diff --git a/include/kernel-6.0 b/include/kernel-6.0
new file mode 100644
index 000000000..1777749cf
--- /dev/null
+++ b/include/kernel-6.0
@@ -0,0 +1,2 @@
+LINUX_VERSION-6.0 = .3
+LINUX_KERNEL_HASH-6.0.3 = b0d522241805794d8af3a67d331ba063a16496c6fb6d365d48f7ed78ee1c3dcf
diff --git a/package/kernel/linux/modules/fs.mk b/package/kernel/linux/modules/fs.mk
index 792c03cf7..134ada3f4 100644
--- a/package/kernel/linux/modules/fs.mk
+++ b/package/kernel/linux/modules/fs.mk
@@ -109,9 +109,9 @@ define KernelPackage/fs-cifs
     +kmod-crypto-ccm \
     +kmod-crypto-ecb \
     +kmod-crypto-des \
-    +(LINUX_5_15):kmod-asn1-decoder \
-    +(LINUX_5_15):kmod-oid-registry \
-    +(LINUX_5_15):kmod-dnsresolver
+    +(LINUX_5_15||LINUX_6_0):kmod-asn1-decoder \
+    +(LINUX_5_15||LINUX_6_0):kmod-oid-registry \
+    +(LINUX_5_15||LINUX_6_0):kmod-dnsresolver
 endef
 
 define KernelPackage/fs-cifs/description
@@ -530,7 +530,7 @@ $(eval $(call KernelPackage,fs-ntfs))
 define KernelPackage/fs-ntfs3
   SUBMENU:=$(FS_MENU)
   TITLE:=NTFS3 Read-Write file system support
-  DEPENDS:=@(LINUX_5_4||LINUX_5_15) +kmod-nls-base
+  DEPENDS:=@(LINUX_5_4||LINUX_5_15||LINUX_6_0) +kmod-nls-base
   KCONFIG:= \
 	CONFIG_NTFS3_FS \
 	CONFIG_NTFS3_64BIT_CLUSTER=y \
diff --git a/package/kernel/linux/modules/netdevices.mk b/package/kernel/linux/modules/netdevices.mk
index bfd072fd0..ea2843163 100644
--- a/package/kernel/linux/modules/netdevices.mk
+++ b/package/kernel/linux/modules/netdevices.mk
@@ -142,7 +142,7 @@ $(eval $(call KernelPackage,mii))
 define KernelPackage/mdio-devres
   SUBMENU:=$(NETWORK_DEVICES_MENU)
   TITLE:=Supports MDIO device registration
-  DEPENDS:=@(LINUX_5_10||LINUX_5_15) +kmod-libphy PACKAGE_kmod-of-mdio:kmod-of-mdio
+  DEPENDS:=@(LINUX_5_10||LINUX_5_15||LINUX_6_0) +kmod-libphy PACKAGE_kmod-of-mdio:kmod-of-mdio
   KCONFIG:=CONFIG_MDIO_DEVRES
   HIDDEN:=1
   FILES:=$(LINUX_DIR)/drivers/net/phy/mdio_devres.ko
@@ -563,7 +563,7 @@ $(eval $(call KernelPackage,8139cp))
 define KernelPackage/r8169
   SUBMENU:=$(NETWORK_DEVICES_MENU)
   TITLE:=RealTek RTL-8169 PCI Gigabit Ethernet Adapter kernel support
-  DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek +(LINUX_5_10||LINUX_5_15):kmod-mdio-devres
+  DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek +(LINUX_5_10||LINUX_5_15||LINUX_6_0):kmod-mdio-devres
   KCONFIG:= \
     CONFIG_R8169 \
     CONFIG_R8169_NAPI=y \
@@ -689,7 +689,7 @@ $(eval $(call KernelPackage,igbvf))
 define KernelPackage/ixgbe
   SUBMENU:=$(NETWORK_DEVICES_MENU)
   TITLE:=Intel(R) 82598/82599 PCI-Express 10 Gigabit Ethernet support
-  DEPENDS:=@PCI_SUPPORT +kmod-mdio +kmod-ptp +kmod-hwmon-core +kmod-libphy +(LINUX_5_10||LINUX_5_15):kmod-mdio-devres
+  DEPENDS:=@PCI_SUPPORT +kmod-mdio +kmod-ptp +kmod-hwmon-core +kmod-libphy +(LINUX_5_10||LINUX_5_15||LINUX_6_0):kmod-mdio-devres
   KCONFIG:=CONFIG_IXGBE \
     CONFIG_IXGBE_VXLAN=n \
     CONFIG_IXGBE_HWMON=y \
diff --git a/package/kernel/linux/modules/other.mk b/package/kernel/linux/modules/other.mk
index 33e36ef87..84e30cf0c 100644
--- a/package/kernel/linux/modules/other.mk
+++ b/package/kernel/linux/modules/other.mk
@@ -1151,7 +1151,7 @@ $(eval $(call KernelPackage,keys-trusted))
 define KernelPackage/tpm
   SUBMENU:=$(OTHER_MENU)
   TITLE:=TPM Hardware Support
-  DEPENDS:= +kmod-random-core +(LINUX_5_15):kmod-asn1-decoder \
+  DEPENDS:= +kmod-random-core +(LINUX_5_15||LINUX_6_0):kmod-asn1-decoder \
 	  +(LINUX_5_15):kmod-asn1-encoder +(LINUX_5_15):kmod-oid-registry
   KCONFIG:= CONFIG_TCG_TPM
   FILES:= $(LINUX_DIR)/drivers/char/tpm/tpm.ko
@@ -1298,7 +1298,7 @@ $(eval $(call KernelPackage,qcom-qmi-helpers))
 define KernelPackage/mhi
   SUBMENU:=$(OTHER_MENU)
   TITLE:=Modem Host Interface (MHI) bus
-  DEPENDS:=@LINUX_5_15
+  DEPENDS:=@(LINUX_5_15||LINUX_6_0)
   KCONFIG:=CONFIG_MHI_BUS \
            CONFIG_MHI_BUS_DEBUG=y \
            CONFIG_MHI_BUS_PCI_GENERIC=n \
diff --git a/package/kernel/linux/modules/usb.mk b/package/kernel/linux/modules/usb.mk
index 594c8aa0f..2bc92db23 100644
--- a/package/kernel/linux/modules/usb.mk
+++ b/package/kernel/linux/modules/usb.mk
@@ -1138,7 +1138,7 @@ $(eval $(call KernelPackage,usb-net-aqc111))
 
 define KernelPackage/usb-net-asix
   TITLE:=Kernel module for USB-to-Ethernet Asix convertors
-  DEPENDS:=+kmod-libphy +LINUX_5_15:kmod-mdio-devres
+  DEPENDS:=+kmod-libphy +(LINUX_5_15||LINUX_6_0):kmod-mdio-devres
   KCONFIG:=CONFIG_USB_NET_AX8817X
   FILES:= \
 	$(LINUX_DIR)/drivers/$(USBNET_DIR)/asix.ko \
diff --git a/package/kernel/linux/modules/video.mk b/package/kernel/linux/modules/video.mk
index 55a3106b8..4a831bcff 100644
--- a/package/kernel/linux/modules/video.mk
+++ b/package/kernel/linux/modules/video.mk
@@ -244,7 +244,7 @@ define KernelPackage/drm
   TITLE:=Direct Rendering Manager (DRM) support
   HIDDEN:=1
   DEPENDS:=+kmod-dma-buf +kmod-i2c-core +kmod-i2c-algo-bit  +PACKAGE_kmod-backlight:kmod-backlight \
-	+(LINUX_5_15):kmod-fb
+	+(LINUX_5_15||LINUX_6_0):kmod-fb
   KCONFIG:=	\
 	CONFIG_DRM	\
 	CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y	\
@@ -263,6 +263,17 @@ endef
 
 $(eval $(call KernelPackage,drm))
 
+define KernelPackage/drm-buddy
+  SUBMENU:=$(VIDEO_MENU)
+  TITLE:=A page based buddy allocator
+  DEPENDS:=@TARGET_x86 @DISPLAY_SUPPORT +kmod-drm @(LINUX_5_19||LINUX_6_0)
+  KCONFIG:=CONFIG_DRM_BUDDY
+  FILES:= $(LINUX_DIR)/drivers/gpu/drm/drm_buddy.ko
+  AUTOLOAD:=$(call AutoProbe,drm_buddy)
+endef
+
+$(eval $(call KernelPackage,drm-buddy))
+
 define KernelPackage/drm-ttm
   SUBMENU:=$(VIDEO_MENU)
   TITLE:=GPU memory management subsystem
@@ -297,11 +308,27 @@ endef
 
 $(eval $(call KernelPackage,drm-kms-helper))
 
+define KernelPackage/drm-display-helper
+  SUBMENU:=$(VIDEO_MENU)
+  TITLE:=DRM helpers for display adapters drivers
+  DEPENDS:=@DISPLAY_SUPPORT +kmod-drm +TARGET_x86:kmod-drm-buddy @(LINUX_6_0)
+  KCONFIG:=CONFIG_DRM_DISPLAY_HELPER
+  FILES:=$(LINUX_DIR)/drivers/gpu/drm/display/drm_display_helper.ko
+  AUTOLOAD:=$(call AutoProbe,drm_display_helper)
+endef
+
+define KernelPackage/drm-display-helper/description
+  DRM helpers for display adapters drivers.
+endef
+
+$(eval $(call KernelPackage,drm-display-helper))
+
 define KernelPackage/drm-amdgpu
   SUBMENU:=$(VIDEO_MENU)
   TITLE:=AMDGPU DRM support
   DEPENDS:=@TARGET_x86 @DISPLAY_SUPPORT +kmod-backlight +kmod-drm-ttm \
-	+kmod-drm-kms-helper +kmod-i2c-algo-bit +amdgpu-firmware
+  +kmod-drm-kms-helper +kmod-i2c-algo-bit +amdgpu-firmware \
+	+(LINUX_6_0):kmod-drm-display-helper
   KCONFIG:=CONFIG_DRM_AMDGPU \
 	CONFIG_DRM_AMDGPU_SI=y \
 	CONFIG_DRM_AMDGPU_CIK=y \
@@ -1075,7 +1102,8 @@ $(eval $(call KernelPackage,video-gspca-konica))
 define KernelPackage/drm-i915
   SUBMENU:=$(VIDEO_MENU)
   TITLE:=Intel GPU drm support
-  DEPENDS:=@TARGET_x86 +kmod-drm-ttm +kmod-drm-kms-helper +i915-firmware
+  DEPENDS:=@TARGET_x86 +kmod-drm-ttm +kmod-drm-kms-helper +i915-firmware \
+	+(LINUX_6_0):kmod-drm-display-helper
   KCONFIG:= \
 	CONFIG_INTEL_GTT \
 	CONFIG_DRM_I915 \
diff --git a/package/kernel/r8168/Makefile b/package/kernel/r8168/Makefile
index bb6ec9796..1258fc904 100644
--- a/package/kernel/r8168/Makefile
+++ b/package/kernel/r8168/Makefile
@@ -7,8 +7,13 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=r8168
-PKG_VERSION:=8.050.02
-PKG_RELEASE:=1
+PKG_VERSION:=8.050.03
+PKG_RELEASE:=$(AUTORELEASE)
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=https://github.com/BROBIRD/openwrt-r8168.git
+PKG_SOURCE_VERSION:=ddfaceacd1b7ed2857fb995642a8ffb1fc37e989
+PKG_MIRROR_HASH:=5428f60dc33e9503c6cfdf690c00077149dce24cbb0591129d905b9f1aad9202
 
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
 
@@ -18,8 +23,7 @@ define KernelPackage/r8168
   TITLE:=Driver for Realtek r8168 chipsets
   SUBMENU:=Network Devices
   VERSION:=$(LINUX_VERSION)+$(PKG_VERSION)-$(BOARD)-$(PKG_RELEASE)
-  DEPENDS:=@PCI_SUPPORT
-  FILES:= $(PKG_BUILD_DIR)/r8168.ko
+  FILES:= $(PKG_BUILD_DIR)/src/r8168.ko
   AUTOLOAD:=$(call AutoProbe,r8168)
   CONFLICTS:=kmod-r8169
 endef
@@ -28,20 +32,8 @@ define Package/r8168/description
   This package contains a driver for Realtek r8168 chipsets.
 endef
 
-R8168_MAKEOPTS= -C $(PKG_BUILD_DIR) \
-	PATH="$(TARGET_PATH)" \
-	ARCH="$(LINUX_KARCH)" \
-	CROSS_COMPILE="$(TARGET_CROSS)" \
-	TARGET="$(HAL_TARGET)" \
-	TOOLPREFIX="$(KERNEL_CROSS)" \
-	TOOLPATH="$(KERNEL_CROSS)" \
-	KERNELPATH="$(LINUX_DIR)" \
-	KERNELDIR="$(LINUX_DIR)" \
-	LDOPTS=" " \
-	DOMULTI=1
-
 define Build/Compile
-	$(MAKE) $(R8168_MAKEOPTS) modules
+	+$(KERNEL_MAKE) M=$(PKG_BUILD_DIR)/src modules
 endef
 
 $(eval $(call KernelPackage,r8168))
diff --git a/package/kernel/r8168/patches/001-r8168-add-LED-configuration-from-OF.patch b/package/kernel/r8168/patches/001-r8168-add-LED-configuration-from-OF.patch
index 89c4c41e7..f49842442 100644
--- a/package/kernel/r8168/patches/001-r8168-add-LED-configuration-from-OF.patch
+++ b/package/kernel/r8168/patches/001-r8168-add-LED-configuration-from-OF.patch
@@ -1,5 +1,5 @@
---- a/r8168_n.c
-+++ b/r8168_n.c
+--- a/src/r8168_n.c
++++ b/src/r8168_n.c
 @@ -47,6 +47,7 @@
  #include <linux/etherdevice.h>
  #include <linux/delay.h>
@@ -8,7 +8,7 @@
  #include <linux/if_vlan.h>
  #include <linux/crc32.h>
  #include <linux/interrupt.h>
-@@ -24607,6 +24608,22 @@ rtl8168_set_bios_setting(struct net_device *dev)
+@@ -24643,6 +24644,22 @@ rtl8168_set_bios_setting(struct net_devi
          }
  }
  
@@ -31,7 +31,7 @@
  static void
  rtl8168_init_software_variable(struct net_device *dev)
  {
-@@ -25169,6 +25186,8 @@ rtl8168_init_software_variable(struct net_device *dev)
+@@ -25206,6 +25223,8 @@ rtl8168_init_software_variable(struct ne
                  tp->NotWrMcuPatchCode = TRUE;
          }
  
diff --git a/package/kernel/r8168/patches/020-5.18-support.patch b/package/kernel/r8168/patches/020-5.18-support.patch
new file mode 100644
index 000000000..499389274
--- /dev/null
+++ b/package/kernel/r8168/patches/020-5.18-support.patch
@@ -0,0 +1,47 @@
+--- a/src/r8168_n.c
++++ b/src/r8168_n.c
+@@ -3715,7 +3715,11 @@
+         txd->opts2 = 0;
+         while (1) {
+                 memset(tmpAddr, pattern++, len - 14);
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
+                 pci_dma_sync_single_for_device(tp->pci_dev,
++#else
++                dma_sync_single_for_device(tp_to_dev(tp),
++#endif
+                                                le64_to_cpu(mapping),
+                                                len, DMA_TO_DEVICE);
+                 txd->opts1 = cpu_to_le32(DescOwn | FirstFrag | LastFrag | len);
+@@ -3743,7 +3747,11 @@
+                 if (rx_len == len) {
+                         dma_sync_single_for_cpu(tp_to_dev(tp), le64_to_cpu(rxd->addr), tp->rx_buf_sz, DMA_FROM_DEVICE);
+                         i = memcmp(skb->data, rx_skb->data, rx_len);
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
+                         pci_dma_sync_single_for_device(tp->pci_dev, le64_to_cpu(rxd->addr), tp->rx_buf_sz, DMA_FROM_DEVICE);
++#else
++                        dma_sync_single_for_device(tp_to_dev(tp), le64_to_cpu(rxd->addr), tp->rx_buf_sz, DMA_FROM_DEVICE);
++#endif
+                         if (i == 0) {
+ //              dev_printk(KERN_INFO, tp_to_dev(tp), "loopback test finished\n",rx_len,len);
+                                 break;
+@@ -26464,11 +26472,20 @@
+ 
+         if ((sizeof(dma_addr_t) > 4) &&
+             use_dac &&
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
+             !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) &&
+             !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
++#else
++            !dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) &&
++            !dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64))) {
++#endif
+                 dev->features |= NETIF_F_HIGHDMA;
+         } else {
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)
+                 rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
++#else
++                rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
++#endif
+                 if (rc < 0) {
+ #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
+                         if (netif_msg_probe(tp))
diff --git a/package/kernel/r8168/patches/030-5.19-support.patch b/package/kernel/r8168/patches/030-5.19-support.patch
new file mode 100644
index 000000000..d4dca3125
--- /dev/null
+++ b/package/kernel/r8168/patches/030-5.19-support.patch
@@ -0,0 +1,18 @@
+--- a/src/r8168_n.c
++++ b/src/r8168_n.c
+@@ -116,6 +116,15 @@
+ #define FIRMWARE_8168FP_3   "rtl_nic/rtl8168fp-3.fw"
+ #define FIRMWARE_8168FP_4   "rtl_nic/rtl8168fp-4.fw"
+ 
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0)
++static inline void netif_set_gso_max_size(struct net_device *dev,
++					  unsigned int size)
++{
++	/* dev->gso_max_size is read locklessly from sk_setup_caps() */
++	WRITE_ONCE(dev->gso_max_size, size);
++}
++#endif
++
+ /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
+    The RTL chips use a 64 element hash table based on the Ethernet CRC. */
+ static const int multicast_filter_limit = 32;
diff --git a/package/kernel/r8168/src/Makefile b/package/kernel/r8168/src/Makefile
deleted file mode 100644
index eb10ba4fe..000000000
--- a/package/kernel/r8168/src/Makefile
+++ /dev/null
@@ -1,175 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-
-################################################################################
-#  This product is covered by one or more of the following patents:
-#  US6,570,884, US6,115,776, and US6,327,625.
-################################################################################
-
-CONFIG_SOC_LAN = n
-ENABLE_FIBER_SUPPORT = n
-ENABLE_REALWOW_SUPPORT = n
-ENABLE_DASH_SUPPORT = n
-ENABLE_DASH_PRINTER_SUPPORT = n
-CONFIG_DOWN_SPEED_100 = n
-CONFIG_ASPM = y
-ENABLE_S5WOL = y
-ENABLE_S5_KEEP_CURR_MAC = n
-ENABLE_EEE = y
-ENABLE_S0_MAGIC_PACKET = n
-CONFIG_DYNAMIC_ASPM = y
-ENABLE_USE_FIRMWARE_FILE = n
-CONFIG_CTAP_SHORT_OFF = n
-
-ifneq ($(KERNELRELEASE),)
-	obj-m := r8168.o
-	r8168-objs := r8168_n.o r8168_asf.o rtl_eeprom.o rtltool.o
-	ifeq ($(CONFIG_SOC_LAN), y)
-		EXTRA_CFLAGS += -DCONFIG_SOC_LAN
-	endif
-	ifeq ($(ENABLE_FIBER_SUPPORT), y)
-	    r8168-objs += r8168_fiber.o
-		EXTRA_CFLAGS += -DENABLE_FIBER_SUPPORT
-	endif
-	ifeq ($(ENABLE_REALWOW_SUPPORT), y)
-	    r8168-objs += r8168_realwow.o
-		EXTRA_CFLAGS += -DENABLE_REALWOW_SUPPORT
-	endif
-	ifeq ($(ENABLE_DASH_SUPPORT), y)
-	    r8168-objs += r8168_dash.o
-		EXTRA_CFLAGS += -DENABLE_DASH_SUPPORT
-	endif
-	ifeq ($(ENABLE_DASH_PRINTER_SUPPORT), y)
-	    r8168-objs += r8168_dash.o
-		EXTRA_CFLAGS += -DENABLE_DASH_SUPPORT -DENABLE_DASH_PRINTER_SUPPORT
-	endif
-	EXTRA_CFLAGS += -DCONFIG_R8168_NAPI
-	EXTRA_CFLAGS += -DCONFIG_R8168_VLAN
-	ifeq ($(CONFIG_DOWN_SPEED_100), y)
-		EXTRA_CFLAGS += -DCONFIG_DOWN_SPEED_100
-	endif
-	ifeq ($(CONFIG_ASPM), y)
-		EXTRA_CFLAGS += -DCONFIG_ASPM
-	endif
-	ifeq ($(ENABLE_S5WOL), y)
-		EXTRA_CFLAGS += -DENABLE_S5WOL
-	endif
-	ifeq ($(ENABLE_S5_KEEP_CURR_MAC), y)
-		EXTRA_CFLAGS += -DENABLE_S5_KEEP_CURR_MAC
-	endif
-	ifeq ($(ENABLE_EEE), y)
-		EXTRA_CFLAGS += -DENABLE_EEE
-	endif
-	ifeq ($(ENABLE_S0_MAGIC_PACKET), y)
-		EXTRA_CFLAGS += -DENABLE_S0_MAGIC_PACKET
-	endif
-	ifeq ($(CONFIG_DYNAMIC_ASPM), y)
-		EXTRA_CFLAGS += -DCONFIG_DYNAMIC_ASPM
-	endif
-	ifeq ($(ENABLE_USE_FIRMWARE_FILE), y)
-		r8168-objs += r8168_firmware.o
-		EXTRA_CFLAGS += -DENABLE_USE_FIRMWARE_FILE
-	endif
-	ifeq ($(CONFIG_CTAP_SHORT_OFF), y)
-		EXTRA_CFLAGS += -DCONFIG_CTAP_SHORT_OFF
-	endif
-else
-	BASEDIR := /lib/modules/$(shell uname -r)
-	KERNELDIR ?= $(BASEDIR)/build
-	PWD :=$(shell pwd)
-	DRIVERDIR := $(shell find $(BASEDIR)/kernel/drivers/net/ethernet -name realtek -type d)
-	ifeq ($(DRIVERDIR),)
-		DRIVERDIR := $(shell find $(BASEDIR)/kernel/drivers/net -name realtek -type d)
-	endif
-	ifeq ($(DRIVERDIR),)
-		DRIVERDIR := $(BASEDIR)/kernel/drivers/net
-	endif
-	RTKDIR := $(subst $(BASEDIR)/,,$(DRIVERDIR))
-
-	KERNEL_GCC_VERSION := $(shell cat /proc/version | sed -n 's/.*gcc version \([[:digit:]]\.[[:digit:]]\.[[:digit:]]\).*/\1/p')
-	CCVERSION = $(shell $(CC) -dumpversion)
-
-	KVER = $(shell uname -r)
-	KMAJ = $(shell echo $(KVER) | \
-	sed -e 's/^\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*.*/\1/')
-	KMIN = $(shell echo $(KVER) | \
-	sed -e 's/^[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*.*/\1/')
-	KREV = $(shell echo $(KVER) | \
-	sed -e 's/^[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/')
-
-	kver_ge = $(shell \
-	echo test | awk '{if($(KMAJ) < $(1)) {print 0} else { \
-	if($(KMAJ) > $(1)) {print 1} else { \
-	if($(KMIN) < $(2)) {print 0} else { \
-	if($(KMIN) > $(2)) {print 1} else { \
-	if($(KREV) < $(3)) {print 0} else { print 1 } \
-	}}}}}' \
-	)
-
-.PHONY: all
-all: print_vars clean modules install
-
-print_vars:
-	@echo
-	@echo "CC: " $(CC)
-	@echo "CCVERSION: " $(CCVERSION)
-	@echo "KERNEL_GCC_VERSION: " $(KERNEL_GCC_VERSION)
-	@echo "KVER: " $(KVER)
-	@echo "KMAJ: " $(KMAJ)
-	@echo "KMIN: " $(KMIN)
-	@echo "KREV: " $(KREV)
-	@echo "BASEDIR: " $(BASEDIR)
-	@echo "DRIVERDIR: " $(DRIVERDIR)
-	@echo "PWD: " $(PWD)
-	@echo "RTKDIR: " $(RTKDIR)
-	@echo
-
-.PHONY:modules
-modules:
-#ifeq ($(call kver_ge,5,0,0),1)
-	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
-#else
-#	$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
-#endif
-
-.PHONY:clean
-clean:
-#ifeq ($(call kver_ge,5,0,0),1)
-	$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
-#else
-#	$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) clean
-#endif
-
-.PHONY:install
-install:
-#ifeq ($(call kver_ge,5,0,0),1)
-	$(MAKE) -C $(KERNELDIR) M=$(PWD) INSTALL_MOD_DIR=$(RTKDIR) modules_install
-#else
-#	$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) INSTALL_MOD_DIR=$(RTKDIR) modules_install
-#endif
-
-endif
diff --git a/package/kernel/r8168/src/Makefile_linux24x b/package/kernel/r8168/src/Makefile_linux24x
deleted file mode 100644
index a76625bf9..000000000
--- a/package/kernel/r8168/src/Makefile_linux24x
+++ /dev/null
@@ -1,75 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-
-################################################################################
-# This product is covered by one or more of the following patents:
-# US6,570,884, US6,115,776, and US6,327,625.
-################################################################################
-
-CC		:= gcc
-LD		:= ld
-ARCH		:= $(shell uname -m | sed 's/i.86/i386/')
-KSRC		:= /lib/modules/$(shell uname -r)/build
-CONFIG_FILE	:= $(KSRC)/include/linux/autoconf.h
-KMISC		:= /lib/modules/$(shell uname -r)/kernel/drivers/net/
-
-
-ifeq ($(ARCH),x86_64)
-   MODCFLAGS	+= -mcmodel=kernel -mno-red-zone
-endif
-
-#standard flags for module builds
-MODCFLAGS	+= -DLINUX -D__KERNEL__ -DMODULE -O2 -pipe -Wall
-MODCFLAGS	+= -I$(KSRC)/include -I.
-MODCFLAGS	+= -DMODVERSIONS -DEXPORT_SYMTAB -include $(KSRC)/include/linux/modversions.h
-SOURCE		:= r8168_n.c r8168_asf.c rtl_eeprom.c rtltool.c
-OBJS		:= $(SOURCE:.c=.o)
-
-
-SMP		:= $(shell $(CC) $(MODCFLAGS) -E -dM $(CONFIG_FILE) | \
-   grep CONFIG_SMP | awk '{print $$3}')
-
-ifneq ($(SMP),1)
-   SMP		:= 0
-endif
-
-ifeq ($(SMP),1)
-   MODCFLAGS	+= -D__SMP__
-endif
-
-modules: $(OBJS)
-	$(LD) -r $^ -o r8168.o
-	strip --strip-debug r8168.o
-
-%.o: %.c
-	$(CC) $(MODCFLAGS) -c $< -o $@
-
-clean:
-	rm *.o -f
-
-install:
-	install -m 744 -c r8168.o $(KMISC)
diff --git a/package/kernel/r8168/src/r8168.h b/package/kernel/r8168/src/r8168.h
deleted file mode 100644
index ed4c1f413..000000000
--- a/package/kernel/r8168/src/r8168.h
+++ /dev/null
@@ -1,1867 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#include <linux/ethtool.h>
-#include "r8168_dash.h"
-#include "r8168_realwow.h"
-#include "r8168_fiber.h"
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)
-typedef int netdev_tx_t;
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-#define skb_transport_offset(skb) (skb->h.raw - skb->data)
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
-#define device_set_wakeup_enable(dev, val)	do {} while (0)
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
-static inline void ether_addr_copy(u8 *dst, const u8 *src)
-{
-        u16 *a = (u16 *)dst;
-        const u16 *b = (const u16 *)src;
-
-        a[0] = b[0];
-        a[1] = b[1];
-        a[2] = b[2];
-}
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)
-#define IS_ERR_OR_NULL(ptr)			(!ptr)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0)
-#define reinit_completion(x)			((x)->done = 0)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,39)
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)
-#define pm_runtime_mark_last_busy(x)
-#define pm_runtime_put_autosuspend(x)		pm_runtime_put(x)
-#define pm_runtime_put_sync_autosuspend(x)	pm_runtime_put_sync(x)
-
-static inline bool pm_runtime_suspended(struct device *dev)
-{
-        return dev->power.runtime_status == RPM_SUSPENDED
-               && !dev->power.disable_depth;
-}
-
-static inline bool pm_runtime_active(struct device *dev)
-{
-        return dev->power.runtime_status == RPM_ACTIVE
-               || dev->power.disable_depth;
-}
-#endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)
-#define queue_delayed_work(long_wq, work, delay)	schedule_delayed_work(work, delay)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)
-#define netif_printk(priv, type, level, netdev, fmt, args...)	\
-	do {								\
-		if (netif_msg_##type(priv))				\
-			printk(level "%s: " fmt,(netdev)->name , ##args); \
-	} while (0)
-
-#define netif_emerg(priv, type, netdev, fmt, args...)		\
-		netif_printk(priv, type, KERN_EMERG, netdev, fmt, ##args)
-#define netif_alert(priv, type, netdev, fmt, args...)		\
-		netif_printk(priv, type, KERN_ALERT, netdev, fmt, ##args)
-#define netif_crit(priv, type, netdev, fmt, args...)		\
-		netif_printk(priv, type, KERN_CRIT, netdev, fmt, ##args)
-#define netif_err(priv, type, netdev, fmt, args...)		\
-		netif_printk(priv, type, KERN_ERR, netdev, fmt, ##args)
-#define netif_warn(priv, type, netdev, fmt, args...)		\
-		netif_printk(priv, type, KERN_WARNING, netdev, fmt, ##args)
-#define netif_notice(priv, type, netdev, fmt, args...)		\
-		netif_printk(priv, type, KERN_NOTICE, netdev, fmt, ##args)
-#define netif_info(priv, type, netdev, fmt, args...)		\
-		netif_printk(priv, type, KERN_INFO, (netdev), fmt, ##args)
-#endif
-#endif
-#endif
-#endif
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
-#define setup_timer(_timer, _function, _data) \
-do { \
-	(_timer)->function = _function; \
-	(_timer)->data = _data; \
-	init_timer(_timer); \
-} while (0)
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)
-#if defined(skb_vlan_tag_present) && !defined(vlan_tx_tag_present)
-#define vlan_tx_tag_present skb_vlan_tag_present
-#endif
-#if defined(skb_vlan_tag_get) && !defined(vlan_tx_tag_get)
-#define vlan_tx_tag_get skb_vlan_tag_get
-#endif
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)
-
-#define RTL_ALLOC_SKB_INTR(tp, length) dev_alloc_skb(length)
-#ifdef CONFIG_R8168_NAPI
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0)
-#undef RTL_ALLOC_SKB_INTR
-#define RTL_ALLOC_SKB_INTR(tp, length) napi_alloc_skb(&tp->napi, length)
-#endif
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)
-#define eth_random_addr(addr) random_ether_addr(addr)
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
-#define netdev_features_t  u32
-#endif
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0)
-#define NETIF_F_ALL_CSUM        NETIF_F_CSUM_MASK
-#else
-#ifndef NETIF_F_ALL_CSUM
-#define NETIF_F_ALL_CSUM        NETIF_F_CSUM_MASK
-#endif
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,37)
-#define ENABLE_R8168_PROCFS
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
-#define NETIF_F_HW_VLAN_RX	NETIF_F_HW_VLAN_CTAG_RX
-#define NETIF_F_HW_VLAN_TX	NETIF_F_HW_VLAN_CTAG_TX
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
-#define __devinit
-#define __devexit
-#define __devexit_p(func)   func
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-#define CHECKSUM_PARTIAL CHECKSUM_HW
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-#define irqreturn_t void
-#define IRQ_HANDLED    1
-#define IRQ_NONE   0
-#define IRQ_RETVAL(x)
-#endif
-
-#ifndef NETIF_F_RXALL
-#define NETIF_F_RXALL  0
-#endif
-
-#ifndef NETIF_F_RXFCS
-#define NETIF_F_RXFCS  0
-#endif
-
-#ifndef HAVE_FREE_NETDEV
-#define free_netdev(x)  kfree(x)
-#endif
-
-#ifndef SET_NETDEV_DEV
-#define SET_NETDEV_DEV(net, pdev)
-#endif
-
-#ifndef SET_MODULE_OWNER
-#define SET_MODULE_OWNER(dev)
-#endif
-
-#ifndef SA_SHIRQ
-#define SA_SHIRQ IRQF_SHARED
-#endif
-
-#ifndef NETIF_F_GSO
-#define gso_size    tso_size
-#define gso_segs    tso_segs
-#endif
-
-#ifndef PCI_VENDOR_ID_DLINK
-#define PCI_VENDOR_ID_DLINK 0x1186
-#endif
-
-#ifndef dma_mapping_error
-#define dma_mapping_error(a,b) 0
-#endif
-
-#ifndef netif_err
-#define netif_err(a,b,c,d)
-#endif
-
-#ifndef AUTONEG_DISABLE
-#define AUTONEG_DISABLE   0x00
-#endif
-
-#ifndef AUTONEG_ENABLE
-#define AUTONEG_ENABLE    0x01
-#endif
-
-#ifndef BMCR_SPEED1000
-#define BMCR_SPEED1000  0x0040
-#endif
-
-#ifndef BMCR_SPEED100
-#define BMCR_SPEED100   0x2000
-#endif
-
-#ifndef BMCR_SPEED10
-#define BMCR_SPEED10    0x0000
-#endif
-
-#ifndef SPEED_UNKNOWN
-#define SPEED_UNKNOWN   -1
-#endif
-
-#ifndef DUPLEX_UNKNOWN
-#define DUPLEX_UNKNOWN  0xff
-#endif
-
-#ifndef SUPPORTED_Pause
-#define SUPPORTED_Pause  (1 << 13)
-#endif
-
-#ifndef SUPPORTED_Asym_Pause
-#define SUPPORTED_Asym_Pause  (1 << 14)
-#endif
-
-#ifndef  MDIO_EEE_100TX
-#define  MDIO_EEE_100TX  0x0002
-#endif
-
-#ifndef  MDIO_EEE_1000T
-#define  MDIO_EEE_1000T  0x0004
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
-#ifdef CONFIG_NET_POLL_CONTROLLER
-#define RTL_NET_POLL_CONTROLLER dev->poll_controller=rtl8168_netpoll
-#else
-#define RTL_NET_POLL_CONTROLLER
-#endif
-
-#ifdef CONFIG_R8168_VLAN
-#define RTL_SET_VLAN dev->vlan_rx_register=rtl8168_vlan_rx_register
-#else
-#define RTL_SET_VLAN
-#endif
-
-#define RTL_NET_DEVICE_OPS(ops) dev->open=rtl8168_open; \
-                    dev->hard_start_xmit=rtl8168_start_xmit; \
-                    dev->get_stats=rtl8168_get_stats; \
-                    dev->stop=rtl8168_close; \
-                    dev->tx_timeout=rtl8168_tx_timeout; \
-                    dev->set_multicast_list=rtl8168_set_rx_mode; \
-                    dev->change_mtu=rtl8168_change_mtu; \
-                    dev->set_mac_address=rtl8168_set_mac_address; \
-                    dev->do_ioctl=rtl8168_do_ioctl; \
-                    RTL_NET_POLL_CONTROLLER; \
-                    RTL_SET_VLAN;
-#else
-#define RTL_NET_DEVICE_OPS(ops) dev->netdev_ops=&ops
-#endif
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#ifndef TRUE
-#define TRUE  1
-#endif
-
-#ifndef false
-#define false 0
-#endif
-
-#ifndef true
-#define true  1
-#endif
-
-//Hardware will continue interrupt 10 times after interrupt finished.
-#define RTK_KEEP_INTERRUPT_COUNT (10)
-
-//Due to the hardware design of RTL8111B, the low 32 bit address of receive
-//buffer must be 8-byte alignment.
-#ifndef NET_IP_ALIGN
-#define NET_IP_ALIGN        2
-#endif
-#define RTK_RX_ALIGN        8
-
-#ifdef CONFIG_R8168_NAPI
-#define NAPI_SUFFIX "-NAPI"
-#else
-#define NAPI_SUFFIX ""
-#endif
-#ifdef ENABLE_FIBER_SUPPORT
-#define FIBER_SUFFIX "-FIBER"
-#else
-#define FIBER_SUFFIX ""
-#endif
-#ifdef ENABLE_REALWOW_SUPPORT
-#define REALWOW_SUFFIX "-REALWOW"
-#else
-#define REALWOW_SUFFIX ""
-#endif
-#if defined(ENABLE_DASH_PRINTER_SUPPORT)
-#define DASH_SUFFIX "-PRINTER"
-#elif defined(ENABLE_DASH_SUPPORT)
-#define DASH_SUFFIX "-DASH"
-#else
-#define DASH_SUFFIX ""
-#endif
-
-#define RTL8168_VERSION "8.050.02" NAPI_SUFFIX FIBER_SUFFIX REALWOW_SUFFIX DASH_SUFFIX
-#define MODULENAME "r8168"
-#define PFX MODULENAME ": "
-
-#define GPL_CLAIM "\
-r8168  Copyright (C) 2022 Realtek NIC software team <nicfae@realtek.com> \n \
-This program comes with ABSOLUTELY NO WARRANTY; for details, please see <http://www.gnu.org/licenses/>. \n \
-This is free software, and you are welcome to redistribute it under certain conditions; see <http://www.gnu.org/licenses/>. \n"
-
-#ifdef RTL8168_DEBUG
-#define assert(expr) \
-        if(!(expr)) {                   \
-            printk( "Assertion failed! %s,%s,%s,line=%d\n", \
-            #expr,__FILE__,__FUNCTION__,__LINE__);      \
-        }
-#define dprintk(fmt, args...)   do { printk(PFX fmt, ## args); } while (0)
-#else
-#define assert(expr) do {} while (0)
-#define dprintk(fmt, args...)   do {} while (0)
-#endif /* RTL8168_DEBUG */
-
-#define R8168_MSG_DEFAULT \
-    (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
-
-#ifdef CONFIG_R8168_NAPI
-#define rtl8168_rx_hwaccel_skb      vlan_hwaccel_receive_skb
-#define rtl8168_rx_quota(count, quota)  min(count, quota)
-#else
-#define rtl8168_rx_hwaccel_skb      vlan_hwaccel_rx
-#define rtl8168_rx_quota(count, quota)  count
-#endif
-
-/* MAC address length */
-#ifndef MAC_ADDR_LEN
-#define MAC_ADDR_LEN    6
-#endif
-
-#ifndef MAC_PROTOCOL_LEN
-#define MAC_PROTOCOL_LEN    2
-#endif
-
-#ifndef ETH_FCS_LEN
-#define ETH_FCS_LEN	  4
-#endif
-
-#ifndef NETIF_F_TSO6
-#define NETIF_F_TSO6  0
-#endif
-
-#define Reserved2_data  7
-#define RX_DMA_BURST    7   /* Maximum PCI burst, '6' is 1024 */
-#define TX_DMA_BURST_unlimited  7
-#define TX_DMA_BURST_1024   6
-#define TX_DMA_BURST_512    5
-#define TX_DMA_BURST_256    4
-#define TX_DMA_BURST_128    3
-#define TX_DMA_BURST_64     2
-#define TX_DMA_BURST_32     1
-#define TX_DMA_BURST_16     0
-#define Reserved1_data  0x3F
-#define RxPacketMaxSize 0x3FE8  /* 16K - 1 - ETH_HLEN - VLAN - CRC... */
-#define Jumbo_Frame_1k  ETH_DATA_LEN
-#define Jumbo_Frame_2k  (2*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
-#define Jumbo_Frame_3k  (3*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
-#define Jumbo_Frame_4k  (4*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
-#define Jumbo_Frame_5k  (5*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
-#define Jumbo_Frame_6k  (6*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
-#define Jumbo_Frame_7k  (7*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
-#define Jumbo_Frame_8k  (8*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
-#define Jumbo_Frame_9k  (9*1024 - ETH_HLEN - VLAN_HLEN - ETH_FCS_LEN)
-#define InterFrameGap   0x03    /* 3 means InterFrameGap = the shortest one */
-#define RxEarly_off_V1 (0x07 << 11)
-#define RxEarly_off_V2 (1 << 11)
-#define Rx_Single_fetch_V2 (1 << 14)
-
-#define R8168_REGS_SIZE     (256)
-#define R8168_MAC_REGS_SIZE     (256)
-#define R8168_PHY_REGS_SIZE     (16*2)
-#define R8168_EPHY_REGS_SIZE  	(31*2)
-#define R8168_ERI_REGS_SIZE  	(0x100)
-#define R8168_REGS_DUMP_SIZE     (0x400)
-#define R8168_PCI_REGS_SIZE  	(0x100)
-#define R8168_NAPI_WEIGHT   64
-
-#define RTL8168_TX_TIMEOUT  (6 * HZ)
-#define RTL8168_LINK_TIMEOUT    (1 * HZ)
-#define RTL8168_ESD_TIMEOUT (2 * HZ)
-
-#define MAX_NUM_TX_DESC 1024    /* Maximum number of Tx descriptor registers */
-#define MAX_NUM_RX_DESC 1024    /* Maximum number of Rx descriptor registers */
-
-#define MIN_NUM_TX_DESC 32    /* Minimum number of Tx descriptor registers */
-#define MIN_NUM_RX_DESC 32    /* Minimum number of Rx descriptor registers */
-
-#define NUM_TX_DESC 256    /* Number of Tx descriptor registers */
-#define NUM_RX_DESC 256    /* Number of Rx descriptor registers */
-
-#define RX_BUF_SIZE 0x05F3  /* 0x05F3 = 1522bye + 1 */
-
-#define OCP_STD_PHY_BASE	0xa400
-
-#define NODE_ADDRESS_SIZE 6
-
-#define SHORT_PACKET_PADDING_BUF_SIZE 256
-
-#define RTK_MAGIC_DEBUG_VALUE 0x0badbeef
-
-/* write/read MMIO register */
-#define RTL_W8(tp, reg, val8)	writeb((val8), tp->mmio_addr + (reg))
-#define RTL_W16(tp, reg, val16)	writew((val16), tp->mmio_addr + (reg))
-#define RTL_W32(tp, reg, val32)	writel((val32), tp->mmio_addr + (reg))
-#define RTL_R8(tp, reg)		readb(tp->mmio_addr + (reg))
-#define RTL_R16(tp, reg)		readw(tp->mmio_addr + (reg))
-#define RTL_R32(tp, reg)		((unsigned long) readl(tp->mmio_addr + (reg)))
-
-#ifndef DMA_64BIT_MASK
-#define DMA_64BIT_MASK  0xffffffffffffffffULL
-#endif
-
-#ifndef DMA_32BIT_MASK
-#define DMA_32BIT_MASK  0x00000000ffffffffULL
-#endif
-
-#ifndef NETDEV_TX_OK
-#define NETDEV_TX_OK 0      /* driver took care of packet */
-#endif
-
-#ifndef NETDEV_TX_BUSY
-#define NETDEV_TX_BUSY 1    /* driver tx path was busy*/
-#endif
-
-#ifndef NETDEV_TX_LOCKED
-#define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */
-#endif
-
-#ifndef ADVERTISED_Pause
-#define ADVERTISED_Pause    (1 << 13)
-#endif
-
-#ifndef ADVERTISED_Asym_Pause
-#define ADVERTISED_Asym_Pause   (1 << 14)
-#endif
-
-#ifndef ADVERTISE_PAUSE_CAP
-#define ADVERTISE_PAUSE_CAP 0x400
-#endif
-
-#ifndef ADVERTISE_PAUSE_ASYM
-#define ADVERTISE_PAUSE_ASYM    0x800
-#endif
-
-#ifndef MII_CTRL1000
-#define MII_CTRL1000        0x09
-#endif
-
-#ifndef ADVERTISE_1000FULL
-#define ADVERTISE_1000FULL  0x200
-#endif
-
-#ifndef ADVERTISE_1000HALF
-#define ADVERTISE_1000HALF  0x100
-#endif
-
-#ifndef ETH_MIN_MTU
-#define ETH_MIN_MTU  68
-#endif
-
-/*****************************************************************************/
-
-//#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3)
-#if (( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,27) ) || \
-     (( LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) ) && \
-      ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3) )))
-/* copied from linux kernel 2.6.20 include/linux/netdev.h */
-#define NETDEV_ALIGN        32
-#define NETDEV_ALIGN_CONST  (NETDEV_ALIGN - 1)
-
-static inline void *netdev_priv(struct net_device *dev)
-{
-        return (char *)dev + ((sizeof(struct net_device)
-                               + NETDEV_ALIGN_CONST)
-                              & ~NETDEV_ALIGN_CONST);
-}
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,3)
-
-/*****************************************************************************/
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-#define RTLDEV  tp
-#else
-#define RTLDEV  dev
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-/*****************************************************************************/
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-typedef struct net_device *napi_ptr;
-typedef int *napi_budget;
-
-#define napi dev
-#define RTL_NAPI_CONFIG(ndev, priv, function, weig) ndev->poll=function;    \
-                                ndev->weight=weig;
-#define RTL_NAPI_QUOTA(budget, ndev)            min(*budget, ndev->quota)
-#define RTL_GET_PRIV(stuct_ptr, priv_struct)        netdev_priv(stuct_ptr)
-#define RTL_GET_NETDEV(priv_ptr)
-#define RTL_RX_QUOTA(budget)          *budget
-#define RTL_NAPI_QUOTA_UPDATE(ndev, work_done, budget)  *budget -= work_done;   \
-                                ndev->quota -= work_done;
-#define RTL_NETIF_RX_COMPLETE(dev, napi, work_done)        netif_rx_complete(dev)
-#define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi)       netif_rx_schedule_prep(dev)
-#define __RTL_NETIF_RX_SCHEDULE(dev, napi)      __netif_rx_schedule(dev)
-#define RTL_NAPI_RETURN_VALUE               work_done >= work_to_do
-#define RTL_NAPI_ENABLE(dev, napi)          netif_poll_enable(dev)
-#define RTL_NAPI_DISABLE(dev, napi)         netif_poll_disable(dev)
-#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
-#else
-typedef struct napi_struct *napi_ptr;
-typedef int napi_budget;
-
-#define RTL_NAPI_CONFIG(ndev, priv, function, weight)   netif_napi_add(ndev, &priv->napi, function, weight)
-#define RTL_NAPI_QUOTA(budget, ndev)            min(budget, budget)
-#define RTL_GET_PRIV(stuct_ptr, priv_struct)        container_of(stuct_ptr, priv_struct, stuct_ptr)
-#define RTL_GET_NETDEV(priv_ptr)            struct net_device *dev = priv_ptr->dev;
-#define RTL_RX_QUOTA(budget)          budget
-#define RTL_NAPI_QUOTA_UPDATE(ndev, work_done, budget)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
-#define RTL_NETIF_RX_COMPLETE(dev, napi, work_done)        netif_rx_complete(dev, napi)
-#define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi)       netif_rx_schedule_prep(dev, napi)
-#define __RTL_NETIF_RX_SCHEDULE(dev, napi)      __netif_rx_schedule(dev, napi)
-#endif
-#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,29)
-#define RTL_NETIF_RX_COMPLETE(dev, napi, work_done)        netif_rx_complete(napi)
-#define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi)       netif_rx_schedule_prep(napi)
-#define __RTL_NETIF_RX_SCHEDULE(dev, napi)      __netif_rx_schedule(napi)
-#endif
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,29)
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0)
-#define RTL_NETIF_RX_COMPLETE(dev, napi, work_done)        napi_complete_done(napi, work_done)
-#else
-#define RTL_NETIF_RX_COMPLETE(dev, napi, work_done)        napi_complete(napi)
-#endif
-#define RTL_NETIF_RX_SCHEDULE_PREP(dev, napi)       napi_schedule_prep(napi)
-#define __RTL_NETIF_RX_SCHEDULE(dev, napi)      __napi_schedule(napi)
-#endif
-#define RTL_NAPI_RETURN_VALUE work_done
-#define RTL_NAPI_ENABLE(dev, napi)          napi_enable(napi)
-#define RTL_NAPI_DISABLE(dev, napi)         napi_disable(napi)
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
-#define RTL_NAPI_DEL(priv)
-#else
-#define RTL_NAPI_DEL(priv)   netif_napi_del(&priv->napi)
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
-
-/*****************************************************************************/
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)
-#ifdef __CHECKER__
-#define __iomem __attribute__((noderef, address_space(2)))
-extern void __chk_io_ptr(void __iomem *);
-#define __bitwise __attribute__((bitwise))
-#else
-#define __iomem
-#define __chk_io_ptr(x) (void)0
-#define __bitwise
-#endif
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)
-
-/*****************************************************************************/
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8)
-#ifdef __CHECKER__
-#define __force __attribute__((force))
-#else
-#define __force
-#endif
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,8)
-
-#ifndef module_param
-#define module_param(v,t,p) MODULE_PARM(v, "i");
-#endif
-
-#ifndef PCI_DEVICE
-#define PCI_DEVICE(vend,dev) \
-    .vendor = (vend), .device = (dev), \
-    .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID
-#endif
-
-/*****************************************************************************/
-/* 2.5.28 => 2.4.23 */
-#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,5,28) )
-
-static inline void _kc_synchronize_irq(void)
-{
-        synchronize_irq();
-}
-#undef synchronize_irq
-#define synchronize_irq(X) _kc_synchronize_irq()
-
-#include <linux/tqueue.h>
-#define work_struct tq_struct
-#undef INIT_WORK
-#define INIT_WORK(a,b,c) INIT_TQUEUE(a,(void (*)(void *))b,c)
-#undef container_of
-#define container_of list_entry
-#define schedule_work schedule_task
-#define flush_scheduled_work flush_scheduled_tasks
-#endif /* 2.5.28 => 2.4.17 */
-
-/*****************************************************************************/
-/* 2.6.4 => 2.6.0 */
-#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) )
-#define MODULE_VERSION(_version) MODULE_INFO(version, _version)
-#endif /* 2.6.4 => 2.6.0 */
-/*****************************************************************************/
-/* 2.6.0 => 2.5.28 */
-#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) )
-#define MODULE_INFO(version, _version)
-#ifndef CONFIG_E1000_DISABLE_PACKET_SPLIT
-#define CONFIG_E1000_DISABLE_PACKET_SPLIT 1
-#endif
-
-#define pci_set_consistent_dma_mask(dev,mask) 1
-
-#undef dev_put
-#define dev_put(dev) __dev_put(dev)
-
-#ifndef skb_fill_page_desc
-#define skb_fill_page_desc _kc_skb_fill_page_desc
-extern void _kc_skb_fill_page_desc(struct sk_buff *skb, int i, struct page *page, int off, int size);
-#endif
-
-#ifndef pci_dma_mapping_error
-#define pci_dma_mapping_error _kc_pci_dma_mapping_error
-static inline int _kc_pci_dma_mapping_error(dma_addr_t dma_addr)
-{
-        return dma_addr == 0;
-}
-#endif
-
-#undef ALIGN
-#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))
-
-#endif /* 2.6.0 => 2.5.28 */
-
-/*****************************************************************************/
-/* 2.4.22 => 2.4.17 */
-#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,4,22) )
-#define pci_name(x) ((x)->slot_name)
-#endif /* 2.4.22 => 2.4.17 */
-
-/*****************************************************************************/
-/* 2.6.5 => 2.6.0 */
-#if ( LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5) )
-#define pci_dma_sync_single_for_cpu pci_dma_sync_single
-#define pci_dma_sync_single_for_device  pci_dma_sync_single_for_cpu
-#endif /* 2.6.5 => 2.6.0 */
-
-/*****************************************************************************/
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-/*
- * initialize a work-struct's func and data pointers:
- */
-#define PREPARE_WORK(_work, _func, _data)           \
-    do {                            \
-        (_work)->func = _func;              \
-        (_work)->data = _data;              \
-    } while (0)
-
-#endif
-/*****************************************************************************/
-/* 2.6.4 => 2.6.0 */
-#if ((LINUX_VERSION_CODE < KERNEL_VERSION(2,4,25) && \
-     LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)) || \
-    (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) && \
-      LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4)))
-#define ETHTOOL_OPS_COMPAT
-#endif /* 2.6.4 => 2.6.0 */
-
-/*****************************************************************************/
-/* Installations with ethtool version without eeprom, adapter id, or statistics
- * support */
-
-#ifndef ETH_GSTRING_LEN
-#define ETH_GSTRING_LEN 32
-#endif
-
-#ifndef ETHTOOL_GSTATS
-#define ETHTOOL_GSTATS 0x1d
-#undef ethtool_drvinfo
-#define ethtool_drvinfo k_ethtool_drvinfo
-struct k_ethtool_drvinfo {
-        u32 cmd;
-        char driver[32];
-        char version[32];
-        char fw_version[32];
-        char bus_info[32];
-        char reserved1[32];
-        char reserved2[16];
-        u32 n_stats;
-        u32 testinfo_len;
-        u32 eedump_len;
-        u32 regdump_len;
-};
-
-struct ethtool_stats {
-        u32 cmd;
-        u32 n_stats;
-        u64 data[0];
-};
-#endif /* ETHTOOL_GSTATS */
-
-#ifndef ETHTOOL_PHYS_ID
-#define ETHTOOL_PHYS_ID 0x1c
-#endif /* ETHTOOL_PHYS_ID */
-
-#ifndef ETHTOOL_GSTRINGS
-#define ETHTOOL_GSTRINGS 0x1b
-enum ethtool_stringset {
-        ETH_SS_TEST             = 0,
-        ETH_SS_STATS,
-};
-struct ethtool_gstrings {
-        u32 cmd;            /* ETHTOOL_GSTRINGS */
-        u32 string_set;     /* string set id e.c. ETH_SS_TEST, etc*/
-        u32 len;            /* number of strings in the string set */
-        u8 data[0];
-};
-#endif /* ETHTOOL_GSTRINGS */
-
-#ifndef ETHTOOL_TEST
-#define ETHTOOL_TEST 0x1a
-enum ethtool_test_flags {
-        ETH_TEST_FL_OFFLINE = (1 << 0),
-        ETH_TEST_FL_FAILED  = (1 << 1),
-};
-struct ethtool_test {
-        u32 cmd;
-        u32 flags;
-        u32 reserved;
-        u32 len;
-        u64 data[0];
-};
-#endif /* ETHTOOL_TEST */
-
-#ifndef ETHTOOL_GEEPROM
-#define ETHTOOL_GEEPROM 0xb
-#undef ETHTOOL_GREGS
-struct ethtool_eeprom {
-        u32 cmd;
-        u32 magic;
-        u32 offset;
-        u32 len;
-        u8 data[0];
-};
-
-struct ethtool_value {
-        u32 cmd;
-        u32 data;
-};
-#endif /* ETHTOOL_GEEPROM */
-
-#ifndef ETHTOOL_GLINK
-#define ETHTOOL_GLINK 0xa
-#endif /* ETHTOOL_GLINK */
-
-#ifndef ETHTOOL_GREGS
-#define ETHTOOL_GREGS       0x00000004 /* Get NIC registers */
-#define ethtool_regs _kc_ethtool_regs
-/* for passing big chunks of data */
-struct _kc_ethtool_regs {
-        u32 cmd;
-        u32 version; /* driver-specific, indicates different chips/revs */
-        u32 len; /* bytes */
-        u8 data[0];
-};
-#endif /* ETHTOOL_GREGS */
-
-#ifndef ETHTOOL_GMSGLVL
-#define ETHTOOL_GMSGLVL     0x00000007 /* Get driver message level */
-#endif
-#ifndef ETHTOOL_SMSGLVL
-#define ETHTOOL_SMSGLVL     0x00000008 /* Set driver msg level, priv. */
-#endif
-#ifndef ETHTOOL_NWAY_RST
-#define ETHTOOL_NWAY_RST    0x00000009 /* Restart autonegotiation, priv */
-#endif
-#ifndef ETHTOOL_GLINK
-#define ETHTOOL_GLINK       0x0000000a /* Get link status */
-#endif
-#ifndef ETHTOOL_GEEPROM
-#define ETHTOOL_GEEPROM     0x0000000b /* Get EEPROM data */
-#endif
-#ifndef ETHTOOL_SEEPROM
-#define ETHTOOL_SEEPROM     0x0000000c /* Set EEPROM data */
-#endif
-#ifndef ETHTOOL_GCOALESCE
-#define ETHTOOL_GCOALESCE   0x0000000e /* Get coalesce config */
-/* for configuring coalescing parameters of chip */
-#define ethtool_coalesce _kc_ethtool_coalesce
-struct _kc_ethtool_coalesce {
-        u32 cmd;    /* ETHTOOL_{G,S}COALESCE */
-
-        /* How many usecs to delay an RX interrupt after
-         * a packet arrives.  If 0, only rx_max_coalesced_frames
-         * is used.
-         */
-        u32 rx_coalesce_usecs;
-
-        /* How many packets to delay an RX interrupt after
-         * a packet arrives.  If 0, only rx_coalesce_usecs is
-         * used.  It is illegal to set both usecs and max frames
-         * to zero as this would cause RX interrupts to never be
-         * generated.
-         */
-        u32 rx_max_coalesced_frames;
-
-        /* Same as above two parameters, except that these values
-         * apply while an IRQ is being serviced by the host.  Not
-         * all cards support this feature and the values are ignored
-         * in that case.
-         */
-        u32 rx_coalesce_usecs_irq;
-        u32 rx_max_coalesced_frames_irq;
-
-        /* How many usecs to delay a TX interrupt after
-         * a packet is sent.  If 0, only tx_max_coalesced_frames
-         * is used.
-         */
-        u32 tx_coalesce_usecs;
-
-        /* How many packets to delay a TX interrupt after
-         * a packet is sent.  If 0, only tx_coalesce_usecs is
-         * used.  It is illegal to set both usecs and max frames
-         * to zero as this would cause TX interrupts to never be
-         * generated.
-         */
-        u32 tx_max_coalesced_frames;
-
-        /* Same as above two parameters, except that these values
-         * apply while an IRQ is being serviced by the host.  Not
-         * all cards support this feature and the values are ignored
-         * in that case.
-         */
-        u32 tx_coalesce_usecs_irq;
-        u32 tx_max_coalesced_frames_irq;
-
-        /* How many usecs to delay in-memory statistics
-         * block updates.  Some drivers do not have an in-memory
-         * statistic block, and in such cases this value is ignored.
-         * This value must not be zero.
-         */
-        u32 stats_block_coalesce_usecs;
-
-        /* Adaptive RX/TX coalescing is an algorithm implemented by
-         * some drivers to improve latency under low packet rates and
-         * improve throughput under high packet rates.  Some drivers
-         * only implement one of RX or TX adaptive coalescing.  Anything
-         * not implemented by the driver causes these values to be
-         * silently ignored.
-         */
-        u32 use_adaptive_rx_coalesce;
-        u32 use_adaptive_tx_coalesce;
-
-        /* When the packet rate (measured in packets per second)
-         * is below pkt_rate_low, the {rx,tx}_*_low parameters are
-         * used.
-         */
-        u32 pkt_rate_low;
-        u32 rx_coalesce_usecs_low;
-        u32 rx_max_coalesced_frames_low;
-        u32 tx_coalesce_usecs_low;
-        u32 tx_max_coalesced_frames_low;
-
-        /* When the packet rate is below pkt_rate_high but above
-         * pkt_rate_low (both measured in packets per second) the
-         * normal {rx,tx}_* coalescing parameters are used.
-         */
-
-        /* When the packet rate is (measured in packets per second)
-         * is above pkt_rate_high, the {rx,tx}_*_high parameters are
-         * used.
-         */
-        u32 pkt_rate_high;
-        u32 rx_coalesce_usecs_high;
-        u32 rx_max_coalesced_frames_high;
-        u32 tx_coalesce_usecs_high;
-        u32 tx_max_coalesced_frames_high;
-
-        /* How often to do adaptive coalescing packet rate sampling,
-         * measured in seconds.  Must not be zero.
-         */
-        u32 rate_sample_interval;
-};
-#endif /* ETHTOOL_GCOALESCE */
-
-#ifndef ETHTOOL_SCOALESCE
-#define ETHTOOL_SCOALESCE   0x0000000f /* Set coalesce config. */
-#endif
-#ifndef ETHTOOL_GRINGPARAM
-#define ETHTOOL_GRINGPARAM  0x00000010 /* Get ring parameters */
-/* for configuring RX/TX ring parameters */
-#define ethtool_ringparam _kc_ethtool_ringparam
-struct _kc_ethtool_ringparam {
-        u32 cmd;    /* ETHTOOL_{G,S}RINGPARAM */
-
-        /* Read only attributes.  These indicate the maximum number
-         * of pending RX/TX ring entries the driver will allow the
-         * user to set.
-         */
-        u32 rx_max_pending;
-        u32 rx_mini_max_pending;
-        u32 rx_jumbo_max_pending;
-        u32 tx_max_pending;
-
-        /* Values changeable by the user.  The valid values are
-         * in the range 1 to the "*_max_pending" counterpart above.
-         */
-        u32 rx_pending;
-        u32 rx_mini_pending;
-        u32 rx_jumbo_pending;
-        u32 tx_pending;
-};
-#endif /* ETHTOOL_GRINGPARAM */
-
-#ifndef ETHTOOL_SRINGPARAM
-#define ETHTOOL_SRINGPARAM  0x00000011 /* Set ring parameters, priv. */
-#endif
-#ifndef ETHTOOL_GPAUSEPARAM
-#define ETHTOOL_GPAUSEPARAM 0x00000012 /* Get pause parameters */
-/* for configuring link flow control parameters */
-#define ethtool_pauseparam _kc_ethtool_pauseparam
-struct _kc_ethtool_pauseparam {
-        u32 cmd;    /* ETHTOOL_{G,S}PAUSEPARAM */
-
-        /* If the link is being auto-negotiated (via ethtool_cmd.autoneg
-         * being true) the user may set 'autonet' here non-zero to have the
-         * pause parameters be auto-negotiated too.  In such a case, the
-         * {rx,tx}_pause values below determine what capabilities are
-         * advertised.
-         *
-         * If 'autoneg' is zero or the link is not being auto-negotiated,
-         * then {rx,tx}_pause force the driver to use/not-use pause
-         * flow control.
-         */
-        u32 autoneg;
-        u32 rx_pause;
-        u32 tx_pause;
-};
-#endif /* ETHTOOL_GPAUSEPARAM */
-
-#ifndef ETHTOOL_SPAUSEPARAM
-#define ETHTOOL_SPAUSEPARAM 0x00000013 /* Set pause parameters. */
-#endif
-#ifndef ETHTOOL_GRXCSUM
-#define ETHTOOL_GRXCSUM     0x00000014 /* Get RX hw csum enable (ethtool_value) */
-#endif
-#ifndef ETHTOOL_SRXCSUM
-#define ETHTOOL_SRXCSUM     0x00000015 /* Set RX hw csum enable (ethtool_value) */
-#endif
-#ifndef ETHTOOL_GTXCSUM
-#define ETHTOOL_GTXCSUM     0x00000016 /* Get TX hw csum enable (ethtool_value) */
-#endif
-#ifndef ETHTOOL_STXCSUM
-#define ETHTOOL_STXCSUM     0x00000017 /* Set TX hw csum enable (ethtool_value) */
-#endif
-#ifndef ETHTOOL_GSG
-#define ETHTOOL_GSG     0x00000018 /* Get scatter-gather enable
-* (ethtool_value) */
-#endif
-#ifndef ETHTOOL_SSG
-#define ETHTOOL_SSG     0x00000019 /* Set scatter-gather enable
-* (ethtool_value). */
-#endif
-#ifndef ETHTOOL_TEST
-#define ETHTOOL_TEST        0x0000001a /* execute NIC self-test, priv. */
-#endif
-#ifndef ETHTOOL_GSTRINGS
-#define ETHTOOL_GSTRINGS    0x0000001b /* get specified string set */
-#endif
-#ifndef ETHTOOL_PHYS_ID
-#define ETHTOOL_PHYS_ID     0x0000001c /* identify the NIC */
-#endif
-#ifndef ETHTOOL_GSTATS
-#define ETHTOOL_GSTATS      0x0000001d /* get NIC-specific statistics */
-#endif
-#ifndef ETHTOOL_GTSO
-#define ETHTOOL_GTSO        0x0000001e /* Get TSO enable (ethtool_value) */
-#endif
-#ifndef ETHTOOL_STSO
-#define ETHTOOL_STSO        0x0000001f /* Set TSO enable (ethtool_value) */
-#endif
-
-#ifndef ETHTOOL_BUSINFO_LEN
-#define ETHTOOL_BUSINFO_LEN 32
-#endif
-
-/*****************************************************************************/
-
-enum RTL8168_DSM_STATE {
-        DSM_MAC_INIT = 1,
-        DSM_NIC_GOTO_D3 = 2,
-        DSM_IF_DOWN = 3,
-        DSM_NIC_RESUME_D3 = 4,
-        DSM_IF_UP = 5,
-};
-
-enum RTL8168_registers {
-        MAC0            = 0x00,     /* Ethernet hardware address. */
-        MAC4            = 0x04,
-        MAR0            = 0x08,     /* Multicast filter. */
-        CounterAddrLow      = 0x10,
-        CounterAddrHigh     = 0x14,
-        CustomLED       = 0x18,
-        TxDescStartAddrLow  = 0x20,
-        TxDescStartAddrHigh = 0x24,
-        TxHDescStartAddrLow = 0x28,
-        TxHDescStartAddrHigh    = 0x2c,
-        FLASH           = 0x30,
-        ERSR            = 0x36,
-        ChipCmd         = 0x37,
-        TxPoll          = 0x38,
-        IntrMask        = 0x3C,
-        IntrStatus      = 0x3E,
-        TxConfig        = 0x40,
-        RxConfig        = 0x44,
-        TCTR            = 0x48,
-        Cfg9346         = 0x50,
-        Config0         = 0x51,
-        Config1         = 0x52,
-        Config2         = 0x53,
-        Config3         = 0x54,
-        Config4         = 0x55,
-        Config5         = 0x56,
-        TDFNR           = 0x57,
-        TimeInt0        = 0x58,
-        TimeInt1        = 0x5C,
-        PHYAR           = 0x60,
-        CSIDR           = 0x64,
-        CSIAR           = 0x68,
-        PHYstatus       = 0x6C,
-        MACDBG          = 0x6D,
-        GPIO            = 0x6E,
-        PMCH            = 0x6F,
-        ERIDR           = 0x70,
-        ERIAR           = 0x74,
-        EPHY_RXER_NUM   = 0x7C,
-        EPHYAR          = 0x80,
-        TimeInt2        = 0x8C,
-        OCPDR           = 0xB0,
-        MACOCP          = 0xB0,
-        OCPAR           = 0xB4,
-        SecMAC0         = 0xB4,
-        SecMAC4         = 0xB8,
-        PHYOCP          = 0xB8,
-        DBG_reg         = 0xD1,
-        TwiCmdReg       = 0xD2,
-        MCUCmd_reg      = 0xD3,
-        RxMaxSize       = 0xDA,
-        EFUSEAR         = 0xDC,
-        CPlusCmd        = 0xE0,
-        IntrMitigate    = 0xE2,
-        RxDescAddrLow   = 0xE4,
-        RxDescAddrHigh  = 0xE8,
-        MTPS            = 0xEC,
-        FuncEvent       = 0xF0,
-        PPSW            = 0xF2,
-        FuncEventMask   = 0xF4,
-        TimeInt3        = 0xF4,
-        FuncPresetState = 0xF8,
-        CMAC_IBCR0      = 0xF8,
-        CMAC_IBCR2      = 0xF9,
-        CMAC_IBIMR0     = 0xFA,
-        CMAC_IBISR0     = 0xFB,
-        FuncForceEvent  = 0xFC,
-};
-
-enum RTL8168_register_content {
-        /* InterruptStatusBits */
-        SYSErr      = 0x8000,
-        PCSTimeout  = 0x4000,
-        SWInt       = 0x0100,
-        TxDescUnavail   = 0x0080,
-        RxFIFOOver  = 0x0040,
-        LinkChg     = 0x0020,
-        RxDescUnavail   = 0x0010,
-        TxErr       = 0x0008,
-        TxOK        = 0x0004,
-        RxErr       = 0x0002,
-        RxOK        = 0x0001,
-
-        /* RxStatusDesc */
-        RxRWT = (1 << 22),
-        RxRES = (1 << 21),
-        RxRUNT = (1 << 20),
-        RxCRC = (1 << 19),
-
-        /* ChipCmdBits */
-        StopReq  = 0x80,
-        CmdReset = 0x10,
-        CmdRxEnb = 0x08,
-        CmdTxEnb = 0x04,
-        RxBufEmpty = 0x01,
-
-        /* Cfg9346Bits */
-        Cfg9346_Lock = 0x00,
-        Cfg9346_Unlock = 0xC0,
-        Cfg9346_EEDO = (1 << 0),
-        Cfg9346_EEDI = (1 << 1),
-        Cfg9346_EESK = (1 << 2),
-        Cfg9346_EECS = (1 << 3),
-        Cfg9346_EEM0 = (1 << 6),
-        Cfg9346_EEM1 = (1 << 7),
-
-        /* rx_mode_bits */
-        AcceptErr = 0x20,
-        AcceptRunt = 0x10,
-        AcceptBroadcast = 0x08,
-        AcceptMulticast = 0x04,
-        AcceptMyPhys = 0x02,
-        AcceptAllPhys = 0x01,
-
-        /* Transmit Priority Polling*/
-        HPQ = 0x80,
-        NPQ = 0x40,
-        FSWInt = 0x01,
-
-        /* RxConfigBits */
-        Reserved2_shift = 13,
-        RxCfgDMAShift = 8,
-        RxCfg_128_int_en = (1 << 15),
-        RxCfg_fet_multi_en = (1 << 14),
-        RxCfg_half_refetch = (1 << 13),
-        RxCfg_9356SEL = (1 << 6),
-
-        /* TxConfigBits */
-        TxInterFrameGapShift = 24,
-        TxDMAShift = 8, /* DMA burst value (0-7) is shift this many bits */
-        TxMACLoopBack = (1 << 17),  /* MAC loopback */
-
-        /* Config1 register */
-        LEDS1       = (1 << 7),
-        LEDS0       = (1 << 6),
-        Speed_down  = (1 << 4),
-        MEMMAP      = (1 << 3),
-        IOMAP       = (1 << 2),
-        VPD         = (1 << 1),
-        PMEnable    = (1 << 0), /* Power Management Enable */
-
-        /* Config2 register */
-        ClkReqEn	= (1 << 7),	/* Clock Request Enable */
-        PMSTS_En    = (1 << 5),
-
-        /* Config3 register */
-        Isolate_en  = (1 << 12), /* Isolate enable */
-        MagicPacket = (1 << 5), /* Wake up when receives a Magic Packet */
-        LinkUp      = (1 << 4), /* This bit is reserved in RTL8168B.*/
-        /* Wake up when the cable connection is re-established */
-        ECRCEN      = (1 << 3), /* This bit is reserved in RTL8168B*/
-        Jumbo_En0   = (1 << 2), /* This bit is reserved in RTL8168B*/
-        RDY_TO_L23  = (1 << 1), /* This bit is reserved in RTL8168B*/
-        Beacon_en   = (1 << 0), /* This bit is reserved in RTL8168B*/
-
-        /* Config4 register */
-        Jumbo_En1   = (1 << 1), /* This bit is reserved in RTL8168B*/
-
-        /* Config5 register */
-        BWF     = (1 << 6), /* Accept Broadcast wakeup frame */
-        MWF     = (1 << 5), /* Accept Multicast wakeup frame */
-        UWF     = (1 << 4), /* Accept Unicast wakeup frame */
-        LanWake     = (1 << 1), /* LanWake enable/disable */
-        PMEStatus   = (1 << 0), /* PME status can be reset by PCI RST# */
-        ASPM_en	    = (1 << 0),	/* ASPM enable */
-
-        /* CPlusCmd */
-        EnableBist  = (1 << 15),
-        Macdbgo_oe  = (1 << 14),
-        Normal_mode = (1 << 13),
-        Force_halfdup   = (1 << 12),
-        Force_rxflow_en = (1 << 11),
-        Force_txflow_en = (1 << 10),
-        Cxpl_dbg_sel    = (1 << 9),//This bit is reserved in RTL8168B
-        ASF     = (1 << 8),//This bit is reserved in RTL8168C
-        PktCntrDisable  = (1 << 7),
-        RxVlan      = (1 << 6),
-        RxChkSum    = (1 << 5),
-        Macdbgo_sel = 0x001C,
-        INTT_0      = 0x0000,
-        INTT_1      = 0x0001,
-        INTT_2      = 0x0002,
-        INTT_3      = 0x0003,
-
-        /* rtl8168_PHYstatus */
-        PowerSaveStatus = 0x80,
-        TxFlowCtrl = 0x40,
-        RxFlowCtrl = 0x20,
-        _1000bpsF = 0x10,
-        _100bps = 0x08,
-        _10bps = 0x04,
-        LinkStatus = 0x02,
-        FullDup = 0x01,
-
-        /* DBG_reg */
-        Fix_Nak_1 = (1 << 4),
-        Fix_Nak_2 = (1 << 3),
-        DBGPIN_E2 = (1 << 0),
-
-        /* ResetCounterCommand */
-        CounterReset = 0x1,
-        /* DumpCounterCommand */
-        CounterDump = 0x8,
-
-        /* PHY access */
-        PHYAR_Flag = 0x80000000,
-        PHYAR_Write = 0x80000000,
-        PHYAR_Read = 0x00000000,
-        PHYAR_Reg_Mask = 0x1f,
-        PHYAR_Reg_shift = 16,
-        PHYAR_Data_Mask = 0xffff,
-
-        /* EPHY access */
-        EPHYAR_Flag = 0x80000000,
-        EPHYAR_Write = 0x80000000,
-        EPHYAR_Read = 0x00000000,
-        EPHYAR_Reg_Mask = 0x3f,
-        EPHYAR_Reg_shift = 16,
-        EPHYAR_Data_Mask = 0xffff,
-
-        /* CSI access */
-        CSIAR_Flag = 0x80000000,
-        CSIAR_Write = 0x80000000,
-        CSIAR_Read = 0x00000000,
-        CSIAR_ByteEn = 0x0f,
-        CSIAR_ByteEn_shift = 12,
-        CSIAR_Addr_Mask = 0x0fff,
-
-        /* ERI access */
-        ERIAR_Flag = 0x80000000,
-        ERIAR_Write = 0x80000000,
-        ERIAR_Read = 0x00000000,
-        ERIAR_Addr_Align = 4, /* ERI access register address must be 4 byte alignment */
-        ERIAR_ExGMAC = 0,
-        ERIAR_MSIX = 1,
-        ERIAR_ASF = 2,
-        ERIAR_OOB = 2,
-        ERIAR_Type_shift = 16,
-        ERIAR_ByteEn = 0x0f,
-        ERIAR_ByteEn_shift = 12,
-
-        /* OCP GPHY access */
-        OCPDR_Write = 0x80000000,
-        OCPDR_Read = 0x00000000,
-        OCPDR_Reg_Mask = 0xFF,
-        OCPDR_Data_Mask = 0xFFFF,
-        OCPDR_GPHY_Reg_shift = 16,
-        OCPAR_Flag = 0x80000000,
-        OCPAR_GPHY_Write = 0x8000F060,
-        OCPAR_GPHY_Read = 0x0000F060,
-        OCPR_Write = 0x80000000,
-        OCPR_Read = 0x00000000,
-        OCPR_Addr_Reg_shift = 16,
-        OCPR_Flag = 0x80000000,
-        OCP_STD_PHY_BASE_PAGE = 0x0A40,
-
-        /* MCU Command */
-        Now_is_oob = (1 << 7),
-        Txfifo_empty = (1 << 5),
-        Rxfifo_empty = (1 << 4),
-
-        /* E-FUSE access */
-        EFUSE_WRITE = 0x80000000,
-        EFUSE_WRITE_OK  = 0x00000000,
-        EFUSE_READ  = 0x00000000,
-        EFUSE_READ_OK   = 0x80000000,
-        EFUSE_WRITE_V3 = 0x40000000,
-        EFUSE_WRITE_OK_V3  = 0x00000000,
-        EFUSE_READ_V3  = 0x80000000,
-        EFUSE_READ_OK_V3   = 0x00000000,
-        EFUSE_Reg_Mask  = 0x03FF,
-        EFUSE_Reg_Shift = 8,
-        EFUSE_Check_Cnt = 300,
-        EFUSE_READ_FAIL = 0xFF,
-        EFUSE_Data_Mask = 0x000000FF,
-
-        /* GPIO */
-        GPIO_en = (1 << 0),
-
-};
-
-enum _DescStatusBit {
-        DescOwn     = (1 << 31), /* Descriptor is owned by NIC */
-        RingEnd     = (1 << 30), /* End of descriptor ring */
-        FirstFrag   = (1 << 29), /* First segment of a packet */
-        LastFrag    = (1 << 28), /* Final segment of a packet */
-
-        /* Tx private */
-        /*------ offset 0 of tx descriptor ------*/
-        LargeSend   = (1 << 27), /* TCP Large Send Offload (TSO) */
-        GiantSendv4 = (1 << 26), /* TCP Giant Send Offload V4 (GSOv4) */
-        GiantSendv6 = (1 << 25), /* TCP Giant Send Offload V6 (GSOv6) */
-        LargeSend_DP = (1 << 16), /* TCP Large Send Offload (TSO) */
-        MSSShift    = 16,        /* MSS value position */
-        MSSMask     = 0x7FFU,    /* MSS value 11 bits */
-        TxIPCS      = (1 << 18), /* Calculate IP checksum */
-        TxUDPCS     = (1 << 17), /* Calculate UDP/IP checksum */
-        TxTCPCS     = (1 << 16), /* Calculate TCP/IP checksum */
-        TxVlanTag   = (1 << 17), /* Add VLAN tag */
-
-        /*@@@@@@ offset 4 of tx descriptor => bits for RTL8168C/CP only     begin @@@@@@*/
-        TxUDPCS_C   = (1 << 31), /* Calculate UDP/IP checksum */
-        TxTCPCS_C   = (1 << 30), /* Calculate TCP/IP checksum */
-        TxIPCS_C    = (1 << 29), /* Calculate IP checksum */
-        TxIPV6F_C   = (1 << 28), /* Indicate it is an IPv6 packet */
-        /*@@@@@@ offset 4 of tx descriptor => bits for RTL8168C/CP only     end @@@@@@*/
-
-
-        /* Rx private */
-        /*------ offset 0 of rx descriptor ------*/
-        PID1        = (1 << 18), /* Protocol ID bit 1/2 */
-        PID0        = (1 << 17), /* Protocol ID bit 2/2 */
-
-#define RxProtoUDP  (PID1)
-#define RxProtoTCP  (PID0)
-#define RxProtoIP   (PID1 | PID0)
-#define RxProtoMask RxProtoIP
-
-        RxIPF       = (1 << 16), /* IP checksum failed */
-        RxUDPF      = (1 << 15), /* UDP/IP checksum failed */
-        RxTCPF      = (1 << 14), /* TCP/IP checksum failed */
-        RxVlanTag   = (1 << 16), /* VLAN tag available */
-
-        /*@@@@@@ offset 0 of rx descriptor => bits for RTL8168C/CP only     begin @@@@@@*/
-        RxUDPT      = (1 << 18),
-        RxTCPT      = (1 << 17),
-        /*@@@@@@ offset 0 of rx descriptor => bits for RTL8168C/CP only     end @@@@@@*/
-
-        /*@@@@@@ offset 4 of rx descriptor => bits for RTL8168C/CP only     begin @@@@@@*/
-        RxV6F       = (1 << 31),
-        RxV4F       = (1 << 30),
-        /*@@@@@@ offset 4 of rx descriptor => bits for RTL8168C/CP only     end @@@@@@*/
-};
-
-enum features {
-//  RTL_FEATURE_WOL = (1 << 0),
-        RTL_FEATURE_MSI = (1 << 1),
-};
-
-enum wol_capability {
-        WOL_DISABLED = 0,
-        WOL_ENABLED = 1
-};
-
-enum bits {
-        BIT_0 = (1 << 0),
-        BIT_1 = (1 << 1),
-        BIT_2 = (1 << 2),
-        BIT_3 = (1 << 3),
-        BIT_4 = (1 << 4),
-        BIT_5 = (1 << 5),
-        BIT_6 = (1 << 6),
-        BIT_7 = (1 << 7),
-        BIT_8 = (1 << 8),
-        BIT_9 = (1 << 9),
-        BIT_10 = (1 << 10),
-        BIT_11 = (1 << 11),
-        BIT_12 = (1 << 12),
-        BIT_13 = (1 << 13),
-        BIT_14 = (1 << 14),
-        BIT_15 = (1 << 15),
-        BIT_16 = (1 << 16),
-        BIT_17 = (1 << 17),
-        BIT_18 = (1 << 18),
-        BIT_19 = (1 << 19),
-        BIT_20 = (1 << 20),
-        BIT_21 = (1 << 21),
-        BIT_22 = (1 << 22),
-        BIT_23 = (1 << 23),
-        BIT_24 = (1 << 24),
-        BIT_25 = (1 << 25),
-        BIT_26 = (1 << 26),
-        BIT_27 = (1 << 27),
-        BIT_28 = (1 << 28),
-        BIT_29 = (1 << 29),
-        BIT_30 = (1 << 30),
-        BIT_31 = (1 << 31)
-};
-
-enum effuse {
-        EFUSE_NOT_SUPPORT = 0,
-        EFUSE_SUPPORT_V1,
-        EFUSE_SUPPORT_V2,
-        EFUSE_SUPPORT_V3,
-};
-#define RsvdMask    0x3fffc000
-
-struct TxDesc {
-        u32 opts1;
-        u32 opts2;
-        u64 addr;
-};
-
-struct RxDesc {
-        u32 opts1;
-        u32 opts2;
-        u64 addr;
-};
-
-struct ring_info {
-        struct sk_buff  *skb;
-        u32     len;
-        u8      __pad[sizeof(void *) - sizeof(u32)];
-};
-
-struct pci_resource {
-        u8  cmd;
-        u8  cls;
-        u16 io_base_h;
-        u16 io_base_l;
-        u16 mem_base_h;
-        u16 mem_base_l;
-        u8  ilr;
-        u16 resv_0x1c_h;
-        u16 resv_0x1c_l;
-        u16 resv_0x20_h;
-        u16 resv_0x20_l;
-        u16 resv_0x24_h;
-        u16 resv_0x24_l;
-        u16 resv_0x2c_h;
-        u16 resv_0x2c_l;
-        u32 pci_sn_l;
-        u32 pci_sn_h;
-};
-
-/* Flow Control Settings */
-enum rtl8168_fc_mode {
-        rtl8168_fc_none = 0,
-        rtl8168_fc_rx_pause,
-        rtl8168_fc_tx_pause,
-        rtl8168_fc_full,
-        rtl8168_fc_default
-};
-
-struct rtl8168_private {
-        void __iomem *mmio_addr;    /* memory map physical address */
-        struct pci_dev *pci_dev;    /* Index of PCI device */
-        struct net_device *dev;
-#ifdef CONFIG_R8168_NAPI
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
-        struct napi_struct napi;
-#endif
-#endif
-        struct net_device_stats stats;  /* statistics of net device */
-        spinlock_t lock;        /* spin lock flag */
-        u32 msg_enable;
-        u32 tx_tcp_csum_cmd;
-        u32 tx_udp_csum_cmd;
-        u32 tx_ip_csum_cmd;
-        u32 tx_ipv6_csum_cmd;
-        int max_jumbo_frame_size;
-        int chipset;
-        u32 mcfg;
-        u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
-        u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
-        u32 dirty_rx;
-        u32 dirty_tx;
-        u32 num_rx_desc; /* Number of Rx descriptor registers */
-        u32 num_tx_desc; /* Number of Tx descriptor registers */
-        struct TxDesc *TxDescArray; /* 256-aligned Tx descriptor ring */
-        struct RxDesc *RxDescArray; /* 256-aligned Rx descriptor ring */
-        dma_addr_t TxPhyAddr;
-        dma_addr_t RxPhyAddr;
-        struct sk_buff *Rx_skbuff[MAX_NUM_RX_DESC]; /* Rx data buffers */
-        struct ring_info tx_skb[MAX_NUM_TX_DESC];   /* Tx data buffers */
-        unsigned rx_buf_sz;
-        struct timer_list esd_timer;
-        struct timer_list link_timer;
-        struct pci_resource pci_cfg_space;
-        unsigned int esd_flag;
-        unsigned int pci_cfg_is_read;
-        unsigned int rtl8168_rx_config;
-        u16 cp_cmd;
-        u16 intr_mask;
-        u16 timer_intr_mask;
-        int phy_auto_nego_reg;
-        int phy_1000_ctrl_reg;
-        u8 org_mac_addr[NODE_ADDRESS_SIZE];
-        struct rtl8168_counters *tally_vaddr;
-        dma_addr_t tally_paddr;
-
-#ifdef CONFIG_R8168_VLAN
-        struct vlan_group *vlgrp;
-#endif
-        u8  wol_enabled;
-        u32 wol_opts;
-        u8  efuse_ver;
-        u8  eeprom_type;
-        u8  autoneg;
-        u8  duplex;
-        u32 speed;
-        u32 advertising;
-        enum rtl8168_fc_mode fcpause;
-        u16 eeprom_len;
-        u16 cur_page;
-        u32 bios_setting;
-
-        int (*set_speed)(struct net_device *, u8 autoneg, u32 speed, u8 duplex, u32 adv);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
-        void (*get_settings)(struct net_device *, struct ethtool_cmd *);
-#else
-        void (*get_settings)(struct net_device *, struct ethtool_link_ksettings *);
-#endif
-        void (*phy_reset_enable)(struct net_device *);
-        unsigned int (*phy_reset_pending)(struct net_device *);
-        unsigned int (*link_ok)(struct net_device *);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-        struct work_struct task;
-#else
-        struct delayed_work task;
-#endif
-        unsigned features;
-
-        u8 org_pci_offset_99;
-        u8 org_pci_offset_180;
-        u8 issue_offset_99_event;
-
-        u8 org_pci_offset_80;
-        u8 org_pci_offset_81;
-        u8 use_timer_interrrupt;
-
-        u32 keep_intr_cnt;
-
-        u8  HwIcVerUnknown;
-        u8  NotWrRamCodeToMicroP;
-        u8  NotWrMcuPatchCode;
-        u8  HwHasWrRamCodeToMicroP;
-
-        u16 sw_ram_code_ver;
-        u16 hw_ram_code_ver;
-
-        u8 rtk_enable_diag;
-
-        u8 ShortPacketSwChecksum;
-
-        u8 UseSwPaddingShortPkt;
-
-        u8 RequireAdcBiasPatch;
-        u16 AdcBiasPatchIoffset;
-
-        u8 RequireAdjustUpsTxLinkPulseTiming;
-        u16 SwrCnt1msIni;
-
-        u8 HwSuppNowIsOobVer;
-
-        u8 RequiredSecLanDonglePatch;
-
-        u32 HwFiberModeVer;
-        u32 HwFiberStat;
-        u8 HwFiberLedMode;
-        u8 HwSwitchMdiToFiber;
-
-        u8 HwSuppSerDesPhyVer;
-
-        u8 HwSuppPhyOcpVer;
-
-        u8 HwSuppAspmClkIntrLock;
-
-        u16 NicCustLedValue;
-
-        u8 HwSuppUpsVer;
-
-        u8 HwSuppMagicPktVer;
-
-        u8 HwSuppCheckPhyDisableModeVer;
-
-        u8 random_mac;
-
-        u16 phy_reg_aner;
-        u16 phy_reg_anlpar;
-        u16 phy_reg_gbsr;
-
-        u32 HwPcieSNOffset;
-
-        u8 HwSuppEsdVer;
-        u8 TestPhyOcpReg;
-        u16 BackupPhyFuseDout_15_0;
-        u16 BackupPhyFuseDout_31_16;
-        u16 BackupPhyFuseDout_47_32;
-        u16 BackupPhyFuseDout_63_48;
-
-        const char *fw_name;
-        struct rtl8168_fw *rtl_fw;
-        u32 ocp_base;
-
-        //Dash+++++++++++++++++
-        u8 HwSuppDashVer;
-        u8 DASH;
-        u8 dash_printer_enabled;
-        u8 HwPkgDet;
-        void __iomem *mapped_cmac_ioaddr; /* mapped cmac memory map physical address */
-        void __iomem *cmac_ioaddr; /* cmac memory map physical address */
-
-#ifdef ENABLE_DASH_SUPPORT
-        u16 AfterRecvFromFwBufLen;
-        u8 AfterRecvFromFwBuf[RECV_FROM_FW_BUF_SIZE];
-        u16 AfterSendToFwBufLen;
-        u8 AfterSendToFwBuf[SEND_TO_FW_BUF_SIZE];
-        u16 SendToFwBufferLen;
-        u32 SizeOfSendToFwBuffer ;
-        u32 SizeOfSendToFwBufferMemAlloc ;
-        u32 NumOfSendToFwBuffer ;
-
-        u8 OobReq;
-        u8 OobAck;
-        u32 OobReqComplete;
-        u32 OobAckComplete;
-
-        u8 RcvFwReqSysOkEvt;
-        u8 RcvFwDashOkEvt;
-        u8 SendFwHostOkEvt;
-
-        u8 DashFwDisableRx;
-
-        void *SendToFwBuffer ;
-        dma_addr_t SendToFwBufferPhy ;
-        u8 SendingToFw;
-        PTX_DASH_SEND_FW_DESC TxDashSendFwDesc;
-        dma_addr_t TxDashSendFwDescPhy;
-        u32 SizeOfTxDashSendFwDescMemAlloc;
-        u32 SizeOfTxDashSendFwDesc ;
-        u32 NumTxDashSendFwDesc ;
-        u32 CurrNumTxDashSendFwDesc ;
-        u32 LastSendNumTxDashSendFwDesc ;
-
-        u32 NumRecvFromFwBuffer ;
-        u32 SizeOfRecvFromFwBuffer ;
-        u32 SizeOfRecvFromFwBufferMemAlloc ;
-        void *RecvFromFwBuffer ;
-        dma_addr_t RecvFromFwBufferPhy ;
-
-        PRX_DASH_FROM_FW_DESC RxDashRecvFwDesc;
-        dma_addr_t RxDashRecvFwDescPhy;
-        u32 SizeOfRxDashRecvFwDescMemAlloc;
-        u32 SizeOfRxDashRecvFwDesc ;
-        u32 NumRxDashRecvFwDesc ;
-        u32 CurrNumRxDashRecvFwDesc ;
-        u8 DashReqRegValue;
-        u16 HostReqValue;
-
-        u32 CmacResetIsrCounter;
-        u8 CmacResetIntr ;
-        u8 CmacResetting ;
-        u8 CmacOobIssueCmacReset ;
-        u32 CmacResetbyFwCnt;
-
-#if defined(ENABLE_DASH_PRINTER_SUPPORT)
-        struct completion fw_ack;
-        struct completion fw_req;
-        struct completion fw_host_ok;
-#endif
-        //Dash-----------------
-#endif //ENABLE_DASH_SUPPORT
-
-        //Realwow++++++++++++++
-        u8 HwSuppKCPOffloadVer;
-
-        u8 EnableDhcpTimeoutWake;
-        u8 EnableTeredoOffload;
-        u8 EnableKCPOffload;
-#ifdef ENABLE_REALWOW_SUPPORT
-        u32 DhcpTimeout;
-        MP_KCP_INFO MpKCPInfo;
-        //Realwow--------------
-#endif //ENABLE_REALWOW_SUPPORT
-
-        u32 eee_adv_t;
-        u8 eee_enabled;
-
-        u32 dynamic_aspm_packet_count;
-
-#ifdef ENABLE_R8168_PROCFS
-        //Procfs support
-        struct proc_dir_entry *proc_dir;
-#endif
-};
-
-enum eetype {
-        EEPROM_TYPE_NONE=0,
-        EEPROM_TYPE_93C46,
-        EEPROM_TYPE_93C56,
-        EEPROM_TWSI
-};
-
-enum mcfg {
-        CFG_METHOD_1=0,
-        CFG_METHOD_2,
-        CFG_METHOD_3,
-        CFG_METHOD_4,
-        CFG_METHOD_5,
-        CFG_METHOD_6,
-        CFG_METHOD_7,
-        CFG_METHOD_8,
-        CFG_METHOD_9 ,
-        CFG_METHOD_10,
-        CFG_METHOD_11,
-        CFG_METHOD_12,
-        CFG_METHOD_13,
-        CFG_METHOD_14,
-        CFG_METHOD_15,
-        CFG_METHOD_16,
-        CFG_METHOD_17,
-        CFG_METHOD_18,
-        CFG_METHOD_19,
-        CFG_METHOD_20,
-        CFG_METHOD_21,
-        CFG_METHOD_22,
-        CFG_METHOD_23,
-        CFG_METHOD_24,
-        CFG_METHOD_25,
-        CFG_METHOD_26,
-        CFG_METHOD_27,
-        CFG_METHOD_28,
-        CFG_METHOD_29,
-        CFG_METHOD_30,
-        CFG_METHOD_31,
-        CFG_METHOD_32,
-        CFG_METHOD_33,
-        CFG_METHOD_34,
-        CFG_METHOD_35,
-        CFG_METHOD_MAX,
-        CFG_METHOD_DEFAULT = 0xFF
-};
-
-#define LSO_32K 32000
-#define LSO_64K 64000
-
-#define NIC_MIN_PHYS_BUF_COUNT          (2)
-#define NIC_MAX_PHYS_BUF_COUNT_LSO_64K  (24)
-#define NIC_MAX_PHYS_BUF_COUNT_LSO2     (16*4)
-
-#define GTTCPHO_SHIFT                   18
-#define GTTCPHO_MAX                     0x70U
-#define GTPKTSIZE_MAX                   0x3ffffU
-#define TCPHO_SHIFT                     18
-#define TCPHO_MAX                       0x3ffU
-#define LSOPKTSIZE_MAX                  0xffffU
-#define MSS_MAX                         0x07ffu /* MSS value */
-
-#define OOB_CMD_RESET       0x00
-#define OOB_CMD_DRIVER_START    0x05
-#define OOB_CMD_DRIVER_STOP 0x06
-#define OOB_CMD_SET_IPMAC   0x41
-
-#define WAKEUP_MAGIC_PACKET_NOT_SUPPORT (0)
-#define WAKEUP_MAGIC_PACKET_V1 (1)
-#define WAKEUP_MAGIC_PACKET_V2 (2)
-
-//Ram Code Version
-#define NIC_RAMCODE_VERSION_CFG_METHOD_14 (0x0057)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_16 (0x0055)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_18 (0x0052)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_20 (0x0044)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_21 (0x0042)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_24 (0x0001)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_23 (0x0015)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_26 (0x0012)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_28 (0x0019)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_29 (0x0055)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_31 (0x0003)
-#define NIC_RAMCODE_VERSION_CFG_METHOD_35 (0x0004)
-
-//hwoptimize
-#define HW_PATCH_SOC_LAN (BIT_0)
-#define HW_PATCH_SAMSUNG_LAN_DONGLE (BIT_2)
-
-#define HW_PHY_STATUS_INI       1
-#define HW_PHY_STATUS_EXT_INI   2
-#define HW_PHY_STATUS_LAN_ON    3
-
-void rtl8168_mdio_write(struct rtl8168_private *tp, u16 RegAddr, u16 value);
-void rtl8168_mdio_prot_write(struct rtl8168_private *tp, u32 RegAddr, u32 value);
-void rtl8168_mdio_prot_direct_write_phy_ocp(struct rtl8168_private *tp, u32 RegAddr, u32 value);
-u32 rtl8168_mdio_read(struct rtl8168_private *tp, u16 RegAddr);
-u32 rtl8168_mdio_prot_read(struct rtl8168_private *tp, u32 RegAddr);
-u32 rtl8168_mdio_prot_direct_read_phy_ocp(struct rtl8168_private *tp, u32 RegAddr);
-void rtl8168_ephy_write(struct rtl8168_private *tp, int RegAddr, int value);
-void rtl8168_mac_ocp_write(struct rtl8168_private *tp, u16 reg_addr, u16 value);
-u16 rtl8168_mac_ocp_read(struct rtl8168_private *tp, u16 reg_addr);
-void rtl8168_clear_eth_phy_bit(struct rtl8168_private *tp, u8 addr, u16 mask);
-void rtl8168_set_eth_phy_bit(struct rtl8168_private *tp,  u8  addr, u16  mask);
-void rtl8168_ocp_write(struct rtl8168_private *tp, u16 addr, u8 len, u32 data);
-void rtl8168_oob_notify(struct rtl8168_private *tp, u8 cmd);
-void rtl8168_init_ring_indexes(struct rtl8168_private *tp);
-int rtl8168_eri_write(struct rtl8168_private *tp, int addr, int len, u32 value, int type);
-void rtl8168_oob_mutex_lock(struct rtl8168_private *tp);
-u32 rtl8168_ocp_read(struct rtl8168_private *tp, u16 addr, u8 len);
-u32 rtl8168_ocp_read_with_oob_base_address(struct rtl8168_private *tp, u16 addr, u8 len, u32 base_address);
-u32 rtl8168_ocp_write_with_oob_base_address(struct rtl8168_private *tp, u16 addr, u8 len, u32 value, u32 base_address);
-u32 rtl8168_eri_read(struct rtl8168_private *tp, int addr, int len, int type);
-u32 rtl8168_eri_read_with_oob_base_address(struct rtl8168_private *tp, int addr, int len, int type, u32 base_address);
-int rtl8168_eri_write_with_oob_base_address(struct rtl8168_private *tp, int addr, int len, u32 value, int type, u32 base_address);
-u16 rtl8168_ephy_read(struct rtl8168_private *tp, int RegAddr);
-void rtl8168_wait_txrx_fifo_empty(struct net_device *dev);
-void rtl8168_wait_ll_share_fifo_ready(struct net_device *dev);
-void rtl8168_enable_now_is_oob(struct rtl8168_private *tp);
-void rtl8168_disable_now_is_oob(struct rtl8168_private *tp);
-void rtl8168_oob_mutex_unlock(struct rtl8168_private *tp);
-void rtl8168_dash2_disable_tx(struct rtl8168_private *tp);
-void rtl8168_dash2_enable_tx(struct rtl8168_private *tp);
-void rtl8168_dash2_disable_rx(struct rtl8168_private *tp);
-void rtl8168_dash2_enable_rx(struct rtl8168_private *tp);
-void rtl8168_hw_disable_mac_mcu_bps(struct net_device *dev);
-
-#define HW_SUPPORT_CHECK_PHY_DISABLE_MODE(_M)        ((_M)->HwSuppCheckPhyDisableModeVer > 0 )
-#define HW_SUPP_SERDES_PHY(_M)        ((_M)->HwSuppSerDesPhyVer > 0)
-#define HW_HAS_WRITE_PHY_MCU_RAM_CODE(_M)        (((_M)->HwHasWrRamCodeToMicroP == TRUE) ? 1 : 0)
-#define HW_SUPPORT_UPS_MODE(_M)        ((_M)->HwSuppUpsVer > 0)
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)
-#define netdev_mc_count(dev) ((dev)->mc_count)
-#define netdev_mc_empty(dev) (netdev_mc_count(dev) == 0)
-#define netdev_for_each_mc_addr(mclist, dev) \
-    for (mclist = dev->mc_list; mclist; mclist = mclist->next)
-#endif
diff --git a/package/kernel/r8168/src/r8168_asf.c b/package/kernel/r8168/src/r8168_asf.c
deleted file mode 100644
index 29d7f5ae3..000000000
--- a/package/kernel/r8168/src/r8168_asf.c
+++ /dev/null
@@ -1,422 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/pci.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/delay.h>
-#include <linux/ethtool.h>
-#include <linux/mii.h>
-#include <linux/if_vlan.h>
-#include <linux/crc32.h>
-#include <linux/in.h>
-#include <linux/ip.h>
-#include <linux/tcp.h>
-#include <linux/init.h>
-#include <linux/rtnetlink.h>
-
-#include <asm/uaccess.h>
-
-#include "r8168.h"
-#include "r8168_asf.h"
-#include "rtl_eeprom.h"
-
-int rtl8168_asf_ioctl(struct net_device *dev,
-                      struct ifreq *ifr)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        void *user_data = ifr->ifr_data;
-        struct asf_ioctl_struct asf_usrdata;
-        unsigned long flags;
-
-        if (tp->mcfg != CFG_METHOD_7 && tp->mcfg != CFG_METHOD_8)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&asf_usrdata, user_data, sizeof(struct asf_ioctl_struct)))
-                return -EFAULT;
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        switch (asf_usrdata.offset) {
-        case HBPeriod:
-                rtl8168_asf_hbperiod(tp, asf_usrdata.arg, asf_usrdata.u.data);
-                break;
-        case WD8Timer:
-                break;
-        case WD16Rst:
-                rtl8168_asf_wd16rst(tp, asf_usrdata.arg, asf_usrdata.u.data);
-                break;
-        case WD8Rst:
-                rtl8168_asf_time_period(tp, asf_usrdata.arg, WD8Rst, asf_usrdata.u.data);
-                break;
-        case LSnsrPollCycle:
-                rtl8168_asf_time_period(tp, asf_usrdata.arg, LSnsrPollCycle, asf_usrdata.u.data);
-                break;
-        case ASFSnsrPollPrd:
-                rtl8168_asf_time_period(tp, asf_usrdata.arg, ASFSnsrPollPrd, asf_usrdata.u.data);
-                break;
-        case AlertReSendItvl:
-                rtl8168_asf_time_period(tp, asf_usrdata.arg, AlertReSendItvl, asf_usrdata.u.data);
-                break;
-        case SMBAddr:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, SMBAddr, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case ASFConfigR0:
-                rtl8168_asf_config_regs(tp, asf_usrdata.arg, ASFConfigR0, asf_usrdata.u.data);
-                break;
-        case ASFConfigR1:
-                rtl8168_asf_config_regs(tp, asf_usrdata.arg, ASFConfigR1, asf_usrdata.u.data);
-                break;
-        case ConsoleMA:
-                rtl8168_asf_console_mac(tp, asf_usrdata.arg, asf_usrdata.u.data);
-                break;
-        case ConsoleIP:
-                rtl8168_asf_ip_address(tp, asf_usrdata.arg, ConsoleIP, asf_usrdata.u.data);
-                break;
-        case IPAddr:
-                rtl8168_asf_ip_address(tp, asf_usrdata.arg, IPAddr, asf_usrdata.u.data);
-                break;
-        case UUID:
-                rtl8168_asf_rw_uuid(tp, asf_usrdata.arg, asf_usrdata.u.data);
-                break;
-        case IANA:
-                rtl8168_asf_rw_iana(tp, asf_usrdata.arg, asf_usrdata.u.data);
-                break;
-        case SysID:
-                rtl8168_asf_rw_systemid(tp, asf_usrdata.arg, asf_usrdata.u.data);
-                break;
-        case Community:
-                rtl8168_asf_community_string(tp, asf_usrdata.arg, asf_usrdata.u.string);
-                break;
-        case StringLength:
-                rtl8168_asf_community_string_len(tp, asf_usrdata.arg, asf_usrdata.u.data);
-                break;
-        case FmCapMsk:
-                rtl8168_asf_capability_masks(tp, asf_usrdata.arg, FmCapMsk, asf_usrdata.u.data);
-                break;
-        case SpCMDMsk:
-                rtl8168_asf_capability_masks(tp, asf_usrdata.arg, SpCMDMsk, asf_usrdata.u.data);
-                break;
-        case SysCapMsk:
-                rtl8168_asf_capability_masks(tp, asf_usrdata.arg, SysCapMsk, asf_usrdata.u.data);
-                break;
-        case RmtRstAddr:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtRstAddr, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtRstCmd:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtRstCmd, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtRstData:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtRstData, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtPwrOffAddr:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtPwrOffAddr, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtPwrOffCmd:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtPwrOffCmd, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtPwrOffData:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtPwrOffData, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtPwrOnAddr:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtPwrOnAddr, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtPwrOnCmd:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtPwrOnCmd, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtPwrOnData:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtPwrOnData, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtPCRAddr:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtPCRAddr, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtPCRCmd:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtPCRCmd, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case RmtPCRData:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, RmtPCRData, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case ASFSnsr0Addr:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, ASFSnsr0Addr, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case LSnsrAddr0:
-                rtl8168_asf_rw_hexadecimal(tp, asf_usrdata.arg, LSnsrAddr0, RW_ONE_BYTE, asf_usrdata.u.data);
-                break;
-        case KO:
-                /* Get/Set Key Operation */
-                rtl8168_asf_key_access(tp, asf_usrdata.arg, KO, asf_usrdata.u.data);
-                break;
-        case KA:
-                /* Get/Set Key Administrator */
-                rtl8168_asf_key_access(tp, asf_usrdata.arg, KA, asf_usrdata.u.data);
-                break;
-        case KG:
-                /* Get/Set Key Generation */
-                rtl8168_asf_key_access(tp, asf_usrdata.arg, KG, asf_usrdata.u.data);
-                break;
-        case KR:
-                /* Get/Set Key Random */
-                rtl8168_asf_key_access(tp, asf_usrdata.arg, KR, asf_usrdata.u.data);
-                break;
-        default:
-                spin_unlock_irqrestore(&tp->lock, flags);
-                return -EOPNOTSUPP;
-        }
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        if (copy_to_user(user_data, &asf_usrdata, sizeof(struct asf_ioctl_struct)))
-                return -EFAULT;
-
-        return 0;
-}
-
-void rtl8168_asf_hbperiod(struct rtl8168_private *tp, int arg, unsigned int *data)
-{
-        if (arg == ASF_GET)
-                data[ASFHBPERIOD] = rtl8168_eri_read(tp, HBPeriod, RW_TWO_BYTES, ERIAR_ASF);
-        else if (arg == ASF_SET) {
-                rtl8168_eri_write(tp, HBPeriod, RW_TWO_BYTES, data[ASFHBPERIOD], ERIAR_ASF);
-                rtl8168_eri_write(tp, 0x1EC, RW_ONE_BYTE, 0x07, ERIAR_ASF);
-        }
-}
-
-void rtl8168_asf_wd16rst(struct rtl8168_private *tp, int arg, unsigned int *data)
-{
-        data[ASFWD16RST] = rtl8168_eri_read(tp, WD16Rst, RW_TWO_BYTES, ERIAR_ASF);
-}
-
-void rtl8168_asf_console_mac(struct rtl8168_private *tp, int arg, unsigned int *data)
-{
-        int i;
-
-        if (arg == ASF_GET) {
-                for (i = 0; i < 6; i++)
-                        data[i] = rtl8168_eri_read(tp, ConsoleMA + i, RW_ONE_BYTE, ERIAR_ASF);
-        } else if (arg == ASF_SET) {
-                for (i = 0; i < 6; i++)
-                        rtl8168_eri_write(tp, ConsoleMA + i, RW_ONE_BYTE, data[i], ERIAR_ASF);
-
-                /* write the new console MAC address to EEPROM */
-                rtl8168_eeprom_write_sc(tp, 70, (data[1] << 8) | data[0]);
-                rtl8168_eeprom_write_sc(tp, 71, (data[3] << 8) | data[2]);
-                rtl8168_eeprom_write_sc(tp, 72, (data[5] << 8) | data[4]);
-        }
-}
-
-void rtl8168_asf_ip_address(struct rtl8168_private *tp, int arg, int offset, unsigned int *data)
-{
-        int i;
-        int eeprom_off = 0;
-
-        if (arg == ASF_GET) {
-                for (i = 0; i < 4; i++)
-                        data[i] = rtl8168_eri_read(tp, offset + i, RW_ONE_BYTE, ERIAR_ASF);
-        } else if (arg == ASF_SET) {
-                for (i = 0; i < 4; i++)
-                        rtl8168_eri_write(tp, offset + i, RW_ONE_BYTE, data[i], ERIAR_ASF);
-
-                if (offset == ConsoleIP)
-                        eeprom_off = 73;
-                else if (offset == IPAddr)
-                        eeprom_off = 75;
-
-                /* write the new IP address to EEPROM */
-                rtl8168_eeprom_write_sc(tp, eeprom_off, (data[1] << 8) | data[0]);
-                rtl8168_eeprom_write_sc(tp, eeprom_off + 1, (data[3] << 8) | data[2]);
-
-        }
-}
-
-void rtl8168_asf_config_regs(struct rtl8168_private *tp, int arg, int offset, unsigned int *data)
-{
-        unsigned int value;
-
-        if (arg == ASF_GET) {
-                data[ASFCAPABILITY] = (rtl8168_eri_read(tp, offset, RW_ONE_BYTE, ERIAR_ASF) & data[ASFCONFIG]) ? FUNCTION_ENABLE : FUNCTION_DISABLE;
-        } else if (arg == ASF_SET) {
-                value = rtl8168_eri_read(tp, offset, RW_ONE_BYTE, ERIAR_ASF);
-
-                if (data[ASFCAPABILITY] == FUNCTION_ENABLE)
-                        value |= data[ASFCONFIG];
-                else if (data[ASFCAPABILITY] == FUNCTION_DISABLE)
-                        value &= ~data[ASFCONFIG];
-
-                rtl8168_eri_write(tp, offset, RW_ONE_BYTE, value, ERIAR_ASF);
-        }
-}
-
-void rtl8168_asf_capability_masks(struct rtl8168_private *tp, int arg, int offset, unsigned int *data)
-{
-        unsigned int len, bit_mask;
-
-        bit_mask = DISABLE_MASK;
-
-        if (offset == FmCapMsk) {
-                /* System firmware capabilities */
-                len = RW_FOUR_BYTES;
-                if (data[ASFCAPMASK] == FUNCTION_ENABLE)
-                        bit_mask = FMW_CAP_MASK;
-        } else if (offset == SpCMDMsk) {
-                /* Special commands */
-                len = RW_TWO_BYTES;
-                if (data[ASFCAPMASK] == FUNCTION_ENABLE)
-                        bit_mask = SPC_CMD_MASK;
-        } else {
-                /* System capability (offset == SysCapMsk)*/
-                len = RW_ONE_BYTE;
-                if (data[ASFCAPMASK] == FUNCTION_ENABLE)
-                        bit_mask = SYS_CAP_MASK;
-        }
-
-        if (arg == ASF_GET)
-                data[ASFCAPMASK] = rtl8168_eri_read(tp, offset, len, ERIAR_ASF) ? FUNCTION_ENABLE : FUNCTION_DISABLE;
-        else /* arg == ASF_SET */
-                rtl8168_eri_write(tp, offset, len, bit_mask, ERIAR_ASF);
-}
-
-void rtl8168_asf_community_string(struct rtl8168_private *tp, int arg, char *string)
-{
-        int i;
-
-        if (arg == ASF_GET) {
-                for (i = 0; i < COMMU_STR_MAX_LEN; i++)
-                        string[i] = rtl8168_eri_read(tp, Community + i, RW_ONE_BYTE, ERIAR_ASF);
-        } else { /* arg == ASF_SET */
-                for (i = 0; i < COMMU_STR_MAX_LEN; i++)
-                        rtl8168_eri_write(tp, Community + i, RW_ONE_BYTE, string[i], ERIAR_ASF);
-        }
-}
-
-void rtl8168_asf_community_string_len(struct rtl8168_private *tp, int arg, unsigned int *data)
-{
-        if (arg == ASF_GET)
-                data[ASFCOMMULEN] = rtl8168_eri_read(tp, StringLength, RW_ONE_BYTE, ERIAR_ASF);
-        else /* arg == ASF_SET */
-                rtl8168_eri_write(tp, StringLength, RW_ONE_BYTE, data[ASFCOMMULEN], ERIAR_ASF);
-}
-
-void rtl8168_asf_time_period(struct rtl8168_private *tp, int arg, int offset, unsigned int *data)
-{
-        int pos = 0;
-
-        if (offset == WD8Rst)
-                pos = ASFWD8RESET;
-        else if (offset == LSnsrPollCycle)
-                pos = ASFLSNRPOLLCYC;
-        else if (offset == ASFSnsrPollPrd)
-                pos = ASFSNRPOLLCYC;
-        else if (offset == AlertReSendItvl)
-                pos = ASFALERTRESND;
-
-        if (arg == ASF_GET)
-                data[pos] = rtl8168_eri_read(tp, offset, RW_ONE_BYTE, ERIAR_ASF);
-        else /* arg == ASF_SET */
-                rtl8168_eri_write(tp, offset, RW_ONE_BYTE, data[pos], ERIAR_ASF);
-
-}
-
-void rtl8168_asf_key_access(struct rtl8168_private *tp, int arg, int offset, unsigned int *data)
-{
-        int i, j;
-        int key_off = 0;
-
-        if (arg == ASF_GET) {
-                for (i = 0; i < KEY_LEN; i++)
-                        data[i] = rtl8168_eri_read(tp, offset + KEY_LEN - (i + 1), RW_ONE_BYTE, ERIAR_ASF);
-        } else {
-                if (offset == KO)
-                        key_off = 162;
-                else if (offset == KA)
-                        key_off = 172;
-                else if (offset == KG)
-                        key_off = 182;
-                else if (offset == KR)
-                        key_off = 192;
-
-                /* arg == ASF_SET */
-                for (i = 0; i < KEY_LEN; i++)
-                        rtl8168_eri_write(tp, offset + KEY_LEN - (i + 1), RW_ONE_BYTE, data[i], ERIAR_ASF);
-
-                /* write the new key to EEPROM */
-                for (i = 0, j = 19; i < 10; i++, j = j - 2)
-                        rtl8168_eeprom_write_sc(tp, key_off + i, (data[j - 1] << 8) | data[j]);
-        }
-}
-
-void rtl8168_asf_rw_hexadecimal(struct rtl8168_private *tp, int arg, int offset, int len, unsigned int *data)
-{
-        if (arg == ASF_GET)
-                data[ASFRWHEXNUM] = rtl8168_eri_read(tp, offset, len, ERIAR_ASF);
-        else /* arg == ASF_SET */
-                rtl8168_eri_write(tp, offset, len, data[ASFRWHEXNUM], ERIAR_ASF);
-}
-
-void rtl8168_asf_rw_systemid(struct rtl8168_private *tp, int arg, unsigned int *data)
-{
-        int i;
-
-        if (arg == ASF_GET)
-                for (i = 0; i < SYSID_LEN ; i++)
-                        data[i] = rtl8168_eri_read(tp, SysID + i, RW_ONE_BYTE, ERIAR_ASF);
-        else /* arg == ASF_SET */
-                for (i = 0; i < SYSID_LEN ; i++)
-                        rtl8168_eri_write(tp, SysID + i, RW_ONE_BYTE, data[i], ERIAR_ASF);
-}
-
-void rtl8168_asf_rw_iana(struct rtl8168_private *tp, int arg, unsigned int *data)
-{
-        int i;
-
-        if (arg == ASF_GET)
-                for (i = 0; i < RW_FOUR_BYTES; i++)
-                        data[i] = rtl8168_eri_read(tp, IANA + i, RW_ONE_BYTE, ERIAR_ASF);
-        else /* arg == ASF_SET */
-                for (i = 0; i < RW_FOUR_BYTES; i++)
-                        rtl8168_eri_write(tp, IANA + i, RW_ONE_BYTE, data[i], ERIAR_ASF);
-}
-
-void rtl8168_asf_rw_uuid(struct rtl8168_private *tp, int arg, unsigned int *data)
-{
-        int i, j;
-
-        if (arg == ASF_GET)
-                for (i = UUID_LEN - 1, j = 0; i >= 0 ; i--, j++)
-                        data[j] = rtl8168_eri_read(tp, UUID + i, RW_ONE_BYTE, ERIAR_ASF);
-        else /* arg == ASF_SET */
-                for (i = UUID_LEN - 1, j = 0; i >= 0 ; i--, j++)
-                        rtl8168_eri_write(tp, UUID + i, RW_ONE_BYTE, data[j], ERIAR_ASF);
-}
diff --git a/package/kernel/r8168/src/r8168_asf.h b/package/kernel/r8168/src/r8168_asf.h
deleted file mode 100644
index 4c532ec2f..000000000
--- a/package/kernel/r8168/src/r8168_asf.h
+++ /dev/null
@@ -1,295 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#define SIOCDEVPRIVATE_RTLASF   SIOCDEVPRIVATE
-
-#define FUNCTION_ENABLE		1
-#define FUNCTION_DISABLE	0
-
-#define ASFCONFIG	0
-#define ASFCAPABILITY	1
-#define ASFCOMMULEN	0
-#define ASFHBPERIOD	0
-#define ASFWD16RST	0
-#define ASFCAPMASK	0
-#define ASFALERTRESND	0
-#define ASFLSNRPOLLCYC	0
-#define ASFSNRPOLLCYC	0
-#define ASFWD8RESET	0
-#define ASFRWHEXNUM	0
-
-#define FMW_CAP_MASK	0x0000F867
-#define SPC_CMD_MASK	0x1F00
-#define SYS_CAP_MASK	0xFF
-#define DISABLE_MASK	0x00
-
-#define MAX_DATA_LEN	200
-#define MAX_STR_LEN	200
-
-#define COMMU_STR_MAX_LEN	23
-
-#define KEY_LEN		20
-#define UUID_LEN	16
-#define SYSID_LEN	2
-
-#define RW_ONE_BYTE	1
-#define RW_TWO_BYTES	2
-#define RW_FOUR_BYTES	4
-
-enum asf_registers {
-        HBPeriod	= 0x0000,
-        WD8Rst		= 0x0002,
-        WD8Timer	= 0x0003,
-        WD16Rst		= 0x0004,
-        LSnsrPollCycle	= 0x0006,
-        ASFSnsrPollPrd	= 0x0007,
-        AlertReSendCnt	= 0x0008,
-        AlertReSendItvl	= 0x0009,
-        SMBAddr		= 0x000A,
-        SMBCap		= 0x000B,
-        ASFConfigR0	= 0x000C,
-        ASFConfigR1	= 0x000D,
-        WD16Timer	= 0x000E,
-        ConsoleMA	= 0x0010,
-        ConsoleIP	= 0x0016,
-        IPAddr		= 0x001A,
-
-        UUID		= 0x0020,
-        IANA		= 0x0030,
-        SysID		= 0x0034,
-        Community	= 0x0036,
-        StringLength	= 0x004D,
-        LC		= 0x004E,
-        EntityInst	= 0x004F,
-        FmCapMsk	= 0x0050,
-        SpCMDMsk	= 0x0054,
-        SysCapMsk	= 0x0056,
-        WDSysSt		= 0x0057,
-        RxMsgType	= 0x0058,
-        RxSpCMD		= 0x0059,
-        RxSpCMDPa	= 0x005A,
-        RxBtOpMsk	= 0x005C,
-        RmtRstAddr	= 0x005E,
-        RmtRstCmd	= 0x005F,
-        RmtRstData	= 0x0060,
-        RmtPwrOffAddr	= 0x0061,
-        RmtPwrOffCmd	= 0x0062,
-        RmtPwrOffData	= 0x0063,
-        RmtPwrOnAddr	= 0x0064,
-        RmtPwrOnCmd	= 0x0065,
-        RmtPwrOnData	= 0x0066,
-        RmtPCRAddr	= 0x0067,
-        RmtPCRCmd	= 0x0068,
-        RmtPCRData	= 0x0069,
-        RMCP_IANA	= 0x006A,
-        RMCP_OEM	= 0x006E,
-        ASFSnsr0Addr	= 0x0070,
-
-        ASFSnsrEvSt	= 0x0073,
-        ASFSnsrEvAlert	= 0x0081,
-
-        LSnsrNo		= 0x00AD,
-        AssrtEvntMsk	= 0x00AE,
-        DeAssrtEvntMsk	= 0x00AF,
-
-        LSnsrAddr0	= 0x00B0,
-        LAlertCMD0	= 0x00B1,
-        LAlertDataMsk0	= 0x00B2,
-        LAlertCmp0	= 0x00B3,
-        LAlertESnsrT0	= 0x00B4,
-        LAlertET0	= 0x00B5,
-        LAlertEOffset0	= 0x00B6,
-        LAlertES0	= 0x00B7,
-        LAlertSN0	= 0x00B8,
-        LAlertEntity0	= 0x00B9,
-        LAlertEI0	= 0x00BA,
-        LSnsrState0	= 0x00BB,
-
-        LSnsrAddr1	= 0x00BD,
-        LAlertCMD1	= 0x00BE,
-        LAlertDataMsk1	= 0x00BF,
-        LAlertCmp1	= 0x00C0,
-        LAlertESnsrT1	= 0x00C1,
-        LAlertET1	= 0x00C2,
-        LAlertEOffset1	= 0x00C3,
-        LAlertES1	= 0x00C4,
-        LAlertSN1	= 0x00C5,
-        LAlertEntity1	= 0x00C6,
-        LAlertEI1	= 0x00C7,
-        LSnsrState1	= 0x00C8,
-
-        LSnsrAddr2	= 0x00CA,
-        LAlertCMD2	= 0x00CB,
-        LAlertDataMsk2	= 0x00CC,
-        LAlertCmp2	= 0x00CD,
-        LAlertESnsrT2	= 0x00CE,
-        LAlertET2	= 0x00CF,
-        LAlertEOffset2	= 0x00D0,
-        LAlertES2	= 0x00D1,
-        LAlertSN2	= 0x00D2,
-        LAlertEntity2	= 0x00D3,
-        LAlertEI2	= 0x00D4,
-        LSnsrState2	= 0x00D5,
-
-        LSnsrAddr3	= 0x00D7,
-        LAlertCMD3	= 0x00D8,
-        LAlertDataMsk3	= 0x00D9,
-        LAlertCmp3	= 0x00DA,
-        LAlertESnsrT3	= 0x00DB,
-        LAlertET3	= 0x00DC,
-        LAlertEOffset3	= 0x00DD,
-        LAlertES3	= 0x00DE,
-        LAlertSN3	= 0x00DF,
-        LAlertEntity3	= 0x00E0,
-        LAlertEI3	= 0x00E1,
-        LSnsrState3	= 0x00E2,
-
-        LSnsrAddr4	= 0x00E4,
-        LAlertCMD4	= 0x00E5,
-        LAlertDataMsk4	= 0x00E6,
-        LAlertCmp4	= 0x00E7,
-        LAlertESnsrT4	= 0x00E8,
-        LAlertET4	= 0x00E9,
-        LAlertEOffset4	= 0x00EA,
-        LAlertES4	= 0x00EB,
-        LAlertSN4	= 0x00EC,
-        LAlertEntity4	= 0x00ED,
-        LAlertEI4	= 0x00EE,
-        LSnsrState4	= 0x00EF,
-
-        LSnsrAddr5	= 0x00F1,
-        LAlertCMD5	= 0x00F2,
-        LAlertDataMsk5	= 0x00F3,
-        LAlertCmp5	= 0x00F4,
-        LAlertESnsrT5	= 0x00F5,
-        LAlertET5	= 0x00F6,
-        LAlertEOffset5	= 0x00F7,
-        LAlertES5	= 0x00F8,
-        LAlertSN5	= 0x00F9,
-        LAlertEntity5	= 0x00FA,
-        LAlertEI5	= 0x00FB,
-        LSnsrState5	= 0x00FC,
-
-        LSnsrAddr6	= 0x00FE,
-        LAlertCMD6	= 0x00FF,
-        LAlertDataMsk6	= 0x0100,
-        LAlertCmp6	= 0x0101,
-        LAlertESnsrT6	= 0x0102,
-        LAlertET6	= 0x0103,
-        LAlertEOffset6	= 0x0104,
-        LAlertES6	= 0x0105,
-        LAlertSN6	= 0x0106,
-        LAlertEntity6	= 0x0107,
-        LAlertEI6	= 0x0108,
-        LSnsrState6	= 0x0109,
-
-        LSnsrAddr7	= 0x010B,
-        LAlertCMD7	= 0x010C,
-        LAlertDataMsk7	= 0x010D,
-        LAlertCmp7	= 0x010E,
-        LAlertESnsrT7	= 0x010F,
-        LAlertET7	= 0x0110,
-        LAlertEOffset7	= 0x0111,
-        LAlertES7	= 0x0112,
-        LAlertSN7	= 0x0113,
-        LAlertEntity7	= 0x0114,
-        LAlertEI7	= 0x0115,
-        LSnsrState7	= 0x0116,
-        LAssert		= 0x0117,
-        LDAssert	= 0x0118,
-        IPServiceType	= 0x0119,
-        IPIdfr		= 0x011A,
-        FlagFOffset	= 0x011C,
-        TTL		= 0x011E,
-        HbtEI		= 0x011F,
-        MgtConSID1	= 0x0120,
-        MgtConSID2	= 0x0124,
-        MgdCltSID	= 0x0128,
-        StCd		= 0x012C,
-        MgtConUR	= 0x012D,
-        MgtConUNL	= 0x012E,
-
-        AuthPd		= 0x0130,
-        IntyPd		= 0x0138,
-        MgtConRN	= 0x0140,
-        MgdCtlRN	= 0x0150,
-        MgtConUN	= 0x0160,
-        Rakp2IntCk	= 0x0170,
-        KO		= 0x017C,
-        KA		= 0x0190,
-        KG		= 0x01A4,
-        KR		= 0x01B8,
-        CP		= 0x01CC,
-        CQ		= 0x01D0,
-        KC		= 0x01D4,
-        ConsoleSid	= 0x01E8,
-
-        SIK1		= 0x01FC,
-        SIK2		= 0x0210,
-        Udpsrc_port	= 0x0224,
-        Udpdes_port	= 0x0226,
-        Asf_debug_mux	= 0x0228
-};
-
-enum asf_cmdln_opt {
-        ASF_GET,
-        ASF_SET,
-        ASF_HELP
-};
-
-struct asf_ioctl_struct {
-        unsigned int arg;
-        unsigned int offset;
-        union {
-                unsigned int data[MAX_DATA_LEN];
-                char string[MAX_STR_LEN];
-        } u;
-};
-
-int rtl8168_asf_ioctl(struct net_device *dev, struct ifreq *ifr);
-void rtl8168_asf_hbperiod(struct rtl8168_private *tp, int arg, unsigned int *data);
-void rtl8168_asf_wd16rst(struct rtl8168_private *tp, int arg, unsigned int *data);
-void rtl8168_asf_console_mac(struct rtl8168_private *, int arg, unsigned int *data);
-void rtl8168_asf_ip_address(struct rtl8168_private *, int arg, int offset, unsigned int *data);
-void rtl8168_asf_config_regs(struct rtl8168_private *tp, int arg, int offset, unsigned int *data);
-void rtl8168_asf_capability_masks(struct rtl8168_private *tp, int arg, int offset, unsigned int *data);
-void rtl8168_asf_community_string(struct rtl8168_private *tp, int arg, char *string);
-void rtl8168_asf_community_string_len(struct rtl8168_private *tp, int arg, unsigned int *data);
-void rtl8168_asf_alert_resend_interval(struct rtl8168_private *tp, int arg, unsigned int *data);
-void rtl8168_asf_time_period(struct rtl8168_private *tp, int arg, int offset, unsigned int *data);
-void rtl8168_asf_key_access(struct rtl8168_private *, int arg, int offset, unsigned int *data);
-void rtl8168_asf_rw_hexadecimal(struct rtl8168_private *tp, int arg, int offset, int len, unsigned int *data);
-void rtl8168_asf_rw_iana(struct rtl8168_private *tp, int arg, unsigned int *data);
-void rtl8168_asf_rw_uuid(struct rtl8168_private *tp, int arg, unsigned int *data);
-void rtl8168_asf_rw_systemid(struct rtl8168_private *tp, int arg, unsigned int *data);
diff --git a/package/kernel/r8168/src/r8168_dash.h b/package/kernel/r8168/src/r8168_dash.h
deleted file mode 100644
index 094775300..000000000
--- a/package/kernel/r8168/src/r8168_dash.h
+++ /dev/null
@@ -1,256 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#ifndef _LINUX_R8168_DASH_H
-#define _LINUX_R8168_DASH_H
-
-#define SIOCDEVPRIVATE_RTLDASH   SIOCDEVPRIVATE+2
-
-enum rtl_dash_cmd {
-        RTL_DASH_ARP_NS_OFFLOAD = 0,
-        RTL_DASH_SET_OOB_IPMAC,
-        RTL_DASH_NOTIFY_OOB,
-
-        RTL_DASH_SEND_BUFFER_DATA_TO_DASH_FW,
-        RTL_DASH_CHECK_SEND_BUFFER_TO_DASH_FW_COMPLETE,
-        RTL_DASH_GET_RCV_FROM_FW_BUFFER_DATA,
-        RTL_DASH_OOB_REQ,
-        RTL_DASH_OOB_ACK,
-        RTL_DASH_DETACH_OOB_REQ,
-        RTL_DASH_DETACH_OOB_ACK,
-
-        RTL_FW_SET_IPV4 = 0x10,
-        RTL_FW_GET_IPV4,
-        RTL_FW_SET_IPV6,
-        RTL_FW_GET_IPV6,
-        RTL_FW_SET_EXT_SNMP,
-        RTL_FW_GET_EXT_SNMP,
-        RTL_FW_SET_WAKEUP_PATTERN,
-        RTL_FW_GET_WAKEUP_PATTERN,
-        RTL_FW_DEL_WAKEUP_PATTERN,
-
-        RTLT_DASH_COMMAND_INVALID,
-};
-
-struct rtl_dash_ip_mac {
-        struct sockaddr ifru_addr;
-        struct sockaddr ifru_netmask;
-        struct sockaddr ifru_hwaddr;
-};
-
-struct rtl_dash_ioctl_struct {
-        __u32	cmd;
-        __u32	offset;
-        __u32	len;
-        union {
-                __u32	data;
-                void *data_buffer;
-        };
-};
-
-struct settings_ipv4 {
-        __u32	IPv4addr;
-        __u32	IPv4mask;
-        __u32	IPv4Gateway;
-};
-
-struct settings_ipv6 {
-        __u32	reserved;
-        __u32	prefixLen;
-        __u16	IPv6addr[8];
-        __u16	IPv6Gateway[8];
-};
-
-struct settings_ext_snmp {
-        __u16	index;
-        __u16	oid_get_len;
-        __u8	oid_for_get[24];
-        __u8	reserved0[26];
-        __u16	value_len;
-        __u8	value[256];
-        __u8	supported;
-        __u8	reserved1[27];
-};
-
-struct wakeup_pattern {
-        __u8	index;
-        __u8	valid;
-        __u8	start;
-        __u8	length;
-        __u8	name[36];
-        __u8	mask[16];
-        __u8	pattern[128];
-        __u32	reserved[2];
-};
-
-typedef struct _RX_DASH_FROM_FW_DESC {
-        __le16 length;
-        __le16 status;
-        __le32 resv;
-        __le64 BufferAddress;
-}
-RX_DASH_FROM_FW_DESC, *PRX_DASH_FROM_FW_DESC;
-
-typedef struct _TX_DASH_SEND_FW_DESC {
-        __le16 length;
-        __le16 status;
-        __le32 resv;
-        __le64 BufferAddress;
-}
-TX_DASH_SEND_FW_DESC, *PTX_DASH_SEND_FW_DESC;
-
-typedef struct _OSOOBHdr {
-        __le32 len;
-        u8 type;
-        u8 flag;
-        u8 hostReqV;
-        u8 res;
-}
-OSOOBHdr, *POSOOBHdr;
-
-typedef struct _RX_DASH_BUFFER_TYPE_2 {
-        OSOOBHdr oobhdr;
-        u8 RxDataBuffer[0];
-}
-RX_DASH_BUFFER_TYPE_2, *PRX_DASH_BUFFER_TYPE_2;
-
-#define ALIGN_8                 (0x7)
-#define ALIGN_16                (0xf)
-#define ALIGN_32                (0x1f)
-#define ALIGN_64                (0x3f)
-#define ALIGN_256               (0xff)
-#define ALIGN_4096              (0xfff)
-
-#define OCP_REG_CONFIG0 (0x10)
-#define OCP_REG_CONFIG0_REV_F (0xB8)
-#define OCP_REG_DASH_POLL (0x30)
-#define OCP_REG_HOST_REQ (0x34)
-#define OCP_REG_DASH_REQ (0x35)
-#define OCP_REG_CR (0x36)
-#define OCP_REG_DMEMSTA (0x38)
-#define OCP_REG_GPHYAR (0x60)
-
-
-#define OCP_REG_CONFIG0_DASHEN           BIT_15
-#define OCP_REG_CONFIG0_OOBRESET         BIT_14
-#define OCP_REG_CONFIG0_APRDY            BIT_13
-#define OCP_REG_CONFIG0_FIRMWARERDY      BIT_12
-#define OCP_REG_CONFIG0_DRIVERRDY        BIT_11
-#define OCP_REG_CONFIG0_OOB_WDT          BIT_9
-#define OCP_REG_CONFIG0_DRV_WAIT_OOB     BIT_8
-#define OCP_REG_CONFIG0_TLSEN            BIT_7
-
-#define HW_DASH_SUPPORT_DASH(_M)        ((_M)->HwSuppDashVer > 0)
-#define HW_DASH_SUPPORT_TYPE_1(_M)        ((_M)->HwSuppDashVer == 1)
-#define HW_DASH_SUPPORT_TYPE_2(_M)        ((_M)->HwSuppDashVer == 2)
-#define HW_DASH_SUPPORT_TYPE_3(_M)        ((_M)->HwSuppDashVer == 3)
-
-#define RECV_FROM_FW_BUF_SIZE (2048)
-#define SEND_TO_FW_BUF_SIZE (2048)
-
-#define RX_DASH_FROM_FW_OWN BIT_15
-#define TX_DASH_SEND_FW_OWN BIT_15
-
-#define TXS_CC3_0       (BIT_0|BIT_1|BIT_2|BIT_3)
-#define TXS_EXC         BIT_4
-#define TXS_LNKF        BIT_5
-#define TXS_OWC         BIT_6
-#define TXS_TES         BIT_7
-#define TXS_UNF         BIT_9
-#define TXS_LGSEN       BIT_11
-#define TXS_LS          BIT_12
-#define TXS_FS          BIT_13
-#define TXS_EOR         BIT_14
-#define TXS_OWN         BIT_15
-
-#define TPPool_HRDY     0x20
-
-#define HostReqReg (0xC0)
-#define SystemMasterDescStartAddrLow (0xF0)
-#define SystemMasterDescStartAddrHigh (0xF4)
-#define SystemSlaveDescStartAddrLow (0xF8)
-#define SystemSlaveDescStartAddrHigh (0xFC)
-
-//DASH Request Type
-#define WSMANREG 0x01
-#define OSPUSHDATA 0x02
-
-#define RXS_OWN      BIT_15
-#define RXS_EOR      BIT_14
-#define RXS_FS       BIT_13
-#define RXS_LS       BIT_12
-
-#define ISRIMR_DP_DASH_OK BIT_15
-#define ISRIMR_DP_HOST_OK BIT_13
-#define ISRIMR_DP_REQSYS_OK BIT_11
-
-#define ISRIMR_DASH_INTR_EN BIT_12
-#define ISRIMR_DASH_INTR_CMAC_RESET BIT_15
-
-#define ISRIMR_DASH_TYPE2_ROK BIT_0
-#define ISRIMR_DASH_TYPE2_RDU BIT_1
-#define ISRIMR_DASH_TYPE2_TOK BIT_2
-#define ISRIMR_DASH_TYPE2_TDU BIT_3
-#define ISRIMR_DASH_TYPE2_TX_FIFO_FULL BIT_4
-#define ISRIMR_DASH_TYPE2_TX_DISABLE_IDLE BIT_5
-#define ISRIMR_DASH_TYPE2_RX_DISABLE_IDLE BIT_6
-
-#define CMAC_OOB_STOP 0x25
-#define CMAC_OOB_INIT 0x26
-#define CMAC_OOB_RESET 0x2a
-
-#define NO_BASE_ADDRESS 0x00000000
-#define RTL8168FP_OOBMAC_BASE 0xBAF70000
-#define RTL8168FP_CMAC_IOBASE 0xBAF20000
-#define RTL8168FP_KVM_BASE 0xBAF80400
-#define CMAC_SYNC_REG 0x20
-#define CMAC_RXDESC_OFFSET 0x90    //RX: 0x90 - 0x98
-#define CMAC_TXDESC_OFFSET 0x98    //TX: 0x98 - 0x9F
-
-/* cmac write/read MMIO register */
-#define RTL_CMAC_W8(tp, reg, val8)   writeb ((val8), tp->cmac_ioaddr + (reg))
-#define RTL_CMAC_W16(tp, reg, val16) writew ((val16), tp->cmac_ioaddr + (reg))
-#define RTL_CMAC_W32(tp, reg, val32) writel ((val32), tp->cmac_ioaddr + (reg))
-#define RTL_CMAC_R8(tp, reg)     readb (tp->cmac_ioaddr + (reg))
-#define RTL_CMAC_R16(tp, reg)        readw (tp->cmac_ioaddr + (reg))
-#define RTL_CMAC_R32(tp, reg)        ((unsigned long) readl (tp->cmac_ioaddr + (reg)))
-
-int rtl8168_dash_ioctl(struct net_device *dev, struct ifreq *ifr);
-void HandleDashInterrupt(struct net_device *dev);
-int AllocateDashShareMemory(struct net_device *dev);
-void FreeAllocatedDashShareMemory(struct net_device *dev);
-void DashHwInit(struct net_device *dev);
-
-
-#endif /* _LINUX_R8168_DASH_H */
diff --git a/package/kernel/r8168/src/r8168_fiber.h b/package/kernel/r8168/src/r8168_fiber.h
deleted file mode 100644
index 6a01b3993..000000000
--- a/package/kernel/r8168/src/r8168_fiber.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#ifndef _LINUX_R8168_FIBER_H
-#define _LINUX_R8168_FIBER_H
-
-enum {
-        FIBER_MODE_NIC_ONLY = 0,
-        FIBER_MODE_RTL8168H_RTL8211FS,
-        FIBER_MODE_RTL8168H_MDI_SWITCH_RTL8211FS,
-        FIBER_MODE_MAX
-};
-
-enum {
-        FIBER_STAT_NOT_CHECKED = 0,
-        FIBER_STAT_CONNECT_EEPROM,
-        FIBER_STAT_DISCONNECT,
-        FIBER_STAT_CONNECT_GPO,
-        FIBER_STAT_MAX
-};
-
-enum {
-        FIBER_LED_MODE_DEFAULT = 0,
-        FIBER_LED_MODE_1,
-        FIBER_LED_MODE_MAX
-};
-
-#define HW_FIBER_MODE_ENABLED(_M)        ((_M)->HwFiberModeVer > 0)
-#define HW_FIBER_STATUS_CONNECTED(_M)        (((_M)->HwFiberStat == FIBER_STAT_CONNECT_EEPROM) || ((_M)->HwFiberStat == FIBER_STAT_CONNECT_GPO))
-#define HW_FIBER_STATUS_DISCONNECTED(_M)        ((_M)->HwFiberStat == FIBER_STAT_DISCONNECT)
-
-struct rtl8168_private;
-
-void rtl8168_hw_init_fiber_nic(struct rtl8168_private *tp);
-void rtl8168_hw_fiber_nic_d3_para(struct rtl8168_private *tp);
-void rtl8168_hw_fiber_phy_config(struct rtl8168_private *tp);
-void rtl8168_hw_switch_mdi_to_fiber(struct rtl8168_private *tp);
-void rtl8168_hw_switch_mdi_to_nic(struct rtl8168_private *tp);
-unsigned int rtl8168_hw_fiber_link_ok(struct rtl8168_private *tp);
-void rtl8168_check_fiber_link_status(struct rtl8168_private *tp);
-void rtl8168_check_hw_fiber_mode_support(struct rtl8168_private *tp);
-void rtl8168_set_fiber_mode_software_variable(struct rtl8168_private *tp);
-
-#endif /* _LINUX_R8168_FIBER_H */
diff --git a/package/kernel/r8168/src/r8168_firmware.c b/package/kernel/r8168/src/r8168_firmware.c
deleted file mode 100644
index 285498b50..000000000
--- a/package/kernel/r8168/src/r8168_firmware.c
+++ /dev/null
@@ -1,264 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#include <linux/version.h>
-#include <linux/delay.h>
-#include <linux/firmware.h>
-
-#include "r8168_firmware.h"
-
-enum rtl_fw_opcode {
-        PHY_READ		= 0x0,
-        PHY_DATA_OR		= 0x1,
-        PHY_DATA_AND		= 0x2,
-        PHY_BJMPN		= 0x3,
-        PHY_MDIO_CHG		= 0x4,
-        PHY_CLEAR_READCOUNT	= 0x7,
-        PHY_WRITE		= 0x8,
-        PHY_READCOUNT_EQ_SKIP	= 0x9,
-        PHY_COMP_EQ_SKIPN	= 0xa,
-        PHY_COMP_NEQ_SKIPN	= 0xb,
-        PHY_WRITE_PREVIOUS	= 0xc,
-        PHY_SKIPN		= 0xd,
-        PHY_DELAY_MS		= 0xe,
-};
-
-struct fw_info {
-        u32	magic;
-        char	version[RTL8168_VER_SIZE];
-        __le32	fw_start;
-        __le32	fw_len;
-        u8	chksum;
-} __packed;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,16,0)
-#define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER))
-#endif
-#define FW_OPCODE_SIZE sizeof_field(struct rtl8168_fw_phy_action, code[0])
-
-static bool rtl8168_fw_format_ok(struct rtl8168_fw *rtl_fw)
-{
-        const struct firmware *fw = rtl_fw->fw;
-        struct fw_info *fw_info = (struct fw_info *)fw->data;
-        struct rtl8168_fw_phy_action *pa = &rtl_fw->phy_action;
-
-        if (fw->size < FW_OPCODE_SIZE)
-                return false;
-
-        if (!fw_info->magic) {
-                size_t i, size, start;
-                u8 checksum = 0;
-
-                if (fw->size < sizeof(*fw_info))
-                        return false;
-
-                for (i = 0; i < fw->size; i++)
-                        checksum += fw->data[i];
-                if (checksum != 0)
-                        return false;
-
-                start = le32_to_cpu(fw_info->fw_start);
-                if (start > fw->size)
-                        return false;
-
-                size = le32_to_cpu(fw_info->fw_len);
-                if (size > (fw->size - start) / FW_OPCODE_SIZE)
-                        return false;
-
-                strscpy(rtl_fw->version, fw_info->version, RTL8168_VER_SIZE);
-
-                pa->code = (__le32 *)(fw->data + start);
-                pa->size = size;
-        } else {
-                if (fw->size % FW_OPCODE_SIZE)
-                        return false;
-
-                strscpy(rtl_fw->version, rtl_fw->fw_name, RTL8168_VER_SIZE);
-
-                pa->code = (__le32 *)fw->data;
-                pa->size = fw->size / FW_OPCODE_SIZE;
-        }
-
-        return true;
-}
-
-static bool rtl8168_fw_data_ok(struct rtl8168_fw *rtl_fw)
-{
-        struct rtl8168_fw_phy_action *pa = &rtl_fw->phy_action;
-        size_t index;
-
-        for (index = 0; index < pa->size; index++) {
-                u32 action = le32_to_cpu(pa->code[index]);
-                u32 val = action & 0x0000ffff;
-                u32 regno = (action & 0x0fff0000) >> 16;
-
-                switch (action >> 28) {
-                case PHY_READ:
-                case PHY_DATA_OR:
-                case PHY_DATA_AND:
-                case PHY_CLEAR_READCOUNT:
-                case PHY_WRITE:
-                case PHY_WRITE_PREVIOUS:
-                case PHY_DELAY_MS:
-                        break;
-
-                case PHY_MDIO_CHG:
-                        if (val > 1)
-                                goto out;
-                        break;
-
-                case PHY_BJMPN:
-                        if (regno > index)
-                                goto out;
-                        break;
-                case PHY_READCOUNT_EQ_SKIP:
-                        if (index + 2 >= pa->size)
-                                goto out;
-                        break;
-                case PHY_COMP_EQ_SKIPN:
-                case PHY_COMP_NEQ_SKIPN:
-                case PHY_SKIPN:
-                        if (index + 1 + regno >= pa->size)
-                                goto out;
-                        break;
-
-                default:
-                        dev_err(rtl_fw->dev, "Invalid action 0x%08x\n", action);
-                        return false;
-                }
-        }
-
-        return true;
-out:
-        dev_err(rtl_fw->dev, "Out of range of firmware\n");
-        return false;
-}
-
-void rtl8168_fw_write_firmware(struct rtl8168_private *tp, struct rtl8168_fw *rtl_fw)
-{
-        struct rtl8168_fw_phy_action *pa = &rtl_fw->phy_action;
-        rtl8168_fw_write_t fw_write = rtl_fw->phy_write;
-        rtl8168_fw_read_t fw_read = rtl_fw->phy_read;
-        int predata = 0, count = 0;
-        size_t index;
-
-        for (index = 0; index < pa->size; index++) {
-                u32 action = le32_to_cpu(pa->code[index]);
-                u32 data = action & 0x0000ffff;
-                u32 regno = (action & 0x0fff0000) >> 16;
-                enum rtl_fw_opcode opcode = action >> 28;
-
-                if (!action)
-                        break;
-
-                switch (opcode) {
-                case PHY_READ:
-                        predata = fw_read(tp, regno);
-                        count++;
-                        break;
-                case PHY_DATA_OR:
-                        predata |= data;
-                        break;
-                case PHY_DATA_AND:
-                        predata &= data;
-                        break;
-                case PHY_BJMPN:
-                        index -= (regno + 1);
-                        break;
-                case PHY_MDIO_CHG:
-                        if (data) {
-                                fw_write = rtl_fw->mac_mcu_write;
-                                fw_read = rtl_fw->mac_mcu_read;
-                        } else {
-                                fw_write = rtl_fw->phy_write;
-                                fw_read = rtl_fw->phy_read;
-                        }
-
-                        break;
-                case PHY_CLEAR_READCOUNT:
-                        count = 0;
-                        break;
-                case PHY_WRITE:
-                        fw_write(tp, regno, data);
-                        break;
-                case PHY_READCOUNT_EQ_SKIP:
-                        if (count == data)
-                                index++;
-                        break;
-                case PHY_COMP_EQ_SKIPN:
-                        if (predata == data)
-                                index += regno;
-                        break;
-                case PHY_COMP_NEQ_SKIPN:
-                        if (predata != data)
-                                index += regno;
-                        break;
-                case PHY_WRITE_PREVIOUS:
-                        fw_write(tp, regno, predata);
-                        break;
-                case PHY_SKIPN:
-                        index += regno;
-                        break;
-                case PHY_DELAY_MS:
-                        mdelay(data);
-                        break;
-                }
-        }
-}
-
-void rtl8168_fw_release_firmware(struct rtl8168_fw *rtl_fw)
-{
-        release_firmware(rtl_fw->fw);
-}
-
-int rtl8168_fw_request_firmware(struct rtl8168_fw *rtl_fw)
-{
-        int rc;
-
-        rc = request_firmware(&rtl_fw->fw, rtl_fw->fw_name, rtl_fw->dev);
-        if (rc < 0)
-                goto out;
-
-        if (!rtl8168_fw_format_ok(rtl_fw) || !rtl8168_fw_data_ok(rtl_fw)) {
-                release_firmware(rtl_fw->fw);
-                rc = -EINVAL;
-                goto out;
-        }
-
-        return 0;
-out:
-        dev_err(rtl_fw->dev, "Unable to load firmware %s (%d)\n",
-                rtl_fw->fw_name, rc);
-        return rc;
-}
diff --git a/package/kernel/r8168/src/r8168_firmware.h b/package/kernel/r8168/src/r8168_firmware.h
deleted file mode 100644
index 0954333fa..000000000
--- a/package/kernel/r8168/src/r8168_firmware.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek 2.5Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#ifndef _LINUX_RTL8168_FIRMWARE_H
-#define _LINUX_RTL8168_FIRMWARE_H
-
-#include <linux/device.h>
-#include <linux/firmware.h>
-
-struct rtl8168_private;
-typedef void (*rtl8168_fw_write_t)(struct rtl8168_private *tp, u16 reg, u16 val);
-typedef u32 (*rtl8168_fw_read_t)(struct rtl8168_private *tp, u16 reg);
-
-#define RTL8168_VER_SIZE		32
-
-struct rtl8168_fw {
-        rtl8168_fw_write_t phy_write;
-        rtl8168_fw_read_t phy_read;
-        rtl8168_fw_write_t mac_mcu_write;
-        rtl8168_fw_read_t mac_mcu_read;
-        const struct firmware *fw;
-        const char *fw_name;
-        struct device *dev;
-
-        char version[RTL8168_VER_SIZE];
-
-        struct rtl8168_fw_phy_action {
-                __le32 *code;
-                size_t size;
-        } phy_action;
-};
-
-int rtl8168_fw_request_firmware(struct rtl8168_fw *rtl_fw);
-void rtl8168_fw_release_firmware(struct rtl8168_fw *rtl_fw);
-void rtl8168_fw_write_firmware(struct rtl8168_private *tp, struct rtl8168_fw *rtl_fw);
-
-#endif /* _LINUX_RTL8168_FIRMWARE_H */
diff --git a/package/kernel/r8168/src/r8168_n.c b/package/kernel/r8168/src/r8168_n.c
deleted file mode 100644
index ec6ffbcfe..000000000
--- a/package/kernel/r8168/src/r8168_n.c
+++ /dev/null
@@ -1,30038 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-/*
- * This driver is modified from r8169.c in Linux kernel 2.6.18
- */
-
-/* In Linux 5.4 asm_inline was introduced, but it's not supported by clang.
- * Redefine it to just asm to enable successful compilation.
- */
-
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/pci.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/delay.h>
-#include <linux/mii.h>
-#include <linux/if_vlan.h>
-#include <linux/crc32.h>
-#include <linux/interrupt.h>
-#include <linux/in.h>
-#include <linux/ip.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-#include <linux/ipv6.h>
-#include <net/ip6_checksum.h>
-#endif
-#include <linux/tcp.h>
-#include <linux/init.h>
-#include <linux/rtnetlink.h>
-#include <linux/completion.h>
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0)
-#include <linux/pci-aspm.h>
-#endif
-#endif
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,37)
-#include <linux/prefetch.h>
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-#define dev_printk(A,B,fmt,args...) printk(A fmt,##args)
-#else
-#include <linux/dma-mapping.h>
-#include <linux/moduleparam.h>
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)
-#include <linux/mdio.h>
-#endif
-
-#include <asm/io.h>
-#include <asm/irq.h>
-
-#include "r8168.h"
-#include "r8168_asf.h"
-#include "rtl_eeprom.h"
-#include "rtltool.h"
-#include "r8168_firmware.h"
-
-#ifdef ENABLE_R8168_PROCFS
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-#endif
-
-#define FIRMWARE_8168D_1    "rtl_nic/rtl8168d-1.fw"
-#define FIRMWARE_8168D_2    "rtl_nic/rtl8168d-2.fw"
-#define FIRMWARE_8168E_1    "rtl_nic/rtl8168e-1.fw"
-#define FIRMWARE_8168E_2    "rtl_nic/rtl8168e-2.fw"
-#define FIRMWARE_8168E_3    "rtl_nic/rtl8168e-3.fw"
-#define FIRMWARE_8168E_4    "rtl_nic/rtl8168e-4.fw"
-#define FIRMWARE_8168F_1    "rtl_nic/rtl8168f-1.fw"
-#define FIRMWARE_8168F_2    "rtl_nic/rtl8168f-2.fw"
-#define FIRMWARE_8411_1     "rtl_nic/rtl8411-1.fw"
-#define FIRMWARE_8411_2     "rtl_nic/rtl8411-2.fw"
-#define FIRMWARE_8168G_2    "rtl_nic/rtl8168g-2.fw"
-#define FIRMWARE_8168G_3    "rtl_nic/rtl8168g-3.fw"
-#define FIRMWARE_8168EP_1   "rtl_nic/rtl8168ep-1.fw"
-#define FIRMWARE_8168EP_2   "rtl_nic/rtl8168ep-2.fw"
-#define FIRMWARE_8168EP_3   "rtl_nic/rtl8168ep-3.fw"
-#define FIRMWARE_8168H_1    "rtl_nic/rtl8168h-1.fw"
-#define FIRMWARE_8168H_2    "rtl_nic/rtl8168h-2.fw"
-#define FIRMWARE_8168H_3    "rtl_nic/rtl8168h-3.fw"
-#define FIRMWARE_8168FP_3   "rtl_nic/rtl8168fp-3.fw"
-#define FIRMWARE_8168FP_4   "rtl_nic/rtl8168fp-4.fw"
-
-/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
-   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
-static const int multicast_filter_limit = 32;
-
-static const struct {
-        const char *name;
-        const char *fw_name;
-} rtl_chip_fw_infos[] = {
-        /* PCI-E devices. */
-        [CFG_METHOD_1] = {"RTL8168B/8111",          },
-        [CFG_METHOD_2] = {"RTL8168B/8111",          },
-        [CFG_METHOD_3] = {"RTL8168B/8111",          },
-        [CFG_METHOD_4] = {"RTL8168C/8111C",         },
-        [CFG_METHOD_5] = {"RTL8168C/8111C",         },
-        [CFG_METHOD_6] = {"RTL8168C/8111C",         },
-        [CFG_METHOD_7] = {"RTL8168CP/8111CP",       },
-        [CFG_METHOD_8] = {"RTL8168CP/8111CP",       },
-        [CFG_METHOD_9] = {"RTL8168D/8111D",         FIRMWARE_8168D_1},
-        [CFG_METHOD_10] = {"RTL8168D/8111D",        FIRMWARE_8168D_2},
-        [CFG_METHOD_11] = {"RTL8168DP/8111DP",      },
-        [CFG_METHOD_12] = {"RTL8168DP/8111DP",      },
-        [CFG_METHOD_13] = {"RTL8168DP/8111DP",      },
-        [CFG_METHOD_14] = {"RTL8168E/8111E",        FIRMWARE_8168E_1},
-        [CFG_METHOD_15] = {"RTL8168E/8111E",        FIRMWARE_8168E_2},
-        [CFG_METHOD_16] = {"RTL8168E-VL/8111E-VL",  FIRMWARE_8168E_3},
-        [CFG_METHOD_17] = {"RTL8168E-VL/8111E-VL",  FIRMWARE_8168E_4},
-        [CFG_METHOD_18] = {"RTL8168F/8111F",        FIRMWARE_8168F_1},
-        [CFG_METHOD_19] = {"RTL8168F/8111F",        FIRMWARE_8168F_2},
-        [CFG_METHOD_20] = {"RTL8411",               FIRMWARE_8411_1},
-        [CFG_METHOD_21] = {"RTL8168G/8111G",        FIRMWARE_8168G_2},
-        [CFG_METHOD_22] = {"RTL8168G/8111G",        },
-        [CFG_METHOD_23] = {"RTL8168EP/8111EP",      FIRMWARE_8168EP_1},
-        [CFG_METHOD_24] = {"RTL8168GU/8111GU",      },
-        [CFG_METHOD_25] = {"RTL8168GU/8111GU",      FIRMWARE_8168G_3},
-        [CFG_METHOD_26] = {"8411B",                 FIRMWARE_8411_2},
-        [CFG_METHOD_27] = {"RTL8168EP/8111EP",      FIRMWARE_8168EP_2},
-        [CFG_METHOD_28] = {"RTL8168EP/8111EP",      FIRMWARE_8168EP_3},
-        [CFG_METHOD_29] = {"RTL8168H/8111H",        FIRMWARE_8168H_1},
-        [CFG_METHOD_30] = {"RTL8168H/8111H",        FIRMWARE_8168H_2},
-        [CFG_METHOD_31] = {"RTL8168FP/8111FP",      },
-        [CFG_METHOD_32] = {"RTL8168FP/8111FP",      FIRMWARE_8168FP_3},
-        [CFG_METHOD_33] = {"RTL8168FP/8111FP",      FIRMWARE_8168FP_4},
-        [CFG_METHOD_34] = {"RTL8168FP/8111FP",      FIRMWARE_8168FP_4},
-        [CFG_METHOD_35] = {"RTL8168H/8111H",        FIRMWARE_8168H_3},
-        [CFG_METHOD_DEFAULT] = {"Unknown",          },
-};
-
-#define _R(NAME,MAC,RCR,MASK, JumFrameSz) \
-    { .name = NAME, .mcfg = MAC, .RCR_Cfg = RCR, .RxConfigMask = MASK, .jumbo_frame_sz = JumFrameSz }
-
-static const struct {
-        const char *name;
-        u8 mcfg;
-        u32 RCR_Cfg;
-        u32 RxConfigMask;   /* Clears the bits supported by this chip */
-        u32 jumbo_frame_sz;
-} rtl_chip_info[] = {
-        _R("RTL8168B/8111B",
-        CFG_METHOD_1,
-        (Reserved2_data << Reserved2_shift) | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_4k),
-
-        _R("RTL8168B/8111B",
-        CFG_METHOD_2,
-        (Reserved2_data << Reserved2_shift) | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_4k),
-
-        _R("RTL8168B/8111B",
-        CFG_METHOD_3,
-        (Reserved2_data << Reserved2_shift) | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_4k),
-
-        _R("RTL8168C/8111C",
-        CFG_METHOD_4,
-        RxCfg_128_int_en | RxCfg_fet_multi_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_6k),
-
-        _R("RTL8168C/8111C",
-        CFG_METHOD_5,
-        RxCfg_128_int_en | RxCfg_fet_multi_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_6k),
-
-        _R("RTL8168C/8111C",
-        CFG_METHOD_6,
-        RxCfg_128_int_en | RxCfg_fet_multi_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_6k),
-
-        _R("RTL8168CP/8111CP",
-        CFG_METHOD_7,
-        RxCfg_128_int_en | RxCfg_fet_multi_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_6k),
-
-        _R("RTL8168CP/8111CP",
-        CFG_METHOD_8,
-        RxCfg_128_int_en | RxCfg_fet_multi_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_6k),
-
-        _R("RTL8168D/8111D",
-        CFG_METHOD_9,
-        RxCfg_128_int_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168D/8111D",
-        CFG_METHOD_10,
-        RxCfg_128_int_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168DP/8111DP",
-        CFG_METHOD_11,
-        RxCfg_128_int_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168DP/8111DP",
-        CFG_METHOD_12,
-        RxCfg_128_int_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168DP/8111DP",
-        CFG_METHOD_13,
-        RxCfg_128_int_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168E/8111E",
-        CFG_METHOD_14,
-        RxCfg_128_int_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168E/8111E",
-        CFG_METHOD_15,
-        RxCfg_128_int_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168E-VL/8111E-VL",
-        CFG_METHOD_16,
-        RxCfg_128_int_en | RxEarly_off_V1 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e0080,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168E-VL/8111E-VL",
-        CFG_METHOD_17,
-        RxCfg_128_int_en | RxEarly_off_V1 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168F/8111F",
-        CFG_METHOD_18,
-        RxCfg_128_int_en | RxEarly_off_V1 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168F/8111F",
-        CFG_METHOD_19,
-        RxCfg_128_int_en | RxEarly_off_V1 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8411",
-        CFG_METHOD_20,
-        RxCfg_128_int_en | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e1880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168G/8111G",
-        CFG_METHOD_21,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168G/8111G",
-        CFG_METHOD_22,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168EP/8111EP",
-        CFG_METHOD_23,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168GU/8111GU",
-        CFG_METHOD_24,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168GU/8111GU",
-        CFG_METHOD_25,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("8411B",
-        CFG_METHOD_26,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168EP/8111EP",
-        CFG_METHOD_27,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168EP/8111EP",
-        CFG_METHOD_28,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168H/8111H",
-        CFG_METHOD_29,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168H/8111H",
-        CFG_METHOD_30,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168FP/8111FP",
-        CFG_METHOD_31,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168FP/8111FP",
-        CFG_METHOD_32,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168FP/8111FP",
-        CFG_METHOD_33,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168FP/8111FP",
-        CFG_METHOD_34,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("RTL8168H/8111H",
-        CFG_METHOD_35,
-        RxCfg_128_int_en | RxEarly_off_V2 | Rx_Single_fetch_V2 | (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_9k),
-
-        _R("Unknown",
-        CFG_METHOD_DEFAULT,
-        (RX_DMA_BURST << RxCfgDMAShift),
-        0xff7e5880,
-        Jumbo_Frame_1k)
-};
-#undef _R
-
-#ifndef PCI_VENDOR_ID_DLINK
-#define PCI_VENDOR_ID_DLINK 0x1186
-#endif
-
-static struct pci_device_id rtl8168_pci_tbl[] = {
-        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168), },
-        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8161), },
-        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x2502), },
-        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x2600), },
-        { PCI_VENDOR_ID_DLINK, 0x4300, 0x1186, 0x4b10,},
-        {0,},
-};
-
-MODULE_DEVICE_TABLE(pci, rtl8168_pci_tbl);
-
-static int rx_copybreak = 0;
-static int use_dac = 1;
-static int timer_count = 0x2600;
-static int dynamic_aspm_packet_threshold = 10;
-
-static struct {
-        u32 msg_enable;
-} debug = { -1 };
-
-static unsigned int speed_mode = SPEED_1000;
-static unsigned int duplex_mode = DUPLEX_FULL;
-static unsigned int autoneg_mode = AUTONEG_ENABLE;
-static unsigned int advertising_mode =  ADVERTISED_10baseT_Half |
-                                        ADVERTISED_10baseT_Full |
-                                        ADVERTISED_100baseT_Half |
-                                        ADVERTISED_100baseT_Full |
-                                        ADVERTISED_1000baseT_Half |
-                                        ADVERTISED_1000baseT_Full;
-#ifdef CONFIG_ASPM
-static int aspm = 1;
-#else
-static int aspm = 0;
-#endif
-#ifdef CONFIG_DYNAMIC_ASPM
-static int dynamic_aspm = 1;
-#else
-static int dynamic_aspm = 0;
-#endif
-#ifdef ENABLE_S5WOL
-static int s5wol = 1;
-#else
-static int s5wol = 0;
-#endif
-#ifdef ENABLE_S5_KEEP_CURR_MAC
-static int s5_keep_curr_mac = 1;
-#else
-static int s5_keep_curr_mac = 0;
-#endif
-#ifdef ENABLE_EEE
-static int eee_enable = 1;
-#else
-static int eee_enable = 0;
-#endif
-#ifdef CONFIG_SOC_LAN
-static ulong hwoptimize = HW_PATCH_SOC_LAN;
-#else
-static ulong hwoptimize = 0;
-#endif
-#ifdef ENABLE_S0_MAGIC_PACKET
-static int s0_magic_packet = 1;
-#else
-static int s0_magic_packet = 0;
-#endif
-
-MODULE_AUTHOR("Realtek and the Linux r8168 crew <netdev@vger.kernel.org>");
-MODULE_DESCRIPTION("RealTek RTL-8168 Gigabit Ethernet driver");
-
-module_param(speed_mode, uint, 0);
-MODULE_PARM_DESC(speed_mode, "force phy operation. Deprecated by ethtool (8).");
-
-module_param(duplex_mode, uint, 0);
-MODULE_PARM_DESC(duplex_mode, "force phy operation. Deprecated by ethtool (8).");
-
-module_param(autoneg_mode, uint, 0);
-MODULE_PARM_DESC(autoneg_mode, "force phy operation. Deprecated by ethtool (8).");
-
-module_param(advertising_mode, uint, 0);
-MODULE_PARM_DESC(advertising_mode, "force phy operation. Deprecated by ethtool (8).");
-
-module_param(aspm, int, 0);
-MODULE_PARM_DESC(aspm, "Enable ASPM.");
-
-module_param(dynamic_aspm, int, 0);
-MODULE_PARM_DESC(aspm, "Enable Software Dynamic ASPM.");
-
-module_param(s5wol, int, 0);
-MODULE_PARM_DESC(s5wol, "Enable Shutdown Wake On Lan.");
-
-module_param(s5_keep_curr_mac, int, 0);
-MODULE_PARM_DESC(s5_keep_curr_mac, "Enable Shutdown Keep Current MAC Address.");
-
-module_param(rx_copybreak, int, 0);
-MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames");
-
-module_param(use_dac, int, 0);
-MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
-
-module_param(timer_count, int, 0);
-MODULE_PARM_DESC(timer_count, "Timer Interrupt Interval.");
-
-module_param(eee_enable, int, 0);
-MODULE_PARM_DESC(eee_enable, "Enable Energy Efficient Ethernet.");
-
-module_param(hwoptimize, ulong, 0);
-MODULE_PARM_DESC(hwoptimize, "Enable HW optimization function.");
-
-module_param(s0_magic_packet, int, 0);
-MODULE_PARM_DESC(s0_magic_packet, "Enable S0 Magic Packet.");
-
-module_param(dynamic_aspm_packet_threshold, int, 0);
-MODULE_PARM_DESC(dynamic_aspm_packet_threshold, "Dynamic ASPM packet threshold.");
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-module_param_named(debug, debug.msg_enable, int, 0);
-MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
-#endif//LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-
-MODULE_LICENSE("GPL");
-#ifdef ENABLE_USE_FIRMWARE_FILE
-MODULE_FIRMWARE(FIRMWARE_8168D_1);
-MODULE_FIRMWARE(FIRMWARE_8168D_2);
-MODULE_FIRMWARE(FIRMWARE_8168E_1);
-MODULE_FIRMWARE(FIRMWARE_8168E_2);
-MODULE_FIRMWARE(FIRMWARE_8168E_3);
-MODULE_FIRMWARE(FIRMWARE_8168E_4);
-MODULE_FIRMWARE(FIRMWARE_8168F_1);
-MODULE_FIRMWARE(FIRMWARE_8168F_2);
-MODULE_FIRMWARE(FIRMWARE_8411_1);
-MODULE_FIRMWARE(FIRMWARE_8411_2);
-MODULE_FIRMWARE(FIRMWARE_8168G_2);
-MODULE_FIRMWARE(FIRMWARE_8168G_3);
-MODULE_FIRMWARE(FIRMWARE_8168EP_1);
-MODULE_FIRMWARE(FIRMWARE_8168EP_2);
-MODULE_FIRMWARE(FIRMWARE_8168EP_3);
-MODULE_FIRMWARE(FIRMWARE_8168H_1);
-MODULE_FIRMWARE(FIRMWARE_8168H_2);
-MODULE_FIRMWARE(FIRMWARE_8168H_3);
-MODULE_FIRMWARE(FIRMWARE_8168FP_3);
-MODULE_FIRMWARE(FIRMWARE_8168FP_4);
-#endif
-
-MODULE_VERSION(RTL8168_VERSION);
-
-static void rtl8168_sleep_rx_enable(struct net_device *dev);
-static void rtl8168_dsm(struct net_device *dev, int dev_state);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
-static void rtl8168_esd_timer(unsigned long __opaque);
-#else
-static void rtl8168_esd_timer(struct timer_list *t);
-#endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
-static void rtl8168_link_timer(unsigned long __opaque);
-#else
-static void rtl8168_link_timer(struct timer_list *t);
-#endif
-static void rtl8168_tx_clear(struct rtl8168_private *tp);
-static void rtl8168_rx_clear(struct rtl8168_private *tp);
-
-static int rtl8168_open(struct net_device *dev);
-static netdev_tx_t rtl8168_start_xmit(struct sk_buff *skb, struct net_device *dev);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-static irqreturn_t rtl8168_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
-#else
-static irqreturn_t rtl8168_interrupt(int irq, void *dev_instance);
-#endif
-static void rtl8168_rx_desc_offset0_init(struct rtl8168_private *, int);
-static int rtl8168_init_ring(struct net_device *dev);
-static void rtl8168_hw_config(struct net_device *dev);
-static void rtl8168_hw_start(struct net_device *dev);
-static int rtl8168_close(struct net_device *dev);
-static void rtl8168_set_rx_mode(struct net_device *dev);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0)
-static void rtl8168_tx_timeout(struct net_device *dev, unsigned int txqueue);
-#else
-static void rtl8168_tx_timeout(struct net_device *dev);
-#endif
-static struct net_device_stats *rtl8168_get_stats(struct net_device *dev);
-static int rtl8168_rx_interrupt(struct net_device *, struct rtl8168_private *, napi_budget);
-static int rtl8168_change_mtu(struct net_device *dev, int new_mtu);
-static void rtl8168_down(struct net_device *dev);
-
-static int rtl8168_set_mac_address(struct net_device *dev, void *p);
-void rtl8168_rar_set(struct rtl8168_private *tp, const u8 *addr);
-static void rtl8168_desc_addr_fill(struct rtl8168_private *);
-static void rtl8168_tx_desc_init(struct rtl8168_private *tp);
-static void rtl8168_rx_desc_init(struct rtl8168_private *tp);
-
-static u16 rtl8168_get_hw_phy_mcu_code_ver(struct rtl8168_private *tp);
-
-static void rtl8168_hw_reset(struct net_device *dev);
-
-static void rtl8168_phy_power_up(struct net_device *dev);
-static void rtl8168_phy_power_down(struct net_device *dev);
-static int rtl8168_set_speed(struct net_device *dev, u8 autoneg, u32 speed, u8 duplex, u32 adv);
-
-static int rtl8168_set_phy_mcu_patch_request(struct rtl8168_private *tp);
-static int rtl8168_clear_phy_mcu_patch_request(struct rtl8168_private *tp);
-
-#ifdef CONFIG_R8168_NAPI
-static int rtl8168_poll(napi_ptr napi, napi_budget budget);
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-static void rtl8168_reset_task(void *_data);
-#else
-static void rtl8168_reset_task(struct work_struct *work);
-#endif
-
-static inline struct device *tp_to_dev(struct rtl8168_private *tp)
-{
-        return &tp->pci_dev->dev;
-}
-
-#if ((LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) && \
-     LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,00)))
-void ethtool_convert_legacy_u32_to_link_mode(unsigned long *dst,
-                u32 legacy_u32)
-{
-        bitmap_zero(dst, __ETHTOOL_LINK_MODE_MASK_NBITS);
-        dst[0] = legacy_u32;
-}
-
-bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
-                const unsigned long *src)
-{
-        bool retval = true;
-
-        /* TODO: following test will soon always be true */
-        if (__ETHTOOL_LINK_MODE_MASK_NBITS > 32) {
-                __ETHTOOL_DECLARE_LINK_MODE_MASK(ext);
-
-                bitmap_zero(ext, __ETHTOOL_LINK_MODE_MASK_NBITS);
-                bitmap_fill(ext, 32);
-                bitmap_complement(ext, ext, __ETHTOOL_LINK_MODE_MASK_NBITS);
-                if (bitmap_intersects(ext, src,
-                                      __ETHTOOL_LINK_MODE_MASK_NBITS)) {
-                        /* src mask goes beyond bit 31 */
-                        retval = false;
-                }
-        }
-        *legacy_u32 = src[0];
-        return retval;
-}
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
-
-#ifndef LPA_1000FULL
-#define LPA_1000FULL            0x0800
-#endif
-
-#ifndef LPA_1000HALF
-#define LPA_1000HALF            0x0400
-#endif
-
-static inline u32 mii_adv_to_ethtool_adv_t(u32 adv)
-{
-        u32 result = 0;
-
-        if (adv & ADVERTISE_10HALF)
-                result |= ADVERTISED_10baseT_Half;
-        if (adv & ADVERTISE_10FULL)
-                result |= ADVERTISED_10baseT_Full;
-        if (adv & ADVERTISE_100HALF)
-                result |= ADVERTISED_100baseT_Half;
-        if (adv & ADVERTISE_100FULL)
-                result |= ADVERTISED_100baseT_Full;
-        if (adv & ADVERTISE_PAUSE_CAP)
-                result |= ADVERTISED_Pause;
-        if (adv & ADVERTISE_PAUSE_ASYM)
-                result |= ADVERTISED_Asym_Pause;
-
-        return result;
-}
-
-static inline u32 mii_lpa_to_ethtool_lpa_t(u32 lpa)
-{
-        u32 result = 0;
-
-        if (lpa & LPA_LPACK)
-                result |= ADVERTISED_Autoneg;
-
-        return result | mii_adv_to_ethtool_adv_t(lpa);
-}
-
-static inline u32 mii_stat1000_to_ethtool_lpa_t(u32 lpa)
-{
-        u32 result = 0;
-
-        if (lpa & LPA_1000HALF)
-                result |= ADVERTISED_1000baseT_Half;
-        if (lpa & LPA_1000FULL)
-                result |= ADVERTISED_1000baseT_Full;
-
-        return result;
-}
-
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)
-static inline void eth_hw_addr_random(struct net_device *dev)
-{
-        random_ether_addr(dev->dev_addr);
-}
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-#undef ethtool_ops
-#define ethtool_ops _kc_ethtool_ops
-
-struct _kc_ethtool_ops {
-        int  (*get_settings)(struct net_device *, struct ethtool_cmd *);
-        int  (*set_settings)(struct net_device *, struct ethtool_cmd *);
-        void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *);
-        int  (*get_regs_len)(struct net_device *);
-        void (*get_regs)(struct net_device *, struct ethtool_regs *, void *);
-        void (*get_wol)(struct net_device *, struct ethtool_wolinfo *);
-        int  (*set_wol)(struct net_device *, struct ethtool_wolinfo *);
-        u32  (*get_msglevel)(struct net_device *);
-        void (*set_msglevel)(struct net_device *, u32);
-        int  (*nway_reset)(struct net_device *);
-        u32  (*get_link)(struct net_device *);
-        int  (*get_eeprom_len)(struct net_device *);
-        int  (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *);
-        int  (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *);
-        int  (*get_coalesce)(struct net_device *, struct ethtool_coalesce *);
-        int  (*set_coalesce)(struct net_device *, struct ethtool_coalesce *);
-        void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *);
-        int  (*set_ringparam)(struct net_device *, struct ethtool_ringparam *);
-        void (*get_pauseparam)(struct net_device *,
-                               struct ethtool_pauseparam*);
-        int  (*set_pauseparam)(struct net_device *,
-                               struct ethtool_pauseparam*);
-        u32  (*get_rx_csum)(struct net_device *);
-        int  (*set_rx_csum)(struct net_device *, u32);
-        u32  (*get_tx_csum)(struct net_device *);
-        int  (*set_tx_csum)(struct net_device *, u32);
-        u32  (*get_sg)(struct net_device *);
-        int  (*set_sg)(struct net_device *, u32);
-        u32  (*get_tso)(struct net_device *);
-        int  (*set_tso)(struct net_device *, u32);
-        int  (*self_test_count)(struct net_device *);
-        void (*self_test)(struct net_device *, struct ethtool_test *, u64 *);
-        void (*get_strings)(struct net_device *, u32 stringset, u8 *);
-        int  (*phys_id)(struct net_device *, u32);
-        int  (*get_stats_count)(struct net_device *);
-        void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *,
-                                  u64 *);
-} *ethtool_ops = NULL;
-
-#undef SET_ETHTOOL_OPS
-#define SET_ETHTOOL_OPS(netdev, ops) (ethtool_ops = (ops))
-
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0)
-#ifndef SET_ETHTOOL_OPS
-#define SET_ETHTOOL_OPS(netdev,ops) \
-         ( (netdev)->ethtool_ops = (ops) )
-#endif //SET_ETHTOOL_OPS
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0)
-
-//#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5)
-#ifndef netif_msg_init
-#define netif_msg_init _kc_netif_msg_init
-/* copied from linux kernel 2.6.20 include/linux/netdevice.h */
-static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits)
-{
-        /* use default */
-        if (debug_value < 0 || debug_value >= (sizeof(u32) * 8))
-                return default_msg_enable_bits;
-        if (debug_value == 0)   /* no output */
-                return 0;
-        /* set low N bits */
-        return (1 << debug_value) - 1;
-}
-
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,5)
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22)
-static inline void eth_copy_and_sum (struct sk_buff *dest,
-                                     const unsigned char *src,
-                                     int len, int base)
-{
-        memcpy (dest->data, src, len);
-}
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,22)
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)
-/* copied from linux kernel 2.6.20 /include/linux/time.h */
-/* Parameters used to convert the timespec values: */
-#define MSEC_PER_SEC    1000L
-
-/* copied from linux kernel 2.6.20 /include/linux/jiffies.h */
-/*
- * Change timeval to jiffies, trying to avoid the
- * most obvious overflows..
- *
- * And some not so obvious.
- *
- * Note that we don't want to return MAX_LONG, because
- * for various timeout reasons we often end up having
- * to wait "jiffies+1" in order to guarantee that we wait
- * at _least_ "jiffies" - so "jiffies+1" had better still
- * be positive.
- */
-#define MAX_JIFFY_OFFSET ((~0UL >> 1)-1)
-
-/*
- * Convert jiffies to milliseconds and back.
- *
- * Avoid unnecessary multiplications/divisions in the
- * two most common HZ cases:
- */
-static inline unsigned int _kc_jiffies_to_msecs(const unsigned long j)
-{
-#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
-        return (MSEC_PER_SEC / HZ) * j;
-#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
-        return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
-#else
-        return (j * MSEC_PER_SEC) / HZ;
-#endif
-}
-
-static inline unsigned long _kc_msecs_to_jiffies(const unsigned int m)
-{
-        if (m > _kc_jiffies_to_msecs(MAX_JIFFY_OFFSET))
-                return MAX_JIFFY_OFFSET;
-#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
-        return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
-#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
-        return m * (HZ / MSEC_PER_SEC);
-#else
-        return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC;
-#endif
-}
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)
-
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11)
-
-/* copied from linux kernel 2.6.12.6 /include/linux/pm.h */
-typedef int __bitwise pci_power_t;
-
-/* copied from linux kernel 2.6.12.6 /include/linux/pci.h */
-typedef u32 __bitwise pm_message_t;
-
-#define PCI_D0  ((pci_power_t __force) 0)
-#define PCI_D1  ((pci_power_t __force) 1)
-#define PCI_D2  ((pci_power_t __force) 2)
-#define PCI_D3hot   ((pci_power_t __force) 3)
-#define PCI_D3cold  ((pci_power_t __force) 4)
-#define PCI_POWER_ERROR ((pci_power_t __force) -1)
-
-/* copied from linux kernel 2.6.12.6 /drivers/pci/pci.c */
-/**
- * pci_choose_state - Choose the power state of a PCI device
- * @dev: PCI device to be suspended
- * @state: target sleep state for the whole system. This is the value
- *  that is passed to suspend() function.
- *
- * Returns PCI power state suitable for given device and given system
- * message.
- */
-
-pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state)
-{
-        if (!pci_find_capability(dev, PCI_CAP_ID_PM))
-                return PCI_D0;
-
-        switch (state) {
-        case 0:
-                return PCI_D0;
-        case 3:
-                return PCI_D3hot;
-        default:
-                printk("They asked me for state %d\n", state);
-//      BUG();
-        }
-        return PCI_D0;
-}
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11)
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)
-/**
- * msleep_interruptible - sleep waiting for waitqueue interruptions
- * @msecs: Time in milliseconds to sleep for
- */
-#define msleep_interruptible _kc_msleep_interruptible
-unsigned long _kc_msleep_interruptible(unsigned int msecs)
-{
-        unsigned long timeout = _kc_msecs_to_jiffies(msecs);
-
-        while (timeout && !signal_pending(current)) {
-                set_current_state(TASK_INTERRUPTIBLE);
-                timeout = schedule_timeout(timeout);
-        }
-        return _kc_jiffies_to_msecs(timeout);
-}
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)
-/* copied from linux kernel 2.6.20 include/linux/sched.h */
-#ifndef __sched
-#define __sched     __attribute__((__section__(".sched.text")))
-#endif
-
-/* copied from linux kernel 2.6.20 kernel/timer.c */
-signed long __sched schedule_timeout_uninterruptible(signed long timeout)
-{
-        __set_current_state(TASK_UNINTERRUPTIBLE);
-        return schedule_timeout(timeout);
-}
-
-/* copied from linux kernel 2.6.20 include/linux/mii.h */
-#undef if_mii
-#define if_mii _kc_if_mii
-static inline struct mii_ioctl_data *if_mii(struct ifreq *rq)
-{
-        return (struct mii_ioctl_data *) &rq->ifr_ifru;
-}
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)
-
-struct rtl8168_counters {
-        u64 tx_packets;
-        u64 rx_packets;
-        u64 tx_errors;
-        u32 rx_errors;
-        u16 rx_missed;
-        u16 align_errors;
-        u32 tx_one_collision;
-        u32 tx_multi_collision;
-        u64 rx_unicast;
-        u64 rx_broadcast;
-        u32 rx_multicast;
-        u16 tx_aborted;
-        u16 tx_underrun;
-};
-
-#ifdef ENABLE_R8168_PROCFS
-/****************************************************************************
-*   -----------------------------PROCFS STUFF-------------------------
-*****************************************************************************
-*/
-
-static struct proc_dir_entry *rtl8168_proc;
-static int proc_init_num = 0;
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
-static int proc_get_driver_variable(struct seq_file *m, void *v)
-{
-        struct net_device *dev = m->private;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        seq_puts(m, "\nDump Driver Variable\n");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        seq_puts(m, "Variable\tValue\n----------\t-----\n");
-        seq_printf(m, "MODULENAME\t%s\n", MODULENAME);
-        seq_printf(m, "driver version\t%s\n", RTL8168_VERSION);
-        seq_printf(m, "chipset\t%d\n", tp->chipset);
-        seq_printf(m, "chipset_name\t%s\n", rtl_chip_info[tp->chipset].name);
-        seq_printf(m, "mtu\t%d\n", dev->mtu);
-        seq_printf(m, "NUM_RX_DESC\t0x%x\n", tp->num_rx_desc);
-        seq_printf(m, "cur_rx\t0x%x\n", tp->cur_rx);
-        seq_printf(m, "dirty_rx\t0x%x\n", tp->dirty_rx);
-        seq_printf(m, "NUM_TX_DESC\t0x%x\n", tp->num_tx_desc);
-        seq_printf(m, "cur_tx\t0x%x\n", tp->cur_tx);
-        seq_printf(m, "dirty_tx\t0x%x\n", tp->dirty_tx);
-        seq_printf(m, "rx_buf_sz\t0x%x\n", tp->rx_buf_sz);
-        seq_printf(m, "esd_flag\t0x%x\n", tp->esd_flag);
-        seq_printf(m, "pci_cfg_is_read\t0x%x\n", tp->pci_cfg_is_read);
-        seq_printf(m, "rtl8168_rx_config\t0x%x\n", tp->rtl8168_rx_config);
-        seq_printf(m, "cp_cmd\t0x%x\n", tp->cp_cmd);
-        seq_printf(m, "intr_mask\t0x%x\n", tp->intr_mask);
-        seq_printf(m, "timer_intr_mask\t0x%x\n", tp->timer_intr_mask);
-        seq_printf(m, "wol_enabled\t0x%x\n", tp->wol_enabled);
-        seq_printf(m, "wol_opts\t0x%x\n", tp->wol_opts);
-        seq_printf(m, "efuse_ver\t0x%x\n", tp->efuse_ver);
-        seq_printf(m, "eeprom_type\t0x%x\n", tp->eeprom_type);
-        seq_printf(m, "autoneg\t0x%x\n", tp->autoneg);
-        seq_printf(m, "duplex\t0x%x\n", tp->duplex);
-        seq_printf(m, "speed\t%d\n", tp->speed);
-        seq_printf(m, "advertising\t0x%x\n", tp->advertising);
-        seq_printf(m, "eeprom_len\t0x%x\n", tp->eeprom_len);
-        seq_printf(m, "cur_page\t0x%x\n", tp->cur_page);
-        seq_printf(m, "bios_setting\t0x%x\n", tp->bios_setting);
-        seq_printf(m, "features\t0x%x\n", tp->features);
-        seq_printf(m, "org_pci_offset_99\t0x%x\n", tp->org_pci_offset_99);
-        seq_printf(m, "org_pci_offset_180\t0x%x\n", tp->org_pci_offset_180);
-        seq_printf(m, "issue_offset_99_event\t0x%x\n", tp->issue_offset_99_event);
-        seq_printf(m, "org_pci_offset_80\t0x%x\n", tp->org_pci_offset_80);
-        seq_printf(m, "org_pci_offset_81\t0x%x\n", tp->org_pci_offset_81);
-        seq_printf(m, "use_timer_interrrupt\t0x%x\n", tp->use_timer_interrrupt);
-        seq_printf(m, "HwIcVerUnknown\t0x%x\n", tp->HwIcVerUnknown);
-        seq_printf(m, "NotWrRamCodeToMicroP\t0x%x\n", tp->NotWrRamCodeToMicroP);
-        seq_printf(m, "NotWrMcuPatchCode\t0x%x\n", tp->NotWrMcuPatchCode);
-        seq_printf(m, "HwHasWrRamCodeToMicroP\t0x%x\n", tp->HwHasWrRamCodeToMicroP);
-        seq_printf(m, "sw_ram_code_ver\t0x%x\n", tp->sw_ram_code_ver);
-        seq_printf(m, "hw_ram_code_ver\t0x%x\n", tp->hw_ram_code_ver);
-        seq_printf(m, "rtk_enable_diag\t0x%x\n", tp->rtk_enable_diag);
-        seq_printf(m, "ShortPacketSwChecksum\t0x%x\n", tp->ShortPacketSwChecksum);
-        seq_printf(m, "UseSwPaddingShortPkt\t0x%x\n", tp->UseSwPaddingShortPkt);
-        seq_printf(m, "RequireAdcBiasPatch\t0x%x\n", tp->RequireAdcBiasPatch);
-        seq_printf(m, "AdcBiasPatchIoffset\t0x%x\n", tp->AdcBiasPatchIoffset);
-        seq_printf(m, "RequireAdjustUpsTxLinkPulseTiming\t0x%x\n", tp->RequireAdjustUpsTxLinkPulseTiming);
-        seq_printf(m, "SwrCnt1msIni\t0x%x\n", tp->SwrCnt1msIni);
-        seq_printf(m, "HwSuppNowIsOobVer\t0x%x\n", tp->HwSuppNowIsOobVer);
-        seq_printf(m, "HwFiberModeVer\t0x%x\n", tp->HwFiberModeVer);
-        seq_printf(m, "HwFiberStat\t0x%x\n", tp->HwFiberStat);
-        seq_printf(m, "HwSwitchMdiToFiber\t0x%x\n", tp->HwSwitchMdiToFiber);
-        seq_printf(m, "HwSuppSerDesPhyVer\t0x%x\n", tp->HwSuppSerDesPhyVer);
-        seq_printf(m, "NicCustLedValue\t0x%x\n", tp->NicCustLedValue);
-        seq_printf(m, "RequiredSecLanDonglePatch\t0x%x\n", tp->RequiredSecLanDonglePatch);
-        seq_printf(m, "HwSuppDashVer\t0x%x\n", tp->HwSuppDashVer);
-        seq_printf(m, "DASH\t0x%x\n", tp->DASH);
-        seq_printf(m, "dash_printer_enabled\t0x%x\n", tp->dash_printer_enabled);
-        seq_printf(m, "HwSuppKCPOffloadVer\t0x%x\n", tp->HwSuppKCPOffloadVer);
-        seq_printf(m, "speed_mode\t0x%x\n", speed_mode);
-        seq_printf(m, "duplex_mode\t0x%x\n", duplex_mode);
-        seq_printf(m, "autoneg_mode\t0x%x\n", autoneg_mode);
-        seq_printf(m, "advertising_mode\t0x%x\n", advertising_mode);
-        seq_printf(m, "aspm\t0x%x\n", aspm);
-        seq_printf(m, "s5wol\t0x%x\n", s5wol);
-        seq_printf(m, "s5_keep_curr_mac\t0x%x\n", s5_keep_curr_mac);
-        seq_printf(m, "eee_enable\t0x%x\n", tp->eee_enabled);
-        seq_printf(m, "hwoptimize\t0x%lx\n", hwoptimize);
-        seq_printf(m, "proc_init_num\t0x%x\n", proc_init_num);
-        seq_printf(m, "s0_magic_packet\t0x%x\n", s0_magic_packet);
-        seq_printf(m, "HwSuppMagicPktVer\t0x%x\n", tp->HwSuppMagicPktVer);
-        seq_printf(m, "HwSuppUpsVer\t0x%x\n", tp->HwSuppUpsVer);
-        seq_printf(m, "HwSuppEsdVer\t0x%x\n", tp->HwSuppEsdVer);
-        seq_printf(m, "HwSuppCheckPhyDisableModeVer\t0x%x\n", tp->HwSuppCheckPhyDisableModeVer);
-        seq_printf(m, "HwPkgDet\t0x%x\n", tp->HwPkgDet);
-        seq_printf(m, "random_mac\t0x%x\n", tp->random_mac);
-        seq_printf(m, "org_mac_addr\t%pM\n", tp->org_mac_addr);
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13)
-        seq_printf(m, "perm_addr\t%pM\n", dev->perm_addr);
-#endif
-        seq_printf(m, "dev_addr\t%pM\n", dev->dev_addr);
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        seq_putc(m, '\n');
-        return 0;
-}
-
-static int proc_get_tally_counter(struct seq_file *m, void *v)
-{
-        struct net_device *dev = m->private;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct rtl8168_counters *counters;
-        dma_addr_t paddr;
-        u32 cmd;
-        u32 WaitCnt;
-        unsigned long flags;
-
-        seq_puts(m, "\nDump Tally Counter\n");
-
-        //ASSERT_RTNL();
-
-        counters = tp->tally_vaddr;
-        paddr = tp->tally_paddr;
-        if (!counters) {
-                seq_puts(m, "\nDump Tally Counter Fail\n");
-                return 0;
-        }
-
-        spin_lock_irqsave(&tp->lock, flags);
-        RTL_W32(tp, CounterAddrHigh, (u64)paddr >> 32);
-        cmd = (u64)paddr & DMA_BIT_MASK(32);
-        RTL_W32(tp, CounterAddrLow, cmd);
-        RTL_W32(tp, CounterAddrLow, cmd | CounterDump);
-
-        WaitCnt = 0;
-        while (RTL_R32(tp, CounterAddrLow) & CounterDump) {
-                udelay(10);
-
-                WaitCnt++;
-                if (WaitCnt > 20)
-                        break;
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        seq_puts(m, "Statistics\tValue\n----------\t-----\n");
-        seq_printf(m, "tx_packets\t%lld\n", le64_to_cpu(counters->tx_packets));
-        seq_printf(m, "rx_packets\t%lld\n", le64_to_cpu(counters->rx_packets));
-        seq_printf(m, "tx_errors\t%lld\n", le64_to_cpu(counters->tx_errors));
-        seq_printf(m, "rx_errors\t%d\n", le32_to_cpu(counters->rx_errors));
-        seq_printf(m, "rx_missed\t%d\n", le16_to_cpu(counters->rx_missed));
-        seq_printf(m, "align_errors\t%d\n", le16_to_cpu(counters->align_errors));
-        seq_printf(m, "tx_one_collision\t%d\n", le32_to_cpu(counters->tx_one_collision));
-        seq_printf(m, "tx_multi_collision\t%d\n", le32_to_cpu(counters->tx_multi_collision));
-        seq_printf(m, "rx_unicast\t%lld\n", le64_to_cpu(counters->rx_unicast));
-        seq_printf(m, "rx_broadcast\t%lld\n", le64_to_cpu(counters->rx_broadcast));
-        seq_printf(m, "rx_multicast\t%d\n", le32_to_cpu(counters->rx_multicast));
-        seq_printf(m, "tx_aborted\t%d\n", le16_to_cpu(counters->tx_aborted));
-        seq_printf(m, "tx_underrun\t%d\n", le16_to_cpu(counters->tx_underrun));
-
-        seq_putc(m, '\n');
-        return 0;
-}
-
-static int proc_get_registers(struct seq_file *m, void *v)
-{
-        struct net_device *dev = m->private;
-        int i, n, max = R8168_MAC_REGS_SIZE;
-        u8 byte_rd;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        void __iomem *ioaddr = tp->mmio_addr;
-        unsigned long flags;
-
-        seq_puts(m, "\nDump MAC Registers\n");
-        seq_puts(m, "Offset\tValue\n------\t-----\n");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        for (n = 0; n < max;) {
-                seq_printf(m, "\n0x%02x:\t", n);
-
-                for (i = 0; i < 16 && n < max; i++, n++) {
-                        byte_rd = readb(ioaddr + n);
-                        seq_printf(m, "%02x ", byte_rd);
-                }
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        seq_putc(m, '\n');
-        return 0;
-}
-
-static int proc_get_pcie_phy(struct seq_file *m, void *v)
-{
-        struct net_device *dev = m->private;
-        int i, n, max = R8168_EPHY_REGS_SIZE/2;
-        u16 word_rd;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        seq_puts(m, "\nDump PCIE PHY\n");
-        seq_puts(m, "\nOffset\tValue\n------\t-----\n ");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        for (n = 0; n < max;) {
-                seq_printf(m, "\n0x%02x:\t", n);
-
-                for (i = 0; i < 8 && n < max; i++, n++) {
-                        word_rd = rtl8168_ephy_read(tp, n);
-                        seq_printf(m, "%04x ", word_rd);
-                }
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        seq_putc(m, '\n');
-        return 0;
-}
-
-static int proc_get_eth_phy(struct seq_file *m, void *v)
-{
-        struct net_device *dev = m->private;
-        int i, n, max = R8168_PHY_REGS_SIZE/2;
-        u16 word_rd;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        seq_puts(m, "\nDump Ethernet PHY\n");
-        seq_puts(m, "\nOffset\tValue\n------\t-----\n ");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        seq_puts(m, "\n####################page 0##################\n ");
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        for (n = 0; n < max;) {
-                seq_printf(m, "\n0x%02x:\t", n);
-
-                for (i = 0; i < 8 && n < max; i++, n++) {
-                        word_rd = rtl8168_mdio_read(tp, n);
-                        seq_printf(m, "%04x ", word_rd);
-                }
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        seq_putc(m, '\n');
-        return 0;
-}
-
-static int proc_get_extended_registers(struct seq_file *m, void *v)
-{
-        struct net_device *dev = m->private;
-        int i, n, max = R8168_ERI_REGS_SIZE;
-        u32 dword_rd;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_1:
-        case CFG_METHOD_2:
-        case CFG_METHOD_3:
-                /* RTL8168B does not support Extend GMAC */
-                seq_puts(m, "\nNot Support Dump Extended Registers\n");
-                return 0;
-        }
-
-        seq_puts(m, "\nDump Extended Registers\n");
-        seq_puts(m, "\nOffset\tValue\n------\t-----\n ");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        for (n = 0; n < max;) {
-                seq_printf(m, "\n0x%02x:\t", n);
-
-                for (i = 0; i < 4 && n < max; i++, n+=4) {
-                        dword_rd = rtl8168_eri_read(tp, n, 4, ERIAR_ExGMAC);
-                        seq_printf(m, "%08x ", dword_rd);
-                }
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        seq_putc(m, '\n');
-        return 0;
-}
-
-static int proc_get_pci_registers(struct seq_file *m, void *v)
-{
-        struct net_device *dev = m->private;
-        int i, n, max = R8168_PCI_REGS_SIZE;
-        u32 dword_rd;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        seq_puts(m, "\nDump PCI Registers\n");
-        seq_puts(m, "\nOffset\tValue\n------\t-----\n ");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        for (n = 0; n < max;) {
-                seq_printf(m, "\n0x%03x:\t", n);
-
-                for (i = 0; i < 4 && n < max; i++, n+=4) {
-                        pci_read_config_dword(tp->pci_dev, n, &dword_rd);
-                        seq_printf(m, "%08x ", dword_rd);
-                }
-        }
-
-        n = 0x110;
-        pci_read_config_dword(tp->pci_dev, n, &dword_rd);
-        seq_printf(m, "\n0x%03x:\t%08x ", n, dword_rd);
-        n = 0x70c;
-        pci_read_config_dword(tp->pci_dev, n, &dword_rd);
-        seq_printf(m, "\n0x%03x:\t%08x ", n, dword_rd);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        seq_putc(m, '\n');
-        return 0;
-}
-#else
-
-static int proc_get_driver_variable(char *page, char **start,
-                                    off_t offset, int count,
-                                    int *eof, void *data)
-{
-        struct net_device *dev = data;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-        int len = 0;
-
-        len += snprintf(page + len, count - len,
-                        "\nDump Driver Driver\n");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        len += snprintf(page + len, count - len,
-                        "Variable\tValue\n----------\t-----\n");
-
-        len += snprintf(page + len, count - len,
-                        "MODULENAME\t%s\n"
-                        "driver version\t%s\n"
-                        "chipset\t%d\n"
-                        "chipset_name\t%s\n"
-                        "mtu\t%d\n"
-                        "NUM_RX_DESC\t0x%x\n"
-                        "cur_rx\t0x%x\n"
-                        "dirty_rx\t0x%x\n"
-                        "NUM_TX_DESC\t0x%x\n"
-                        "cur_tx\t0x%x\n"
-                        "dirty_tx\t0x%x\n"
-                        "rx_buf_sz\t0x%x\n"
-                        "esd_flag\t0x%x\n"
-                        "pci_cfg_is_read\t0x%x\n"
-                        "rtl8168_rx_config\t0x%x\n"
-                        "cp_cmd\t0x%x\n"
-                        "intr_mask\t0x%x\n"
-                        "timer_intr_mask\t0x%x\n"
-                        "wol_enabled\t0x%x\n"
-                        "wol_opts\t0x%x\n"
-                        "efuse_ver\t0x%x\n"
-                        "eeprom_type\t0x%x\n"
-                        "autoneg\t0x%x\n"
-                        "duplex\t0x%x\n"
-                        "speed\t%d\n"
-                        "advertising\t0x%x\n"
-                        "eeprom_len\t0x%x\n"
-                        "cur_page\t0x%x\n"
-                        "bios_setting\t0x%x\n"
-                        "features\t0x%x\n"
-                        "org_pci_offset_99\t0x%x\n"
-                        "org_pci_offset_180\t0x%x\n"
-                        "issue_offset_99_event\t0x%x\n"
-                        "org_pci_offset_80\t0x%x\n"
-                        "org_pci_offset_81\t0x%x\n"
-                        "use_timer_interrrupt\t0x%x\n"
-                        "HwIcVerUnknown\t0x%x\n"
-                        "NotWrRamCodeToMicroP\t0x%x\n"
-                        "NotWrMcuPatchCode\t0x%x\n"
-                        "HwHasWrRamCodeToMicroP\t0x%x\n"
-                        "sw_ram_code_ver\t0x%x\n"
-                        "hw_ram_code_ver\t0x%x\n"
-                        "rtk_enable_diag\t0x%x\n"
-                        "ShortPacketSwChecksum\t0x%x\n"
-                        "UseSwPaddingShortPkt\t0x%x\n"
-                        "RequireAdcBiasPatch\t0x%x\n"
-                        "AdcBiasPatchIoffset\t0x%x\n"
-                        "RequireAdjustUpsTxLinkPulseTiming\t0x%x\n"
-                        "SwrCnt1msIni\t0x%x\n"
-                        "HwSuppNowIsOobVer\t0x%x\n"
-                        "HwFiberModeVer\t0x%x\n"
-                        "HwFiberStat\t0x%x\n"
-                        "HwSwitchMdiToFiber\t0x%x\n"
-                        "HwSuppSerDesPhyVer\t0x%x\n"
-                        "NicCustLedValue\t0x%x\n"
-                        "RequiredSecLanDonglePatch\t0x%x\n"
-                        "HwSuppDashVer\t0x%x\n"
-                        "DASH\t0x%x\n"
-                        "dash_printer_enabled\t0x%x\n"
-                        "HwSuppKCPOffloadVer\t0x%x\n"
-                        "speed_mode\t0x%x\n"
-                        "duplex_mode\t0x%x\n"
-                        "autoneg_mode\t0x%x\n"
-                        "advertising_mode\t0x%x\n"
-                        "aspm\t0x%x\n"
-                        "s5wol\t0x%x\n"
-                        "s5_keep_curr_mac\t0x%x\n"
-                        "eee_enable\t0x%x\n"
-                        "hwoptimize\t0x%lx\n"
-                        "proc_init_num\t0x%x\n"
-                        "s0_magic_packet\t0x%x\n"
-                        "HwSuppMagicPktVer\t0x%x\n"
-                        "HwSuppUpsVer\t0x%x\n"
-                        "HwSuppEsdVer\t0x%x\n"
-                        "HwSuppCheckPhyDisableModeVer\t0x%x\n"
-                        "HwPkgDet\t0x%x\n"
-                        "random_mac\t0x%x\n"
-                        "org_mac_addr\t%pM\n"
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13)
-                        "perm_addr\t%pM\n"
-#endif
-                        "dev_addr\t%pM\n",
-                        MODULENAME,
-                        RTL8168_VERSION,
-                        tp->chipset,
-                        rtl_chip_info[tp->chipset].name,
-                        dev->mtu,
-                        tp->num_rx_desc,
-                        tp->cur_rx,
-                        tp->dirty_rx,
-                        tp->num_tx_desc,
-                        tp->cur_tx,
-                        tp->dirty_tx,
-                        tp->rx_buf_sz,
-                        tp->esd_flag,
-                        tp->pci_cfg_is_read,
-                        tp->rtl8168_rx_config,
-                        tp->cp_cmd,
-                        tp->intr_mask,
-                        tp->timer_intr_mask,
-                        tp->wol_enabled,
-                        tp->wol_opts,
-                        tp->efuse_ver,
-                        tp->eeprom_type,
-                        tp->autoneg,
-                        tp->duplex,
-                        tp->speed,
-                        tp->advertising,
-                        tp->eeprom_len,
-                        tp->cur_page,
-                        tp->bios_setting,
-                        tp->features,
-                        tp->org_pci_offset_99,
-                        tp->org_pci_offset_180,
-                        tp->issue_offset_99_event,
-                        tp->org_pci_offset_80,
-                        tp->org_pci_offset_81,
-                        tp->use_timer_interrrupt,
-                        tp->HwIcVerUnknown,
-                        tp->NotWrRamCodeToMicroP,
-                        tp->NotWrMcuPatchCode,
-                        tp->HwHasWrRamCodeToMicroP,
-                        tp->sw_ram_code_ver,
-                        tp->hw_ram_code_ver,
-                        tp->rtk_enable_diag,
-                        tp->ShortPacketSwChecksum,
-                        tp->UseSwPaddingShortPkt,
-                        tp->RequireAdcBiasPatch,
-                        tp->AdcBiasPatchIoffset,
-                        tp->RequireAdjustUpsTxLinkPulseTiming,
-                        tp->SwrCnt1msIni,
-                        tp->HwSuppNowIsOobVer,
-                        tp->HwFiberModeVer,
-                        tp->HwFiberStat,
-                        tp->HwSwitchMdiToFiber,
-                        tp->HwSuppSerDesPhyVer,
-                        tp->NicCustLedValue,
-                        tp->RequiredSecLanDonglePatch,
-                        tp->HwSuppDashVer,
-                        tp->DASH,
-                        tp->dash_printer_enabled,
-                        tp->HwSuppKCPOffloadVer,
-                        speed_mode,
-                        duplex_mode,
-                        autoneg_mode,
-                        advertising_mode,
-                        aspm,
-                        s5wol,
-                        s5_keep_curr_mac,
-                        tp->eee_enabled,
-                        hwoptimize,
-                        proc_init_num,
-                        s0_magic_packet,
-                        tp->HwSuppMagicPktVer,
-                        tp->HwSuppUpsVer,
-                        tp->HwSuppEsdVer,
-                        tp->HwSuppCheckPhyDisableModeVer,
-                        tp->HwPkgDet,
-                        tp->random_mac,
-                        tp->org_mac_addr,
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13)
-                        dev->perm_addr,
-#endif
-                        dev->dev_addr
-                       );
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        len += snprintf(page + len, count - len, "\n");
-
-        *eof = 1;
-        return len;
-}
-
-static int proc_get_tally_counter(char *page, char **start,
-                                  off_t offset, int count,
-                                  int *eof, void *data)
-{
-        struct net_device *dev = data;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct rtl8168_counters *counters;
-        dma_addr_t paddr;
-        u32 cmd;
-        u32 WaitCnt;
-        unsigned long flags;
-        int len = 0;
-
-        len += snprintf(page + len, count - len,
-                        "\nDump Tally Counter\n");
-
-        //ASSERT_RTNL();
-
-        counters = tp->tally_vaddr;
-        paddr = tp->tally_paddr;
-        if (!counters) {
-                len += snprintf(page + len, count - len,
-                                "\nDump Tally Counter Fail\n");
-                goto out;
-        }
-
-        spin_lock_irqsave(&tp->lock, flags);
-        RTL_W32(tp, CounterAddrHigh, (u64)paddr >> 32);
-        cmd = (u64)paddr & DMA_BIT_MASK(32);
-        RTL_W32(tp, CounterAddrLow, cmd);
-        RTL_W32(tp, CounterAddrLow, cmd | CounterDump);
-
-        WaitCnt = 0;
-        while (RTL_R32(tp, CounterAddrLow) & CounterDump) {
-                udelay(10);
-
-                WaitCnt++;
-                if (WaitCnt > 20)
-                        break;
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        len += snprintf(page + len, count - len,
-                        "Statistics\tValue\n----------\t-----\n");
-
-        len += snprintf(page + len, count - len,
-                        "tx_packets\t%lld\n"
-                        "rx_packets\t%lld\n"
-                        "tx_errors\t%lld\n"
-                        "rx_errors\t%d\n"
-                        "rx_missed\t%d\n"
-                        "align_errors\t%d\n"
-                        "tx_one_collision\t%d\n"
-                        "tx_multi_collision\t%d\n"
-                        "rx_unicast\t%lld\n"
-                        "rx_broadcast\t%lld\n"
-                        "rx_multicast\t%d\n"
-                        "tx_aborted\t%d\n"
-                        "tx_underrun\t%d\n",
-                        le64_to_cpu(counters->tx_packets),
-                        le64_to_cpu(counters->rx_packets),
-                        le64_to_cpu(counters->tx_errors),
-                        le32_to_cpu(counters->rx_errors),
-                        le16_to_cpu(counters->rx_missed),
-                        le16_to_cpu(counters->align_errors),
-                        le32_to_cpu(counters->tx_one_collision),
-                        le32_to_cpu(counters->tx_multi_collision),
-                        le64_to_cpu(counters->rx_unicast),
-                        le64_to_cpu(counters->rx_broadcast),
-                        le32_to_cpu(counters->rx_multicast),
-                        le16_to_cpu(counters->tx_aborted),
-                        le16_to_cpu(counters->tx_underrun)
-                       );
-
-        len += snprintf(page + len, count - len, "\n");
-out:
-        *eof = 1;
-        return len;
-}
-
-static int proc_get_registers(char *page, char **start,
-                              off_t offset, int count,
-                              int *eof, void *data)
-{
-        struct net_device *dev = data;
-        int i, n, max = R8168_MAC_REGS_SIZE;
-        u8 byte_rd;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        void __iomem *ioaddr = tp->mmio_addr;
-        unsigned long flags;
-        int len = 0;
-
-        len += snprintf(page + len, count - len,
-                        "\nDump MAC Registers\n"
-                        "Offset\tValue\n------\t-----\n");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        for (n = 0; n < max;) {
-                len += snprintf(page + len, count - len,
-                                "\n0x%02x:\t",
-                                n);
-
-                for (i = 0; i < 16 && n < max; i++, n++) {
-                        byte_rd = readb(ioaddr + n);
-                        len += snprintf(page + len, count - len,
-                                        "%02x ",
-                                        byte_rd);
-                }
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        len += snprintf(page + len, count - len, "\n");
-
-        *eof = 1;
-        return len;
-}
-
-static int proc_get_pcie_phy(char *page, char **start,
-                             off_t offset, int count,
-                             int *eof, void *data)
-{
-        struct net_device *dev = data;
-        int i, n, max = R8168_EPHY_REGS_SIZE/2;
-        u16 word_rd;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-        int len = 0;
-
-        len += snprintf(page + len, count - len,
-                        "\nDump PCIE PHY\n"
-                        "Offset\tValue\n------\t-----\n");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        for (n = 0; n < max;) {
-                len += snprintf(page + len, count - len,
-                                "\n0x%02x:\t",
-                                n);
-
-                for (i = 0; i < 8 && n < max; i++, n++) {
-                        word_rd = rtl8168_ephy_read(tp, n);
-                        len += snprintf(page + len, count - len,
-                                        "%04x ",
-                                        word_rd);
-                }
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        len += snprintf(page + len, count - len, "\n");
-
-        *eof = 1;
-        return len;
-}
-
-static int proc_get_eth_phy(char *page, char **start,
-                            off_t offset, int count,
-                            int *eof, void *data)
-{
-        struct net_device *dev = data;
-        int i, n, max = R8168_PHY_REGS_SIZE/2;
-        u16 word_rd;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-        int len = 0;
-
-        len += snprintf(page + len, count - len,
-                        "\nDump Ethernet PHY\n"
-                        "Offset\tValue\n------\t-----\n");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        len += snprintf(page + len, count - len,
-                        "\n####################page 0##################\n");
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        for (n = 0; n < max;) {
-                len += snprintf(page + len, count - len,
-                                "\n0x%02x:\t",
-                                n);
-
-                for (i = 0; i < 8 && n < max; i++, n++) {
-                        word_rd = rtl8168_mdio_read(tp, n);
-                        len += snprintf(page + len, count - len,
-                                        "%04x ",
-                                        word_rd);
-                }
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        len += snprintf(page + len, count - len, "\n");
-
-        *eof = 1;
-        return len;
-}
-
-static int proc_get_extended_registers(char *page, char **start,
-                                       off_t offset, int count,
-                                       int *eof, void *data)
-{
-        struct net_device *dev = data;
-        int i, n, max = R8168_ERI_REGS_SIZE;
-        u32 dword_rd;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-        int len = 0;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_1:
-        case CFG_METHOD_2:
-        case CFG_METHOD_3:
-                /* RTL8168B does not support Extend GMAC */
-                len += snprintf(page + len, count - len,
-                                "\nNot Support Dump Extended Registers\n");
-
-                goto out;
-        }
-
-        len += snprintf(page + len, count - len,
-                        "\nDump Extended Registers\n"
-                        "Offset\tValue\n------\t-----\n");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        for (n = 0; n < max;) {
-                len += snprintf(page + len, count - len,
-                                "\n0x%02x:\t",
-                                n);
-
-                for (i = 0; i < 4 && n < max; i++, n+=4) {
-                        dword_rd = rtl8168_eri_read(tp, n, 4, ERIAR_ExGMAC);
-                        len += snprintf(page + len, count - len,
-                                        "%08x ",
-                                        dword_rd);
-                }
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        len += snprintf(page + len, count - len, "\n");
-out:
-        *eof = 1;
-        return len;
-}
-
-static int proc_get_pci_registers(char *page, char **start,
-                                  off_t offset, int count,
-                                  int *eof, void *data)
-{
-        struct net_device *dev = data;
-        int i, n, max = R8168_PCI_REGS_SIZE;
-        u32 dword_rd;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-        int len = 0;
-
-        len += snprintf(page + len, count - len,
-                        "\nDump PCI Registers\n"
-                        "Offset\tValue\n------\t-----\n");
-
-        spin_lock_irqsave(&tp->lock, flags);
-        for (n = 0; n < max;) {
-                len += snprintf(page + len, count - len,
-                                "\n0x%03x:\t",
-                                n);
-
-                for (i = 0; i < 4 && n < max; i++, n+=4) {
-                        pci_read_config_dword(tp->pci_dev, n, &dword_rd);
-                        len += snprintf(page + len, count - len,
-                                        "%08x ",
-                                        dword_rd);
-                }
-        }
-
-        n = 0x110;
-        pci_read_config_dword(tp->pci_dev, n, &dword_rd);
-        len += snprintf(page + len, count - len,
-                        "\n0x%03x:\t%08x ",
-                        n,
-                        dword_rd);
-        n = 0x70c;
-        pci_read_config_dword(tp->pci_dev, n, &dword_rd);
-        len += snprintf(page + len, count - len,
-                        "\n0x%03x:\t%08x ",
-                        n,
-                        dword_rd);
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        len += snprintf(page + len, count - len, "\n");
-
-        *eof = 1;
-        return len;
-}
-#endif
-static void rtl8168_proc_module_init(void)
-{
-        //create /proc/net/r8168
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)
-        rtl8168_proc = proc_mkdir(MODULENAME, init_net.proc_net);
-#else
-        rtl8168_proc = proc_mkdir(MODULENAME, proc_net);
-#endif
-        if (!rtl8168_proc)
-                dprintk("cannot create %s proc entry \n", MODULENAME);
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
-/*
- * seq_file wrappers for procfile show routines.
- */
-static int rtl8168_proc_open(struct inode *inode, struct file *file)
-{
-        struct net_device *dev = proc_get_parent_data(inode);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)
-        int (*show)(struct seq_file *, void *) = pde_data(inode);
-#else
-        int (*show)(struct seq_file *, void *) = PDE_DATA(inode);
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)
-
-        return single_open(file, show, dev);
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0)
-static const struct proc_ops rtl8168_proc_fops = {
-        .proc_open           = rtl8168_proc_open,
-        .proc_read           = seq_read,
-        .proc_lseek          = seq_lseek,
-        .proc_release        = single_release,
-};
-#else
-static const struct file_operations rtl8168_proc_fops = {
-        .open           = rtl8168_proc_open,
-        .read           = seq_read,
-        .llseek         = seq_lseek,
-        .release        = single_release,
-};
-#endif
-
-#endif
-
-/*
- * Table of proc files we need to create.
- */
-struct rtl8168_proc_file {
-        char name[12];
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
-        int (*show)(struct seq_file *, void *);
-#else
-        int (*show)(char *, char **, off_t, int, int *, void *);
-#endif
-};
-
-static const struct rtl8168_proc_file rtl8168_proc_files[] = {
-        { "driver_var", &proc_get_driver_variable },
-        { "tally", &proc_get_tally_counter },
-        { "registers", &proc_get_registers },
-        { "pcie_phy", &proc_get_pcie_phy },
-        { "eth_phy", &proc_get_eth_phy },
-        { "ext_regs", &proc_get_extended_registers },
-        { "pci_regs", &proc_get_pci_registers },
-        { "" }
-};
-
-static void rtl8168_proc_init(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        const struct rtl8168_proc_file *f;
-        struct proc_dir_entry *dir;
-
-        if (rtl8168_proc && !tp->proc_dir) {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
-                dir = proc_mkdir_data(dev->name, 0, rtl8168_proc, dev);
-                if (!dir) {
-                        printk("Unable to initialize /proc/net/%s/%s\n",
-                               MODULENAME, dev->name);
-                        return;
-                }
-
-                tp->proc_dir = dir;
-                proc_init_num++;
-
-                for (f = rtl8168_proc_files; f->name[0]; f++) {
-                        if (!proc_create_data(f->name, S_IFREG | S_IRUGO, dir,
-                                              &rtl8168_proc_fops, f->show)) {
-                                printk("Unable to initialize "
-                                       "/proc/net/%s/%s/%s\n",
-                                       MODULENAME, dev->name, f->name);
-                                return;
-                        }
-                }
-#else
-                dir = proc_mkdir(dev->name, rtl8168_proc);
-                if (!dir) {
-                        printk("Unable to initialize /proc/net/%s/%s\n",
-                               MODULENAME, dev->name);
-                        return;
-                }
-
-                tp->proc_dir = dir;
-                proc_init_num++;
-
-                for (f = rtl8168_proc_files; f->name[0]; f++) {
-                        if (!create_proc_read_entry(f->name, S_IFREG | S_IRUGO,
-                                                    dir, f->show, dev)) {
-                                printk("Unable to initialize "
-                                       "/proc/net/%s/%s/%s\n",
-                                       MODULENAME, dev->name, f->name);
-                                return;
-                        }
-                }
-#endif
-        }
-}
-
-static void rtl8168_proc_remove(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (tp->proc_dir) {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
-                remove_proc_subtree(dev->name, rtl8168_proc);
-                proc_init_num--;
-
-#else
-                const struct rtl8168_proc_file *f;
-                struct rtl8168_private *tp = netdev_priv(dev);
-
-                for (f = rtl8168_proc_files; f->name[0]; f++)
-                        remove_proc_entry(f->name, tp->proc_dir);
-
-                remove_proc_entry(dev->name, rtl8168_proc);
-                proc_init_num--;
-#endif
-                tp->proc_dir = NULL;
-        }
-}
-
-#endif //ENABLE_R8168_PROCFS
-
-static inline u16 map_phy_ocp_addr(u16 PageNum, u8 RegNum)
-{
-        u16 OcpPageNum = 0;
-        u8 OcpRegNum = 0;
-        u16 OcpPhyAddress = 0;
-
-        if ( PageNum == 0 ) {
-                OcpPageNum = OCP_STD_PHY_BASE_PAGE + ( RegNum / 8 );
-                OcpRegNum = 0x10 + ( RegNum % 8 );
-        } else {
-                OcpPageNum = PageNum;
-                OcpRegNum = RegNum;
-        }
-
-        OcpPageNum <<= 4;
-
-        if ( OcpRegNum < 16 ) {
-                OcpPhyAddress = 0;
-        } else {
-                OcpRegNum -= 16;
-                OcpRegNum <<= 1;
-
-                OcpPhyAddress = OcpPageNum + OcpRegNum;
-        }
-
-
-        return OcpPhyAddress;
-}
-
-static void mdio_real_direct_write_phy_ocp(struct rtl8168_private *tp,
-                u32 RegAddr,
-                u32 value)
-{
-        u32 data32;
-        int i;
-
-        if (tp->HwSuppPhyOcpVer == 0) goto out;
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-        WARN_ON_ONCE(RegAddr % 2);
-#endif
-        data32 = RegAddr/2;
-        data32 <<= OCPR_Addr_Reg_shift;
-        data32 |= OCPR_Write | value;
-
-        RTL_W32(tp, PHYOCP, data32);
-        for (i = 0; i < 100; i++) {
-                udelay(1);
-
-                if (!(RTL_R32(tp, PHYOCP) & OCPR_Flag))
-                        break;
-        }
-out:
-        return;
-}
-
-static void mdio_direct_write_phy_ocp(struct rtl8168_private *tp,
-                                      u16 RegAddr,
-                                      u16 value)
-{
-        if (tp->rtk_enable_diag) return;
-
-        mdio_real_direct_write_phy_ocp(tp, RegAddr, value);
-}
-
-static void rtl8168_mdio_write_phy_ocp(struct rtl8168_private *tp,
-                                       u16 PageNum,
-                                       u32 RegAddr,
-                                       u32 value)
-{
-        u16 ocp_addr;
-
-        if (tp->rtk_enable_diag) return;
-
-        ocp_addr = map_phy_ocp_addr(PageNum, RegAddr);
-
-        mdio_direct_write_phy_ocp(tp, ocp_addr, value);
-}
-
-static void rtl8168_mdio_real_write_phy_ocp(struct rtl8168_private *tp,
-                u16 PageNum,
-                u32 RegAddr,
-                u32 value)
-{
-        u16 ocp_addr;
-
-        ocp_addr = map_phy_ocp_addr(PageNum, RegAddr);
-
-        mdio_real_direct_write_phy_ocp(tp, ocp_addr, value);
-}
-
-static void mdio_real_write(struct rtl8168_private *tp,
-                            u32 RegAddr,
-                            u32 value)
-{
-        int i;
-
-        if (RegAddr == 0x1F) {
-                tp->cur_page = value;
-        }
-
-        if (tp->mcfg == CFG_METHOD_11) {
-                RTL_W32(tp, OCPDR, OCPDR_Write |
-                        (RegAddr & OCPDR_Reg_Mask) << OCPDR_GPHY_Reg_shift |
-                        (value & OCPDR_Data_Mask));
-                RTL_W32(tp, OCPAR, OCPAR_GPHY_Write);
-                RTL_W32(tp, EPHY_RXER_NUM, 0);
-
-                for (i = 0; i < 100; i++) {
-                        mdelay(1);
-                        if (!(RTL_R32(tp, OCPAR) & OCPAR_Flag))
-                                break;
-                }
-        } else {
-                if (tp->HwSuppPhyOcpVer > 0) {
-                        if (RegAddr == 0x1F) {
-                                return;
-                        }
-                        rtl8168_mdio_real_write_phy_ocp(tp, tp->cur_page, RegAddr, value);
-                } else {
-                        if (tp->mcfg == CFG_METHOD_12 || tp->mcfg == CFG_METHOD_13)
-                                RTL_W32(tp, 0xD0, RTL_R32(tp, 0xD0) & ~0x00020000);
-
-                        RTL_W32(tp, PHYAR, PHYAR_Write |
-                                (RegAddr & PHYAR_Reg_Mask) << PHYAR_Reg_shift |
-                                (value & PHYAR_Data_Mask));
-
-                        for (i = 0; i < 10; i++) {
-                                udelay(100);
-
-                                /* Check if the RTL8168 has completed writing to the specified MII register */
-                                if (!(RTL_R32(tp, PHYAR) & PHYAR_Flag)) {
-                                        udelay(20);
-                                        break;
-                                }
-                        }
-
-                        if (tp->mcfg == CFG_METHOD_12 || tp->mcfg == CFG_METHOD_13)
-                                RTL_W32(tp, 0xD0, RTL_R32(tp, 0xD0) | 0x00020000);
-                }
-        }
-}
-
-void rtl8168_mdio_write(struct rtl8168_private *tp,
-                        u16 RegAddr,
-                        u16 value)
-{
-        if (tp->rtk_enable_diag) return;
-
-        mdio_real_write(tp, RegAddr, value);
-}
-
-void rtl8168_mdio_prot_write(struct rtl8168_private *tp,
-                             u32 RegAddr,
-                             u32 value)
-{
-        mdio_real_write(tp, RegAddr, value);
-}
-
-void rtl8168_mdio_prot_direct_write_phy_ocp(struct rtl8168_private *tp,
-                u32 RegAddr,
-                u32 value)
-{
-        mdio_real_direct_write_phy_ocp(tp, RegAddr, value);
-}
-
-static u32 mdio_real_direct_read_phy_ocp(struct rtl8168_private *tp,
-                u32 RegAddr)
-{
-        u32 data32;
-        int i, value = 0;
-
-        if (tp->HwSuppPhyOcpVer == 0) goto out;
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-        WARN_ON_ONCE(RegAddr % 2);
-#endif
-        data32 = RegAddr/2;
-        data32 <<= OCPR_Addr_Reg_shift;
-
-        RTL_W32(tp, PHYOCP, data32);
-        for (i = 0; i < 100; i++) {
-                udelay(1);
-
-                if (RTL_R32(tp, PHYOCP) & OCPR_Flag)
-                        break;
-        }
-        value = RTL_R32(tp, PHYOCP) & OCPDR_Data_Mask;
-
-out:
-        return value;
-}
-
-static u32 mdio_direct_read_phy_ocp(struct rtl8168_private *tp,
-                                    u16 RegAddr)
-{
-        if (tp->rtk_enable_diag) return 0xffffffff;
-
-        return mdio_real_direct_read_phy_ocp(tp, RegAddr);
-}
-
-static u32 rtl8168_mdio_read_phy_ocp(struct rtl8168_private *tp,
-                                     u16 PageNum,
-                                     u32 RegAddr)
-{
-        u16 ocp_addr;
-
-        if (tp->rtk_enable_diag) return 0xffffffff;
-
-        ocp_addr = map_phy_ocp_addr(PageNum, RegAddr);
-
-        return mdio_direct_read_phy_ocp(tp, ocp_addr);
-}
-
-static u32 rtl8168_mdio_real_read_phy_ocp(struct rtl8168_private *tp,
-                u16 PageNum,
-                u32 RegAddr)
-{
-        u16 ocp_addr;
-
-        ocp_addr = map_phy_ocp_addr(PageNum, RegAddr);
-
-        return mdio_real_direct_read_phy_ocp(tp, ocp_addr);
-}
-
-u32 mdio_real_read(struct rtl8168_private *tp,
-                   u32 RegAddr)
-{
-        int i, value = 0;
-
-        if (tp->mcfg==CFG_METHOD_11) {
-                RTL_W32(tp, OCPDR, OCPDR_Read |
-                        (RegAddr & OCPDR_Reg_Mask) << OCPDR_GPHY_Reg_shift);
-                RTL_W32(tp, OCPAR, OCPAR_GPHY_Write);
-                RTL_W32(tp, EPHY_RXER_NUM, 0);
-
-                for (i = 0; i < 100; i++) {
-                        mdelay(1);
-                        if (!(RTL_R32(tp, OCPAR) & OCPAR_Flag))
-                                break;
-                }
-
-                mdelay(1);
-                RTL_W32(tp, OCPAR, OCPAR_GPHY_Read);
-                RTL_W32(tp, EPHY_RXER_NUM, 0);
-
-                for (i = 0; i < 100; i++) {
-                        mdelay(1);
-                        if (RTL_R32(tp, OCPAR) & OCPAR_Flag)
-                                break;
-                }
-
-                value = RTL_R32(tp, OCPDR) & OCPDR_Data_Mask;
-        } else {
-                if (tp->HwSuppPhyOcpVer > 0) {
-                        value = rtl8168_mdio_real_read_phy_ocp(tp, tp->cur_page, RegAddr);
-                } else {
-                        if (tp->mcfg == CFG_METHOD_12 || tp->mcfg == CFG_METHOD_13)
-                                RTL_W32(tp, 0xD0, RTL_R32(tp, 0xD0) & ~0x00020000);
-
-                        RTL_W32(tp, PHYAR,
-                                PHYAR_Read | (RegAddr & PHYAR_Reg_Mask) << PHYAR_Reg_shift);
-
-                        for (i = 0; i < 10; i++) {
-                                udelay(100);
-
-                                /* Check if the RTL8168 has completed retrieving data from the specified MII register */
-                                if (RTL_R32(tp, PHYAR) & PHYAR_Flag) {
-                                        value = RTL_R32(tp, PHYAR) & PHYAR_Data_Mask;
-                                        udelay(20);
-                                        break;
-                                }
-                        }
-
-                        if (tp->mcfg == CFG_METHOD_12 || tp->mcfg == CFG_METHOD_13)
-                                RTL_W32(tp, 0xD0, RTL_R32(tp, 0xD0) | 0x00020000);
-                }
-        }
-
-        return value;
-}
-
-u32 rtl8168_mdio_read(struct rtl8168_private *tp,
-                      u16 RegAddr)
-{
-        if (tp->rtk_enable_diag) return 0xffffffff;
-
-        return mdio_real_read(tp, RegAddr);
-}
-
-u32 rtl8168_mdio_prot_read(struct rtl8168_private *tp,
-                           u32 RegAddr)
-{
-        return mdio_real_read(tp, RegAddr);
-}
-
-u32 rtl8168_mdio_prot_direct_read_phy_ocp(struct rtl8168_private *tp,
-                u32 RegAddr)
-{
-        return mdio_real_direct_read_phy_ocp(tp, RegAddr);
-}
-
-static void ClearAndSetEthPhyBit(struct rtl8168_private *tp, u8  addr, u16 clearmask, u16 setmask)
-{
-        u16 PhyRegValue;
-
-
-        PhyRegValue = rtl8168_mdio_read(tp, addr);
-        PhyRegValue &= ~clearmask;
-        PhyRegValue |= setmask;
-        rtl8168_mdio_write(tp, addr, PhyRegValue);
-}
-
-void rtl8168_clear_eth_phy_bit(struct rtl8168_private *tp, u8 addr, u16 mask)
-{
-        ClearAndSetEthPhyBit(tp,
-                             addr,
-                             mask,
-                             0
-                            );
-}
-
-void rtl8168_set_eth_phy_bit(struct rtl8168_private *tp,  u8  addr, u16  mask)
-{
-        ClearAndSetEthPhyBit(tp,
-                             addr,
-                             0,
-                             mask
-                            );
-}
-
-void rtl8168_mac_ocp_write(struct rtl8168_private *tp, u16 reg_addr, u16 value)
-{
-        u32 data32;
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-        WARN_ON_ONCE(reg_addr % 2);
-#endif
-
-        data32 = reg_addr/2;
-        data32 <<= OCPR_Addr_Reg_shift;
-        data32 += value;
-        data32 |= OCPR_Write;
-
-        RTL_W32(tp, MACOCP, data32);
-}
-
-u16 rtl8168_mac_ocp_read(struct rtl8168_private *tp, u16 reg_addr)
-{
-        u32 data32;
-        u16 data16 = 0;
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-        WARN_ON_ONCE(reg_addr % 2);
-#endif
-
-        data32 = reg_addr/2;
-        data32 <<= OCPR_Addr_Reg_shift;
-
-        RTL_W32(tp, MACOCP, data32);
-        data16 = (u16)RTL_R32(tp, MACOCP);
-
-        return data16;
-}
-
-#ifdef ENABLE_USE_FIRMWARE_FILE
-static void mac_mcu_write(struct rtl8168_private *tp, u16 reg, u16 value)
-{
-        if (reg == 0x1f) {
-                tp->ocp_base = value << 4;
-                return;
-        }
-
-        rtl8168_mac_ocp_write(tp, tp->ocp_base + reg, value);
-}
-
-static u32 mac_mcu_read(struct rtl8168_private *tp, u16 reg)
-{
-        return rtl8168_mac_ocp_read(tp, tp->ocp_base + reg);
-}
-#endif
-
-static void
-rtl8168_clear_and_set_mcu_ocp_bit(
-        struct rtl8168_private *tp,
-        u16   addr,
-        u16   clearmask,
-        u16   setmask
-)
-{
-        u16 RegValue;
-
-        RegValue = rtl8168_mac_ocp_read(tp, addr);
-        RegValue &= ~clearmask;
-        RegValue |= setmask;
-        rtl8168_mac_ocp_write(tp, addr, RegValue);
-}
-
-static void
-rtl8168_clear_mcu_ocp_bit(
-        struct rtl8168_private *tp,
-        u16   addr,
-        u16   mask
-)
-{
-        rtl8168_clear_and_set_mcu_ocp_bit(tp,
-                                          addr,
-                                          mask,
-                                          0
-                                         );
-}
-
-static void
-rtl8168_set_mcu_ocp_bit(
-        struct rtl8168_private *tp,
-        u16   addr,
-        u16   mask
-)
-{
-        rtl8168_clear_and_set_mcu_ocp_bit(tp,
-                                          addr,
-                                          0,
-                                          mask
-                                         );
-}
-
-static u32 real_ocp_read(struct rtl8168_private *tp, u16 addr, u8 len)
-{
-        int i, val_shift, shift = 0;
-        u32 value1 = 0, value2 = 0, mask;
-
-        if (len > 4 || len <= 0)
-                return -1;
-
-        while (len > 0) {
-                val_shift = addr % 4;
-                addr = addr & ~0x3;
-
-                RTL_W32(tp, OCPAR, (0x0F<<12) | (addr&0xFFF));
-
-                for (i = 0; i < 20; i++) {
-                        udelay(100);
-                        if (RTL_R32(tp, OCPAR) & OCPAR_Flag)
-                                break;
-                }
-
-                if (len == 1)       mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else if (len == 2)  mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else if (len == 3)  mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else            mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-
-                value1 = RTL_R32(tp, OCPDR) & mask;
-                value2 |= (value1 >> val_shift * 8) << shift * 8;
-
-                if (len <= 4 - val_shift) {
-                        len = 0;
-                } else {
-                        len -= (4 - val_shift);
-                        shift = 4 - val_shift;
-                        addr += 4;
-                }
-        }
-
-        udelay(20);
-
-        return value2;
-}
-
-u32 rtl8168_ocp_read_with_oob_base_address(struct rtl8168_private *tp, u16 addr, u8 len, const u32 base_address)
-{
-        return rtl8168_eri_read_with_oob_base_address(tp, addr, len, ERIAR_OOB, base_address);
-}
-
-u32 rtl8168_ocp_read(struct rtl8168_private *tp, u16 addr, u8 len)
-{
-        u32 value = 0;
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp))
-                value = rtl8168_ocp_read_with_oob_base_address(tp, addr, len, NO_BASE_ADDRESS);
-        else if (HW_DASH_SUPPORT_TYPE_3(tp))
-                value = rtl8168_ocp_read_with_oob_base_address(tp, addr, len, RTL8168FP_OOBMAC_BASE);
-        else
-                value = real_ocp_read(tp, addr, len);
-
-        return value;
-}
-
-static int real_ocp_write(struct rtl8168_private *tp, u16 addr, u8 len, u32 value)
-{
-        int i, val_shift, shift = 0;
-        u32 value1 = 0, mask;
-
-        if (len > 4 || len <= 0)
-                return -1;
-
-        while (len > 0) {
-                val_shift = addr % 4;
-                addr = addr & ~0x3;
-
-                if (len == 1)       mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else if (len == 2)  mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else if (len == 3)  mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else            mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-
-                value1 = rtl8168_ocp_read(tp, addr, 4) & ~mask;
-                value1 |= ((value << val_shift * 8) >> shift * 8);
-
-                RTL_W32(tp, OCPDR, value1);
-                RTL_W32(tp, OCPAR, OCPAR_Flag | (0x0F<<12) | (addr&0xFFF));
-
-                for (i = 0; i < 10; i++) {
-                        udelay(100);
-
-                        /* Check if the RTL8168 has completed ERI write */
-                        if (!(RTL_R32(tp, OCPAR) & OCPAR_Flag))
-                                break;
-                }
-
-                if (len <= 4 - val_shift) {
-                        len = 0;
-                } else {
-                        len -= (4 - val_shift);
-                        shift = 4 - val_shift;
-                        addr += 4;
-                }
-        }
-
-        udelay(20);
-
-        return 0;
-}
-
-u32 rtl8168_ocp_write_with_oob_base_address(struct rtl8168_private *tp, u16 addr, u8 len, u32 value, const u32 base_address)
-{
-        return rtl8168_eri_write_with_oob_base_address(tp, addr, len, value, ERIAR_OOB, base_address);
-}
-
-void rtl8168_ocp_write(struct rtl8168_private *tp, u16 addr, u8 len, u32 value)
-{
-        if (HW_DASH_SUPPORT_TYPE_2(tp))
-                rtl8168_ocp_write_with_oob_base_address(tp, addr, len, value, NO_BASE_ADDRESS);
-        else if (HW_DASH_SUPPORT_TYPE_3(tp))
-                rtl8168_ocp_write_with_oob_base_address(tp, addr, len, value, RTL8168FP_OOBMAC_BASE);
-        else
-                real_ocp_write(tp, addr, len, value);
-}
-
-void rtl8168_oob_mutex_lock(struct rtl8168_private *tp)
-{
-        u8 reg_16, reg_a0;
-        u32 wait_cnt_0, wait_Cnt_1;
-        u16 ocp_reg_mutex_ib;
-        u16 ocp_reg_mutex_oob;
-        u16 ocp_reg_mutex_prio;
-
-        if (!tp->DASH) return;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-                ocp_reg_mutex_oob = 0x16;
-                ocp_reg_mutex_ib = 0x17;
-                ocp_reg_mutex_prio = 0x9C;
-                break;
-        case CFG_METHOD_13:
-                ocp_reg_mutex_oob = 0x06;
-                ocp_reg_mutex_ib = 0x07;
-                ocp_reg_mutex_prio = 0x9C;
-                break;
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        default:
-                ocp_reg_mutex_oob = 0x110;
-                ocp_reg_mutex_ib = 0x114;
-                ocp_reg_mutex_prio = 0x11C;
-                break;
-        }
-
-        rtl8168_ocp_write(tp, ocp_reg_mutex_ib, 1, BIT_0);
-        reg_16 = rtl8168_ocp_read(tp, ocp_reg_mutex_oob, 1);
-        wait_cnt_0 = 0;
-        while(reg_16) {
-                reg_a0 = rtl8168_ocp_read(tp, ocp_reg_mutex_prio, 1);
-                if (reg_a0) {
-                        rtl8168_ocp_write(tp, ocp_reg_mutex_ib, 1, 0x00);
-                        reg_a0 = rtl8168_ocp_read(tp, ocp_reg_mutex_prio, 1);
-                        wait_Cnt_1 = 0;
-                        while(reg_a0) {
-                                reg_a0 = rtl8168_ocp_read(tp, ocp_reg_mutex_prio, 1);
-
-                                wait_Cnt_1++;
-
-                                if (wait_Cnt_1 > 2000)
-                                        break;
-                        };
-                        rtl8168_ocp_write(tp, ocp_reg_mutex_ib, 1, BIT_0);
-
-                }
-                reg_16 = rtl8168_ocp_read(tp, ocp_reg_mutex_oob, 1);
-
-                wait_cnt_0++;
-
-                if (wait_cnt_0 > 2000)
-                        break;
-        };
-}
-
-void rtl8168_oob_mutex_unlock(struct rtl8168_private *tp)
-{
-        u16 ocp_reg_mutex_ib;
-        u16 ocp_reg_mutex_oob;
-        u16 ocp_reg_mutex_prio;
-
-        if (!tp->DASH) return;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-                ocp_reg_mutex_oob = 0x16;
-                ocp_reg_mutex_ib = 0x17;
-                ocp_reg_mutex_prio = 0x9C;
-                break;
-        case CFG_METHOD_13:
-                ocp_reg_mutex_oob = 0x06;
-                ocp_reg_mutex_ib = 0x07;
-                ocp_reg_mutex_prio = 0x9C;
-                break;
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        default:
-                ocp_reg_mutex_oob = 0x110;
-                ocp_reg_mutex_ib = 0x114;
-                ocp_reg_mutex_prio = 0x11C;
-                break;
-        }
-
-        rtl8168_ocp_write(tp, ocp_reg_mutex_prio, 1, BIT_0);
-        rtl8168_ocp_write(tp, ocp_reg_mutex_ib, 1, 0x00);
-}
-
-void rtl8168_oob_notify(struct rtl8168_private *tp, u8 cmd)
-{
-        rtl8168_eri_write(tp, 0xE8, 1, cmd, ERIAR_ExGMAC);
-
-        rtl8168_ocp_write(tp, 0x30, 1, 0x01);
-}
-
-static int rtl8168_check_dash(struct rtl8168_private *tp)
-{
-        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                if (rtl8168_ocp_read(tp, 0x128, 1) & BIT_0)
-                        return 1;
-                else
-                        return 0;
-        } else {
-                u32 reg;
-
-                if (tp->mcfg == CFG_METHOD_13)
-                        reg = 0xb8;
-                else
-                        reg = 0x10;
-
-                if (rtl8168_ocp_read(tp, reg, 2) & 0x00008000)
-                        return 1;
-                else
-                        return 0;
-        }
-}
-
-void rtl8168_dash2_disable_tx(struct rtl8168_private *tp)
-{
-        if (!tp->DASH) return;
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                u16 WaitCnt;
-                u8 TmpUchar;
-
-                //Disable oob Tx
-                RTL_CMAC_W8(tp, CMAC_IBCR2, RTL_CMAC_R8(tp, CMAC_IBCR2) & ~( BIT_0 ));
-                WaitCnt = 0;
-
-                //wait oob tx disable
-                do {
-                        TmpUchar = RTL_CMAC_R8(tp, CMAC_IBISR0);
-
-                        if ( TmpUchar & ISRIMR_DASH_TYPE2_TX_DISABLE_IDLE ) {
-                                break;
-                        }
-
-                        udelay( 50 );
-                        WaitCnt++;
-                } while(WaitCnt < 2000);
-
-                //Clear ISRIMR_DASH_TYPE2_TX_DISABLE_IDLE
-                RTL_CMAC_W8(tp, CMAC_IBISR0, RTL_CMAC_R8(tp, CMAC_IBISR0) | ISRIMR_DASH_TYPE2_TX_DISABLE_IDLE);
-        }
-}
-
-void rtl8168_dash2_enable_tx(struct rtl8168_private *tp)
-{
-        if (!tp->DASH) return;
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                RTL_CMAC_W8(tp, CMAC_IBCR2, RTL_CMAC_R8(tp, CMAC_IBCR2) | BIT_0);
-        }
-}
-
-void rtl8168_dash2_disable_rx(struct rtl8168_private *tp)
-{
-        if (!tp->DASH) return;
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                RTL_CMAC_W8(tp, CMAC_IBCR0, RTL_CMAC_R8(tp, CMAC_IBCR0) & ~( BIT_0 ));
-        }
-}
-
-void rtl8168_dash2_enable_rx(struct rtl8168_private *tp)
-{
-        if (!tp->DASH) return;
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                RTL_CMAC_W8(tp, CMAC_IBCR0, RTL_CMAC_R8(tp, CMAC_IBCR0) | BIT_0);
-        }
-}
-
-static void rtl8168_dash2_disable_txrx(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                rtl8168_dash2_disable_tx( tp );
-                rtl8168_dash2_disable_rx( tp );
-        }
-}
-
-void rtl8168_ephy_write(struct rtl8168_private *tp, int RegAddr, int value)
-{
-        int i;
-
-        RTL_W32(tp, EPHYAR,
-                EPHYAR_Write |
-                (RegAddr & EPHYAR_Reg_Mask) << EPHYAR_Reg_shift |
-                (value & EPHYAR_Data_Mask));
-
-        for (i = 0; i < 10; i++) {
-                udelay(100);
-
-                /* Check if the RTL8168 has completed EPHY write */
-                if (!(RTL_R32(tp, EPHYAR) & EPHYAR_Flag))
-                        break;
-        }
-
-        udelay(20);
-}
-
-u16 rtl8168_ephy_read(struct rtl8168_private *tp, int RegAddr)
-{
-        int i;
-        u16 value = 0xffff;
-
-        RTL_W32(tp, EPHYAR,
-                EPHYAR_Read | (RegAddr & EPHYAR_Reg_Mask) << EPHYAR_Reg_shift);
-
-        for (i = 0; i < 10; i++) {
-                udelay(100);
-
-                /* Check if the RTL8168 has completed EPHY read */
-                if (RTL_R32(tp, EPHYAR) & EPHYAR_Flag) {
-                        value = (u16) (RTL_R32(tp, EPHYAR) & EPHYAR_Data_Mask);
-                        break;
-                }
-        }
-
-        udelay(20);
-
-        return value;
-}
-
-static void ClearAndSetPCIePhyBit(struct rtl8168_private *tp, u8 addr, u16 clearmask, u16 setmask)
-{
-        u16 EphyValue;
-
-        EphyValue = rtl8168_ephy_read(tp, addr);
-        EphyValue &= ~clearmask;
-        EphyValue |= setmask;
-        rtl8168_ephy_write(tp, addr, EphyValue);
-}
-
-static void ClearPCIePhyBit(struct rtl8168_private *tp, u8 addr, u16 mask)
-{
-        ClearAndSetPCIePhyBit( tp,
-                               addr,
-                               mask,
-                               0
-                             );
-}
-
-static void SetPCIePhyBit( struct rtl8168_private *tp, u8 addr, u16 mask)
-{
-        ClearAndSetPCIePhyBit( tp,
-                               addr,
-                               0,
-                               mask
-                             );
-}
-
-static u32
-rtl8168_csi_other_fun_read(struct rtl8168_private *tp,
-                           u8 multi_fun_sel_bit,
-                           u32 addr)
-{
-        u32 cmd;
-        int i;
-        u32 value = 0;
-
-        cmd = CSIAR_Read | CSIAR_ByteEn << CSIAR_ByteEn_shift | (addr & CSIAR_Addr_Mask);
-
-        if (tp->mcfg != CFG_METHOD_20 && tp->mcfg != CFG_METHOD_23 &&
-            tp->mcfg != CFG_METHOD_26 && tp->mcfg != CFG_METHOD_27 &&
-            tp->mcfg != CFG_METHOD_28 && tp->mcfg != CFG_METHOD_31 &&
-            tp->mcfg != CFG_METHOD_32 && tp->mcfg != CFG_METHOD_33 &&
-            tp->mcfg != CFG_METHOD_34) {
-                multi_fun_sel_bit = 0;
-        }
-
-        if ( multi_fun_sel_bit > 7 ) {
-                return 0xffffffff;
-        }
-
-        cmd |= multi_fun_sel_bit << 16;
-
-        RTL_W32(tp, CSIAR, cmd);
-
-        for (i = 0; i < 10; i++) {
-                udelay(100);
-
-                /* Check if the RTL8168 has completed CSI read */
-                if (RTL_R32(tp, CSIAR) & CSIAR_Flag) {
-                        value = (u32)RTL_R32(tp, CSIDR);
-                        break;
-                }
-        }
-
-        udelay(20);
-
-        return value;
-}
-
-static void
-rtl8168_csi_other_fun_write(struct rtl8168_private *tp,
-                            u8 multi_fun_sel_bit,
-                            u32 addr,
-                            u32 value)
-{
-        u32 cmd;
-        int i;
-
-        RTL_W32(tp, CSIDR, value);
-        cmd = CSIAR_Write | CSIAR_ByteEn << CSIAR_ByteEn_shift | (addr & CSIAR_Addr_Mask);
-        if (tp->mcfg != CFG_METHOD_20 && tp->mcfg != CFG_METHOD_23 &&
-            tp->mcfg != CFG_METHOD_26 && tp->mcfg != CFG_METHOD_27 &&
-            tp->mcfg != CFG_METHOD_28 && tp->mcfg != CFG_METHOD_31 &&
-            tp->mcfg != CFG_METHOD_32 && tp->mcfg != CFG_METHOD_33 &&
-            tp->mcfg != CFG_METHOD_34) {
-                multi_fun_sel_bit = 0;
-        }
-
-        if ( multi_fun_sel_bit > 7 ) {
-                return;
-        }
-
-        cmd |= multi_fun_sel_bit << 16;
-
-        RTL_W32(tp, CSIAR, cmd);
-
-        for (i = 0; i < 10; i++) {
-                udelay(100);
-
-                /* Check if the RTL8168 has completed CSI write */
-                if (!(RTL_R32(tp, CSIAR) & CSIAR_Flag))
-                        break;
-        }
-
-        udelay(20);
-}
-
-static u32
-rtl8168_csi_read(struct rtl8168_private *tp,
-                 u32 addr)
-{
-        u8 multi_fun_sel_bit;
-
-        if (tp->mcfg == CFG_METHOD_20)
-                multi_fun_sel_bit = 2;
-        else if (tp->mcfg == CFG_METHOD_26 || tp->mcfg == CFG_METHOD_31 ||
-                 tp->mcfg == CFG_METHOD_32 || tp->mcfg == CFG_METHOD_33 ||
-                 tp->mcfg == CFG_METHOD_34)
-                multi_fun_sel_bit = 1;
-        else
-                multi_fun_sel_bit = 0;
-
-        return rtl8168_csi_other_fun_read(tp, multi_fun_sel_bit, addr);
-}
-
-static void
-rtl8168_csi_write(struct rtl8168_private *tp,
-                  u32 addr,
-                  u32 value)
-{
-        u8 multi_fun_sel_bit;
-
-        if (tp->mcfg == CFG_METHOD_20)
-                multi_fun_sel_bit = 2;
-        else if (tp->mcfg == CFG_METHOD_26 || tp->mcfg == CFG_METHOD_31 ||
-                 tp->mcfg == CFG_METHOD_32 || tp->mcfg == CFG_METHOD_33 ||
-                 tp->mcfg == CFG_METHOD_34)
-                multi_fun_sel_bit = 1;
-        else
-                multi_fun_sel_bit = 0;
-
-        rtl8168_csi_other_fun_write(tp, multi_fun_sel_bit, addr, value);
-}
-
-static u8
-rtl8168_csi_fun0_read_byte(struct rtl8168_private *tp,
-                           u32 addr)
-{
-        u8 RetVal = 0;
-
-        if (tp->mcfg == CFG_METHOD_20 || tp->mcfg == CFG_METHOD_26 ||
-            tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-            tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34) {
-                u32 TmpUlong;
-                u16 RegAlignAddr;
-                u8 ShiftByte;
-
-                RegAlignAddr = addr & ~(0x3);
-                ShiftByte = addr & (0x3);
-                TmpUlong = rtl8168_csi_other_fun_read(tp, 0, addr);
-                TmpUlong >>= (8*ShiftByte);
-                RetVal = (u8)TmpUlong;
-        } else {
-                struct pci_dev *pdev = tp->pci_dev;
-
-                pci_read_config_byte(pdev, addr, &RetVal);
-        }
-
-        udelay(20);
-
-        return RetVal;
-}
-
-static void
-rtl8168_csi_fun0_write_byte(struct rtl8168_private *tp,
-                            u32 addr,
-                            u8 value)
-{
-        if (tp->mcfg == CFG_METHOD_20 || tp->mcfg == CFG_METHOD_26 ||
-            tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-            tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34) {
-                u32 TmpUlong;
-                u16 RegAlignAddr;
-                u8 ShiftByte;
-
-                RegAlignAddr = addr & ~(0x3);
-                ShiftByte = addr & (0x3);
-                TmpUlong = rtl8168_csi_other_fun_read(tp, 0, RegAlignAddr);
-                TmpUlong &= ~(0xFF << (8*ShiftByte));
-                TmpUlong |= (value << (8*ShiftByte));
-                rtl8168_csi_other_fun_write( tp, 0, RegAlignAddr, TmpUlong );
-        } else {
-                struct pci_dev *pdev = tp->pci_dev;
-
-                pci_write_config_byte(pdev, addr, value);
-        }
-
-        udelay(20);
-}
-
-static void
-rtl8168_clear_and_set_other_fun_pci_bit(struct rtl8168_private *tp,
-                                        u8 multi_fun_sel_bit,
-                                        u32 addr,
-                                        u32 clearmask,
-                                        u32 setmask)
-{
-        u32 TmpUlong;
-
-        TmpUlong = rtl8168_csi_other_fun_read(tp, multi_fun_sel_bit, addr);
-        TmpUlong &= ~clearmask;
-        TmpUlong |= setmask;
-        rtl8168_csi_other_fun_write(tp, multi_fun_sel_bit, addr, TmpUlong);
-}
-
-static void
-rtl8168_other_fun_dev_pci_setting(struct rtl8168_private *tp,
-                                  u32 addr,
-                                  u32 clearmask,
-                                  u32 setmask,
-                                  u8 multi_fun_sel_bit)
-{
-        u32 TmpUlong;
-        u8 i;
-        u8 FunBit;
-
-        for (i = 0; i < 8; i++) {
-                FunBit = (1 << i);
-                if (FunBit & multi_fun_sel_bit) {
-                        u8 set_other_fun = TRUE;
-
-                        switch(tp->mcfg) {
-                        case CFG_METHOD_23:
-                        case CFG_METHOD_27:
-                        case CFG_METHOD_28:
-                                //0: UMAC, 1: TCR1, 2: TCR2, 3: KCS, 4: EHCI(Control by EHCI Driver)
-                                if (i < 5) {
-                                        TmpUlong = rtl8168_csi_other_fun_read(tp, i, 0x00);
-                                        if (TmpUlong == 0xFFFFFFFF)
-                                                set_other_fun = TRUE;
-                                        else
-                                                set_other_fun = FALSE;
-                                }
-                                break;
-                        case CFG_METHOD_31:
-                        case CFG_METHOD_32:
-                        case CFG_METHOD_33:
-                        case CFG_METHOD_34:
-                                //0: BMC, 1: NIC, 2: TCR, 3: VGA/PCIE_TO_USB, 4: EHCI, 5: WIFI, 6: WIFI, 7: KCS
-                                if (i == 5 || i == 6) {
-                                        if (tp->DASH) {
-                                                TmpUlong = rtl8168_ocp_read(tp, 0x184, 4);
-                                                if (TmpUlong & BIT_26)
-                                                        set_other_fun = FALSE;
-                                                else
-                                                        set_other_fun = TRUE;
-                                        }
-                                } else { //function 0/1/2/3/4/7
-                                        TmpUlong = rtl8168_csi_other_fun_read(tp, i, 0x00);
-                                        if (TmpUlong == 0xFFFFFFFF)
-                                                set_other_fun = TRUE;
-                                        else
-                                                set_other_fun = FALSE;
-                                }
-                                break;
-                        default:
-                                return;
-                        }
-
-                        if (set_other_fun)
-                                rtl8168_clear_and_set_other_fun_pci_bit(tp, i, addr, clearmask, setmask);
-                }
-        }
-}
-
-static void
-rtl8168_set_dash_other_fun_dev_state_change(struct rtl8168_private *tp,
-                u8 dev_state,
-                u8 multi_fun_sel_bit)
-{
-        u32 clearmask;
-        u32 setmask;
-
-        if (dev_state == 0) {
-                //
-                // goto D0
-                //
-                clearmask = (BIT_0 | BIT_1);
-                setmask = 0;
-
-                rtl8168_other_fun_dev_pci_setting(tp, 0x44, clearmask, setmask, multi_fun_sel_bit);
-        } else {
-                //
-                // goto D3
-                //
-                clearmask = 0;
-                setmask = (BIT_0 | BIT_1);
-
-                rtl8168_other_fun_dev_pci_setting(tp, 0x44, clearmask, setmask, multi_fun_sel_bit);
-        }
-}
-
-static void
-rtl8168_set_dash_other_fun_dev_aspm_clkreq(struct rtl8168_private *tp,
-                u8 aspm_val,
-                u8 clkreq_en,
-                u8 multi_fun_sel_bit)
-{
-        u32 clearmask;
-        u32 setmask;
-
-        aspm_val &= (BIT_0 | BIT_1);
-        clearmask = (BIT_0 | BIT_1 | BIT_8);
-        setmask = aspm_val;
-        if (clkreq_en)
-                setmask |= BIT_8;
-
-        rtl8168_other_fun_dev_pci_setting(tp, 0x80, clearmask, setmask, multi_fun_sel_bit);
-}
-
-/*
-static void
-rtl8168_set_dash_other_fun_dev_pci_cmd_register(struct rtl8168_private *tp,
-                u8 pci_cmd_reg,
-                u8 multi_fun_sel_bit)
-{
-        u32 clearmask;
-        u32 setmask;
-
-        pci_cmd_reg &= (BIT_0 | BIT_1 | BIT_2);
-
-        clearmask = (BIT_0 | BIT_1 | BIT_2);
-        setmask = pci_cmd_reg;
-
-        rtl8168_other_fun_dev_pci_setting(tp, 0x04, clearmask, setmask, multi_fun_sel_bit);
-}
-*/
-
-u32 rtl8168_eri_read_with_oob_base_address(struct rtl8168_private *tp, int addr, int len, int type, const u32 base_address)
-{
-        int i, val_shift, shift = 0;
-        u32 value1 = 0, value2 = 0, mask;
-        u32 eri_cmd;
-        const u32 transformed_base_address = ((base_address & 0x00FFF000) << 6) | (base_address & 0x000FFF);
-
-        if (len > 4 || len <= 0)
-                return -1;
-
-        while (len > 0) {
-                val_shift = addr % ERIAR_Addr_Align;
-                addr = addr & ~0x3;
-
-                eri_cmd = ERIAR_Read |
-                          transformed_base_address |
-                          type << ERIAR_Type_shift |
-                          ERIAR_ByteEn << ERIAR_ByteEn_shift |
-                          (addr & 0x0FFF);
-                if (addr & 0xF000) {
-                        u32 tmp;
-
-                        tmp = addr & 0xF000;
-                        tmp >>= 12;
-                        eri_cmd |= (tmp << 20) & 0x00F00000;
-                }
-
-                RTL_W32(tp, ERIAR, eri_cmd);
-
-                for (i = 0; i < 10; i++) {
-                        udelay(100);
-
-                        /* Check if the RTL8168 has completed ERI read */
-                        if (RTL_R32(tp, ERIAR) & ERIAR_Flag)
-                                break;
-                }
-
-                if (len == 1)       mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else if (len == 2)  mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else if (len == 3)  mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else            mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-
-                value1 = RTL_R32(tp, ERIDR) & mask;
-                value2 |= (value1 >> val_shift * 8) << shift * 8;
-
-                if (len <= 4 - val_shift) {
-                        len = 0;
-                } else {
-                        len -= (4 - val_shift);
-                        shift = 4 - val_shift;
-                        addr += 4;
-                }
-        }
-
-        udelay(20);
-
-        return value2;
-}
-
-u32 rtl8168_eri_read(struct rtl8168_private *tp, int addr, int len, int type)
-{
-        return rtl8168_eri_read_with_oob_base_address(tp, addr, len, type, 0);
-}
-
-int rtl8168_eri_write_with_oob_base_address(struct rtl8168_private *tp, int addr, int len, u32 value, int type, const u32 base_address)
-{
-        int i, val_shift, shift = 0;
-        u32 value1 = 0, mask;
-        u32 eri_cmd;
-        const u32 transformed_base_address = ((base_address & 0x00FFF000) << 6) | (base_address & 0x000FFF);
-
-        if (len > 4 || len <= 0)
-                return -1;
-
-        while (len > 0) {
-                val_shift = addr % ERIAR_Addr_Align;
-                addr = addr & ~0x3;
-
-                if (len == 1)       mask = (0xFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else if (len == 2)  mask = (0xFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else if (len == 3)  mask = (0xFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-                else            mask = (0xFFFFFFFF << (val_shift * 8)) & 0xFFFFFFFF;
-
-                value1 = rtl8168_eri_read_with_oob_base_address(tp, addr, 4, type, base_address) & ~mask;
-                value1 |= ((value << val_shift * 8) >> shift * 8);
-
-                RTL_W32(tp, ERIDR, value1);
-
-                eri_cmd = ERIAR_Write |
-                          transformed_base_address |
-                          type << ERIAR_Type_shift |
-                          ERIAR_ByteEn << ERIAR_ByteEn_shift |
-                          (addr & 0x0FFF);
-                if (addr & 0xF000) {
-                        u32 tmp;
-
-                        tmp = addr & 0xF000;
-                        tmp >>= 12;
-                        eri_cmd |= (tmp << 20) & 0x00F00000;
-                }
-
-                RTL_W32(tp, ERIAR, eri_cmd);
-
-                for (i = 0; i < 10; i++) {
-                        udelay(100);
-
-                        /* Check if the RTL8168 has completed ERI write */
-                        if (!(RTL_R32(tp, ERIAR) & ERIAR_Flag))
-                                break;
-                }
-
-                if (len <= 4 - val_shift) {
-                        len = 0;
-                } else {
-                        len -= (4 - val_shift);
-                        shift = 4 - val_shift;
-                        addr += 4;
-                }
-        }
-
-        udelay(20);
-
-        return 0;
-}
-
-int rtl8168_eri_write(struct rtl8168_private *tp, int addr, int len, u32 value, int type)
-{
-        return rtl8168_eri_write_with_oob_base_address(tp, addr, len, value, type, NO_BASE_ADDRESS);
-}
-
-static void
-rtl8168_enable_rxdvgate(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_3);
-                mdelay(2);
-                break;
-        }
-}
-
-static void
-rtl8168_disable_rxdvgate(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_3);
-                mdelay(2);
-                break;
-        }
-}
-
-static u8
-rtl8168_is_gpio_low(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u8 gpio_low = FALSE;
-
-        switch (tp->HwSuppCheckPhyDisableModeVer) {
-        case 1:
-        case 2:
-                if (!(rtl8168_mac_ocp_read(tp, 0xDC04) & BIT_9))
-                        gpio_low = TRUE;
-                break;
-        case 3:
-                if (!(rtl8168_mac_ocp_read(tp, 0xDC04) & BIT_13))
-                        gpio_low = TRUE;
-                break;
-        }
-
-        if (gpio_low)
-                dprintk("gpio is low.\n");
-
-        return gpio_low;
-}
-
-static u8
-rtl8168_is_phy_disable_mode_enabled(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u8 phy_disable_mode_enabled = FALSE;
-
-        switch (tp->HwSuppCheckPhyDisableModeVer) {
-        case 1:
-                if (rtl8168_mac_ocp_read(tp, 0xDC20) & BIT_1)
-                        phy_disable_mode_enabled = TRUE;
-                break;
-        case 2:
-        case 3:
-                if (RTL_R8(tp, 0xF2) & BIT_5)
-                        phy_disable_mode_enabled = TRUE;
-                break;
-        }
-
-        if (phy_disable_mode_enabled)
-                dprintk("phy disable mode enabled.\n");
-
-        return phy_disable_mode_enabled;
-}
-
-static u8
-rtl8168_is_in_phy_disable_mode(struct net_device *dev)
-{
-        u8 in_phy_disable_mode = FALSE;
-
-        if (rtl8168_is_phy_disable_mode_enabled(dev) && rtl8168_is_gpio_low(dev))
-                in_phy_disable_mode = TRUE;
-
-        if (in_phy_disable_mode)
-                dprintk("Hardware is in phy disable mode.\n");
-
-        return in_phy_disable_mode;
-}
-
-void
-rtl8168_wait_txrx_fifo_empty(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int i;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                for (i = 0; i < 10; i++) {
-                        udelay(100);
-                        if (RTL_R32(tp, TxConfig) & BIT_11)
-                                break;
-                }
-
-                for (i = 0; i < 10; i++) {
-                        udelay(100);
-                        if ((RTL_R8(tp, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) == (Txfifo_empty | Rxfifo_empty))
-                                break;
-                }
-
-                mdelay(1);
-                break;
-        }
-}
-
-static void rtl8168_driver_start(struct rtl8168_private *tp)
-{
-        //change other device state to D0.
-        switch (tp->mcfg) {
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-                rtl8168_set_dash_other_fun_dev_aspm_clkreq(tp, 3, 1, 0x1E);
-                rtl8168_set_dash_other_fun_dev_state_change(tp, 3, 0x1E);
-                break;
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                rtl8168_set_dash_other_fun_dev_aspm_clkreq(tp, 3, 1, 0xFC);
-                rtl8168_set_dash_other_fun_dev_state_change(tp, 3, 0xFC);
-                break;
-        }
-
-        if (!tp->DASH)
-                return;
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                int timeout;
-                u32 tmp_value;
-
-                rtl8168_ocp_write(tp, 0x180, 1, OOB_CMD_DRIVER_START);
-                tmp_value = rtl8168_ocp_read(tp, 0x30, 1);
-                tmp_value |= BIT_0;
-                rtl8168_ocp_write(tp, 0x30, 1, tmp_value);
-
-                for (timeout = 0; timeout < 10; timeout++) {
-                        mdelay(10);
-                        if (rtl8168_ocp_read(tp, 0x124, 1) & BIT_0)
-                                break;
-                }
-        } else {
-                int timeout;
-                u32 reg;
-
-                if (tp->mcfg == CFG_METHOD_13) {
-                        RTL_W8(tp, TwiCmdReg, RTL_R8(tp, TwiCmdReg) | ( BIT_7 ));
-                }
-
-                rtl8168_oob_notify(tp, OOB_CMD_DRIVER_START);
-
-                if (tp->mcfg == CFG_METHOD_13)
-                        reg = 0xB8;
-                else
-                        reg = 0x10;
-
-                for (timeout = 0; timeout < 10; timeout++) {
-                        mdelay(10);
-                        if (rtl8168_ocp_read(tp, reg, 2) & BIT_11)
-                                break;
-                }
-        }
-}
-
-static void rtl8168_driver_stop(struct rtl8168_private *tp)
-{
-        if (!tp->DASH)
-                goto update_device_state;
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                struct net_device *dev = tp->dev;
-                int timeout;
-                u32 tmp_value;
-
-                rtl8168_dash2_disable_txrx(dev);
-
-                rtl8168_ocp_write(tp, 0x180, 1, OOB_CMD_DRIVER_STOP);
-                tmp_value = rtl8168_ocp_read(tp, 0x30, 1);
-                tmp_value |= BIT_0;
-                rtl8168_ocp_write(tp, 0x30, 1, tmp_value);
-
-                for (timeout = 0; timeout < 10; timeout++) {
-                        mdelay(10);
-                        if (!(rtl8168_ocp_read(tp, 0x124, 1) & BIT_0))
-                                break;
-                }
-        } else {
-                int timeout;
-                u32 reg;
-
-                rtl8168_oob_notify(tp, OOB_CMD_DRIVER_STOP);
-
-                if (tp->mcfg == CFG_METHOD_13)
-                        reg = 0xB8;
-                else
-                        reg = 0x10;
-
-                for (timeout = 0; timeout < 10; timeout++) {
-                        mdelay(10);
-                        if ((rtl8168_ocp_read(tp, reg, 2) & BIT_11) == 0)
-                                break;
-                }
-
-                if (tp->mcfg == CFG_METHOD_13) {
-                        RTL_W8(tp, TwiCmdReg, RTL_R8(tp, TwiCmdReg) & ~( BIT_7 ));
-                }
-        }
-
-update_device_state:
-        //change other device state to D3.
-        switch (tp->mcfg) {
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-                rtl8168_set_dash_other_fun_dev_state_change(tp, 3, 0x0E);
-                break;
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                rtl8168_set_dash_other_fun_dev_state_change(tp, 3, 0xFD);
-                break;
-        }
-}
-
-#ifdef ENABLE_DASH_SUPPORT
-
-inline void
-rtl8168_enable_dash2_interrupt(struct rtl8168_private *tp)
-{
-        if (!tp->DASH) return;
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                RTL_CMAC_W8(tp, CMAC_IBIMR0, ( ISRIMR_DASH_TYPE2_ROK | ISRIMR_DASH_TYPE2_TOK | ISRIMR_DASH_TYPE2_TDU | ISRIMR_DASH_TYPE2_RDU | ISRIMR_DASH_TYPE2_RX_DISABLE_IDLE ));
-        }
-}
-
-static inline void
-rtl8168_disable_dash2_interrupt(struct rtl8168_private *tp)
-{
-        if (!tp->DASH) return;
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                RTL_CMAC_W8(tp, CMAC_IBIMR0, 0);
-        }
-}
-#endif
-
-static inline void
-rtl8168_enable_hw_interrupt(struct rtl8168_private *tp)
-{
-        RTL_W16(tp, IntrMask, tp->intr_mask);
-
-#ifdef ENABLE_DASH_SUPPORT
-        if (tp->DASH)
-                rtl8168_enable_dash2_interrupt(tp);
-#endif
-}
-
-static inline void
-rtl8168_disable_hw_interrupt(struct rtl8168_private *tp)
-{
-        RTL_W16(tp, IntrMask, 0x0000);
-
-#ifdef ENABLE_DASH_SUPPORT
-        if (tp->DASH)
-                rtl8168_disable_dash2_interrupt(tp);
-#endif
-}
-
-
-static inline void
-rtl8168_switch_to_hw_interrupt(struct rtl8168_private *tp)
-{
-        RTL_W32(tp, TimeInt0, 0x0000);
-
-        rtl8168_enable_hw_interrupt(tp);
-}
-
-static inline void
-rtl8168_switch_to_timer_interrupt(struct rtl8168_private *tp)
-{
-        if (tp->use_timer_interrrupt) {
-                RTL_W32(tp, TimeInt0, timer_count);
-                RTL_W32(tp, TCTR, timer_count);
-                RTL_W16(tp, IntrMask, tp->timer_intr_mask);
-
-#ifdef ENABLE_DASH_SUPPORT
-                if (tp->DASH)
-                        rtl8168_enable_dash2_interrupt(tp);
-#endif
-        } else {
-                rtl8168_switch_to_hw_interrupt(tp);
-        }
-}
-
-static void
-rtl8168_irq_mask_and_ack(struct rtl8168_private *tp)
-{
-        rtl8168_disable_hw_interrupt(tp);
-#ifdef ENABLE_DASH_SUPPORT
-        if (tp->DASH) {
-                if (tp->dash_printer_enabled) {
-                        RTL_W16(tp, IntrStatus, RTL_R16(tp, IntrStatus) &
-                                ~(ISRIMR_DASH_INTR_EN | ISRIMR_DASH_INTR_CMAC_RESET));
-                } else {
-                        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                                RTL_CMAC_W8(tp, CMAC_IBISR0, RTL_CMAC_R8(tp, CMAC_IBISR0));
-                        }
-                }
-        } else {
-                RTL_W16(tp, IntrStatus, RTL_R16(tp, IntrStatus));
-        }
-#else
-        RTL_W16(tp, IntrStatus, RTL_R16(tp, IntrStatus));
-#endif
-}
-
-static void
-rtl8168_nic_reset(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int i;
-
-        RTL_W32(tp, RxConfig, (RX_DMA_BURST << RxCfgDMAShift));
-
-        rtl8168_enable_rxdvgate(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_1:
-        case CFG_METHOD_2:
-        case CFG_METHOD_3:
-                mdelay(10);
-                break;
-        case CFG_METHOD_4:
-        case CFG_METHOD_5:
-        case CFG_METHOD_6:
-        case CFG_METHOD_7:
-        case CFG_METHOD_8:
-        case CFG_METHOD_9:
-        case CFG_METHOD_10:
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-                RTL_W8(tp, ChipCmd, StopReq | CmdRxEnb | CmdTxEnb);
-                udelay(100);
-                break;
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-        case CFG_METHOD_13:
-                for (i = 0; i < 2000; i++) {
-                        if (!(RTL_R8(tp, TxPoll) & NPQ)) break;
-                        udelay(100);
-                }
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                mdelay(2);
-                break;
-        default:
-                mdelay(10);
-                break;
-        }
-
-        rtl8168_wait_txrx_fifo_empty(dev);
-
-        /* Soft reset the chip. */
-        RTL_W8(tp, ChipCmd, CmdReset);
-
-        /* Check that the chip has finished the reset. */
-        for (i = 100; i > 0; i--) {
-                udelay(100);
-                if ((RTL_R8(tp, ChipCmd) & CmdReset) == 0)
-                        break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_11:
-                rtl8168_oob_mutex_lock(tp);
-                rtl8168_ocp_write(tp, 0x10, 2, rtl8168_ocp_read(tp, 0x010, 2)&~0x00004000);
-                rtl8168_oob_mutex_unlock(tp);
-
-                rtl8168_oob_notify(tp, OOB_CMD_RESET);
-
-                for (i = 0; i < 10; i++) {
-                        mdelay(10);
-                        if (rtl8168_ocp_read(tp, 0x010, 2)&0x00004000)
-                                break;
-                }
-
-                for (i = 0; i < 5; i++) {
-                        if ( rtl8168_ocp_read(tp, 0x034, 1) == 0)
-                                break;
-                }
-                break;
-        }
-}
-
-static void
-rtl8168_hw_clear_timer_int(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        RTL_W32(tp, TimeInt0, 0x0000);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_4:
-        case CFG_METHOD_5:
-        case CFG_METHOD_6:
-        case CFG_METHOD_7:
-        case CFG_METHOD_8:
-                RTL_W32(tp, TimeInt1, 0x0000);
-                break;
-        case CFG_METHOD_9:
-        case CFG_METHOD_10:
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-        case CFG_METHOD_13:
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                RTL_W32(tp, TimeInt1, 0x0000);
-                RTL_W32(tp, TimeInt2, 0x0000);
-                RTL_W32(tp, TimeInt3, 0x0000);
-                break;
-        }
-}
-
-static void
-rtl8168_hw_reset(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        /* Disable interrupts */
-        rtl8168_irq_mask_and_ack(tp);
-
-        rtl8168_hw_clear_timer_int(dev);
-
-        rtl8168_nic_reset(dev);
-}
-
-static void rtl8168_mac_loopback_test(struct rtl8168_private *tp)
-{
-        struct pci_dev *pdev = tp->pci_dev;
-        struct net_device *dev = tp->dev;
-        struct sk_buff *skb, *rx_skb;
-        dma_addr_t mapping;
-        struct TxDesc *txd;
-        struct RxDesc *rxd;
-        void *tmpAddr;
-        u32 len, rx_len, rx_cmd = 0;
-        u16 type;
-        u8 pattern;
-        int i;
-
-        if (tp->DASH)
-                return;
-
-        pattern = 0x5A;
-        len = 60;
-        type = htons(ETH_P_IP);
-        txd = tp->TxDescArray;
-        rxd = tp->RxDescArray;
-        rx_skb = tp->Rx_skbuff[0];
-        RTL_W32(tp, TxConfig, (RTL_R32(tp, TxConfig) & ~0x00060000) | 0x00020000);
-
-        do {
-                skb = dev_alloc_skb(len + RTK_RX_ALIGN);
-                if (unlikely(!skb))
-                        dev_printk(KERN_NOTICE, tp_to_dev(tp), "-ENOMEM;\n");
-        } while (unlikely(skb == NULL));
-        skb_reserve(skb, RTK_RX_ALIGN);
-
-        memcpy(skb_put(skb, dev->addr_len), dev->dev_addr, dev->addr_len);
-        memcpy(skb_put(skb, dev->addr_len), dev->dev_addr, dev->addr_len);
-        memcpy(skb_put(skb, sizeof(type)), &type, sizeof(type));
-        tmpAddr = skb_put(skb, len - 14);
-
-        mapping = dma_map_single(tp_to_dev(tp), skb->data, len, DMA_TO_DEVICE);
-        dma_sync_single_for_cpu(tp_to_dev(tp), le64_to_cpu(mapping),
-                                len, DMA_TO_DEVICE);
-        txd->addr = cpu_to_le64(mapping);
-        txd->opts2 = 0;
-        while (1) {
-                memset(tmpAddr, pattern++, len - 14);
-                pci_dma_sync_single_for_device(tp->pci_dev,
-                                               le64_to_cpu(mapping),
-                                               len, DMA_TO_DEVICE);
-                txd->opts1 = cpu_to_le32(DescOwn | FirstFrag | LastFrag | len);
-
-                RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig)  | AcceptMyPhys);
-
-                smp_wmb();
-                RTL_W8(tp, TxPoll, NPQ);    /* set polling bit */
-
-                for (i = 0; i < 50; i++) {
-                        udelay(200);
-                        rx_cmd = le32_to_cpu(rxd->opts1);
-                        if ((rx_cmd & DescOwn) == 0)
-                                break;
-                }
-
-                RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) & ~(AcceptErr | AcceptRunt | AcceptBroadcast | AcceptMulticast | AcceptMyPhys |  AcceptAllPhys));
-
-                rx_len = rx_cmd & 0x3FFF;
-                rx_len -= 4;
-                rxd->opts1 = cpu_to_le32(DescOwn | tp->rx_buf_sz);
-
-                dma_sync_single_for_cpu(tp_to_dev(tp), le64_to_cpu(mapping), len, DMA_TO_DEVICE);
-
-                if (rx_len == len) {
-                        dma_sync_single_for_cpu(tp_to_dev(tp), le64_to_cpu(rxd->addr), tp->rx_buf_sz, DMA_FROM_DEVICE);
-                        i = memcmp(skb->data, rx_skb->data, rx_len);
-                        pci_dma_sync_single_for_device(tp->pci_dev, le64_to_cpu(rxd->addr), tp->rx_buf_sz, DMA_FROM_DEVICE);
-                        if (i == 0) {
-//              dev_printk(KERN_INFO, tp_to_dev(tp), "loopback test finished\n",rx_len,len);
-                                break;
-                        }
-                }
-
-                rtl8168_hw_reset(dev);
-                rtl8168_disable_rxdvgate(dev);
-                RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb);
-        }
-        tp->dirty_tx++;
-        tp->dirty_rx++;
-        tp->cur_tx++;
-        tp->cur_rx++;
-        dma_unmap_single(&pdev->dev, le64_to_cpu(mapping),
-                         len, DMA_TO_DEVICE);
-        RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) & ~0x00060000);
-        dev_kfree_skb_any(skb);
-        RTL_W16(tp, IntrStatus, 0xFFBF);
-}
-
-static unsigned int
-rtl8168_xmii_reset_pending(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int retval;
-
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        retval = rtl8168_mdio_read(tp, MII_BMCR) & BMCR_RESET;
-
-        return retval;
-}
-
-static unsigned int
-rtl8168_xmii_link_ok(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int retval;
-
-        retval = (RTL_R8(tp, PHYstatus) & LinkStatus) ? 1 : 0;
-
-        return retval;
-}
-
-static int
-rtl8168_wait_phy_reset_complete(struct rtl8168_private *tp)
-{
-        int i, val;
-
-        for (i = 0; i < 2500; i++) {
-                val = rtl8168_mdio_read(tp, MII_BMCR) & BMCR_RESET;
-                if (!val)
-                        return 0;
-
-                mdelay(1);
-        }
-
-        return -1;
-}
-
-static void
-rtl8168_xmii_reset_enable(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (rtl8168_is_in_phy_disable_mode(dev))
-                return;
-
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, MII_ADVERTISE, rtl8168_mdio_read(tp, MII_ADVERTISE) &
-                           ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
-                             ADVERTISE_100HALF | ADVERTISE_100FULL));
-        rtl8168_mdio_write(tp, MII_CTRL1000, rtl8168_mdio_read(tp, MII_CTRL1000) &
-                           ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL));
-        rtl8168_mdio_write(tp, MII_BMCR, BMCR_RESET | BMCR_ANENABLE);
-
-        if (rtl8168_wait_phy_reset_complete(tp) == 0) return;
-
-        if (netif_msg_link(tp))
-                printk(KERN_ERR "%s: PHY reset failed.\n", dev->name);
-}
-
-static void
-rtl8168dp_10mbps_gphy_para(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u8 status = RTL_R8(tp, PHYstatus);
-
-        if ((status & LinkStatus) && (status & _10bps)) {
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, 0x10, 0x04EE);
-        } else {
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, 0x10, 0x01EE);
-        }
-}
-
-void rtl8168_init_ring_indexes(struct rtl8168_private *tp)
-{
-        tp->dirty_tx = 0;
-        tp->dirty_rx = 0;
-        tp->cur_tx = 0;
-        tp->cur_rx = 0;
-}
-
-static void
-rtl8168_issue_offset_99_event(struct rtl8168_private *tp)
-{
-        u32 csi_tmp;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-                if (tp->mcfg == CFG_METHOD_24 || tp->mcfg == CFG_METHOD_25 ||
-                    tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28) {
-                        rtl8168_eri_write(tp, 0x3FC, 4, 0x00000000, ERIAR_ExGMAC);
-                } else {
-                        rtl8168_eri_write(tp, 0x3FC, 4, 0x083C083C, ERIAR_ExGMAC);
-                }
-                csi_tmp = rtl8168_eri_read(tp, 0x3F8, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0x3F8, 1, csi_tmp, ERIAR_ExGMAC);
-                break;
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0x1EA, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0x1EA, 1, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-}
-
-static void
-rtl8168_enable_cfg9346_write(struct rtl8168_private *tp)
-{
-        RTL_W8(tp, Cfg9346, RTL_R8(tp, Cfg9346) | Cfg9346_Unlock);
-}
-
-static void
-rtl8168_disable_cfg9346_write(struct rtl8168_private *tp)
-{
-        RTL_W8(tp, Cfg9346, RTL_R8(tp, Cfg9346) & ~Cfg9346_Unlock);
-}
-
-static void
-rtl8168_enable_exit_l1_mask(struct rtl8168_private *tp)
-{
-        u32 csi_tmp;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-                csi_tmp = rtl8168_eri_read(tp, 0xD4, 4, ERIAR_ExGMAC);
-                csi_tmp |= (BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12);
-                rtl8168_eri_write(tp, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
-                break;
-        case CFG_METHOD_20:
-                csi_tmp = rtl8168_eri_read(tp, 0xD4, 4, ERIAR_ExGMAC);
-                csi_tmp |= (BIT_10 | BIT_11);
-                rtl8168_eri_write(tp, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
-                break;
-        case CFG_METHOD_21 ... CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0xD4, 4, ERIAR_ExGMAC);
-                csi_tmp |= (BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12);
-                rtl8168_eri_write(tp, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-}
-
-static void
-rtl8168_disable_exit_l1_mask(struct rtl8168_private *tp)
-{
-        u32 csi_tmp;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-                csi_tmp = rtl8168_eri_read(tp, 0xD4, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~(BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12);
-                rtl8168_eri_write(tp, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
-                break;
-        case CFG_METHOD_20:
-                csi_tmp = rtl8168_eri_read(tp, 0xD4, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~(BIT_10 | BIT_11);
-                rtl8168_eri_write(tp, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
-                break;
-        case CFG_METHOD_21 ... CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0xD4, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~(BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12);
-                rtl8168_eri_write(tp, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-}
-
-static void
-rtl8168_hw_aspm_clkreq_enable(struct rtl8168_private *tp, bool enable)
-{
-        if (!tp->HwSuppAspmClkIntrLock) return;
-
-        if (enable && aspm) {
-                RTL_W8(tp, Config5, RTL_R8(tp, Config5) | ASPM_en);
-                RTL_W8(tp, Config2, RTL_R8(tp, Config2) | ClkReqEn);
-        } else {
-                RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
-                RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
-        }
-
-        udelay(10);
-}
-
-#ifdef ENABLE_DASH_SUPPORT
-static void
-NICChkTypeEnableDashInterrupt(struct rtl8168_private *tp)
-{
-        if (tp->DASH) {
-                //
-                // even disconnected, enable 3 dash interrupt mask bits for in-band/out-band communication
-                //
-                if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                        rtl8168_enable_dash2_interrupt(tp);
-                        RTL_W16(tp, IntrMask, (ISRIMR_DASH_INTR_EN | ISRIMR_DASH_INTR_CMAC_RESET));
-                } else {
-                        RTL_W16(tp, IntrMask, (ISRIMR_DP_DASH_OK | ISRIMR_DP_HOST_OK | ISRIMR_DP_REQSYS_OK));
-                }
-        }
-}
-#endif
-
-static void
-rtl8168_check_link_status(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int link_status_on;
-
-#ifdef ENABLE_FIBER_SUPPORT
-        rtl8168_check_fiber_link_status(tp);
-#endif //ENABLE_FIBER_SUPPORT
-
-        link_status_on = tp->link_ok(dev);
-
-        if (tp->mcfg == CFG_METHOD_11)
-                rtl8168dp_10mbps_gphy_para(dev);
-
-        if (netif_carrier_ok(dev) != link_status_on) {
-                if (link_status_on) {
-                        rtl8168_hw_config(dev);
-
-                        if (tp->mcfg == CFG_METHOD_18 || tp->mcfg == CFG_METHOD_19 || tp->mcfg == CFG_METHOD_20) {
-                                if (RTL_R8(tp, PHYstatus) & _1000bpsF) {
-                                        rtl8168_eri_write(tp, 0x1bc, 4, 0x00000011, ERIAR_ExGMAC);
-                                        rtl8168_eri_write(tp, 0x1dc, 4, 0x0000001f, ERIAR_ExGMAC);
-                                } else if (RTL_R8(tp, PHYstatus) & _100bps) {
-                                        rtl8168_eri_write(tp, 0x1bc, 4, 0x0000001f, ERIAR_ExGMAC);
-                                        rtl8168_eri_write(tp, 0x1dc, 4, 0x0000001f, ERIAR_ExGMAC);
-                                } else {
-                                        rtl8168_eri_write(tp, 0x1bc, 4, 0x0000001f, ERIAR_ExGMAC);
-                                        rtl8168_eri_write(tp, 0x1dc, 4, 0x0000002d, ERIAR_ExGMAC);
-                                }
-                        } else if ((tp->mcfg == CFG_METHOD_16 || tp->mcfg == CFG_METHOD_17) && netif_running(dev)) {
-                                if (tp->mcfg == CFG_METHOD_16 && (RTL_R8(tp, PHYstatus) & _10bps)) {
-                                        RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) | AcceptAllPhys);
-                                } else if (tp->mcfg == CFG_METHOD_17) {
-                                        if (RTL_R8(tp, PHYstatus) & _1000bpsF) {
-                                                rtl8168_eri_write(tp, 0x1bc, 4, 0x00000011, ERIAR_ExGMAC);
-                                                rtl8168_eri_write(tp, 0x1dc, 4, 0x00000005, ERIAR_ExGMAC);
-                                        } else if (RTL_R8(tp, PHYstatus) & _100bps) {
-                                                rtl8168_eri_write(tp, 0x1bc, 4, 0x0000001f, ERIAR_ExGMAC);
-                                                rtl8168_eri_write(tp, 0x1dc, 4, 0x00000005, ERIAR_ExGMAC);
-                                        } else {
-                                                rtl8168_eri_write(tp, 0x1bc, 4, 0x0000001f, ERIAR_ExGMAC);
-                                                rtl8168_eri_write(tp, 0x1dc, 4, 0x0000003f, ERIAR_ExGMAC);
-                                        }
-                                }
-                        } else if ((tp->mcfg == CFG_METHOD_14 || tp->mcfg == CFG_METHOD_15) && tp->eee_enabled == 1) {
-                                /*Full -Duplex  mode*/
-                                if (RTL_R8(tp, PHYstatus)&FullDup) {
-                                        rtl8168_mdio_write(tp, 0x1F, 0x0006);
-                                        rtl8168_mdio_write(tp, 0x00, 0x5a30);
-                                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                                        if (RTL_R8(tp, PHYstatus) & (_10bps | _100bps))
-                                                RTL_W32(tp, TxConfig, (RTL_R32(tp, TxConfig) & ~BIT_19) | BIT_25);
-
-                                } else {
-                                        rtl8168_mdio_write(tp, 0x1F, 0x0006);
-                                        rtl8168_mdio_write(tp, 0x00, 0x5a00);
-                                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                                        if (RTL_R8(tp, PHYstatus) & (_10bps | _100bps))
-                                                RTL_W32(tp, TxConfig, (RTL_R32(tp, TxConfig) & ~BIT_19) | (InterFrameGap << TxInterFrameGapShift));
-                                }
-                        } else if ((tp->mcfg == CFG_METHOD_21 || tp->mcfg == CFG_METHOD_22 ||
-                                    tp->mcfg == CFG_METHOD_23 || tp->mcfg == CFG_METHOD_24 ||
-                                    tp->mcfg == CFG_METHOD_25 || tp->mcfg == CFG_METHOD_26 ||
-                                    tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28 ||
-                                    tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-                                    tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-                                    tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34 ||
-                                    tp->mcfg == CFG_METHOD_35) &&
-                                   netif_running(dev)) {
-                                if (RTL_R8(tp, PHYstatus)&FullDup)
-                                        RTL_W32(tp, TxConfig, (RTL_R32(tp, TxConfig) | (BIT_24 | BIT_25)) & ~BIT_19);
-                                else
-                                        RTL_W32(tp, TxConfig, (RTL_R32(tp, TxConfig) | BIT_25) & ~(BIT_19 | BIT_24));
-                        }
-
-                        if (tp->mcfg == CFG_METHOD_21 || tp->mcfg == CFG_METHOD_22 ||
-                            tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28 ||
-                            tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-                            tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34) {
-                                /*half mode*/
-                                if (!(RTL_R8(tp, PHYstatus)&FullDup)) {
-                                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                                        rtl8168_mdio_write(tp, MII_ADVERTISE, rtl8168_mdio_read(tp, MII_ADVERTISE)&~(ADVERTISE_PAUSE_CAP|ADVERTISE_PAUSE_ASYM));
-                                }
-                        }
-
-                        if ((tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-                             tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34) &&
-                            (RTL_R8(tp, PHYstatus) & _10bps)) {
-                                u32 csi_tmp;
-
-                                csi_tmp = rtl8168_eri_read(tp, 0x1D0, 1, ERIAR_ExGMAC);
-                                csi_tmp |= BIT_1;
-                                rtl8168_eri_write(tp, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);
-                        }
-
-                        rtl8168_hw_start(dev);
-
-                        netif_carrier_on(dev);
-
-                        netif_wake_queue(dev);
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                        tp->phy_reg_aner = rtl8168_mdio_read(tp, MII_EXPANSION);
-                        tp->phy_reg_anlpar = rtl8168_mdio_read(tp, MII_LPA);
-                        tp->phy_reg_gbsr = rtl8168_mdio_read(tp, MII_STAT1000);
-
-                        if (netif_msg_ifup(tp))
-                                printk(KERN_INFO PFX "%s: link up\n", dev->name);
-                } else {
-                        if (netif_msg_ifdown(tp))
-                                printk(KERN_INFO PFX "%s: link down\n", dev->name);
-
-                        tp->phy_reg_aner = 0;
-                        tp->phy_reg_anlpar = 0;
-                        tp->phy_reg_gbsr = 0;
-
-                        netif_stop_queue(dev);
-
-                        netif_carrier_off(dev);
-
-                        rtl8168_hw_reset(dev);
-
-                        rtl8168_tx_clear(tp);
-
-                        rtl8168_rx_clear(tp);
-
-                        rtl8168_init_ring(dev);
-
-                        if (dynamic_aspm) {
-                                rtl8168_enable_cfg9346_write(tp);
-                                rtl8168_hw_aspm_clkreq_enable(tp, true);
-                                rtl8168_disable_cfg9346_write(tp);
-                        }
-
-                        rtl8168_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising);
-
-                        switch (tp->mcfg) {
-                        case CFG_METHOD_21:
-                        case CFG_METHOD_22:
-                        case CFG_METHOD_23:
-                        case CFG_METHOD_24:
-                        case CFG_METHOD_25:
-                        case CFG_METHOD_27:
-                        case CFG_METHOD_28:
-                        case CFG_METHOD_31:
-                        case CFG_METHOD_32:
-                        case CFG_METHOD_33:
-                        case CFG_METHOD_34:
-                                if (tp->org_pci_offset_99 & BIT_2)
-                                        tp->issue_offset_99_event = TRUE;
-                                break;
-                        }
-
-#ifdef ENABLE_DASH_SUPPORT
-                        if (tp->DASH) {
-                                NICChkTypeEnableDashInterrupt(tp);
-                        }
-#endif
-                }
-        }
-
-        if (!link_status_on) {
-                switch (tp->mcfg) {
-                case CFG_METHOD_21:
-                case CFG_METHOD_22:
-                case CFG_METHOD_23:
-                case CFG_METHOD_24:
-                case CFG_METHOD_25:
-                case CFG_METHOD_27:
-                case CFG_METHOD_28:
-                case CFG_METHOD_31:
-                case CFG_METHOD_32:
-                case CFG_METHOD_33:
-                case CFG_METHOD_34:
-                        if (tp->issue_offset_99_event) {
-                                if (!(RTL_R8(tp, PHYstatus) & PowerSaveStatus)) {
-                                        tp->issue_offset_99_event = FALSE;
-                                        rtl8168_issue_offset_99_event(tp);
-                                }
-                        }
-                        break;
-                }
-        } else {
-                if (dynamic_aspm) {
-                        bool enable_hw_aspm_clkreq = true;
-                        if (tp->dynamic_aspm_packet_count > dynamic_aspm_packet_threshold)
-                                enable_hw_aspm_clkreq = false;
-
-                        rtl8168_enable_cfg9346_write(tp);
-                        rtl8168_hw_aspm_clkreq_enable(tp, enable_hw_aspm_clkreq);
-                        rtl8168_disable_cfg9346_write(tp);
-                }
-                tp->dynamic_aspm_packet_count = 0;
-        }
-}
-
-static void
-rtl8168_link_option(u8 *aut,
-                    u32 *spd,
-                    u8 *dup,
-                    u32 *adv)
-{
-        if ((*spd != SPEED_1000) && (*spd != SPEED_100) && (*spd != SPEED_10))
-                *spd = SPEED_1000;
-
-        if ((*dup != DUPLEX_FULL) && (*dup != DUPLEX_HALF))
-                *dup = DUPLEX_FULL;
-
-        if ((*aut != AUTONEG_ENABLE) && (*aut != AUTONEG_DISABLE))
-                *aut = AUTONEG_ENABLE;
-
-        *adv &= (ADVERTISED_10baseT_Half |
-                 ADVERTISED_10baseT_Full |
-                 ADVERTISED_100baseT_Half |
-                 ADVERTISED_100baseT_Full |
-                 ADVERTISED_1000baseT_Half |
-                 ADVERTISED_1000baseT_Full);
-        if (*adv == 0)
-                *adv = (ADVERTISED_10baseT_Half |
-                        ADVERTISED_10baseT_Full |
-                        ADVERTISED_100baseT_Half |
-                        ADVERTISED_100baseT_Full |
-                        ADVERTISED_1000baseT_Half |
-                        ADVERTISED_1000baseT_Full);
-}
-
-static void
-rtl8168_enable_ocp_phy_power_saving(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 val;
-
-        if (tp->mcfg == CFG_METHOD_25 || tp->mcfg == CFG_METHOD_26 ||
-            tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28 ||
-            tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-            tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-            tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34 ||
-            tp->mcfg == CFG_METHOD_35) {
-                val = rtl8168_mdio_read_phy_ocp(tp, 0x0C41, 0x13);
-                if (val != 0x0050) {
-                        rtl8168_set_phy_mcu_patch_request(tp);
-                        rtl8168_mdio_write_phy_ocp(tp, 0x0C41, 0x13, 0x0000);
-                        rtl8168_mdio_write_phy_ocp(tp, 0x0C41, 0x13, 0x0050);
-                        rtl8168_clear_phy_mcu_patch_request(tp);
-                }
-        }
-}
-
-static void
-rtl8168_disable_ocp_phy_power_saving(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 val;
-
-        if (tp->mcfg == CFG_METHOD_25 || tp->mcfg == CFG_METHOD_26 ||
-            tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28 ||
-            tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-            tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-            tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34 ||
-            tp->mcfg == CFG_METHOD_35) {
-                val = rtl8168_mdio_read_phy_ocp(tp, 0x0C41, 0x13);
-                if (val != 0x0500) {
-                        rtl8168_set_phy_mcu_patch_request(tp);
-                        rtl8168_mdio_write_phy_ocp(tp, 0x0C41, 0x13, 0x0000);
-                        rtl8168_mdio_write_phy_ocp(tp, 0x0C41, 0x13, 0x0500);
-                        rtl8168_clear_phy_mcu_patch_request(tp);
-                }
-        }
-}
-
-void
-rtl8168_wait_ll_share_fifo_ready(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int i;
-
-        for (i = 0; i < 10; i++) {
-                udelay(100);
-                if (RTL_R16(tp, 0xD2) & BIT_9)
-                        break;
-        }
-}
-
-static void
-rtl8168_disable_pci_offset_99(struct rtl8168_private *tp)
-{
-        u32 csi_tmp;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0x3F2, 2, ERIAR_ExGMAC);
-                csi_tmp &= ~(BIT_0 | BIT_1);
-                rtl8168_eri_write(tp, 0x3F2, 2, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_26:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_csi_fun0_write_byte(tp, 0x99, 0x00);
-                break;
-        }
-}
-
-static void
-rtl8168_enable_pci_offset_99(struct rtl8168_private *tp)
-{
-        u32 csi_tmp;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_26:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_csi_fun0_write_byte(tp, 0x99, tp->org_pci_offset_99);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0x3F2, 2, ERIAR_ExGMAC);
-                csi_tmp &= ~(BIT_0 | BIT_1);
-                if (tp->org_pci_offset_99 & (BIT_5 | BIT_6))
-                        csi_tmp |= BIT_1;
-                if (tp->org_pci_offset_99 & BIT_2)
-                        csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0x3F2, 2, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-}
-
-static void
-rtl8168_init_pci_offset_99(struct rtl8168_private *tp)
-{
-        u32 csi_tmp;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_26:
-                if (tp->org_pci_offset_99 & BIT_2) {
-                        csi_tmp = rtl8168_eri_read(tp, 0x5C2, 1, ERIAR_ExGMAC);
-                        csi_tmp &= ~BIT_1;
-                        rtl8168_eri_write(tp, 0x5C2, 1, csi_tmp, ERIAR_ExGMAC);
-                }
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0x3F2, 2, ERIAR_ExGMAC);
-                csi_tmp &= ~( BIT_8 | BIT_9  | BIT_10 | BIT_11  | BIT_12  | BIT_13  | BIT_14 | BIT_15 );
-                csi_tmp |= ( BIT_9 | BIT_10 | BIT_13  | BIT_14 | BIT_15 );
-                rtl8168_eri_write(tp, 0x3F2, 2, csi_tmp, ERIAR_ExGMAC);
-                csi_tmp = rtl8168_eri_read(tp, 0x3F5, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_6 | BIT_7;
-                rtl8168_eri_write(tp, 0x3F5, 1, csi_tmp, ERIAR_ExGMAC);
-                rtl8168_mac_ocp_write(tp, 0xE02C, 0x1880);
-                rtl8168_mac_ocp_write(tp, 0xE02E, 0x4880);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_26:
-                rtl8168_eri_write(tp, 0x5C0, 1, 0xFA, ERIAR_ExGMAC);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_26:
-                if (tp->org_pci_offset_99 & BIT_2) {
-                        csi_tmp = rtl8168_eri_read(tp, 0x5C8, 1, ERIAR_ExGMAC);
-                        csi_tmp |= BIT_0;
-                        rtl8168_eri_write(tp, 0x5C8, 1, csi_tmp, ERIAR_ExGMAC);
-                }
-                break;
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                if (tp->org_pci_offset_99 & BIT_2)
-                        rtl8168_mac_ocp_write(tp, 0xE0A2,  rtl8168_mac_ocp_read(tp, 0xE0A2) | BIT_0);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_23:
-                rtl8168_eri_write(tp, 0x2E8, 2, 0x883C, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x2EA, 2, 0x8C12, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x2EC, 2, 0x9003, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x2E2, 2, 0x883C, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x2E4, 2, 0x8C12, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x2E6, 2, 0x9003, ERIAR_ExGMAC);
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_eri_write(tp, 0x2E8, 2, 0x9003, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x2EA, 2, 0x9003, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x2EC, 2, 0x9003, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x2E2, 2, 0x883C, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x2E4, 2, 0x8C12, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x2E6, 2, 0x9003, ERIAR_ExGMAC);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-                csi_tmp = rtl8168_eri_read(tp, 0x3FA, 2, ERIAR_ExGMAC);
-                csi_tmp |= BIT_14;
-                rtl8168_eri_write(tp, 0x3FA, 2, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_26:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_35:
-                if (tp->org_pci_offset_99 & BIT_2)
-                        RTL_W8(tp, 0xB6, RTL_R8(tp, 0xB6) | BIT_0);
-                break;
-        }
-
-        rtl8168_enable_pci_offset_99(tp);
-}
-
-static void
-rtl8168_disable_pci_offset_180(struct rtl8168_private *tp)
-{
-        u32 csi_tmp;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0x1E2, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_2;
-                rtl8168_eri_write(tp, 0x1E2, 1, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_26:
-                rtl8168_eri_write(tp, 0x1E9, 1, 0x0A, ERIAR_ExGMAC);
-                break;
-        }
-}
-
-static void
-rtl8168_enable_pci_offset_180(struct rtl8168_private *tp)
-{
-        u32 csi_tmp;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_25:
-        case CFG_METHOD_28:
-                csi_tmp = rtl8168_eri_read(tp, 0x1E8, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~(0x0000FF00);
-                csi_tmp |= (0x00006400);
-                rtl8168_eri_write(tp, 0x1E8, 4, csi_tmp, ERIAR_ExGMAC);
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1E4, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~(0x0000FF00);
-                rtl8168_eri_write(tp, 0x1E4, 4, csi_tmp, ERIAR_ExGMAC);
-                break;
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                csi_tmp = rtl8168_eri_read(tp, 0x1E8, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~(0x0000FFF0);
-                csi_tmp |= (0x00000640);
-                rtl8168_eri_write(tp, 0x1E8, 4, csi_tmp, ERIAR_ExGMAC);
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1E4, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~(0x0000FF00);
-                rtl8168_eri_write(tp, 0x1E4, 4, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0x1E8, 2, ERIAR_ExGMAC);
-                csi_tmp &= ~(0xFFF0);
-                csi_tmp |= 0x0640;
-                rtl8168_eri_write(tp,0x1E8, 2, csi_tmp, ERIAR_ExGMAC);
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1E4, 2, ERIAR_ExGMAC);
-                csi_tmp &= ~(0xFF00);
-                rtl8168_eri_write(tp, 0x1E4, 2, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0x1E2, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_2;
-                rtl8168_eri_write(tp, 0x1E2, 1, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_26:
-                rtl8168_eri_write(tp, 0x1E9, 1, 0x64, ERIAR_ExGMAC);
-                break;
-        }
-
-        rtl8168_mac_ocp_write(tp, 0xE094, 0x0000);
-}
-
-static void
-rtl8168_init_pci_offset_180(struct rtl8168_private *tp)
-{
-        if (tp->org_pci_offset_180 & (BIT_0|BIT_1))
-                rtl8168_enable_pci_offset_180(tp);
-        else
-                rtl8168_disable_pci_offset_180(tp);
-}
-
-static void
-rtl8168_set_pci_99_180_exit_driver_para(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                if (tp->org_pci_offset_99 & BIT_2)
-                        rtl8168_issue_offset_99_event(tp);
-                rtl8168_disable_pci_offset_99(tp);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_disable_pci_offset_180(tp);
-                break;
-        }
-}
-
-static void
-rtl8168_hw_d3_para(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        RTL_W16(tp, RxMaxSize, RX_BUF_SIZE);
-
-        if (tp->HwSuppAspmClkIntrLock) {
-                RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) & ~BIT_7);
-                rtl8168_enable_cfg9346_write(tp);
-                rtl8168_hw_aspm_clkreq_enable(tp, false);
-                rtl8168_disable_cfg9346_write(tp);
-        }
-
-        rtl8168_disable_exit_l1_mask(tp);
-
-#ifdef ENABLE_REALWOW_SUPPORT
-        rtl8168_set_realwow_d3_para(dev);
-#endif
-
-        if (tp->mcfg == CFG_METHOD_18 || tp->mcfg == CFG_METHOD_19 || tp->mcfg == CFG_METHOD_20) {
-                rtl8168_eri_write(tp, 0x1bc, 4, 0x0000001f, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x1dc, 4, 0x0000002d, ERIAR_ExGMAC);
-        } else if (tp->mcfg == CFG_METHOD_16) {
-                rtl8168_eri_write(tp, 0x1bc, 4, 0x0000001f, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0x1dc, 4, 0x0000003f, ERIAR_ExGMAC);
-        }
-
-        if (tp->mcfg == CFG_METHOD_21 || tp->mcfg == CFG_METHOD_22 ||
-            tp->mcfg == CFG_METHOD_23 || tp->mcfg == CFG_METHOD_24 ||
-            tp->mcfg == CFG_METHOD_25 || tp->mcfg == CFG_METHOD_26 ||
-            tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28)
-                rtl8168_eri_write(tp, 0x2F8, 2, 0x0064, ERIAR_ExGMAC);
-
-        if (tp->bios_setting & BIT_28) {
-                if (tp->mcfg == CFG_METHOD_18 || tp->mcfg == CFG_METHOD_19 ||
-                    tp->mcfg == CFG_METHOD_20) {
-                        u32 gphy_val;
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                        rtl8168_mdio_write(tp, 0x04, 0x0061);
-                        rtl8168_mdio_write(tp, 0x09, 0x0000);
-                        rtl8168_mdio_write(tp, 0x00, 0x9200);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8B80);
-                        gphy_val = rtl8168_mdio_read(tp, 0x06);
-                        gphy_val &= ~BIT_7;
-                        rtl8168_mdio_write(tp, 0x06, gphy_val);
-                        mdelay(1);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                        rtl8168_mdio_write(tp, 0x1E, 0x002C);
-                        gphy_val = rtl8168_mdio_read(tp, 0x16);
-                        gphy_val &= ~BIT_10;
-                        rtl8168_mdio_write(tp, 0x16, gphy_val);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-        }
-
-        rtl8168_set_pci_99_180_exit_driver_para(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_35:
-                rtl8168_set_mcu_ocp_bit(tp, 0xD438, BIT_3);
-                rtl8168_set_mcu_ocp_bit(tp, 0xDE38, BIT_2);
-                rtl8168_clear_mcu_ocp_bit(tp, 0xDE28, (BIT_1 | BIT_0));
-                rtl8168_set_mcu_ocp_bit(tp, 0xD438, (BIT_1 | BIT_0));
-                break;
-        }
-
-        /*disable ocp phy power saving*/
-        if (tp->mcfg == CFG_METHOD_25 || tp->mcfg == CFG_METHOD_26 ||
-            tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28 ||
-            tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-            tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-            tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34 ||
-            tp->mcfg == CFG_METHOD_35)
-                if (!tp->dash_printer_enabled)
-                        rtl8168_disable_ocp_phy_power_saving(dev);
-
-        rtl8168_disable_rxdvgate(dev);
-}
-
-static void
-rtl8168_enable_magic_packet(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u32 csi_tmp;
-
-        switch (tp->HwSuppMagicPktVer) {
-        case WAKEUP_MAGIC_PACKET_V1:
-                rtl8168_enable_cfg9346_write(tp);
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) | MagicPacket);
-                rtl8168_disable_cfg9346_write(tp);
-                break;
-        case WAKEUP_MAGIC_PACKET_V2:
-                csi_tmp = rtl8168_eri_read(tp, 0xDE, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0xDE, 1, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-}
-static void
-rtl8168_disable_magic_packet(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u32 csi_tmp;
-
-        switch (tp->HwSuppMagicPktVer) {
-        case WAKEUP_MAGIC_PACKET_V1:
-                rtl8168_enable_cfg9346_write(tp);
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~MagicPacket);
-                rtl8168_disable_cfg9346_write(tp);
-                break;
-        case WAKEUP_MAGIC_PACKET_V2:
-                csi_tmp = rtl8168_eri_read(tp, 0xDE, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_0;
-                rtl8168_eri_write(tp, 0xDE, 1, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-}
-
-#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
-
-static void
-rtl8168_get_hw_wol(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u8 options;
-        u32 csi_tmp;
-        unsigned long flags;
-
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        tp->wol_opts = 0;
-        options = RTL_R8(tp, Config1);
-        if (!(options & PMEnable))
-                goto out_unlock;
-
-        options = RTL_R8(tp, Config3);
-        if (options & LinkUp)
-                tp->wol_opts |= WAKE_PHY;
-
-        switch (tp->HwSuppMagicPktVer) {
-        case WAKEUP_MAGIC_PACKET_V2:
-                csi_tmp = rtl8168_eri_read(tp, 0xDE, 1, ERIAR_ExGMAC);
-                if (csi_tmp & BIT_0)
-                        tp->wol_opts |= WAKE_MAGIC;
-                break;
-        default:
-                if (options & MagicPacket)
-                        tp->wol_opts |= WAKE_MAGIC;
-                break;
-        }
-
-        options = RTL_R8(tp, Config5);
-        if (options & UWF)
-                tp->wol_opts |= WAKE_UCAST;
-        if (options & BWF)
-                tp->wol_opts |= WAKE_BCAST;
-        if (options & MWF)
-                tp->wol_opts |= WAKE_MCAST;
-
-out_unlock:
-        tp->wol_enabled = (tp->wol_opts || tp->dash_printer_enabled) ? WOL_ENABLED : WOL_DISABLED;
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-}
-
-static void
-rtl8168_set_hw_wol(struct net_device *dev, u32 wolopts)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int i,tmp;
-        static struct {
-                u32 opt;
-                u16 reg;
-                u8  mask;
-        } cfg[] = {
-                { WAKE_PHY,   Config3, LinkUp },
-                { WAKE_UCAST, Config5, UWF },
-                { WAKE_BCAST, Config5, BWF },
-                { WAKE_MCAST, Config5, MWF },
-                { WAKE_ANY,   Config5, LanWake },
-                { WAKE_MAGIC, Config3, MagicPacket },
-        };
-
-        switch (tp->HwSuppMagicPktVer) {
-        case WAKEUP_MAGIC_PACKET_V2:
-                tmp = ARRAY_SIZE(cfg) - 1;
-
-                if (wolopts & WAKE_MAGIC)
-                        rtl8168_enable_magic_packet(dev);
-                else
-                        rtl8168_disable_magic_packet(dev);
-                break;
-        default:
-                tmp = ARRAY_SIZE(cfg);
-                break;
-        }
-
-        rtl8168_enable_cfg9346_write(tp);
-
-        for (i = 0; i < tmp; i++) {
-                u8 options = RTL_R8(tp, cfg[i].reg) & ~cfg[i].mask;
-                if (wolopts & cfg[i].opt)
-                        options |= cfg[i].mask;
-                RTL_W8(tp, cfg[i].reg, options);
-        }
-
-        if (tp->dash_printer_enabled)
-                RTL_W8(tp, Config5, RTL_R8(tp, Config5) | LanWake);
-
-        rtl8168_disable_cfg9346_write(tp);
-}
-
-static void
-rtl8168_phy_restart_nway(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (rtl8168_is_in_phy_disable_mode(dev)) return;
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        rtl8168_mdio_write(tp, MII_BMCR, BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART);
-}
-
-static void
-rtl8168_phy_setup_force_mode(struct net_device *dev, u32 speed, u8 duplex)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 bmcr_true_force = 0;
-
-        if (rtl8168_is_in_phy_disable_mode(dev)) return;
-
-        if ((speed == SPEED_10) && (duplex == DUPLEX_HALF)) {
-                bmcr_true_force = BMCR_SPEED10;
-        } else if ((speed == SPEED_10) && (duplex == DUPLEX_FULL)) {
-                bmcr_true_force = BMCR_SPEED10 | BMCR_FULLDPLX;
-        } else if ((speed == SPEED_100) && (duplex == DUPLEX_HALF)) {
-                bmcr_true_force = BMCR_SPEED100;
-        } else if ((speed == SPEED_100) && (duplex == DUPLEX_FULL)) {
-                bmcr_true_force = BMCR_SPEED100 | BMCR_FULLDPLX;
-        } else {
-                netif_err(tp, drv, dev, "Failed to set phy force mode!\n");
-                return;
-        }
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        rtl8168_mdio_write(tp, MII_BMCR, bmcr_true_force);
-}
-
-static void
-rtl8168_set_pci_pme(struct rtl8168_private *tp, int set)
-{
-        struct pci_dev *pdev = tp->pci_dev;
-        u16 pmc;
-
-        if (!pdev->pm_cap)
-                return;
-
-        pci_read_config_word(pdev, pdev->pm_cap + PCI_PM_CTRL, &pmc);
-        pmc |= PCI_PM_CTRL_PME_STATUS;
-        if (set)
-                pmc |= PCI_PM_CTRL_PME_ENABLE;
-        else
-                pmc &= ~PCI_PM_CTRL_PME_ENABLE;
-        pci_write_config_word(pdev, pdev->pm_cap + PCI_PM_CTRL, pmc);
-}
-
-static void
-rtl8168_set_wol_link_speed(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int auto_nego;
-        int giga_ctrl;
-        u32 adv;
-        u16 anlpar;
-        u16 gbsr;
-        u16 aner;
-
-        if (tp->autoneg != AUTONEG_ENABLE)
-                goto exit;
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        auto_nego = rtl8168_mdio_read(tp, MII_ADVERTISE);
-        auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL
-                       | ADVERTISE_100HALF | ADVERTISE_100FULL);
-
-        giga_ctrl = rtl8168_mdio_read(tp, MII_CTRL1000);
-        giga_ctrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
-
-        aner = anlpar = gbsr = 0;
-        if (tp->link_ok(dev)) {
-                aner = rtl8168_mdio_read(tp, MII_EXPANSION);
-                anlpar = rtl8168_mdio_read(tp, MII_LPA);
-                gbsr = rtl8168_mdio_read(tp, MII_STAT1000);
-        } else {
-                if (netif_running(dev)) {
-                        aner = tp->phy_reg_aner;
-                        anlpar = tp->phy_reg_anlpar;
-                        gbsr = tp->phy_reg_gbsr;
-                }
-        }
-
-        if ((aner | anlpar | gbsr) == 0) {
-                int auto_nego_tmp = 0;
-                adv = tp->advertising;
-                if ((adv & ADVERTISED_10baseT_Half) && (anlpar & LPA_10HALF))
-                        auto_nego_tmp |= ADVERTISE_10HALF;
-                if ((adv & ADVERTISED_10baseT_Full) && (anlpar & LPA_10FULL))
-                        auto_nego_tmp |= ADVERTISE_10FULL;
-                if ((adv & ADVERTISED_100baseT_Half) && (anlpar & LPA_100HALF))
-                        auto_nego_tmp |= ADVERTISE_100HALF;
-                if ((adv & ADVERTISED_100baseT_Full) && (anlpar & LPA_100FULL))
-                        auto_nego_tmp |= ADVERTISE_100FULL;
-
-                if (auto_nego_tmp == 0)	goto exit;
-
-                auto_nego |= auto_nego_tmp;
-                goto skip_check_lpa;
-        }
-        if (!(aner & EXPANSION_NWAY)) goto exit;
-
-        adv = tp->advertising;
-        if ((adv & ADVERTISED_10baseT_Half) && (anlpar & LPA_10HALF))
-                auto_nego |= ADVERTISE_10HALF;
-        else if ((adv & ADVERTISED_10baseT_Full) && (anlpar & LPA_10FULL))
-                auto_nego |= ADVERTISE_10FULL;
-        else if ((adv & ADVERTISED_100baseT_Half) && (anlpar & LPA_100HALF))
-                auto_nego |= ADVERTISE_100HALF;
-        else if ((adv & ADVERTISED_100baseT_Full) && (anlpar & LPA_100FULL))
-                auto_nego |= ADVERTISE_100FULL;
-        else if (adv & ADVERTISED_1000baseT_Half && (gbsr & LPA_1000HALF))
-                giga_ctrl |= ADVERTISE_1000HALF;
-        else if (adv & ADVERTISED_1000baseT_Full && (gbsr & LPA_1000FULL))
-                giga_ctrl |= ADVERTISE_1000FULL;
-        else
-                goto exit;
-
-skip_check_lpa:
-        if (tp->DASH)
-                auto_nego |= (ADVERTISE_100FULL | ADVERTISE_100HALF | ADVERTISE_10HALF | ADVERTISE_10FULL);
-
-        if (((tp->mcfg == CFG_METHOD_7) || (tp->mcfg == CFG_METHOD_8)) && (RTL_R16(tp, CPlusCmd) & ASF))
-                auto_nego |= (ADVERTISE_100FULL | ADVERTISE_100HALF | ADVERTISE_10HALF | ADVERTISE_10FULL);
-
-#ifdef CONFIG_DOWN_SPEED_100
-        auto_nego |= (ADVERTISE_100FULL | ADVERTISE_100HALF | ADVERTISE_10HALF | ADVERTISE_10FULL);
-#endif
-
-        rtl8168_mdio_write(tp, MII_ADVERTISE, auto_nego);
-        rtl8168_mdio_write(tp, MII_CTRL1000, giga_ctrl);
-
-        rtl8168_phy_restart_nway(dev);
-
-exit:
-        return;
-}
-
-static void
-rtl8168_powerdown_pll(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-#ifdef ENABLE_FIBER_SUPPORT
-        if (HW_FIBER_MODE_ENABLED(tp))
-                return;
-#endif //ENABLE_FIBER_SUPPORT
-
-        if (tp->wol_enabled == WOL_ENABLED || tp->DASH || tp->EnableKCPOffload) {
-                rtl8168_set_hw_wol(dev, tp->wol_opts);
-
-                if (tp->mcfg == CFG_METHOD_16 || tp->mcfg == CFG_METHOD_17 ||
-                    tp->mcfg == CFG_METHOD_21 || tp->mcfg == CFG_METHOD_22 ||
-                    tp->mcfg == CFG_METHOD_24 || tp->mcfg == CFG_METHOD_25 ||
-                    tp->mcfg == CFG_METHOD_26 || tp->mcfg == CFG_METHOD_23 ||
-                    tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28 ||
-                    tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-                    tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-                    tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34 ||
-                    tp->mcfg == CFG_METHOD_35) {
-                        rtl8168_enable_cfg9346_write(tp);
-                        RTL_W8(tp, Config2, RTL_R8(tp, Config2) | PMSTS_En);
-                        rtl8168_disable_cfg9346_write(tp);
-                }
-
-                /* Enable the PME and clear the status */
-                rtl8168_set_pci_pme(tp, 1);
-
-                if (HW_SUPP_SERDES_PHY(tp))
-                        return;
-
-                rtl8168_set_wol_link_speed(dev);
-
-                RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) | AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
-
-                return;
-        }
-
-        if (tp->DASH)
-                return;
-
-        if (((tp->mcfg == CFG_METHOD_7) || (tp->mcfg == CFG_METHOD_8)) && (RTL_R16(tp, CPlusCmd) & ASF))
-                return;
-
-        rtl8168_phy_power_down(dev);
-
-        if (!tp->HwIcVerUnknown) {
-                switch (tp->mcfg) {
-                case CFG_METHOD_9:
-                case CFG_METHOD_10:
-                //case CFG_METHOD_11:
-                case CFG_METHOD_12:
-                case CFG_METHOD_13:
-                case CFG_METHOD_14:
-                case CFG_METHOD_15:
-                case CFG_METHOD_17:
-                case CFG_METHOD_18:
-                case CFG_METHOD_19:
-                case CFG_METHOD_21:
-                case CFG_METHOD_22:
-                case CFG_METHOD_24:
-                case CFG_METHOD_25:
-                case CFG_METHOD_26:
-                case CFG_METHOD_27:
-                case CFG_METHOD_28:
-                case CFG_METHOD_29:
-                case CFG_METHOD_30:
-                case CFG_METHOD_31:
-                case CFG_METHOD_32:
-                case CFG_METHOD_33:
-                case CFG_METHOD_34:
-                case CFG_METHOD_35:
-                        RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~BIT_7);
-                        break;
-                }
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_14 ... CFG_METHOD_15:
-                RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) & ~BIT_6);
-                break;
-        case CFG_METHOD_16 ... CFG_METHOD_35:
-                RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) & ~BIT_6);
-                RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_6);
-                break;
-        }
-}
-
-static void rtl8168_powerup_pll(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_9:
-        case CFG_METHOD_10:
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-        case CFG_METHOD_13:
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | BIT_7 | BIT_6);
-                break;
-        }
-
-        rtl8168_phy_power_up(dev);
-}
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-static void
-rtl8168_get_wol(struct net_device *dev,
-                struct ethtool_wolinfo *wol)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u8 options;
-        unsigned long flags;
-
-        wol->wolopts = 0;
-
-        if (tp->mcfg == CFG_METHOD_DEFAULT) {
-                wol->supported = 0;
-                return;
-        } else {
-                wol->supported = WAKE_ANY;
-        }
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        options = RTL_R8(tp, Config1);
-        if (!(options & PMEnable))
-                goto out_unlock;
-
-        wol->wolopts = tp->wol_opts;
-
-out_unlock:
-        spin_unlock_irqrestore(&tp->lock, flags);
-}
-
-static int
-rtl8168_set_wol(struct net_device *dev,
-                struct ethtool_wolinfo *wol)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        if (tp->mcfg == CFG_METHOD_DEFAULT)
-                return -EOPNOTSUPP;
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        tp->wol_opts = wol->wolopts;
-
-        tp->wol_enabled = (tp->wol_opts || tp->dash_printer_enabled) ? WOL_ENABLED : WOL_DISABLED;
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        device_set_wakeup_enable(tp_to_dev(tp), tp->wol_enabled);
-
-        return 0;
-}
-
-static void
-rtl8168_get_drvinfo(struct net_device *dev,
-                    struct ethtool_drvinfo *info)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct rtl8168_fw *rtl_fw = tp->rtl_fw;
-
-        strcpy(info->driver, MODULENAME);
-        strcpy(info->version, RTL8168_VERSION);
-        strcpy(info->bus_info, pci_name(tp->pci_dev));
-        info->regdump_len = R8168_REGS_DUMP_SIZE;
-        info->eedump_len = tp->eeprom_len;
-        BUILD_BUG_ON(sizeof(info->fw_version) < sizeof(rtl_fw->version));
-        if (rtl_fw)
-                strlcpy(info->fw_version, rtl_fw->version,
-                        sizeof(info->fw_version));
-}
-
-static int
-rtl8168_get_regs_len(struct net_device *dev)
-{
-        return R8168_REGS_DUMP_SIZE;
-}
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-
-static int
-rtl8168_set_speed_xmii(struct net_device *dev,
-                       u8 autoneg,
-                       u32 speed,
-                       u8 duplex,
-                       u32 adv)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int auto_nego = 0;
-        int giga_ctrl = 0;
-        int rc = -EINVAL;
-
-        if (tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-            tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-            tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34 ||
-            tp->mcfg == CFG_METHOD_35) {
-                //Disable Giga Lite
-                rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                rtl8168_clear_eth_phy_bit(tp, 0x14, BIT_9);
-                if (tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-                    tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34)
-                        rtl8168_clear_eth_phy_bit(tp, 0x14, BIT_7);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A40);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        }
-
-        if ((speed != SPEED_1000) &&
-            (speed != SPEED_100) &&
-            (speed != SPEED_10)) {
-                speed = SPEED_1000;
-                duplex = DUPLEX_FULL;
-        }
-
-        giga_ctrl = rtl8168_mdio_read(tp, MII_CTRL1000);
-        giga_ctrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
-
-        if (autoneg == AUTONEG_ENABLE) {
-                /*n-way force*/
-                auto_nego = rtl8168_mdio_read(tp, MII_ADVERTISE);
-                auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
-                               ADVERTISE_100HALF | ADVERTISE_100FULL |
-                               ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
-
-                if (adv & ADVERTISED_10baseT_Half)
-                        auto_nego |= ADVERTISE_10HALF;
-                if (adv & ADVERTISED_10baseT_Full)
-                        auto_nego |= ADVERTISE_10FULL;
-                if (adv & ADVERTISED_100baseT_Half)
-                        auto_nego |= ADVERTISE_100HALF;
-                if (adv & ADVERTISED_100baseT_Full)
-                        auto_nego |= ADVERTISE_100FULL;
-                if (adv & ADVERTISED_1000baseT_Half)
-                        giga_ctrl |= ADVERTISE_1000HALF;
-                if (adv & ADVERTISED_1000baseT_Full)
-                        giga_ctrl |= ADVERTISE_1000FULL;
-
-                //flow control
-                if (dev->mtu <= ETH_DATA_LEN && tp->fcpause == rtl8168_fc_full)
-                        auto_nego |= ADVERTISE_PAUSE_CAP|ADVERTISE_PAUSE_ASYM;
-
-                tp->phy_auto_nego_reg = auto_nego;
-                tp->phy_1000_ctrl_reg = giga_ctrl;
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, MII_ADVERTISE, auto_nego);
-                rtl8168_mdio_write(tp, MII_CTRL1000, giga_ctrl);
-                rtl8168_phy_restart_nway(dev);
-                mdelay(20);
-        } else {
-                /*true force*/
-                if (speed == SPEED_10 || speed == SPEED_100)
-                        rtl8168_phy_setup_force_mode(dev, speed, duplex);
-                else
-                        goto out;
-        }
-
-        tp->autoneg = autoneg;
-        tp->speed = speed;
-        tp->duplex = duplex;
-        tp->advertising = adv;
-
-        if (tp->mcfg == CFG_METHOD_11)
-                rtl8168dp_10mbps_gphy_para(dev);
-
-        rc = 0;
-out:
-        return rc;
-}
-
-static int
-rtl8168_set_speed(struct net_device *dev,
-                  u8 autoneg,
-                  u32 speed,
-                  u8 duplex,
-                  u32 adv)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int ret;
-
-        ret = tp->set_speed(dev, autoneg, speed, duplex, adv);
-
-        return ret;
-}
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-static int
-rtl8168_set_settings(struct net_device *dev,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
-                     struct ethtool_cmd *cmd
-#else
-                     const struct ethtool_link_ksettings *cmd
-#endif
-                    )
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int ret;
-        unsigned long flags;
-        u8 autoneg;
-        u32 speed;
-        u8 duplex;
-        u32 supported, advertising;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
-        autoneg = cmd->autoneg;
-        speed = cmd->speed;
-        duplex = cmd->duplex;
-        supported = cmd->supported;
-        advertising = cmd->advertising;
-#else
-        const struct ethtool_link_settings *base = &cmd->base;
-        autoneg = base->autoneg;
-        speed = base->speed;
-        duplex = base->duplex;
-        ethtool_convert_link_mode_to_legacy_u32(&supported,
-                                                cmd->link_modes.supported);
-        ethtool_convert_link_mode_to_legacy_u32(&advertising,
-                                                cmd->link_modes.advertising);
-#endif
-        if (advertising & ~supported)
-                return -EINVAL;
-
-        spin_lock_irqsave(&tp->lock, flags);
-        ret = rtl8168_set_speed(dev, autoneg, speed, duplex, advertising);
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        return ret;
-}
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
-static u32
-rtl8168_get_tx_csum(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u32 ret;
-        unsigned long flags;
-
-        spin_lock_irqsave(&tp->lock, flags);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-        ret = ((dev->features & NETIF_F_IP_CSUM) != 0);
-#else
-        ret = ((dev->features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)) != 0);
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        return ret;
-}
-
-static u32
-rtl8168_get_rx_csum(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u32 ret;
-        unsigned long flags;
-
-        spin_lock_irqsave(&tp->lock, flags);
-        ret = tp->cp_cmd & RxChkSum;
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        return ret;
-}
-
-static int
-rtl8168_set_tx_csum(struct net_device *dev,
-                    u32 data)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        if (tp->mcfg == CFG_METHOD_DEFAULT)
-                return -EOPNOTSUPP;
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-        if (data)
-                dev->features |= NETIF_F_IP_CSUM;
-        else
-                dev->features &= ~NETIF_F_IP_CSUM;
-#else
-        if (data)
-                if ((tp->mcfg == CFG_METHOD_1) || (tp->mcfg == CFG_METHOD_2) || (tp->mcfg == CFG_METHOD_3))
-                        dev->features |= NETIF_F_IP_CSUM;
-                else
-                        dev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
-        else
-                dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        return 0;
-}
-
-static int
-rtl8168_set_rx_csum(struct net_device *dev,
-                    u32 data)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        if (tp->mcfg == CFG_METHOD_DEFAULT)
-                return -EOPNOTSUPP;
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        if (data)
-                tp->cp_cmd |= RxChkSum;
-        else
-                tp->cp_cmd &= ~RxChkSum;
-
-        RTL_W16(tp, CPlusCmd, tp->cp_cmd);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        return 0;
-}
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-
-#ifdef CONFIG_R8168_VLAN
-
-static inline u32
-rtl8168_tx_vlan_tag(struct rtl8168_private *tp,
-                    struct sk_buff *skb)
-{
-        u32 tag;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-        tag = (tp->vlgrp && vlan_tx_tag_present(skb)) ?
-              TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
-#elif LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)
-        tag = (vlan_tx_tag_present(skb)) ?
-              TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
-#else
-        tag = (skb_vlan_tag_present(skb)) ?
-              TxVlanTag | swab16(skb_vlan_tag_get(skb)) : 0x00;
-#endif
-
-        return tag;
-}
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-
-static void
-rtl8168_vlan_rx_register(struct net_device *dev,
-                         struct vlan_group *grp)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        spin_lock_irqsave(&tp->lock, flags);
-        tp->vlgrp = grp;
-        if (tp->vlgrp)
-                tp->cp_cmd |= RxVlan;
-        else
-                tp->cp_cmd &= ~RxVlan;
-        RTL_W16(tp, CPlusCmd, tp->cp_cmd);
-        RTL_R16(tp, CPlusCmd);
-        spin_unlock_irqrestore(&tp->lock, flags);
-}
-
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-static void
-rtl8168_vlan_rx_kill_vid(struct net_device *dev,
-                         unsigned short vid)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        spin_lock_irqsave(&tp->lock, flags);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
-        if (tp->vlgrp)
-                tp->vlgrp->vlan_devices[vid] = NULL;
-#else
-        vlan_group_set_device(tp->vlgrp, vid, NULL);
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)
-        spin_unlock_irqrestore(&tp->lock, flags);
-}
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-
-static int
-rtl8168_rx_vlan_skb(struct rtl8168_private *tp,
-                    struct RxDesc *desc,
-                    struct sk_buff *skb)
-{
-        u32 opts2 = le32_to_cpu(desc->opts2);
-        int ret = -1;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-        if (tp->vlgrp && (opts2 & RxVlanTag)) {
-                rtl8168_rx_hwaccel_skb(skb, tp->vlgrp,
-                                       swab16(opts2 & 0xffff));
-                ret = 0;
-        }
-#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
-        if (opts2 & RxVlanTag)
-                __vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
-#else
-        if (opts2 & RxVlanTag)
-                __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 0xffff));
-#endif
-
-        desc->opts2 = 0;
-        return ret;
-}
-
-#else /* !CONFIG_R8168_VLAN */
-
-static inline u32
-rtl8168_tx_vlan_tag(struct rtl8168_private *tp,
-                    struct sk_buff *skb)
-{
-        return 0;
-}
-
-static int
-rtl8168_rx_vlan_skb(struct rtl8168_private *tp,
-                    struct RxDesc *desc,
-                    struct sk_buff *skb)
-{
-        return -1;
-}
-
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
-
-static netdev_features_t rtl8168_fix_features(struct net_device *dev,
-                netdev_features_t features)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        spin_lock_irqsave(&tp->lock, flags);
-        if (dev->mtu > MSS_MAX)
-                features &= ~NETIF_F_ALL_TSO;
-        if (dev->mtu > ETH_DATA_LEN) {
-                features &= ~NETIF_F_ALL_TSO;
-                features &= ~NETIF_F_ALL_CSUM;
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        return features;
-}
-
-static int rtl8168_hw_set_features(struct net_device *dev,
-                                   netdev_features_t features)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u32 rx_config;
-
-        rx_config = RTL_R32(tp, RxConfig);
-        if (features & NETIF_F_RXALL)
-                rx_config |= (AcceptErr | AcceptRunt);
-        else
-                rx_config &= ~(AcceptErr | AcceptRunt);
-
-        RTL_W32(tp, RxConfig, rx_config);
-
-        if (features & NETIF_F_RXCSUM)
-                tp->cp_cmd |= RxChkSum;
-        else
-                tp->cp_cmd &= ~RxChkSum;
-
-        if (dev->features & NETIF_F_HW_VLAN_RX)
-                tp->cp_cmd |= RxVlan;
-        else
-                tp->cp_cmd &= ~RxVlan;
-
-        RTL_W16(tp, CPlusCmd, tp->cp_cmd);
-        RTL_R16(tp, CPlusCmd);
-
-        return 0;
-}
-
-static int rtl8168_set_features(struct net_device *dev,
-                                netdev_features_t features)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        features &= NETIF_F_RXALL | NETIF_F_RXCSUM | NETIF_F_HW_VLAN_RX;
-
-        spin_lock_irqsave(&tp->lock, flags);
-        if (features ^ dev->features)
-                rtl8168_hw_set_features(dev, features);
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        return 0;
-}
-
-#endif
-
-static void rtl8168_gset_xmii(struct net_device *dev,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
-                              struct ethtool_cmd *cmd
-#else
-                              struct ethtool_link_ksettings *cmd
-#endif
-                             )
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u8 status;
-        u8 autoneg, duplex;
-        u32 speed = 0;
-        u16 bmcr, bmsr, anlpar, ctrl1000 = 0, stat1000 = 0;
-        u32 supported, advertising, lp_advertising;
-        unsigned long flags;
-
-        supported = SUPPORTED_10baseT_Half |
-                    SUPPORTED_10baseT_Full |
-                    SUPPORTED_100baseT_Half |
-                    SUPPORTED_100baseT_Full |
-                    SUPPORTED_1000baseT_Full |
-                    SUPPORTED_Autoneg |
-                    SUPPORTED_TP |
-                    SUPPORTED_Pause |
-                    SUPPORTED_Asym_Pause;
-
-        advertising = ADVERTISED_TP;
-
-        spin_lock_irqsave(&tp->lock, flags);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        bmcr = rtl8168_mdio_read(tp, MII_BMCR);
-        bmsr = rtl8168_mdio_read(tp, MII_BMSR);
-        anlpar = rtl8168_mdio_read(tp, MII_LPA);
-        ctrl1000 = rtl8168_mdio_read(tp, MII_CTRL1000);
-        stat1000 = rtl8168_mdio_read(tp, MII_STAT1000);
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        if (bmcr & BMCR_ANENABLE) {
-                advertising |= ADVERTISED_Autoneg;
-                autoneg = AUTONEG_ENABLE;
-
-                if (bmsr & BMSR_ANEGCOMPLETE) {
-                        lp_advertising = mii_lpa_to_ethtool_lpa_t(anlpar);
-                        lp_advertising |=
-                                mii_stat1000_to_ethtool_lpa_t(stat1000);
-                } else {
-                        lp_advertising = 0;
-                }
-
-                if (tp->phy_auto_nego_reg & ADVERTISE_10HALF)
-                        advertising |= ADVERTISED_10baseT_Half;
-                if (tp->phy_auto_nego_reg & ADVERTISE_10FULL)
-                        advertising |= ADVERTISED_10baseT_Full;
-                if (tp->phy_auto_nego_reg & ADVERTISE_100HALF)
-                        advertising |= ADVERTISED_100baseT_Half;
-                if (tp->phy_auto_nego_reg & ADVERTISE_100FULL)
-                        advertising |= ADVERTISED_100baseT_Full;
-                if (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL)
-                        advertising |= ADVERTISED_1000baseT_Full;
-        } else {
-                autoneg = AUTONEG_DISABLE;
-                lp_advertising = 0;
-        }
-
-        status = RTL_R8(tp, PHYstatus);
-
-        if (status & LinkStatus) {
-                /*link on*/
-                if (status & _1000bpsF)
-                        speed = SPEED_1000;
-                else if (status & _100bps)
-                        speed = SPEED_100;
-                else if (status & _10bps)
-                        speed = SPEED_10;
-
-                if (status & TxFlowCtrl)
-                        advertising |= ADVERTISED_Asym_Pause;
-
-                if (status & RxFlowCtrl)
-                        advertising |= ADVERTISED_Pause;
-
-                duplex = ((status & _1000bpsF) || (status & FullDup)) ?
-                         DUPLEX_FULL : DUPLEX_HALF;
-        } else {
-                /*link down*/
-                speed = SPEED_UNKNOWN;
-                duplex = DUPLEX_UNKNOWN;
-        }
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
-        cmd->supported = supported;
-        cmd->advertising = advertising;
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30)
-        cmd->lp_advertising = lp_advertising;
-#endif
-        cmd->autoneg = autoneg;
-        cmd->speed = speed;
-        cmd->duplex = duplex;
-        cmd->port = PORT_TP;
-#else
-        ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
-                                                supported);
-        ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
-                                                advertising);
-        ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.lp_advertising,
-                                                lp_advertising);
-        cmd->base.autoneg = autoneg;
-        cmd->base.speed = speed;
-        cmd->base.duplex = duplex;
-        cmd->base.port = PORT_TP;
-#endif
-}
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-static int
-rtl8168_get_settings(struct net_device *dev,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
-                     struct ethtool_cmd *cmd
-#else
-                     struct ethtool_link_ksettings *cmd
-#endif
-                    )
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        tp->get_settings(dev, cmd);
-
-        return 0;
-}
-
-static void rtl8168_get_regs(struct net_device *dev, struct ethtool_regs *regs,
-                             void *p)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        void __iomem *ioaddr = tp->mmio_addr;
-        unsigned int i;
-        u8 *data = p;
-        unsigned long flags;
-
-        if (regs->len < R8168_REGS_DUMP_SIZE)
-                return /* -EINVAL */;
-
-        memset(p, 0, regs->len);
-
-        spin_lock_irqsave(&tp->lock, flags);
-        for (i = 0; i < R8168_MAC_REGS_SIZE; i++)
-                *data++ = readb(ioaddr + i);
-        data = (u8*)p + 256;
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        for (i = 0; i < R8168_PHY_REGS_SIZE/2; i++) {
-                *(u16*)data = rtl8168_mdio_read(tp, i);
-                data += 2;
-        }
-        data = (u8*)p + 256 * 2;
-
-        for (i = 0; i < R8168_EPHY_REGS_SIZE/2; i++) {
-                *(u16*)data = rtl8168_ephy_read(tp, i);
-                data += 2;
-        }
-        data = (u8*)p + 256 * 3;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_1:
-        case CFG_METHOD_2:
-        case CFG_METHOD_3:
-                /* RTL8168B does not support Extend GMAC */
-                break;
-        default:
-                for (i = 0; i < R8168_ERI_REGS_SIZE; i+=4) {
-                        *(u32*)data = rtl8168_eri_read(tp, i , 4, ERIAR_ExGMAC);
-                        data += 4;
-                }
-                break;
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-static void rtl8168_get_pauseparam(struct net_device *dev,
-                                   struct ethtool_pauseparam *pause)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        pause->autoneg = (tp->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE);
-        if (tp->fcpause == rtl8168_fc_rx_pause)
-                pause->rx_pause = 1;
-        else if (tp->fcpause == rtl8168_fc_tx_pause)
-                pause->tx_pause = 1;
-        else if (tp->fcpause == rtl8168_fc_full) {
-                pause->rx_pause = 1;
-                pause->tx_pause = 1;
-        }
-}
-
-static int rtl8168_set_pauseparam(struct net_device *dev,
-                                  struct ethtool_pauseparam *pause)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        enum rtl8168_fc_mode newfc;
-
-        if (pause->tx_pause || pause->rx_pause)
-                newfc = rtl8168_fc_full;
-        else
-                newfc = rtl8168_fc_none;
-
-        if (tp->fcpause != newfc) {
-                tp->fcpause = newfc;
-
-                rtl8168_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising);
-        }
-
-        return 0;
-
-}
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-
-static u32
-rtl8168_get_msglevel(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        return tp->msg_enable;
-}
-
-static void
-rtl8168_set_msglevel(struct net_device *dev,
-                     u32 value)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        tp->msg_enable = value;
-}
-
-static const char rtl8168_gstrings[][ETH_GSTRING_LEN] = {
-        "tx_packets",
-        "rx_packets",
-        "tx_errors",
-        "rx_errors",
-        "rx_missed",
-        "align_errors",
-        "tx_single_collisions",
-        "tx_multi_collisions",
-        "unicast",
-        "broadcast",
-        "multicast",
-        "tx_aborted",
-        "tx_underrun",
-};
-#endif //#LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-static int rtl8168_get_stats_count(struct net_device *dev)
-{
-        return ARRAY_SIZE(rtl8168_gstrings);
-}
-#endif //#LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-#else
-static int rtl8168_get_sset_count(struct net_device *dev, int sset)
-{
-        switch (sset) {
-        case ETH_SS_STATS:
-                return ARRAY_SIZE(rtl8168_gstrings);
-        default:
-                return -EOPNOTSUPP;
-        }
-}
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
-
-static void
-rtl8168_wait_for_quiescence(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        synchronize_irq(dev->irq);
-
-        /* Wait for any pending NAPI task to complete */
-#ifdef CONFIG_R8168_NAPI
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-        RTL_NAPI_DISABLE(dev, &tp->napi);
-#endif
-#endif //CONFIG_R8168_NAPI
-
-        rtl8168_irq_mask_and_ack(tp);
-
-#ifdef CONFIG_R8168_NAPI
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-        RTL_NAPI_ENABLE(dev, &tp->napi);
-#endif
-#endif //CONFIG_R8168_NAPI
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)
-static void rtl8168_get_ringparam(struct net_device *dev,
-                                  struct ethtool_ringparam *ring,
-                                  struct kernel_ethtool_ringparam *kernel_ring,
-                                  struct netlink_ext_ack *extack)
-#else
-static void rtl8168_get_ringparam(struct net_device *dev,
-                                  struct ethtool_ringparam *ring)
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        ring->rx_max_pending = MAX_NUM_TX_DESC;
-        ring->tx_max_pending = MAX_NUM_RX_DESC;
-        ring->rx_pending = tp->num_rx_desc;
-        ring->tx_pending = tp->num_tx_desc;
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)
-static int rtl8168_set_ringparam(struct net_device *dev,
-                                 struct ethtool_ringparam *ring,
-                                 struct kernel_ethtool_ringparam *kernel_ring,
-                                 struct netlink_ext_ack *extack)
-#else
-static int rtl8168_set_ringparam(struct net_device *dev,
-                                 struct ethtool_ringparam *ring)
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u32 new_rx_count, new_tx_count;
-        int rc = 0;
-
-        if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
-                return -EINVAL;
-
-        new_tx_count = clamp_t(u32, ring->tx_pending,
-                               MIN_NUM_TX_DESC, MAX_NUM_TX_DESC);
-
-        new_rx_count = clamp_t(u32, ring->rx_pending,
-                               MIN_NUM_RX_DESC, MAX_NUM_RX_DESC);
-
-        if ((new_rx_count == tp->num_rx_desc) &&
-            (new_tx_count == tp->num_tx_desc)) {
-                /* nothing to do */
-                return 0;
-        }
-
-        if (netif_running(dev)) {
-                rtl8168_wait_for_quiescence(dev);
-                rtl8168_close(dev);
-        }
-
-        tp->num_rx_desc = new_rx_count;
-        tp->num_tx_desc = new_tx_count;
-
-        if (netif_running(dev))
-                rc = rtl8168_open(dev);
-
-        return rc;
-}
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-static void
-rtl8168_get_ethtool_stats(struct net_device *dev,
-                          struct ethtool_stats *stats,
-                          u64 *data)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct rtl8168_counters *counters;
-        dma_addr_t paddr;
-        u32 cmd;
-        u32 WaitCnt;
-        unsigned long flags;
-
-        ASSERT_RTNL();
-
-        counters = tp->tally_vaddr;
-        paddr = tp->tally_paddr;
-        if (!counters)
-                return;
-
-        spin_lock_irqsave(&tp->lock, flags);
-        RTL_W32(tp, CounterAddrHigh, (u64)paddr >> 32);
-        cmd = (u64)paddr & DMA_BIT_MASK(32);
-        RTL_W32(tp, CounterAddrLow, cmd);
-        RTL_W32(tp, CounterAddrLow, cmd | CounterDump);
-
-        WaitCnt = 0;
-        while (RTL_R32(tp, CounterAddrLow) & CounterDump) {
-                udelay(10);
-
-                WaitCnt++;
-                if (WaitCnt > 20)
-                        break;
-        }
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        data[0] = le64_to_cpu(counters->tx_packets);
-        data[1] = le64_to_cpu(counters->rx_packets);
-        data[2] = le64_to_cpu(counters->tx_errors);
-        data[3] = le32_to_cpu(counters->rx_errors);
-        data[4] = le16_to_cpu(counters->rx_missed);
-        data[5] = le16_to_cpu(counters->align_errors);
-        data[6] = le32_to_cpu(counters->tx_one_collision);
-        data[7] = le32_to_cpu(counters->tx_multi_collision);
-        data[8] = le64_to_cpu(counters->rx_unicast);
-        data[9] = le64_to_cpu(counters->rx_broadcast);
-        data[10] = le32_to_cpu(counters->rx_multicast);
-        data[11] = le16_to_cpu(counters->tx_aborted);
-        data[12] = le16_to_cpu(counters->tx_underrun);
-}
-
-static void
-rtl8168_get_strings(struct net_device *dev,
-                    u32 stringset,
-                    u8 *data)
-{
-        switch (stringset) {
-        case ETH_SS_STATS:
-                memcpy(data, rtl8168_gstrings, sizeof(rtl8168_gstrings));
-                break;
-        }
-}
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-
-static int rtl_get_eeprom_len(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        return tp->eeprom_len;
-}
-
-static int rtl_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *buf)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int i,j,ret;
-        int start_w, end_w;
-        int VPD_addr, VPD_data;
-        u32 *eeprom_buff;
-        u16 tmp;
-
-        if (tp->eeprom_type == EEPROM_TYPE_NONE) {
-                dev_printk(KERN_DEBUG, tp_to_dev(tp), "Detect none EEPROM\n");
-                return -EOPNOTSUPP;
-        } else if (eeprom->len == 0 || (eeprom->offset+eeprom->len) > tp->eeprom_len) {
-                dev_printk(KERN_DEBUG, tp_to_dev(tp), "Invalid parameter\n");
-                return -EINVAL;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_9:
-        case CFG_METHOD_10:
-                VPD_addr = 0xCE;
-                VPD_data = 0xD0;
-                break;
-
-        case CFG_METHOD_1:
-        case CFG_METHOD_2:
-        case CFG_METHOD_3:
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-        case CFG_METHOD_13:
-                return -EOPNOTSUPP;
-        default:
-                VPD_addr = 0xD2;
-                VPD_data = 0xD4;
-                break;
-        }
-
-        start_w = eeprom->offset >> 2;
-        end_w = (eeprom->offset + eeprom->len - 1) >> 2;
-
-        eeprom_buff = kmalloc(sizeof(u32)*(end_w - start_w + 1), GFP_KERNEL);
-        if (!eeprom_buff)
-                return -ENOMEM;
-
-        rtl8168_enable_cfg9346_write(tp);
-        ret = -EFAULT;
-        for (i=start_w; i<=end_w; i++) {
-                pci_write_config_word(tp->pci_dev, VPD_addr, (u16)i*4);
-                ret = -EFAULT;
-                for (j = 0; j < 10; j++) {
-                        udelay(400);
-                        pci_read_config_word(tp->pci_dev, VPD_addr, &tmp);
-                        if (tmp&0x8000) {
-                                ret = 0;
-                                break;
-                        }
-                }
-
-                if (ret)
-                        break;
-
-                pci_read_config_dword(tp->pci_dev, VPD_data, &eeprom_buff[i-start_w]);
-        }
-        rtl8168_disable_cfg9346_write(tp);
-
-        if (!ret)
-                memcpy(buf, (u8 *)eeprom_buff + (eeprom->offset & 3), eeprom->len);
-
-        kfree(eeprom_buff);
-
-        return ret;
-}
-
-#undef ethtool_op_get_link
-#define ethtool_op_get_link _kc_ethtool_op_get_link
-static u32 _kc_ethtool_op_get_link(struct net_device *dev)
-{
-        return netif_carrier_ok(dev) ? 1 : 0;
-}
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
-#undef ethtool_op_get_sg
-#define ethtool_op_get_sg _kc_ethtool_op_get_sg
-static u32 _kc_ethtool_op_get_sg(struct net_device *dev)
-{
-#ifdef NETIF_F_SG
-        return (dev->features & NETIF_F_SG) != 0;
-#else
-        return 0;
-#endif
-}
-
-#undef ethtool_op_set_sg
-#define ethtool_op_set_sg _kc_ethtool_op_set_sg
-static int _kc_ethtool_op_set_sg(struct net_device *dev, u32 data)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (tp->mcfg == CFG_METHOD_DEFAULT)
-                return -EOPNOTSUPP;
-
-#ifdef NETIF_F_SG
-        if (data)
-                dev->features |= NETIF_F_SG;
-        else
-                dev->features &= ~NETIF_F_SG;
-#endif
-
-        return 0;
-}
-#endif
-
-static int rtl8168_enable_EEE(struct rtl8168_private *tp)
-{
-        int ret;
-        u16 data;
-        u32 csi_tmp;
-
-        ret = 0;
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x0020);
-                data = rtl8168_mdio_read(tp, 0x15) | 0x0100;
-                rtl8168_mdio_write(tp, 0x15, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B85);
-                data = rtl8168_mdio_read(tp, 0x06) | 0x2000;
-                rtl8168_mdio_write(tp, 0x06, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0006);
-                rtl8168_mdio_write(tp, 0x00, 0x5A30);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x0D, 0x0007);
-                rtl8168_mdio_write(tp, 0x0E, 0x003C);
-                rtl8168_mdio_write(tp, 0x0D, 0x4007);
-                rtl8168_mdio_write(tp, 0x0E, 0x0006);
-                rtl8168_mdio_write(tp, 0x0D, 0x0000);
-                if ((RTL_R8(tp, Config4)&0x40) && (RTL_R8(tp, 0x6D) & BIT_7)) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8AC8);
-                        rtl8168_mdio_write(tp, 0x06, RTL_R16(tp, tp->NicCustLedValue));
-                        rtl8168_mdio_write(tp, 0x05, 0x8B82);
-                        data = rtl8168_mdio_read(tp, 0x06) | 0x0010;
-                        rtl8168_mdio_write(tp, 0x05, 0x8B82);
-                        rtl8168_mdio_write(tp, 0x06, data);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-                break;
-
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0, 4, ERIAR_ExGMAC) | 0x0003;
-                rtl8168_eri_write(tp, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
-                rtl8168_mdio_write(tp,0x1F , 0x0004);
-                rtl8168_mdio_write(tp,0x1F , 0x0007);
-                rtl8168_mdio_write(tp,0x1E , 0x0020);
-                data = rtl8168_mdio_read(tp, 0x15)|0x0100;
-                rtl8168_mdio_write(tp,0x15 , data);
-                rtl8168_mdio_write(tp,0x1F , 0x0002);
-                rtl8168_mdio_write(tp,0x1F , 0x0005);
-                rtl8168_mdio_write(tp,0x05 , 0x8B85);
-                data = rtl8168_mdio_read(tp, 0x06)|0x2000;
-                rtl8168_mdio_write(tp,0x06 , data);
-                rtl8168_mdio_write(tp,0x1F , 0x0000);
-                rtl8168_mdio_write(tp,0x0D , 0x0007);
-                rtl8168_mdio_write(tp,0x0E , 0x003C);
-                rtl8168_mdio_write(tp,0x0D , 0x4007);
-                rtl8168_mdio_write(tp,0x0E , 0x0006);
-                rtl8168_mdio_write(tp,0x0D , 0x0000);
-                break;
-
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0, 4, ERIAR_ExGMAC);
-                csi_tmp |= BIT_1 | BIT_0;
-                rtl8168_eri_write(tp, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x0020);
-                data = rtl8168_mdio_read(tp, 0x15);
-                data |= BIT_8;
-                rtl8168_mdio_write(tp, 0x15, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B85);
-                data = rtl8168_mdio_read(tp, 0x06);
-                data |= BIT_13;
-                rtl8168_mdio_write(tp, 0x06, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x0D, 0x0007);
-                rtl8168_mdio_write(tp, 0x0E, 0x003C);
-                rtl8168_mdio_write(tp, 0x0D, 0x4007);
-                rtl8168_mdio_write(tp, 0x0E, 0x0006);
-                rtl8168_mdio_write(tp, 0x0D, 0x0000);
-                break;
-
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0, 4, ERIAR_ExGMAC);
-                csi_tmp |= BIT_1 | BIT_0;
-                rtl8168_eri_write(tp, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                data = rtl8168_mdio_read(tp, 0x11);
-                rtl8168_mdio_write(tp, 0x11, data | BIT_4);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A5D);
-                rtl8168_mdio_write(tp, 0x10, tp->eee_adv_t);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-
-        default:
-//      dev_printk(KERN_DEBUG, tp_to_dev(tp), "Not Support EEE\n");
-                ret = -EOPNOTSUPP;
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_mdio_write(tp, 0x1F, 0x0A4A);
-                rtl8168_set_eth_phy_bit(tp, 0x11, BIT_9);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                rtl8168_set_eth_phy_bit(tp, 0x14, BIT_7);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        }
-
-        /*Advanced EEE*/
-        switch (tp->mcfg) {
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                rtl8168_oob_mutex_lock(tp);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_set_phy_mcu_patch_request(tp);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_25:
-                rtl8168_eri_write(tp, 0x1EA, 1, 0xFA, ERIAR_ExGMAC);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                data = rtl8168_mdio_read(tp, 0x10);
-                if (data & BIT_10) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                        data = rtl8168_mdio_read(tp, 0x16);
-                        data &= ~(BIT_1);
-                        rtl8168_mdio_write(tp, 0x16, data);
-                } else {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                        data = rtl8168_mdio_read(tp, 0x16);
-                        data |= BIT_1;
-                        rtl8168_mdio_write(tp, 0x16, data);
-                }
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        case CFG_METHOD_26:
-                data = rtl8168_mac_ocp_read(tp, 0xE052);
-                data |= BIT_0;
-                rtl8168_mac_ocp_write(tp, 0xE052, data);
-                data = rtl8168_mac_ocp_read(tp, 0xE056);
-                data &= 0xFF0F;
-                data |= (BIT_4 | BIT_5 | BIT_6);
-                rtl8168_mac_ocp_write(tp, 0xE056, data);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                data = rtl8168_mdio_read(tp, 0x10);
-                if (data & BIT_10) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                        data = rtl8168_mdio_read(tp, 0x16);
-                        data &= ~(BIT_1);
-                        rtl8168_mdio_write(tp, 0x16, data);
-                } else {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                        data = rtl8168_mdio_read(tp, 0x16);
-                        data |= BIT_1;
-                        rtl8168_mdio_write(tp, 0x16, data);
-                }
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-                data = rtl8168_mac_ocp_read(tp, 0xE052);
-                data &= ~BIT_0;
-                rtl8168_mac_ocp_write(tp, 0xE052, data);
-                data = rtl8168_mac_ocp_read(tp, 0xE056);
-                data &= 0xFF0F;
-                data |= (BIT_4 | BIT_5 | BIT_6);
-                rtl8168_mac_ocp_write(tp, 0xE056, data);
-                break;
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_35:
-                data = rtl8168_mac_ocp_read(tp, 0xE052);
-                data &= ~(BIT_0);
-                rtl8168_mac_ocp_write(tp, 0xE052, data);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                data = rtl8168_mdio_read(tp, 0x10) | BIT_15;
-                rtl8168_mdio_write(tp, 0x10, data);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                data = rtl8168_mdio_read(tp, 0x11) | BIT_13 | BIT_14;
-                data &= ~(BIT_12);
-                rtl8168_mdio_write(tp, 0x11, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                data = rtl8168_mac_ocp_read(tp, 0xE052);
-                data &= ~(BIT_0);
-                if (tp->HwPkgDet == 0x0F)
-                        data |= BIT_0;
-                rtl8168_mac_ocp_write(tp, 0xE052, data);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                data = rtl8168_mdio_read(tp, 0x10) | BIT_15;
-                rtl8168_mdio_write(tp, 0x10, data);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                data = rtl8168_mdio_read(tp, 0x11) | BIT_13 | BIT_14;
-                data &= ~(BIT_12);
-                rtl8168_mdio_write(tp, 0x11, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_clear_phy_mcu_patch_request(tp);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                rtl8168_oob_mutex_unlock(tp);
-                break;
-        }
-
-        return ret;
-}
-
-static int rtl8168_disable_EEE(struct rtl8168_private *tp)
-{
-        int ret;
-        u16 data;
-        u32 csi_tmp;
-
-        ret = 0;
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B85);
-                data = rtl8168_mdio_read(tp, 0x06) & ~0x2000;
-                rtl8168_mdio_write(tp, 0x06, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x0020);
-                data = rtl8168_mdio_read(tp, 0x15) & ~0x0100;
-                rtl8168_mdio_write(tp, 0x15, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0006);
-                rtl8168_mdio_write(tp, 0x00, 0x5A00);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x0D, 0x0007);
-                rtl8168_mdio_write(tp, 0x0E, 0x003C);
-                rtl8168_mdio_write(tp, 0x0D, 0x4007);
-                rtl8168_mdio_write(tp, 0x0E, 0x0000);
-                rtl8168_mdio_write(tp, 0x0D, 0x0000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                if (RTL_R8(tp, Config4) & 0x40) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8B82);
-                        data = rtl8168_mdio_read(tp, 0x06) & ~0x0010;
-                        rtl8168_mdio_write(tp, 0x05, 0x8B82);
-                        rtl8168_mdio_write(tp, 0x06, data);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-                break;
-
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0,4, ERIAR_ExGMAC)& ~0x0003;
-                rtl8168_eri_write(tp, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B85);
-                data = rtl8168_mdio_read(tp, 0x06) & ~0x2000;
-                rtl8168_mdio_write(tp, 0x06, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0004);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x0020);
-                data = rtl8168_mdio_read(tp, 0x15) & ~0x0100;
-                rtl8168_mdio_write(tp,0x15 , data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x0D, 0x0007);
-                rtl8168_mdio_write(tp, 0x0E, 0x003C);
-                rtl8168_mdio_write(tp, 0x0D, 0x4007);
-                rtl8168_mdio_write(tp, 0x0E, 0x0000);
-                rtl8168_mdio_write(tp, 0x0D, 0x0000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~(BIT_1 | BIT_0);
-                rtl8168_eri_write(tp, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B85);
-                data = rtl8168_mdio_read(tp, 0x06);
-                data &= ~BIT_13;
-                rtl8168_mdio_write(tp, 0x06, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x0020);
-                data = rtl8168_mdio_read(tp, 0x15);
-                data &= ~BIT_8;
-                rtl8168_mdio_write(tp, 0x15, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x0D, 0x0007);
-                rtl8168_mdio_write(tp, 0x0E, 0x003C);
-                rtl8168_mdio_write(tp, 0x0D, 0x4007);
-                rtl8168_mdio_write(tp, 0x0E, 0x0000);
-                rtl8168_mdio_write(tp, 0x0D, 0x0000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~(BIT_1 | BIT_0);
-                rtl8168_eri_write(tp, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                data = rtl8168_mdio_read(tp, 0x11);
-                rtl8168_mdio_write(tp, 0x11, data & ~BIT_4);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A5D);
-                rtl8168_mdio_write(tp, 0x10, 0x0000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-
-        default:
-//      dev_printk(KERN_DEBUG, tp_to_dev(tp), "Not Support EEE\n");
-                ret = -EOPNOTSUPP;
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_35:
-                rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                rtl8168_clear_eth_phy_bit(tp, 0x14, BIT_7);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A4A);
-                rtl8168_clear_eth_phy_bit(tp, 0x11, BIT_9);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        }
-
-        /*Advanced EEE*/
-        switch (tp->mcfg) {
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                rtl8168_oob_mutex_lock(tp);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_set_phy_mcu_patch_request(tp);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_25:
-                rtl8168_eri_write(tp, 0x1EA, 1, 0x00, ERIAR_ExGMAC);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                data = rtl8168_mdio_read(tp, 0x16);
-                data &= ~(BIT_1);
-                rtl8168_mdio_write(tp, 0x16, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        case CFG_METHOD_26:
-                data = rtl8168_mac_ocp_read(tp, 0xE052);
-                data &= ~(BIT_0);
-                rtl8168_mac_ocp_write(tp, 0xE052, data);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                data = rtl8168_mdio_read(tp, 0x16);
-                data &= ~(BIT_1);
-                rtl8168_mdio_write(tp, 0x16, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-                data = rtl8168_mac_ocp_read(tp, 0xE052);
-                data &= ~(BIT_0);
-                rtl8168_mac_ocp_write(tp, 0xE052, data);
-                break;
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                data = rtl8168_mac_ocp_read(tp, 0xE052);
-                data &= ~(BIT_0);
-                rtl8168_mac_ocp_write(tp, 0xE052, data);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                data = rtl8168_mdio_read(tp, 0x10) & ~(BIT_15);
-                rtl8168_mdio_write(tp, 0x10, data);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                data = rtl8168_mdio_read(tp, 0x11) & ~(BIT_12 | BIT_13 | BIT_14);
-                rtl8168_mdio_write(tp, 0x11, data);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_clear_phy_mcu_patch_request(tp);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                rtl8168_oob_mutex_unlock(tp);
-                break;
-        }
-
-        return ret;
-}
-
-static int rtl_nway_reset(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-        int ret, bmcr;
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        if (unlikely(tp->rtk_enable_diag)) {
-                spin_unlock_irqrestore(&tp->lock, flags);
-                return -EBUSY;
-        }
-
-        /* if autoneg is off, it's an error */
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        bmcr = rtl8168_mdio_read(tp, MII_BMCR);
-
-        if (bmcr & BMCR_ANENABLE) {
-                bmcr |= BMCR_ANRESTART;
-                rtl8168_mdio_write(tp, MII_BMCR, bmcr);
-                ret = 0;
-        } else {
-                ret = -EINVAL;
-        }
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        return ret;
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)
-static int
-rtl_ethtool_get_eee(struct net_device *net, struct ethtool_eee *eee)
-{
-        struct rtl8168_private *tp = netdev_priv(net);
-        u32 lp, adv, supported = 0;
-        unsigned long flags;
-        u16 val;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21 ... CFG_METHOD_35:
-                break;
-        default:
-                return -EOPNOTSUPP;
-        }
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        if (unlikely(tp->rtk_enable_diag)) {
-                spin_unlock_irqrestore(&tp->lock, flags);
-                return -EBUSY;
-        }
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A5C);
-        val = rtl8168_mdio_read(tp, 0x12);
-        supported = mmd_eee_cap_to_ethtool_sup_t(val);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A5D);
-        val = rtl8168_mdio_read(tp, 0x10);
-        adv = mmd_eee_adv_to_ethtool_adv_t(val);
-
-        val = rtl8168_mdio_read(tp, 0x11);
-        lp = mmd_eee_adv_to_ethtool_adv_t(val);
-
-        val = rtl8168_eri_read(tp, 0x1B0, 2, ERIAR_ExGMAC);
-        val &= BIT_1 | BIT_0;
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        eee->eee_enabled = !!val;
-        eee->eee_active = !!(supported & adv & lp);
-        eee->supported = supported;
-        eee->advertised = adv;
-        eee->lp_advertised = lp;
-
-        return 0;
-}
-
-static int
-rtl_ethtool_set_eee(struct net_device *net, struct ethtool_eee *eee)
-{
-        struct rtl8168_private *tp = netdev_priv(net);
-        unsigned long flags;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21 ... CFG_METHOD_35:
-                break;
-        default:
-                return -EOPNOTSUPP;
-        }
-
-        if (HW_SUPP_SERDES_PHY(tp) ||
-            !HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp) ||
-            tp->DASH)
-                return -EOPNOTSUPP;
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        if (unlikely(tp->rtk_enable_diag)) {
-                spin_unlock_irqrestore(&tp->lock, flags);
-                return -EBUSY;
-        }
-
-        tp->eee_enabled = eee->eee_enabled;
-        tp->eee_adv_t = ethtool_adv_to_mmd_eee_adv_t(eee->advertised);
-
-        if (tp->eee_enabled)
-                rtl8168_enable_EEE(tp);
-        else
-                rtl8168_disable_EEE(tp);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        rtl_nway_reset(net);
-
-        return 0;
-}
-#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) */
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-static const struct ethtool_ops rtl8168_ethtool_ops = {
-        .get_drvinfo        = rtl8168_get_drvinfo,
-        .get_regs_len       = rtl8168_get_regs_len,
-        .get_link           = ethtool_op_get_link,
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-        .get_ringparam      = rtl8168_get_ringparam,
-        .set_ringparam      = rtl8168_set_ringparam,
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
-        .get_settings       = rtl8168_get_settings,
-        .set_settings       = rtl8168_set_settings,
-#else
-        .get_link_ksettings       = rtl8168_get_settings,
-        .set_link_ksettings       = rtl8168_set_settings,
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-        .get_pauseparam     = rtl8168_get_pauseparam,
-        .set_pauseparam     = rtl8168_set_pauseparam,
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-        .get_msglevel       = rtl8168_get_msglevel,
-        .set_msglevel       = rtl8168_set_msglevel,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
-        .get_rx_csum        = rtl8168_get_rx_csum,
-        .set_rx_csum        = rtl8168_set_rx_csum,
-        .get_tx_csum        = rtl8168_get_tx_csum,
-        .set_tx_csum        = rtl8168_set_tx_csum,
-        .get_sg         = ethtool_op_get_sg,
-        .set_sg         = ethtool_op_set_sg,
-#ifdef NETIF_F_TSO
-        .get_tso        = ethtool_op_get_tso,
-        .set_tso        = ethtool_op_set_tso,
-#endif //NETIF_F_TSO
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
-        .get_regs       = rtl8168_get_regs,
-        .get_wol        = rtl8168_get_wol,
-        .set_wol        = rtl8168_set_wol,
-        .get_strings        = rtl8168_get_strings,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
-        .get_stats_count    = rtl8168_get_stats_count,
-#else
-        .get_sset_count     = rtl8168_get_sset_count,
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33)
-        .get_ethtool_stats  = rtl8168_get_ethtool_stats,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
-#ifdef ETHTOOL_GPERMADDR
-        .get_perm_addr      = ethtool_op_get_perm_addr,
-#endif
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
-        .get_eeprom     = rtl_get_eeprom,
-        .get_eeprom_len     = rtl_get_eeprom_len,
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
-        .get_ts_info        = ethtool_op_get_ts_info,
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0)
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)
-        .get_eee = rtl_ethtool_get_eee,
-        .set_eee = rtl_ethtool_set_eee,
-#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) */
-        .nway_reset = rtl_nway_reset,
-};
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-
-#if 0
-
-static int rtl8168_enable_green_feature(struct rtl8168_private *tp)
-{
-        u16 gphy_val;
-        unsigned long flags;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                gphy_val = rtl8168_mdio_read(tp, 0x10) | 0x0400;
-                rtl8168_mdio_write(tp, 0x10, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x19) | 0x0001;
-                rtl8168_mdio_write(tp, 0x19, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                gphy_val = rtl8168_mdio_read(tp, 0x01) & ~0x0100;
-                rtl8168_mdio_write(tp, 0x01, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x00, 0x9200);
-                mdelay(20);
-                break;
-
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-                rtl8168_mdio_write(tp, 0x1f, 0x0003);
-                gphy_val = rtl8168_mdio_read(tp, 0x10);
-                gphy_val |= BIT_10;
-                rtl8168_mdio_write(tp, 0x10, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x19);
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x19, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                gphy_val = rtl8168_mdio_read(tp, 0x01);
-                gphy_val |= BIT_8;
-                rtl8168_mdio_write(tp, 0x01, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, 0x00, 0x9200);
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8011);
-                rtl8168_set_eth_phy_bit( tp, 0x14, BIT_14 );
-                rtl8168_mdio_write(tp, 0x1F, 0x0A40);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x00, 0x9200);
-                break;
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8045);
-                rtl8168_mdio_write(tp, 0x14, 0x0000);
-                rtl8168_mdio_write(tp, 0x13, 0x804d);
-                rtl8168_mdio_write(tp, 0x14, 0x1222);
-                rtl8168_mdio_write(tp, 0x13, 0x805d);
-                rtl8168_mdio_write(tp, 0x14, 0x0022);
-                rtl8168_mdio_write(tp, 0x13, 0x8011);
-                rtl8168_set_eth_phy_bit( tp, 0x14, BIT_15 );
-                rtl8168_mdio_write(tp, 0x1F, 0x0A40);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x00, 0x9200);
-                break;
-        default:
-                dev_printk(KERN_DEBUG, tp_to_dev(tp), "Not Support Green Feature\n");
-                break;
-        }
-
-        return 0;
-}
-
-static int rtl8168_disable_green_feature(struct rtl8168_private *tp)
-{
-        u16 gphy_val;
-        unsigned long flags;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                gphy_val = rtl8168_mdio_read(tp, 0x01) | 0x0100;
-                rtl8168_mdio_write(tp, 0x01, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                gphy_val = rtl8168_mdio_read(tp, 0x10) & ~0x0400;
-                rtl8168_mdio_write(tp, 0x10, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x19) & ~0x0001;
-                rtl8168_mdio_write(tp, 0x19, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x06) & ~0x7000;
-                gphy_val |= 0x3000;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x0D) & 0x0700;
-                gphy_val |= 0x0500;
-                rtl8168_mdio_write(tp, 0x0D, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-                rtl8168_mdio_write(tp, 0x1f, 0x0003);
-                gphy_val = rtl8168_mdio_read(tp, 0x19);
-                gphy_val &= ~BIT_0;
-                rtl8168_mdio_write(tp, 0x19, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x10);
-                gphy_val &= ~BIT_10;
-                rtl8168_mdio_write(tp, 0x10, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8011);
-                rtl8168_clear_eth_phy_bit( tp, 0x14, BIT_14 );
-                rtl8168_mdio_write(tp, 0x1F, 0x0A40);
-                rtl8168_mdio_write(tp, 0x00, 0x9200);
-                break;
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8045);
-                rtl8168_mdio_write(tp, 0x14, 0x2444);
-                rtl8168_mdio_write(tp, 0x13, 0x804d);
-                rtl8168_mdio_write(tp, 0x14, 0x2444);
-                rtl8168_mdio_write(tp, 0x13, 0x805d);
-                rtl8168_mdio_write(tp, 0x14, 0x2444);
-                rtl8168_mdio_write(tp, 0x13, 0x8011);
-                rtl8168_set_eth_phy_bit( tp, 0x14, BIT_15 );
-                rtl8168_mdio_write(tp, 0x1F, 0x0A40);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x00, 0x9200);
-                break;
-        default:
-                dev_printk(KERN_DEBUG, tp_to_dev(tp), "Not Support Green Feature\n");
-                break;
-        }
-
-        return 0;
-}
-
-#endif
-
-static void rtl8168_get_mac_version(struct rtl8168_private *tp)
-{
-        u32 reg,val32;
-        u32 ICVerID;
-
-        val32 = RTL_R32(tp, TxConfig);
-        reg = val32 & 0x7c800000;
-        ICVerID = val32 & 0x00700000;
-
-        switch (reg) {
-        case 0x30000000:
-                tp->mcfg = CFG_METHOD_1;
-                tp->efuse_ver = EFUSE_NOT_SUPPORT;
-                break;
-        case 0x38000000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_2;
-                } else if (ICVerID == 0x00500000) {
-                        tp->mcfg = CFG_METHOD_3;
-                } else {
-                        tp->mcfg = CFG_METHOD_3;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_NOT_SUPPORT;
-                break;
-        case 0x3C000000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_4;
-                } else if (ICVerID == 0x00200000) {
-                        tp->mcfg = CFG_METHOD_5;
-                } else if (ICVerID == 0x00400000) {
-                        tp->mcfg = CFG_METHOD_6;
-                } else {
-                        tp->mcfg = CFG_METHOD_6;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_NOT_SUPPORT;
-                break;
-        case 0x3C800000:
-                if (ICVerID == 0x00100000) {
-                        tp->mcfg = CFG_METHOD_7;
-                } else if (ICVerID == 0x00300000) {
-                        tp->mcfg = CFG_METHOD_8;
-                } else {
-                        tp->mcfg = CFG_METHOD_8;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_NOT_SUPPORT;
-                break;
-        case 0x28000000:
-                if (ICVerID == 0x00100000) {
-                        tp->mcfg = CFG_METHOD_9;
-                } else if (ICVerID == 0x00300000) {
-                        tp->mcfg = CFG_METHOD_10;
-                } else {
-                        tp->mcfg = CFG_METHOD_10;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_SUPPORT_V1;
-                break;
-        case 0x28800000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_11;
-                } else if (ICVerID == 0x00200000) {
-                        tp->mcfg = CFG_METHOD_12;
-                        RTL_W32(tp, 0xD0, RTL_R32(tp, 0xD0) | 0x00020000);
-                } else if (ICVerID == 0x00300000) {
-                        tp->mcfg = CFG_METHOD_13;
-                } else {
-                        tp->mcfg = CFG_METHOD_13;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_SUPPORT_V1;
-                break;
-        case 0x2C000000:
-                if (ICVerID == 0x00100000) {
-                        tp->mcfg = CFG_METHOD_14;
-                } else if (ICVerID == 0x00200000) {
-                        tp->mcfg = CFG_METHOD_15;
-                } else {
-                        tp->mcfg = CFG_METHOD_15;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_SUPPORT_V2;
-                break;
-        case 0x2C800000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_16;
-                } else if (ICVerID == 0x00100000) {
-                        tp->mcfg = CFG_METHOD_17;
-                } else {
-                        tp->mcfg = CFG_METHOD_17;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_SUPPORT_V3;
-                break;
-        case 0x48000000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_18;
-                } else if (ICVerID == 0x00100000) {
-                        tp->mcfg = CFG_METHOD_19;
-                } else {
-                        tp->mcfg = CFG_METHOD_19;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_SUPPORT_V3;
-                break;
-        case 0x48800000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_20;
-                } else {
-                        tp->mcfg = CFG_METHOD_20;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-
-                tp->efuse_ver = EFUSE_SUPPORT_V3;
-                break;
-        case 0x4C000000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_21;
-                } else if (ICVerID == 0x00100000) {
-                        tp->mcfg = CFG_METHOD_22;
-                } else {
-                        tp->mcfg = CFG_METHOD_22;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_SUPPORT_V3;
-                break;
-        case 0x50000000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_23;
-                } else if (ICVerID == 0x00100000) {
-                        tp->mcfg = CFG_METHOD_27;
-                } else if (ICVerID == 0x00200000) {
-                        tp->mcfg = CFG_METHOD_28;
-                } else {
-                        tp->mcfg = CFG_METHOD_28;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_SUPPORT_V3;
-                break;
-        case 0x50800000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_24;
-                } else if (ICVerID == 0x00100000) {
-                        tp->mcfg = CFG_METHOD_25;
-                } else {
-                        tp->mcfg = CFG_METHOD_25;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-                tp->efuse_ver = EFUSE_SUPPORT_V3;
-                break;
-        case 0x5C800000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_26;
-                } else {
-                        tp->mcfg = CFG_METHOD_26;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-
-                tp->efuse_ver = EFUSE_SUPPORT_V3;
-                break;
-        case 0x54000000:
-                if (ICVerID == 0x00000000) {
-                        tp->mcfg = CFG_METHOD_29;
-                } else if (ICVerID == 0x00100000) {
-                        tp->mcfg = CFG_METHOD_30;
-                } else {
-                        tp->mcfg = CFG_METHOD_30;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-
-                if (tp->mcfg == CFG_METHOD_30 &&
-                    (rtl8168_mac_ocp_read(tp, 0xD006) & 0xFF00) == 0x0100)
-                        tp->mcfg = CFG_METHOD_35;
-
-                tp->efuse_ver = EFUSE_SUPPORT_V3;
-                break;
-        case 0x54800000:
-                if (ICVerID == 0x00100000) {
-                        tp->mcfg = CFG_METHOD_31;
-                } else if (ICVerID == 0x00200000) {
-                        tp->mcfg = CFG_METHOD_32;
-                } else if (ICVerID == 0x00300000) {
-                        tp->mcfg = CFG_METHOD_33;
-                } else if (ICVerID == 0x00400000) {
-                        tp->mcfg = CFG_METHOD_34;
-                } else {
-                        tp->mcfg = CFG_METHOD_34;
-                        tp->HwIcVerUnknown = TRUE;
-                }
-
-                tp->efuse_ver = EFUSE_SUPPORT_V3;
-                break;
-        default:
-                printk("unknown chip version (%x)\n",reg);
-                tp->mcfg = CFG_METHOD_DEFAULT;
-                tp->HwIcVerUnknown = TRUE;
-                tp->efuse_ver = EFUSE_NOT_SUPPORT;
-                break;
-        }
-}
-
-static void
-rtl8168_print_mac_version(struct rtl8168_private *tp)
-{
-        int i;
-        for (i = ARRAY_SIZE(rtl_chip_info) - 1; i >= 0; i--) {
-                if (tp->mcfg == rtl_chip_info[i].mcfg) {
-                        dprintk("Realtek PCIe GbE Family Controller mcfg = %04d\n",
-                                rtl_chip_info[i].mcfg);
-                        return;
-                }
-        }
-
-        dprintk("mac_version == Unknown\n");
-}
-
-static u8 rtl8168_calc_efuse_dummy_bit(u16 reg)
-{
-        int s,a,b;
-        u8 dummyBitPos = 0;
-
-
-        s=reg% 32;
-        a=s % 16;
-        b=s/16;
-
-        if (s/16) {
-                dummyBitPos = (u8)(16-a);
-        } else {
-                dummyBitPos = (u8)a;
-        }
-
-        return dummyBitPos;
-}
-
-static u32 rtl8168_decode_efuse_cmd(struct rtl8168_private *tp, u32 DwCmd)
-{
-        u16 reg = (u16)((DwCmd & 0x00FE0000) >> 17);
-        u32 DummyPos = rtl8168_calc_efuse_dummy_bit(reg);
-        u32 DeCodeDwCmd = DwCmd;
-        u32 Dw17BitData;
-
-
-        if (tp->efuse_ver < 3) {
-                DeCodeDwCmd = (DwCmd>>(DummyPos+1))<<DummyPos;
-                if (DummyPos > 0) {
-                        DeCodeDwCmd |= ((DwCmd<<(32-DummyPos))>>(32-DummyPos));
-                }
-        } else {
-                reg = (u16)((DwCmd & 0x007F0000) >> 16);
-                DummyPos = rtl8168_calc_efuse_dummy_bit(reg);
-                Dw17BitData = ((DwCmd & BIT_23) >> 23);
-                Dw17BitData <<= 16;
-                Dw17BitData |= (DwCmd & 0x0000FFFF);
-                DeCodeDwCmd = (Dw17BitData>>(DummyPos+1))<<DummyPos;
-                if (DummyPos > 0) {
-                        DeCodeDwCmd |= ((Dw17BitData<<(32-DummyPos))>>(32-DummyPos));
-                }
-        }
-
-        return DeCodeDwCmd;
-}
-
-static u8 rtl8168_efuse_read(struct rtl8168_private *tp, u16 reg)
-{
-        u8 efuse_data = 0;
-        u32 temp;
-        int cnt;
-
-        if (tp->efuse_ver == EFUSE_NOT_SUPPORT)
-                return EFUSE_READ_FAIL;
-
-        if (tp->efuse_ver == EFUSE_SUPPORT_V1) {
-                temp = EFUSE_READ | ((reg & EFUSE_Reg_Mask) << EFUSE_Reg_Shift);
-                RTL_W32(tp, EFUSEAR, temp);
-
-                cnt = 0;
-                do {
-                        udelay(100);
-                        temp = RTL_R32(tp, EFUSEAR);
-                        cnt++;
-                } while (!(temp & EFUSE_READ_OK) && (cnt < EFUSE_Check_Cnt));
-
-                if (cnt == EFUSE_Check_Cnt)
-                        efuse_data = EFUSE_READ_FAIL;
-                else
-                        efuse_data = (u8)(RTL_R32(tp, EFUSEAR) & EFUSE_Data_Mask);
-        } else  if (tp->efuse_ver == EFUSE_SUPPORT_V2) {
-                temp = (reg/2) & 0x03ff;
-                temp <<= 17;
-                temp |= EFUSE_READ;
-                RTL_W32(tp, EFUSEAR, temp);
-
-                cnt = 0;
-                do {
-                        udelay(100);
-                        temp = RTL_R32(tp, EFUSEAR);
-                        cnt++;
-                } while (!(temp & EFUSE_READ_OK) && (cnt < EFUSE_Check_Cnt));
-
-                if (cnt == EFUSE_Check_Cnt) {
-                        efuse_data = EFUSE_READ_FAIL;
-                } else {
-                        temp = RTL_R32(tp, EFUSEAR);
-                        temp = rtl8168_decode_efuse_cmd(tp, temp);
-
-                        if (reg%2) {
-                                temp >>= 8;
-                                efuse_data = (u8)temp;
-                        } else {
-                                efuse_data = (u8)temp;
-                        }
-                }
-        } else  if (tp->efuse_ver == EFUSE_SUPPORT_V3) {
-                temp = (reg/2) & 0x03ff;
-                temp <<= 16;
-                temp |= EFUSE_READ_V3;
-                RTL_W32(tp, EFUSEAR, temp);
-
-                cnt = 0;
-                do {
-                        udelay(100);
-                        temp = RTL_R32(tp, EFUSEAR);
-                        cnt++;
-                } while ((temp & BIT_31) && (cnt < EFUSE_Check_Cnt));
-
-                if (cnt == EFUSE_Check_Cnt) {
-                        efuse_data = EFUSE_READ_FAIL;
-                } else {
-                        temp = RTL_R32(tp, EFUSEAR);
-                        temp = rtl8168_decode_efuse_cmd(tp, temp);
-
-                        if (reg%2) {
-                                temp >>= 8;
-                                efuse_data = (u8)temp;
-                        } else {
-                                efuse_data = (u8)temp;
-                        }
-                }
-        }
-
-        udelay(20);
-
-        return efuse_data;
-}
-
-static void
-rtl8168_tally_counter_addr_fill(struct rtl8168_private *tp)
-{
-        if (!tp->tally_paddr)
-                return;
-
-        RTL_W32(tp, CounterAddrHigh, (u64)tp->tally_paddr >> 32);
-        RTL_W32(tp, CounterAddrLow, (u64)tp->tally_paddr & (DMA_BIT_MASK(32)));
-}
-
-static void
-rtl8168_tally_counter_clear(struct rtl8168_private *tp)
-{
-        if (tp->mcfg == CFG_METHOD_1 || tp->mcfg == CFG_METHOD_2 ||
-            tp->mcfg == CFG_METHOD_3 )
-                return;
-
-        if (!tp->tally_paddr)
-                return;
-
-        RTL_W32(tp, CounterAddrHigh, (u64)tp->tally_paddr >> 32);
-        RTL_W32(tp, CounterAddrLow, ((u64)tp->tally_paddr & (DMA_BIT_MASK(32))) | CounterReset);
-}
-
-static
-u16
-rtl8168_get_phy_state(struct rtl8168_private *tp)
-{
-        u16 PhyState = 0xFF;
-
-        if (HW_SUPPORT_UPS_MODE(tp) == FALSE) goto exit;
-
-        switch (tp->HwSuppUpsVer) {
-        case 1:
-                PhyState = rtl8168_mdio_read_phy_ocp(tp, 0x0A42, 0x10);
-                PhyState &= 0x7;  //bit[2:0]
-                break;
-        }
-
-exit:
-        return PhyState;
-}
-
-static
-bool
-rtl8168_wait_phy_state_ready(struct rtl8168_private *tp,
-                             u16 PhyState,
-                             u32 MicroSecondTimeout
-                            )
-{
-        u16 TmpPhyState;
-        u32 WaitCount;
-        u32 i = 0;
-        bool PhyStateReady = TRUE;
-
-        if (HW_SUPPORT_UPS_MODE(tp) == FALSE) goto exit;
-
-        WaitCount = MicroSecondTimeout / 1000;
-        if (WaitCount == 0) WaitCount = 100;
-
-        do {
-                TmpPhyState = rtl8168_get_phy_state(tp);
-                mdelay(1);
-                i++;
-        } while ((i < WaitCount) && (TmpPhyState != PhyState));
-
-        PhyStateReady = (i == WaitCount && TmpPhyState != PhyState) ? FALSE : TRUE;
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-        WARN_ON_ONCE(i == WaitCount);
-#endif
-
-exit:
-        return PhyStateReady;
-}
-
-static
-bool
-rtl8168_test_phy_ocp_v2(struct rtl8168_private *tp)
-{
-        bool RestorePhyOcpReg = FALSE;
-
-        u16 PhyRegValue;
-        u8 ResetPhyType = 0;
-
-        if (HW_PHY_STATUS_INI == rtl8168_get_phy_state(tp)) {
-                ResetPhyType = 1;
-        } else {
-                rtl8168_mdio_write(tp, 0x1F, 0x0C40);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x12);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                if ((PhyRegValue & 0x03) != 0x00) {
-                        ResetPhyType = 2;
-                }
-        }
-
-        if (ResetPhyType == 0) goto exit;
-
-        netif_err(tp, drv, tp->dev, "test_phy_ocp ResetPhyType = 0x%02x\n.\n",
-                  ResetPhyType);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0C41);
-        rtl8168_set_eth_phy_bit(tp, 0x14, BIT_0);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        mdelay(24); //24ms
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0C40);
-        PhyRegValue = rtl8168_mdio_read(tp, 0x12);
-        if ((PhyRegValue & 0x03) != 0x00) {
-                u32 WaitCnt = 0;
-                while ((PhyRegValue & 0x03) != 0x00 && WaitCnt < 5) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0C40);
-                        rtl8168_set_eth_phy_bit(tp, 0x11, (BIT_15 | BIT_14));
-                        rtl8168_clear_eth_phy_bit(tp, 0x11, (BIT_15 | BIT_14));
-                        mdelay(100);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0C40);
-                        PhyRegValue = rtl8168_mdio_read(tp, 0x12);
-                        WaitCnt++;
-                }
-        }
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A46);
-        rtl8168_mdio_write(tp, 0x10, tp->BackupPhyFuseDout_15_0);
-        rtl8168_mdio_write(tp, 0x12, tp->BackupPhyFuseDout_47_32);
-        rtl8168_mdio_write(tp, 0x13, tp->BackupPhyFuseDout_63_48);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        rtl8168_wait_phy_state_ready(tp, HW_PHY_STATUS_INI, 5000000);
-        rtl8168_mdio_write(tp, 0x1F, 0x0A46);
-        rtl8168_set_eth_phy_bit(tp, 0x14, BIT_0);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        rtl8168_wait_phy_state_ready(tp, HW_PHY_STATUS_LAN_ON, 500000);
-
-        tp->HwHasWrRamCodeToMicroP = FALSE;
-
-        RestorePhyOcpReg = TRUE;
-
-exit:
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        return RestorePhyOcpReg;
-}
-
-static
-bool
-rtl8168_test_phy_ocp_v3(struct rtl8168_private *tp)
-{
-        bool RestorePhyOcpReg = FALSE;
-
-        u16 PhyRegValue;
-        u8 ResetPhyType = 0;
-        u8 watch_dog = 0;
-        u8 uc_response;
-        u8 nctl_pc_range_fail;
-        u8 nctl_pc_stuck_fail;
-
-        if (FALSE == HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) goto exit;
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0B82);
-        uc_response = !!(rtl8168_mdio_read(tp, 0x10) & BIT_5);
-        rtl8168_mdio_write(tp, 0x1F, 0x0B84);
-        nctl_pc_range_fail = !!(rtl8168_mdio_read(tp, 0x11) & BIT_1);
-        nctl_pc_stuck_fail = !!(rtl8168_mdio_read(tp, 0x11) & BIT_2);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        if (uc_response || nctl_pc_range_fail || nctl_pc_stuck_fail) {
-                ResetPhyType = 3;
-        } else {
-                rtl8168_mdio_write(tp, 0x1F, 0x0C40);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x12);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                if ((PhyRegValue & 0x03) != 0x00) {
-                        watch_dog = (u8)(PhyRegValue & 0x03);
-                        ResetPhyType = 2;
-                }
-        }
-
-        if (ResetPhyType == 0) goto exit;
-
-        netif_err(tp, drv, tp->dev, "test_phy_ocp ResetPhyType = 0x%02x\n.\n",
-                  ResetPhyType);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0C41);
-        rtl8168_set_eth_phy_bit(tp, 0x14, BIT_0);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        mdelay(24000); //24ms
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0C40);
-        PhyRegValue = rtl8168_mdio_read(tp, 0x12);
-        if ((PhyRegValue & 0x03) != 0x00) {
-                u32 WaitCnt = 0;
-                while ((PhyRegValue & 0x03) != 0x00 && WaitCnt < 5) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0C40);
-                        rtl8168_set_eth_phy_bit(tp, 0x11, (BIT_15 | BIT_14));
-                        rtl8168_clear_eth_phy_bit(tp, 0x11, (BIT_15 | BIT_14));
-                        mdelay(100000);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0C40);
-                        PhyRegValue = rtl8168_mdio_read(tp, 0x12);
-                        WaitCnt++;
-                }
-        }
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        //issue9
-        rtl8168_mdio_write(tp, 0x1F, 0x0A46);
-        rtl8168_mdio_write(tp, 0x10, tp->BackupPhyFuseDout_15_0);
-        rtl8168_mdio_write(tp, 0x11, tp->BackupPhyFuseDout_31_16);
-        rtl8168_mdio_write(tp, 0x12, tp->BackupPhyFuseDout_47_32);
-        rtl8168_mdio_write(tp, 0x13, tp->BackupPhyFuseDout_63_48);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        rtl8168_wait_phy_state_ready(tp, HW_PHY_STATUS_INI, 5000000);
-        rtl8168_mdio_write(tp, 0x1F, 0x0A46);
-        rtl8168_set_eth_phy_bit(tp, 0x14, BIT_0);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        rtl8168_wait_phy_state_ready(tp, HW_PHY_STATUS_LAN_ON, 500000);
-
-        //record fail case
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x801C);
-        PhyRegValue = 0;
-        PhyRegValue = watch_dog & 0x03;
-        PhyRegValue <<= 14;
-        if (uc_response) PhyRegValue |= BIT_13;
-        if (nctl_pc_range_fail) PhyRegValue |= BIT_12;
-        if (nctl_pc_stuck_fail) PhyRegValue |= BIT_11;
-        ClearAndSetEthPhyBit(tp,
-                             0x14,
-                             0xF800,
-                             PhyRegValue);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        tp->HwHasWrRamCodeToMicroP = FALSE;
-
-        RestorePhyOcpReg = TRUE;
-
-exit:
-        //set uc_response to 1 and gphy should auto clear it.
-        rtl8168_mdio_write(tp, 0x1F, 0x0B82);
-        rtl8168_set_eth_phy_bit(tp, 0x10, BIT_5);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        return RestorePhyOcpReg;
-}
-
-static
-bool
-rtl8168_test_phy_ocp(struct rtl8168_private *tp)
-{
-        bool RestorePhyOcpReg = FALSE;
-
-        if (tp->TestPhyOcpReg == FALSE) goto exit;
-
-        switch (tp->HwSuppEsdVer) {
-        case 2:
-                RestorePhyOcpReg = rtl8168_test_phy_ocp_v2(tp);
-                break;
-        case 3:
-                RestorePhyOcpReg = rtl8168_test_phy_ocp_v3(tp);
-                break;
-        default:
-                break;
-        }
-
-exit:
-        return RestorePhyOcpReg;
-}
-
-static int
-rtl8168_is_ups_resume(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        return (rtl8168_mac_ocp_read(tp, 0xD408) & BIT_0);
-}
-
-static void
-rtl8168_clear_ups_resume_bit(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        rtl8168_mac_ocp_write(tp, 0xD408, rtl8168_mac_ocp_read(tp, 0xD408) & ~(BIT_0));
-}
-
-static void
-rtl8168_wait_phy_ups_resume(struct net_device *dev, u16 PhyState)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 TmpPhyState;
-        int i = 0;
-
-        do {
-                TmpPhyState = rtl8168_mdio_read_phy_ocp(tp, 0x0A42, 0x10);
-                TmpPhyState &= 0x7;
-                mdelay(1);
-                i++;
-        } while ((i < 100) && (TmpPhyState != PhyState));
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
-        WARN_ON_ONCE(i == 100);
-#endif
-}
-
-void
-rtl8168_enable_now_is_oob(struct rtl8168_private *tp)
-{
-        if ( tp->HwSuppNowIsOobVer == 1 ) {
-                RTL_W8(tp, MCUCmd_reg, RTL_R8(tp, MCUCmd_reg) | Now_is_oob);
-        }
-}
-
-void
-rtl8168_disable_now_is_oob(struct rtl8168_private *tp)
-{
-        if ( tp->HwSuppNowIsOobVer == 1 ) {
-                RTL_W8(tp, MCUCmd_reg, RTL_R8(tp, MCUCmd_reg) & ~Now_is_oob);
-        }
-}
-
-static void
-rtl8168_switch_to_sgmii_mode(
-        struct rtl8168_private *tp
-)
-{
-        if (FALSE == HW_SUPP_SERDES_PHY(tp)) return;
-
-        switch (tp->HwSuppSerDesPhyVer) {
-        case 1:
-                rtl8168_mac_ocp_write(tp, 0xEB00, 0x2);
-                rtl8168_set_mcu_ocp_bit(tp, 0xEB16, BIT_1);
-                break;
-        }
-}
-
-static void
-rtl8168_exit_oob(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 data16;
-
-        RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) & ~(AcceptErr | AcceptRunt | AcceptBroadcast | AcceptMulticast | AcceptMyPhys |  AcceptAllPhys));
-
-        if (HW_SUPP_SERDES_PHY(tp)) {
-                if (tp->HwSuppSerDesPhyVer == 1) {
-                        rtl8168_switch_to_sgmii_mode(tp);
-                }
-        }
-
-        if (HW_DASH_SUPPORT_DASH(tp)) {
-                rtl8168_driver_start(tp);
-                rtl8168_dash2_disable_txrx(dev);
-#ifdef ENABLE_DASH_SUPPORT
-                DashHwInit(dev);
-#endif
-        }
-
-        //Disable realwow  function
-        switch (tp->mcfg) {
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-                RTL_W32(tp, MACOCP, 0xE5A90000);
-                RTL_W32(tp, MACOCP, 0xF2100010);
-                break;
-        case CFG_METHOD_20:
-                RTL_W32(tp, MACOCP, 0xE5A90000);
-                RTL_W32(tp, MACOCP, 0xE4640000);
-                RTL_W32(tp, MACOCP, 0xF2100010);
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-                RTL_W32(tp, MACOCP, 0x605E0000);
-                RTL_W32(tp, MACOCP, (0xE05E << 16) | (RTL_R32(tp, MACOCP) & 0xFFFE));
-                RTL_W32(tp, MACOCP, 0xE9720000);
-                RTL_W32(tp, MACOCP, 0xF2140010);
-                break;
-        case CFG_METHOD_26:
-                RTL_W32(tp, MACOCP, 0xE05E00FF);
-                RTL_W32(tp, MACOCP, 0xE9720000);
-                rtl8168_mac_ocp_write(tp, 0xE428, 0x0010);
-                break;
-        }
-
-#ifdef ENABLE_REALWOW_SUPPORT
-        rtl8168_realwow_hw_init(dev);
-#else
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-                rtl8168_eri_write(tp, 0x174, 2, 0x0000, ERIAR_ExGMAC);
-                rtl8168_mac_ocp_write(tp, 0xE428, 0x0010);
-                break;
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_28:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                rtl8168_eri_write(tp, 0x174, 2, 0x00FF, ERIAR_ExGMAC);
-                rtl8168_mac_ocp_write(tp, 0xE428, 0x0010);
-                break;
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_35:	{
-                u32 csi_tmp;
-                csi_tmp = rtl8168_eri_read(tp, 0x174, 2, ERIAR_ExGMAC);
-                csi_tmp &= ~(BIT_8);
-                csi_tmp |= (BIT_15);
-                rtl8168_eri_write(tp, 0x174, 2, csi_tmp, ERIAR_ExGMAC);
-                rtl8168_mac_ocp_write(tp, 0xE428, 0x0010);
-        }
-        break;
-        }
-#endif //ENABLE_REALWOW_SUPPORT
-
-        rtl8168_nic_reset(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_20:
-                rtl8168_wait_ll_share_fifo_ready(dev);
-
-                data16 = rtl8168_mac_ocp_read(tp, 0xD4DE) | BIT_15;
-                rtl8168_mac_ocp_write(tp, 0xD4DE, data16);
-
-                rtl8168_wait_ll_share_fifo_ready(dev);
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_disable_now_is_oob(tp);
-
-                data16 = rtl8168_mac_ocp_read(tp, 0xE8DE) & ~BIT_14;
-                rtl8168_mac_ocp_write(tp, 0xE8DE, data16);
-                rtl8168_wait_ll_share_fifo_ready(dev);
-
-                data16 = rtl8168_mac_ocp_read(tp, 0xE8DE) | BIT_15;
-                rtl8168_mac_ocp_write(tp, 0xE8DE, data16);
-
-                rtl8168_wait_ll_share_fifo_ready(dev);
-                break;
-        }
-
-        //wait ups resume (phy state 2)
-        if (HW_SUPPORT_UPS_MODE(tp))
-                if (rtl8168_is_ups_resume(dev)) {
-                        rtl8168_wait_phy_ups_resume(dev, HW_PHY_STATUS_EXT_INI);
-                        rtl8168_clear_ups_resume_bit(dev);
-                }
-
-#ifdef ENABLE_FIBER_SUPPORT
-        if (HW_FIBER_MODE_ENABLED(tp))
-                rtl8168_hw_init_fiber_nic(tp);
-#endif //ENABLE_FIBER_SUPPORT
-}
-
-void
-rtl8168_hw_disable_mac_mcu_bps(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (tp->HwSuppAspmClkIntrLock) {
-                rtl8168_enable_cfg9346_write(tp);
-                rtl8168_hw_aspm_clkreq_enable(tp, false);
-                rtl8168_disable_cfg9346_write(tp);
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_mac_ocp_write(tp, 0xFC38, 0x0000);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_mac_ocp_write(tp, 0xFC28, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC2A, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC2C, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC2E, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC30, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC32, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC34, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC36, 0x0000);
-                mdelay(3);
-                rtl8168_mac_ocp_write(tp, 0xFC26, 0x0000);
-                break;
-        }
-}
-
-#ifndef ENABLE_USE_FIRMWARE_FILE
-static void
-rtl8168_set_mac_mcu_8168g_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        rtl8168_mac_ocp_write(tp, 0xE43C, 0x0000);
-        rtl8168_mac_ocp_write(tp, 0xE43E, 0x0000);
-
-        rtl8168_mac_ocp_write(tp, 0xE434, 0x0004);
-        rtl8168_mac_ocp_write(tp, 0xE43C, 0x0004);
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        rtl8168_mac_ocp_write( tp, 0xF800, 0xE008 );
-        rtl8168_mac_ocp_write( tp, 0xF802, 0xE01B );
-        rtl8168_mac_ocp_write( tp, 0xF804, 0xE022 );
-        rtl8168_mac_ocp_write( tp, 0xF806, 0xE094 );
-        rtl8168_mac_ocp_write( tp, 0xF808, 0xE097 );
-        rtl8168_mac_ocp_write( tp, 0xF80A, 0xE09A );
-        rtl8168_mac_ocp_write( tp, 0xF80C, 0xE0B3 );
-        rtl8168_mac_ocp_write( tp, 0xF80E, 0xE0BA );
-        rtl8168_mac_ocp_write( tp, 0xF810, 0x49D2 );
-        rtl8168_mac_ocp_write( tp, 0xF812, 0xF10D );
-        rtl8168_mac_ocp_write( tp, 0xF814, 0x766C );
-        rtl8168_mac_ocp_write( tp, 0xF816, 0x49E2 );
-        rtl8168_mac_ocp_write( tp, 0xF818, 0xF00A );
-        rtl8168_mac_ocp_write( tp, 0xF81A, 0x1EC0 );
-        rtl8168_mac_ocp_write( tp, 0xF81C, 0x8EE1 );
-        rtl8168_mac_ocp_write( tp, 0xF81E, 0xC60A );
-        rtl8168_mac_ocp_write( tp, 0xF820, 0x77C0 );
-        rtl8168_mac_ocp_write( tp, 0xF822, 0x4870 );
-        rtl8168_mac_ocp_write( tp, 0xF824, 0x9FC0 );
-        rtl8168_mac_ocp_write( tp, 0xF826, 0x1EA0 );
-        rtl8168_mac_ocp_write( tp, 0xF828, 0xC707 );
-        rtl8168_mac_ocp_write( tp, 0xF82A, 0x8EE1 );
-        rtl8168_mac_ocp_write( tp, 0xF82C, 0x9D6C );
-        rtl8168_mac_ocp_write( tp, 0xF82E, 0xC603 );
-        rtl8168_mac_ocp_write( tp, 0xF830, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF832, 0xB416 );
-        rtl8168_mac_ocp_write( tp, 0xF834, 0x0076 );
-        rtl8168_mac_ocp_write( tp, 0xF836, 0xE86C );
-        rtl8168_mac_ocp_write( tp, 0xF838, 0xC406 );
-        rtl8168_mac_ocp_write( tp, 0xF83A, 0x7580 );
-        rtl8168_mac_ocp_write( tp, 0xF83C, 0x4852 );
-        rtl8168_mac_ocp_write( tp, 0xF83E, 0x8D80 );
-        rtl8168_mac_ocp_write( tp, 0xF840, 0xC403 );
-        rtl8168_mac_ocp_write( tp, 0xF842, 0xBC00 );
-        rtl8168_mac_ocp_write( tp, 0xF844, 0xD3E0 );
-        rtl8168_mac_ocp_write( tp, 0xF846, 0x02C8 );
-        rtl8168_mac_ocp_write( tp, 0xF848, 0x8918 );
-        rtl8168_mac_ocp_write( tp, 0xF84A, 0xE815 );
-        rtl8168_mac_ocp_write( tp, 0xF84C, 0x1100 );
-        rtl8168_mac_ocp_write( tp, 0xF84E, 0xF011 );
-        rtl8168_mac_ocp_write( tp, 0xF850, 0xE812 );
-        rtl8168_mac_ocp_write( tp, 0xF852, 0x4990 );
-        rtl8168_mac_ocp_write( tp, 0xF854, 0xF002 );
-        rtl8168_mac_ocp_write( tp, 0xF856, 0xE817 );
-        rtl8168_mac_ocp_write( tp, 0xF858, 0xE80E );
-        rtl8168_mac_ocp_write( tp, 0xF85A, 0x4992 );
-        rtl8168_mac_ocp_write( tp, 0xF85C, 0xF002 );
-        rtl8168_mac_ocp_write( tp, 0xF85E, 0xE80E );
-        rtl8168_mac_ocp_write( tp, 0xF860, 0xE80A );
-        rtl8168_mac_ocp_write( tp, 0xF862, 0x4993 );
-        rtl8168_mac_ocp_write( tp, 0xF864, 0xF002 );
-        rtl8168_mac_ocp_write( tp, 0xF866, 0xE818 );
-        rtl8168_mac_ocp_write( tp, 0xF868, 0xE806 );
-        rtl8168_mac_ocp_write( tp, 0xF86A, 0x4991 );
-        rtl8168_mac_ocp_write( tp, 0xF86C, 0xF002 );
-        rtl8168_mac_ocp_write( tp, 0xF86E, 0xE838 );
-        rtl8168_mac_ocp_write( tp, 0xF870, 0xC25E );
-        rtl8168_mac_ocp_write( tp, 0xF872, 0xBA00 );
-        rtl8168_mac_ocp_write( tp, 0xF874, 0xC056 );
-        rtl8168_mac_ocp_write( tp, 0xF876, 0x7100 );
-        rtl8168_mac_ocp_write( tp, 0xF878, 0xFF80 );
-        rtl8168_mac_ocp_write( tp, 0xF87A, 0x7100 );
-        rtl8168_mac_ocp_write( tp, 0xF87C, 0x4892 );
-        rtl8168_mac_ocp_write( tp, 0xF87E, 0x4813 );
-        rtl8168_mac_ocp_write( tp, 0xF880, 0x8900 );
-        rtl8168_mac_ocp_write( tp, 0xF882, 0xE00A );
-        rtl8168_mac_ocp_write( tp, 0xF884, 0x7100 );
-        rtl8168_mac_ocp_write( tp, 0xF886, 0x4890 );
-        rtl8168_mac_ocp_write( tp, 0xF888, 0x4813 );
-        rtl8168_mac_ocp_write( tp, 0xF88A, 0x8900 );
-        rtl8168_mac_ocp_write( tp, 0xF88C, 0xC74B );
-        rtl8168_mac_ocp_write( tp, 0xF88E, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF890, 0x48C2 );
-        rtl8168_mac_ocp_write( tp, 0xF892, 0x4841 );
-        rtl8168_mac_ocp_write( tp, 0xF894, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF896, 0xC746 );
-        rtl8168_mac_ocp_write( tp, 0xF898, 0x74FC );
-        rtl8168_mac_ocp_write( tp, 0xF89A, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF89C, 0xF120 );
-        rtl8168_mac_ocp_write( tp, 0xF89E, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xF8A0, 0xF11E );
-        rtl8168_mac_ocp_write( tp, 0xF8A2, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF8A4, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF8A6, 0xF01B );
-        rtl8168_mac_ocp_write( tp, 0xF8A8, 0x49C6 );
-        rtl8168_mac_ocp_write( tp, 0xF8AA, 0xF119 );
-        rtl8168_mac_ocp_write( tp, 0xF8AC, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF8AE, 0x49C4 );
-        rtl8168_mac_ocp_write( tp, 0xF8B0, 0xF013 );
-        rtl8168_mac_ocp_write( tp, 0xF8B2, 0xC536 );
-        rtl8168_mac_ocp_write( tp, 0xF8B4, 0x74B0 );
-        rtl8168_mac_ocp_write( tp, 0xF8B6, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xF8B8, 0xF1FD );
-        rtl8168_mac_ocp_write( tp, 0xF8BA, 0xC537 );
-        rtl8168_mac_ocp_write( tp, 0xF8BC, 0xC434 );
-        rtl8168_mac_ocp_write( tp, 0xF8BE, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xF8C0, 0xC435 );
-        rtl8168_mac_ocp_write( tp, 0xF8C2, 0x1C13 );
-        rtl8168_mac_ocp_write( tp, 0xF8C4, 0x484F );
-        rtl8168_mac_ocp_write( tp, 0xF8C6, 0x9CA2 );
-        rtl8168_mac_ocp_write( tp, 0xF8C8, 0xC52B );
-        rtl8168_mac_ocp_write( tp, 0xF8CA, 0x74B0 );
-        rtl8168_mac_ocp_write( tp, 0xF8CC, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xF8CE, 0xF1FD );
-        rtl8168_mac_ocp_write( tp, 0xF8D0, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF8D2, 0x48C4 );
-        rtl8168_mac_ocp_write( tp, 0xF8D4, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF8D6, 0x7100 );
-        rtl8168_mac_ocp_write( tp, 0xF8D8, 0x4893 );
-        rtl8168_mac_ocp_write( tp, 0xF8DA, 0x8900 );
-        rtl8168_mac_ocp_write( tp, 0xF8DC, 0xFF80 );
-        rtl8168_mac_ocp_write( tp, 0xF8DE, 0xC520 );
-        rtl8168_mac_ocp_write( tp, 0xF8E0, 0x74B0 );
-        rtl8168_mac_ocp_write( tp, 0xF8E2, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xF8E4, 0xF11C );
-        rtl8168_mac_ocp_write( tp, 0xF8E6, 0xC71E );
-        rtl8168_mac_ocp_write( tp, 0xF8E8, 0x74FC );
-        rtl8168_mac_ocp_write( tp, 0xF8EA, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xF8EC, 0xF118 );
-        rtl8168_mac_ocp_write( tp, 0xF8EE, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF8F0, 0xF116 );
-        rtl8168_mac_ocp_write( tp, 0xF8F2, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF8F4, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF8F6, 0xF013 );
-        rtl8168_mac_ocp_write( tp, 0xF8F8, 0x48C3 );
-        rtl8168_mac_ocp_write( tp, 0xF8FA, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF8FC, 0xC516 );
-        rtl8168_mac_ocp_write( tp, 0xF8FE, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xF900, 0x49CE );
-        rtl8168_mac_ocp_write( tp, 0xF902, 0xF1FE );
-        rtl8168_mac_ocp_write( tp, 0xF904, 0xC411 );
-        rtl8168_mac_ocp_write( tp, 0xF906, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xF908, 0xC411 );
-        rtl8168_mac_ocp_write( tp, 0xF90A, 0x1C13 );
-        rtl8168_mac_ocp_write( tp, 0xF90C, 0x484F );
-        rtl8168_mac_ocp_write( tp, 0xF90E, 0x9CA2 );
-        rtl8168_mac_ocp_write( tp, 0xF910, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xF912, 0x49CF );
-        rtl8168_mac_ocp_write( tp, 0xF914, 0xF1FE );
-        rtl8168_mac_ocp_write( tp, 0xF916, 0x7100 );
-        rtl8168_mac_ocp_write( tp, 0xF918, 0x4891 );
-        rtl8168_mac_ocp_write( tp, 0xF91A, 0x8900 );
-        rtl8168_mac_ocp_write( tp, 0xF91C, 0xFF80 );
-        rtl8168_mac_ocp_write( tp, 0xF91E, 0xE400 );
-        rtl8168_mac_ocp_write( tp, 0xF920, 0xD3E0 );
-        rtl8168_mac_ocp_write( tp, 0xF922, 0xE000 );
-        rtl8168_mac_ocp_write( tp, 0xF924, 0x0481 );
-        rtl8168_mac_ocp_write( tp, 0xF926, 0x0C81 );
-        rtl8168_mac_ocp_write( tp, 0xF928, 0xDE20 );
-        rtl8168_mac_ocp_write( tp, 0xF92A, 0x0000 );
-        rtl8168_mac_ocp_write( tp, 0xF92C, 0x0992 );
-        rtl8168_mac_ocp_write( tp, 0xF92E, 0x1B76 );
-        rtl8168_mac_ocp_write( tp, 0xF930, 0xC602 );
-        rtl8168_mac_ocp_write( tp, 0xF932, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF934, 0x059C );
-        rtl8168_mac_ocp_write( tp, 0xF936, 0x1B76 );
-        rtl8168_mac_ocp_write( tp, 0xF938, 0xC602 );
-        rtl8168_mac_ocp_write( tp, 0xF93A, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF93C, 0x065A );
-        rtl8168_mac_ocp_write( tp, 0xF93E, 0xB400 );
-        rtl8168_mac_ocp_write( tp, 0xF940, 0x18DE );
-        rtl8168_mac_ocp_write( tp, 0xF942, 0x2008 );
-        rtl8168_mac_ocp_write( tp, 0xF944, 0x4001 );
-        rtl8168_mac_ocp_write( tp, 0xF946, 0xF10F );
-        rtl8168_mac_ocp_write( tp, 0xF948, 0x7342 );
-        rtl8168_mac_ocp_write( tp, 0xF94A, 0x1880 );
-        rtl8168_mac_ocp_write( tp, 0xF94C, 0x2008 );
-        rtl8168_mac_ocp_write( tp, 0xF94E, 0x0009 );
-        rtl8168_mac_ocp_write( tp, 0xF950, 0x4018 );
-        rtl8168_mac_ocp_write( tp, 0xF952, 0xF109 );
-        rtl8168_mac_ocp_write( tp, 0xF954, 0x7340 );
-        rtl8168_mac_ocp_write( tp, 0xF956, 0x25BC );
-        rtl8168_mac_ocp_write( tp, 0xF958, 0x130F );
-        rtl8168_mac_ocp_write( tp, 0xF95A, 0xF105 );
-        rtl8168_mac_ocp_write( tp, 0xF95C, 0xC00A );
-        rtl8168_mac_ocp_write( tp, 0xF95E, 0x7300 );
-        rtl8168_mac_ocp_write( tp, 0xF960, 0x4831 );
-        rtl8168_mac_ocp_write( tp, 0xF962, 0x9B00 );
-        rtl8168_mac_ocp_write( tp, 0xF964, 0xB000 );
-        rtl8168_mac_ocp_write( tp, 0xF966, 0x7340 );
-        rtl8168_mac_ocp_write( tp, 0xF968, 0x8320 );
-        rtl8168_mac_ocp_write( tp, 0xF96A, 0xC302 );
-        rtl8168_mac_ocp_write( tp, 0xF96C, 0xBB00 );
-        rtl8168_mac_ocp_write( tp, 0xF96E, 0x0C12 );
-        rtl8168_mac_ocp_write( tp, 0xF970, 0xE860 );
-        rtl8168_mac_ocp_write( tp, 0xF972, 0xC406 );
-        rtl8168_mac_ocp_write( tp, 0xF974, 0x7580 );
-        rtl8168_mac_ocp_write( tp, 0xF976, 0x4851 );
-        rtl8168_mac_ocp_write( tp, 0xF978, 0x8D80 );
-        rtl8168_mac_ocp_write( tp, 0xF97A, 0xC403 );
-        rtl8168_mac_ocp_write( tp, 0xF97C, 0xBC00 );
-        rtl8168_mac_ocp_write( tp, 0xF97E, 0xD3E0 );
-        rtl8168_mac_ocp_write( tp, 0xF980, 0x02C8 );
-        rtl8168_mac_ocp_write( tp, 0xF982, 0xC406 );
-        rtl8168_mac_ocp_write( tp, 0xF984, 0x7580 );
-        rtl8168_mac_ocp_write( tp, 0xF986, 0x4850 );
-        rtl8168_mac_ocp_write( tp, 0xF988, 0x8D80 );
-        rtl8168_mac_ocp_write( tp, 0xF98A, 0xC403 );
-        rtl8168_mac_ocp_write( tp, 0xF98C, 0xBC00 );
-        rtl8168_mac_ocp_write( tp, 0xF98E, 0xD3E0 );
-        rtl8168_mac_ocp_write( tp, 0xF990, 0x0298 );
-
-        rtl8168_mac_ocp_write( tp, 0xDE30, 0x0080 );
-
-        rtl8168_mac_ocp_write( tp, 0xFC26, 0x8000 );
-
-        rtl8168_mac_ocp_write( tp, 0xFC28, 0x0075 );
-        rtl8168_mac_ocp_write( tp, 0xFC2A, 0x02B1 );
-        rtl8168_mac_ocp_write( tp, 0xFC2C, 0x0991 );
-        rtl8168_mac_ocp_write( tp, 0xFC2E, 0x059B );
-        rtl8168_mac_ocp_write( tp, 0xFC30, 0x0659 );
-        rtl8168_mac_ocp_write( tp, 0xFC32, 0x0000 );
-        rtl8168_mac_ocp_write( tp, 0xFC34, 0x02C7 );
-        rtl8168_mac_ocp_write( tp, 0xFC36, 0x0279 );
-}
-
-static void
-rtl8168_set_mac_mcu_8168gu_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        rtl8168_mac_ocp_write( tp, 0xF800, 0xE008 );
-        rtl8168_mac_ocp_write( tp, 0xF802, 0xE011 );
-        rtl8168_mac_ocp_write( tp, 0xF804, 0xE015 );
-        rtl8168_mac_ocp_write( tp, 0xF806, 0xE018 );
-        rtl8168_mac_ocp_write( tp, 0xF808, 0xE01B );
-        rtl8168_mac_ocp_write( tp, 0xF80A, 0xE027 );
-        rtl8168_mac_ocp_write( tp, 0xF80C, 0xE043 );
-        rtl8168_mac_ocp_write( tp, 0xF80E, 0xE065 );
-        rtl8168_mac_ocp_write( tp, 0xF810, 0x49E2 );
-        rtl8168_mac_ocp_write( tp, 0xF812, 0xF005 );
-        rtl8168_mac_ocp_write( tp, 0xF814, 0x49EA );
-        rtl8168_mac_ocp_write( tp, 0xF816, 0xF003 );
-        rtl8168_mac_ocp_write( tp, 0xF818, 0xC404 );
-        rtl8168_mac_ocp_write( tp, 0xF81A, 0xBC00 );
-        rtl8168_mac_ocp_write( tp, 0xF81C, 0xC403 );
-        rtl8168_mac_ocp_write( tp, 0xF81E, 0xBC00 );
-        rtl8168_mac_ocp_write( tp, 0xF820, 0x0496 );
-        rtl8168_mac_ocp_write( tp, 0xF822, 0x051A );
-        rtl8168_mac_ocp_write( tp, 0xF824, 0x1D01 );
-        rtl8168_mac_ocp_write( tp, 0xF826, 0x8DE8 );
-        rtl8168_mac_ocp_write( tp, 0xF828, 0xC602 );
-        rtl8168_mac_ocp_write( tp, 0xF82A, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF82C, 0x0206 );
-        rtl8168_mac_ocp_write( tp, 0xF82E, 0x1B76 );
-        rtl8168_mac_ocp_write( tp, 0xF830, 0xC202 );
-        rtl8168_mac_ocp_write( tp, 0xF832, 0xBA00 );
-        rtl8168_mac_ocp_write( tp, 0xF834, 0x058A );
-        rtl8168_mac_ocp_write( tp, 0xF836, 0x1B76 );
-        rtl8168_mac_ocp_write( tp, 0xF838, 0xC602 );
-        rtl8168_mac_ocp_write( tp, 0xF83A, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF83C, 0x0648 );
-        rtl8168_mac_ocp_write( tp, 0xF83E, 0x74E6 );
-        rtl8168_mac_ocp_write( tp, 0xF840, 0x1B78 );
-        rtl8168_mac_ocp_write( tp, 0xF842, 0x46DC );
-        rtl8168_mac_ocp_write( tp, 0xF844, 0x1300 );
-        rtl8168_mac_ocp_write( tp, 0xF846, 0xF005 );
-        rtl8168_mac_ocp_write( tp, 0xF848, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF84A, 0x48C3 );
-        rtl8168_mac_ocp_write( tp, 0xF84C, 0x48C4 );
-        rtl8168_mac_ocp_write( tp, 0xF84E, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF850, 0x64E7 );
-        rtl8168_mac_ocp_write( tp, 0xF852, 0xC302 );
-        rtl8168_mac_ocp_write( tp, 0xF854, 0xBB00 );
-        rtl8168_mac_ocp_write( tp, 0xF856, 0x068E );
-        rtl8168_mac_ocp_write( tp, 0xF858, 0x74E4 );
-        rtl8168_mac_ocp_write( tp, 0xF85A, 0x49C5 );
-        rtl8168_mac_ocp_write( tp, 0xF85C, 0xF106 );
-        rtl8168_mac_ocp_write( tp, 0xF85E, 0x49C6 );
-        rtl8168_mac_ocp_write( tp, 0xF860, 0xF107 );
-        rtl8168_mac_ocp_write( tp, 0xF862, 0x48C8 );
-        rtl8168_mac_ocp_write( tp, 0xF864, 0x48C9 );
-        rtl8168_mac_ocp_write( tp, 0xF866, 0xE011 );
-        rtl8168_mac_ocp_write( tp, 0xF868, 0x48C9 );
-        rtl8168_mac_ocp_write( tp, 0xF86A, 0x4848 );
-        rtl8168_mac_ocp_write( tp, 0xF86C, 0xE00E );
-        rtl8168_mac_ocp_write( tp, 0xF86E, 0x4848 );
-        rtl8168_mac_ocp_write( tp, 0xF870, 0x49C7 );
-        rtl8168_mac_ocp_write( tp, 0xF872, 0xF00A );
-        rtl8168_mac_ocp_write( tp, 0xF874, 0x48C9 );
-        rtl8168_mac_ocp_write( tp, 0xF876, 0xC60D );
-        rtl8168_mac_ocp_write( tp, 0xF878, 0x1D1F );
-        rtl8168_mac_ocp_write( tp, 0xF87A, 0x8DC2 );
-        rtl8168_mac_ocp_write( tp, 0xF87C, 0x1D00 );
-        rtl8168_mac_ocp_write( tp, 0xF87E, 0x8DC3 );
-        rtl8168_mac_ocp_write( tp, 0xF880, 0x1D11 );
-        rtl8168_mac_ocp_write( tp, 0xF882, 0x8DC0 );
-        rtl8168_mac_ocp_write( tp, 0xF884, 0xE002 );
-        rtl8168_mac_ocp_write( tp, 0xF886, 0x4849 );
-        rtl8168_mac_ocp_write( tp, 0xF888, 0x94E5 );
-        rtl8168_mac_ocp_write( tp, 0xF88A, 0xC602 );
-        rtl8168_mac_ocp_write( tp, 0xF88C, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF88E, 0x0238 );
-        rtl8168_mac_ocp_write( tp, 0xF890, 0xE434 );
-        rtl8168_mac_ocp_write( tp, 0xF892, 0x49D9 );
-        rtl8168_mac_ocp_write( tp, 0xF894, 0xF01B );
-        rtl8168_mac_ocp_write( tp, 0xF896, 0xC31E );
-        rtl8168_mac_ocp_write( tp, 0xF898, 0x7464 );
-        rtl8168_mac_ocp_write( tp, 0xF89A, 0x49C4 );
-        rtl8168_mac_ocp_write( tp, 0xF89C, 0xF114 );
-        rtl8168_mac_ocp_write( tp, 0xF89E, 0xC31B );
-        rtl8168_mac_ocp_write( tp, 0xF8A0, 0x6460 );
-        rtl8168_mac_ocp_write( tp, 0xF8A2, 0x14FA );
-        rtl8168_mac_ocp_write( tp, 0xF8A4, 0xFA02 );
-        rtl8168_mac_ocp_write( tp, 0xF8A6, 0xE00F );
-        rtl8168_mac_ocp_write( tp, 0xF8A8, 0xC317 );
-        rtl8168_mac_ocp_write( tp, 0xF8AA, 0x7460 );
-        rtl8168_mac_ocp_write( tp, 0xF8AC, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF8AE, 0xF10B );
-        rtl8168_mac_ocp_write( tp, 0xF8B0, 0xC311 );
-        rtl8168_mac_ocp_write( tp, 0xF8B2, 0x7462 );
-        rtl8168_mac_ocp_write( tp, 0xF8B4, 0x48C1 );
-        rtl8168_mac_ocp_write( tp, 0xF8B6, 0x9C62 );
-        rtl8168_mac_ocp_write( tp, 0xF8B8, 0x4841 );
-        rtl8168_mac_ocp_write( tp, 0xF8BA, 0x9C62 );
-        rtl8168_mac_ocp_write( tp, 0xF8BC, 0xC30A );
-        rtl8168_mac_ocp_write( tp, 0xF8BE, 0x1C04 );
-        rtl8168_mac_ocp_write( tp, 0xF8C0, 0x8C60 );
-        rtl8168_mac_ocp_write( tp, 0xF8C2, 0xE004 );
-        rtl8168_mac_ocp_write( tp, 0xF8C4, 0x1C15 );
-        rtl8168_mac_ocp_write( tp, 0xF8C6, 0xC305 );
-        rtl8168_mac_ocp_write( tp, 0xF8C8, 0x8C60 );
-        rtl8168_mac_ocp_write( tp, 0xF8CA, 0xC602 );
-        rtl8168_mac_ocp_write( tp, 0xF8CC, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF8CE, 0x0374 );
-        rtl8168_mac_ocp_write( tp, 0xF8D0, 0xE434 );
-        rtl8168_mac_ocp_write( tp, 0xF8D2, 0xE030 );
-        rtl8168_mac_ocp_write( tp, 0xF8D4, 0xE61C );
-        rtl8168_mac_ocp_write( tp, 0xF8D6, 0xE906 );
-        rtl8168_mac_ocp_write( tp, 0xF8D8, 0xC602 );
-        rtl8168_mac_ocp_write( tp, 0xF8DA, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF8DC, 0x0000 );
-
-        rtl8168_mac_ocp_write( tp, 0xFC26, 0x8000 );
-
-        rtl8168_mac_ocp_write( tp, 0xFC28, 0x0493 );
-        rtl8168_mac_ocp_write( tp, 0xFC2A, 0x0205 );
-        rtl8168_mac_ocp_write( tp, 0xFC2C, 0x0589 );
-        rtl8168_mac_ocp_write( tp, 0xFC2E, 0x0647 );
-        rtl8168_mac_ocp_write( tp, 0xFC30, 0x0000 );
-        rtl8168_mac_ocp_write( tp, 0xFC32, 0x0215 );
-        rtl8168_mac_ocp_write( tp, 0xFC34, 0x0285 );
-}
-
-static void
-rtl8168_set_mac_mcu_8168gu_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        rtl8168_mac_ocp_write( tp, 0xF800, 0xE008 );
-        rtl8168_mac_ocp_write( tp, 0xF802, 0xE00A );
-        rtl8168_mac_ocp_write( tp, 0xF804, 0xE00D );
-        rtl8168_mac_ocp_write( tp, 0xF806, 0xE02F );
-        rtl8168_mac_ocp_write( tp, 0xF808, 0xE031 );
-        rtl8168_mac_ocp_write( tp, 0xF80A, 0xE038 );
-        rtl8168_mac_ocp_write( tp, 0xF80C, 0xE03A );
-        rtl8168_mac_ocp_write( tp, 0xF80E, 0xE051 );
-        rtl8168_mac_ocp_write( tp, 0xF810, 0xC202 );
-        rtl8168_mac_ocp_write( tp, 0xF812, 0xBA00 );
-        rtl8168_mac_ocp_write( tp, 0xF814, 0x0DFC );
-        rtl8168_mac_ocp_write( tp, 0xF816, 0x7444 );
-        rtl8168_mac_ocp_write( tp, 0xF818, 0xC502 );
-        rtl8168_mac_ocp_write( tp, 0xF81A, 0xBD00 );
-        rtl8168_mac_ocp_write( tp, 0xF81C, 0x0A30 );
-        rtl8168_mac_ocp_write( tp, 0xF81E, 0x49D9 );
-        rtl8168_mac_ocp_write( tp, 0xF820, 0xF019 );
-        rtl8168_mac_ocp_write( tp, 0xF822, 0xC520 );
-        rtl8168_mac_ocp_write( tp, 0xF824, 0x64A5 );
-        rtl8168_mac_ocp_write( tp, 0xF826, 0x1400 );
-        rtl8168_mac_ocp_write( tp, 0xF828, 0xF007 );
-        rtl8168_mac_ocp_write( tp, 0xF82A, 0x0C01 );
-        rtl8168_mac_ocp_write( tp, 0xF82C, 0x8CA5 );
-        rtl8168_mac_ocp_write( tp, 0xF82E, 0x1C15 );
-        rtl8168_mac_ocp_write( tp, 0xF830, 0xC515 );
-        rtl8168_mac_ocp_write( tp, 0xF832, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xF834, 0xE00F );
-        rtl8168_mac_ocp_write( tp, 0xF836, 0xC513 );
-        rtl8168_mac_ocp_write( tp, 0xF838, 0x74A0 );
-        rtl8168_mac_ocp_write( tp, 0xF83A, 0x48C8 );
-        rtl8168_mac_ocp_write( tp, 0xF83C, 0x48CA );
-        rtl8168_mac_ocp_write( tp, 0xF83E, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xF840, 0xC510 );
-        rtl8168_mac_ocp_write( tp, 0xF842, 0x1B00 );
-        rtl8168_mac_ocp_write( tp, 0xF844, 0x9BA0 );
-        rtl8168_mac_ocp_write( tp, 0xF846, 0x1B1C );
-        rtl8168_mac_ocp_write( tp, 0xF848, 0x483F );
-        rtl8168_mac_ocp_write( tp, 0xF84A, 0x9BA2 );
-        rtl8168_mac_ocp_write( tp, 0xF84C, 0x1B04 );
-        rtl8168_mac_ocp_write( tp, 0xF84E, 0xC506 );
-        rtl8168_mac_ocp_write( tp, 0xF850, 0x9BA0 );
-        rtl8168_mac_ocp_write( tp, 0xF852, 0xC603 );
-        rtl8168_mac_ocp_write( tp, 0xF854, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF856, 0x0298 );
-        rtl8168_mac_ocp_write( tp, 0xF858, 0x03DE );
-        rtl8168_mac_ocp_write( tp, 0xF85A, 0xE434 );
-        rtl8168_mac_ocp_write( tp, 0xF85C, 0xE096 );
-        rtl8168_mac_ocp_write( tp, 0xF85E, 0xE860 );
-        rtl8168_mac_ocp_write( tp, 0xF860, 0xDE20 );
-        rtl8168_mac_ocp_write( tp, 0xF862, 0xD3C0 );
-        rtl8168_mac_ocp_write( tp, 0xF864, 0xC602 );
-        rtl8168_mac_ocp_write( tp, 0xF866, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF868, 0x0A64 );
-        rtl8168_mac_ocp_write( tp, 0xF86A, 0xC707 );
-        rtl8168_mac_ocp_write( tp, 0xF86C, 0x1D00 );
-        rtl8168_mac_ocp_write( tp, 0xF86E, 0x8DE2 );
-        rtl8168_mac_ocp_write( tp, 0xF870, 0x48C1 );
-        rtl8168_mac_ocp_write( tp, 0xF872, 0xC502 );
-        rtl8168_mac_ocp_write( tp, 0xF874, 0xBD00 );
-        rtl8168_mac_ocp_write( tp, 0xF876, 0x00AA );
-        rtl8168_mac_ocp_write( tp, 0xF878, 0xE0C0 );
-        rtl8168_mac_ocp_write( tp, 0xF87A, 0xC502 );
-        rtl8168_mac_ocp_write( tp, 0xF87C, 0xBD00 );
-        rtl8168_mac_ocp_write( tp, 0xF87E, 0x0132 );
-        rtl8168_mac_ocp_write( tp, 0xF880, 0xC50C );
-        rtl8168_mac_ocp_write( tp, 0xF882, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xF884, 0x49CE );
-        rtl8168_mac_ocp_write( tp, 0xF886, 0xF1FE );
-        rtl8168_mac_ocp_write( tp, 0xF888, 0x1C00 );
-        rtl8168_mac_ocp_write( tp, 0xF88A, 0x9EA0 );
-        rtl8168_mac_ocp_write( tp, 0xF88C, 0x1C1C );
-        rtl8168_mac_ocp_write( tp, 0xF88E, 0x484F );
-        rtl8168_mac_ocp_write( tp, 0xF890, 0x9CA2 );
-        rtl8168_mac_ocp_write( tp, 0xF892, 0xC402 );
-        rtl8168_mac_ocp_write( tp, 0xF894, 0xBC00 );
-        rtl8168_mac_ocp_write( tp, 0xF896, 0x0AFA );
-        rtl8168_mac_ocp_write( tp, 0xF898, 0xDE20 );
-        rtl8168_mac_ocp_write( tp, 0xF89A, 0xE000 );
-        rtl8168_mac_ocp_write( tp, 0xF89C, 0xE092 );
-        rtl8168_mac_ocp_write( tp, 0xF89E, 0xE430 );
-        rtl8168_mac_ocp_write( tp, 0xF8A0, 0xDE20 );
-        rtl8168_mac_ocp_write( tp, 0xF8A2, 0xE0C0 );
-        rtl8168_mac_ocp_write( tp, 0xF8A4, 0xE860 );
-        rtl8168_mac_ocp_write( tp, 0xF8A6, 0xE84C );
-        rtl8168_mac_ocp_write( tp, 0xF8A8, 0xB400 );
-        rtl8168_mac_ocp_write( tp, 0xF8AA, 0xB430 );
-        rtl8168_mac_ocp_write( tp, 0xF8AC, 0xE410 );
-        rtl8168_mac_ocp_write( tp, 0xF8AE, 0xC0AE );
-        rtl8168_mac_ocp_write( tp, 0xF8B0, 0xB407 );
-        rtl8168_mac_ocp_write( tp, 0xF8B2, 0xB406 );
-        rtl8168_mac_ocp_write( tp, 0xF8B4, 0xB405 );
-        rtl8168_mac_ocp_write( tp, 0xF8B6, 0xB404 );
-        rtl8168_mac_ocp_write( tp, 0xF8B8, 0xB403 );
-        rtl8168_mac_ocp_write( tp, 0xF8BA, 0xB402 );
-        rtl8168_mac_ocp_write( tp, 0xF8BC, 0xB401 );
-        rtl8168_mac_ocp_write( tp, 0xF8BE, 0xC7EE );
-        rtl8168_mac_ocp_write( tp, 0xF8C0, 0x76F4 );
-        rtl8168_mac_ocp_write( tp, 0xF8C2, 0xC2ED );
-        rtl8168_mac_ocp_write( tp, 0xF8C4, 0xC3ED );
-        rtl8168_mac_ocp_write( tp, 0xF8C6, 0xC1EF );
-        rtl8168_mac_ocp_write( tp, 0xF8C8, 0xC5F3 );
-        rtl8168_mac_ocp_write( tp, 0xF8CA, 0x74A0 );
-        rtl8168_mac_ocp_write( tp, 0xF8CC, 0x49CD );
-        rtl8168_mac_ocp_write( tp, 0xF8CE, 0xF001 );
-        rtl8168_mac_ocp_write( tp, 0xF8D0, 0xC5EE );
-        rtl8168_mac_ocp_write( tp, 0xF8D2, 0x74A0 );
-        rtl8168_mac_ocp_write( tp, 0xF8D4, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xF8D6, 0xF105 );
-        rtl8168_mac_ocp_write( tp, 0xF8D8, 0xC5E4 );
-        rtl8168_mac_ocp_write( tp, 0xF8DA, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xF8DC, 0x49CE );
-        rtl8168_mac_ocp_write( tp, 0xF8DE, 0xF00B );
-        rtl8168_mac_ocp_write( tp, 0xF8E0, 0x7444 );
-        rtl8168_mac_ocp_write( tp, 0xF8E2, 0x484B );
-        rtl8168_mac_ocp_write( tp, 0xF8E4, 0x9C44 );
-        rtl8168_mac_ocp_write( tp, 0xF8E6, 0x1C10 );
-        rtl8168_mac_ocp_write( tp, 0xF8E8, 0x9C62 );
-        rtl8168_mac_ocp_write( tp, 0xF8EA, 0x1C11 );
-        rtl8168_mac_ocp_write( tp, 0xF8EC, 0x8C60 );
-        rtl8168_mac_ocp_write( tp, 0xF8EE, 0x1C00 );
-        rtl8168_mac_ocp_write( tp, 0xF8F0, 0x9CF6 );
-        rtl8168_mac_ocp_write( tp, 0xF8F2, 0xE0EC );
-        rtl8168_mac_ocp_write( tp, 0xF8F4, 0x49E7 );
-        rtl8168_mac_ocp_write( tp, 0xF8F6, 0xF016 );
-        rtl8168_mac_ocp_write( tp, 0xF8F8, 0x1D80 );
-        rtl8168_mac_ocp_write( tp, 0xF8FA, 0x8DF4 );
-        rtl8168_mac_ocp_write( tp, 0xF8FC, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF8FE, 0x4843 );
-        rtl8168_mac_ocp_write( tp, 0xF900, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF902, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF904, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF906, 0x7444 );
-        rtl8168_mac_ocp_write( tp, 0xF908, 0x48C8 );
-        rtl8168_mac_ocp_write( tp, 0xF90A, 0x48C9 );
-        rtl8168_mac_ocp_write( tp, 0xF90C, 0x48CA );
-        rtl8168_mac_ocp_write( tp, 0xF90E, 0x9C44 );
-        rtl8168_mac_ocp_write( tp, 0xF910, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF912, 0x4844 );
-        rtl8168_mac_ocp_write( tp, 0xF914, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF916, 0x1E01 );
-        rtl8168_mac_ocp_write( tp, 0xF918, 0xE8DB );
-        rtl8168_mac_ocp_write( tp, 0xF91A, 0x7420 );
-        rtl8168_mac_ocp_write( tp, 0xF91C, 0x48C1 );
-        rtl8168_mac_ocp_write( tp, 0xF91E, 0x9C20 );
-        rtl8168_mac_ocp_write( tp, 0xF920, 0xE0D5 );
-        rtl8168_mac_ocp_write( tp, 0xF922, 0x49E6 );
-        rtl8168_mac_ocp_write( tp, 0xF924, 0xF02A );
-        rtl8168_mac_ocp_write( tp, 0xF926, 0x1D40 );
-        rtl8168_mac_ocp_write( tp, 0xF928, 0x8DF4 );
-        rtl8168_mac_ocp_write( tp, 0xF92A, 0x74FC );
-        rtl8168_mac_ocp_write( tp, 0xF92C, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF92E, 0xF124 );
-        rtl8168_mac_ocp_write( tp, 0xF930, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xF932, 0xF122 );
-        rtl8168_mac_ocp_write( tp, 0xF934, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF936, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF938, 0xF01F );
-        rtl8168_mac_ocp_write( tp, 0xF93A, 0xE8D3 );
-        rtl8168_mac_ocp_write( tp, 0xF93C, 0x48C4 );
-        rtl8168_mac_ocp_write( tp, 0xF93E, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF940, 0x1E00 );
-        rtl8168_mac_ocp_write( tp, 0xF942, 0xE8C6 );
-        rtl8168_mac_ocp_write( tp, 0xF944, 0xC5B1 );
-        rtl8168_mac_ocp_write( tp, 0xF946, 0x74A0 );
-        rtl8168_mac_ocp_write( tp, 0xF948, 0x49C3 );
-        rtl8168_mac_ocp_write( tp, 0xF94A, 0xF016 );
-        rtl8168_mac_ocp_write( tp, 0xF94C, 0xC5AF );
-        rtl8168_mac_ocp_write( tp, 0xF94E, 0x74A4 );
-        rtl8168_mac_ocp_write( tp, 0xF950, 0x49C2 );
-        rtl8168_mac_ocp_write( tp, 0xF952, 0xF005 );
-        rtl8168_mac_ocp_write( tp, 0xF954, 0xC5AA );
-        rtl8168_mac_ocp_write( tp, 0xF956, 0x74B2 );
-        rtl8168_mac_ocp_write( tp, 0xF958, 0x49C9 );
-        rtl8168_mac_ocp_write( tp, 0xF95A, 0xF10E );
-        rtl8168_mac_ocp_write( tp, 0xF95C, 0xC5A6 );
-        rtl8168_mac_ocp_write( tp, 0xF95E, 0x74A8 );
-        rtl8168_mac_ocp_write( tp, 0xF960, 0x4845 );
-        rtl8168_mac_ocp_write( tp, 0xF962, 0x4846 );
-        rtl8168_mac_ocp_write( tp, 0xF964, 0x4847 );
-        rtl8168_mac_ocp_write( tp, 0xF966, 0x4848 );
-        rtl8168_mac_ocp_write( tp, 0xF968, 0x9CA8 );
-        rtl8168_mac_ocp_write( tp, 0xF96A, 0x74B2 );
-        rtl8168_mac_ocp_write( tp, 0xF96C, 0x4849 );
-        rtl8168_mac_ocp_write( tp, 0xF96E, 0x9CB2 );
-        rtl8168_mac_ocp_write( tp, 0xF970, 0x74A0 );
-        rtl8168_mac_ocp_write( tp, 0xF972, 0x484F );
-        rtl8168_mac_ocp_write( tp, 0xF974, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xF976, 0xE0AA );
-        rtl8168_mac_ocp_write( tp, 0xF978, 0x49E4 );
-        rtl8168_mac_ocp_write( tp, 0xF97A, 0xF018 );
-        rtl8168_mac_ocp_write( tp, 0xF97C, 0x1D10 );
-        rtl8168_mac_ocp_write( tp, 0xF97E, 0x8DF4 );
-        rtl8168_mac_ocp_write( tp, 0xF980, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF982, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF984, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF986, 0x4843 );
-        rtl8168_mac_ocp_write( tp, 0xF988, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF98A, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF98C, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF98E, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF990, 0x4844 );
-        rtl8168_mac_ocp_write( tp, 0xF992, 0x4842 );
-        rtl8168_mac_ocp_write( tp, 0xF994, 0x4841 );
-        rtl8168_mac_ocp_write( tp, 0xF996, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF998, 0x1E01 );
-        rtl8168_mac_ocp_write( tp, 0xF99A, 0xE89A );
-        rtl8168_mac_ocp_write( tp, 0xF99C, 0x7420 );
-        rtl8168_mac_ocp_write( tp, 0xF99E, 0x4841 );
-        rtl8168_mac_ocp_write( tp, 0xF9A0, 0x9C20 );
-        rtl8168_mac_ocp_write( tp, 0xF9A2, 0x7444 );
-        rtl8168_mac_ocp_write( tp, 0xF9A4, 0x4848 );
-        rtl8168_mac_ocp_write( tp, 0xF9A6, 0x9C44 );
-        rtl8168_mac_ocp_write( tp, 0xF9A8, 0xE091 );
-        rtl8168_mac_ocp_write( tp, 0xF9AA, 0x49E5 );
-        rtl8168_mac_ocp_write( tp, 0xF9AC, 0xF03E );
-        rtl8168_mac_ocp_write( tp, 0xF9AE, 0x1D20 );
-        rtl8168_mac_ocp_write( tp, 0xF9B0, 0x8DF4 );
-        rtl8168_mac_ocp_write( tp, 0xF9B2, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF9B4, 0x48C2 );
-        rtl8168_mac_ocp_write( tp, 0xF9B6, 0x4841 );
-        rtl8168_mac_ocp_write( tp, 0xF9B8, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF9BA, 0x1E01 );
-        rtl8168_mac_ocp_write( tp, 0xF9BC, 0x7444 );
-        rtl8168_mac_ocp_write( tp, 0xF9BE, 0x49CA );
-        rtl8168_mac_ocp_write( tp, 0xF9C0, 0xF103 );
-        rtl8168_mac_ocp_write( tp, 0xF9C2, 0x49C2 );
-        rtl8168_mac_ocp_write( tp, 0xF9C4, 0xF00C );
-        rtl8168_mac_ocp_write( tp, 0xF9C6, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xF9C8, 0xF004 );
-        rtl8168_mac_ocp_write( tp, 0xF9CA, 0x6447 );
-        rtl8168_mac_ocp_write( tp, 0xF9CC, 0x2244 );
-        rtl8168_mac_ocp_write( tp, 0xF9CE, 0xE002 );
-        rtl8168_mac_ocp_write( tp, 0xF9D0, 0x1C01 );
-        rtl8168_mac_ocp_write( tp, 0xF9D2, 0x9C62 );
-        rtl8168_mac_ocp_write( tp, 0xF9D4, 0x1C11 );
-        rtl8168_mac_ocp_write( tp, 0xF9D6, 0x8C60 );
-        rtl8168_mac_ocp_write( tp, 0xF9D8, 0x1C00 );
-        rtl8168_mac_ocp_write( tp, 0xF9DA, 0x9CF6 );
-        rtl8168_mac_ocp_write( tp, 0xF9DC, 0x7444 );
-        rtl8168_mac_ocp_write( tp, 0xF9DE, 0x49C8 );
-        rtl8168_mac_ocp_write( tp, 0xF9E0, 0xF01D );
-        rtl8168_mac_ocp_write( tp, 0xF9E2, 0x74FC );
-        rtl8168_mac_ocp_write( tp, 0xF9E4, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF9E6, 0xF11A );
-        rtl8168_mac_ocp_write( tp, 0xF9E8, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xF9EA, 0xF118 );
-        rtl8168_mac_ocp_write( tp, 0xF9EC, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF9EE, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF9F0, 0xF015 );
-        rtl8168_mac_ocp_write( tp, 0xF9F2, 0x49C6 );
-        rtl8168_mac_ocp_write( tp, 0xF9F4, 0xF113 );
-        rtl8168_mac_ocp_write( tp, 0xF9F6, 0xE875 );
-        rtl8168_mac_ocp_write( tp, 0xF9F8, 0x48C4 );
-        rtl8168_mac_ocp_write( tp, 0xF9FA, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF9FC, 0x7420 );
-        rtl8168_mac_ocp_write( tp, 0xF9FE, 0x48C1 );
-        rtl8168_mac_ocp_write( tp, 0xFA00, 0x9C20 );
-        rtl8168_mac_ocp_write( tp, 0xFA02, 0xC50A );
-        rtl8168_mac_ocp_write( tp, 0xFA04, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xFA06, 0x8CA5 );
-        rtl8168_mac_ocp_write( tp, 0xFA08, 0x74A0 );
-        rtl8168_mac_ocp_write( tp, 0xFA0A, 0xC505 );
-        rtl8168_mac_ocp_write( tp, 0xFA0C, 0x9CA2 );
-        rtl8168_mac_ocp_write( tp, 0xFA0E, 0x1C11 );
-        rtl8168_mac_ocp_write( tp, 0xFA10, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xFA12, 0xE00A );
-        rtl8168_mac_ocp_write( tp, 0xFA14, 0xE434 );
-        rtl8168_mac_ocp_write( tp, 0xFA16, 0xD3C0 );
-        rtl8168_mac_ocp_write( tp, 0xFA18, 0xDC00 );
-        rtl8168_mac_ocp_write( tp, 0xFA1A, 0x7444 );
-        rtl8168_mac_ocp_write( tp, 0xFA1C, 0x49CA );
-        rtl8168_mac_ocp_write( tp, 0xFA1E, 0xF004 );
-        rtl8168_mac_ocp_write( tp, 0xFA20, 0x48CA );
-        rtl8168_mac_ocp_write( tp, 0xFA22, 0x9C44 );
-        rtl8168_mac_ocp_write( tp, 0xFA24, 0xE855 );
-        rtl8168_mac_ocp_write( tp, 0xFA26, 0xE052 );
-        rtl8168_mac_ocp_write( tp, 0xFA28, 0x49E8 );
-        rtl8168_mac_ocp_write( tp, 0xFA2A, 0xF024 );
-        rtl8168_mac_ocp_write( tp, 0xFA2C, 0x1D01 );
-        rtl8168_mac_ocp_write( tp, 0xFA2E, 0x8DF5 );
-        rtl8168_mac_ocp_write( tp, 0xFA30, 0x7440 );
-        rtl8168_mac_ocp_write( tp, 0xFA32, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xFA34, 0xF11E );
-        rtl8168_mac_ocp_write( tp, 0xFA36, 0x7444 );
-        rtl8168_mac_ocp_write( tp, 0xFA38, 0x49C8 );
-        rtl8168_mac_ocp_write( tp, 0xFA3A, 0xF01B );
-        rtl8168_mac_ocp_write( tp, 0xFA3C, 0x49CA );
-        rtl8168_mac_ocp_write( tp, 0xFA3E, 0xF119 );
-        rtl8168_mac_ocp_write( tp, 0xFA40, 0xC5EC );
-        rtl8168_mac_ocp_write( tp, 0xFA42, 0x76A4 );
-        rtl8168_mac_ocp_write( tp, 0xFA44, 0x49E3 );
-        rtl8168_mac_ocp_write( tp, 0xFA46, 0xF015 );
-        rtl8168_mac_ocp_write( tp, 0xFA48, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xFA4A, 0xF103 );
-        rtl8168_mac_ocp_write( tp, 0xFA4C, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xFA4E, 0xF011 );
-        rtl8168_mac_ocp_write( tp, 0xFA50, 0x4849 );
-        rtl8168_mac_ocp_write( tp, 0xFA52, 0x9C44 );
-        rtl8168_mac_ocp_write( tp, 0xFA54, 0x1C00 );
-        rtl8168_mac_ocp_write( tp, 0xFA56, 0x9CF6 );
-        rtl8168_mac_ocp_write( tp, 0xFA58, 0x7444 );
-        rtl8168_mac_ocp_write( tp, 0xFA5A, 0x49C1 );
-        rtl8168_mac_ocp_write( tp, 0xFA5C, 0xF004 );
-        rtl8168_mac_ocp_write( tp, 0xFA5E, 0x6446 );
-        rtl8168_mac_ocp_write( tp, 0xFA60, 0x1E07 );
-        rtl8168_mac_ocp_write( tp, 0xFA62, 0xE003 );
-        rtl8168_mac_ocp_write( tp, 0xFA64, 0x1C01 );
-        rtl8168_mac_ocp_write( tp, 0xFA66, 0x1E03 );
-        rtl8168_mac_ocp_write( tp, 0xFA68, 0x9C62 );
-        rtl8168_mac_ocp_write( tp, 0xFA6A, 0x1C11 );
-        rtl8168_mac_ocp_write( tp, 0xFA6C, 0x8C60 );
-        rtl8168_mac_ocp_write( tp, 0xFA6E, 0xE830 );
-        rtl8168_mac_ocp_write( tp, 0xFA70, 0xE02D );
-        rtl8168_mac_ocp_write( tp, 0xFA72, 0x49E9 );
-        rtl8168_mac_ocp_write( tp, 0xFA74, 0xF004 );
-        rtl8168_mac_ocp_write( tp, 0xFA76, 0x1D02 );
-        rtl8168_mac_ocp_write( tp, 0xFA78, 0x8DF5 );
-        rtl8168_mac_ocp_write( tp, 0xFA7A, 0xE79C );
-        rtl8168_mac_ocp_write( tp, 0xFA7C, 0x49E3 );
-        rtl8168_mac_ocp_write( tp, 0xFA7E, 0xF006 );
-        rtl8168_mac_ocp_write( tp, 0xFA80, 0x1D08 );
-        rtl8168_mac_ocp_write( tp, 0xFA82, 0x8DF4 );
-        rtl8168_mac_ocp_write( tp, 0xFA84, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xFA86, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xFA88, 0xE73A );
-        rtl8168_mac_ocp_write( tp, 0xFA8A, 0x49E1 );
-        rtl8168_mac_ocp_write( tp, 0xFA8C, 0xF007 );
-        rtl8168_mac_ocp_write( tp, 0xFA8E, 0x1D02 );
-        rtl8168_mac_ocp_write( tp, 0xFA90, 0x8DF4 );
-        rtl8168_mac_ocp_write( tp, 0xFA92, 0x1E01 );
-        rtl8168_mac_ocp_write( tp, 0xFA94, 0xE7A7 );
-        rtl8168_mac_ocp_write( tp, 0xFA96, 0xDE20 );
-        rtl8168_mac_ocp_write( tp, 0xFA98, 0xE410 );
-        rtl8168_mac_ocp_write( tp, 0xFA9A, 0x49E0 );
-        rtl8168_mac_ocp_write( tp, 0xFA9C, 0xF017 );
-        rtl8168_mac_ocp_write( tp, 0xFA9E, 0x1D01 );
-        rtl8168_mac_ocp_write( tp, 0xFAA0, 0x8DF4 );
-        rtl8168_mac_ocp_write( tp, 0xFAA2, 0xC5FA );
-        rtl8168_mac_ocp_write( tp, 0xFAA4, 0x1C00 );
-        rtl8168_mac_ocp_write( tp, 0xFAA6, 0x8CA0 );
-        rtl8168_mac_ocp_write( tp, 0xFAA8, 0x1C1B );
-        rtl8168_mac_ocp_write( tp, 0xFAAA, 0x9CA2 );
-        rtl8168_mac_ocp_write( tp, 0xFAAC, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xFAAE, 0x49CF );
-        rtl8168_mac_ocp_write( tp, 0xFAB0, 0xF0FE );
-        rtl8168_mac_ocp_write( tp, 0xFAB2, 0xC5F3 );
-        rtl8168_mac_ocp_write( tp, 0xFAB4, 0x74A0 );
-        rtl8168_mac_ocp_write( tp, 0xFAB6, 0x4849 );
-        rtl8168_mac_ocp_write( tp, 0xFAB8, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xFABA, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xFABC, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xFABE, 0xF006 );
-        rtl8168_mac_ocp_write( tp, 0xFAC0, 0x48C3 );
-        rtl8168_mac_ocp_write( tp, 0xFAC2, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xFAC4, 0xE820 );
-        rtl8168_mac_ocp_write( tp, 0xFAC6, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xFAC8, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xFACA, 0xC432 );
-        rtl8168_mac_ocp_write( tp, 0xFACC, 0xBC00 );
-        rtl8168_mac_ocp_write( tp, 0xFACE, 0xC5E4 );
-        rtl8168_mac_ocp_write( tp, 0xFAD0, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xFAD2, 0x49CE );
-        rtl8168_mac_ocp_write( tp, 0xFAD4, 0xF1FE );
-        rtl8168_mac_ocp_write( tp, 0xFAD6, 0x9EA0 );
-        rtl8168_mac_ocp_write( tp, 0xFAD8, 0x1C1C );
-        rtl8168_mac_ocp_write( tp, 0xFADA, 0x484F );
-        rtl8168_mac_ocp_write( tp, 0xFADC, 0x9CA2 );
-        rtl8168_mac_ocp_write( tp, 0xFADE, 0xFF80 );
-        rtl8168_mac_ocp_write( tp, 0xFAE0, 0xB404 );
-        rtl8168_mac_ocp_write( tp, 0xFAE2, 0xB405 );
-        rtl8168_mac_ocp_write( tp, 0xFAE4, 0xC5D9 );
-        rtl8168_mac_ocp_write( tp, 0xFAE6, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xFAE8, 0x49CE );
-        rtl8168_mac_ocp_write( tp, 0xFAEA, 0xF1FE );
-        rtl8168_mac_ocp_write( tp, 0xFAEC, 0xC41F );
-        rtl8168_mac_ocp_write( tp, 0xFAEE, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xFAF0, 0xC41C );
-        rtl8168_mac_ocp_write( tp, 0xFAF2, 0x1C13 );
-        rtl8168_mac_ocp_write( tp, 0xFAF4, 0x484F );
-        rtl8168_mac_ocp_write( tp, 0xFAF6, 0x9CA2 );
-        rtl8168_mac_ocp_write( tp, 0xFAF8, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xFAFA, 0x49CF );
-        rtl8168_mac_ocp_write( tp, 0xFAFC, 0xF1FE );
-        rtl8168_mac_ocp_write( tp, 0xFAFE, 0xB005 );
-        rtl8168_mac_ocp_write( tp, 0xFB00, 0xB004 );
-        rtl8168_mac_ocp_write( tp, 0xFB02, 0xFF80 );
-        rtl8168_mac_ocp_write( tp, 0xFB04, 0xB404 );
-        rtl8168_mac_ocp_write( tp, 0xFB06, 0xB405 );
-        rtl8168_mac_ocp_write( tp, 0xFB08, 0xC5C7 );
-        rtl8168_mac_ocp_write( tp, 0xFB0A, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xFB0C, 0x49CE );
-        rtl8168_mac_ocp_write( tp, 0xFB0E, 0xF1FE );
-        rtl8168_mac_ocp_write( tp, 0xFB10, 0xC40E );
-        rtl8168_mac_ocp_write( tp, 0xFB12, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xFB14, 0xC40A );
-        rtl8168_mac_ocp_write( tp, 0xFB16, 0x1C13 );
-        rtl8168_mac_ocp_write( tp, 0xFB18, 0x484F );
-        rtl8168_mac_ocp_write( tp, 0xFB1A, 0x9CA2 );
-        rtl8168_mac_ocp_write( tp, 0xFB1C, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xFB1E, 0x49CF );
-        rtl8168_mac_ocp_write( tp, 0xFB20, 0xF1FE );
-        rtl8168_mac_ocp_write( tp, 0xFB22, 0xB005 );
-        rtl8168_mac_ocp_write( tp, 0xFB24, 0xB004 );
-        rtl8168_mac_ocp_write( tp, 0xFB26, 0xFF80 );
-        rtl8168_mac_ocp_write( tp, 0xFB28, 0x0000 );
-        rtl8168_mac_ocp_write( tp, 0xFB2A, 0x0481 );
-        rtl8168_mac_ocp_write( tp, 0xFB2C, 0x0C81 );
-        rtl8168_mac_ocp_write( tp, 0xFB2E, 0x0AE0 );
-
-
-        rtl8168_mac_ocp_write( tp, 0xFC26, 0x8000 );
-
-        rtl8168_mac_ocp_write( tp, 0xFC28, 0x0000 );
-        rtl8168_mac_ocp_write( tp, 0xFC2A, 0x0000 );
-        rtl8168_mac_ocp_write( tp, 0xFC2C, 0x0297 );
-        rtl8168_mac_ocp_write( tp, 0xFC2E, 0x0000 );
-        rtl8168_mac_ocp_write( tp, 0xFC30, 0x00A9 );
-        rtl8168_mac_ocp_write( tp, 0xFC32, 0x012D );
-        rtl8168_mac_ocp_write( tp, 0xFC34, 0x0000 );
-        rtl8168_mac_ocp_write( tp, 0xFC36, 0x08DF );
-}
-
-static void
-rtl8168_set_mac_mcu_8411b_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        rtl8168_mac_ocp_write( tp, 0xF800, 0xE008 );
-        rtl8168_mac_ocp_write( tp, 0xF802, 0xE00A );
-        rtl8168_mac_ocp_write( tp, 0xF804, 0xE00C );
-        rtl8168_mac_ocp_write( tp, 0xF806, 0xE00E );
-        rtl8168_mac_ocp_write( tp, 0xF808, 0xE027 );
-        rtl8168_mac_ocp_write( tp, 0xF80A, 0xE04F );
-        rtl8168_mac_ocp_write( tp, 0xF80C, 0xE05E );
-        rtl8168_mac_ocp_write( tp, 0xF80E, 0xE065 );
-        rtl8168_mac_ocp_write( tp, 0xF810, 0xC602 );
-        rtl8168_mac_ocp_write( tp, 0xF812, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF814, 0x0000 );
-        rtl8168_mac_ocp_write( tp, 0xF816, 0xC502 );
-        rtl8168_mac_ocp_write( tp, 0xF818, 0xBD00 );
-        rtl8168_mac_ocp_write( tp, 0xF81A, 0x074C );
-        rtl8168_mac_ocp_write( tp, 0xF81C, 0xC302 );
-        rtl8168_mac_ocp_write( tp, 0xF81E, 0xBB00 );
-        rtl8168_mac_ocp_write( tp, 0xF820, 0x080A );
-        rtl8168_mac_ocp_write( tp, 0xF822, 0x6420 );
-        rtl8168_mac_ocp_write( tp, 0xF824, 0x48C2 );
-        rtl8168_mac_ocp_write( tp, 0xF826, 0x8C20 );
-        rtl8168_mac_ocp_write( tp, 0xF828, 0xC516 );
-        rtl8168_mac_ocp_write( tp, 0xF82A, 0x64A4 );
-        rtl8168_mac_ocp_write( tp, 0xF82C, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF82E, 0xF009 );
-        rtl8168_mac_ocp_write( tp, 0xF830, 0x74A2 );
-        rtl8168_mac_ocp_write( tp, 0xF832, 0x8CA5 );
-        rtl8168_mac_ocp_write( tp, 0xF834, 0x74A0 );
-        rtl8168_mac_ocp_write( tp, 0xF836, 0xC50E );
-        rtl8168_mac_ocp_write( tp, 0xF838, 0x9CA2 );
-        rtl8168_mac_ocp_write( tp, 0xF83A, 0x1C11 );
-        rtl8168_mac_ocp_write( tp, 0xF83C, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xF83E, 0xE006 );
-        rtl8168_mac_ocp_write( tp, 0xF840, 0x74F8 );
-        rtl8168_mac_ocp_write( tp, 0xF842, 0x48C4 );
-        rtl8168_mac_ocp_write( tp, 0xF844, 0x8CF8 );
-        rtl8168_mac_ocp_write( tp, 0xF846, 0xC404 );
-        rtl8168_mac_ocp_write( tp, 0xF848, 0xBC00 );
-        rtl8168_mac_ocp_write( tp, 0xF84A, 0xC403 );
-        rtl8168_mac_ocp_write( tp, 0xF84C, 0xBC00 );
-        rtl8168_mac_ocp_write( tp, 0xF84E, 0x0BF2 );
-        rtl8168_mac_ocp_write( tp, 0xF850, 0x0C0A );
-        rtl8168_mac_ocp_write( tp, 0xF852, 0xE434 );
-        rtl8168_mac_ocp_write( tp, 0xF854, 0xD3C0 );
-        rtl8168_mac_ocp_write( tp, 0xF856, 0x49D9 );
-        rtl8168_mac_ocp_write( tp, 0xF858, 0xF01F );
-        rtl8168_mac_ocp_write( tp, 0xF85A, 0xC526 );
-        rtl8168_mac_ocp_write( tp, 0xF85C, 0x64A5 );
-        rtl8168_mac_ocp_write( tp, 0xF85E, 0x1400 );
-        rtl8168_mac_ocp_write( tp, 0xF860, 0xF007 );
-        rtl8168_mac_ocp_write( tp, 0xF862, 0x0C01 );
-        rtl8168_mac_ocp_write( tp, 0xF864, 0x8CA5 );
-        rtl8168_mac_ocp_write( tp, 0xF866, 0x1C15 );
-        rtl8168_mac_ocp_write( tp, 0xF868, 0xC51B );
-        rtl8168_mac_ocp_write( tp, 0xF86A, 0x9CA0 );
-        rtl8168_mac_ocp_write( tp, 0xF86C, 0xE013 );
-        rtl8168_mac_ocp_write( tp, 0xF86E, 0xC519 );
-        rtl8168_mac_ocp_write( tp, 0xF870, 0x74A0 );
-        rtl8168_mac_ocp_write( tp, 0xF872, 0x48C4 );
-        rtl8168_mac_ocp_write( tp, 0xF874, 0x8CA0 );
-        rtl8168_mac_ocp_write( tp, 0xF876, 0xC516 );
-        rtl8168_mac_ocp_write( tp, 0xF878, 0x74A4 );
-        rtl8168_mac_ocp_write( tp, 0xF87A, 0x48C8 );
-        rtl8168_mac_ocp_write( tp, 0xF87C, 0x48CA );
-        rtl8168_mac_ocp_write( tp, 0xF87E, 0x9CA4 );
-        rtl8168_mac_ocp_write( tp, 0xF880, 0xC512 );
-        rtl8168_mac_ocp_write( tp, 0xF882, 0x1B00 );
-        rtl8168_mac_ocp_write( tp, 0xF884, 0x9BA0 );
-        rtl8168_mac_ocp_write( tp, 0xF886, 0x1B1C );
-        rtl8168_mac_ocp_write( tp, 0xF888, 0x483F );
-        rtl8168_mac_ocp_write( tp, 0xF88A, 0x9BA2 );
-        rtl8168_mac_ocp_write( tp, 0xF88C, 0x1B04 );
-        rtl8168_mac_ocp_write( tp, 0xF88E, 0xC508 );
-        rtl8168_mac_ocp_write( tp, 0xF890, 0x9BA0 );
-        rtl8168_mac_ocp_write( tp, 0xF892, 0xC505 );
-        rtl8168_mac_ocp_write( tp, 0xF894, 0xBD00 );
-        rtl8168_mac_ocp_write( tp, 0xF896, 0xC502 );
-        rtl8168_mac_ocp_write( tp, 0xF898, 0xBD00 );
-        rtl8168_mac_ocp_write( tp, 0xF89A, 0x0300 );
-        rtl8168_mac_ocp_write( tp, 0xF89C, 0x051E );
-        rtl8168_mac_ocp_write( tp, 0xF89E, 0xE434 );
-        rtl8168_mac_ocp_write( tp, 0xF8A0, 0xE018 );
-        rtl8168_mac_ocp_write( tp, 0xF8A2, 0xE092 );
-        rtl8168_mac_ocp_write( tp, 0xF8A4, 0xDE20 );
-        rtl8168_mac_ocp_write( tp, 0xF8A6, 0xD3C0 );
-        rtl8168_mac_ocp_write( tp, 0xF8A8, 0xC50F );
-        rtl8168_mac_ocp_write( tp, 0xF8AA, 0x76A4 );
-        rtl8168_mac_ocp_write( tp, 0xF8AC, 0x49E3 );
-        rtl8168_mac_ocp_write( tp, 0xF8AE, 0xF007 );
-        rtl8168_mac_ocp_write( tp, 0xF8B0, 0x49C0 );
-        rtl8168_mac_ocp_write( tp, 0xF8B2, 0xF103 );
-        rtl8168_mac_ocp_write( tp, 0xF8B4, 0xC607 );
-        rtl8168_mac_ocp_write( tp, 0xF8B6, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF8B8, 0xC606 );
-        rtl8168_mac_ocp_write( tp, 0xF8BA, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF8BC, 0xC602 );
-        rtl8168_mac_ocp_write( tp, 0xF8BE, 0xBE00 );
-        rtl8168_mac_ocp_write( tp, 0xF8C0, 0x0C4C );
-        rtl8168_mac_ocp_write( tp, 0xF8C2, 0x0C28 );
-        rtl8168_mac_ocp_write( tp, 0xF8C4, 0x0C2C );
-        rtl8168_mac_ocp_write( tp, 0xF8C6, 0xDC00 );
-        rtl8168_mac_ocp_write( tp, 0xF8C8, 0xC707 );
-        rtl8168_mac_ocp_write( tp, 0xF8CA, 0x1D00 );
-        rtl8168_mac_ocp_write( tp, 0xF8CC, 0x8DE2 );
-        rtl8168_mac_ocp_write( tp, 0xF8CE, 0x48C1 );
-        rtl8168_mac_ocp_write( tp, 0xF8D0, 0xC502 );
-        rtl8168_mac_ocp_write( tp, 0xF8D2, 0xBD00 );
-        rtl8168_mac_ocp_write( tp, 0xF8D4, 0x00AA );
-        rtl8168_mac_ocp_write( tp, 0xF8D6, 0xE0C0 );
-        rtl8168_mac_ocp_write( tp, 0xF8D8, 0xC502 );
-        rtl8168_mac_ocp_write( tp, 0xF8DA, 0xBD00 );
-        rtl8168_mac_ocp_write( tp, 0xF8DC, 0x0132 );
-
-        rtl8168_mac_ocp_write( tp, 0xFC26, 0x8000 );
-
-        rtl8168_mac_ocp_write( tp, 0xFC2A, 0x0743 );
-        rtl8168_mac_ocp_write( tp, 0xFC2C, 0x0801 );
-        rtl8168_mac_ocp_write( tp, 0xFC2E, 0x0BE9 );
-        rtl8168_mac_ocp_write( tp, 0xFC30, 0x02FD );
-        rtl8168_mac_ocp_write( tp, 0xFC32, 0x0C25 );
-        rtl8168_mac_ocp_write( tp, 0xFC34, 0x00A9 );
-        rtl8168_mac_ocp_write( tp, 0xFC36, 0x012D );
-}
-
-static void
-rtl8168_set_mac_mcu_8168ep_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 i;
-        static const u16 mcu_patch_code_8168ep_1[] = {
-                0xE008, 0xE0D3, 0xE0D6, 0xE0D9, 0xE0DB, 0xE0DD, 0xE0DF, 0xE0E1, 0xC251,
-                0x7340, 0x49B1, 0xF010, 0x1D02, 0x8D40, 0xC202, 0xBA00, 0x2C3A, 0xC0F0,
-                0xE8DE, 0x2000, 0x8000, 0xC0B6, 0x268C, 0x752C, 0x49D4, 0xF112, 0xE025,
-                0xC2F6, 0x7146, 0xC2F5, 0x7340, 0x49BE, 0xF103, 0xC7F2, 0xE002, 0xC7F1,
-                0x304F, 0x6226, 0x49A1, 0xF1F0, 0x7222, 0x49A0, 0xF1ED, 0x2525, 0x1F28,
-                0x3097, 0x3091, 0x9A36, 0x752C, 0x21DC, 0x25BC, 0xC6E2, 0x77C0, 0x1304,
-                0xF014, 0x1303, 0xF014, 0x1302, 0xF014, 0x1301, 0xF014, 0x49D4, 0xF103,
-                0xC3D7, 0xBB00, 0xC618, 0x67C6, 0x752E, 0x22D7, 0x26DD, 0x1505, 0xF013,
-                0xC60A, 0xBE00, 0xC309, 0xBB00, 0xC308, 0xBB00, 0xC307, 0xBB00, 0xC306,
-                0xBB00, 0x25C8, 0x25A6, 0x25AC, 0x25B2, 0x25B8, 0xCD08, 0x0000, 0xC0BC,
-                0xC2FF, 0x7340, 0x49B0, 0xF04E, 0x1F46, 0x308F, 0xC3F7, 0x1C04, 0xE84D,
-                0x1401, 0xF147, 0x7226, 0x49A7, 0xF044, 0x7222, 0x2525, 0x1F30, 0x3097,
-                0x3091, 0x7340, 0xC4EA, 0x401C, 0xF006, 0xC6E8, 0x75C0, 0x49D7, 0xF105,
-                0xE036, 0x1D08, 0x8DC1, 0x0208, 0x6640, 0x2764, 0x1606, 0xF12F, 0x6346,
-                0x133B, 0xF12C, 0x9B34, 0x1B18, 0x3093, 0xC32A, 0x1C10, 0xE82A, 0x1401,
-                0xF124, 0x1A36, 0x308A, 0x7322, 0x25B5, 0x0B0E, 0x1C00, 0xE82C, 0xC71F,
-                0x4027, 0xF11A, 0xE838, 0x1F42, 0x308F, 0x1B08, 0xE824, 0x7236, 0x7746,
-                0x1700, 0xF00D, 0xC313, 0x401F, 0xF103, 0x1F00, 0x9F46, 0x7744, 0x449F,
-                0x445F, 0xE817, 0xC70A, 0x4027, 0xF105, 0xC302, 0xBB00, 0x2E08, 0x2DC2,
-                0xC7FF, 0xBF00, 0xCDB8, 0xFFFF, 0x0C02, 0xA554, 0xA5DC, 0x402F, 0xF105,
-                0x1400, 0xF1FA, 0x1C01, 0xE002, 0x1C00, 0xFF80, 0x49B0, 0xF004, 0x0B01,
-                0xA1D3, 0xE003, 0x0B02, 0xA5D3, 0x3127, 0x3720, 0x0B02, 0xA5D3, 0x3127,
-                0x3720, 0x1300, 0xF1FB, 0xFF80, 0x7322, 0x25B5, 0x1E28, 0x30DE, 0x30D9,
-                0x7264, 0x1E11, 0x2368, 0x3116, 0xFF80, 0x1B7E, 0xC602, 0xBE00, 0x06A6,
-                0x1B7E, 0xC602, 0xBE00, 0x0764, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00,
-                0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00,
-                0x0000
-        };
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168ep_1); i++) {
-                rtl8168_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8168ep_1[i]);
-        }
-
-        rtl8168_mac_ocp_write(tp, 0xFC26, 0x8000);
-
-        rtl8168_mac_ocp_write(tp, 0xFC28, 0x2549);
-        rtl8168_mac_ocp_write(tp, 0xFC2A, 0x06A5);
-        rtl8168_mac_ocp_write(tp, 0xFC2C, 0x0763);
-}
-
-static bool
-rtl8168_check_dash_other_fun_present(struct rtl8168_private *tp)
-{
-        //check if func 2 exist
-        if (rtl8168_csi_other_fun_read(tp, 2, 0x00) != 0xffffffff)
-                return true;
-
-        return false;
-}
-
-static void
-rtl8168_set_mac_mcu_8168ep_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 i;
-        static const u16 mcu_patch_code_8168ep_2[] = {
-                0xE008, 0xE017, 0xE052, 0xE057, 0xE059, 0xE05B, 0xE05D, 0xE05F, 0xC50F,
-                0x76A4, 0x49E3, 0xF007, 0x49C0, 0xF103, 0xC607, 0xBE00, 0xC606, 0xBE00,
-                0xC602, 0xBE00, 0x0BDA, 0x0BB6, 0x0BBA, 0xDC00, 0xB400, 0xB401, 0xB402,
-                0xB403, 0xB404, 0xC02E, 0x7206, 0x49AE, 0xF1FE, 0xC12B, 0x9904, 0xC12A,
-                0x9906, 0x7206, 0x49AE, 0xF1FE, 0x7200, 0x49A0, 0xF117, 0xC123, 0xC223,
-                0xC323, 0xE808, 0xC322, 0xE806, 0xC321, 0xE804, 0xC320, 0xE802, 0xE00C,
-                0x740E, 0x49CE, 0xF1FE, 0x9908, 0x990A, 0x9A0C, 0x9B0E, 0x740E, 0x49CE,
-                0xF1FE, 0xFF80, 0xB004, 0xB003, 0xB002, 0xB001, 0xB000, 0xC604, 0xC002,
-                0xB800, 0x1FC8, 0xE000, 0xE8E0, 0xF128, 0x0002, 0xFFFF, 0xF000, 0x8001,
-                0x8002, 0x8003, 0x8004, 0x48C1, 0x48C2, 0x9C46, 0xC402, 0xBC00, 0x0490,
-                0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000,
-                0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000
-        };
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168ep_2); i++) {
-                rtl8168_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8168ep_2[i]);
-        }
-
-        rtl8168_mac_ocp_write(tp, 0xFC26, 0x8000);
-
-        rtl8168_mac_ocp_write(tp, 0xFC28, 0x0BB3);
-        if (false == rtl8168_check_dash_other_fun_present(tp))
-                rtl8168_mac_ocp_write(tp, 0xFC2A, 0x1FC7);
-        //rtl8168_mac_ocp_write(tp, 0xFC2C, 0x0485);
-}
-
-static void
-rtl8168_set_mac_mcu_8168h_1(struct net_device *dev)
-{
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-}
-
-static void
-rtl8168_set_mac_mcu_8168h_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 i;
-        static const u16 mcu_patch_code_8168h_1[] = {
-                0xE008, 0xE00F, 0xE011, 0xE047, 0xE049, 0xE073, 0xE075, 0xE07A, 0xC707,
-                0x1D00, 0x8DE2, 0x48C1, 0xC502, 0xBD00, 0x00E4, 0xE0C0, 0xC502, 0xBD00,
-                0x0216, 0xC634, 0x75C0, 0x49D3, 0xF027, 0xC631, 0x75C0, 0x49D3, 0xF123,
-                0xC627, 0x75C0, 0xB405, 0xC525, 0x9DC0, 0xC621, 0x75C8, 0x49D5, 0xF00A,
-                0x49D6, 0xF008, 0x49D7, 0xF006, 0x49D8, 0xF004, 0x75D2, 0x49D9, 0xF111,
-                0xC517, 0x9DC8, 0xC516, 0x9DD2, 0xC618, 0x75C0, 0x49D4, 0xF003, 0x49D0,
-                0xF104, 0xC60A, 0xC50E, 0x9DC0, 0xB005, 0xC607, 0x9DC0, 0xB007, 0xC602,
-                0xBE00, 0x1A06, 0xB400, 0xE86C, 0xA000, 0x01E1, 0x0200, 0x9200, 0xE84C,
-                0xE004, 0xE908, 0xC502, 0xBD00, 0x0B58, 0xB407, 0xB404, 0x2195, 0x25BD,
-                0x9BE0, 0x1C1C, 0x484F, 0x9CE2, 0x72E2, 0x49AE, 0xF1FE, 0x0B00, 0xF116,
-                0xC71C, 0xC419, 0x9CE0, 0x1C13, 0x484F, 0x9CE2, 0x74E2, 0x49CE, 0xF1FE,
-                0xC412, 0x9CE0, 0x1C13, 0x484F, 0x9CE2, 0x74E2, 0x49CE, 0xF1FE, 0xC70C,
-                0x74F8, 0x48C3, 0x8CF8, 0xB004, 0xB007, 0xC502, 0xBD00, 0x0F24, 0x0481,
-                0x0C81, 0xDE24, 0xE000, 0xC602, 0xBE00, 0x0CA4, 0x48C1, 0x48C2, 0x9C46,
-                0xC402, 0xBC00, 0x0578, 0xC602, 0xBE00, 0x0000
-        };
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168h_1); i++) {
-                rtl8168_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8168h_1[i]);
-        }
-
-        rtl8168_mac_ocp_write(tp, 0xFC26, 0x8000);
-
-        rtl8168_mac_ocp_write(tp, 0xFC28, 0x00E2);
-        rtl8168_mac_ocp_write(tp, 0xFC2A, 0x0210);
-        rtl8168_mac_ocp_write(tp, 0xFC2C, 0x1A04);
-        rtl8168_mac_ocp_write(tp, 0xFC2E, 0x0B26);
-        rtl8168_mac_ocp_write(tp, 0xFC30, 0x0F02);
-        rtl8168_mac_ocp_write(tp, 0xFC32, 0x0CA0);
-        //rtl8168_mac_ocp_write(tp, 0xFC34, 0x056C);
-
-        rtl8168_mac_ocp_write(tp, 0xFC38, 0x003F);
-}
-
-static void
-rtl8168_set_mac_mcu_8168h_3(struct net_device *dev)
-{
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-}
-
-static void
-rtl8168_set_mac_mcu_8168fp_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 i;
-        u16 breakPointEnabled = 0;
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        if(tp->HwPkgDet == 0x00 || tp->HwPkgDet == 0x0F) {
-                static const u16 mcu_patch_code_8168fp_1_1[] = {
-                        0xE00A, 0xE0C1, 0xE104, 0xE108, 0xE10D, 0xE112, 0xE11C, 0xE121, 0xE000,
-                        0xE0C8, 0xB400, 0xC1FE, 0x49E2, 0xF04C, 0x49EA, 0xF04A, 0x74E6, 0xC246,
-                        0x7542, 0x73EC, 0x1800, 0x49C0, 0xF10D, 0x49C1, 0xF10B, 0x49C2, 0xF109,
-                        0x49B0, 0xF107, 0x49B1, 0xF105, 0x7220, 0x49A2, 0xF102, 0xE002, 0x4800,
-                        0x49D0, 0xF10A, 0x49D1, 0xF108, 0x49D2, 0xF106, 0x49D3, 0xF104, 0x49DF,
-                        0xF102, 0xE00C, 0x4801, 0x72E4, 0x49AD, 0xF108, 0xC225, 0x6741, 0x48F0,
-                        0x8F41, 0x4870, 0x8F41, 0xC7CF, 0x49B5, 0xF01F, 0x49B2, 0xF00B, 0x4980,
-                        0xF003, 0x484E, 0x94E7, 0x4981, 0xF004, 0x485E, 0xC212, 0x9543, 0xE071,
-                        0x49B6, 0xF003, 0x49B3, 0xF10F, 0x4980, 0xF003, 0x484E, 0x94E7, 0x4981,
-                        0xF004, 0x485E, 0xC204, 0x9543, 0xE005, 0xE000, 0xE0FC, 0xE0FA, 0xE065,
-                        0x49B7, 0xF007, 0x4980, 0xF005, 0x1A38, 0x46D4, 0x1200, 0xF109, 0x4981,
-                        0xF055, 0x49C3, 0xF105, 0x1A30, 0x46D5, 0x1200, 0xF04F, 0x7220, 0x49A2,
-                        0xF130, 0x49C1, 0xF12E, 0x49B0, 0xF12C, 0xC2E6, 0x7240, 0x49A8, 0xF003,
-                        0x49D0, 0xF126, 0x49A9, 0xF003, 0x49D1, 0xF122, 0x49AA, 0xF003, 0x49D2,
-                        0xF11E, 0x49AB, 0xF003, 0x49DF, 0xF11A, 0x49AC, 0xF003, 0x49D3, 0xF116,
-                        0x4980, 0xF003, 0x49C7, 0xF105, 0x4981, 0xF02C, 0x49D7, 0xF02A, 0x49C0,
-                        0xF00C, 0xC721, 0x62F4, 0x49A0, 0xF008, 0x49A4, 0xF106, 0x4824, 0x8AF4,
-                        0xC71A, 0x1A40, 0x9AE0, 0x49B6, 0xF017, 0x200E, 0xC7B8, 0x72E0, 0x4710,
-                        0x92E1, 0xC70E, 0x77E0, 0x49F0, 0xF112, 0xC70B, 0x77E0, 0x27FE, 0x1AFA,
-                        0x4317, 0xC705, 0x9AE2, 0x1A11, 0x8AE0, 0xE008, 0xE41C, 0xC0AE, 0xD23A,
-                        0xC7A2, 0x74E6, 0x484F, 0x94E7, 0xC79E, 0x8CE6, 0x8BEC, 0xC29C, 0x8D42,
-                        0x7220, 0xB000, 0xC502, 0xBD00, 0x0932, 0xB400, 0xC240, 0xC340, 0x7060,
-                        0x498F, 0xF014, 0x488F, 0x9061, 0x744C, 0x49C3, 0xF004, 0x7562, 0x485E,
-                        0x9563, 0x7446, 0x49C3, 0xF106, 0x7562, 0x1C30, 0x46E5, 0x1200, 0xF004,
-                        0x7446, 0x484F, 0x9447, 0xC32A, 0x7466, 0x49C0, 0xF00F, 0x48C0, 0x9C66,
-                        0x7446, 0x4840, 0x4841, 0x4842, 0x9C46, 0x744C, 0x4840, 0x9C4C, 0x744A,
-                        0x484A, 0x9C4A, 0xE013, 0x498E, 0xF011, 0x488E, 0x9061, 0x744C, 0x49C3,
-                        0xF004, 0x7446, 0x484E, 0x9447, 0x7446, 0x1D38, 0x46EC, 0x1500, 0xF004,
-                        0x7446, 0x484F, 0x9447, 0xB000, 0xC502, 0xBD00, 0x074C, 0xE000, 0xE0FC,
-                        0xE0C0, 0x4830, 0x4837, 0xC502, 0xBD00, 0x0978, 0x63E2, 0x4830, 0x4837,
-                        0xC502, 0xBD00, 0x09FE, 0x73E2, 0x4830, 0x8BE2, 0xC302, 0xBB00, 0x0A12,
-                        0x73E2, 0x48B0, 0x48B3, 0x48B4, 0x48B5, 0x48B6, 0x48B7, 0x8BE2, 0xC302,
-                        0xBB00, 0x0A5A, 0x73E2, 0x4830, 0x8BE2, 0xC302, 0xBB00, 0x0A6C, 0x73E2,
-                        0x4830, 0x4837, 0xC502, 0xBD00, 0x0A86
-                };
-
-                for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_1_1); i++) {
-                        rtl8168_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8168fp_1_1[i]);
-                }
-
-                rtl8168_mac_ocp_write(tp, 0xFC26, 0x8000);
-
-                rtl8168_mac_ocp_write(tp, 0xFC28, 0x0890);
-                rtl8168_mac_ocp_write(tp, 0xFC2A, 0x0712);
-                rtl8168_mac_ocp_write(tp, 0xFC2C, 0x0974);
-                rtl8168_mac_ocp_write(tp, 0xFC2E, 0x09FC);
-                rtl8168_mac_ocp_write(tp, 0xFC30, 0x0A0E);
-                rtl8168_mac_ocp_write(tp, 0xFC32, 0x0A56);
-                rtl8168_mac_ocp_write(tp, 0xFC34, 0x0A68);
-                rtl8168_mac_ocp_write(tp, 0xFC36, 0x0A84);
-
-        } else if (tp->HwPkgDet == 0x6) {
-                static const u16 mcu_patch_code_8168fp_1_2[] = {
-                        0xE008, 0xE00A, 0xE031, 0xE033, 0xE035, 0xE144, 0xE166, 0xE168, 0xC502,
-                        0xBD00, 0x0000, 0xC725, 0x75E0, 0x48D0, 0x9DE0, 0xC722, 0x75E0, 0x1C78,
-                        0x416C, 0x1530, 0xF111, 0xC71D, 0x75F6, 0x49D1, 0xF00D, 0x75E0, 0x1C1F,
-                        0x416C, 0x1502, 0xF108, 0x75FA, 0x49D3, 0xF005, 0x75EC, 0x9DE4, 0x4853,
-                        0x9DFA, 0xC70B, 0x75E0, 0x4852, 0x4850, 0x9DE0, 0xC602, 0xBE00, 0x04B8,
-                        0xE420, 0xE000, 0xE0FC, 0xE43C, 0xDC00, 0xEB00, 0xC202, 0xBA00, 0x0000,
-                        0xC002, 0xB800, 0x0000, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405, 0xB406,
-                        0xC44D, 0xC54D, 0x1867, 0xE8A2, 0x2318, 0x276E, 0x1601, 0xF106, 0x1A07,
-                        0xE861, 0xE86B, 0xE873, 0xE037, 0x231E, 0x276E, 0x1602, 0xF10B, 0x1A07,
-                        0xE858, 0xE862, 0xC247, 0xC344, 0xE8E3, 0xC73B, 0x66E0, 0xE8B5, 0xE029,
-                        0x231A, 0x276C, 0xC733, 0x9EE0, 0x1866, 0xE885, 0x251C, 0x120F, 0xF011,
-                        0x1209, 0xF011, 0x2014, 0x240E, 0x1000, 0xF007, 0x120C, 0xF00D, 0x1203,
-                        0xF00D, 0x1200, 0xF00D, 0x120C, 0xF00D, 0x1203, 0xF00D, 0x1A03, 0xE00C,
-                        0x1A07, 0xE00A, 0x1A00, 0xE008, 0x1A01, 0xE006, 0x1A02, 0xE004, 0x1A04,
-                        0xE002, 0x1A05, 0xE829, 0xE833, 0xB006, 0xB005, 0xB004, 0xB003, 0xB002,
-                        0xB001, 0x60C4, 0xC702, 0xBF00, 0x2786, 0xDD00, 0xD030, 0xE0C4, 0xE0F8,
-                        0xDC42, 0xD3F0, 0x0000, 0x0004, 0x0007, 0x0014, 0x0090, 0x1000, 0x0F00,
-                        0x1004, 0x1008, 0x3000, 0x3004, 0x3008, 0x4000, 0x7777, 0x8000, 0x8001,
-                        0x8008, 0x8003, 0x8004, 0xC000, 0xC004, 0xF004, 0xFFFF, 0xB406, 0xB407,
-                        0xC6E5, 0x77C0, 0x27F3, 0x23F3, 0x47FA, 0x9FC0, 0xB007, 0xB006, 0xFF80,
-                        0xB405, 0xB407, 0xC7D8, 0x75E0, 0x48D0, 0x9DE0, 0xB007, 0xB005, 0xFF80,
-                        0xB401, 0xC0EA, 0xC2DC, 0xC3D8, 0xE865, 0xC0D3, 0xC1E0, 0xC2E3, 0xE861,
-                        0xE817, 0xC0CD, 0xC2CF, 0xE85D, 0xC0C9, 0xC1D6, 0xC2DB, 0xE859, 0xE80F,
-                        0xC1C7, 0xC2CE, 0xE855, 0xC0C0, 0xC1D1, 0xC2D3, 0xE851, 0xE807, 0xC0BE,
-                        0xC2C2, 0xE84D, 0xE803, 0xB001, 0xFF80, 0xB402, 0xC2C6, 0xE859, 0x499F,
-                        0xF1FE, 0xB002, 0xFF80, 0xB402, 0xB403, 0xB407, 0xE821, 0x8882, 0x1980,
-                        0x8983, 0xE81D, 0x7180, 0x218B, 0x25BB, 0x1310, 0xF014, 0x1310, 0xFB03,
-                        0x1F20, 0x38FB, 0x3288, 0x434B, 0x2491, 0x430B, 0x1F0F, 0x38FB, 0x4313,
-                        0x2121, 0x4353, 0x2521, 0x418A, 0x6282, 0x2527, 0x212F, 0x418A, 0xB007,
-                        0xB003, 0xB002, 0xFF80, 0x6183, 0x2496, 0x1100, 0xF1FD, 0xFF80, 0x4800,
-                        0x4801, 0xC213, 0xC313, 0xE815, 0x4860, 0x8EE0, 0xC210, 0xC310, 0xE822,
-                        0x481E, 0xC20C, 0xC30C, 0xE80C, 0xC206, 0x7358, 0x483A, 0x9B58, 0xFF80,
-                        0xE8E0, 0xE000, 0x1008, 0x0F00, 0x800C, 0x0F00, 0xB407, 0xB406, 0xB403,
-                        0xC7F7, 0x98E0, 0x99E2, 0x9AE4, 0x21B2, 0x4831, 0x483F, 0x9BE6, 0x66E7,
-                        0x49E6, 0xF1FE, 0xB003, 0xB006, 0xB007, 0xFF80, 0xB407, 0xB406, 0xB403,
-                        0xC7E5, 0x9AE4, 0x21B2, 0x4831, 0x9BE6, 0x66E7, 0x49E6, 0xF1FE, 0x70E0,
-                        0x71E2, 0xB003, 0xB006, 0xB007, 0xFF80, 0x4882, 0xB406, 0xB405, 0xC71E,
-                        0x76E0, 0x1D78, 0x4175, 0x1630, 0xF10C, 0xC715, 0x76E0, 0x4861, 0x9EE0,
-                        0xC713, 0x1EFF, 0x9EE2, 0x75E0, 0x4850, 0x9DE0, 0xE005, 0xC70B, 0x76E0,
-                        0x4865, 0x9EE0, 0xB005, 0xB006, 0xC708, 0xC102, 0xB900, 0x279E, 0xEB16,
-                        0xEB00, 0xE43C, 0xDC00, 0xD3EC, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00,
-                        0x0000
-                };
-
-                for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_1_2); i++) {
-                        rtl8168_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8168fp_1_2[i]);
-                }
-
-                rtl8168_mac_ocp_write(tp, 0xFC26, 0x8000);
-
-                rtl8168_mac_ocp_write(tp, 0xFC28, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC2A, 0x04b4);
-                rtl8168_mac_ocp_write(tp, 0xFC2C, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC2E, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC30, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC32, 0x279C);
-                rtl8168_mac_ocp_write(tp, 0xFC34, 0x0000);
-                rtl8168_mac_ocp_write(tp, 0xFC36, 0x0000);
-        }
-
-        if (tp->HwPkgDet == 0x00)
-                breakPointEnabled = 0x00FC;
-        else if (tp->HwPkgDet == 0x0F)
-                breakPointEnabled = 0x00FF;
-        else if (tp->HwPkgDet == 0x06)
-                breakPointEnabled = 0x0022;
-
-        rtl8168_mac_ocp_write(tp, 0xFC38, breakPointEnabled);
-}
-
-static void
-rtl8168_set_mac_mcu_8168fp_8116as_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 i;
-        static const u16 mcu_patch_code_8168fp_8116as_2[] = {
-                0xE008, 0xE00A, 0xE00F, 0xE014, 0xE016, 0xE018, 0xE01A, 0xE01C, 0xC602,
-                0xBE00, 0x2AB2, 0x1BC0, 0x46EB, 0x1BFE, 0xC102, 0xB900, 0x0B1A, 0x1BC0,
-                0x46EB, 0x1B7E, 0xC102, 0xB900, 0x0BEA, 0xC602, 0xBE00, 0x0000, 0xC602,
-                0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602,
-                0xBE00, 0x0000
-        };
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_8116as_2); i++) {
-                rtl8168_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8168fp_8116as_2[i]);
-        }
-
-        rtl8168_mac_ocp_write(tp, 0xFC26, 0x8000);
-
-        rtl8168_mac_ocp_write(tp, 0xFC28, 0x2AAC);
-        rtl8168_mac_ocp_write(tp, 0xFC2A, 0x0B14);
-        rtl8168_mac_ocp_write(tp, 0xFC2C, 0x0BE4);
-
-        rtl8168_mac_ocp_write(tp, 0xFC38, 0x0007);
-}
-
-static void
-_rtl8168_set_mac_mcu_8168fp_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 i;
-        static const u16 mcu_patch_code_8168fp_2[] = {
-                0xE008, 0xE00A, 0xE00F, 0xE014, 0xE05F, 0xE064, 0xE066, 0xE068, 0xC602,
-                0xBE00, 0x0000, 0x1BC0, 0x46EB, 0x1BFE, 0xC102, 0xB900, 0x0B1A, 0x1BC0,
-                0x46EB, 0x1B7E, 0xC102, 0xB900, 0x0BEA, 0xB400, 0xB401, 0xB402, 0xB403,
-                0xB404, 0xB405, 0xC03A, 0x7206, 0x49AE, 0xF1FE, 0xC137, 0x9904, 0xC136,
-                0x9906, 0x7206, 0x49AE, 0xF1FE, 0x7200, 0x49A0, 0xF10B, 0xC52F, 0xC12E,
-                0xC232, 0xC332, 0xE812, 0xC331, 0xE810, 0xC330, 0xE80E, 0xE018, 0xC126,
-                0xC229, 0xC525, 0xC328, 0xE808, 0xC523, 0xC326, 0xE805, 0xC521, 0xC324,
-                0xE802, 0xE00C, 0x740E, 0x49CE, 0xF1FE, 0x9908, 0x9D0A, 0x9A0C, 0x9B0E,
-                0x740E, 0x49CE, 0xF1FE, 0xFF80, 0xB005, 0xB004, 0xB003, 0xB002, 0xB001,
-                0xB000, 0xC604, 0xC002, 0xB800, 0x2A5E, 0xE000, 0xE8E0, 0xF128, 0x3DC2,
-                0xFFFF, 0x10EC, 0x816A, 0x816D, 0x816C, 0xF000, 0x8002, 0x8004, 0x8007,
-                0x48C1, 0x48C2, 0x9C46, 0xC402, 0xBC00, 0x07BC, 0xC602, 0xBE00, 0x0000,
-                0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000
-        };
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_2); i++) {
-                rtl8168_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8168fp_2[i]);
-        }
-
-        rtl8168_mac_ocp_write(tp, 0xFC26, 0x8000);
-
-        rtl8168_mac_ocp_write(tp, 0xFC28, 0x2AAC);
-        rtl8168_mac_ocp_write(tp, 0xFC2A, 0x0B14);
-        rtl8168_mac_ocp_write(tp, 0xFC2C, 0x0BE4);
-        rtl8168_mac_ocp_write(tp, 0xFC2E, 0x2A5C);
-        //rtl8168_mac_ocp_write(tp, 0xFC30, 0x07B0);
-
-        if (true == rtl8168_check_dash_other_fun_present(tp))
-                rtl8168_mac_ocp_write(tp, 0xFC38, 0x0006);
-        else
-                rtl8168_mac_ocp_write(tp, 0xFC38, 0x000E);
-}
-
-static void
-rtl8168_set_mac_mcu_8168fp_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (tp->HwSuppSerDesPhyVer == 1) rtl8168_set_mac_mcu_8168fp_8116as_2(dev);
-        else _rtl8168_set_mac_mcu_8168fp_2(dev);
-}
-
-static void
-rtl8168_set_mac_mcu_8168fp_3(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 i;
-        static const u16 mcu_patch_code_8168fp_3[] = {
-                0xE008, 0xE053, 0xE058, 0xE05A, 0xE05C, 0xE05E, 0xE060, 0xE062, 0xB400,
-                0xB401, 0xB402, 0xB403, 0xB404, 0xB405, 0xC03A, 0x7206, 0x49AE, 0xF1FE,
-                0xC137, 0x9904, 0xC136, 0x9906, 0x7206, 0x49AE, 0xF1FE, 0x7200, 0x49A0,
-                0xF10B, 0xC52F, 0xC12E, 0xC232, 0xC332, 0xE812, 0xC331, 0xE810, 0xC330,
-                0xE80E, 0xE018, 0xC126, 0xC229, 0xC525, 0xC328, 0xE808, 0xC523, 0xC326,
-                0xE805, 0xC521, 0xC324, 0xE802, 0xE00C, 0x740E, 0x49CE, 0xF1FE, 0x9908,
-                0x9D0A, 0x9A0C, 0x9B0E, 0x740E, 0x49CE, 0xF1FE, 0xFF80, 0xB005, 0xB004,
-                0xB003, 0xB002, 0xB001, 0xB000, 0xC604, 0xC002, 0xB800, 0x2B16, 0xE000,
-                0xE8E0, 0xF128, 0x3DC2, 0xFFFF, 0x10EC, 0x816A, 0x816D, 0x816C, 0xF000,
-                0x8002, 0x8004, 0x8007, 0x48C1, 0x48C2, 0x9C46, 0xC402, 0xBC00, 0x07BC,
-                0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000,
-                0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000
-        };
-
-        rtl8168_hw_disable_mac_mcu_bps(dev);
-
-        for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8168fp_3); i++) {
-                rtl8168_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8168fp_3[i]);
-        }
-
-        rtl8168_mac_ocp_write(tp, 0xFC26, 0x8000);
-
-        rtl8168_mac_ocp_write(tp, 0xFC28, 0x2B14);
-        //rtl8168_mac_ocp_write(tp, 0xFC2A, 0x07B0);
-
-        if (true == rtl8168_check_dash_other_fun_present(tp))
-                rtl8168_mac_ocp_write(tp, 0xFC38, 0x0000);
-        else
-                rtl8168_mac_ocp_write(tp, 0xFC38, 0x0001);
-}
-
-static void
-rtl8168_hw_mac_mcu_config(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (tp->NotWrMcuPatchCode == TRUE) return;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-                rtl8168_set_mac_mcu_8168g_1(dev);
-                break;
-        case CFG_METHOD_24:
-                rtl8168_set_mac_mcu_8168gu_1(dev);
-                break;
-        case CFG_METHOD_25:
-                rtl8168_set_mac_mcu_8168gu_2(dev);
-                break;
-        case CFG_METHOD_26:
-                rtl8168_set_mac_mcu_8411b_1(dev);
-                break;
-        case CFG_METHOD_27:
-                rtl8168_set_mac_mcu_8168ep_1(dev);
-                break;
-        case CFG_METHOD_28:
-                rtl8168_set_mac_mcu_8168ep_2(dev);
-                break;
-        case CFG_METHOD_29:
-                rtl8168_set_mac_mcu_8168h_1(dev);
-                break;
-        case CFG_METHOD_30:
-                rtl8168_set_mac_mcu_8168h_2(dev);
-                break;
-        case CFG_METHOD_31:
-                rtl8168_set_mac_mcu_8168fp_1(dev);
-                break;
-        case CFG_METHOD_32:
-                rtl8168_set_mac_mcu_8168fp_2(dev);
-                break;
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                rtl8168_set_mac_mcu_8168fp_3(dev);
-                break;
-        case CFG_METHOD_35:
-                rtl8168_set_mac_mcu_8168h_3(dev);
-                break;
-        }
-}
-#endif
-
-#ifdef ENABLE_USE_FIRMWARE_FILE
-static void rtl8168_release_firmware(struct rtl8168_private *tp)
-{
-        if (tp->rtl_fw) {
-                rtl8168_fw_release_firmware(tp->rtl_fw);
-                kfree(tp->rtl_fw);
-                tp->rtl_fw = NULL;
-        }
-}
-
-void rtl8168_apply_firmware(struct rtl8168_private *tp)
-{
-        /* TODO: release firmware if rtl_fw_write_firmware signals failure. */
-        if (tp->rtl_fw) {
-                rtl8168_fw_write_firmware(tp, tp->rtl_fw);
-                /* At least one firmware doesn't reset tp->ocp_base. */
-                tp->ocp_base = OCP_STD_PHY_BASE;
-
-                /* PHY soft reset may still be in progress */
-                //phy_read_poll_timeout(tp->phydev, MII_BMCR, val,
-                //		      !(val & BMCR_RESET),
-                //		      50000, 600000, true);
-                rtl8168_wait_phy_reset_complete(tp);
-
-                tp->hw_ram_code_ver = rtl8168_get_hw_phy_mcu_code_ver(tp);
-                tp->sw_ram_code_ver = tp->hw_ram_code_ver;
-                tp->HwHasWrRamCodeToMicroP = TRUE;
-        }
-}
-#endif
-
-static void
-rtl8168_hw_init(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u32 csi_tmp;
-
-        if (tp->HwSuppAspmClkIntrLock) {
-                RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) & ~BIT_7);
-                rtl8168_enable_cfg9346_write(tp);
-                rtl8168_hw_aspm_clkreq_enable(tp, false);
-                rtl8168_disable_cfg9346_write(tp);
-        }
-
-        //Disable UPS
-        if (HW_SUPPORT_UPS_MODE(tp))
-                rtl8168_mac_ocp_write(tp, 0xD400, rtl8168_mac_ocp_read( tp, 0xD400) & ~(BIT_0));
-
-        //Disable DMA Aggregation
-        switch (tp->mcfg) {
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_mac_ocp_write(tp, 0xE63E, rtl8168_mac_ocp_read( tp, 0xE63E) & ~(BIT_3 | BIT_2 | BIT_1));
-                rtl8168_mac_ocp_write(tp, 0xE63E, rtl8168_mac_ocp_read( tp, 0xE63E) | (BIT_0));
-                rtl8168_mac_ocp_write(tp, 0xE63E, rtl8168_mac_ocp_read( tp, 0xE63E) & ~(BIT_0));
-                rtl8168_mac_ocp_write(tp, 0xC094, 0x0);
-                rtl8168_mac_ocp_write(tp, 0xC09E, 0x0);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_9:
-        case CFG_METHOD_10:
-                RTL_W8(tp, DBG_reg, RTL_R8(tp, DBG_reg) | BIT_1 | BIT_7);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-                RTL_W8(tp, 0xF2, (RTL_R8(tp, 0xF2) & ~(BIT_2 | BIT_1 | BIT_0)));
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-                if (aspm) {
-                        RTL_W8(tp, 0x6E, RTL_R8(tp, 0x6E) | BIT_6);
-                        rtl8168_eri_write(tp, 0x1AE, 2, 0x0403, ERIAR_ExGMAC);
-                }
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_35:
-                if (aspm) {
-                        if ((rtl8168_mac_ocp_read(tp, 0xDC00) & BIT_3) || (RTL_R8(tp, Config0) & 0x07)) {
-                                RTL_W8(tp, 0x6E, RTL_R8(tp, 0x6E) | BIT_6);
-                                rtl8168_eri_write(tp, 0x1AE, 2, 0x0403, ERIAR_ExGMAC);
-                        }
-                }
-                break;
-        }
-
-        if (tp->mcfg == CFG_METHOD_10 || tp->mcfg == CFG_METHOD_14 || tp->mcfg == CFG_METHOD_15)
-                RTL_W8(tp, 0xF3, RTL_R8(tp, 0xF3) | BIT_2);
-
-#ifndef ENABLE_USE_FIRMWARE_FILE
-        if (!tp->rtl_fw)
-                rtl8168_hw_mac_mcu_config(dev);
-#endif
-
-        /*disable ocp phy power saving*/
-        if (tp->mcfg == CFG_METHOD_25 || tp->mcfg == CFG_METHOD_26 ||
-            tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28 ||
-            tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-            tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-            tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34 ||
-            tp->mcfg == CFG_METHOD_35)
-                if (!tp->dash_printer_enabled)
-                        rtl8168_disable_ocp_phy_power_saving(dev);
-
-        //Set PCIE uncorrectable error status mask pcie 0x108
-        csi_tmp = rtl8168_csi_read(tp, 0x108);
-        csi_tmp |= BIT_20;
-        rtl8168_csi_write(tp, 0x108, csi_tmp);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-                csi_tmp = rtl8168_eri_read(tp, 0x1AB, 1, ERIAR_ExGMAC);
-                csi_tmp |= ( BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7 );
-                rtl8168_eri_write(tp, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-
-        rtl8168_set_pci_pme(tp, 0);
-
-        if (s0_magic_packet == 1)
-                rtl8168_enable_magic_packet(dev);
-
-#ifdef ENABLE_USE_FIRMWARE_FILE
-        if (tp->rtl_fw &&
-            !(HW_DASH_SUPPORT_TYPE_3(tp) &&
-              tp->HwPkgDet == 0x06))
-                rtl8168_apply_firmware(tp);
-#endif
-}
-
-static void
-rtl8168_hw_ephy_config(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 ephy_data;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_4:
-                /*Set EPHY registers    begin*/
-                /*Set EPHY register offset 0x02 bit 11 to 0 and bit 12 to 1*/
-                ephy_data = rtl8168_ephy_read(tp, 0x02);
-                ephy_data &= ~BIT_11;
-                ephy_data |= BIT_12;
-                rtl8168_ephy_write(tp, 0x02, ephy_data);
-
-                /*Set EPHY register offset 0x03 bit 1 to 1*/
-                ephy_data = rtl8168_ephy_read(tp, 0x03);
-                ephy_data |= (1 << 1);
-                rtl8168_ephy_write(tp, 0x03, ephy_data);
-
-                /*Set EPHY register offset 0x06 bit 7 to 0*/
-                ephy_data = rtl8168_ephy_read(tp, 0x06);
-                ephy_data &= ~(1 << 7);
-                rtl8168_ephy_write(tp, 0x06, ephy_data);
-                /*Set EPHY registers    end*/
-
-                break;
-        case CFG_METHOD_5:
-                /* set EPHY registers */
-                SetPCIePhyBit(tp, 0x01, BIT_0);
-
-                ClearAndSetPCIePhyBit(tp,
-                                      0x03,
-                                      BIT_10,
-                                      BIT_5
-                                     );
-
-                break;
-        case CFG_METHOD_9:
-                /* set EPHY registers */
-                rtl8168_ephy_write(tp, 0x01, 0x7C7F);
-                rtl8168_ephy_write(tp, 0x02, 0x011F);
-                if (tp->eeprom_type != EEPROM_TYPE_NONE) {
-                        ClearAndSetPCIePhyBit(tp,
-                                              0x03,
-                                              0xFFB0,
-                                              0x05B0
-                                             );
-                } else {
-                        ClearAndSetPCIePhyBit(tp,
-                                              0x03,
-                                              0xFFF0,
-                                              0x05F0
-                                             );
-                }
-                rtl8168_ephy_write(tp, 0x06, 0xB271);
-                rtl8168_ephy_write(tp, 0x07, 0xCE00);
-
-                break;
-        case CFG_METHOD_10:
-                /* set EPHY registers */
-                rtl8168_ephy_write(tp, 0x01, 0x6C7F);
-                rtl8168_ephy_write(tp, 0x02, 0x011F);
-                ClearAndSetPCIePhyBit(tp,
-                                      0x03,
-                                      0xFFF0,
-                                      0x01B0
-                                     );
-                rtl8168_ephy_write(tp, 0x1A, 0x0546);
-                rtl8168_ephy_write(tp, 0x1C, 0x80C4);
-                rtl8168_ephy_write(tp, 0x1D, 0x78E5);
-                rtl8168_ephy_write(tp, 0x0A, 0x8100);
-
-                break;
-        case CFG_METHOD_12:
-        case CFG_METHOD_13:
-                ephy_data = rtl8168_ephy_read(tp, 0x0B);
-                rtl8168_ephy_write(tp, 0x0B, ephy_data|0x48);
-                ephy_data = rtl8168_ephy_read(tp, 0x19);
-                ephy_data &= ~0x20;
-                rtl8168_ephy_write(tp, 0x19, ephy_data|0x50);
-                ephy_data = rtl8168_ephy_read(tp, 0x0C);
-                ephy_data &= ~0x100;
-                rtl8168_ephy_write(tp, 0x0C, ephy_data|0x20);
-                ephy_data = rtl8168_ephy_read(tp, 0x10);
-                ephy_data &= ~0x04;
-                rtl8168_ephy_write(tp, 0x10, ephy_data);
-
-                break;
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-                /* set EPHY registers */
-                ephy_data = rtl8168_ephy_read(tp, 0x00) & ~0x0200;
-                ephy_data |= 0x0100;
-                rtl8168_ephy_write(tp, 0x00, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x00);
-                ephy_data |= 0x0004;
-                rtl8168_ephy_write(tp, 0x00, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x06) & ~0x0002;
-                ephy_data |= 0x0001;
-                rtl8168_ephy_write(tp, 0x06, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x06);
-                ephy_data |= 0x0030;
-                rtl8168_ephy_write(tp, 0x06, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x07);
-                ephy_data |= 0x2000;
-                rtl8168_ephy_write(tp, 0x07, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x00);
-                ephy_data |= 0x0020;
-                rtl8168_ephy_write(tp, 0x00, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x03) & ~0x5800;
-                ephy_data |= 0x2000;
-                rtl8168_ephy_write(tp, 0x03, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x03);
-                ephy_data |= 0x0001;
-                rtl8168_ephy_write(tp, 0x03, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x01) & ~0x0800;
-                ephy_data |= 0x1000;
-                rtl8168_ephy_write(tp, 0x01, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x07);
-                ephy_data |= 0x4000;
-                rtl8168_ephy_write(tp, 0x07, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x1E);
-                ephy_data |= 0x2000;
-                rtl8168_ephy_write(tp, 0x1E, ephy_data);
-
-                rtl8168_ephy_write(tp, 0x19, 0xFE6C);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x0A);
-                ephy_data |= 0x0040;
-                rtl8168_ephy_write(tp, 0x0A, ephy_data);
-
-                break;
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-                if (tp->mcfg == CFG_METHOD_16) {
-                        rtl8168_ephy_write(tp, 0x06, 0xF020);
-                        rtl8168_ephy_write(tp, 0x07, 0x01FF);
-                        rtl8168_ephy_write(tp, 0x00, 0x5027);
-                        rtl8168_ephy_write(tp, 0x01, 0x0003);
-                        rtl8168_ephy_write(tp, 0x02, 0x2D16);
-                        rtl8168_ephy_write(tp, 0x03, 0x6D49);
-                        rtl8168_ephy_write(tp, 0x08, 0x0006);
-                        rtl8168_ephy_write(tp, 0x0A, 0x00C8);
-                }
-
-                ephy_data = rtl8168_ephy_read(tp, 0x09);
-                ephy_data |= BIT_7;
-                rtl8168_ephy_write(tp, 0x09, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x19);
-                ephy_data |= (BIT_2 | BIT_5 | BIT_9);
-                rtl8168_ephy_write(tp, 0x19, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x00);
-                ephy_data |= BIT_3;
-                rtl8168_ephy_write(tp, 0x00, ephy_data);
-                ephy_data = rtl8168_ephy_read(tp, 0x0C);
-                ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
-                ephy_data |= BIT_9;
-                rtl8168_ephy_write(tp, 0x0C, ephy_data);
-
-                break;
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-                if (tp->mcfg == CFG_METHOD_18) {
-                        ephy_data = rtl8168_ephy_read(tp, 0x06);
-                        ephy_data |= BIT_5;
-                        ephy_data &= ~(BIT_7 | BIT_6);
-                        rtl8168_ephy_write(tp, 0x06, ephy_data);
-
-                        ephy_data = rtl8168_ephy_read(tp, 0x08);
-                        ephy_data |= BIT_1;
-                        ephy_data &= ~BIT_0;
-                        rtl8168_ephy_write(tp, 0x08, ephy_data);
-                }
-
-                ephy_data = rtl8168_ephy_read(tp, 0x09);
-                ephy_data |= BIT_7;
-                rtl8168_ephy_write(tp, 0x09, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x19);
-                ephy_data |= (BIT_2 | BIT_5 | BIT_9);
-                rtl8168_ephy_write(tp, 0x19, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x00);
-                ephy_data |= BIT_3;
-                rtl8168_ephy_write(tp, 0x00, ephy_data);
-                ephy_data = rtl8168_ephy_read(tp, 0x0C);
-                ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
-                ephy_data |= BIT_9;
-                rtl8168_ephy_write(tp, 0x0C, ephy_data);
-
-                break;
-        case CFG_METHOD_20:
-                ephy_data = rtl8168_ephy_read(tp, 0x06);
-                ephy_data |= BIT_5;
-                ephy_data &= ~(BIT_7 | BIT_6);
-                rtl8168_ephy_write(tp, 0x06, ephy_data);
-
-                rtl8168_ephy_write(tp, 0x0f, 0x5200);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x19);
-                ephy_data |= (BIT_2 | BIT_5 | BIT_9);
-                rtl8168_ephy_write(tp, 0x19, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x00);
-                ephy_data |= BIT_3;
-                rtl8168_ephy_write(tp, 0x00, ephy_data);
-                ephy_data = rtl8168_ephy_read(tp, 0x0C);
-                ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
-                ephy_data |= BIT_9;
-                rtl8168_ephy_write(tp, 0x0C, ephy_data);
-
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-
-                ephy_data = rtl8168_ephy_read(tp, 0x00);
-                ephy_data &= ~(BIT_3);
-                rtl8168_ephy_write(tp, 0x00, ephy_data);
-                ephy_data = rtl8168_ephy_read(tp, 0x0C);
-                ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
-                ephy_data |= (BIT_5 | BIT_11);
-                rtl8168_ephy_write(tp, 0x0C, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x1E);
-                ephy_data |= (BIT_0);
-                rtl8168_ephy_write(tp, 0x1E, ephy_data);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x19);
-                ephy_data &= ~(BIT_15);
-                rtl8168_ephy_write(tp, 0x19, ephy_data);
-
-                break;
-        case CFG_METHOD_25:
-                ephy_data = rtl8168_ephy_read(tp, 0x00);
-                ephy_data &= ~BIT_3;
-                rtl8168_ephy_write(tp, 0x00, ephy_data);
-                ephy_data = rtl8168_ephy_read(tp, 0x0C);
-                ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10| BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
-                ephy_data |= (BIT_5 | BIT_11);
-                rtl8168_ephy_write(tp, 0x0C, ephy_data);
-
-                rtl8168_ephy_write(tp, 0x19, 0x7C00);
-                rtl8168_ephy_write(tp, 0x1E, 0x20EB);
-                rtl8168_ephy_write(tp, 0x0D, 0x1666);
-                rtl8168_ephy_write(tp, 0x00, 0x10A3);
-                rtl8168_ephy_write(tp, 0x06, 0xF050);
-
-                SetPCIePhyBit(tp, 0x04, BIT_4);
-                ClearPCIePhyBit(tp, 0x1D, BIT_14);
-
-                break;
-        case CFG_METHOD_26:
-                ClearPCIePhyBit(tp, 0x00, BIT_3);
-                ClearAndSetPCIePhyBit( tp,
-                                       0x0C,
-                                       (BIT_13 | BIT_12 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_4),
-                                       (BIT_5 | BIT_11)
-                                     );
-                SetPCIePhyBit(tp, 0x1E, BIT_0);
-                ClearPCIePhyBit(tp, 0x19, BIT_15);
-
-                ClearPCIePhyBit(tp, 0x19, (BIT_5 | BIT_0));
-
-                SetPCIePhyBit(tp, 0x1E, BIT_13);
-                ClearPCIePhyBit(tp, 0x0D, BIT_8);
-                SetPCIePhyBit(tp, 0x0D, BIT_9);
-                SetPCIePhyBit(tp, 0x00, BIT_7);
-
-                SetPCIePhyBit(tp, 0x06, BIT_4);
-
-                SetPCIePhyBit(tp, 0x04, BIT_4);
-                SetPCIePhyBit(tp, 0x1D, BIT_14);
-
-                break;
-        case CFG_METHOD_23:
-                rtl8168_ephy_write(tp, 0x00, 0x10AB);
-                rtl8168_ephy_write(tp, 0x06, 0xf030);
-                rtl8168_ephy_write(tp, 0x08, 0x2006);
-                rtl8168_ephy_write(tp, 0x0D, 0x1666);
-
-                ephy_data = rtl8168_ephy_read(tp, 0x0C);
-                ephy_data &= ~(BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4);
-                rtl8168_ephy_write(tp, 0x0C, ephy_data);
-
-                break;
-        case CFG_METHOD_27:
-                rtl8168_ephy_write(tp, 0x00, 0x10A3);
-                rtl8168_ephy_write(tp, 0x19, 0xFC00);
-                rtl8168_ephy_write(tp, 0x1E, 0x20EA);
-
-                break;
-        case CFG_METHOD_28:
-                rtl8168_ephy_write(tp, 0x00, 0x10AB);
-                rtl8168_ephy_write(tp, 0x19, 0xFC00);
-                rtl8168_ephy_write(tp, 0x1E, 0x20EB);
-                rtl8168_ephy_write(tp, 0x0D, 0x1666);
-                ClearPCIePhyBit(tp, 0x0B, BIT_0);
-                SetPCIePhyBit(tp, 0x1D, BIT_14);
-                ClearAndSetPCIePhyBit(tp,
-                                      0x0C,
-                                      BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_8 | BIT_7 | BIT_6 | BIT_5,
-                                      BIT_9 | BIT_4
-                                     );
-
-                break;
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-                ClearPCIePhyBit(tp, 0x1E, BIT_11);
-
-                SetPCIePhyBit(tp, 0x1E, BIT_0);
-                SetPCIePhyBit(tp, 0x1D, BIT_11);
-
-                rtl8168_ephy_write(tp, 0x05, 0x2089);
-                rtl8168_ephy_write(tp, 0x06, 0x5881);
-
-                rtl8168_ephy_write(tp, 0x04, 0x854A);
-                rtl8168_ephy_write(tp, 0x01, 0x068B);
-
-                break;
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                ClearAndSetPCIePhyBit(tp,
-                                      0x19,
-                                      BIT_6,
-                                      (BIT_12| BIT_8)
-                                     );
-                ClearAndSetPCIePhyBit(tp,
-                                      0x59,
-                                      BIT_6,
-                                      (BIT_12| BIT_8)
-                                     );
-
-                ClearPCIePhyBit(tp, 0x0C, BIT_4);
-                ClearPCIePhyBit(tp, 0x4C, BIT_4);
-                ClearPCIePhyBit(tp, 0x0B, BIT_0);
-
-                break;
-        case CFG_METHOD_35:
-                rtl8168_clear_mcu_ocp_bit(tp, 0xDE28, (BIT_1 | BIT_0));
-
-                rtl8168_set_mcu_ocp_bit(tp, 0xDE38, (BIT_2));
-
-                break;
-        }
-}
-
-static int
-rtl8168_set_phy_mcu_patch_request(struct rtl8168_private *tp)
-{
-        u16 PhyRegValue;
-        u32 WaitCnt;
-        int retval = TRUE;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21 ... CFG_METHOD_35:
-                rtl8168_mdio_write(tp,0x1f, 0x0B82);
-                rtl8168_set_eth_phy_bit(tp, 0x10, BIT_4);
-
-                rtl8168_mdio_write(tp,0x1f, 0x0B80);
-                WaitCnt = 0;
-                do {
-                        PhyRegValue = rtl8168_mdio_read(tp, 0x10);
-                        udelay(100);
-                        WaitCnt++;
-                }  while (!(PhyRegValue & BIT_6) && (WaitCnt < 1000));
-
-                if (!(PhyRegValue & BIT_6) && (WaitCnt == 1000)) retval = FALSE;
-
-                rtl8168_mdio_write(tp,0x1f, 0x0000);
-                break;
-        }
-
-        return retval;
-}
-
-static int
-rtl8168_clear_phy_mcu_patch_request(struct rtl8168_private *tp)
-{
-        u16 PhyRegValue;
-        u32 WaitCnt;
-        int retval = TRUE;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21 ... CFG_METHOD_35:
-                rtl8168_mdio_write(tp, 0x1f, 0x0B82);
-                rtl8168_clear_eth_phy_bit(tp, 0x10, BIT_4);
-
-                rtl8168_mdio_write(tp,0x1f, 0x0B80);
-                WaitCnt = 0;
-                do {
-                        PhyRegValue = rtl8168_mdio_read(tp, 0x10);
-                        udelay(100);
-                        WaitCnt++;
-                } while ((PhyRegValue & BIT_6) && (WaitCnt < 1000));
-
-                if ((PhyRegValue & BIT_6) && (WaitCnt == 1000)) retval = FALSE;
-
-                rtl8168_mdio_write(tp,0x1f, 0x0000);
-                break;
-        }
-
-        return retval;
-}
-
-static u16
-rtl8168_get_hw_phy_mcu_code_ver(struct rtl8168_private *tp)
-{
-        u16 hw_ram_code_ver = ~0;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B60);
-                hw_ram_code_ver = rtl8168_mdio_read(tp, 0x06);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B30);
-                hw_ram_code_ver = rtl8168_mdio_read(tp, 0x06);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x801E);
-                hw_ram_code_ver = rtl8168_mdio_read(tp, 0x14);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                break;
-        default:
-                tp->hw_ram_code_ver = ~0;
-                break;
-        }
-
-        return hw_ram_code_ver;
-}
-
-#ifndef ENABLE_USE_FIRMWARE_FILE
-static void
-rtl8168_enable_phy_disable_mode(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        switch (tp->HwSuppCheckPhyDisableModeVer) {
-        case 1:
-                rtl8168_mac_ocp_write(tp, 0xDC20, rtl8168_mac_ocp_read(tp, 0xDC20) | BIT_1);
-                break;
-        case 2:
-        case 3:
-                RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_5);
-                break;
-        }
-
-        dprintk("enable phy disable mode.\n");
-}
-
-static void
-rtl8168_disable_phy_disable_mode(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        switch (tp->HwSuppCheckPhyDisableModeVer) {
-        case 1:
-                rtl8168_mac_ocp_write(tp, 0xDC20, rtl8168_mac_ocp_read(tp, 0xDC20) & ~BIT_1);
-                break;
-        case 2:
-        case 3:
-                RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_5);
-                break;
-        }
-
-        mdelay(1);
-
-        dprintk("disable phy disable mode.\n");
-}
-
-static int
-rtl8168_check_hw_phy_mcu_code_ver(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int ram_code_ver_match = 0;
-
-        tp->hw_ram_code_ver = rtl8168_get_hw_phy_mcu_code_ver(tp);
-
-        if ( tp->hw_ram_code_ver == tp->sw_ram_code_ver) {
-                ram_code_ver_match = 1;
-                tp->HwHasWrRamCodeToMicroP = TRUE;
-        }
-
-        return ram_code_ver_match;
-}
-
-static void
-rtl8168_write_hw_phy_mcu_code_ver(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B60);
-                rtl8168_mdio_write(tp, 0x06, tp->sw_ram_code_ver);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                tp->hw_ram_code_ver = tp->sw_ram_code_ver;
-                break;
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B30);
-                rtl8168_mdio_write(tp, 0x06, tp->sw_ram_code_ver);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                tp->hw_ram_code_ver = tp->sw_ram_code_ver;
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x801E);
-                rtl8168_mdio_write(tp, 0x14, tp->sw_ram_code_ver);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                tp->hw_ram_code_ver = tp->sw_ram_code_ver;
-                break;
-        }
-}
-static int
-rtl8168_phy_ram_code_check(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 PhyRegValue;
-        int retval = TRUE;
-
-        switch(tp->mcfg) {
-        case CFG_METHOD_21:
-                rtl8168_mdio_write(tp, 0x1f, 0x0A40);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x10);
-                PhyRegValue &= ~(BIT_11);
-                rtl8168_mdio_write(tp, 0x10, PhyRegValue);
-
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A00);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x10);
-                PhyRegValue &= ~(BIT_12 | BIT_13 | BIT_14 | BIT_15);
-                rtl8168_mdio_write(tp, 0x10, PhyRegValue);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8010);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x14);
-                PhyRegValue &= ~(BIT_11);
-                rtl8168_mdio_write(tp, 0x14, PhyRegValue);
-
-                retval = rtl8168_set_phy_mcu_patch_request(tp);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A40);
-                rtl8168_mdio_write(tp, 0x10, 0x0140);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A4A);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x13);
-                PhyRegValue &= ~(BIT_6);
-                PhyRegValue |= (BIT_7);
-                rtl8168_mdio_write(tp, 0x13, PhyRegValue);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A44);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x14);
-                PhyRegValue |= (BIT_2);
-                rtl8168_mdio_write(tp, 0x14, PhyRegValue);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A50);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x11);
-                PhyRegValue |= (BIT_11|BIT_12);
-                rtl8168_mdio_write(tp, 0x11, PhyRegValue);
-
-                retval = rtl8168_clear_phy_mcu_patch_request(tp);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A40);
-                rtl8168_mdio_write(tp, 0x10, 0x1040);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A4A);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x13);
-                PhyRegValue &= ~(BIT_6|BIT_7);
-                rtl8168_mdio_write(tp, 0x13, PhyRegValue);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A44);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x14);
-                PhyRegValue &= ~(BIT_2);
-                rtl8168_mdio_write(tp, 0x14, PhyRegValue);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A50);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x11);
-                PhyRegValue &= ~(BIT_11|BIT_12);
-                rtl8168_mdio_write(tp, 0x11, PhyRegValue);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8010);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x14);
-                PhyRegValue |= (BIT_11);
-                rtl8168_mdio_write(tp, 0x14, PhyRegValue);
-
-                retval = rtl8168_set_phy_mcu_patch_request(tp);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0A20);
-                PhyRegValue = rtl8168_mdio_read(tp, 0x13);
-                if (PhyRegValue & BIT_11) {
-                        if (PhyRegValue & BIT_10) {
-                                retval = FALSE;
-                        }
-                }
-
-                retval = rtl8168_clear_phy_mcu_patch_request(tp);
-
-                mdelay(2);
-                break;
-        default:
-                break;
-        }
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        return retval;
-}
-
-static void
-rtl8168_set_phy_ram_code_check_fail_flag(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u16 TmpUshort;
-
-        switch(tp->mcfg) {
-        case CFG_METHOD_21:
-                TmpUshort = rtl8168_mac_ocp_read(tp, 0xD3C0);
-                TmpUshort |= BIT_0;
-                rtl8168_mac_ocp_write(tp, 0xD3C0, TmpUshort);
-                break;
-        }
-}
-
-static void
-rtl8168_set_phy_mcu_8168e_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val,i;
-
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x00, 0x1800);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        rtl8168_mdio_write(tp, 0x17, 0x0117);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1E, 0x002C);
-        rtl8168_mdio_write(tp, 0x1B, 0x5000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x16, 0x4104);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x1E);
-                gphy_val &= 0x03FF;
-                if (gphy_val == 0x000C)
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x07);
-                if ((gphy_val & BIT_5) == 0)
-                        break;
-        }
-        gphy_val = rtl8168_mdio_read(tp, 0x07);
-        if (gphy_val & BIT_5) {
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x00a1);
-                rtl8168_mdio_write(tp, 0x17, 0x1000);
-                rtl8168_mdio_write(tp, 0x17, 0x0000);
-                rtl8168_mdio_write(tp, 0x17, 0x2000);
-                rtl8168_mdio_write(tp, 0x1e, 0x002f);
-                rtl8168_mdio_write(tp, 0x18, 0x9bfb);
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x07, 0x0000);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        gphy_val = rtl8168_mdio_read(tp, 0x00);
-        gphy_val &= ~(BIT_7);
-        rtl8168_mdio_write(tp, 0x00, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0002);
-        gphy_val = rtl8168_mdio_read(tp, 0x08);
-        gphy_val &= ~(BIT_7);
-        rtl8168_mdio_write(tp, 0x08, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0307);
-        rtl8168_mdio_write(tp, 0x15, 0x000e);
-        rtl8168_mdio_write(tp, 0x19, 0x000a);
-        rtl8168_mdio_write(tp, 0x15, 0x0010);
-        rtl8168_mdio_write(tp, 0x19, 0x0008);
-        rtl8168_mdio_write(tp, 0x15, 0x0018);
-        rtl8168_mdio_write(tp, 0x19, 0x4801);
-        rtl8168_mdio_write(tp, 0x15, 0x0019);
-        rtl8168_mdio_write(tp, 0x19, 0x6801);
-        rtl8168_mdio_write(tp, 0x15, 0x001a);
-        rtl8168_mdio_write(tp, 0x19, 0x66a1);
-        rtl8168_mdio_write(tp, 0x15, 0x001f);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0020);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0021);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0022);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0023);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0024);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0025);
-        rtl8168_mdio_write(tp, 0x19, 0x64a1);
-        rtl8168_mdio_write(tp, 0x15, 0x0026);
-        rtl8168_mdio_write(tp, 0x19, 0x40ea);
-        rtl8168_mdio_write(tp, 0x15, 0x0027);
-        rtl8168_mdio_write(tp, 0x19, 0x4503);
-        rtl8168_mdio_write(tp, 0x15, 0x0028);
-        rtl8168_mdio_write(tp, 0x19, 0x9f00);
-        rtl8168_mdio_write(tp, 0x15, 0x0029);
-        rtl8168_mdio_write(tp, 0x19, 0xa631);
-        rtl8168_mdio_write(tp, 0x15, 0x002a);
-        rtl8168_mdio_write(tp, 0x19, 0x9717);
-        rtl8168_mdio_write(tp, 0x15, 0x002b);
-        rtl8168_mdio_write(tp, 0x19, 0x302c);
-        rtl8168_mdio_write(tp, 0x15, 0x002c);
-        rtl8168_mdio_write(tp, 0x19, 0x4802);
-        rtl8168_mdio_write(tp, 0x15, 0x002d);
-        rtl8168_mdio_write(tp, 0x19, 0x58da);
-        rtl8168_mdio_write(tp, 0x15, 0x002e);
-        rtl8168_mdio_write(tp, 0x19, 0x400d);
-        rtl8168_mdio_write(tp, 0x15, 0x002f);
-        rtl8168_mdio_write(tp, 0x19, 0x4488);
-        rtl8168_mdio_write(tp, 0x15, 0x0030);
-        rtl8168_mdio_write(tp, 0x19, 0x9e00);
-        rtl8168_mdio_write(tp, 0x15, 0x0031);
-        rtl8168_mdio_write(tp, 0x19, 0x63c8);
-        rtl8168_mdio_write(tp, 0x15, 0x0032);
-        rtl8168_mdio_write(tp, 0x19, 0x6481);
-        rtl8168_mdio_write(tp, 0x15, 0x0033);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0034);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0035);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0036);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0037);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0038);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0039);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x003a);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x003b);
-        rtl8168_mdio_write(tp, 0x19, 0x63e8);
-        rtl8168_mdio_write(tp, 0x15, 0x003c);
-        rtl8168_mdio_write(tp, 0x19, 0x7d00);
-        rtl8168_mdio_write(tp, 0x15, 0x003d);
-        rtl8168_mdio_write(tp, 0x19, 0x59d4);
-        rtl8168_mdio_write(tp, 0x15, 0x003e);
-        rtl8168_mdio_write(tp, 0x19, 0x63f8);
-        rtl8168_mdio_write(tp, 0x15, 0x0040);
-        rtl8168_mdio_write(tp, 0x19, 0x64a1);
-        rtl8168_mdio_write(tp, 0x15, 0x0041);
-        rtl8168_mdio_write(tp, 0x19, 0x30de);
-        rtl8168_mdio_write(tp, 0x15, 0x0044);
-        rtl8168_mdio_write(tp, 0x19, 0x480f);
-        rtl8168_mdio_write(tp, 0x15, 0x0045);
-        rtl8168_mdio_write(tp, 0x19, 0x6800);
-        rtl8168_mdio_write(tp, 0x15, 0x0046);
-        rtl8168_mdio_write(tp, 0x19, 0x6680);
-        rtl8168_mdio_write(tp, 0x15, 0x0047);
-        rtl8168_mdio_write(tp, 0x19, 0x7c10);
-        rtl8168_mdio_write(tp, 0x15, 0x0048);
-        rtl8168_mdio_write(tp, 0x19, 0x63c8);
-        rtl8168_mdio_write(tp, 0x15, 0x0049);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x004a);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x004b);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x004c);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x004d);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x004e);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x004f);
-        rtl8168_mdio_write(tp, 0x19, 0x40ea);
-        rtl8168_mdio_write(tp, 0x15, 0x0050);
-        rtl8168_mdio_write(tp, 0x19, 0x4503);
-        rtl8168_mdio_write(tp, 0x15, 0x0051);
-        rtl8168_mdio_write(tp, 0x19, 0x58ca);
-        rtl8168_mdio_write(tp, 0x15, 0x0052);
-        rtl8168_mdio_write(tp, 0x19, 0x63c8);
-        rtl8168_mdio_write(tp, 0x15, 0x0053);
-        rtl8168_mdio_write(tp, 0x19, 0x63d8);
-        rtl8168_mdio_write(tp, 0x15, 0x0054);
-        rtl8168_mdio_write(tp, 0x19, 0x66a0);
-        rtl8168_mdio_write(tp, 0x15, 0x0055);
-        rtl8168_mdio_write(tp, 0x19, 0x9f00);
-        rtl8168_mdio_write(tp, 0x15, 0x0056);
-        rtl8168_mdio_write(tp, 0x19, 0x3000);
-        rtl8168_mdio_write(tp, 0x15, 0x006E);
-        rtl8168_mdio_write(tp, 0x19, 0x9afa);
-        rtl8168_mdio_write(tp, 0x15, 0x00a1);
-        rtl8168_mdio_write(tp, 0x19, 0x3044);
-        rtl8168_mdio_write(tp, 0x15, 0x00ab);
-        rtl8168_mdio_write(tp, 0x19, 0x5820);
-        rtl8168_mdio_write(tp, 0x15, 0x00ac);
-        rtl8168_mdio_write(tp, 0x19, 0x5e04);
-        rtl8168_mdio_write(tp, 0x15, 0x00ad);
-        rtl8168_mdio_write(tp, 0x19, 0xb60c);
-        rtl8168_mdio_write(tp, 0x15, 0x00af);
-        rtl8168_mdio_write(tp, 0x19, 0x000a);
-        rtl8168_mdio_write(tp, 0x15, 0x00b2);
-        rtl8168_mdio_write(tp, 0x19, 0x30b9);
-        rtl8168_mdio_write(tp, 0x15, 0x00b9);
-        rtl8168_mdio_write(tp, 0x19, 0x4408);
-        rtl8168_mdio_write(tp, 0x15, 0x00ba);
-        rtl8168_mdio_write(tp, 0x19, 0x480b);
-        rtl8168_mdio_write(tp, 0x15, 0x00bb);
-        rtl8168_mdio_write(tp, 0x19, 0x5e00);
-        rtl8168_mdio_write(tp, 0x15, 0x00bc);
-        rtl8168_mdio_write(tp, 0x19, 0x405f);
-        rtl8168_mdio_write(tp, 0x15, 0x00bd);
-        rtl8168_mdio_write(tp, 0x19, 0x4448);
-        rtl8168_mdio_write(tp, 0x15, 0x00be);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x00bf);
-        rtl8168_mdio_write(tp, 0x19, 0x4468);
-        rtl8168_mdio_write(tp, 0x15, 0x00c0);
-        rtl8168_mdio_write(tp, 0x19, 0x9c02);
-        rtl8168_mdio_write(tp, 0x15, 0x00c1);
-        rtl8168_mdio_write(tp, 0x19, 0x58a0);
-        rtl8168_mdio_write(tp, 0x15, 0x00c2);
-        rtl8168_mdio_write(tp, 0x19, 0xb605);
-        rtl8168_mdio_write(tp, 0x15, 0x00c3);
-        rtl8168_mdio_write(tp, 0x19, 0xc0d3);
-        rtl8168_mdio_write(tp, 0x15, 0x00c4);
-        rtl8168_mdio_write(tp, 0x19, 0x00e6);
-        rtl8168_mdio_write(tp, 0x15, 0x00c5);
-        rtl8168_mdio_write(tp, 0x19, 0xdaec);
-        rtl8168_mdio_write(tp, 0x15, 0x00c6);
-        rtl8168_mdio_write(tp, 0x19, 0x00fa);
-        rtl8168_mdio_write(tp, 0x15, 0x00c7);
-        rtl8168_mdio_write(tp, 0x19, 0x9df9);
-        rtl8168_mdio_write(tp, 0x15, 0x00c8);
-        rtl8168_mdio_write(tp, 0x19, 0x307a);
-        rtl8168_mdio_write(tp, 0x15, 0x0112);
-        rtl8168_mdio_write(tp, 0x19, 0x6421);
-        rtl8168_mdio_write(tp, 0x15, 0x0113);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0114);
-        rtl8168_mdio_write(tp, 0x19, 0x63f0);
-        rtl8168_mdio_write(tp, 0x15, 0x0115);
-        rtl8168_mdio_write(tp, 0x19, 0x4003);
-        rtl8168_mdio_write(tp, 0x15, 0x0116);
-        rtl8168_mdio_write(tp, 0x19, 0x4418);
-        rtl8168_mdio_write(tp, 0x15, 0x0117);
-        rtl8168_mdio_write(tp, 0x19, 0x9b00);
-        rtl8168_mdio_write(tp, 0x15, 0x0118);
-        rtl8168_mdio_write(tp, 0x19, 0x6461);
-        rtl8168_mdio_write(tp, 0x15, 0x0119);
-        rtl8168_mdio_write(tp, 0x19, 0x64e1);
-        rtl8168_mdio_write(tp, 0x15, 0x011a);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0150);
-        rtl8168_mdio_write(tp, 0x19, 0x7c80);
-        rtl8168_mdio_write(tp, 0x15, 0x0151);
-        rtl8168_mdio_write(tp, 0x19, 0x6461);
-        rtl8168_mdio_write(tp, 0x15, 0x0152);
-        rtl8168_mdio_write(tp, 0x19, 0x4003);
-        rtl8168_mdio_write(tp, 0x15, 0x0153);
-        rtl8168_mdio_write(tp, 0x19, 0x4540);
-        rtl8168_mdio_write(tp, 0x15, 0x0154);
-        rtl8168_mdio_write(tp, 0x19, 0x9f00);
-        rtl8168_mdio_write(tp, 0x15, 0x0155);
-        rtl8168_mdio_write(tp, 0x19, 0x9d00);
-        rtl8168_mdio_write(tp, 0x15, 0x0156);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x0157);
-        rtl8168_mdio_write(tp, 0x19, 0x6421);
-        rtl8168_mdio_write(tp, 0x15, 0x0158);
-        rtl8168_mdio_write(tp, 0x19, 0x7c80);
-        rtl8168_mdio_write(tp, 0x15, 0x0159);
-        rtl8168_mdio_write(tp, 0x19, 0x64a1);
-        rtl8168_mdio_write(tp, 0x15, 0x015a);
-        rtl8168_mdio_write(tp, 0x19, 0x30fe);
-        rtl8168_mdio_write(tp, 0x15, 0x021e);
-        rtl8168_mdio_write(tp, 0x19, 0x5410);
-        rtl8168_mdio_write(tp, 0x15, 0x0225);
-        rtl8168_mdio_write(tp, 0x19, 0x5400);
-        rtl8168_mdio_write(tp, 0x15, 0x023D);
-        rtl8168_mdio_write(tp, 0x19, 0x4050);
-        rtl8168_mdio_write(tp, 0x15, 0x0295);
-        rtl8168_mdio_write(tp, 0x19, 0x6c08);
-        rtl8168_mdio_write(tp, 0x15, 0x02bd);
-        rtl8168_mdio_write(tp, 0x19, 0xa523);
-        rtl8168_mdio_write(tp, 0x15, 0x02be);
-        rtl8168_mdio_write(tp, 0x19, 0x32ca);
-        rtl8168_mdio_write(tp, 0x15, 0x02ca);
-        rtl8168_mdio_write(tp, 0x19, 0x48b3);
-        rtl8168_mdio_write(tp, 0x15, 0x02cb);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x02cc);
-        rtl8168_mdio_write(tp, 0x19, 0x4823);
-        rtl8168_mdio_write(tp, 0x15, 0x02cd);
-        rtl8168_mdio_write(tp, 0x19, 0x4510);
-        rtl8168_mdio_write(tp, 0x15, 0x02ce);
-        rtl8168_mdio_write(tp, 0x19, 0xb63a);
-        rtl8168_mdio_write(tp, 0x15, 0x02cf);
-        rtl8168_mdio_write(tp, 0x19, 0x7dc8);
-        rtl8168_mdio_write(tp, 0x15, 0x02d6);
-        rtl8168_mdio_write(tp, 0x19, 0x9bf8);
-        rtl8168_mdio_write(tp, 0x15, 0x02d8);
-        rtl8168_mdio_write(tp, 0x19, 0x85f6);
-        rtl8168_mdio_write(tp, 0x15, 0x02d9);
-        rtl8168_mdio_write(tp, 0x19, 0x32e0);
-        rtl8168_mdio_write(tp, 0x15, 0x02e0);
-        rtl8168_mdio_write(tp, 0x19, 0x4834);
-        rtl8168_mdio_write(tp, 0x15, 0x02e1);
-        rtl8168_mdio_write(tp, 0x19, 0x6c08);
-        rtl8168_mdio_write(tp, 0x15, 0x02e2);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x02e3);
-        rtl8168_mdio_write(tp, 0x19, 0x4824);
-        rtl8168_mdio_write(tp, 0x15, 0x02e4);
-        rtl8168_mdio_write(tp, 0x19, 0x4520);
-        rtl8168_mdio_write(tp, 0x15, 0x02e5);
-        rtl8168_mdio_write(tp, 0x19, 0x4008);
-        rtl8168_mdio_write(tp, 0x15, 0x02e6);
-        rtl8168_mdio_write(tp, 0x19, 0x4560);
-        rtl8168_mdio_write(tp, 0x15, 0x02e7);
-        rtl8168_mdio_write(tp, 0x19, 0x9d04);
-        rtl8168_mdio_write(tp, 0x15, 0x02e8);
-        rtl8168_mdio_write(tp, 0x19, 0x48c4);
-        rtl8168_mdio_write(tp, 0x15, 0x02e9);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02ea);
-        rtl8168_mdio_write(tp, 0x19, 0x4844);
-        rtl8168_mdio_write(tp, 0x15, 0x02eb);
-        rtl8168_mdio_write(tp, 0x19, 0x7dc8);
-        rtl8168_mdio_write(tp, 0x15, 0x02f0);
-        rtl8168_mdio_write(tp, 0x19, 0x9cf7);
-        rtl8168_mdio_write(tp, 0x15, 0x02f1);
-        rtl8168_mdio_write(tp, 0x19, 0xdf94);
-        rtl8168_mdio_write(tp, 0x15, 0x02f2);
-        rtl8168_mdio_write(tp, 0x19, 0x0002);
-        rtl8168_mdio_write(tp, 0x15, 0x02f3);
-        rtl8168_mdio_write(tp, 0x19, 0x6810);
-        rtl8168_mdio_write(tp, 0x15, 0x02f4);
-        rtl8168_mdio_write(tp, 0x19, 0xb614);
-        rtl8168_mdio_write(tp, 0x15, 0x02f5);
-        rtl8168_mdio_write(tp, 0x19, 0xc42b);
-        rtl8168_mdio_write(tp, 0x15, 0x02f6);
-        rtl8168_mdio_write(tp, 0x19, 0x00d4);
-        rtl8168_mdio_write(tp, 0x15, 0x02f7);
-        rtl8168_mdio_write(tp, 0x19, 0xc455);
-        rtl8168_mdio_write(tp, 0x15, 0x02f8);
-        rtl8168_mdio_write(tp, 0x19, 0x0093);
-        rtl8168_mdio_write(tp, 0x15, 0x02f9);
-        rtl8168_mdio_write(tp, 0x19, 0x92ee);
-        rtl8168_mdio_write(tp, 0x15, 0x02fa);
-        rtl8168_mdio_write(tp, 0x19, 0xefed);
-        rtl8168_mdio_write(tp, 0x15, 0x02fb);
-        rtl8168_mdio_write(tp, 0x19, 0x3312);
-        rtl8168_mdio_write(tp, 0x15, 0x0312);
-        rtl8168_mdio_write(tp, 0x19, 0x49b5);
-        rtl8168_mdio_write(tp, 0x15, 0x0313);
-        rtl8168_mdio_write(tp, 0x19, 0x7d00);
-        rtl8168_mdio_write(tp, 0x15, 0x0314);
-        rtl8168_mdio_write(tp, 0x19, 0x4d00);
-        rtl8168_mdio_write(tp, 0x15, 0x0315);
-        rtl8168_mdio_write(tp, 0x19, 0x6810);
-        rtl8168_mdio_write(tp, 0x15, 0x031e);
-        rtl8168_mdio_write(tp, 0x19, 0x404f);
-        rtl8168_mdio_write(tp, 0x15, 0x031f);
-        rtl8168_mdio_write(tp, 0x19, 0x44c8);
-        rtl8168_mdio_write(tp, 0x15, 0x0320);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x0321);
-        rtl8168_mdio_write(tp, 0x19, 0x00e7);
-        rtl8168_mdio_write(tp, 0x15, 0x0322);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0323);
-        rtl8168_mdio_write(tp, 0x19, 0x8203);
-        rtl8168_mdio_write(tp, 0x15, 0x0324);
-        rtl8168_mdio_write(tp, 0x19, 0x4d48);
-        rtl8168_mdio_write(tp, 0x15, 0x0325);
-        rtl8168_mdio_write(tp, 0x19, 0x3327);
-        rtl8168_mdio_write(tp, 0x15, 0x0326);
-        rtl8168_mdio_write(tp, 0x19, 0x4d40);
-        rtl8168_mdio_write(tp, 0x15, 0x0327);
-        rtl8168_mdio_write(tp, 0x19, 0xc8d7);
-        rtl8168_mdio_write(tp, 0x15, 0x0328);
-        rtl8168_mdio_write(tp, 0x19, 0x0003);
-        rtl8168_mdio_write(tp, 0x15, 0x0329);
-        rtl8168_mdio_write(tp, 0x19, 0x7c20);
-        rtl8168_mdio_write(tp, 0x15, 0x032a);
-        rtl8168_mdio_write(tp, 0x19, 0x4c20);
-        rtl8168_mdio_write(tp, 0x15, 0x032b);
-        rtl8168_mdio_write(tp, 0x19, 0xc8ed);
-        rtl8168_mdio_write(tp, 0x15, 0x032c);
-        rtl8168_mdio_write(tp, 0x19, 0x00f4);
-        rtl8168_mdio_write(tp, 0x15, 0x032d);
-        rtl8168_mdio_write(tp, 0x19, 0x82b3);
-        rtl8168_mdio_write(tp, 0x15, 0x032e);
-        rtl8168_mdio_write(tp, 0x19, 0xd11d);
-        rtl8168_mdio_write(tp, 0x15, 0x032f);
-        rtl8168_mdio_write(tp, 0x19, 0x00b1);
-        rtl8168_mdio_write(tp, 0x15, 0x0330);
-        rtl8168_mdio_write(tp, 0x19, 0xde18);
-        rtl8168_mdio_write(tp, 0x15, 0x0331);
-        rtl8168_mdio_write(tp, 0x19, 0x0008);
-        rtl8168_mdio_write(tp, 0x15, 0x0332);
-        rtl8168_mdio_write(tp, 0x19, 0x91ee);
-        rtl8168_mdio_write(tp, 0x15, 0x0333);
-        rtl8168_mdio_write(tp, 0x19, 0x3339);
-        rtl8168_mdio_write(tp, 0x15, 0x033a);
-        rtl8168_mdio_write(tp, 0x19, 0x4064);
-        rtl8168_mdio_write(tp, 0x15, 0x0340);
-        rtl8168_mdio_write(tp, 0x19, 0x9e06);
-        rtl8168_mdio_write(tp, 0x15, 0x0341);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0342);
-        rtl8168_mdio_write(tp, 0x19, 0x8203);
-        rtl8168_mdio_write(tp, 0x15, 0x0343);
-        rtl8168_mdio_write(tp, 0x19, 0x4d48);
-        rtl8168_mdio_write(tp, 0x15, 0x0344);
-        rtl8168_mdio_write(tp, 0x19, 0x3346);
-        rtl8168_mdio_write(tp, 0x15, 0x0345);
-        rtl8168_mdio_write(tp, 0x19, 0x4d40);
-        rtl8168_mdio_write(tp, 0x15, 0x0346);
-        rtl8168_mdio_write(tp, 0x19, 0xd11d);
-        rtl8168_mdio_write(tp, 0x15, 0x0347);
-        rtl8168_mdio_write(tp, 0x19, 0x0099);
-        rtl8168_mdio_write(tp, 0x15, 0x0348);
-        rtl8168_mdio_write(tp, 0x19, 0xbb17);
-        rtl8168_mdio_write(tp, 0x15, 0x0349);
-        rtl8168_mdio_write(tp, 0x19, 0x8102);
-        rtl8168_mdio_write(tp, 0x15, 0x034a);
-        rtl8168_mdio_write(tp, 0x19, 0x334d);
-        rtl8168_mdio_write(tp, 0x15, 0x034b);
-        rtl8168_mdio_write(tp, 0x19, 0xa22c);
-        rtl8168_mdio_write(tp, 0x15, 0x034c);
-        rtl8168_mdio_write(tp, 0x19, 0x3397);
-        rtl8168_mdio_write(tp, 0x15, 0x034d);
-        rtl8168_mdio_write(tp, 0x19, 0x91f2);
-        rtl8168_mdio_write(tp, 0x15, 0x034e);
-        rtl8168_mdio_write(tp, 0x19, 0xc218);
-        rtl8168_mdio_write(tp, 0x15, 0x034f);
-        rtl8168_mdio_write(tp, 0x19, 0x00f0);
-        rtl8168_mdio_write(tp, 0x15, 0x0350);
-        rtl8168_mdio_write(tp, 0x19, 0x3397);
-        rtl8168_mdio_write(tp, 0x15, 0x0351);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0364);
-        rtl8168_mdio_write(tp, 0x19, 0xbc05);
-        rtl8168_mdio_write(tp, 0x15, 0x0367);
-        rtl8168_mdio_write(tp, 0x19, 0xa1fc);
-        rtl8168_mdio_write(tp, 0x15, 0x0368);
-        rtl8168_mdio_write(tp, 0x19, 0x3377);
-        rtl8168_mdio_write(tp, 0x15, 0x0369);
-        rtl8168_mdio_write(tp, 0x19, 0x328b);
-        rtl8168_mdio_write(tp, 0x15, 0x036a);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0377);
-        rtl8168_mdio_write(tp, 0x19, 0x4b97);
-        rtl8168_mdio_write(tp, 0x15, 0x0378);
-        rtl8168_mdio_write(tp, 0x19, 0x6818);
-        rtl8168_mdio_write(tp, 0x15, 0x0379);
-        rtl8168_mdio_write(tp, 0x19, 0x4b07);
-        rtl8168_mdio_write(tp, 0x15, 0x037a);
-        rtl8168_mdio_write(tp, 0x19, 0x40ac);
-        rtl8168_mdio_write(tp, 0x15, 0x037b);
-        rtl8168_mdio_write(tp, 0x19, 0x4445);
-        rtl8168_mdio_write(tp, 0x15, 0x037c);
-        rtl8168_mdio_write(tp, 0x19, 0x404e);
-        rtl8168_mdio_write(tp, 0x15, 0x037d);
-        rtl8168_mdio_write(tp, 0x19, 0x4461);
-        rtl8168_mdio_write(tp, 0x15, 0x037e);
-        rtl8168_mdio_write(tp, 0x19, 0x9c09);
-        rtl8168_mdio_write(tp, 0x15, 0x037f);
-        rtl8168_mdio_write(tp, 0x19, 0x63da);
-        rtl8168_mdio_write(tp, 0x15, 0x0380);
-        rtl8168_mdio_write(tp, 0x19, 0x5440);
-        rtl8168_mdio_write(tp, 0x15, 0x0381);
-        rtl8168_mdio_write(tp, 0x19, 0x4b98);
-        rtl8168_mdio_write(tp, 0x15, 0x0382);
-        rtl8168_mdio_write(tp, 0x19, 0x7c60);
-        rtl8168_mdio_write(tp, 0x15, 0x0383);
-        rtl8168_mdio_write(tp, 0x19, 0x4c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0384);
-        rtl8168_mdio_write(tp, 0x19, 0x4b08);
-        rtl8168_mdio_write(tp, 0x15, 0x0385);
-        rtl8168_mdio_write(tp, 0x19, 0x63d8);
-        rtl8168_mdio_write(tp, 0x15, 0x0386);
-        rtl8168_mdio_write(tp, 0x19, 0x338d);
-        rtl8168_mdio_write(tp, 0x15, 0x0387);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x0388);
-        rtl8168_mdio_write(tp, 0x19, 0x0080);
-        rtl8168_mdio_write(tp, 0x15, 0x0389);
-        rtl8168_mdio_write(tp, 0x19, 0x820c);
-        rtl8168_mdio_write(tp, 0x15, 0x038a);
-        rtl8168_mdio_write(tp, 0x19, 0xa10b);
-        rtl8168_mdio_write(tp, 0x15, 0x038b);
-        rtl8168_mdio_write(tp, 0x19, 0x9df3);
-        rtl8168_mdio_write(tp, 0x15, 0x038c);
-        rtl8168_mdio_write(tp, 0x19, 0x3395);
-        rtl8168_mdio_write(tp, 0x15, 0x038d);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x038e);
-        rtl8168_mdio_write(tp, 0x19, 0x00f9);
-        rtl8168_mdio_write(tp, 0x15, 0x038f);
-        rtl8168_mdio_write(tp, 0x19, 0xc017);
-        rtl8168_mdio_write(tp, 0x15, 0x0390);
-        rtl8168_mdio_write(tp, 0x19, 0x0005);
-        rtl8168_mdio_write(tp, 0x15, 0x0391);
-        rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x0392);
-        rtl8168_mdio_write(tp, 0x19, 0xa103);
-        rtl8168_mdio_write(tp, 0x15, 0x0393);
-        rtl8168_mdio_write(tp, 0x19, 0x6c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0394);
-        rtl8168_mdio_write(tp, 0x19, 0x9df9);
-        rtl8168_mdio_write(tp, 0x15, 0x0395);
-        rtl8168_mdio_write(tp, 0x19, 0x6c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0396);
-        rtl8168_mdio_write(tp, 0x19, 0x3397);
-        rtl8168_mdio_write(tp, 0x15, 0x0399);
-        rtl8168_mdio_write(tp, 0x19, 0x6810);
-        rtl8168_mdio_write(tp, 0x15, 0x03a4);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x03a5);
-        rtl8168_mdio_write(tp, 0x19, 0x8203);
-        rtl8168_mdio_write(tp, 0x15, 0x03a6);
-        rtl8168_mdio_write(tp, 0x19, 0x4d08);
-        rtl8168_mdio_write(tp, 0x15, 0x03a7);
-        rtl8168_mdio_write(tp, 0x19, 0x33a9);
-        rtl8168_mdio_write(tp, 0x15, 0x03a8);
-        rtl8168_mdio_write(tp, 0x19, 0x4d00);
-        rtl8168_mdio_write(tp, 0x15, 0x03a9);
-        rtl8168_mdio_write(tp, 0x19, 0x9bfa);
-        rtl8168_mdio_write(tp, 0x15, 0x03aa);
-        rtl8168_mdio_write(tp, 0x19, 0x33b6);
-        rtl8168_mdio_write(tp, 0x15, 0x03bb);
-        rtl8168_mdio_write(tp, 0x19, 0x4056);
-        rtl8168_mdio_write(tp, 0x15, 0x03bc);
-        rtl8168_mdio_write(tp, 0x19, 0x44e9);
-        rtl8168_mdio_write(tp, 0x15, 0x03bd);
-        rtl8168_mdio_write(tp, 0x19, 0x405e);
-        rtl8168_mdio_write(tp, 0x15, 0x03be);
-        rtl8168_mdio_write(tp, 0x19, 0x44f8);
-        rtl8168_mdio_write(tp, 0x15, 0x03bf);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x03c0);
-        rtl8168_mdio_write(tp, 0x19, 0x0037);
-        rtl8168_mdio_write(tp, 0x15, 0x03c1);
-        rtl8168_mdio_write(tp, 0x19, 0xbd37);
-        rtl8168_mdio_write(tp, 0x15, 0x03c2);
-        rtl8168_mdio_write(tp, 0x19, 0x9cfd);
-        rtl8168_mdio_write(tp, 0x15, 0x03c3);
-        rtl8168_mdio_write(tp, 0x19, 0xc639);
-        rtl8168_mdio_write(tp, 0x15, 0x03c4);
-        rtl8168_mdio_write(tp, 0x19, 0x0011);
-        rtl8168_mdio_write(tp, 0x15, 0x03c5);
-        rtl8168_mdio_write(tp, 0x19, 0x9b03);
-        rtl8168_mdio_write(tp, 0x15, 0x03c6);
-        rtl8168_mdio_write(tp, 0x19, 0x7c01);
-        rtl8168_mdio_write(tp, 0x15, 0x03c7);
-        rtl8168_mdio_write(tp, 0x19, 0x4c01);
-        rtl8168_mdio_write(tp, 0x15, 0x03c8);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x03c9);
-        rtl8168_mdio_write(tp, 0x19, 0x7c20);
-        rtl8168_mdio_write(tp, 0x15, 0x03ca);
-        rtl8168_mdio_write(tp, 0x19, 0x4c20);
-        rtl8168_mdio_write(tp, 0x15, 0x03cb);
-        rtl8168_mdio_write(tp, 0x19, 0x9af4);
-        rtl8168_mdio_write(tp, 0x15, 0x03cc);
-        rtl8168_mdio_write(tp, 0x19, 0x7c12);
-        rtl8168_mdio_write(tp, 0x15, 0x03cd);
-        rtl8168_mdio_write(tp, 0x19, 0x4c52);
-        rtl8168_mdio_write(tp, 0x15, 0x03ce);
-        rtl8168_mdio_write(tp, 0x19, 0x4470);
-        rtl8168_mdio_write(tp, 0x15, 0x03cf);
-        rtl8168_mdio_write(tp, 0x19, 0x7c12);
-        rtl8168_mdio_write(tp, 0x15, 0x03d0);
-        rtl8168_mdio_write(tp, 0x19, 0x4c40);
-        rtl8168_mdio_write(tp, 0x15, 0x03d1);
-        rtl8168_mdio_write(tp, 0x19, 0x33bf);
-        rtl8168_mdio_write(tp, 0x15, 0x03d6);
-        rtl8168_mdio_write(tp, 0x19, 0x4047);
-        rtl8168_mdio_write(tp, 0x15, 0x03d7);
-        rtl8168_mdio_write(tp, 0x19, 0x4469);
-        rtl8168_mdio_write(tp, 0x15, 0x03d8);
-        rtl8168_mdio_write(tp, 0x19, 0x492b);
-        rtl8168_mdio_write(tp, 0x15, 0x03d9);
-        rtl8168_mdio_write(tp, 0x19, 0x4479);
-        rtl8168_mdio_write(tp, 0x15, 0x03da);
-        rtl8168_mdio_write(tp, 0x19, 0x7c09);
-        rtl8168_mdio_write(tp, 0x15, 0x03db);
-        rtl8168_mdio_write(tp, 0x19, 0x8203);
-        rtl8168_mdio_write(tp, 0x15, 0x03dc);
-        rtl8168_mdio_write(tp, 0x19, 0x4d48);
-        rtl8168_mdio_write(tp, 0x15, 0x03dd);
-        rtl8168_mdio_write(tp, 0x19, 0x33df);
-        rtl8168_mdio_write(tp, 0x15, 0x03de);
-        rtl8168_mdio_write(tp, 0x19, 0x4d40);
-        rtl8168_mdio_write(tp, 0x15, 0x03df);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x03e0);
-        rtl8168_mdio_write(tp, 0x19, 0x0017);
-        rtl8168_mdio_write(tp, 0x15, 0x03e1);
-        rtl8168_mdio_write(tp, 0x19, 0xbd17);
-        rtl8168_mdio_write(tp, 0x15, 0x03e2);
-        rtl8168_mdio_write(tp, 0x19, 0x9b03);
-        rtl8168_mdio_write(tp, 0x15, 0x03e3);
-        rtl8168_mdio_write(tp, 0x19, 0x7c20);
-        rtl8168_mdio_write(tp, 0x15, 0x03e4);
-        rtl8168_mdio_write(tp, 0x19, 0x4c20);
-        rtl8168_mdio_write(tp, 0x15, 0x03e5);
-        rtl8168_mdio_write(tp, 0x19, 0x88f5);
-        rtl8168_mdio_write(tp, 0x15, 0x03e6);
-        rtl8168_mdio_write(tp, 0x19, 0xc428);
-        rtl8168_mdio_write(tp, 0x15, 0x03e7);
-        rtl8168_mdio_write(tp, 0x19, 0x0008);
-        rtl8168_mdio_write(tp, 0x15, 0x03e8);
-        rtl8168_mdio_write(tp, 0x19, 0x9af2);
-        rtl8168_mdio_write(tp, 0x15, 0x03e9);
-        rtl8168_mdio_write(tp, 0x19, 0x7c12);
-        rtl8168_mdio_write(tp, 0x15, 0x03ea);
-        rtl8168_mdio_write(tp, 0x19, 0x4c52);
-        rtl8168_mdio_write(tp, 0x15, 0x03eb);
-        rtl8168_mdio_write(tp, 0x19, 0x4470);
-        rtl8168_mdio_write(tp, 0x15, 0x03ec);
-        rtl8168_mdio_write(tp, 0x19, 0x7c12);
-        rtl8168_mdio_write(tp, 0x15, 0x03ed);
-        rtl8168_mdio_write(tp, 0x19, 0x4c40);
-        rtl8168_mdio_write(tp, 0x15, 0x03ee);
-        rtl8168_mdio_write(tp, 0x19, 0x33da);
-        rtl8168_mdio_write(tp, 0x15, 0x03ef);
-        rtl8168_mdio_write(tp, 0x19, 0x3312);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0300);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x17, 0x2179);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0040);
-        rtl8168_mdio_write(tp, 0x18, 0x0645);
-        rtl8168_mdio_write(tp, 0x19, 0xe200);
-        rtl8168_mdio_write(tp, 0x18, 0x0655);
-        rtl8168_mdio_write(tp, 0x19, 0x9000);
-        rtl8168_mdio_write(tp, 0x18, 0x0d05);
-        rtl8168_mdio_write(tp, 0x19, 0xbe00);
-        rtl8168_mdio_write(tp, 0x18, 0x0d15);
-        rtl8168_mdio_write(tp, 0x19, 0xd300);
-        rtl8168_mdio_write(tp, 0x18, 0x0d25);
-        rtl8168_mdio_write(tp, 0x19, 0xfe00);
-        rtl8168_mdio_write(tp, 0x18, 0x0d35);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x0d45);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x18, 0x0d55);
-        rtl8168_mdio_write(tp, 0x19, 0x1000);
-        rtl8168_mdio_write(tp, 0x18, 0x0d65);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x0d75);
-        rtl8168_mdio_write(tp, 0x19, 0x8200);
-        rtl8168_mdio_write(tp, 0x18, 0x0d85);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x0d95);
-        rtl8168_mdio_write(tp, 0x19, 0x7000);
-        rtl8168_mdio_write(tp, 0x18, 0x0da5);
-        rtl8168_mdio_write(tp, 0x19, 0x0f00);
-        rtl8168_mdio_write(tp, 0x18, 0x0db5);
-        rtl8168_mdio_write(tp, 0x19, 0x0100);
-        rtl8168_mdio_write(tp, 0x18, 0x0dc5);
-        rtl8168_mdio_write(tp, 0x19, 0x9b00);
-        rtl8168_mdio_write(tp, 0x18, 0x0dd5);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x18, 0x0de5);
-        rtl8168_mdio_write(tp, 0x19, 0xe000);
-        rtl8168_mdio_write(tp, 0x18, 0x0df5);
-        rtl8168_mdio_write(tp, 0x19, 0xef00);
-        rtl8168_mdio_write(tp, 0x18, 0x16d5);
-        rtl8168_mdio_write(tp, 0x19, 0xe200);
-        rtl8168_mdio_write(tp, 0x18, 0x16e5);
-        rtl8168_mdio_write(tp, 0x19, 0xab00);
-        rtl8168_mdio_write(tp, 0x18, 0x2904);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x2914);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x18, 0x2924);
-        rtl8168_mdio_write(tp, 0x19, 0x0100);
-        rtl8168_mdio_write(tp, 0x18, 0x2934);
-        rtl8168_mdio_write(tp, 0x19, 0x2000);
-        rtl8168_mdio_write(tp, 0x18, 0x2944);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x2954);
-        rtl8168_mdio_write(tp, 0x19, 0x4600);
-        rtl8168_mdio_write(tp, 0x18, 0x2964);
-        rtl8168_mdio_write(tp, 0x19, 0xfc00);
-        rtl8168_mdio_write(tp, 0x18, 0x2974);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x2984);
-        rtl8168_mdio_write(tp, 0x19, 0x5000);
-        rtl8168_mdio_write(tp, 0x18, 0x2994);
-        rtl8168_mdio_write(tp, 0x19, 0x9d00);
-        rtl8168_mdio_write(tp, 0x18, 0x29a4);
-        rtl8168_mdio_write(tp, 0x19, 0xff00);
-        rtl8168_mdio_write(tp, 0x18, 0x29b4);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x29c4);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x18, 0x29d4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x29e4);
-        rtl8168_mdio_write(tp, 0x19, 0x2000);
-        rtl8168_mdio_write(tp, 0x18, 0x29f4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x2a04);
-        rtl8168_mdio_write(tp, 0x19, 0xe600);
-        rtl8168_mdio_write(tp, 0x18, 0x2a14);
-        rtl8168_mdio_write(tp, 0x19, 0xff00);
-        rtl8168_mdio_write(tp, 0x18, 0x2a24);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x2a34);
-        rtl8168_mdio_write(tp, 0x19, 0x5000);
-        rtl8168_mdio_write(tp, 0x18, 0x2a44);
-        rtl8168_mdio_write(tp, 0x19, 0x8500);
-        rtl8168_mdio_write(tp, 0x18, 0x2a54);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x18, 0x2a64);
-        rtl8168_mdio_write(tp, 0x19, 0xac00);
-        rtl8168_mdio_write(tp, 0x18, 0x2a74);
-        rtl8168_mdio_write(tp, 0x19, 0x0800);
-        rtl8168_mdio_write(tp, 0x18, 0x2a84);
-        rtl8168_mdio_write(tp, 0x19, 0xfc00);
-        rtl8168_mdio_write(tp, 0x18, 0x2a94);
-        rtl8168_mdio_write(tp, 0x19, 0xe000);
-        rtl8168_mdio_write(tp, 0x18, 0x2aa4);
-        rtl8168_mdio_write(tp, 0x19, 0x7400);
-        rtl8168_mdio_write(tp, 0x18, 0x2ab4);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x2ac4);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x18, 0x2ad4);
-        rtl8168_mdio_write(tp, 0x19, 0x0100);
-        rtl8168_mdio_write(tp, 0x18, 0x2ae4);
-        rtl8168_mdio_write(tp, 0x19, 0xff00);
-        rtl8168_mdio_write(tp, 0x18, 0x2af4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x2b04);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x18, 0x2b14);
-        rtl8168_mdio_write(tp, 0x19, 0xfc00);
-        rtl8168_mdio_write(tp, 0x18, 0x2b24);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x2b34);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x2b44);
-        rtl8168_mdio_write(tp, 0x19, 0x9d00);
-        rtl8168_mdio_write(tp, 0x18, 0x2b54);
-        rtl8168_mdio_write(tp, 0x19, 0xff00);
-        rtl8168_mdio_write(tp, 0x18, 0x2b64);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x2b74);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x18, 0x2b84);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x2b94);
-        rtl8168_mdio_write(tp, 0x19, 0xff00);
-        rtl8168_mdio_write(tp, 0x18, 0x2ba4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x2bb4);
-        rtl8168_mdio_write(tp, 0x19, 0xfc00);
-        rtl8168_mdio_write(tp, 0x18, 0x2bc4);
-        rtl8168_mdio_write(tp, 0x19, 0xff00);
-        rtl8168_mdio_write(tp, 0x18, 0x2bd4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x2be4);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x2bf4);
-        rtl8168_mdio_write(tp, 0x19, 0x8900);
-        rtl8168_mdio_write(tp, 0x18, 0x2c04);
-        rtl8168_mdio_write(tp, 0x19, 0x8300);
-        rtl8168_mdio_write(tp, 0x18, 0x2c14);
-        rtl8168_mdio_write(tp, 0x19, 0xe000);
-        rtl8168_mdio_write(tp, 0x18, 0x2c24);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x18, 0x2c34);
-        rtl8168_mdio_write(tp, 0x19, 0xac00);
-        rtl8168_mdio_write(tp, 0x18, 0x2c44);
-        rtl8168_mdio_write(tp, 0x19, 0x0800);
-        rtl8168_mdio_write(tp, 0x18, 0x2c54);
-        rtl8168_mdio_write(tp, 0x19, 0xfa00);
-        rtl8168_mdio_write(tp, 0x18, 0x2c64);
-        rtl8168_mdio_write(tp, 0x19, 0xe100);
-        rtl8168_mdio_write(tp, 0x18, 0x2c74);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x18, 0x0001);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x17, 0x2100);
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x05, 0x8b88);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x05, 0x8000);
-        rtl8168_mdio_write(tp, 0x06, 0xd480);
-        rtl8168_mdio_write(tp, 0x06, 0xc1e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b9a);
-        rtl8168_mdio_write(tp, 0x06, 0xe58b);
-        rtl8168_mdio_write(tp, 0x06, 0x9bee);
-        rtl8168_mdio_write(tp, 0x06, 0x8b83);
-        rtl8168_mdio_write(tp, 0x06, 0x41bf);
-        rtl8168_mdio_write(tp, 0x06, 0x8b88);
-        rtl8168_mdio_write(tp, 0x06, 0xec00);
-        rtl8168_mdio_write(tp, 0x06, 0x19a9);
-        rtl8168_mdio_write(tp, 0x06, 0x8b90);
-        rtl8168_mdio_write(tp, 0x06, 0xf9ee);
-        rtl8168_mdio_write(tp, 0x06, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0xfff7);
-        rtl8168_mdio_write(tp, 0x06, 0xffe0);
-        rtl8168_mdio_write(tp, 0x06, 0xe140);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e1);
-        rtl8168_mdio_write(tp, 0x06, 0x41f7);
-        rtl8168_mdio_write(tp, 0x06, 0x2ff6);
-        rtl8168_mdio_write(tp, 0x06, 0x28e4);
-        rtl8168_mdio_write(tp, 0x06, 0xe140);
-        rtl8168_mdio_write(tp, 0x06, 0xe5e1);
-        rtl8168_mdio_write(tp, 0x06, 0x41f7);
-        rtl8168_mdio_write(tp, 0x06, 0x0002);
-        rtl8168_mdio_write(tp, 0x06, 0x020c);
-        rtl8168_mdio_write(tp, 0x06, 0x0202);
-        rtl8168_mdio_write(tp, 0x06, 0x1d02);
-        rtl8168_mdio_write(tp, 0x06, 0x0230);
-        rtl8168_mdio_write(tp, 0x06, 0x0202);
-        rtl8168_mdio_write(tp, 0x06, 0x4002);
-        rtl8168_mdio_write(tp, 0x06, 0x028b);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0x6c02);
-        rtl8168_mdio_write(tp, 0x06, 0x8085);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x88e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b89);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8a1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8b);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8c1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01a0);
-        rtl8168_mdio_write(tp, 0x06, 0x00c7);
-        rtl8168_mdio_write(tp, 0x06, 0xaec3);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x10ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0x0002);
-        rtl8168_mdio_write(tp, 0x06, 0x1310);
-        rtl8168_mdio_write(tp, 0x06, 0x021f);
-        rtl8168_mdio_write(tp, 0x06, 0x9d02);
-        rtl8168_mdio_write(tp, 0x06, 0x1f0c);
-        rtl8168_mdio_write(tp, 0x06, 0x0227);
-        rtl8168_mdio_write(tp, 0x06, 0x49fc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x200b);
-        rtl8168_mdio_write(tp, 0x06, 0xf620);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x830e);
-        rtl8168_mdio_write(tp, 0x06, 0x021b);
-        rtl8168_mdio_write(tp, 0x06, 0x67ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2211);
-        rtl8168_mdio_write(tp, 0x06, 0xf622);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x2ba5);
-        rtl8168_mdio_write(tp, 0x06, 0x022a);
-        rtl8168_mdio_write(tp, 0x06, 0x2402);
-        rtl8168_mdio_write(tp, 0x06, 0x80c6);
-        rtl8168_mdio_write(tp, 0x06, 0x022a);
-        rtl8168_mdio_write(tp, 0x06, 0xf0ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2511);
-        rtl8168_mdio_write(tp, 0x06, 0xf625);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x8226);
-        rtl8168_mdio_write(tp, 0x06, 0x0204);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0x19cc);
-        rtl8168_mdio_write(tp, 0x06, 0x022b);
-        rtl8168_mdio_write(tp, 0x06, 0x5bfc);
-        rtl8168_mdio_write(tp, 0x06, 0x04ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0x0105);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b83);
-        rtl8168_mdio_write(tp, 0x06, 0xad24);
-        rtl8168_mdio_write(tp, 0x06, 0x44e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe022);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0x23ad);
-        rtl8168_mdio_write(tp, 0x06, 0x223b);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xbea0);
-        rtl8168_mdio_write(tp, 0x06, 0x0005);
-        rtl8168_mdio_write(tp, 0x06, 0x0228);
-        rtl8168_mdio_write(tp, 0x06, 0xdeae);
-        rtl8168_mdio_write(tp, 0x06, 0x42a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0105);
-        rtl8168_mdio_write(tp, 0x06, 0x0228);
-        rtl8168_mdio_write(tp, 0x06, 0xf1ae);
-        rtl8168_mdio_write(tp, 0x06, 0x3aa0);
-        rtl8168_mdio_write(tp, 0x06, 0x0205);
-        rtl8168_mdio_write(tp, 0x06, 0x0281);
-        rtl8168_mdio_write(tp, 0x06, 0x25ae);
-        rtl8168_mdio_write(tp, 0x06, 0x32a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0305);
-        rtl8168_mdio_write(tp, 0x06, 0x0229);
-        rtl8168_mdio_write(tp, 0x06, 0x9aae);
-        rtl8168_mdio_write(tp, 0x06, 0x2aa0);
-        rtl8168_mdio_write(tp, 0x06, 0x0405);
-        rtl8168_mdio_write(tp, 0x06, 0x0229);
-        rtl8168_mdio_write(tp, 0x06, 0xaeae);
-        rtl8168_mdio_write(tp, 0x06, 0x22a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0505);
-        rtl8168_mdio_write(tp, 0x06, 0x0229);
-        rtl8168_mdio_write(tp, 0x06, 0xd7ae);
-        rtl8168_mdio_write(tp, 0x06, 0x1aa0);
-        rtl8168_mdio_write(tp, 0x06, 0x0605);
-        rtl8168_mdio_write(tp, 0x06, 0x0229);
-        rtl8168_mdio_write(tp, 0x06, 0xfeae);
-        rtl8168_mdio_write(tp, 0x06, 0x12ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac0);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac1);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac6);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8abe);
-        rtl8168_mdio_write(tp, 0x06, 0x00ae);
-        rtl8168_mdio_write(tp, 0x06, 0x00fc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0x022a);
-        rtl8168_mdio_write(tp, 0x06, 0x67e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe022);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0x230d);
-        rtl8168_mdio_write(tp, 0x06, 0x0658);
-        rtl8168_mdio_write(tp, 0x06, 0x03a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0202);
-        rtl8168_mdio_write(tp, 0x06, 0xae2d);
-        rtl8168_mdio_write(tp, 0x06, 0xa001);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x2da0);
-        rtl8168_mdio_write(tp, 0x06, 0x004d);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-        rtl8168_mdio_write(tp, 0x06, 0x00e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe201);
-        rtl8168_mdio_write(tp, 0x06, 0xad24);
-        rtl8168_mdio_write(tp, 0x06, 0x44e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac2);
-        rtl8168_mdio_write(tp, 0x06, 0xe48a);
-        rtl8168_mdio_write(tp, 0x06, 0xc4e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac3);
-        rtl8168_mdio_write(tp, 0x06, 0xe48a);
-        rtl8168_mdio_write(tp, 0x06, 0xc5ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8abe);
-        rtl8168_mdio_write(tp, 0x06, 0x03e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b83);
-        rtl8168_mdio_write(tp, 0x06, 0xad25);
-        rtl8168_mdio_write(tp, 0x06, 0x3aee);
-        rtl8168_mdio_write(tp, 0x06, 0x8abe);
-        rtl8168_mdio_write(tp, 0x06, 0x05ae);
-        rtl8168_mdio_write(tp, 0x06, 0x34e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8ace);
-        rtl8168_mdio_write(tp, 0x06, 0xae03);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xcfe1);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac2);
-        rtl8168_mdio_write(tp, 0x06, 0x4905);
-        rtl8168_mdio_write(tp, 0x06, 0xe58a);
-        rtl8168_mdio_write(tp, 0x06, 0xc4e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac3);
-        rtl8168_mdio_write(tp, 0x06, 0x4905);
-        rtl8168_mdio_write(tp, 0x06, 0xe58a);
-        rtl8168_mdio_write(tp, 0x06, 0xc5ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8abe);
-        rtl8168_mdio_write(tp, 0x06, 0x0502);
-        rtl8168_mdio_write(tp, 0x06, 0x2ab6);
-        rtl8168_mdio_write(tp, 0x06, 0xac20);
-        rtl8168_mdio_write(tp, 0x06, 0x1202);
-        rtl8168_mdio_write(tp, 0x06, 0x819b);
-        rtl8168_mdio_write(tp, 0x06, 0xac20);
-        rtl8168_mdio_write(tp, 0x06, 0x0cee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac1);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac6);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8abe);
-        rtl8168_mdio_write(tp, 0x06, 0x02fc);
-        rtl8168_mdio_write(tp, 0x06, 0x04d0);
-        rtl8168_mdio_write(tp, 0x06, 0x0002);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x590f);
-        rtl8168_mdio_write(tp, 0x06, 0x3902);
-        rtl8168_mdio_write(tp, 0x06, 0xaa04);
-        rtl8168_mdio_write(tp, 0x06, 0xd001);
-        rtl8168_mdio_write(tp, 0x06, 0xae02);
-        rtl8168_mdio_write(tp, 0x06, 0xd000);
-        rtl8168_mdio_write(tp, 0x06, 0x04f9);
-        rtl8168_mdio_write(tp, 0x06, 0xfae2);
-        rtl8168_mdio_write(tp, 0x06, 0xe2d2);
-        rtl8168_mdio_write(tp, 0x06, 0xe3e2);
-        rtl8168_mdio_write(tp, 0x06, 0xd3f9);
-        rtl8168_mdio_write(tp, 0x06, 0x5af7);
-        rtl8168_mdio_write(tp, 0x06, 0xe6e2);
-        rtl8168_mdio_write(tp, 0x06, 0xd2e7);
-        rtl8168_mdio_write(tp, 0x06, 0xe2d3);
-        rtl8168_mdio_write(tp, 0x06, 0xe2e0);
-        rtl8168_mdio_write(tp, 0x06, 0x2ce3);
-        rtl8168_mdio_write(tp, 0x06, 0xe02d);
-        rtl8168_mdio_write(tp, 0x06, 0xf95b);
-        rtl8168_mdio_write(tp, 0x06, 0xe01e);
-        rtl8168_mdio_write(tp, 0x06, 0x30e6);
-        rtl8168_mdio_write(tp, 0x06, 0xe02c);
-        rtl8168_mdio_write(tp, 0x06, 0xe7e0);
-        rtl8168_mdio_write(tp, 0x06, 0x2de2);
-        rtl8168_mdio_write(tp, 0x06, 0xe2cc);
-        rtl8168_mdio_write(tp, 0x06, 0xe3e2);
-        rtl8168_mdio_write(tp, 0x06, 0xcdf9);
-        rtl8168_mdio_write(tp, 0x06, 0x5a0f);
-        rtl8168_mdio_write(tp, 0x06, 0x6a50);
-        rtl8168_mdio_write(tp, 0x06, 0xe6e2);
-        rtl8168_mdio_write(tp, 0x06, 0xcce7);
-        rtl8168_mdio_write(tp, 0x06, 0xe2cd);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x3ce1);
-        rtl8168_mdio_write(tp, 0x06, 0xe03d);
-        rtl8168_mdio_write(tp, 0x06, 0xef64);
-        rtl8168_mdio_write(tp, 0x06, 0xfde0);
-        rtl8168_mdio_write(tp, 0x06, 0xe2cc);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e2);
-        rtl8168_mdio_write(tp, 0x06, 0xcd58);
-        rtl8168_mdio_write(tp, 0x06, 0x0f5a);
-        rtl8168_mdio_write(tp, 0x06, 0xf01e);
-        rtl8168_mdio_write(tp, 0x06, 0x02e4);
-        rtl8168_mdio_write(tp, 0x06, 0xe2cc);
-        rtl8168_mdio_write(tp, 0x06, 0xe5e2);
-        rtl8168_mdio_write(tp, 0x06, 0xcdfd);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x2ce1);
-        rtl8168_mdio_write(tp, 0x06, 0xe02d);
-        rtl8168_mdio_write(tp, 0x06, 0x59e0);
-        rtl8168_mdio_write(tp, 0x06, 0x5b1f);
-        rtl8168_mdio_write(tp, 0x06, 0x1e13);
-        rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-        rtl8168_mdio_write(tp, 0x06, 0x2ce5);
-        rtl8168_mdio_write(tp, 0x06, 0xe02d);
-        rtl8168_mdio_write(tp, 0x06, 0xfde0);
-        rtl8168_mdio_write(tp, 0x06, 0xe2d2);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e2);
-        rtl8168_mdio_write(tp, 0x06, 0xd358);
-        rtl8168_mdio_write(tp, 0x06, 0xf75a);
-        rtl8168_mdio_write(tp, 0x06, 0x081e);
-        rtl8168_mdio_write(tp, 0x06, 0x02e4);
-        rtl8168_mdio_write(tp, 0x06, 0xe2d2);
-        rtl8168_mdio_write(tp, 0x06, 0xe5e2);
-        rtl8168_mdio_write(tp, 0x06, 0xd3ef);
-        rtl8168_mdio_write(tp, 0x06, 0x46fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfd04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe022);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0x2358);
-        rtl8168_mdio_write(tp, 0x06, 0xc4e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b6e);
-        rtl8168_mdio_write(tp, 0x06, 0x1f10);
-        rtl8168_mdio_write(tp, 0x06, 0x9e58);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x6ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2222);
-        rtl8168_mdio_write(tp, 0x06, 0xac27);
-        rtl8168_mdio_write(tp, 0x06, 0x55ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2602);
-        rtl8168_mdio_write(tp, 0x06, 0xae1a);
-        rtl8168_mdio_write(tp, 0x06, 0xd106);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0xba02);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xd107);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0xbd02);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xd107);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0xc002);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xae30);
-        rtl8168_mdio_write(tp, 0x06, 0xd103);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0xc302);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0xc602);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xca02);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xd10f);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0xba02);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0xbd02);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0xc002);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xef96);
-        rtl8168_mdio_write(tp, 0x06, 0xfefd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0xc302);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xd011);
-        rtl8168_mdio_write(tp, 0x06, 0x022b);
-        rtl8168_mdio_write(tp, 0x06, 0xfb59);
-        rtl8168_mdio_write(tp, 0x06, 0x03ef);
-        rtl8168_mdio_write(tp, 0x06, 0x01d1);
-        rtl8168_mdio_write(tp, 0x06, 0x00a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0002);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0xc602);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xd111);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x020c);
-        rtl8168_mdio_write(tp, 0x06, 0x11ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2102);
-        rtl8168_mdio_write(tp, 0x06, 0x0c12);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xca02);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xaec8);
-        rtl8168_mdio_write(tp, 0x06, 0x70e4);
-        rtl8168_mdio_write(tp, 0x06, 0x2602);
-        rtl8168_mdio_write(tp, 0x06, 0x82d1);
-        rtl8168_mdio_write(tp, 0x06, 0x05f8);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe2fe);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e2);
-        rtl8168_mdio_write(tp, 0x06, 0xffad);
-        rtl8168_mdio_write(tp, 0x06, 0x2d1a);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e1);
-        rtl8168_mdio_write(tp, 0x06, 0x4ee1);
-        rtl8168_mdio_write(tp, 0x06, 0xe14f);
-        rtl8168_mdio_write(tp, 0x06, 0xac2d);
-        rtl8168_mdio_write(tp, 0x06, 0x22f6);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0x033b);
-        rtl8168_mdio_write(tp, 0x06, 0xf703);
-        rtl8168_mdio_write(tp, 0x06, 0xf706);
-        rtl8168_mdio_write(tp, 0x06, 0xbf84);
-        rtl8168_mdio_write(tp, 0x06, 0x4402);
-        rtl8168_mdio_write(tp, 0x06, 0x2d21);
-        rtl8168_mdio_write(tp, 0x06, 0xae11);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e1);
-        rtl8168_mdio_write(tp, 0x06, 0x4ee1);
-        rtl8168_mdio_write(tp, 0x06, 0xe14f);
-        rtl8168_mdio_write(tp, 0x06, 0xad2d);
-        rtl8168_mdio_write(tp, 0x06, 0x08bf);
-        rtl8168_mdio_write(tp, 0x06, 0x844f);
-        rtl8168_mdio_write(tp, 0x06, 0x022d);
-        rtl8168_mdio_write(tp, 0x06, 0x21f6);
-        rtl8168_mdio_write(tp, 0x06, 0x06ef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0x0283);
-        rtl8168_mdio_write(tp, 0x06, 0x4502);
-        rtl8168_mdio_write(tp, 0x06, 0x83a2);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x00e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe001);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x1fd1);
-        rtl8168_mdio_write(tp, 0x06, 0x01bf);
-        rtl8168_mdio_write(tp, 0x06, 0x843b);
-        rtl8168_mdio_write(tp, 0x06, 0x022d);
-        rtl8168_mdio_write(tp, 0x06, 0xc1e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe020);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0x21ad);
-        rtl8168_mdio_write(tp, 0x06, 0x200e);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf84);
-        rtl8168_mdio_write(tp, 0x06, 0x3b02);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xbf3b);
-        rtl8168_mdio_write(tp, 0x06, 0x9602);
-        rtl8168_mdio_write(tp, 0x06, 0x2d21);
-        rtl8168_mdio_write(tp, 0x06, 0xef96);
-        rtl8168_mdio_write(tp, 0x06, 0xfefc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x87ad);
-        rtl8168_mdio_write(tp, 0x06, 0x204c);
-        rtl8168_mdio_write(tp, 0x06, 0xd200);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-        rtl8168_mdio_write(tp, 0x06, 0x0058);
-        rtl8168_mdio_write(tp, 0x06, 0x010c);
-        rtl8168_mdio_write(tp, 0x06, 0x021e);
-        rtl8168_mdio_write(tp, 0x06, 0x20e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe000);
-        rtl8168_mdio_write(tp, 0x06, 0x5810);
-        rtl8168_mdio_write(tp, 0x06, 0x1e20);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x3658);
-        rtl8168_mdio_write(tp, 0x06, 0x031e);
-        rtl8168_mdio_write(tp, 0x06, 0x20e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe022);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0x2358);
-        rtl8168_mdio_write(tp, 0x06, 0xe01e);
-        rtl8168_mdio_write(tp, 0x06, 0x20e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b64);
-        rtl8168_mdio_write(tp, 0x06, 0x1f02);
-        rtl8168_mdio_write(tp, 0x06, 0x9e22);
-        rtl8168_mdio_write(tp, 0x06, 0xe68b);
-        rtl8168_mdio_write(tp, 0x06, 0x64ad);
-        rtl8168_mdio_write(tp, 0x06, 0x3214);
-        rtl8168_mdio_write(tp, 0x06, 0xad34);
-        rtl8168_mdio_write(tp, 0x06, 0x11ef);
-        rtl8168_mdio_write(tp, 0x06, 0x0258);
-        rtl8168_mdio_write(tp, 0x06, 0x039e);
-        rtl8168_mdio_write(tp, 0x06, 0x07ad);
-        rtl8168_mdio_write(tp, 0x06, 0x3508);
-        rtl8168_mdio_write(tp, 0x06, 0x5ac0);
-        rtl8168_mdio_write(tp, 0x06, 0x9f04);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xae02);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf84);
-        rtl8168_mdio_write(tp, 0x06, 0x3e02);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xef96);
-        rtl8168_mdio_write(tp, 0x06, 0xfefd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x06, 0xfbe0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad25);
-        rtl8168_mdio_write(tp, 0x06, 0x22e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe022);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0x23e2);
-        rtl8168_mdio_write(tp, 0x06, 0xe036);
-        rtl8168_mdio_write(tp, 0x06, 0xe3e0);
-        rtl8168_mdio_write(tp, 0x06, 0x375a);
-        rtl8168_mdio_write(tp, 0x06, 0xc40d);
-        rtl8168_mdio_write(tp, 0x06, 0x0158);
-        rtl8168_mdio_write(tp, 0x06, 0x021e);
-        rtl8168_mdio_write(tp, 0x06, 0x20e3);
-        rtl8168_mdio_write(tp, 0x06, 0x8ae7);
-        rtl8168_mdio_write(tp, 0x06, 0xac31);
-        rtl8168_mdio_write(tp, 0x06, 0x60ac);
-        rtl8168_mdio_write(tp, 0x06, 0x3a08);
-        rtl8168_mdio_write(tp, 0x06, 0xac3e);
-        rtl8168_mdio_write(tp, 0x06, 0x26ae);
-        rtl8168_mdio_write(tp, 0x06, 0x67af);
-        rtl8168_mdio_write(tp, 0x06, 0x8437);
-        rtl8168_mdio_write(tp, 0x06, 0xad37);
-        rtl8168_mdio_write(tp, 0x06, 0x61e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8ae8);
-        rtl8168_mdio_write(tp, 0x06, 0x10e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8ae8);
-        rtl8168_mdio_write(tp, 0x06, 0xe18a);
-        rtl8168_mdio_write(tp, 0x06, 0xe91b);
-        rtl8168_mdio_write(tp, 0x06, 0x109e);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x51d1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x8441);
-        rtl8168_mdio_write(tp, 0x06, 0x022d);
-        rtl8168_mdio_write(tp, 0x06, 0xc1ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ae8);
-        rtl8168_mdio_write(tp, 0x06, 0x00ae);
-        rtl8168_mdio_write(tp, 0x06, 0x43ad);
-        rtl8168_mdio_write(tp, 0x06, 0x3627);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xeee1);
-        rtl8168_mdio_write(tp, 0x06, 0x8aef);
-        rtl8168_mdio_write(tp, 0x06, 0xef74);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xeae1);
-        rtl8168_mdio_write(tp, 0x06, 0x8aeb);
-        rtl8168_mdio_write(tp, 0x06, 0x1b74);
-        rtl8168_mdio_write(tp, 0x06, 0x9e2e);
-        rtl8168_mdio_write(tp, 0x06, 0x14e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8aea);
-        rtl8168_mdio_write(tp, 0x06, 0xe58a);
-        rtl8168_mdio_write(tp, 0x06, 0xebef);
-        rtl8168_mdio_write(tp, 0x06, 0x74e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8aee);
-        rtl8168_mdio_write(tp, 0x06, 0xe18a);
-        rtl8168_mdio_write(tp, 0x06, 0xef1b);
-        rtl8168_mdio_write(tp, 0x06, 0x479e);
-        rtl8168_mdio_write(tp, 0x06, 0x0fae);
-        rtl8168_mdio_write(tp, 0x06, 0x19ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8aea);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8aeb);
-        rtl8168_mdio_write(tp, 0x06, 0x00ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0fac);
-        rtl8168_mdio_write(tp, 0x06, 0x390c);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf84);
-        rtl8168_mdio_write(tp, 0x06, 0x4102);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc1);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0xe800);
-        rtl8168_mdio_write(tp, 0x06, 0xe68a);
-        rtl8168_mdio_write(tp, 0x06, 0xe7ff);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x06, 0x0400);
-        rtl8168_mdio_write(tp, 0x06, 0xe234);
-        rtl8168_mdio_write(tp, 0x06, 0xcce2);
-        rtl8168_mdio_write(tp, 0x06, 0x0088);
-        rtl8168_mdio_write(tp, 0x06, 0xe200);
-        rtl8168_mdio_write(tp, 0x06, 0xa725);
-        rtl8168_mdio_write(tp, 0x06, 0xe50a);
-        rtl8168_mdio_write(tp, 0x06, 0x1de5);
-        rtl8168_mdio_write(tp, 0x06, 0x0a2c);
-        rtl8168_mdio_write(tp, 0x06, 0xe50a);
-        rtl8168_mdio_write(tp, 0x06, 0x6de5);
-        rtl8168_mdio_write(tp, 0x06, 0x0a1d);
-        rtl8168_mdio_write(tp, 0x06, 0xe50a);
-        rtl8168_mdio_write(tp, 0x06, 0x1ce5);
-        rtl8168_mdio_write(tp, 0x06, 0x0a2d);
-        rtl8168_mdio_write(tp, 0x06, 0xa755);
-        rtl8168_mdio_write(tp, 0x05, 0x8b64);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x05, 0x8b94);
-        rtl8168_mdio_write(tp, 0x06, 0x82cd);
-        rtl8168_mdio_write(tp, 0x05, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0x2000);
-        rtl8168_mdio_write(tp, 0x05, 0x8aee);
-        rtl8168_mdio_write(tp, 0x06, 0x03b8);
-        rtl8168_mdio_write(tp, 0x05, 0x8ae8);
-        rtl8168_mdio_write(tp, 0x06, 0x0002);
-        gphy_val = rtl8168_mdio_read(tp, 0x01);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp, 0x01, gphy_val);
-        gphy_val = rtl8168_mdio_read(tp, 0x00);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp, 0x00, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x00);
-                if (gphy_val & BIT_7)
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val &= ~(BIT_0);
-        if (tp->RequiredSecLanDonglePatch)
-                gphy_val &= ~(BIT_2);
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0028);
-        rtl8168_mdio_write(tp, 0x15, 0x0010);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0041);
-        rtl8168_mdio_write(tp, 0x15, 0x0802);
-        rtl8168_mdio_write(tp, 0x16, 0x2185);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-}
-
-static void
-rtl8168_set_phy_mcu_8168e_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val,i;
-
-        if (rtl8168_efuse_read(tp, 0x22) == 0x0c) {
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, 0x00, 0x1800);
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x0023);
-                rtl8168_mdio_write(tp, 0x17, 0x0117);
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x002C);
-                rtl8168_mdio_write(tp, 0x1B, 0x5000);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, 0x16, 0x4104);
-                for (i = 0; i < 200; i++) {
-                        udelay(100);
-                        gphy_val = rtl8168_mdio_read(tp, 0x1E);
-                        gphy_val &= 0x03FF;
-                        if (gphy_val==0x000C)
-                                break;
-                }
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                for (i = 0; i < 200; i++) {
-                        udelay(100);
-                        gphy_val = rtl8168_mdio_read(tp, 0x07);
-                        if ((gphy_val & BIT_5) == 0)
-                                break;
-                }
-                gphy_val = rtl8168_mdio_read(tp, 0x07);
-                if (gphy_val & BIT_5) {
-                        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                        rtl8168_mdio_write(tp, 0x1e, 0x00a1);
-                        rtl8168_mdio_write(tp, 0x17, 0x1000);
-                        rtl8168_mdio_write(tp, 0x17, 0x0000);
-                        rtl8168_mdio_write(tp, 0x17, 0x2000);
-                        rtl8168_mdio_write(tp, 0x1e, 0x002f);
-                        rtl8168_mdio_write(tp, 0x18, 0x9bfb);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                        rtl8168_mdio_write(tp, 0x07, 0x0000);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                }
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0xfff6);
-                rtl8168_mdio_write(tp, 0x06, 0x0080);
-                gphy_val = rtl8168_mdio_read(tp, 0x00);
-                gphy_val &= ~(BIT_7);
-                rtl8168_mdio_write(tp, 0x00, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x08);
-                gphy_val &= ~(BIT_7);
-                rtl8168_mdio_write(tp, 0x08, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x0023);
-                rtl8168_mdio_write(tp, 0x16, 0x0306);
-                rtl8168_mdio_write(tp, 0x16, 0x0307);
-                rtl8168_mdio_write(tp, 0x15, 0x000e);
-                rtl8168_mdio_write(tp, 0x19, 0x000a);
-                rtl8168_mdio_write(tp, 0x15, 0x0010);
-                rtl8168_mdio_write(tp, 0x19, 0x0008);
-                rtl8168_mdio_write(tp, 0x15, 0x0018);
-                rtl8168_mdio_write(tp, 0x19, 0x4801);
-                rtl8168_mdio_write(tp, 0x15, 0x0019);
-                rtl8168_mdio_write(tp, 0x19, 0x6801);
-                rtl8168_mdio_write(tp, 0x15, 0x001a);
-                rtl8168_mdio_write(tp, 0x19, 0x66a1);
-                rtl8168_mdio_write(tp, 0x15, 0x001f);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0020);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0021);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0022);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0023);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0024);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0025);
-                rtl8168_mdio_write(tp, 0x19, 0x64a1);
-                rtl8168_mdio_write(tp, 0x15, 0x0026);
-                rtl8168_mdio_write(tp, 0x19, 0x40ea);
-                rtl8168_mdio_write(tp, 0x15, 0x0027);
-                rtl8168_mdio_write(tp, 0x19, 0x4503);
-                rtl8168_mdio_write(tp, 0x15, 0x0028);
-                rtl8168_mdio_write(tp, 0x19, 0x9f00);
-                rtl8168_mdio_write(tp, 0x15, 0x0029);
-                rtl8168_mdio_write(tp, 0x19, 0xa631);
-                rtl8168_mdio_write(tp, 0x15, 0x002a);
-                rtl8168_mdio_write(tp, 0x19, 0x9717);
-                rtl8168_mdio_write(tp, 0x15, 0x002b);
-                rtl8168_mdio_write(tp, 0x19, 0x302c);
-                rtl8168_mdio_write(tp, 0x15, 0x002c);
-                rtl8168_mdio_write(tp, 0x19, 0x4802);
-                rtl8168_mdio_write(tp, 0x15, 0x002d);
-                rtl8168_mdio_write(tp, 0x19, 0x58da);
-                rtl8168_mdio_write(tp, 0x15, 0x002e);
-                rtl8168_mdio_write(tp, 0x19, 0x400d);
-                rtl8168_mdio_write(tp, 0x15, 0x002f);
-                rtl8168_mdio_write(tp, 0x19, 0x4488);
-                rtl8168_mdio_write(tp, 0x15, 0x0030);
-                rtl8168_mdio_write(tp, 0x19, 0x9e00);
-                rtl8168_mdio_write(tp, 0x15, 0x0031);
-                rtl8168_mdio_write(tp, 0x19, 0x63c8);
-                rtl8168_mdio_write(tp, 0x15, 0x0032);
-                rtl8168_mdio_write(tp, 0x19, 0x6481);
-                rtl8168_mdio_write(tp, 0x15, 0x0033);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0034);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0035);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0036);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0037);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0038);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0039);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x003a);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x003b);
-                rtl8168_mdio_write(tp, 0x19, 0x63e8);
-                rtl8168_mdio_write(tp, 0x15, 0x003c);
-                rtl8168_mdio_write(tp, 0x19, 0x7d00);
-                rtl8168_mdio_write(tp, 0x15, 0x003d);
-                rtl8168_mdio_write(tp, 0x19, 0x59d4);
-                rtl8168_mdio_write(tp, 0x15, 0x003e);
-                rtl8168_mdio_write(tp, 0x19, 0x63f8);
-                rtl8168_mdio_write(tp, 0x15, 0x0040);
-                rtl8168_mdio_write(tp, 0x19, 0x64a1);
-                rtl8168_mdio_write(tp, 0x15, 0x0041);
-                rtl8168_mdio_write(tp, 0x19, 0x30de);
-                rtl8168_mdio_write(tp, 0x15, 0x0044);
-                rtl8168_mdio_write(tp, 0x19, 0x480f);
-                rtl8168_mdio_write(tp, 0x15, 0x0045);
-                rtl8168_mdio_write(tp, 0x19, 0x6800);
-                rtl8168_mdio_write(tp, 0x15, 0x0046);
-                rtl8168_mdio_write(tp, 0x19, 0x6680);
-                rtl8168_mdio_write(tp, 0x15, 0x0047);
-                rtl8168_mdio_write(tp, 0x19, 0x7c10);
-                rtl8168_mdio_write(tp, 0x15, 0x0048);
-                rtl8168_mdio_write(tp, 0x19, 0x63c8);
-                rtl8168_mdio_write(tp, 0x15, 0x0049);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004a);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004b);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004c);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004d);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004e);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004f);
-                rtl8168_mdio_write(tp, 0x19, 0x40ea);
-                rtl8168_mdio_write(tp, 0x15, 0x0050);
-                rtl8168_mdio_write(tp, 0x19, 0x4503);
-                rtl8168_mdio_write(tp, 0x15, 0x0051);
-                rtl8168_mdio_write(tp, 0x19, 0x58ca);
-                rtl8168_mdio_write(tp, 0x15, 0x0052);
-                rtl8168_mdio_write(tp, 0x19, 0x63c8);
-                rtl8168_mdio_write(tp, 0x15, 0x0053);
-                rtl8168_mdio_write(tp, 0x19, 0x63d8);
-                rtl8168_mdio_write(tp, 0x15, 0x0054);
-                rtl8168_mdio_write(tp, 0x19, 0x66a0);
-                rtl8168_mdio_write(tp, 0x15, 0x0055);
-                rtl8168_mdio_write(tp, 0x19, 0x9f00);
-                rtl8168_mdio_write(tp, 0x15, 0x0056);
-                rtl8168_mdio_write(tp, 0x19, 0x3000);
-                rtl8168_mdio_write(tp, 0x15, 0x00a1);
-                rtl8168_mdio_write(tp, 0x19, 0x3044);
-                rtl8168_mdio_write(tp, 0x15, 0x00ab);
-                rtl8168_mdio_write(tp, 0x19, 0x5820);
-                rtl8168_mdio_write(tp, 0x15, 0x00ac);
-                rtl8168_mdio_write(tp, 0x19, 0x5e04);
-                rtl8168_mdio_write(tp, 0x15, 0x00ad);
-                rtl8168_mdio_write(tp, 0x19, 0xb60c);
-                rtl8168_mdio_write(tp, 0x15, 0x00af);
-                rtl8168_mdio_write(tp, 0x19, 0x000a);
-                rtl8168_mdio_write(tp, 0x15, 0x00b2);
-                rtl8168_mdio_write(tp, 0x19, 0x30b9);
-                rtl8168_mdio_write(tp, 0x15, 0x00b9);
-                rtl8168_mdio_write(tp, 0x19, 0x4408);
-                rtl8168_mdio_write(tp, 0x15, 0x00ba);
-                rtl8168_mdio_write(tp, 0x19, 0x480b);
-                rtl8168_mdio_write(tp, 0x15, 0x00bb);
-                rtl8168_mdio_write(tp, 0x19, 0x5e00);
-                rtl8168_mdio_write(tp, 0x15, 0x00bc);
-                rtl8168_mdio_write(tp, 0x19, 0x405f);
-                rtl8168_mdio_write(tp, 0x15, 0x00bd);
-                rtl8168_mdio_write(tp, 0x19, 0x4448);
-                rtl8168_mdio_write(tp, 0x15, 0x00be);
-                rtl8168_mdio_write(tp, 0x19, 0x4020);
-                rtl8168_mdio_write(tp, 0x15, 0x00bf);
-                rtl8168_mdio_write(tp, 0x19, 0x4468);
-                rtl8168_mdio_write(tp, 0x15, 0x00c0);
-                rtl8168_mdio_write(tp, 0x19, 0x9c02);
-                rtl8168_mdio_write(tp, 0x15, 0x00c1);
-                rtl8168_mdio_write(tp, 0x19, 0x58a0);
-                rtl8168_mdio_write(tp, 0x15, 0x00c2);
-                rtl8168_mdio_write(tp, 0x19, 0xb605);
-                rtl8168_mdio_write(tp, 0x15, 0x00c3);
-                rtl8168_mdio_write(tp, 0x19, 0xc0d3);
-                rtl8168_mdio_write(tp, 0x15, 0x00c4);
-                rtl8168_mdio_write(tp, 0x19, 0x00e6);
-                rtl8168_mdio_write(tp, 0x15, 0x00c5);
-                rtl8168_mdio_write(tp, 0x19, 0xdaec);
-                rtl8168_mdio_write(tp, 0x15, 0x00c6);
-                rtl8168_mdio_write(tp, 0x19, 0x00fa);
-                rtl8168_mdio_write(tp, 0x15, 0x00c7);
-                rtl8168_mdio_write(tp, 0x19, 0x9df9);
-                rtl8168_mdio_write(tp, 0x15, 0x0112);
-                rtl8168_mdio_write(tp, 0x19, 0x6421);
-                rtl8168_mdio_write(tp, 0x15, 0x0113);
-                rtl8168_mdio_write(tp, 0x19, 0x7c08);
-                rtl8168_mdio_write(tp, 0x15, 0x0114);
-                rtl8168_mdio_write(tp, 0x19, 0x63f0);
-                rtl8168_mdio_write(tp, 0x15, 0x0115);
-                rtl8168_mdio_write(tp, 0x19, 0x4003);
-                rtl8168_mdio_write(tp, 0x15, 0x0116);
-                rtl8168_mdio_write(tp, 0x19, 0x4418);
-                rtl8168_mdio_write(tp, 0x15, 0x0117);
-                rtl8168_mdio_write(tp, 0x19, 0x9b00);
-                rtl8168_mdio_write(tp, 0x15, 0x0118);
-                rtl8168_mdio_write(tp, 0x19, 0x6461);
-                rtl8168_mdio_write(tp, 0x15, 0x0119);
-                rtl8168_mdio_write(tp, 0x19, 0x64e1);
-                rtl8168_mdio_write(tp, 0x15, 0x011a);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0150);
-                rtl8168_mdio_write(tp, 0x19, 0x7c80);
-                rtl8168_mdio_write(tp, 0x15, 0x0151);
-                rtl8168_mdio_write(tp, 0x19, 0x6461);
-                rtl8168_mdio_write(tp, 0x15, 0x0152);
-                rtl8168_mdio_write(tp, 0x19, 0x4003);
-                rtl8168_mdio_write(tp, 0x15, 0x0153);
-                rtl8168_mdio_write(tp, 0x19, 0x4540);
-                rtl8168_mdio_write(tp, 0x15, 0x0154);
-                rtl8168_mdio_write(tp, 0x19, 0x9f00);
-                rtl8168_mdio_write(tp, 0x15, 0x0155);
-                rtl8168_mdio_write(tp, 0x19, 0x9d00);
-                rtl8168_mdio_write(tp, 0x15, 0x0156);
-                rtl8168_mdio_write(tp, 0x19, 0x7c40);
-                rtl8168_mdio_write(tp, 0x15, 0x0157);
-                rtl8168_mdio_write(tp, 0x19, 0x6421);
-                rtl8168_mdio_write(tp, 0x15, 0x0158);
-                rtl8168_mdio_write(tp, 0x19, 0x7c80);
-                rtl8168_mdio_write(tp, 0x15, 0x0159);
-                rtl8168_mdio_write(tp, 0x19, 0x64a1);
-                rtl8168_mdio_write(tp, 0x15, 0x015a);
-                rtl8168_mdio_write(tp, 0x19, 0x30fe);
-                rtl8168_mdio_write(tp, 0x15, 0x029c);
-                rtl8168_mdio_write(tp, 0x19, 0x0070);
-                rtl8168_mdio_write(tp, 0x15, 0x02b2);
-                rtl8168_mdio_write(tp, 0x19, 0x005a);
-                rtl8168_mdio_write(tp, 0x15, 0x02bd);
-                rtl8168_mdio_write(tp, 0x19, 0xa522);
-                rtl8168_mdio_write(tp, 0x15, 0x02ce);
-                rtl8168_mdio_write(tp, 0x19, 0xb63e);
-                rtl8168_mdio_write(tp, 0x15, 0x02d9);
-                rtl8168_mdio_write(tp, 0x19, 0x32df);
-                rtl8168_mdio_write(tp, 0x15, 0x02df);
-                rtl8168_mdio_write(tp, 0x19, 0x4500);
-                rtl8168_mdio_write(tp, 0x15, 0x02e7);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x02f4);
-                rtl8168_mdio_write(tp, 0x19, 0xb618);
-                rtl8168_mdio_write(tp, 0x15, 0x02fb);
-                rtl8168_mdio_write(tp, 0x19, 0xb900);
-                rtl8168_mdio_write(tp, 0x15, 0x02fc);
-                rtl8168_mdio_write(tp, 0x19, 0x49b5);
-                rtl8168_mdio_write(tp, 0x15, 0x02fd);
-                rtl8168_mdio_write(tp, 0x19, 0x6812);
-                rtl8168_mdio_write(tp, 0x15, 0x02fe);
-                rtl8168_mdio_write(tp, 0x19, 0x66a0);
-                rtl8168_mdio_write(tp, 0x15, 0x02ff);
-                rtl8168_mdio_write(tp, 0x19, 0x9900);
-                rtl8168_mdio_write(tp, 0x15, 0x0300);
-                rtl8168_mdio_write(tp, 0x19, 0x64a0);
-                rtl8168_mdio_write(tp, 0x15, 0x0301);
-                rtl8168_mdio_write(tp, 0x19, 0x3316);
-                rtl8168_mdio_write(tp, 0x15, 0x0308);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x030c);
-                rtl8168_mdio_write(tp, 0x19, 0x3000);
-                rtl8168_mdio_write(tp, 0x15, 0x0312);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0313);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0314);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0315);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0316);
-                rtl8168_mdio_write(tp, 0x19, 0x49b5);
-                rtl8168_mdio_write(tp, 0x15, 0x0317);
-                rtl8168_mdio_write(tp, 0x19, 0x7d00);
-                rtl8168_mdio_write(tp, 0x15, 0x0318);
-                rtl8168_mdio_write(tp, 0x19, 0x4d00);
-                rtl8168_mdio_write(tp, 0x15, 0x0319);
-                rtl8168_mdio_write(tp, 0x19, 0x6810);
-                rtl8168_mdio_write(tp, 0x15, 0x031a);
-                rtl8168_mdio_write(tp, 0x19, 0x6c08);
-                rtl8168_mdio_write(tp, 0x15, 0x031b);
-                rtl8168_mdio_write(tp, 0x19, 0x4925);
-                rtl8168_mdio_write(tp, 0x15, 0x031c);
-                rtl8168_mdio_write(tp, 0x19, 0x403b);
-                rtl8168_mdio_write(tp, 0x15, 0x031d);
-                rtl8168_mdio_write(tp, 0x19, 0xa602);
-                rtl8168_mdio_write(tp, 0x15, 0x031e);
-                rtl8168_mdio_write(tp, 0x19, 0x402f);
-                rtl8168_mdio_write(tp, 0x15, 0x031f);
-                rtl8168_mdio_write(tp, 0x19, 0x4484);
-                rtl8168_mdio_write(tp, 0x15, 0x0320);
-                rtl8168_mdio_write(tp, 0x19, 0x40c8);
-                rtl8168_mdio_write(tp, 0x15, 0x0321);
-                rtl8168_mdio_write(tp, 0x19, 0x44c4);
-                rtl8168_mdio_write(tp, 0x15, 0x0322);
-                rtl8168_mdio_write(tp, 0x19, 0x404f);
-                rtl8168_mdio_write(tp, 0x15, 0x0323);
-                rtl8168_mdio_write(tp, 0x19, 0x44c8);
-                rtl8168_mdio_write(tp, 0x15, 0x0324);
-                rtl8168_mdio_write(tp, 0x19, 0xd64f);
-                rtl8168_mdio_write(tp, 0x15, 0x0325);
-                rtl8168_mdio_write(tp, 0x19, 0x00e7);
-                rtl8168_mdio_write(tp, 0x15, 0x0326);
-                rtl8168_mdio_write(tp, 0x19, 0x7c08);
-                rtl8168_mdio_write(tp, 0x15, 0x0327);
-                rtl8168_mdio_write(tp, 0x19, 0x8203);
-                rtl8168_mdio_write(tp, 0x15, 0x0328);
-                rtl8168_mdio_write(tp, 0x19, 0x4d48);
-                rtl8168_mdio_write(tp, 0x15, 0x0329);
-                rtl8168_mdio_write(tp, 0x19, 0x332b);
-                rtl8168_mdio_write(tp, 0x15, 0x032a);
-                rtl8168_mdio_write(tp, 0x19, 0x4d40);
-                rtl8168_mdio_write(tp, 0x15, 0x032c);
-                rtl8168_mdio_write(tp, 0x19, 0x00f8);
-                rtl8168_mdio_write(tp, 0x15, 0x032d);
-                rtl8168_mdio_write(tp, 0x19, 0x82b2);
-                rtl8168_mdio_write(tp, 0x15, 0x032f);
-                rtl8168_mdio_write(tp, 0x19, 0x00b0);
-                rtl8168_mdio_write(tp, 0x15, 0x0332);
-                rtl8168_mdio_write(tp, 0x19, 0x91f2);
-                rtl8168_mdio_write(tp, 0x15, 0x033f);
-                rtl8168_mdio_write(tp, 0x19, 0xb6cd);
-                rtl8168_mdio_write(tp, 0x15, 0x0340);
-                rtl8168_mdio_write(tp, 0x19, 0x9e01);
-                rtl8168_mdio_write(tp, 0x15, 0x0341);
-                rtl8168_mdio_write(tp, 0x19, 0xd11d);
-                rtl8168_mdio_write(tp, 0x15, 0x0342);
-                rtl8168_mdio_write(tp, 0x19, 0x009d);
-                rtl8168_mdio_write(tp, 0x15, 0x0343);
-                rtl8168_mdio_write(tp, 0x19, 0xbb1c);
-                rtl8168_mdio_write(tp, 0x15, 0x0344);
-                rtl8168_mdio_write(tp, 0x19, 0x8102);
-                rtl8168_mdio_write(tp, 0x15, 0x0345);
-                rtl8168_mdio_write(tp, 0x19, 0x3348);
-                rtl8168_mdio_write(tp, 0x15, 0x0346);
-                rtl8168_mdio_write(tp, 0x19, 0xa231);
-                rtl8168_mdio_write(tp, 0x15, 0x0347);
-                rtl8168_mdio_write(tp, 0x19, 0x335b);
-                rtl8168_mdio_write(tp, 0x15, 0x0348);
-                rtl8168_mdio_write(tp, 0x19, 0x91f7);
-                rtl8168_mdio_write(tp, 0x15, 0x0349);
-                rtl8168_mdio_write(tp, 0x19, 0xc218);
-                rtl8168_mdio_write(tp, 0x15, 0x034a);
-                rtl8168_mdio_write(tp, 0x19, 0x00f5);
-                rtl8168_mdio_write(tp, 0x15, 0x034b);
-                rtl8168_mdio_write(tp, 0x19, 0x335b);
-                rtl8168_mdio_write(tp, 0x15, 0x034c);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x034d);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x034e);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x034f);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0350);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x035b);
-                rtl8168_mdio_write(tp, 0x19, 0xa23c);
-                rtl8168_mdio_write(tp, 0x15, 0x035c);
-                rtl8168_mdio_write(tp, 0x19, 0x7c08);
-                rtl8168_mdio_write(tp, 0x15, 0x035d);
-                rtl8168_mdio_write(tp, 0x19, 0x4c00);
-                rtl8168_mdio_write(tp, 0x15, 0x035e);
-                rtl8168_mdio_write(tp, 0x19, 0x3397);
-                rtl8168_mdio_write(tp, 0x15, 0x0363);
-                rtl8168_mdio_write(tp, 0x19, 0xb6a9);
-                rtl8168_mdio_write(tp, 0x15, 0x0366);
-                rtl8168_mdio_write(tp, 0x19, 0x00f5);
-                rtl8168_mdio_write(tp, 0x15, 0x0382);
-                rtl8168_mdio_write(tp, 0x19, 0x7c40);
-                rtl8168_mdio_write(tp, 0x15, 0x0388);
-                rtl8168_mdio_write(tp, 0x19, 0x0084);
-                rtl8168_mdio_write(tp, 0x15, 0x0389);
-                rtl8168_mdio_write(tp, 0x19, 0xdd17);
-                rtl8168_mdio_write(tp, 0x15, 0x038a);
-                rtl8168_mdio_write(tp, 0x19, 0x000b);
-                rtl8168_mdio_write(tp, 0x15, 0x038b);
-                rtl8168_mdio_write(tp, 0x19, 0xa10a);
-                rtl8168_mdio_write(tp, 0x15, 0x038c);
-                rtl8168_mdio_write(tp, 0x19, 0x337e);
-                rtl8168_mdio_write(tp, 0x15, 0x038d);
-                rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-                rtl8168_mdio_write(tp, 0x15, 0x038e);
-                rtl8168_mdio_write(tp, 0x19, 0xa107);
-                rtl8168_mdio_write(tp, 0x15, 0x038f);
-                rtl8168_mdio_write(tp, 0x19, 0x6c08);
-                rtl8168_mdio_write(tp, 0x15, 0x0390);
-                rtl8168_mdio_write(tp, 0x19, 0xc017);
-                rtl8168_mdio_write(tp, 0x15, 0x0391);
-                rtl8168_mdio_write(tp, 0x19, 0x0004);
-                rtl8168_mdio_write(tp, 0x15, 0x0392);
-                rtl8168_mdio_write(tp, 0x19, 0xd64f);
-                rtl8168_mdio_write(tp, 0x15, 0x0393);
-                rtl8168_mdio_write(tp, 0x19, 0x00f4);
-                rtl8168_mdio_write(tp, 0x15, 0x0397);
-                rtl8168_mdio_write(tp, 0x19, 0x4098);
-                rtl8168_mdio_write(tp, 0x15, 0x0398);
-                rtl8168_mdio_write(tp, 0x19, 0x4408);
-                rtl8168_mdio_write(tp, 0x15, 0x0399);
-                rtl8168_mdio_write(tp, 0x19, 0x55bf);
-                rtl8168_mdio_write(tp, 0x15, 0x039a);
-                rtl8168_mdio_write(tp, 0x19, 0x4bb9);
-                rtl8168_mdio_write(tp, 0x15, 0x039b);
-                rtl8168_mdio_write(tp, 0x19, 0x6810);
-                rtl8168_mdio_write(tp, 0x15, 0x039c);
-                rtl8168_mdio_write(tp, 0x19, 0x4b29);
-                rtl8168_mdio_write(tp, 0x15, 0x039d);
-                rtl8168_mdio_write(tp, 0x19, 0x4041);
-                rtl8168_mdio_write(tp, 0x15, 0x039e);
-                rtl8168_mdio_write(tp, 0x19, 0x442a);
-                rtl8168_mdio_write(tp, 0x15, 0x039f);
-                rtl8168_mdio_write(tp, 0x19, 0x4029);
-                rtl8168_mdio_write(tp, 0x15, 0x03aa);
-                rtl8168_mdio_write(tp, 0x19, 0x33b8);
-                rtl8168_mdio_write(tp, 0x15, 0x03b6);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03b7);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03b8);
-                rtl8168_mdio_write(tp, 0x19, 0x543f);
-                rtl8168_mdio_write(tp, 0x15, 0x03b9);
-                rtl8168_mdio_write(tp, 0x19, 0x499a);
-                rtl8168_mdio_write(tp, 0x15, 0x03ba);
-                rtl8168_mdio_write(tp, 0x19, 0x7c40);
-                rtl8168_mdio_write(tp, 0x15, 0x03bb);
-                rtl8168_mdio_write(tp, 0x19, 0x4c40);
-                rtl8168_mdio_write(tp, 0x15, 0x03bc);
-                rtl8168_mdio_write(tp, 0x19, 0x490a);
-                rtl8168_mdio_write(tp, 0x15, 0x03bd);
-                rtl8168_mdio_write(tp, 0x19, 0x405e);
-                rtl8168_mdio_write(tp, 0x15, 0x03c2);
-                rtl8168_mdio_write(tp, 0x19, 0x9a03);
-                rtl8168_mdio_write(tp, 0x15, 0x03c4);
-                rtl8168_mdio_write(tp, 0x19, 0x0015);
-                rtl8168_mdio_write(tp, 0x15, 0x03c5);
-                rtl8168_mdio_write(tp, 0x19, 0x9e03);
-                rtl8168_mdio_write(tp, 0x15, 0x03c8);
-                rtl8168_mdio_write(tp, 0x19, 0x9cf7);
-                rtl8168_mdio_write(tp, 0x15, 0x03c9);
-                rtl8168_mdio_write(tp, 0x19, 0x7c12);
-                rtl8168_mdio_write(tp, 0x15, 0x03ca);
-                rtl8168_mdio_write(tp, 0x19, 0x4c52);
-                rtl8168_mdio_write(tp, 0x15, 0x03cb);
-                rtl8168_mdio_write(tp, 0x19, 0x4458);
-                rtl8168_mdio_write(tp, 0x15, 0x03cd);
-                rtl8168_mdio_write(tp, 0x19, 0x4c40);
-                rtl8168_mdio_write(tp, 0x15, 0x03ce);
-                rtl8168_mdio_write(tp, 0x19, 0x33bf);
-                rtl8168_mdio_write(tp, 0x15, 0x03cf);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d0);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d1);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d5);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d6);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d7);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d8);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d9);
-                rtl8168_mdio_write(tp, 0x19, 0x49bb);
-                rtl8168_mdio_write(tp, 0x15, 0x03da);
-                rtl8168_mdio_write(tp, 0x19, 0x4478);
-                rtl8168_mdio_write(tp, 0x15, 0x03db);
-                rtl8168_mdio_write(tp, 0x19, 0x492b);
-                rtl8168_mdio_write(tp, 0x15, 0x03dc);
-                rtl8168_mdio_write(tp, 0x19, 0x7c01);
-                rtl8168_mdio_write(tp, 0x15, 0x03dd);
-                rtl8168_mdio_write(tp, 0x19, 0x4c00);
-                rtl8168_mdio_write(tp, 0x15, 0x03de);
-                rtl8168_mdio_write(tp, 0x19, 0xbd1a);
-                rtl8168_mdio_write(tp, 0x15, 0x03df);
-                rtl8168_mdio_write(tp, 0x19, 0xc428);
-                rtl8168_mdio_write(tp, 0x15, 0x03e0);
-                rtl8168_mdio_write(tp, 0x19, 0x0008);
-                rtl8168_mdio_write(tp, 0x15, 0x03e1);
-                rtl8168_mdio_write(tp, 0x19, 0x9cfd);
-                rtl8168_mdio_write(tp, 0x15, 0x03e2);
-                rtl8168_mdio_write(tp, 0x19, 0x7c12);
-                rtl8168_mdio_write(tp, 0x15, 0x03e3);
-                rtl8168_mdio_write(tp, 0x19, 0x4c52);
-                rtl8168_mdio_write(tp, 0x15, 0x03e4);
-                rtl8168_mdio_write(tp, 0x19, 0x4458);
-                rtl8168_mdio_write(tp, 0x15, 0x03e5);
-                rtl8168_mdio_write(tp, 0x19, 0x7c12);
-                rtl8168_mdio_write(tp, 0x15, 0x03e6);
-                rtl8168_mdio_write(tp, 0x19, 0x4c40);
-                rtl8168_mdio_write(tp, 0x15, 0x03e7);
-                rtl8168_mdio_write(tp, 0x19, 0x33de);
-                rtl8168_mdio_write(tp, 0x15, 0x03e8);
-                rtl8168_mdio_write(tp, 0x19, 0xc218);
-                rtl8168_mdio_write(tp, 0x15, 0x03e9);
-                rtl8168_mdio_write(tp, 0x19, 0x0002);
-                rtl8168_mdio_write(tp, 0x15, 0x03ea);
-                rtl8168_mdio_write(tp, 0x19, 0x32df);
-                rtl8168_mdio_write(tp, 0x15, 0x03eb);
-                rtl8168_mdio_write(tp, 0x19, 0x3316);
-                rtl8168_mdio_write(tp, 0x15, 0x03ec);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03ed);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03ee);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03ef);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03f7);
-                rtl8168_mdio_write(tp, 0x19, 0x330c);
-                rtl8168_mdio_write(tp, 0x16, 0x0306);
-                rtl8168_mdio_write(tp, 0x16, 0x0300);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0xfff6);
-                rtl8168_mdio_write(tp, 0x06, 0x0080);
-                rtl8168_mdio_write(tp, 0x05, 0x8000);
-                rtl8168_mdio_write(tp, 0x06, 0x0280);
-                rtl8168_mdio_write(tp, 0x06, 0x48f7);
-                rtl8168_mdio_write(tp, 0x06, 0x00e0);
-                rtl8168_mdio_write(tp, 0x06, 0xfff7);
-                rtl8168_mdio_write(tp, 0x06, 0xa080);
-                rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                rtl8168_mdio_write(tp, 0x06, 0xf602);
-                rtl8168_mdio_write(tp, 0x06, 0x0200);
-                rtl8168_mdio_write(tp, 0x06, 0x0280);
-                rtl8168_mdio_write(tp, 0x06, 0x9002);
-                rtl8168_mdio_write(tp, 0x06, 0x0224);
-                rtl8168_mdio_write(tp, 0x06, 0x0202);
-                rtl8168_mdio_write(tp, 0x06, 0x3402);
-                rtl8168_mdio_write(tp, 0x06, 0x027f);
-                rtl8168_mdio_write(tp, 0x06, 0x0280);
-                rtl8168_mdio_write(tp, 0x06, 0xa602);
-                rtl8168_mdio_write(tp, 0x06, 0x80bf);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x88e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b89);
-                rtl8168_mdio_write(tp, 0x06, 0x1e01);
-                rtl8168_mdio_write(tp, 0x06, 0xe18b);
-                rtl8168_mdio_write(tp, 0x06, 0x8a1e);
-                rtl8168_mdio_write(tp, 0x06, 0x01e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8b);
-                rtl8168_mdio_write(tp, 0x06, 0x1e01);
-                rtl8168_mdio_write(tp, 0x06, 0xe18b);
-                rtl8168_mdio_write(tp, 0x06, 0x8c1e);
-                rtl8168_mdio_write(tp, 0x06, 0x01e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-                rtl8168_mdio_write(tp, 0x06, 0x1e01);
-                rtl8168_mdio_write(tp, 0x06, 0xe18b);
-                rtl8168_mdio_write(tp, 0x06, 0x8e1e);
-                rtl8168_mdio_write(tp, 0x06, 0x01a0);
-                rtl8168_mdio_write(tp, 0x06, 0x00c7);
-                rtl8168_mdio_write(tp, 0x06, 0xaebb);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xe600);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xee03);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xefb8);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xe902);
-                rtl8168_mdio_write(tp, 0x06, 0xee8b);
-                rtl8168_mdio_write(tp, 0x06, 0x8285);
-                rtl8168_mdio_write(tp, 0x06, 0xee8b);
-                rtl8168_mdio_write(tp, 0x06, 0x8520);
-                rtl8168_mdio_write(tp, 0x06, 0xee8b);
-                rtl8168_mdio_write(tp, 0x06, 0x8701);
-                rtl8168_mdio_write(tp, 0x06, 0xd481);
-                rtl8168_mdio_write(tp, 0x06, 0x35e4);
-                rtl8168_mdio_write(tp, 0x06, 0x8b94);
-                rtl8168_mdio_write(tp, 0x06, 0xe58b);
-                rtl8168_mdio_write(tp, 0x06, 0x95bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8b88);
-                rtl8168_mdio_write(tp, 0x06, 0xec00);
-                rtl8168_mdio_write(tp, 0x06, 0x19a9);
-                rtl8168_mdio_write(tp, 0x06, 0x8b90);
-                rtl8168_mdio_write(tp, 0x06, 0xf9ee);
-                rtl8168_mdio_write(tp, 0x06, 0xfff6);
-                rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                rtl8168_mdio_write(tp, 0x06, 0xfff7);
-                rtl8168_mdio_write(tp, 0x06, 0xffe0);
-                rtl8168_mdio_write(tp, 0x06, 0xe140);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e1);
-                rtl8168_mdio_write(tp, 0x06, 0x41f7);
-                rtl8168_mdio_write(tp, 0x06, 0x2ff6);
-                rtl8168_mdio_write(tp, 0x06, 0x28e4);
-                rtl8168_mdio_write(tp, 0x06, 0xe140);
-                rtl8168_mdio_write(tp, 0x06, 0xe5e1);
-                rtl8168_mdio_write(tp, 0x06, 0x4104);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b89);
-                rtl8168_mdio_write(tp, 0x06, 0xad20);
-                rtl8168_mdio_write(tp, 0x06, 0x0dee);
-                rtl8168_mdio_write(tp, 0x06, 0x8b89);
-                rtl8168_mdio_write(tp, 0x06, 0x0002);
-                rtl8168_mdio_write(tp, 0x06, 0x82f4);
-                rtl8168_mdio_write(tp, 0x06, 0x021f);
-                rtl8168_mdio_write(tp, 0x06, 0x4102);
-                rtl8168_mdio_write(tp, 0x06, 0x2812);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-                rtl8168_mdio_write(tp, 0x06, 0xad20);
-                rtl8168_mdio_write(tp, 0x06, 0x10ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-                rtl8168_mdio_write(tp, 0x06, 0x0002);
-                rtl8168_mdio_write(tp, 0x06, 0x139d);
-                rtl8168_mdio_write(tp, 0x06, 0x0281);
-                rtl8168_mdio_write(tp, 0x06, 0xd602);
-                rtl8168_mdio_write(tp, 0x06, 0x1f99);
-                rtl8168_mdio_write(tp, 0x06, 0x0227);
-                rtl8168_mdio_write(tp, 0x06, 0xeafc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x8ead);
-                rtl8168_mdio_write(tp, 0x06, 0x2014);
-                rtl8168_mdio_write(tp, 0x06, 0xf620);
-                rtl8168_mdio_write(tp, 0x06, 0xe48b);
-                rtl8168_mdio_write(tp, 0x06, 0x8e02);
-                rtl8168_mdio_write(tp, 0x06, 0x8104);
-                rtl8168_mdio_write(tp, 0x06, 0x021b);
-                rtl8168_mdio_write(tp, 0x06, 0xf402);
-                rtl8168_mdio_write(tp, 0x06, 0x2c9c);
-                rtl8168_mdio_write(tp, 0x06, 0x0281);
-                rtl8168_mdio_write(tp, 0x06, 0x7902);
-                rtl8168_mdio_write(tp, 0x06, 0x8443);
-                rtl8168_mdio_write(tp, 0x06, 0xad22);
-                rtl8168_mdio_write(tp, 0x06, 0x11f6);
-                rtl8168_mdio_write(tp, 0x06, 0x22e4);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-                rtl8168_mdio_write(tp, 0x06, 0x022c);
-                rtl8168_mdio_write(tp, 0x06, 0x4602);
-                rtl8168_mdio_write(tp, 0x06, 0x2ac5);
-                rtl8168_mdio_write(tp, 0x06, 0x0229);
-                rtl8168_mdio_write(tp, 0x06, 0x2002);
-                rtl8168_mdio_write(tp, 0x06, 0x2b91);
-                rtl8168_mdio_write(tp, 0x06, 0xad25);
-                rtl8168_mdio_write(tp, 0x06, 0x11f6);
-                rtl8168_mdio_write(tp, 0x06, 0x25e4);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-                rtl8168_mdio_write(tp, 0x06, 0x0284);
-                rtl8168_mdio_write(tp, 0x06, 0xe202);
-                rtl8168_mdio_write(tp, 0x06, 0x043a);
-                rtl8168_mdio_write(tp, 0x06, 0x021a);
-                rtl8168_mdio_write(tp, 0x06, 0x5902);
-                rtl8168_mdio_write(tp, 0x06, 0x2bfc);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x00e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe001);
-                rtl8168_mdio_write(tp, 0x06, 0xad27);
-                rtl8168_mdio_write(tp, 0x06, 0x1fd1);
-                rtl8168_mdio_write(tp, 0x06, 0x01bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8638);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe020);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x21ad);
-                rtl8168_mdio_write(tp, 0x06, 0x200e);
-                rtl8168_mdio_write(tp, 0x06, 0xd100);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x3802);
-                rtl8168_mdio_write(tp, 0x06, 0x2f50);
-                rtl8168_mdio_write(tp, 0x06, 0xbf3d);
-                rtl8168_mdio_write(tp, 0x06, 0x3902);
-                rtl8168_mdio_write(tp, 0x06, 0x2eb0);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefc);
-                rtl8168_mdio_write(tp, 0x06, 0x0402);
-                rtl8168_mdio_write(tp, 0x06, 0x8591);
-                rtl8168_mdio_write(tp, 0x06, 0x0281);
-                rtl8168_mdio_write(tp, 0x06, 0x3c05);
-                rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0xfee1);
-                rtl8168_mdio_write(tp, 0x06, 0xe2ff);
-                rtl8168_mdio_write(tp, 0x06, 0xad2d);
-                rtl8168_mdio_write(tp, 0x06, 0x1ae0);
-                rtl8168_mdio_write(tp, 0x06, 0xe14e);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e1);
-                rtl8168_mdio_write(tp, 0x06, 0x4fac);
-                rtl8168_mdio_write(tp, 0x06, 0x2d22);
-                rtl8168_mdio_write(tp, 0x06, 0xf603);
-                rtl8168_mdio_write(tp, 0x06, 0x0203);
-                rtl8168_mdio_write(tp, 0x06, 0x36f7);
-                rtl8168_mdio_write(tp, 0x06, 0x03f7);
-                rtl8168_mdio_write(tp, 0x06, 0x06bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8622);
-                rtl8168_mdio_write(tp, 0x06, 0x022e);
-                rtl8168_mdio_write(tp, 0x06, 0xb0ae);
-                rtl8168_mdio_write(tp, 0x06, 0x11e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe14e);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e1);
-                rtl8168_mdio_write(tp, 0x06, 0x4fad);
-                rtl8168_mdio_write(tp, 0x06, 0x2d08);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x2d02);
-                rtl8168_mdio_write(tp, 0x06, 0x2eb0);
-                rtl8168_mdio_write(tp, 0x06, 0xf606);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x87ad);
-                rtl8168_mdio_write(tp, 0x06, 0x204c);
-                rtl8168_mdio_write(tp, 0x06, 0xd200);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0x0058);
-                rtl8168_mdio_write(tp, 0x06, 0x010c);
-                rtl8168_mdio_write(tp, 0x06, 0x021e);
-                rtl8168_mdio_write(tp, 0x06, 0x20e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe000);
-                rtl8168_mdio_write(tp, 0x06, 0x5810);
-                rtl8168_mdio_write(tp, 0x06, 0x1e20);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x3658);
-                rtl8168_mdio_write(tp, 0x06, 0x031e);
-                rtl8168_mdio_write(tp, 0x06, 0x20e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe022);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x2358);
-                rtl8168_mdio_write(tp, 0x06, 0xe01e);
-                rtl8168_mdio_write(tp, 0x06, 0x20e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8ae6);
-                rtl8168_mdio_write(tp, 0x06, 0x1f02);
-                rtl8168_mdio_write(tp, 0x06, 0x9e22);
-                rtl8168_mdio_write(tp, 0x06, 0xe68a);
-                rtl8168_mdio_write(tp, 0x06, 0xe6ad);
-                rtl8168_mdio_write(tp, 0x06, 0x3214);
-                rtl8168_mdio_write(tp, 0x06, 0xad34);
-                rtl8168_mdio_write(tp, 0x06, 0x11ef);
-                rtl8168_mdio_write(tp, 0x06, 0x0258);
-                rtl8168_mdio_write(tp, 0x06, 0x039e);
-                rtl8168_mdio_write(tp, 0x06, 0x07ad);
-                rtl8168_mdio_write(tp, 0x06, 0x3508);
-                rtl8168_mdio_write(tp, 0x06, 0x5ac0);
-                rtl8168_mdio_write(tp, 0x06, 0x9f04);
-                rtl8168_mdio_write(tp, 0x06, 0xd101);
-                rtl8168_mdio_write(tp, 0x06, 0xae02);
-                rtl8168_mdio_write(tp, 0x06, 0xd100);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x3e02);
-                rtl8168_mdio_write(tp, 0x06, 0x2f50);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefd);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-                rtl8168_mdio_write(tp, 0x06, 0xfae0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b81);
-                rtl8168_mdio_write(tp, 0x06, 0xac26);
-                rtl8168_mdio_write(tp, 0x06, 0x0ee0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b81);
-                rtl8168_mdio_write(tp, 0x06, 0xac21);
-                rtl8168_mdio_write(tp, 0x06, 0x08e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b87);
-                rtl8168_mdio_write(tp, 0x06, 0xac24);
-                rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                rtl8168_mdio_write(tp, 0x06, 0x6bee);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-                rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                rtl8168_mdio_write(tp, 0x06, 0xe0eb);
-                rtl8168_mdio_write(tp, 0x06, 0x00e2);
-                rtl8168_mdio_write(tp, 0x06, 0xe07c);
-                rtl8168_mdio_write(tp, 0x06, 0xe3e0);
-                rtl8168_mdio_write(tp, 0x06, 0x7da5);
-                rtl8168_mdio_write(tp, 0x06, 0x1111);
-                rtl8168_mdio_write(tp, 0x06, 0x15d2);
-                rtl8168_mdio_write(tp, 0x06, 0x60d6);
-                rtl8168_mdio_write(tp, 0x06, 0x6666);
-                rtl8168_mdio_write(tp, 0x06, 0x0207);
-                rtl8168_mdio_write(tp, 0x06, 0xf9d2);
-                rtl8168_mdio_write(tp, 0x06, 0xa0d6);
-                rtl8168_mdio_write(tp, 0x06, 0xaaaa);
-                rtl8168_mdio_write(tp, 0x06, 0x0207);
-                rtl8168_mdio_write(tp, 0x06, 0xf902);
-                rtl8168_mdio_write(tp, 0x06, 0x825c);
-                rtl8168_mdio_write(tp, 0x06, 0xae44);
-                rtl8168_mdio_write(tp, 0x06, 0xa566);
-                rtl8168_mdio_write(tp, 0x06, 0x6602);
-                rtl8168_mdio_write(tp, 0x06, 0xae38);
-                rtl8168_mdio_write(tp, 0x06, 0xa5aa);
-                rtl8168_mdio_write(tp, 0x06, 0xaa02);
-                rtl8168_mdio_write(tp, 0x06, 0xae32);
-                rtl8168_mdio_write(tp, 0x06, 0xeee0);
-                rtl8168_mdio_write(tp, 0x06, 0xea04);
-                rtl8168_mdio_write(tp, 0x06, 0xeee0);
-                rtl8168_mdio_write(tp, 0x06, 0xeb06);
-                rtl8168_mdio_write(tp, 0x06, 0xe2e0);
-                rtl8168_mdio_write(tp, 0x06, 0x7ce3);
-                rtl8168_mdio_write(tp, 0x06, 0xe07d);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x38e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe039);
-                rtl8168_mdio_write(tp, 0x06, 0xad2e);
-                rtl8168_mdio_write(tp, 0x06, 0x21ad);
-                rtl8168_mdio_write(tp, 0x06, 0x3f13);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e4);
-                rtl8168_mdio_write(tp, 0x06, 0x14e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe415);
-                rtl8168_mdio_write(tp, 0x06, 0x6880);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e4);
-                rtl8168_mdio_write(tp, 0x06, 0x14e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe415);
-                rtl8168_mdio_write(tp, 0x06, 0x0282);
-                rtl8168_mdio_write(tp, 0x06, 0x5cae);
-                rtl8168_mdio_write(tp, 0x06, 0x0bac);
-                rtl8168_mdio_write(tp, 0x06, 0x3e02);
-                rtl8168_mdio_write(tp, 0x06, 0xae06);
-                rtl8168_mdio_write(tp, 0x06, 0x0282);
-                rtl8168_mdio_write(tp, 0x06, 0x8602);
-                rtl8168_mdio_write(tp, 0x06, 0x82b0);
-                rtl8168_mdio_write(tp, 0x06, 0xfefd);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b2e);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x81ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2605);
-                rtl8168_mdio_write(tp, 0x06, 0x0221);
-                rtl8168_mdio_write(tp, 0x06, 0xf3f7);
-                rtl8168_mdio_write(tp, 0x06, 0x28e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b81);
-                rtl8168_mdio_write(tp, 0x06, 0xad21);
-                rtl8168_mdio_write(tp, 0x06, 0x0502);
-                rtl8168_mdio_write(tp, 0x06, 0x22f8);
-                rtl8168_mdio_write(tp, 0x06, 0xf729);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x87ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2405);
-                rtl8168_mdio_write(tp, 0x06, 0x0282);
-                rtl8168_mdio_write(tp, 0x06, 0xebf7);
-                rtl8168_mdio_write(tp, 0x06, 0x2ae5);
-                rtl8168_mdio_write(tp, 0x06, 0x8b2e);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b81);
-                rtl8168_mdio_write(tp, 0x06, 0xad26);
-                rtl8168_mdio_write(tp, 0x06, 0x0302);
-                rtl8168_mdio_write(tp, 0x06, 0x2134);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x81ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2109);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x2eac);
-                rtl8168_mdio_write(tp, 0x06, 0x2003);
-                rtl8168_mdio_write(tp, 0x06, 0x0283);
-                rtl8168_mdio_write(tp, 0x06, 0x52e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b87);
-                rtl8168_mdio_write(tp, 0x06, 0xad24);
-                rtl8168_mdio_write(tp, 0x06, 0x09e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b2e);
-                rtl8168_mdio_write(tp, 0x06, 0xac21);
-                rtl8168_mdio_write(tp, 0x06, 0x0302);
-                rtl8168_mdio_write(tp, 0x06, 0x8337);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b2e);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x81ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2608);
-                rtl8168_mdio_write(tp, 0x06, 0xe085);
-                rtl8168_mdio_write(tp, 0x06, 0xd2ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2502);
-                rtl8168_mdio_write(tp, 0x06, 0xf628);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x81ad);
-                rtl8168_mdio_write(tp, 0x06, 0x210a);
-                rtl8168_mdio_write(tp, 0x06, 0xe086);
-                rtl8168_mdio_write(tp, 0x06, 0x0af6);
-                rtl8168_mdio_write(tp, 0x06, 0x27a0);
-                rtl8168_mdio_write(tp, 0x06, 0x0502);
-                rtl8168_mdio_write(tp, 0x06, 0xf629);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x87ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2408);
-                rtl8168_mdio_write(tp, 0x06, 0xe08a);
-                rtl8168_mdio_write(tp, 0x06, 0xedad);
-                rtl8168_mdio_write(tp, 0x06, 0x2002);
-                rtl8168_mdio_write(tp, 0x06, 0xf62a);
-                rtl8168_mdio_write(tp, 0x06, 0xe58b);
-                rtl8168_mdio_write(tp, 0x06, 0x2ea1);
-                rtl8168_mdio_write(tp, 0x06, 0x0003);
-                rtl8168_mdio_write(tp, 0x06, 0x0221);
-                rtl8168_mdio_write(tp, 0x06, 0x11fc);
-                rtl8168_mdio_write(tp, 0x06, 0x04ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8aed);
-                rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8aec);
-                rtl8168_mdio_write(tp, 0x06, 0x0004);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b87);
-                rtl8168_mdio_write(tp, 0x06, 0xad24);
-                rtl8168_mdio_write(tp, 0x06, 0x3ae0);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0xeb58);
-                rtl8168_mdio_write(tp, 0x06, 0xf8d1);
-                rtl8168_mdio_write(tp, 0x06, 0x01e4);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-                rtl8168_mdio_write(tp, 0x06, 0xe5e0);
-                rtl8168_mdio_write(tp, 0x06, 0xebe0);
-                rtl8168_mdio_write(tp, 0x06, 0xe07c);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x7d5c);
-                rtl8168_mdio_write(tp, 0x06, 0x00ff);
-                rtl8168_mdio_write(tp, 0x06, 0x3c00);
-                rtl8168_mdio_write(tp, 0x06, 0x1eab);
-                rtl8168_mdio_write(tp, 0x06, 0x1ce0);
-                rtl8168_mdio_write(tp, 0x06, 0xe04c);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x4d58);
-                rtl8168_mdio_write(tp, 0x06, 0xc1e4);
-                rtl8168_mdio_write(tp, 0x06, 0xe04c);
-                rtl8168_mdio_write(tp, 0x06, 0xe5e0);
-                rtl8168_mdio_write(tp, 0x06, 0x4de0);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ee);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0x3ce4);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ee);
-                rtl8168_mdio_write(tp, 0x06, 0xe5e0);
-                rtl8168_mdio_write(tp, 0x06, 0xeffc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x87ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2412);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0xeee1);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ef);
-                rtl8168_mdio_write(tp, 0x06, 0x59c3);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-                rtl8168_mdio_write(tp, 0x06, 0xeee5);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ef);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xed01);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b81);
-                rtl8168_mdio_write(tp, 0x06, 0xac25);
-                rtl8168_mdio_write(tp, 0x06, 0x0502);
-                rtl8168_mdio_write(tp, 0x06, 0x8363);
-                rtl8168_mdio_write(tp, 0x06, 0xae03);
-                rtl8168_mdio_write(tp, 0x06, 0x0225);
-                rtl8168_mdio_write(tp, 0x06, 0x16fc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xfae0);
-                rtl8168_mdio_write(tp, 0x06, 0x860a);
-                rtl8168_mdio_write(tp, 0x06, 0xa000);
-                rtl8168_mdio_write(tp, 0x06, 0x19e0);
-                rtl8168_mdio_write(tp, 0x06, 0x860b);
-                rtl8168_mdio_write(tp, 0x06, 0xe18b);
-                rtl8168_mdio_write(tp, 0x06, 0x331b);
-                rtl8168_mdio_write(tp, 0x06, 0x109e);
-                rtl8168_mdio_write(tp, 0x06, 0x04aa);
-                rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                rtl8168_mdio_write(tp, 0x06, 0x06ee);
-                rtl8168_mdio_write(tp, 0x06, 0x860a);
-                rtl8168_mdio_write(tp, 0x06, 0x01ae);
-                rtl8168_mdio_write(tp, 0x06, 0xe602);
-                rtl8168_mdio_write(tp, 0x06, 0x241e);
-                rtl8168_mdio_write(tp, 0x06, 0xae14);
-                rtl8168_mdio_write(tp, 0x06, 0xa001);
-                rtl8168_mdio_write(tp, 0x06, 0x1402);
-                rtl8168_mdio_write(tp, 0x06, 0x2426);
-                rtl8168_mdio_write(tp, 0x06, 0xbf26);
-                rtl8168_mdio_write(tp, 0x06, 0x6d02);
-                rtl8168_mdio_write(tp, 0x06, 0x2eb0);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0b00);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0a02);
-                rtl8168_mdio_write(tp, 0x06, 0xaf84);
-                rtl8168_mdio_write(tp, 0x06, 0x3ca0);
-                rtl8168_mdio_write(tp, 0x06, 0x0252);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0400);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0500);
-                rtl8168_mdio_write(tp, 0x06, 0xe086);
-                rtl8168_mdio_write(tp, 0x06, 0x0be1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b32);
-                rtl8168_mdio_write(tp, 0x06, 0x1b10);
-                rtl8168_mdio_write(tp, 0x06, 0x9e04);
-                rtl8168_mdio_write(tp, 0x06, 0xaa02);
-                rtl8168_mdio_write(tp, 0x06, 0xaecb);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0b00);
-                rtl8168_mdio_write(tp, 0x06, 0x0224);
-                rtl8168_mdio_write(tp, 0x06, 0x3ae2);
-                rtl8168_mdio_write(tp, 0x06, 0x8604);
-                rtl8168_mdio_write(tp, 0x06, 0xe386);
-                rtl8168_mdio_write(tp, 0x06, 0x05ef);
-                rtl8168_mdio_write(tp, 0x06, 0x65e2);
-                rtl8168_mdio_write(tp, 0x06, 0x8606);
-                rtl8168_mdio_write(tp, 0x06, 0xe386);
-                rtl8168_mdio_write(tp, 0x06, 0x071b);
-                rtl8168_mdio_write(tp, 0x06, 0x56aa);
-                rtl8168_mdio_write(tp, 0x06, 0x0eef);
-                rtl8168_mdio_write(tp, 0x06, 0x56e6);
-                rtl8168_mdio_write(tp, 0x06, 0x8606);
-                rtl8168_mdio_write(tp, 0x06, 0xe786);
-                rtl8168_mdio_write(tp, 0x06, 0x07e2);
-                rtl8168_mdio_write(tp, 0x06, 0x8609);
-                rtl8168_mdio_write(tp, 0x06, 0xe686);
-                rtl8168_mdio_write(tp, 0x06, 0x08e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8609);
-                rtl8168_mdio_write(tp, 0x06, 0xa000);
-                rtl8168_mdio_write(tp, 0x06, 0x07ee);
-                rtl8168_mdio_write(tp, 0x06, 0x860a);
-                rtl8168_mdio_write(tp, 0x06, 0x03af);
-                rtl8168_mdio_write(tp, 0x06, 0x8369);
-                rtl8168_mdio_write(tp, 0x06, 0x0224);
-                rtl8168_mdio_write(tp, 0x06, 0x8e02);
-                rtl8168_mdio_write(tp, 0x06, 0x2426);
-                rtl8168_mdio_write(tp, 0x06, 0xae48);
-                rtl8168_mdio_write(tp, 0x06, 0xa003);
-                rtl8168_mdio_write(tp, 0x06, 0x21e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8608);
-                rtl8168_mdio_write(tp, 0x06, 0xe186);
-                rtl8168_mdio_write(tp, 0x06, 0x091b);
-                rtl8168_mdio_write(tp, 0x06, 0x019e);
-                rtl8168_mdio_write(tp, 0x06, 0x0caa);
-                rtl8168_mdio_write(tp, 0x06, 0x0502);
-                rtl8168_mdio_write(tp, 0x06, 0x249d);
-                rtl8168_mdio_write(tp, 0x06, 0xaee7);
-                rtl8168_mdio_write(tp, 0x06, 0x0224);
-                rtl8168_mdio_write(tp, 0x06, 0x8eae);
-                rtl8168_mdio_write(tp, 0x06, 0xe2ee);
-                rtl8168_mdio_write(tp, 0x06, 0x860a);
-                rtl8168_mdio_write(tp, 0x06, 0x04ee);
-                rtl8168_mdio_write(tp, 0x06, 0x860b);
-                rtl8168_mdio_write(tp, 0x06, 0x00af);
-                rtl8168_mdio_write(tp, 0x06, 0x8369);
-                rtl8168_mdio_write(tp, 0x06, 0xa004);
-                rtl8168_mdio_write(tp, 0x06, 0x15e0);
-                rtl8168_mdio_write(tp, 0x06, 0x860b);
-                rtl8168_mdio_write(tp, 0x06, 0xe18b);
-                rtl8168_mdio_write(tp, 0x06, 0x341b);
-                rtl8168_mdio_write(tp, 0x06, 0x109e);
-                rtl8168_mdio_write(tp, 0x06, 0x05aa);
-                rtl8168_mdio_write(tp, 0x06, 0x03af);
-                rtl8168_mdio_write(tp, 0x06, 0x8383);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0a05);
-                rtl8168_mdio_write(tp, 0x06, 0xae0c);
-                rtl8168_mdio_write(tp, 0x06, 0xa005);
-                rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                rtl8168_mdio_write(tp, 0x06, 0x0702);
-                rtl8168_mdio_write(tp, 0x06, 0x2309);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0a00);
-                rtl8168_mdio_write(tp, 0x06, 0xfeef);
-                rtl8168_mdio_write(tp, 0x06, 0x96fe);
-                rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xfbe0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b85);
-                rtl8168_mdio_write(tp, 0x06, 0xad25);
-                rtl8168_mdio_write(tp, 0x06, 0x22e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe022);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x23e2);
-                rtl8168_mdio_write(tp, 0x06, 0xe036);
-                rtl8168_mdio_write(tp, 0x06, 0xe3e0);
-                rtl8168_mdio_write(tp, 0x06, 0x375a);
-                rtl8168_mdio_write(tp, 0x06, 0xc40d);
-                rtl8168_mdio_write(tp, 0x06, 0x0158);
-                rtl8168_mdio_write(tp, 0x06, 0x021e);
-                rtl8168_mdio_write(tp, 0x06, 0x20e3);
-                rtl8168_mdio_write(tp, 0x06, 0x8ae7);
-                rtl8168_mdio_write(tp, 0x06, 0xac31);
-                rtl8168_mdio_write(tp, 0x06, 0x60ac);
-                rtl8168_mdio_write(tp, 0x06, 0x3a08);
-                rtl8168_mdio_write(tp, 0x06, 0xac3e);
-                rtl8168_mdio_write(tp, 0x06, 0x26ae);
-                rtl8168_mdio_write(tp, 0x06, 0x67af);
-                rtl8168_mdio_write(tp, 0x06, 0x84db);
-                rtl8168_mdio_write(tp, 0x06, 0xad37);
-                rtl8168_mdio_write(tp, 0x06, 0x61e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8ae8);
-                rtl8168_mdio_write(tp, 0x06, 0x10e4);
-                rtl8168_mdio_write(tp, 0x06, 0x8ae8);
-                rtl8168_mdio_write(tp, 0x06, 0xe18a);
-                rtl8168_mdio_write(tp, 0x06, 0xe91b);
-                rtl8168_mdio_write(tp, 0x06, 0x109e);
-                rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                rtl8168_mdio_write(tp, 0x06, 0x51d1);
-                rtl8168_mdio_write(tp, 0x06, 0x00bf);
-                rtl8168_mdio_write(tp, 0x06, 0x863b);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8ae8);
-                rtl8168_mdio_write(tp, 0x06, 0x00ae);
-                rtl8168_mdio_write(tp, 0x06, 0x43ad);
-                rtl8168_mdio_write(tp, 0x06, 0x3627);
-                rtl8168_mdio_write(tp, 0x06, 0xe08a);
-                rtl8168_mdio_write(tp, 0x06, 0xeee1);
-                rtl8168_mdio_write(tp, 0x06, 0x8aef);
-                rtl8168_mdio_write(tp, 0x06, 0xef74);
-                rtl8168_mdio_write(tp, 0x06, 0xe08a);
-                rtl8168_mdio_write(tp, 0x06, 0xeae1);
-                rtl8168_mdio_write(tp, 0x06, 0x8aeb);
-                rtl8168_mdio_write(tp, 0x06, 0x1b74);
-                rtl8168_mdio_write(tp, 0x06, 0x9e2e);
-                rtl8168_mdio_write(tp, 0x06, 0x14e4);
-                rtl8168_mdio_write(tp, 0x06, 0x8aea);
-                rtl8168_mdio_write(tp, 0x06, 0xe58a);
-                rtl8168_mdio_write(tp, 0x06, 0xebef);
-                rtl8168_mdio_write(tp, 0x06, 0x74e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8aee);
-                rtl8168_mdio_write(tp, 0x06, 0xe18a);
-                rtl8168_mdio_write(tp, 0x06, 0xef1b);
-                rtl8168_mdio_write(tp, 0x06, 0x479e);
-                rtl8168_mdio_write(tp, 0x06, 0x0fae);
-                rtl8168_mdio_write(tp, 0x06, 0x19ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8aea);
-                rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8aeb);
-                rtl8168_mdio_write(tp, 0x06, 0x00ae);
-                rtl8168_mdio_write(tp, 0x06, 0x0fac);
-                rtl8168_mdio_write(tp, 0x06, 0x390c);
-                rtl8168_mdio_write(tp, 0x06, 0xd101);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x3b02);
-                rtl8168_mdio_write(tp, 0x06, 0x2f50);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xe800);
-                rtl8168_mdio_write(tp, 0x06, 0xe68a);
-                rtl8168_mdio_write(tp, 0x06, 0xe7ff);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefd);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-                rtl8168_mdio_write(tp, 0x06, 0xfaef);
-                rtl8168_mdio_write(tp, 0x06, 0x69e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe022);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x2358);
-                rtl8168_mdio_write(tp, 0x06, 0xc4e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b6e);
-                rtl8168_mdio_write(tp, 0x06, 0x1f10);
-                rtl8168_mdio_write(tp, 0x06, 0x9e24);
-                rtl8168_mdio_write(tp, 0x06, 0xe48b);
-                rtl8168_mdio_write(tp, 0x06, 0x6ead);
-                rtl8168_mdio_write(tp, 0x06, 0x2218);
-                rtl8168_mdio_write(tp, 0x06, 0xac27);
-                rtl8168_mdio_write(tp, 0x06, 0x0dac);
-                rtl8168_mdio_write(tp, 0x06, 0x2605);
-                rtl8168_mdio_write(tp, 0x06, 0x0203);
-                rtl8168_mdio_write(tp, 0x06, 0x8fae);
-                rtl8168_mdio_write(tp, 0x06, 0x1302);
-                rtl8168_mdio_write(tp, 0x06, 0x03c8);
-                rtl8168_mdio_write(tp, 0x06, 0xae0e);
-                rtl8168_mdio_write(tp, 0x06, 0x0203);
-                rtl8168_mdio_write(tp, 0x06, 0xe102);
-                rtl8168_mdio_write(tp, 0x06, 0x8520);
-                rtl8168_mdio_write(tp, 0x06, 0xae06);
-                rtl8168_mdio_write(tp, 0x06, 0x0203);
-                rtl8168_mdio_write(tp, 0x06, 0x8f02);
-                rtl8168_mdio_write(tp, 0x06, 0x8566);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefd);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x82ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2737);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x4402);
-                rtl8168_mdio_write(tp, 0x06, 0x2f23);
-                rtl8168_mdio_write(tp, 0x06, 0xac28);
-                rtl8168_mdio_write(tp, 0x06, 0x2ed1);
-                rtl8168_mdio_write(tp, 0x06, 0x01bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8647);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8641);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x23e5);
-                rtl8168_mdio_write(tp, 0x06, 0x8af0);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x22e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe023);
-                rtl8168_mdio_write(tp, 0x06, 0xac2e);
-                rtl8168_mdio_write(tp, 0x06, 0x04d1);
-                rtl8168_mdio_write(tp, 0x06, 0x01ae);
-                rtl8168_mdio_write(tp, 0x06, 0x02d1);
-                rtl8168_mdio_write(tp, 0x06, 0x00bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8641);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50d1);
-                rtl8168_mdio_write(tp, 0x06, 0x01bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8644);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50ef);
-                rtl8168_mdio_write(tp, 0x06, 0x96fe);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x4702);
-                rtl8168_mdio_write(tp, 0x06, 0x2f23);
-                rtl8168_mdio_write(tp, 0x06, 0xad28);
-                rtl8168_mdio_write(tp, 0x06, 0x19d1);
-                rtl8168_mdio_write(tp, 0x06, 0x00bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8644);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8af0);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x4102);
-                rtl8168_mdio_write(tp, 0x06, 0x2f50);
-                rtl8168_mdio_write(tp, 0x06, 0xd100);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x4702);
-                rtl8168_mdio_write(tp, 0x06, 0x2f50);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0xfee1);
-                rtl8168_mdio_write(tp, 0x06, 0xe2ff);
-                rtl8168_mdio_write(tp, 0x06, 0xad2e);
-                rtl8168_mdio_write(tp, 0x06, 0x63e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe038);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x39ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2f10);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x34e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe035);
-                rtl8168_mdio_write(tp, 0x06, 0xf726);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-                rtl8168_mdio_write(tp, 0x06, 0x34e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe035);
-                rtl8168_mdio_write(tp, 0x06, 0xae0e);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0xd6e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe2d7);
-                rtl8168_mdio_write(tp, 0x06, 0xf728);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e2);
-                rtl8168_mdio_write(tp, 0x06, 0xd6e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe2d7);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0x34e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe235);
-                rtl8168_mdio_write(tp, 0x06, 0xf72b);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e2);
-                rtl8168_mdio_write(tp, 0x06, 0x34e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe235);
-                rtl8168_mdio_write(tp, 0x06, 0xd07d);
-                rtl8168_mdio_write(tp, 0x06, 0xb0fe);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0x34e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe235);
-                rtl8168_mdio_write(tp, 0x06, 0xf62b);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e2);
-                rtl8168_mdio_write(tp, 0x06, 0x34e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe235);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x34e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe035);
-                rtl8168_mdio_write(tp, 0x06, 0xf626);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-                rtl8168_mdio_write(tp, 0x06, 0x34e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe035);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0xd6e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe2d7);
-                rtl8168_mdio_write(tp, 0x06, 0xf628);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e2);
-                rtl8168_mdio_write(tp, 0x06, 0xd6e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe2d7);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xae20);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0xa725);
-                rtl8168_mdio_write(tp, 0x06, 0xe50a);
-                rtl8168_mdio_write(tp, 0x06, 0x1de5);
-                rtl8168_mdio_write(tp, 0x06, 0x0a2c);
-                rtl8168_mdio_write(tp, 0x06, 0xe50a);
-                rtl8168_mdio_write(tp, 0x06, 0x6de5);
-                rtl8168_mdio_write(tp, 0x06, 0x0a1d);
-                rtl8168_mdio_write(tp, 0x06, 0xe50a);
-                rtl8168_mdio_write(tp, 0x06, 0x1ce5);
-                rtl8168_mdio_write(tp, 0x06, 0x0a2d);
-                rtl8168_mdio_write(tp, 0x06, 0xa755);
-                rtl8168_mdio_write(tp, 0x06, 0x00e2);
-                rtl8168_mdio_write(tp, 0x06, 0x3488);
-                rtl8168_mdio_write(tp, 0x06, 0xe200);
-                rtl8168_mdio_write(tp, 0x06, 0xcce2);
-                rtl8168_mdio_write(tp, 0x06, 0x0055);
-                rtl8168_mdio_write(tp, 0x06, 0xe020);
-                rtl8168_mdio_write(tp, 0x06, 0x55e2);
-                rtl8168_mdio_write(tp, 0x06, 0xd600);
-                rtl8168_mdio_write(tp, 0x06, 0xe24a);
-                gphy_val = rtl8168_mdio_read(tp, 0x01);
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x01, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x00);
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x00, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, 0x17, 0x2179);
-                rtl8168_mdio_write(tp, 0x1f, 0x0001);
-                rtl8168_mdio_write(tp, 0x10, 0xf274);
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x0042);
-                rtl8168_mdio_write(tp, 0x15, 0x0f00);
-                rtl8168_mdio_write(tp, 0x15, 0x0f00);
-                rtl8168_mdio_write(tp, 0x16, 0x7408);
-                rtl8168_mdio_write(tp, 0x15, 0x0e00);
-                rtl8168_mdio_write(tp, 0x15, 0x0f00);
-                rtl8168_mdio_write(tp, 0x15, 0x0f01);
-                rtl8168_mdio_write(tp, 0x16, 0x4000);
-                rtl8168_mdio_write(tp, 0x15, 0x0e01);
-                rtl8168_mdio_write(tp, 0x15, 0x0f01);
-                rtl8168_mdio_write(tp, 0x15, 0x0f02);
-                rtl8168_mdio_write(tp, 0x16, 0x9400);
-                rtl8168_mdio_write(tp, 0x15, 0x0e02);
-                rtl8168_mdio_write(tp, 0x15, 0x0f02);
-                rtl8168_mdio_write(tp, 0x15, 0x0f03);
-                rtl8168_mdio_write(tp, 0x16, 0x7408);
-                rtl8168_mdio_write(tp, 0x15, 0x0e03);
-                rtl8168_mdio_write(tp, 0x15, 0x0f03);
-                rtl8168_mdio_write(tp, 0x15, 0x0f04);
-                rtl8168_mdio_write(tp, 0x16, 0x4008);
-                rtl8168_mdio_write(tp, 0x15, 0x0e04);
-                rtl8168_mdio_write(tp, 0x15, 0x0f04);
-                rtl8168_mdio_write(tp, 0x15, 0x0f05);
-                rtl8168_mdio_write(tp, 0x16, 0x9400);
-                rtl8168_mdio_write(tp, 0x15, 0x0e05);
-                rtl8168_mdio_write(tp, 0x15, 0x0f05);
-                rtl8168_mdio_write(tp, 0x15, 0x0f06);
-                rtl8168_mdio_write(tp, 0x16, 0x0803);
-                rtl8168_mdio_write(tp, 0x15, 0x0e06);
-                rtl8168_mdio_write(tp, 0x15, 0x0f06);
-                rtl8168_mdio_write(tp, 0x15, 0x0d00);
-                rtl8168_mdio_write(tp, 0x15, 0x0100);
-                rtl8168_mdio_write(tp, 0x1f, 0x0001);
-                rtl8168_mdio_write(tp, 0x10, 0xf074);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, 0x17, 0x2149);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                for (i = 0; i < 200; i++) {
-                        udelay(100);
-                        gphy_val = rtl8168_mdio_read(tp, 0x00);
-                        if (gphy_val & BIT_7)
-                                break;
-                }
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x0023);
-                gphy_val = rtl8168_mdio_read(tp, 0x17);
-                gphy_val &= ~(BIT_0);
-                if (tp->RequiredSecLanDonglePatch)
-                        gphy_val &= ~(BIT_2);
-                rtl8168_mdio_write(tp, 0x17, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x0023);
-                gphy_val = rtl8168_mdio_read(tp, 0x17);
-                gphy_val |= BIT_14;
-                rtl8168_mdio_write(tp, 0x17, gphy_val);
-                rtl8168_mdio_write(tp, 0x1e, 0x0020);
-                gphy_val = rtl8168_mdio_read(tp, 0x1b);
-                gphy_val |= BIT_7;
-                rtl8168_mdio_write(tp, 0x1b, gphy_val);
-                rtl8168_mdio_write(tp, 0x1e, 0x0041);
-                rtl8168_mdio_write(tp, 0x15, 0x0e02);
-                rtl8168_mdio_write(tp, 0x1e, 0x0028);
-                gphy_val = rtl8168_mdio_read(tp, 0x19);
-                gphy_val |= BIT_15;
-                rtl8168_mdio_write(tp, 0x19, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        } else {
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, 0x00, 0x1800);
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x0023);
-                rtl8168_mdio_write(tp, 0x17, 0x0117);
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x002C);
-                rtl8168_mdio_write(tp, 0x1B, 0x5000);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                rtl8168_mdio_write(tp, 0x16, 0x4104);
-                for (i = 0; i < 200; i++) {
-                        udelay(100);
-                        gphy_val = rtl8168_mdio_read(tp, 0x1E);
-                        gphy_val &= 0x03FF;
-                        if (gphy_val==0x000C)
-                                break;
-                }
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                for (i = 0; i < 200; i++) {
-                        udelay(100);
-                        gphy_val = rtl8168_mdio_read(tp, 0x07);
-                        if ((gphy_val & BIT_5) == 0)
-                                break;
-                }
-                gphy_val = rtl8168_mdio_read(tp, 0x07);
-                if (gphy_val & BIT_5) {
-                        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                        rtl8168_mdio_write(tp, 0x1e, 0x00a1);
-                        rtl8168_mdio_write(tp, 0x17, 0x1000);
-                        rtl8168_mdio_write(tp, 0x17, 0x0000);
-                        rtl8168_mdio_write(tp, 0x17, 0x2000);
-                        rtl8168_mdio_write(tp, 0x1e, 0x002f);
-                        rtl8168_mdio_write(tp, 0x18, 0x9bfb);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                        rtl8168_mdio_write(tp, 0x07, 0x0000);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                }
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0xfff6);
-                rtl8168_mdio_write(tp, 0x06, 0x0080);
-                gphy_val = rtl8168_mdio_read(tp, 0x00);
-                gphy_val &= ~(BIT_7);
-                rtl8168_mdio_write(tp, 0x00, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x08);
-                gphy_val &= ~(BIT_7);
-                rtl8168_mdio_write(tp, 0x08, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x0023);
-                rtl8168_mdio_write(tp, 0x16, 0x0306);
-                rtl8168_mdio_write(tp, 0x16, 0x0307);
-                rtl8168_mdio_write(tp, 0x15, 0x000e);
-                rtl8168_mdio_write(tp, 0x19, 0x000a);
-                rtl8168_mdio_write(tp, 0x15, 0x0010);
-                rtl8168_mdio_write(tp, 0x19, 0x0008);
-                rtl8168_mdio_write(tp, 0x15, 0x0018);
-                rtl8168_mdio_write(tp, 0x19, 0x4801);
-                rtl8168_mdio_write(tp, 0x15, 0x0019);
-                rtl8168_mdio_write(tp, 0x19, 0x6801);
-                rtl8168_mdio_write(tp, 0x15, 0x001a);
-                rtl8168_mdio_write(tp, 0x19, 0x66a1);
-                rtl8168_mdio_write(tp, 0x15, 0x001f);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0020);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0021);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0022);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0023);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0024);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0025);
-                rtl8168_mdio_write(tp, 0x19, 0x64a1);
-                rtl8168_mdio_write(tp, 0x15, 0x0026);
-                rtl8168_mdio_write(tp, 0x19, 0x40ea);
-                rtl8168_mdio_write(tp, 0x15, 0x0027);
-                rtl8168_mdio_write(tp, 0x19, 0x4503);
-                rtl8168_mdio_write(tp, 0x15, 0x0028);
-                rtl8168_mdio_write(tp, 0x19, 0x9f00);
-                rtl8168_mdio_write(tp, 0x15, 0x0029);
-                rtl8168_mdio_write(tp, 0x19, 0xa631);
-                rtl8168_mdio_write(tp, 0x15, 0x002a);
-                rtl8168_mdio_write(tp, 0x19, 0x9717);
-                rtl8168_mdio_write(tp, 0x15, 0x002b);
-                rtl8168_mdio_write(tp, 0x19, 0x302c);
-                rtl8168_mdio_write(tp, 0x15, 0x002c);
-                rtl8168_mdio_write(tp, 0x19, 0x4802);
-                rtl8168_mdio_write(tp, 0x15, 0x002d);
-                rtl8168_mdio_write(tp, 0x19, 0x58da);
-                rtl8168_mdio_write(tp, 0x15, 0x002e);
-                rtl8168_mdio_write(tp, 0x19, 0x400d);
-                rtl8168_mdio_write(tp, 0x15, 0x002f);
-                rtl8168_mdio_write(tp, 0x19, 0x4488);
-                rtl8168_mdio_write(tp, 0x15, 0x0030);
-                rtl8168_mdio_write(tp, 0x19, 0x9e00);
-                rtl8168_mdio_write(tp, 0x15, 0x0031);
-                rtl8168_mdio_write(tp, 0x19, 0x63c8);
-                rtl8168_mdio_write(tp, 0x15, 0x0032);
-                rtl8168_mdio_write(tp, 0x19, 0x6481);
-                rtl8168_mdio_write(tp, 0x15, 0x0033);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0034);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0035);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0036);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0037);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0038);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0039);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x003a);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x003b);
-                rtl8168_mdio_write(tp, 0x19, 0x63e8);
-                rtl8168_mdio_write(tp, 0x15, 0x003c);
-                rtl8168_mdio_write(tp, 0x19, 0x7d00);
-                rtl8168_mdio_write(tp, 0x15, 0x003d);
-                rtl8168_mdio_write(tp, 0x19, 0x59d4);
-                rtl8168_mdio_write(tp, 0x15, 0x003e);
-                rtl8168_mdio_write(tp, 0x19, 0x63f8);
-                rtl8168_mdio_write(tp, 0x15, 0x0040);
-                rtl8168_mdio_write(tp, 0x19, 0x64a1);
-                rtl8168_mdio_write(tp, 0x15, 0x0041);
-                rtl8168_mdio_write(tp, 0x19, 0x30de);
-                rtl8168_mdio_write(tp, 0x15, 0x0044);
-                rtl8168_mdio_write(tp, 0x19, 0x480f);
-                rtl8168_mdio_write(tp, 0x15, 0x0045);
-                rtl8168_mdio_write(tp, 0x19, 0x6800);
-                rtl8168_mdio_write(tp, 0x15, 0x0046);
-                rtl8168_mdio_write(tp, 0x19, 0x6680);
-                rtl8168_mdio_write(tp, 0x15, 0x0047);
-                rtl8168_mdio_write(tp, 0x19, 0x7c10);
-                rtl8168_mdio_write(tp, 0x15, 0x0048);
-                rtl8168_mdio_write(tp, 0x19, 0x63c8);
-                rtl8168_mdio_write(tp, 0x15, 0x0049);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004a);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004b);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004c);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004d);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004e);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x004f);
-                rtl8168_mdio_write(tp, 0x19, 0x40ea);
-                rtl8168_mdio_write(tp, 0x15, 0x0050);
-                rtl8168_mdio_write(tp, 0x19, 0x4503);
-                rtl8168_mdio_write(tp, 0x15, 0x0051);
-                rtl8168_mdio_write(tp, 0x19, 0x58ca);
-                rtl8168_mdio_write(tp, 0x15, 0x0052);
-                rtl8168_mdio_write(tp, 0x19, 0x63c8);
-                rtl8168_mdio_write(tp, 0x15, 0x0053);
-                rtl8168_mdio_write(tp, 0x19, 0x63d8);
-                rtl8168_mdio_write(tp, 0x15, 0x0054);
-                rtl8168_mdio_write(tp, 0x19, 0x66a0);
-                rtl8168_mdio_write(tp, 0x15, 0x0055);
-                rtl8168_mdio_write(tp, 0x19, 0x9f00);
-                rtl8168_mdio_write(tp, 0x15, 0x0056);
-                rtl8168_mdio_write(tp, 0x19, 0x3000);
-                rtl8168_mdio_write(tp, 0x15, 0x00a1);
-                rtl8168_mdio_write(tp, 0x19, 0x3044);
-                rtl8168_mdio_write(tp, 0x15, 0x00ab);
-                rtl8168_mdio_write(tp, 0x19, 0x5820);
-                rtl8168_mdio_write(tp, 0x15, 0x00ac);
-                rtl8168_mdio_write(tp, 0x19, 0x5e04);
-                rtl8168_mdio_write(tp, 0x15, 0x00ad);
-                rtl8168_mdio_write(tp, 0x19, 0xb60c);
-                rtl8168_mdio_write(tp, 0x15, 0x00af);
-                rtl8168_mdio_write(tp, 0x19, 0x000a);
-                rtl8168_mdio_write(tp, 0x15, 0x00b2);
-                rtl8168_mdio_write(tp, 0x19, 0x30b9);
-                rtl8168_mdio_write(tp, 0x15, 0x00b9);
-                rtl8168_mdio_write(tp, 0x19, 0x4408);
-                rtl8168_mdio_write(tp, 0x15, 0x00ba);
-                rtl8168_mdio_write(tp, 0x19, 0x480b);
-                rtl8168_mdio_write(tp, 0x15, 0x00bb);
-                rtl8168_mdio_write(tp, 0x19, 0x5e00);
-                rtl8168_mdio_write(tp, 0x15, 0x00bc);
-                rtl8168_mdio_write(tp, 0x19, 0x405f);
-                rtl8168_mdio_write(tp, 0x15, 0x00bd);
-                rtl8168_mdio_write(tp, 0x19, 0x4448);
-                rtl8168_mdio_write(tp, 0x15, 0x00be);
-                rtl8168_mdio_write(tp, 0x19, 0x4020);
-                rtl8168_mdio_write(tp, 0x15, 0x00bf);
-                rtl8168_mdio_write(tp, 0x19, 0x4468);
-                rtl8168_mdio_write(tp, 0x15, 0x00c0);
-                rtl8168_mdio_write(tp, 0x19, 0x9c02);
-                rtl8168_mdio_write(tp, 0x15, 0x00c1);
-                rtl8168_mdio_write(tp, 0x19, 0x58a0);
-                rtl8168_mdio_write(tp, 0x15, 0x00c2);
-                rtl8168_mdio_write(tp, 0x19, 0xb605);
-                rtl8168_mdio_write(tp, 0x15, 0x00c3);
-                rtl8168_mdio_write(tp, 0x19, 0xc0d3);
-                rtl8168_mdio_write(tp, 0x15, 0x00c4);
-                rtl8168_mdio_write(tp, 0x19, 0x00e6);
-                rtl8168_mdio_write(tp, 0x15, 0x00c5);
-                rtl8168_mdio_write(tp, 0x19, 0xdaec);
-                rtl8168_mdio_write(tp, 0x15, 0x00c6);
-                rtl8168_mdio_write(tp, 0x19, 0x00fa);
-                rtl8168_mdio_write(tp, 0x15, 0x00c7);
-                rtl8168_mdio_write(tp, 0x19, 0x9df9);
-                rtl8168_mdio_write(tp, 0x15, 0x0112);
-                rtl8168_mdio_write(tp, 0x19, 0x6421);
-                rtl8168_mdio_write(tp, 0x15, 0x0113);
-                rtl8168_mdio_write(tp, 0x19, 0x7c08);
-                rtl8168_mdio_write(tp, 0x15, 0x0114);
-                rtl8168_mdio_write(tp, 0x19, 0x63f0);
-                rtl8168_mdio_write(tp, 0x15, 0x0115);
-                rtl8168_mdio_write(tp, 0x19, 0x4003);
-                rtl8168_mdio_write(tp, 0x15, 0x0116);
-                rtl8168_mdio_write(tp, 0x19, 0x4418);
-                rtl8168_mdio_write(tp, 0x15, 0x0117);
-                rtl8168_mdio_write(tp, 0x19, 0x9b00);
-                rtl8168_mdio_write(tp, 0x15, 0x0118);
-                rtl8168_mdio_write(tp, 0x19, 0x6461);
-                rtl8168_mdio_write(tp, 0x15, 0x0119);
-                rtl8168_mdio_write(tp, 0x19, 0x64e1);
-                rtl8168_mdio_write(tp, 0x15, 0x011a);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0150);
-                rtl8168_mdio_write(tp, 0x19, 0x7c80);
-                rtl8168_mdio_write(tp, 0x15, 0x0151);
-                rtl8168_mdio_write(tp, 0x19, 0x6461);
-                rtl8168_mdio_write(tp, 0x15, 0x0152);
-                rtl8168_mdio_write(tp, 0x19, 0x4003);
-                rtl8168_mdio_write(tp, 0x15, 0x0153);
-                rtl8168_mdio_write(tp, 0x19, 0x4540);
-                rtl8168_mdio_write(tp, 0x15, 0x0154);
-                rtl8168_mdio_write(tp, 0x19, 0x9f00);
-                rtl8168_mdio_write(tp, 0x15, 0x0155);
-                rtl8168_mdio_write(tp, 0x19, 0x9d00);
-                rtl8168_mdio_write(tp, 0x15, 0x0156);
-                rtl8168_mdio_write(tp, 0x19, 0x7c40);
-                rtl8168_mdio_write(tp, 0x15, 0x0157);
-                rtl8168_mdio_write(tp, 0x19, 0x6421);
-                rtl8168_mdio_write(tp, 0x15, 0x0158);
-                rtl8168_mdio_write(tp, 0x19, 0x7c80);
-                rtl8168_mdio_write(tp, 0x15, 0x0159);
-                rtl8168_mdio_write(tp, 0x19, 0x64a1);
-                rtl8168_mdio_write(tp, 0x15, 0x015a);
-                rtl8168_mdio_write(tp, 0x19, 0x30fe);
-                rtl8168_mdio_write(tp, 0x15, 0x029c);
-                rtl8168_mdio_write(tp, 0x19, 0x0070);
-                rtl8168_mdio_write(tp, 0x15, 0x02b2);
-                rtl8168_mdio_write(tp, 0x19, 0x005a);
-                rtl8168_mdio_write(tp, 0x15, 0x02bd);
-                rtl8168_mdio_write(tp, 0x19, 0xa522);
-                rtl8168_mdio_write(tp, 0x15, 0x02ce);
-                rtl8168_mdio_write(tp, 0x19, 0xb63e);
-                rtl8168_mdio_write(tp, 0x15, 0x02d9);
-                rtl8168_mdio_write(tp, 0x19, 0x32df);
-                rtl8168_mdio_write(tp, 0x15, 0x02df);
-                rtl8168_mdio_write(tp, 0x19, 0x4500);
-                rtl8168_mdio_write(tp, 0x15, 0x02f4);
-                rtl8168_mdio_write(tp, 0x19, 0xb618);
-                rtl8168_mdio_write(tp, 0x15, 0x02fb);
-                rtl8168_mdio_write(tp, 0x19, 0xb900);
-                rtl8168_mdio_write(tp, 0x15, 0x02fc);
-                rtl8168_mdio_write(tp, 0x19, 0x49b5);
-                rtl8168_mdio_write(tp, 0x15, 0x02fd);
-                rtl8168_mdio_write(tp, 0x19, 0x6812);
-                rtl8168_mdio_write(tp, 0x15, 0x02fe);
-                rtl8168_mdio_write(tp, 0x19, 0x66a0);
-                rtl8168_mdio_write(tp, 0x15, 0x02ff);
-                rtl8168_mdio_write(tp, 0x19, 0x9900);
-                rtl8168_mdio_write(tp, 0x15, 0x0300);
-                rtl8168_mdio_write(tp, 0x19, 0x64a0);
-                rtl8168_mdio_write(tp, 0x15, 0x0301);
-                rtl8168_mdio_write(tp, 0x19, 0x3316);
-                rtl8168_mdio_write(tp, 0x15, 0x0308);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x030c);
-                rtl8168_mdio_write(tp, 0x19, 0x3000);
-                rtl8168_mdio_write(tp, 0x15, 0x0312);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0313);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0314);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0315);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0316);
-                rtl8168_mdio_write(tp, 0x19, 0x49b5);
-                rtl8168_mdio_write(tp, 0x15, 0x0317);
-                rtl8168_mdio_write(tp, 0x19, 0x7d00);
-                rtl8168_mdio_write(tp, 0x15, 0x0318);
-                rtl8168_mdio_write(tp, 0x19, 0x4d00);
-                rtl8168_mdio_write(tp, 0x15, 0x0319);
-                rtl8168_mdio_write(tp, 0x19, 0x6810);
-                rtl8168_mdio_write(tp, 0x15, 0x031a);
-                rtl8168_mdio_write(tp, 0x19, 0x6c08);
-                rtl8168_mdio_write(tp, 0x15, 0x031b);
-                rtl8168_mdio_write(tp, 0x19, 0x4925);
-                rtl8168_mdio_write(tp, 0x15, 0x031c);
-                rtl8168_mdio_write(tp, 0x19, 0x403b);
-                rtl8168_mdio_write(tp, 0x15, 0x031d);
-                rtl8168_mdio_write(tp, 0x19, 0xa602);
-                rtl8168_mdio_write(tp, 0x15, 0x031e);
-                rtl8168_mdio_write(tp, 0x19, 0x402f);
-                rtl8168_mdio_write(tp, 0x15, 0x031f);
-                rtl8168_mdio_write(tp, 0x19, 0x4484);
-                rtl8168_mdio_write(tp, 0x15, 0x0320);
-                rtl8168_mdio_write(tp, 0x19, 0x40c8);
-                rtl8168_mdio_write(tp, 0x15, 0x0321);
-                rtl8168_mdio_write(tp, 0x19, 0x44c4);
-                rtl8168_mdio_write(tp, 0x15, 0x0322);
-                rtl8168_mdio_write(tp, 0x19, 0x404f);
-                rtl8168_mdio_write(tp, 0x15, 0x0323);
-                rtl8168_mdio_write(tp, 0x19, 0x44c8);
-                rtl8168_mdio_write(tp, 0x15, 0x0324);
-                rtl8168_mdio_write(tp, 0x19, 0xd64f);
-                rtl8168_mdio_write(tp, 0x15, 0x0325);
-                rtl8168_mdio_write(tp, 0x19, 0x00e7);
-                rtl8168_mdio_write(tp, 0x15, 0x0326);
-                rtl8168_mdio_write(tp, 0x19, 0x7c08);
-                rtl8168_mdio_write(tp, 0x15, 0x0327);
-                rtl8168_mdio_write(tp, 0x19, 0x8203);
-                rtl8168_mdio_write(tp, 0x15, 0x0328);
-                rtl8168_mdio_write(tp, 0x19, 0x4d48);
-                rtl8168_mdio_write(tp, 0x15, 0x0329);
-                rtl8168_mdio_write(tp, 0x19, 0x332b);
-                rtl8168_mdio_write(tp, 0x15, 0x032a);
-                rtl8168_mdio_write(tp, 0x19, 0x4d40);
-                rtl8168_mdio_write(tp, 0x15, 0x032c);
-                rtl8168_mdio_write(tp, 0x19, 0x00f8);
-                rtl8168_mdio_write(tp, 0x15, 0x032d);
-                rtl8168_mdio_write(tp, 0x19, 0x82b2);
-                rtl8168_mdio_write(tp, 0x15, 0x032f);
-                rtl8168_mdio_write(tp, 0x19, 0x00b0);
-                rtl8168_mdio_write(tp, 0x15, 0x0332);
-                rtl8168_mdio_write(tp, 0x19, 0x91f2);
-                rtl8168_mdio_write(tp, 0x15, 0x033f);
-                rtl8168_mdio_write(tp, 0x19, 0xb6cd);
-                rtl8168_mdio_write(tp, 0x15, 0x0340);
-                rtl8168_mdio_write(tp, 0x19, 0x9e01);
-                rtl8168_mdio_write(tp, 0x15, 0x0341);
-                rtl8168_mdio_write(tp, 0x19, 0xd11d);
-                rtl8168_mdio_write(tp, 0x15, 0x0342);
-                rtl8168_mdio_write(tp, 0x19, 0x009d);
-                rtl8168_mdio_write(tp, 0x15, 0x0343);
-                rtl8168_mdio_write(tp, 0x19, 0xbb1c);
-                rtl8168_mdio_write(tp, 0x15, 0x0344);
-                rtl8168_mdio_write(tp, 0x19, 0x8102);
-                rtl8168_mdio_write(tp, 0x15, 0x0345);
-                rtl8168_mdio_write(tp, 0x19, 0x3348);
-                rtl8168_mdio_write(tp, 0x15, 0x0346);
-                rtl8168_mdio_write(tp, 0x19, 0xa231);
-                rtl8168_mdio_write(tp, 0x15, 0x0347);
-                rtl8168_mdio_write(tp, 0x19, 0x335b);
-                rtl8168_mdio_write(tp, 0x15, 0x0348);
-                rtl8168_mdio_write(tp, 0x19, 0x91f7);
-                rtl8168_mdio_write(tp, 0x15, 0x0349);
-                rtl8168_mdio_write(tp, 0x19, 0xc218);
-                rtl8168_mdio_write(tp, 0x15, 0x034a);
-                rtl8168_mdio_write(tp, 0x19, 0x00f5);
-                rtl8168_mdio_write(tp, 0x15, 0x034b);
-                rtl8168_mdio_write(tp, 0x19, 0x335b);
-                rtl8168_mdio_write(tp, 0x15, 0x034c);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x034d);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x034e);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x034f);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x0350);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x035b);
-                rtl8168_mdio_write(tp, 0x19, 0xa23c);
-                rtl8168_mdio_write(tp, 0x15, 0x035c);
-                rtl8168_mdio_write(tp, 0x19, 0x7c08);
-                rtl8168_mdio_write(tp, 0x15, 0x035d);
-                rtl8168_mdio_write(tp, 0x19, 0x4c00);
-                rtl8168_mdio_write(tp, 0x15, 0x035e);
-                rtl8168_mdio_write(tp, 0x19, 0x3397);
-                rtl8168_mdio_write(tp, 0x15, 0x0363);
-                rtl8168_mdio_write(tp, 0x19, 0xb6a9);
-                rtl8168_mdio_write(tp, 0x15, 0x0366);
-                rtl8168_mdio_write(tp, 0x19, 0x00f5);
-                rtl8168_mdio_write(tp, 0x15, 0x0382);
-                rtl8168_mdio_write(tp, 0x19, 0x7c40);
-                rtl8168_mdio_write(tp, 0x15, 0x0388);
-                rtl8168_mdio_write(tp, 0x19, 0x0084);
-                rtl8168_mdio_write(tp, 0x15, 0x0389);
-                rtl8168_mdio_write(tp, 0x19, 0xdd17);
-                rtl8168_mdio_write(tp, 0x15, 0x038a);
-                rtl8168_mdio_write(tp, 0x19, 0x000b);
-                rtl8168_mdio_write(tp, 0x15, 0x038b);
-                rtl8168_mdio_write(tp, 0x19, 0xa10a);
-                rtl8168_mdio_write(tp, 0x15, 0x038c);
-                rtl8168_mdio_write(tp, 0x19, 0x337e);
-                rtl8168_mdio_write(tp, 0x15, 0x038d);
-                rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-                rtl8168_mdio_write(tp, 0x15, 0x038e);
-                rtl8168_mdio_write(tp, 0x19, 0xa107);
-                rtl8168_mdio_write(tp, 0x15, 0x038f);
-                rtl8168_mdio_write(tp, 0x19, 0x6c08);
-                rtl8168_mdio_write(tp, 0x15, 0x0390);
-                rtl8168_mdio_write(tp, 0x19, 0xc017);
-                rtl8168_mdio_write(tp, 0x15, 0x0391);
-                rtl8168_mdio_write(tp, 0x19, 0x0004);
-                rtl8168_mdio_write(tp, 0x15, 0x0392);
-                rtl8168_mdio_write(tp, 0x19, 0xd64f);
-                rtl8168_mdio_write(tp, 0x15, 0x0393);
-                rtl8168_mdio_write(tp, 0x19, 0x00f4);
-                rtl8168_mdio_write(tp, 0x15, 0x0397);
-                rtl8168_mdio_write(tp, 0x19, 0x4098);
-                rtl8168_mdio_write(tp, 0x15, 0x0398);
-                rtl8168_mdio_write(tp, 0x19, 0x4408);
-                rtl8168_mdio_write(tp, 0x15, 0x0399);
-                rtl8168_mdio_write(tp, 0x19, 0x55bf);
-                rtl8168_mdio_write(tp, 0x15, 0x039a);
-                rtl8168_mdio_write(tp, 0x19, 0x4bb9);
-                rtl8168_mdio_write(tp, 0x15, 0x039b);
-                rtl8168_mdio_write(tp, 0x19, 0x6810);
-                rtl8168_mdio_write(tp, 0x15, 0x039c);
-                rtl8168_mdio_write(tp, 0x19, 0x4b29);
-                rtl8168_mdio_write(tp, 0x15, 0x039d);
-                rtl8168_mdio_write(tp, 0x19, 0x4041);
-                rtl8168_mdio_write(tp, 0x15, 0x039e);
-                rtl8168_mdio_write(tp, 0x19, 0x442a);
-                rtl8168_mdio_write(tp, 0x15, 0x039f);
-                rtl8168_mdio_write(tp, 0x19, 0x4029);
-                rtl8168_mdio_write(tp, 0x15, 0x03aa);
-                rtl8168_mdio_write(tp, 0x19, 0x33b8);
-                rtl8168_mdio_write(tp, 0x15, 0x03b6);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03b7);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03b8);
-                rtl8168_mdio_write(tp, 0x19, 0x543f);
-                rtl8168_mdio_write(tp, 0x15, 0x03b9);
-                rtl8168_mdio_write(tp, 0x19, 0x499a);
-                rtl8168_mdio_write(tp, 0x15, 0x03ba);
-                rtl8168_mdio_write(tp, 0x19, 0x7c40);
-                rtl8168_mdio_write(tp, 0x15, 0x03bb);
-                rtl8168_mdio_write(tp, 0x19, 0x4c40);
-                rtl8168_mdio_write(tp, 0x15, 0x03bc);
-                rtl8168_mdio_write(tp, 0x19, 0x490a);
-                rtl8168_mdio_write(tp, 0x15, 0x03bd);
-                rtl8168_mdio_write(tp, 0x19, 0x405e);
-                rtl8168_mdio_write(tp, 0x15, 0x03c2);
-                rtl8168_mdio_write(tp, 0x19, 0x9a03);
-                rtl8168_mdio_write(tp, 0x15, 0x03c4);
-                rtl8168_mdio_write(tp, 0x19, 0x0015);
-                rtl8168_mdio_write(tp, 0x15, 0x03c5);
-                rtl8168_mdio_write(tp, 0x19, 0x9e03);
-                rtl8168_mdio_write(tp, 0x15, 0x03c8);
-                rtl8168_mdio_write(tp, 0x19, 0x9cf7);
-                rtl8168_mdio_write(tp, 0x15, 0x03c9);
-                rtl8168_mdio_write(tp, 0x19, 0x7c12);
-                rtl8168_mdio_write(tp, 0x15, 0x03ca);
-                rtl8168_mdio_write(tp, 0x19, 0x4c52);
-                rtl8168_mdio_write(tp, 0x15, 0x03cb);
-                rtl8168_mdio_write(tp, 0x19, 0x4458);
-                rtl8168_mdio_write(tp, 0x15, 0x03cd);
-                rtl8168_mdio_write(tp, 0x19, 0x4c40);
-                rtl8168_mdio_write(tp, 0x15, 0x03ce);
-                rtl8168_mdio_write(tp, 0x19, 0x33bf);
-                rtl8168_mdio_write(tp, 0x15, 0x03cf);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d0);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d1);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d5);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d6);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d7);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d8);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03d9);
-                rtl8168_mdio_write(tp, 0x19, 0x49bb);
-                rtl8168_mdio_write(tp, 0x15, 0x03da);
-                rtl8168_mdio_write(tp, 0x19, 0x4478);
-                rtl8168_mdio_write(tp, 0x15, 0x03db);
-                rtl8168_mdio_write(tp, 0x19, 0x492b);
-                rtl8168_mdio_write(tp, 0x15, 0x03dc);
-                rtl8168_mdio_write(tp, 0x19, 0x7c01);
-                rtl8168_mdio_write(tp, 0x15, 0x03dd);
-                rtl8168_mdio_write(tp, 0x19, 0x4c00);
-                rtl8168_mdio_write(tp, 0x15, 0x03de);
-                rtl8168_mdio_write(tp, 0x19, 0xbd1a);
-                rtl8168_mdio_write(tp, 0x15, 0x03df);
-                rtl8168_mdio_write(tp, 0x19, 0xc428);
-                rtl8168_mdio_write(tp, 0x15, 0x03e0);
-                rtl8168_mdio_write(tp, 0x19, 0x0008);
-                rtl8168_mdio_write(tp, 0x15, 0x03e1);
-                rtl8168_mdio_write(tp, 0x19, 0x9cfd);
-                rtl8168_mdio_write(tp, 0x15, 0x03e2);
-                rtl8168_mdio_write(tp, 0x19, 0x7c12);
-                rtl8168_mdio_write(tp, 0x15, 0x03e3);
-                rtl8168_mdio_write(tp, 0x19, 0x4c52);
-                rtl8168_mdio_write(tp, 0x15, 0x03e4);
-                rtl8168_mdio_write(tp, 0x19, 0x4458);
-                rtl8168_mdio_write(tp, 0x15, 0x03e5);
-                rtl8168_mdio_write(tp, 0x19, 0x7c12);
-                rtl8168_mdio_write(tp, 0x15, 0x03e6);
-                rtl8168_mdio_write(tp, 0x19, 0x4c40);
-                rtl8168_mdio_write(tp, 0x15, 0x03e7);
-                rtl8168_mdio_write(tp, 0x19, 0x33de);
-                rtl8168_mdio_write(tp, 0x15, 0x03e8);
-                rtl8168_mdio_write(tp, 0x19, 0xc218);
-                rtl8168_mdio_write(tp, 0x15, 0x03e9);
-                rtl8168_mdio_write(tp, 0x19, 0x0002);
-                rtl8168_mdio_write(tp, 0x15, 0x03ea);
-                rtl8168_mdio_write(tp, 0x19, 0x32df);
-                rtl8168_mdio_write(tp, 0x15, 0x03eb);
-                rtl8168_mdio_write(tp, 0x19, 0x3316);
-                rtl8168_mdio_write(tp, 0x15, 0x03ec);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03ed);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03ee);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03ef);
-                rtl8168_mdio_write(tp, 0x19, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x03f7);
-                rtl8168_mdio_write(tp, 0x19, 0x330c);
-                rtl8168_mdio_write(tp, 0x16, 0x0306);
-                rtl8168_mdio_write(tp, 0x16, 0x0300);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0xfff6);
-                rtl8168_mdio_write(tp, 0x06, 0x0080);
-                rtl8168_mdio_write(tp, 0x05, 0x8000);
-                rtl8168_mdio_write(tp, 0x06, 0x0280);
-                rtl8168_mdio_write(tp, 0x06, 0x48f7);
-                rtl8168_mdio_write(tp, 0x06, 0x00e0);
-                rtl8168_mdio_write(tp, 0x06, 0xfff7);
-                rtl8168_mdio_write(tp, 0x06, 0xa080);
-                rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                rtl8168_mdio_write(tp, 0x06, 0xf602);
-                rtl8168_mdio_write(tp, 0x06, 0x0200);
-                rtl8168_mdio_write(tp, 0x06, 0x0280);
-                rtl8168_mdio_write(tp, 0x06, 0x9002);
-                rtl8168_mdio_write(tp, 0x06, 0x0224);
-                rtl8168_mdio_write(tp, 0x06, 0x0202);
-                rtl8168_mdio_write(tp, 0x06, 0x3402);
-                rtl8168_mdio_write(tp, 0x06, 0x027f);
-                rtl8168_mdio_write(tp, 0x06, 0x0280);
-                rtl8168_mdio_write(tp, 0x06, 0xa602);
-                rtl8168_mdio_write(tp, 0x06, 0x80bf);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x88e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b89);
-                rtl8168_mdio_write(tp, 0x06, 0x1e01);
-                rtl8168_mdio_write(tp, 0x06, 0xe18b);
-                rtl8168_mdio_write(tp, 0x06, 0x8a1e);
-                rtl8168_mdio_write(tp, 0x06, 0x01e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8b);
-                rtl8168_mdio_write(tp, 0x06, 0x1e01);
-                rtl8168_mdio_write(tp, 0x06, 0xe18b);
-                rtl8168_mdio_write(tp, 0x06, 0x8c1e);
-                rtl8168_mdio_write(tp, 0x06, 0x01e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-                rtl8168_mdio_write(tp, 0x06, 0x1e01);
-                rtl8168_mdio_write(tp, 0x06, 0xe18b);
-                rtl8168_mdio_write(tp, 0x06, 0x8e1e);
-                rtl8168_mdio_write(tp, 0x06, 0x01a0);
-                rtl8168_mdio_write(tp, 0x06, 0x00c7);
-                rtl8168_mdio_write(tp, 0x06, 0xaebb);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xe600);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xee03);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xefb8);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xe902);
-                rtl8168_mdio_write(tp, 0x06, 0xee8b);
-                rtl8168_mdio_write(tp, 0x06, 0x8285);
-                rtl8168_mdio_write(tp, 0x06, 0xee8b);
-                rtl8168_mdio_write(tp, 0x06, 0x8520);
-                rtl8168_mdio_write(tp, 0x06, 0xee8b);
-                rtl8168_mdio_write(tp, 0x06, 0x8701);
-                rtl8168_mdio_write(tp, 0x06, 0xd481);
-                rtl8168_mdio_write(tp, 0x06, 0x35e4);
-                rtl8168_mdio_write(tp, 0x06, 0x8b94);
-                rtl8168_mdio_write(tp, 0x06, 0xe58b);
-                rtl8168_mdio_write(tp, 0x06, 0x95bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8b88);
-                rtl8168_mdio_write(tp, 0x06, 0xec00);
-                rtl8168_mdio_write(tp, 0x06, 0x19a9);
-                rtl8168_mdio_write(tp, 0x06, 0x8b90);
-                rtl8168_mdio_write(tp, 0x06, 0xf9ee);
-                rtl8168_mdio_write(tp, 0x06, 0xfff6);
-                rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                rtl8168_mdio_write(tp, 0x06, 0xfff7);
-                rtl8168_mdio_write(tp, 0x06, 0xffe0);
-                rtl8168_mdio_write(tp, 0x06, 0xe140);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e1);
-                rtl8168_mdio_write(tp, 0x06, 0x41f7);
-                rtl8168_mdio_write(tp, 0x06, 0x2ff6);
-                rtl8168_mdio_write(tp, 0x06, 0x28e4);
-                rtl8168_mdio_write(tp, 0x06, 0xe140);
-                rtl8168_mdio_write(tp, 0x06, 0xe5e1);
-                rtl8168_mdio_write(tp, 0x06, 0x4104);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b89);
-                rtl8168_mdio_write(tp, 0x06, 0xad20);
-                rtl8168_mdio_write(tp, 0x06, 0x0dee);
-                rtl8168_mdio_write(tp, 0x06, 0x8b89);
-                rtl8168_mdio_write(tp, 0x06, 0x0002);
-                rtl8168_mdio_write(tp, 0x06, 0x82f4);
-                rtl8168_mdio_write(tp, 0x06, 0x021f);
-                rtl8168_mdio_write(tp, 0x06, 0x4102);
-                rtl8168_mdio_write(tp, 0x06, 0x2812);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-                rtl8168_mdio_write(tp, 0x06, 0xad20);
-                rtl8168_mdio_write(tp, 0x06, 0x10ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-                rtl8168_mdio_write(tp, 0x06, 0x0002);
-                rtl8168_mdio_write(tp, 0x06, 0x139d);
-                rtl8168_mdio_write(tp, 0x06, 0x0281);
-                rtl8168_mdio_write(tp, 0x06, 0xd602);
-                rtl8168_mdio_write(tp, 0x06, 0x1f99);
-                rtl8168_mdio_write(tp, 0x06, 0x0227);
-                rtl8168_mdio_write(tp, 0x06, 0xeafc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x8ead);
-                rtl8168_mdio_write(tp, 0x06, 0x2014);
-                rtl8168_mdio_write(tp, 0x06, 0xf620);
-                rtl8168_mdio_write(tp, 0x06, 0xe48b);
-                rtl8168_mdio_write(tp, 0x06, 0x8e02);
-                rtl8168_mdio_write(tp, 0x06, 0x8104);
-                rtl8168_mdio_write(tp, 0x06, 0x021b);
-                rtl8168_mdio_write(tp, 0x06, 0xf402);
-                rtl8168_mdio_write(tp, 0x06, 0x2c9c);
-                rtl8168_mdio_write(tp, 0x06, 0x0281);
-                rtl8168_mdio_write(tp, 0x06, 0x7902);
-                rtl8168_mdio_write(tp, 0x06, 0x8443);
-                rtl8168_mdio_write(tp, 0x06, 0xad22);
-                rtl8168_mdio_write(tp, 0x06, 0x11f6);
-                rtl8168_mdio_write(tp, 0x06, 0x22e4);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-                rtl8168_mdio_write(tp, 0x06, 0x022c);
-                rtl8168_mdio_write(tp, 0x06, 0x4602);
-                rtl8168_mdio_write(tp, 0x06, 0x2ac5);
-                rtl8168_mdio_write(tp, 0x06, 0x0229);
-                rtl8168_mdio_write(tp, 0x06, 0x2002);
-                rtl8168_mdio_write(tp, 0x06, 0x2b91);
-                rtl8168_mdio_write(tp, 0x06, 0xad25);
-                rtl8168_mdio_write(tp, 0x06, 0x11f6);
-                rtl8168_mdio_write(tp, 0x06, 0x25e4);
-                rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-                rtl8168_mdio_write(tp, 0x06, 0x0284);
-                rtl8168_mdio_write(tp, 0x06, 0xe202);
-                rtl8168_mdio_write(tp, 0x06, 0x043a);
-                rtl8168_mdio_write(tp, 0x06, 0x021a);
-                rtl8168_mdio_write(tp, 0x06, 0x5902);
-                rtl8168_mdio_write(tp, 0x06, 0x2bfc);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x00e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe001);
-                rtl8168_mdio_write(tp, 0x06, 0xad27);
-                rtl8168_mdio_write(tp, 0x06, 0x1fd1);
-                rtl8168_mdio_write(tp, 0x06, 0x01bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8638);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe020);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x21ad);
-                rtl8168_mdio_write(tp, 0x06, 0x200e);
-                rtl8168_mdio_write(tp, 0x06, 0xd100);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x3802);
-                rtl8168_mdio_write(tp, 0x06, 0x2f50);
-                rtl8168_mdio_write(tp, 0x06, 0xbf3d);
-                rtl8168_mdio_write(tp, 0x06, 0x3902);
-                rtl8168_mdio_write(tp, 0x06, 0x2eb0);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefc);
-                rtl8168_mdio_write(tp, 0x06, 0x0402);
-                rtl8168_mdio_write(tp, 0x06, 0x8591);
-                rtl8168_mdio_write(tp, 0x06, 0x0281);
-                rtl8168_mdio_write(tp, 0x06, 0x3c05);
-                rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0xfee1);
-                rtl8168_mdio_write(tp, 0x06, 0xe2ff);
-                rtl8168_mdio_write(tp, 0x06, 0xad2d);
-                rtl8168_mdio_write(tp, 0x06, 0x1ae0);
-                rtl8168_mdio_write(tp, 0x06, 0xe14e);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e1);
-                rtl8168_mdio_write(tp, 0x06, 0x4fac);
-                rtl8168_mdio_write(tp, 0x06, 0x2d22);
-                rtl8168_mdio_write(tp, 0x06, 0xf603);
-                rtl8168_mdio_write(tp, 0x06, 0x0203);
-                rtl8168_mdio_write(tp, 0x06, 0x36f7);
-                rtl8168_mdio_write(tp, 0x06, 0x03f7);
-                rtl8168_mdio_write(tp, 0x06, 0x06bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8622);
-                rtl8168_mdio_write(tp, 0x06, 0x022e);
-                rtl8168_mdio_write(tp, 0x06, 0xb0ae);
-                rtl8168_mdio_write(tp, 0x06, 0x11e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe14e);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e1);
-                rtl8168_mdio_write(tp, 0x06, 0x4fad);
-                rtl8168_mdio_write(tp, 0x06, 0x2d08);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x2d02);
-                rtl8168_mdio_write(tp, 0x06, 0x2eb0);
-                rtl8168_mdio_write(tp, 0x06, 0xf606);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x87ad);
-                rtl8168_mdio_write(tp, 0x06, 0x204c);
-                rtl8168_mdio_write(tp, 0x06, 0xd200);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0x0058);
-                rtl8168_mdio_write(tp, 0x06, 0x010c);
-                rtl8168_mdio_write(tp, 0x06, 0x021e);
-                rtl8168_mdio_write(tp, 0x06, 0x20e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe000);
-                rtl8168_mdio_write(tp, 0x06, 0x5810);
-                rtl8168_mdio_write(tp, 0x06, 0x1e20);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x3658);
-                rtl8168_mdio_write(tp, 0x06, 0x031e);
-                rtl8168_mdio_write(tp, 0x06, 0x20e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe022);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x2358);
-                rtl8168_mdio_write(tp, 0x06, 0xe01e);
-                rtl8168_mdio_write(tp, 0x06, 0x20e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8ae6);
-                rtl8168_mdio_write(tp, 0x06, 0x1f02);
-                rtl8168_mdio_write(tp, 0x06, 0x9e22);
-                rtl8168_mdio_write(tp, 0x06, 0xe68a);
-                rtl8168_mdio_write(tp, 0x06, 0xe6ad);
-                rtl8168_mdio_write(tp, 0x06, 0x3214);
-                rtl8168_mdio_write(tp, 0x06, 0xad34);
-                rtl8168_mdio_write(tp, 0x06, 0x11ef);
-                rtl8168_mdio_write(tp, 0x06, 0x0258);
-                rtl8168_mdio_write(tp, 0x06, 0x039e);
-                rtl8168_mdio_write(tp, 0x06, 0x07ad);
-                rtl8168_mdio_write(tp, 0x06, 0x3508);
-                rtl8168_mdio_write(tp, 0x06, 0x5ac0);
-                rtl8168_mdio_write(tp, 0x06, 0x9f04);
-                rtl8168_mdio_write(tp, 0x06, 0xd101);
-                rtl8168_mdio_write(tp, 0x06, 0xae02);
-                rtl8168_mdio_write(tp, 0x06, 0xd100);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x3e02);
-                rtl8168_mdio_write(tp, 0x06, 0x2f50);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefd);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-                rtl8168_mdio_write(tp, 0x06, 0xfae0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b81);
-                rtl8168_mdio_write(tp, 0x06, 0xac26);
-                rtl8168_mdio_write(tp, 0x06, 0x0ee0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b81);
-                rtl8168_mdio_write(tp, 0x06, 0xac21);
-                rtl8168_mdio_write(tp, 0x06, 0x08e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b87);
-                rtl8168_mdio_write(tp, 0x06, 0xac24);
-                rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                rtl8168_mdio_write(tp, 0x06, 0x6bee);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-                rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                rtl8168_mdio_write(tp, 0x06, 0xe0eb);
-                rtl8168_mdio_write(tp, 0x06, 0x00e2);
-                rtl8168_mdio_write(tp, 0x06, 0xe07c);
-                rtl8168_mdio_write(tp, 0x06, 0xe3e0);
-                rtl8168_mdio_write(tp, 0x06, 0x7da5);
-                rtl8168_mdio_write(tp, 0x06, 0x1111);
-                rtl8168_mdio_write(tp, 0x06, 0x15d2);
-                rtl8168_mdio_write(tp, 0x06, 0x60d6);
-                rtl8168_mdio_write(tp, 0x06, 0x6666);
-                rtl8168_mdio_write(tp, 0x06, 0x0207);
-                rtl8168_mdio_write(tp, 0x06, 0xf9d2);
-                rtl8168_mdio_write(tp, 0x06, 0xa0d6);
-                rtl8168_mdio_write(tp, 0x06, 0xaaaa);
-                rtl8168_mdio_write(tp, 0x06, 0x0207);
-                rtl8168_mdio_write(tp, 0x06, 0xf902);
-                rtl8168_mdio_write(tp, 0x06, 0x825c);
-                rtl8168_mdio_write(tp, 0x06, 0xae44);
-                rtl8168_mdio_write(tp, 0x06, 0xa566);
-                rtl8168_mdio_write(tp, 0x06, 0x6602);
-                rtl8168_mdio_write(tp, 0x06, 0xae38);
-                rtl8168_mdio_write(tp, 0x06, 0xa5aa);
-                rtl8168_mdio_write(tp, 0x06, 0xaa02);
-                rtl8168_mdio_write(tp, 0x06, 0xae32);
-                rtl8168_mdio_write(tp, 0x06, 0xeee0);
-                rtl8168_mdio_write(tp, 0x06, 0xea04);
-                rtl8168_mdio_write(tp, 0x06, 0xeee0);
-                rtl8168_mdio_write(tp, 0x06, 0xeb06);
-                rtl8168_mdio_write(tp, 0x06, 0xe2e0);
-                rtl8168_mdio_write(tp, 0x06, 0x7ce3);
-                rtl8168_mdio_write(tp, 0x06, 0xe07d);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x38e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe039);
-                rtl8168_mdio_write(tp, 0x06, 0xad2e);
-                rtl8168_mdio_write(tp, 0x06, 0x21ad);
-                rtl8168_mdio_write(tp, 0x06, 0x3f13);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e4);
-                rtl8168_mdio_write(tp, 0x06, 0x14e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe415);
-                rtl8168_mdio_write(tp, 0x06, 0x6880);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e4);
-                rtl8168_mdio_write(tp, 0x06, 0x14e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe415);
-                rtl8168_mdio_write(tp, 0x06, 0x0282);
-                rtl8168_mdio_write(tp, 0x06, 0x5cae);
-                rtl8168_mdio_write(tp, 0x06, 0x0bac);
-                rtl8168_mdio_write(tp, 0x06, 0x3e02);
-                rtl8168_mdio_write(tp, 0x06, 0xae06);
-                rtl8168_mdio_write(tp, 0x06, 0x0282);
-                rtl8168_mdio_write(tp, 0x06, 0x8602);
-                rtl8168_mdio_write(tp, 0x06, 0x82b0);
-                rtl8168_mdio_write(tp, 0x06, 0xfefd);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b2e);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x81ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2605);
-                rtl8168_mdio_write(tp, 0x06, 0x0221);
-                rtl8168_mdio_write(tp, 0x06, 0xf3f7);
-                rtl8168_mdio_write(tp, 0x06, 0x28e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b81);
-                rtl8168_mdio_write(tp, 0x06, 0xad21);
-                rtl8168_mdio_write(tp, 0x06, 0x0502);
-                rtl8168_mdio_write(tp, 0x06, 0x22f8);
-                rtl8168_mdio_write(tp, 0x06, 0xf729);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x87ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2405);
-                rtl8168_mdio_write(tp, 0x06, 0x0282);
-                rtl8168_mdio_write(tp, 0x06, 0xebf7);
-                rtl8168_mdio_write(tp, 0x06, 0x2ae5);
-                rtl8168_mdio_write(tp, 0x06, 0x8b2e);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b81);
-                rtl8168_mdio_write(tp, 0x06, 0xad26);
-                rtl8168_mdio_write(tp, 0x06, 0x0302);
-                rtl8168_mdio_write(tp, 0x06, 0x2134);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x81ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2109);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x2eac);
-                rtl8168_mdio_write(tp, 0x06, 0x2003);
-                rtl8168_mdio_write(tp, 0x06, 0x0283);
-                rtl8168_mdio_write(tp, 0x06, 0x52e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b87);
-                rtl8168_mdio_write(tp, 0x06, 0xad24);
-                rtl8168_mdio_write(tp, 0x06, 0x09e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b2e);
-                rtl8168_mdio_write(tp, 0x06, 0xac21);
-                rtl8168_mdio_write(tp, 0x06, 0x0302);
-                rtl8168_mdio_write(tp, 0x06, 0x8337);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b2e);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x81ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2608);
-                rtl8168_mdio_write(tp, 0x06, 0xe085);
-                rtl8168_mdio_write(tp, 0x06, 0xd2ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2502);
-                rtl8168_mdio_write(tp, 0x06, 0xf628);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x81ad);
-                rtl8168_mdio_write(tp, 0x06, 0x210a);
-                rtl8168_mdio_write(tp, 0x06, 0xe086);
-                rtl8168_mdio_write(tp, 0x06, 0x0af6);
-                rtl8168_mdio_write(tp, 0x06, 0x27a0);
-                rtl8168_mdio_write(tp, 0x06, 0x0502);
-                rtl8168_mdio_write(tp, 0x06, 0xf629);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x87ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2408);
-                rtl8168_mdio_write(tp, 0x06, 0xe08a);
-                rtl8168_mdio_write(tp, 0x06, 0xedad);
-                rtl8168_mdio_write(tp, 0x06, 0x2002);
-                rtl8168_mdio_write(tp, 0x06, 0xf62a);
-                rtl8168_mdio_write(tp, 0x06, 0xe58b);
-                rtl8168_mdio_write(tp, 0x06, 0x2ea1);
-                rtl8168_mdio_write(tp, 0x06, 0x0003);
-                rtl8168_mdio_write(tp, 0x06, 0x0221);
-                rtl8168_mdio_write(tp, 0x06, 0x11fc);
-                rtl8168_mdio_write(tp, 0x06, 0x04ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8aed);
-                rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8aec);
-                rtl8168_mdio_write(tp, 0x06, 0x0004);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b87);
-                rtl8168_mdio_write(tp, 0x06, 0xad24);
-                rtl8168_mdio_write(tp, 0x06, 0x3ae0);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0xeb58);
-                rtl8168_mdio_write(tp, 0x06, 0xf8d1);
-                rtl8168_mdio_write(tp, 0x06, 0x01e4);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-                rtl8168_mdio_write(tp, 0x06, 0xe5e0);
-                rtl8168_mdio_write(tp, 0x06, 0xebe0);
-                rtl8168_mdio_write(tp, 0x06, 0xe07c);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x7d5c);
-                rtl8168_mdio_write(tp, 0x06, 0x00ff);
-                rtl8168_mdio_write(tp, 0x06, 0x3c00);
-                rtl8168_mdio_write(tp, 0x06, 0x1eab);
-                rtl8168_mdio_write(tp, 0x06, 0x1ce0);
-                rtl8168_mdio_write(tp, 0x06, 0xe04c);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x4d58);
-                rtl8168_mdio_write(tp, 0x06, 0xc1e4);
-                rtl8168_mdio_write(tp, 0x06, 0xe04c);
-                rtl8168_mdio_write(tp, 0x06, 0xe5e0);
-                rtl8168_mdio_write(tp, 0x06, 0x4de0);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ee);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0x3ce4);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ee);
-                rtl8168_mdio_write(tp, 0x06, 0xe5e0);
-                rtl8168_mdio_write(tp, 0x06, 0xeffc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x87ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2412);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0xeee1);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ef);
-                rtl8168_mdio_write(tp, 0x06, 0x59c3);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-                rtl8168_mdio_write(tp, 0x06, 0xeee5);
-                rtl8168_mdio_write(tp, 0x06, 0xe0ef);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xed01);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b81);
-                rtl8168_mdio_write(tp, 0x06, 0xac25);
-                rtl8168_mdio_write(tp, 0x06, 0x0502);
-                rtl8168_mdio_write(tp, 0x06, 0x8363);
-                rtl8168_mdio_write(tp, 0x06, 0xae03);
-                rtl8168_mdio_write(tp, 0x06, 0x0225);
-                rtl8168_mdio_write(tp, 0x06, 0x16fc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xfae0);
-                rtl8168_mdio_write(tp, 0x06, 0x860a);
-                rtl8168_mdio_write(tp, 0x06, 0xa000);
-                rtl8168_mdio_write(tp, 0x06, 0x19e0);
-                rtl8168_mdio_write(tp, 0x06, 0x860b);
-                rtl8168_mdio_write(tp, 0x06, 0xe18b);
-                rtl8168_mdio_write(tp, 0x06, 0x331b);
-                rtl8168_mdio_write(tp, 0x06, 0x109e);
-                rtl8168_mdio_write(tp, 0x06, 0x04aa);
-                rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                rtl8168_mdio_write(tp, 0x06, 0x06ee);
-                rtl8168_mdio_write(tp, 0x06, 0x860a);
-                rtl8168_mdio_write(tp, 0x06, 0x01ae);
-                rtl8168_mdio_write(tp, 0x06, 0xe602);
-                rtl8168_mdio_write(tp, 0x06, 0x241e);
-                rtl8168_mdio_write(tp, 0x06, 0xae14);
-                rtl8168_mdio_write(tp, 0x06, 0xa001);
-                rtl8168_mdio_write(tp, 0x06, 0x1402);
-                rtl8168_mdio_write(tp, 0x06, 0x2426);
-                rtl8168_mdio_write(tp, 0x06, 0xbf26);
-                rtl8168_mdio_write(tp, 0x06, 0x6d02);
-                rtl8168_mdio_write(tp, 0x06, 0x2eb0);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0b00);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0a02);
-                rtl8168_mdio_write(tp, 0x06, 0xaf84);
-                rtl8168_mdio_write(tp, 0x06, 0x3ca0);
-                rtl8168_mdio_write(tp, 0x06, 0x0252);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0400);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0500);
-                rtl8168_mdio_write(tp, 0x06, 0xe086);
-                rtl8168_mdio_write(tp, 0x06, 0x0be1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b32);
-                rtl8168_mdio_write(tp, 0x06, 0x1b10);
-                rtl8168_mdio_write(tp, 0x06, 0x9e04);
-                rtl8168_mdio_write(tp, 0x06, 0xaa02);
-                rtl8168_mdio_write(tp, 0x06, 0xaecb);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0b00);
-                rtl8168_mdio_write(tp, 0x06, 0x0224);
-                rtl8168_mdio_write(tp, 0x06, 0x3ae2);
-                rtl8168_mdio_write(tp, 0x06, 0x8604);
-                rtl8168_mdio_write(tp, 0x06, 0xe386);
-                rtl8168_mdio_write(tp, 0x06, 0x05ef);
-                rtl8168_mdio_write(tp, 0x06, 0x65e2);
-                rtl8168_mdio_write(tp, 0x06, 0x8606);
-                rtl8168_mdio_write(tp, 0x06, 0xe386);
-                rtl8168_mdio_write(tp, 0x06, 0x071b);
-                rtl8168_mdio_write(tp, 0x06, 0x56aa);
-                rtl8168_mdio_write(tp, 0x06, 0x0eef);
-                rtl8168_mdio_write(tp, 0x06, 0x56e6);
-                rtl8168_mdio_write(tp, 0x06, 0x8606);
-                rtl8168_mdio_write(tp, 0x06, 0xe786);
-                rtl8168_mdio_write(tp, 0x06, 0x07e2);
-                rtl8168_mdio_write(tp, 0x06, 0x8609);
-                rtl8168_mdio_write(tp, 0x06, 0xe686);
-                rtl8168_mdio_write(tp, 0x06, 0x08e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8609);
-                rtl8168_mdio_write(tp, 0x06, 0xa000);
-                rtl8168_mdio_write(tp, 0x06, 0x07ee);
-                rtl8168_mdio_write(tp, 0x06, 0x860a);
-                rtl8168_mdio_write(tp, 0x06, 0x03af);
-                rtl8168_mdio_write(tp, 0x06, 0x8369);
-                rtl8168_mdio_write(tp, 0x06, 0x0224);
-                rtl8168_mdio_write(tp, 0x06, 0x8e02);
-                rtl8168_mdio_write(tp, 0x06, 0x2426);
-                rtl8168_mdio_write(tp, 0x06, 0xae48);
-                rtl8168_mdio_write(tp, 0x06, 0xa003);
-                rtl8168_mdio_write(tp, 0x06, 0x21e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8608);
-                rtl8168_mdio_write(tp, 0x06, 0xe186);
-                rtl8168_mdio_write(tp, 0x06, 0x091b);
-                rtl8168_mdio_write(tp, 0x06, 0x019e);
-                rtl8168_mdio_write(tp, 0x06, 0x0caa);
-                rtl8168_mdio_write(tp, 0x06, 0x0502);
-                rtl8168_mdio_write(tp, 0x06, 0x249d);
-                rtl8168_mdio_write(tp, 0x06, 0xaee7);
-                rtl8168_mdio_write(tp, 0x06, 0x0224);
-                rtl8168_mdio_write(tp, 0x06, 0x8eae);
-                rtl8168_mdio_write(tp, 0x06, 0xe2ee);
-                rtl8168_mdio_write(tp, 0x06, 0x860a);
-                rtl8168_mdio_write(tp, 0x06, 0x04ee);
-                rtl8168_mdio_write(tp, 0x06, 0x860b);
-                rtl8168_mdio_write(tp, 0x06, 0x00af);
-                rtl8168_mdio_write(tp, 0x06, 0x8369);
-                rtl8168_mdio_write(tp, 0x06, 0xa004);
-                rtl8168_mdio_write(tp, 0x06, 0x15e0);
-                rtl8168_mdio_write(tp, 0x06, 0x860b);
-                rtl8168_mdio_write(tp, 0x06, 0xe18b);
-                rtl8168_mdio_write(tp, 0x06, 0x341b);
-                rtl8168_mdio_write(tp, 0x06, 0x109e);
-                rtl8168_mdio_write(tp, 0x06, 0x05aa);
-                rtl8168_mdio_write(tp, 0x06, 0x03af);
-                rtl8168_mdio_write(tp, 0x06, 0x8383);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0a05);
-                rtl8168_mdio_write(tp, 0x06, 0xae0c);
-                rtl8168_mdio_write(tp, 0x06, 0xa005);
-                rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                rtl8168_mdio_write(tp, 0x06, 0x0702);
-                rtl8168_mdio_write(tp, 0x06, 0x2309);
-                rtl8168_mdio_write(tp, 0x06, 0xee86);
-                rtl8168_mdio_write(tp, 0x06, 0x0a00);
-                rtl8168_mdio_write(tp, 0x06, 0xfeef);
-                rtl8168_mdio_write(tp, 0x06, 0x96fe);
-                rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xfbe0);
-                rtl8168_mdio_write(tp, 0x06, 0x8b85);
-                rtl8168_mdio_write(tp, 0x06, 0xad25);
-                rtl8168_mdio_write(tp, 0x06, 0x22e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe022);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x23e2);
-                rtl8168_mdio_write(tp, 0x06, 0xe036);
-                rtl8168_mdio_write(tp, 0x06, 0xe3e0);
-                rtl8168_mdio_write(tp, 0x06, 0x375a);
-                rtl8168_mdio_write(tp, 0x06, 0xc40d);
-                rtl8168_mdio_write(tp, 0x06, 0x0158);
-                rtl8168_mdio_write(tp, 0x06, 0x021e);
-                rtl8168_mdio_write(tp, 0x06, 0x20e3);
-                rtl8168_mdio_write(tp, 0x06, 0x8ae7);
-                rtl8168_mdio_write(tp, 0x06, 0xac31);
-                rtl8168_mdio_write(tp, 0x06, 0x60ac);
-                rtl8168_mdio_write(tp, 0x06, 0x3a08);
-                rtl8168_mdio_write(tp, 0x06, 0xac3e);
-                rtl8168_mdio_write(tp, 0x06, 0x26ae);
-                rtl8168_mdio_write(tp, 0x06, 0x67af);
-                rtl8168_mdio_write(tp, 0x06, 0x84db);
-                rtl8168_mdio_write(tp, 0x06, 0xad37);
-                rtl8168_mdio_write(tp, 0x06, 0x61e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8ae8);
-                rtl8168_mdio_write(tp, 0x06, 0x10e4);
-                rtl8168_mdio_write(tp, 0x06, 0x8ae8);
-                rtl8168_mdio_write(tp, 0x06, 0xe18a);
-                rtl8168_mdio_write(tp, 0x06, 0xe91b);
-                rtl8168_mdio_write(tp, 0x06, 0x109e);
-                rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                rtl8168_mdio_write(tp, 0x06, 0x51d1);
-                rtl8168_mdio_write(tp, 0x06, 0x00bf);
-                rtl8168_mdio_write(tp, 0x06, 0x863b);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8ae8);
-                rtl8168_mdio_write(tp, 0x06, 0x00ae);
-                rtl8168_mdio_write(tp, 0x06, 0x43ad);
-                rtl8168_mdio_write(tp, 0x06, 0x3627);
-                rtl8168_mdio_write(tp, 0x06, 0xe08a);
-                rtl8168_mdio_write(tp, 0x06, 0xeee1);
-                rtl8168_mdio_write(tp, 0x06, 0x8aef);
-                rtl8168_mdio_write(tp, 0x06, 0xef74);
-                rtl8168_mdio_write(tp, 0x06, 0xe08a);
-                rtl8168_mdio_write(tp, 0x06, 0xeae1);
-                rtl8168_mdio_write(tp, 0x06, 0x8aeb);
-                rtl8168_mdio_write(tp, 0x06, 0x1b74);
-                rtl8168_mdio_write(tp, 0x06, 0x9e2e);
-                rtl8168_mdio_write(tp, 0x06, 0x14e4);
-                rtl8168_mdio_write(tp, 0x06, 0x8aea);
-                rtl8168_mdio_write(tp, 0x06, 0xe58a);
-                rtl8168_mdio_write(tp, 0x06, 0xebef);
-                rtl8168_mdio_write(tp, 0x06, 0x74e0);
-                rtl8168_mdio_write(tp, 0x06, 0x8aee);
-                rtl8168_mdio_write(tp, 0x06, 0xe18a);
-                rtl8168_mdio_write(tp, 0x06, 0xef1b);
-                rtl8168_mdio_write(tp, 0x06, 0x479e);
-                rtl8168_mdio_write(tp, 0x06, 0x0fae);
-                rtl8168_mdio_write(tp, 0x06, 0x19ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8aea);
-                rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                rtl8168_mdio_write(tp, 0x06, 0x8aeb);
-                rtl8168_mdio_write(tp, 0x06, 0x00ae);
-                rtl8168_mdio_write(tp, 0x06, 0x0fac);
-                rtl8168_mdio_write(tp, 0x06, 0x390c);
-                rtl8168_mdio_write(tp, 0x06, 0xd101);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x3b02);
-                rtl8168_mdio_write(tp, 0x06, 0x2f50);
-                rtl8168_mdio_write(tp, 0x06, 0xee8a);
-                rtl8168_mdio_write(tp, 0x06, 0xe800);
-                rtl8168_mdio_write(tp, 0x06, 0xe68a);
-                rtl8168_mdio_write(tp, 0x06, 0xe7ff);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefd);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-                rtl8168_mdio_write(tp, 0x06, 0xfaef);
-                rtl8168_mdio_write(tp, 0x06, 0x69e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe022);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x2358);
-                rtl8168_mdio_write(tp, 0x06, 0xc4e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8b6e);
-                rtl8168_mdio_write(tp, 0x06, 0x1f10);
-                rtl8168_mdio_write(tp, 0x06, 0x9e24);
-                rtl8168_mdio_write(tp, 0x06, 0xe48b);
-                rtl8168_mdio_write(tp, 0x06, 0x6ead);
-                rtl8168_mdio_write(tp, 0x06, 0x2218);
-                rtl8168_mdio_write(tp, 0x06, 0xac27);
-                rtl8168_mdio_write(tp, 0x06, 0x0dac);
-                rtl8168_mdio_write(tp, 0x06, 0x2605);
-                rtl8168_mdio_write(tp, 0x06, 0x0203);
-                rtl8168_mdio_write(tp, 0x06, 0x8fae);
-                rtl8168_mdio_write(tp, 0x06, 0x1302);
-                rtl8168_mdio_write(tp, 0x06, 0x03c8);
-                rtl8168_mdio_write(tp, 0x06, 0xae0e);
-                rtl8168_mdio_write(tp, 0x06, 0x0203);
-                rtl8168_mdio_write(tp, 0x06, 0xe102);
-                rtl8168_mdio_write(tp, 0x06, 0x8520);
-                rtl8168_mdio_write(tp, 0x06, 0xae06);
-                rtl8168_mdio_write(tp, 0x06, 0x0203);
-                rtl8168_mdio_write(tp, 0x06, 0x8f02);
-                rtl8168_mdio_write(tp, 0x06, 0x8566);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefd);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xe08b);
-                rtl8168_mdio_write(tp, 0x06, 0x82ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2737);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x4402);
-                rtl8168_mdio_write(tp, 0x06, 0x2f23);
-                rtl8168_mdio_write(tp, 0x06, 0xac28);
-                rtl8168_mdio_write(tp, 0x06, 0x2ed1);
-                rtl8168_mdio_write(tp, 0x06, 0x01bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8647);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8641);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x23e5);
-                rtl8168_mdio_write(tp, 0x06, 0x8af0);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x22e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe023);
-                rtl8168_mdio_write(tp, 0x06, 0xac2e);
-                rtl8168_mdio_write(tp, 0x06, 0x04d1);
-                rtl8168_mdio_write(tp, 0x06, 0x01ae);
-                rtl8168_mdio_write(tp, 0x06, 0x02d1);
-                rtl8168_mdio_write(tp, 0x06, 0x00bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8641);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50d1);
-                rtl8168_mdio_write(tp, 0x06, 0x01bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8644);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50ef);
-                rtl8168_mdio_write(tp, 0x06, 0x96fe);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-                rtl8168_mdio_write(tp, 0x06, 0xef69);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x4702);
-                rtl8168_mdio_write(tp, 0x06, 0x2f23);
-                rtl8168_mdio_write(tp, 0x06, 0xad28);
-                rtl8168_mdio_write(tp, 0x06, 0x19d1);
-                rtl8168_mdio_write(tp, 0x06, 0x00bf);
-                rtl8168_mdio_write(tp, 0x06, 0x8644);
-                rtl8168_mdio_write(tp, 0x06, 0x022f);
-                rtl8168_mdio_write(tp, 0x06, 0x50e1);
-                rtl8168_mdio_write(tp, 0x06, 0x8af0);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x4102);
-                rtl8168_mdio_write(tp, 0x06, 0x2f50);
-                rtl8168_mdio_write(tp, 0x06, 0xd100);
-                rtl8168_mdio_write(tp, 0x06, 0xbf86);
-                rtl8168_mdio_write(tp, 0x06, 0x4702);
-                rtl8168_mdio_write(tp, 0x06, 0x2f50);
-                rtl8168_mdio_write(tp, 0x06, 0xef96);
-                rtl8168_mdio_write(tp, 0x06, 0xfefc);
-                rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0xfee1);
-                rtl8168_mdio_write(tp, 0x06, 0xe2ff);
-                rtl8168_mdio_write(tp, 0x06, 0xad2e);
-                rtl8168_mdio_write(tp, 0x06, 0x63e0);
-                rtl8168_mdio_write(tp, 0x06, 0xe038);
-                rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-                rtl8168_mdio_write(tp, 0x06, 0x39ad);
-                rtl8168_mdio_write(tp, 0x06, 0x2f10);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x34e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe035);
-                rtl8168_mdio_write(tp, 0x06, 0xf726);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-                rtl8168_mdio_write(tp, 0x06, 0x34e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe035);
-                rtl8168_mdio_write(tp, 0x06, 0xae0e);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0xd6e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe2d7);
-                rtl8168_mdio_write(tp, 0x06, 0xf728);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e2);
-                rtl8168_mdio_write(tp, 0x06, 0xd6e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe2d7);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0x34e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe235);
-                rtl8168_mdio_write(tp, 0x06, 0xf72b);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e2);
-                rtl8168_mdio_write(tp, 0x06, 0x34e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe235);
-                rtl8168_mdio_write(tp, 0x06, 0xd07d);
-                rtl8168_mdio_write(tp, 0x06, 0xb0fe);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0x34e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe235);
-                rtl8168_mdio_write(tp, 0x06, 0xf62b);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e2);
-                rtl8168_mdio_write(tp, 0x06, 0x34e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe235);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-                rtl8168_mdio_write(tp, 0x06, 0x34e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe035);
-                rtl8168_mdio_write(tp, 0x06, 0xf626);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-                rtl8168_mdio_write(tp, 0x06, 0x34e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe035);
-                rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-                rtl8168_mdio_write(tp, 0x06, 0xd6e1);
-                rtl8168_mdio_write(tp, 0x06, 0xe2d7);
-                rtl8168_mdio_write(tp, 0x06, 0xf628);
-                rtl8168_mdio_write(tp, 0x06, 0xe4e2);
-                rtl8168_mdio_write(tp, 0x06, 0xd6e5);
-                rtl8168_mdio_write(tp, 0x06, 0xe2d7);
-                rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                rtl8168_mdio_write(tp, 0x06, 0xae20);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x06, 0xa725);
-                rtl8168_mdio_write(tp, 0x06, 0xe50a);
-                rtl8168_mdio_write(tp, 0x06, 0x1de5);
-                rtl8168_mdio_write(tp, 0x06, 0x0a2c);
-                rtl8168_mdio_write(tp, 0x06, 0xe50a);
-                rtl8168_mdio_write(tp, 0x06, 0x6de5);
-                rtl8168_mdio_write(tp, 0x06, 0x0a1d);
-                rtl8168_mdio_write(tp, 0x06, 0xe50a);
-                rtl8168_mdio_write(tp, 0x06, 0x1ce5);
-                rtl8168_mdio_write(tp, 0x06, 0x0a2d);
-                rtl8168_mdio_write(tp, 0x06, 0xa755);
-                rtl8168_mdio_write(tp, 0x06, 0x00e2);
-                rtl8168_mdio_write(tp, 0x06, 0x3488);
-                rtl8168_mdio_write(tp, 0x06, 0xe200);
-                rtl8168_mdio_write(tp, 0x06, 0xcce2);
-                rtl8168_mdio_write(tp, 0x06, 0x0055);
-                rtl8168_mdio_write(tp, 0x06, 0xe020);
-                rtl8168_mdio_write(tp, 0x06, 0x55e2);
-                rtl8168_mdio_write(tp, 0x06, 0xd600);
-                rtl8168_mdio_write(tp, 0x06, 0xe24a);
-                gphy_val = rtl8168_mdio_read(tp, 0x01);
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x01, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x00);
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x00, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                for (i = 0; i < 200; i++) {
-                        udelay(100);
-                        gphy_val = rtl8168_mdio_read(tp, 0x00);
-                        if (gphy_val & BIT_7)
-                                break;
-                }
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x0023);
-                gphy_val = rtl8168_mdio_read(tp, 0x17);
-                gphy_val &= ~(BIT_0);
-                if (tp->RequiredSecLanDonglePatch)
-                        gphy_val &= ~(BIT_2);
-                rtl8168_mdio_write(tp, 0x17, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        }
-}
-
-static void
-rtl8168_set_phy_mcu_8168evl_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val,i;
-
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x00, 0x1800);
-        gphy_val = rtl8168_mdio_read(tp, 0x15);
-        gphy_val &= ~(BIT_12);
-        rtl8168_mdio_write(tp, 0x15, gphy_val);
-        mdelay(20);
-        rtl8168_mdio_write(tp, 0x1f, 0x0004);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        if ((gphy_val & BIT_11) == 0x0000) {
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x17, gphy_val);
-                for (i = 0; i < 200; i++) {
-                        udelay(100);
-                        gphy_val = rtl8168_mdio_read(tp, 0x17);
-                        if (gphy_val & BIT_11)
-                                break;
-                }
-        }
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0004);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1E, 0x002C);
-        rtl8168_mdio_write(tp, 0x1B, 0x5000);
-        rtl8168_mdio_write(tp, 0x1E, 0x002d);
-        rtl8168_mdio_write(tp, 0x19, 0x0004);
-        rtl8168_mdio_write(tp, 0x1f, 0x0002);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x1E);
-                if ((gphy_val & 0x03FF) == 0x0014)
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x07);
-                if ((gphy_val & BIT_5) == 0)
-                        break;
-        }
-        gphy_val = rtl8168_mdio_read(tp, 0x07);
-        if (gphy_val & BIT_5) {
-                rtl8168_mdio_write(tp, 0x1f, 0x0004);
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x00a1);
-                rtl8168_mdio_write(tp, 0x17, 0x1000);
-                rtl8168_mdio_write(tp, 0x17, 0x0000);
-                rtl8168_mdio_write(tp, 0x17, 0x2000);
-                rtl8168_mdio_write(tp, 0x1e, 0x002f);
-                rtl8168_mdio_write(tp, 0x18, 0x9bfb);
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x07, 0x0000);
-                rtl8168_mdio_write(tp, 0x1f, 0x0002);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        gphy_val = rtl8168_mdio_read(tp, 0x00);
-        gphy_val &= ~(BIT_7);
-        rtl8168_mdio_write(tp, 0x00, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0004);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0307);
-        rtl8168_mdio_write(tp, 0x15, 0x0000);
-        rtl8168_mdio_write(tp, 0x19, 0x407d);
-        rtl8168_mdio_write(tp, 0x15, 0x0001);
-        rtl8168_mdio_write(tp, 0x19, 0x440f);
-        rtl8168_mdio_write(tp, 0x15, 0x0002);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0003);
-        rtl8168_mdio_write(tp, 0x19, 0x6c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0004);
-        rtl8168_mdio_write(tp, 0x19, 0xc4d5);
-        rtl8168_mdio_write(tp, 0x15, 0x0005);
-        rtl8168_mdio_write(tp, 0x19, 0x00ff);
-        rtl8168_mdio_write(tp, 0x15, 0x0006);
-        rtl8168_mdio_write(tp, 0x19, 0x74f0);
-        rtl8168_mdio_write(tp, 0x15, 0x0007);
-        rtl8168_mdio_write(tp, 0x19, 0x4880);
-        rtl8168_mdio_write(tp, 0x15, 0x0008);
-        rtl8168_mdio_write(tp, 0x19, 0x4c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0009);
-        rtl8168_mdio_write(tp, 0x19, 0x4800);
-        rtl8168_mdio_write(tp, 0x15, 0x000a);
-        rtl8168_mdio_write(tp, 0x19, 0x5000);
-        rtl8168_mdio_write(tp, 0x15, 0x000b);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x000c);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x000d);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x15, 0x000e);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x000f);
-        rtl8168_mdio_write(tp, 0x19, 0x7010);
-        rtl8168_mdio_write(tp, 0x15, 0x0010);
-        rtl8168_mdio_write(tp, 0x19, 0x6804);
-        rtl8168_mdio_write(tp, 0x15, 0x0011);
-        rtl8168_mdio_write(tp, 0x19, 0x64a0);
-        rtl8168_mdio_write(tp, 0x15, 0x0012);
-        rtl8168_mdio_write(tp, 0x19, 0x63da);
-        rtl8168_mdio_write(tp, 0x15, 0x0013);
-        rtl8168_mdio_write(tp, 0x19, 0x63d8);
-        rtl8168_mdio_write(tp, 0x15, 0x0014);
-        rtl8168_mdio_write(tp, 0x19, 0x6f05);
-        rtl8168_mdio_write(tp, 0x15, 0x0015);
-        rtl8168_mdio_write(tp, 0x19, 0x5420);
-        rtl8168_mdio_write(tp, 0x15, 0x0016);
-        rtl8168_mdio_write(tp, 0x19, 0x58ce);
-        rtl8168_mdio_write(tp, 0x15, 0x0017);
-        rtl8168_mdio_write(tp, 0x19, 0x5cf3);
-        rtl8168_mdio_write(tp, 0x15, 0x0018);
-        rtl8168_mdio_write(tp, 0x19, 0xb600);
-        rtl8168_mdio_write(tp, 0x15, 0x0019);
-        rtl8168_mdio_write(tp, 0x19, 0xc659);
-        rtl8168_mdio_write(tp, 0x15, 0x001a);
-        rtl8168_mdio_write(tp, 0x19, 0x0018);
-        rtl8168_mdio_write(tp, 0x15, 0x001b);
-        rtl8168_mdio_write(tp, 0x19, 0xc403);
-        rtl8168_mdio_write(tp, 0x15, 0x001c);
-        rtl8168_mdio_write(tp, 0x19, 0x0016);
-        rtl8168_mdio_write(tp, 0x15, 0x001d);
-        rtl8168_mdio_write(tp, 0x19, 0xaa05);
-        rtl8168_mdio_write(tp, 0x15, 0x001e);
-        rtl8168_mdio_write(tp, 0x19, 0xc503);
-        rtl8168_mdio_write(tp, 0x15, 0x001f);
-        rtl8168_mdio_write(tp, 0x19, 0x0003);
-        rtl8168_mdio_write(tp, 0x15, 0x0020);
-        rtl8168_mdio_write(tp, 0x19, 0x89f8);
-        rtl8168_mdio_write(tp, 0x15, 0x0021);
-        rtl8168_mdio_write(tp, 0x19, 0x32ae);
-        rtl8168_mdio_write(tp, 0x15, 0x0022);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0023);
-        rtl8168_mdio_write(tp, 0x19, 0x6c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0024);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0025);
-        rtl8168_mdio_write(tp, 0x19, 0x6801);
-        rtl8168_mdio_write(tp, 0x15, 0x0026);
-        rtl8168_mdio_write(tp, 0x19, 0x66a0);
-        rtl8168_mdio_write(tp, 0x15, 0x0027);
-        rtl8168_mdio_write(tp, 0x19, 0xa300);
-        rtl8168_mdio_write(tp, 0x15, 0x0028);
-        rtl8168_mdio_write(tp, 0x19, 0x64a0);
-        rtl8168_mdio_write(tp, 0x15, 0x0029);
-        rtl8168_mdio_write(tp, 0x19, 0x76f0);
-        rtl8168_mdio_write(tp, 0x15, 0x002a);
-        rtl8168_mdio_write(tp, 0x19, 0x7670);
-        rtl8168_mdio_write(tp, 0x15, 0x002b);
-        rtl8168_mdio_write(tp, 0x19, 0x7630);
-        rtl8168_mdio_write(tp, 0x15, 0x002c);
-        rtl8168_mdio_write(tp, 0x19, 0x31a6);
-        rtl8168_mdio_write(tp, 0x15, 0x002d);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x002e);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x002f);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0030);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0031);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0032);
-        rtl8168_mdio_write(tp, 0x19, 0x4801);
-        rtl8168_mdio_write(tp, 0x15, 0x0033);
-        rtl8168_mdio_write(tp, 0x19, 0x6803);
-        rtl8168_mdio_write(tp, 0x15, 0x0034);
-        rtl8168_mdio_write(tp, 0x19, 0x66a1);
-        rtl8168_mdio_write(tp, 0x15, 0x0035);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0036);
-        rtl8168_mdio_write(tp, 0x19, 0x6c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0037);
-        rtl8168_mdio_write(tp, 0x19, 0xa300);
-        rtl8168_mdio_write(tp, 0x15, 0x0038);
-        rtl8168_mdio_write(tp, 0x19, 0x64a1);
-        rtl8168_mdio_write(tp, 0x15, 0x0039);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x003a);
-        rtl8168_mdio_write(tp, 0x19, 0x74f8);
-        rtl8168_mdio_write(tp, 0x15, 0x003b);
-        rtl8168_mdio_write(tp, 0x19, 0x63d0);
-        rtl8168_mdio_write(tp, 0x15, 0x003c);
-        rtl8168_mdio_write(tp, 0x19, 0x7ff0);
-        rtl8168_mdio_write(tp, 0x15, 0x003d);
-        rtl8168_mdio_write(tp, 0x19, 0x77f0);
-        rtl8168_mdio_write(tp, 0x15, 0x003e);
-        rtl8168_mdio_write(tp, 0x19, 0x7ff0);
-        rtl8168_mdio_write(tp, 0x15, 0x003f);
-        rtl8168_mdio_write(tp, 0x19, 0x7750);
-        rtl8168_mdio_write(tp, 0x15, 0x0040);
-        rtl8168_mdio_write(tp, 0x19, 0x63d8);
-        rtl8168_mdio_write(tp, 0x15, 0x0041);
-        rtl8168_mdio_write(tp, 0x19, 0x7cf0);
-        rtl8168_mdio_write(tp, 0x15, 0x0042);
-        rtl8168_mdio_write(tp, 0x19, 0x7708);
-        rtl8168_mdio_write(tp, 0x15, 0x0043);
-        rtl8168_mdio_write(tp, 0x19, 0xa654);
-        rtl8168_mdio_write(tp, 0x15, 0x0044);
-        rtl8168_mdio_write(tp, 0x19, 0x304a);
-        rtl8168_mdio_write(tp, 0x15, 0x0045);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0046);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0047);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0048);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0049);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x004a);
-        rtl8168_mdio_write(tp, 0x19, 0x4802);
-        rtl8168_mdio_write(tp, 0x15, 0x004b);
-        rtl8168_mdio_write(tp, 0x19, 0x4003);
-        rtl8168_mdio_write(tp, 0x15, 0x004c);
-        rtl8168_mdio_write(tp, 0x19, 0x4440);
-        rtl8168_mdio_write(tp, 0x15, 0x004d);
-        rtl8168_mdio_write(tp, 0x19, 0x63c8);
-        rtl8168_mdio_write(tp, 0x15, 0x004e);
-        rtl8168_mdio_write(tp, 0x19, 0x6481);
-        rtl8168_mdio_write(tp, 0x15, 0x004f);
-        rtl8168_mdio_write(tp, 0x19, 0x9d00);
-        rtl8168_mdio_write(tp, 0x15, 0x0050);
-        rtl8168_mdio_write(tp, 0x19, 0x63e8);
-        rtl8168_mdio_write(tp, 0x15, 0x0051);
-        rtl8168_mdio_write(tp, 0x19, 0x7d00);
-        rtl8168_mdio_write(tp, 0x15, 0x0052);
-        rtl8168_mdio_write(tp, 0x19, 0x5900);
-        rtl8168_mdio_write(tp, 0x15, 0x0053);
-        rtl8168_mdio_write(tp, 0x19, 0x63f8);
-        rtl8168_mdio_write(tp, 0x15, 0x0054);
-        rtl8168_mdio_write(tp, 0x19, 0x64a1);
-        rtl8168_mdio_write(tp, 0x15, 0x0055);
-        rtl8168_mdio_write(tp, 0x19, 0x3116);
-        rtl8168_mdio_write(tp, 0x15, 0x0056);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0057);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0058);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0059);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x005a);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x005b);
-        rtl8168_mdio_write(tp, 0x19, 0x6c03);
-        rtl8168_mdio_write(tp, 0x15, 0x005c);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x005d);
-        rtl8168_mdio_write(tp, 0x19, 0x6000);
-        rtl8168_mdio_write(tp, 0x15, 0x005e);
-        rtl8168_mdio_write(tp, 0x19, 0x59ce);
-        rtl8168_mdio_write(tp, 0x15, 0x005f);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x0060);
-        rtl8168_mdio_write(tp, 0x19, 0x7d00);
-        rtl8168_mdio_write(tp, 0x15, 0x0061);
-        rtl8168_mdio_write(tp, 0x19, 0x72b0);
-        rtl8168_mdio_write(tp, 0x15, 0x0062);
-        rtl8168_mdio_write(tp, 0x19, 0x400e);
-        rtl8168_mdio_write(tp, 0x15, 0x0063);
-        rtl8168_mdio_write(tp, 0x19, 0x4440);
-        rtl8168_mdio_write(tp, 0x15, 0x0064);
-        rtl8168_mdio_write(tp, 0x19, 0x9d00);
-        rtl8168_mdio_write(tp, 0x15, 0x0065);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x15, 0x0066);
-        rtl8168_mdio_write(tp, 0x19, 0x70b0);
-        rtl8168_mdio_write(tp, 0x15, 0x0067);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0068);
-        rtl8168_mdio_write(tp, 0x19, 0x6008);
-        rtl8168_mdio_write(tp, 0x15, 0x0069);
-        rtl8168_mdio_write(tp, 0x19, 0x7cf0);
-        rtl8168_mdio_write(tp, 0x15, 0x006a);
-        rtl8168_mdio_write(tp, 0x19, 0x7750);
-        rtl8168_mdio_write(tp, 0x15, 0x006b);
-        rtl8168_mdio_write(tp, 0x19, 0x4007);
-        rtl8168_mdio_write(tp, 0x15, 0x006c);
-        rtl8168_mdio_write(tp, 0x19, 0x4500);
-        rtl8168_mdio_write(tp, 0x15, 0x006d);
-        rtl8168_mdio_write(tp, 0x19, 0x4023);
-        rtl8168_mdio_write(tp, 0x15, 0x006e);
-        rtl8168_mdio_write(tp, 0x19, 0x4580);
-        rtl8168_mdio_write(tp, 0x15, 0x006f);
-        rtl8168_mdio_write(tp, 0x19, 0x9f00);
-        rtl8168_mdio_write(tp, 0x15, 0x0070);
-        rtl8168_mdio_write(tp, 0x19, 0xcd78);
-        rtl8168_mdio_write(tp, 0x15, 0x0071);
-        rtl8168_mdio_write(tp, 0x19, 0x0003);
-        rtl8168_mdio_write(tp, 0x15, 0x0072);
-        rtl8168_mdio_write(tp, 0x19, 0xbe02);
-        rtl8168_mdio_write(tp, 0x15, 0x0073);
-        rtl8168_mdio_write(tp, 0x19, 0x3070);
-        rtl8168_mdio_write(tp, 0x15, 0x0074);
-        rtl8168_mdio_write(tp, 0x19, 0x7cf0);
-        rtl8168_mdio_write(tp, 0x15, 0x0075);
-        rtl8168_mdio_write(tp, 0x19, 0x77f0);
-        rtl8168_mdio_write(tp, 0x15, 0x0076);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x0077);
-        rtl8168_mdio_write(tp, 0x19, 0x4007);
-        rtl8168_mdio_write(tp, 0x15, 0x0078);
-        rtl8168_mdio_write(tp, 0x19, 0x4500);
-        rtl8168_mdio_write(tp, 0x15, 0x0079);
-        rtl8168_mdio_write(tp, 0x19, 0x4023);
-        rtl8168_mdio_write(tp, 0x15, 0x007a);
-        rtl8168_mdio_write(tp, 0x19, 0x4580);
-        rtl8168_mdio_write(tp, 0x15, 0x007b);
-        rtl8168_mdio_write(tp, 0x19, 0x9f00);
-        rtl8168_mdio_write(tp, 0x15, 0x007c);
-        rtl8168_mdio_write(tp, 0x19, 0xce80);
-        rtl8168_mdio_write(tp, 0x15, 0x007d);
-        rtl8168_mdio_write(tp, 0x19, 0x0004);
-        rtl8168_mdio_write(tp, 0x15, 0x007e);
-        rtl8168_mdio_write(tp, 0x19, 0xce80);
-        rtl8168_mdio_write(tp, 0x15, 0x007f);
-        rtl8168_mdio_write(tp, 0x19, 0x0002);
-        rtl8168_mdio_write(tp, 0x15, 0x0080);
-        rtl8168_mdio_write(tp, 0x19, 0x307c);
-        rtl8168_mdio_write(tp, 0x15, 0x0081);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x0082);
-        rtl8168_mdio_write(tp, 0x19, 0x480f);
-        rtl8168_mdio_write(tp, 0x15, 0x0083);
-        rtl8168_mdio_write(tp, 0x19, 0x6802);
-        rtl8168_mdio_write(tp, 0x15, 0x0084);
-        rtl8168_mdio_write(tp, 0x19, 0x6680);
-        rtl8168_mdio_write(tp, 0x15, 0x0085);
-        rtl8168_mdio_write(tp, 0x19, 0x7c10);
-        rtl8168_mdio_write(tp, 0x15, 0x0086);
-        rtl8168_mdio_write(tp, 0x19, 0x6010);
-        rtl8168_mdio_write(tp, 0x15, 0x0087);
-        rtl8168_mdio_write(tp, 0x19, 0x400a);
-        rtl8168_mdio_write(tp, 0x15, 0x0088);
-        rtl8168_mdio_write(tp, 0x19, 0x4580);
-        rtl8168_mdio_write(tp, 0x15, 0x0089);
-        rtl8168_mdio_write(tp, 0x19, 0x9e00);
-        rtl8168_mdio_write(tp, 0x15, 0x008a);
-        rtl8168_mdio_write(tp, 0x19, 0x7d00);
-        rtl8168_mdio_write(tp, 0x15, 0x008b);
-        rtl8168_mdio_write(tp, 0x19, 0x5800);
-        rtl8168_mdio_write(tp, 0x15, 0x008c);
-        rtl8168_mdio_write(tp, 0x19, 0x63c8);
-        rtl8168_mdio_write(tp, 0x15, 0x008d);
-        rtl8168_mdio_write(tp, 0x19, 0x63d8);
-        rtl8168_mdio_write(tp, 0x15, 0x008e);
-        rtl8168_mdio_write(tp, 0x19, 0x66a0);
-        rtl8168_mdio_write(tp, 0x15, 0x008f);
-        rtl8168_mdio_write(tp, 0x19, 0x8300);
-        rtl8168_mdio_write(tp, 0x15, 0x0090);
-        rtl8168_mdio_write(tp, 0x19, 0x7ff0);
-        rtl8168_mdio_write(tp, 0x15, 0x0091);
-        rtl8168_mdio_write(tp, 0x19, 0x74f0);
-        rtl8168_mdio_write(tp, 0x15, 0x0092);
-        rtl8168_mdio_write(tp, 0x19, 0x3006);
-        rtl8168_mdio_write(tp, 0x15, 0x0093);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0094);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0095);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0096);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0097);
-        rtl8168_mdio_write(tp, 0x19, 0x4803);
-        rtl8168_mdio_write(tp, 0x15, 0x0098);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0099);
-        rtl8168_mdio_write(tp, 0x19, 0x6c03);
-        rtl8168_mdio_write(tp, 0x15, 0x009a);
-        rtl8168_mdio_write(tp, 0x19, 0xa203);
-        rtl8168_mdio_write(tp, 0x15, 0x009b);
-        rtl8168_mdio_write(tp, 0x19, 0x64b1);
-        rtl8168_mdio_write(tp, 0x15, 0x009c);
-        rtl8168_mdio_write(tp, 0x19, 0x309e);
-        rtl8168_mdio_write(tp, 0x15, 0x009d);
-        rtl8168_mdio_write(tp, 0x19, 0x64b3);
-        rtl8168_mdio_write(tp, 0x15, 0x009e);
-        rtl8168_mdio_write(tp, 0x19, 0x4030);
-        rtl8168_mdio_write(tp, 0x15, 0x009f);
-        rtl8168_mdio_write(tp, 0x19, 0x440e);
-        rtl8168_mdio_write(tp, 0x15, 0x00a0);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x00a1);
-        rtl8168_mdio_write(tp, 0x19, 0x4419);
-        rtl8168_mdio_write(tp, 0x15, 0x00a2);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x00a3);
-        rtl8168_mdio_write(tp, 0x19, 0xc520);
-        rtl8168_mdio_write(tp, 0x15, 0x00a4);
-        rtl8168_mdio_write(tp, 0x19, 0x000b);
-        rtl8168_mdio_write(tp, 0x15, 0x00a5);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x00a6);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x00a7);
-        rtl8168_mdio_write(tp, 0x19, 0x58a4);
-        rtl8168_mdio_write(tp, 0x15, 0x00a8);
-        rtl8168_mdio_write(tp, 0x19, 0x63da);
-        rtl8168_mdio_write(tp, 0x15, 0x00a9);
-        rtl8168_mdio_write(tp, 0x19, 0x5cb0);
-        rtl8168_mdio_write(tp, 0x15, 0x00aa);
-        rtl8168_mdio_write(tp, 0x19, 0x7d00);
-        rtl8168_mdio_write(tp, 0x15, 0x00ab);
-        rtl8168_mdio_write(tp, 0x19, 0x72b0);
-        rtl8168_mdio_write(tp, 0x15, 0x00ac);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x15, 0x00ad);
-        rtl8168_mdio_write(tp, 0x19, 0x70b0);
-        rtl8168_mdio_write(tp, 0x15, 0x00ae);
-        rtl8168_mdio_write(tp, 0x19, 0x30b8);
-        rtl8168_mdio_write(tp, 0x15, 0x00AF);
-        rtl8168_mdio_write(tp, 0x19, 0x4060);
-        rtl8168_mdio_write(tp, 0x15, 0x00B0);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x00B1);
-        rtl8168_mdio_write(tp, 0x19, 0x7e00);
-        rtl8168_mdio_write(tp, 0x15, 0x00B2);
-        rtl8168_mdio_write(tp, 0x19, 0x72B0);
-        rtl8168_mdio_write(tp, 0x15, 0x00B3);
-        rtl8168_mdio_write(tp, 0x19, 0x7F00);
-        rtl8168_mdio_write(tp, 0x15, 0x00B4);
-        rtl8168_mdio_write(tp, 0x19, 0x73B0);
-        rtl8168_mdio_write(tp, 0x15, 0x00b5);
-        rtl8168_mdio_write(tp, 0x19, 0x58a0);
-        rtl8168_mdio_write(tp, 0x15, 0x00b6);
-        rtl8168_mdio_write(tp, 0x19, 0x63d2);
-        rtl8168_mdio_write(tp, 0x15, 0x00b7);
-        rtl8168_mdio_write(tp, 0x19, 0x5c00);
-        rtl8168_mdio_write(tp, 0x15, 0x00b8);
-        rtl8168_mdio_write(tp, 0x19, 0x5780);
-        rtl8168_mdio_write(tp, 0x15, 0x00b9);
-        rtl8168_mdio_write(tp, 0x19, 0xb60d);
-        rtl8168_mdio_write(tp, 0x15, 0x00ba);
-        rtl8168_mdio_write(tp, 0x19, 0x9bff);
-        rtl8168_mdio_write(tp, 0x15, 0x00bb);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x00bc);
-        rtl8168_mdio_write(tp, 0x19, 0x6001);
-        rtl8168_mdio_write(tp, 0x15, 0x00bd);
-        rtl8168_mdio_write(tp, 0x19, 0xc020);
-        rtl8168_mdio_write(tp, 0x15, 0x00be);
-        rtl8168_mdio_write(tp, 0x19, 0x002b);
-        rtl8168_mdio_write(tp, 0x15, 0x00bf);
-        rtl8168_mdio_write(tp, 0x19, 0xc137);
-        rtl8168_mdio_write(tp, 0x15, 0x00c0);
-        rtl8168_mdio_write(tp, 0x19, 0x0006);
-        rtl8168_mdio_write(tp, 0x15, 0x00c1);
-        rtl8168_mdio_write(tp, 0x19, 0x9af8);
-        rtl8168_mdio_write(tp, 0x15, 0x00c2);
-        rtl8168_mdio_write(tp, 0x19, 0x30c6);
-        rtl8168_mdio_write(tp, 0x15, 0x00c3);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00c4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00c5);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00c6);
-        rtl8168_mdio_write(tp, 0x19, 0x7d00);
-        rtl8168_mdio_write(tp, 0x15, 0x00c7);
-        rtl8168_mdio_write(tp, 0x19, 0x70b0);
-        rtl8168_mdio_write(tp, 0x15, 0x00c8);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x00c9);
-        rtl8168_mdio_write(tp, 0x19, 0x4804);
-        rtl8168_mdio_write(tp, 0x15, 0x00ca);
-        rtl8168_mdio_write(tp, 0x19, 0x7c80);
-        rtl8168_mdio_write(tp, 0x15, 0x00cb);
-        rtl8168_mdio_write(tp, 0x19, 0x5c80);
-        rtl8168_mdio_write(tp, 0x15, 0x00cc);
-        rtl8168_mdio_write(tp, 0x19, 0x4010);
-        rtl8168_mdio_write(tp, 0x15, 0x00cd);
-        rtl8168_mdio_write(tp, 0x19, 0x4415);
-        rtl8168_mdio_write(tp, 0x15, 0x00ce);
-        rtl8168_mdio_write(tp, 0x19, 0x9b00);
-        rtl8168_mdio_write(tp, 0x15, 0x00cf);
-        rtl8168_mdio_write(tp, 0x19, 0x7f00);
-        rtl8168_mdio_write(tp, 0x15, 0x00d0);
-        rtl8168_mdio_write(tp, 0x19, 0x70b0);
-        rtl8168_mdio_write(tp, 0x15, 0x00d1);
-        rtl8168_mdio_write(tp, 0x19, 0x3177);
-        rtl8168_mdio_write(tp, 0x15, 0x00d2);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00d3);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00d4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00d5);
-        rtl8168_mdio_write(tp, 0x19, 0x4808);
-        rtl8168_mdio_write(tp, 0x15, 0x00d6);
-        rtl8168_mdio_write(tp, 0x19, 0x4007);
-        rtl8168_mdio_write(tp, 0x15, 0x00d7);
-        rtl8168_mdio_write(tp, 0x19, 0x4420);
-        rtl8168_mdio_write(tp, 0x15, 0x00d8);
-        rtl8168_mdio_write(tp, 0x19, 0x63d8);
-        rtl8168_mdio_write(tp, 0x15, 0x00d9);
-        rtl8168_mdio_write(tp, 0x19, 0xb608);
-        rtl8168_mdio_write(tp, 0x15, 0x00da);
-        rtl8168_mdio_write(tp, 0x19, 0xbcbd);
-        rtl8168_mdio_write(tp, 0x15, 0x00db);
-        rtl8168_mdio_write(tp, 0x19, 0xc60b);
-        rtl8168_mdio_write(tp, 0x15, 0x00dc);
-        rtl8168_mdio_write(tp, 0x19, 0x00fd);
-        rtl8168_mdio_write(tp, 0x15, 0x00dd);
-        rtl8168_mdio_write(tp, 0x19, 0x30e1);
-        rtl8168_mdio_write(tp, 0x15, 0x00de);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00df);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00e0);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00e1);
-        rtl8168_mdio_write(tp, 0x19, 0x4809);
-        rtl8168_mdio_write(tp, 0x15, 0x00e2);
-        rtl8168_mdio_write(tp, 0x19, 0x7e40);
-        rtl8168_mdio_write(tp, 0x15, 0x00e3);
-        rtl8168_mdio_write(tp, 0x19, 0x5a40);
-        rtl8168_mdio_write(tp, 0x15, 0x00e4);
-        rtl8168_mdio_write(tp, 0x19, 0x305a);
-        rtl8168_mdio_write(tp, 0x15, 0x00e5);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00e6);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00e7);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00e8);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00e9);
-        rtl8168_mdio_write(tp, 0x19, 0x480a);
-        rtl8168_mdio_write(tp, 0x15, 0x00ea);
-        rtl8168_mdio_write(tp, 0x19, 0x5820);
-        rtl8168_mdio_write(tp, 0x15, 0x00eb);
-        rtl8168_mdio_write(tp, 0x19, 0x6c03);
-        rtl8168_mdio_write(tp, 0x15, 0x00ec);
-        rtl8168_mdio_write(tp, 0x19, 0xb60a);
-        rtl8168_mdio_write(tp, 0x15, 0x00ed);
-        rtl8168_mdio_write(tp, 0x19, 0xda07);
-        rtl8168_mdio_write(tp, 0x15, 0x00ee);
-        rtl8168_mdio_write(tp, 0x19, 0x0008);
-        rtl8168_mdio_write(tp, 0x15, 0x00ef);
-        rtl8168_mdio_write(tp, 0x19, 0xc60b);
-        rtl8168_mdio_write(tp, 0x15, 0x00f0);
-        rtl8168_mdio_write(tp, 0x19, 0x00fc);
-        rtl8168_mdio_write(tp, 0x15, 0x00f1);
-        rtl8168_mdio_write(tp, 0x19, 0x30f6);
-        rtl8168_mdio_write(tp, 0x15, 0x00f2);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00f3);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00f4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00f5);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x00f6);
-        rtl8168_mdio_write(tp, 0x19, 0x4408);
-        rtl8168_mdio_write(tp, 0x15, 0x00f7);
-        rtl8168_mdio_write(tp, 0x19, 0x480b);
-        rtl8168_mdio_write(tp, 0x15, 0x00f8);
-        rtl8168_mdio_write(tp, 0x19, 0x6f03);
-        rtl8168_mdio_write(tp, 0x15, 0x00f9);
-        rtl8168_mdio_write(tp, 0x19, 0x405f);
-        rtl8168_mdio_write(tp, 0x15, 0x00fa);
-        rtl8168_mdio_write(tp, 0x19, 0x4448);
-        rtl8168_mdio_write(tp, 0x15, 0x00fb);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x00fc);
-        rtl8168_mdio_write(tp, 0x19, 0x4468);
-        rtl8168_mdio_write(tp, 0x15, 0x00fd);
-        rtl8168_mdio_write(tp, 0x19, 0x9c03);
-        rtl8168_mdio_write(tp, 0x15, 0x00fe);
-        rtl8168_mdio_write(tp, 0x19, 0x6f07);
-        rtl8168_mdio_write(tp, 0x15, 0x00ff);
-        rtl8168_mdio_write(tp, 0x19, 0x58a0);
-        rtl8168_mdio_write(tp, 0x15, 0x0100);
-        rtl8168_mdio_write(tp, 0x19, 0xd6d1);
-        rtl8168_mdio_write(tp, 0x15, 0x0101);
-        rtl8168_mdio_write(tp, 0x19, 0x0004);
-        rtl8168_mdio_write(tp, 0x15, 0x0102);
-        rtl8168_mdio_write(tp, 0x19, 0xc137);
-        rtl8168_mdio_write(tp, 0x15, 0x0103);
-        rtl8168_mdio_write(tp, 0x19, 0x0002);
-        rtl8168_mdio_write(tp, 0x15, 0x0104);
-        rtl8168_mdio_write(tp, 0x19, 0xa0e5);
-        rtl8168_mdio_write(tp, 0x15, 0x0105);
-        rtl8168_mdio_write(tp, 0x19, 0x9df8);
-        rtl8168_mdio_write(tp, 0x15, 0x0106);
-        rtl8168_mdio_write(tp, 0x19, 0x30c6);
-        rtl8168_mdio_write(tp, 0x15, 0x0107);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0108);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0109);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x010a);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x010b);
-        rtl8168_mdio_write(tp, 0x19, 0x4808);
-        rtl8168_mdio_write(tp, 0x15, 0x010c);
-        rtl8168_mdio_write(tp, 0x19, 0xc32d);
-        rtl8168_mdio_write(tp, 0x15, 0x010d);
-        rtl8168_mdio_write(tp, 0x19, 0x0003);
-        rtl8168_mdio_write(tp, 0x15, 0x010e);
-        rtl8168_mdio_write(tp, 0x19, 0xc8b3);
-        rtl8168_mdio_write(tp, 0x15, 0x010f);
-        rtl8168_mdio_write(tp, 0x19, 0x00fc);
-        rtl8168_mdio_write(tp, 0x15, 0x0110);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x0111);
-        rtl8168_mdio_write(tp, 0x19, 0x3116);
-        rtl8168_mdio_write(tp, 0x15, 0x0112);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0113);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0114);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0115);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0116);
-        rtl8168_mdio_write(tp, 0x19, 0x4803);
-        rtl8168_mdio_write(tp, 0x15, 0x0117);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0118);
-        rtl8168_mdio_write(tp, 0x19, 0x6c02);
-        rtl8168_mdio_write(tp, 0x15, 0x0119);
-        rtl8168_mdio_write(tp, 0x19, 0x7c04);
-        rtl8168_mdio_write(tp, 0x15, 0x011a);
-        rtl8168_mdio_write(tp, 0x19, 0x6000);
-        rtl8168_mdio_write(tp, 0x15, 0x011b);
-        rtl8168_mdio_write(tp, 0x19, 0x5cf7);
-        rtl8168_mdio_write(tp, 0x15, 0x011c);
-        rtl8168_mdio_write(tp, 0x19, 0x7c2a);
-        rtl8168_mdio_write(tp, 0x15, 0x011d);
-        rtl8168_mdio_write(tp, 0x19, 0x5800);
-        rtl8168_mdio_write(tp, 0x15, 0x011e);
-        rtl8168_mdio_write(tp, 0x19, 0x5400);
-        rtl8168_mdio_write(tp, 0x15, 0x011f);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0120);
-        rtl8168_mdio_write(tp, 0x19, 0x74f0);
-        rtl8168_mdio_write(tp, 0x15, 0x0121);
-        rtl8168_mdio_write(tp, 0x19, 0x4019);
-        rtl8168_mdio_write(tp, 0x15, 0x0122);
-        rtl8168_mdio_write(tp, 0x19, 0x440d);
-        rtl8168_mdio_write(tp, 0x15, 0x0123);
-        rtl8168_mdio_write(tp, 0x19, 0xb6c1);
-        rtl8168_mdio_write(tp, 0x15, 0x0124);
-        rtl8168_mdio_write(tp, 0x19, 0xc05b);
-        rtl8168_mdio_write(tp, 0x15, 0x0125);
-        rtl8168_mdio_write(tp, 0x19, 0x00bf);
-        rtl8168_mdio_write(tp, 0x15, 0x0126);
-        rtl8168_mdio_write(tp, 0x19, 0xc025);
-        rtl8168_mdio_write(tp, 0x15, 0x0127);
-        rtl8168_mdio_write(tp, 0x19, 0x00bd);
-        rtl8168_mdio_write(tp, 0x15, 0x0128);
-        rtl8168_mdio_write(tp, 0x19, 0xc603);
-        rtl8168_mdio_write(tp, 0x15, 0x0129);
-        rtl8168_mdio_write(tp, 0x19, 0x00bb);
-        rtl8168_mdio_write(tp, 0x15, 0x012a);
-        rtl8168_mdio_write(tp, 0x19, 0x8805);
-        rtl8168_mdio_write(tp, 0x15, 0x012b);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x012c);
-        rtl8168_mdio_write(tp, 0x19, 0x4001);
-        rtl8168_mdio_write(tp, 0x15, 0x012d);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x012e);
-        rtl8168_mdio_write(tp, 0x19, 0xa3dd);
-        rtl8168_mdio_write(tp, 0x15, 0x012f);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0130);
-        rtl8168_mdio_write(tp, 0x19, 0x6c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0131);
-        rtl8168_mdio_write(tp, 0x19, 0x8407);
-        rtl8168_mdio_write(tp, 0x15, 0x0132);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0133);
-        rtl8168_mdio_write(tp, 0x19, 0x6c02);
-        rtl8168_mdio_write(tp, 0x15, 0x0134);
-        rtl8168_mdio_write(tp, 0x19, 0xd9b8);
-        rtl8168_mdio_write(tp, 0x15, 0x0135);
-        rtl8168_mdio_write(tp, 0x19, 0x0003);
-        rtl8168_mdio_write(tp, 0x15, 0x0136);
-        rtl8168_mdio_write(tp, 0x19, 0xc240);
-        rtl8168_mdio_write(tp, 0x15, 0x0137);
-        rtl8168_mdio_write(tp, 0x19, 0x0015);
-        rtl8168_mdio_write(tp, 0x15, 0x0138);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0139);
-        rtl8168_mdio_write(tp, 0x19, 0x6c02);
-        rtl8168_mdio_write(tp, 0x15, 0x013a);
-        rtl8168_mdio_write(tp, 0x19, 0x9ae9);
-        rtl8168_mdio_write(tp, 0x15, 0x013b);
-        rtl8168_mdio_write(tp, 0x19, 0x3140);
-        rtl8168_mdio_write(tp, 0x15, 0x013c);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x013d);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x013e);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x013f);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0140);
-        rtl8168_mdio_write(tp, 0x19, 0x4807);
-        rtl8168_mdio_write(tp, 0x15, 0x0141);
-        rtl8168_mdio_write(tp, 0x19, 0x4004);
-        rtl8168_mdio_write(tp, 0x15, 0x0142);
-        rtl8168_mdio_write(tp, 0x19, 0x4410);
-        rtl8168_mdio_write(tp, 0x15, 0x0143);
-        rtl8168_mdio_write(tp, 0x19, 0x7c0c);
-        rtl8168_mdio_write(tp, 0x15, 0x0144);
-        rtl8168_mdio_write(tp, 0x19, 0x600c);
-        rtl8168_mdio_write(tp, 0x15, 0x0145);
-        rtl8168_mdio_write(tp, 0x19, 0x9b00);
-        rtl8168_mdio_write(tp, 0x15, 0x0146);
-        rtl8168_mdio_write(tp, 0x19, 0xa68f);
-        rtl8168_mdio_write(tp, 0x15, 0x0147);
-        rtl8168_mdio_write(tp, 0x19, 0x3116);
-        rtl8168_mdio_write(tp, 0x15, 0x0148);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0149);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x014a);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x014b);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x014c);
-        rtl8168_mdio_write(tp, 0x19, 0x4804);
-        rtl8168_mdio_write(tp, 0x15, 0x014d);
-        rtl8168_mdio_write(tp, 0x19, 0x54c0);
-        rtl8168_mdio_write(tp, 0x15, 0x014e);
-        rtl8168_mdio_write(tp, 0x19, 0xb703);
-        rtl8168_mdio_write(tp, 0x15, 0x014f);
-        rtl8168_mdio_write(tp, 0x19, 0x5cff);
-        rtl8168_mdio_write(tp, 0x15, 0x0150);
-        rtl8168_mdio_write(tp, 0x19, 0x315f);
-        rtl8168_mdio_write(tp, 0x15, 0x0151);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0152);
-        rtl8168_mdio_write(tp, 0x19, 0x74f8);
-        rtl8168_mdio_write(tp, 0x15, 0x0153);
-        rtl8168_mdio_write(tp, 0x19, 0x6421);
-        rtl8168_mdio_write(tp, 0x15, 0x0154);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0155);
-        rtl8168_mdio_write(tp, 0x19, 0x6000);
-        rtl8168_mdio_write(tp, 0x15, 0x0156);
-        rtl8168_mdio_write(tp, 0x19, 0x4003);
-        rtl8168_mdio_write(tp, 0x15, 0x0157);
-        rtl8168_mdio_write(tp, 0x19, 0x4418);
-        rtl8168_mdio_write(tp, 0x15, 0x0158);
-        rtl8168_mdio_write(tp, 0x19, 0x9b00);
-        rtl8168_mdio_write(tp, 0x15, 0x0159);
-        rtl8168_mdio_write(tp, 0x19, 0x6461);
-        rtl8168_mdio_write(tp, 0x15, 0x015a);
-        rtl8168_mdio_write(tp, 0x19, 0x64e1);
-        rtl8168_mdio_write(tp, 0x15, 0x015b);
-        rtl8168_mdio_write(tp, 0x19, 0x7c20);
-        rtl8168_mdio_write(tp, 0x15, 0x015c);
-        rtl8168_mdio_write(tp, 0x19, 0x5820);
-        rtl8168_mdio_write(tp, 0x15, 0x015d);
-        rtl8168_mdio_write(tp, 0x19, 0x5ccf);
-        rtl8168_mdio_write(tp, 0x15, 0x015e);
-        rtl8168_mdio_write(tp, 0x19, 0x7050);
-        rtl8168_mdio_write(tp, 0x15, 0x015f);
-        rtl8168_mdio_write(tp, 0x19, 0xd9b8);
-        rtl8168_mdio_write(tp, 0x15, 0x0160);
-        rtl8168_mdio_write(tp, 0x19, 0x0008);
-        rtl8168_mdio_write(tp, 0x15, 0x0161);
-        rtl8168_mdio_write(tp, 0x19, 0xdab1);
-        rtl8168_mdio_write(tp, 0x15, 0x0162);
-        rtl8168_mdio_write(tp, 0x19, 0x0015);
-        rtl8168_mdio_write(tp, 0x15, 0x0163);
-        rtl8168_mdio_write(tp, 0x19, 0xc244);
-        rtl8168_mdio_write(tp, 0x15, 0x0164);
-        rtl8168_mdio_write(tp, 0x19, 0x0013);
-        rtl8168_mdio_write(tp, 0x15, 0x0165);
-        rtl8168_mdio_write(tp, 0x19, 0xc021);
-        rtl8168_mdio_write(tp, 0x15, 0x0166);
-        rtl8168_mdio_write(tp, 0x19, 0x00f9);
-        rtl8168_mdio_write(tp, 0x15, 0x0167);
-        rtl8168_mdio_write(tp, 0x19, 0x3177);
-        rtl8168_mdio_write(tp, 0x15, 0x0168);
-        rtl8168_mdio_write(tp, 0x19, 0x5cf7);
-        rtl8168_mdio_write(tp, 0x15, 0x0169);
-        rtl8168_mdio_write(tp, 0x19, 0x4010);
-        rtl8168_mdio_write(tp, 0x15, 0x016a);
-        rtl8168_mdio_write(tp, 0x19, 0x4428);
-        rtl8168_mdio_write(tp, 0x15, 0x016b);
-        rtl8168_mdio_write(tp, 0x19, 0x9c00);
-        rtl8168_mdio_write(tp, 0x15, 0x016c);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x016d);
-        rtl8168_mdio_write(tp, 0x19, 0x6008);
-        rtl8168_mdio_write(tp, 0x15, 0x016e);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x016f);
-        rtl8168_mdio_write(tp, 0x19, 0x74f0);
-        rtl8168_mdio_write(tp, 0x15, 0x0170);
-        rtl8168_mdio_write(tp, 0x19, 0x6461);
-        rtl8168_mdio_write(tp, 0x15, 0x0171);
-        rtl8168_mdio_write(tp, 0x19, 0x6421);
-        rtl8168_mdio_write(tp, 0x15, 0x0172);
-        rtl8168_mdio_write(tp, 0x19, 0x64a1);
-        rtl8168_mdio_write(tp, 0x15, 0x0173);
-        rtl8168_mdio_write(tp, 0x19, 0x3116);
-        rtl8168_mdio_write(tp, 0x15, 0x0174);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0175);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0176);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0177);
-        rtl8168_mdio_write(tp, 0x19, 0x4805);
-        rtl8168_mdio_write(tp, 0x15, 0x0178);
-        rtl8168_mdio_write(tp, 0x19, 0xa103);
-        rtl8168_mdio_write(tp, 0x15, 0x0179);
-        rtl8168_mdio_write(tp, 0x19, 0x7c02);
-        rtl8168_mdio_write(tp, 0x15, 0x017a);
-        rtl8168_mdio_write(tp, 0x19, 0x6002);
-        rtl8168_mdio_write(tp, 0x15, 0x017b);
-        rtl8168_mdio_write(tp, 0x19, 0x7e00);
-        rtl8168_mdio_write(tp, 0x15, 0x017c);
-        rtl8168_mdio_write(tp, 0x19, 0x5400);
-        rtl8168_mdio_write(tp, 0x15, 0x017d);
-        rtl8168_mdio_write(tp, 0x19, 0x7c6b);
-        rtl8168_mdio_write(tp, 0x15, 0x017e);
-        rtl8168_mdio_write(tp, 0x19, 0x5c63);
-        rtl8168_mdio_write(tp, 0x15, 0x017f);
-        rtl8168_mdio_write(tp, 0x19, 0x407d);
-        rtl8168_mdio_write(tp, 0x15, 0x0180);
-        rtl8168_mdio_write(tp, 0x19, 0xa602);
-        rtl8168_mdio_write(tp, 0x15, 0x0181);
-        rtl8168_mdio_write(tp, 0x19, 0x4001);
-        rtl8168_mdio_write(tp, 0x15, 0x0182);
-        rtl8168_mdio_write(tp, 0x19, 0x4420);
-        rtl8168_mdio_write(tp, 0x15, 0x0183);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x0184);
-        rtl8168_mdio_write(tp, 0x19, 0x44a1);
-        rtl8168_mdio_write(tp, 0x15, 0x0185);
-        rtl8168_mdio_write(tp, 0x19, 0xd6e0);
-        rtl8168_mdio_write(tp, 0x15, 0x0186);
-        rtl8168_mdio_write(tp, 0x19, 0x0009);
-        rtl8168_mdio_write(tp, 0x15, 0x0187);
-        rtl8168_mdio_write(tp, 0x19, 0x9efe);
-        rtl8168_mdio_write(tp, 0x15, 0x0188);
-        rtl8168_mdio_write(tp, 0x19, 0x7c02);
-        rtl8168_mdio_write(tp, 0x15, 0x0189);
-        rtl8168_mdio_write(tp, 0x19, 0x6000);
-        rtl8168_mdio_write(tp, 0x15, 0x018a);
-        rtl8168_mdio_write(tp, 0x19, 0x9c00);
-        rtl8168_mdio_write(tp, 0x15, 0x018b);
-        rtl8168_mdio_write(tp, 0x19, 0x318f);
-        rtl8168_mdio_write(tp, 0x15, 0x018c);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x018d);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x018e);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x018f);
-        rtl8168_mdio_write(tp, 0x19, 0x4806);
-        rtl8168_mdio_write(tp, 0x15, 0x0190);
-        rtl8168_mdio_write(tp, 0x19, 0x7c10);
-        rtl8168_mdio_write(tp, 0x15, 0x0191);
-        rtl8168_mdio_write(tp, 0x19, 0x5c10);
-        rtl8168_mdio_write(tp, 0x15, 0x0192);
-        rtl8168_mdio_write(tp, 0x19, 0x40fa);
-        rtl8168_mdio_write(tp, 0x15, 0x0193);
-        rtl8168_mdio_write(tp, 0x19, 0xa602);
-        rtl8168_mdio_write(tp, 0x15, 0x0194);
-        rtl8168_mdio_write(tp, 0x19, 0x4010);
-        rtl8168_mdio_write(tp, 0x15, 0x0195);
-        rtl8168_mdio_write(tp, 0x19, 0x4440);
-        rtl8168_mdio_write(tp, 0x15, 0x0196);
-        rtl8168_mdio_write(tp, 0x19, 0x9d00);
-        rtl8168_mdio_write(tp, 0x15, 0x0197);
-        rtl8168_mdio_write(tp, 0x19, 0x7c80);
-        rtl8168_mdio_write(tp, 0x15, 0x0198);
-        rtl8168_mdio_write(tp, 0x19, 0x6400);
-        rtl8168_mdio_write(tp, 0x15, 0x0199);
-        rtl8168_mdio_write(tp, 0x19, 0x4003);
-        rtl8168_mdio_write(tp, 0x15, 0x019a);
-        rtl8168_mdio_write(tp, 0x19, 0x4540);
-        rtl8168_mdio_write(tp, 0x15, 0x019b);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x019c);
-        rtl8168_mdio_write(tp, 0x19, 0x6008);
-        rtl8168_mdio_write(tp, 0x15, 0x019d);
-        rtl8168_mdio_write(tp, 0x19, 0x9f00);
-        rtl8168_mdio_write(tp, 0x15, 0x019e);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x019f);
-        rtl8168_mdio_write(tp, 0x19, 0x6400);
-        rtl8168_mdio_write(tp, 0x15, 0x01a0);
-        rtl8168_mdio_write(tp, 0x19, 0x7c80);
-        rtl8168_mdio_write(tp, 0x15, 0x01a1);
-        rtl8168_mdio_write(tp, 0x19, 0x6480);
-        rtl8168_mdio_write(tp, 0x15, 0x01a2);
-        rtl8168_mdio_write(tp, 0x19, 0x3140);
-        rtl8168_mdio_write(tp, 0x15, 0x01a3);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01a4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01a5);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01a6);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x01a7);
-        rtl8168_mdio_write(tp, 0x19, 0x7c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x01a8);
-        rtl8168_mdio_write(tp, 0x19, 0x6c01);
-        rtl8168_mdio_write(tp, 0x15, 0x01a9);
-        rtl8168_mdio_write(tp, 0x19, 0x64a8);
-        rtl8168_mdio_write(tp, 0x15, 0x01aa);
-        rtl8168_mdio_write(tp, 0x19, 0x6800);
-        rtl8168_mdio_write(tp, 0x15, 0x01ab);
-        rtl8168_mdio_write(tp, 0x19, 0x5cf0);
-        rtl8168_mdio_write(tp, 0x15, 0x01ac);
-        rtl8168_mdio_write(tp, 0x19, 0x588f);
-        rtl8168_mdio_write(tp, 0x15, 0x01ad);
-        rtl8168_mdio_write(tp, 0x19, 0xb628);
-        rtl8168_mdio_write(tp, 0x15, 0x01ae);
-        rtl8168_mdio_write(tp, 0x19, 0xc053);
-        rtl8168_mdio_write(tp, 0x15, 0x01af);
-        rtl8168_mdio_write(tp, 0x19, 0x0026);
-        rtl8168_mdio_write(tp, 0x15, 0x01b0);
-        rtl8168_mdio_write(tp, 0x19, 0xc02d);
-        rtl8168_mdio_write(tp, 0x15, 0x01b1);
-        rtl8168_mdio_write(tp, 0x19, 0x0024);
-        rtl8168_mdio_write(tp, 0x15, 0x01b2);
-        rtl8168_mdio_write(tp, 0x19, 0xc603);
-        rtl8168_mdio_write(tp, 0x15, 0x01b3);
-        rtl8168_mdio_write(tp, 0x19, 0x0022);
-        rtl8168_mdio_write(tp, 0x15, 0x01b4);
-        rtl8168_mdio_write(tp, 0x19, 0x8cf9);
-        rtl8168_mdio_write(tp, 0x15, 0x01b5);
-        rtl8168_mdio_write(tp, 0x19, 0x31ba);
-        rtl8168_mdio_write(tp, 0x15, 0x01b6);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01b7);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01b8);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01b9);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01ba);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x01bb);
-        rtl8168_mdio_write(tp, 0x19, 0x5420);
-        rtl8168_mdio_write(tp, 0x15, 0x01bc);
-        rtl8168_mdio_write(tp, 0x19, 0x4811);
-        rtl8168_mdio_write(tp, 0x15, 0x01bd);
-        rtl8168_mdio_write(tp, 0x19, 0x5000);
-        rtl8168_mdio_write(tp, 0x15, 0x01be);
-        rtl8168_mdio_write(tp, 0x19, 0x4801);
-        rtl8168_mdio_write(tp, 0x15, 0x01bf);
-        rtl8168_mdio_write(tp, 0x19, 0x6800);
-        rtl8168_mdio_write(tp, 0x15, 0x01c0);
-        rtl8168_mdio_write(tp, 0x19, 0x31f5);
-        rtl8168_mdio_write(tp, 0x15, 0x01c1);
-        rtl8168_mdio_write(tp, 0x19, 0xb614);
-        rtl8168_mdio_write(tp, 0x15, 0x01c2);
-        rtl8168_mdio_write(tp, 0x19, 0x8ce4);
-        rtl8168_mdio_write(tp, 0x15, 0x01c3);
-        rtl8168_mdio_write(tp, 0x19, 0xb30c);
-        rtl8168_mdio_write(tp, 0x15, 0x01c4);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x01c5);
-        rtl8168_mdio_write(tp, 0x19, 0x6c02);
-        rtl8168_mdio_write(tp, 0x15, 0x01c6);
-        rtl8168_mdio_write(tp, 0x19, 0x8206);
-        rtl8168_mdio_write(tp, 0x15, 0x01c7);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x01c8);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x01c9);
-        rtl8168_mdio_write(tp, 0x19, 0x7c04);
-        rtl8168_mdio_write(tp, 0x15, 0x01ca);
-        rtl8168_mdio_write(tp, 0x19, 0x7404);
-        rtl8168_mdio_write(tp, 0x15, 0x01cb);
-        rtl8168_mdio_write(tp, 0x19, 0x31c0);
-        rtl8168_mdio_write(tp, 0x15, 0x01cc);
-        rtl8168_mdio_write(tp, 0x19, 0x7c04);
-        rtl8168_mdio_write(tp, 0x15, 0x01cd);
-        rtl8168_mdio_write(tp, 0x19, 0x7400);
-        rtl8168_mdio_write(tp, 0x15, 0x01ce);
-        rtl8168_mdio_write(tp, 0x19, 0x31c0);
-        rtl8168_mdio_write(tp, 0x15, 0x01cf);
-        rtl8168_mdio_write(tp, 0x19, 0x8df1);
-        rtl8168_mdio_write(tp, 0x15, 0x01d0);
-        rtl8168_mdio_write(tp, 0x19, 0x3248);
-        rtl8168_mdio_write(tp, 0x15, 0x01d1);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01d2);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01d3);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01d4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01d5);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x01d6);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x01d7);
-        rtl8168_mdio_write(tp, 0x19, 0x6c03);
-        rtl8168_mdio_write(tp, 0x15, 0x01d8);
-        rtl8168_mdio_write(tp, 0x19, 0x7670);
-        rtl8168_mdio_write(tp, 0x15, 0x01d9);
-        rtl8168_mdio_write(tp, 0x19, 0x4023);
-        rtl8168_mdio_write(tp, 0x15, 0x01da);
-        rtl8168_mdio_write(tp, 0x19, 0x4500);
-        rtl8168_mdio_write(tp, 0x15, 0x01db);
-        rtl8168_mdio_write(tp, 0x19, 0x4069);
-        rtl8168_mdio_write(tp, 0x15, 0x01dc);
-        rtl8168_mdio_write(tp, 0x19, 0x4580);
-        rtl8168_mdio_write(tp, 0x15, 0x01dd);
-        rtl8168_mdio_write(tp, 0x19, 0x9f00);
-        rtl8168_mdio_write(tp, 0x15, 0x01de);
-        rtl8168_mdio_write(tp, 0x19, 0xcff5);
-        rtl8168_mdio_write(tp, 0x15, 0x01df);
-        rtl8168_mdio_write(tp, 0x19, 0x00ff);
-        rtl8168_mdio_write(tp, 0x15, 0x01e0);
-        rtl8168_mdio_write(tp, 0x19, 0x76f0);
-        rtl8168_mdio_write(tp, 0x15, 0x01e1);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x01e2);
-        rtl8168_mdio_write(tp, 0x19, 0x4023);
-        rtl8168_mdio_write(tp, 0x15, 0x01e3);
-        rtl8168_mdio_write(tp, 0x19, 0x4500);
-        rtl8168_mdio_write(tp, 0x15, 0x01e4);
-        rtl8168_mdio_write(tp, 0x19, 0x4069);
-        rtl8168_mdio_write(tp, 0x15, 0x01e5);
-        rtl8168_mdio_write(tp, 0x19, 0x4580);
-        rtl8168_mdio_write(tp, 0x15, 0x01e6);
-        rtl8168_mdio_write(tp, 0x19, 0x9f00);
-        rtl8168_mdio_write(tp, 0x15, 0x01e7);
-        rtl8168_mdio_write(tp, 0x19, 0xd0f5);
-        rtl8168_mdio_write(tp, 0x15, 0x01e8);
-        rtl8168_mdio_write(tp, 0x19, 0x00ff);
-        rtl8168_mdio_write(tp, 0x15, 0x01e9);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x01ea);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x01eb);
-        rtl8168_mdio_write(tp, 0x19, 0x6800);
-        rtl8168_mdio_write(tp, 0x15, 0x01ec);
-        rtl8168_mdio_write(tp, 0x19, 0x66a0);
-        rtl8168_mdio_write(tp, 0x15, 0x01ed);
-        rtl8168_mdio_write(tp, 0x19, 0x8300);
-        rtl8168_mdio_write(tp, 0x15, 0x01ee);
-        rtl8168_mdio_write(tp, 0x19, 0x74f0);
-        rtl8168_mdio_write(tp, 0x15, 0x01ef);
-        rtl8168_mdio_write(tp, 0x19, 0x3006);
-        rtl8168_mdio_write(tp, 0x15, 0x01f0);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01f1);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01f2);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01f3);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01f4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x01f5);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x01f6);
-        rtl8168_mdio_write(tp, 0x19, 0x6c02);
-        rtl8168_mdio_write(tp, 0x15, 0x01f7);
-        rtl8168_mdio_write(tp, 0x19, 0x409d);
-        rtl8168_mdio_write(tp, 0x15, 0x01f8);
-        rtl8168_mdio_write(tp, 0x19, 0x7c87);
-        rtl8168_mdio_write(tp, 0x15, 0x01f9);
-        rtl8168_mdio_write(tp, 0x19, 0xae14);
-        rtl8168_mdio_write(tp, 0x15, 0x01fa);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x01fb);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x01fc);
-        rtl8168_mdio_write(tp, 0x19, 0x6800);
-        rtl8168_mdio_write(tp, 0x15, 0x01fd);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x01fe);
-        rtl8168_mdio_write(tp, 0x19, 0x980e);
-        rtl8168_mdio_write(tp, 0x15, 0x01ff);
-        rtl8168_mdio_write(tp, 0x19, 0x930c);
-        rtl8168_mdio_write(tp, 0x15, 0x0200);
-        rtl8168_mdio_write(tp, 0x19, 0x9206);
-        rtl8168_mdio_write(tp, 0x15, 0x0201);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0202);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0203);
-        rtl8168_mdio_write(tp, 0x19, 0x588f);
-        rtl8168_mdio_write(tp, 0x15, 0x0204);
-        rtl8168_mdio_write(tp, 0x19, 0x5520);
-        rtl8168_mdio_write(tp, 0x15, 0x0205);
-        rtl8168_mdio_write(tp, 0x19, 0x320c);
-        rtl8168_mdio_write(tp, 0x15, 0x0206);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x15, 0x0207);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0208);
-        rtl8168_mdio_write(tp, 0x19, 0x588d);
-        rtl8168_mdio_write(tp, 0x15, 0x0209);
-        rtl8168_mdio_write(tp, 0x19, 0x5500);
-        rtl8168_mdio_write(tp, 0x15, 0x020a);
-        rtl8168_mdio_write(tp, 0x19, 0x320c);
-        rtl8168_mdio_write(tp, 0x15, 0x020b);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x020c);
-        rtl8168_mdio_write(tp, 0x19, 0x3220);
-        rtl8168_mdio_write(tp, 0x15, 0x020d);
-        rtl8168_mdio_write(tp, 0x19, 0x4480);
-        rtl8168_mdio_write(tp, 0x15, 0x020e);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x020f);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x0210);
-        rtl8168_mdio_write(tp, 0x19, 0x6840);
-        rtl8168_mdio_write(tp, 0x15, 0x0211);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x0212);
-        rtl8168_mdio_write(tp, 0x19, 0x980e);
-        rtl8168_mdio_write(tp, 0x15, 0x0213);
-        rtl8168_mdio_write(tp, 0x19, 0x930c);
-        rtl8168_mdio_write(tp, 0x15, 0x0214);
-        rtl8168_mdio_write(tp, 0x19, 0x9206);
-        rtl8168_mdio_write(tp, 0x15, 0x0215);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x15, 0x0216);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0217);
-        rtl8168_mdio_write(tp, 0x19, 0x588f);
-        rtl8168_mdio_write(tp, 0x15, 0x0218);
-        rtl8168_mdio_write(tp, 0x19, 0x5520);
-        rtl8168_mdio_write(tp, 0x15, 0x0219);
-        rtl8168_mdio_write(tp, 0x19, 0x3220);
-        rtl8168_mdio_write(tp, 0x15, 0x021a);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x021b);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x021c);
-        rtl8168_mdio_write(tp, 0x19, 0x588d);
-        rtl8168_mdio_write(tp, 0x15, 0x021d);
-        rtl8168_mdio_write(tp, 0x19, 0x5540);
-        rtl8168_mdio_write(tp, 0x15, 0x021e);
-        rtl8168_mdio_write(tp, 0x19, 0x3220);
-        rtl8168_mdio_write(tp, 0x15, 0x021f);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x15, 0x0220);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0221);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0222);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0223);
-        rtl8168_mdio_write(tp, 0x19, 0x3231);
-        rtl8168_mdio_write(tp, 0x15, 0x0224);
-        rtl8168_mdio_write(tp, 0x19, 0xab06);
-        rtl8168_mdio_write(tp, 0x15, 0x0225);
-        rtl8168_mdio_write(tp, 0x19, 0xbf08);
-        rtl8168_mdio_write(tp, 0x15, 0x0226);
-        rtl8168_mdio_write(tp, 0x19, 0x4076);
-        rtl8168_mdio_write(tp, 0x15, 0x0227);
-        rtl8168_mdio_write(tp, 0x19, 0x7d07);
-        rtl8168_mdio_write(tp, 0x15, 0x0228);
-        rtl8168_mdio_write(tp, 0x19, 0x4502);
-        rtl8168_mdio_write(tp, 0x15, 0x0229);
-        rtl8168_mdio_write(tp, 0x19, 0x3231);
-        rtl8168_mdio_write(tp, 0x15, 0x022a);
-        rtl8168_mdio_write(tp, 0x19, 0x7d80);
-        rtl8168_mdio_write(tp, 0x15, 0x022b);
-        rtl8168_mdio_write(tp, 0x19, 0x5180);
-        rtl8168_mdio_write(tp, 0x15, 0x022c);
-        rtl8168_mdio_write(tp, 0x19, 0x322f);
-        rtl8168_mdio_write(tp, 0x15, 0x022d);
-        rtl8168_mdio_write(tp, 0x19, 0x7d80);
-        rtl8168_mdio_write(tp, 0x15, 0x022e);
-        rtl8168_mdio_write(tp, 0x19, 0x5000);
-        rtl8168_mdio_write(tp, 0x15, 0x022f);
-        rtl8168_mdio_write(tp, 0x19, 0x7d07);
-        rtl8168_mdio_write(tp, 0x15, 0x0230);
-        rtl8168_mdio_write(tp, 0x19, 0x4402);
-        rtl8168_mdio_write(tp, 0x15, 0x0231);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0232);
-        rtl8168_mdio_write(tp, 0x19, 0x6c02);
-        rtl8168_mdio_write(tp, 0x15, 0x0233);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0234);
-        rtl8168_mdio_write(tp, 0x19, 0xb309);
-        rtl8168_mdio_write(tp, 0x15, 0x0235);
-        rtl8168_mdio_write(tp, 0x19, 0xb204);
-        rtl8168_mdio_write(tp, 0x15, 0x0236);
-        rtl8168_mdio_write(tp, 0x19, 0xb105);
-        rtl8168_mdio_write(tp, 0x15, 0x0237);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0238);
-        rtl8168_mdio_write(tp, 0x19, 0x31c1);
-        rtl8168_mdio_write(tp, 0x15, 0x0239);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x023a);
-        rtl8168_mdio_write(tp, 0x19, 0x3261);
-        rtl8168_mdio_write(tp, 0x15, 0x023b);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x023c);
-        rtl8168_mdio_write(tp, 0x19, 0x3250);
-        rtl8168_mdio_write(tp, 0x15, 0x023d);
-        rtl8168_mdio_write(tp, 0x19, 0xb203);
-        rtl8168_mdio_write(tp, 0x15, 0x023e);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x023f);
-        rtl8168_mdio_write(tp, 0x19, 0x327a);
-        rtl8168_mdio_write(tp, 0x15, 0x0240);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0241);
-        rtl8168_mdio_write(tp, 0x19, 0x3293);
-        rtl8168_mdio_write(tp, 0x15, 0x0242);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0243);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0244);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0245);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0246);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0247);
-        rtl8168_mdio_write(tp, 0x19, 0x32a3);
-        rtl8168_mdio_write(tp, 0x15, 0x0248);
-        rtl8168_mdio_write(tp, 0x19, 0x5520);
-        rtl8168_mdio_write(tp, 0x15, 0x0249);
-        rtl8168_mdio_write(tp, 0x19, 0x403d);
-        rtl8168_mdio_write(tp, 0x15, 0x024a);
-        rtl8168_mdio_write(tp, 0x19, 0x440c);
-        rtl8168_mdio_write(tp, 0x15, 0x024b);
-        rtl8168_mdio_write(tp, 0x19, 0x4812);
-        rtl8168_mdio_write(tp, 0x15, 0x024c);
-        rtl8168_mdio_write(tp, 0x19, 0x5001);
-        rtl8168_mdio_write(tp, 0x15, 0x024d);
-        rtl8168_mdio_write(tp, 0x19, 0x4802);
-        rtl8168_mdio_write(tp, 0x15, 0x024e);
-        rtl8168_mdio_write(tp, 0x19, 0x6880);
-        rtl8168_mdio_write(tp, 0x15, 0x024f);
-        rtl8168_mdio_write(tp, 0x19, 0x31f5);
-        rtl8168_mdio_write(tp, 0x15, 0x0250);
-        rtl8168_mdio_write(tp, 0x19, 0xb685);
-        rtl8168_mdio_write(tp, 0x15, 0x0251);
-        rtl8168_mdio_write(tp, 0x19, 0x801c);
-        rtl8168_mdio_write(tp, 0x15, 0x0252);
-        rtl8168_mdio_write(tp, 0x19, 0xbaf5);
-        rtl8168_mdio_write(tp, 0x15, 0x0253);
-        rtl8168_mdio_write(tp, 0x19, 0xc07c);
-        rtl8168_mdio_write(tp, 0x15, 0x0254);
-        rtl8168_mdio_write(tp, 0x19, 0x00fb);
-        rtl8168_mdio_write(tp, 0x15, 0x0255);
-        rtl8168_mdio_write(tp, 0x19, 0x325a);
-        rtl8168_mdio_write(tp, 0x15, 0x0256);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0257);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0258);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0259);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x025a);
-        rtl8168_mdio_write(tp, 0x19, 0x481a);
-        rtl8168_mdio_write(tp, 0x15, 0x025b);
-        rtl8168_mdio_write(tp, 0x19, 0x5001);
-        rtl8168_mdio_write(tp, 0x15, 0x025c);
-        rtl8168_mdio_write(tp, 0x19, 0x401b);
-        rtl8168_mdio_write(tp, 0x15, 0x025d);
-        rtl8168_mdio_write(tp, 0x19, 0x480a);
-        rtl8168_mdio_write(tp, 0x15, 0x025e);
-        rtl8168_mdio_write(tp, 0x19, 0x4418);
-        rtl8168_mdio_write(tp, 0x15, 0x025f);
-        rtl8168_mdio_write(tp, 0x19, 0x6900);
-        rtl8168_mdio_write(tp, 0x15, 0x0260);
-        rtl8168_mdio_write(tp, 0x19, 0x31f5);
-        rtl8168_mdio_write(tp, 0x15, 0x0261);
-        rtl8168_mdio_write(tp, 0x19, 0xb64b);
-        rtl8168_mdio_write(tp, 0x15, 0x0262);
-        rtl8168_mdio_write(tp, 0x19, 0xdb00);
-        rtl8168_mdio_write(tp, 0x15, 0x0263);
-        rtl8168_mdio_write(tp, 0x19, 0x0048);
-        rtl8168_mdio_write(tp, 0x15, 0x0264);
-        rtl8168_mdio_write(tp, 0x19, 0xdb7d);
-        rtl8168_mdio_write(tp, 0x15, 0x0265);
-        rtl8168_mdio_write(tp, 0x19, 0x0002);
-        rtl8168_mdio_write(tp, 0x15, 0x0266);
-        rtl8168_mdio_write(tp, 0x19, 0xa0fa);
-        rtl8168_mdio_write(tp, 0x15, 0x0267);
-        rtl8168_mdio_write(tp, 0x19, 0x4408);
-        rtl8168_mdio_write(tp, 0x15, 0x0268);
-        rtl8168_mdio_write(tp, 0x19, 0x3248);
-        rtl8168_mdio_write(tp, 0x15, 0x0269);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x026a);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x026b);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x026c);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x026d);
-        rtl8168_mdio_write(tp, 0x19, 0xb806);
-        rtl8168_mdio_write(tp, 0x15, 0x026e);
-        rtl8168_mdio_write(tp, 0x19, 0x588d);
-        rtl8168_mdio_write(tp, 0x15, 0x026f);
-        rtl8168_mdio_write(tp, 0x19, 0x5500);
-        rtl8168_mdio_write(tp, 0x15, 0x0270);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x0271);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0272);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0273);
-        rtl8168_mdio_write(tp, 0x19, 0x4814);
-        rtl8168_mdio_write(tp, 0x15, 0x0274);
-        rtl8168_mdio_write(tp, 0x19, 0x500b);
-        rtl8168_mdio_write(tp, 0x15, 0x0275);
-        rtl8168_mdio_write(tp, 0x19, 0x4804);
-        rtl8168_mdio_write(tp, 0x15, 0x0276);
-        rtl8168_mdio_write(tp, 0x19, 0x40c4);
-        rtl8168_mdio_write(tp, 0x15, 0x0277);
-        rtl8168_mdio_write(tp, 0x19, 0x4425);
-        rtl8168_mdio_write(tp, 0x15, 0x0278);
-        rtl8168_mdio_write(tp, 0x19, 0x6a00);
-        rtl8168_mdio_write(tp, 0x15, 0x0279);
-        rtl8168_mdio_write(tp, 0x19, 0x31f5);
-        rtl8168_mdio_write(tp, 0x15, 0x027a);
-        rtl8168_mdio_write(tp, 0x19, 0xb632);
-        rtl8168_mdio_write(tp, 0x15, 0x027b);
-        rtl8168_mdio_write(tp, 0x19, 0xdc03);
-        rtl8168_mdio_write(tp, 0x15, 0x027c);
-        rtl8168_mdio_write(tp, 0x19, 0x0027);
-        rtl8168_mdio_write(tp, 0x15, 0x027d);
-        rtl8168_mdio_write(tp, 0x19, 0x80fc);
-        rtl8168_mdio_write(tp, 0x15, 0x027e);
-        rtl8168_mdio_write(tp, 0x19, 0x3283);
-        rtl8168_mdio_write(tp, 0x15, 0x027f);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0280);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0281);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0282);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0283);
-        rtl8168_mdio_write(tp, 0x19, 0xb806);
-        rtl8168_mdio_write(tp, 0x15, 0x0284);
-        rtl8168_mdio_write(tp, 0x19, 0x588f);
-        rtl8168_mdio_write(tp, 0x15, 0x0285);
-        rtl8168_mdio_write(tp, 0x19, 0x5520);
-        rtl8168_mdio_write(tp, 0x15, 0x0286);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x0287);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x15, 0x0288);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0289);
-        rtl8168_mdio_write(tp, 0x19, 0x4818);
-        rtl8168_mdio_write(tp, 0x15, 0x028a);
-        rtl8168_mdio_write(tp, 0x19, 0x5051);
-        rtl8168_mdio_write(tp, 0x15, 0x028b);
-        rtl8168_mdio_write(tp, 0x19, 0x4808);
-        rtl8168_mdio_write(tp, 0x15, 0x028c);
-        rtl8168_mdio_write(tp, 0x19, 0x4050);
-        rtl8168_mdio_write(tp, 0x15, 0x028d);
-        rtl8168_mdio_write(tp, 0x19, 0x4462);
-        rtl8168_mdio_write(tp, 0x15, 0x028e);
-        rtl8168_mdio_write(tp, 0x19, 0x40c4);
-        rtl8168_mdio_write(tp, 0x15, 0x028f);
-        rtl8168_mdio_write(tp, 0x19, 0x4473);
-        rtl8168_mdio_write(tp, 0x15, 0x0290);
-        rtl8168_mdio_write(tp, 0x19, 0x5041);
-        rtl8168_mdio_write(tp, 0x15, 0x0291);
-        rtl8168_mdio_write(tp, 0x19, 0x6b00);
-        rtl8168_mdio_write(tp, 0x15, 0x0292);
-        rtl8168_mdio_write(tp, 0x19, 0x31f5);
-        rtl8168_mdio_write(tp, 0x15, 0x0293);
-        rtl8168_mdio_write(tp, 0x19, 0xb619);
-        rtl8168_mdio_write(tp, 0x15, 0x0294);
-        rtl8168_mdio_write(tp, 0x19, 0x80d9);
-        rtl8168_mdio_write(tp, 0x15, 0x0295);
-        rtl8168_mdio_write(tp, 0x19, 0xbd06);
-        rtl8168_mdio_write(tp, 0x15, 0x0296);
-        rtl8168_mdio_write(tp, 0x19, 0xbb0d);
-        rtl8168_mdio_write(tp, 0x15, 0x0297);
-        rtl8168_mdio_write(tp, 0x19, 0xaf14);
-        rtl8168_mdio_write(tp, 0x15, 0x0298);
-        rtl8168_mdio_write(tp, 0x19, 0x8efa);
-        rtl8168_mdio_write(tp, 0x15, 0x0299);
-        rtl8168_mdio_write(tp, 0x19, 0x5049);
-        rtl8168_mdio_write(tp, 0x15, 0x029a);
-        rtl8168_mdio_write(tp, 0x19, 0x3248);
-        rtl8168_mdio_write(tp, 0x15, 0x029b);
-        rtl8168_mdio_write(tp, 0x19, 0x4c10);
-        rtl8168_mdio_write(tp, 0x15, 0x029c);
-        rtl8168_mdio_write(tp, 0x19, 0x44b0);
-        rtl8168_mdio_write(tp, 0x15, 0x029d);
-        rtl8168_mdio_write(tp, 0x19, 0x4c00);
-        rtl8168_mdio_write(tp, 0x15, 0x029e);
-        rtl8168_mdio_write(tp, 0x19, 0x3292);
-        rtl8168_mdio_write(tp, 0x15, 0x029f);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02a0);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02a1);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02a2);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02a3);
-        rtl8168_mdio_write(tp, 0x19, 0x481f);
-        rtl8168_mdio_write(tp, 0x15, 0x02a4);
-        rtl8168_mdio_write(tp, 0x19, 0x5005);
-        rtl8168_mdio_write(tp, 0x15, 0x02a5);
-        rtl8168_mdio_write(tp, 0x19, 0x480f);
-        rtl8168_mdio_write(tp, 0x15, 0x02a6);
-        rtl8168_mdio_write(tp, 0x19, 0xac00);
-        rtl8168_mdio_write(tp, 0x15, 0x02a7);
-        rtl8168_mdio_write(tp, 0x19, 0x31a6);
-        rtl8168_mdio_write(tp, 0x15, 0x02a8);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02a9);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02aa);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02ab);
-        rtl8168_mdio_write(tp, 0x19, 0x31ba);
-        rtl8168_mdio_write(tp, 0x15, 0x02ac);
-        rtl8168_mdio_write(tp, 0x19, 0x31d5);
-        rtl8168_mdio_write(tp, 0x15, 0x02ad);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02ae);
-        rtl8168_mdio_write(tp, 0x19, 0x5cf0);
-        rtl8168_mdio_write(tp, 0x15, 0x02af);
-        rtl8168_mdio_write(tp, 0x19, 0x588c);
-        rtl8168_mdio_write(tp, 0x15, 0x02b0);
-        rtl8168_mdio_write(tp, 0x19, 0x542f);
-        rtl8168_mdio_write(tp, 0x15, 0x02b1);
-        rtl8168_mdio_write(tp, 0x19, 0x7ffb);
-        rtl8168_mdio_write(tp, 0x15, 0x02b2);
-        rtl8168_mdio_write(tp, 0x19, 0x6ff8);
-        rtl8168_mdio_write(tp, 0x15, 0x02b3);
-        rtl8168_mdio_write(tp, 0x19, 0x64a4);
-        rtl8168_mdio_write(tp, 0x15, 0x02b4);
-        rtl8168_mdio_write(tp, 0x19, 0x64a0);
-        rtl8168_mdio_write(tp, 0x15, 0x02b5);
-        rtl8168_mdio_write(tp, 0x19, 0x6800);
-        rtl8168_mdio_write(tp, 0x15, 0x02b6);
-        rtl8168_mdio_write(tp, 0x19, 0x4400);
-        rtl8168_mdio_write(tp, 0x15, 0x02b7);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x02b8);
-        rtl8168_mdio_write(tp, 0x19, 0x4480);
-        rtl8168_mdio_write(tp, 0x15, 0x02b9);
-        rtl8168_mdio_write(tp, 0x19, 0x9e00);
-        rtl8168_mdio_write(tp, 0x15, 0x02ba);
-        rtl8168_mdio_write(tp, 0x19, 0x4891);
-        rtl8168_mdio_write(tp, 0x15, 0x02bb);
-        rtl8168_mdio_write(tp, 0x19, 0x4cc0);
-        rtl8168_mdio_write(tp, 0x15, 0x02bc);
-        rtl8168_mdio_write(tp, 0x19, 0x4801);
-        rtl8168_mdio_write(tp, 0x15, 0x02bd);
-        rtl8168_mdio_write(tp, 0x19, 0xa609);
-        rtl8168_mdio_write(tp, 0x15, 0x02be);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x02bf);
-        rtl8168_mdio_write(tp, 0x19, 0x004e);
-        rtl8168_mdio_write(tp, 0x15, 0x02c0);
-        rtl8168_mdio_write(tp, 0x19, 0x87fe);
-        rtl8168_mdio_write(tp, 0x15, 0x02c1);
-        rtl8168_mdio_write(tp, 0x19, 0x32c6);
-        rtl8168_mdio_write(tp, 0x15, 0x02c2);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02c3);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02c4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02c5);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02c6);
-        rtl8168_mdio_write(tp, 0x19, 0x48b2);
-        rtl8168_mdio_write(tp, 0x15, 0x02c7);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x02c8);
-        rtl8168_mdio_write(tp, 0x19, 0x4822);
-        rtl8168_mdio_write(tp, 0x15, 0x02c9);
-        rtl8168_mdio_write(tp, 0x19, 0x4488);
-        rtl8168_mdio_write(tp, 0x15, 0x02ca);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x02cb);
-        rtl8168_mdio_write(tp, 0x19, 0x0042);
-        rtl8168_mdio_write(tp, 0x15, 0x02cc);
-        rtl8168_mdio_write(tp, 0x19, 0x8203);
-        rtl8168_mdio_write(tp, 0x15, 0x02cd);
-        rtl8168_mdio_write(tp, 0x19, 0x4cc8);
-        rtl8168_mdio_write(tp, 0x15, 0x02ce);
-        rtl8168_mdio_write(tp, 0x19, 0x32d0);
-        rtl8168_mdio_write(tp, 0x15, 0x02cf);
-        rtl8168_mdio_write(tp, 0x19, 0x4cc0);
-        rtl8168_mdio_write(tp, 0x15, 0x02d0);
-        rtl8168_mdio_write(tp, 0x19, 0xc4d4);
-        rtl8168_mdio_write(tp, 0x15, 0x02d1);
-        rtl8168_mdio_write(tp, 0x19, 0x00f9);
-        rtl8168_mdio_write(tp, 0x15, 0x02d2);
-        rtl8168_mdio_write(tp, 0x19, 0xa51a);
-        rtl8168_mdio_write(tp, 0x15, 0x02d3);
-        rtl8168_mdio_write(tp, 0x19, 0x32d9);
-        rtl8168_mdio_write(tp, 0x15, 0x02d4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02d5);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02d6);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02d7);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02d8);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02d9);
-        rtl8168_mdio_write(tp, 0x19, 0x48b3);
-        rtl8168_mdio_write(tp, 0x15, 0x02da);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x02db);
-        rtl8168_mdio_write(tp, 0x19, 0x4823);
-        rtl8168_mdio_write(tp, 0x15, 0x02dc);
-        rtl8168_mdio_write(tp, 0x19, 0x4410);
-        rtl8168_mdio_write(tp, 0x15, 0x02dd);
-        rtl8168_mdio_write(tp, 0x19, 0xb630);
-        rtl8168_mdio_write(tp, 0x15, 0x02de);
-        rtl8168_mdio_write(tp, 0x19, 0x7dc8);
-        rtl8168_mdio_write(tp, 0x15, 0x02df);
-        rtl8168_mdio_write(tp, 0x19, 0x8203);
-        rtl8168_mdio_write(tp, 0x15, 0x02e0);
-        rtl8168_mdio_write(tp, 0x19, 0x4c48);
-        rtl8168_mdio_write(tp, 0x15, 0x02e1);
-        rtl8168_mdio_write(tp, 0x19, 0x32e3);
-        rtl8168_mdio_write(tp, 0x15, 0x02e2);
-        rtl8168_mdio_write(tp, 0x19, 0x4c40);
-        rtl8168_mdio_write(tp, 0x15, 0x02e3);
-        rtl8168_mdio_write(tp, 0x19, 0x9bfa);
-        rtl8168_mdio_write(tp, 0x15, 0x02e4);
-        rtl8168_mdio_write(tp, 0x19, 0x84ca);
-        rtl8168_mdio_write(tp, 0x15, 0x02e5);
-        rtl8168_mdio_write(tp, 0x19, 0x85f8);
-        rtl8168_mdio_write(tp, 0x15, 0x02e6);
-        rtl8168_mdio_write(tp, 0x19, 0x32ec);
-        rtl8168_mdio_write(tp, 0x15, 0x02e7);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02e8);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02e9);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02ea);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02eb);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x02ec);
-        rtl8168_mdio_write(tp, 0x19, 0x48d4);
-        rtl8168_mdio_write(tp, 0x15, 0x02ed);
-        rtl8168_mdio_write(tp, 0x19, 0x4020);
-        rtl8168_mdio_write(tp, 0x15, 0x02ee);
-        rtl8168_mdio_write(tp, 0x19, 0x4844);
-        rtl8168_mdio_write(tp, 0x15, 0x02ef);
-        rtl8168_mdio_write(tp, 0x19, 0x4420);
-        rtl8168_mdio_write(tp, 0x15, 0x02f0);
-        rtl8168_mdio_write(tp, 0x19, 0x6800);
-        rtl8168_mdio_write(tp, 0x15, 0x02f1);
-        rtl8168_mdio_write(tp, 0x19, 0x7dc0);
-        rtl8168_mdio_write(tp, 0x15, 0x02f2);
-        rtl8168_mdio_write(tp, 0x19, 0x4c40);
-        rtl8168_mdio_write(tp, 0x15, 0x02f3);
-        rtl8168_mdio_write(tp, 0x19, 0x7c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x02f4);
-        rtl8168_mdio_write(tp, 0x19, 0x6c08);
-        rtl8168_mdio_write(tp, 0x15, 0x02f5);
-        rtl8168_mdio_write(tp, 0x19, 0x3311);
-        rtl8168_mdio_write(tp, 0x15, 0x02f6);
-        rtl8168_mdio_write(tp, 0x19, 0x9cfd);
-        rtl8168_mdio_write(tp, 0x15, 0x02f7);
-        rtl8168_mdio_write(tp, 0x19, 0xb616);
-        rtl8168_mdio_write(tp, 0x15, 0x02f8);
-        rtl8168_mdio_write(tp, 0x19, 0xc42b);
-        rtl8168_mdio_write(tp, 0x15, 0x02f9);
-        rtl8168_mdio_write(tp, 0x19, 0x00e0);
-        rtl8168_mdio_write(tp, 0x15, 0x02fa);
-        rtl8168_mdio_write(tp, 0x19, 0xc455);
-        rtl8168_mdio_write(tp, 0x15, 0x02fb);
-        rtl8168_mdio_write(tp, 0x19, 0x00b3);
-        rtl8168_mdio_write(tp, 0x15, 0x02fc);
-        rtl8168_mdio_write(tp, 0x19, 0xb20a);
-        rtl8168_mdio_write(tp, 0x15, 0x02fd);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x02fe);
-        rtl8168_mdio_write(tp, 0x19, 0x6c02);
-        rtl8168_mdio_write(tp, 0x15, 0x02ff);
-        rtl8168_mdio_write(tp, 0x19, 0x8204);
-        rtl8168_mdio_write(tp, 0x15, 0x0300);
-        rtl8168_mdio_write(tp, 0x19, 0x7c04);
-        rtl8168_mdio_write(tp, 0x15, 0x0301);
-        rtl8168_mdio_write(tp, 0x19, 0x7404);
-        rtl8168_mdio_write(tp, 0x15, 0x0302);
-        rtl8168_mdio_write(tp, 0x19, 0x32f3);
-        rtl8168_mdio_write(tp, 0x15, 0x0303);
-        rtl8168_mdio_write(tp, 0x19, 0x7c04);
-        rtl8168_mdio_write(tp, 0x15, 0x0304);
-        rtl8168_mdio_write(tp, 0x19, 0x7400);
-        rtl8168_mdio_write(tp, 0x15, 0x0305);
-        rtl8168_mdio_write(tp, 0x19, 0x32f3);
-        rtl8168_mdio_write(tp, 0x15, 0x0306);
-        rtl8168_mdio_write(tp, 0x19, 0xefed);
-        rtl8168_mdio_write(tp, 0x15, 0x0307);
-        rtl8168_mdio_write(tp, 0x19, 0x3342);
-        rtl8168_mdio_write(tp, 0x15, 0x0308);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0309);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x030a);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x030b);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x030c);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x030d);
-        rtl8168_mdio_write(tp, 0x19, 0x3006);
-        rtl8168_mdio_write(tp, 0x15, 0x030e);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x030f);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0310);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0311);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0312);
-        rtl8168_mdio_write(tp, 0x19, 0xa207);
-        rtl8168_mdio_write(tp, 0x15, 0x0313);
-        rtl8168_mdio_write(tp, 0x19, 0x4c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0314);
-        rtl8168_mdio_write(tp, 0x19, 0x3322);
-        rtl8168_mdio_write(tp, 0x15, 0x0315);
-        rtl8168_mdio_write(tp, 0x19, 0x4041);
-        rtl8168_mdio_write(tp, 0x15, 0x0316);
-        rtl8168_mdio_write(tp, 0x19, 0x7d07);
-        rtl8168_mdio_write(tp, 0x15, 0x0317);
-        rtl8168_mdio_write(tp, 0x19, 0x4502);
-        rtl8168_mdio_write(tp, 0x15, 0x0318);
-        rtl8168_mdio_write(tp, 0x19, 0x3322);
-        rtl8168_mdio_write(tp, 0x15, 0x0319);
-        rtl8168_mdio_write(tp, 0x19, 0x4c08);
-        rtl8168_mdio_write(tp, 0x15, 0x031a);
-        rtl8168_mdio_write(tp, 0x19, 0x3322);
-        rtl8168_mdio_write(tp, 0x15, 0x031b);
-        rtl8168_mdio_write(tp, 0x19, 0x7d80);
-        rtl8168_mdio_write(tp, 0x15, 0x031c);
-        rtl8168_mdio_write(tp, 0x19, 0x5180);
-        rtl8168_mdio_write(tp, 0x15, 0x031d);
-        rtl8168_mdio_write(tp, 0x19, 0x3320);
-        rtl8168_mdio_write(tp, 0x15, 0x031e);
-        rtl8168_mdio_write(tp, 0x19, 0x7d80);
-        rtl8168_mdio_write(tp, 0x15, 0x031f);
-        rtl8168_mdio_write(tp, 0x19, 0x5000);
-        rtl8168_mdio_write(tp, 0x15, 0x0320);
-        rtl8168_mdio_write(tp, 0x19, 0x7d07);
-        rtl8168_mdio_write(tp, 0x15, 0x0321);
-        rtl8168_mdio_write(tp, 0x19, 0x4402);
-        rtl8168_mdio_write(tp, 0x15, 0x0322);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0323);
-        rtl8168_mdio_write(tp, 0x19, 0x6c02);
-        rtl8168_mdio_write(tp, 0x15, 0x0324);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x0325);
-        rtl8168_mdio_write(tp, 0x19, 0xb30c);
-        rtl8168_mdio_write(tp, 0x15, 0x0326);
-        rtl8168_mdio_write(tp, 0x19, 0xb206);
-        rtl8168_mdio_write(tp, 0x15, 0x0327);
-        rtl8168_mdio_write(tp, 0x19, 0xb103);
-        rtl8168_mdio_write(tp, 0x15, 0x0328);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0329);
-        rtl8168_mdio_write(tp, 0x19, 0x32f6);
-        rtl8168_mdio_write(tp, 0x15, 0x032a);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x032b);
-        rtl8168_mdio_write(tp, 0x19, 0x3352);
-        rtl8168_mdio_write(tp, 0x15, 0x032c);
-        rtl8168_mdio_write(tp, 0x19, 0xb103);
-        rtl8168_mdio_write(tp, 0x15, 0x032d);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x032e);
-        rtl8168_mdio_write(tp, 0x19, 0x336a);
-        rtl8168_mdio_write(tp, 0x15, 0x032f);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0330);
-        rtl8168_mdio_write(tp, 0x19, 0x3382);
-        rtl8168_mdio_write(tp, 0x15, 0x0331);
-        rtl8168_mdio_write(tp, 0x19, 0xb206);
-        rtl8168_mdio_write(tp, 0x15, 0x0332);
-        rtl8168_mdio_write(tp, 0x19, 0xb103);
-        rtl8168_mdio_write(tp, 0x15, 0x0333);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0334);
-        rtl8168_mdio_write(tp, 0x19, 0x3395);
-        rtl8168_mdio_write(tp, 0x15, 0x0335);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0336);
-        rtl8168_mdio_write(tp, 0x19, 0x33c6);
-        rtl8168_mdio_write(tp, 0x15, 0x0337);
-        rtl8168_mdio_write(tp, 0x19, 0xb103);
-        rtl8168_mdio_write(tp, 0x15, 0x0338);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x0339);
-        rtl8168_mdio_write(tp, 0x19, 0x33d7);
-        rtl8168_mdio_write(tp, 0x15, 0x033a);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x033b);
-        rtl8168_mdio_write(tp, 0x19, 0x33f2);
-        rtl8168_mdio_write(tp, 0x15, 0x033c);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x033d);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x033e);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x033f);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0340);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0341);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0342);
-        rtl8168_mdio_write(tp, 0x19, 0x49b5);
-        rtl8168_mdio_write(tp, 0x15, 0x0343);
-        rtl8168_mdio_write(tp, 0x19, 0x7d00);
-        rtl8168_mdio_write(tp, 0x15, 0x0344);
-        rtl8168_mdio_write(tp, 0x19, 0x4d00);
-        rtl8168_mdio_write(tp, 0x15, 0x0345);
-        rtl8168_mdio_write(tp, 0x19, 0x6880);
-        rtl8168_mdio_write(tp, 0x15, 0x0346);
-        rtl8168_mdio_write(tp, 0x19, 0x7c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0347);
-        rtl8168_mdio_write(tp, 0x19, 0x6c08);
-        rtl8168_mdio_write(tp, 0x15, 0x0348);
-        rtl8168_mdio_write(tp, 0x19, 0x4925);
-        rtl8168_mdio_write(tp, 0x15, 0x0349);
-        rtl8168_mdio_write(tp, 0x19, 0x403b);
-        rtl8168_mdio_write(tp, 0x15, 0x034a);
-        rtl8168_mdio_write(tp, 0x19, 0xa602);
-        rtl8168_mdio_write(tp, 0x15, 0x034b);
-        rtl8168_mdio_write(tp, 0x19, 0x402f);
-        rtl8168_mdio_write(tp, 0x15, 0x034c);
-        rtl8168_mdio_write(tp, 0x19, 0x4484);
-        rtl8168_mdio_write(tp, 0x15, 0x034d);
-        rtl8168_mdio_write(tp, 0x19, 0x40c8);
-        rtl8168_mdio_write(tp, 0x15, 0x034e);
-        rtl8168_mdio_write(tp, 0x19, 0x44c4);
-        rtl8168_mdio_write(tp, 0x15, 0x034f);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x0350);
-        rtl8168_mdio_write(tp, 0x19, 0x00bd);
-        rtl8168_mdio_write(tp, 0x15, 0x0351);
-        rtl8168_mdio_write(tp, 0x19, 0x3311);
-        rtl8168_mdio_write(tp, 0x15, 0x0352);
-        rtl8168_mdio_write(tp, 0x19, 0xc8ed);
-        rtl8168_mdio_write(tp, 0x15, 0x0353);
-        rtl8168_mdio_write(tp, 0x19, 0x00fc);
-        rtl8168_mdio_write(tp, 0x15, 0x0354);
-        rtl8168_mdio_write(tp, 0x19, 0x8221);
-        rtl8168_mdio_write(tp, 0x15, 0x0355);
-        rtl8168_mdio_write(tp, 0x19, 0xd11d);
-        rtl8168_mdio_write(tp, 0x15, 0x0356);
-        rtl8168_mdio_write(tp, 0x19, 0x001f);
-        rtl8168_mdio_write(tp, 0x15, 0x0357);
-        rtl8168_mdio_write(tp, 0x19, 0xde18);
-        rtl8168_mdio_write(tp, 0x15, 0x0358);
-        rtl8168_mdio_write(tp, 0x19, 0x0008);
-        rtl8168_mdio_write(tp, 0x15, 0x0359);
-        rtl8168_mdio_write(tp, 0x19, 0x91f6);
-        rtl8168_mdio_write(tp, 0x15, 0x035a);
-        rtl8168_mdio_write(tp, 0x19, 0x3360);
-        rtl8168_mdio_write(tp, 0x15, 0x035b);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x035c);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x035d);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x035e);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x035f);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0360);
-        rtl8168_mdio_write(tp, 0x19, 0x4bb6);
-        rtl8168_mdio_write(tp, 0x15, 0x0361);
-        rtl8168_mdio_write(tp, 0x19, 0x4064);
-        rtl8168_mdio_write(tp, 0x15, 0x0362);
-        rtl8168_mdio_write(tp, 0x19, 0x4b26);
-        rtl8168_mdio_write(tp, 0x15, 0x0363);
-        rtl8168_mdio_write(tp, 0x19, 0x4410);
-        rtl8168_mdio_write(tp, 0x15, 0x0364);
-        rtl8168_mdio_write(tp, 0x19, 0x4006);
-        rtl8168_mdio_write(tp, 0x15, 0x0365);
-        rtl8168_mdio_write(tp, 0x19, 0x4490);
-        rtl8168_mdio_write(tp, 0x15, 0x0366);
-        rtl8168_mdio_write(tp, 0x19, 0x6900);
-        rtl8168_mdio_write(tp, 0x15, 0x0367);
-        rtl8168_mdio_write(tp, 0x19, 0xb6a6);
-        rtl8168_mdio_write(tp, 0x15, 0x0368);
-        rtl8168_mdio_write(tp, 0x19, 0x9e02);
-        rtl8168_mdio_write(tp, 0x15, 0x0369);
-        rtl8168_mdio_write(tp, 0x19, 0x3311);
-        rtl8168_mdio_write(tp, 0x15, 0x036a);
-        rtl8168_mdio_write(tp, 0x19, 0xd11d);
-        rtl8168_mdio_write(tp, 0x15, 0x036b);
-        rtl8168_mdio_write(tp, 0x19, 0x000a);
-        rtl8168_mdio_write(tp, 0x15, 0x036c);
-        rtl8168_mdio_write(tp, 0x19, 0xbb0f);
-        rtl8168_mdio_write(tp, 0x15, 0x036d);
-        rtl8168_mdio_write(tp, 0x19, 0x8102);
-        rtl8168_mdio_write(tp, 0x15, 0x036e);
-        rtl8168_mdio_write(tp, 0x19, 0x3371);
-        rtl8168_mdio_write(tp, 0x15, 0x036f);
-        rtl8168_mdio_write(tp, 0x19, 0xa21e);
-        rtl8168_mdio_write(tp, 0x15, 0x0370);
-        rtl8168_mdio_write(tp, 0x19, 0x33b6);
-        rtl8168_mdio_write(tp, 0x15, 0x0371);
-        rtl8168_mdio_write(tp, 0x19, 0x91f6);
-        rtl8168_mdio_write(tp, 0x15, 0x0372);
-        rtl8168_mdio_write(tp, 0x19, 0xc218);
-        rtl8168_mdio_write(tp, 0x15, 0x0373);
-        rtl8168_mdio_write(tp, 0x19, 0x00f4);
-        rtl8168_mdio_write(tp, 0x15, 0x0374);
-        rtl8168_mdio_write(tp, 0x19, 0x33b6);
-        rtl8168_mdio_write(tp, 0x15, 0x0375);
-        rtl8168_mdio_write(tp, 0x19, 0x32ec);
-        rtl8168_mdio_write(tp, 0x15, 0x0376);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0377);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0378);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x0379);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x037a);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x037b);
-        rtl8168_mdio_write(tp, 0x19, 0x4b97);
-        rtl8168_mdio_write(tp, 0x15, 0x037c);
-        rtl8168_mdio_write(tp, 0x19, 0x402b);
-        rtl8168_mdio_write(tp, 0x15, 0x037d);
-        rtl8168_mdio_write(tp, 0x19, 0x4b07);
-        rtl8168_mdio_write(tp, 0x15, 0x037e);
-        rtl8168_mdio_write(tp, 0x19, 0x4422);
-        rtl8168_mdio_write(tp, 0x15, 0x037f);
-        rtl8168_mdio_write(tp, 0x19, 0x6980);
-        rtl8168_mdio_write(tp, 0x15, 0x0380);
-        rtl8168_mdio_write(tp, 0x19, 0xb608);
-        rtl8168_mdio_write(tp, 0x15, 0x0381);
-        rtl8168_mdio_write(tp, 0x19, 0x3311);
-        rtl8168_mdio_write(tp, 0x15, 0x0382);
-        rtl8168_mdio_write(tp, 0x19, 0xbc05);
-        rtl8168_mdio_write(tp, 0x15, 0x0383);
-        rtl8168_mdio_write(tp, 0x19, 0xc21c);
-        rtl8168_mdio_write(tp, 0x15, 0x0384);
-        rtl8168_mdio_write(tp, 0x19, 0x0032);
-        rtl8168_mdio_write(tp, 0x15, 0x0385);
-        rtl8168_mdio_write(tp, 0x19, 0xa1fb);
-        rtl8168_mdio_write(tp, 0x15, 0x0386);
-        rtl8168_mdio_write(tp, 0x19, 0x338d);
-        rtl8168_mdio_write(tp, 0x15, 0x0387);
-        rtl8168_mdio_write(tp, 0x19, 0x32ae);
-        rtl8168_mdio_write(tp, 0x15, 0x0388);
-        rtl8168_mdio_write(tp, 0x19, 0x330d);
-        rtl8168_mdio_write(tp, 0x15, 0x0389);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x038a);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x038b);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x038c);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x038d);
-        rtl8168_mdio_write(tp, 0x19, 0x4b97);
-        rtl8168_mdio_write(tp, 0x15, 0x038e);
-        rtl8168_mdio_write(tp, 0x19, 0x6a08);
-        rtl8168_mdio_write(tp, 0x15, 0x038f);
-        rtl8168_mdio_write(tp, 0x19, 0x4b07);
-        rtl8168_mdio_write(tp, 0x15, 0x0390);
-        rtl8168_mdio_write(tp, 0x19, 0x40ac);
-        rtl8168_mdio_write(tp, 0x15, 0x0391);
-        rtl8168_mdio_write(tp, 0x19, 0x4445);
-        rtl8168_mdio_write(tp, 0x15, 0x0392);
-        rtl8168_mdio_write(tp, 0x19, 0x404e);
-        rtl8168_mdio_write(tp, 0x15, 0x0393);
-        rtl8168_mdio_write(tp, 0x19, 0x4461);
-        rtl8168_mdio_write(tp, 0x15, 0x0394);
-        rtl8168_mdio_write(tp, 0x19, 0x3311);
-        rtl8168_mdio_write(tp, 0x15, 0x0395);
-        rtl8168_mdio_write(tp, 0x19, 0x9c0a);
-        rtl8168_mdio_write(tp, 0x15, 0x0396);
-        rtl8168_mdio_write(tp, 0x19, 0x63da);
-        rtl8168_mdio_write(tp, 0x15, 0x0397);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0c);
-        rtl8168_mdio_write(tp, 0x15, 0x0398);
-        rtl8168_mdio_write(tp, 0x19, 0x5440);
-        rtl8168_mdio_write(tp, 0x15, 0x0399);
-        rtl8168_mdio_write(tp, 0x19, 0x4b98);
-        rtl8168_mdio_write(tp, 0x15, 0x039a);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x039b);
-        rtl8168_mdio_write(tp, 0x19, 0x4c00);
-        rtl8168_mdio_write(tp, 0x15, 0x039c);
-        rtl8168_mdio_write(tp, 0x19, 0x4b08);
-        rtl8168_mdio_write(tp, 0x15, 0x039d);
-        rtl8168_mdio_write(tp, 0x19, 0x63d8);
-        rtl8168_mdio_write(tp, 0x15, 0x039e);
-        rtl8168_mdio_write(tp, 0x19, 0x33a5);
-        rtl8168_mdio_write(tp, 0x15, 0x039f);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x03a0);
-        rtl8168_mdio_write(tp, 0x19, 0x00e8);
-        rtl8168_mdio_write(tp, 0x15, 0x03a1);
-        rtl8168_mdio_write(tp, 0x19, 0x820e);
-        rtl8168_mdio_write(tp, 0x15, 0x03a2);
-        rtl8168_mdio_write(tp, 0x19, 0xa10d);
-        rtl8168_mdio_write(tp, 0x15, 0x03a3);
-        rtl8168_mdio_write(tp, 0x19, 0x9df1);
-        rtl8168_mdio_write(tp, 0x15, 0x03a4);
-        rtl8168_mdio_write(tp, 0x19, 0x33af);
-        rtl8168_mdio_write(tp, 0x15, 0x03a5);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x03a6);
-        rtl8168_mdio_write(tp, 0x19, 0x00f9);
-        rtl8168_mdio_write(tp, 0x15, 0x03a7);
-        rtl8168_mdio_write(tp, 0x19, 0xc017);
-        rtl8168_mdio_write(tp, 0x15, 0x03a8);
-        rtl8168_mdio_write(tp, 0x19, 0x0007);
-        rtl8168_mdio_write(tp, 0x15, 0x03a9);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x03aa);
-        rtl8168_mdio_write(tp, 0x19, 0x6c03);
-        rtl8168_mdio_write(tp, 0x15, 0x03ab);
-        rtl8168_mdio_write(tp, 0x19, 0xa104);
-        rtl8168_mdio_write(tp, 0x15, 0x03ac);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x03ad);
-        rtl8168_mdio_write(tp, 0x19, 0x6c00);
-        rtl8168_mdio_write(tp, 0x15, 0x03ae);
-        rtl8168_mdio_write(tp, 0x19, 0x9df7);
-        rtl8168_mdio_write(tp, 0x15, 0x03af);
-        rtl8168_mdio_write(tp, 0x19, 0x7c03);
-        rtl8168_mdio_write(tp, 0x15, 0x03b0);
-        rtl8168_mdio_write(tp, 0x19, 0x6c08);
-        rtl8168_mdio_write(tp, 0x15, 0x03b1);
-        rtl8168_mdio_write(tp, 0x19, 0x33b6);
-        rtl8168_mdio_write(tp, 0x15, 0x03b2);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03b3);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03b4);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03b5);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03b6);
-        rtl8168_mdio_write(tp, 0x19, 0x55af);
-        rtl8168_mdio_write(tp, 0x15, 0x03b7);
-        rtl8168_mdio_write(tp, 0x19, 0x7ff0);
-        rtl8168_mdio_write(tp, 0x15, 0x03b8);
-        rtl8168_mdio_write(tp, 0x19, 0x6ff0);
-        rtl8168_mdio_write(tp, 0x15, 0x03b9);
-        rtl8168_mdio_write(tp, 0x19, 0x4bb9);
-        rtl8168_mdio_write(tp, 0x15, 0x03ba);
-        rtl8168_mdio_write(tp, 0x19, 0x6a80);
-        rtl8168_mdio_write(tp, 0x15, 0x03bb);
-        rtl8168_mdio_write(tp, 0x19, 0x4b29);
-        rtl8168_mdio_write(tp, 0x15, 0x03bc);
-        rtl8168_mdio_write(tp, 0x19, 0x4041);
-        rtl8168_mdio_write(tp, 0x15, 0x03bd);
-        rtl8168_mdio_write(tp, 0x19, 0x440a);
-        rtl8168_mdio_write(tp, 0x15, 0x03be);
-        rtl8168_mdio_write(tp, 0x19, 0x4029);
-        rtl8168_mdio_write(tp, 0x15, 0x03bf);
-        rtl8168_mdio_write(tp, 0x19, 0x4418);
-        rtl8168_mdio_write(tp, 0x15, 0x03c0);
-        rtl8168_mdio_write(tp, 0x19, 0x4090);
-        rtl8168_mdio_write(tp, 0x15, 0x03c1);
-        rtl8168_mdio_write(tp, 0x19, 0x4438);
-        rtl8168_mdio_write(tp, 0x15, 0x03c2);
-        rtl8168_mdio_write(tp, 0x19, 0x40c4);
-        rtl8168_mdio_write(tp, 0x15, 0x03c3);
-        rtl8168_mdio_write(tp, 0x19, 0x447b);
-        rtl8168_mdio_write(tp, 0x15, 0x03c4);
-        rtl8168_mdio_write(tp, 0x19, 0xb6c4);
-        rtl8168_mdio_write(tp, 0x15, 0x03c5);
-        rtl8168_mdio_write(tp, 0x19, 0x3311);
-        rtl8168_mdio_write(tp, 0x15, 0x03c6);
-        rtl8168_mdio_write(tp, 0x19, 0x9bfe);
-        rtl8168_mdio_write(tp, 0x15, 0x03c7);
-        rtl8168_mdio_write(tp, 0x19, 0x33cc);
-        rtl8168_mdio_write(tp, 0x15, 0x03c8);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03c9);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03ca);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03cb);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03cc);
-        rtl8168_mdio_write(tp, 0x19, 0x542f);
-        rtl8168_mdio_write(tp, 0x15, 0x03cd);
-        rtl8168_mdio_write(tp, 0x19, 0x499a);
-        rtl8168_mdio_write(tp, 0x15, 0x03ce);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x03cf);
-        rtl8168_mdio_write(tp, 0x19, 0x4c40);
-        rtl8168_mdio_write(tp, 0x15, 0x03d0);
-        rtl8168_mdio_write(tp, 0x19, 0x490a);
-        rtl8168_mdio_write(tp, 0x15, 0x03d1);
-        rtl8168_mdio_write(tp, 0x19, 0x405e);
-        rtl8168_mdio_write(tp, 0x15, 0x03d2);
-        rtl8168_mdio_write(tp, 0x19, 0x44f8);
-        rtl8168_mdio_write(tp, 0x15, 0x03d3);
-        rtl8168_mdio_write(tp, 0x19, 0x6b00);
-        rtl8168_mdio_write(tp, 0x15, 0x03d4);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x03d5);
-        rtl8168_mdio_write(tp, 0x19, 0x0028);
-        rtl8168_mdio_write(tp, 0x15, 0x03d6);
-        rtl8168_mdio_write(tp, 0x19, 0x3311);
-        rtl8168_mdio_write(tp, 0x15, 0x03d7);
-        rtl8168_mdio_write(tp, 0x19, 0xbd27);
-        rtl8168_mdio_write(tp, 0x15, 0x03d8);
-        rtl8168_mdio_write(tp, 0x19, 0x9cfc);
-        rtl8168_mdio_write(tp, 0x15, 0x03d9);
-        rtl8168_mdio_write(tp, 0x19, 0xc639);
-        rtl8168_mdio_write(tp, 0x15, 0x03da);
-        rtl8168_mdio_write(tp, 0x19, 0x000f);
-        rtl8168_mdio_write(tp, 0x15, 0x03db);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x03dc);
-        rtl8168_mdio_write(tp, 0x19, 0x7c01);
-        rtl8168_mdio_write(tp, 0x15, 0x03dd);
-        rtl8168_mdio_write(tp, 0x19, 0x4c01);
-        rtl8168_mdio_write(tp, 0x15, 0x03de);
-        rtl8168_mdio_write(tp, 0x19, 0x9af6);
-        rtl8168_mdio_write(tp, 0x15, 0x03df);
-        rtl8168_mdio_write(tp, 0x19, 0x7c12);
-        rtl8168_mdio_write(tp, 0x15, 0x03e0);
-        rtl8168_mdio_write(tp, 0x19, 0x4c52);
-        rtl8168_mdio_write(tp, 0x15, 0x03e1);
-        rtl8168_mdio_write(tp, 0x19, 0x4470);
-        rtl8168_mdio_write(tp, 0x15, 0x03e2);
-        rtl8168_mdio_write(tp, 0x19, 0x7c12);
-        rtl8168_mdio_write(tp, 0x15, 0x03e3);
-        rtl8168_mdio_write(tp, 0x19, 0x4c40);
-        rtl8168_mdio_write(tp, 0x15, 0x03e4);
-        rtl8168_mdio_write(tp, 0x19, 0x33d4);
-        rtl8168_mdio_write(tp, 0x15, 0x03e5);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03e6);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03e7);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03e8);
-        rtl8168_mdio_write(tp, 0x19, 0x0000);
-        rtl8168_mdio_write(tp, 0x15, 0x03e9);
-        rtl8168_mdio_write(tp, 0x19, 0x49bb);
-        rtl8168_mdio_write(tp, 0x15, 0x03ea);
-        rtl8168_mdio_write(tp, 0x19, 0x4478);
-        rtl8168_mdio_write(tp, 0x15, 0x03eb);
-        rtl8168_mdio_write(tp, 0x19, 0x492b);
-        rtl8168_mdio_write(tp, 0x15, 0x03ec);
-        rtl8168_mdio_write(tp, 0x19, 0x6b80);
-        rtl8168_mdio_write(tp, 0x15, 0x03ed);
-        rtl8168_mdio_write(tp, 0x19, 0x7c01);
-        rtl8168_mdio_write(tp, 0x15, 0x03ee);
-        rtl8168_mdio_write(tp, 0x19, 0x4c00);
-        rtl8168_mdio_write(tp, 0x15, 0x03ef);
-        rtl8168_mdio_write(tp, 0x19, 0xd64f);
-        rtl8168_mdio_write(tp, 0x15, 0x03f0);
-        rtl8168_mdio_write(tp, 0x19, 0x000d);
-        rtl8168_mdio_write(tp, 0x15, 0x03f1);
-        rtl8168_mdio_write(tp, 0x19, 0x3311);
-        rtl8168_mdio_write(tp, 0x15, 0x03f2);
-        rtl8168_mdio_write(tp, 0x19, 0xbd0c);
-        rtl8168_mdio_write(tp, 0x15, 0x03f3);
-        rtl8168_mdio_write(tp, 0x19, 0xc428);
-        rtl8168_mdio_write(tp, 0x15, 0x03f4);
-        rtl8168_mdio_write(tp, 0x19, 0x0008);
-        rtl8168_mdio_write(tp, 0x15, 0x03f5);
-        rtl8168_mdio_write(tp, 0x19, 0x9afa);
-        rtl8168_mdio_write(tp, 0x15, 0x03f6);
-        rtl8168_mdio_write(tp, 0x19, 0x7c12);
-        rtl8168_mdio_write(tp, 0x15, 0x03f7);
-        rtl8168_mdio_write(tp, 0x19, 0x4c52);
-        rtl8168_mdio_write(tp, 0x15, 0x03f8);
-        rtl8168_mdio_write(tp, 0x19, 0x4470);
-        rtl8168_mdio_write(tp, 0x15, 0x03f9);
-        rtl8168_mdio_write(tp, 0x19, 0x7c12);
-        rtl8168_mdio_write(tp, 0x15, 0x03fa);
-        rtl8168_mdio_write(tp, 0x19, 0x4c40);
-        rtl8168_mdio_write(tp, 0x15, 0x03fb);
-        rtl8168_mdio_write(tp, 0x19, 0x33ef);
-        rtl8168_mdio_write(tp, 0x15, 0x03fc);
-        rtl8168_mdio_write(tp, 0x19, 0x3342);
-        rtl8168_mdio_write(tp, 0x15, 0x03fd);
-        rtl8168_mdio_write(tp, 0x19, 0x330d);
-        rtl8168_mdio_write(tp, 0x15, 0x03fe);
-        rtl8168_mdio_write(tp, 0x19, 0x32ae);
-        rtl8168_mdio_write(tp, 0x15, 0x0000);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0300);
-        rtl8168_mdio_write(tp, 0x1f, 0x0002);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x05, 0x8000);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0x48f7);
-        rtl8168_mdio_write(tp, 0x06, 0x00e0);
-        rtl8168_mdio_write(tp, 0x06, 0xfff7);
-        rtl8168_mdio_write(tp, 0x06, 0xa080);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0xf602);
-        rtl8168_mdio_write(tp, 0x06, 0x0112);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x1f02);
-        rtl8168_mdio_write(tp, 0x06, 0x012c);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x3c02);
-        rtl8168_mdio_write(tp, 0x06, 0x0156);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x6d02);
-        rtl8168_mdio_write(tp, 0x06, 0x809d);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x88e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b89);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8a1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8b);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8c1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01a0);
-        rtl8168_mdio_write(tp, 0x06, 0x00c7);
-        rtl8168_mdio_write(tp, 0x06, 0xaebb);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xc702);
-        rtl8168_mdio_write(tp, 0x06, 0x320a);
-        rtl8168_mdio_write(tp, 0x06, 0xd105);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xcd02);
-        rtl8168_mdio_write(tp, 0x06, 0x320a);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xca02);
-        rtl8168_mdio_write(tp, 0x06, 0x320a);
-        rtl8168_mdio_write(tp, 0x06, 0xd105);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xd002);
-        rtl8168_mdio_write(tp, 0x06, 0x320a);
-        rtl8168_mdio_write(tp, 0x06, 0xd481);
-        rtl8168_mdio_write(tp, 0x06, 0xc9e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b90);
-        rtl8168_mdio_write(tp, 0x06, 0xe58b);
-        rtl8168_mdio_write(tp, 0x06, 0x91d4);
-        rtl8168_mdio_write(tp, 0x06, 0x81b8);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x92e5);
-        rtl8168_mdio_write(tp, 0x06, 0x8b93);
-        rtl8168_mdio_write(tp, 0x06, 0xbf8b);
-        rtl8168_mdio_write(tp, 0x06, 0x88ec);
-        rtl8168_mdio_write(tp, 0x06, 0x0019);
-        rtl8168_mdio_write(tp, 0x06, 0xa98b);
-        rtl8168_mdio_write(tp, 0x06, 0x90f9);
-        rtl8168_mdio_write(tp, 0x06, 0xeeff);
-        rtl8168_mdio_write(tp, 0x06, 0xf600);
-        rtl8168_mdio_write(tp, 0x06, 0xeeff);
-        rtl8168_mdio_write(tp, 0x06, 0xf7fc);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xc102);
-        rtl8168_mdio_write(tp, 0x06, 0x320a);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xc402);
-        rtl8168_mdio_write(tp, 0x06, 0x320a);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x201a);
-        rtl8168_mdio_write(tp, 0x06, 0xf620);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x824b);
-        rtl8168_mdio_write(tp, 0x06, 0x0281);
-        rtl8168_mdio_write(tp, 0x06, 0x1902);
-        rtl8168_mdio_write(tp, 0x06, 0x2c9d);
-        rtl8168_mdio_write(tp, 0x06, 0x0203);
-        rtl8168_mdio_write(tp, 0x06, 0x9602);
-        rtl8168_mdio_write(tp, 0x06, 0x0473);
-        rtl8168_mdio_write(tp, 0x06, 0x022e);
-        rtl8168_mdio_write(tp, 0x06, 0x3902);
-        rtl8168_mdio_write(tp, 0x06, 0x044d);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x210b);
-        rtl8168_mdio_write(tp, 0x06, 0xf621);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x0416);
-        rtl8168_mdio_write(tp, 0x06, 0x021b);
-        rtl8168_mdio_write(tp, 0x06, 0xa4e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad22);
-        rtl8168_mdio_write(tp, 0x06, 0x05f6);
-        rtl8168_mdio_write(tp, 0x06, 0x22e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2305);
-        rtl8168_mdio_write(tp, 0x06, 0xf623);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ee0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad24);
-        rtl8168_mdio_write(tp, 0x06, 0x05f6);
-        rtl8168_mdio_write(tp, 0x06, 0x24e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2505);
-        rtl8168_mdio_write(tp, 0x06, 0xf625);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ee0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad26);
-        rtl8168_mdio_write(tp, 0x06, 0x08f6);
-        rtl8168_mdio_write(tp, 0x06, 0x26e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x0281);
-        rtl8168_mdio_write(tp, 0x06, 0xdae0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x05f6);
-        rtl8168_mdio_write(tp, 0x06, 0x27e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x0203);
-        rtl8168_mdio_write(tp, 0x06, 0x5cfc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad21);
-        rtl8168_mdio_write(tp, 0x06, 0x57e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe022);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0x2358);
-        rtl8168_mdio_write(tp, 0x06, 0xc059);
-        rtl8168_mdio_write(tp, 0x06, 0x021e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b3c);
-        rtl8168_mdio_write(tp, 0x06, 0x1f10);
-        rtl8168_mdio_write(tp, 0x06, 0x9e44);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x3cad);
-        rtl8168_mdio_write(tp, 0x06, 0x211d);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x84f7);
-        rtl8168_mdio_write(tp, 0x06, 0x29e5);
-        rtl8168_mdio_write(tp, 0x06, 0x8b84);
-        rtl8168_mdio_write(tp, 0x06, 0xac27);
-        rtl8168_mdio_write(tp, 0x06, 0x0dac);
-        rtl8168_mdio_write(tp, 0x06, 0x2605);
-        rtl8168_mdio_write(tp, 0x06, 0x0281);
-        rtl8168_mdio_write(tp, 0x06, 0x7fae);
-        rtl8168_mdio_write(tp, 0x06, 0x2b02);
-        rtl8168_mdio_write(tp, 0x06, 0x2c23);
-        rtl8168_mdio_write(tp, 0x06, 0xae26);
-        rtl8168_mdio_write(tp, 0x06, 0x022c);
-        rtl8168_mdio_write(tp, 0x06, 0x41ae);
-        rtl8168_mdio_write(tp, 0x06, 0x21e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b87);
-        rtl8168_mdio_write(tp, 0x06, 0xad22);
-        rtl8168_mdio_write(tp, 0x06, 0x18e0);
-        rtl8168_mdio_write(tp, 0x06, 0xfff7);
-        rtl8168_mdio_write(tp, 0x06, 0x58fc);
-        rtl8168_mdio_write(tp, 0x06, 0xe4ff);
-        rtl8168_mdio_write(tp, 0x06, 0xf7d1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x2eee);
-        rtl8168_mdio_write(tp, 0x06, 0x0232);
-        rtl8168_mdio_write(tp, 0x06, 0x0ad1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x82e8);
-        rtl8168_mdio_write(tp, 0x06, 0x0232);
-        rtl8168_mdio_write(tp, 0x06, 0x0a02);
-        rtl8168_mdio_write(tp, 0x06, 0x2bdf);
-        rtl8168_mdio_write(tp, 0x06, 0xef96);
-        rtl8168_mdio_write(tp, 0x06, 0xfefc);
-        rtl8168_mdio_write(tp, 0x06, 0x04d0);
-        rtl8168_mdio_write(tp, 0x06, 0x0202);
-        rtl8168_mdio_write(tp, 0x06, 0x1e97);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x87ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2228);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xd302);
-        rtl8168_mdio_write(tp, 0x06, 0x320a);
-        rtl8168_mdio_write(tp, 0x06, 0xd10c);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xd602);
-        rtl8168_mdio_write(tp, 0x06, 0x320a);
-        rtl8168_mdio_write(tp, 0x06, 0xd104);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xd902);
-        rtl8168_mdio_write(tp, 0x06, 0x320a);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xe802);
-        rtl8168_mdio_write(tp, 0x06, 0x320a);
-        rtl8168_mdio_write(tp, 0x06, 0xe0ff);
-        rtl8168_mdio_write(tp, 0x06, 0xf768);
-        rtl8168_mdio_write(tp, 0x06, 0x03e4);
-        rtl8168_mdio_write(tp, 0x06, 0xfff7);
-        rtl8168_mdio_write(tp, 0x06, 0xd004);
-        rtl8168_mdio_write(tp, 0x06, 0x0228);
-        rtl8168_mdio_write(tp, 0x06, 0x7a04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe234);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e2);
-        rtl8168_mdio_write(tp, 0x06, 0x35f6);
-        rtl8168_mdio_write(tp, 0x06, 0x2be4);
-        rtl8168_mdio_write(tp, 0x06, 0xe234);
-        rtl8168_mdio_write(tp, 0x06, 0xe5e2);
-        rtl8168_mdio_write(tp, 0x06, 0x35fc);
-        rtl8168_mdio_write(tp, 0x06, 0x05f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e2);
-        rtl8168_mdio_write(tp, 0x06, 0x34e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe235);
-        rtl8168_mdio_write(tp, 0x06, 0xf72b);
-        rtl8168_mdio_write(tp, 0x06, 0xe4e2);
-        rtl8168_mdio_write(tp, 0x06, 0x34e5);
-        rtl8168_mdio_write(tp, 0x06, 0xe235);
-        rtl8168_mdio_write(tp, 0x06, 0xfc05);
-        rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69ac);
-        rtl8168_mdio_write(tp, 0x06, 0x1b4c);
-        rtl8168_mdio_write(tp, 0x06, 0xbf2e);
-        rtl8168_mdio_write(tp, 0x06, 0x3002);
-        rtl8168_mdio_write(tp, 0x06, 0x31dd);
-        rtl8168_mdio_write(tp, 0x06, 0xef01);
-        rtl8168_mdio_write(tp, 0x06, 0xe28a);
-        rtl8168_mdio_write(tp, 0x06, 0x76e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8a76);
-        rtl8168_mdio_write(tp, 0x06, 0x1f12);
-        rtl8168_mdio_write(tp, 0x06, 0x9e3a);
-        rtl8168_mdio_write(tp, 0x06, 0xef12);
-        rtl8168_mdio_write(tp, 0x06, 0x5907);
-        rtl8168_mdio_write(tp, 0x06, 0x9f12);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b40);
-        rtl8168_mdio_write(tp, 0x06, 0xf721);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x40d0);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0x287a);
-        rtl8168_mdio_write(tp, 0x06, 0x0282);
-        rtl8168_mdio_write(tp, 0x06, 0x34fc);
-        rtl8168_mdio_write(tp, 0x06, 0xa000);
-        rtl8168_mdio_write(tp, 0x06, 0x1002);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc3);
-        rtl8168_mdio_write(tp, 0x06, 0x022e);
-        rtl8168_mdio_write(tp, 0x06, 0x21e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b40);
-        rtl8168_mdio_write(tp, 0x06, 0xf621);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x40ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0fbf);
-        rtl8168_mdio_write(tp, 0x06, 0x3fa5);
-        rtl8168_mdio_write(tp, 0x06, 0x0231);
-        rtl8168_mdio_write(tp, 0x06, 0x6cbf);
-        rtl8168_mdio_write(tp, 0x06, 0x3fa2);
-        rtl8168_mdio_write(tp, 0x06, 0x0231);
-        rtl8168_mdio_write(tp, 0x06, 0x6c02);
-        rtl8168_mdio_write(tp, 0x06, 0x2dc3);
-        rtl8168_mdio_write(tp, 0x06, 0xef96);
-        rtl8168_mdio_write(tp, 0x06, 0xfefd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe2f4);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e2);
-        rtl8168_mdio_write(tp, 0x06, 0xf5e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8a78);
-        rtl8168_mdio_write(tp, 0x06, 0xe58a);
-        rtl8168_mdio_write(tp, 0x06, 0x79ee);
-        rtl8168_mdio_write(tp, 0x06, 0xe2f4);
-        rtl8168_mdio_write(tp, 0x06, 0xd8ee);
-        rtl8168_mdio_write(tp, 0x06, 0xe2f5);
-        rtl8168_mdio_write(tp, 0x06, 0x20fc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x87ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2065);
-        rtl8168_mdio_write(tp, 0x06, 0xd200);
-        rtl8168_mdio_write(tp, 0x06, 0xbf2e);
-        rtl8168_mdio_write(tp, 0x06, 0xe802);
-        rtl8168_mdio_write(tp, 0x06, 0x31dd);
-        rtl8168_mdio_write(tp, 0x06, 0x1e21);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xdf02);
-        rtl8168_mdio_write(tp, 0x06, 0x31dd);
-        rtl8168_mdio_write(tp, 0x06, 0x0c11);
-        rtl8168_mdio_write(tp, 0x06, 0x1e21);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xe202);
-        rtl8168_mdio_write(tp, 0x06, 0x31dd);
-        rtl8168_mdio_write(tp, 0x06, 0x0c12);
-        rtl8168_mdio_write(tp, 0x06, 0x1e21);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xe502);
-        rtl8168_mdio_write(tp, 0x06, 0x31dd);
-        rtl8168_mdio_write(tp, 0x06, 0x0c13);
-        rtl8168_mdio_write(tp, 0x06, 0x1e21);
-        rtl8168_mdio_write(tp, 0x06, 0xbf1f);
-        rtl8168_mdio_write(tp, 0x06, 0x5302);
-        rtl8168_mdio_write(tp, 0x06, 0x31dd);
-        rtl8168_mdio_write(tp, 0x06, 0x0c14);
-        rtl8168_mdio_write(tp, 0x06, 0x1e21);
-        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-        rtl8168_mdio_write(tp, 0x06, 0xeb02);
-        rtl8168_mdio_write(tp, 0x06, 0x31dd);
-        rtl8168_mdio_write(tp, 0x06, 0x0c16);
-        rtl8168_mdio_write(tp, 0x06, 0x1e21);
-        rtl8168_mdio_write(tp, 0x06, 0xe083);
-        rtl8168_mdio_write(tp, 0x06, 0xe01f);
-        rtl8168_mdio_write(tp, 0x06, 0x029e);
-        rtl8168_mdio_write(tp, 0x06, 0x22e6);
-        rtl8168_mdio_write(tp, 0x06, 0x83e0);
-        rtl8168_mdio_write(tp, 0x06, 0xad31);
-        rtl8168_mdio_write(tp, 0x06, 0x14ad);
-        rtl8168_mdio_write(tp, 0x06, 0x3011);
-        rtl8168_mdio_write(tp, 0x06, 0xef02);
-        rtl8168_mdio_write(tp, 0x06, 0x580c);
-        rtl8168_mdio_write(tp, 0x06, 0x9e07);
-        rtl8168_mdio_write(tp, 0x06, 0xad36);
-        rtl8168_mdio_write(tp, 0x06, 0x085a);
-        rtl8168_mdio_write(tp, 0x06, 0x309f);
-        rtl8168_mdio_write(tp, 0x06, 0x04d1);
-        rtl8168_mdio_write(tp, 0x06, 0x01ae);
-        rtl8168_mdio_write(tp, 0x06, 0x02d1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x82dc);
-        rtl8168_mdio_write(tp, 0x06, 0x0232);
-        rtl8168_mdio_write(tp, 0x06, 0x0aef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x06, 0x0400);
-        rtl8168_mdio_write(tp, 0x06, 0xe140);
-        rtl8168_mdio_write(tp, 0x06, 0x77e1);
-        rtl8168_mdio_write(tp, 0x06, 0x4010);
-        rtl8168_mdio_write(tp, 0x06, 0xe150);
-        rtl8168_mdio_write(tp, 0x06, 0x32e1);
-        rtl8168_mdio_write(tp, 0x06, 0x5030);
-        rtl8168_mdio_write(tp, 0x06, 0xe144);
-        rtl8168_mdio_write(tp, 0x06, 0x74e1);
-        rtl8168_mdio_write(tp, 0x06, 0x44bb);
-        rtl8168_mdio_write(tp, 0x06, 0xe2d2);
-        rtl8168_mdio_write(tp, 0x06, 0x40e0);
-        rtl8168_mdio_write(tp, 0x06, 0x2cfc);
-        rtl8168_mdio_write(tp, 0x06, 0xe2cc);
-        rtl8168_mdio_write(tp, 0x06, 0xcce2);
-        rtl8168_mdio_write(tp, 0x06, 0x00cc);
-        rtl8168_mdio_write(tp, 0x06, 0xe000);
-        rtl8168_mdio_write(tp, 0x06, 0x99e0);
-        rtl8168_mdio_write(tp, 0x06, 0x3688);
-        rtl8168_mdio_write(tp, 0x06, 0xe036);
-        rtl8168_mdio_write(tp, 0x06, 0x99e1);
-        rtl8168_mdio_write(tp, 0x06, 0x40dd);
-        rtl8168_mdio_write(tp, 0x06, 0xe022);
-        rtl8168_mdio_write(tp, 0x05, 0xe142);
-        gphy_val = rtl8168_mdio_read(tp, 0x06);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp, 0x06, gphy_val);
-        rtl8168_mdio_write(tp, 0x05, 0xe140);
-        gphy_val = rtl8168_mdio_read(tp, 0x06);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp, 0x06, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x00);
-                if (gphy_val & BIT_7)
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0004);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val &= ~(BIT_0);
-        gphy_val |= BIT_2;
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0002);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-}
-
-static void
-rtl8168_set_phy_mcu_8168evl_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct pci_dev *pdev = tp->pci_dev;
-        unsigned int gphy_val,i;
-
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x00, 0x1800);
-        gphy_val = rtl8168_mdio_read(tp, 0x15);
-        gphy_val &= ~(BIT_12);
-        rtl8168_mdio_write(tp, 0x15, gphy_val);
-        rtl8168_mdio_write(tp, 0x00, 0x4800);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x002f);
-        for (i = 0; i < 1000; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x1c);
-                if ((gphy_val & 0x0080) == 0x0080)
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x00, 0x1800);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x17);
-                if (!(gphy_val & 0x0001))
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0307);
-        rtl8168_mdio_write(tp, 0x15, 0x00AF);
-        rtl8168_mdio_write(tp, 0x19, 0x4060);
-        rtl8168_mdio_write(tp, 0x15, 0x00B0);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x00B1);
-        rtl8168_mdio_write(tp, 0x19, 0x7e00);
-        rtl8168_mdio_write(tp, 0x15, 0x00B2);
-        rtl8168_mdio_write(tp, 0x19, 0x72B0);
-        rtl8168_mdio_write(tp, 0x15, 0x00B3);
-        rtl8168_mdio_write(tp, 0x19, 0x7F00);
-        rtl8168_mdio_write(tp, 0x15, 0x00B4);
-        rtl8168_mdio_write(tp, 0x19, 0x73B0);
-        rtl8168_mdio_write(tp, 0x15, 0x0101);
-        rtl8168_mdio_write(tp, 0x19, 0x0005);
-        rtl8168_mdio_write(tp, 0x15, 0x0103);
-        rtl8168_mdio_write(tp, 0x19, 0x0003);
-        rtl8168_mdio_write(tp, 0x15, 0x0105);
-        rtl8168_mdio_write(tp, 0x19, 0x30FD);
-        rtl8168_mdio_write(tp, 0x15, 0x0106);
-        rtl8168_mdio_write(tp, 0x19, 0x9DF7);
-        rtl8168_mdio_write(tp, 0x15, 0x0107);
-        rtl8168_mdio_write(tp, 0x19, 0x30C6);
-        rtl8168_mdio_write(tp, 0x15, 0x0098);
-        rtl8168_mdio_write(tp, 0x19, 0x7c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x0099);
-        rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00eb);
-        rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00f8);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00fe);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0f);
-        rtl8168_mdio_write(tp, 0x15, 0x00db);
-        rtl8168_mdio_write(tp, 0x19, 0x6f09);
-        rtl8168_mdio_write(tp, 0x15, 0x00dc);
-        rtl8168_mdio_write(tp, 0x19, 0xaefd);
-        rtl8168_mdio_write(tp, 0x15, 0x00dd);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00de);
-        rtl8168_mdio_write(tp, 0x19, 0xc60b);
-        rtl8168_mdio_write(tp, 0x15, 0x00df);
-        rtl8168_mdio_write(tp, 0x19, 0x00fa);
-        rtl8168_mdio_write(tp, 0x15, 0x00e0);
-        rtl8168_mdio_write(tp, 0x19, 0x30e1);
-        rtl8168_mdio_write(tp, 0x15, 0x020c);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x020e);
-        rtl8168_mdio_write(tp, 0x19, 0x9813);
-        rtl8168_mdio_write(tp, 0x15, 0x020f);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x0210);
-        rtl8168_mdio_write(tp, 0x19, 0x930f);
-        rtl8168_mdio_write(tp, 0x15, 0x0211);
-        rtl8168_mdio_write(tp, 0x19, 0x9206);
-        rtl8168_mdio_write(tp, 0x15, 0x0212);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0213);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0214);
-        rtl8168_mdio_write(tp, 0x19, 0x588f);
-        rtl8168_mdio_write(tp, 0x15, 0x0215);
-        rtl8168_mdio_write(tp, 0x19, 0x5520);
-        rtl8168_mdio_write(tp, 0x15, 0x0216);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x0217);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0218);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0219);
-        rtl8168_mdio_write(tp, 0x19, 0x588d);
-        rtl8168_mdio_write(tp, 0x15, 0x021a);
-        rtl8168_mdio_write(tp, 0x19, 0x5540);
-        rtl8168_mdio_write(tp, 0x15, 0x021b);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x021c);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x021d);
-        rtl8168_mdio_write(tp, 0x19, 0x6840);
-        rtl8168_mdio_write(tp, 0x15, 0x021e);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x021f);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0220);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x0221);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x0222);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x0223);
-        rtl8168_mdio_write(tp, 0x19, 0x6840);
-        rtl8168_mdio_write(tp, 0x15, 0x0224);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0225);
-        rtl8168_mdio_write(tp, 0x19, 0x3231);
-        rtl8168_mdio_write(tp, 0x15, 0x0000);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0300);
-        rtl8168_mdio_write(tp, 0x1f, 0x0002);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x17, 0x2160);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0040);
-        rtl8168_mdio_write(tp, 0x18, 0x0004);
-        if (pdev->subsystem_vendor == 0x144d &&
-            pdev->subsystem_device == 0xc0a6) {
-                rtl8168_mdio_write(tp, 0x18, 0x0724);
-                rtl8168_mdio_write(tp, 0x19, 0xfe00);
-                rtl8168_mdio_write(tp, 0x18, 0x0734);
-                rtl8168_mdio_write(tp, 0x19, 0xfd00);
-                rtl8168_mdio_write(tp, 0x18, 0x1824);
-                rtl8168_mdio_write(tp, 0x19, 0xfc00);
-                rtl8168_mdio_write(tp, 0x18, 0x1834);
-                rtl8168_mdio_write(tp, 0x19, 0xfd00);
-        }
-        rtl8168_mdio_write(tp, 0x18, 0x09d4);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x09e4);
-        rtl8168_mdio_write(tp, 0x19, 0x0800);
-        rtl8168_mdio_write(tp, 0x18, 0x09f4);
-        rtl8168_mdio_write(tp, 0x19, 0xff00);
-        rtl8168_mdio_write(tp, 0x18, 0x0a04);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x0a14);
-        rtl8168_mdio_write(tp, 0x19, 0x0c00);
-        rtl8168_mdio_write(tp, 0x18, 0x0a24);
-        rtl8168_mdio_write(tp, 0x19, 0xff00);
-        rtl8168_mdio_write(tp, 0x18, 0x0a74);
-        rtl8168_mdio_write(tp, 0x19, 0xf600);
-        rtl8168_mdio_write(tp, 0x18, 0x1a24);
-        rtl8168_mdio_write(tp, 0x19, 0x7d00);
-        rtl8168_mdio_write(tp, 0x18, 0x1a64);
-        rtl8168_mdio_write(tp, 0x19, 0x0500);
-        rtl8168_mdio_write(tp, 0x18, 0x1a74);
-        rtl8168_mdio_write(tp, 0x19, 0x9500);
-        rtl8168_mdio_write(tp, 0x18, 0x1a84);
-        rtl8168_mdio_write(tp, 0x19, 0x8000);
-        rtl8168_mdio_write(tp, 0x18, 0x1a94);
-        rtl8168_mdio_write(tp, 0x19, 0x7d00);
-        rtl8168_mdio_write(tp, 0x18, 0x1aa4);
-        rtl8168_mdio_write(tp, 0x19, 0x9600);
-        rtl8168_mdio_write(tp, 0x18, 0x1ac4);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x1ad4);
-        rtl8168_mdio_write(tp, 0x19, 0x0800);
-        rtl8168_mdio_write(tp, 0x18, 0x1af4);
-        rtl8168_mdio_write(tp, 0x19, 0xc400);
-        rtl8168_mdio_write(tp, 0x18, 0x1b04);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x1b14);
-        rtl8168_mdio_write(tp, 0x19, 0x0800);
-        rtl8168_mdio_write(tp, 0x18, 0x1b24);
-        rtl8168_mdio_write(tp, 0x19, 0xfd00);
-        rtl8168_mdio_write(tp, 0x18, 0x1b34);
-        rtl8168_mdio_write(tp, 0x19, 0x4000);
-        rtl8168_mdio_write(tp, 0x18, 0x1b44);
-        rtl8168_mdio_write(tp, 0x19, 0x0400);
-        rtl8168_mdio_write(tp, 0x18, 0x1b94);
-        rtl8168_mdio_write(tp, 0x19, 0xf100);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x17, 0x2100);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0040);
-        rtl8168_mdio_write(tp, 0x18, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x05, 0x8000);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0x48f7);
-        rtl8168_mdio_write(tp, 0x06, 0x00e0);
-        rtl8168_mdio_write(tp, 0x06, 0xfff7);
-        rtl8168_mdio_write(tp, 0x06, 0xa080);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0xf602);
-        rtl8168_mdio_write(tp, 0x06, 0x0115);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x2202);
-        rtl8168_mdio_write(tp, 0x06, 0x80a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x3f02);
-        rtl8168_mdio_write(tp, 0x06, 0x0159);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0xbd02);
-        rtl8168_mdio_write(tp, 0x06, 0x80da);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x88e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b89);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8a1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8b);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8c1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01a0);
-        rtl8168_mdio_write(tp, 0x06, 0x00c7);
-        rtl8168_mdio_write(tp, 0x06, 0xaebb);
-        rtl8168_mdio_write(tp, 0x06, 0xd481);
-        rtl8168_mdio_write(tp, 0x06, 0xd2e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b92);
-        rtl8168_mdio_write(tp, 0x06, 0xe58b);
-        rtl8168_mdio_write(tp, 0x06, 0x93d1);
-        rtl8168_mdio_write(tp, 0x06, 0x03bf);
-        rtl8168_mdio_write(tp, 0x06, 0x859e);
-        rtl8168_mdio_write(tp, 0x06, 0x0237);
-        rtl8168_mdio_write(tp, 0x06, 0x23d1);
-        rtl8168_mdio_write(tp, 0x06, 0x02bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85a1);
-        rtl8168_mdio_write(tp, 0x06, 0x0237);
-        rtl8168_mdio_write(tp, 0x06, 0x23ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8608);
-        rtl8168_mdio_write(tp, 0x06, 0x03ee);
-        rtl8168_mdio_write(tp, 0x06, 0x860a);
-        rtl8168_mdio_write(tp, 0x06, 0x60ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8610);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8611);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8abe);
-        rtl8168_mdio_write(tp, 0x06, 0x07ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8abf);
-        rtl8168_mdio_write(tp, 0x06, 0x73ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8a95);
-        rtl8168_mdio_write(tp, 0x06, 0x02bf);
-        rtl8168_mdio_write(tp, 0x06, 0x8b88);
-        rtl8168_mdio_write(tp, 0x06, 0xec00);
-        rtl8168_mdio_write(tp, 0x06, 0x19a9);
-        rtl8168_mdio_write(tp, 0x06, 0x8b90);
-        rtl8168_mdio_write(tp, 0x06, 0xf9ee);
-        rtl8168_mdio_write(tp, 0x06, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0xfff7);
-        rtl8168_mdio_write(tp, 0x06, 0xfed1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x8595);
-        rtl8168_mdio_write(tp, 0x06, 0x0237);
-        rtl8168_mdio_write(tp, 0x06, 0x23d1);
-        rtl8168_mdio_write(tp, 0x06, 0x01bf);
-        rtl8168_mdio_write(tp, 0x06, 0x8598);
-        rtl8168_mdio_write(tp, 0x06, 0x0237);
-        rtl8168_mdio_write(tp, 0x06, 0x2304);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8a);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x14ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8a);
-        rtl8168_mdio_write(tp, 0x06, 0x0002);
-        rtl8168_mdio_write(tp, 0x06, 0x1f9a);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e4);
-        rtl8168_mdio_write(tp, 0x06, 0x26e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe427);
-        rtl8168_mdio_write(tp, 0x06, 0xeee4);
-        rtl8168_mdio_write(tp, 0x06, 0x2623);
-        rtl8168_mdio_write(tp, 0x06, 0xe5e4);
-        rtl8168_mdio_write(tp, 0x06, 0x27fc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8dad);
-        rtl8168_mdio_write(tp, 0x06, 0x2014);
-        rtl8168_mdio_write(tp, 0x06, 0xee8b);
-        rtl8168_mdio_write(tp, 0x06, 0x8d00);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0x5a78);
-        rtl8168_mdio_write(tp, 0x06, 0x039e);
-        rtl8168_mdio_write(tp, 0x06, 0x0902);
-        rtl8168_mdio_write(tp, 0x06, 0x05db);
-        rtl8168_mdio_write(tp, 0x06, 0x0282);
-        rtl8168_mdio_write(tp, 0x06, 0x7b02);
-        rtl8168_mdio_write(tp, 0x06, 0x3231);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x1df6);
-        rtl8168_mdio_write(tp, 0x06, 0x20e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x0281);
-        rtl8168_mdio_write(tp, 0x06, 0x5c02);
-        rtl8168_mdio_write(tp, 0x06, 0x2bcb);
-        rtl8168_mdio_write(tp, 0x06, 0x022d);
-        rtl8168_mdio_write(tp, 0x06, 0x2902);
-        rtl8168_mdio_write(tp, 0x06, 0x03b4);
-        rtl8168_mdio_write(tp, 0x06, 0x0285);
-        rtl8168_mdio_write(tp, 0x06, 0x6402);
-        rtl8168_mdio_write(tp, 0x06, 0x2eca);
-        rtl8168_mdio_write(tp, 0x06, 0x0284);
-        rtl8168_mdio_write(tp, 0x06, 0xcd02);
-        rtl8168_mdio_write(tp, 0x06, 0x046f);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x210b);
-        rtl8168_mdio_write(tp, 0x06, 0xf621);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x8520);
-        rtl8168_mdio_write(tp, 0x06, 0x021b);
-        rtl8168_mdio_write(tp, 0x06, 0xe8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad22);
-        rtl8168_mdio_write(tp, 0x06, 0x05f6);
-        rtl8168_mdio_write(tp, 0x06, 0x22e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2308);
-        rtl8168_mdio_write(tp, 0x06, 0xf623);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x311c);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2405);
-        rtl8168_mdio_write(tp, 0x06, 0xf624);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ee0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad25);
-        rtl8168_mdio_write(tp, 0x06, 0x05f6);
-        rtl8168_mdio_write(tp, 0x06, 0x25e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2608);
-        rtl8168_mdio_write(tp, 0x06, 0xf626);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x2df5);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2705);
-        rtl8168_mdio_write(tp, 0x06, 0xf627);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x037a);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b87);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x65d2);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x2fe9);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf61e);
-        rtl8168_mdio_write(tp, 0x06, 0x21bf);
-        rtl8168_mdio_write(tp, 0x06, 0x2ff5);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf60c);
-        rtl8168_mdio_write(tp, 0x06, 0x111e);
-        rtl8168_mdio_write(tp, 0x06, 0x21bf);
-        rtl8168_mdio_write(tp, 0x06, 0x2ff8);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf60c);
-        rtl8168_mdio_write(tp, 0x06, 0x121e);
-        rtl8168_mdio_write(tp, 0x06, 0x21bf);
-        rtl8168_mdio_write(tp, 0x06, 0x2ffb);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf60c);
-        rtl8168_mdio_write(tp, 0x06, 0x131e);
-        rtl8168_mdio_write(tp, 0x06, 0x21bf);
-        rtl8168_mdio_write(tp, 0x06, 0x1f97);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf60c);
-        rtl8168_mdio_write(tp, 0x06, 0x141e);
-        rtl8168_mdio_write(tp, 0x06, 0x21bf);
-        rtl8168_mdio_write(tp, 0x06, 0x859b);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf60c);
-        rtl8168_mdio_write(tp, 0x06, 0x161e);
-        rtl8168_mdio_write(tp, 0x06, 0x21e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8a8c);
-        rtl8168_mdio_write(tp, 0x06, 0x1f02);
-        rtl8168_mdio_write(tp, 0x06, 0x9e22);
-        rtl8168_mdio_write(tp, 0x06, 0xe68a);
-        rtl8168_mdio_write(tp, 0x06, 0x8cad);
-        rtl8168_mdio_write(tp, 0x06, 0x3114);
-        rtl8168_mdio_write(tp, 0x06, 0xad30);
-        rtl8168_mdio_write(tp, 0x06, 0x11ef);
-        rtl8168_mdio_write(tp, 0x06, 0x0258);
-        rtl8168_mdio_write(tp, 0x06, 0x0c9e);
-        rtl8168_mdio_write(tp, 0x06, 0x07ad);
-        rtl8168_mdio_write(tp, 0x06, 0x3608);
-        rtl8168_mdio_write(tp, 0x06, 0x5a30);
-        rtl8168_mdio_write(tp, 0x06, 0x9f04);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xae02);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf2f);
-        rtl8168_mdio_write(tp, 0x06, 0xf202);
-        rtl8168_mdio_write(tp, 0x06, 0x3723);
-        rtl8168_mdio_write(tp, 0x06, 0xef96);
-        rtl8168_mdio_write(tp, 0x06, 0xfefd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x06, 0xface);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69fa);
-        rtl8168_mdio_write(tp, 0x06, 0xd401);
-        rtl8168_mdio_write(tp, 0x06, 0x55b4);
-        rtl8168_mdio_write(tp, 0x06, 0xfebf);
-        rtl8168_mdio_write(tp, 0x06, 0x85a7);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf6ac);
-        rtl8168_mdio_write(tp, 0x06, 0x280b);
-        rtl8168_mdio_write(tp, 0x06, 0xbf85);
-        rtl8168_mdio_write(tp, 0x06, 0xa402);
-        rtl8168_mdio_write(tp, 0x06, 0x36f6);
-        rtl8168_mdio_write(tp, 0x06, 0xac28);
-        rtl8168_mdio_write(tp, 0x06, 0x49ae);
-        rtl8168_mdio_write(tp, 0x06, 0x64bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85a4);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf6ac);
-        rtl8168_mdio_write(tp, 0x06, 0x285b);
-        rtl8168_mdio_write(tp, 0x06, 0xd000);
-        rtl8168_mdio_write(tp, 0x06, 0x0282);
-        rtl8168_mdio_write(tp, 0x06, 0x60ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2105);
-        rtl8168_mdio_write(tp, 0x06, 0xac22);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x4ebf);
-        rtl8168_mdio_write(tp, 0x06, 0xe0c4);
-        rtl8168_mdio_write(tp, 0x06, 0xbe86);
-        rtl8168_mdio_write(tp, 0x06, 0x14d2);
-        rtl8168_mdio_write(tp, 0x06, 0x04d8);
-        rtl8168_mdio_write(tp, 0x06, 0x19d9);
-        rtl8168_mdio_write(tp, 0x06, 0x1907);
-        rtl8168_mdio_write(tp, 0x06, 0xdc19);
-        rtl8168_mdio_write(tp, 0x06, 0xdd19);
-        rtl8168_mdio_write(tp, 0x06, 0x0789);
-        rtl8168_mdio_write(tp, 0x06, 0x89ef);
-        rtl8168_mdio_write(tp, 0x06, 0x645e);
-        rtl8168_mdio_write(tp, 0x06, 0x07ff);
-        rtl8168_mdio_write(tp, 0x06, 0x0d65);
-        rtl8168_mdio_write(tp, 0x06, 0x5cf8);
-        rtl8168_mdio_write(tp, 0x06, 0x001e);
-        rtl8168_mdio_write(tp, 0x06, 0x46dc);
-        rtl8168_mdio_write(tp, 0x06, 0x19dd);
-        rtl8168_mdio_write(tp, 0x06, 0x19b2);
-        rtl8168_mdio_write(tp, 0x06, 0xe2d4);
-        rtl8168_mdio_write(tp, 0x06, 0x0001);
-        rtl8168_mdio_write(tp, 0x06, 0xbf85);
-        rtl8168_mdio_write(tp, 0x06, 0xa402);
-        rtl8168_mdio_write(tp, 0x06, 0x3723);
-        rtl8168_mdio_write(tp, 0x06, 0xae1d);
-        rtl8168_mdio_write(tp, 0x06, 0xbee0);
-        rtl8168_mdio_write(tp, 0x06, 0xc4bf);
-        rtl8168_mdio_write(tp, 0x06, 0x8614);
-        rtl8168_mdio_write(tp, 0x06, 0xd204);
-        rtl8168_mdio_write(tp, 0x06, 0xd819);
-        rtl8168_mdio_write(tp, 0x06, 0xd919);
-        rtl8168_mdio_write(tp, 0x06, 0x07dc);
-        rtl8168_mdio_write(tp, 0x06, 0x19dd);
-        rtl8168_mdio_write(tp, 0x06, 0x1907);
-        rtl8168_mdio_write(tp, 0x06, 0xb2f4);
-        rtl8168_mdio_write(tp, 0x06, 0xd400);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85a4);
-        rtl8168_mdio_write(tp, 0x06, 0x0237);
-        rtl8168_mdio_write(tp, 0x06, 0x23fe);
-        rtl8168_mdio_write(tp, 0x06, 0xef96);
-        rtl8168_mdio_write(tp, 0x06, 0xfec6);
-        rtl8168_mdio_write(tp, 0x06, 0xfefd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc05);
-        rtl8168_mdio_write(tp, 0x06, 0xf9e2);
-        rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-        rtl8168_mdio_write(tp, 0x06, 0xe3e0);
-        rtl8168_mdio_write(tp, 0x06, 0xeb5a);
-        rtl8168_mdio_write(tp, 0x06, 0x070c);
-        rtl8168_mdio_write(tp, 0x06, 0x031e);
-        rtl8168_mdio_write(tp, 0x06, 0x20e6);
-        rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-        rtl8168_mdio_write(tp, 0x06, 0xe7e0);
-        rtl8168_mdio_write(tp, 0x06, 0xebe0);
-        rtl8168_mdio_write(tp, 0x06, 0xe0fc);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfd);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b81);
-        rtl8168_mdio_write(tp, 0x06, 0xac26);
-        rtl8168_mdio_write(tp, 0x06, 0x1ae0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b81);
-        rtl8168_mdio_write(tp, 0x06, 0xac21);
-        rtl8168_mdio_write(tp, 0x06, 0x14e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xac20);
-        rtl8168_mdio_write(tp, 0x06, 0x0ee0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xac23);
-        rtl8168_mdio_write(tp, 0x06, 0x08e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b87);
-        rtl8168_mdio_write(tp, 0x06, 0xac24);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x3802);
-        rtl8168_mdio_write(tp, 0x06, 0x1ab5);
-        rtl8168_mdio_write(tp, 0x06, 0xeee4);
-        rtl8168_mdio_write(tp, 0x06, 0x1c04);
-        rtl8168_mdio_write(tp, 0x06, 0xeee4);
-        rtl8168_mdio_write(tp, 0x06, 0x1d04);
-        rtl8168_mdio_write(tp, 0x06, 0xe2e0);
-        rtl8168_mdio_write(tp, 0x06, 0x7ce3);
-        rtl8168_mdio_write(tp, 0x06, 0xe07d);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x38e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe039);
-        rtl8168_mdio_write(tp, 0x06, 0xad2e);
-        rtl8168_mdio_write(tp, 0x06, 0x1bad);
-        rtl8168_mdio_write(tp, 0x06, 0x390d);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf21);
-        rtl8168_mdio_write(tp, 0x06, 0xd502);
-        rtl8168_mdio_write(tp, 0x06, 0x3723);
-        rtl8168_mdio_write(tp, 0x06, 0x0282);
-        rtl8168_mdio_write(tp, 0x06, 0xd8ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0bac);
-        rtl8168_mdio_write(tp, 0x06, 0x3802);
-        rtl8168_mdio_write(tp, 0x06, 0xae06);
-        rtl8168_mdio_write(tp, 0x06, 0x0283);
-        rtl8168_mdio_write(tp, 0x06, 0x1802);
-        rtl8168_mdio_write(tp, 0x06, 0x8360);
-        rtl8168_mdio_write(tp, 0x06, 0x021a);
-        rtl8168_mdio_write(tp, 0x06, 0xc6fd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8af4);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2605);
-        rtl8168_mdio_write(tp, 0x06, 0x0222);
-        rtl8168_mdio_write(tp, 0x06, 0xa4f7);
-        rtl8168_mdio_write(tp, 0x06, 0x28e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b81);
-        rtl8168_mdio_write(tp, 0x06, 0xad21);
-        rtl8168_mdio_write(tp, 0x06, 0x0502);
-        rtl8168_mdio_write(tp, 0x06, 0x23a9);
-        rtl8168_mdio_write(tp, 0x06, 0xf729);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x85ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2005);
-        rtl8168_mdio_write(tp, 0x06, 0x0214);
-        rtl8168_mdio_write(tp, 0x06, 0xabf7);
-        rtl8168_mdio_write(tp, 0x06, 0x2ae0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad23);
-        rtl8168_mdio_write(tp, 0x06, 0x0502);
-        rtl8168_mdio_write(tp, 0x06, 0x12e7);
-        rtl8168_mdio_write(tp, 0x06, 0xf72b);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x87ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2405);
-        rtl8168_mdio_write(tp, 0x06, 0x0283);
-        rtl8168_mdio_write(tp, 0x06, 0xbcf7);
-        rtl8168_mdio_write(tp, 0x06, 0x2ce5);
-        rtl8168_mdio_write(tp, 0x06, 0x8af4);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b81);
-        rtl8168_mdio_write(tp, 0x06, 0xad26);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0x21e5);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2109);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xf4ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2003);
-        rtl8168_mdio_write(tp, 0x06, 0x0223);
-        rtl8168_mdio_write(tp, 0x06, 0x98e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x09e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8af4);
-        rtl8168_mdio_write(tp, 0x06, 0xac21);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0x13fb);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x85ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2309);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xf4ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2203);
-        rtl8168_mdio_write(tp, 0x06, 0x0212);
-        rtl8168_mdio_write(tp, 0x06, 0xfae0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b87);
-        rtl8168_mdio_write(tp, 0x06, 0xad24);
-        rtl8168_mdio_write(tp, 0x06, 0x09e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8af4);
-        rtl8168_mdio_write(tp, 0x06, 0xac23);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0x83c1);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8af4);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2608);
-        rtl8168_mdio_write(tp, 0x06, 0xe083);
-        rtl8168_mdio_write(tp, 0x06, 0xd2ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2502);
-        rtl8168_mdio_write(tp, 0x06, 0xf628);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x210a);
-        rtl8168_mdio_write(tp, 0x06, 0xe084);
-        rtl8168_mdio_write(tp, 0x06, 0x0af6);
-        rtl8168_mdio_write(tp, 0x06, 0x27a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0502);
-        rtl8168_mdio_write(tp, 0x06, 0xf629);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x85ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2008);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xe8ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2102);
-        rtl8168_mdio_write(tp, 0x06, 0xf62a);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x85ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2308);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x20a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0xf62b);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x87ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2408);
-        rtl8168_mdio_write(tp, 0x06, 0xe086);
-        rtl8168_mdio_write(tp, 0x06, 0x02a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0xf62c);
-        rtl8168_mdio_write(tp, 0x06, 0xe58a);
-        rtl8168_mdio_write(tp, 0x06, 0xf4a1);
-        rtl8168_mdio_write(tp, 0x06, 0x0008);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf21);
-        rtl8168_mdio_write(tp, 0x06, 0xd502);
-        rtl8168_mdio_write(tp, 0x06, 0x3723);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xee86);
-        rtl8168_mdio_write(tp, 0x06, 0x0200);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x87ad);
-        rtl8168_mdio_write(tp, 0x06, 0x241e);
-        rtl8168_mdio_write(tp, 0x06, 0xe086);
-        rtl8168_mdio_write(tp, 0x06, 0x02a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0005);
-        rtl8168_mdio_write(tp, 0x06, 0x0283);
-        rtl8168_mdio_write(tp, 0x06, 0xe8ae);
-        rtl8168_mdio_write(tp, 0x06, 0xf5a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0105);
-        rtl8168_mdio_write(tp, 0x06, 0x0283);
-        rtl8168_mdio_write(tp, 0x06, 0xf8ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0ba0);
-        rtl8168_mdio_write(tp, 0x06, 0x0205);
-        rtl8168_mdio_write(tp, 0x06, 0x0284);
-        rtl8168_mdio_write(tp, 0x06, 0x14ae);
-        rtl8168_mdio_write(tp, 0x06, 0x03a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0300);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0x0284);
-        rtl8168_mdio_write(tp, 0x06, 0x2bee);
-        rtl8168_mdio_write(tp, 0x06, 0x8602);
-        rtl8168_mdio_write(tp, 0x06, 0x01ef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8609);
-        rtl8168_mdio_write(tp, 0x06, 0x0002);
-        rtl8168_mdio_write(tp, 0x06, 0x8461);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xae10);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8608);
-        rtl8168_mdio_write(tp, 0x06, 0xe186);
-        rtl8168_mdio_write(tp, 0x06, 0x091f);
-        rtl8168_mdio_write(tp, 0x06, 0x019e);
-        rtl8168_mdio_write(tp, 0x06, 0x0611);
-        rtl8168_mdio_write(tp, 0x06, 0xe586);
-        rtl8168_mdio_write(tp, 0x06, 0x09ae);
-        rtl8168_mdio_write(tp, 0x06, 0x04ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8602);
-        rtl8168_mdio_write(tp, 0x06, 0x01fc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0xfbbf);
-        rtl8168_mdio_write(tp, 0x06, 0x8604);
-        rtl8168_mdio_write(tp, 0x06, 0xef79);
-        rtl8168_mdio_write(tp, 0x06, 0xd200);
-        rtl8168_mdio_write(tp, 0x06, 0xd400);
-        rtl8168_mdio_write(tp, 0x06, 0x221e);
-        rtl8168_mdio_write(tp, 0x06, 0x02bf);
-        rtl8168_mdio_write(tp, 0x06, 0x2fec);
-        rtl8168_mdio_write(tp, 0x06, 0x0237);
-        rtl8168_mdio_write(tp, 0x06, 0x23bf);
-        rtl8168_mdio_write(tp, 0x06, 0x13f2);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf60d);
-        rtl8168_mdio_write(tp, 0x06, 0x4559);
-        rtl8168_mdio_write(tp, 0x06, 0x1fef);
-        rtl8168_mdio_write(tp, 0x06, 0x97dd);
-        rtl8168_mdio_write(tp, 0x06, 0xd308);
-        rtl8168_mdio_write(tp, 0x06, 0x1a93);
-        rtl8168_mdio_write(tp, 0x06, 0xdd12);
-        rtl8168_mdio_write(tp, 0x06, 0x17a2);
-        rtl8168_mdio_write(tp, 0x06, 0x04de);
-        rtl8168_mdio_write(tp, 0x06, 0xffef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0xfbee);
-        rtl8168_mdio_write(tp, 0x06, 0x8602);
-        rtl8168_mdio_write(tp, 0x06, 0x03d5);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x06, 0xbf86);
-        rtl8168_mdio_write(tp, 0x06, 0x04ef);
-        rtl8168_mdio_write(tp, 0x06, 0x79ef);
-        rtl8168_mdio_write(tp, 0x06, 0x45bf);
-        rtl8168_mdio_write(tp, 0x06, 0x2fec);
-        rtl8168_mdio_write(tp, 0x06, 0x0237);
-        rtl8168_mdio_write(tp, 0x06, 0x23bf);
-        rtl8168_mdio_write(tp, 0x06, 0x13f2);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf6ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2702);
-        rtl8168_mdio_write(tp, 0x06, 0x78ff);
-        rtl8168_mdio_write(tp, 0x06, 0xe186);
-        rtl8168_mdio_write(tp, 0x06, 0x0a1b);
-        rtl8168_mdio_write(tp, 0x06, 0x01aa);
-        rtl8168_mdio_write(tp, 0x06, 0x2eef);
-        rtl8168_mdio_write(tp, 0x06, 0x97d9);
-        rtl8168_mdio_write(tp, 0x06, 0x7900);
-        rtl8168_mdio_write(tp, 0x06, 0x9e2b);
-        rtl8168_mdio_write(tp, 0x06, 0x81dd);
-        rtl8168_mdio_write(tp, 0x06, 0xbf85);
-        rtl8168_mdio_write(tp, 0x06, 0xad02);
-        rtl8168_mdio_write(tp, 0x06, 0x3723);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xef02);
-        rtl8168_mdio_write(tp, 0x06, 0x100c);
-        rtl8168_mdio_write(tp, 0x06, 0x11b0);
-        rtl8168_mdio_write(tp, 0x06, 0xfc0d);
-        rtl8168_mdio_write(tp, 0x06, 0x11bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85aa);
-        rtl8168_mdio_write(tp, 0x06, 0x0237);
-        rtl8168_mdio_write(tp, 0x06, 0x23d1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85aa);
-        rtl8168_mdio_write(tp, 0x06, 0x0237);
-        rtl8168_mdio_write(tp, 0x06, 0x23ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8602);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0413);
-        rtl8168_mdio_write(tp, 0x06, 0xa38b);
-        rtl8168_mdio_write(tp, 0x06, 0xb4d3);
-        rtl8168_mdio_write(tp, 0x06, 0x8012);
-        rtl8168_mdio_write(tp, 0x06, 0x17a2);
-        rtl8168_mdio_write(tp, 0x06, 0x04ad);
-        rtl8168_mdio_write(tp, 0x06, 0xffef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad25);
-        rtl8168_mdio_write(tp, 0x06, 0x48e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8a96);
-        rtl8168_mdio_write(tp, 0x06, 0xe18a);
-        rtl8168_mdio_write(tp, 0x06, 0x977c);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x9e35);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0x9600);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0x9700);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xbee1);
-        rtl8168_mdio_write(tp, 0x06, 0x8abf);
-        rtl8168_mdio_write(tp, 0x06, 0xe286);
-        rtl8168_mdio_write(tp, 0x06, 0x10e3);
-        rtl8168_mdio_write(tp, 0x06, 0x8611);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0x1aad);
-        rtl8168_mdio_write(tp, 0x06, 0x2012);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0x9603);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0x97b7);
-        rtl8168_mdio_write(tp, 0x06, 0xee86);
-        rtl8168_mdio_write(tp, 0x06, 0x1000);
-        rtl8168_mdio_write(tp, 0x06, 0xee86);
-        rtl8168_mdio_write(tp, 0x06, 0x1100);
-        rtl8168_mdio_write(tp, 0x06, 0xae11);
-        rtl8168_mdio_write(tp, 0x06, 0x15e6);
-        rtl8168_mdio_write(tp, 0x06, 0x8610);
-        rtl8168_mdio_write(tp, 0x06, 0xe786);
-        rtl8168_mdio_write(tp, 0x06, 0x11ae);
-        rtl8168_mdio_write(tp, 0x06, 0x08ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8610);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8611);
-        rtl8168_mdio_write(tp, 0x06, 0x00fd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x00e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe001);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x32e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b40);
-        rtl8168_mdio_write(tp, 0x06, 0xf720);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x40bf);
-        rtl8168_mdio_write(tp, 0x06, 0x31f5);
-        rtl8168_mdio_write(tp, 0x06, 0x0236);
-        rtl8168_mdio_write(tp, 0x06, 0xf6ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2821);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x20e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe021);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x18e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b40);
-        rtl8168_mdio_write(tp, 0x06, 0xf620);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x40ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8b3b);
-        rtl8168_mdio_write(tp, 0x06, 0xffe0);
-        rtl8168_mdio_write(tp, 0x06, 0x8a8a);
-        rtl8168_mdio_write(tp, 0x06, 0xe18a);
-        rtl8168_mdio_write(tp, 0x06, 0x8be4);
-        rtl8168_mdio_write(tp, 0x06, 0xe000);
-        rtl8168_mdio_write(tp, 0x06, 0xe5e0);
-        rtl8168_mdio_write(tp, 0x06, 0x01ef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x80ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2722);
-        rtl8168_mdio_write(tp, 0x06, 0xbf44);
-        rtl8168_mdio_write(tp, 0x06, 0xfc02);
-        rtl8168_mdio_write(tp, 0x06, 0x36f6);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x441f);
-        rtl8168_mdio_write(tp, 0x06, 0x019e);
-        rtl8168_mdio_write(tp, 0x06, 0x15e5);
-        rtl8168_mdio_write(tp, 0x06, 0x8b44);
-        rtl8168_mdio_write(tp, 0x06, 0xad29);
-        rtl8168_mdio_write(tp, 0x06, 0x07ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2804);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xae02);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf85);
-        rtl8168_mdio_write(tp, 0x06, 0xb002);
-        rtl8168_mdio_write(tp, 0x06, 0x3723);
-        rtl8168_mdio_write(tp, 0x06, 0xef96);
-        rtl8168_mdio_write(tp, 0x06, 0xfefc);
-        rtl8168_mdio_write(tp, 0x06, 0x0400);
-        rtl8168_mdio_write(tp, 0x06, 0xe140);
-        rtl8168_mdio_write(tp, 0x06, 0x77e1);
-        rtl8168_mdio_write(tp, 0x06, 0x40dd);
-        rtl8168_mdio_write(tp, 0x06, 0xe022);
-        rtl8168_mdio_write(tp, 0x06, 0x32e1);
-        rtl8168_mdio_write(tp, 0x06, 0x5074);
-        rtl8168_mdio_write(tp, 0x06, 0xe144);
-        rtl8168_mdio_write(tp, 0x06, 0xffe0);
-        rtl8168_mdio_write(tp, 0x06, 0xdaff);
-        rtl8168_mdio_write(tp, 0x06, 0xe0c0);
-        rtl8168_mdio_write(tp, 0x06, 0x52e0);
-        rtl8168_mdio_write(tp, 0x06, 0xeed9);
-        rtl8168_mdio_write(tp, 0x06, 0xe04c);
-        rtl8168_mdio_write(tp, 0x06, 0xbbe0);
-        rtl8168_mdio_write(tp, 0x06, 0x2a00);
-        rtl8168_mdio_write(tp, 0x05, 0xe142);
-        gphy_val = rtl8168_mdio_read(tp, 0x06);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp, 0x06, gphy_val);
-        rtl8168_mdio_write(tp, 0x05, 0xe140);
-        gphy_val = rtl8168_mdio_read(tp, 0x06);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp, 0x06, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x00);
-                if (gphy_val & BIT_7)
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0042);
-        rtl8168_mdio_write(tp, 0x18, 0x2300);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        if (tp->RequiredSecLanDonglePatch) {
-                gphy_val = rtl8168_mdio_read(tp, 0x17);
-                gphy_val &= ~BIT_2;
-                rtl8168_mdio_write(tp, 0x17, gphy_val);
-        }
-
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x00, 0x9200);
-}
-
-static void
-rtl8168_set_phy_mcu_8168f_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val,i;
-
-        rtl8168_mdio_write(tp,0x1f, 0x0000);
-        rtl8168_mdio_write(tp,0x00, 0x1800);
-        gphy_val = rtl8168_mdio_read(tp, 0x15);
-        gphy_val &= ~(BIT_12);
-        rtl8168_mdio_write(tp,0x15, gphy_val);
-        rtl8168_mdio_write(tp,0x00, 0x4800);
-        rtl8168_mdio_write(tp,0x1f, 0x0007);
-        rtl8168_mdio_write(tp,0x1e, 0x002f);
-        for (i = 0; i < 1000; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x1c);
-                if (gphy_val & 0x0080)
-                        break;
-        }
-        rtl8168_mdio_write(tp,0x1f, 0x0000);
-        rtl8168_mdio_write(tp,0x00, 0x1800);
-        rtl8168_mdio_write(tp,0x1f, 0x0007);
-        rtl8168_mdio_write(tp,0x1e, 0x0023);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x18);
-                if (!(gphy_val & 0x0001))
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0307);
-        rtl8168_mdio_write(tp, 0x15, 0x0194);
-        rtl8168_mdio_write(tp, 0x19, 0x407D);
-        rtl8168_mdio_write(tp, 0x15, 0x0098);
-        rtl8168_mdio_write(tp, 0x19, 0x7c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x0099);
-        rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00eb);
-        rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00f8);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00fe);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0f);
-        rtl8168_mdio_write(tp, 0x15, 0x00db);
-        rtl8168_mdio_write(tp, 0x19, 0x6f09);
-        rtl8168_mdio_write(tp, 0x15, 0x00dc);
-        rtl8168_mdio_write(tp, 0x19, 0xaefd);
-        rtl8168_mdio_write(tp, 0x15, 0x00dd);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00de);
-        rtl8168_mdio_write(tp, 0x19, 0xc60b);
-        rtl8168_mdio_write(tp, 0x15, 0x00df);
-        rtl8168_mdio_write(tp, 0x19, 0x00fa);
-        rtl8168_mdio_write(tp, 0x15, 0x00e0);
-        rtl8168_mdio_write(tp, 0x19, 0x30e1);
-        rtl8168_mdio_write(tp, 0x15, 0x020c);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x020e);
-        rtl8168_mdio_write(tp, 0x19, 0x9813);
-        rtl8168_mdio_write(tp, 0x15, 0x020f);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x0210);
-        rtl8168_mdio_write(tp, 0x19, 0x930f);
-        rtl8168_mdio_write(tp, 0x15, 0x0211);
-        rtl8168_mdio_write(tp, 0x19, 0x9206);
-        rtl8168_mdio_write(tp, 0x15, 0x0212);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0213);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0214);
-        rtl8168_mdio_write(tp, 0x19, 0x588f);
-        rtl8168_mdio_write(tp, 0x15, 0x0215);
-        rtl8168_mdio_write(tp, 0x19, 0x5520);
-        rtl8168_mdio_write(tp, 0x15, 0x0216);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x0217);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0218);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0219);
-        rtl8168_mdio_write(tp, 0x19, 0x588d);
-        rtl8168_mdio_write(tp, 0x15, 0x021a);
-        rtl8168_mdio_write(tp, 0x19, 0x5540);
-        rtl8168_mdio_write(tp, 0x15, 0x021b);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x021c);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x021d);
-        rtl8168_mdio_write(tp, 0x19, 0x6840);
-        rtl8168_mdio_write(tp, 0x15, 0x021e);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x021f);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0220);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x0221);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x0222);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x0223);
-        rtl8168_mdio_write(tp, 0x19, 0x6840);
-        rtl8168_mdio_write(tp, 0x15, 0x0224);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0225);
-        rtl8168_mdio_write(tp, 0x19, 0x3231);
-        rtl8168_mdio_write(tp, 0x15, 0x0000);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0300);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x05, 0x8000);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0x48f7);
-        rtl8168_mdio_write(tp, 0x06, 0x00e0);
-        rtl8168_mdio_write(tp, 0x06, 0xfff7);
-        rtl8168_mdio_write(tp, 0x06, 0xa080);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0xf602);
-        rtl8168_mdio_write(tp, 0x06, 0x0118);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x2502);
-        rtl8168_mdio_write(tp, 0x06, 0x8090);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x4202);
-        rtl8168_mdio_write(tp, 0x06, 0x015c);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0xad02);
-        rtl8168_mdio_write(tp, 0x06, 0x80ca);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x88e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b89);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8a1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8b);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8c1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01a0);
-        rtl8168_mdio_write(tp, 0x06, 0x00c7);
-        rtl8168_mdio_write(tp, 0x06, 0xaebb);
-        rtl8168_mdio_write(tp, 0x06, 0xd484);
-        rtl8168_mdio_write(tp, 0x06, 0x3ce4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b92);
-        rtl8168_mdio_write(tp, 0x06, 0xe58b);
-        rtl8168_mdio_write(tp, 0x06, 0x93ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac8);
-        rtl8168_mdio_write(tp, 0x06, 0x03ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8aca);
-        rtl8168_mdio_write(tp, 0x06, 0x60ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac0);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac1);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8abe);
-        rtl8168_mdio_write(tp, 0x06, 0x07ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8abf);
-        rtl8168_mdio_write(tp, 0x06, 0x73ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8a95);
-        rtl8168_mdio_write(tp, 0x06, 0x02bf);
-        rtl8168_mdio_write(tp, 0x06, 0x8b88);
-        rtl8168_mdio_write(tp, 0x06, 0xec00);
-        rtl8168_mdio_write(tp, 0x06, 0x19a9);
-        rtl8168_mdio_write(tp, 0x06, 0x8b90);
-        rtl8168_mdio_write(tp, 0x06, 0xf9ee);
-        rtl8168_mdio_write(tp, 0x06, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0xfff7);
-        rtl8168_mdio_write(tp, 0x06, 0xfed1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85a4);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x7dd1);
-        rtl8168_mdio_write(tp, 0x06, 0x01bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85a7);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x7d04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8a);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x14ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8a);
-        rtl8168_mdio_write(tp, 0x06, 0x0002);
-        rtl8168_mdio_write(tp, 0x06, 0x204b);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e4);
-        rtl8168_mdio_write(tp, 0x06, 0x26e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe427);
-        rtl8168_mdio_write(tp, 0x06, 0xeee4);
-        rtl8168_mdio_write(tp, 0x06, 0x2623);
-        rtl8168_mdio_write(tp, 0x06, 0xe5e4);
-        rtl8168_mdio_write(tp, 0x06, 0x27fc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8dad);
-        rtl8168_mdio_write(tp, 0x06, 0x2014);
-        rtl8168_mdio_write(tp, 0x06, 0xee8b);
-        rtl8168_mdio_write(tp, 0x06, 0x8d00);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0x5a78);
-        rtl8168_mdio_write(tp, 0x06, 0x039e);
-        rtl8168_mdio_write(tp, 0x06, 0x0902);
-        rtl8168_mdio_write(tp, 0x06, 0x05e8);
-        rtl8168_mdio_write(tp, 0x06, 0x0281);
-        rtl8168_mdio_write(tp, 0x06, 0x4f02);
-        rtl8168_mdio_write(tp, 0x06, 0x326c);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x1df6);
-        rtl8168_mdio_write(tp, 0x06, 0x20e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x022f);
-        rtl8168_mdio_write(tp, 0x06, 0x0902);
-        rtl8168_mdio_write(tp, 0x06, 0x2ab0);
-        rtl8168_mdio_write(tp, 0x06, 0x0285);
-        rtl8168_mdio_write(tp, 0x06, 0x1602);
-        rtl8168_mdio_write(tp, 0x06, 0x03ba);
-        rtl8168_mdio_write(tp, 0x06, 0x0284);
-        rtl8168_mdio_write(tp, 0x06, 0xe502);
-        rtl8168_mdio_write(tp, 0x06, 0x2df1);
-        rtl8168_mdio_write(tp, 0x06, 0x0283);
-        rtl8168_mdio_write(tp, 0x06, 0x8302);
-        rtl8168_mdio_write(tp, 0x06, 0x0475);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x210b);
-        rtl8168_mdio_write(tp, 0x06, 0xf621);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x83f8);
-        rtl8168_mdio_write(tp, 0x06, 0x021c);
-        rtl8168_mdio_write(tp, 0x06, 0x99e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad22);
-        rtl8168_mdio_write(tp, 0x06, 0x08f6);
-        rtl8168_mdio_write(tp, 0x06, 0x22e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x0235);
-        rtl8168_mdio_write(tp, 0x06, 0x63e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad23);
-        rtl8168_mdio_write(tp, 0x06, 0x08f6);
-        rtl8168_mdio_write(tp, 0x06, 0x23e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x0231);
-        rtl8168_mdio_write(tp, 0x06, 0x57e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad24);
-        rtl8168_mdio_write(tp, 0x06, 0x05f6);
-        rtl8168_mdio_write(tp, 0x06, 0x24e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2505);
-        rtl8168_mdio_write(tp, 0x06, 0xf625);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ee0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad26);
-        rtl8168_mdio_write(tp, 0x06, 0x08f6);
-        rtl8168_mdio_write(tp, 0x06, 0x26e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x022d);
-        rtl8168_mdio_write(tp, 0x06, 0x1ce0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x05f6);
-        rtl8168_mdio_write(tp, 0x06, 0x27e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x0203);
-        rtl8168_mdio_write(tp, 0x06, 0x80fc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b81);
-        rtl8168_mdio_write(tp, 0x06, 0xac26);
-        rtl8168_mdio_write(tp, 0x06, 0x1ae0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b81);
-        rtl8168_mdio_write(tp, 0x06, 0xac21);
-        rtl8168_mdio_write(tp, 0x06, 0x14e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xac20);
-        rtl8168_mdio_write(tp, 0x06, 0x0ee0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xac23);
-        rtl8168_mdio_write(tp, 0x06, 0x08e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b87);
-        rtl8168_mdio_write(tp, 0x06, 0xac24);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x3802);
-        rtl8168_mdio_write(tp, 0x06, 0x1ac2);
-        rtl8168_mdio_write(tp, 0x06, 0xeee4);
-        rtl8168_mdio_write(tp, 0x06, 0x1c04);
-        rtl8168_mdio_write(tp, 0x06, 0xeee4);
-        rtl8168_mdio_write(tp, 0x06, 0x1d04);
-        rtl8168_mdio_write(tp, 0x06, 0xe2e0);
-        rtl8168_mdio_write(tp, 0x06, 0x7ce3);
-        rtl8168_mdio_write(tp, 0x06, 0xe07d);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x38e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe039);
-        rtl8168_mdio_write(tp, 0x06, 0xad2e);
-        rtl8168_mdio_write(tp, 0x06, 0x1bad);
-        rtl8168_mdio_write(tp, 0x06, 0x390d);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf22);
-        rtl8168_mdio_write(tp, 0x06, 0x7a02);
-        rtl8168_mdio_write(tp, 0x06, 0x387d);
-        rtl8168_mdio_write(tp, 0x06, 0x0281);
-        rtl8168_mdio_write(tp, 0x06, 0xacae);
-        rtl8168_mdio_write(tp, 0x06, 0x0bac);
-        rtl8168_mdio_write(tp, 0x06, 0x3802);
-        rtl8168_mdio_write(tp, 0x06, 0xae06);
-        rtl8168_mdio_write(tp, 0x06, 0x0281);
-        rtl8168_mdio_write(tp, 0x06, 0xe902);
-        rtl8168_mdio_write(tp, 0x06, 0x822e);
-        rtl8168_mdio_write(tp, 0x06, 0x021a);
-        rtl8168_mdio_write(tp, 0x06, 0xd3fd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8af4);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2602);
-        rtl8168_mdio_write(tp, 0x06, 0xf728);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2105);
-        rtl8168_mdio_write(tp, 0x06, 0x0222);
-        rtl8168_mdio_write(tp, 0x06, 0x8ef7);
-        rtl8168_mdio_write(tp, 0x06, 0x29e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x0502);
-        rtl8168_mdio_write(tp, 0x06, 0x14b8);
-        rtl8168_mdio_write(tp, 0x06, 0xf72a);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x85ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2305);
-        rtl8168_mdio_write(tp, 0x06, 0x0212);
-        rtl8168_mdio_write(tp, 0x06, 0xf4f7);
-        rtl8168_mdio_write(tp, 0x06, 0x2be0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b87);
-        rtl8168_mdio_write(tp, 0x06, 0xad24);
-        rtl8168_mdio_write(tp, 0x06, 0x0502);
-        rtl8168_mdio_write(tp, 0x06, 0x8284);
-        rtl8168_mdio_write(tp, 0x06, 0xf72c);
-        rtl8168_mdio_write(tp, 0x06, 0xe58a);
-        rtl8168_mdio_write(tp, 0x06, 0xf4fc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2600);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2109);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xf4ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2003);
-        rtl8168_mdio_write(tp, 0x06, 0x0222);
-        rtl8168_mdio_write(tp, 0x06, 0x7de0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x09e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8af4);
-        rtl8168_mdio_write(tp, 0x06, 0xac21);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0x1408);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x85ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2309);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xf4ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2203);
-        rtl8168_mdio_write(tp, 0x06, 0x0213);
-        rtl8168_mdio_write(tp, 0x06, 0x07e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b87);
-        rtl8168_mdio_write(tp, 0x06, 0xad24);
-        rtl8168_mdio_write(tp, 0x06, 0x09e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8af4);
-        rtl8168_mdio_write(tp, 0x06, 0xac23);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0x8289);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8af4);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2602);
-        rtl8168_mdio_write(tp, 0x06, 0xf628);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ad);
-        rtl8168_mdio_write(tp, 0x06, 0x210a);
-        rtl8168_mdio_write(tp, 0x06, 0xe083);
-        rtl8168_mdio_write(tp, 0x06, 0xecf6);
-        rtl8168_mdio_write(tp, 0x06, 0x27a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0502);
-        rtl8168_mdio_write(tp, 0x06, 0xf629);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x85ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2008);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xe8ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2102);
-        rtl8168_mdio_write(tp, 0x06, 0xf62a);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x85ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2308);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x20a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0xf62b);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x87ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2408);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xc2a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0302);
-        rtl8168_mdio_write(tp, 0x06, 0xf62c);
-        rtl8168_mdio_write(tp, 0x06, 0xe58a);
-        rtl8168_mdio_write(tp, 0x06, 0xf4a1);
-        rtl8168_mdio_write(tp, 0x06, 0x0008);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf22);
-        rtl8168_mdio_write(tp, 0x06, 0x7a02);
-        rtl8168_mdio_write(tp, 0x06, 0x387d);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0xc200);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x87ad);
-        rtl8168_mdio_write(tp, 0x06, 0x241e);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xc2a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0005);
-        rtl8168_mdio_write(tp, 0x06, 0x0282);
-        rtl8168_mdio_write(tp, 0x06, 0xb0ae);
-        rtl8168_mdio_write(tp, 0x06, 0xf5a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0105);
-        rtl8168_mdio_write(tp, 0x06, 0x0282);
-        rtl8168_mdio_write(tp, 0x06, 0xc0ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0ba0);
-        rtl8168_mdio_write(tp, 0x06, 0x0205);
-        rtl8168_mdio_write(tp, 0x06, 0x0282);
-        rtl8168_mdio_write(tp, 0x06, 0xcaae);
-        rtl8168_mdio_write(tp, 0x06, 0x03a0);
-        rtl8168_mdio_write(tp, 0x06, 0x0300);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0x0282);
-        rtl8168_mdio_write(tp, 0x06, 0xe1ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac2);
-        rtl8168_mdio_write(tp, 0x06, 0x01ef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac9);
-        rtl8168_mdio_write(tp, 0x06, 0x0002);
-        rtl8168_mdio_write(tp, 0x06, 0x8317);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac8);
-        rtl8168_mdio_write(tp, 0x06, 0xe18a);
-        rtl8168_mdio_write(tp, 0x06, 0xc91f);
-        rtl8168_mdio_write(tp, 0x06, 0x019e);
-        rtl8168_mdio_write(tp, 0x06, 0x0611);
-        rtl8168_mdio_write(tp, 0x06, 0xe58a);
-        rtl8168_mdio_write(tp, 0x06, 0xc9ae);
-        rtl8168_mdio_write(tp, 0x06, 0x04ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac2);
-        rtl8168_mdio_write(tp, 0x06, 0x01fc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0xfbbf);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac4);
-        rtl8168_mdio_write(tp, 0x06, 0xef79);
-        rtl8168_mdio_write(tp, 0x06, 0xd200);
-        rtl8168_mdio_write(tp, 0x06, 0xd400);
-        rtl8168_mdio_write(tp, 0x06, 0x221e);
-        rtl8168_mdio_write(tp, 0x06, 0x02bf);
-        rtl8168_mdio_write(tp, 0x06, 0x3024);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x7dbf);
-        rtl8168_mdio_write(tp, 0x06, 0x13ff);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x500d);
-        rtl8168_mdio_write(tp, 0x06, 0x4559);
-        rtl8168_mdio_write(tp, 0x06, 0x1fef);
-        rtl8168_mdio_write(tp, 0x06, 0x97dd);
-        rtl8168_mdio_write(tp, 0x06, 0xd308);
-        rtl8168_mdio_write(tp, 0x06, 0x1a93);
-        rtl8168_mdio_write(tp, 0x06, 0xdd12);
-        rtl8168_mdio_write(tp, 0x06, 0x17a2);
-        rtl8168_mdio_write(tp, 0x06, 0x04de);
-        rtl8168_mdio_write(tp, 0x06, 0xffef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0xfbee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac2);
-        rtl8168_mdio_write(tp, 0x06, 0x03d5);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x06, 0xbf8a);
-        rtl8168_mdio_write(tp, 0x06, 0xc4ef);
-        rtl8168_mdio_write(tp, 0x06, 0x79ef);
-        rtl8168_mdio_write(tp, 0x06, 0x45bf);
-        rtl8168_mdio_write(tp, 0x06, 0x3024);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x7dbf);
-        rtl8168_mdio_write(tp, 0x06, 0x13ff);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x50ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2702);
-        rtl8168_mdio_write(tp, 0x06, 0x78ff);
-        rtl8168_mdio_write(tp, 0x06, 0xe18a);
-        rtl8168_mdio_write(tp, 0x06, 0xca1b);
-        rtl8168_mdio_write(tp, 0x06, 0x01aa);
-        rtl8168_mdio_write(tp, 0x06, 0x2eef);
-        rtl8168_mdio_write(tp, 0x06, 0x97d9);
-        rtl8168_mdio_write(tp, 0x06, 0x7900);
-        rtl8168_mdio_write(tp, 0x06, 0x9e2b);
-        rtl8168_mdio_write(tp, 0x06, 0x81dd);
-        rtl8168_mdio_write(tp, 0x06, 0xbf85);
-        rtl8168_mdio_write(tp, 0x06, 0xad02);
-        rtl8168_mdio_write(tp, 0x06, 0x387d);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xef02);
-        rtl8168_mdio_write(tp, 0x06, 0x100c);
-        rtl8168_mdio_write(tp, 0x06, 0x11b0);
-        rtl8168_mdio_write(tp, 0x06, 0xfc0d);
-        rtl8168_mdio_write(tp, 0x06, 0x11bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85aa);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x7dd1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85aa);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x7dee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac2);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0413);
-        rtl8168_mdio_write(tp, 0x06, 0xa38b);
-        rtl8168_mdio_write(tp, 0x06, 0xb4d3);
-        rtl8168_mdio_write(tp, 0x06, 0x8012);
-        rtl8168_mdio_write(tp, 0x06, 0x17a2);
-        rtl8168_mdio_write(tp, 0x06, 0x04ad);
-        rtl8168_mdio_write(tp, 0x06, 0xffef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad25);
-        rtl8168_mdio_write(tp, 0x06, 0x48e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8a96);
-        rtl8168_mdio_write(tp, 0x06, 0xe18a);
-        rtl8168_mdio_write(tp, 0x06, 0x977c);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x9e35);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0x9600);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0x9700);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0xbee1);
-        rtl8168_mdio_write(tp, 0x06, 0x8abf);
-        rtl8168_mdio_write(tp, 0x06, 0xe28a);
-        rtl8168_mdio_write(tp, 0x06, 0xc0e3);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac1);
-        rtl8168_mdio_write(tp, 0x06, 0x0237);
-        rtl8168_mdio_write(tp, 0x06, 0x74ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2012);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0x9603);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0x97b7);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0xc000);
-        rtl8168_mdio_write(tp, 0x06, 0xee8a);
-        rtl8168_mdio_write(tp, 0x06, 0xc100);
-        rtl8168_mdio_write(tp, 0x06, 0xae11);
-        rtl8168_mdio_write(tp, 0x06, 0x15e6);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac0);
-        rtl8168_mdio_write(tp, 0x06, 0xe78a);
-        rtl8168_mdio_write(tp, 0x06, 0xc1ae);
-        rtl8168_mdio_write(tp, 0x06, 0x08ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac0);
-        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8ac1);
-        rtl8168_mdio_write(tp, 0x06, 0x00fd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xae20);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0x0000);
-        rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x00e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe001);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x32e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b40);
-        rtl8168_mdio_write(tp, 0x06, 0xf720);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x40bf);
-        rtl8168_mdio_write(tp, 0x06, 0x3230);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x50ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2821);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x20e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe021);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x18e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b40);
-        rtl8168_mdio_write(tp, 0x06, 0xf620);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x40ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8b3b);
-        rtl8168_mdio_write(tp, 0x06, 0xffe0);
-        rtl8168_mdio_write(tp, 0x06, 0x8a8a);
-        rtl8168_mdio_write(tp, 0x06, 0xe18a);
-        rtl8168_mdio_write(tp, 0x06, 0x8be4);
-        rtl8168_mdio_write(tp, 0x06, 0xe000);
-        rtl8168_mdio_write(tp, 0x06, 0xe5e0);
-        rtl8168_mdio_write(tp, 0x06, 0x01ef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x06, 0xface);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69fa);
-        rtl8168_mdio_write(tp, 0x06, 0xd401);
-        rtl8168_mdio_write(tp, 0x06, 0x55b4);
-        rtl8168_mdio_write(tp, 0x06, 0xfebf);
-        rtl8168_mdio_write(tp, 0x06, 0x1c1e);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x50ac);
-        rtl8168_mdio_write(tp, 0x06, 0x280b);
-        rtl8168_mdio_write(tp, 0x06, 0xbf1c);
-        rtl8168_mdio_write(tp, 0x06, 0x1b02);
-        rtl8168_mdio_write(tp, 0x06, 0x3850);
-        rtl8168_mdio_write(tp, 0x06, 0xac28);
-        rtl8168_mdio_write(tp, 0x06, 0x49ae);
-        rtl8168_mdio_write(tp, 0x06, 0x64bf);
-        rtl8168_mdio_write(tp, 0x06, 0x1c1b);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x50ac);
-        rtl8168_mdio_write(tp, 0x06, 0x285b);
-        rtl8168_mdio_write(tp, 0x06, 0xd000);
-        rtl8168_mdio_write(tp, 0x06, 0x0284);
-        rtl8168_mdio_write(tp, 0x06, 0xcaac);
-        rtl8168_mdio_write(tp, 0x06, 0x2105);
-        rtl8168_mdio_write(tp, 0x06, 0xac22);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x4ebf);
-        rtl8168_mdio_write(tp, 0x06, 0xe0c4);
-        rtl8168_mdio_write(tp, 0x06, 0xbe85);
-        rtl8168_mdio_write(tp, 0x06, 0xf6d2);
-        rtl8168_mdio_write(tp, 0x06, 0x04d8);
-        rtl8168_mdio_write(tp, 0x06, 0x19d9);
-        rtl8168_mdio_write(tp, 0x06, 0x1907);
-        rtl8168_mdio_write(tp, 0x06, 0xdc19);
-        rtl8168_mdio_write(tp, 0x06, 0xdd19);
-        rtl8168_mdio_write(tp, 0x06, 0x0789);
-        rtl8168_mdio_write(tp, 0x06, 0x89ef);
-        rtl8168_mdio_write(tp, 0x06, 0x645e);
-        rtl8168_mdio_write(tp, 0x06, 0x07ff);
-        rtl8168_mdio_write(tp, 0x06, 0x0d65);
-        rtl8168_mdio_write(tp, 0x06, 0x5cf8);
-        rtl8168_mdio_write(tp, 0x06, 0x001e);
-        rtl8168_mdio_write(tp, 0x06, 0x46dc);
-        rtl8168_mdio_write(tp, 0x06, 0x19dd);
-        rtl8168_mdio_write(tp, 0x06, 0x19b2);
-        rtl8168_mdio_write(tp, 0x06, 0xe2d4);
-        rtl8168_mdio_write(tp, 0x06, 0x0001);
-        rtl8168_mdio_write(tp, 0x06, 0xbf1c);
-        rtl8168_mdio_write(tp, 0x06, 0x1b02);
-        rtl8168_mdio_write(tp, 0x06, 0x387d);
-        rtl8168_mdio_write(tp, 0x06, 0xae1d);
-        rtl8168_mdio_write(tp, 0x06, 0xbee0);
-        rtl8168_mdio_write(tp, 0x06, 0xc4bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85f6);
-        rtl8168_mdio_write(tp, 0x06, 0xd204);
-        rtl8168_mdio_write(tp, 0x06, 0xd819);
-        rtl8168_mdio_write(tp, 0x06, 0xd919);
-        rtl8168_mdio_write(tp, 0x06, 0x07dc);
-        rtl8168_mdio_write(tp, 0x06, 0x19dd);
-        rtl8168_mdio_write(tp, 0x06, 0x1907);
-        rtl8168_mdio_write(tp, 0x06, 0xb2f4);
-        rtl8168_mdio_write(tp, 0x06, 0xd400);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x1c1b);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x7dfe);
-        rtl8168_mdio_write(tp, 0x06, 0xef96);
-        rtl8168_mdio_write(tp, 0x06, 0xfec6);
-        rtl8168_mdio_write(tp, 0x06, 0xfefd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc05);
-        rtl8168_mdio_write(tp, 0x06, 0xf9e2);
-        rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-        rtl8168_mdio_write(tp, 0x06, 0xe3e0);
-        rtl8168_mdio_write(tp, 0x06, 0xeb5a);
-        rtl8168_mdio_write(tp, 0x06, 0x070c);
-        rtl8168_mdio_write(tp, 0x06, 0x031e);
-        rtl8168_mdio_write(tp, 0x06, 0x20e6);
-        rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-        rtl8168_mdio_write(tp, 0x06, 0xe7e0);
-        rtl8168_mdio_write(tp, 0x06, 0xebe0);
-        rtl8168_mdio_write(tp, 0x06, 0xe0fc);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfd);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b80);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x22bf);
-        rtl8168_mdio_write(tp, 0x06, 0x4616);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x50e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b44);
-        rtl8168_mdio_write(tp, 0x06, 0x1f01);
-        rtl8168_mdio_write(tp, 0x06, 0x9e15);
-        rtl8168_mdio_write(tp, 0x06, 0xe58b);
-        rtl8168_mdio_write(tp, 0x06, 0x44ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2907);
-        rtl8168_mdio_write(tp, 0x06, 0xac28);
-        rtl8168_mdio_write(tp, 0x06, 0x04d1);
-        rtl8168_mdio_write(tp, 0x06, 0x01ae);
-        rtl8168_mdio_write(tp, 0x06, 0x02d1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85b0);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x7def);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad26);
-        rtl8168_mdio_write(tp, 0x06, 0x30e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe036);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0x37e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b3f);
-        rtl8168_mdio_write(tp, 0x06, 0x1f10);
-        rtl8168_mdio_write(tp, 0x06, 0x9e23);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x3fac);
-        rtl8168_mdio_write(tp, 0x06, 0x200b);
-        rtl8168_mdio_write(tp, 0x06, 0xac21);
-        rtl8168_mdio_write(tp, 0x06, 0x0dac);
-        rtl8168_mdio_write(tp, 0x06, 0x250f);
-        rtl8168_mdio_write(tp, 0x06, 0xac27);
-        rtl8168_mdio_write(tp, 0x06, 0x11ae);
-        rtl8168_mdio_write(tp, 0x06, 0x1202);
-        rtl8168_mdio_write(tp, 0x06, 0x2c47);
-        rtl8168_mdio_write(tp, 0x06, 0xae0d);
-        rtl8168_mdio_write(tp, 0x06, 0x0285);
-        rtl8168_mdio_write(tp, 0x06, 0x4fae);
-        rtl8168_mdio_write(tp, 0x06, 0x0802);
-        rtl8168_mdio_write(tp, 0x06, 0x2c69);
-        rtl8168_mdio_write(tp, 0x06, 0xae03);
-        rtl8168_mdio_write(tp, 0x06, 0x022c);
-        rtl8168_mdio_write(tp, 0x06, 0x7cfc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x6902);
-        rtl8168_mdio_write(tp, 0x06, 0x856c);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x14e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe015);
-        rtl8168_mdio_write(tp, 0x06, 0xad26);
-        rtl8168_mdio_write(tp, 0x06, 0x08d1);
-        rtl8168_mdio_write(tp, 0x06, 0x1ebf);
-        rtl8168_mdio_write(tp, 0x06, 0x2cd9);
-        rtl8168_mdio_write(tp, 0x06, 0x0238);
-        rtl8168_mdio_write(tp, 0x06, 0x7def);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x2fd0);
-        rtl8168_mdio_write(tp, 0x06, 0x0b02);
-        rtl8168_mdio_write(tp, 0x06, 0x3682);
-        rtl8168_mdio_write(tp, 0x06, 0x5882);
-        rtl8168_mdio_write(tp, 0x06, 0x7882);
-        rtl8168_mdio_write(tp, 0x06, 0x9f24);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x32e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b33);
-        rtl8168_mdio_write(tp, 0x06, 0x1f10);
-        rtl8168_mdio_write(tp, 0x06, 0x9e1a);
-        rtl8168_mdio_write(tp, 0x06, 0x10e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b32);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x28e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe029);
-        rtl8168_mdio_write(tp, 0x06, 0xf72c);
-        rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-        rtl8168_mdio_write(tp, 0x06, 0x28e5);
-        rtl8168_mdio_write(tp, 0x06, 0xe029);
-        rtl8168_mdio_write(tp, 0x06, 0xf62c);
-        rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-        rtl8168_mdio_write(tp, 0x06, 0x28e5);
-        rtl8168_mdio_write(tp, 0x06, 0xe029);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0x00e1);
-        rtl8168_mdio_write(tp, 0x06, 0x4077);
-        rtl8168_mdio_write(tp, 0x06, 0xe140);
-        rtl8168_mdio_write(tp, 0x06, 0x52e0);
-        rtl8168_mdio_write(tp, 0x06, 0xeed9);
-        rtl8168_mdio_write(tp, 0x06, 0xe04c);
-        rtl8168_mdio_write(tp, 0x06, 0xbbe0);
-        rtl8168_mdio_write(tp, 0x06, 0x2a00);
-        rtl8168_mdio_write(tp, 0x05, 0xe142);
-        gphy_val = rtl8168_mdio_read(tp, 0x06);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp,0x06, gphy_val);
-        rtl8168_mdio_write(tp, 0x05, 0xe140);
-        gphy_val = rtl8168_mdio_read(tp, 0x06);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp,0x06, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp,0x1f, 0x0005);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x00);
-                if (gphy_val & BIT_7)
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val |= BIT_1;
-        if (tp->RequiredSecLanDonglePatch)
-                gphy_val &= ~BIT_2;
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0003);
-        rtl8168_mdio_write(tp, 0x09, 0xA20F);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0003);
-        rtl8168_mdio_write(tp, 0x01, 0x328A);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x00, 0x9200);
-}
-
-static void
-rtl8168_set_phy_mcu_8168f_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val,i;
-
-        rtl8168_mdio_write(tp,0x1f, 0x0000);
-        rtl8168_mdio_write(tp,0x00, 0x1800);
-        gphy_val = rtl8168_mdio_read(tp, 0x15);
-        gphy_val &= ~(BIT_12);
-        rtl8168_mdio_write(tp,0x15, gphy_val);
-        rtl8168_mdio_write(tp,0x00, 0x4800);
-        rtl8168_mdio_write(tp,0x1f, 0x0007);
-        rtl8168_mdio_write(tp,0x1e, 0x002f);
-        for (i = 0; i < 1000; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x1c);
-                if (gphy_val & 0x0080)
-                        break;
-        }
-        rtl8168_mdio_write(tp,0x1f, 0x0000);
-        rtl8168_mdio_write(tp,0x00, 0x1800);
-        rtl8168_mdio_write(tp,0x1f, 0x0007);
-        rtl8168_mdio_write(tp,0x1e, 0x0023);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x18);
-                if (!(gphy_val & 0x0001))
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0307);
-        rtl8168_mdio_write(tp, 0x15, 0x0098);
-        rtl8168_mdio_write(tp, 0x19, 0x7c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x0099);
-        rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00eb);
-        rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00f8);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00fe);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0f);
-        rtl8168_mdio_write(tp, 0x15, 0x00db);
-        rtl8168_mdio_write(tp, 0x19, 0x6f09);
-        rtl8168_mdio_write(tp, 0x15, 0x00dc);
-        rtl8168_mdio_write(tp, 0x19, 0xaefd);
-        rtl8168_mdio_write(tp, 0x15, 0x00dd);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00de);
-        rtl8168_mdio_write(tp, 0x19, 0xc60b);
-        rtl8168_mdio_write(tp, 0x15, 0x00df);
-        rtl8168_mdio_write(tp, 0x19, 0x00fa);
-        rtl8168_mdio_write(tp, 0x15, 0x00e0);
-        rtl8168_mdio_write(tp, 0x19, 0x30e1);
-        rtl8168_mdio_write(tp, 0x15, 0x020c);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x020e);
-        rtl8168_mdio_write(tp, 0x19, 0x9813);
-        rtl8168_mdio_write(tp, 0x15, 0x020f);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x0210);
-        rtl8168_mdio_write(tp, 0x19, 0x930f);
-        rtl8168_mdio_write(tp, 0x15, 0x0211);
-        rtl8168_mdio_write(tp, 0x19, 0x9206);
-        rtl8168_mdio_write(tp, 0x15, 0x0212);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0213);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0214);
-        rtl8168_mdio_write(tp, 0x19, 0x588f);
-        rtl8168_mdio_write(tp, 0x15, 0x0215);
-        rtl8168_mdio_write(tp, 0x19, 0x5520);
-        rtl8168_mdio_write(tp, 0x15, 0x0216);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x0217);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0218);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0219);
-        rtl8168_mdio_write(tp, 0x19, 0x588d);
-        rtl8168_mdio_write(tp, 0x15, 0x021a);
-        rtl8168_mdio_write(tp, 0x19, 0x5540);
-        rtl8168_mdio_write(tp, 0x15, 0x021b);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x021c);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x021d);
-        rtl8168_mdio_write(tp, 0x19, 0x6840);
-        rtl8168_mdio_write(tp, 0x15, 0x021e);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x021f);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0220);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x0221);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x0222);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x0223);
-        rtl8168_mdio_write(tp, 0x19, 0x6840);
-        rtl8168_mdio_write(tp, 0x15, 0x0224);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0225);
-        rtl8168_mdio_write(tp, 0x19, 0x3231);
-        rtl8168_mdio_write(tp, 0x15, 0x0000);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0300);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x05, 0x8000);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0x48f7);
-        rtl8168_mdio_write(tp, 0x06, 0x00e0);
-        rtl8168_mdio_write(tp, 0x06, 0xfff7);
-        rtl8168_mdio_write(tp, 0x06, 0xa080);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0xf602);
-        rtl8168_mdio_write(tp, 0x06, 0x011b);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x2802);
-        rtl8168_mdio_write(tp, 0x06, 0x0135);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x4502);
-        rtl8168_mdio_write(tp, 0x06, 0x015f);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0x6b02);
-        rtl8168_mdio_write(tp, 0x06, 0x80e5);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x88e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b89);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8a1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8b);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8c1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01a0);
-        rtl8168_mdio_write(tp, 0x06, 0x00c7);
-        rtl8168_mdio_write(tp, 0x06, 0xaebb);
-        rtl8168_mdio_write(tp, 0x06, 0xbf8b);
-        rtl8168_mdio_write(tp, 0x06, 0x88ec);
-        rtl8168_mdio_write(tp, 0x06, 0x0019);
-        rtl8168_mdio_write(tp, 0x06, 0xa98b);
-        rtl8168_mdio_write(tp, 0x06, 0x90f9);
-        rtl8168_mdio_write(tp, 0x06, 0xeeff);
-        rtl8168_mdio_write(tp, 0x06, 0xf600);
-        rtl8168_mdio_write(tp, 0x06, 0xeeff);
-        rtl8168_mdio_write(tp, 0x06, 0xf7fe);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf81);
-        rtl8168_mdio_write(tp, 0x06, 0x9802);
-        rtl8168_mdio_write(tp, 0x06, 0x39f3);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf81);
-        rtl8168_mdio_write(tp, 0x06, 0x9b02);
-        rtl8168_mdio_write(tp, 0x06, 0x39f3);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8dad);
-        rtl8168_mdio_write(tp, 0x06, 0x2014);
-        rtl8168_mdio_write(tp, 0x06, 0xee8b);
-        rtl8168_mdio_write(tp, 0x06, 0x8d00);
-        rtl8168_mdio_write(tp, 0x06, 0xe08a);
-        rtl8168_mdio_write(tp, 0x06, 0x5a78);
-        rtl8168_mdio_write(tp, 0x06, 0x039e);
-        rtl8168_mdio_write(tp, 0x06, 0x0902);
-        rtl8168_mdio_write(tp, 0x06, 0x05fc);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0x8802);
-        rtl8168_mdio_write(tp, 0x06, 0x32dd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ac);
-        rtl8168_mdio_write(tp, 0x06, 0x261a);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x81ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2114);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x85ac);
-        rtl8168_mdio_write(tp, 0x06, 0x200e);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x85ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2308);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x87ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2402);
-        rtl8168_mdio_write(tp, 0x06, 0xae38);
-        rtl8168_mdio_write(tp, 0x06, 0x021a);
-        rtl8168_mdio_write(tp, 0x06, 0xd6ee);
-        rtl8168_mdio_write(tp, 0x06, 0xe41c);
-        rtl8168_mdio_write(tp, 0x06, 0x04ee);
-        rtl8168_mdio_write(tp, 0x06, 0xe41d);
-        rtl8168_mdio_write(tp, 0x06, 0x04e2);
-        rtl8168_mdio_write(tp, 0x06, 0xe07c);
-        rtl8168_mdio_write(tp, 0x06, 0xe3e0);
-        rtl8168_mdio_write(tp, 0x06, 0x7de0);
-        rtl8168_mdio_write(tp, 0x06, 0xe038);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0x39ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2e1b);
-        rtl8168_mdio_write(tp, 0x06, 0xad39);
-        rtl8168_mdio_write(tp, 0x06, 0x0dd1);
-        rtl8168_mdio_write(tp, 0x06, 0x01bf);
-        rtl8168_mdio_write(tp, 0x06, 0x22c8);
-        rtl8168_mdio_write(tp, 0x06, 0x0239);
-        rtl8168_mdio_write(tp, 0x06, 0xf302);
-        rtl8168_mdio_write(tp, 0x06, 0x21f0);
-        rtl8168_mdio_write(tp, 0x06, 0xae0b);
-        rtl8168_mdio_write(tp, 0x06, 0xac38);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0602);
-        rtl8168_mdio_write(tp, 0x06, 0x222d);
-        rtl8168_mdio_write(tp, 0x06, 0x0222);
-        rtl8168_mdio_write(tp, 0x06, 0x7202);
-        rtl8168_mdio_write(tp, 0x06, 0x1ae7);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x201a);
-        rtl8168_mdio_write(tp, 0x06, 0xf620);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x2afe);
-        rtl8168_mdio_write(tp, 0x06, 0x022c);
-        rtl8168_mdio_write(tp, 0x06, 0x5c02);
-        rtl8168_mdio_write(tp, 0x06, 0x03c5);
-        rtl8168_mdio_write(tp, 0x06, 0x0281);
-        rtl8168_mdio_write(tp, 0x06, 0x6702);
-        rtl8168_mdio_write(tp, 0x06, 0x2e4f);
-        rtl8168_mdio_write(tp, 0x06, 0x0204);
-        rtl8168_mdio_write(tp, 0x06, 0x8902);
-        rtl8168_mdio_write(tp, 0x06, 0x2f7a);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x210b);
-        rtl8168_mdio_write(tp, 0x06, 0xf621);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x0445);
-        rtl8168_mdio_write(tp, 0x06, 0x021c);
-        rtl8168_mdio_write(tp, 0x06, 0xb8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad22);
-        rtl8168_mdio_write(tp, 0x06, 0x08f6);
-        rtl8168_mdio_write(tp, 0x06, 0x22e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x0235);
-        rtl8168_mdio_write(tp, 0x06, 0xd4e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad23);
-        rtl8168_mdio_write(tp, 0x06, 0x08f6);
-        rtl8168_mdio_write(tp, 0x06, 0x23e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x0231);
-        rtl8168_mdio_write(tp, 0x06, 0xc8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad24);
-        rtl8168_mdio_write(tp, 0x06, 0x05f6);
-        rtl8168_mdio_write(tp, 0x06, 0x24e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2505);
-        rtl8168_mdio_write(tp, 0x06, 0xf625);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ee0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad26);
-        rtl8168_mdio_write(tp, 0x06, 0x08f6);
-        rtl8168_mdio_write(tp, 0x06, 0x26e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x022d);
-        rtl8168_mdio_write(tp, 0x06, 0x6ae0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x05f6);
-        rtl8168_mdio_write(tp, 0x06, 0x27e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x0203);
-        rtl8168_mdio_write(tp, 0x06, 0x8bfc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b80);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x22bf);
-        rtl8168_mdio_write(tp, 0x06, 0x479a);
-        rtl8168_mdio_write(tp, 0x06, 0x0239);
-        rtl8168_mdio_write(tp, 0x06, 0xc6e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b44);
-        rtl8168_mdio_write(tp, 0x06, 0x1f01);
-        rtl8168_mdio_write(tp, 0x06, 0x9e15);
-        rtl8168_mdio_write(tp, 0x06, 0xe58b);
-        rtl8168_mdio_write(tp, 0x06, 0x44ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2907);
-        rtl8168_mdio_write(tp, 0x06, 0xac28);
-        rtl8168_mdio_write(tp, 0x06, 0x04d1);
-        rtl8168_mdio_write(tp, 0x06, 0x01ae);
-        rtl8168_mdio_write(tp, 0x06, 0x02d1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x819e);
-        rtl8168_mdio_write(tp, 0x06, 0x0239);
-        rtl8168_mdio_write(tp, 0x06, 0xf3ef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0x00e1);
-        rtl8168_mdio_write(tp, 0x06, 0x4077);
-        rtl8168_mdio_write(tp, 0x06, 0xe140);
-        rtl8168_mdio_write(tp, 0x06, 0xbbe0);
-        rtl8168_mdio_write(tp, 0x06, 0x2a00);
-        rtl8168_mdio_write(tp, 0x05, 0xe142);
-        gphy_val = rtl8168_mdio_read(tp, 0x06);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp, 0x06, gphy_val);
-        rtl8168_mdio_write(tp, 0x05, 0xe140);
-        gphy_val = rtl8168_mdio_read(tp, 0x06);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp, 0x06, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp,0x1f, 0x0005);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x00);
-                if (gphy_val & BIT_7)
-                        break;
-        }
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val |= BIT_1;
-        if (tp->RequiredSecLanDonglePatch)
-                gphy_val &= ~BIT_2;
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x00, 0x9200);
-}
-
-static void
-rtl8168_set_phy_mcu_8411_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val,i;
-
-        rtl8168_mdio_write(tp,0x1f, 0x0000);
-        rtl8168_mdio_write(tp,0x00, 0x1800);
-        gphy_val = rtl8168_mdio_read(tp, 0x15);
-        gphy_val &= ~(BIT_12);
-        rtl8168_mdio_write(tp,0x15, gphy_val);
-        rtl8168_mdio_write(tp,0x00, 0x4800);
-        rtl8168_mdio_write(tp,0x1f, 0x0007);
-        rtl8168_mdio_write(tp,0x1e, 0x002f);
-        for (i = 0; i < 1000; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x1c);
-                if (gphy_val & 0x0080)
-                        break;
-        }
-        rtl8168_mdio_write(tp,0x1f, 0x0000);
-        rtl8168_mdio_write(tp,0x00, 0x1800);
-        rtl8168_mdio_write(tp,0x1f, 0x0007);
-        rtl8168_mdio_write(tp,0x1e, 0x0023);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x18);
-                if (!(gphy_val & 0x0001))
-                        break;
-        }
-        rtl8168_mdio_write(tp,0x1f, 0x0005);
-        rtl8168_mdio_write(tp,0x05, 0xfff6);
-        rtl8168_mdio_write(tp,0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x1f, 0x0007);
-        rtl8168_mdio_write(tp, 0x1e, 0x0023);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0307);
-        rtl8168_mdio_write(tp, 0x15, 0x0098);
-        rtl8168_mdio_write(tp, 0x19, 0x7c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x0099);
-        rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00eb);
-        rtl8168_mdio_write(tp, 0x19, 0x6c0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00f8);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00fe);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0f);
-        rtl8168_mdio_write(tp, 0x15, 0x00db);
-        rtl8168_mdio_write(tp, 0x19, 0x6f09);
-        rtl8168_mdio_write(tp, 0x15, 0x00dc);
-        rtl8168_mdio_write(tp, 0x19, 0xaefd);
-        rtl8168_mdio_write(tp, 0x15, 0x00dd);
-        rtl8168_mdio_write(tp, 0x19, 0x6f0b);
-        rtl8168_mdio_write(tp, 0x15, 0x00de);
-        rtl8168_mdio_write(tp, 0x19, 0xc60b);
-        rtl8168_mdio_write(tp, 0x15, 0x00df);
-        rtl8168_mdio_write(tp, 0x19, 0x00fa);
-        rtl8168_mdio_write(tp, 0x15, 0x00e0);
-        rtl8168_mdio_write(tp, 0x19, 0x30e1);
-        rtl8168_mdio_write(tp, 0x15, 0x020c);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x020e);
-        rtl8168_mdio_write(tp, 0x19, 0x9813);
-        rtl8168_mdio_write(tp, 0x15, 0x020f);
-        rtl8168_mdio_write(tp, 0x19, 0x7801);
-        rtl8168_mdio_write(tp, 0x15, 0x0210);
-        rtl8168_mdio_write(tp, 0x19, 0x930f);
-        rtl8168_mdio_write(tp, 0x15, 0x0211);
-        rtl8168_mdio_write(tp, 0x19, 0x9206);
-        rtl8168_mdio_write(tp, 0x15, 0x0212);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0213);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0214);
-        rtl8168_mdio_write(tp, 0x19, 0x588f);
-        rtl8168_mdio_write(tp, 0x15, 0x0215);
-        rtl8168_mdio_write(tp, 0x19, 0x5520);
-        rtl8168_mdio_write(tp, 0x15, 0x0216);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x0217);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0218);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0219);
-        rtl8168_mdio_write(tp, 0x19, 0x588d);
-        rtl8168_mdio_write(tp, 0x15, 0x021a);
-        rtl8168_mdio_write(tp, 0x19, 0x5540);
-        rtl8168_mdio_write(tp, 0x15, 0x021b);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x021c);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x021d);
-        rtl8168_mdio_write(tp, 0x19, 0x6840);
-        rtl8168_mdio_write(tp, 0x15, 0x021e);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x021f);
-        rtl8168_mdio_write(tp, 0x19, 0x4002);
-        rtl8168_mdio_write(tp, 0x15, 0x0220);
-        rtl8168_mdio_write(tp, 0x19, 0x3224);
-        rtl8168_mdio_write(tp, 0x15, 0x0221);
-        rtl8168_mdio_write(tp, 0x19, 0x9e03);
-        rtl8168_mdio_write(tp, 0x15, 0x0222);
-        rtl8168_mdio_write(tp, 0x19, 0x7c40);
-        rtl8168_mdio_write(tp, 0x15, 0x0223);
-        rtl8168_mdio_write(tp, 0x19, 0x6840);
-        rtl8168_mdio_write(tp, 0x15, 0x0224);
-        rtl8168_mdio_write(tp, 0x19, 0x7800);
-        rtl8168_mdio_write(tp, 0x15, 0x0225);
-        rtl8168_mdio_write(tp, 0x19, 0x3231);
-        rtl8168_mdio_write(tp, 0x15, 0x0000);
-        rtl8168_mdio_write(tp, 0x16, 0x0306);
-        rtl8168_mdio_write(tp, 0x16, 0x0300);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-        rtl8168_mdio_write(tp, 0x06, 0x0080);
-        rtl8168_mdio_write(tp, 0x05, 0x8000);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0x48f7);
-        rtl8168_mdio_write(tp, 0x06, 0x00e0);
-        rtl8168_mdio_write(tp, 0x06, 0xfff7);
-        rtl8168_mdio_write(tp, 0x06, 0xa080);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0xf602);
-        rtl8168_mdio_write(tp, 0x06, 0x011e);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x2b02);
-        rtl8168_mdio_write(tp, 0x06, 0x8077);
-        rtl8168_mdio_write(tp, 0x06, 0x0201);
-        rtl8168_mdio_write(tp, 0x06, 0x4802);
-        rtl8168_mdio_write(tp, 0x06, 0x0162);
-        rtl8168_mdio_write(tp, 0x06, 0x0280);
-        rtl8168_mdio_write(tp, 0x06, 0x9402);
-        rtl8168_mdio_write(tp, 0x06, 0x810e);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x88e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b89);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8a1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8b);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8c1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0x1e01);
-        rtl8168_mdio_write(tp, 0x06, 0xe18b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e1e);
-        rtl8168_mdio_write(tp, 0x06, 0x01a0);
-        rtl8168_mdio_write(tp, 0x06, 0x00c7);
-        rtl8168_mdio_write(tp, 0x06, 0xaebb);
-        rtl8168_mdio_write(tp, 0x06, 0xd481);
-        rtl8168_mdio_write(tp, 0x06, 0xd4e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b92);
-        rtl8168_mdio_write(tp, 0x06, 0xe58b);
-        rtl8168_mdio_write(tp, 0x06, 0x9302);
-        rtl8168_mdio_write(tp, 0x06, 0x2e5a);
-        rtl8168_mdio_write(tp, 0x06, 0xbf8b);
-        rtl8168_mdio_write(tp, 0x06, 0x88ec);
-        rtl8168_mdio_write(tp, 0x06, 0x0019);
-        rtl8168_mdio_write(tp, 0x06, 0xa98b);
-        rtl8168_mdio_write(tp, 0x06, 0x90f9);
-        rtl8168_mdio_write(tp, 0x06, 0xeeff);
-        rtl8168_mdio_write(tp, 0x06, 0xf600);
-        rtl8168_mdio_write(tp, 0x06, 0xeeff);
-        rtl8168_mdio_write(tp, 0x06, 0xf7fc);
-        rtl8168_mdio_write(tp, 0x06, 0xd100);
-        rtl8168_mdio_write(tp, 0x06, 0xbf83);
-        rtl8168_mdio_write(tp, 0x06, 0x3c02);
-        rtl8168_mdio_write(tp, 0x06, 0x3a21);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf83);
-        rtl8168_mdio_write(tp, 0x06, 0x3f02);
-        rtl8168_mdio_write(tp, 0x06, 0x3a21);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8aad);
-        rtl8168_mdio_write(tp, 0x06, 0x2014);
-        rtl8168_mdio_write(tp, 0x06, 0xee8b);
-        rtl8168_mdio_write(tp, 0x06, 0x8a00);
-        rtl8168_mdio_write(tp, 0x06, 0x0220);
-        rtl8168_mdio_write(tp, 0x06, 0x8be0);
-        rtl8168_mdio_write(tp, 0x06, 0xe426);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e4);
-        rtl8168_mdio_write(tp, 0x06, 0x27ee);
-        rtl8168_mdio_write(tp, 0x06, 0xe426);
-        rtl8168_mdio_write(tp, 0x06, 0x23e5);
-        rtl8168_mdio_write(tp, 0x06, 0xe427);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x14ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8d);
-        rtl8168_mdio_write(tp, 0x06, 0x00e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8a5a);
-        rtl8168_mdio_write(tp, 0x06, 0x7803);
-        rtl8168_mdio_write(tp, 0x06, 0x9e09);
-        rtl8168_mdio_write(tp, 0x06, 0x0206);
-        rtl8168_mdio_write(tp, 0x06, 0x2802);
-        rtl8168_mdio_write(tp, 0x06, 0x80b1);
-        rtl8168_mdio_write(tp, 0x06, 0x0232);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xf9e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b81);
-        rtl8168_mdio_write(tp, 0x06, 0xac26);
-        rtl8168_mdio_write(tp, 0x06, 0x1ae0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b81);
-        rtl8168_mdio_write(tp, 0x06, 0xac21);
-        rtl8168_mdio_write(tp, 0x06, 0x14e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xac20);
-        rtl8168_mdio_write(tp, 0x06, 0x0ee0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xac23);
-        rtl8168_mdio_write(tp, 0x06, 0x08e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b87);
-        rtl8168_mdio_write(tp, 0x06, 0xac24);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x3802);
-        rtl8168_mdio_write(tp, 0x06, 0x1b02);
-        rtl8168_mdio_write(tp, 0x06, 0xeee4);
-        rtl8168_mdio_write(tp, 0x06, 0x1c04);
-        rtl8168_mdio_write(tp, 0x06, 0xeee4);
-        rtl8168_mdio_write(tp, 0x06, 0x1d04);
-        rtl8168_mdio_write(tp, 0x06, 0xe2e0);
-        rtl8168_mdio_write(tp, 0x06, 0x7ce3);
-        rtl8168_mdio_write(tp, 0x06, 0xe07d);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x38e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe039);
-        rtl8168_mdio_write(tp, 0x06, 0xad2e);
-        rtl8168_mdio_write(tp, 0x06, 0x1bad);
-        rtl8168_mdio_write(tp, 0x06, 0x390d);
-        rtl8168_mdio_write(tp, 0x06, 0xd101);
-        rtl8168_mdio_write(tp, 0x06, 0xbf22);
-        rtl8168_mdio_write(tp, 0x06, 0xe802);
-        rtl8168_mdio_write(tp, 0x06, 0x3a21);
-        rtl8168_mdio_write(tp, 0x06, 0x0222);
-        rtl8168_mdio_write(tp, 0x06, 0x10ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0bac);
-        rtl8168_mdio_write(tp, 0x06, 0x3802);
-        rtl8168_mdio_write(tp, 0x06, 0xae06);
-        rtl8168_mdio_write(tp, 0x06, 0x0222);
-        rtl8168_mdio_write(tp, 0x06, 0x4d02);
-        rtl8168_mdio_write(tp, 0x06, 0x2292);
-        rtl8168_mdio_write(tp, 0x06, 0x021b);
-        rtl8168_mdio_write(tp, 0x06, 0x13fd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x1af6);
-        rtl8168_mdio_write(tp, 0x06, 0x20e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x022b);
-        rtl8168_mdio_write(tp, 0x06, 0x1e02);
-        rtl8168_mdio_write(tp, 0x06, 0x82ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0203);
-        rtl8168_mdio_write(tp, 0x06, 0xc002);
-        rtl8168_mdio_write(tp, 0x06, 0x827d);
-        rtl8168_mdio_write(tp, 0x06, 0x022e);
-        rtl8168_mdio_write(tp, 0x06, 0x6f02);
-        rtl8168_mdio_write(tp, 0x06, 0x047b);
-        rtl8168_mdio_write(tp, 0x06, 0x022f);
-        rtl8168_mdio_write(tp, 0x06, 0x9ae0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad21);
-        rtl8168_mdio_write(tp, 0x06, 0x0bf6);
-        rtl8168_mdio_write(tp, 0x06, 0x21e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0x0281);
-        rtl8168_mdio_write(tp, 0x06, 0x9002);
-        rtl8168_mdio_write(tp, 0x06, 0x1cd9);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2208);
-        rtl8168_mdio_write(tp, 0x06, 0xf622);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x35f4);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2308);
-        rtl8168_mdio_write(tp, 0x06, 0xf623);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x31e8);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2405);
-        rtl8168_mdio_write(tp, 0x06, 0xf624);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ee0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xad25);
-        rtl8168_mdio_write(tp, 0x06, 0x05f6);
-        rtl8168_mdio_write(tp, 0x06, 0x25e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b8e);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2608);
-        rtl8168_mdio_write(tp, 0x06, 0xf626);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x2d8a);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x8ead);
-        rtl8168_mdio_write(tp, 0x06, 0x2705);
-        rtl8168_mdio_write(tp, 0x06, 0xf627);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x8e02);
-        rtl8168_mdio_write(tp, 0x06, 0x0386);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x06, 0xef69);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x00e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe001);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x32e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b40);
-        rtl8168_mdio_write(tp, 0x06, 0xf720);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x40bf);
-        rtl8168_mdio_write(tp, 0x06, 0x32c1);
-        rtl8168_mdio_write(tp, 0x06, 0x0239);
-        rtl8168_mdio_write(tp, 0x06, 0xf4ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2821);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x20e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe021);
-        rtl8168_mdio_write(tp, 0x06, 0xad20);
-        rtl8168_mdio_write(tp, 0x06, 0x18e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b40);
-        rtl8168_mdio_write(tp, 0x06, 0xf620);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x40ee);
-        rtl8168_mdio_write(tp, 0x06, 0x8b3b);
-        rtl8168_mdio_write(tp, 0x06, 0xffe0);
-        rtl8168_mdio_write(tp, 0x06, 0x8a8a);
-        rtl8168_mdio_write(tp, 0x06, 0xe18a);
-        rtl8168_mdio_write(tp, 0x06, 0x8be4);
-        rtl8168_mdio_write(tp, 0x06, 0xe000);
-        rtl8168_mdio_write(tp, 0x06, 0xe5e0);
-        rtl8168_mdio_write(tp, 0x06, 0x01ef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x06, 0xface);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69fa);
-        rtl8168_mdio_write(tp, 0x06, 0xd401);
-        rtl8168_mdio_write(tp, 0x06, 0x55b4);
-        rtl8168_mdio_write(tp, 0x06, 0xfebf);
-        rtl8168_mdio_write(tp, 0x06, 0x1c5e);
-        rtl8168_mdio_write(tp, 0x06, 0x0239);
-        rtl8168_mdio_write(tp, 0x06, 0xf4ac);
-        rtl8168_mdio_write(tp, 0x06, 0x280b);
-        rtl8168_mdio_write(tp, 0x06, 0xbf1c);
-        rtl8168_mdio_write(tp, 0x06, 0x5b02);
-        rtl8168_mdio_write(tp, 0x06, 0x39f4);
-        rtl8168_mdio_write(tp, 0x06, 0xac28);
-        rtl8168_mdio_write(tp, 0x06, 0x49ae);
-        rtl8168_mdio_write(tp, 0x06, 0x64bf);
-        rtl8168_mdio_write(tp, 0x06, 0x1c5b);
-        rtl8168_mdio_write(tp, 0x06, 0x0239);
-        rtl8168_mdio_write(tp, 0x06, 0xf4ac);
-        rtl8168_mdio_write(tp, 0x06, 0x285b);
-        rtl8168_mdio_write(tp, 0x06, 0xd000);
-        rtl8168_mdio_write(tp, 0x06, 0x0282);
-        rtl8168_mdio_write(tp, 0x06, 0x62ac);
-        rtl8168_mdio_write(tp, 0x06, 0x2105);
-        rtl8168_mdio_write(tp, 0x06, 0xac22);
-        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-        rtl8168_mdio_write(tp, 0x06, 0x4ebf);
-        rtl8168_mdio_write(tp, 0x06, 0xe0c4);
-        rtl8168_mdio_write(tp, 0x06, 0xbe85);
-        rtl8168_mdio_write(tp, 0x06, 0xecd2);
-        rtl8168_mdio_write(tp, 0x06, 0x04d8);
-        rtl8168_mdio_write(tp, 0x06, 0x19d9);
-        rtl8168_mdio_write(tp, 0x06, 0x1907);
-        rtl8168_mdio_write(tp, 0x06, 0xdc19);
-        rtl8168_mdio_write(tp, 0x06, 0xdd19);
-        rtl8168_mdio_write(tp, 0x06, 0x0789);
-        rtl8168_mdio_write(tp, 0x06, 0x89ef);
-        rtl8168_mdio_write(tp, 0x06, 0x645e);
-        rtl8168_mdio_write(tp, 0x06, 0x07ff);
-        rtl8168_mdio_write(tp, 0x06, 0x0d65);
-        rtl8168_mdio_write(tp, 0x06, 0x5cf8);
-        rtl8168_mdio_write(tp, 0x06, 0x001e);
-        rtl8168_mdio_write(tp, 0x06, 0x46dc);
-        rtl8168_mdio_write(tp, 0x06, 0x19dd);
-        rtl8168_mdio_write(tp, 0x06, 0x19b2);
-        rtl8168_mdio_write(tp, 0x06, 0xe2d4);
-        rtl8168_mdio_write(tp, 0x06, 0x0001);
-        rtl8168_mdio_write(tp, 0x06, 0xbf1c);
-        rtl8168_mdio_write(tp, 0x06, 0x5b02);
-        rtl8168_mdio_write(tp, 0x06, 0x3a21);
-        rtl8168_mdio_write(tp, 0x06, 0xae1d);
-        rtl8168_mdio_write(tp, 0x06, 0xbee0);
-        rtl8168_mdio_write(tp, 0x06, 0xc4bf);
-        rtl8168_mdio_write(tp, 0x06, 0x85ec);
-        rtl8168_mdio_write(tp, 0x06, 0xd204);
-        rtl8168_mdio_write(tp, 0x06, 0xd819);
-        rtl8168_mdio_write(tp, 0x06, 0xd919);
-        rtl8168_mdio_write(tp, 0x06, 0x07dc);
-        rtl8168_mdio_write(tp, 0x06, 0x19dd);
-        rtl8168_mdio_write(tp, 0x06, 0x1907);
-        rtl8168_mdio_write(tp, 0x06, 0xb2f4);
-        rtl8168_mdio_write(tp, 0x06, 0xd400);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x1c5b);
-        rtl8168_mdio_write(tp, 0x06, 0x023a);
-        rtl8168_mdio_write(tp, 0x06, 0x21fe);
-        rtl8168_mdio_write(tp, 0x06, 0xef96);
-        rtl8168_mdio_write(tp, 0x06, 0xfec6);
-        rtl8168_mdio_write(tp, 0x06, 0xfefd);
-        rtl8168_mdio_write(tp, 0x06, 0xfc05);
-        rtl8168_mdio_write(tp, 0x06, 0xf9e2);
-        rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-        rtl8168_mdio_write(tp, 0x06, 0xe3e0);
-        rtl8168_mdio_write(tp, 0x06, 0xeb5a);
-        rtl8168_mdio_write(tp, 0x06, 0x070c);
-        rtl8168_mdio_write(tp, 0x06, 0x031e);
-        rtl8168_mdio_write(tp, 0x06, 0x20e6);
-        rtl8168_mdio_write(tp, 0x06, 0xe0ea);
-        rtl8168_mdio_write(tp, 0x06, 0xe7e0);
-        rtl8168_mdio_write(tp, 0x06, 0xebe0);
-        rtl8168_mdio_write(tp, 0x06, 0xe0fc);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0xfdfd);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x69e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b80);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x22bf);
-        rtl8168_mdio_write(tp, 0x06, 0x47ba);
-        rtl8168_mdio_write(tp, 0x06, 0x0239);
-        rtl8168_mdio_write(tp, 0x06, 0xf4e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b44);
-        rtl8168_mdio_write(tp, 0x06, 0x1f01);
-        rtl8168_mdio_write(tp, 0x06, 0x9e15);
-        rtl8168_mdio_write(tp, 0x06, 0xe58b);
-        rtl8168_mdio_write(tp, 0x06, 0x44ad);
-        rtl8168_mdio_write(tp, 0x06, 0x2907);
-        rtl8168_mdio_write(tp, 0x06, 0xac28);
-        rtl8168_mdio_write(tp, 0x06, 0x04d1);
-        rtl8168_mdio_write(tp, 0x06, 0x01ae);
-        rtl8168_mdio_write(tp, 0x06, 0x02d1);
-        rtl8168_mdio_write(tp, 0x06, 0x00bf);
-        rtl8168_mdio_write(tp, 0x06, 0x8342);
-        rtl8168_mdio_write(tp, 0x06, 0x023a);
-        rtl8168_mdio_write(tp, 0x06, 0x21ef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad26);
-        rtl8168_mdio_write(tp, 0x06, 0x30e0);
-        rtl8168_mdio_write(tp, 0x06, 0xe036);
-        rtl8168_mdio_write(tp, 0x06, 0xe1e0);
-        rtl8168_mdio_write(tp, 0x06, 0x37e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b3f);
-        rtl8168_mdio_write(tp, 0x06, 0x1f10);
-        rtl8168_mdio_write(tp, 0x06, 0x9e23);
-        rtl8168_mdio_write(tp, 0x06, 0xe48b);
-        rtl8168_mdio_write(tp, 0x06, 0x3fac);
-        rtl8168_mdio_write(tp, 0x06, 0x200b);
-        rtl8168_mdio_write(tp, 0x06, 0xac21);
-        rtl8168_mdio_write(tp, 0x06, 0x0dac);
-        rtl8168_mdio_write(tp, 0x06, 0x250f);
-        rtl8168_mdio_write(tp, 0x06, 0xac27);
-        rtl8168_mdio_write(tp, 0x06, 0x11ae);
-        rtl8168_mdio_write(tp, 0x06, 0x1202);
-        rtl8168_mdio_write(tp, 0x06, 0x2cb5);
-        rtl8168_mdio_write(tp, 0x06, 0xae0d);
-        rtl8168_mdio_write(tp, 0x06, 0x0282);
-        rtl8168_mdio_write(tp, 0x06, 0xe7ae);
-        rtl8168_mdio_write(tp, 0x06, 0x0802);
-        rtl8168_mdio_write(tp, 0x06, 0x2cd7);
-        rtl8168_mdio_write(tp, 0x06, 0xae03);
-        rtl8168_mdio_write(tp, 0x06, 0x022c);
-        rtl8168_mdio_write(tp, 0x06, 0xeafc);
-        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-        rtl8168_mdio_write(tp, 0x06, 0x6902);
-        rtl8168_mdio_write(tp, 0x06, 0x8304);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x14e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe015);
-        rtl8168_mdio_write(tp, 0x06, 0xad26);
-        rtl8168_mdio_write(tp, 0x06, 0x08d1);
-        rtl8168_mdio_write(tp, 0x06, 0x1ebf);
-        rtl8168_mdio_write(tp, 0x06, 0x2d47);
-        rtl8168_mdio_write(tp, 0x06, 0x023a);
-        rtl8168_mdio_write(tp, 0x06, 0x21ef);
-        rtl8168_mdio_write(tp, 0x06, 0x96fe);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x06, 0x8b85);
-        rtl8168_mdio_write(tp, 0x06, 0xad27);
-        rtl8168_mdio_write(tp, 0x06, 0x2fd0);
-        rtl8168_mdio_write(tp, 0x06, 0x0b02);
-        rtl8168_mdio_write(tp, 0x06, 0x3826);
-        rtl8168_mdio_write(tp, 0x06, 0x5882);
-        rtl8168_mdio_write(tp, 0x06, 0x7882);
-        rtl8168_mdio_write(tp, 0x06, 0x9f24);
-        rtl8168_mdio_write(tp, 0x06, 0xe08b);
-        rtl8168_mdio_write(tp, 0x06, 0x32e1);
-        rtl8168_mdio_write(tp, 0x06, 0x8b33);
-        rtl8168_mdio_write(tp, 0x06, 0x1f10);
-        rtl8168_mdio_write(tp, 0x06, 0x9e1a);
-        rtl8168_mdio_write(tp, 0x06, 0x10e4);
-        rtl8168_mdio_write(tp, 0x06, 0x8b32);
-        rtl8168_mdio_write(tp, 0x06, 0xe0e0);
-        rtl8168_mdio_write(tp, 0x06, 0x28e1);
-        rtl8168_mdio_write(tp, 0x06, 0xe029);
-        rtl8168_mdio_write(tp, 0x06, 0xf72c);
-        rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-        rtl8168_mdio_write(tp, 0x06, 0x28e5);
-        rtl8168_mdio_write(tp, 0x06, 0xe029);
-        rtl8168_mdio_write(tp, 0x06, 0xf62c);
-        rtl8168_mdio_write(tp, 0x06, 0xe4e0);
-        rtl8168_mdio_write(tp, 0x06, 0x28e5);
-        rtl8168_mdio_write(tp, 0x06, 0xe029);
-        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-        rtl8168_mdio_write(tp, 0x06, 0x00e1);
-        rtl8168_mdio_write(tp, 0x06, 0x4077);
-        rtl8168_mdio_write(tp, 0x06, 0xe140);
-        rtl8168_mdio_write(tp, 0x06, 0xbbe0);
-        rtl8168_mdio_write(tp, 0x06, 0x2a00);
-        rtl8168_mdio_write(tp, 0x05, 0xe142);
-        gphy_val = rtl8168_mdio_read(tp, 0x06);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp,0x06, gphy_val);
-        rtl8168_mdio_write(tp, 0x05, 0xe140);
-        gphy_val = rtl8168_mdio_read(tp, 0x06);
-        gphy_val |= BIT_0;
-        rtl8168_mdio_write(tp,0x06, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        rtl8168_mdio_write(tp,0x1f, 0x0005);
-        for (i = 0; i < 200; i++) {
-                udelay(100);
-                gphy_val = rtl8168_mdio_read(tp, 0x00);
-                if (gphy_val & BIT_7)
-                        break;
-        }
-        rtl8168_mdio_write(tp,0x1f, 0x0007);
-        rtl8168_mdio_write(tp,0x1e, 0x0023);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val |= BIT_1;
-        if (tp->RequiredSecLanDonglePatch)
-                gphy_val &= ~BIT_2;
-        rtl8168_mdio_write(tp,0x17, gphy_val);
-        rtl8168_mdio_write(tp,0x1f, 0x0000);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0003);
-        rtl8168_mdio_write(tp, 0x09, 0xA20F);
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0003);
-        rtl8168_mdio_write(tp, 0x01, 0x328A);
-        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-        rtl8168_mdio_write(tp,0x1f, 0x0000);
-        rtl8168_mdio_write(tp,0x00, 0x9200);
-}
-
-static void
-rtl8168_set_phy_mcu_8168g_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val;
-
-        rtl8168_set_phy_mcu_patch_request(tp);
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8146);
-        rtl8168_mdio_write(tp, 0x14, 0x2300);
-        rtl8168_mdio_write(tp, 0x13, 0xB820);
-        rtl8168_mdio_write(tp, 0x14, 0x0210);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0xB820);
-        rtl8168_mdio_write(tp, 0x14, 0x0290);
-        rtl8168_mdio_write(tp, 0x13, 0xA012);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xA014);
-        rtl8168_mdio_write(tp, 0x14, 0x2c04);
-        rtl8168_mdio_write(tp, 0x14, 0x2c0c);
-        rtl8168_mdio_write(tp, 0x14, 0x2c6c);
-        rtl8168_mdio_write(tp, 0x14, 0x2d0d);
-        rtl8168_mdio_write(tp, 0x14, 0x31ce);
-        rtl8168_mdio_write(tp, 0x14, 0x506d);
-        rtl8168_mdio_write(tp, 0x14, 0xd708);
-        rtl8168_mdio_write(tp, 0x14, 0x3108);
-        rtl8168_mdio_write(tp, 0x14, 0x106d);
-        rtl8168_mdio_write(tp, 0x14, 0x1560);
-        rtl8168_mdio_write(tp, 0x14, 0x15a9);
-        rtl8168_mdio_write(tp, 0x14, 0x206e);
-        rtl8168_mdio_write(tp, 0x14, 0x175b);
-        rtl8168_mdio_write(tp, 0x14, 0x6062);
-        rtl8168_mdio_write(tp, 0x14, 0xd700);
-        rtl8168_mdio_write(tp, 0x14, 0x5fae);
-        rtl8168_mdio_write(tp, 0x14, 0xd708);
-        rtl8168_mdio_write(tp, 0x14, 0x3107);
-        rtl8168_mdio_write(tp, 0x14, 0x4c1e);
-        rtl8168_mdio_write(tp, 0x14, 0x4169);
-        rtl8168_mdio_write(tp, 0x14, 0x316a);
-        rtl8168_mdio_write(tp, 0x14, 0x0c19);
-        rtl8168_mdio_write(tp, 0x14, 0x31aa);
-        rtl8168_mdio_write(tp, 0x14, 0x0c19);
-        rtl8168_mdio_write(tp, 0x14, 0x2c1b);
-        rtl8168_mdio_write(tp, 0x14, 0x5e62);
-        rtl8168_mdio_write(tp, 0x14, 0x26b5);
-        rtl8168_mdio_write(tp, 0x14, 0x31ab);
-        rtl8168_mdio_write(tp, 0x14, 0x5c1e);
-        rtl8168_mdio_write(tp, 0x14, 0x2c0c);
-        rtl8168_mdio_write(tp, 0x14, 0xc040);
-        rtl8168_mdio_write(tp, 0x14, 0x8808);
-        rtl8168_mdio_write(tp, 0x14, 0xc520);
-        rtl8168_mdio_write(tp, 0x14, 0xc421);
-        rtl8168_mdio_write(tp, 0x14, 0xd05a);
-        rtl8168_mdio_write(tp, 0x14, 0xd19a);
-        rtl8168_mdio_write(tp, 0x14, 0xd709);
-        rtl8168_mdio_write(tp, 0x14, 0x608f);
-        rtl8168_mdio_write(tp, 0x14, 0xd06b);
-        rtl8168_mdio_write(tp, 0x14, 0xd18a);
-        rtl8168_mdio_write(tp, 0x14, 0x2c2c);
-        rtl8168_mdio_write(tp, 0x14, 0xd0be);
-        rtl8168_mdio_write(tp, 0x14, 0xd188);
-        rtl8168_mdio_write(tp, 0x14, 0x2c2c);
-        rtl8168_mdio_write(tp, 0x14, 0xd708);
-        rtl8168_mdio_write(tp, 0x14, 0x4072);
-        rtl8168_mdio_write(tp, 0x14, 0xc104);
-        rtl8168_mdio_write(tp, 0x14, 0x2c3e);
-        rtl8168_mdio_write(tp, 0x14, 0x4076);
-        rtl8168_mdio_write(tp, 0x14, 0xc110);
-        rtl8168_mdio_write(tp, 0x14, 0x2c3e);
-        rtl8168_mdio_write(tp, 0x14, 0x4071);
-        rtl8168_mdio_write(tp, 0x14, 0xc102);
-        rtl8168_mdio_write(tp, 0x14, 0x2c3e);
-        rtl8168_mdio_write(tp, 0x14, 0x4070);
-        rtl8168_mdio_write(tp, 0x14, 0xc101);
-        rtl8168_mdio_write(tp, 0x14, 0x2c3e);
-        rtl8168_mdio_write(tp, 0x14, 0x175b);
-        rtl8168_mdio_write(tp, 0x14, 0xd709);
-        rtl8168_mdio_write(tp, 0x14, 0x3390);
-        rtl8168_mdio_write(tp, 0x14, 0x5c39);
-        rtl8168_mdio_write(tp, 0x14, 0x2c4e);
-        rtl8168_mdio_write(tp, 0x14, 0x175b);
-        rtl8168_mdio_write(tp, 0x14, 0xd708);
-        rtl8168_mdio_write(tp, 0x14, 0x6193);
-        rtl8168_mdio_write(tp, 0x14, 0xd709);
-        rtl8168_mdio_write(tp, 0x14, 0x5f9d);
-        rtl8168_mdio_write(tp, 0x14, 0x408b);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x6042);
-        rtl8168_mdio_write(tp, 0x14, 0xb401);
-        rtl8168_mdio_write(tp, 0x14, 0x175b);
-        rtl8168_mdio_write(tp, 0x14, 0xd708);
-        rtl8168_mdio_write(tp, 0x14, 0x6073);
-        rtl8168_mdio_write(tp, 0x14, 0x5fbc);
-        rtl8168_mdio_write(tp, 0x14, 0x2c4d);
-        rtl8168_mdio_write(tp, 0x14, 0x26ed);
-        rtl8168_mdio_write(tp, 0x14, 0xb280);
-        rtl8168_mdio_write(tp, 0x14, 0xa841);
-        rtl8168_mdio_write(tp, 0x14, 0x9420);
-        rtl8168_mdio_write(tp, 0x14, 0x8710);
-        rtl8168_mdio_write(tp, 0x14, 0xd709);
-        rtl8168_mdio_write(tp, 0x14, 0x42ec);
-        rtl8168_mdio_write(tp, 0x14, 0x606d);
-        rtl8168_mdio_write(tp, 0x14, 0xd207);
-        rtl8168_mdio_write(tp, 0x14, 0x2c57);
-        rtl8168_mdio_write(tp, 0x14, 0xd203);
-        rtl8168_mdio_write(tp, 0x14, 0x33ff);
-        rtl8168_mdio_write(tp, 0x14, 0x563b);
-        rtl8168_mdio_write(tp, 0x14, 0x3275);
-        rtl8168_mdio_write(tp, 0x14, 0x7c5e);
-        rtl8168_mdio_write(tp, 0x14, 0xb240);
-        rtl8168_mdio_write(tp, 0x14, 0xb402);
-        rtl8168_mdio_write(tp, 0x14, 0x263b);
-        rtl8168_mdio_write(tp, 0x14, 0x6096);
-        rtl8168_mdio_write(tp, 0x14, 0xb240);
-        rtl8168_mdio_write(tp, 0x14, 0xb406);
-        rtl8168_mdio_write(tp, 0x14, 0x263b);
-        rtl8168_mdio_write(tp, 0x14, 0x31d7);
-        rtl8168_mdio_write(tp, 0x14, 0x7c67);
-        rtl8168_mdio_write(tp, 0x14, 0xb240);
-        rtl8168_mdio_write(tp, 0x14, 0xb40e);
-        rtl8168_mdio_write(tp, 0x14, 0x263b);
-        rtl8168_mdio_write(tp, 0x14, 0xb410);
-        rtl8168_mdio_write(tp, 0x14, 0x8802);
-        rtl8168_mdio_write(tp, 0x14, 0xb240);
-        rtl8168_mdio_write(tp, 0x14, 0x940e);
-        rtl8168_mdio_write(tp, 0x14, 0x263b);
-        rtl8168_mdio_write(tp, 0x14, 0xba04);
-        rtl8168_mdio_write(tp, 0x14, 0x1cd6);
-        rtl8168_mdio_write(tp, 0x14, 0xa902);
-        rtl8168_mdio_write(tp, 0x14, 0xd711);
-        rtl8168_mdio_write(tp, 0x14, 0x4045);
-        rtl8168_mdio_write(tp, 0x14, 0xa980);
-        rtl8168_mdio_write(tp, 0x14, 0x3003);
-        rtl8168_mdio_write(tp, 0x14, 0x59b1);
-        rtl8168_mdio_write(tp, 0x14, 0xa540);
-        rtl8168_mdio_write(tp, 0x14, 0xa601);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4043);
-        rtl8168_mdio_write(tp, 0x14, 0xa910);
-        rtl8168_mdio_write(tp, 0x14, 0xd711);
-        rtl8168_mdio_write(tp, 0x14, 0x60a0);
-        rtl8168_mdio_write(tp, 0x14, 0xca33);
-        rtl8168_mdio_write(tp, 0x14, 0xcb33);
-        rtl8168_mdio_write(tp, 0x14, 0xa941);
-        rtl8168_mdio_write(tp, 0x14, 0x2c82);
-        rtl8168_mdio_write(tp, 0x14, 0xcaff);
-        rtl8168_mdio_write(tp, 0x14, 0xcbff);
-        rtl8168_mdio_write(tp, 0x14, 0xa921);
-        rtl8168_mdio_write(tp, 0x14, 0xce02);
-        rtl8168_mdio_write(tp, 0x14, 0xe070);
-        rtl8168_mdio_write(tp, 0x14, 0x0f10);
-        rtl8168_mdio_write(tp, 0x14, 0xaf01);
-        rtl8168_mdio_write(tp, 0x14, 0x8f01);
-        rtl8168_mdio_write(tp, 0x14, 0x1766);
-        rtl8168_mdio_write(tp, 0x14, 0x8e02);
-        rtl8168_mdio_write(tp, 0x14, 0x1787);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x609c);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7fa4);
-        rtl8168_mdio_write(tp, 0x14, 0x2cd4);
-        rtl8168_mdio_write(tp, 0x14, 0x1ce9);
-        rtl8168_mdio_write(tp, 0x14, 0xce04);
-        rtl8168_mdio_write(tp, 0x14, 0xe070);
-        rtl8168_mdio_write(tp, 0x14, 0x0f20);
-        rtl8168_mdio_write(tp, 0x14, 0xaf01);
-        rtl8168_mdio_write(tp, 0x14, 0x8f01);
-        rtl8168_mdio_write(tp, 0x14, 0x1766);
-        rtl8168_mdio_write(tp, 0x14, 0x8e04);
-        rtl8168_mdio_write(tp, 0x14, 0x6044);
-        rtl8168_mdio_write(tp, 0x14, 0x2cd4);
-        rtl8168_mdio_write(tp, 0x14, 0xa520);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4043);
-        rtl8168_mdio_write(tp, 0x14, 0x2cc1);
-        rtl8168_mdio_write(tp, 0x14, 0xe00f);
-        rtl8168_mdio_write(tp, 0x14, 0x0501);
-        rtl8168_mdio_write(tp, 0x14, 0x1cef);
-        rtl8168_mdio_write(tp, 0x14, 0xb801);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x4060);
-        rtl8168_mdio_write(tp, 0x14, 0x7fc4);
-        rtl8168_mdio_write(tp, 0x14, 0x2cd4);
-        rtl8168_mdio_write(tp, 0x14, 0x1cf5);
-        rtl8168_mdio_write(tp, 0x14, 0xe00f);
-        rtl8168_mdio_write(tp, 0x14, 0x0502);
-        rtl8168_mdio_write(tp, 0x14, 0x1cef);
-        rtl8168_mdio_write(tp, 0x14, 0xb802);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x4061);
-        rtl8168_mdio_write(tp, 0x14, 0x7fc4);
-        rtl8168_mdio_write(tp, 0x14, 0x2cd4);
-        rtl8168_mdio_write(tp, 0x14, 0x1cf5);
-        rtl8168_mdio_write(tp, 0x14, 0xe00f);
-        rtl8168_mdio_write(tp, 0x14, 0x0504);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x6099);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7fa4);
-        rtl8168_mdio_write(tp, 0x14, 0x2cd4);
-        rtl8168_mdio_write(tp, 0x14, 0xc17f);
-        rtl8168_mdio_write(tp, 0x14, 0xc200);
-        rtl8168_mdio_write(tp, 0x14, 0xc43f);
-        rtl8168_mdio_write(tp, 0x14, 0xcc03);
-        rtl8168_mdio_write(tp, 0x14, 0xa701);
-        rtl8168_mdio_write(tp, 0x14, 0xa510);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4018);
-        rtl8168_mdio_write(tp, 0x14, 0x9910);
-        rtl8168_mdio_write(tp, 0x14, 0x8510);
-        rtl8168_mdio_write(tp, 0x14, 0x2860);
-        rtl8168_mdio_write(tp, 0x14, 0xe00f);
-        rtl8168_mdio_write(tp, 0x14, 0x0504);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x6099);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7fa4);
-        rtl8168_mdio_write(tp, 0x14, 0x2cd4);
-        rtl8168_mdio_write(tp, 0x14, 0xa608);
-        rtl8168_mdio_write(tp, 0x14, 0xc17d);
-        rtl8168_mdio_write(tp, 0x14, 0xc200);
-        rtl8168_mdio_write(tp, 0x14, 0xc43f);
-        rtl8168_mdio_write(tp, 0x14, 0xcc03);
-        rtl8168_mdio_write(tp, 0x14, 0xa701);
-        rtl8168_mdio_write(tp, 0x14, 0xa510);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4018);
-        rtl8168_mdio_write(tp, 0x14, 0x9910);
-        rtl8168_mdio_write(tp, 0x14, 0x8510);
-        rtl8168_mdio_write(tp, 0x14, 0x2926);
-        rtl8168_mdio_write(tp, 0x14, 0x1792);
-        rtl8168_mdio_write(tp, 0x14, 0x27db);
-        rtl8168_mdio_write(tp, 0x14, 0xc000);
-        rtl8168_mdio_write(tp, 0x14, 0xc100);
-        rtl8168_mdio_write(tp, 0x14, 0xc200);
-        rtl8168_mdio_write(tp, 0x14, 0xc300);
-        rtl8168_mdio_write(tp, 0x14, 0xc400);
-        rtl8168_mdio_write(tp, 0x14, 0xc500);
-        rtl8168_mdio_write(tp, 0x14, 0xc600);
-        rtl8168_mdio_write(tp, 0x14, 0xc7c1);
-        rtl8168_mdio_write(tp, 0x14, 0xc800);
-        rtl8168_mdio_write(tp, 0x14, 0xcc00);
-        rtl8168_mdio_write(tp, 0x14, 0x0800);
-        rtl8168_mdio_write(tp, 0x14, 0xca0f);
-        rtl8168_mdio_write(tp, 0x14, 0xcbff);
-        rtl8168_mdio_write(tp, 0x14, 0xa901);
-        rtl8168_mdio_write(tp, 0x14, 0x8902);
-        rtl8168_mdio_write(tp, 0x14, 0xc900);
-        rtl8168_mdio_write(tp, 0x14, 0xca00);
-        rtl8168_mdio_write(tp, 0x14, 0xcb00);
-        rtl8168_mdio_write(tp, 0x14, 0x0800);
-        rtl8168_mdio_write(tp, 0x14, 0xb804);
-        rtl8168_mdio_write(tp, 0x14, 0x0800);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x6044);
-        rtl8168_mdio_write(tp, 0x14, 0x9804);
-        rtl8168_mdio_write(tp, 0x14, 0x0800);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x6099);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7fa4);
-        rtl8168_mdio_write(tp, 0x14, 0x2cd4);
-        rtl8168_mdio_write(tp, 0x14, 0x0800);
-        rtl8168_mdio_write(tp, 0x14, 0xa510);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x6098);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7fa4);
-        rtl8168_mdio_write(tp, 0x14, 0x2cd4);
-        rtl8168_mdio_write(tp, 0x14, 0x8510);
-        rtl8168_mdio_write(tp, 0x14, 0x0800);
-        rtl8168_mdio_write(tp, 0x14, 0xd711);
-        rtl8168_mdio_write(tp, 0x14, 0x3003);
-        rtl8168_mdio_write(tp, 0x14, 0x1d01);
-        rtl8168_mdio_write(tp, 0x14, 0x2d0b);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x60be);
-        rtl8168_mdio_write(tp, 0x14, 0xe060);
-        rtl8168_mdio_write(tp, 0x14, 0x0920);
-        rtl8168_mdio_write(tp, 0x14, 0x1cd6);
-        rtl8168_mdio_write(tp, 0x14, 0x2c89);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x3063);
-        rtl8168_mdio_write(tp, 0x14, 0x1948);
-        rtl8168_mdio_write(tp, 0x14, 0x288a);
-        rtl8168_mdio_write(tp, 0x14, 0x1cd6);
-        rtl8168_mdio_write(tp, 0x14, 0x29bd);
-        rtl8168_mdio_write(tp, 0x14, 0xa802);
-        rtl8168_mdio_write(tp, 0x14, 0xa303);
-        rtl8168_mdio_write(tp, 0x14, 0x843f);
-        rtl8168_mdio_write(tp, 0x14, 0x81ff);
-        rtl8168_mdio_write(tp, 0x14, 0x8208);
-        rtl8168_mdio_write(tp, 0x14, 0xa201);
-        rtl8168_mdio_write(tp, 0x14, 0xc001);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x30a0);
-        rtl8168_mdio_write(tp, 0x14, 0x0d1c);
-        rtl8168_mdio_write(tp, 0x14, 0x30a0);
-        rtl8168_mdio_write(tp, 0x14, 0x3d13);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7f4c);
-        rtl8168_mdio_write(tp, 0x14, 0x2ab6);
-        rtl8168_mdio_write(tp, 0x14, 0xe003);
-        rtl8168_mdio_write(tp, 0x14, 0x0202);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x6090);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7fac);
-        rtl8168_mdio_write(tp, 0x14, 0x2ab6);
-        rtl8168_mdio_write(tp, 0x14, 0xa20c);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x6091);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7fac);
-        rtl8168_mdio_write(tp, 0x14, 0x2ab6);
-        rtl8168_mdio_write(tp, 0x14, 0x820e);
-        rtl8168_mdio_write(tp, 0x14, 0xa3e0);
-        rtl8168_mdio_write(tp, 0x14, 0xa520);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x609d);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7fac);
-        rtl8168_mdio_write(tp, 0x14, 0x2ab6);
-        rtl8168_mdio_write(tp, 0x14, 0x8520);
-        rtl8168_mdio_write(tp, 0x14, 0x6703);
-        rtl8168_mdio_write(tp, 0x14, 0x2d34);
-        rtl8168_mdio_write(tp, 0x14, 0xa13e);
-        rtl8168_mdio_write(tp, 0x14, 0xc001);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4000);
-        rtl8168_mdio_write(tp, 0x14, 0x6046);
-        rtl8168_mdio_write(tp, 0x14, 0x2d0d);
-        rtl8168_mdio_write(tp, 0x14, 0xa43f);
-        rtl8168_mdio_write(tp, 0x14, 0xa101);
-        rtl8168_mdio_write(tp, 0x14, 0xc020);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x3121);
-        rtl8168_mdio_write(tp, 0x14, 0x0d45);
-        rtl8168_mdio_write(tp, 0x14, 0x30c0);
-        rtl8168_mdio_write(tp, 0x14, 0x3d0d);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7f4c);
-        rtl8168_mdio_write(tp, 0x14, 0x2ab6);
-        rtl8168_mdio_write(tp, 0x14, 0xa540);
-        rtl8168_mdio_write(tp, 0x14, 0xc001);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4001);
-        rtl8168_mdio_write(tp, 0x14, 0xe00f);
-        rtl8168_mdio_write(tp, 0x14, 0x0501);
-        rtl8168_mdio_write(tp, 0x14, 0x1dac);
-        rtl8168_mdio_write(tp, 0x14, 0xc1c4);
-        rtl8168_mdio_write(tp, 0x14, 0xa268);
-        rtl8168_mdio_write(tp, 0x14, 0xa303);
-        rtl8168_mdio_write(tp, 0x14, 0x8420);
-        rtl8168_mdio_write(tp, 0x14, 0xe00f);
-        rtl8168_mdio_write(tp, 0x14, 0x0502);
-        rtl8168_mdio_write(tp, 0x14, 0x1dac);
-        rtl8168_mdio_write(tp, 0x14, 0xc002);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4000);
-        rtl8168_mdio_write(tp, 0x14, 0x8208);
-        rtl8168_mdio_write(tp, 0x14, 0x8410);
-        rtl8168_mdio_write(tp, 0x14, 0xa121);
-        rtl8168_mdio_write(tp, 0x14, 0xc002);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4000);
-        rtl8168_mdio_write(tp, 0x14, 0x8120);
-        rtl8168_mdio_write(tp, 0x14, 0x8180);
-        rtl8168_mdio_write(tp, 0x14, 0x1d97);
-        rtl8168_mdio_write(tp, 0x14, 0xa180);
-        rtl8168_mdio_write(tp, 0x14, 0xa13a);
-        rtl8168_mdio_write(tp, 0x14, 0x8240);
-        rtl8168_mdio_write(tp, 0x14, 0xa430);
-        rtl8168_mdio_write(tp, 0x14, 0xc010);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x30e1);
-        rtl8168_mdio_write(tp, 0x14, 0x0abc);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7f8c);
-        rtl8168_mdio_write(tp, 0x14, 0x2ab6);
-        rtl8168_mdio_write(tp, 0x14, 0xa480);
-        rtl8168_mdio_write(tp, 0x14, 0xa230);
-        rtl8168_mdio_write(tp, 0x14, 0xa303);
-        rtl8168_mdio_write(tp, 0x14, 0xc001);
-        rtl8168_mdio_write(tp, 0x14, 0xd70c);
-        rtl8168_mdio_write(tp, 0x14, 0x4124);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x6120);
-        rtl8168_mdio_write(tp, 0x14, 0xd711);
-        rtl8168_mdio_write(tp, 0x14, 0x3128);
-        rtl8168_mdio_write(tp, 0x14, 0x3d76);
-        rtl8168_mdio_write(tp, 0x14, 0x2d70);
-        rtl8168_mdio_write(tp, 0x14, 0xa801);
-        rtl8168_mdio_write(tp, 0x14, 0x2d6c);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4000);
-        rtl8168_mdio_write(tp, 0x14, 0xe018);
-        rtl8168_mdio_write(tp, 0x14, 0x0208);
-        rtl8168_mdio_write(tp, 0x14, 0xa1f8);
-        rtl8168_mdio_write(tp, 0x14, 0x8480);
-        rtl8168_mdio_write(tp, 0x14, 0xc004);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4000);
-        rtl8168_mdio_write(tp, 0x14, 0x6046);
-        rtl8168_mdio_write(tp, 0x14, 0x2d0d);
-        rtl8168_mdio_write(tp, 0x14, 0xa43f);
-        rtl8168_mdio_write(tp, 0x14, 0xa105);
-        rtl8168_mdio_write(tp, 0x14, 0x8228);
-        rtl8168_mdio_write(tp, 0x14, 0xc004);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4000);
-        rtl8168_mdio_write(tp, 0x14, 0x81bc);
-        rtl8168_mdio_write(tp, 0x14, 0xa220);
-        rtl8168_mdio_write(tp, 0x14, 0x1d97);
-        rtl8168_mdio_write(tp, 0x14, 0x8220);
-        rtl8168_mdio_write(tp, 0x14, 0xa1bc);
-        rtl8168_mdio_write(tp, 0x14, 0xc040);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x30e1);
-        rtl8168_mdio_write(tp, 0x14, 0x0abc);
-        rtl8168_mdio_write(tp, 0x14, 0x30e1);
-        rtl8168_mdio_write(tp, 0x14, 0x3d0d);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7f4c);
-        rtl8168_mdio_write(tp, 0x14, 0x2ab6);
-        rtl8168_mdio_write(tp, 0x14, 0xa802);
-        rtl8168_mdio_write(tp, 0x14, 0xd70c);
-        rtl8168_mdio_write(tp, 0x14, 0x4244);
-        rtl8168_mdio_write(tp, 0x14, 0xa301);
-        rtl8168_mdio_write(tp, 0x14, 0xc004);
-        rtl8168_mdio_write(tp, 0x14, 0xd711);
-        rtl8168_mdio_write(tp, 0x14, 0x3128);
-        rtl8168_mdio_write(tp, 0x14, 0x3da5);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x5f80);
-        rtl8168_mdio_write(tp, 0x14, 0xd711);
-        rtl8168_mdio_write(tp, 0x14, 0x3109);
-        rtl8168_mdio_write(tp, 0x14, 0x3da7);
-        rtl8168_mdio_write(tp, 0x14, 0x2dab);
-        rtl8168_mdio_write(tp, 0x14, 0xa801);
-        rtl8168_mdio_write(tp, 0x14, 0x2d9a);
-        rtl8168_mdio_write(tp, 0x14, 0xa802);
-        rtl8168_mdio_write(tp, 0x14, 0xc004);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x4000);
-        rtl8168_mdio_write(tp, 0x14, 0x0800);
-        rtl8168_mdio_write(tp, 0x14, 0xa510);
-        rtl8168_mdio_write(tp, 0x14, 0xd710);
-        rtl8168_mdio_write(tp, 0x14, 0x609a);
-        rtl8168_mdio_write(tp, 0x14, 0xd71e);
-        rtl8168_mdio_write(tp, 0x14, 0x7fac);
-        rtl8168_mdio_write(tp, 0x14, 0x2ab6);
-        rtl8168_mdio_write(tp, 0x14, 0x8510);
-        rtl8168_mdio_write(tp, 0x14, 0x0800);
-        rtl8168_mdio_write(tp, 0x13, 0xA01A);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xA006);
-        rtl8168_mdio_write(tp, 0x14, 0x0ad6);
-        rtl8168_mdio_write(tp, 0x13, 0xA004);
-        rtl8168_mdio_write(tp, 0x14, 0x07f5);
-        rtl8168_mdio_write(tp, 0x13, 0xA002);
-        rtl8168_mdio_write(tp, 0x14, 0x06a9);
-        rtl8168_mdio_write(tp, 0x13, 0xA000);
-        rtl8168_mdio_write(tp, 0x14, 0xf069);
-        rtl8168_mdio_write(tp, 0x13, 0xB820);
-        rtl8168_mdio_write(tp, 0x14, 0x0210);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x83a0);
-        rtl8168_mdio_write(tp, 0x14, 0xaf83);
-        rtl8168_mdio_write(tp, 0x14, 0xacaf);
-        rtl8168_mdio_write(tp, 0x14, 0x83b8);
-        rtl8168_mdio_write(tp, 0x14, 0xaf83);
-        rtl8168_mdio_write(tp, 0x14, 0xcdaf);
-        rtl8168_mdio_write(tp, 0x14, 0x83d3);
-        rtl8168_mdio_write(tp, 0x14, 0x0204);
-        rtl8168_mdio_write(tp, 0x14, 0x9a02);
-        rtl8168_mdio_write(tp, 0x14, 0x09a9);
-        rtl8168_mdio_write(tp, 0x14, 0x0284);
-        rtl8168_mdio_write(tp, 0x14, 0x61af);
-        rtl8168_mdio_write(tp, 0x14, 0x02fc);
-        rtl8168_mdio_write(tp, 0x14, 0xad20);
-        rtl8168_mdio_write(tp, 0x14, 0x0302);
-        rtl8168_mdio_write(tp, 0x14, 0x867c);
-        rtl8168_mdio_write(tp, 0x14, 0xad21);
-        rtl8168_mdio_write(tp, 0x14, 0x0302);
-        rtl8168_mdio_write(tp, 0x14, 0x85c9);
-        rtl8168_mdio_write(tp, 0x14, 0xad22);
-        rtl8168_mdio_write(tp, 0x14, 0x0302);
-        rtl8168_mdio_write(tp, 0x14, 0x1bc0);
-        rtl8168_mdio_write(tp, 0x14, 0xaf17);
-        rtl8168_mdio_write(tp, 0x14, 0xe302);
-        rtl8168_mdio_write(tp, 0x14, 0x8703);
-        rtl8168_mdio_write(tp, 0x14, 0xaf18);
-        rtl8168_mdio_write(tp, 0x14, 0x6201);
-        rtl8168_mdio_write(tp, 0x14, 0x06e0);
-        rtl8168_mdio_write(tp, 0x14, 0x8148);
-        rtl8168_mdio_write(tp, 0x14, 0xaf3c);
-        rtl8168_mdio_write(tp, 0x14, 0x69f8);
-        rtl8168_mdio_write(tp, 0x14, 0xf9fa);
-        rtl8168_mdio_write(tp, 0x14, 0xef69);
-        rtl8168_mdio_write(tp, 0x14, 0xee80);
-        rtl8168_mdio_write(tp, 0x14, 0x10f7);
-        rtl8168_mdio_write(tp, 0x14, 0xee80);
-        rtl8168_mdio_write(tp, 0x14, 0x131f);
-        rtl8168_mdio_write(tp, 0x14, 0xd104);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0xf302);
-        rtl8168_mdio_write(tp, 0x14, 0x4259);
-        rtl8168_mdio_write(tp, 0x14, 0x0287);
-        rtl8168_mdio_write(tp, 0x14, 0x88bf);
-        rtl8168_mdio_write(tp, 0x14, 0x87cf);
-        rtl8168_mdio_write(tp, 0x14, 0xd7b8);
-        rtl8168_mdio_write(tp, 0x14, 0x22d0);
-        rtl8168_mdio_write(tp, 0x14, 0x0c02);
-        rtl8168_mdio_write(tp, 0x14, 0x4252);
-        rtl8168_mdio_write(tp, 0x14, 0xee80);
-        rtl8168_mdio_write(tp, 0x14, 0xcda0);
-        rtl8168_mdio_write(tp, 0x14, 0xee80);
-        rtl8168_mdio_write(tp, 0x14, 0xce8b);
-        rtl8168_mdio_write(tp, 0x14, 0xee80);
-        rtl8168_mdio_write(tp, 0x14, 0xd1f5);
-        rtl8168_mdio_write(tp, 0x14, 0xee80);
-        rtl8168_mdio_write(tp, 0x14, 0xd2a9);
-        rtl8168_mdio_write(tp, 0x14, 0xee80);
-        rtl8168_mdio_write(tp, 0x14, 0xd30a);
-        rtl8168_mdio_write(tp, 0x14, 0xee80);
-        rtl8168_mdio_write(tp, 0x14, 0xf010);
-        rtl8168_mdio_write(tp, 0x14, 0xee80);
-        rtl8168_mdio_write(tp, 0x14, 0xf38f);
-        rtl8168_mdio_write(tp, 0x14, 0xee81);
-        rtl8168_mdio_write(tp, 0x14, 0x011e);
-        rtl8168_mdio_write(tp, 0x14, 0xee81);
-        rtl8168_mdio_write(tp, 0x14, 0x0b4a);
-        rtl8168_mdio_write(tp, 0x14, 0xee81);
-        rtl8168_mdio_write(tp, 0x14, 0x0c7c);
-        rtl8168_mdio_write(tp, 0x14, 0xee81);
-        rtl8168_mdio_write(tp, 0x14, 0x127f);
-        rtl8168_mdio_write(tp, 0x14, 0xd100);
-        rtl8168_mdio_write(tp, 0x14, 0x0210);
-        rtl8168_mdio_write(tp, 0x14, 0xb5ee);
-        rtl8168_mdio_write(tp, 0x14, 0x8088);
-        rtl8168_mdio_write(tp, 0x14, 0xa4ee);
-        rtl8168_mdio_write(tp, 0x14, 0x8089);
-        rtl8168_mdio_write(tp, 0x14, 0x44ee);
-        rtl8168_mdio_write(tp, 0x14, 0x809a);
-        rtl8168_mdio_write(tp, 0x14, 0xa4ee);
-        rtl8168_mdio_write(tp, 0x14, 0x809b);
-        rtl8168_mdio_write(tp, 0x14, 0x44ee);
-        rtl8168_mdio_write(tp, 0x14, 0x809c);
-        rtl8168_mdio_write(tp, 0x14, 0xa7ee);
-        rtl8168_mdio_write(tp, 0x14, 0x80a5);
-        rtl8168_mdio_write(tp, 0x14, 0xa7d2);
-        rtl8168_mdio_write(tp, 0x14, 0x0002);
-        rtl8168_mdio_write(tp, 0x14, 0x0e66);
-        rtl8168_mdio_write(tp, 0x14, 0x0285);
-        rtl8168_mdio_write(tp, 0x14, 0xc0ee);
-        rtl8168_mdio_write(tp, 0x14, 0x87fc);
-        rtl8168_mdio_write(tp, 0x14, 0x00e0);
-        rtl8168_mdio_write(tp, 0x14, 0x8245);
-        rtl8168_mdio_write(tp, 0x14, 0xf622);
-        rtl8168_mdio_write(tp, 0x14, 0xe482);
-        rtl8168_mdio_write(tp, 0x14, 0x45ef);
-        rtl8168_mdio_write(tp, 0x14, 0x96fe);
-        rtl8168_mdio_write(tp, 0x14, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x14, 0x0402);
-        rtl8168_mdio_write(tp, 0x14, 0x847a);
-        rtl8168_mdio_write(tp, 0x14, 0x0284);
-        rtl8168_mdio_write(tp, 0x14, 0xb302);
-        rtl8168_mdio_write(tp, 0x14, 0x0cab);
-        rtl8168_mdio_write(tp, 0x14, 0x020c);
-        rtl8168_mdio_write(tp, 0x14, 0xc402);
-        rtl8168_mdio_write(tp, 0x14, 0x0cef);
-        rtl8168_mdio_write(tp, 0x14, 0x020d);
-        rtl8168_mdio_write(tp, 0x14, 0x0802);
-        rtl8168_mdio_write(tp, 0x14, 0x0d33);
-        rtl8168_mdio_write(tp, 0x14, 0x020c);
-        rtl8168_mdio_write(tp, 0x14, 0x3d04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x14, 0xef69);
-        rtl8168_mdio_write(tp, 0x14, 0xe182);
-        rtl8168_mdio_write(tp, 0x14, 0x2fac);
-        rtl8168_mdio_write(tp, 0x14, 0x291a);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x24ac);
-        rtl8168_mdio_write(tp, 0x14, 0x2102);
-        rtl8168_mdio_write(tp, 0x14, 0xae22);
-        rtl8168_mdio_write(tp, 0x14, 0x0210);
-        rtl8168_mdio_write(tp, 0x14, 0x57f6);
-        rtl8168_mdio_write(tp, 0x14, 0x21e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8224);
-        rtl8168_mdio_write(tp, 0x14, 0xd101);
-        rtl8168_mdio_write(tp, 0x14, 0xbf44);
-        rtl8168_mdio_write(tp, 0x14, 0xd202);
-        rtl8168_mdio_write(tp, 0x14, 0x4259);
-        rtl8168_mdio_write(tp, 0x14, 0xae10);
-        rtl8168_mdio_write(tp, 0x14, 0x0212);
-        rtl8168_mdio_write(tp, 0x14, 0x4cf6);
-        rtl8168_mdio_write(tp, 0x14, 0x29e5);
-        rtl8168_mdio_write(tp, 0x14, 0x822f);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x24f6);
-        rtl8168_mdio_write(tp, 0x14, 0x21e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8224);
-        rtl8168_mdio_write(tp, 0x14, 0xef96);
-        rtl8168_mdio_write(tp, 0x14, 0xfefc);
-        rtl8168_mdio_write(tp, 0x14, 0x04f8);
-        rtl8168_mdio_write(tp, 0x14, 0xe182);
-        rtl8168_mdio_write(tp, 0x14, 0x2fac);
-        rtl8168_mdio_write(tp, 0x14, 0x2a18);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x24ac);
-        rtl8168_mdio_write(tp, 0x14, 0x2202);
-        rtl8168_mdio_write(tp, 0x14, 0xae26);
-        rtl8168_mdio_write(tp, 0x14, 0x0284);
-        rtl8168_mdio_write(tp, 0x14, 0xf802);
-        rtl8168_mdio_write(tp, 0x14, 0x8565);
-        rtl8168_mdio_write(tp, 0x14, 0xd101);
-        rtl8168_mdio_write(tp, 0x14, 0xbf44);
-        rtl8168_mdio_write(tp, 0x14, 0xd502);
-        rtl8168_mdio_write(tp, 0x14, 0x4259);
-        rtl8168_mdio_write(tp, 0x14, 0xae0e);
-        rtl8168_mdio_write(tp, 0x14, 0x0284);
-        rtl8168_mdio_write(tp, 0x14, 0xea02);
-        rtl8168_mdio_write(tp, 0x14, 0x85a9);
-        rtl8168_mdio_write(tp, 0x14, 0xe182);
-        rtl8168_mdio_write(tp, 0x14, 0x2ff6);
-        rtl8168_mdio_write(tp, 0x14, 0x2ae5);
-        rtl8168_mdio_write(tp, 0x14, 0x822f);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x24f6);
-        rtl8168_mdio_write(tp, 0x14, 0x22e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8224);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf9e2);
-        rtl8168_mdio_write(tp, 0x14, 0x8011);
-        rtl8168_mdio_write(tp, 0x14, 0xad31);
-        rtl8168_mdio_write(tp, 0x14, 0x05d2);
-        rtl8168_mdio_write(tp, 0x14, 0x0002);
-        rtl8168_mdio_write(tp, 0x14, 0x0e66);
-        rtl8168_mdio_write(tp, 0x14, 0xfd04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x14, 0xfaef);
-        rtl8168_mdio_write(tp, 0x14, 0x69e0);
-        rtl8168_mdio_write(tp, 0x14, 0x8011);
-        rtl8168_mdio_write(tp, 0x14, 0xad21);
-        rtl8168_mdio_write(tp, 0x14, 0x5cbf);
-        rtl8168_mdio_write(tp, 0x14, 0x43be);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x97ac);
-        rtl8168_mdio_write(tp, 0x14, 0x281b);
-        rtl8168_mdio_write(tp, 0x14, 0xbf43);
-        rtl8168_mdio_write(tp, 0x14, 0xc102);
-        rtl8168_mdio_write(tp, 0x14, 0x4297);
-        rtl8168_mdio_write(tp, 0x14, 0xac28);
-        rtl8168_mdio_write(tp, 0x14, 0x12bf);
-        rtl8168_mdio_write(tp, 0x14, 0x43c7);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x97ac);
-        rtl8168_mdio_write(tp, 0x14, 0x2804);
-        rtl8168_mdio_write(tp, 0x14, 0xd300);
-        rtl8168_mdio_write(tp, 0x14, 0xae07);
-        rtl8168_mdio_write(tp, 0x14, 0xd306);
-        rtl8168_mdio_write(tp, 0x14, 0xaf85);
-        rtl8168_mdio_write(tp, 0x14, 0x56d3);
-        rtl8168_mdio_write(tp, 0x14, 0x03e0);
-        rtl8168_mdio_write(tp, 0x14, 0x8011);
-        rtl8168_mdio_write(tp, 0x14, 0xad26);
-        rtl8168_mdio_write(tp, 0x14, 0x25bf);
-        rtl8168_mdio_write(tp, 0x14, 0x4559);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x97e2);
-        rtl8168_mdio_write(tp, 0x14, 0x8073);
-        rtl8168_mdio_write(tp, 0x14, 0x0d21);
-        rtl8168_mdio_write(tp, 0x14, 0xf637);
-        rtl8168_mdio_write(tp, 0x14, 0x0d11);
-        rtl8168_mdio_write(tp, 0x14, 0xf62f);
-        rtl8168_mdio_write(tp, 0x14, 0x1b21);
-        rtl8168_mdio_write(tp, 0x14, 0xaa02);
-        rtl8168_mdio_write(tp, 0x14, 0xae10);
-        rtl8168_mdio_write(tp, 0x14, 0xe280);
-        rtl8168_mdio_write(tp, 0x14, 0x740d);
-        rtl8168_mdio_write(tp, 0x14, 0x21f6);
-        rtl8168_mdio_write(tp, 0x14, 0x371b);
-        rtl8168_mdio_write(tp, 0x14, 0x21aa);
-        rtl8168_mdio_write(tp, 0x14, 0x0313);
-        rtl8168_mdio_write(tp, 0x14, 0xae02);
-        rtl8168_mdio_write(tp, 0x14, 0x2b02);
-        rtl8168_mdio_write(tp, 0x14, 0x020e);
-        rtl8168_mdio_write(tp, 0x14, 0x5102);
-        rtl8168_mdio_write(tp, 0x14, 0x0e66);
-        rtl8168_mdio_write(tp, 0x14, 0x020f);
-        rtl8168_mdio_write(tp, 0x14, 0xa3ef);
-        rtl8168_mdio_write(tp, 0x14, 0x96fe);
-        rtl8168_mdio_write(tp, 0x14, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x14, 0x04f8);
-        rtl8168_mdio_write(tp, 0x14, 0xf9fa);
-        rtl8168_mdio_write(tp, 0x14, 0xef69);
-        rtl8168_mdio_write(tp, 0x14, 0xe080);
-        rtl8168_mdio_write(tp, 0x14, 0x12ad);
-        rtl8168_mdio_write(tp, 0x14, 0x2733);
-        rtl8168_mdio_write(tp, 0x14, 0xbf43);
-        rtl8168_mdio_write(tp, 0x14, 0xbe02);
-        rtl8168_mdio_write(tp, 0x14, 0x4297);
-        rtl8168_mdio_write(tp, 0x14, 0xac28);
-        rtl8168_mdio_write(tp, 0x14, 0x09bf);
-        rtl8168_mdio_write(tp, 0x14, 0x43c1);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x97ad);
-        rtl8168_mdio_write(tp, 0x14, 0x2821);
-        rtl8168_mdio_write(tp, 0x14, 0xbf45);
-        rtl8168_mdio_write(tp, 0x14, 0x5902);
-        rtl8168_mdio_write(tp, 0x14, 0x4297);
-        rtl8168_mdio_write(tp, 0x14, 0xe387);
-        rtl8168_mdio_write(tp, 0x14, 0xffd2);
-        rtl8168_mdio_write(tp, 0x14, 0x001b);
-        rtl8168_mdio_write(tp, 0x14, 0x45ac);
-        rtl8168_mdio_write(tp, 0x14, 0x2711);
-        rtl8168_mdio_write(tp, 0x14, 0xe187);
-        rtl8168_mdio_write(tp, 0x14, 0xfebf);
-        rtl8168_mdio_write(tp, 0x14, 0x87e4);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x590d);
-        rtl8168_mdio_write(tp, 0x14, 0x11bf);
-        rtl8168_mdio_write(tp, 0x14, 0x87e7);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x59ef);
-        rtl8168_mdio_write(tp, 0x14, 0x96fe);
-        rtl8168_mdio_write(tp, 0x14, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x14, 0x04f8);
-        rtl8168_mdio_write(tp, 0x14, 0xfaef);
-        rtl8168_mdio_write(tp, 0x14, 0x69d1);
-        rtl8168_mdio_write(tp, 0x14, 0x00bf);
-        rtl8168_mdio_write(tp, 0x14, 0x87e4);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x59bf);
-        rtl8168_mdio_write(tp, 0x14, 0x87e7);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x59ef);
-        rtl8168_mdio_write(tp, 0x14, 0x96fe);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xee87);
-        rtl8168_mdio_write(tp, 0x14, 0xff46);
-        rtl8168_mdio_write(tp, 0x14, 0xee87);
-        rtl8168_mdio_write(tp, 0x14, 0xfe01);
-        rtl8168_mdio_write(tp, 0x14, 0x04f8);
-        rtl8168_mdio_write(tp, 0x14, 0xfaef);
-        rtl8168_mdio_write(tp, 0x14, 0x69e0);
-        rtl8168_mdio_write(tp, 0x14, 0x8241);
-        rtl8168_mdio_write(tp, 0x14, 0xa000);
-        rtl8168_mdio_write(tp, 0x14, 0x0502);
-        rtl8168_mdio_write(tp, 0x14, 0x85eb);
-        rtl8168_mdio_write(tp, 0x14, 0xae0e);
-        rtl8168_mdio_write(tp, 0x14, 0xa001);
-        rtl8168_mdio_write(tp, 0x14, 0x0502);
-        rtl8168_mdio_write(tp, 0x14, 0x1a5a);
-        rtl8168_mdio_write(tp, 0x14, 0xae06);
-        rtl8168_mdio_write(tp, 0x14, 0xa002);
-        rtl8168_mdio_write(tp, 0x14, 0x0302);
-        rtl8168_mdio_write(tp, 0x14, 0x1ae6);
-        rtl8168_mdio_write(tp, 0x14, 0xef96);
-        rtl8168_mdio_write(tp, 0x14, 0xfefc);
-        rtl8168_mdio_write(tp, 0x14, 0x04f8);
-        rtl8168_mdio_write(tp, 0x14, 0xf9fa);
-        rtl8168_mdio_write(tp, 0x14, 0xef69);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x29f6);
-        rtl8168_mdio_write(tp, 0x14, 0x21e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8229);
-        rtl8168_mdio_write(tp, 0x14, 0xe080);
-        rtl8168_mdio_write(tp, 0x14, 0x10ac);
-        rtl8168_mdio_write(tp, 0x14, 0x2202);
-        rtl8168_mdio_write(tp, 0x14, 0xae76);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x27f7);
-        rtl8168_mdio_write(tp, 0x14, 0x21e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8227);
-        rtl8168_mdio_write(tp, 0x14, 0xbf43);
-        rtl8168_mdio_write(tp, 0x14, 0x1302);
-        rtl8168_mdio_write(tp, 0x14, 0x4297);
-        rtl8168_mdio_write(tp, 0x14, 0xef21);
-        rtl8168_mdio_write(tp, 0x14, 0xbf43);
-        rtl8168_mdio_write(tp, 0x14, 0x1602);
-        rtl8168_mdio_write(tp, 0x14, 0x4297);
-        rtl8168_mdio_write(tp, 0x14, 0x0c11);
-        rtl8168_mdio_write(tp, 0x14, 0x1e21);
-        rtl8168_mdio_write(tp, 0x14, 0xbf43);
-        rtl8168_mdio_write(tp, 0x14, 0x1902);
-        rtl8168_mdio_write(tp, 0x14, 0x4297);
-        rtl8168_mdio_write(tp, 0x14, 0x0c12);
-        rtl8168_mdio_write(tp, 0x14, 0x1e21);
-        rtl8168_mdio_write(tp, 0x14, 0xe682);
-        rtl8168_mdio_write(tp, 0x14, 0x43a2);
-        rtl8168_mdio_write(tp, 0x14, 0x000a);
-        rtl8168_mdio_write(tp, 0x14, 0xe182);
-        rtl8168_mdio_write(tp, 0x14, 0x27f6);
-        rtl8168_mdio_write(tp, 0x14, 0x29e5);
-        rtl8168_mdio_write(tp, 0x14, 0x8227);
-        rtl8168_mdio_write(tp, 0x14, 0xae42);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x44f7);
-        rtl8168_mdio_write(tp, 0x14, 0x21e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8244);
-        rtl8168_mdio_write(tp, 0x14, 0x0246);
-        rtl8168_mdio_write(tp, 0x14, 0xaebf);
-        rtl8168_mdio_write(tp, 0x14, 0x4325);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x97ef);
-        rtl8168_mdio_write(tp, 0x14, 0x21bf);
-        rtl8168_mdio_write(tp, 0x14, 0x431c);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x970c);
-        rtl8168_mdio_write(tp, 0x14, 0x121e);
-        rtl8168_mdio_write(tp, 0x14, 0x21bf);
-        rtl8168_mdio_write(tp, 0x14, 0x431f);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x970c);
-        rtl8168_mdio_write(tp, 0x14, 0x131e);
-        rtl8168_mdio_write(tp, 0x14, 0x21bf);
-        rtl8168_mdio_write(tp, 0x14, 0x4328);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x970c);
-        rtl8168_mdio_write(tp, 0x14, 0x141e);
-        rtl8168_mdio_write(tp, 0x14, 0x21bf);
-        rtl8168_mdio_write(tp, 0x14, 0x44b1);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x970c);
-        rtl8168_mdio_write(tp, 0x14, 0x161e);
-        rtl8168_mdio_write(tp, 0x14, 0x21e6);
-        rtl8168_mdio_write(tp, 0x14, 0x8242);
-        rtl8168_mdio_write(tp, 0x14, 0xee82);
-        rtl8168_mdio_write(tp, 0x14, 0x4101);
-        rtl8168_mdio_write(tp, 0x14, 0xef96);
-        rtl8168_mdio_write(tp, 0x14, 0xfefd);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x14, 0xef69);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x46a0);
-        rtl8168_mdio_write(tp, 0x14, 0x0005);
-        rtl8168_mdio_write(tp, 0x14, 0x0286);
-        rtl8168_mdio_write(tp, 0x14, 0x96ae);
-        rtl8168_mdio_write(tp, 0x14, 0x06a0);
-        rtl8168_mdio_write(tp, 0x14, 0x0103);
-        rtl8168_mdio_write(tp, 0x14, 0x0219);
-        rtl8168_mdio_write(tp, 0x14, 0x19ef);
-        rtl8168_mdio_write(tp, 0x14, 0x96fe);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x14, 0xef69);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x29f6);
-        rtl8168_mdio_write(tp, 0x14, 0x20e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8229);
-        rtl8168_mdio_write(tp, 0x14, 0xe080);
-        rtl8168_mdio_write(tp, 0x14, 0x10ac);
-        rtl8168_mdio_write(tp, 0x14, 0x2102);
-        rtl8168_mdio_write(tp, 0x14, 0xae54);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x27f7);
-        rtl8168_mdio_write(tp, 0x14, 0x20e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8227);
-        rtl8168_mdio_write(tp, 0x14, 0xbf42);
-        rtl8168_mdio_write(tp, 0x14, 0xe602);
-        rtl8168_mdio_write(tp, 0x14, 0x4297);
-        rtl8168_mdio_write(tp, 0x14, 0xac28);
-        rtl8168_mdio_write(tp, 0x14, 0x22bf);
-        rtl8168_mdio_write(tp, 0x14, 0x430d);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x97e5);
-        rtl8168_mdio_write(tp, 0x14, 0x8247);
-        rtl8168_mdio_write(tp, 0x14, 0xac28);
-        rtl8168_mdio_write(tp, 0x14, 0x20d1);
-        rtl8168_mdio_write(tp, 0x14, 0x03bf);
-        rtl8168_mdio_write(tp, 0x14, 0x4307);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x59ee);
-        rtl8168_mdio_write(tp, 0x14, 0x8246);
-        rtl8168_mdio_write(tp, 0x14, 0x00e1);
-        rtl8168_mdio_write(tp, 0x14, 0x8227);
-        rtl8168_mdio_write(tp, 0x14, 0xf628);
-        rtl8168_mdio_write(tp, 0x14, 0xe582);
-        rtl8168_mdio_write(tp, 0x14, 0x27ae);
-        rtl8168_mdio_write(tp, 0x14, 0x21d1);
-        rtl8168_mdio_write(tp, 0x14, 0x04bf);
-        rtl8168_mdio_write(tp, 0x14, 0x4307);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x59ae);
-        rtl8168_mdio_write(tp, 0x14, 0x08d1);
-        rtl8168_mdio_write(tp, 0x14, 0x05bf);
-        rtl8168_mdio_write(tp, 0x14, 0x4307);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x59e0);
-        rtl8168_mdio_write(tp, 0x14, 0x8244);
-        rtl8168_mdio_write(tp, 0x14, 0xf720);
-        rtl8168_mdio_write(tp, 0x14, 0xe482);
-        rtl8168_mdio_write(tp, 0x14, 0x4402);
-        rtl8168_mdio_write(tp, 0x14, 0x46ae);
-        rtl8168_mdio_write(tp, 0x14, 0xee82);
-        rtl8168_mdio_write(tp, 0x14, 0x4601);
-        rtl8168_mdio_write(tp, 0x14, 0xef96);
-        rtl8168_mdio_write(tp, 0x14, 0xfefc);
-        rtl8168_mdio_write(tp, 0x14, 0x04f8);
-        rtl8168_mdio_write(tp, 0x14, 0xfaef);
-        rtl8168_mdio_write(tp, 0x14, 0x69e0);
-        rtl8168_mdio_write(tp, 0x14, 0x8013);
-        rtl8168_mdio_write(tp, 0x14, 0xad24);
-        rtl8168_mdio_write(tp, 0x14, 0x1cbf);
-        rtl8168_mdio_write(tp, 0x14, 0x87f0);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x97ad);
-        rtl8168_mdio_write(tp, 0x14, 0x2813);
-        rtl8168_mdio_write(tp, 0x14, 0xe087);
-        rtl8168_mdio_write(tp, 0x14, 0xfca0);
-        rtl8168_mdio_write(tp, 0x14, 0x0005);
-        rtl8168_mdio_write(tp, 0x14, 0x0287);
-        rtl8168_mdio_write(tp, 0x14, 0x36ae);
-        rtl8168_mdio_write(tp, 0x14, 0x10a0);
-        rtl8168_mdio_write(tp, 0x14, 0x0105);
-        rtl8168_mdio_write(tp, 0x14, 0x0287);
-        rtl8168_mdio_write(tp, 0x14, 0x48ae);
-        rtl8168_mdio_write(tp, 0x14, 0x08e0);
-        rtl8168_mdio_write(tp, 0x14, 0x8230);
-        rtl8168_mdio_write(tp, 0x14, 0xf626);
-        rtl8168_mdio_write(tp, 0x14, 0xe482);
-        rtl8168_mdio_write(tp, 0x14, 0x30ef);
-        rtl8168_mdio_write(tp, 0x14, 0x96fe);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8e0);
-        rtl8168_mdio_write(tp, 0x14, 0x8245);
-        rtl8168_mdio_write(tp, 0x14, 0xf722);
-        rtl8168_mdio_write(tp, 0x14, 0xe482);
-        rtl8168_mdio_write(tp, 0x14, 0x4502);
-        rtl8168_mdio_write(tp, 0x14, 0x46ae);
-        rtl8168_mdio_write(tp, 0x14, 0xee87);
-        rtl8168_mdio_write(tp, 0x14, 0xfc01);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x14, 0xef69);
-        rtl8168_mdio_write(tp, 0x14, 0xfb02);
-        rtl8168_mdio_write(tp, 0x14, 0x46d3);
-        rtl8168_mdio_write(tp, 0x14, 0xad50);
-        rtl8168_mdio_write(tp, 0x14, 0x2fbf);
-        rtl8168_mdio_write(tp, 0x14, 0x87ed);
-        rtl8168_mdio_write(tp, 0x14, 0xd101);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x59bf);
-        rtl8168_mdio_write(tp, 0x14, 0x87ed);
-        rtl8168_mdio_write(tp, 0x14, 0xd100);
-        rtl8168_mdio_write(tp, 0x14, 0x0242);
-        rtl8168_mdio_write(tp, 0x14, 0x59e0);
-        rtl8168_mdio_write(tp, 0x14, 0x8245);
-        rtl8168_mdio_write(tp, 0x14, 0xf622);
-        rtl8168_mdio_write(tp, 0x14, 0xe482);
-        rtl8168_mdio_write(tp, 0x14, 0x4502);
-        rtl8168_mdio_write(tp, 0x14, 0x46ae);
-        rtl8168_mdio_write(tp, 0x14, 0xd100);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0xf002);
-        rtl8168_mdio_write(tp, 0x14, 0x4259);
-        rtl8168_mdio_write(tp, 0x14, 0xee87);
-        rtl8168_mdio_write(tp, 0x14, 0xfc00);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x30f6);
-        rtl8168_mdio_write(tp, 0x14, 0x26e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8230);
-        rtl8168_mdio_write(tp, 0x14, 0xffef);
-        rtl8168_mdio_write(tp, 0x14, 0x96fe);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x14, 0xface);
-        rtl8168_mdio_write(tp, 0x14, 0xfaef);
-        rtl8168_mdio_write(tp, 0x14, 0x69fb);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0xb3d7);
-        rtl8168_mdio_write(tp, 0x14, 0x001c);
-        rtl8168_mdio_write(tp, 0x14, 0xd819);
-        rtl8168_mdio_write(tp, 0x14, 0xd919);
-        rtl8168_mdio_write(tp, 0x14, 0xda19);
-        rtl8168_mdio_write(tp, 0x14, 0xdb19);
-        rtl8168_mdio_write(tp, 0x14, 0x07ef);
-        rtl8168_mdio_write(tp, 0x14, 0x9502);
-        rtl8168_mdio_write(tp, 0x14, 0x4259);
-        rtl8168_mdio_write(tp, 0x14, 0x073f);
-        rtl8168_mdio_write(tp, 0x14, 0x0004);
-        rtl8168_mdio_write(tp, 0x14, 0x9fec);
-        rtl8168_mdio_write(tp, 0x14, 0xffef);
-        rtl8168_mdio_write(tp, 0x14, 0x96fe);
-        rtl8168_mdio_write(tp, 0x14, 0xc6fe);
-        rtl8168_mdio_write(tp, 0x14, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x14, 0x0400);
-        rtl8168_mdio_write(tp, 0x14, 0x0145);
-        rtl8168_mdio_write(tp, 0x14, 0x7d00);
-        rtl8168_mdio_write(tp, 0x14, 0x0345);
-        rtl8168_mdio_write(tp, 0x14, 0x5c00);
-        rtl8168_mdio_write(tp, 0x14, 0x0143);
-        rtl8168_mdio_write(tp, 0x14, 0x4f00);
-        rtl8168_mdio_write(tp, 0x14, 0x0387);
-        rtl8168_mdio_write(tp, 0x14, 0xdb00);
-        rtl8168_mdio_write(tp, 0x14, 0x0987);
-        rtl8168_mdio_write(tp, 0x14, 0xde00);
-        rtl8168_mdio_write(tp, 0x14, 0x0987);
-        rtl8168_mdio_write(tp, 0x14, 0xe100);
-        rtl8168_mdio_write(tp, 0x14, 0x0087);
-        rtl8168_mdio_write(tp, 0x14, 0xeaa4);
-        rtl8168_mdio_write(tp, 0x14, 0x00b8);
-        rtl8168_mdio_write(tp, 0x14, 0x20c4);
-        rtl8168_mdio_write(tp, 0x14, 0x1600);
-        rtl8168_mdio_write(tp, 0x14, 0x000f);
-        rtl8168_mdio_write(tp, 0x14, 0xf800);
-        rtl8168_mdio_write(tp, 0x14, 0x7098);
-        rtl8168_mdio_write(tp, 0x14, 0xa58a);
-        rtl8168_mdio_write(tp, 0x14, 0xb6a8);
-        rtl8168_mdio_write(tp, 0x14, 0x3e50);
-        rtl8168_mdio_write(tp, 0x14, 0xa83e);
-        rtl8168_mdio_write(tp, 0x14, 0x33bc);
-        rtl8168_mdio_write(tp, 0x14, 0xc622);
-        rtl8168_mdio_write(tp, 0x14, 0xbcc6);
-        rtl8168_mdio_write(tp, 0x14, 0xaaa4);
-        rtl8168_mdio_write(tp, 0x14, 0x42ff);
-        rtl8168_mdio_write(tp, 0x14, 0xc408);
-        rtl8168_mdio_write(tp, 0x14, 0x00c4);
-        rtl8168_mdio_write(tp, 0x14, 0x16a8);
-        rtl8168_mdio_write(tp, 0x14, 0xbcc0);
-        rtl8168_mdio_write(tp, 0x13, 0xb818);
-        rtl8168_mdio_write(tp, 0x14, 0x02f3);
-        rtl8168_mdio_write(tp, 0x13, 0xb81a);
-        rtl8168_mdio_write(tp, 0x14, 0x17d1);
-        rtl8168_mdio_write(tp, 0x13, 0xb81c);
-        rtl8168_mdio_write(tp, 0x14, 0x185a);
-        rtl8168_mdio_write(tp, 0x13, 0xb81e);
-        rtl8168_mdio_write(tp, 0x14, 0x3c66);
-        rtl8168_mdio_write(tp, 0x13, 0xb820);
-        rtl8168_mdio_write(tp, 0x14, 0x021f);
-        rtl8168_mdio_write(tp, 0x13, 0xc416);
-        rtl8168_mdio_write(tp, 0x14, 0x0500);
-        rtl8168_mdio_write(tp, 0x13, 0xb82e);
-        rtl8168_mdio_write(tp, 0x14, 0xfffc);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x0000);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0B82);
-        gphy_val = rtl8168_mdio_read(tp, 0x10);
-        gphy_val &= ~(BIT_9);
-        rtl8168_mdio_write(tp, 0x10, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8146);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_clear_phy_mcu_patch_request(tp);
-}
-
-static void
-rtl8168_set_phy_mcu_8168gu_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val;
-
-        rtl8168_set_phy_mcu_patch_request(tp);
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8146);
-        rtl8168_mdio_write(tp, 0x14, 0x0300);
-        rtl8168_mdio_write(tp, 0x13, 0xB82E);
-        rtl8168_mdio_write(tp, 0x14, 0x0001);
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0xb820);
-        rtl8168_mdio_write(tp, 0x14, 0x0290);
-        rtl8168_mdio_write(tp, 0x13, 0xa012);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xa014);
-        rtl8168_mdio_write(tp, 0x14, 0x2c04);
-        rtl8168_mdio_write(tp, 0x14, 0x2c07);
-        rtl8168_mdio_write(tp, 0x14, 0x2c07);
-        rtl8168_mdio_write(tp, 0x14, 0x2c07);
-        rtl8168_mdio_write(tp, 0x14, 0xa304);
-        rtl8168_mdio_write(tp, 0x14, 0xa301);
-        rtl8168_mdio_write(tp, 0x14, 0x207e);
-        rtl8168_mdio_write(tp, 0x13, 0xa01a);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xa006);
-        rtl8168_mdio_write(tp, 0x14, 0x0fff);
-        rtl8168_mdio_write(tp, 0x13, 0xa004);
-        rtl8168_mdio_write(tp, 0x14, 0x0fff);
-        rtl8168_mdio_write(tp, 0x13, 0xa002);
-        rtl8168_mdio_write(tp, 0x14, 0x0fff);
-        rtl8168_mdio_write(tp, 0x13, 0xa000);
-        rtl8168_mdio_write(tp, 0x14, 0x107c);
-        rtl8168_mdio_write(tp, 0x13, 0xb820);
-        rtl8168_mdio_write(tp, 0x14, 0x0210);
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x0000);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0B82);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val &= ~(BIT_0);
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8146);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_clear_phy_mcu_patch_request(tp);
-}
-
-static void
-rtl8168_set_phy_mcu_8411b_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val;
-
-        rtl8168_set_phy_mcu_patch_request(tp);
-
-        rtl8168_mdio_write(tp,0x1f, 0x0A43);
-        rtl8168_mdio_write(tp,0x13, 0x8146);
-        rtl8168_mdio_write(tp,0x14, 0x0100);
-        rtl8168_mdio_write(tp,0x13, 0xB82E);
-        rtl8168_mdio_write(tp,0x14, 0x0001);
-
-
-        rtl8168_mdio_write(tp,0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0xb820);
-        rtl8168_mdio_write(tp, 0x14, 0x0290);
-        rtl8168_mdio_write(tp, 0x13, 0xa012);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xa014);
-        rtl8168_mdio_write(tp, 0x14, 0x2c04);
-        rtl8168_mdio_write(tp, 0x14, 0x2c07);
-        rtl8168_mdio_write(tp, 0x14, 0x2c07);
-        rtl8168_mdio_write(tp, 0x14, 0x2c07);
-        rtl8168_mdio_write(tp, 0x14, 0xa304);
-        rtl8168_mdio_write(tp, 0x14, 0xa301);
-        rtl8168_mdio_write(tp, 0x14, 0x207e);
-        rtl8168_mdio_write(tp, 0x13, 0xa01a);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xa006);
-        rtl8168_mdio_write(tp, 0x14, 0x0fff);
-        rtl8168_mdio_write(tp, 0x13, 0xa004);
-        rtl8168_mdio_write(tp, 0x14, 0x0fff);
-        rtl8168_mdio_write(tp, 0x13, 0xa002);
-        rtl8168_mdio_write(tp, 0x14, 0x0fff);
-        rtl8168_mdio_write(tp, 0x13, 0xa000);
-        rtl8168_mdio_write(tp, 0x14, 0x107c);
-        rtl8168_mdio_write(tp, 0x13, 0xb820);
-        rtl8168_mdio_write(tp, 0x14, 0x0210);
-
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x0000);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0B82);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val &= ~(BIT_0);
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8146);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_clear_phy_mcu_patch_request(tp);
-}
-
-static void
-rtl8168_set_phy_mcu_8168ep_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val;
-
-        rtl8168_set_phy_mcu_patch_request(tp);
-
-        rtl8168_mdio_write(tp,0x1f, 0x0A43);
-        rtl8168_mdio_write(tp,0x13, 0x8146);
-        rtl8168_mdio_write(tp,0x14, 0x8700);
-        rtl8168_mdio_write(tp,0x13, 0xB82E);
-        rtl8168_mdio_write(tp,0x14, 0x0001);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-
-        rtl8168_mdio_write(tp, 0x13, 0x83DD);
-        rtl8168_mdio_write(tp, 0x14, 0xAF83);
-        rtl8168_mdio_write(tp, 0x14, 0xE9AF);
-        rtl8168_mdio_write(tp, 0x14, 0x83EE);
-        rtl8168_mdio_write(tp, 0x14, 0xAF83);
-        rtl8168_mdio_write(tp, 0x14, 0xF1A1);
-        rtl8168_mdio_write(tp, 0x14, 0x83F4);
-        rtl8168_mdio_write(tp, 0x14, 0xD149);
-        rtl8168_mdio_write(tp, 0x14, 0xAF06);
-        rtl8168_mdio_write(tp, 0x14, 0x47AF);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x14, 0xAF00);
-        rtl8168_mdio_write(tp, 0x14, 0x00AF);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_mdio_write(tp, 0x13, 0xB818);
-        rtl8168_mdio_write(tp, 0x14, 0x0645);
-
-        rtl8168_mdio_write(tp, 0x13, 0xB81A);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_mdio_write(tp, 0x13, 0xB81C);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_mdio_write(tp, 0x13, 0xB81E);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_mdio_write(tp, 0x13, 0xB832);
-        rtl8168_mdio_write(tp, 0x14, 0x0001);
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x0000);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0B82);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val &= ~(BIT_0);
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8146);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_clear_phy_mcu_patch_request(tp);
-}
-
-static void
-rtl8168_set_phy_mcu_8168h_1(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val;
-
-        rtl8168_set_phy_mcu_patch_request(tp);
-
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8028);
-        rtl8168_mdio_write(tp, 0x14, 0x6200);
-        rtl8168_mdio_write(tp, 0x13, 0xB82E);
-        rtl8168_mdio_write(tp, 0x14, 0x0001);
-
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0xB820);
-        rtl8168_mdio_write(tp, 0x14, 0x0290);
-        rtl8168_mdio_write(tp, 0x13, 0xA012);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xA014);
-        rtl8168_mdio_write(tp, 0x14, 0x2c04);
-        rtl8168_mdio_write(tp, 0x14, 0x2c10);
-        rtl8168_mdio_write(tp, 0x14, 0x2c10);
-        rtl8168_mdio_write(tp, 0x14, 0x2c10);
-        rtl8168_mdio_write(tp, 0x14, 0xa210);
-        rtl8168_mdio_write(tp, 0x14, 0xa101);
-        rtl8168_mdio_write(tp, 0x14, 0xce10);
-        rtl8168_mdio_write(tp, 0x14, 0xe070);
-        rtl8168_mdio_write(tp, 0x14, 0x0f40);
-        rtl8168_mdio_write(tp, 0x14, 0xaf01);
-        rtl8168_mdio_write(tp, 0x14, 0x8f01);
-        rtl8168_mdio_write(tp, 0x14, 0x183e);
-        rtl8168_mdio_write(tp, 0x14, 0x8e10);
-        rtl8168_mdio_write(tp, 0x14, 0x8101);
-        rtl8168_mdio_write(tp, 0x14, 0x8210);
-        rtl8168_mdio_write(tp, 0x14, 0x28da);
-        rtl8168_mdio_write(tp, 0x13, 0xA01A);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xA006);
-        rtl8168_mdio_write(tp, 0x14, 0x0017);
-        rtl8168_mdio_write(tp, 0x13, 0xA004);
-        rtl8168_mdio_write(tp, 0x14, 0x0015);
-        rtl8168_mdio_write(tp, 0x13, 0xA002);
-        rtl8168_mdio_write(tp, 0x14, 0x0013);
-        rtl8168_mdio_write(tp, 0x13, 0xA000);
-        rtl8168_mdio_write(tp, 0x14, 0x18d1);
-        rtl8168_mdio_write(tp, 0x13, 0xB820);
-        rtl8168_mdio_write(tp, 0x14, 0x0210);
-
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x0000);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0B82);
-        gphy_val = rtl8168_mdio_read(tp,  0x17);
-        gphy_val &= ~(BIT_0);
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8028);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_clear_phy_mcu_patch_request(tp);
-}
-
-static void
-rtl8168_set_phy_mcu_8168h_2(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val;
-
-        rtl8168_set_phy_mcu_patch_request(tp);
-
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8028);
-        rtl8168_mdio_write(tp, 0x14, 0x6201);
-        rtl8168_mdio_write(tp, 0x13, 0xB82E);
-        rtl8168_mdio_write(tp, 0x14, 0x0001);
-
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0xB820);
-        rtl8168_mdio_write(tp, 0x14, 0x0290);
-        rtl8168_mdio_write(tp, 0x13, 0xA012);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xA014);
-        rtl8168_mdio_write(tp, 0x14, 0x2c04);
-        rtl8168_mdio_write(tp, 0x14, 0x2c09);
-        rtl8168_mdio_write(tp, 0x14, 0x2c09);
-        rtl8168_mdio_write(tp, 0x14, 0x2c09);
-        rtl8168_mdio_write(tp, 0x14, 0xad01);
-        rtl8168_mdio_write(tp, 0x14, 0xad01);
-        rtl8168_mdio_write(tp, 0x14, 0xad01);
-        rtl8168_mdio_write(tp, 0x14, 0xad01);
-        rtl8168_mdio_write(tp, 0x14, 0x236c);
-        rtl8168_mdio_write(tp, 0x13, 0xA01A);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xA006);
-        rtl8168_mdio_write(tp, 0x14, 0x0fff);
-        rtl8168_mdio_write(tp, 0x13, 0xA004);
-        rtl8168_mdio_write(tp, 0x14, 0x0fff);
-        rtl8168_mdio_write(tp, 0x13, 0xA002);
-        rtl8168_mdio_write(tp, 0x14, 0x0fff);
-        rtl8168_mdio_write(tp, 0x13, 0xA000);
-        rtl8168_mdio_write(tp, 0x14, 0x136b);
-        rtl8168_mdio_write(tp, 0x13, 0xB820);
-        rtl8168_mdio_write(tp, 0x14, 0x0210);
-
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8323);
-        rtl8168_mdio_write(tp, 0x14, 0xaf83);
-        rtl8168_mdio_write(tp, 0x14, 0x2faf);
-        rtl8168_mdio_write(tp, 0x14, 0x853d);
-        rtl8168_mdio_write(tp, 0x14, 0xaf85);
-        rtl8168_mdio_write(tp, 0x14, 0x3daf);
-        rtl8168_mdio_write(tp, 0x14, 0x853d);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x45ad);
-        rtl8168_mdio_write(tp, 0x14, 0x2052);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7ae3);
-        rtl8168_mdio_write(tp, 0x14, 0x85fe);
-        rtl8168_mdio_write(tp, 0x14, 0x1a03);
-        rtl8168_mdio_write(tp, 0x14, 0x10e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85f6);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7a1b);
-        rtl8168_mdio_write(tp, 0x14, 0x03e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85fa);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7be3);
-        rtl8168_mdio_write(tp, 0x14, 0x85fe);
-        rtl8168_mdio_write(tp, 0x14, 0x1a03);
-        rtl8168_mdio_write(tp, 0x14, 0x10e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85f7);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7b1b);
-        rtl8168_mdio_write(tp, 0x14, 0x03e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85fb);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7ce3);
-        rtl8168_mdio_write(tp, 0x14, 0x85fe);
-        rtl8168_mdio_write(tp, 0x14, 0x1a03);
-        rtl8168_mdio_write(tp, 0x14, 0x10e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85f8);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7c1b);
-        rtl8168_mdio_write(tp, 0x14, 0x03e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85fc);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7de3);
-        rtl8168_mdio_write(tp, 0x14, 0x85fe);
-        rtl8168_mdio_write(tp, 0x14, 0x1a03);
-        rtl8168_mdio_write(tp, 0x14, 0x10e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85f9);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7d1b);
-        rtl8168_mdio_write(tp, 0x14, 0x03e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85fd);
-        rtl8168_mdio_write(tp, 0x14, 0xae50);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7ee3);
-        rtl8168_mdio_write(tp, 0x14, 0x85ff);
-        rtl8168_mdio_write(tp, 0x14, 0x1a03);
-        rtl8168_mdio_write(tp, 0x14, 0x10e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85f6);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7e1b);
-        rtl8168_mdio_write(tp, 0x14, 0x03e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85fa);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7fe3);
-        rtl8168_mdio_write(tp, 0x14, 0x85ff);
-        rtl8168_mdio_write(tp, 0x14, 0x1a03);
-        rtl8168_mdio_write(tp, 0x14, 0x10e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85f7);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x7f1b);
-        rtl8168_mdio_write(tp, 0x14, 0x03e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85fb);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x80e3);
-        rtl8168_mdio_write(tp, 0x14, 0x85ff);
-        rtl8168_mdio_write(tp, 0x14, 0x1a03);
-        rtl8168_mdio_write(tp, 0x14, 0x10e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85f8);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x801b);
-        rtl8168_mdio_write(tp, 0x14, 0x03e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85fc);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x81e3);
-        rtl8168_mdio_write(tp, 0x14, 0x85ff);
-        rtl8168_mdio_write(tp, 0x14, 0x1a03);
-        rtl8168_mdio_write(tp, 0x14, 0x10e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85f9);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x811b);
-        rtl8168_mdio_write(tp, 0x14, 0x03e4);
-        rtl8168_mdio_write(tp, 0x14, 0x85fd);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xf6ad);
-        rtl8168_mdio_write(tp, 0x14, 0x2404);
-        rtl8168_mdio_write(tp, 0x14, 0xee85);
-        rtl8168_mdio_write(tp, 0x14, 0xf610);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xf7ad);
-        rtl8168_mdio_write(tp, 0x14, 0x2404);
-        rtl8168_mdio_write(tp, 0x14, 0xee85);
-        rtl8168_mdio_write(tp, 0x14, 0xf710);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xf8ad);
-        rtl8168_mdio_write(tp, 0x14, 0x2404);
-        rtl8168_mdio_write(tp, 0x14, 0xee85);
-        rtl8168_mdio_write(tp, 0x14, 0xf810);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xf9ad);
-        rtl8168_mdio_write(tp, 0x14, 0x2404);
-        rtl8168_mdio_write(tp, 0x14, 0xee85);
-        rtl8168_mdio_write(tp, 0x14, 0xf910);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xfaad);
-        rtl8168_mdio_write(tp, 0x14, 0x2704);
-        rtl8168_mdio_write(tp, 0x14, 0xee85);
-        rtl8168_mdio_write(tp, 0x14, 0xfa00);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xfbad);
-        rtl8168_mdio_write(tp, 0x14, 0x2704);
-        rtl8168_mdio_write(tp, 0x14, 0xee85);
-        rtl8168_mdio_write(tp, 0x14, 0xfb00);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xfcad);
-        rtl8168_mdio_write(tp, 0x14, 0x2704);
-        rtl8168_mdio_write(tp, 0x14, 0xee85);
-        rtl8168_mdio_write(tp, 0x14, 0xfc00);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xfdad);
-        rtl8168_mdio_write(tp, 0x14, 0x2704);
-        rtl8168_mdio_write(tp, 0x14, 0xee85);
-        rtl8168_mdio_write(tp, 0x14, 0xfd00);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x44ad);
-        rtl8168_mdio_write(tp, 0x14, 0x203f);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xf6e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8288);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xfae4);
-        rtl8168_mdio_write(tp, 0x14, 0x8289);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x440d);
-        rtl8168_mdio_write(tp, 0x14, 0x0458);
-        rtl8168_mdio_write(tp, 0x14, 0x01bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8264);
-        rtl8168_mdio_write(tp, 0x14, 0x0215);
-        rtl8168_mdio_write(tp, 0x14, 0x38bf);
-        rtl8168_mdio_write(tp, 0x14, 0x824e);
-        rtl8168_mdio_write(tp, 0x14, 0x0213);
-        rtl8168_mdio_write(tp, 0x14, 0x06a0);
-        rtl8168_mdio_write(tp, 0x14, 0x010f);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x44f6);
-        rtl8168_mdio_write(tp, 0x14, 0x20e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8244);
-        rtl8168_mdio_write(tp, 0x14, 0x580f);
-        rtl8168_mdio_write(tp, 0x14, 0xe582);
-        rtl8168_mdio_write(tp, 0x14, 0x5aae);
-        rtl8168_mdio_write(tp, 0x14, 0x0ebf);
-        rtl8168_mdio_write(tp, 0x14, 0x825e);
-        rtl8168_mdio_write(tp, 0x14, 0xe382);
-        rtl8168_mdio_write(tp, 0x14, 0x44f7);
-        rtl8168_mdio_write(tp, 0x14, 0x3ce7);
-        rtl8168_mdio_write(tp, 0x14, 0x8244);
-        rtl8168_mdio_write(tp, 0x14, 0x0212);
-        rtl8168_mdio_write(tp, 0x14, 0xf0ad);
-        rtl8168_mdio_write(tp, 0x14, 0x213f);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xf7e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8288);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xfbe4);
-        rtl8168_mdio_write(tp, 0x14, 0x8289);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x440d);
-        rtl8168_mdio_write(tp, 0x14, 0x0558);
-        rtl8168_mdio_write(tp, 0x14, 0x01bf);
-        rtl8168_mdio_write(tp, 0x14, 0x826b);
-        rtl8168_mdio_write(tp, 0x14, 0x0215);
-        rtl8168_mdio_write(tp, 0x14, 0x38bf);
-        rtl8168_mdio_write(tp, 0x14, 0x824f);
-        rtl8168_mdio_write(tp, 0x14, 0x0213);
-        rtl8168_mdio_write(tp, 0x14, 0x06a0);
-        rtl8168_mdio_write(tp, 0x14, 0x010f);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x44f6);
-        rtl8168_mdio_write(tp, 0x14, 0x21e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8244);
-        rtl8168_mdio_write(tp, 0x14, 0x580f);
-        rtl8168_mdio_write(tp, 0x14, 0xe582);
-        rtl8168_mdio_write(tp, 0x14, 0x5bae);
-        rtl8168_mdio_write(tp, 0x14, 0x0ebf);
-        rtl8168_mdio_write(tp, 0x14, 0x8265);
-        rtl8168_mdio_write(tp, 0x14, 0xe382);
-        rtl8168_mdio_write(tp, 0x14, 0x44f7);
-        rtl8168_mdio_write(tp, 0x14, 0x3de7);
-        rtl8168_mdio_write(tp, 0x14, 0x8244);
-        rtl8168_mdio_write(tp, 0x14, 0x0212);
-        rtl8168_mdio_write(tp, 0x14, 0xf0ad);
-        rtl8168_mdio_write(tp, 0x14, 0x223f);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xf8e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8288);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xfce4);
-        rtl8168_mdio_write(tp, 0x14, 0x8289);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x440d);
-        rtl8168_mdio_write(tp, 0x14, 0x0658);
-        rtl8168_mdio_write(tp, 0x14, 0x01bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8272);
-        rtl8168_mdio_write(tp, 0x14, 0x0215);
-        rtl8168_mdio_write(tp, 0x14, 0x38bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8250);
-        rtl8168_mdio_write(tp, 0x14, 0x0213);
-        rtl8168_mdio_write(tp, 0x14, 0x06a0);
-        rtl8168_mdio_write(tp, 0x14, 0x010f);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x44f6);
-        rtl8168_mdio_write(tp, 0x14, 0x22e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8244);
-        rtl8168_mdio_write(tp, 0x14, 0x580f);
-        rtl8168_mdio_write(tp, 0x14, 0xe582);
-        rtl8168_mdio_write(tp, 0x14, 0x5cae);
-        rtl8168_mdio_write(tp, 0x14, 0x0ebf);
-        rtl8168_mdio_write(tp, 0x14, 0x826c);
-        rtl8168_mdio_write(tp, 0x14, 0xe382);
-        rtl8168_mdio_write(tp, 0x14, 0x44f7);
-        rtl8168_mdio_write(tp, 0x14, 0x3ee7);
-        rtl8168_mdio_write(tp, 0x14, 0x8244);
-        rtl8168_mdio_write(tp, 0x14, 0x0212);
-        rtl8168_mdio_write(tp, 0x14, 0xf0ad);
-        rtl8168_mdio_write(tp, 0x14, 0x233f);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xf9e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8288);
-        rtl8168_mdio_write(tp, 0x14, 0xe085);
-        rtl8168_mdio_write(tp, 0x14, 0xfde4);
-        rtl8168_mdio_write(tp, 0x14, 0x8289);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x440d);
-        rtl8168_mdio_write(tp, 0x14, 0x0758);
-        rtl8168_mdio_write(tp, 0x14, 0x01bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8279);
-        rtl8168_mdio_write(tp, 0x14, 0x0215);
-        rtl8168_mdio_write(tp, 0x14, 0x38bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8251);
-        rtl8168_mdio_write(tp, 0x14, 0x0213);
-        rtl8168_mdio_write(tp, 0x14, 0x06a0);
-        rtl8168_mdio_write(tp, 0x14, 0x010f);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0x44f6);
-        rtl8168_mdio_write(tp, 0x14, 0x23e4);
-        rtl8168_mdio_write(tp, 0x14, 0x8244);
-        rtl8168_mdio_write(tp, 0x14, 0x580f);
-        rtl8168_mdio_write(tp, 0x14, 0xe582);
-        rtl8168_mdio_write(tp, 0x14, 0x5dae);
-        rtl8168_mdio_write(tp, 0x14, 0x0ebf);
-        rtl8168_mdio_write(tp, 0x14, 0x8273);
-        rtl8168_mdio_write(tp, 0x14, 0xe382);
-        rtl8168_mdio_write(tp, 0x14, 0x44f7);
-        rtl8168_mdio_write(tp, 0x14, 0x3fe7);
-        rtl8168_mdio_write(tp, 0x14, 0x8244);
-        rtl8168_mdio_write(tp, 0x14, 0x0212);
-        rtl8168_mdio_write(tp, 0x14, 0xf0ee);
-        rtl8168_mdio_write(tp, 0x14, 0x8288);
-        rtl8168_mdio_write(tp, 0x14, 0x10ee);
-        rtl8168_mdio_write(tp, 0x14, 0x8289);
-        rtl8168_mdio_write(tp, 0x14, 0x00af);
-        rtl8168_mdio_write(tp, 0x14, 0x14aa);
-        rtl8168_mdio_write(tp, 0x13, 0xb818);
-        rtl8168_mdio_write(tp, 0x14, 0x13cf);
-        rtl8168_mdio_write(tp, 0x13, 0xb81a);
-        rtl8168_mdio_write(tp, 0x14, 0xfffd);
-        rtl8168_mdio_write(tp, 0x13, 0xb81c);
-        rtl8168_mdio_write(tp, 0x14, 0xfffd);
-        rtl8168_mdio_write(tp, 0x13, 0xb81e);
-        rtl8168_mdio_write(tp, 0x14, 0xfffd);
-        rtl8168_mdio_write(tp, 0x13, 0xb832);
-        rtl8168_mdio_write(tp, 0x14, 0x0001);
-
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x0000);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0B82);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val &= ~(BIT_0);
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8028);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_clear_phy_mcu_patch_request(tp);
-
-        if (tp->RequiredSecLanDonglePatch) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                gphy_val = rtl8168_mdio_read(tp, 0x11);
-                gphy_val &= ~BIT_6;
-                rtl8168_mdio_write(tp, 0x11, gphy_val);
-        }
-}
-
-static void
-rtl8168_set_phy_mcu_8168h_3(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int gphy_val;
-
-        rtl8168_set_phy_mcu_patch_request(tp);
-
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8042);
-        rtl8168_mdio_write(tp, 0x14, 0x3800);
-        rtl8168_mdio_write(tp, 0x13, 0xB82E);
-        rtl8168_mdio_write(tp, 0x14, 0x0001);
-
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0xB820);
-        rtl8168_mdio_write(tp, 0x14, 0x0090);
-        rtl8168_mdio_write(tp, 0x13, 0xA016);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xA012);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x13, 0xA014);
-        rtl8168_mdio_write(tp, 0x14, 0x1800);
-        rtl8168_mdio_write(tp, 0x14, 0x8002);
-        rtl8168_mdio_write(tp, 0x14, 0x2b5d);
-        rtl8168_mdio_write(tp, 0x14, 0x0c68);
-        rtl8168_mdio_write(tp, 0x14, 0x1800);
-        rtl8168_mdio_write(tp, 0x14, 0x0b3c);
-        rtl8168_mdio_write(tp, 0x13, 0xA000);
-        rtl8168_mdio_write(tp, 0x14, 0x0b3a);
-        rtl8168_mdio_write(tp, 0x13, 0xA008);
-        rtl8168_mdio_write(tp, 0x14, 0x0100);
-        rtl8168_mdio_write(tp, 0x13, 0xB820);
-        rtl8168_mdio_write(tp, 0x14, 0x0010);
-
-
-        rtl8168_mdio_write(tp, 0x13, 0x83f3);
-        rtl8168_mdio_write(tp, 0x14, 0xaf84);
-        rtl8168_mdio_write(tp, 0x14, 0x0baf);
-        rtl8168_mdio_write(tp, 0x14, 0x8466);
-        rtl8168_mdio_write(tp, 0x14, 0xaf84);
-        rtl8168_mdio_write(tp, 0x14, 0xcdaf);
-        rtl8168_mdio_write(tp, 0x14, 0x8736);
-        rtl8168_mdio_write(tp, 0x14, 0xaf87);
-        rtl8168_mdio_write(tp, 0x14, 0x39af);
-        rtl8168_mdio_write(tp, 0x14, 0x8739);
-        rtl8168_mdio_write(tp, 0x14, 0xaf87);
-        rtl8168_mdio_write(tp, 0x14, 0x39af);
-        rtl8168_mdio_write(tp, 0x14, 0x8739);
-        rtl8168_mdio_write(tp, 0x14, 0xef79);
-        rtl8168_mdio_write(tp, 0x14, 0xfb89);
-        rtl8168_mdio_write(tp, 0x14, 0xe987);
-        rtl8168_mdio_write(tp, 0x14, 0xffd7);
-        rtl8168_mdio_write(tp, 0x14, 0x0017);
-        rtl8168_mdio_write(tp, 0x14, 0xd400);
-        rtl8168_mdio_write(tp, 0x14, 0x051c);
-        rtl8168_mdio_write(tp, 0x14, 0x421a);
-        rtl8168_mdio_write(tp, 0x14, 0x741b);
-        rtl8168_mdio_write(tp, 0x14, 0x97e9);
-        rtl8168_mdio_write(tp, 0x14, 0x87fe);
-        rtl8168_mdio_write(tp, 0x14, 0xffef);
-        rtl8168_mdio_write(tp, 0x14, 0x97e0);
-        rtl8168_mdio_write(tp, 0x14, 0x82aa);
-        rtl8168_mdio_write(tp, 0x14, 0xa000);
-        rtl8168_mdio_write(tp, 0x14, 0x08ef);
-        rtl8168_mdio_write(tp, 0x14, 0x46dc);
-        rtl8168_mdio_write(tp, 0x14, 0x19dd);
-        rtl8168_mdio_write(tp, 0x14, 0xaf1a);
-        rtl8168_mdio_write(tp, 0x14, 0x37a0);
-        rtl8168_mdio_write(tp, 0x14, 0x012d);
-        rtl8168_mdio_write(tp, 0x14, 0xe082);
-        rtl8168_mdio_write(tp, 0x14, 0xa7ac);
-        rtl8168_mdio_write(tp, 0x14, 0x2013);
-        rtl8168_mdio_write(tp, 0x14, 0xe087);
-        rtl8168_mdio_write(tp, 0x14, 0xffe1);
-        rtl8168_mdio_write(tp, 0x14, 0x87fe);
-        rtl8168_mdio_write(tp, 0x14, 0xac27);
-        rtl8168_mdio_write(tp, 0x14, 0x05a1);
-        rtl8168_mdio_write(tp, 0x14, 0x0807);
-        rtl8168_mdio_write(tp, 0x14, 0xae0f);
-        rtl8168_mdio_write(tp, 0x14, 0xa107);
-        rtl8168_mdio_write(tp, 0x14, 0x02ae);
-        rtl8168_mdio_write(tp, 0x14, 0x0aef);
-        rtl8168_mdio_write(tp, 0x14, 0x4619);
-        rtl8168_mdio_write(tp, 0x14, 0x19dc);
-        rtl8168_mdio_write(tp, 0x14, 0x19dd);
-        rtl8168_mdio_write(tp, 0x14, 0xaf1a);
-        rtl8168_mdio_write(tp, 0x14, 0x37d8);
-        rtl8168_mdio_write(tp, 0x14, 0x19d9);
-        rtl8168_mdio_write(tp, 0x14, 0x19dc);
-        rtl8168_mdio_write(tp, 0x14, 0x19dd);
-        rtl8168_mdio_write(tp, 0x14, 0xaf1a);
-        rtl8168_mdio_write(tp, 0x14, 0x3719);
-        rtl8168_mdio_write(tp, 0x14, 0x19ae);
-        rtl8168_mdio_write(tp, 0x14, 0xcfbf);
-        rtl8168_mdio_write(tp, 0x14, 0x8763);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0xdc3c);
-        rtl8168_mdio_write(tp, 0x14, 0x0005);
-        rtl8168_mdio_write(tp, 0x14, 0xaaf5);
-        rtl8168_mdio_write(tp, 0x14, 0x0249);
-        rtl8168_mdio_write(tp, 0x14, 0xcaef);
-        rtl8168_mdio_write(tp, 0x14, 0x67d7);
-        rtl8168_mdio_write(tp, 0x14, 0x0014);
-        rtl8168_mdio_write(tp, 0x14, 0x0249);
-        rtl8168_mdio_write(tp, 0x14, 0xe5ad);
-        rtl8168_mdio_write(tp, 0x14, 0x50f7);
-        rtl8168_mdio_write(tp, 0x14, 0xd400);
-        rtl8168_mdio_write(tp, 0x14, 0x01bf);
-        rtl8168_mdio_write(tp, 0x14, 0x46a7);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0x98bf);
-        rtl8168_mdio_write(tp, 0x14, 0x465c);
-        rtl8168_mdio_write(tp, 0x14, 0x024a);
-        rtl8168_mdio_write(tp, 0x14, 0x5fd4);
-        rtl8168_mdio_write(tp, 0x14, 0x0003);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x7502);
-        rtl8168_mdio_write(tp, 0x14, 0x4498);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x7202);
-        rtl8168_mdio_write(tp, 0x14, 0x4a5f);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x6602);
-        rtl8168_mdio_write(tp, 0x14, 0x4a5f);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x6902);
-        rtl8168_mdio_write(tp, 0x14, 0x44dc);
-        rtl8168_mdio_write(tp, 0x14, 0xad28);
-        rtl8168_mdio_write(tp, 0x14, 0xf7bf);
-        rtl8168_mdio_write(tp, 0x14, 0x876f);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0xdcad);
-        rtl8168_mdio_write(tp, 0x14, 0x28f7);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x6c02);
-        rtl8168_mdio_write(tp, 0x14, 0x4a5f);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x6c02);
-        rtl8168_mdio_write(tp, 0x14, 0x4a56);
-        rtl8168_mdio_write(tp, 0x14, 0xbf46);
-        rtl8168_mdio_write(tp, 0x14, 0x5c02);
-        rtl8168_mdio_write(tp, 0x14, 0x4a56);
-        rtl8168_mdio_write(tp, 0x14, 0xbf45);
-        rtl8168_mdio_write(tp, 0x14, 0x21af);
-        rtl8168_mdio_write(tp, 0x14, 0x020e);
-        rtl8168_mdio_write(tp, 0x14, 0xee82);
-        rtl8168_mdio_write(tp, 0x14, 0x5000);
-        rtl8168_mdio_write(tp, 0x14, 0x0284);
-        rtl8168_mdio_write(tp, 0x14, 0xdd02);
-        rtl8168_mdio_write(tp, 0x14, 0x8521);
-        rtl8168_mdio_write(tp, 0x14, 0x0285);
-        rtl8168_mdio_write(tp, 0x14, 0x36af);
-        rtl8168_mdio_write(tp, 0x14, 0x03d2);
-        rtl8168_mdio_write(tp, 0x14, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x14, 0xfafb);
-        rtl8168_mdio_write(tp, 0x14, 0xef59);
-        rtl8168_mdio_write(tp, 0x14, 0xbf45);
-        rtl8168_mdio_write(tp, 0x14, 0x3002);
-        rtl8168_mdio_write(tp, 0x14, 0x44dc);
-        rtl8168_mdio_write(tp, 0x14, 0x3c00);
-        rtl8168_mdio_write(tp, 0x14, 0x03aa);
-        rtl8168_mdio_write(tp, 0x14, 0x2cbf);
-        rtl8168_mdio_write(tp, 0x14, 0x8769);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0xdcad);
-        rtl8168_mdio_write(tp, 0x14, 0x2823);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x6f02);
-        rtl8168_mdio_write(tp, 0x14, 0x44dc);
-        rtl8168_mdio_write(tp, 0x14, 0xad28);
-        rtl8168_mdio_write(tp, 0x14, 0x1a02);
-        rtl8168_mdio_write(tp, 0x14, 0x49ca);
-        rtl8168_mdio_write(tp, 0x14, 0xef67);
-        rtl8168_mdio_write(tp, 0x14, 0xd700);
-        rtl8168_mdio_write(tp, 0x14, 0x0202);
-        rtl8168_mdio_write(tp, 0x14, 0x49e5);
-        rtl8168_mdio_write(tp, 0x14, 0xad50);
-        rtl8168_mdio_write(tp, 0x14, 0xf7bf);
-        rtl8168_mdio_write(tp, 0x14, 0x876c);
-        rtl8168_mdio_write(tp, 0x14, 0x024a);
-        rtl8168_mdio_write(tp, 0x14, 0x5fbf);
-        rtl8168_mdio_write(tp, 0x14, 0x876c);
-        rtl8168_mdio_write(tp, 0x14, 0x024a);
-        rtl8168_mdio_write(tp, 0x14, 0x56ef);
-        rtl8168_mdio_write(tp, 0x14, 0x95ff);
-        rtl8168_mdio_write(tp, 0x14, 0xfefd);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8fa);
-        rtl8168_mdio_write(tp, 0x14, 0xef69);
-        rtl8168_mdio_write(tp, 0x14, 0xe080);
-        rtl8168_mdio_write(tp, 0x14, 0x15ad);
-        rtl8168_mdio_write(tp, 0x14, 0x2406);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x6002);
-        rtl8168_mdio_write(tp, 0x14, 0x4a56);
-        rtl8168_mdio_write(tp, 0x14, 0xef96);
-        rtl8168_mdio_write(tp, 0x14, 0xfefc);
-        rtl8168_mdio_write(tp, 0x14, 0x04f8);
-        rtl8168_mdio_write(tp, 0x14, 0xe087);
-        rtl8168_mdio_write(tp, 0x14, 0xf9e1);
-        rtl8168_mdio_write(tp, 0x14, 0x87fa);
-        rtl8168_mdio_write(tp, 0x14, 0x1b10);
-        rtl8168_mdio_write(tp, 0x14, 0x9f1e);
-        rtl8168_mdio_write(tp, 0x14, 0xee87);
-        rtl8168_mdio_write(tp, 0x14, 0xf900);
-        rtl8168_mdio_write(tp, 0x14, 0xe080);
-        rtl8168_mdio_write(tp, 0x14, 0x15ac);
-        rtl8168_mdio_write(tp, 0x14, 0x2606);
-        rtl8168_mdio_write(tp, 0x14, 0xee87);
-        rtl8168_mdio_write(tp, 0x14, 0xf700);
-        rtl8168_mdio_write(tp, 0x14, 0xae12);
-        rtl8168_mdio_write(tp, 0x14, 0x0286);
-        rtl8168_mdio_write(tp, 0x14, 0x9702);
-        rtl8168_mdio_write(tp, 0x14, 0x8565);
-        rtl8168_mdio_write(tp, 0x14, 0x0285);
-        rtl8168_mdio_write(tp, 0x14, 0x9d02);
-        rtl8168_mdio_write(tp, 0x14, 0x865a);
-        rtl8168_mdio_write(tp, 0x14, 0xae04);
-        rtl8168_mdio_write(tp, 0x14, 0x10e4);
-        rtl8168_mdio_write(tp, 0x14, 0x87f9);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x14, 0xfaef);
-        rtl8168_mdio_write(tp, 0x14, 0x69fa);
-        rtl8168_mdio_write(tp, 0x14, 0xbf45);
-        rtl8168_mdio_write(tp, 0x14, 0x3002);
-        rtl8168_mdio_write(tp, 0x14, 0x44dc);
-        rtl8168_mdio_write(tp, 0x14, 0xa103);
-        rtl8168_mdio_write(tp, 0x14, 0x22e0);
-        rtl8168_mdio_write(tp, 0x14, 0x87eb);
-        rtl8168_mdio_write(tp, 0x14, 0xe187);
-        rtl8168_mdio_write(tp, 0x14, 0xecef);
-        rtl8168_mdio_write(tp, 0x14, 0x64bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8748);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0xdc1b);
-        rtl8168_mdio_write(tp, 0x14, 0x46aa);
-        rtl8168_mdio_write(tp, 0x14, 0x0abf);
-        rtl8168_mdio_write(tp, 0x14, 0x874b);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0xdc1b);
-        rtl8168_mdio_write(tp, 0x14, 0x46ab);
-        rtl8168_mdio_write(tp, 0x14, 0x06bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8745);
-        rtl8168_mdio_write(tp, 0x14, 0x024a);
-        rtl8168_mdio_write(tp, 0x14, 0x5ffe);
-        rtl8168_mdio_write(tp, 0x14, 0xef96);
-        rtl8168_mdio_write(tp, 0x14, 0xfefd);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x14, 0xef59);
-        rtl8168_mdio_write(tp, 0x14, 0xf9bf);
-        rtl8168_mdio_write(tp, 0x14, 0x4530);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0xdca1);
-        rtl8168_mdio_write(tp, 0x14, 0x0310);
-        rtl8168_mdio_write(tp, 0x14, 0xe087);
-        rtl8168_mdio_write(tp, 0x14, 0xf7ac);
-        rtl8168_mdio_write(tp, 0x14, 0x2605);
-        rtl8168_mdio_write(tp, 0x14, 0x0285);
-        rtl8168_mdio_write(tp, 0x14, 0xc9ae);
-        rtl8168_mdio_write(tp, 0x14, 0x0d02);
-        rtl8168_mdio_write(tp, 0x14, 0x860d);
-        rtl8168_mdio_write(tp, 0x14, 0xae08);
-        rtl8168_mdio_write(tp, 0x14, 0xe287);
-        rtl8168_mdio_write(tp, 0x14, 0xf7f6);
-        rtl8168_mdio_write(tp, 0x14, 0x36e6);
-        rtl8168_mdio_write(tp, 0x14, 0x87f7);
-        rtl8168_mdio_write(tp, 0x14, 0xfdef);
-        rtl8168_mdio_write(tp, 0x14, 0x95fd);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x14, 0xfafb);
-        rtl8168_mdio_write(tp, 0x14, 0xef79);
-        rtl8168_mdio_write(tp, 0x14, 0xfbbf);
-        rtl8168_mdio_write(tp, 0x14, 0x8748);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0xdcef);
-        rtl8168_mdio_write(tp, 0x14, 0x64e2);
-        rtl8168_mdio_write(tp, 0x14, 0x87e9);
-        rtl8168_mdio_write(tp, 0x14, 0xe387);
-        rtl8168_mdio_write(tp, 0x14, 0xea1b);
-        rtl8168_mdio_write(tp, 0x14, 0x659e);
-        rtl8168_mdio_write(tp, 0x14, 0x10e4);
-        rtl8168_mdio_write(tp, 0x14, 0x87e9);
-        rtl8168_mdio_write(tp, 0x14, 0xe587);
-        rtl8168_mdio_write(tp, 0x14, 0xeae2);
-        rtl8168_mdio_write(tp, 0x14, 0x87f7);
-        rtl8168_mdio_write(tp, 0x14, 0xf636);
-        rtl8168_mdio_write(tp, 0x14, 0xe687);
-        rtl8168_mdio_write(tp, 0x14, 0xf7ae);
-        rtl8168_mdio_write(tp, 0x14, 0x13e2);
-        rtl8168_mdio_write(tp, 0x14, 0x87f7);
-        rtl8168_mdio_write(tp, 0x14, 0xf736);
-        rtl8168_mdio_write(tp, 0x14, 0xe687);
-        rtl8168_mdio_write(tp, 0x14, 0xf702);
-        rtl8168_mdio_write(tp, 0x14, 0x49ca);
-        rtl8168_mdio_write(tp, 0x14, 0xef57);
-        rtl8168_mdio_write(tp, 0x14, 0xe687);
-        rtl8168_mdio_write(tp, 0x14, 0xe7e7);
-        rtl8168_mdio_write(tp, 0x14, 0x87e8);
-        rtl8168_mdio_write(tp, 0x14, 0xffef);
-        rtl8168_mdio_write(tp, 0x14, 0x97ff);
-        rtl8168_mdio_write(tp, 0x14, 0xfefd);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x14, 0xfafb);
-        rtl8168_mdio_write(tp, 0x14, 0xef79);
-        rtl8168_mdio_write(tp, 0x14, 0xfbe2);
-        rtl8168_mdio_write(tp, 0x14, 0x87e7);
-        rtl8168_mdio_write(tp, 0x14, 0xe387);
-        rtl8168_mdio_write(tp, 0x14, 0xe8ef);
-        rtl8168_mdio_write(tp, 0x14, 0x65e2);
-        rtl8168_mdio_write(tp, 0x14, 0x87fb);
-        rtl8168_mdio_write(tp, 0x14, 0xe387);
-        rtl8168_mdio_write(tp, 0x14, 0xfcef);
-        rtl8168_mdio_write(tp, 0x14, 0x7502);
-        rtl8168_mdio_write(tp, 0x14, 0x49e5);
-        rtl8168_mdio_write(tp, 0x14, 0xac50);
-        rtl8168_mdio_write(tp, 0x14, 0x1abf);
-        rtl8168_mdio_write(tp, 0x14, 0x8748);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0xdcef);
-        rtl8168_mdio_write(tp, 0x14, 0x64e2);
-        rtl8168_mdio_write(tp, 0x14, 0x87e9);
-        rtl8168_mdio_write(tp, 0x14, 0xe387);
-        rtl8168_mdio_write(tp, 0x14, 0xea1b);
-        rtl8168_mdio_write(tp, 0x14, 0x659e);
-        rtl8168_mdio_write(tp, 0x14, 0x16e4);
-        rtl8168_mdio_write(tp, 0x14, 0x87e9);
-        rtl8168_mdio_write(tp, 0x14, 0xe587);
-        rtl8168_mdio_write(tp, 0x14, 0xeaae);
-        rtl8168_mdio_write(tp, 0x14, 0x06bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8745);
-        rtl8168_mdio_write(tp, 0x14, 0x024a);
-        rtl8168_mdio_write(tp, 0x14, 0x5fe2);
-        rtl8168_mdio_write(tp, 0x14, 0x87f7);
-        rtl8168_mdio_write(tp, 0x14, 0xf636);
-        rtl8168_mdio_write(tp, 0x14, 0xe687);
-        rtl8168_mdio_write(tp, 0x14, 0xf7ff);
-        rtl8168_mdio_write(tp, 0x14, 0xef97);
-        rtl8168_mdio_write(tp, 0x14, 0xfffe);
-        rtl8168_mdio_write(tp, 0x14, 0xfdfc);
-        rtl8168_mdio_write(tp, 0x14, 0x04f8);
-        rtl8168_mdio_write(tp, 0x14, 0xf9fa);
-        rtl8168_mdio_write(tp, 0x14, 0xef69);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x3f02);
-        rtl8168_mdio_write(tp, 0x14, 0x44dc);
-        rtl8168_mdio_write(tp, 0x14, 0xad28);
-        rtl8168_mdio_write(tp, 0x14, 0x29bf);
-        rtl8168_mdio_write(tp, 0x14, 0x873c);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0xdcef);
-        rtl8168_mdio_write(tp, 0x14, 0x54bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8739);
-        rtl8168_mdio_write(tp, 0x14, 0x0244);
-        rtl8168_mdio_write(tp, 0x14, 0xdcac);
-        rtl8168_mdio_write(tp, 0x14, 0x290d);
-        rtl8168_mdio_write(tp, 0x14, 0xac28);
-        rtl8168_mdio_write(tp, 0x14, 0x05a3);
-        rtl8168_mdio_write(tp, 0x14, 0x020c);
-        rtl8168_mdio_write(tp, 0x14, 0xae10);
-        rtl8168_mdio_write(tp, 0x14, 0xa303);
-        rtl8168_mdio_write(tp, 0x14, 0x07ae);
-        rtl8168_mdio_write(tp, 0x14, 0x0ba3);
-        rtl8168_mdio_write(tp, 0x14, 0x0402);
-        rtl8168_mdio_write(tp, 0x14, 0xae06);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x4502);
-        rtl8168_mdio_write(tp, 0x14, 0x4a5f);
-        rtl8168_mdio_write(tp, 0x14, 0xef96);
-        rtl8168_mdio_write(tp, 0x14, 0xfefd);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8f9);
-        rtl8168_mdio_write(tp, 0x14, 0xfafb);
-        rtl8168_mdio_write(tp, 0x14, 0xef69);
-        rtl8168_mdio_write(tp, 0x14, 0xfae0);
-        rtl8168_mdio_write(tp, 0x14, 0x8015);
-        rtl8168_mdio_write(tp, 0x14, 0xad25);
-        rtl8168_mdio_write(tp, 0x14, 0x41d2);
-        rtl8168_mdio_write(tp, 0x14, 0x0002);
-        rtl8168_mdio_write(tp, 0x14, 0x86ed);
-        rtl8168_mdio_write(tp, 0x14, 0xe087);
-        rtl8168_mdio_write(tp, 0x14, 0xebe1);
-        rtl8168_mdio_write(tp, 0x14, 0x87ec);
-        rtl8168_mdio_write(tp, 0x14, 0x1b46);
-        rtl8168_mdio_write(tp, 0x14, 0xab26);
-        rtl8168_mdio_write(tp, 0x14, 0xd40b);
-        rtl8168_mdio_write(tp, 0x14, 0xff1b);
-        rtl8168_mdio_write(tp, 0x14, 0x46aa);
-        rtl8168_mdio_write(tp, 0x14, 0x1fac);
-        rtl8168_mdio_write(tp, 0x14, 0x3204);
-        rtl8168_mdio_write(tp, 0x14, 0xef32);
-        rtl8168_mdio_write(tp, 0x14, 0xae02);
-        rtl8168_mdio_write(tp, 0x14, 0xd304);
-        rtl8168_mdio_write(tp, 0x14, 0x0c31);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0xeb1a);
-        rtl8168_mdio_write(tp, 0x14, 0x93d8);
-        rtl8168_mdio_write(tp, 0x14, 0x19d9);
-        rtl8168_mdio_write(tp, 0x14, 0x1b46);
-        rtl8168_mdio_write(tp, 0x14, 0xab0e);
-        rtl8168_mdio_write(tp, 0x14, 0x19d8);
-        rtl8168_mdio_write(tp, 0x14, 0x19d9);
-        rtl8168_mdio_write(tp, 0x14, 0x1b46);
-        rtl8168_mdio_write(tp, 0x14, 0xaa06);
-        rtl8168_mdio_write(tp, 0x14, 0x12a2);
-        rtl8168_mdio_write(tp, 0x14, 0x08c9);
-        rtl8168_mdio_write(tp, 0x14, 0xae06);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x4202);
-        rtl8168_mdio_write(tp, 0x14, 0x4a5f);
-        rtl8168_mdio_write(tp, 0x14, 0xfeef);
-        rtl8168_mdio_write(tp, 0x14, 0x96ff);
-        rtl8168_mdio_write(tp, 0x14, 0xfefd);
-        rtl8168_mdio_write(tp, 0x14, 0xfc04);
-        rtl8168_mdio_write(tp, 0x14, 0xf8fb);
-        rtl8168_mdio_write(tp, 0x14, 0xef79);
-        rtl8168_mdio_write(tp, 0x14, 0xa200);
-        rtl8168_mdio_write(tp, 0x14, 0x05bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8748);
-        rtl8168_mdio_write(tp, 0x14, 0xae33);
-        rtl8168_mdio_write(tp, 0x14, 0xa201);
-        rtl8168_mdio_write(tp, 0x14, 0x05bf);
-        rtl8168_mdio_write(tp, 0x14, 0x874b);
-        rtl8168_mdio_write(tp, 0x14, 0xae2b);
-        rtl8168_mdio_write(tp, 0x14, 0xa202);
-        rtl8168_mdio_write(tp, 0x14, 0x05bf);
-        rtl8168_mdio_write(tp, 0x14, 0x874e);
-        rtl8168_mdio_write(tp, 0x14, 0xae23);
-        rtl8168_mdio_write(tp, 0x14, 0xa203);
-        rtl8168_mdio_write(tp, 0x14, 0x05bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8751);
-        rtl8168_mdio_write(tp, 0x14, 0xae1b);
-        rtl8168_mdio_write(tp, 0x14, 0xa204);
-        rtl8168_mdio_write(tp, 0x14, 0x05bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8754);
-        rtl8168_mdio_write(tp, 0x14, 0xae13);
-        rtl8168_mdio_write(tp, 0x14, 0xa205);
-        rtl8168_mdio_write(tp, 0x14, 0x05bf);
-        rtl8168_mdio_write(tp, 0x14, 0x8757);
-        rtl8168_mdio_write(tp, 0x14, 0xae0b);
-        rtl8168_mdio_write(tp, 0x14, 0xa206);
-        rtl8168_mdio_write(tp, 0x14, 0x05bf);
-        rtl8168_mdio_write(tp, 0x14, 0x875a);
-        rtl8168_mdio_write(tp, 0x14, 0xae03);
-        rtl8168_mdio_write(tp, 0x14, 0xbf87);
-        rtl8168_mdio_write(tp, 0x14, 0x5d02);
-        rtl8168_mdio_write(tp, 0x14, 0x44dc);
-        rtl8168_mdio_write(tp, 0x14, 0xef64);
-        rtl8168_mdio_write(tp, 0x14, 0xef97);
-        rtl8168_mdio_write(tp, 0x14, 0xfffc);
-        rtl8168_mdio_write(tp, 0x14, 0x04af);
-        rtl8168_mdio_write(tp, 0x14, 0x00ed);
-        rtl8168_mdio_write(tp, 0x14, 0x54a4);
-        rtl8168_mdio_write(tp, 0x14, 0x3474);
-        rtl8168_mdio_write(tp, 0x14, 0xa600);
-        rtl8168_mdio_write(tp, 0x14, 0x22a4);
-        rtl8168_mdio_write(tp, 0x14, 0x3411);
-        rtl8168_mdio_write(tp, 0x14, 0xb842);
-        rtl8168_mdio_write(tp, 0x14, 0x22b8);
-        rtl8168_mdio_write(tp, 0x14, 0x42f0);
-        rtl8168_mdio_write(tp, 0x14, 0xa200);
-        rtl8168_mdio_write(tp, 0x14, 0xf0a2);
-        rtl8168_mdio_write(tp, 0x14, 0x02f0);
-        rtl8168_mdio_write(tp, 0x14, 0xa204);
-        rtl8168_mdio_write(tp, 0x14, 0xf0a2);
-        rtl8168_mdio_write(tp, 0x14, 0x06f0);
-        rtl8168_mdio_write(tp, 0x14, 0xa208);
-        rtl8168_mdio_write(tp, 0x14, 0xf0a2);
-        rtl8168_mdio_write(tp, 0x14, 0x0af0);
-        rtl8168_mdio_write(tp, 0x14, 0xa20c);
-        rtl8168_mdio_write(tp, 0x14, 0xf0a2);
-        rtl8168_mdio_write(tp, 0x14, 0x0e55);
-        rtl8168_mdio_write(tp, 0x14, 0xb820);
-        rtl8168_mdio_write(tp, 0x14, 0xd9c6);
-        rtl8168_mdio_write(tp, 0x14, 0x08aa);
-        rtl8168_mdio_write(tp, 0x14, 0xc430);
-        rtl8168_mdio_write(tp, 0x14, 0x00c6);
-        rtl8168_mdio_write(tp, 0x14, 0x1433);
-        rtl8168_mdio_write(tp, 0x14, 0xc41a);
-        rtl8168_mdio_write(tp, 0x14, 0x88c4);
-        rtl8168_mdio_write(tp, 0x14, 0x2e22);
-        rtl8168_mdio_write(tp, 0x14, 0xc42e);
-        rtl8168_mdio_write(tp, 0x14, 0x54c4);
-        rtl8168_mdio_write(tp, 0x14, 0x1a00);
-        rtl8168_mdio_write(tp, 0x13, 0xb818);
-        rtl8168_mdio_write(tp, 0x14, 0x1a01);
-        rtl8168_mdio_write(tp, 0x13, 0xb81a);
-        rtl8168_mdio_write(tp, 0x14, 0x020b);
-        rtl8168_mdio_write(tp, 0x13, 0xb81c);
-        rtl8168_mdio_write(tp, 0x14, 0x03ce);
-        rtl8168_mdio_write(tp, 0x13, 0xb81e);
-        rtl8168_mdio_write(tp, 0x14, 0x00e7);
-        rtl8168_mdio_write(tp, 0x13, 0xb846);
-        rtl8168_mdio_write(tp, 0x14, 0xffff);
-        rtl8168_mdio_write(tp, 0x13, 0xb848);
-        rtl8168_mdio_write(tp, 0x14, 0xffff);
-        rtl8168_mdio_write(tp, 0x13, 0xb84a);
-        rtl8168_mdio_write(tp, 0x14, 0xffff);
-        rtl8168_mdio_write(tp, 0x13, 0xb84c);
-        rtl8168_mdio_write(tp, 0x14, 0xffff);
-        rtl8168_mdio_write(tp, 0x13, 0xb832);
-        rtl8168_mdio_write(tp, 0x14, 0x000f);
-
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x0000);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-        rtl8168_mdio_write(tp, 0x1f, 0x0B82);
-        gphy_val = rtl8168_mdio_read(tp, 0x17);
-        gphy_val &= ~(BIT_0);
-        rtl8168_mdio_write(tp, 0x17, gphy_val);
-        rtl8168_mdio_write(tp, 0x1f, 0x0A43);
-        rtl8168_mdio_write(tp, 0x13, 0x8042);
-        rtl8168_mdio_write(tp, 0x14, 0x0000);
-
-        rtl8168_clear_phy_mcu_patch_request(tp);
-
-        if (tp->RequiredSecLanDonglePatch) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                gphy_val = rtl8168_mdio_read(tp, 0x11);
-                gphy_val &= ~BIT_6;
-                rtl8168_mdio_write(tp, 0x11, gphy_val);
-        }
-}
-
-static void
-rtl8168_init_hw_phy_mcu(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u8 require_disable_phy_disable_mode = FALSE;
-
-        if (tp->NotWrRamCodeToMicroP == TRUE) return;
-        if (rtl8168_check_hw_phy_mcu_code_ver(dev)) return;
-
-        if (FALSE == rtl8168_phy_ram_code_check(dev)) {
-                rtl8168_set_phy_ram_code_check_fail_flag(dev);
-                return;
-        }
-
-        if (HW_SUPPORT_CHECK_PHY_DISABLE_MODE(tp) && rtl8168_is_in_phy_disable_mode(dev))
-                require_disable_phy_disable_mode = TRUE;
-
-        if (require_disable_phy_disable_mode)
-                rtl8168_disable_phy_disable_mode(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-                rtl8168_set_phy_mcu_8168e_1(dev);
-                break;
-        case CFG_METHOD_15:
-                rtl8168_set_phy_mcu_8168e_2(dev);
-                break;
-        case CFG_METHOD_16:
-                rtl8168_set_phy_mcu_8168evl_1(dev);
-                break;
-        case CFG_METHOD_17:
-                rtl8168_set_phy_mcu_8168evl_2(dev);
-                break;
-        case CFG_METHOD_18:
-                rtl8168_set_phy_mcu_8168f_1(dev);
-                break;
-        case CFG_METHOD_19:
-                rtl8168_set_phy_mcu_8168f_2(dev);
-                break;
-        case CFG_METHOD_20:
-                rtl8168_set_phy_mcu_8411_1(dev);
-                break;
-        case CFG_METHOD_21:
-                rtl8168_set_phy_mcu_8168g_1(dev);
-                break;
-        case CFG_METHOD_25:
-                rtl8168_set_phy_mcu_8168gu_2(dev);
-                break;
-        case CFG_METHOD_26:
-                rtl8168_set_phy_mcu_8411b_1(dev);
-                break;
-        case CFG_METHOD_28:
-                rtl8168_set_phy_mcu_8168ep_2(dev);
-                break;
-        case CFG_METHOD_29:
-                rtl8168_set_phy_mcu_8168h_1(dev);
-                break;
-        case CFG_METHOD_30:
-                rtl8168_set_phy_mcu_8168h_2(dev);
-                break;
-        case CFG_METHOD_35:
-                rtl8168_set_phy_mcu_8168h_3(dev);
-                break;
-        }
-
-        if (require_disable_phy_disable_mode)
-                rtl8168_enable_phy_disable_mode(dev);
-
-        rtl8168_write_hw_phy_mcu_code_ver(dev);
-
-        rtl8168_mdio_write(tp,0x1F, 0x0000);
-
-        tp->HwHasWrRamCodeToMicroP = TRUE;
-}
-#endif
-
-static void
-rtl8168_hw_phy_config(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct pci_dev *pdev = tp->pci_dev;
-        u16 gphy_val;
-        unsigned int i;
-
-        tp->phy_reset_enable(dev);
-
-        if (HW_DASH_SUPPORT_TYPE_3(tp) && tp->HwPkgDet == 0x06) return;
-
-#ifndef ENABLE_USE_FIRMWARE_FILE
-        if (!tp->rtl_fw) {
-                rtl8168_init_hw_phy_mcu(dev);
-        }
-#endif
-
-        if (tp->mcfg == CFG_METHOD_1) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x0B, 0x94B0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x12, 0x6096);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x0D, 0xF8A0);
-        } else if (tp->mcfg == CFG_METHOD_2) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x0B, 0x94B0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x12, 0x6096);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_3) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x0B, 0x94B0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x12, 0x6096);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_4) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x12, 0x2300);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x16, 0x000A);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x12, 0xC096);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x00, 0x88DE);
-                rtl8168_mdio_write(tp, 0x01, 0x82B1);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x08, 0x9E30);
-                rtl8168_mdio_write(tp, 0x09, 0x01F0);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x0A, 0x5500);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x03, 0x7002);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x0C, 0x00C8);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) | (1 << 5));
-                rtl8168_mdio_write(tp, 0x0D, rtl8168_mdio_read(tp, 0x0D) & ~(1 << 5));
-        } else if (tp->mcfg == CFG_METHOD_5) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x12, 0x2300);
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x16, 0x0F0A);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x00, 0x88DE);
-                rtl8168_mdio_write(tp, 0x01, 0x82B1);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x0C, 0x7EB8);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x06, 0x0761);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x03, 0x802F);
-                rtl8168_mdio_write(tp, 0x02, 0x4F02);
-                rtl8168_mdio_write(tp, 0x01, 0x0409);
-                rtl8168_mdio_write(tp, 0x00, 0xF099);
-                rtl8168_mdio_write(tp, 0x04, 0x9800);
-                rtl8168_mdio_write(tp, 0x04, 0x9000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x16, rtl8168_mdio_read(tp, 0x16) | (1 << 0));
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) | (1 << 5));
-                rtl8168_mdio_write(tp, 0x0D, rtl8168_mdio_read(tp, 0x0D) & ~(1 << 5));
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x1D, 0x3D98);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x17, 0x0CC0);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_6) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x12, 0x2300);
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x16, 0x0F0A);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x00, 0x88DE);
-                rtl8168_mdio_write(tp, 0x01, 0x82B1);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x0C, 0x7EB8);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x06, 0x5461);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x06, 0x5461);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x16, rtl8168_mdio_read(tp, 0x16) | (1 << 0));
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) | (1 << 5));
-                rtl8168_mdio_write(tp, 0x0D, rtl8168_mdio_read(tp, 0x0D) & ~(1 << 5));
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x1D, 0x3D98);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0001);
-                rtl8168_mdio_write(tp, 0x17, 0x0CC0);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_7) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) | (1 << 5));
-                rtl8168_mdio_write(tp, 0x0D, rtl8168_mdio_read(tp, 0x0D) & ~(1 << 5));
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x1D, 0x3D98);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x14, 0xCAA3);
-                rtl8168_mdio_write(tp, 0x1C, 0x000A);
-                rtl8168_mdio_write(tp, 0x18, 0x65D0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x17, 0xB580);
-                rtl8168_mdio_write(tp, 0x18, 0xFF54);
-                rtl8168_mdio_write(tp, 0x19, 0x3954);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x0D, 0x310C);
-                rtl8168_mdio_write(tp, 0x0E, 0x310C);
-                rtl8168_mdio_write(tp, 0x0F, 0x311C);
-                rtl8168_mdio_write(tp, 0x06, 0x0761);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x18, 0xFF55);
-                rtl8168_mdio_write(tp, 0x19, 0x3955);
-                rtl8168_mdio_write(tp, 0x18, 0xFF54);
-                rtl8168_mdio_write(tp, 0x19, 0x3954);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x17, 0x0CC0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_8) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) | (1 << 5));
-                rtl8168_mdio_write(tp, 0x0D, rtl8168_mdio_read(tp, 0x0D) & ~(1 << 5));
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x14, 0xCAA3);
-                rtl8168_mdio_write(tp, 0x1C, 0x000A);
-                rtl8168_mdio_write(tp, 0x18, 0x65D0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x17, 0xB580);
-                rtl8168_mdio_write(tp, 0x18, 0xFF54);
-                rtl8168_mdio_write(tp, 0x19, 0x3954);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x0D, 0x310C);
-                rtl8168_mdio_write(tp, 0x0E, 0x310C);
-                rtl8168_mdio_write(tp, 0x0F, 0x311C);
-                rtl8168_mdio_write(tp, 0x06, 0x0761);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x18, 0xFF55);
-                rtl8168_mdio_write(tp, 0x19, 0x3955);
-                rtl8168_mdio_write(tp, 0x18, 0xFF54);
-                rtl8168_mdio_write(tp, 0x19, 0x3954);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x17, 0x0CC0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x16, rtl8168_mdio_read(tp, 0x16) | (1 << 0));
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_9) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x06, 0x4064);
-                rtl8168_mdio_write(tp, 0x07, 0x2863);
-                rtl8168_mdio_write(tp, 0x08, 0x059C);
-                rtl8168_mdio_write(tp, 0x09, 0x26B4);
-                rtl8168_mdio_write(tp, 0x0A, 0x6A19);
-                rtl8168_mdio_write(tp, 0x0B, 0xDCC8);
-                rtl8168_mdio_write(tp, 0x10, 0xF06D);
-                rtl8168_mdio_write(tp, 0x14, 0x7F68);
-                rtl8168_mdio_write(tp, 0x18, 0x7FD9);
-                rtl8168_mdio_write(tp, 0x1C, 0xF0FF);
-                rtl8168_mdio_write(tp, 0x1D, 0x3D9C);
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x12, 0xF49F);
-                rtl8168_mdio_write(tp, 0x13, 0x070B);
-                rtl8168_mdio_write(tp, 0x1A, 0x05AD);
-                rtl8168_mdio_write(tp, 0x14, 0x94C0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x0B) & 0xFF00;
-                gphy_val |= 0x10;
-                rtl8168_mdio_write(tp, 0x0B, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x0C) & 0x00FF;
-                gphy_val |= 0xA200;
-                rtl8168_mdio_write(tp, 0x0C, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x06, 0x5561);
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8332);
-                rtl8168_mdio_write(tp, 0x06, 0x5561);
-
-                if (rtl8168_efuse_read(tp, 0x01) == 0xb1) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                        rtl8168_mdio_write(tp, 0x05, 0x669A);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8330);
-                        rtl8168_mdio_write(tp, 0x06, 0x669A);
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                        gphy_val = rtl8168_mdio_read(tp, 0x0D);
-                        if ((gphy_val & 0x00FF) != 0x006C) {
-                                gphy_val &= 0xFF00;
-                                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x0065);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x0066);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x0067);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x0068);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x0069);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x006A);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x006B);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x006C);
-                        }
-                } else {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                        rtl8168_mdio_write(tp, 0x05, 0x6662);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8330);
-                        rtl8168_mdio_write(tp, 0x06, 0x6662);
-                }
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x0D);
-                gphy_val |= BIT_9;
-                gphy_val |= BIT_8;
-                rtl8168_mdio_write(tp, 0x0D, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x0F);
-                gphy_val |= BIT_4;
-                rtl8168_mdio_write(tp, 0x0F, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x02);
-                gphy_val &= ~BIT_10;
-                gphy_val &= ~BIT_9;
-                gphy_val |= BIT_8;
-                rtl8168_mdio_write(tp, 0x02, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x03);
-                gphy_val &= ~BIT_15;
-                gphy_val &= ~BIT_14;
-                gphy_val &= ~BIT_13;
-                rtl8168_mdio_write(tp, 0x03, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x17, 0x0CC0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x001B);
-                if (rtl8168_mdio_read(tp, 0x06) == 0xBF00) {
-                        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-                        rtl8168_mdio_write(tp, 0x06, 0x0080);
-                        rtl8168_mdio_write(tp, 0x05, 0x8000);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-                        rtl8168_mdio_write(tp, 0x06, 0xfaef);
-                        rtl8168_mdio_write(tp, 0x06, 0x59ee);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8ea);
-                        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8eb);
-                        rtl8168_mdio_write(tp, 0x06, 0x00e0);
-                        rtl8168_mdio_write(tp, 0x06, 0xf87c);
-                        rtl8168_mdio_write(tp, 0x06, 0xe1f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x7d59);
-                        rtl8168_mdio_write(tp, 0x06, 0x0fef);
-                        rtl8168_mdio_write(tp, 0x06, 0x0139);
-                        rtl8168_mdio_write(tp, 0x06, 0x029e);
-                        rtl8168_mdio_write(tp, 0x06, 0x06ef);
-                        rtl8168_mdio_write(tp, 0x06, 0x1039);
-                        rtl8168_mdio_write(tp, 0x06, 0x089f);
-                        rtl8168_mdio_write(tp, 0x06, 0x2aee);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8ea);
-                        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8eb);
-                        rtl8168_mdio_write(tp, 0x06, 0x01e0);
-                        rtl8168_mdio_write(tp, 0x06, 0xf87c);
-                        rtl8168_mdio_write(tp, 0x06, 0xe1f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x7d58);
-                        rtl8168_mdio_write(tp, 0x06, 0x409e);
-                        rtl8168_mdio_write(tp, 0x06, 0x0f39);
-                        rtl8168_mdio_write(tp, 0x06, 0x46aa);
-                        rtl8168_mdio_write(tp, 0x06, 0x0bbf);
-                        rtl8168_mdio_write(tp, 0x06, 0x8290);
-                        rtl8168_mdio_write(tp, 0x06, 0xd682);
-                        rtl8168_mdio_write(tp, 0x06, 0x9802);
-                        rtl8168_mdio_write(tp, 0x06, 0x014f);
-                        rtl8168_mdio_write(tp, 0x06, 0xae09);
-                        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-                        rtl8168_mdio_write(tp, 0x06, 0x98d6);
-                        rtl8168_mdio_write(tp, 0x06, 0x82a0);
-                        rtl8168_mdio_write(tp, 0x06, 0x0201);
-                        rtl8168_mdio_write(tp, 0x06, 0x4fef);
-                        rtl8168_mdio_write(tp, 0x06, 0x95fe);
-                        rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-                        rtl8168_mdio_write(tp, 0x06, 0x05f8);
-                        rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-                        rtl8168_mdio_write(tp, 0x06, 0xeef8);
-                        rtl8168_mdio_write(tp, 0x06, 0xea00);
-                        rtl8168_mdio_write(tp, 0x06, 0xeef8);
-                        rtl8168_mdio_write(tp, 0x06, 0xeb00);
-                        rtl8168_mdio_write(tp, 0x06, 0xe2f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x7ce3);
-                        rtl8168_mdio_write(tp, 0x06, 0xf87d);
-                        rtl8168_mdio_write(tp, 0x06, 0xa511);
-                        rtl8168_mdio_write(tp, 0x06, 0x1112);
-                        rtl8168_mdio_write(tp, 0x06, 0xd240);
-                        rtl8168_mdio_write(tp, 0x06, 0xd644);
-                        rtl8168_mdio_write(tp, 0x06, 0x4402);
-                        rtl8168_mdio_write(tp, 0x06, 0x8217);
-                        rtl8168_mdio_write(tp, 0x06, 0xd2a0);
-                        rtl8168_mdio_write(tp, 0x06, 0xd6aa);
-                        rtl8168_mdio_write(tp, 0x06, 0xaa02);
-                        rtl8168_mdio_write(tp, 0x06, 0x8217);
-                        rtl8168_mdio_write(tp, 0x06, 0xae0f);
-                        rtl8168_mdio_write(tp, 0x06, 0xa544);
-                        rtl8168_mdio_write(tp, 0x06, 0x4402);
-                        rtl8168_mdio_write(tp, 0x06, 0xae4d);
-                        rtl8168_mdio_write(tp, 0x06, 0xa5aa);
-                        rtl8168_mdio_write(tp, 0x06, 0xaa02);
-                        rtl8168_mdio_write(tp, 0x06, 0xae47);
-                        rtl8168_mdio_write(tp, 0x06, 0xaf82);
-                        rtl8168_mdio_write(tp, 0x06, 0x13ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834d);
-                        rtl8168_mdio_write(tp, 0x06, 0x0fee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834c);
-                        rtl8168_mdio_write(tp, 0x06, 0x0fee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834f);
-                        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x8351);
-                        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834a);
-                        rtl8168_mdio_write(tp, 0x06, 0xffee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834b);
-                        rtl8168_mdio_write(tp, 0x06, 0xffe0);
-                        rtl8168_mdio_write(tp, 0x06, 0x8330);
-                        rtl8168_mdio_write(tp, 0x06, 0xe183);
-                        rtl8168_mdio_write(tp, 0x06, 0x3158);
-                        rtl8168_mdio_write(tp, 0x06, 0xfee4);
-                        rtl8168_mdio_write(tp, 0x06, 0xf88a);
-                        rtl8168_mdio_write(tp, 0x06, 0xe5f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x8be0);
-                        rtl8168_mdio_write(tp, 0x06, 0x8332);
-                        rtl8168_mdio_write(tp, 0x06, 0xe183);
-                        rtl8168_mdio_write(tp, 0x06, 0x3359);
-                        rtl8168_mdio_write(tp, 0x06, 0x0fe2);
-                        rtl8168_mdio_write(tp, 0x06, 0x834d);
-                        rtl8168_mdio_write(tp, 0x06, 0x0c24);
-                        rtl8168_mdio_write(tp, 0x06, 0x5af0);
-                        rtl8168_mdio_write(tp, 0x06, 0x1e12);
-                        rtl8168_mdio_write(tp, 0x06, 0xe4f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x8ce5);
-                        rtl8168_mdio_write(tp, 0x06, 0xf88d);
-                        rtl8168_mdio_write(tp, 0x06, 0xaf82);
-                        rtl8168_mdio_write(tp, 0x06, 0x13e0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834f);
-                        rtl8168_mdio_write(tp, 0x06, 0x10e4);
-                        rtl8168_mdio_write(tp, 0x06, 0x834f);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e78);
-                        rtl8168_mdio_write(tp, 0x06, 0x009f);
-                        rtl8168_mdio_write(tp, 0x06, 0x0ae0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834f);
-                        rtl8168_mdio_write(tp, 0x06, 0xa010);
-                        rtl8168_mdio_write(tp, 0x06, 0xa5ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x01e0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x7805);
-                        rtl8168_mdio_write(tp, 0x06, 0x9e9a);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e78);
-                        rtl8168_mdio_write(tp, 0x06, 0x049e);
-                        rtl8168_mdio_write(tp, 0x06, 0x10e0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x7803);
-                        rtl8168_mdio_write(tp, 0x06, 0x9e0f);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e78);
-                        rtl8168_mdio_write(tp, 0x06, 0x019e);
-                        rtl8168_mdio_write(tp, 0x06, 0x05ae);
-                        rtl8168_mdio_write(tp, 0x06, 0x0caf);
-                        rtl8168_mdio_write(tp, 0x06, 0x81f8);
-                        rtl8168_mdio_write(tp, 0x06, 0xaf81);
-                        rtl8168_mdio_write(tp, 0x06, 0xa3af);
-                        rtl8168_mdio_write(tp, 0x06, 0x81dc);
-                        rtl8168_mdio_write(tp, 0x06, 0xaf82);
-                        rtl8168_mdio_write(tp, 0x06, 0x13ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x8348);
-                        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x8349);
-                        rtl8168_mdio_write(tp, 0x06, 0x00e0);
-                        rtl8168_mdio_write(tp, 0x06, 0x8351);
-                        rtl8168_mdio_write(tp, 0x06, 0x10e4);
-                        rtl8168_mdio_write(tp, 0x06, 0x8351);
-                        rtl8168_mdio_write(tp, 0x06, 0x5801);
-                        rtl8168_mdio_write(tp, 0x06, 0x9fea);
-                        rtl8168_mdio_write(tp, 0x06, 0xd000);
-                        rtl8168_mdio_write(tp, 0x06, 0xd180);
-                        rtl8168_mdio_write(tp, 0x06, 0x1f66);
-                        rtl8168_mdio_write(tp, 0x06, 0xe2f8);
-                        rtl8168_mdio_write(tp, 0x06, 0xeae3);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8eb);
-                        rtl8168_mdio_write(tp, 0x06, 0x5af8);
-                        rtl8168_mdio_write(tp, 0x06, 0x1e20);
-                        rtl8168_mdio_write(tp, 0x06, 0xe6f8);
-                        rtl8168_mdio_write(tp, 0x06, 0xeae5);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8eb);
-                        rtl8168_mdio_write(tp, 0x06, 0xd302);
-                        rtl8168_mdio_write(tp, 0x06, 0xb3fe);
-                        rtl8168_mdio_write(tp, 0x06, 0xe2f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x7cef);
-                        rtl8168_mdio_write(tp, 0x06, 0x325b);
-                        rtl8168_mdio_write(tp, 0x06, 0x80e3);
-                        rtl8168_mdio_write(tp, 0x06, 0xf87d);
-                        rtl8168_mdio_write(tp, 0x06, 0x9e03);
-                        rtl8168_mdio_write(tp, 0x06, 0x7dff);
-                        rtl8168_mdio_write(tp, 0x06, 0xff0d);
-                        rtl8168_mdio_write(tp, 0x06, 0x581c);
-                        rtl8168_mdio_write(tp, 0x06, 0x551a);
-                        rtl8168_mdio_write(tp, 0x06, 0x6511);
-                        rtl8168_mdio_write(tp, 0x06, 0xa190);
-                        rtl8168_mdio_write(tp, 0x06, 0xd3e2);
-                        rtl8168_mdio_write(tp, 0x06, 0x8348);
-                        rtl8168_mdio_write(tp, 0x06, 0xe383);
-                        rtl8168_mdio_write(tp, 0x06, 0x491b);
-                        rtl8168_mdio_write(tp, 0x06, 0x56ab);
-                        rtl8168_mdio_write(tp, 0x06, 0x08ef);
-                        rtl8168_mdio_write(tp, 0x06, 0x56e6);
-                        rtl8168_mdio_write(tp, 0x06, 0x8348);
-                        rtl8168_mdio_write(tp, 0x06, 0xe783);
-                        rtl8168_mdio_write(tp, 0x06, 0x4910);
-                        rtl8168_mdio_write(tp, 0x06, 0xd180);
-                        rtl8168_mdio_write(tp, 0x06, 0x1f66);
-                        rtl8168_mdio_write(tp, 0x06, 0xa004);
-                        rtl8168_mdio_write(tp, 0x06, 0xb9e2);
-                        rtl8168_mdio_write(tp, 0x06, 0x8348);
-                        rtl8168_mdio_write(tp, 0x06, 0xe383);
-                        rtl8168_mdio_write(tp, 0x06, 0x49ef);
-                        rtl8168_mdio_write(tp, 0x06, 0x65e2);
-                        rtl8168_mdio_write(tp, 0x06, 0x834a);
-                        rtl8168_mdio_write(tp, 0x06, 0xe383);
-                        rtl8168_mdio_write(tp, 0x06, 0x4b1b);
-                        rtl8168_mdio_write(tp, 0x06, 0x56aa);
-                        rtl8168_mdio_write(tp, 0x06, 0x0eef);
-                        rtl8168_mdio_write(tp, 0x06, 0x56e6);
-                        rtl8168_mdio_write(tp, 0x06, 0x834a);
-                        rtl8168_mdio_write(tp, 0x06, 0xe783);
-                        rtl8168_mdio_write(tp, 0x06, 0x4be2);
-                        rtl8168_mdio_write(tp, 0x06, 0x834d);
-                        rtl8168_mdio_write(tp, 0x06, 0xe683);
-                        rtl8168_mdio_write(tp, 0x06, 0x4ce0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834d);
-                        rtl8168_mdio_write(tp, 0x06, 0xa000);
-                        rtl8168_mdio_write(tp, 0x06, 0x0caf);
-                        rtl8168_mdio_write(tp, 0x06, 0x81dc);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4d10);
-                        rtl8168_mdio_write(tp, 0x06, 0xe483);
-                        rtl8168_mdio_write(tp, 0x06, 0x4dae);
-                        rtl8168_mdio_write(tp, 0x06, 0x0480);
-                        rtl8168_mdio_write(tp, 0x06, 0xe483);
-                        rtl8168_mdio_write(tp, 0x06, 0x4de0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x7803);
-                        rtl8168_mdio_write(tp, 0x06, 0x9e0b);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e78);
-                        rtl8168_mdio_write(tp, 0x06, 0x049e);
-                        rtl8168_mdio_write(tp, 0x06, 0x04ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x02e0);
-                        rtl8168_mdio_write(tp, 0x06, 0x8332);
-                        rtl8168_mdio_write(tp, 0x06, 0xe183);
-                        rtl8168_mdio_write(tp, 0x06, 0x3359);
-                        rtl8168_mdio_write(tp, 0x06, 0x0fe2);
-                        rtl8168_mdio_write(tp, 0x06, 0x834d);
-                        rtl8168_mdio_write(tp, 0x06, 0x0c24);
-                        rtl8168_mdio_write(tp, 0x06, 0x5af0);
-                        rtl8168_mdio_write(tp, 0x06, 0x1e12);
-                        rtl8168_mdio_write(tp, 0x06, 0xe4f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x8ce5);
-                        rtl8168_mdio_write(tp, 0x06, 0xf88d);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x30e1);
-                        rtl8168_mdio_write(tp, 0x06, 0x8331);
-                        rtl8168_mdio_write(tp, 0x06, 0x6801);
-                        rtl8168_mdio_write(tp, 0x06, 0xe4f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x8ae5);
-                        rtl8168_mdio_write(tp, 0x06, 0xf88b);
-                        rtl8168_mdio_write(tp, 0x06, 0xae37);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e03);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4ce1);
-                        rtl8168_mdio_write(tp, 0x06, 0x834d);
-                        rtl8168_mdio_write(tp, 0x06, 0x1b01);
-                        rtl8168_mdio_write(tp, 0x06, 0x9e04);
-                        rtl8168_mdio_write(tp, 0x06, 0xaaa1);
-                        rtl8168_mdio_write(tp, 0x06, 0xaea8);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e04);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4f00);
-                        rtl8168_mdio_write(tp, 0x06, 0xaeab);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4f78);
-                        rtl8168_mdio_write(tp, 0x06, 0x039f);
-                        rtl8168_mdio_write(tp, 0x06, 0x14ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x05d2);
-                        rtl8168_mdio_write(tp, 0x06, 0x40d6);
-                        rtl8168_mdio_write(tp, 0x06, 0x5554);
-                        rtl8168_mdio_write(tp, 0x06, 0x0282);
-                        rtl8168_mdio_write(tp, 0x06, 0x17d2);
-                        rtl8168_mdio_write(tp, 0x06, 0xa0d6);
-                        rtl8168_mdio_write(tp, 0x06, 0xba00);
-                        rtl8168_mdio_write(tp, 0x06, 0x0282);
-                        rtl8168_mdio_write(tp, 0x06, 0x17fe);
-                        rtl8168_mdio_write(tp, 0x06, 0xfdfc);
-                        rtl8168_mdio_write(tp, 0x06, 0x05f8);
-                        rtl8168_mdio_write(tp, 0x06, 0xe0f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x60e1);
-                        rtl8168_mdio_write(tp, 0x06, 0xf861);
-                        rtl8168_mdio_write(tp, 0x06, 0x6802);
-                        rtl8168_mdio_write(tp, 0x06, 0xe4f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x60e5);
-                        rtl8168_mdio_write(tp, 0x06, 0xf861);
-                        rtl8168_mdio_write(tp, 0x06, 0xe0f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x48e1);
-                        rtl8168_mdio_write(tp, 0x06, 0xf849);
-                        rtl8168_mdio_write(tp, 0x06, 0x580f);
-                        rtl8168_mdio_write(tp, 0x06, 0x1e02);
-                        rtl8168_mdio_write(tp, 0x06, 0xe4f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x48e5);
-                        rtl8168_mdio_write(tp, 0x06, 0xf849);
-                        rtl8168_mdio_write(tp, 0x06, 0xd000);
-                        rtl8168_mdio_write(tp, 0x06, 0x0282);
-                        rtl8168_mdio_write(tp, 0x06, 0x5bbf);
-                        rtl8168_mdio_write(tp, 0x06, 0x8350);
-                        rtl8168_mdio_write(tp, 0x06, 0xef46);
-                        rtl8168_mdio_write(tp, 0x06, 0xdc19);
-                        rtl8168_mdio_write(tp, 0x06, 0xddd0);
-                        rtl8168_mdio_write(tp, 0x06, 0x0102);
-                        rtl8168_mdio_write(tp, 0x06, 0x825b);
-                        rtl8168_mdio_write(tp, 0x06, 0x0282);
-                        rtl8168_mdio_write(tp, 0x06, 0x77e0);
-                        rtl8168_mdio_write(tp, 0x06, 0xf860);
-                        rtl8168_mdio_write(tp, 0x06, 0xe1f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x6158);
-                        rtl8168_mdio_write(tp, 0x06, 0xfde4);
-                        rtl8168_mdio_write(tp, 0x06, 0xf860);
-                        rtl8168_mdio_write(tp, 0x06, 0xe5f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x61fc);
-                        rtl8168_mdio_write(tp, 0x06, 0x04f9);
-                        rtl8168_mdio_write(tp, 0x06, 0xfafb);
-                        rtl8168_mdio_write(tp, 0x06, 0xc6bf);
-                        rtl8168_mdio_write(tp, 0x06, 0xf840);
-                        rtl8168_mdio_write(tp, 0x06, 0xbe83);
-                        rtl8168_mdio_write(tp, 0x06, 0x50a0);
-                        rtl8168_mdio_write(tp, 0x06, 0x0101);
-                        rtl8168_mdio_write(tp, 0x06, 0x071b);
-                        rtl8168_mdio_write(tp, 0x06, 0x89cf);
-                        rtl8168_mdio_write(tp, 0x06, 0xd208);
-                        rtl8168_mdio_write(tp, 0x06, 0xebdb);
-                        rtl8168_mdio_write(tp, 0x06, 0x19b2);
-                        rtl8168_mdio_write(tp, 0x06, 0xfbff);
-                        rtl8168_mdio_write(tp, 0x06, 0xfefd);
-                        rtl8168_mdio_write(tp, 0x06, 0x04f8);
-                        rtl8168_mdio_write(tp, 0x06, 0xe0f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x48e1);
-                        rtl8168_mdio_write(tp, 0x06, 0xf849);
-                        rtl8168_mdio_write(tp, 0x06, 0x6808);
-                        rtl8168_mdio_write(tp, 0x06, 0xe4f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x48e5);
-                        rtl8168_mdio_write(tp, 0x06, 0xf849);
-                        rtl8168_mdio_write(tp, 0x06, 0x58f7);
-                        rtl8168_mdio_write(tp, 0x06, 0xe4f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x48e5);
-                        rtl8168_mdio_write(tp, 0x06, 0xf849);
-                        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                        rtl8168_mdio_write(tp, 0x06, 0x4d20);
-                        rtl8168_mdio_write(tp, 0x06, 0x0002);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e22);
-                        rtl8168_mdio_write(tp, 0x06, 0x0002);
-                        rtl8168_mdio_write(tp, 0x06, 0x4ddf);
-                        rtl8168_mdio_write(tp, 0x06, 0xff01);
-                        rtl8168_mdio_write(tp, 0x06, 0x4edd);
-                        rtl8168_mdio_write(tp, 0x06, 0xff01);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8fa);
-                        rtl8168_mdio_write(tp, 0x06, 0xfbef);
-                        rtl8168_mdio_write(tp, 0x06, 0x79bf);
-                        rtl8168_mdio_write(tp, 0x06, 0xf822);
-                        rtl8168_mdio_write(tp, 0x06, 0xd819);
-                        rtl8168_mdio_write(tp, 0x06, 0xd958);
-                        rtl8168_mdio_write(tp, 0x06, 0x849f);
-                        rtl8168_mdio_write(tp, 0x06, 0x09bf);
-                        rtl8168_mdio_write(tp, 0x06, 0x82be);
-                        rtl8168_mdio_write(tp, 0x06, 0xd682);
-                        rtl8168_mdio_write(tp, 0x06, 0xc602);
-                        rtl8168_mdio_write(tp, 0x06, 0x014f);
-                        rtl8168_mdio_write(tp, 0x06, 0xef97);
-                        rtl8168_mdio_write(tp, 0x06, 0xfffe);
-                        rtl8168_mdio_write(tp, 0x06, 0xfc05);
-                        rtl8168_mdio_write(tp, 0x06, 0x17ff);
-                        rtl8168_mdio_write(tp, 0x06, 0xfe01);
-                        rtl8168_mdio_write(tp, 0x06, 0x1700);
-                        rtl8168_mdio_write(tp, 0x06, 0x0102);
-                        rtl8168_mdio_write(tp, 0x05, 0x83d8);
-                        rtl8168_mdio_write(tp, 0x06, 0x8051);
-                        rtl8168_mdio_write(tp, 0x05, 0x83d6);
-                        rtl8168_mdio_write(tp, 0x06, 0x82a0);
-                        rtl8168_mdio_write(tp, 0x05, 0x83d4);
-                        rtl8168_mdio_write(tp, 0x06, 0x8000);
-                        rtl8168_mdio_write(tp, 0x02, 0x2010);
-                        rtl8168_mdio_write(tp, 0x03, 0xdc00);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                        rtl8168_mdio_write(tp, 0x0b, 0x0600);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-                        rtl8168_mdio_write(tp, 0x06, 0x00fc);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                }
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x0D, 0xF880);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_10) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x06, 0x4064);
-                rtl8168_mdio_write(tp, 0x07, 0x2863);
-                rtl8168_mdio_write(tp, 0x08, 0x059C);
-                rtl8168_mdio_write(tp, 0x09, 0x26B4);
-                rtl8168_mdio_write(tp, 0x0A, 0x6A19);
-                rtl8168_mdio_write(tp, 0x0B, 0xDCC8);
-                rtl8168_mdio_write(tp, 0x10, 0xF06D);
-                rtl8168_mdio_write(tp, 0x14, 0x7F68);
-                rtl8168_mdio_write(tp, 0x18, 0x7FD9);
-                rtl8168_mdio_write(tp, 0x1C, 0xF0FF);
-                rtl8168_mdio_write(tp, 0x1D, 0x3D9C);
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x12, 0xF49F);
-                rtl8168_mdio_write(tp, 0x13, 0x070B);
-                rtl8168_mdio_write(tp, 0x1A, 0x05AD);
-                rtl8168_mdio_write(tp, 0x14, 0x94C0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x06, 0x5561);
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8332);
-                rtl8168_mdio_write(tp, 0x06, 0x5561);
-
-                if (rtl8168_efuse_read(tp, 0x01) == 0xb1) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                        rtl8168_mdio_write(tp, 0x05, 0x669A);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8330);
-                        rtl8168_mdio_write(tp, 0x06, 0x669A);
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                        gphy_val = rtl8168_mdio_read(tp, 0x0D);
-                        if ((gphy_val & 0x00FF) != 0x006C) {
-                                gphy_val &= 0xFF00;
-                                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x0065);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x0066);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x0067);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x0068);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x0069);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x006A);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x006B);
-                                rtl8168_mdio_write(tp, 0x0D, gphy_val | 0x006C);
-                        }
-                } else {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                        rtl8168_mdio_write(tp, 0x05, 0x2642);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8330);
-                        rtl8168_mdio_write(tp, 0x06, 0x2642);
-                }
-
-                if (rtl8168_efuse_read(tp, 0x30) == 0x98) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                        rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) & ~BIT_1);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x01, rtl8168_mdio_read(tp, 0x01) | BIT_9);
-                } else if (rtl8168_efuse_read(tp, 0x30) == 0x90) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x01, rtl8168_mdio_read(tp, 0x01) & ~BIT_9);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                        rtl8168_mdio_write(tp, 0x16, 0x5101);
-                }
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x02);
-                gphy_val &= ~BIT_10;
-                gphy_val &= ~BIT_9;
-                gphy_val |= BIT_8;
-                rtl8168_mdio_write(tp, 0x02, gphy_val);
-                gphy_val = rtl8168_mdio_read(tp, 0x03);
-                gphy_val &= ~BIT_15;
-                gphy_val &= ~BIT_14;
-                gphy_val &= ~BIT_13;
-                rtl8168_mdio_write(tp, 0x03, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x17, 0x0CC0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x0F);
-                gphy_val |= BIT_4;
-                gphy_val |= BIT_2;
-                gphy_val |= BIT_1;
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x0F, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x001B);
-                if (rtl8168_mdio_read(tp, 0x06) == 0xB300) {
-                        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-                        rtl8168_mdio_write(tp, 0x06, 0x0080);
-                        rtl8168_mdio_write(tp, 0x05, 0x8000);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8f9);
-                        rtl8168_mdio_write(tp, 0x06, 0xfaee);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8ea);
-                        rtl8168_mdio_write(tp, 0x06, 0x00ee);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8eb);
-                        rtl8168_mdio_write(tp, 0x06, 0x00e2);
-                        rtl8168_mdio_write(tp, 0x06, 0xf87c);
-                        rtl8168_mdio_write(tp, 0x06, 0xe3f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x7da5);
-                        rtl8168_mdio_write(tp, 0x06, 0x1111);
-                        rtl8168_mdio_write(tp, 0x06, 0x12d2);
-                        rtl8168_mdio_write(tp, 0x06, 0x40d6);
-                        rtl8168_mdio_write(tp, 0x06, 0x4444);
-                        rtl8168_mdio_write(tp, 0x06, 0x0281);
-                        rtl8168_mdio_write(tp, 0x06, 0xc6d2);
-                        rtl8168_mdio_write(tp, 0x06, 0xa0d6);
-                        rtl8168_mdio_write(tp, 0x06, 0xaaaa);
-                        rtl8168_mdio_write(tp, 0x06, 0x0281);
-                        rtl8168_mdio_write(tp, 0x06, 0xc6ae);
-                        rtl8168_mdio_write(tp, 0x06, 0x0fa5);
-                        rtl8168_mdio_write(tp, 0x06, 0x4444);
-                        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                        rtl8168_mdio_write(tp, 0x06, 0x4da5);
-                        rtl8168_mdio_write(tp, 0x06, 0xaaaa);
-                        rtl8168_mdio_write(tp, 0x06, 0x02ae);
-                        rtl8168_mdio_write(tp, 0x06, 0x47af);
-                        rtl8168_mdio_write(tp, 0x06, 0x81c2);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e00);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4d0f);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4c0f);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4f00);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x5100);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4aff);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4bff);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x30e1);
-                        rtl8168_mdio_write(tp, 0x06, 0x8331);
-                        rtl8168_mdio_write(tp, 0x06, 0x58fe);
-                        rtl8168_mdio_write(tp, 0x06, 0xe4f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x8ae5);
-                        rtl8168_mdio_write(tp, 0x06, 0xf88b);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x32e1);
-                        rtl8168_mdio_write(tp, 0x06, 0x8333);
-                        rtl8168_mdio_write(tp, 0x06, 0x590f);
-                        rtl8168_mdio_write(tp, 0x06, 0xe283);
-                        rtl8168_mdio_write(tp, 0x06, 0x4d0c);
-                        rtl8168_mdio_write(tp, 0x06, 0x245a);
-                        rtl8168_mdio_write(tp, 0x06, 0xf01e);
-                        rtl8168_mdio_write(tp, 0x06, 0x12e4);
-                        rtl8168_mdio_write(tp, 0x06, 0xf88c);
-                        rtl8168_mdio_write(tp, 0x06, 0xe5f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x8daf);
-                        rtl8168_mdio_write(tp, 0x06, 0x81c2);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4f10);
-                        rtl8168_mdio_write(tp, 0x06, 0xe483);
-                        rtl8168_mdio_write(tp, 0x06, 0x4fe0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x7800);
-                        rtl8168_mdio_write(tp, 0x06, 0x9f0a);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4fa0);
-                        rtl8168_mdio_write(tp, 0x06, 0x10a5);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e01);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e78);
-                        rtl8168_mdio_write(tp, 0x06, 0x059e);
-                        rtl8168_mdio_write(tp, 0x06, 0x9ae0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x7804);
-                        rtl8168_mdio_write(tp, 0x06, 0x9e10);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e78);
-                        rtl8168_mdio_write(tp, 0x06, 0x039e);
-                        rtl8168_mdio_write(tp, 0x06, 0x0fe0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x7801);
-                        rtl8168_mdio_write(tp, 0x06, 0x9e05);
-                        rtl8168_mdio_write(tp, 0x06, 0xae0c);
-                        rtl8168_mdio_write(tp, 0x06, 0xaf81);
-                        rtl8168_mdio_write(tp, 0x06, 0xa7af);
-                        rtl8168_mdio_write(tp, 0x06, 0x8152);
-                        rtl8168_mdio_write(tp, 0x06, 0xaf81);
-                        rtl8168_mdio_write(tp, 0x06, 0x8baf);
-                        rtl8168_mdio_write(tp, 0x06, 0x81c2);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4800);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4900);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x5110);
-                        rtl8168_mdio_write(tp, 0x06, 0xe483);
-                        rtl8168_mdio_write(tp, 0x06, 0x5158);
-                        rtl8168_mdio_write(tp, 0x06, 0x019f);
-                        rtl8168_mdio_write(tp, 0x06, 0xead0);
-                        rtl8168_mdio_write(tp, 0x06, 0x00d1);
-                        rtl8168_mdio_write(tp, 0x06, 0x801f);
-                        rtl8168_mdio_write(tp, 0x06, 0x66e2);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8ea);
-                        rtl8168_mdio_write(tp, 0x06, 0xe3f8);
-                        rtl8168_mdio_write(tp, 0x06, 0xeb5a);
-                        rtl8168_mdio_write(tp, 0x06, 0xf81e);
-                        rtl8168_mdio_write(tp, 0x06, 0x20e6);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8ea);
-                        rtl8168_mdio_write(tp, 0x06, 0xe5f8);
-                        rtl8168_mdio_write(tp, 0x06, 0xebd3);
-                        rtl8168_mdio_write(tp, 0x06, 0x02b3);
-                        rtl8168_mdio_write(tp, 0x06, 0xfee2);
-                        rtl8168_mdio_write(tp, 0x06, 0xf87c);
-                        rtl8168_mdio_write(tp, 0x06, 0xef32);
-                        rtl8168_mdio_write(tp, 0x06, 0x5b80);
-                        rtl8168_mdio_write(tp, 0x06, 0xe3f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x7d9e);
-                        rtl8168_mdio_write(tp, 0x06, 0x037d);
-                        rtl8168_mdio_write(tp, 0x06, 0xffff);
-                        rtl8168_mdio_write(tp, 0x06, 0x0d58);
-                        rtl8168_mdio_write(tp, 0x06, 0x1c55);
-                        rtl8168_mdio_write(tp, 0x06, 0x1a65);
-                        rtl8168_mdio_write(tp, 0x06, 0x11a1);
-                        rtl8168_mdio_write(tp, 0x06, 0x90d3);
-                        rtl8168_mdio_write(tp, 0x06, 0xe283);
-                        rtl8168_mdio_write(tp, 0x06, 0x48e3);
-                        rtl8168_mdio_write(tp, 0x06, 0x8349);
-                        rtl8168_mdio_write(tp, 0x06, 0x1b56);
-                        rtl8168_mdio_write(tp, 0x06, 0xab08);
-                        rtl8168_mdio_write(tp, 0x06, 0xef56);
-                        rtl8168_mdio_write(tp, 0x06, 0xe683);
-                        rtl8168_mdio_write(tp, 0x06, 0x48e7);
-                        rtl8168_mdio_write(tp, 0x06, 0x8349);
-                        rtl8168_mdio_write(tp, 0x06, 0x10d1);
-                        rtl8168_mdio_write(tp, 0x06, 0x801f);
-                        rtl8168_mdio_write(tp, 0x06, 0x66a0);
-                        rtl8168_mdio_write(tp, 0x06, 0x04b9);
-                        rtl8168_mdio_write(tp, 0x06, 0xe283);
-                        rtl8168_mdio_write(tp, 0x06, 0x48e3);
-                        rtl8168_mdio_write(tp, 0x06, 0x8349);
-                        rtl8168_mdio_write(tp, 0x06, 0xef65);
-                        rtl8168_mdio_write(tp, 0x06, 0xe283);
-                        rtl8168_mdio_write(tp, 0x06, 0x4ae3);
-                        rtl8168_mdio_write(tp, 0x06, 0x834b);
-                        rtl8168_mdio_write(tp, 0x06, 0x1b56);
-                        rtl8168_mdio_write(tp, 0x06, 0xaa0e);
-                        rtl8168_mdio_write(tp, 0x06, 0xef56);
-                        rtl8168_mdio_write(tp, 0x06, 0xe683);
-                        rtl8168_mdio_write(tp, 0x06, 0x4ae7);
-                        rtl8168_mdio_write(tp, 0x06, 0x834b);
-                        rtl8168_mdio_write(tp, 0x06, 0xe283);
-                        rtl8168_mdio_write(tp, 0x06, 0x4de6);
-                        rtl8168_mdio_write(tp, 0x06, 0x834c);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4da0);
-                        rtl8168_mdio_write(tp, 0x06, 0x000c);
-                        rtl8168_mdio_write(tp, 0x06, 0xaf81);
-                        rtl8168_mdio_write(tp, 0x06, 0x8be0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834d);
-                        rtl8168_mdio_write(tp, 0x06, 0x10e4);
-                        rtl8168_mdio_write(tp, 0x06, 0x834d);
-                        rtl8168_mdio_write(tp, 0x06, 0xae04);
-                        rtl8168_mdio_write(tp, 0x06, 0x80e4);
-                        rtl8168_mdio_write(tp, 0x06, 0x834d);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e78);
-                        rtl8168_mdio_write(tp, 0x06, 0x039e);
-                        rtl8168_mdio_write(tp, 0x06, 0x0be0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x7804);
-                        rtl8168_mdio_write(tp, 0x06, 0x9e04);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e02);
-                        rtl8168_mdio_write(tp, 0x06, 0xe083);
-                        rtl8168_mdio_write(tp, 0x06, 0x32e1);
-                        rtl8168_mdio_write(tp, 0x06, 0x8333);
-                        rtl8168_mdio_write(tp, 0x06, 0x590f);
-                        rtl8168_mdio_write(tp, 0x06, 0xe283);
-                        rtl8168_mdio_write(tp, 0x06, 0x4d0c);
-                        rtl8168_mdio_write(tp, 0x06, 0x245a);
-                        rtl8168_mdio_write(tp, 0x06, 0xf01e);
-                        rtl8168_mdio_write(tp, 0x06, 0x12e4);
-                        rtl8168_mdio_write(tp, 0x06, 0xf88c);
-                        rtl8168_mdio_write(tp, 0x06, 0xe5f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x8de0);
-                        rtl8168_mdio_write(tp, 0x06, 0x8330);
-                        rtl8168_mdio_write(tp, 0x06, 0xe183);
-                        rtl8168_mdio_write(tp, 0x06, 0x3168);
-                        rtl8168_mdio_write(tp, 0x06, 0x01e4);
-                        rtl8168_mdio_write(tp, 0x06, 0xf88a);
-                        rtl8168_mdio_write(tp, 0x06, 0xe5f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x8bae);
-                        rtl8168_mdio_write(tp, 0x06, 0x37ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x03e0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834c);
-                        rtl8168_mdio_write(tp, 0x06, 0xe183);
-                        rtl8168_mdio_write(tp, 0x06, 0x4d1b);
-                        rtl8168_mdio_write(tp, 0x06, 0x019e);
-                        rtl8168_mdio_write(tp, 0x06, 0x04aa);
-                        rtl8168_mdio_write(tp, 0x06, 0xa1ae);
-                        rtl8168_mdio_write(tp, 0x06, 0xa8ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834e);
-                        rtl8168_mdio_write(tp, 0x06, 0x04ee);
-                        rtl8168_mdio_write(tp, 0x06, 0x834f);
-                        rtl8168_mdio_write(tp, 0x06, 0x00ae);
-                        rtl8168_mdio_write(tp, 0x06, 0xabe0);
-                        rtl8168_mdio_write(tp, 0x06, 0x834f);
-                        rtl8168_mdio_write(tp, 0x06, 0x7803);
-                        rtl8168_mdio_write(tp, 0x06, 0x9f14);
-                        rtl8168_mdio_write(tp, 0x06, 0xee83);
-                        rtl8168_mdio_write(tp, 0x06, 0x4e05);
-                        rtl8168_mdio_write(tp, 0x06, 0xd240);
-                        rtl8168_mdio_write(tp, 0x06, 0xd655);
-                        rtl8168_mdio_write(tp, 0x06, 0x5402);
-                        rtl8168_mdio_write(tp, 0x06, 0x81c6);
-                        rtl8168_mdio_write(tp, 0x06, 0xd2a0);
-                        rtl8168_mdio_write(tp, 0x06, 0xd6ba);
-                        rtl8168_mdio_write(tp, 0x06, 0x0002);
-                        rtl8168_mdio_write(tp, 0x06, 0x81c6);
-                        rtl8168_mdio_write(tp, 0x06, 0xfefd);
-                        rtl8168_mdio_write(tp, 0x06, 0xfc05);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                        rtl8168_mdio_write(tp, 0x06, 0xf860);
-                        rtl8168_mdio_write(tp, 0x06, 0xe1f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x6168);
-                        rtl8168_mdio_write(tp, 0x06, 0x02e4);
-                        rtl8168_mdio_write(tp, 0x06, 0xf860);
-                        rtl8168_mdio_write(tp, 0x06, 0xe5f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x61e0);
-                        rtl8168_mdio_write(tp, 0x06, 0xf848);
-                        rtl8168_mdio_write(tp, 0x06, 0xe1f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x4958);
-                        rtl8168_mdio_write(tp, 0x06, 0x0f1e);
-                        rtl8168_mdio_write(tp, 0x06, 0x02e4);
-                        rtl8168_mdio_write(tp, 0x06, 0xf848);
-                        rtl8168_mdio_write(tp, 0x06, 0xe5f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x49d0);
-                        rtl8168_mdio_write(tp, 0x06, 0x0002);
-                        rtl8168_mdio_write(tp, 0x06, 0x820a);
-                        rtl8168_mdio_write(tp, 0x06, 0xbf83);
-                        rtl8168_mdio_write(tp, 0x06, 0x50ef);
-                        rtl8168_mdio_write(tp, 0x06, 0x46dc);
-                        rtl8168_mdio_write(tp, 0x06, 0x19dd);
-                        rtl8168_mdio_write(tp, 0x06, 0xd001);
-                        rtl8168_mdio_write(tp, 0x06, 0x0282);
-                        rtl8168_mdio_write(tp, 0x06, 0x0a02);
-                        rtl8168_mdio_write(tp, 0x06, 0x8226);
-                        rtl8168_mdio_write(tp, 0x06, 0xe0f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x60e1);
-                        rtl8168_mdio_write(tp, 0x06, 0xf861);
-                        rtl8168_mdio_write(tp, 0x06, 0x58fd);
-                        rtl8168_mdio_write(tp, 0x06, 0xe4f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x60e5);
-                        rtl8168_mdio_write(tp, 0x06, 0xf861);
-                        rtl8168_mdio_write(tp, 0x06, 0xfc04);
-                        rtl8168_mdio_write(tp, 0x06, 0xf9fa);
-                        rtl8168_mdio_write(tp, 0x06, 0xfbc6);
-                        rtl8168_mdio_write(tp, 0x06, 0xbff8);
-                        rtl8168_mdio_write(tp, 0x06, 0x40be);
-                        rtl8168_mdio_write(tp, 0x06, 0x8350);
-                        rtl8168_mdio_write(tp, 0x06, 0xa001);
-                        rtl8168_mdio_write(tp, 0x06, 0x0107);
-                        rtl8168_mdio_write(tp, 0x06, 0x1b89);
-                        rtl8168_mdio_write(tp, 0x06, 0xcfd2);
-                        rtl8168_mdio_write(tp, 0x06, 0x08eb);
-                        rtl8168_mdio_write(tp, 0x06, 0xdb19);
-                        rtl8168_mdio_write(tp, 0x06, 0xb2fb);
-                        rtl8168_mdio_write(tp, 0x06, 0xfffe);
-                        rtl8168_mdio_write(tp, 0x06, 0xfd04);
-                        rtl8168_mdio_write(tp, 0x06, 0xf8e0);
-                        rtl8168_mdio_write(tp, 0x06, 0xf848);
-                        rtl8168_mdio_write(tp, 0x06, 0xe1f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x4968);
-                        rtl8168_mdio_write(tp, 0x06, 0x08e4);
-                        rtl8168_mdio_write(tp, 0x06, 0xf848);
-                        rtl8168_mdio_write(tp, 0x06, 0xe5f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x4958);
-                        rtl8168_mdio_write(tp, 0x06, 0xf7e4);
-                        rtl8168_mdio_write(tp, 0x06, 0xf848);
-                        rtl8168_mdio_write(tp, 0x06, 0xe5f8);
-                        rtl8168_mdio_write(tp, 0x06, 0x49fc);
-                        rtl8168_mdio_write(tp, 0x06, 0x044d);
-                        rtl8168_mdio_write(tp, 0x06, 0x2000);
-                        rtl8168_mdio_write(tp, 0x06, 0x024e);
-                        rtl8168_mdio_write(tp, 0x06, 0x2200);
-                        rtl8168_mdio_write(tp, 0x06, 0x024d);
-                        rtl8168_mdio_write(tp, 0x06, 0xdfff);
-                        rtl8168_mdio_write(tp, 0x06, 0x014e);
-                        rtl8168_mdio_write(tp, 0x06, 0xddff);
-                        rtl8168_mdio_write(tp, 0x06, 0x01f8);
-                        rtl8168_mdio_write(tp, 0x06, 0xfafb);
-                        rtl8168_mdio_write(tp, 0x06, 0xef79);
-                        rtl8168_mdio_write(tp, 0x06, 0xbff8);
-                        rtl8168_mdio_write(tp, 0x06, 0x22d8);
-                        rtl8168_mdio_write(tp, 0x06, 0x19d9);
-                        rtl8168_mdio_write(tp, 0x06, 0x5884);
-                        rtl8168_mdio_write(tp, 0x06, 0x9f09);
-                        rtl8168_mdio_write(tp, 0x06, 0xbf82);
-                        rtl8168_mdio_write(tp, 0x06, 0x6dd6);
-                        rtl8168_mdio_write(tp, 0x06, 0x8275);
-                        rtl8168_mdio_write(tp, 0x06, 0x0201);
-                        rtl8168_mdio_write(tp, 0x06, 0x4fef);
-                        rtl8168_mdio_write(tp, 0x06, 0x97ff);
-                        rtl8168_mdio_write(tp, 0x06, 0xfefc);
-                        rtl8168_mdio_write(tp, 0x06, 0x0517);
-                        rtl8168_mdio_write(tp, 0x06, 0xfffe);
-                        rtl8168_mdio_write(tp, 0x06, 0x0117);
-                        rtl8168_mdio_write(tp, 0x06, 0x0001);
-                        rtl8168_mdio_write(tp, 0x06, 0x0200);
-                        rtl8168_mdio_write(tp, 0x05, 0x83d8);
-                        rtl8168_mdio_write(tp, 0x06, 0x8000);
-                        rtl8168_mdio_write(tp, 0x05, 0x83d6);
-                        rtl8168_mdio_write(tp, 0x06, 0x824f);
-                        rtl8168_mdio_write(tp, 0x02, 0x2010);
-                        rtl8168_mdio_write(tp, 0x03, 0xdc00);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                        rtl8168_mdio_write(tp, 0x0b, 0x0600);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0xfff6);
-                        rtl8168_mdio_write(tp, 0x06, 0x00fc);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                }
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x0D, 0xF880);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_11) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x10, 0x0008);
-                rtl8168_mdio_write(tp, 0x0D, 0x006C);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x17, 0x0CC0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x0B, 0xA4D8);
-                rtl8168_mdio_write(tp, 0x09, 0x281C);
-                rtl8168_mdio_write(tp, 0x07, 0x2883);
-                rtl8168_mdio_write(tp, 0x0A, 0x6B35);
-                rtl8168_mdio_write(tp, 0x1D, 0x3DA4);
-                rtl8168_mdio_write(tp, 0x1C, 0xEFFD);
-                rtl8168_mdio_write(tp, 0x14, 0x7F52);
-                rtl8168_mdio_write(tp, 0x18, 0x7FC6);
-                rtl8168_mdio_write(tp, 0x08, 0x0601);
-                rtl8168_mdio_write(tp, 0x06, 0x4063);
-                rtl8168_mdio_write(tp, 0x10, 0xF074);
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x13, 0x0789);
-                rtl8168_mdio_write(tp, 0x12, 0xF4BD);
-                rtl8168_mdio_write(tp, 0x1A, 0x04FD);
-                rtl8168_mdio_write(tp, 0x14, 0x84B0);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x00, 0x9200);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x01, 0x0340);
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x04, 0x4000);
-                rtl8168_mdio_write(tp, 0x03, 0x1D21);
-                rtl8168_mdio_write(tp, 0x02, 0x0C32);
-                rtl8168_mdio_write(tp, 0x01, 0x0200);
-                rtl8168_mdio_write(tp, 0x00, 0x5554);
-                rtl8168_mdio_write(tp, 0x04, 0x4800);
-                rtl8168_mdio_write(tp, 0x04, 0x4000);
-                rtl8168_mdio_write(tp, 0x04, 0xF000);
-                rtl8168_mdio_write(tp, 0x03, 0xDF01);
-                rtl8168_mdio_write(tp, 0x02, 0xDF20);
-                rtl8168_mdio_write(tp, 0x01, 0x101A);
-                rtl8168_mdio_write(tp, 0x00, 0xA0FF);
-                rtl8168_mdio_write(tp, 0x04, 0xF800);
-                rtl8168_mdio_write(tp, 0x04, 0xF000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x0023);
-                rtl8168_mdio_write(tp, 0x16, 0x0000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                gphy_val = rtl8168_mdio_read(tp, 0x0D);
-                gphy_val |= BIT_5;
-                rtl8168_mdio_write(tp, 0x0D, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x0C);
-                gphy_val |= BIT_10;
-                rtl8168_mdio_write(tp, 0x0C, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_12) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x17, 0x0CC0);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                gphy_val = rtl8168_mdio_read(tp, 0x0D);
-                gphy_val |= BIT_5;
-                rtl8168_mdio_write(tp, 0x0D, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x0C);
-                gphy_val |= BIT_10;
-                rtl8168_mdio_write(tp, 0x0C, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x002C);
-                rtl8168_mdio_write(tp, 0x15, 0x035D);
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x01, 0x0300);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_13) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                gphy_val = rtl8168_mdio_read(tp, 0x0D);
-                gphy_val |= BIT_5;
-                rtl8168_mdio_write(tp, 0x0D, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x0C);
-                gphy_val |= BIT_10;
-                rtl8168_mdio_write(tp, 0x0C, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_14 || tp->mcfg == CFG_METHOD_15) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x0023);
-                gphy_val = rtl8168_mdio_read(tp, 0x17) | BIT_1;
-                if (tp->RequiredSecLanDonglePatch)
-                        gphy_val &= ~(BIT_2);
-                else
-                        gphy_val |= (BIT_2);
-                rtl8168_mdio_write(tp, 0x17, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8b80);
-                rtl8168_mdio_write(tp, 0x06, 0xc896);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x0B, 0x6C20);
-                rtl8168_mdio_write(tp, 0x07, 0x2872);
-                rtl8168_mdio_write(tp, 0x1C, 0xEFFF);
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x14, 0x6420);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                gphy_val = rtl8168_mdio_read(tp, 0x08) & 0x00FF;
-                rtl8168_mdio_write(tp, 0x08, gphy_val | 0x8000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x002D);
-                gphy_val = rtl8168_mdio_read(tp, 0x18);
-                rtl8168_mdio_write(tp, 0x18, gphy_val | 0x0010);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                gphy_val = rtl8168_mdio_read(tp, 0x14);
-                rtl8168_mdio_write(tp, 0x14, gphy_val | 0x8000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x00, 0x080B);
-                rtl8168_mdio_write(tp, 0x0B, 0x09D7);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                                rtl8168_mdio_write(tp, 0x15, 0x1006);
-                        }
-                }
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x19, 0x7F46);
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8AD2);
-                rtl8168_mdio_write(tp, 0x06, 0x6810);
-                rtl8168_mdio_write(tp, 0x05, 0x8AD4);
-                rtl8168_mdio_write(tp, 0x06, 0x8002);
-                rtl8168_mdio_write(tp, 0x05, 0x8ADE);
-                rtl8168_mdio_write(tp, 0x06, 0x8025);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x002F);
-                rtl8168_mdio_write(tp, 0x15, 0x1919);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x002D);
-                gphy_val = rtl8168_mdio_read(tp, 0x18);
-                rtl8168_mdio_write(tp, 0x18, gphy_val | 0x0040);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B86);
-                gphy_val = rtl8168_mdio_read(tp, 0x06);
-                rtl8168_mdio_write(tp, 0x06, gphy_val | 0x0001);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x00AC);
-                rtl8168_mdio_write(tp, 0x18, 0x0006);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_16) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B80);
-                gphy_val = rtl8168_mdio_read(tp, 0x06);
-                gphy_val |= BIT_2 | BIT_1;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0004);
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x002D);
-                gphy_val = rtl8168_mdio_read(tp, 0x18);
-                gphy_val |= BIT_4;
-                rtl8168_mdio_write(tp, 0x18, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0002);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                gphy_val = rtl8168_mdio_read(tp, 0x14);
-                gphy_val |= BIT_15;
-                rtl8168_mdio_write(tp, 0x14, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x15, 0x1006);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B86);
-                gphy_val = rtl8168_mdio_read(tp, 0x06);
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                rtl8168_mdio_write(tp, 0x0B, 0x6C14);
-                rtl8168_mdio_write(tp, 0x14, 0x7F3D);
-                rtl8168_mdio_write(tp, 0x1C, 0xFAFE);
-                rtl8168_mdio_write(tp, 0x08, 0x07C5);
-                rtl8168_mdio_write(tp, 0x10, 0xF090);
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x14, 0x641A);
-                rtl8168_mdio_write(tp, 0x1A, 0x0606);
-                rtl8168_mdio_write(tp, 0x12, 0xF480);
-                rtl8168_mdio_write(tp, 0x13, 0x0747);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0004);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x0078);
-                rtl8168_mdio_write(tp, 0x15, 0xA408);
-                rtl8168_mdio_write(tp, 0x17, 0x5100);
-                rtl8168_mdio_write(tp, 0x19, 0x0008);
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x0D, 0x0207);
-                rtl8168_mdio_write(tp, 0x02, 0x5FD0);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0004);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x00A1);
-                gphy_val = rtl8168_mdio_read(tp, 0x1A);
-                gphy_val &= ~BIT_2;
-                rtl8168_mdio_write(tp, 0x1A, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0004);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x002D);
-                gphy_val = rtl8168_mdio_read(tp, 0x16);
-                gphy_val |= BIT_5;
-                rtl8168_mdio_write(tp, 0x16, gphy_val);
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0004);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x00AC);
-                rtl8168_mdio_write(tp, 0x18, 0x0006);
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x09, 0xA20F);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B5B);
-                rtl8168_mdio_write(tp, 0x06, 0x9222);
-                rtl8168_mdio_write(tp, 0x05, 0x8B6D);
-                rtl8168_mdio_write(tp, 0x06, 0x8000);
-                rtl8168_mdio_write(tp, 0x05, 0x8B76);
-                rtl8168_mdio_write(tp, 0x06, 0x8000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                if (pdev->subsystem_vendor == 0x1043 &&
-                    pdev->subsystem_device == 0x13F7) {
-
-                        static const u16 evl_phy_value[] = {
-                                0x8B56, 0x8B5F, 0x8B68, 0x8B71,
-                                0x8B7A, 0x8A7B, 0x8A7E, 0x8A81,
-                                0x8A84, 0x8A87
-                        };
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        for (i = 0; i < ARRAY_SIZE(evl_phy_value); i++) {
-                                rtl8168_mdio_write(tp, 0x05, evl_phy_value[i]);
-                                gphy_val = (0xAA << 8) | (rtl8168_mdio_read(tp, 0x06) & 0xFF);
-                                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                        }
-                        rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                        rtl8168_mdio_write(tp, 0x1E, 0x0078);
-                        rtl8168_mdio_write(tp, 0x17, 0x51AA);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B54);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_11);
-                rtl8168_mdio_write(tp, 0x05, 0x8B5D);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_11);
-                rtl8168_mdio_write(tp, 0x05, 0x8A7C);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A7F);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) | BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A82);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A85);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A88);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B85);
-                gphy_val = rtl8168_mdio_read(tp, 0x06) | BIT_14 | BIT_15;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_17) {
-                if (pdev->subsystem_vendor == 0x144d &&
-                    pdev->subsystem_device == 0xc0a6) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0001);
-                        rtl8168_mdio_write(tp, 0x0e, 0x6b7f);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8B86);
-                        gphy_val = rtl8168_mdio_read(tp, 0x06);
-                        gphy_val |= BIT_4;
-                        rtl8168_mdio_write(tp, 0x06, gphy_val);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                } else {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8B80);
-                        gphy_val = rtl8168_mdio_read(tp, 0x06);
-                        gphy_val |= BIT_2 | BIT_1;
-                        rtl8168_mdio_write(tp, 0x06, gphy_val);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8B86);
-                        gphy_val = rtl8168_mdio_read(tp, 0x06);
-                        gphy_val &= ~BIT_4;
-                        rtl8168_mdio_write(tp, 0x06, gphy_val);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                }
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0004);
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x002D);
-                gphy_val = rtl8168_mdio_read(tp, 0x18);
-                gphy_val |= BIT_4;
-                rtl8168_mdio_write(tp, 0x18, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0002);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                gphy_val = rtl8168_mdio_read(tp, 0x14);
-                gphy_val |= BIT_15;
-                rtl8168_mdio_write(tp, 0x14, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B86);
-                gphy_val = rtl8168_mdio_read(tp, 0x06);
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0004);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x00AC);
-                rtl8168_mdio_write(tp, 0x18, 0x0006);
-                rtl8168_mdio_write(tp, 0x1F, 0x0002);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x09, 0xA20F);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B85);
-                gphy_val = rtl8168_mdio_read(tp, 0x06) | BIT_14 | BIT_15;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B5B);
-                rtl8168_mdio_write(tp, 0x06, 0x9222);
-                rtl8168_mdio_write(tp, 0x05, 0x8B6D);
-                rtl8168_mdio_write(tp, 0x06, 0x8000);
-                rtl8168_mdio_write(tp, 0x05, 0x8B76);
-                rtl8168_mdio_write(tp, 0x06, 0x8000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                if (pdev->subsystem_vendor == 0x1043 &&
-                    pdev->subsystem_device == 0x13F7) {
-
-                        static const u16 evl_phy_value[] = {
-                                0x8B56, 0x8B5F, 0x8B68, 0x8B71,
-                                0x8B7A, 0x8A7B, 0x8A7E, 0x8A81,
-                                0x8A84, 0x8A87
-                        };
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        for (i = 0; i < ARRAY_SIZE(evl_phy_value); i++) {
-                                rtl8168_mdio_write(tp, 0x05, evl_phy_value[i]);
-                                gphy_val = (0xAA << 8) | (rtl8168_mdio_read(tp, 0x06) & 0xFF);
-                                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                        }
-                        rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                        rtl8168_mdio_write(tp, 0x1E, 0x0078);
-                        rtl8168_mdio_write(tp, 0x17, 0x51AA);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B54);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_11);
-                rtl8168_mdio_write(tp, 0x05, 0x8B5D);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_11);
-                rtl8168_mdio_write(tp, 0x05, 0x8A7C);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A7F);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) | BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A82);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A85);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A88);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                                gphy_val = rtl8168_mdio_read(tp, 0x15);
-                                gphy_val |= BIT_12;
-                                rtl8168_mdio_write(tp, 0x15, gphy_val);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_18) {
-                if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8b80);
-                        gphy_val = rtl8168_mdio_read(tp, 0x06);
-                        gphy_val |= BIT_2 | BIT_1;
-                        rtl8168_mdio_write(tp, 0x06, gphy_val);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x002D);
-                gphy_val = rtl8168_mdio_read(tp, 0x18);
-                gphy_val |= BIT_4;
-                rtl8168_mdio_write(tp, 0x18, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                gphy_val = rtl8168_mdio_read(tp, 0x14);
-                gphy_val |= BIT_15;
-                rtl8168_mdio_write(tp, 0x14, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B86);
-                gphy_val = rtl8168_mdio_read(tp, 0x06);
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B85);
-                gphy_val = rtl8168_mdio_read(tp, 0x06);
-                gphy_val |= BIT_14;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x09, 0xA20F);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B55);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x05, 0x8B5E);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x05, 0x8B67);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x05, 0x8B70);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x0078);
-                rtl8168_mdio_write(tp, 0x17, 0x0000);
-                rtl8168_mdio_write(tp, 0x19, 0x00FB);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B79);
-                rtl8168_mdio_write(tp, 0x06, 0xAA00);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0003);
-                rtl8168_mdio_write(tp, 0x01, 0x328A);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B54);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_11);
-                rtl8168_mdio_write(tp, 0x05, 0x8B5D);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_11);
-                rtl8168_mdio_write(tp, 0x05, 0x8A7C);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A7F);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) | BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A82);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A85);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A88);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8b85);
-                        rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) | BIT_15);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                }
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                                gphy_val = rtl8168_mdio_read(tp, 0x15);
-                                gphy_val |= BIT_12;
-                                rtl8168_mdio_write(tp, 0x15, gphy_val);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_19) {
-                if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8b80);
-                        gphy_val = rtl8168_mdio_read(tp, 0x06);
-                        gphy_val |= BIT_2 | BIT_1;
-                        rtl8168_mdio_write(tp, 0x06, gphy_val);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x002D);
-                gphy_val = rtl8168_mdio_read(tp, 0x18);
-                gphy_val |= BIT_4;
-                rtl8168_mdio_write(tp, 0x18, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                gphy_val = rtl8168_mdio_read(tp, 0x14);
-                gphy_val |= BIT_15;
-                rtl8168_mdio_write(tp, 0x14, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B86);
-                gphy_val = rtl8168_mdio_read(tp, 0x06);
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B54);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_11);
-                rtl8168_mdio_write(tp, 0x05, 0x8B5D);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_11);
-                rtl8168_mdio_write(tp, 0x05, 0x8A7C);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A7F);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) | BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A82);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A85);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A88);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8b85);
-                        rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) | BIT_15);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                }
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                                gphy_val = rtl8168_mdio_read(tp, 0x15);
-                                gphy_val |= BIT_12;
-                                rtl8168_mdio_write(tp, 0x15, gphy_val);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_20) {
-
-                if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8b80);
-                        gphy_val = rtl8168_mdio_read(tp, 0x06);
-                        gphy_val |= BIT_2 | BIT_1;
-                        rtl8168_mdio_write(tp, 0x06, gphy_val);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0007);
-                rtl8168_mdio_write(tp, 0x1e, 0x002D);
-                gphy_val = rtl8168_mdio_read(tp, 0x18);
-                gphy_val |= BIT_4;
-                rtl8168_mdio_write(tp, 0x18, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                gphy_val = rtl8168_mdio_read(tp, 0x14);
-                gphy_val |= BIT_15;
-                rtl8168_mdio_write(tp, 0x14, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B86);
-                gphy_val = rtl8168_mdio_read(tp, 0x06);
-                gphy_val |= BIT_0;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B85);
-                gphy_val = rtl8168_mdio_read(tp, 0x06);
-                gphy_val |= BIT_14;
-                rtl8168_mdio_write(tp, 0x06, gphy_val);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0003);
-                rtl8168_mdio_write(tp, 0x09, 0xA20F);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B55);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x05, 0x8B5E);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x05, 0x8B67);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x05, 0x8B70);
-                rtl8168_mdio_write(tp, 0x06, 0x0000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                rtl8168_mdio_write(tp, 0x1E, 0x0078);
-                rtl8168_mdio_write(tp, 0x17, 0x0000);
-                rtl8168_mdio_write(tp, 0x19, 0x00FB);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B79);
-                rtl8168_mdio_write(tp, 0x06, 0xAA00);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                rtl8168_mdio_write(tp, 0x05, 0x8B54);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_11);
-                rtl8168_mdio_write(tp, 0x05, 0x8B5D);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_11);
-                rtl8168_mdio_write(tp, 0x05, 0x8A7C);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A7F);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) | BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A82);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A85);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x05, 0x8A88);
-                rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-
-                if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                        rtl8168_mdio_write(tp, 0x1f, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8b85);
-                        rtl8168_mdio_write(tp, 0x06, rtl8168_mdio_read(tp, 0x06) | BIT_15);
-                        rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                }
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1f, 0x0000);
-                                gphy_val = rtl8168_mdio_read(tp, 0x15);
-                                gphy_val |= BIT_12;
-                                rtl8168_mdio_write(tp, 0x15, gphy_val);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_21) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0A46);
-                gphy_val = rtl8168_mdio_read(tp, 0x10);
-                rtl8168_mdio_write(tp, 0x1F, 0x0BCC);
-                if (gphy_val & BIT_8)
-                        rtl8168_clear_eth_phy_bit(tp, 0x12, BIT_15);
-                else
-                        rtl8168_set_eth_phy_bit(tp, 0x12, BIT_15);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A46);
-                gphy_val = rtl8168_mdio_read(tp, 0x13);
-                rtl8168_mdio_write(tp, 0x1F, 0x0C41);
-                if (gphy_val & BIT_8)
-                        rtl8168_set_eth_phy_bit(tp, 0x15, BIT_1);
-                else
-                        rtl8168_clear_eth_phy_bit(tp, 0x15, BIT_1);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_2 | BIT_3);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0BCC);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_7);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_6);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8084);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) & ~(BIT_14 | BIT_13));
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_12);
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_1);
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A4B);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_2);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8012);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) | BIT_15);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0C42);
-                gphy_val = rtl8168_mdio_read(tp, 0x11);
-                gphy_val |= BIT_14;
-                gphy_val &= ~BIT_13;
-                rtl8168_mdio_write(tp, 0x11, gphy_val);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x809A);
-                rtl8168_mdio_write(tp, 0x14, 0x8022);
-                rtl8168_mdio_write(tp, 0x13, 0x80A0);
-                gphy_val = rtl8168_mdio_read(tp, 0x14) & 0x00FF;
-                gphy_val |= 0x1000;
-                rtl8168_mdio_write(tp, 0x14, gphy_val);
-                rtl8168_mdio_write(tp, 0x13, 0x8088);
-                rtl8168_mdio_write(tp, 0x14, 0x9222);
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_2);
-                        }
-                }
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_22) {
-                //do nothing
-        } else if (tp->mcfg == CFG_METHOD_23) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | (BIT_3 | BIT_2));
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0BCC);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_7);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_6);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8084);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) & ~(BIT_14 | BIT_13));
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_12);
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_1);
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A4B);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_2);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8012);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) | BIT_15);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0C42);
-                ClearAndSetEthPhyBit(tp,
-                                     0x11,
-                                     BIT_13,
-                                     BIT_14
-                                    );
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_2);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_24) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0BCC);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_7);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_6);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8084);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) & ~(BIT_14 | BIT_13));
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_12);
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_1);
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_0);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8012);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) | BIT_15);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0C42);
-                gphy_val = rtl8168_mdio_read(tp, 0x11);
-                gphy_val |= BIT_14;
-                gphy_val &= ~BIT_13;
-                rtl8168_mdio_write(tp, 0x11, gphy_val);
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_2);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_25 || tp->mcfg == CFG_METHOD_26) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0BCC);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_7);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_6);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8084);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) & ~(BIT_14 | BIT_13));
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_12);
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_1);
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8012);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) | BIT_15);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0BCE);
-                rtl8168_mdio_write(tp, 0x12, 0x8860);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x80F3);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x8B00);
-                rtl8168_mdio_write(tp, 0x13, 0x80F0);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x3A00);
-                rtl8168_mdio_write(tp, 0x13, 0x80EF);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x0500);
-                rtl8168_mdio_write(tp, 0x13, 0x80F6);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x6E00);
-                rtl8168_mdio_write(tp, 0x13, 0x80EC);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x6800);
-                rtl8168_mdio_write(tp, 0x13, 0x80ED);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x7C00);
-                rtl8168_mdio_write(tp, 0x13, 0x80F2);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0xF400);
-                rtl8168_mdio_write(tp, 0x13, 0x80F4);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x8500);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8110);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0xA800);
-                rtl8168_mdio_write(tp, 0x13, 0x810F);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x1D00);
-                rtl8168_mdio_write(tp, 0x13, 0x8111);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0xF500);
-                rtl8168_mdio_write(tp, 0x13, 0x8113);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x6100);
-                rtl8168_mdio_write(tp, 0x13, 0x8115);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x9200);
-                rtl8168_mdio_write(tp, 0x13, 0x810E);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x0400);
-                rtl8168_mdio_write(tp, 0x13, 0x810C);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x7C00);
-                rtl8168_mdio_write(tp, 0x13, 0x810B);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x5A00);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x80D1);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0xFF00);
-                rtl8168_mdio_write(tp, 0x13, 0x80CD);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x9E00);
-                rtl8168_mdio_write(tp, 0x13, 0x80D3);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x0E00);
-                rtl8168_mdio_write(tp, 0x13, 0x80D5);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0xCA00);
-                rtl8168_mdio_write(tp, 0x13, 0x80D7);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x8400);
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_2);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0BCC);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) & ~BIT_8);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_7);
-                rtl8168_mdio_write(tp, 0x11, rtl8168_mdio_read(tp, 0x11) | BIT_6);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8084);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) & ~(BIT_14 | BIT_13));
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_12);
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_1);
-                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_0);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8012);
-                rtl8168_mdio_write(tp, 0x14, rtl8168_mdio_read(tp, 0x14) | BIT_15);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0C42);
-                rtl8168_mdio_write(tp, 0x11, (rtl8168_mdio_read(tp, 0x11) & ~BIT_13) | BIT_14);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x80F3);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x8B00);
-                rtl8168_mdio_write(tp, 0x13, 0x80F0);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x3A00);
-                rtl8168_mdio_write(tp, 0x13, 0x80EF);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x0500);
-                rtl8168_mdio_write(tp, 0x13, 0x80F6);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x6E00);
-                rtl8168_mdio_write(tp, 0x13, 0x80EC);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x6800);
-                rtl8168_mdio_write(tp, 0x13, 0x80ED);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x7C00);
-                rtl8168_mdio_write(tp, 0x13, 0x80F2);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0xF400);
-                rtl8168_mdio_write(tp, 0x13, 0x80F4);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x8500);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8110);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0xA800);
-                rtl8168_mdio_write(tp, 0x13, 0x810F);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x1D00);
-                rtl8168_mdio_write(tp, 0x13, 0x8111);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0xF500);
-                rtl8168_mdio_write(tp, 0x13, 0x8113);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x6100);
-                rtl8168_mdio_write(tp, 0x13, 0x8115);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x9200);
-                rtl8168_mdio_write(tp, 0x13, 0x810E);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x0400);
-                rtl8168_mdio_write(tp, 0x13, 0x810C);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x7C00);
-                rtl8168_mdio_write(tp, 0x13, 0x810B);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x5A00);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x80D1);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0xFF00);
-                rtl8168_mdio_write(tp, 0x13, 0x80CD);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x9E00);
-                rtl8168_mdio_write(tp, 0x13, 0x80D3);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x0E00);
-                rtl8168_mdio_write(tp, 0x13, 0x80D5);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0xCA00);
-                rtl8168_mdio_write(tp, 0x13, 0x80D7);
-                rtl8168_mdio_write(tp, 0x14, (rtl8168_mdio_read(tp, 0x14) & ~0xFF00) | 0x8400);
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                                rtl8168_mdio_write(tp, 0x10, rtl8168_mdio_read(tp, 0x10) | BIT_2);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_29) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x809b);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xF800 ,
-                                      0x8000
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80A2);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x8000
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80A4);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x8500
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x809C);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0xbd00
-                                    );
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x80AD);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xF800 ,
-                                      0x7000
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80B4);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x5000
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80AC);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x4000
-                                    );
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x808E);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x1200
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x8090);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0xE500
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x8092);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x9F00
-                                    );
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                        u16 dout_tapbin;
-
-                        dout_tapbin = 0x0000;
-                        rtl8168_mdio_write( tp, 0x1F, 0x0A46 );
-                        gphy_val = rtl8168_mdio_read( tp, 0x13 );
-                        gphy_val &= (BIT_1|BIT_0);
-                        gphy_val <<= 2;
-                        dout_tapbin |= gphy_val;
-
-                        gphy_val = rtl8168_mdio_read( tp, 0x12 );
-                        gphy_val &= (BIT_15|BIT_14);
-                        gphy_val >>= 14;
-                        dout_tapbin |= gphy_val;
-
-                        dout_tapbin = ~( dout_tapbin^BIT_3 );
-                        dout_tapbin <<= 12;
-                        dout_tapbin &= 0xF000;
-
-                        rtl8168_mdio_write( tp, 0x1F, 0x0A43 );
-
-                        rtl8168_mdio_write( tp, 0x13, 0x827A );
-                        ClearAndSetEthPhyBit( tp,
-                                              0x14,
-                                              BIT_15|BIT_14|BIT_13|BIT_12,
-                                              dout_tapbin
-                                            );
-
-
-                        rtl8168_mdio_write( tp, 0x13, 0x827B );
-                        ClearAndSetEthPhyBit( tp,
-                                              0x14,
-                                              BIT_15|BIT_14|BIT_13|BIT_12,
-                                              dout_tapbin
-                                            );
-
-
-                        rtl8168_mdio_write( tp, 0x13, 0x827C );
-                        ClearAndSetEthPhyBit( tp,
-                                              0x14,
-                                              BIT_15|BIT_14|BIT_13|BIT_12,
-                                              dout_tapbin
-                                            );
-
-
-                        rtl8168_mdio_write( tp, 0x13, 0x827D );
-                        ClearAndSetEthPhyBit( tp,
-                                              0x14,
-                                              BIT_15|BIT_14|BIT_13|BIT_12,
-                                              dout_tapbin
-                                            );
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                        rtl8168_mdio_write(tp, 0x13, 0x8011);
-                        rtl8168_set_eth_phy_bit(tp, 0x14, BIT_11);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                        rtl8168_set_eth_phy_bit(tp, 0x16, BIT_1);
-                }
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_set_eth_phy_bit( tp, 0x11, BIT_11 );
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0BCA);
-                ClearAndSetEthPhyBit( tp,
-                                      0x17,
-                                      (BIT_13 | BIT_12) ,
-                                      BIT_14
-                                    );
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x803F);
-                rtl8168_clear_eth_phy_bit( tp, 0x14, (BIT_13 | BIT_12));
-                rtl8168_mdio_write(tp, 0x13, 0x8047);
-                rtl8168_clear_eth_phy_bit( tp, 0x14, (BIT_13 | BIT_12));
-                rtl8168_mdio_write(tp, 0x13, 0x804F);
-                rtl8168_clear_eth_phy_bit( tp, 0x14, (BIT_13 | BIT_12));
-                rtl8168_mdio_write(tp, 0x13, 0x8057);
-                rtl8168_clear_eth_phy_bit( tp, 0x14, (BIT_13 | BIT_12));
-                rtl8168_mdio_write(tp, 0x13, 0x805F);
-                rtl8168_clear_eth_phy_bit( tp, 0x14, (BIT_13 | BIT_12));
-                rtl8168_mdio_write(tp, 0x13, 0x8067 );
-                rtl8168_clear_eth_phy_bit( tp, 0x14, (BIT_13 | BIT_12));
-                rtl8168_mdio_write(tp, 0x13, 0x806F );
-                rtl8168_clear_eth_phy_bit( tp, 0x14, (BIT_13 | BIT_12));
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                                rtl8168_set_eth_phy_bit( tp, 0x10, BIT_2 );
-                                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_30) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x808A);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0,
-                                      0x0A );
-
-                if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                        rtl8168_mdio_write(tp, 0x13, 0x8011);
-                        rtl8168_set_eth_phy_bit(tp, 0x14, BIT_11);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0A42);
-                        rtl8168_set_eth_phy_bit(tp, 0x16, BIT_1);
-                }
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_set_eth_phy_bit( tp, 0x11, BIT_11 );
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                if (tp->RequireAdcBiasPatch) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0BCF);
-                        rtl8168_mdio_write(tp, 0x16, tp->AdcBiasPatchIoffset);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-
-                {
-                        u16 rlen;
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0BCD);
-                        gphy_val = rtl8168_mdio_read( tp, 0x16 );
-                        gphy_val &= 0x000F;
-
-                        if ( gphy_val > 3 ) {
-                                rlen = gphy_val - 3;
-                        } else {
-                                rlen = 0;
-                        }
-
-                        gphy_val = rlen | (rlen<<4) | (rlen<<8) | (rlen<<12);
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0BCD);
-                        rtl8168_mdio_write(tp, 0x17, gphy_val);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-
-                if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                        rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                        rtl8168_mdio_write(tp, 0x13, 0x85FE);
-                        ClearAndSetEthPhyBit(
-                                tp,
-                                0x14,
-                                BIT_15|BIT_14|BIT_13|BIT_12|BIT_11|BIT_10|BIT_8,
-                                BIT_9);
-                        rtl8168_mdio_write(tp, 0x13, 0x85FF);
-                        ClearAndSetEthPhyBit(
-                                tp,
-                                0x14,
-                                BIT_15|BIT_14|BIT_13|BIT_12,
-                                BIT_11|BIT_10|BIT_9|BIT_8);
-                        rtl8168_mdio_write(tp, 0x13, 0x814B);
-                        ClearAndSetEthPhyBit(
-                                tp,
-                                0x14,
-                                BIT_15|BIT_14|BIT_13|BIT_11|BIT_10|BIT_9|BIT_8,
-                                BIT_12);
-                }
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                                rtl8168_set_eth_phy_bit( tp, 0x10, BIT_2 );
-                                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-                   tp->mcfg == CFG_METHOD_33 ||  tp->mcfg == CFG_METHOD_34) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x808E);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x4800
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x8090);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0xCC00
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x8092);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0xB000
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x8088);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x6000
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x808B);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0x3F00 ,
-                                      0x0B00
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x808D);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0x1F00 ,
-                                      0x0600
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x808C);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0xB000
-                                    );
-
-                rtl8168_mdio_write(tp, 0x13, 0x80A0);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x2800
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80A2);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x5000
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x809B);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xF800 ,
-                                      0xB000
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x809A);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x4B00
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x809D);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0x3F00 ,
-                                      0x0800
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80A1);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x7000
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x809F);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0x1F00 ,
-                                      0x0300
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x809E);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x8800
-                                    );
-
-                rtl8168_mdio_write(tp, 0x13, 0x80B2);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x2200
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80AD);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xF800 ,
-                                      0x9800
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80AF);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0x3F00 ,
-                                      0x0800
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80B3);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x6F00
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80B1);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0x1F00 ,
-                                      0x0300
-                                    );
-                rtl8168_mdio_write(tp, 0x13, 0x80B0);
-                ClearAndSetEthPhyBit( tp,
-                                      0x14,
-                                      0xFF00 ,
-                                      0x9300
-                                    );
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8011);
-                rtl8168_set_eth_phy_bit(tp, 0x14, BIT_11);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_set_eth_phy_bit(tp, 0x11, BIT_11);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8016);
-                rtl8168_set_eth_phy_bit(tp, 0x14, BIT_10);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                if (aspm) {
-                        if (!HW_SUPP_SERDES_PHY(tp) &&
-                            HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                                rtl8168_set_eth_phy_bit( tp, 0x10, BIT_2 );
-                                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                        }
-                }
-        } else if (tp->mcfg == CFG_METHOD_35) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_set_eth_phy_bit(tp, 0x11, BIT_11);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A4C);
-                rtl8168_clear_eth_phy_bit(tp, 0x15, (BIT_14 | BIT_13));
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x81B9);
-                rtl8168_mdio_write(tp, 0x14, 0x2000);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x81D4);
-                ClearAndSetEthPhyBit(tp,
-                                     0x14,
-                                     0xFF00,
-                                     0x6600);
-                rtl8168_mdio_write(tp, 0x13, 0x81CB);
-                ClearAndSetEthPhyBit(tp,
-                                     0x14,
-                                     0xFF00,
-                                     0x3500);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A80);
-                ClearAndSetEthPhyBit(tp,
-                                     0x16,
-                                     0x000F,
-                                     0x0005);
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8016);
-                rtl8168_set_eth_phy_bit(tp, 0x14, BIT_13);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x811E);
-                rtl8168_mdio_write(tp, 0x14, 0xDECA);
-
-                rtl8168_mdio_write(tp, 0x13, 0x811C);
-                rtl8168_mdio_write(tp, 0x14, 0x8008);
-                rtl8168_mdio_write(tp, 0x13, 0x8118);
-                rtl8168_mdio_write(tp, 0x14, 0xF8B4);
-                rtl8168_mdio_write(tp, 0x13, 0x811A);
-                rtl8168_mdio_write(tp, 0x14, 0x1A04);
-
-                rtl8168_mdio_write(tp, 0x13, 0x8134);
-                rtl8168_mdio_write(tp, 0x14, 0xDECA);
-                rtl8168_mdio_write(tp, 0x13, 0x8132);
-                rtl8168_mdio_write(tp, 0x14, 0xA008);
-                rtl8168_mdio_write(tp, 0x13, 0x812E);
-                rtl8168_mdio_write(tp, 0x14, 0x00B5);
-                rtl8168_mdio_write(tp, 0x13, 0x8130);
-                rtl8168_mdio_write(tp, 0x14, 0x1A04);
-
-                rtl8168_mdio_write(tp, 0x13, 0x8112);
-                ClearAndSetEthPhyBit(tp,
-                                     0x14,
-                                     0xFF00,
-                                     0x7300);
-                rtl8168_mdio_write(tp, 0x13, 0x8106);
-                rtl8168_mdio_write(tp, 0x14, 0xA209);
-                rtl8168_mdio_write(tp, 0x13, 0x8108);
-                rtl8168_mdio_write(tp, 0x14, 0x13B0);
-                rtl8168_mdio_write(tp, 0x13, 0x8103);
-                ClearAndSetEthPhyBit(tp,
-                                     0x14,
-                                     0xF800,
-                                     0xB800);
-                rtl8168_mdio_write(tp, 0x13, 0x8105);
-                ClearAndSetEthPhyBit(tp,
-                                     0x14,
-                                     0xFF00,
-                                     0x0A00);
-
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x87EB);
-                rtl8168_mdio_write(tp, 0x14, 0x0018);
-                rtl8168_mdio_write(tp, 0x13, 0x87EB);
-                rtl8168_mdio_write(tp, 0x14, 0x0018);
-                rtl8168_mdio_write(tp, 0x13, 0x87ED);
-                rtl8168_mdio_write(tp, 0x14, 0x0733);
-                rtl8168_mdio_write(tp, 0x13, 0x87EF);
-                rtl8168_mdio_write(tp, 0x14, 0x08DC);
-                rtl8168_mdio_write(tp, 0x13, 0x87F1);
-                rtl8168_mdio_write(tp, 0x14, 0x08DF);
-                rtl8168_mdio_write(tp, 0x13, 0x87F3);
-                rtl8168_mdio_write(tp, 0x14, 0x0C79);
-                rtl8168_mdio_write(tp, 0x13, 0x87F5);
-                rtl8168_mdio_write(tp, 0x14, 0x0D93);
-                rtl8168_mdio_write(tp, 0x13, 0x87F9);
-                rtl8168_mdio_write(tp, 0x14, 0x0010);
-                rtl8168_mdio_write(tp, 0x13, 0x87FB);
-                rtl8168_mdio_write(tp, 0x14, 0x0800);
-                rtl8168_mdio_write(tp, 0x13, 0x8015);
-                ClearAndSetEthPhyBit(tp,
-                                     0x14,
-                                     0x7000,
-                                     0x7000);
-
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                rtl8168_mdio_write(tp, 0x13, 0x8111);
-                ClearAndSetEthPhyBit(tp,
-                                     0x14,
-                                     0xFF00,
-                                     0x7C00);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                if (aspm) {
-                        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                                rtl8168_mdio_write(tp, 0x1F, 0x0A43);
-                                rtl8168_set_eth_phy_bit( tp, 0x10, BIT_2 );
-                                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                        }
-                }
-        }
-
-#ifdef ENABLE_FIBER_SUPPORT
-        if (HW_FIBER_MODE_ENABLED(tp))
-                rtl8168_hw_fiber_phy_config(tp);
-#endif //ENABLE_FIBER_SUPPORT
-
-        //EthPhyPPSW
-        if (tp->mcfg == CFG_METHOD_21 || tp->mcfg == CFG_METHOD_22 ||
-            tp->mcfg == CFG_METHOD_24 || tp->mcfg == CFG_METHOD_25 ||
-            tp->mcfg == CFG_METHOD_26) {
-                //disable EthPhyPPSW
-                rtl8168_mdio_write(tp, 0x1F, 0x0BCD);
-                rtl8168_mdio_write(tp, 0x14, 0x5065);
-                rtl8168_mdio_write(tp, 0x14, 0xD065);
-                rtl8168_mdio_write(tp, 0x1F, 0x0BC8);
-                rtl8168_mdio_write(tp, 0x11, 0x5655);
-                rtl8168_mdio_write(tp, 0x1F, 0x0BCD);
-                rtl8168_mdio_write(tp, 0x14, 0x1065);
-                rtl8168_mdio_write(tp, 0x14, 0x9065);
-                rtl8168_mdio_write(tp, 0x14, 0x1065);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        } else if (tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-                   tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-                   tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34 ||
-                   tp->mcfg == CFG_METHOD_35) {
-                //enable EthPhyPPSW
-                rtl8168_mdio_write(tp, 0x1F, 0x0A44);
-                rtl8168_set_eth_phy_bit( tp, 0x11, BIT_7 );
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        }
-
-        /*ocp phy power saving*/
-        if (tp->mcfg == CFG_METHOD_25 || tp->mcfg == CFG_METHOD_26 ||
-            tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28 ||
-            tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-            tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-            tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34 ||
-            tp->mcfg == CFG_METHOD_35) {
-                if (aspm)
-                        rtl8168_enable_ocp_phy_power_saving(dev);
-        }
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-        if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) {
-                if (tp->eee_enabled)
-                        rtl8168_enable_EEE(tp);
-                else
-                        rtl8168_disable_EEE(tp);
-        }
-}
-
-static inline void rtl8168_delete_esd_timer(struct net_device *dev, struct timer_list *timer)
-{
-        del_timer_sync(timer);
-}
-
-static inline void rtl8168_request_esd_timer(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct timer_list *timer = &tp->esd_timer;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
-        setup_timer(timer, rtl8168_esd_timer, (unsigned long)dev);
-#else
-        timer_setup(timer, rtl8168_esd_timer, 0);
-#endif
-        mod_timer(timer, jiffies + RTL8168_ESD_TIMEOUT);
-}
-
-static inline void rtl8168_delete_link_timer(struct net_device *dev, struct timer_list *timer)
-{
-        del_timer_sync(timer);
-}
-
-static inline void rtl8168_request_link_timer(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct timer_list *timer = &tp->link_timer;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
-        setup_timer(timer, rtl8168_link_timer, (unsigned long)dev);
-#else
-        timer_setup(timer, rtl8168_link_timer, 0);
-#endif
-        mod_timer(timer, jiffies + RTL8168_LINK_TIMEOUT);
-}
-
-#ifdef CONFIG_NET_POLL_CONTROLLER
-/*
- * Polling 'interrupt' - used by things like netconsole to send skbs
- * without having to re-enable interrupts. It's not called while
- * the interrupt routine is executing.
- */
-static void
-rtl8168_netpoll(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct pci_dev *pdev = tp->pci_dev;
-
-        disable_irq(pdev->irq);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-        rtl8168_interrupt(pdev->irq, dev, NULL);
-#else
-        rtl8168_interrupt(pdev->irq, dev);
-#endif
-        enable_irq(pdev->irq);
-}
-#endif
-
-static void
-rtl8168_get_bios_setting(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_9:
-        case CFG_METHOD_10:
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-        case CFG_METHOD_13:
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                tp->bios_setting = RTL_R32(tp, 0x8c);
-                break;
-        }
-}
-
-static void
-rtl8168_set_bios_setting(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_9:
-        case CFG_METHOD_10:
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-        case CFG_METHOD_13:
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                RTL_W32(tp, 0x8C, tp->bios_setting);
-                break;
-        }
-}
-
-static void
-rtl8168_init_software_variable(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct pci_dev *pdev = tp->pci_dev;
-
-        rtl8168_get_bios_setting(dev);
-
-        tp->num_rx_desc = NUM_RX_DESC;
-        tp->num_tx_desc = NUM_TX_DESC;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-        case CFG_METHOD_13:
-                tp->HwSuppDashVer = 1;
-                break;
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-                tp->HwSuppDashVer = 2;
-                break;
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                tp->HwSuppDashVer = 3;
-                break;
-        default:
-                tp->HwSuppDashVer = 0;
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                tp->HwPkgDet = rtl8168_mac_ocp_read(tp, 0xDC00);
-                tp->HwPkgDet = (tp->HwPkgDet >> 3) & 0x0F;
-                break;
-        }
-
-        if (HW_SUPP_SERDES_PHY(tp))
-                eee_enable = 0;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                tp->HwSuppNowIsOobVer = 1;
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                tp->HwSuppPhyOcpVer = 1;
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                tp->HwSuppUpsVer = 1;
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                tp->HwPcieSNOffset = 0x16C;
-                break;
-        case CFG_METHOD_DEFAULT:
-                tp->HwPcieSNOffset = 0;
-                break;
-        default:
-                tp->HwPcieSNOffset = 0x164;
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                tp->HwSuppAspmClkIntrLock = 1;
-                break;
-        }
-
-        if (!aspm || !tp->HwSuppAspmClkIntrLock)
-                dynamic_aspm = 0;
-
-#ifdef ENABLE_REALWOW_SUPPORT
-        rtl8168_get_realwow_hw_version(dev);
-#endif //ENABLE_REALWOW_SUPPORT
-
-        if (HW_DASH_SUPPORT_DASH(tp) && rtl8168_check_dash(tp))
-                tp->DASH = 1;
-        else
-                tp->DASH = 0;
-
-        if (tp->DASH) {
-                if (HW_DASH_SUPPORT_TYPE_3(tp)) {
-                        u64 CmacMemPhysAddress;
-                        void __iomem *cmac_ioaddr = NULL;
-                        struct pci_dev *pdev_cmac;
-
-                        pdev_cmac = pci_get_slot(pdev->bus, PCI_DEVFN(PCI_SLOT(pdev->devfn), 0));
-
-                        //map CMAC IO space
-                        CmacMemPhysAddress = pci_resource_start(pdev_cmac, 2);
-
-                        /* ioremap MMIO region */
-                        cmac_ioaddr = ioremap(CmacMemPhysAddress, R8168_REGS_SIZE);
-
-                        if (cmac_ioaddr == NULL) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                                if (netif_msg_probe(tp))
-                                        dev_err(&pdev->dev, "cannot remap CMAC MMIO, aborting\n");
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                                tp->DASH = 0;
-                        } else {
-                                tp->mapped_cmac_ioaddr = cmac_ioaddr;
-                        }
-                }
-
-                eee_enable = 0;
-        }
-
-#ifdef ENABLE_DASH_SUPPORT
-#ifdef ENABLE_DASH_PRINTER_SUPPORT
-        if (tp->DASH) {
-                if (HW_DASH_SUPPORT_TYPE_3(tp) && tp->HwPkgDet == 0x0F)
-                        tp->dash_printer_enabled = 1;
-                else if (HW_DASH_SUPPORT_TYPE_2(tp))
-                        tp->dash_printer_enabled = 1;
-        }
-#endif //ENABLE_DASH_PRINTER_SUPPORT
-#endif //ENABLE_DASH_SUPPORT
-
-        if (HW_DASH_SUPPORT_TYPE_2(tp))
-                tp->cmac_ioaddr = tp->mmio_addr;
-        else if (HW_DASH_SUPPORT_TYPE_3(tp))
-                tp->cmac_ioaddr = tp->mapped_cmac_ioaddr;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_1:
-                tp->intr_mask = RxDescUnavail | RxFIFOOver | TxDescUnavail | TxOK | RxOK | SWInt;
-                tp->timer_intr_mask = PCSTimeout | RxFIFOOver;
-                break;
-        case CFG_METHOD_2:
-        case CFG_METHOD_3:
-        case CFG_METHOD_4:
-                tp->intr_mask = RxDescUnavail | TxDescUnavail | TxOK | RxOK | SWInt;
-                tp->timer_intr_mask = PCSTimeout;
-                break;
-        default:
-                tp->intr_mask = RxDescUnavail | TxOK | RxOK | SWInt;
-                tp->timer_intr_mask = PCSTimeout;
-                break;
-        }
-
-#ifdef ENABLE_DASH_SUPPORT
-        if (tp->DASH) {
-                if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                        tp->timer_intr_mask |= ( ISRIMR_DASH_INTR_EN | ISRIMR_DASH_INTR_CMAC_RESET);
-                        tp->intr_mask |= ( ISRIMR_DASH_INTR_EN | ISRIMR_DASH_INTR_CMAC_RESET);
-                } else {
-                        tp->timer_intr_mask |= ( ISRIMR_DP_DASH_OK | ISRIMR_DP_HOST_OK | ISRIMR_DP_REQSYS_OK );
-                        tp->intr_mask |= ( ISRIMR_DP_DASH_OK | ISRIMR_DP_HOST_OK | ISRIMR_DP_REQSYS_OK );
-                }
-        }
-#endif
-        if (aspm) {
-                switch (tp->mcfg) {
-                case CFG_METHOD_21:
-                case CFG_METHOD_22:
-                case CFG_METHOD_23:
-                case CFG_METHOD_24:
-                case CFG_METHOD_25:
-                case CFG_METHOD_26:
-                case CFG_METHOD_27:
-                case CFG_METHOD_28:
-                case CFG_METHOD_29:
-                case CFG_METHOD_30:
-                case CFG_METHOD_31:
-                case CFG_METHOD_32:
-                case CFG_METHOD_33:
-                case CFG_METHOD_34:
-                case CFG_METHOD_35:
-                        tp->org_pci_offset_99 = rtl8168_csi_fun0_read_byte(tp, 0x99);
-                        tp->org_pci_offset_99 &= ~(BIT_5|BIT_6);
-                        break;
-                }
-                switch (tp->mcfg) {
-                case CFG_METHOD_24:
-                case CFG_METHOD_25:
-                case CFG_METHOD_26:
-                case CFG_METHOD_27:
-                case CFG_METHOD_28:
-                case CFG_METHOD_29:
-                case CFG_METHOD_30:
-                case CFG_METHOD_35:
-                        tp->org_pci_offset_180 = rtl8168_csi_fun0_read_byte(tp, 0x180);
-                        break;
-                case CFG_METHOD_31:
-                case CFG_METHOD_32:
-                case CFG_METHOD_33:
-                case CFG_METHOD_34:
-                        tp->org_pci_offset_180 = rtl8168_csi_fun0_read_byte(tp, 0x214);
-                        break;
-                }
-
-                switch (tp->mcfg) {
-                case CFG_METHOD_21:
-                case CFG_METHOD_22:
-                case CFG_METHOD_23:
-                case CFG_METHOD_24:
-                case CFG_METHOD_25:
-                case CFG_METHOD_27:
-                case CFG_METHOD_28:
-                case CFG_METHOD_31:
-                case CFG_METHOD_32:
-                case CFG_METHOD_33:
-                case CFG_METHOD_34:
-                        if (tp->org_pci_offset_99 & BIT_2)
-                                tp->issue_offset_99_event = TRUE;
-                        break;
-                }
-        }
-
-        pci_read_config_byte(pdev, 0x80, &tp->org_pci_offset_80);
-        pci_read_config_byte(pdev, 0x81, &tp->org_pci_offset_81);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-                if ((tp->features & RTL_FEATURE_MSI) && (tp->org_pci_offset_80 & BIT_1))
-                        tp->use_timer_interrrupt = FALSE;
-                else
-                        tp->use_timer_interrrupt = TRUE;
-                break;
-        default:
-                tp->use_timer_interrrupt = TRUE;
-                break;
-        }
-
-        if (timer_count == 0 || tp->mcfg == CFG_METHOD_DEFAULT)
-                tp->use_timer_interrrupt = FALSE;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_1:
-        case CFG_METHOD_2:
-        case CFG_METHOD_3:
-                tp->ShortPacketSwChecksum = TRUE;
-                break;
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-                tp->ShortPacketSwChecksum = TRUE;
-                tp->UseSwPaddingShortPkt = TRUE;
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_30: {
-                u16 ioffset_p3, ioffset_p2, ioffset_p1, ioffset_p0;
-                u16 TmpUshort;
-
-                rtl8168_mac_ocp_write( tp, 0xDD02, 0x807D);
-                TmpUshort = rtl8168_mac_ocp_read( tp, 0xDD02 );
-                ioffset_p3 = ( (TmpUshort & BIT_7) >>7 );
-                ioffset_p3 <<= 3;
-                TmpUshort = rtl8168_mac_ocp_read( tp, 0xDD00 );
-
-                ioffset_p3 |= ((TmpUshort & (BIT_15 | BIT_14 | BIT_13))>>13);
-
-                ioffset_p2 = ((TmpUshort & (BIT_12|BIT_11|BIT_10|BIT_9))>>9);
-                ioffset_p1 = ((TmpUshort & (BIT_8|BIT_7|BIT_6|BIT_5))>>5);
-
-                ioffset_p0 = ( (TmpUshort & BIT_4) >>4 );
-                ioffset_p0 <<= 3;
-                ioffset_p0 |= (TmpUshort & (BIT_2| BIT_1 | BIT_0));
-
-                if ((ioffset_p3 == 0x0F) && (ioffset_p2 == 0x0F) && (ioffset_p1 == 0x0F) && (ioffset_p0 == 0x0F)) {
-                        tp->RequireAdcBiasPatch = FALSE;
-                } else {
-                        tp->RequireAdcBiasPatch = TRUE;
-                        tp->AdcBiasPatchIoffset = (ioffset_p3<<12)|(ioffset_p2<<8)|(ioffset_p1<<4)|(ioffset_p0);
-                }
-        }
-        break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34: {
-                u16 rg_saw_cnt;
-
-                rtl8168_mdio_write(tp, 0x1F, 0x0C42);
-                rg_saw_cnt = rtl8168_mdio_read(tp, 0x13);
-                rg_saw_cnt &= ~(BIT_15|BIT_14);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                if (rg_saw_cnt > 0) {
-                        tp->SwrCnt1msIni = 16000000/rg_saw_cnt;
-                        tp->SwrCnt1msIni &= 0x0FFF;
-
-                        tp->RequireAdjustUpsTxLinkPulseTiming = TRUE;
-                }
-        }
-        break;
-        }
-
-#ifdef ENABLE_FIBER_SUPPORT
-        rtl8168_check_hw_fiber_mode_support(tp);
-#endif //ENABLE_FIBER_SUPPORT
-
-        switch(tp->mcfg) {
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                if (tp->HwPkgDet == 0x06) {
-                        u8 tmpUchar = rtl8168_eri_read(tp, 0xE6, 1, ERIAR_ExGMAC);
-                        if (tmpUchar == 0x02)
-                                tp->HwSuppSerDesPhyVer = 1;
-                        else if (tmpUchar == 0x00)
-                                tp->HwSuppSerDesPhyVer = 2;
-                }
-                break;
-        }
-
-        if (pdev->subsystem_vendor == 0x144d) {
-                if (pdev->subsystem_device == 0xc098 ||
-                    pdev->subsystem_device == 0xc0b1 ||
-                    pdev->subsystem_device == 0xc0b8)
-                        hwoptimize |= HW_PATCH_SAMSUNG_LAN_DONGLE;
-        }
-
-#ifdef CONFIG_CTAP_SHORT_OFF
-        hwoptimize |= HW_PATCH_SAMSUNG_LAN_DONGLE;
-#endif //CONFIG_CTAP_SHORT_OFF
-
-        if (hwoptimize & HW_PATCH_SAMSUNG_LAN_DONGLE) {
-                switch (tp->mcfg) {
-                case CFG_METHOD_14:
-                case CFG_METHOD_15:
-                case CFG_METHOD_16:
-                case CFG_METHOD_17:
-                case CFG_METHOD_18:
-                case CFG_METHOD_19:
-                case CFG_METHOD_20:
-                case CFG_METHOD_30:
-                        tp->RequiredSecLanDonglePatch = TRUE;
-                        break;
-                }
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                tp->HwSuppMagicPktVer = WAKEUP_MAGIC_PACKET_V2;
-                break;
-        case CFG_METHOD_DEFAULT:
-                tp->HwSuppMagicPktVer = WAKEUP_MAGIC_PACKET_NOT_SUPPORT;
-                break;
-        default:
-                tp->HwSuppMagicPktVer = WAKEUP_MAGIC_PACKET_V1;
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-                tp->HwSuppEsdVer = 2;
-                break;
-        case CFG_METHOD_35:
-                tp->HwSuppEsdVer = 3;
-                break;
-        default:
-                tp->HwSuppEsdVer = 1;
-                break;
-        }
-
-        if (tp->HwSuppEsdVer == 2 ||
-            tp->HwSuppEsdVer == 3) {
-                rtl8168_mdio_write(tp, 0x1F, 0x0A46);
-                tp->BackupPhyFuseDout_15_0 = rtl8168_mdio_read(tp, 0x10);
-                tp->BackupPhyFuseDout_31_16 = rtl8168_mdio_read(tp, 0x11);
-                tp->BackupPhyFuseDout_47_32 = rtl8168_mdio_read(tp, 0x12);
-                tp->BackupPhyFuseDout_63_48 = rtl8168_mdio_read(tp, 0x13);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-
-                tp->TestPhyOcpReg = TRUE;
-#ifdef ENABLE_USE_FIRMWARE_FILE
-                if (tp->HwSuppEsdVer == 3) tp->TestPhyOcpReg = FALSE;
-#endif
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-                tp->HwSuppCheckPhyDisableModeVer = 1;
-                break;
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_35:
-                tp->HwSuppCheckPhyDisableModeVer = 2;
-                break;
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                tp->HwSuppCheckPhyDisableModeVer = 3;
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_14;
-                break;
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_16;
-                break;
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_18;
-                break;
-        case CFG_METHOD_20:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_20;
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_21;
-                break;
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_23;
-                break;
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_24;
-                break;
-        case CFG_METHOD_26:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_26;
-                break;
-        case CFG_METHOD_28:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_28;
-                break;
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_29;
-                break;
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_31;
-                break;
-        case CFG_METHOD_35:
-                tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_35;
-                break;
-        }
-
-        if (tp->HwIcVerUnknown) {
-                tp->NotWrRamCodeToMicroP = TRUE;
-                tp->NotWrMcuPatchCode = TRUE;
-        }
-
-        tp->NicCustLedValue = RTL_R16(tp, CustomLED);
-
-        rtl8168_get_hw_wol(dev);
-
-        rtl8168_link_option((u8*)&autoneg_mode, (u32*)&speed_mode, (u8*)&duplex_mode, (u32*)&advertising_mode);
-
-        tp->autoneg = autoneg_mode;
-        tp->speed = speed_mode;
-        tp->duplex = duplex_mode;
-        tp->advertising = advertising_mode;
-        tp->fcpause = rtl8168_fc_full;
-
-        tp->max_jumbo_frame_size = rtl_chip_info[tp->chipset].jumbo_frame_sz;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)
-        /* MTU range: 60 - hw-specific max */
-        dev->min_mtu = ETH_MIN_MTU;
-        dev->max_mtu = tp->max_jumbo_frame_size;
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)
-        tp->eee_enabled = eee_enable;
-        tp->eee_adv_t = MDIO_EEE_1000T | MDIO_EEE_100TX;
-
-#ifdef ENABLE_FIBER_SUPPORT
-        if (HW_FIBER_MODE_ENABLED(tp))
-                rtl8168_set_fiber_mode_software_variable(tp);
-#endif //ENABLE_FIBER_SUPPORT
-}
-
-static void
-rtl8168_release_board(struct pci_dev *pdev,
-                      struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        void __iomem *ioaddr = tp->mmio_addr;
-
-        rtl8168_set_bios_setting(dev);
-        rtl8168_rar_set(tp, tp->org_mac_addr);
-        tp->wol_enabled = WOL_DISABLED;
-
-        if (!tp->DASH)
-                rtl8168_phy_power_down(dev);
-
-#ifdef ENABLE_DASH_SUPPORT
-        if (tp->DASH)
-                FreeAllocatedDashShareMemory(dev);
-#endif
-
-        if (tp->mapped_cmac_ioaddr != NULL)
-                iounmap(tp->mapped_cmac_ioaddr);
-
-        iounmap(ioaddr);
-        pci_release_regions(pdev);
-        pci_clear_mwi(pdev);
-        pci_disable_device(pdev);
-        free_netdev(dev);
-}
-
-static void
-rtl8168_hw_address_set(struct net_device *dev, u8 mac_addr[MAC_ADDR_LEN])
-{
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)
-        eth_hw_addr_set(dev, mac_addr);
-#else
-        memcpy(dev->dev_addr, mac_addr, MAC_ADDR_LEN);
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)
-}
-
-static int
-rtl8168_get_mac_address(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int i;
-        u8 mac_addr[MAC_ADDR_LEN];
-
-        for (i = 0; i < MAC_ADDR_LEN; i++)
-                mac_addr[i] = RTL_R8(tp, MAC0 + i);
-
-        if (tp->mcfg == CFG_METHOD_18 ||
-            tp->mcfg == CFG_METHOD_19 ||
-            tp->mcfg == CFG_METHOD_20 ||
-            tp->mcfg == CFG_METHOD_21 ||
-            tp->mcfg == CFG_METHOD_22 ||
-            tp->mcfg == CFG_METHOD_23 ||
-            tp->mcfg == CFG_METHOD_24 ||
-            tp->mcfg == CFG_METHOD_25 ||
-            tp->mcfg == CFG_METHOD_26 ||
-            tp->mcfg == CFG_METHOD_27 ||
-            tp->mcfg == CFG_METHOD_28 ||
-            tp->mcfg == CFG_METHOD_29 ||
-            tp->mcfg == CFG_METHOD_30 ||
-            tp->mcfg == CFG_METHOD_31 ||
-            tp->mcfg == CFG_METHOD_32 ||
-            tp->mcfg == CFG_METHOD_33 ||
-            tp->mcfg == CFG_METHOD_34 ||
-            tp->mcfg == CFG_METHOD_35) {
-                *(u32*)&mac_addr[0] = rtl8168_eri_read(tp, 0xE0, 4, ERIAR_ExGMAC);
-                *(u16*)&mac_addr[4] = rtl8168_eri_read(tp, 0xE4, 2, ERIAR_ExGMAC);
-        } else {
-                if (tp->eeprom_type != EEPROM_TYPE_NONE) {
-                        u16 *pUshort = (u16*)mac_addr;
-                        /* Get MAC address from EEPROM */
-                        if (tp->mcfg == CFG_METHOD_16 ||
-                            tp->mcfg == CFG_METHOD_17 ||
-                            tp->mcfg == CFG_METHOD_18 ||
-                            tp->mcfg == CFG_METHOD_19 ||
-                            tp->mcfg == CFG_METHOD_20 ||
-                            tp->mcfg == CFG_METHOD_21 ||
-                            tp->mcfg == CFG_METHOD_22 ||
-                            tp->mcfg == CFG_METHOD_23 ||
-                            tp->mcfg == CFG_METHOD_24 ||
-                            tp->mcfg == CFG_METHOD_25 ||
-                            tp->mcfg == CFG_METHOD_26 ||
-                            tp->mcfg == CFG_METHOD_27 ||
-                            tp->mcfg == CFG_METHOD_28 ||
-                            tp->mcfg == CFG_METHOD_29 ||
-                            tp->mcfg == CFG_METHOD_30 ||
-                            tp->mcfg == CFG_METHOD_31 ||
-                            tp->mcfg == CFG_METHOD_32 ||
-                            tp->mcfg == CFG_METHOD_33 ||
-                            tp->mcfg == CFG_METHOD_34 ||
-                            tp->mcfg == CFG_METHOD_35) {
-                                *pUshort++ = rtl8168_eeprom_read_sc(tp, 1);
-                                *pUshort++ = rtl8168_eeprom_read_sc(tp, 2);
-                                *pUshort = rtl8168_eeprom_read_sc(tp, 3);
-                        } else {
-                                *pUshort++ = rtl8168_eeprom_read_sc(tp, 7);
-                                *pUshort++ = rtl8168_eeprom_read_sc(tp, 8);
-                                *pUshort = rtl8168_eeprom_read_sc(tp, 9);
-                        }
-                }
-        }
-
-        if (!is_valid_ether_addr(mac_addr)) {
-                netif_err(tp, probe, dev, "Invalid ether addr %pM\n",
-                          mac_addr);
-                eth_random_addr(mac_addr);
-                dev->addr_assign_type = NET_ADDR_RANDOM;
-                netif_info(tp, probe, dev, "Random ether addr %pM\n",
-                           mac_addr);
-                tp->random_mac = 1;
-        }
-
-        rtl8168_hw_address_set(dev, mac_addr);
-        rtl8168_rar_set(tp, mac_addr);
-
-        /* keep the original MAC address */
-        memcpy(tp->org_mac_addr, dev->dev_addr, MAC_ADDR_LEN);
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13)
-        memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
-#endif
-        return 0;
-}
-
-/**
- * rtl8168_set_mac_address - Change the Ethernet Address of the NIC
- * @dev: network interface device structure
- * @p:   pointer to an address structure
- *
- * Return 0 on success, negative on failure
- **/
-static int
-rtl8168_set_mac_address(struct net_device *dev,
-                        void *p)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct sockaddr *addr = p;
-        unsigned long flags;
-
-        if (!is_valid_ether_addr(addr->sa_data))
-                return -EADDRNOTAVAIL;
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        rtl8168_hw_address_set(dev, addr->sa_data);
-
-        rtl8168_rar_set(tp, dev->dev_addr);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        return 0;
-}
-
-/******************************************************************************
- * rtl8168_rar_set - Puts an ethernet address into a receive address register.
- *
- * tp - The private data structure for driver
- * addr - Address to put into receive address register
- *****************************************************************************/
-void
-rtl8168_rar_set(struct rtl8168_private *tp,
-                const u8 *addr)
-{
-        uint32_t rar_low = 0;
-        uint32_t rar_high = 0;
-
-        rar_low = ((uint32_t) addr[0] |
-                   ((uint32_t) addr[1] << 8) |
-                   ((uint32_t) addr[2] << 16) |
-                   ((uint32_t) addr[3] << 24));
-
-        rar_high = ((uint32_t) addr[4] |
-                    ((uint32_t) addr[5] << 8));
-
-        rtl8168_enable_cfg9346_write(tp);
-        RTL_W32(tp, MAC0, rar_low);
-        RTL_W32(tp, MAC4, rar_high);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-                RTL_W32(tp, SecMAC0, rar_low);
-                RTL_W16(tp, SecMAC4, (uint16_t)rar_high);
-                break;
-        }
-
-        if (tp->mcfg == CFG_METHOD_17) {
-                rtl8168_eri_write(tp, 0xf0, 4, rar_low << 16, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xf4, 4, rar_low >> 16 | rar_high << 16, ERIAR_ExGMAC);
-        }
-
-        rtl8168_disable_cfg9346_write(tp);
-}
-
-#ifdef ETHTOOL_OPS_COMPAT
-static int ethtool_get_settings(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_cmd cmd = { ETHTOOL_GSET };
-        int err;
-
-        if (!ethtool_ops->get_settings)
-                return -EOPNOTSUPP;
-
-        err = ethtool_ops->get_settings(dev, &cmd);
-        if (err < 0)
-                return err;
-
-        if (copy_to_user(useraddr, &cmd, sizeof(cmd)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_set_settings(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_cmd cmd;
-
-        if (!ethtool_ops->set_settings)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
-                return -EFAULT;
-
-        return ethtool_ops->set_settings(dev, &cmd);
-}
-
-static int ethtool_get_drvinfo(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_drvinfo info;
-        struct ethtool_ops *ops = ethtool_ops;
-
-        if (!ops->get_drvinfo)
-                return -EOPNOTSUPP;
-
-        memset(&info, 0, sizeof(info));
-        info.cmd = ETHTOOL_GDRVINFO;
-        ops->get_drvinfo(dev, &info);
-
-        if (ops->self_test_count)
-                info.testinfo_len = ops->self_test_count(dev);
-        if (ops->get_stats_count)
-                info.n_stats = ops->get_stats_count(dev);
-        if (ops->get_regs_len)
-                info.regdump_len = ops->get_regs_len(dev);
-        if (ops->get_eeprom_len)
-                info.eedump_len = ops->get_eeprom_len(dev);
-
-        if (copy_to_user(useraddr, &info, sizeof(info)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_get_regs(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_regs regs;
-        struct ethtool_ops *ops = ethtool_ops;
-        void *regbuf;
-        int reglen, ret;
-
-        if (!ops->get_regs || !ops->get_regs_len)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&regs, useraddr, sizeof(regs)))
-                return -EFAULT;
-
-        reglen = ops->get_regs_len(dev);
-        if (regs.len > reglen)
-                regs.len = reglen;
-
-        regbuf = kmalloc(reglen, GFP_USER);
-        if (!regbuf)
-                return -ENOMEM;
-
-        ops->get_regs(dev, &regs, regbuf);
-
-        ret = -EFAULT;
-        if (copy_to_user(useraddr, &regs, sizeof(regs)))
-                goto out;
-        useraddr += offsetof(struct ethtool_regs, data);
-        if (copy_to_user(useraddr, regbuf, reglen))
-                goto out;
-        ret = 0;
-
-out:
-        kfree(regbuf);
-        return ret;
-}
-
-static int ethtool_get_wol(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_wolinfo wol = { ETHTOOL_GWOL };
-
-        if (!ethtool_ops->get_wol)
-                return -EOPNOTSUPP;
-
-        ethtool_ops->get_wol(dev, &wol);
-
-        if (copy_to_user(useraddr, &wol, sizeof(wol)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_set_wol(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_wolinfo wol;
-
-        if (!ethtool_ops->set_wol)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&wol, useraddr, sizeof(wol)))
-                return -EFAULT;
-
-        return ethtool_ops->set_wol(dev, &wol);
-}
-
-static int ethtool_get_msglevel(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_value edata = { ETHTOOL_GMSGLVL };
-
-        if (!ethtool_ops->get_msglevel)
-                return -EOPNOTSUPP;
-
-        edata.data = ethtool_ops->get_msglevel(dev);
-
-        if (copy_to_user(useraddr, &edata, sizeof(edata)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_set_msglevel(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_value edata;
-
-        if (!ethtool_ops->set_msglevel)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&edata, useraddr, sizeof(edata)))
-                return -EFAULT;
-
-        ethtool_ops->set_msglevel(dev, edata.data);
-        return 0;
-}
-
-static int ethtool_nway_reset(struct net_device *dev)
-{
-        if (!ethtool_ops->nway_reset)
-                return -EOPNOTSUPP;
-
-        return ethtool_ops->nway_reset(dev);
-}
-
-static int ethtool_get_link(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_value edata = { ETHTOOL_GLINK };
-
-        if (!ethtool_ops->get_link)
-                return -EOPNOTSUPP;
-
-        edata.data = ethtool_ops->get_link(dev);
-
-        if (copy_to_user(useraddr, &edata, sizeof(edata)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_get_eeprom(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_eeprom eeprom;
-        struct ethtool_ops *ops = ethtool_ops;
-        u8 *data;
-        int ret;
-
-        if (!ops->get_eeprom || !ops->get_eeprom_len)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
-                return -EFAULT;
-
-        /* Check for wrap and zero */
-        if (eeprom.offset + eeprom.len <= eeprom.offset)
-                return -EINVAL;
-
-        /* Check for exceeding total eeprom len */
-        if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
-                return -EINVAL;
-
-        data = kmalloc(eeprom.len, GFP_USER);
-        if (!data)
-                return -ENOMEM;
-
-        ret = -EFAULT;
-        if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len))
-                goto out;
-
-        ret = ops->get_eeprom(dev, &eeprom, data);
-        if (ret)
-                goto out;
-
-        ret = -EFAULT;
-        if (copy_to_user(useraddr, &eeprom, sizeof(eeprom)))
-                goto out;
-        if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len))
-                goto out;
-        ret = 0;
-
-out:
-        kfree(data);
-        return ret;
-}
-
-static int ethtool_set_eeprom(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_eeprom eeprom;
-        struct ethtool_ops *ops = ethtool_ops;
-        u8 *data;
-        int ret;
-
-        if (!ops->set_eeprom || !ops->get_eeprom_len)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
-                return -EFAULT;
-
-        /* Check for wrap and zero */
-        if (eeprom.offset + eeprom.len <= eeprom.offset)
-                return -EINVAL;
-
-        /* Check for exceeding total eeprom len */
-        if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
-                return -EINVAL;
-
-        data = kmalloc(eeprom.len, GFP_USER);
-        if (!data)
-                return -ENOMEM;
-
-        ret = -EFAULT;
-        if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len))
-                goto out;
-
-        ret = ops->set_eeprom(dev, &eeprom, data);
-        if (ret)
-                goto out;
-
-        if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len))
-                ret = -EFAULT;
-
-out:
-        kfree(data);
-        return ret;
-}
-
-static int ethtool_get_coalesce(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_coalesce coalesce = { ETHTOOL_GCOALESCE };
-
-        if (!ethtool_ops->get_coalesce)
-                return -EOPNOTSUPP;
-
-        ethtool_ops->get_coalesce(dev, &coalesce);
-
-        if (copy_to_user(useraddr, &coalesce, sizeof(coalesce)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_set_coalesce(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_coalesce coalesce;
-
-        if (!ethtool_ops->get_coalesce)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&coalesce, useraddr, sizeof(coalesce)))
-                return -EFAULT;
-
-        return ethtool_ops->set_coalesce(dev, &coalesce);
-}
-
-static int ethtool_get_ringparam(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_ringparam ringparam = { ETHTOOL_GRINGPARAM };
-
-        if (!ethtool_ops->get_ringparam)
-                return -EOPNOTSUPP;
-
-        ethtool_ops->get_ringparam(dev, &ringparam);
-
-        if (copy_to_user(useraddr, &ringparam, sizeof(ringparam)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_set_ringparam(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_ringparam ringparam;
-
-        if (!ethtool_ops->get_ringparam)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&ringparam, useraddr, sizeof(ringparam)))
-                return -EFAULT;
-
-        return ethtool_ops->set_ringparam(dev, &ringparam);
-}
-
-static int ethtool_get_pauseparam(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM };
-
-        if (!ethtool_ops->get_pauseparam)
-                return -EOPNOTSUPP;
-
-        ethtool_ops->get_pauseparam(dev, &pauseparam);
-
-        if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_set_pauseparam(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_pauseparam pauseparam;
-
-        if (!ethtool_ops->get_pauseparam)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam)))
-                return -EFAULT;
-
-        return ethtool_ops->set_pauseparam(dev, &pauseparam);
-}
-
-static int ethtool_get_rx_csum(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_value edata = { ETHTOOL_GRXCSUM };
-
-        if (!ethtool_ops->get_rx_csum)
-                return -EOPNOTSUPP;
-
-        edata.data = ethtool_ops->get_rx_csum(dev);
-
-        if (copy_to_user(useraddr, &edata, sizeof(edata)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_set_rx_csum(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_value edata;
-
-        if (!ethtool_ops->set_rx_csum)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&edata, useraddr, sizeof(edata)))
-                return -EFAULT;
-
-        ethtool_ops->set_rx_csum(dev, edata.data);
-        return 0;
-}
-
-static int ethtool_get_tx_csum(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_value edata = { ETHTOOL_GTXCSUM };
-
-        if (!ethtool_ops->get_tx_csum)
-                return -EOPNOTSUPP;
-
-        edata.data = ethtool_ops->get_tx_csum(dev);
-
-        if (copy_to_user(useraddr, &edata, sizeof(edata)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_set_tx_csum(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_value edata;
-
-        if (!ethtool_ops->set_tx_csum)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&edata, useraddr, sizeof(edata)))
-                return -EFAULT;
-
-        return ethtool_ops->set_tx_csum(dev, edata.data);
-}
-
-static int ethtool_get_sg(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_value edata = { ETHTOOL_GSG };
-
-        if (!ethtool_ops->get_sg)
-                return -EOPNOTSUPP;
-
-        edata.data = ethtool_ops->get_sg(dev);
-
-        if (copy_to_user(useraddr, &edata, sizeof(edata)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_set_sg(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_value edata;
-
-        if (!ethtool_ops->set_sg)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&edata, useraddr, sizeof(edata)))
-                return -EFAULT;
-
-        return ethtool_ops->set_sg(dev, edata.data);
-}
-
-static int ethtool_get_tso(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_value edata = { ETHTOOL_GTSO };
-
-        if (!ethtool_ops->get_tso)
-                return -EOPNOTSUPP;
-
-        edata.data = ethtool_ops->get_tso(dev);
-
-        if (copy_to_user(useraddr, &edata, sizeof(edata)))
-                return -EFAULT;
-        return 0;
-}
-
-static int ethtool_set_tso(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_value edata;
-
-        if (!ethtool_ops->set_tso)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&edata, useraddr, sizeof(edata)))
-                return -EFAULT;
-
-        return ethtool_ops->set_tso(dev, edata.data);
-}
-
-static int ethtool_self_test(struct net_device *dev, char *useraddr)
-{
-        struct ethtool_test test;
-        struct ethtool_ops *ops = ethtool_ops;
-        u64 *data;
-        int ret;
-
-        if (!ops->self_test || !ops->self_test_count)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&test, useraddr, sizeof(test)))
-                return -EFAULT;
-
-        test.len = ops->self_test_count(dev);
-        data = kmalloc(test.len * sizeof(u64), GFP_USER);
-        if (!data)
-                return -ENOMEM;
-
-        ops->self_test(dev, &test, data);
-
-        ret = -EFAULT;
-        if (copy_to_user(useraddr, &test, sizeof(test)))
-                goto out;
-        useraddr += sizeof(test);
-        if (copy_to_user(useraddr, data, test.len * sizeof(u64)))
-                goto out;
-        ret = 0;
-
-out:
-        kfree(data);
-        return ret;
-}
-
-static int ethtool_get_strings(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_gstrings gstrings;
-        struct ethtool_ops *ops = ethtool_ops;
-        u8 *data;
-        int ret;
-
-        if (!ops->get_strings)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&gstrings, useraddr, sizeof(gstrings)))
-                return -EFAULT;
-
-        switch (gstrings.string_set) {
-        case ETH_SS_TEST:
-                if (!ops->self_test_count)
-                        return -EOPNOTSUPP;
-                gstrings.len = ops->self_test_count(dev);
-                break;
-        case ETH_SS_STATS:
-                if (!ops->get_stats_count)
-                        return -EOPNOTSUPP;
-                gstrings.len = ops->get_stats_count(dev);
-                break;
-        default:
-                return -EINVAL;
-        }
-
-        data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
-        if (!data)
-                return -ENOMEM;
-
-        ops->get_strings(dev, gstrings.string_set, data);
-
-        ret = -EFAULT;
-        if (copy_to_user(useraddr, &gstrings, sizeof(gstrings)))
-                goto out;
-        useraddr += sizeof(gstrings);
-        if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN))
-                goto out;
-        ret = 0;
-
-out:
-        kfree(data);
-        return ret;
-}
-
-static int ethtool_phys_id(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_value id;
-
-        if (!ethtool_ops->phys_id)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&id, useraddr, sizeof(id)))
-                return -EFAULT;
-
-        return ethtool_ops->phys_id(dev, id.data);
-}
-
-static int ethtool_get_stats(struct net_device *dev, void *useraddr)
-{
-        struct ethtool_stats stats;
-        struct ethtool_ops *ops = ethtool_ops;
-        u64 *data;
-        int ret;
-
-        if (!ops->get_ethtool_stats || !ops->get_stats_count)
-                return -EOPNOTSUPP;
-
-        if (copy_from_user(&stats, useraddr, sizeof(stats)))
-                return -EFAULT;
-
-        stats.n_stats = ops->get_stats_count(dev);
-        data = kmalloc(stats.n_stats * sizeof(u64), GFP_USER);
-        if (!data)
-                return -ENOMEM;
-
-        ops->get_ethtool_stats(dev, &stats, data);
-
-        ret = -EFAULT;
-        if (copy_to_user(useraddr, &stats, sizeof(stats)))
-                goto out;
-        useraddr += sizeof(stats);
-        if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64)))
-                goto out;
-        ret = 0;
-
-out:
-        kfree(data);
-        return ret;
-}
-
-static int ethtool_ioctl(struct ifreq *ifr)
-{
-        struct net_device *dev = __dev_get_by_name(ifr->ifr_name);
-        void *useraddr = (void *) ifr->ifr_data;
-        u32 ethcmd;
-
-        /*
-         * XXX: This can be pushed down into the ethtool_* handlers that
-         * need it.  Keep existing behaviour for the moment.
-         */
-        if (!capable(CAP_NET_ADMIN))
-                return -EPERM;
-
-        if (!dev || !netif_device_present(dev))
-                return -ENODEV;
-
-        if (copy_from_user(&ethcmd, useraddr, sizeof (ethcmd)))
-                return -EFAULT;
-
-        switch (ethcmd) {
-        case ETHTOOL_GSET:
-                return ethtool_get_settings(dev, useraddr);
-        case ETHTOOL_SSET:
-                return ethtool_set_settings(dev, useraddr);
-        case ETHTOOL_GDRVINFO:
-                return ethtool_get_drvinfo(dev, useraddr);
-        case ETHTOOL_GREGS:
-                return ethtool_get_regs(dev, useraddr);
-        case ETHTOOL_GWOL:
-                return ethtool_get_wol(dev, useraddr);
-        case ETHTOOL_SWOL:
-                return ethtool_set_wol(dev, useraddr);
-        case ETHTOOL_GMSGLVL:
-                return ethtool_get_msglevel(dev, useraddr);
-        case ETHTOOL_SMSGLVL:
-                return ethtool_set_msglevel(dev, useraddr);
-        case ETHTOOL_NWAY_RST:
-                return ethtool_nway_reset(dev);
-        case ETHTOOL_GLINK:
-                return ethtool_get_link(dev, useraddr);
-        case ETHTOOL_GEEPROM:
-                return ethtool_get_eeprom(dev, useraddr);
-        case ETHTOOL_SEEPROM:
-                return ethtool_set_eeprom(dev, useraddr);
-        case ETHTOOL_GCOALESCE:
-                return ethtool_get_coalesce(dev, useraddr);
-        case ETHTOOL_SCOALESCE:
-                return ethtool_set_coalesce(dev, useraddr);
-        case ETHTOOL_GRINGPARAM:
-                return ethtool_get_ringparam(dev, useraddr);
-        case ETHTOOL_SRINGPARAM:
-                return ethtool_set_ringparam(dev, useraddr);
-        case ETHTOOL_GPAUSEPARAM:
-                return ethtool_get_pauseparam(dev, useraddr);
-        case ETHTOOL_SPAUSEPARAM:
-                return ethtool_set_pauseparam(dev, useraddr);
-        case ETHTOOL_GRXCSUM:
-                return ethtool_get_rx_csum(dev, useraddr);
-        case ETHTOOL_SRXCSUM:
-                return ethtool_set_rx_csum(dev, useraddr);
-        case ETHTOOL_GTXCSUM:
-                return ethtool_get_tx_csum(dev, useraddr);
-        case ETHTOOL_STXCSUM:
-                return ethtool_set_tx_csum(dev, useraddr);
-        case ETHTOOL_GSG:
-                return ethtool_get_sg(dev, useraddr);
-        case ETHTOOL_SSG:
-                return ethtool_set_sg(dev, useraddr);
-        case ETHTOOL_GTSO:
-                return ethtool_get_tso(dev, useraddr);
-        case ETHTOOL_STSO:
-                return ethtool_set_tso(dev, useraddr);
-        case ETHTOOL_TEST:
-                return ethtool_self_test(dev, useraddr);
-        case ETHTOOL_GSTRINGS:
-                return ethtool_get_strings(dev, useraddr);
-        case ETHTOOL_PHYS_ID:
-                return ethtool_phys_id(dev, useraddr);
-        case ETHTOOL_GSTATS:
-                return ethtool_get_stats(dev, useraddr);
-        default:
-                return -EOPNOTSUPP;
-        }
-
-        return -EOPNOTSUPP;
-}
-#endif //ETHTOOL_OPS_COMPAT
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
-static int rtl8168_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
-                                  void __user *data, int cmd)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int ret = 0;
-
-        switch (cmd) {
-        case SIOCDEVPRIVATE_RTLASF:
-                if (!netif_running(dev)) {
-                        ret = -ENODEV;
-                        break;
-                }
-
-                ret = rtl8168_asf_ioctl(dev, ifr);
-                break;
-
-#ifdef ENABLE_DASH_SUPPORT
-        case SIOCDEVPRIVATE_RTLDASH:
-                if (!netif_running(dev)) {
-                        ret = -ENODEV;
-                        break;
-                }
-
-                if (!capable(CAP_NET_ADMIN)) {
-                        ret = -EPERM;
-                        break;
-                }
-
-                ret = rtl8168_dash_ioctl(dev, ifr);
-                break;
-#endif
-
-#ifdef ENABLE_REALWOW_SUPPORT
-        case SIOCDEVPRIVATE_RTLREALWOW:
-                if (!netif_running(dev)) {
-                        ret = -ENODEV;
-                        break;
-                }
-
-                if (!capable(CAP_NET_ADMIN)) {
-                        ret = -EPERM;
-                        break;
-                }
-
-                ret = rtl8168_realwow_ioctl(dev, ifr);
-                break;
-#endif
-
-        case SIOCRTLTOOL:
-                if (!capable(CAP_NET_ADMIN)) {
-                        ret = -EPERM;
-                        break;
-                }
-
-                ret = rtl8168_tool_ioctl(tp, ifr);
-                break;
-
-        default:
-                ret = -EOPNOTSUPP;
-        }
-
-        return ret;
-}
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
-
-static int
-rtl8168_do_ioctl(struct net_device *dev,
-                 struct ifreq *ifr,
-                 int cmd)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct mii_ioctl_data *data = if_mii(ifr);
-        int ret;
-        unsigned long flags;
-
-        ret = 0;
-        switch (cmd) {
-        case SIOCGMIIPHY:
-                data->phy_id = 32; /* Internal PHY */
-                break;
-
-        case SIOCGMIIREG:
-                spin_lock_irqsave(&tp->lock, flags);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                data->val_out = rtl8168_mdio_read(tp, data->reg_num);
-                spin_unlock_irqrestore(&tp->lock, flags);
-                break;
-
-        case SIOCSMIIREG:
-                if (!capable(CAP_NET_ADMIN))
-                        return -EPERM;
-                spin_lock_irqsave(&tp->lock, flags);
-                rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                rtl8168_mdio_write(tp, data->reg_num, data->val_in);
-                spin_unlock_irqrestore(&tp->lock, flags);
-                break;
-
-#ifdef ETHTOOL_OPS_COMPAT
-        case SIOCETHTOOL:
-                ret = ethtool_ioctl(ifr);
-                break;
-#endif
-        case SIOCDEVPRIVATE_RTLASF:
-                if (!netif_running(dev)) {
-                        ret = -ENODEV;
-                        break;
-                }
-
-                ret = rtl8168_asf_ioctl(dev, ifr);
-                break;
-
-#ifdef ENABLE_DASH_SUPPORT
-        case SIOCDEVPRIVATE_RTLDASH:
-                if (!netif_running(dev)) {
-                        ret = -ENODEV;
-                        break;
-                }
-                if (!capable(CAP_NET_ADMIN)) {
-                        ret = -EPERM;
-                        break;
-                }
-
-                ret = rtl8168_dash_ioctl(dev, ifr);
-                break;
-#endif
-
-#ifdef ENABLE_REALWOW_SUPPORT
-        case SIOCDEVPRIVATE_RTLREALWOW:
-                if (!netif_running(dev)) {
-                        ret = -ENODEV;
-                        break;
-                }
-
-                if (!capable(CAP_NET_ADMIN)) {
-                        ret = -EPERM;
-                        break;
-                }
-
-                ret = rtl8168_realwow_ioctl(dev, ifr);
-                break;
-#endif
-
-        case SIOCRTLTOOL:
-                if (!capable(CAP_NET_ADMIN)) {
-                        ret = -EPERM;
-                        break;
-                }
-
-                ret = rtl8168_tool_ioctl(tp, ifr);
-                break;
-
-        default:
-                ret = -EOPNOTSUPP;
-                break;
-        }
-
-        return ret;
-}
-
-static void
-rtl8168_phy_power_up(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (rtl8168_is_in_phy_disable_mode(dev))
-                return;
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        switch (tp->mcfg) {
-        case CFG_METHOD_1:
-        case CFG_METHOD_2:
-        case CFG_METHOD_3:
-        case CFG_METHOD_4:
-        case CFG_METHOD_5:
-        case CFG_METHOD_6:
-        case CFG_METHOD_7:
-        case CFG_METHOD_8:
-        case CFG_METHOD_9:
-        case CFG_METHOD_10:
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-        case CFG_METHOD_13:
-                rtl8168_mdio_write(tp, 0x0E, 0x0000);
-                break;
-        }
-        rtl8168_mdio_write(tp, MII_BMCR, BMCR_ANENABLE);
-
-        //wait mdc/mdio ready
-        switch (tp->mcfg) {
-        case CFG_METHOD_23:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-                mdelay(10);
-                break;
-        }
-
-        //wait ups resume (phy state 3)
-        if (HW_SUPPORT_UPS_MODE(tp))
-                rtl8168_wait_phy_ups_resume(dev, HW_PHY_STATUS_LAN_ON);
-}
-
-static void
-rtl8168_phy_power_down(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u32 csi_tmp;
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-                csi_tmp = rtl8168_eri_read(tp, 0x1AB, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~( BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7 );
-                rtl8168_eri_write(tp, 0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-
-        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-        switch (tp->mcfg) {
-        case CFG_METHOD_1:
-        case CFG_METHOD_2:
-        case CFG_METHOD_3:
-        case CFG_METHOD_4:
-        case CFG_METHOD_5:
-        case CFG_METHOD_6:
-        case CFG_METHOD_7:
-        case CFG_METHOD_8:
-        case CFG_METHOD_9:
-        case CFG_METHOD_10:
-        case CFG_METHOD_11:
-        case CFG_METHOD_12:
-        case CFG_METHOD_13:
-                rtl8168_mdio_write(tp, 0x0E, 0x0200);
-                rtl8168_mdio_write(tp, MII_BMCR, BMCR_PDOWN);
-                break;
-        case CFG_METHOD_14:
-        case CFG_METHOD_15:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_35:
-                rtl8168_mdio_write(tp, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
-                break;
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-                rtl8168_mdio_write(tp, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
-                break;
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-                rtl8168_mdio_write(tp, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
-                break;
-        default:
-                rtl8168_mdio_write(tp, MII_BMCR, BMCR_PDOWN);
-                break;
-        }
-}
-
-static int __devinit
-rtl8168_init_board(struct pci_dev *pdev,
-                   struct net_device **dev_out,
-                   void __iomem **ioaddr_out)
-{
-        void __iomem *ioaddr;
-        struct net_device *dev;
-        struct rtl8168_private *tp;
-        int rc = -ENOMEM, i, pm_cap;
-
-        assert(ioaddr_out != NULL);
-
-        /* dev zeroed in alloc_etherdev */
-        dev = alloc_etherdev(sizeof (*tp));
-        if (dev == NULL) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                if (netif_msg_drv(&debug))
-                        dev_err(&pdev->dev, "unable to alloc new ethernet\n");
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                goto err_out;
-        }
-
-        SET_MODULE_OWNER(dev);
-        SET_NETDEV_DEV(dev, &pdev->dev);
-        tp = netdev_priv(dev);
-        tp->dev = dev;
-        tp->msg_enable = netif_msg_init(debug.msg_enable, R8168_MSG_DEFAULT);
-
-        if (!aspm || tp->mcfg == CFG_METHOD_9) {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
-                pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
-                                       PCIE_LINK_STATE_CLKPM);
-#endif
-        }
-
-        /* enable device (incl. PCI PM wakeup and hotplug setup) */
-        rc = pci_enable_device(pdev);
-        if (rc < 0) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                if (netif_msg_probe(tp))
-                        dev_err(&pdev->dev, "enable failure\n");
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                goto err_out_free_dev;
-        }
-
-        if (pci_set_mwi(pdev) < 0) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                if (netif_msg_drv(&debug))
-                        dev_info(&pdev->dev, "Mem-Wr-Inval unavailable.\n");
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-        }
-
-        /* save power state before pci_enable_device overwrites it */
-        pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
-        if (pm_cap) {
-                u16 pwr_command;
-
-                pci_read_config_word(pdev, pm_cap + PCI_PM_CTRL, &pwr_command);
-        } else {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                if (netif_msg_probe(tp)) {
-                        dev_err(&pdev->dev, "PowerManagement capability not found.\n");
-                }
-#else
-                printk("PowerManagement capability not found.\n");
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-
-        }
-
-        /* make sure PCI base addr 1 is MMIO */
-        if (!(pci_resource_flags(pdev, 2) & IORESOURCE_MEM)) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                if (netif_msg_probe(tp))
-                        dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n");
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                rc = -ENODEV;
-                goto err_out_mwi;
-        }
-        /* check for weird/broken PCI region reporting */
-        if (pci_resource_len(pdev, 2) < R8168_REGS_SIZE) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                if (netif_msg_probe(tp))
-                        dev_err(&pdev->dev, "Invalid PCI region size(s), aborting\n");
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                rc = -ENODEV;
-                goto err_out_mwi;
-        }
-
-        rc = pci_request_regions(pdev, MODULENAME);
-        if (rc < 0) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                if (netif_msg_probe(tp))
-                        dev_err(&pdev->dev, "could not request regions.\n");
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                goto err_out_mwi;
-        }
-
-        if ((sizeof(dma_addr_t) > 4) &&
-            use_dac &&
-            !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) &&
-            !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
-                dev->features |= NETIF_F_HIGHDMA;
-        } else {
-                rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
-                if (rc < 0) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                        if (netif_msg_probe(tp))
-                                dev_err(&pdev->dev, "DMA configuration failed.\n");
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                        goto err_out_free_res;
-                }
-        }
-
-        /* ioremap MMIO region */
-        ioaddr = ioremap(pci_resource_start(pdev, 2), R8168_REGS_SIZE);
-        if (ioaddr == NULL) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                if (netif_msg_probe(tp))
-                        dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                rc = -EIO;
-                goto err_out_free_res;
-        }
-
-        tp->mmio_addr = ioaddr;
-
-        /* Identify chip attached to board */
-        rtl8168_get_mac_version(tp);
-
-        rtl8168_print_mac_version(tp);
-
-        for (i = ARRAY_SIZE(rtl_chip_info) - 1; i >= 0; i--) {
-                if (tp->mcfg == rtl_chip_info[i].mcfg)
-                        break;
-        }
-
-        if (i < 0) {
-                /* Unknown chip: assume array element #0, original RTL-8168 */
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                if (netif_msg_probe(tp))
-                        dev_printk(KERN_DEBUG, &pdev->dev, "unknown chip version, assuming %s\n", rtl_chip_info[0].name);
-#else
-                printk("Realtek unknown chip version, assuming %s\n", rtl_chip_info[0].name);
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-                i++;
-        }
-
-        tp->chipset = i;
-
-        *ioaddr_out = ioaddr;
-        *dev_out = dev;
-out:
-        return rc;
-
-err_out_free_res:
-        pci_release_regions(pdev);
-err_out_mwi:
-        pci_clear_mwi(pdev);
-        pci_disable_device(pdev);
-err_out_free_dev:
-        free_netdev(dev);
-err_out:
-        *ioaddr_out = NULL;
-        *dev_out = NULL;
-        goto out;
-}
-
-static void
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
-rtl8168_esd_timer(unsigned long __opaque)
-#else
-rtl8168_esd_timer(struct timer_list *t)
-#endif
-{
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
-        struct net_device *dev = (struct net_device *)__opaque;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct timer_list *timer = &tp->esd_timer;
-#else
-        struct rtl8168_private *tp = from_timer(tp, t, esd_timer);
-        struct net_device *dev = tp->dev;
-        struct timer_list *timer = t;
-#endif
-        struct pci_dev *pdev = tp->pci_dev;
-        unsigned long timeout = RTL8168_ESD_TIMEOUT;
-        unsigned long flags;
-        u8 cmd;
-        u16 io_base_l;
-        u16 mem_base_l;
-        u16 mem_base_h;
-        u8 ilr;
-        u16 resv_0x1c_h;
-        u16 resv_0x1c_l;
-        u16 resv_0x20_l;
-        u16 resv_0x20_h;
-        u16 resv_0x24_l;
-        u16 resv_0x24_h;
-        u16 resv_0x2c_h;
-        u16 resv_0x2c_l;
-        u32 pci_sn_l;
-        u32 pci_sn_h;
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        tp->esd_flag = 0;
-
-        pci_read_config_byte(pdev, PCI_COMMAND, &cmd);
-        if (cmd != tp->pci_cfg_space.cmd) {
-                printk(KERN_ERR "%s: cmd = 0x%02x, should be 0x%02x \n.", dev->name, cmd, tp->pci_cfg_space.cmd);
-                pci_write_config_byte(pdev, PCI_COMMAND, tp->pci_cfg_space.cmd);
-                tp->esd_flag |= BIT_0;
-
-                pci_read_config_byte(pdev, PCI_COMMAND, &cmd);
-                if (cmd == 0xff) {
-                        printk(KERN_ERR "%s: pci link is down \n.", dev->name);
-                        goto out_unlock;
-                }
-        }
-
-        pci_read_config_word(pdev, PCI_BASE_ADDRESS_0, &io_base_l);
-        if (io_base_l != tp->pci_cfg_space.io_base_l) {
-                printk(KERN_ERR "%s: io_base_l = 0x%04x, should be 0x%04x \n.", dev->name, io_base_l, tp->pci_cfg_space.io_base_l);
-                pci_write_config_word(pdev, PCI_BASE_ADDRESS_0, tp->pci_cfg_space.io_base_l);
-                tp->esd_flag |= BIT_1;
-        }
-
-        pci_read_config_word(pdev, PCI_BASE_ADDRESS_2, &mem_base_l);
-        if (mem_base_l != tp->pci_cfg_space.mem_base_l) {
-                printk(KERN_ERR "%s: mem_base_l = 0x%04x, should be 0x%04x \n.", dev->name, mem_base_l, tp->pci_cfg_space.mem_base_l);
-                pci_write_config_word(pdev, PCI_BASE_ADDRESS_2, tp->pci_cfg_space.mem_base_l);
-                tp->esd_flag |= BIT_2;
-        }
-
-        pci_read_config_word(pdev, PCI_BASE_ADDRESS_2 + 2, &mem_base_h);
-        if (mem_base_h!= tp->pci_cfg_space.mem_base_h) {
-                printk(KERN_ERR "%s: mem_base_h = 0x%04x, should be 0x%04x \n.", dev->name, mem_base_h, tp->pci_cfg_space.mem_base_h);
-                pci_write_config_word(pdev, PCI_BASE_ADDRESS_2 + 2, tp->pci_cfg_space.mem_base_h);
-                tp->esd_flag |= BIT_3;
-        }
-
-        pci_read_config_word(pdev, PCI_BASE_ADDRESS_3, &resv_0x1c_l);
-        if (resv_0x1c_l != tp->pci_cfg_space.resv_0x1c_l) {
-                printk(KERN_ERR "%s: resv_0x1c_l = 0x%04x, should be 0x%04x \n.", dev->name, resv_0x1c_l, tp->pci_cfg_space.resv_0x1c_l);
-                pci_write_config_word(pdev, PCI_BASE_ADDRESS_3, tp->pci_cfg_space.resv_0x1c_l);
-                tp->esd_flag |= BIT_4;
-        }
-
-        pci_read_config_word(pdev, PCI_BASE_ADDRESS_3 + 2, &resv_0x1c_h);
-        if (resv_0x1c_h != tp->pci_cfg_space.resv_0x1c_h) {
-                printk(KERN_ERR "%s: resv_0x1c_h = 0x%04x, should be 0x%04x \n.", dev->name, resv_0x1c_h, tp->pci_cfg_space.resv_0x1c_h);
-                pci_write_config_word(pdev, PCI_BASE_ADDRESS_3 + 2, tp->pci_cfg_space.resv_0x1c_h);
-                tp->esd_flag |= BIT_5;
-        }
-
-        pci_read_config_word(pdev, PCI_BASE_ADDRESS_4, &resv_0x20_l);
-        if (resv_0x20_l != tp->pci_cfg_space.resv_0x20_l) {
-                printk(KERN_ERR "%s: resv_0x20_l = 0x%04x, should be 0x%04x \n.", dev->name, resv_0x20_l, tp->pci_cfg_space.resv_0x20_l);
-                pci_write_config_word(pdev, PCI_BASE_ADDRESS_4, tp->pci_cfg_space.resv_0x20_l);
-                tp->esd_flag |= BIT_6;
-        }
-
-        pci_read_config_word(pdev, PCI_BASE_ADDRESS_4 + 2, &resv_0x20_h);
-        if (resv_0x20_h != tp->pci_cfg_space.resv_0x20_h) {
-                printk(KERN_ERR "%s: resv_0x20_h = 0x%04x, should be 0x%04x \n.", dev->name, resv_0x20_h, tp->pci_cfg_space.resv_0x20_h);
-                pci_write_config_word(pdev, PCI_BASE_ADDRESS_4 + 2, tp->pci_cfg_space.resv_0x20_h);
-                tp->esd_flag |= BIT_7;
-        }
-
-        pci_read_config_word(pdev, PCI_BASE_ADDRESS_5, &resv_0x24_l);
-        if (resv_0x24_l != tp->pci_cfg_space.resv_0x24_l) {
-                printk(KERN_ERR "%s: resv_0x24_l = 0x%04x, should be 0x%04x \n.", dev->name, resv_0x24_l, tp->pci_cfg_space.resv_0x24_l);
-                pci_write_config_word(pdev, PCI_BASE_ADDRESS_5, tp->pci_cfg_space.resv_0x24_l);
-                tp->esd_flag |= BIT_8;
-        }
-
-        pci_read_config_word(pdev, PCI_BASE_ADDRESS_5 + 2, &resv_0x24_h);
-        if (resv_0x24_h != tp->pci_cfg_space.resv_0x24_h) {
-                printk(KERN_ERR "%s: resv_0x24_h = 0x%04x, should be 0x%04x \n.", dev->name, resv_0x24_h, tp->pci_cfg_space.resv_0x24_h);
-                pci_write_config_word(pdev, PCI_BASE_ADDRESS_5 + 2, tp->pci_cfg_space.resv_0x24_h);
-                tp->esd_flag |= BIT_9;
-        }
-
-        pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &ilr);
-        if (ilr != tp->pci_cfg_space.ilr) {
-                printk(KERN_ERR "%s: ilr = 0x%02x, should be 0x%02x \n.", dev->name, ilr, tp->pci_cfg_space.ilr);
-                pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, tp->pci_cfg_space.ilr);
-                tp->esd_flag |= BIT_10;
-        }
-
-        pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &resv_0x2c_l);
-        if (resv_0x2c_l != tp->pci_cfg_space.resv_0x2c_l) {
-                printk(KERN_ERR "%s: resv_0x2c_l = 0x%04x, should be 0x%04x \n.", dev->name, resv_0x2c_l, tp->pci_cfg_space.resv_0x2c_l);
-                pci_write_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, tp->pci_cfg_space.resv_0x2c_l);
-                tp->esd_flag |= BIT_11;
-        }
-
-        pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID + 2, &resv_0x2c_h);
-        if (resv_0x2c_h != tp->pci_cfg_space.resv_0x2c_h) {
-                printk(KERN_ERR "%s: resv_0x2c_h = 0x%04x, should be 0x%04x \n.", dev->name, resv_0x2c_h, tp->pci_cfg_space.resv_0x2c_h);
-                pci_write_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID + 2, tp->pci_cfg_space.resv_0x2c_h);
-                tp->esd_flag |= BIT_12;
-        }
-
-        if (tp->HwPcieSNOffset > 0) {
-                pci_sn_l = rtl8168_csi_read(tp, tp->HwPcieSNOffset);
-                if (pci_sn_l != tp->pci_cfg_space.pci_sn_l) {
-                        printk(KERN_ERR "%s: pci_sn_l = 0x%08x, should be 0x%08x \n.", dev->name, pci_sn_l, tp->pci_cfg_space.pci_sn_l);
-                        rtl8168_csi_write(tp, tp->HwPcieSNOffset, tp->pci_cfg_space.pci_sn_l);
-                        tp->esd_flag |= BIT_13;
-                }
-
-                pci_sn_h = rtl8168_csi_read(tp, tp->HwPcieSNOffset + 4);
-                if (pci_sn_h != tp->pci_cfg_space.pci_sn_h) {
-                        printk(KERN_ERR "%s: pci_sn_h = 0x%08x, should be 0x%08x \n.", dev->name, pci_sn_h, tp->pci_cfg_space.pci_sn_h);
-                        rtl8168_csi_write(tp, tp->HwPcieSNOffset + 4, tp->pci_cfg_space.pci_sn_h);
-                        tp->esd_flag |= BIT_14;
-                }
-        }
-
-        if (tp->TestPhyOcpReg && rtl8168_test_phy_ocp(tp))
-                tp->esd_flag |= BIT_15;
-
-        if (tp->esd_flag != 0) {
-                printk(KERN_ERR "%s: esd_flag = 0x%04x\n.\n", dev->name, tp->esd_flag);
-                netif_stop_queue(dev);
-                netif_carrier_off(dev);
-                rtl8168_hw_reset(dev);
-                rtl8168_tx_clear(tp);
-                rtl8168_rx_clear(tp);
-                rtl8168_init_ring(dev);
-                rtl8168_hw_init(dev);
-                rtl8168_powerup_pll(dev);
-                rtl8168_hw_ephy_config(dev);
-                rtl8168_hw_phy_config(dev);
-                rtl8168_hw_config(dev);
-                rtl8168_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising);
-                tp->esd_flag = 0;
-        }
-
-out_unlock:
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        mod_timer(timer, jiffies + timeout);
-}
-
-static void
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
-rtl8168_link_timer(unsigned long __opaque)
-#else
-rtl8168_link_timer(struct timer_list *t)
-#endif
-{
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
-        struct net_device *dev = (struct net_device *)__opaque;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct timer_list *timer = &tp->link_timer;
-#else
-        struct rtl8168_private *tp = from_timer(tp, t, link_timer);
-        struct net_device *dev = tp->dev;
-        struct timer_list *timer = t;
-#endif
-        unsigned long flags;
-
-        spin_lock_irqsave(&tp->lock, flags);
-        rtl8168_check_link_status(dev);
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        mod_timer(timer, jiffies + RTL8168_LINK_TIMEOUT);
-}
-
-/* Cfg9346_Unlock assumed. */
-static unsigned rtl8168_try_msi(struct pci_dev *pdev, struct rtl8168_private *tp)
-{
-        unsigned msi = 0;
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13)
-        switch (tp->mcfg) {
-        case CFG_METHOD_1:
-        case CFG_METHOD_2:
-        case CFG_METHOD_3:
-        case CFG_METHOD_4:
-        case CFG_METHOD_5:
-        case CFG_METHOD_6:
-        case CFG_METHOD_7:
-        case CFG_METHOD_8:
-                dev_info(&pdev->dev, "Default use INTx.\n");
-                break;
-        default:
-                if (pci_enable_msi(pdev))
-                        dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
-                else
-                        msi |= RTL_FEATURE_MSI;
-                break;
-        }
-#endif
-
-        return msi;
-}
-
-static void rtl8168_disable_msi(struct pci_dev *pdev, struct rtl8168_private *tp)
-{
-        if (tp->features & RTL_FEATURE_MSI) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13)
-                pci_disable_msi(pdev);
-#endif
-                tp->features &= ~RTL_FEATURE_MSI;
-        }
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)
-static const struct net_device_ops rtl8168_netdev_ops = {
-        .ndo_open       = rtl8168_open,
-        .ndo_stop       = rtl8168_close,
-        .ndo_get_stats      = rtl8168_get_stats,
-        .ndo_start_xmit     = rtl8168_start_xmit,
-        .ndo_tx_timeout     = rtl8168_tx_timeout,
-        .ndo_change_mtu     = rtl8168_change_mtu,
-        .ndo_set_mac_address    = rtl8168_set_mac_address,
-#if LINUX_VERSION_CODE < KERNEL_VERSION(5,15,0)
-        .ndo_do_ioctl       = rtl8168_do_ioctl,
-#else
-        .ndo_siocdevprivate = rtl8168_siocdevprivate,
-        .ndo_eth_ioctl      = rtl8168_do_ioctl,
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(5,15,0)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0)
-        .ndo_set_multicast_list = rtl8168_set_rx_mode,
-#else
-        .ndo_set_rx_mode    = rtl8168_set_rx_mode,
-#endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-#ifdef CONFIG_R8168_VLAN
-        .ndo_vlan_rx_register   = rtl8168_vlan_rx_register,
-#endif
-#else
-        .ndo_fix_features   = rtl8168_fix_features,
-        .ndo_set_features   = rtl8168_set_features,
-#endif
-#ifdef CONFIG_NET_POLL_CONTROLLER
-        .ndo_poll_controller    = rtl8168_netpoll,
-#endif
-};
-#endif
-
-static int __devinit
-rtl8168_init_one(struct pci_dev *pdev,
-                 const struct pci_device_id *ent)
-{
-        struct net_device *dev = NULL;
-        struct rtl8168_private *tp;
-        void __iomem *ioaddr = NULL;
-        static int board_idx = -1;
-
-        int rc;
-
-        assert(pdev != NULL);
-        assert(ent != NULL);
-
-        board_idx++;
-
-        if (netif_msg_drv(&debug))
-                printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
-                       MODULENAME, RTL8168_VERSION);
-
-        rc = rtl8168_init_board(pdev, &dev, &ioaddr);
-        if (rc)
-                goto out;
-
-        tp = netdev_priv(dev);
-        assert(ioaddr != NULL);
-
-        tp->set_speed = rtl8168_set_speed_xmii;
-        tp->get_settings = rtl8168_gset_xmii;
-        tp->phy_reset_enable = rtl8168_xmii_reset_enable;
-        tp->phy_reset_pending = rtl8168_xmii_reset_pending;
-        tp->link_ok = rtl8168_xmii_link_ok;
-
-        tp->features |= rtl8168_try_msi(pdev, tp);
-
-        RTL_NET_DEVICE_OPS(rtl8168_netdev_ops);
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
-        SET_ETHTOOL_OPS(dev, &rtl8168_ethtool_ops);
-#endif
-
-        dev->watchdog_timeo = RTL8168_TX_TIMEOUT;
-        dev->irq = pdev->irq;
-        dev->base_addr = (unsigned long) ioaddr;
-
-#ifdef CONFIG_R8168_NAPI
-        RTL_NAPI_CONFIG(dev, tp, rtl8168_poll, R8168_NAPI_WEIGHT);
-#endif
-
-#ifdef CONFIG_R8168_VLAN
-        if (tp->mcfg != CFG_METHOD_DEFAULT) {
-                dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-                dev->vlan_rx_kill_vid = rtl8168_vlan_rx_kill_vid;
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-        }
-#endif
-
-        /* There has been a number of reports that using SG/TSO results in
-         * tx timeouts. However for a lot of people SG/TSO works fine.
-         * Therefore disable both features by default, but allow users to
-         * enable them. Use at own risk!
-         */
-        tp->cp_cmd |= RTL_R16(tp, CPlusCmd);
-        if (tp->mcfg != CFG_METHOD_DEFAULT) {
-                dev->features |= NETIF_F_IP_CSUM;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-                tp->cp_cmd |= RxChkSum;
-#else
-                dev->features |= NETIF_F_RXCSUM;
-                dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM |
-                                   NETIF_F_RXCSUM | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-                dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM |
-                                     NETIF_F_HIGHDMA;
-                if ((tp->mcfg != CFG_METHOD_16) && (tp->mcfg != CFG_METHOD_17)) {
-                        //dev->features |= NETIF_F_TSO;
-                        dev->hw_features |= NETIF_F_TSO;
-                        dev->vlan_features |= NETIF_F_TSO;
-                }
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0)
-                dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0)
-                dev->hw_features |= NETIF_F_RXALL;
-                dev->hw_features |= NETIF_F_RXFCS;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-                if ((tp->mcfg == CFG_METHOD_1) || (tp->mcfg == CFG_METHOD_2) || (tp->mcfg == CFG_METHOD_3)) {
-                        dev->hw_features &= ~NETIF_F_IPV6_CSUM;
-                        netif_set_gso_max_size(dev, LSO_32K);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0)
-                        dev->gso_max_segs = NIC_MAX_PHYS_BUF_COUNT_LSO_64K;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
-                        dev->gso_min_segs = NIC_MIN_PHYS_BUF_COUNT;
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0)
-                } else {
-                        dev->hw_features |= NETIF_F_IPV6_CSUM;
-                        dev->features |=  NETIF_F_IPV6_CSUM;
-                        if ((tp->mcfg != CFG_METHOD_16) && (tp->mcfg != CFG_METHOD_17)) {
-                                dev->hw_features |= NETIF_F_TSO6;
-                                //dev->features |=  NETIF_F_TSO6;
-                        }
-                        netif_set_gso_max_size(dev, LSO_64K);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0)
-                        dev->gso_max_segs = NIC_MAX_PHYS_BUF_COUNT_LSO2;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
-                        dev->gso_min_segs = NIC_MIN_PHYS_BUF_COUNT;
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0)
-                }
-#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-        }
-
-        tp->pci_dev = pdev;
-
-        spin_lock_init(&tp->lock);
-
-        rtl8168_init_software_variable(dev);
-
-#ifdef ENABLE_DASH_SUPPORT
-        if (tp->DASH)
-                AllocateDashShareMemory(dev);
-#endif
-
-        rtl8168_exit_oob(dev);
-
-        rtl8168_hw_init(dev);
-
-        rtl8168_hw_reset(dev);
-
-        /* Get production from EEPROM */
-        if (((tp->mcfg == CFG_METHOD_21 || tp->mcfg == CFG_METHOD_22 ||
-              tp->mcfg == CFG_METHOD_25 || tp->mcfg == CFG_METHOD_29 ||
-              tp->mcfg == CFG_METHOD_30 || tp->mcfg == CFG_METHOD_35) &&
-             (rtl8168_mac_ocp_read(tp, 0xDC00) & BIT_3)) ||
-            ((tp->mcfg == CFG_METHOD_26) && (rtl8168_mac_ocp_read(tp, 0xDC00) & BIT_4)))
-                tp->eeprom_type = EEPROM_TYPE_NONE;
-        else
-                rtl8168_eeprom_type(tp);
-
-        if (tp->eeprom_type == EEPROM_TYPE_93C46 || tp->eeprom_type == EEPROM_TYPE_93C56)
-                rtl8168_set_eeprom_sel_low(tp);
-
-        rtl8168_get_mac_address(dev);
-
-        tp->fw_name = rtl_chip_fw_infos[tp->mcfg].fw_name;
-
-#if defined(ENABLE_DASH_PRINTER_SUPPORT)
-        init_completion(&tp->fw_host_ok);
-        init_completion(&tp->fw_ack);
-        init_completion(&tp->fw_req);
-#endif
-
-        tp->tally_vaddr = dma_alloc_coherent(&pdev->dev, sizeof(*tp->tally_vaddr),
-                                             &tp->tally_paddr, GFP_KERNEL);
-        if (!tp->tally_vaddr) {
-                rc = -ENOMEM;
-                goto err_out;
-        }
-
-        rtl8168_tally_counter_clear(tp);
-
-        pci_set_drvdata(pdev, dev);
-
-        rc = register_netdev(dev);
-        if (rc)
-                goto err_out;
-
-        printk(KERN_INFO "%s: This product is covered by one or more of the following patents: US6,570,884, US6,115,776, and US6,327,625.\n", MODULENAME);
-
-        rtl8168_disable_rxdvgate(dev);
-
-        device_set_wakeup_enable(&pdev->dev, tp->wol_enabled);
-
-        netif_carrier_off(dev);
-
-        printk("%s", GPL_CLAIM);
-
-out:
-        return rc;
-
-err_out:
-        if (tp->tally_vaddr != NULL) {
-                dma_free_coherent(&pdev->dev, sizeof(*tp->tally_vaddr), tp->tally_vaddr,
-                                  tp->tally_paddr);
-
-                tp->tally_vaddr = NULL;
-        }
-#ifdef  CONFIG_R8168_NAPI
-        RTL_NAPI_DEL(tp);
-#endif
-        rtl8168_disable_msi(pdev, tp);
-        rtl8168_release_board(pdev, dev);
-
-        goto out;
-}
-
-static void __devexit
-rtl8168_remove_one(struct pci_dev *pdev)
-{
-        struct net_device *dev = pci_get_drvdata(pdev);
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        assert(dev != NULL);
-        assert(tp != NULL);
-
-#ifdef  CONFIG_R8168_NAPI
-        RTL_NAPI_DEL(tp);
-#endif
-        if (HW_DASH_SUPPORT_DASH(tp))
-                rtl8168_driver_stop(tp);
-
-        unregister_netdev(dev);
-        rtl8168_disable_msi(pdev, tp);
-#ifdef ENABLE_R8168_PROCFS
-        rtl8168_proc_remove(dev);
-#endif
-        if (tp->tally_vaddr != NULL) {
-                dma_free_coherent(&pdev->dev, sizeof(*tp->tally_vaddr), tp->tally_vaddr, tp->tally_paddr);
-                tp->tally_vaddr = NULL;
-        }
-
-        rtl8168_release_board(pdev, dev);
-
-#ifdef ENABLE_USE_FIRMWARE_FILE
-        rtl8168_release_firmware(tp);
-#endif
-
-        pci_set_drvdata(pdev, NULL);
-}
-
-static void
-rtl8168_set_rxbufsize(struct rtl8168_private *tp,
-                      struct net_device *dev)
-{
-        unsigned int mtu = dev->mtu;
-
-        tp->rx_buf_sz = (mtu > ETH_DATA_LEN) ? mtu + ETH_HLEN + 8 + 1 : RX_BUF_SIZE;
-}
-
-#ifdef ENABLE_USE_FIRMWARE_FILE
-static void rtl8168_request_firmware(struct rtl8168_private *tp)
-{
-        struct rtl8168_fw *rtl_fw;
-
-        /* firmware loaded already or no firmware available */
-        if (tp->rtl_fw || !tp->fw_name)
-                return;
-
-        rtl_fw = kzalloc(sizeof(*rtl_fw), GFP_KERNEL);
-        if (!rtl_fw)
-                return;
-
-        rtl_fw->phy_write = rtl8168_mdio_write;
-        rtl_fw->phy_read = rtl8168_mdio_read;
-        rtl_fw->mac_mcu_write = mac_mcu_write;
-        rtl_fw->mac_mcu_read = mac_mcu_read;
-        rtl_fw->fw_name = tp->fw_name;
-        rtl_fw->dev = tp_to_dev(tp);
-
-        if (rtl8168_fw_request_firmware(rtl_fw))
-                kfree(rtl_fw);
-        else
-                tp->rtl_fw = rtl_fw;
-}
-#endif
-
-static int rtl8168_open(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct pci_dev *pdev = tp->pci_dev;
-        unsigned long flags;
-        int retval;
-
-        retval = -ENOMEM;
-
-#ifdef ENABLE_R8168_PROCFS
-        rtl8168_proc_init(dev);
-#endif
-        rtl8168_set_rxbufsize(tp, dev);
-        /*
-        * Rx and Tx descriptors needs 256 bytes alignment.
-        * pci_alloc_consistent provides more.
-        */
-        tp->TxDescArray = dma_alloc_coherent(&pdev->dev,
-                                             (tp->num_tx_desc * sizeof(struct TxDesc)),
-                                             &tp->TxPhyAddr, GFP_KERNEL);
-        if (!tp->TxDescArray)
-                goto err_free_all_allocated_mem;
-
-        tp->RxDescArray = dma_alloc_coherent(&pdev->dev,
-                                             (tp->num_rx_desc * sizeof(struct RxDesc)),
-                                             &tp->RxPhyAddr, GFP_KERNEL);
-        if (!tp->RxDescArray)
-                goto err_free_all_allocated_mem;
-
-        retval = rtl8168_init_ring(dev);
-        if (retval < 0)
-                goto err_free_all_allocated_mem;
-
-        retval = request_irq(dev->irq, rtl8168_interrupt, (tp->features & RTL_FEATURE_MSI) ? 0 : SA_SHIRQ, dev->name, dev);
-        if (retval<0)
-                goto err_free_all_allocated_mem;
-
-        if (netif_msg_probe(tp)) {
-                printk(KERN_INFO "%s: 0x%lx, "
-                       "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
-                       "IRQ %d\n",
-                       dev->name,
-                       dev->base_addr,
-                       dev->dev_addr[0], dev->dev_addr[1],
-                       dev->dev_addr[2], dev->dev_addr[3],
-                       dev->dev_addr[4], dev->dev_addr[5], dev->irq);
-        }
-
-#ifdef ENABLE_USE_FIRMWARE_FILE
-        rtl8168_request_firmware(tp);
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-        INIT_WORK(&tp->task, rtl8168_reset_task, dev);
-#else
-        INIT_DELAYED_WORK(&tp->task, rtl8168_reset_task);
-#endif
-
-        pci_set_master(pdev);
-
-#ifdef  CONFIG_R8168_NAPI
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-        RTL_NAPI_ENABLE(dev, &tp->napi);
-#endif
-#endif
-        spin_lock_irqsave(&tp->lock, flags);
-
-        rtl8168_exit_oob(dev);
-
-        rtl8168_hw_init(dev);
-
-        rtl8168_hw_reset(dev);
-
-        rtl8168_powerup_pll(dev);
-
-        rtl8168_hw_ephy_config(dev);
-
-        rtl8168_hw_phy_config(dev);
-
-        rtl8168_hw_config(dev);
-
-        rtl8168_dsm(dev, DSM_IF_UP);
-
-        rtl8168_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        if (tp->esd_flag == 0)
-                rtl8168_request_esd_timer(dev);
-
-        rtl8168_request_link_timer(dev);
-
-out:
-
-        return retval;
-
-err_free_all_allocated_mem:
-        if (tp->RxDescArray != NULL) {
-                dma_free_coherent(&pdev->dev,
-                                  (tp->num_rx_desc * sizeof(struct RxDesc)),
-                                  tp->RxDescArray,
-                                  tp->RxPhyAddr);
-                tp->RxDescArray = NULL;
-        }
-
-        if (tp->TxDescArray != NULL) {
-                dma_free_coherent(&pdev->dev,
-                                  (tp->num_tx_desc * sizeof(struct TxDesc)),
-                                  tp->TxDescArray,
-                                  tp->TxPhyAddr);
-                tp->TxDescArray = NULL;
-        }
-
-        goto out;
-}
-
-static void
-rtl8168_dsm(struct net_device *dev, int dev_state)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        switch (dev_state) {
-        case DSM_MAC_INIT:
-                if ((tp->mcfg == CFG_METHOD_5) || (tp->mcfg == CFG_METHOD_6)) {
-                        if (RTL_R8(tp, MACDBG) & 0x80)
-                                RTL_W8(tp, GPIO, RTL_R8(tp, GPIO) | GPIO_en);
-                        else
-                                RTL_W8(tp, GPIO, RTL_R8(tp, GPIO) & ~GPIO_en);
-                }
-
-                break;
-        case DSM_NIC_GOTO_D3:
-        case DSM_IF_DOWN:
-                if ((tp->mcfg == CFG_METHOD_5) || (tp->mcfg == CFG_METHOD_6)) {
-                        if (RTL_R8(tp, MACDBG) & 0x80)
-                                RTL_W8(tp, GPIO, RTL_R8(tp, GPIO) & ~GPIO_en);
-                }
-                break;
-
-        case DSM_NIC_RESUME_D3:
-        case DSM_IF_UP:
-                if ((tp->mcfg == CFG_METHOD_5) || (tp->mcfg == CFG_METHOD_6)) {
-                        if (RTL_R8(tp, MACDBG) & 0x80)
-                                RTL_W8(tp, GPIO, RTL_R8(tp, GPIO) | GPIO_en);
-                }
-
-                break;
-        }
-
-}
-
-static void
-set_offset70F(struct rtl8168_private *tp, u8 setting)
-{
-        u32 csi_tmp;
-        u32 temp = (u32)setting;
-        temp = temp << 24;
-        /*set PCI configuration space offset 0x70F to setting*/
-        /*When the register offset of PCI configuration space larger than 0xff, use CSI to access it.*/
-
-        csi_tmp = rtl8168_csi_read(tp, 0x70c) & 0x00ffffff;
-        rtl8168_csi_write(tp, 0x70c, csi_tmp | temp);
-}
-
-static void
-set_offset79(struct rtl8168_private *tp, u8 setting)
-{
-        //Set PCI configuration space offset 0x79 to setting
-
-        struct pci_dev *pdev = tp->pci_dev;
-        u8 device_control;
-
-        if (hwoptimize & HW_PATCH_SOC_LAN) return;
-
-        pci_read_config_byte(pdev, 0x79, &device_control);
-        device_control &= ~0x70;
-        device_control |= setting;
-        pci_write_config_byte(pdev, 0x79, device_control);
-}
-
-static void
-set_offset711(struct rtl8168_private *tp, u8 setting)
-{
-        u32 csi_tmp;
-        u32 temp = (u32)setting;
-        temp &= 0x0f;
-        temp = temp << 12;
-        /*set PCI configuration space offset 0x711 to setting*/
-
-        csi_tmp = rtl8168_csi_read(tp, 0x710) & 0xffff0fff;
-        rtl8168_csi_write(tp, 0x710, csi_tmp | temp);
-}
-
-static void
-rtl8168_hw_set_rx_packet_filter(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u32 mc_filter[2];   /* Multicast hash filter */
-        int rx_mode;
-        u32 tmp = 0;
-
-        if (dev->flags & IFF_PROMISC) {
-                /* Unconditionally log net taps. */
-                if (netif_msg_link(tp))
-                        printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n",
-                               dev->name);
-
-                rx_mode =
-                        AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
-                        AcceptAllPhys;
-                mc_filter[1] = mc_filter[0] = 0xffffffff;
-        } else if ((netdev_mc_count(dev) > multicast_filter_limit)
-                   || (dev->flags & IFF_ALLMULTI)) {
-                /* Too many to filter perfectly -- accept all multicasts. */
-                rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
-                mc_filter[1] = mc_filter[0] = 0xffffffff;
-        } else {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35)
-                struct dev_mc_list *mclist;
-                unsigned int i;
-
-                rx_mode = AcceptBroadcast | AcceptMyPhys;
-                mc_filter[1] = mc_filter[0] = 0;
-                for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
-                     i++, mclist = mclist->next) {
-                        int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
-                        mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
-                        rx_mode |= AcceptMulticast;
-                }
-#else
-                struct netdev_hw_addr *ha;
-
-                rx_mode = AcceptBroadcast | AcceptMyPhys;
-                mc_filter[1] = mc_filter[0] = 0;
-                netdev_for_each_mc_addr(ha, dev) {
-                        int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
-                        mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
-                        rx_mode |= AcceptMulticast;
-                }
-#endif
-        }
-
-        if (dev->features & NETIF_F_RXALL)
-                rx_mode |= (AcceptErr | AcceptRunt);
-
-        tmp = mc_filter[0];
-        mc_filter[0] = swab32(mc_filter[1]);
-        mc_filter[1] = swab32(tmp);
-
-        tp->rtl8168_rx_config = rtl_chip_info[tp->chipset].RCR_Cfg;
-        tmp = tp->rtl8168_rx_config | rx_mode | (RTL_R32(tp, RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
-
-        RTL_W32(tp, RxConfig, tmp);
-        RTL_W32(tp, MAR0 + 0, mc_filter[0]);
-        RTL_W32(tp, MAR0 + 4, mc_filter[1]);
-}
-
-static void
-rtl8168_set_rx_mode(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        rtl8168_hw_set_rx_packet_filter(dev);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-}
-
-static void
-rtl8168_hw_config(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct pci_dev *pdev = tp->pci_dev;
-        u8 device_control;
-        u16 mac_ocp_data;
-        u32 csi_tmp;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-        if (dev->mtu > ETH_DATA_LEN) {
-                dev->features &= ~(NETIF_F_IP_CSUM);
-        } else {
-                dev->features |= NETIF_F_IP_CSUM;
-        }
-#endif
-
-        RTL_W32(tp, RxConfig, (RX_DMA_BURST << RxCfgDMAShift));
-
-        rtl8168_hw_reset(dev);
-
-        rtl8168_enable_cfg9346_write(tp);
-        if (tp->HwSuppAspmClkIntrLock) {
-                RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) & ~BIT_7);
-                rtl8168_hw_aspm_clkreq_enable(tp, false);
-        }
-
-        //clear io_rdy_l23
-        switch (tp->mcfg) {
-        case CFG_METHOD_20:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~BIT_1);
-                break;
-        }
-
-        //keep magic packet only
-        switch (tp->mcfg) {
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                csi_tmp = rtl8168_eri_read(tp, 0xDE, 1, ERIAR_ExGMAC);
-                csi_tmp &= BIT_0;
-                rtl8168_eri_write(tp, 0xDE, 1, csi_tmp, ERIAR_ExGMAC);
-                break;
-        }
-
-        RTL_W8(tp, MTPS, Reserved1_data);
-
-        tp->cp_cmd |= INTT_1;
-        if (tp->use_timer_interrrupt)
-                tp->cp_cmd |= PktCntrDisable;
-        else
-                tp->cp_cmd &= ~PktCntrDisable;
-
-        RTL_W16(tp, IntrMitigate, 0x5f51);
-
-        rtl8168_tally_counter_addr_fill(tp);
-
-        rtl8168_desc_addr_fill(tp);
-
-        /* Set DMA burst size and Interframe Gap Time */
-        if (tp->mcfg == CFG_METHOD_1)
-                RTL_W32(tp, TxConfig, (TX_DMA_BURST_512 << TxDMAShift) |
-                        (InterFrameGap << TxInterFrameGapShift));
-        else
-                RTL_W32(tp, TxConfig, (TX_DMA_BURST_unlimited << TxDMAShift) |
-                        (InterFrameGap << TxInterFrameGapShift));
-
-        if (tp->mcfg == CFG_METHOD_4) {
-                set_offset70F(tp, 0x27);
-
-                RTL_W8(tp, DBG_reg, (0x0E << 4) | Fix_Nak_1 | Fix_Nak_2);
-
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                //disable clock request.
-                pci_write_config_byte(pdev, 0x81, 0x00);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
-
-                        set_offset79(tp, 0x20);
-                } else {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
-
-                        set_offset79(tp, 0x50);
-                }
-
-                //rx checksum offload enable
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-                tp->cp_cmd |= RxChkSum;
-#else
-                dev->features |= NETIF_F_RXCSUM;
-#endif
-
-                tp->cp_cmd &= ~(EnableBist | Macdbgo_oe | Force_halfdup |
-                                Force_rxflow_en | Force_txflow_en | Cxpl_dbg_sel |
-                                ASF | PktCntrDisable | Macdbgo_sel);
-        } else if (tp->mcfg == CFG_METHOD_5) {
-
-                set_offset70F(tp, 0x27);
-
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                //disable clock request.
-                pci_write_config_byte(pdev, 0x81, 0x00);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
-
-                        set_offset79(tp, 0x20);
-                } else {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
-
-                        set_offset79(tp, 0x50);
-                }
-
-                //rx checksum offload enable
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-                tp->cp_cmd |= RxChkSum;
-#else
-                dev->features |= NETIF_F_RXCSUM;
-#endif
-        } else if (tp->mcfg == CFG_METHOD_6) {
-                set_offset70F(tp, 0x27);
-
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                //disable clock request.
-                pci_write_config_byte(pdev, 0x81, 0x00);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
-
-                        set_offset79(tp, 0x20);
-                } else {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
-
-                        set_offset79(tp, 0x50);
-                }
-
-                //rx checksum offload enable
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-                tp->cp_cmd |= RxChkSum;
-#else
-                dev->features |= NETIF_F_RXCSUM;
-#endif
-        } else if (tp->mcfg == CFG_METHOD_7) {
-                set_offset70F(tp, 0x27);
-
-                rtl8168_eri_write(tp, 0x1EC, 1, 0x07, ERIAR_ASF);
-
-                //disable clock request.
-                pci_write_config_byte(pdev, 0x81, 0x00);
-
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
-
-                        set_offset79(tp, 0x20);
-                } else {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
-
-
-                        set_offset79(tp, 0x50);
-                }
-        } else if (tp->mcfg == CFG_METHOD_8) {
-
-                set_offset70F(tp, 0x27);
-
-                rtl8168_eri_write(tp, 0x1EC, 1, 0x07, ERIAR_ASF);
-
-                //disable clock request.
-                pci_write_config_byte(pdev, 0x81, 0x00);
-
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                RTL_W8(tp, 0xD1, 0x20);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
-
-                        set_offset79(tp, 0x20);
-                } else {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
-
-                        set_offset79(tp, 0x50);
-                }
-        } else if (tp->mcfg == CFG_METHOD_9) {
-                set_offset70F(tp, 0x27);
-
-                /* disable clock request. */
-                pci_write_config_byte(pdev, 0x81, 0x00);
-
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~BIT_4);
-                RTL_W8(tp, DBG_reg, RTL_R8(tp, DBG_reg) | BIT_7 | BIT_1);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
-
-                        set_offset79(tp, 0x20);
-                } else {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
-
-                        set_offset79(tp, 0x50);
-                }
-
-                RTL_W8(tp, TDFNR, 0x8);
-
-        } else if (tp->mcfg == CFG_METHOD_10) {
-                set_offset70F(tp, 0x27);
-
-                RTL_W8(tp, DBG_reg, RTL_R8(tp, DBG_reg) | BIT_7 | BIT_1);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
-
-                        set_offset79(tp, 0x20);
-                } else {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
-
-                        set_offset79(tp, 0x50);
-                }
-
-                RTL_W8(tp, TDFNR, 0x8);
-
-                RTL_W8(tp, Config1, RTL_R8(tp, Config1) | 0x10);
-
-                /* disable clock request. */
-                pci_write_config_byte(pdev, 0x81, 0x00);
-        } else if (tp->mcfg == CFG_METHOD_11 || tp->mcfg == CFG_METHOD_13) {
-                set_offset70F(tp, 0x27);
-                set_offset79(tp, 0x50);
-
-                if (dev->mtu > ETH_DATA_LEN)
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
-                else
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
-
-                pci_write_config_byte(pdev, 0x81, 0x00);
-
-                RTL_W8(tp, Config1, RTL_R8(tp, Config1) | 0x10);
-
-        } else if (tp->mcfg == CFG_METHOD_12) {
-                set_offset70F(tp, 0x27);
-                set_offset79(tp, 0x50);
-
-                if (dev->mtu > ETH_DATA_LEN)
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
-                else
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
-
-                pci_write_config_byte(pdev, 0x81, 0x01);
-
-                RTL_W8(tp, Config1, RTL_R8(tp, Config1) | 0x10);
-
-        } else if (tp->mcfg == CFG_METHOD_14 || tp->mcfg == CFG_METHOD_15) {
-
-                set_offset70F(tp, 0x27);
-                set_offset79(tp, 0x50);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        RTL_W8(tp, MTPS, 0x24);
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) | 0x01);
-                } else {
-                        RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~0x01);
-                }
-
-                RTL_W8(tp, 0xF3, RTL_R8(tp, 0xF3) | BIT_5);
-                RTL_W8(tp, 0xF3, RTL_R8(tp, 0xF3) & ~BIT_5);
-
-                RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_7 | BIT_6);
-
-                RTL_W8(tp, 0xD1, RTL_R8(tp, 0xD1) | BIT_2 | BIT_3);
-
-                RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) | BIT_6 | BIT_5 | BIT_4 | BIT_2 | BIT_1);
-
-                RTL_W8(tp, TDFNR, 0x8);
-
-                /*
-                if (aspm)
-                RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) | BIT_7);
-                */
-
-                RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_3);
-
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                RTL_W8(tp, Config1, RTL_R8(tp, Config1) & ~0x10);
-        } else if (tp->mcfg == CFG_METHOD_16 || tp->mcfg == CFG_METHOD_17) {
-                set_offset70F(tp, 0x27);
-                set_offset79(tp, 0x50);
-
-                rtl8168_eri_write(tp, 0xC0, 2, 0x0000, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xB8, 4, 0x00000000, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xC8, 4, 0x00100002, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
-                csi_tmp = rtl8168_eri_read(tp, 0x1D0, 4, ERIAR_ExGMAC);
-                csi_tmp |= BIT_1;
-                rtl8168_eri_write(tp, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);
-
-                csi_tmp = rtl8168_eri_read(tp, 0xDC, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-                csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-
-                RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | BIT_7);
-                RTL_W8(tp, 0xD3, RTL_R8(tp, 0xD3) & ~BIT_7);
-                RTL_W8(tp, 0x1B, RTL_R8(tp, 0x1B) & ~0x07);
-
-                if (tp->mcfg == CFG_METHOD_16) {
-                        RTL_W32(tp, 0xB0, 0xEE480010);
-                        RTL_W8(tp, 0x1A, RTL_R8(tp, 0x1A) & ~(BIT_2|BIT_3));
-                        rtl8168_eri_write(tp, 0x1DC, 1, 0x64, ERIAR_ExGMAC);
-                } else {
-                        csi_tmp = rtl8168_eri_read(tp, 0x1B0, 4, ERIAR_ExGMAC);
-                        csi_tmp |= BIT_4;
-                        rtl8168_eri_write(tp, 0x1B0, 1, csi_tmp, ERIAR_ExGMAC);
-                        rtl8168_eri_write(tp, 0xCC, 4, 0x00000050, ERIAR_ExGMAC);
-                        rtl8168_eri_write(tp, 0xD0, 4, 0x07ff0060, ERIAR_ExGMAC);
-                }
-
-                RTL_W8(tp, TDFNR, 0x8);
-
-                RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~PMSTS_En);
-
-                RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_6);
-                RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_6);
-
-                if (dev->mtu > ETH_DATA_LEN)
-                        RTL_W8(tp, MTPS, 0x27);
-
-                /* disable clock request. */
-                pci_write_config_byte(pdev, 0x81, 0x00);
-
-        } else if (tp->mcfg == CFG_METHOD_18 || tp->mcfg == CFG_METHOD_19) {
-                set_offset70F(tp, 0x27);
-                set_offset79(tp, 0x50);
-
-                rtl8168_eri_write(tp, 0xC8, 4, 0x00100002, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
-                RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | BIT_7);
-                RTL_W8(tp, 0xD3, RTL_R8(tp, 0xD3) & ~BIT_7);
-                csi_tmp = rtl8168_eri_read(tp, 0xDC, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-                csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-
-                /*
-                if (aspm)
-                RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) | BIT_7);
-                */
-
-                if (dev->mtu > ETH_DATA_LEN)
-                        RTL_W8(tp, MTPS, 0x27);
-
-                RTL_W8(tp, TDFNR, 0x8);
-
-                RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_6);
-                RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_6);
-
-                rtl8168_eri_write(tp, 0xC0, 2, 0x0000, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xB8, 4, 0x00000000, ERIAR_ExGMAC);
-                RTL_W8(tp, 0x1B,RTL_R8(tp, 0x1B) & ~0x07);
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_4;
-                rtl8168_eri_write(tp, 0x1B0, 1, csi_tmp, ERIAR_ExGMAC);
-                csi_tmp = rtl8168_eri_read(tp, 0x1d0, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_4 | BIT_1;
-                rtl8168_eri_write(tp, 0x1d0, 1, csi_tmp, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xCC, 4, 0x00000050, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xd0, 4, 0x00000060, ERIAR_ExGMAC);
-        } else if (tp->mcfg == CFG_METHOD_20) {
-                set_offset70F(tp, 0x27);
-                set_offset79(tp, 0x50);
-
-                rtl8168_eri_write(tp, 0xC8, 4, 0x00100002, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
-                RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | BIT_7);
-                RTL_W8(tp, 0xD3, RTL_R8(tp, 0xD3) & ~BIT_7);
-                csi_tmp = rtl8168_eri_read(tp, 0xDC, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-                csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-
-                /*
-                if (aspm)
-                RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) | BIT_7);
-                */
-
-                if (dev->mtu > ETH_DATA_LEN)
-                        RTL_W8(tp, MTPS, 0x27);
-
-                RTL_W8(tp, TDFNR, 0x8);
-
-                RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_6);
-                RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_6);
-                rtl8168_eri_write(tp, 0xC0, 2, 0x0000, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xB8, 4, 0x00000000, ERIAR_ExGMAC);
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_4;
-                rtl8168_eri_write(tp, 0x1B0, 1, csi_tmp, ERIAR_ExGMAC);
-                csi_tmp = rtl8168_eri_read(tp, 0x1d0, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_4 | BIT_1;
-                rtl8168_eri_write(tp, 0x1d0, 1, csi_tmp, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xCC, 4, 0x00000050, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xd0, 4, 0x00000060, ERIAR_ExGMAC);
-        } else if (tp->mcfg == CFG_METHOD_21 || tp->mcfg == CFG_METHOD_22 ||
-                   tp->mcfg == CFG_METHOD_24 || tp->mcfg == CFG_METHOD_25 ||
-                   tp->mcfg == CFG_METHOD_26 || tp->mcfg == CFG_METHOD_29 ||
-                   tp->mcfg == CFG_METHOD_30 || tp->mcfg == CFG_METHOD_35) {
-                set_offset70F(tp, 0x27);
-                set_offset79(tp, 0x50);
-                if (tp->mcfg == CFG_METHOD_21 || tp->mcfg == CFG_METHOD_22)
-                        set_offset711(tp, 0x04);
-
-                rtl8168_eri_write(tp, 0xC8, 4, 0x00080002, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xCC, 1, 0x38, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xD0, 1, 0x48, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
-
-                RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | BIT_7);
-
-                csi_tmp = rtl8168_eri_read(tp, 0xDC, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-                csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-
-                if (tp->mcfg == CFG_METHOD_35)
-                        rtl8168_set_mcu_ocp_bit(tp, 0xD438, (BIT_1 | BIT_0));
-
-                if (tp->mcfg == CFG_METHOD_26) {
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xD3C0);
-                        mac_ocp_data &= ~(BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0);
-                        mac_ocp_data |= 0x0FFF;
-                        rtl8168_mac_ocp_write(tp, 0xD3C0, mac_ocp_data);
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xD3C2);
-                        mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0);
-                        rtl8168_mac_ocp_write(tp, 0xD3C2, mac_ocp_data);
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xD3C4);
-                        mac_ocp_data |= BIT_0;
-                        rtl8168_mac_ocp_write(tp, 0xD3C4, mac_ocp_data);
-                } else if (tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-                           tp->mcfg == CFG_METHOD_35) {
-
-                        if (tp->RequireAdjustUpsTxLinkPulseTiming) {
-                                mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xD412);
-                                mac_ocp_data &= ~(0x0FFF);
-                                mac_ocp_data |= tp->SwrCnt1msIni;
-                                rtl8168_mac_ocp_write(tp, 0xD412, mac_ocp_data);
-                        }
-
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xE056);
-                        mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4);
-                        //mac_ocp_data |= (BIT_6 | BIT_5 | BIT_4);
-                        rtl8168_mac_ocp_write(tp, 0xE056, mac_ocp_data);
-
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xE052);
-                        mac_ocp_data &= ~(BIT_15 | BIT_14 | BIT_13 | BIT_3);
-                        mac_ocp_data |= BIT_15;
-                        //mac_ocp_data |= BIT_3;
-                        rtl8168_mac_ocp_write(tp, 0xE052, mac_ocp_data);
-
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xD420);
-                        mac_ocp_data &= ~(BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0);
-                        mac_ocp_data |= 0x45F;
-                        rtl8168_mac_ocp_write(tp, 0xD420, mac_ocp_data);
-
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xE0D6);
-                        mac_ocp_data &= ~(BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0);
-                        mac_ocp_data |= 0x17F;
-                        rtl8168_mac_ocp_write(tp, 0xE0D6, mac_ocp_data);
-                }
-
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                RTL_W8(tp, 0x1B, RTL_R8(tp, 0x1B) & ~0x07);
-
-                RTL_W8(tp, TDFNR, 0x4);
-
-                RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~PMSTS_En);
-
-                /*
-                if (aspm)
-                RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) | BIT_7);
-                */
-
-                if (dev->mtu > ETH_DATA_LEN)
-                        RTL_W8(tp, MTPS, 0x27);
-
-                RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_6);
-                RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_6);
-
-                RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_7);
-
-                rtl8168_eri_write(tp, 0xC0, 2, 0x0000, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xB8, 4, 0x00000000, ERIAR_ExGMAC);
-
-                if (tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-                    tp->mcfg == CFG_METHOD_35) {
-                        rtl8168_mac_ocp_write(tp, 0xE054, 0x0000);
-
-                        rtl8168_eri_write(tp, 0x5F0, 2, 0x4000, ERIAR_ExGMAC);
-                } else {
-                        rtl8168_eri_write(tp, 0x5F0, 2, 0x4F87, ERIAR_ExGMAC);
-                }
-
-                if (tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-                    tp->mcfg == CFG_METHOD_35) {
-                        csi_tmp = rtl8168_eri_read(tp, 0xDC, 4, ERIAR_ExGMAC);
-                        csi_tmp |= (BIT_2 | BIT_3 | BIT_4);
-                        rtl8168_eri_write(tp, 0xDC, 4, csi_tmp, ERIAR_ExGMAC);
-                }
-
-                if (tp->mcfg == CFG_METHOD_21 || tp->mcfg == CFG_METHOD_22 ||
-                    tp->mcfg == CFG_METHOD_24 || tp->mcfg == CFG_METHOD_25) {
-                        rtl8168_mac_ocp_write(tp, 0xC140, 0xFFFF);
-                } else if (tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-                           tp->mcfg == CFG_METHOD_35) {
-                        rtl8168_mac_ocp_write(tp, 0xC140, 0xFFFF);
-                        rtl8168_mac_ocp_write(tp, 0xC142, 0xFFFF);
-                }
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_12;
-                rtl8168_eri_write(tp, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
-
-                if (tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
-                    tp->mcfg == CFG_METHOD_35) {
-                        csi_tmp = rtl8168_eri_read(tp, 0x2FC, 1, ERIAR_ExGMAC);
-                        csi_tmp &= ~(BIT_2);
-                        rtl8168_eri_write(tp, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC);
-                } else {
-                        csi_tmp = rtl8168_eri_read(tp, 0x2FC, 1, ERIAR_ExGMAC);
-                        csi_tmp &= ~(BIT_0 | BIT_1 | BIT_2);
-                        csi_tmp |= BIT_0;
-                        rtl8168_eri_write(tp, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC);
-                }
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1D0, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_1;
-                rtl8168_eri_write(tp, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);
-        } else if (tp->mcfg == CFG_METHOD_23 || tp->mcfg == CFG_METHOD_27 ||
-                   tp->mcfg == CFG_METHOD_28) {
-                set_offset70F(tp, 0x27);
-                set_offset79(tp, 0x50);
-
-                rtl8168_eri_write(tp, 0xC8, 4, 0x00080002, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xCC, 1, 0x2F, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xD0, 1, 0x5F, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
-
-                RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | BIT_7);
-
-                csi_tmp = rtl8168_eri_read(tp, 0xDC, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-                csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_6);
-                RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_6);
-
-                RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_7);
-
-                rtl8168_eri_write(tp, 0xC0, 2, 0x0000, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xB8, 4, 0x00000000, ERIAR_ExGMAC);
-                RTL_W8(tp, 0x1B, RTL_R8(tp, 0x1B) & ~0x07);
-
-                RTL_W8(tp, TDFNR, 0x4);
-
-                /*
-                if (aspm)
-                RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) | BIT_7);
-                */
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_12;
-                rtl8168_eri_write(tp, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
-
-                csi_tmp = rtl8168_eri_read(tp, 0x2FC, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~(BIT_0 | BIT_1 | BIT_2);
-                csi_tmp |= (BIT_0 | BIT_1);
-                rtl8168_eri_write(tp, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC);
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1D0, 1, ERIAR_ExGMAC);
-                csi_tmp |= BIT_1;
-                rtl8168_eri_write(tp, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);
-
-                if (dev->mtu > ETH_DATA_LEN)
-                        RTL_W8(tp, MTPS, 0x27);
-
-                if (tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28) {
-                        rtl8168_oob_mutex_lock(tp);
-                        rtl8168_eri_write(tp, 0x5F0, 2, 0x4F87, ERIAR_ExGMAC);
-                        rtl8168_oob_mutex_unlock(tp);
-                }
-
-                rtl8168_mac_ocp_write(tp, 0xC140, 0xFFFF);
-                rtl8168_mac_ocp_write(tp, 0xC142, 0xFFFF);
-
-                if (tp->mcfg == CFG_METHOD_28) {
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xD3E2);
-                        mac_ocp_data &= 0xF000;
-                        mac_ocp_data |= 0xAFD;
-                        rtl8168_mac_ocp_write(tp, 0xD3E2, mac_ocp_data);
-
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xD3E4);
-                        mac_ocp_data &= 0xFF00;
-                        rtl8168_mac_ocp_write(tp, 0xD3E4, mac_ocp_data);
-
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xE860);
-                        mac_ocp_data |= BIT_7;
-                        rtl8168_mac_ocp_write(tp, 0xE860, mac_ocp_data);
-                }
-        } else if (tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32 ||
-                   tp->mcfg == CFG_METHOD_33 || tp->mcfg == CFG_METHOD_34) {
-                set_offset70F(tp, 0x27);
-                set_offset79(tp, 0x50);
-
-                rtl8168_eri_write(tp, 0xC8, 4, 0x00080002, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xCC, 1, 0x2F, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xD0, 1, 0x5F, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xE8, 4, 0x00100006, ERIAR_ExGMAC);
-
-                RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | BIT_7);
-
-                csi_tmp = rtl8168_eri_read(tp, 0xDC, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-                csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
-
-                if (tp->RequireAdjustUpsTxLinkPulseTiming) {
-                        mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xD412);
-                        mac_ocp_data &= ~(0x0FFF);
-                        mac_ocp_data |= tp->SwrCnt1msIni;
-                        rtl8168_mac_ocp_write(tp, 0xD412, mac_ocp_data);
-                }
-
-                mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xE056);
-                mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4);
-                if (tp->HwPkgDet == 0x0F)
-                        mac_ocp_data |= (BIT_6 | BIT_5 | BIT_4);
-                rtl8168_mac_ocp_write(tp, 0xE056, mac_ocp_data);
-                if (tp->HwPkgDet == 0x0F)
-                        rtl8168_mac_ocp_write(tp, 0xEA80, 0x0003);
-                else
-                        rtl8168_mac_ocp_write(tp, 0xEA80, 0x0000);
-
-                rtl8168_oob_mutex_lock(tp);
-                mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xE052);
-                mac_ocp_data &= ~(BIT_3 | BIT_0);
-                if (tp->HwPkgDet == 0x0F)
-                        mac_ocp_data |= BIT_0;
-                rtl8168_mac_ocp_write(tp, 0xE052, mac_ocp_data);
-                rtl8168_oob_mutex_unlock(tp);
-
-                mac_ocp_data = rtl8168_mac_ocp_read(tp, 0xD420);
-                mac_ocp_data &= ~(BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0);
-                mac_ocp_data |= 0x45F;
-                rtl8168_mac_ocp_write(tp, 0xD420, mac_ocp_data);
-
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                RTL_W8(tp, 0x1B, RTL_R8(tp, 0x1B) & ~0x07);
-
-                RTL_W8(tp, TDFNR, 0x4);
-
-                RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~PMSTS_En);
-
-                /*
-                if (aspm)
-                RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) | BIT_7);
-                */
-
-                if (dev->mtu > ETH_DATA_LEN)
-                        RTL_W8(tp, MTPS, 0x27);
-
-                if (FALSE == HW_SUPP_SERDES_PHY(tp)) {
-                        RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_6);
-                        RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_6);
-                        RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_7);
-                } else {
-                        RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) & ~BIT_6);
-                        RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_6);
-                        RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) & ~BIT_7);
-                }
-
-                rtl8168_eri_write(tp, 0xC0, 2, 0x0000, ERIAR_ExGMAC);
-                rtl8168_eri_write(tp, 0xB8, 4, 0x00000000, ERIAR_ExGMAC);
-
-                rtl8168_oob_mutex_lock(tp);
-                if (tp->HwPkgDet == 0x0F)
-                        rtl8168_eri_write(tp, 0x5F0, 2, 0x4F00, ERIAR_ExGMAC);
-                else
-                        rtl8168_eri_write(tp, 0x5F0, 2, 0x4000, ERIAR_ExGMAC);
-                rtl8168_oob_mutex_unlock(tp);
-
-                if (tp->mcfg == CFG_METHOD_32 || tp->mcfg == CFG_METHOD_33 ||
-                    tp->mcfg == CFG_METHOD_34) {
-                        csi_tmp = rtl8168_eri_read(tp, 0xD4, 4, ERIAR_ExGMAC);
-                        csi_tmp |= BIT_4;
-                        rtl8168_eri_write(tp, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
-                }
-
-                rtl8168_mac_ocp_write(tp, 0xC140, 0xFFFF);
-                rtl8168_mac_ocp_write(tp, 0xC142, 0xFFFF);
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1B0, 4, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_12;
-                rtl8168_eri_write(tp, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
-
-                csi_tmp = rtl8168_eri_read(tp, 0x2FC, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~(BIT_0 | BIT_1);
-                csi_tmp |= BIT_0;
-                rtl8168_eri_write(tp, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC);
-
-                csi_tmp = rtl8168_eri_read(tp, 0x1D0, 1, ERIAR_ExGMAC);
-                csi_tmp &= ~BIT_1;
-                rtl8168_eri_write(tp, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);
-        } else if (tp->mcfg == CFG_METHOD_1) {
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        pci_read_config_byte(pdev, 0x69, &device_control);
-                        device_control &= ~0x70;
-                        device_control |= 0x28;
-                        pci_write_config_byte(pdev, 0x69, device_control);
-                } else {
-                        pci_read_config_byte(pdev, 0x69, &device_control);
-                        device_control &= ~0x70;
-                        device_control |= 0x58;
-                        pci_write_config_byte(pdev, 0x69, device_control);
-                }
-        } else if (tp->mcfg == CFG_METHOD_2) {
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        pci_read_config_byte(pdev, 0x69, &device_control);
-                        device_control &= ~0x70;
-                        device_control |= 0x28;
-                        pci_write_config_byte(pdev, 0x69, device_control);
-
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) | (1 << 0));
-                } else {
-                        pci_read_config_byte(pdev, 0x69, &device_control);
-                        device_control &= ~0x70;
-                        device_control |= 0x58;
-                        pci_write_config_byte(pdev, 0x69, device_control);
-
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~(1 << 0));
-                }
-        } else if (tp->mcfg == CFG_METHOD_3) {
-                RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
-
-                if (dev->mtu > ETH_DATA_LEN) {
-                        pci_read_config_byte(pdev, 0x69, &device_control);
-                        device_control &= ~0x70;
-                        device_control |= 0x28;
-                        pci_write_config_byte(pdev, 0x69, device_control);
-
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) | (1 << 0));
-                } else {
-                        pci_read_config_byte(pdev, 0x69, &device_control);
-                        device_control &= ~0x70;
-                        device_control |= 0x58;
-                        pci_write_config_byte(pdev, 0x69, device_control);
-
-                        RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~(1 << 0));
-                }
-        }
-
-        if ((tp->mcfg == CFG_METHOD_1) || (tp->mcfg == CFG_METHOD_2) || (tp->mcfg == CFG_METHOD_3)) {
-                /* csum offload command for RTL8168B/8111B */
-                tp->tx_tcp_csum_cmd = TxTCPCS;
-                tp->tx_udp_csum_cmd = TxUDPCS;
-                tp->tx_ip_csum_cmd = TxIPCS;
-                tp->tx_ipv6_csum_cmd = 0;
-        } else {
-                /* csum offload command for RTL8168C/8111C and RTL8168CP/8111CP */
-                tp->tx_tcp_csum_cmd = TxTCPCS_C;
-                tp->tx_udp_csum_cmd = TxUDPCS_C;
-                tp->tx_ip_csum_cmd = TxIPCS_C;
-                tp->tx_ipv6_csum_cmd = TxIPV6F_C;
-        }
-
-
-        //other hw parameters
-        if (tp->mcfg == CFG_METHOD_21 || tp->mcfg == CFG_METHOD_22 ||
-            tp->mcfg == CFG_METHOD_23 || tp->mcfg == CFG_METHOD_24 ||
-            tp->mcfg == CFG_METHOD_25 || tp->mcfg == CFG_METHOD_26 ||
-            tp->mcfg == CFG_METHOD_27 || tp->mcfg == CFG_METHOD_28)
-                rtl8168_eri_write(tp, 0x2F8, 2, 0x1D8F, ERIAR_ExGMAC);
-
-        if (tp->bios_setting & BIT_28) {
-                if (tp->mcfg == CFG_METHOD_18 || tp->mcfg == CFG_METHOD_19 ||
-                    tp->mcfg == CFG_METHOD_20) {
-                        u32 gphy_val;
-
-                        rtl8168_mdio_write(tp, 0x1F, 0x0007);
-                        rtl8168_mdio_write(tp, 0x1E, 0x002C);
-                        gphy_val = rtl8168_mdio_read(tp, 0x16);
-                        gphy_val |= BIT_10;
-                        rtl8168_mdio_write(tp, 0x16, gphy_val);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0005);
-                        rtl8168_mdio_write(tp, 0x05, 0x8B80);
-                        gphy_val = rtl8168_mdio_read(tp, 0x06);
-                        gphy_val |= BIT_7;
-                        rtl8168_mdio_write(tp, 0x06, gphy_val);
-                        rtl8168_mdio_write(tp, 0x1F, 0x0000);
-                }
-        }
-
-        rtl8168_hw_clear_timer_int(dev);
-
-        rtl8168_enable_exit_l1_mask(tp);
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_25:
-                rtl8168_mac_ocp_write(tp, 0xD3C0, 0x0B00);
-                rtl8168_mac_ocp_write(tp, 0xD3C2, 0x0000);
-                break;
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_35:
-                rtl8168_mac_ocp_write(tp, 0xE098, 0x0AA2);
-                break;
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-                rtl8168_mac_ocp_write(tp, 0xE098, 0xC302);
-                break;
-        }
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                if (aspm) {
-                        rtl8168_init_pci_offset_99(tp);
-                }
-                break;
-        }
-        switch (tp->mcfg) {
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35:
-                if (aspm) {
-                        rtl8168_init_pci_offset_180(tp);
-                }
-                break;
-        }
-
-        tp->cp_cmd &= ~(EnableBist | Macdbgo_oe | Force_halfdup |
-                        Force_rxflow_en | Force_txflow_en | Cxpl_dbg_sel |
-                        ASF | Macdbgo_sel);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0)
-        RTL_W16(tp, CPlusCmd, tp->cp_cmd);
-#else
-        rtl8168_hw_set_features(dev, dev->features);
-#endif
-
-        switch (tp->mcfg) {
-        case CFG_METHOD_16:
-        case CFG_METHOD_17:
-        case CFG_METHOD_18:
-        case CFG_METHOD_19:
-        case CFG_METHOD_20:
-        case CFG_METHOD_21:
-        case CFG_METHOD_22:
-        case CFG_METHOD_23:
-        case CFG_METHOD_24:
-        case CFG_METHOD_25:
-        case CFG_METHOD_26:
-        case CFG_METHOD_27:
-        case CFG_METHOD_28:
-        case CFG_METHOD_29:
-        case CFG_METHOD_30:
-        case CFG_METHOD_31:
-        case CFG_METHOD_32:
-        case CFG_METHOD_33:
-        case CFG_METHOD_34:
-        case CFG_METHOD_35: {
-                int timeout;
-                for (timeout = 0; timeout < 10; timeout++) {
-                        if ((rtl8168_eri_read(tp, 0x1AE, 2, ERIAR_ExGMAC) & BIT_13)==0)
-                                break;
-                        mdelay(1);
-                }
-        }
-        break;
-        }
-
-        RTL_W16(tp, RxMaxSize, tp->rx_buf_sz);
-
-        rtl8168_disable_rxdvgate(dev);
-
-        if (tp->mcfg == CFG_METHOD_11 || tp->mcfg == CFG_METHOD_12)
-                rtl8168_mac_loopback_test(tp);
-
-        if (!tp->pci_cfg_is_read) {
-                pci_read_config_byte(pdev, PCI_COMMAND, &tp->pci_cfg_space.cmd);
-                pci_read_config_word(pdev, PCI_BASE_ADDRESS_0, &tp->pci_cfg_space.io_base_l);
-                pci_read_config_word(pdev, PCI_BASE_ADDRESS_0 + 2, &tp->pci_cfg_space.io_base_h);
-                pci_read_config_word(pdev, PCI_BASE_ADDRESS_2, &tp->pci_cfg_space.mem_base_l);
-                pci_read_config_word(pdev, PCI_BASE_ADDRESS_2 + 2, &tp->pci_cfg_space.mem_base_h);
-                pci_read_config_word(pdev, PCI_BASE_ADDRESS_3, &tp->pci_cfg_space.resv_0x1c_l);
-                pci_read_config_word(pdev, PCI_BASE_ADDRESS_3 + 2, &tp->pci_cfg_space.resv_0x1c_h);
-                pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &tp->pci_cfg_space.ilr);
-                pci_read_config_word(pdev, PCI_BASE_ADDRESS_4, &tp->pci_cfg_space.resv_0x20_l);
-                pci_read_config_word(pdev, PCI_BASE_ADDRESS_4 + 2, &tp->pci_cfg_space.resv_0x20_h);
-                pci_read_config_word(pdev, PCI_BASE_ADDRESS_5, &tp->pci_cfg_space.resv_0x24_l);
-                pci_read_config_word(pdev, PCI_BASE_ADDRESS_5 + 2, &tp->pci_cfg_space.resv_0x24_h);
-                pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &tp->pci_cfg_space.resv_0x2c_l);
-                pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID + 2, &tp->pci_cfg_space.resv_0x2c_h);
-                if (tp->HwPcieSNOffset > 0) {
-                        tp->pci_cfg_space.pci_sn_l = rtl8168_csi_read(tp, tp->HwPcieSNOffset);
-                        tp->pci_cfg_space.pci_sn_h = rtl8168_csi_read(tp, tp->HwPcieSNOffset + 4);
-                }
-
-                tp->pci_cfg_is_read = 1;
-        }
-
-        rtl8168_dsm(dev, DSM_MAC_INIT);
-
-        /* Set Rx packet filter */
-        rtl8168_hw_set_rx_packet_filter(dev);
-
-#ifdef ENABLE_DASH_SUPPORT
-        if (tp->DASH && !tp->dash_printer_enabled)
-                NICChkTypeEnableDashInterrupt(tp);
-#endif
-
-        if (tp->HwSuppAspmClkIntrLock)
-                rtl8168_hw_aspm_clkreq_enable(tp, true);
-
-        rtl8168_disable_cfg9346_write(tp);
-
-        udelay(10);
-}
-
-static void
-rtl8168_hw_start(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb);
-
-        rtl8168_enable_hw_interrupt(tp);
-}
-
-static int
-rtl8168_change_mtu(struct net_device *dev,
-                   int new_mtu)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int ret = 0;
-        unsigned long flags;
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)
-        if (new_mtu < ETH_MIN_MTU)
-                return -EINVAL;
-        else if (new_mtu > tp->max_jumbo_frame_size)
-                new_mtu = tp->max_jumbo_frame_size;
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)
-
-        spin_lock_irqsave(&tp->lock, flags);
-        dev->mtu = new_mtu;
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        if (!netif_running(dev))
-                goto out;
-
-        rtl8168_down(dev);
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        rtl8168_set_rxbufsize(tp, dev);
-
-        ret = rtl8168_init_ring(dev);
-
-        if (ret < 0) {
-                spin_unlock_irqrestore(&tp->lock, flags);
-                goto err_out;
-        }
-
-#ifdef CONFIG_R8168_NAPI
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-        RTL_NAPI_ENABLE(dev, &tp->napi);
-#endif
-#endif//CONFIG_R8168_NAPI
-
-        netif_stop_queue(dev);
-        netif_carrier_off(dev);
-        rtl8168_hw_config(dev);
-
-        rtl8168_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        mod_timer(&tp->esd_timer, jiffies + RTL8168_ESD_TIMEOUT);
-        mod_timer(&tp->link_timer, jiffies + RTL8168_LINK_TIMEOUT);
-out:
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
-        netdev_update_features(dev);
-#endif
-
-err_out:
-        return ret;
-}
-
-static inline void
-rtl8168_make_unusable_by_asic(struct RxDesc *desc)
-{
-        desc->addr = 0x0badbadbadbadbadull;
-        desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
-}
-
-static void
-rtl8168_free_rx_skb(struct rtl8168_private *tp,
-                    struct sk_buff **sk_buff,
-                    struct RxDesc *desc)
-{
-        struct pci_dev *pdev = tp->pci_dev;
-
-        dma_unmap_single(&pdev->dev, le64_to_cpu(desc->addr), tp->rx_buf_sz,
-                         DMA_FROM_DEVICE);
-        dev_kfree_skb(*sk_buff);
-        *sk_buff = NULL;
-        rtl8168_make_unusable_by_asic(desc);
-}
-
-static inline void
-rtl8168_mark_to_asic(struct RxDesc *desc,
-                     u32 rx_buf_sz)
-{
-        u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
-
-        desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
-}
-
-static inline void
-rtl8168_map_to_asic(struct RxDesc *desc,
-                    dma_addr_t mapping,
-                    u32 rx_buf_sz)
-{
-        desc->addr = cpu_to_le64(mapping);
-        wmb();
-        rtl8168_mark_to_asic(desc, rx_buf_sz);
-}
-
-static int
-rtl8168_alloc_rx_skb(struct rtl8168_private *tp,
-                     struct sk_buff **sk_buff,
-                     struct RxDesc *desc,
-                     int rx_buf_sz,
-                     u8 in_intr)
-{
-        struct sk_buff *skb;
-        dma_addr_t mapping;
-        int ret = 0;
-
-        if (in_intr)
-                skb = RTL_ALLOC_SKB_INTR(tp, rx_buf_sz + RTK_RX_ALIGN);
-        else
-                skb = dev_alloc_skb(rx_buf_sz + RTK_RX_ALIGN);
-
-        if (unlikely(!skb))
-                goto err_out;
-
-        skb_reserve(skb, RTK_RX_ALIGN);
-
-        mapping = dma_map_single(tp_to_dev(tp), skb->data, rx_buf_sz,
-                                 DMA_FROM_DEVICE);
-        if (unlikely(dma_mapping_error(tp_to_dev(tp), mapping))) {
-                if (unlikely(net_ratelimit()))
-                        netif_err(tp, drv, tp->dev, "Failed to map RX DMA!\n");
-                goto err_out;
-        }
-
-        *sk_buff = skb;
-        rtl8168_map_to_asic(desc, mapping, rx_buf_sz);
-out:
-        return ret;
-
-err_out:
-        if (skb)
-                dev_kfree_skb(skb);
-        ret = -ENOMEM;
-        rtl8168_make_unusable_by_asic(desc);
-        goto out;
-}
-
-static void
-rtl8168_rx_clear(struct rtl8168_private *tp)
-{
-        int i;
-
-        for (i = 0; i < tp->num_rx_desc; i++) {
-                if (tp->Rx_skbuff[i])
-                        rtl8168_free_rx_skb(tp, tp->Rx_skbuff + i,
-                                            tp->RxDescArray + i);
-        }
-}
-
-static u32
-rtl8168_rx_fill(struct rtl8168_private *tp,
-                struct net_device *dev,
-                u32 start,
-                u32 end,
-                u8 in_intr)
-{
-        u32 cur;
-
-        for (cur = start; end - cur > 0; cur++) {
-                int ret, i = cur % tp->num_rx_desc;
-
-                if (tp->Rx_skbuff[i])
-                        continue;
-
-                ret = rtl8168_alloc_rx_skb(tp, tp->Rx_skbuff + i,
-                                           tp->RxDescArray + i,
-                                           tp->rx_buf_sz,
-                                           in_intr);
-                if (ret < 0)
-                        break;
-        }
-        return cur - start;
-}
-
-static inline void
-rtl8168_mark_as_last_descriptor(struct RxDesc *desc)
-{
-        desc->opts1 |= cpu_to_le32(RingEnd);
-}
-
-static void
-rtl8168_desc_addr_fill(struct rtl8168_private *tp)
-{
-        if (!tp->TxPhyAddr || !tp->RxPhyAddr)
-                return;
-
-        RTL_W32(tp, TxDescStartAddrLow, ((u64) tp->TxPhyAddr & DMA_BIT_MASK(32)));
-        RTL_W32(tp, TxDescStartAddrHigh, ((u64) tp->TxPhyAddr >> 32));
-        RTL_W32(tp, RxDescAddrLow, ((u64) tp->RxPhyAddr & DMA_BIT_MASK(32)));
-        RTL_W32(tp, RxDescAddrHigh, ((u64) tp->RxPhyAddr >> 32));
-}
-
-static void
-rtl8168_tx_desc_init(struct rtl8168_private *tp)
-{
-        int i = 0;
-
-        memset(tp->TxDescArray, 0x0, tp->num_tx_desc * sizeof(struct TxDesc));
-
-        for (i = 0; i < tp->num_tx_desc; i++) {
-                if (i == (tp->num_tx_desc - 1))
-                        tp->TxDescArray[i].opts1 = cpu_to_le32(RingEnd);
-        }
-}
-
-static void
-rtl8168_rx_desc_offset0_init(struct rtl8168_private *tp, int own)
-{
-        int i = 0;
-        int ownbit = 0;
-
-        if (tp->RxDescArray == NULL) return;
-
-        if (own)
-                ownbit = DescOwn;
-
-        for (i = 0; i < tp->num_rx_desc; i++) {
-                if (i == (tp->num_rx_desc - 1))
-                        tp->RxDescArray[i].opts1 = cpu_to_le32((ownbit | RingEnd) | (unsigned long)tp->rx_buf_sz);
-                else
-                        tp->RxDescArray[i].opts1 = cpu_to_le32(ownbit | (unsigned long)tp->rx_buf_sz);
-        }
-}
-
-static void
-rtl8168_rx_desc_init(struct rtl8168_private *tp)
-{
-        memset(tp->RxDescArray, 0x0, tp->num_rx_desc * sizeof(struct RxDesc));
-}
-
-static int
-rtl8168_init_ring(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        rtl8168_init_ring_indexes(tp);
-
-        memset(tp->tx_skb, 0x0, sizeof(tp->tx_skb));
-        memset(tp->Rx_skbuff, 0x0, sizeof(tp->Rx_skbuff));
-
-        rtl8168_tx_desc_init(tp);
-        rtl8168_rx_desc_init(tp);
-
-        if (rtl8168_rx_fill(tp, dev, 0, tp->num_rx_desc, 0) != tp->num_rx_desc)
-                goto err_out;
-
-        rtl8168_mark_as_last_descriptor(tp->RxDescArray + tp->num_rx_desc - 1);
-
-        return 0;
-
-err_out:
-        rtl8168_rx_clear(tp);
-        return -ENOMEM;
-}
-
-static void
-rtl8168_unmap_tx_skb(struct pci_dev *pdev,
-                     struct ring_info *tx_skb,
-                     struct TxDesc *desc)
-{
-        unsigned int len = tx_skb->len;
-
-        dma_unmap_single(&pdev->dev, le64_to_cpu(desc->addr), len, DMA_TO_DEVICE);
-
-        desc->opts1 = cpu_to_le32(RTK_MAGIC_DEBUG_VALUE);
-        desc->opts2 = 0x00;
-        desc->addr = 0x00;
-        tx_skb->len = 0;
-}
-
-static void rtl8168_tx_clear_range(struct rtl8168_private *tp, u32 start,
-                                   unsigned int n)
-{
-        unsigned int i;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
-        struct net_device *dev = tp->dev;
-#endif
-
-        for (i = 0; i < n; i++) {
-                unsigned int entry = (start + i) % tp->num_tx_desc;
-                struct ring_info *tx_skb = tp->tx_skb + entry;
-                unsigned int len = tx_skb->len;
-
-                if (len) {
-                        struct sk_buff *skb = tx_skb->skb;
-
-                        rtl8168_unmap_tx_skb(tp->pci_dev, tx_skb,
-                                             tp->TxDescArray + entry);
-                        if (skb) {
-                                RTLDEV->stats.tx_dropped++;
-                                dev_kfree_skb_any(skb);
-                                tx_skb->skb = NULL;
-                        }
-                }
-        }
-}
-
-static void
-rtl8168_tx_clear(struct rtl8168_private *tp)
-{
-        rtl8168_tx_clear_range(tp, tp->dirty_tx, tp->num_tx_desc);
-        tp->cur_tx = tp->dirty_tx = 0;
-}
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-static void rtl8168_schedule_work(struct net_device *dev, void (*task)(void *))
-{
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        INIT_WORK(&tp->task, task, dev);
-        schedule_delayed_work(&tp->task, 4);
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-}
-
-#define rtl8168_cancel_schedule_work(a)
-
-#else
-static void rtl8168_schedule_work(struct net_device *dev, work_func_t task)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        INIT_DELAYED_WORK(&tp->task, task);
-        schedule_delayed_work(&tp->task, 4);
-}
-
-static void rtl8168_cancel_schedule_work(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct work_struct *work = &tp->task.work;
-
-        if (!work->func) return;
-
-        cancel_delayed_work_sync(&tp->task);
-}
-#endif
-
-#if 0
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-static void rtl8168_reinit_task(void *_data)
-#else
-static void rtl8168_reinit_task(struct work_struct *work)
-#endif
-{
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-        struct net_device *dev = _data;
-#else
-        struct rtl8168_private *tp =
-                container_of(work, struct rtl8168_private, task.work);
-        struct net_device *dev = tp->dev;
-#endif
-        int ret;
-
-        if (netif_running(dev)) {
-                rtl8168_wait_for_quiescence(dev);
-                rtl8168_close(dev);
-        }
-
-        ret = rtl8168_open(dev);
-        if (unlikely(ret < 0)) {
-                if (unlikely(net_ratelimit())) {
-                        struct rtl8168_private *tp = netdev_priv(dev);
-
-                        if (netif_msg_drv(tp)) {
-                                printk(PFX KERN_ERR
-                                       "%s: reinit failure (status = %d)."
-                                       " Rescheduling.\n", dev->name, ret);
-                        }
-                }
-                rtl8168_schedule_work(dev, rtl8168_reinit_task);
-        }
-}
-#endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-static void rtl8168_reset_task(void *_data)
-{
-        struct net_device *dev = _data;
-        struct rtl8168_private *tp = netdev_priv(dev);
-#else
-static void rtl8168_reset_task(struct work_struct *work)
-{
-        struct rtl8168_private *tp =
-                container_of(work, struct rtl8168_private, task.work);
-        struct net_device *dev = tp->dev;
-#endif
-        u32 budget = ~(u32)0;
-        unsigned long flags;
-
-        if (!netif_running(dev))
-                return;
-
-        rtl8168_wait_for_quiescence(dev);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-        rtl8168_rx_interrupt(dev, tp, &budget);
-#else
-        rtl8168_rx_interrupt(dev, tp, budget);
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        rtl8168_tx_clear(tp);
-
-        if (tp->dirty_rx == tp->cur_rx) {
-                rtl8168_rx_clear(tp);
-                rtl8168_init_ring(dev);
-                rtl8168_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising);
-                spin_unlock_irqrestore(&tp->lock, flags);
-        } else {
-                spin_unlock_irqrestore(&tp->lock, flags);
-                if (unlikely(net_ratelimit())) {
-                        struct rtl8168_private *tp = netdev_priv(dev);
-
-                        if (netif_msg_intr(tp)) {
-                                printk(PFX KERN_EMERG
-                                       "%s: Rx buffers shortage\n", dev->name);
-                        }
-                }
-                rtl8168_schedule_work(dev, rtl8168_reset_task);
-        }
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0)
-static void
-rtl8168_tx_timeout(struct net_device *dev, unsigned int txqueue)
-#else
-static void
-rtl8168_tx_timeout(struct net_device *dev)
-#endif
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        spin_lock_irqsave(&tp->lock, flags);
-        netif_stop_queue(dev);
-        netif_carrier_off(dev);
-        rtl8168_hw_reset(dev);
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        /* Let's wait a bit while any (async) irq lands on */
-        rtl8168_schedule_work(dev, rtl8168_reset_task);
-}
-
-static u32
-rtl8168_get_txd_opts1(struct rtl8168_private *tp,
-                      u32 opts1,
-                      u32 len,
-                      unsigned int entry)
-{
-        u32 status = opts1 | len;
-
-        if (entry == tp->num_tx_desc - 1)
-                status |= RingEnd;
-
-        return status;
-}
-
-static int
-rtl8168_xmit_frags(struct rtl8168_private *tp,
-                   struct sk_buff *skb,
-                   const u32 *opts)
-{
-        struct skb_shared_info *info = skb_shinfo(skb);
-        unsigned int cur_frag, entry;
-        struct TxDesc *txd = NULL;
-        const unsigned char nr_frags = info->nr_frags;
-
-        entry = tp->cur_tx;
-        for (cur_frag = 0; cur_frag < nr_frags; cur_frag++) {
-                skb_frag_t *frag = info->frags + cur_frag;
-                dma_addr_t mapping;
-                u32 status, len;
-                void *addr;
-
-                entry = (entry + 1) % tp->num_tx_desc;
-
-                txd = tp->TxDescArray + entry;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)
-                len = frag->size;
-                addr = ((void *) page_address(frag->page)) + frag->page_offset;
-#else
-                len = skb_frag_size(frag);
-                addr = skb_frag_address(frag);
-#endif
-                mapping = dma_map_single(tp_to_dev(tp), addr, len, DMA_TO_DEVICE);
-
-                if (unlikely(dma_mapping_error(tp_to_dev(tp), mapping))) {
-                        if (unlikely(net_ratelimit()))
-                                netif_err(tp, drv, tp->dev,
-                                          "Failed to map TX fragments DMA!\n");
-                        goto err_out;
-                }
-
-                /* anti gcc 2.95.3 bugware (sic) */
-                status = rtl8168_get_txd_opts1(tp, opts[0], len, entry);
-                if (cur_frag == (nr_frags - 1)) {
-                        tp->tx_skb[entry].skb = skb;
-                        status |= LastFrag;
-                }
-
-                txd->addr = cpu_to_le64(mapping);
-
-                tp->tx_skb[entry].len = len;
-
-                txd->opts2 = cpu_to_le32(opts[1]);
-                wmb();
-                txd->opts1 = cpu_to_le32(status);
-        }
-
-        return cur_frag;
-
-err_out:
-        rtl8168_tx_clear_range(tp, tp->cur_tx + 1, cur_frag);
-        return -EIO;
-}
-
-static inline
-__be16 get_protocol(struct sk_buff *skb)
-{
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)
-        return vlan_get_protocol(skb);
-#else
-        __be16 protocol;
-
-        if (skb->protocol == htons(ETH_P_8021Q))
-                protocol = vlan_eth_hdr(skb)->h_vlan_encapsulated_proto;
-        else
-                protocol = skb->protocol;
-
-        return protocol;
-#endif
-}
-
-static bool rtl8168_skb_pad(struct sk_buff *skb)
-{
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
-        if (skb_padto(skb, ETH_ZLEN))
-                return false;
-        skb_put(skb, ETH_ZLEN - skb->len);
-        return true;
-#else
-        return !eth_skb_pad(skb);
-#endif
-}
-
-static inline bool
-rtl8168_tx_csum(struct sk_buff *skb,
-                struct net_device *dev,
-                u32 *opts)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        u32 csum_cmd = 0;
-        u8 sw_calc_csum = FALSE;
-
-        if (skb->ip_summed == CHECKSUM_PARTIAL) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-                const struct iphdr *ip = skb->nh.iph;
-
-                if (dev->features & NETIF_F_IP_CSUM) {
-                        if (ip->protocol == IPPROTO_TCP)
-                                csum_cmd = tp->tx_ip_csum_cmd | tp->tx_tcp_csum_cmd;
-                        else if (ip->protocol == IPPROTO_UDP)
-                                csum_cmd = tp->tx_ip_csum_cmd | tp->tx_udp_csum_cmd;
-                        else if (ip->protocol == IPPROTO_IP)
-                                csum_cmd = tp->tx_ip_csum_cmd;
-                }
-#else
-                u8 ip_protocol = IPPROTO_RAW;
-
-                switch (get_protocol(skb)) {
-                case  __constant_htons(ETH_P_IP):
-                        if (dev->features & NETIF_F_IP_CSUM) {
-                                ip_protocol = ip_hdr(skb)->protocol;
-                                csum_cmd = tp->tx_ip_csum_cmd;
-                        }
-                        break;
-                case  __constant_htons(ETH_P_IPV6):
-                        if (dev->features & NETIF_F_IPV6_CSUM) {
-                                u32 transport_offset = (u32)skb_transport_offset(skb);
-                                if (transport_offset > 0 && transport_offset <= TCPHO_MAX) {
-                                        ip_protocol = ipv6_hdr(skb)->nexthdr;
-                                        csum_cmd = tp->tx_ipv6_csum_cmd;
-                                        csum_cmd |= transport_offset << TCPHO_SHIFT;
-                                }
-                        }
-                        break;
-                default:
-                        if (unlikely(net_ratelimit()))
-                                dprintk("checksum_partial proto=%x!\n", skb->protocol);
-                        break;
-                }
-
-                if (ip_protocol == IPPROTO_TCP)
-                        csum_cmd |= tp->tx_tcp_csum_cmd;
-                else if (ip_protocol == IPPROTO_UDP)
-                        csum_cmd |= tp->tx_udp_csum_cmd;
-#endif
-                if (csum_cmd == 0) {
-                        sw_calc_csum = TRUE;
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-                        WARN_ON(1); /* we need a WARN() */
-#endif
-                }
-        }
-
-        if (csum_cmd != 0) {
-                if (tp->ShortPacketSwChecksum && skb->len < ETH_ZLEN) {
-                        sw_calc_csum = TRUE;
-                        if (!rtl8168_skb_pad(skb))
-                                return false;
-                } else {
-                        if ((tp->mcfg == CFG_METHOD_1) || (tp->mcfg == CFG_METHOD_2) || (tp->mcfg == CFG_METHOD_3))
-                                opts[0] |= csum_cmd;
-                        else
-                                opts[1] |= csum_cmd;
-                }
-        }
-
-        if (tp->UseSwPaddingShortPkt && skb->len < ETH_ZLEN)
-                if (!rtl8168_skb_pad(skb))
-                        return false;
-
-        if (sw_calc_csum) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,7)
-                skb_checksum_help(&skb, 0);
-#elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
-                skb_checksum_help(skb, 0);
-#else
-                skb_checksum_help(skb);
-#endif
-        }
-
-        return true;
-}
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
-/* r8169_csum_workaround()
-  * The hw limits the value the transport offset. When the offset is out of the
-  * range, calculate the checksum by sw.
-  */
-static void r8168_csum_workaround(struct rtl8168_private *tp,
-                                  struct sk_buff *skb)
-{
-        if (skb_shinfo(skb)->gso_size) {
-                netdev_features_t features = tp->dev->features;
-                struct sk_buff *segs, *nskb;
-
-                features &= ~(NETIF_F_SG | NETIF_F_IPV6_CSUM | NETIF_F_TSO6);
-                segs = skb_gso_segment(skb, features);
-                if (IS_ERR(segs) || !segs)
-                        goto drop;
-
-                do {
-                        nskb = segs;
-                        segs = segs->next;
-                        nskb->next = NULL;
-                        rtl8168_start_xmit(nskb, tp->dev);
-                } while (segs);
-
-                dev_consume_skb_any(skb);
-        } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
-                if (skb_checksum_help(skb) < 0)
-                        goto drop;
-
-                rtl8168_start_xmit(skb, tp->dev);
-        } else {
-                struct net_device_stats *stats;
-
-drop:
-                stats = &tp->dev->stats;
-                stats->tx_dropped++;
-                dev_kfree_skb_any(skb);
-        }
-}
-
-/* msdn_giant_send_check()
- * According to the document of microsoft, the TCP Pseudo Header excludes the
- * packet length for IPv6 TCP large packets.
- */
-static int msdn_giant_send_check(struct sk_buff *skb)
-{
-        const struct ipv6hdr *ipv6h;
-        struct tcphdr *th;
-        int ret;
-
-        ret = skb_cow_head(skb, 0);
-        if (ret)
-                return ret;
-
-        ipv6h = ipv6_hdr(skb);
-        th = tcp_hdr(skb);
-
-        th->check = 0;
-        th->check = ~tcp_v6_check(0, &ipv6h->saddr, &ipv6h->daddr, 0);
-
-        return ret;
-}
-#endif
-
-static bool rtl8168_tx_slots_avail(struct rtl8168_private *tp,
-                                   unsigned int nr_frags)
-{
-        unsigned int slots_avail = tp->dirty_tx + tp->num_tx_desc - tp->cur_tx;
-
-        /* A skbuff with nr_frags needs nr_frags+1 entries in the tx queue */
-        return slots_avail > nr_frags;
-}
-
-static netdev_tx_t
-rtl8168_start_xmit(struct sk_buff *skb,
-                   struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned int entry;
-        struct TxDesc *txd;
-        dma_addr_t mapping;
-        u32 len;
-        u32 opts[2];
-        netdev_tx_t ret = NETDEV_TX_OK;
-        unsigned long flags, large_send;
-        int frags;
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        if (unlikely(!rtl8168_tx_slots_avail(tp, skb_shinfo(skb)->nr_frags))) {
-                if (netif_msg_drv(tp)) {
-                        printk(KERN_ERR
-                               "%s: BUG! Tx Ring full when queue awake!\n",
-                               dev->name);
-                }
-                goto err_stop;
-        }
-
-        entry = tp->cur_tx % tp->num_tx_desc;
-        txd = tp->TxDescArray + entry;
-
-        if (unlikely(le32_to_cpu(txd->opts1) & DescOwn)) {
-                if (netif_msg_drv(tp)) {
-                        printk(KERN_ERR
-                               "%s: BUG! Tx Desc is own by hardware!\n",
-                               dev->name);
-                }
-                goto err_stop;
-        }
-
-        opts[0] = DescOwn;
-        opts[1] = rtl8168_tx_vlan_tag(tp, skb);
-
-        large_send = 0;
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-        if (dev->features & (NETIF_F_TSO | NETIF_F_TSO6)) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
-                u32 mss = skb_shinfo(skb)->tso_size;
-#else
-                u32 mss = skb_shinfo(skb)->gso_size;
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
-
-                /* TCP Segmentation Offload (or TCP Large Send) */
-                if (mss) {
-                        if ((tp->mcfg == CFG_METHOD_1) ||
-                            (tp->mcfg == CFG_METHOD_2) ||
-                            (tp->mcfg == CFG_METHOD_3)) {
-                                opts[0] |= LargeSend | (min(mss, MSS_MAX) << 16);
-                                large_send = 1;
-                        } else {
-                                u32 transport_offset = (u32)skb_transport_offset(skb);
-                                switch (get_protocol(skb)) {
-                                case __constant_htons(ETH_P_IP):
-                                        if (transport_offset <= GTTCPHO_MAX) {
-                                                opts[0] |= GiantSendv4;
-                                                opts[0] |= transport_offset << GTTCPHO_SHIFT;
-                                                opts[1] |= min(mss, MSS_MAX) << 18;
-                                                large_send = 1;
-                                        }
-                                        break;
-                                case __constant_htons(ETH_P_IPV6):
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
-                                        if (msdn_giant_send_check(skb)) {
-                                                spin_unlock_irqrestore(&tp->lock, flags);
-                                                r8168_csum_workaround(tp, skb);
-                                                goto out;
-                                        }
-#endif
-                                        if (transport_offset <= GTTCPHO_MAX) {
-                                                opts[0] |= GiantSendv6;
-                                                opts[0] |= transport_offset << GTTCPHO_SHIFT;
-                                                opts[1] |= min(mss, MSS_MAX) << 18;
-                                                large_send = 1;
-                                        }
-                                        break;
-                                default:
-                                        if (unlikely(net_ratelimit()))
-                                                dprintk("tso proto=%x!\n", skb->protocol);
-                                        break;
-                                }
-                        }
-
-                        if (large_send == 0)
-                                goto err_dma_0;
-                }
-        }
-#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-
-        if (large_send == 0) {
-                if (unlikely(!rtl8168_tx_csum(skb, dev, opts)))
-                        goto err_dma_0;
-        }
-
-        frags = rtl8168_xmit_frags(tp, skb, opts);
-        if (unlikely(frags < 0))
-                goto err_dma_0;
-        if (frags) {
-                len = skb_headlen(skb);
-                opts[0] |= FirstFrag;
-        } else {
-                len = skb->len;
-
-                tp->tx_skb[entry].skb = skb;
-
-                opts[0] |= FirstFrag | LastFrag;
-        }
-
-        opts[0] = rtl8168_get_txd_opts1(tp, opts[0], len, entry);
-        mapping = dma_map_single(tp_to_dev(tp), skb->data, len, DMA_TO_DEVICE);
-        if (unlikely(dma_mapping_error(tp_to_dev(tp), mapping))) {
-                if (unlikely(net_ratelimit()))
-                        netif_err(tp, drv, dev, "Failed to map TX DMA!\n");
-                goto err_dma_1;
-        }
-        tp->tx_skb[entry].len = len;
-        txd->addr = cpu_to_le64(mapping);
-        txd->opts2 = cpu_to_le32(opts[1]);
-        wmb();
-        txd->opts1 = cpu_to_le32(opts[0]);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0)
-        dev->trans_start = jiffies;
-#else
-        skb_tx_timestamp(skb);
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,5,0)
-
-        tp->cur_tx += frags + 1;
-
-        wmb();
-
-        RTL_W8(tp, TxPoll, NPQ);    /* set polling bit */
-
-        if (!rtl8168_tx_slots_avail(tp, MAX_SKB_FRAGS)) {
-                netif_stop_queue(dev);
-                smp_rmb();
-                if (rtl8168_tx_slots_avail(tp, MAX_SKB_FRAGS))
-                        netif_wake_queue(dev);
-        }
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-out:
-        return ret;
-err_dma_1:
-        tp->tx_skb[entry].skb = NULL;
-        rtl8168_tx_clear_range(tp, tp->cur_tx + 1, frags);
-err_dma_0:
-        RTLDEV->stats.tx_dropped++;
-        spin_unlock_irqrestore(&tp->lock, flags);
-        dev_kfree_skb_any(skb);
-        ret = NETDEV_TX_OK;
-        goto out;
-err_stop:
-        netif_stop_queue(dev);
-        ret = NETDEV_TX_BUSY;
-        RTLDEV->stats.tx_dropped++;
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-        goto out;
-}
-
-static void
-rtl8168_tx_interrupt(struct net_device *dev,
-                     struct rtl8168_private *tp)
-{
-        unsigned int dirty_tx, tx_left;
-
-        assert(dev != NULL);
-        assert(tp != NULL);
-
-        dirty_tx = tp->dirty_tx;
-        smp_rmb();
-        tx_left = tp->cur_tx - dirty_tx;
-        tp->dynamic_aspm_packet_count += tx_left;
-
-        while (tx_left > 0) {
-                unsigned int entry = dirty_tx % tp->num_tx_desc;
-                struct ring_info *tx_skb = tp->tx_skb + entry;
-                u32 len = tx_skb->len;
-                u32 status;
-
-                rmb();
-                status = le32_to_cpu(tp->TxDescArray[entry].opts1);
-                if (status & DescOwn)
-                        break;
-
-                RTLDEV->stats.tx_bytes += len;
-                RTLDEV->stats.tx_packets++;
-
-                rtl8168_unmap_tx_skb(tp->pci_dev,
-                                     tx_skb,
-                                     tp->TxDescArray + entry);
-
-                if (tx_skb->skb!=NULL) {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
-                        dev_consume_skb_any(tx_skb->skb);
-#else
-                        dev_kfree_skb_any(tx_skb->skb);
-#endif
-                        tx_skb->skb = NULL;
-                }
-                dirty_tx++;
-                tx_left--;
-        }
-
-        tp->dynamic_aspm_packet_count -= tx_left;
-
-        if (tp->dirty_tx != dirty_tx) {
-                tp->dirty_tx = dirty_tx;
-                smp_wmb();
-                if (netif_queue_stopped(dev) &&
-                    (rtl8168_tx_slots_avail(tp, MAX_SKB_FRAGS))) {
-                        netif_wake_queue(dev);
-                }
-                smp_rmb();
-                if (tp->cur_tx != dirty_tx)
-                        RTL_W8(tp, TxPoll, NPQ);
-        }
-}
-
-static inline int
-rtl8168_fragmented_frame(u32 status)
-{
-        return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
-}
-
-static inline void
-rtl8168_rx_csum(struct rtl8168_private *tp,
-                struct sk_buff *skb,
-                struct RxDesc *desc)
-{
-        u32 opts1 = le32_to_cpu(desc->opts1);
-        u32 opts2 = le32_to_cpu(desc->opts2);
-
-        if ((tp->mcfg == CFG_METHOD_1) ||
-            (tp->mcfg == CFG_METHOD_2) ||
-            (tp->mcfg == CFG_METHOD_3)) {
-                u32 status = opts1 & RxProtoMask;
-
-                /* rx csum offload for RTL8168B/8111B */
-                if (((status == RxProtoTCP) && !(opts1 & (RxTCPF | RxIPF))) ||
-                    ((status == RxProtoUDP) && !(opts1 & (RxUDPF | RxIPF))))
-                        skb->ip_summed = CHECKSUM_UNNECESSARY;
-                else
-                        skb->ip_summed = CHECKSUM_NONE;
-        } else {
-                /* rx csum offload for RTL8168C/8111C and RTL8168CP/8111CP */
-                if (((opts2 & RxV4F) && !(opts1 & RxIPF)) || (opts2 & RxV6F)) {
-                        if (((opts1 & RxTCPT) && !(opts1 & RxTCPF)) ||
-                            ((opts1 & RxUDPT) && !(opts1 & RxUDPF)))
-                                skb->ip_summed = CHECKSUM_UNNECESSARY;
-                        else
-                                skb->ip_summed = CHECKSUM_NONE;
-                } else
-                        skb->ip_summed = CHECKSUM_NONE;
-        }
-}
-
-static inline int
-rtl8168_try_rx_copy(struct rtl8168_private *tp,
-                    struct sk_buff **sk_buff,
-                    int pkt_size,
-                    struct RxDesc *desc,
-                    int rx_buf_sz)
-{
-        int ret = -1;
-
-        if (pkt_size < rx_copybreak) {
-                struct sk_buff *skb;
-
-                skb = RTL_ALLOC_SKB_INTR(tp, pkt_size + RTK_RX_ALIGN);
-                if (skb) {
-                        u8 *data;
-
-                        data = sk_buff[0]->data;
-                        skb_reserve(skb, RTK_RX_ALIGN);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,37)
-                        prefetch(data - RTK_RX_ALIGN);
-#endif
-                        eth_copy_and_sum(skb, data, pkt_size, 0);
-                        *sk_buff = skb;
-                        rtl8168_mark_to_asic(desc, rx_buf_sz);
-                        ret = 0;
-                }
-        }
-        return ret;
-}
-
-static inline void
-rtl8168_rx_skb(struct rtl8168_private *tp,
-               struct sk_buff *skb)
-{
-#ifdef CONFIG_R8168_NAPI
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29)
-        netif_receive_skb(skb);
-#else
-        napi_gro_receive(&tp->napi, skb);
-#endif
-#else
-        netif_rx(skb);
-#endif
-}
-
-static int
-rtl8168_rx_interrupt(struct net_device *dev,
-                     struct rtl8168_private *tp,
-                     napi_budget budget)
-{
-        unsigned int cur_rx, rx_left;
-        unsigned int delta, count = 0;
-        unsigned int entry;
-        struct RxDesc *desc;
-        u32 status;
-        u32 rx_quota;
-
-        assert(dev != NULL);
-        assert(tp != NULL);
-
-        if (tp->RxDescArray == NULL)
-                goto rx_out;
-
-        rx_quota = RTL_RX_QUOTA(budget);
-        cur_rx = tp->cur_rx;
-        entry = cur_rx % tp->num_rx_desc;
-        desc = tp->RxDescArray + entry;
-        rx_left = tp->num_rx_desc + tp->dirty_rx - cur_rx;
-        rx_left = rtl8168_rx_quota(rx_left, (u32)rx_quota);
-
-        for (; rx_left > 0; rx_left--) {
-                rmb();
-                status = le32_to_cpu(desc->opts1);
-                if (status & DescOwn)
-                        break;
-                if (unlikely(status & RxRES)) {
-                        if (netif_msg_rx_err(tp)) {
-                                printk(KERN_INFO
-                                       "%s: Rx ERROR. status = %08x\n",
-                                       dev->name, status);
-                        }
-
-                        RTLDEV->stats.rx_errors++;
-
-                        if (status & (RxRWT | RxRUNT))
-                                RTLDEV->stats.rx_length_errors++;
-                        if (status & RxCRC)
-                                RTLDEV->stats.rx_crc_errors++;
-                        if (dev->features & NETIF_F_RXALL)
-                                goto process_pkt;
-
-                        rtl8168_mark_to_asic(desc, tp->rx_buf_sz);
-                } else {
-                        struct sk_buff *skb;
-                        int pkt_size;
-
-process_pkt:
-                        if (likely(!(dev->features & NETIF_F_RXFCS)))
-                                pkt_size = (status & 0x00003fff) - 4;
-                        else
-                                pkt_size = status & 0x00003fff;
-
-                        /*
-                         * The driver does not support incoming fragmented
-                         * frames. They are seen as a symptom of over-mtu
-                         * sized frames.
-                         */
-                        if (unlikely(rtl8168_fragmented_frame(status))) {
-                                RTLDEV->stats.rx_dropped++;
-                                RTLDEV->stats.rx_length_errors++;
-                                rtl8168_mark_to_asic(desc, tp->rx_buf_sz);
-                                continue;
-                        }
-
-                        skb = tp->Rx_skbuff[entry];
-
-                        dma_sync_single_for_cpu(tp_to_dev(tp),
-                                                le64_to_cpu(desc->addr), tp->rx_buf_sz,
-                                                DMA_FROM_DEVICE);
-
-                        if (rtl8168_try_rx_copy(tp, &skb, pkt_size,
-                                                desc, tp->rx_buf_sz)) {
-                                tp->Rx_skbuff[entry] = NULL;
-                                dma_unmap_single(tp_to_dev(tp), le64_to_cpu(desc->addr),
-                                                 tp->rx_buf_sz, DMA_FROM_DEVICE);
-                        } else {
-                                dma_sync_single_for_device(tp_to_dev(tp), le64_to_cpu(desc->addr),
-                                                           tp->rx_buf_sz, DMA_FROM_DEVICE);
-                        }
-
-                        if (tp->cp_cmd & RxChkSum)
-                                rtl8168_rx_csum(tp, skb, desc);
-
-                        skb->dev = dev;
-                        skb_put(skb, pkt_size);
-                        skb->protocol = eth_type_trans(skb, dev);
-
-                        if (skb->pkt_type == PACKET_MULTICAST)
-                                RTLDEV->stats.multicast++;
-
-                        if (rtl8168_rx_vlan_skb(tp, desc, skb) < 0)
-                                rtl8168_rx_skb(tp, skb);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
-                        dev->last_rx = jiffies;
-#endif //LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
-                        RTLDEV->stats.rx_bytes += pkt_size;
-                        RTLDEV->stats.rx_packets++;
-                }
-
-                cur_rx++;
-                entry = cur_rx % tp->num_rx_desc;
-                desc = tp->RxDescArray + entry;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,37)
-                prefetch(desc);
-#endif
-        }
-
-        count = cur_rx - tp->cur_rx;
-        tp->cur_rx = cur_rx;
-
-        delta = rtl8168_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx, 1);
-        if (!delta && count && netif_msg_intr(tp))
-                printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
-        tp->dirty_rx += delta;
-
-        tp->dynamic_aspm_packet_count += delta;
-
-        /*
-         * FIXME: until there is periodic timer to try and refill the ring,
-         * a temporary shortage may definitely kill the Rx process.
-         * - disable the asic to try and avoid an overflow and kick it again
-         *   after refill ?
-         * - how do others driver handle this condition (Uh oh...).
-         */
-        if ((tp->dirty_rx + tp->num_rx_desc == tp->cur_rx) && netif_msg_intr(tp))
-                printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name);
-
-rx_out:
-        return count;
-}
-
-/*
- *The interrupt handler does all of the Rx thread work and cleans up after
- *the Tx thread.
- */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-static irqreturn_t rtl8168_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
-#else
-static irqreturn_t rtl8168_interrupt(int irq, void *dev_instance)
-#endif
-{
-        struct net_device *dev = (struct net_device *) dev_instance;
-        struct rtl8168_private *tp = netdev_priv(dev);
-        int status;
-        int handled = 0;
-
-        do {
-                status = RTL_R16(tp, IntrStatus);
-
-                if (!(tp->features & RTL_FEATURE_MSI)) {
-                        /* hotplug/major error/no more work/shared irq */
-                        if ((status == 0xFFFF) || !status)
-                                break;
-
-                        if (!(status & (tp->intr_mask | tp->timer_intr_mask)))
-                                break;
-                }
-
-                handled = 1;
-
-                rtl8168_disable_hw_interrupt(tp);
-
-                switch (tp->mcfg) {
-                case CFG_METHOD_9:
-                case CFG_METHOD_10:
-                case CFG_METHOD_11:
-                case CFG_METHOD_12:
-                case CFG_METHOD_13:
-                case CFG_METHOD_14:
-                case CFG_METHOD_15:
-                case CFG_METHOD_16:
-                case CFG_METHOD_17:
-                case CFG_METHOD_18:
-                case CFG_METHOD_19:
-                case CFG_METHOD_20:
-                case CFG_METHOD_21:
-                case CFG_METHOD_22:
-                case CFG_METHOD_23:
-                case CFG_METHOD_24:
-                case CFG_METHOD_25:
-                case CFG_METHOD_26:
-                case CFG_METHOD_27:
-                case CFG_METHOD_28:
-                case CFG_METHOD_29:
-                case CFG_METHOD_30:
-                case CFG_METHOD_31:
-                case CFG_METHOD_32:
-                case CFG_METHOD_33:
-                case CFG_METHOD_34:
-                case CFG_METHOD_35:
-                        /* RX_OVERFLOW RE-START mechanism now HW handles it automatically*/
-                        RTL_W16(tp, IntrStatus, status&~RxFIFOOver);
-                        break;
-                default:
-                        RTL_W16(tp, IntrStatus, status);
-                        break;
-                }
-
-                //Work around for rx fifo overflow
-                if (unlikely(status & RxFIFOOver)) {
-                        if (tp->mcfg == CFG_METHOD_1) {
-                                netif_stop_queue(dev);
-                                udelay(300);
-                                rtl8168_hw_reset(dev);
-                                rtl8168_tx_clear(tp);
-                                rtl8168_rx_clear(tp);
-                                rtl8168_init_ring(dev);
-                                rtl8168_hw_config(dev);
-                                rtl8168_hw_start(dev);
-                                netif_wake_queue(dev);
-                        }
-                }
-
-#ifdef ENABLE_DASH_SUPPORT
-                if ( tp->DASH ) {
-                        if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) {
-                                u8 DashIntType2Status;
-
-                                if (status & ISRIMR_DASH_INTR_CMAC_RESET)
-                                        tp->CmacResetIntr = TRUE;
-
-                                DashIntType2Status = RTL_CMAC_R8(tp, CMAC_IBISR0);
-                                if (DashIntType2Status & ISRIMR_DASH_TYPE2_ROK) {
-                                        tp->RcvFwDashOkEvt = TRUE;
-                                }
-                                if (DashIntType2Status & ISRIMR_DASH_TYPE2_TOK) {
-                                        tp->SendFwHostOkEvt = TRUE;
-                                }
-                                if (DashIntType2Status & ISRIMR_DASH_TYPE2_RX_DISABLE_IDLE) {
-                                        tp->DashFwDisableRx = TRUE;
-                                }
-
-                                RTL_CMAC_W8(tp, CMAC_IBISR0, DashIntType2Status);
-                        } else {
-                                if (status & ISRIMR_DP_REQSYS_OK) {
-                                        tp->RcvFwReqSysOkEvt = TRUE;
-                                }
-                                if (status & ISRIMR_DP_DASH_OK) {
-                                        tp->RcvFwDashOkEvt = TRUE;
-                                }
-                                if (status & ISRIMR_DP_HOST_OK) {
-                                        tp->SendFwHostOkEvt = TRUE;
-                                }
-                        }
-                }
-#endif
-
-#ifdef CONFIG_R8168_NAPI
-                if (status & tp->intr_mask || tp->keep_intr_cnt-- > 0) {
-                        if (status & tp->intr_mask)
-                                tp->keep_intr_cnt = RTK_KEEP_INTERRUPT_COUNT;
-
-                        if (likely(RTL_NETIF_RX_SCHEDULE_PREP(dev, &tp->napi)))
-                                __RTL_NETIF_RX_SCHEDULE(dev, &tp->napi);
-                        else if (netif_msg_intr(tp))
-                                printk(KERN_INFO "%s: interrupt %04x in poll\n",
-                                       dev->name, status);
-                } else {
-                        tp->keep_intr_cnt = RTK_KEEP_INTERRUPT_COUNT;
-                        rtl8168_switch_to_hw_interrupt(tp);
-                }
-#else
-                if (status & tp->intr_mask || tp->keep_intr_cnt-- > 0) {
-                        u32 budget = ~(u32)0;
-
-                        if (status & tp->intr_mask)
-                                tp->keep_intr_cnt = RTK_KEEP_INTERRUPT_COUNT;
-
-                        rtl8168_tx_interrupt(dev, tp);
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-                        rtl8168_rx_interrupt(dev, tp, &budget);
-#else
-                        rtl8168_rx_interrupt(dev, tp, budget);
-#endif  //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-
-#ifdef ENABLE_DASH_SUPPORT
-                        if ( tp->DASH ) {
-                                struct net_device *dev = tp->dev;
-
-                                HandleDashInterrupt(dev);
-                        }
-#endif
-
-                        rtl8168_switch_to_timer_interrupt(tp);
-                } else {
-                        tp->keep_intr_cnt = RTK_KEEP_INTERRUPT_COUNT;
-                        rtl8168_switch_to_hw_interrupt(tp);
-                }
-#endif
-
-        } while (false);
-
-        return IRQ_RETVAL(handled);
-}
-
-#ifdef CONFIG_R8168_NAPI
-static int rtl8168_poll(napi_ptr napi, napi_budget budget)
-{
-        struct rtl8168_private *tp = RTL_GET_PRIV(napi, struct rtl8168_private);
-        RTL_GET_NETDEV(tp)
-        unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev);
-        unsigned int work_done;
-        unsigned long flags;
-
-        spin_lock_irqsave(&tp->lock, flags);
-        rtl8168_tx_interrupt(dev, tp);
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        work_done = rtl8168_rx_interrupt(dev, tp, budget);
-
-        RTL_NAPI_QUOTA_UPDATE(dev, work_done, budget);
-
-        if (work_done < work_to_do) {
-#ifdef ENABLE_DASH_SUPPORT
-                if ( tp->DASH ) {
-                        struct net_device *dev = tp->dev;
-
-                        spin_lock_irqsave(&tp->lock, flags);
-                        HandleDashInterrupt(dev);
-                        spin_unlock_irqrestore(&tp->lock, flags);
-                }
-#endif
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)
-                if (RTL_NETIF_RX_COMPLETE(dev, napi, work_done) == FALSE) return RTL_NAPI_RETURN_VALUE;
-#else
-                RTL_NETIF_RX_COMPLETE(dev, napi, work_done);
-#endif
-                /*
-                 * 20040426: the barrier is not strictly required but the
-                 * behavior of the irq handler could be less predictable
-                 * without it. Btw, the lack of flush for the posted pci
-                 * write is safe - FR
-                 */
-                smp_wmb();
-
-                rtl8168_switch_to_timer_interrupt(tp);
-        }
-
-        return RTL_NAPI_RETURN_VALUE;
-}
-#endif//CONFIG_R8168_NAPI
-
-static void rtl8168_sleep_rx_enable(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (tp->wol_enabled != WOL_ENABLED) return;
-
-        if ((tp->mcfg == CFG_METHOD_1) || (tp->mcfg == CFG_METHOD_2)) {
-                RTL_W8(tp, ChipCmd, CmdReset);
-                rtl8168_rx_desc_offset0_init(tp, 0);
-                RTL_W8(tp, ChipCmd, CmdRxEnb);
-        } else if (tp->mcfg == CFG_METHOD_14 || tp->mcfg == CFG_METHOD_15) {
-                rtl8168_ephy_write(tp, 0x19, 0xFF64);
-                RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) | AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
-        }
-}
-
-static void rtl8168_down(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-
-        rtl8168_delete_esd_timer(dev, &tp->esd_timer);
-
-        rtl8168_delete_link_timer(dev, &tp->link_timer);
-
-#ifdef CONFIG_R8168_NAPI
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-        RTL_NAPI_DISABLE(dev, &tp->napi);
-#endif
-#endif//CONFIG_R8168_NAPI
-
-        netif_stop_queue(dev);
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11)
-        /* Give a racing hard_start_xmit a few cycles to complete. */
-        synchronize_rcu();  /* FIXME: should this be synchronize_irq()? */
-#endif
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        netif_carrier_off(dev);
-
-        rtl8168_dsm(dev, DSM_IF_DOWN);
-
-        rtl8168_hw_reset(dev);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        synchronize_irq(dev->irq);
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        rtl8168_tx_clear(tp);
-
-        rtl8168_rx_clear(tp);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-}
-
-static int rtl8168_close(struct net_device *dev)
-{
-        struct rtl8168_private *tp = netdev_priv(dev);
-        struct pci_dev *pdev = tp->pci_dev;
-        unsigned long flags;
-
-        if (tp->TxDescArray!=NULL && tp->RxDescArray!=NULL) {
-                rtl8168_cancel_schedule_work(dev);
-
-                rtl8168_down(dev);
-
-                pci_clear_master(tp->pci_dev);
-
-                spin_lock_irqsave(&tp->lock, flags);
-
-                rtl8168_hw_d3_para(dev);
-
-                rtl8168_powerdown_pll(dev);
-
-                rtl8168_sleep_rx_enable(dev);
-
-                spin_unlock_irqrestore(&tp->lock, flags);
-
-                free_irq(dev->irq, dev);
-
-                dma_free_coherent(&pdev->dev,
-                                  (tp->num_rx_desc * sizeof(struct RxDesc)),
-                                  tp->RxDescArray,
-                                  tp->RxPhyAddr);
-                dma_free_coherent(&pdev->dev,
-                                  (tp->num_tx_desc * sizeof(struct TxDesc)),
-                                  tp->TxDescArray,
-                                  tp->TxPhyAddr);
-                tp->TxDescArray = NULL;
-                tp->RxDescArray = NULL;
-        } else {
-                spin_lock_irqsave(&tp->lock, flags);
-
-                rtl8168_hw_d3_para(dev);
-
-                rtl8168_powerdown_pll(dev);
-
-                spin_unlock_irqrestore(&tp->lock, flags);
-        }
-
-        return 0;
-}
-
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11)
-static void rtl8168_shutdown(struct pci_dev *pdev)
-{
-        struct net_device *dev = pci_get_drvdata(pdev);
-        struct rtl8168_private *tp = netdev_priv(dev);
-
-        if (HW_DASH_SUPPORT_DASH(tp))
-                rtl8168_driver_stop(tp);
-
-        rtl8168_set_bios_setting(dev);
-        if (s5_keep_curr_mac == 0 && tp->random_mac == 0)
-                rtl8168_rar_set(tp, tp->org_mac_addr);
-
-#ifdef ENABLE_FIBER_SUPPORT
-        rtl8168_hw_fiber_nic_d3_para(tp);
-#endif  //ENABLE_FIBER_SUPPORT
-
-        if (s5wol == 0)
-                tp->wol_enabled = WOL_DISABLED;
-
-        rtl8168_close(dev);
-        rtl8168_disable_msi(pdev, tp);
-
-        if (system_state == SYSTEM_POWER_OFF) {
-                pci_clear_master(tp->pci_dev);
-                rtl8168_sleep_rx_enable(dev);
-                pci_wake_from_d3(pdev, tp->wol_enabled);
-                pci_set_power_state(pdev, PCI_D3hot);
-        }
-}
-#endif
-
-/**
- *  rtl8168_get_stats - Get rtl8168 read/write statistics
- *  @dev: The Ethernet Device to get statistics for
- *
- *  Get TX/RX statistics for rtl8168
- */
-static struct
-net_device_stats *rtl8168_get_stats(struct net_device *dev)
-{
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22)
-        struct rtl8168_private *tp = netdev_priv(dev);
-#endif
-        if (netif_running(dev)) {
-//      spin_lock_irqsave(&tp->lock, flags);
-//      spin_unlock_irqrestore(&tp->lock, flags);
-        }
-
-        return &RTLDEV->stats;
-}
-
-#ifdef CONFIG_PM
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11)
-static int
-rtl8168_suspend(struct pci_dev *pdev, u32 state)
-#else
-static int
-rtl8168_suspend(struct pci_dev *pdev, pm_message_t state)
-#endif
-{
-        struct net_device *dev = pci_get_drvdata(pdev);
-        struct rtl8168_private *tp = netdev_priv(dev);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
-        u32 pci_pm_state = pci_choose_state(pdev, state);
-#endif
-        unsigned long flags;
-
-        if (!netif_running(dev))
-                goto out;
-
-        rtl8168_cancel_schedule_work(dev);
-
-        rtl8168_delete_esd_timer(dev, &tp->esd_timer);
-
-        rtl8168_delete_link_timer(dev, &tp->link_timer);
-
-        netif_stop_queue(dev);
-
-        netif_carrier_off(dev);
-
-        netif_device_detach(dev);
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        rtl8168_dsm(dev, DSM_NIC_GOTO_D3);
-
-        rtl8168_hw_reset(dev);
-
-        pci_clear_master(pdev);
-
-        rtl8168_hw_d3_para(dev);
-
-#ifdef ENABLE_FIBER_SUPPORT
-        rtl8168_hw_fiber_nic_d3_para(tp);
-#endif  //ENABLE_FIBER_SUPPORT
-
-        rtl8168_powerdown_pll(dev);
-
-        rtl8168_sleep_rx_enable(dev);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-out:
-        if (HW_DASH_SUPPORT_DASH(tp)) {
-                spin_lock_irqsave(&tp->lock, flags);
-                rtl8168_driver_stop(tp);
-                spin_unlock_irqrestore(&tp->lock, flags);
-        }
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
-        pci_save_state(pdev, &pci_pm_state);
-#else
-        pci_save_state(pdev);
-#endif
-        pci_enable_wake(pdev, pci_choose_state(pdev, state), tp->wol_enabled);
-//  pci_set_power_state(pdev, pci_choose_state(pdev, state));
-
-        return 0;
-}
-
-static int
-rtl8168_resume(struct pci_dev *pdev)
-{
-        struct net_device *dev = pci_get_drvdata(pdev);
-        struct rtl8168_private *tp = netdev_priv(dev);
-        unsigned long flags;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
-        u32 pci_pm_state = PCI_D0;
-#endif
-
-        pci_set_power_state(pdev, PCI_D0);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
-        pci_restore_state(pdev, &pci_pm_state);
-#else
-        pci_restore_state(pdev);
-#endif
-        pci_enable_wake(pdev, PCI_D0, 0);
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        /* restore last modified mac address */
-        rtl8168_rar_set(tp, dev->dev_addr);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        if (!netif_running(dev)) {
-                if (HW_DASH_SUPPORT_DASH(tp)) {
-                        spin_lock_irqsave(&tp->lock, flags);
-                        rtl8168_driver_start(tp);
-                        spin_unlock_irqrestore(&tp->lock, flags);
-                }
-                goto out;
-        }
-
-        pci_set_master(pdev);
-
-        spin_lock_irqsave(&tp->lock, flags);
-
-        rtl8168_exit_oob(dev);
-
-        rtl8168_dsm(dev, DSM_NIC_RESUME_D3);
-
-        rtl8168_hw_init(dev);
-
-        rtl8168_powerup_pll(dev);
-
-        rtl8168_hw_ephy_config(dev);
-
-        rtl8168_hw_phy_config(dev);
-
-        rtl8168_hw_config(dev);
-
-        spin_unlock_irqrestore(&tp->lock, flags);
-
-        rtl8168_schedule_work(dev, rtl8168_reset_task);
-
-        netif_device_attach(dev);
-
-        mod_timer(&tp->esd_timer, jiffies + RTL8168_ESD_TIMEOUT);
-        mod_timer(&tp->link_timer, jiffies + RTL8168_LINK_TIMEOUT);
-out:
-        return 0;
-}
-
-#endif /* CONFIG_PM */
-
-static struct pci_driver rtl8168_pci_driver = {
-        .name       = MODULENAME,
-        .id_table   = rtl8168_pci_tbl,
-        .probe      = rtl8168_init_one,
-        .remove     = __devexit_p(rtl8168_remove_one),
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11)
-        .shutdown   = rtl8168_shutdown,
-#endif
-#ifdef CONFIG_PM
-        .suspend    = rtl8168_suspend,
-        .resume     = rtl8168_resume,
-#endif
-};
-
-static int __init
-rtl8168_init_module(void)
-{
-#ifdef ENABLE_R8168_PROCFS
-        rtl8168_proc_module_init();
-#endif
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
-        return pci_register_driver(&rtl8168_pci_driver);
-#else
-        return pci_module_init(&rtl8168_pci_driver);
-#endif
-}
-
-static void __exit
-rtl8168_cleanup_module(void)
-{
-        pci_unregister_driver(&rtl8168_pci_driver);
-#ifdef ENABLE_R8168_PROCFS
-        if (rtl8168_proc) {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
-                remove_proc_subtree(MODULENAME, init_net.proc_net);
-#else
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)
-                remove_proc_entry(MODULENAME, init_net.proc_net);
-#else
-                remove_proc_entry(MODULENAME, proc_net);
-#endif  //LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)
-#endif  //LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
-                rtl8168_proc = NULL;
-        }
-#endif
-}
-
-module_init(rtl8168_init_module);
-module_exit(rtl8168_cleanup_module);
diff --git a/package/kernel/r8168/src/r8168_realwow.h b/package/kernel/r8168/src/r8168_realwow.h
deleted file mode 100644
index 8e80e6411..000000000
--- a/package/kernel/r8168/src/r8168_realwow.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#ifndef _LINUX_R8168_REALWOW_H
-#define _LINUX_R8168_REALWOW_H
-
-#define SIOCDEVPRIVATE_RTLREALWOW   SIOCDEVPRIVATE+3
-
-#define MAX_RealWoW_KCP_SIZE (100)
-#define MAX_RealWoW_Payload (64)
-
-#define KA_TX_PACKET_SIZE (100)
-#define KA_WAKEUP_PATTERN_SIZE (120)
-
-//HwSuppKeepAliveOffloadVer
-#define HW_SUPPORT_KCP_OFFLOAD(_M)        ((_M)->HwSuppKCPOffloadVer > 0)
-
-enum rtl_realwow_cmd {
-
-        RTL_REALWOW_SET_KCP_DISABLE=0,
-        RTL_REALWOW_SET_KCP_INFO,
-        RTL_REALWOW_SET_KCP_CONTENT,
-
-        RTL_REALWOW_SET_KCP_ACKPKTINFO,
-        RTL_REALWOW_SET_KCP_WPINFO,
-        RTL_REALWOW_SET_KCPDHCP_TIMEOUT,
-
-        RTLT_REALWOW_COMMAND_INVALID
-};
-
-struct rtl_realwow_ioctl_struct {
-        __u32	cmd;
-        __u32	offset;
-        __u32	len;
-        union {
-                __u32	data;
-                void *data_buffer;
-        };
-};
-
-typedef struct _MP_KCPInfo {
-        u8 DIPv4[4];
-        u8 MacID[6];
-        u16 UdpPort[2];
-        u8 PKTLEN[2];
-
-        u16 ackLostCnt;
-        u8 KCP_WakePattern[MAX_RealWoW_Payload];
-        u8 KCP_AckPacket[MAX_RealWoW_Payload];
-        u32 KCP_interval;
-        u8 KCP_WakePattern_Len;
-        u8 KCP_AckPacket_Len;
-        u8 KCP_TxPacket[2][KA_TX_PACKET_SIZE];
-} MP_KCP_INFO, *PMP_KCP_INFO;
-
-typedef struct _KCPInfo {
-        u32 nId; // = id
-        u8 DIPv4[4];
-        u8 MacID[6];
-        u16 UdpPort;
-        u16 PKTLEN;
-} KCPInfo, *PKCPInfo;
-
-typedef struct _KCPContent {
-        u32 id; // = id
-        u32 mSec; // = msec
-        u32 size; // =size
-        u8 bPacket[MAX_RealWoW_KCP_SIZE]; // put packet here
-} KCPContent, *PKCPContent;
-
-typedef struct _RealWoWAckPktInfo {
-        u16 ackLostCnt;
-        u16 patterntSize;
-        u8 pattern[MAX_RealWoW_Payload];
-} RealWoWAckPktInfo,*PRealWoWAckPktInfo;
-
-typedef struct _RealWoWWPInfo {
-        u16 patterntSize;
-        u8 pattern[MAX_RealWoW_Payload];
-} RealWoWWPInfo,*PRealWoWWPInfo;
-
-int rtl8168_realwow_ioctl(struct net_device *dev, struct ifreq *ifr);
-void rtl8168_realwow_hw_init(struct net_device *dev);
-void rtl8168_get_realwow_hw_version(struct net_device *dev);
-void rtl8168_set_realwow_d3_para(struct net_device *dev);
-
-#endif /* _LINUX_R8168_REALWOW_H */
diff --git a/package/kernel/r8168/src/rtl_eeprom.c b/package/kernel/r8168/src/rtl_eeprom.c
deleted file mode 100644
index b44544e4f..000000000
--- a/package/kernel/r8168/src/rtl_eeprom.c
+++ /dev/null
@@ -1,289 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/ethtool.h>
-#include <linux/netdevice.h>
-#include <linux/delay.h>
-
-#include <asm/io.h>
-
-#include "r8168.h"
-#include "rtl_eeprom.h"
-
-//-------------------------------------------------------------------
-//rtl8168_eeprom_type():
-//  tell the eeprom type
-//return value:
-//  0: the eeprom type is 93C46
-//  1: the eeprom type is 93C56 or 93C66
-//-------------------------------------------------------------------
-void rtl8168_eeprom_type(struct rtl8168_private *tp)
-{
-        u16 magic = 0;
-
-        if (tp->mcfg == CFG_METHOD_DEFAULT)
-                goto out_no_eeprom;
-
-        if(RTL_R8(tp, 0xD2)&0x04) {
-                //not support
-                //tp->eeprom_type = EEPROM_TWSI;
-                //tp->eeprom_len = 256;
-                goto out_no_eeprom;
-        } else if(RTL_R32(tp, RxConfig) & RxCfg_9356SEL) {
-                tp->eeprom_type = EEPROM_TYPE_93C56;
-                tp->eeprom_len = 256;
-        } else {
-                tp->eeprom_type = EEPROM_TYPE_93C46;
-                tp->eeprom_len = 128;
-        }
-
-        magic = rtl8168_eeprom_read_sc(tp, 0);
-
-out_no_eeprom:
-        if ((magic != 0x8129) && (magic != 0x8128)) {
-                tp->eeprom_type = EEPROM_TYPE_NONE;
-                tp->eeprom_len = 0;
-        }
-}
-
-void rtl8168_eeprom_cleanup(struct rtl8168_private *tp)
-{
-        u8 x;
-
-        x = RTL_R8(tp, Cfg9346);
-        x &= ~(Cfg9346_EEDI | Cfg9346_EECS);
-
-        RTL_W8(tp, Cfg9346, x);
-
-        rtl8168_raise_clock(tp, &x);
-        rtl8168_lower_clock(tp, &x);
-}
-
-int rtl8168_eeprom_cmd_done(struct rtl8168_private *tp)
-{
-        u8 x;
-        int i;
-
-        rtl8168_stand_by(tp);
-
-        for (i = 0; i < 50000; i++) {
-                x = RTL_R8(tp, Cfg9346);
-
-                if (x & Cfg9346_EEDO) {
-                        udelay(RTL_CLOCK_RATE * 2 * 3);
-                        return 0;
-                }
-                udelay(1);
-        }
-
-        return -1;
-}
-
-//-------------------------------------------------------------------
-//rtl8168_eeprom_read_sc():
-//  read one word from eeprom
-//-------------------------------------------------------------------
-u16 rtl8168_eeprom_read_sc(struct rtl8168_private *tp, u16 reg)
-{
-        int addr_sz = 6;
-        u8 x;
-        u16 data;
-
-        if(tp->eeprom_type == EEPROM_TYPE_NONE) {
-                return -1;
-        }
-
-        if (tp->eeprom_type==EEPROM_TYPE_93C46)
-                addr_sz = 6;
-        else if (tp->eeprom_type==EEPROM_TYPE_93C56)
-                addr_sz = 8;
-
-        x = Cfg9346_EEM1 | Cfg9346_EECS;
-        RTL_W8(tp, Cfg9346, x);
-
-        rtl8168_shift_out_bits(tp, RTL_EEPROM_READ_OPCODE, 3);
-        rtl8168_shift_out_bits(tp, reg, addr_sz);
-
-        data = rtl8168_shift_in_bits(tp);
-
-        rtl8168_eeprom_cleanup(tp);
-
-        RTL_W8(tp, Cfg9346, 0);
-
-        return data;
-}
-
-//-------------------------------------------------------------------
-//rtl8168_eeprom_write_sc():
-//  write one word to a specific address in the eeprom
-//-------------------------------------------------------------------
-void rtl8168_eeprom_write_sc(struct rtl8168_private *tp, u16 reg, u16 data)
-{
-        u8 x;
-        int addr_sz = 6;
-        int w_dummy_addr = 4;
-
-        if(tp->eeprom_type == EEPROM_TYPE_NONE) {
-                return ;
-        }
-
-        if (tp->eeprom_type==EEPROM_TYPE_93C46) {
-                addr_sz = 6;
-                w_dummy_addr = 4;
-        } else if (tp->eeprom_type==EEPROM_TYPE_93C56) {
-                addr_sz = 8;
-                w_dummy_addr = 6;
-        }
-
-        x = Cfg9346_EEM1 | Cfg9346_EECS;
-        RTL_W8(tp, Cfg9346, x);
-
-        rtl8168_shift_out_bits(tp, RTL_EEPROM_EWEN_OPCODE, 5);
-        rtl8168_shift_out_bits(tp, reg, w_dummy_addr);
-        rtl8168_stand_by(tp);
-
-        rtl8168_shift_out_bits(tp, RTL_EEPROM_ERASE_OPCODE, 3);
-        rtl8168_shift_out_bits(tp, reg, addr_sz);
-        if (rtl8168_eeprom_cmd_done(tp) < 0) {
-                return;
-        }
-        rtl8168_stand_by(tp);
-
-        rtl8168_shift_out_bits(tp, RTL_EEPROM_WRITE_OPCODE, 3);
-        rtl8168_shift_out_bits(tp, reg, addr_sz);
-        rtl8168_shift_out_bits(tp, data, 16);
-        if (rtl8168_eeprom_cmd_done(tp) < 0) {
-                return;
-        }
-        rtl8168_stand_by(tp);
-
-        rtl8168_shift_out_bits(tp, RTL_EEPROM_EWDS_OPCODE, 5);
-        rtl8168_shift_out_bits(tp, reg, w_dummy_addr);
-
-        rtl8168_eeprom_cleanup(tp);
-        RTL_W8(tp, Cfg9346, 0);
-}
-
-void rtl8168_raise_clock(struct rtl8168_private *tp, u8 *x)
-{
-        *x = *x | Cfg9346_EESK;
-        RTL_W8(tp, Cfg9346, *x);
-        udelay(RTL_CLOCK_RATE);
-}
-
-void rtl8168_lower_clock(struct rtl8168_private *tp, u8 *x)
-{
-
-        *x = *x & ~Cfg9346_EESK;
-        RTL_W8(tp, Cfg9346, *x);
-        udelay(RTL_CLOCK_RATE);
-}
-
-void rtl8168_shift_out_bits(struct rtl8168_private *tp, int data, int count)
-{
-        u8 x;
-        int  mask;
-
-        mask = 0x01 << (count - 1);
-        x = RTL_R8(tp, Cfg9346);
-        x &= ~(Cfg9346_EEDI | Cfg9346_EEDO);
-
-        do {
-                if (data & mask)
-                        x |= Cfg9346_EEDI;
-                else
-                        x &= ~Cfg9346_EEDI;
-
-                RTL_W8(tp, Cfg9346, x);
-                udelay(RTL_CLOCK_RATE);
-                rtl8168_raise_clock(tp, &x);
-                rtl8168_lower_clock(tp, &x);
-                mask = mask >> 1;
-        } while(mask);
-
-        x &= ~Cfg9346_EEDI;
-        RTL_W8(tp, Cfg9346, x);
-}
-
-u16 rtl8168_shift_in_bits(struct rtl8168_private *tp)
-{
-        u8 x;
-        u16 d, i;
-
-        x = RTL_R8(tp, Cfg9346);
-        x &= ~(Cfg9346_EEDI | Cfg9346_EEDO);
-
-        d = 0;
-
-        for (i = 0; i < 16; i++) {
-                d = d << 1;
-                rtl8168_raise_clock(tp, &x);
-
-                x = RTL_R8(tp, Cfg9346);
-                x &= ~Cfg9346_EEDI;
-
-                if (x & Cfg9346_EEDO)
-                        d |= 1;
-
-                rtl8168_lower_clock(tp, &x);
-        }
-
-        return d;
-}
-
-void rtl8168_stand_by(struct rtl8168_private *tp)
-{
-        u8 x;
-
-        x = RTL_R8(tp, Cfg9346);
-        x &= ~(Cfg9346_EECS | Cfg9346_EESK);
-        RTL_W8(tp, Cfg9346, x);
-        udelay(RTL_CLOCK_RATE);
-
-        x |= Cfg9346_EECS;
-        RTL_W8(tp, Cfg9346, x);
-}
-
-void rtl8168_set_eeprom_sel_low(struct rtl8168_private *tp)
-{
-        RTL_W8(tp, Cfg9346, Cfg9346_EEM1);
-        RTL_W8(tp, Cfg9346, Cfg9346_EEM1 | Cfg9346_EESK);
-
-        udelay(20);
-
-        RTL_W8(tp, Cfg9346, Cfg9346_EEM1);
-}
diff --git a/package/kernel/r8168/src/rtl_eeprom.h b/package/kernel/r8168/src/rtl_eeprom.h
deleted file mode 100644
index 473d8934f..000000000
--- a/package/kernel/r8168/src/rtl_eeprom.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-//EEPROM opcodes
-#define RTL_EEPROM_READ_OPCODE      06
-#define RTL_EEPROM_WRITE_OPCODE     05
-#define RTL_EEPROM_ERASE_OPCODE     07
-#define RTL_EEPROM_EWEN_OPCODE      19
-#define RTL_EEPROM_EWDS_OPCODE      16
-
-#define RTL_CLOCK_RATE  3
-
-void rtl8168_eeprom_type(struct rtl8168_private *tp);
-void rtl8168_eeprom_cleanup(struct rtl8168_private *tp);
-u16 rtl8168_eeprom_read_sc(struct rtl8168_private *tp, u16 reg);
-void rtl8168_eeprom_write_sc(struct rtl8168_private *tp, u16 reg, u16 data);
-void rtl8168_shift_out_bits(struct rtl8168_private *tp, int data, int count);
-u16 rtl8168_shift_in_bits(struct rtl8168_private *tp);
-void rtl8168_raise_clock(struct rtl8168_private *tp, u8 *x);
-void rtl8168_lower_clock(struct rtl8168_private *tp, u8 *x);
-void rtl8168_stand_by(struct rtl8168_private *tp);
-void rtl8168_set_eeprom_sel_low(struct rtl8168_private *tp);
-
-
-
diff --git a/package/kernel/r8168/src/rtltool.c b/package/kernel/r8168/src/rtltool.c
deleted file mode 100644
index cba919529..000000000
--- a/package/kernel/r8168/src/rtltool.c
+++ /dev/null
@@ -1,299 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#include <linux/module.h>
-#include <linux/version.h>
-#include <linux/pci.h>
-#include <linux/netdevice.h>
-#include <linux/delay.h>
-#include <linux/in.h>
-#include <linux/ethtool.h>
-#include <asm/uaccess.h>
-#include "r8168.h"
-#include "rtl_eeprom.h"
-#include "rtltool.h"
-
-int rtl8168_tool_ioctl(struct rtl8168_private *tp, struct ifreq *ifr)
-{
-        struct rtltool_cmd my_cmd;
-        unsigned long flags;
-        int ret;
-
-        if (copy_from_user(&my_cmd, ifr->ifr_data, sizeof(my_cmd)))
-                return -EFAULT;
-
-        ret = 0;
-        switch (my_cmd.cmd) {
-        case RTLTOOL_READ_MAC:
-                if (my_cmd.len==1)
-                        my_cmd.data = readb(tp->mmio_addr+my_cmd.offset);
-                else if (my_cmd.len==2)
-                        my_cmd.data = readw(tp->mmio_addr+(my_cmd.offset&~1));
-                else if (my_cmd.len==4)
-                        my_cmd.data = readl(tp->mmio_addr+(my_cmd.offset&~3));
-                else {
-                        ret = -EOPNOTSUPP;
-                        break;
-                }
-
-                if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) {
-                        ret = -EFAULT;
-                        break;
-                }
-                break;
-
-        case RTLTOOL_WRITE_MAC:
-                if (my_cmd.len==1)
-                        writeb(my_cmd.data, tp->mmio_addr+my_cmd.offset);
-                else if (my_cmd.len==2)
-                        writew(my_cmd.data, tp->mmio_addr+(my_cmd.offset&~1));
-                else if (my_cmd.len==4)
-                        writel(my_cmd.data, tp->mmio_addr+(my_cmd.offset&~3));
-                else {
-                        ret = -EOPNOTSUPP;
-                        break;
-                }
-
-                break;
-
-        case RTLTOOL_READ_PHY:
-                spin_lock_irqsave(&tp->lock, flags);
-                my_cmd.data = rtl8168_mdio_prot_read(tp, my_cmd.offset);
-                spin_unlock_irqrestore(&tp->lock, flags);
-
-                if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) {
-                        ret = -EFAULT;
-                        break;
-                }
-
-                break;
-
-        case RTLTOOL_WRITE_PHY:
-                spin_lock_irqsave(&tp->lock, flags);
-                rtl8168_mdio_prot_write(tp, my_cmd.offset, my_cmd.data);
-                spin_unlock_irqrestore(&tp->lock, flags);
-                break;
-
-        case RTLTOOL_READ_EPHY:
-                spin_lock_irqsave(&tp->lock, flags);
-                my_cmd.data = rtl8168_ephy_read(tp, my_cmd.offset);
-                spin_unlock_irqrestore(&tp->lock, flags);
-
-                if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) {
-                        ret = -EFAULT;
-                        break;
-                }
-
-                break;
-
-        case RTLTOOL_WRITE_EPHY:
-                spin_lock_irqsave(&tp->lock, flags);
-                rtl8168_ephy_write(tp, my_cmd.offset, my_cmd.data);
-                spin_unlock_irqrestore(&tp->lock, flags);
-                break;
-
-        case RTLTOOL_READ_ERI:
-                my_cmd.data = 0;
-                if (my_cmd.len==1 || my_cmd.len==2 || my_cmd.len==4) {
-                        spin_lock_irqsave(&tp->lock, flags);
-                        my_cmd.data = rtl8168_eri_read(tp, my_cmd.offset, my_cmd.len, ERIAR_ExGMAC);
-                        spin_unlock_irqrestore(&tp->lock, flags);
-                } else {
-                        ret = -EOPNOTSUPP;
-                        break;
-                }
-
-                if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) {
-                        ret = -EFAULT;
-                        break;
-                }
-
-                break;
-
-        case RTLTOOL_WRITE_ERI:
-                if (my_cmd.len==1 || my_cmd.len==2 || my_cmd.len==4) {
-                        spin_lock_irqsave(&tp->lock, flags);
-                        rtl8168_eri_write(tp, my_cmd.offset, my_cmd.len, my_cmd.data, ERIAR_ExGMAC);
-                        spin_unlock_irqrestore(&tp->lock, flags);
-                } else {
-                        ret = -EOPNOTSUPP;
-                        break;
-                }
-                break;
-
-        case RTLTOOL_READ_PCI:
-                my_cmd.data = 0;
-                if (my_cmd.len==1)
-                        pci_read_config_byte(tp->pci_dev, my_cmd.offset,
-                                             (u8 *)&my_cmd.data);
-                else if (my_cmd.len==2)
-                        pci_read_config_word(tp->pci_dev, my_cmd.offset,
-                                             (u16 *)&my_cmd.data);
-                else if (my_cmd.len==4)
-                        pci_read_config_dword(tp->pci_dev, my_cmd.offset,
-                                              &my_cmd.data);
-                else {
-                        ret = -EOPNOTSUPP;
-                        break;
-                }
-
-                if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) {
-                        ret = -EFAULT;
-                        break;
-                }
-                break;
-
-        case RTLTOOL_WRITE_PCI:
-                if (my_cmd.len==1)
-                        pci_write_config_byte(tp->pci_dev, my_cmd.offset,
-                                              my_cmd.data);
-                else if (my_cmd.len==2)
-                        pci_write_config_word(tp->pci_dev, my_cmd.offset,
-                                              my_cmd.data);
-                else if (my_cmd.len==4)
-                        pci_write_config_dword(tp->pci_dev, my_cmd.offset,
-                                               my_cmd.data);
-                else {
-                        ret = -EOPNOTSUPP;
-                        break;
-                }
-
-                break;
-
-        case RTLTOOL_READ_EEPROM:
-                spin_lock_irqsave(&tp->lock, flags);
-                my_cmd.data = rtl8168_eeprom_read_sc(tp, my_cmd.offset);
-                spin_unlock_irqrestore(&tp->lock, flags);
-
-                if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) {
-                        ret = -EFAULT;
-                        break;
-                }
-
-                break;
-
-        case RTLTOOL_WRITE_EEPROM:
-                spin_lock_irqsave(&tp->lock, flags);
-                rtl8168_eeprom_write_sc(tp, my_cmd.offset, my_cmd.data);
-                spin_unlock_irqrestore(&tp->lock, flags);
-                break;
-
-        case RTL_READ_OOB_MAC:
-                spin_lock_irqsave(&tp->lock, flags);
-                rtl8168_oob_mutex_lock(tp);
-                my_cmd.data = rtl8168_ocp_read(tp, my_cmd.offset, 4);
-                rtl8168_oob_mutex_unlock(tp);
-                spin_unlock_irqrestore(&tp->lock, flags);
-
-                if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) {
-                        ret = -EFAULT;
-                        break;
-                }
-                break;
-
-        case RTL_WRITE_OOB_MAC:
-                if (my_cmd.len == 0 || my_cmd.len > 4)
-                        return -EOPNOTSUPP;
-
-                spin_lock_irqsave(&tp->lock, flags);
-                rtl8168_oob_mutex_lock(tp);
-                rtl8168_ocp_write(tp, my_cmd.offset, my_cmd.len, my_cmd.data);
-                rtl8168_oob_mutex_unlock(tp);
-                spin_unlock_irqrestore(&tp->lock, flags);
-                break;
-
-        case RTL_ENABLE_PCI_DIAG:
-                spin_lock_irqsave(&tp->lock, flags);
-                tp->rtk_enable_diag = 1;
-                spin_unlock_irqrestore(&tp->lock, flags);
-
-                dprintk("enable rtk diag\n");
-                break;
-
-        case RTL_DISABLE_PCI_DIAG:
-                spin_lock_irqsave(&tp->lock, flags);
-                tp->rtk_enable_diag = 0;
-                spin_unlock_irqrestore(&tp->lock, flags);
-
-                dprintk("disable rtk diag\n");
-                break;
-
-        case RTL_READ_MAC_OCP:
-                if (my_cmd.offset % 2)
-                        return -EOPNOTSUPP;
-
-                spin_lock_irqsave(&tp->lock, flags);
-                my_cmd.data = rtl8168_mac_ocp_read(tp, my_cmd.offset);
-                spin_unlock_irqrestore(&tp->lock, flags);
-
-                if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) {
-                        ret = -EFAULT;
-                        break;
-                }
-                break;
-
-        case RTL_WRITE_MAC_OCP:
-                if ((my_cmd.offset % 2) || (my_cmd.len != 2))
-                        return -EOPNOTSUPP;
-
-                spin_lock_irqsave(&tp->lock, flags);
-                rtl8168_mac_ocp_write(tp, my_cmd.offset, (u16)my_cmd.data);
-                spin_unlock_irqrestore(&tp->lock, flags);
-                break;
-
-        case RTL_DIRECT_READ_PHY_OCP:
-                spin_lock_irqsave(&tp->lock, flags);
-                my_cmd.data = rtl8168_mdio_prot_direct_read_phy_ocp(tp, my_cmd.offset);
-                spin_unlock_irqrestore(&tp->lock, flags);
-
-                if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) {
-                        ret = -EFAULT;
-                        break;
-                }
-
-                break;
-
-        case RTL_DIRECT_WRITE_PHY_OCP:
-                spin_lock_irqsave(&tp->lock, flags);
-                rtl8168_mdio_prot_direct_write_phy_ocp(tp, my_cmd.offset, my_cmd.data);
-                spin_unlock_irqrestore(&tp->lock, flags);
-                break;
-
-        default:
-                ret = -EOPNOTSUPP;
-                break;
-        }
-
-        return ret;
-}
diff --git a/package/kernel/r8168/src/rtltool.h b/package/kernel/r8168/src/rtltool.h
deleted file mode 100644
index b5c6b440e..000000000
--- a/package/kernel/r8168/src/rtltool.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
-################################################################################
-#
-# r8168 is the Linux device driver released for Realtek Gigabit Ethernet
-# controllers with PCI-Express interface.
-#
-# Copyright(c) 2022 Realtek Semiconductor Corp. All rights reserved.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# Author:
-# Realtek NIC software team <nicfae@realtek.com>
-# No. 2, Innovation Road II, Hsinchu Science Park, Hsinchu 300, Taiwan
-#
-################################################################################
-*/
-
-/************************************************************************************
- *  This product is covered by one or more of the following patents:
- *  US6,570,884, US6,115,776, and US6,327,625.
- ***********************************************************************************/
-
-#ifndef _LINUX_RTLTOOL_H
-#define _LINUX_RTLTOOL_H
-
-#define SIOCRTLTOOL		SIOCDEVPRIVATE+1
-
-enum rtl_cmd {
-        RTLTOOL_READ_MAC=0,
-        RTLTOOL_WRITE_MAC,
-        RTLTOOL_READ_PHY,
-        RTLTOOL_WRITE_PHY,
-        RTLTOOL_READ_EPHY,
-        RTLTOOL_WRITE_EPHY,
-        RTLTOOL_READ_ERI,
-        RTLTOOL_WRITE_ERI,
-        RTLTOOL_READ_PCI,
-        RTLTOOL_WRITE_PCI,
-        RTLTOOL_READ_EEPROM,
-        RTLTOOL_WRITE_EEPROM,
-
-        RTL_READ_OOB_MAC,
-        RTL_WRITE_OOB_MAC,
-
-        RTL_ENABLE_PCI_DIAG,
-        RTL_DISABLE_PCI_DIAG,
-
-        RTL_READ_MAC_OCP,
-        RTL_WRITE_MAC_OCP,
-
-        RTL_DIRECT_READ_PHY_OCP,
-        RTL_DIRECT_WRITE_PHY_OCP,
-
-        RTLTOOL_INVALID
-};
-
-struct rtltool_cmd {
-        __u32	cmd;
-        __u32	offset;
-        __u32	len;
-        __u32	data;
-};
-
-enum mode_access {
-        MODE_NONE=0,
-        MODE_READ,
-        MODE_WRITE
-};
-
-#ifdef __KERNEL__
-int rtl8168_tool_ioctl(struct rtl8168_private *tp, struct ifreq *ifr);
-#endif
-
-#endif /* _LINUX_RTLTOOL_H */
diff --git a/target/linux/generic/backport-6.0/001-CONFIG_INITRAMFS_PRESERVE_MTIME.patch b/target/linux/generic/backport-6.0/001-CONFIG_INITRAMFS_PRESERVE_MTIME.patch
new file mode 100644
index 000000000..a757fee62
--- /dev/null
+++ b/target/linux/generic/backport-6.0/001-CONFIG_INITRAMFS_PRESERVE_MTIME.patch
@@ -0,0 +1,75 @@
+--- a/init/Kconfig
++++ b/init/Kconfig
+@@ -1386,16 +1386,6 @@ config BOOT_CONFIG_EMBED_FILE
+ 	  This bootconfig will be used if there is no initrd or no other
+ 	  bootconfig in the initrd.
+ 
+-config INITRAMFS_PRESERVE_MTIME
+-	bool "Preserve cpio archive mtimes in initramfs"
+-	default y
+-	help
+-	  Each entry in an initramfs cpio archive carries an mtime value. When
+-	  enabled, extracted cpio items take this mtime, with directory mtime
+-	  setting deferred until after creation of any child entries.
+-
+-	  If unsure, say Y.
+-
+ choice
+ 	prompt "Compiler optimization level"
+ 	default CC_OPTIMIZE_FOR_PERFORMANCE
+--- a/init/initramfs.c
++++ b/init/initramfs.c
+@@ -127,17 +127,15 @@ static void __init free_hash(void)
+ 	}
+ }
+ 
+-#ifdef CONFIG_INITRAMFS_PRESERVE_MTIME
+-static void __init do_utime(char *filename, time64_t mtime)
++static long __init do_utime(char *filename, time64_t mtime)
+ {
+-	struct timespec64 t[2] = { { .tv_sec = mtime }, { .tv_sec = mtime } };
+-	init_utimes(filename, t);
+-}
++	struct timespec64 t[2];
+ 
+-static void __init do_utime_path(const struct path *path, time64_t mtime)
+-{
+-	struct timespec64 t[2] = { { .tv_sec = mtime }, { .tv_sec = mtime } };
+-	vfs_utimes(path, t);
++	t[0].tv_sec = mtime;
++	t[0].tv_nsec = 0;
++	t[1].tv_sec = mtime;
++	t[1].tv_nsec = 0;
++	return init_utimes(filename, t);
+ }
+ 
+ static __initdata LIST_HEAD(dir_list);
+@@ -170,12 +168,6 @@ static void __init dir_utime(void)
+ 		kfree(de);
+ 	}
+ }
+-#else
+-static void __init do_utime(char *filename, time64_t mtime) {}
+-static void __init do_utime_path(const struct path *path, time64_t mtime) {}
+-static void __init dir_add(const char *name, time64_t mtime) {}
+-static void __init dir_utime(void) {}
+-#endif
+ 
+ static __initdata time64_t mtime;
+ 
+@@ -407,10 +399,14 @@ static int __init do_name(void)
+ static int __init do_copy(void)
+ {
+ 	if (byte_count >= body_len) {
++		struct timespec64 t[2] = { };
+ 		if (xwrite(wfile, victim, body_len, &wfile_pos) != body_len)
+ 			error("write error");
+ 
+-		do_utime_path(&wfile->f_path, mtime);
++		t[0].tv_sec = mtime;
++		t[1].tv_sec = mtime;
++		vfs_utimes(&wfile->f_path, t);
++
+ 		fput(wfile);
+ 		if (csum_present && io_csum != hdr_csum)
+ 			error("bad data checksum");
diff --git a/target/linux/generic/backport-6.0/002-struct-net_device.patch b/target/linux/generic/backport-6.0/002-struct-net_device.patch
new file mode 100644
index 000000000..e45e19ca7
--- /dev/null
+++ b/target/linux/generic/backport-6.0/002-struct-net_device.patch
@@ -0,0 +1,122 @@
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -2133,8 +2133,6 @@ struct net_device {
+ 
+ 	/* Protocol-specific pointers */
+ 
+-	struct in_device __rcu	*ip_ptr;
+-	struct inet6_dev __rcu	*ip6_ptr;
+ #if IS_ENABLED(CONFIG_VLAN_8021Q)
+ 	struct vlan_info __rcu	*vlan_info;
+ #endif
+@@ -2147,18 +2145,16 @@ struct net_device {
+ #if IS_ENABLED(CONFIG_ATALK)
+ 	void 			*atalk_ptr;
+ #endif
++	struct in_device __rcu	*ip_ptr;
+ #if IS_ENABLED(CONFIG_DECNET)
+ 	struct dn_dev __rcu     *dn_ptr;
+ #endif
++	struct inet6_dev __rcu	*ip6_ptr;
+ #if IS_ENABLED(CONFIG_AX25)
+ 	void			*ax25_ptr;
+ #endif
+-#if IS_ENABLED(CONFIG_CFG80211)
+ 	struct wireless_dev	*ieee80211_ptr;
+-#endif
+-#if IS_ENABLED(CONFIG_IEEE802154) || IS_ENABLED(CONFIG_6LOWPAN)
+ 	struct wpan_dev		*ieee802154_ptr;
+-#endif
+ #if IS_ENABLED(CONFIG_MPLS_ROUTING)
+ 	struct mpls_dev __rcu	*mpls_ptr;
+ #endif
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -8379,9 +8379,7 @@ int cfg80211_register_netdevice(struct n
+  */
+ static inline void cfg80211_unregister_netdevice(struct net_device *dev)
+ {
+-#if IS_ENABLED(CONFIG_CFG80211)
+ 	cfg80211_unregister_wdev(dev->ieee80211_ptr);
+-#endif
+ }
+ 
+ /**
+--- a/include/net/cfg802154.h
++++ b/include/net/cfg802154.h
+@@ -373,7 +373,6 @@ struct wpan_dev {
+ 
+ #define to_phy(_dev)	container_of(_dev, struct wpan_phy, dev)
+ 
+-#if IS_ENABLED(CONFIG_IEEE802154) || IS_ENABLED(CONFIG_6LOWPAN)
+ static inline int
+ wpan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
+ 		     const struct ieee802154_addr *daddr,
+@@ -384,7 +383,6 @@ wpan_dev_hard_header(struct sk_buff *skb
+ 
+ 	return wpan_dev->header_ops->create(skb, dev, daddr, saddr, len);
+ }
+-#endif
+ 
+ struct wpan_phy *
+ wpan_phy_new(const struct cfg802154_ops *ops, size_t priv_size);
+--- a/net/batman-adv/hard-interface.c
++++ b/net/batman-adv/hard-interface.c
+@@ -308,11 +308,9 @@ static bool batadv_is_cfg80211_netdev(st
+ 	if (!net_device)
+ 		return false;
+ 
+-#if IS_ENABLED(CONFIG_CFG80211)
+ 	/* cfg80211 drivers have to set ieee80211_ptr */
+ 	if (net_device->ieee80211_ptr)
+ 		return true;
+-#endif
+ 
+ 	return false;
+ }
+--- a/net/core/net-sysfs.c
++++ b/net/core/net-sysfs.c
+@@ -747,6 +747,7 @@ static const struct attribute_group nets
+ 	.attrs  = netstat_attrs,
+ };
+ 
++#if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211)
+ static struct attribute *wireless_attrs[] = {
+ 	NULL
+ };
+@@ -755,19 +756,7 @@ static const struct attribute_group wire
+ 	.name = "wireless",
+ 	.attrs = wireless_attrs,
+ };
+-
+-static bool wireless_group_needed(struct net_device *ndev)
+-{
+-#if IS_ENABLED(CONFIG_CFG80211)
+-	if (ndev->ieee80211_ptr)
+-		return true;
+ #endif
+-#if IS_ENABLED(CONFIG_WIRELESS_EXT)
+-	if (ndev->wireless_handlers)
+-		return true;
+-#endif
+-	return false;
+-}
+ 
+ #else /* CONFIG_SYSFS */
+ #define net_class_groups	NULL
+@@ -2008,8 +1997,14 @@ int netdev_register_kobject(struct net_d
+ 
+ 	*groups++ = &netstat_group;
+ 
+-	if (wireless_group_needed(ndev))
++#if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211)
++	if (ndev->ieee80211_ptr)
++		*groups++ = &wireless_group;
++#if IS_ENABLED(CONFIG_WIRELESS_EXT)
++	else if (ndev->wireless_handlers)
+ 		*groups++ = &wireless_group;
++#endif
++#endif
+ #endif /* CONFIG_SYSFS */
+ 
+ 	error = device_add(dev);
diff --git a/target/linux/generic/backport-6.0/011-kbuild-export-SUBARCH.patch b/target/linux/generic/backport-6.0/011-kbuild-export-SUBARCH.patch
new file mode 100644
index 000000000..b6688332d
--- /dev/null
+++ b/target/linux/generic/backport-6.0/011-kbuild-export-SUBARCH.patch
@@ -0,0 +1,21 @@
+From 173019b66dcc9d68ad9333aa744dad1e369b5aa8 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sun, 9 Jul 2017 00:26:53 +0200
+Subject: [PATCH 34/34] kernel: add compile fix for linux 4.9 on x86
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ Makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/Makefile
++++ b/Makefile
+@@ -537,7 +537,7 @@ KBUILD_LDFLAGS_MODULE :=
+ KBUILD_LDFLAGS :=
+ CLANG_FLAGS :=
+ 
+-export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC HOSTPKG_CONFIG
++export ARCH SRCARCH SUBARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC HOSTPKG_CONFIG
+ export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL
+ export PERL PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX
+ export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD
diff --git a/target/linux/generic/backport-6.0/100-mm-x86-arm64-add-arch_has_hw_pte_young.patch b/target/linux/generic/backport-6.0/100-mm-x86-arm64-add-arch_has_hw_pte_young.patch
new file mode 100644
index 000000000..18530fae9
--- /dev/null
+++ b/target/linux/generic/backport-6.0/100-mm-x86-arm64-add-arch_has_hw_pte_young.patch
@@ -0,0 +1,143 @@
+From e3264035bdac67898d685423ffb2f3a9c3a5964a Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Wed, 4 Aug 2021 01:31:34 -0600
+Subject: [PATCH 01/14] mm: x86, arm64: add arch_has_hw_pte_young()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Some architectures automatically set the accessed bit in PTEs, e.g.,
+x86 and arm64 v8.2. On architectures that do not have this capability,
+clearing the accessed bit in a PTE usually triggers a page fault
+following the TLB miss of this PTE (to emulate the accessed bit).
+
+Being aware of this capability can help make better decisions, e.g.,
+whether to spread the work out over a period of time to reduce bursty
+page faults when trying to clear the accessed bit in many PTEs.
+
+Note that theoretically this capability can be unreliable, e.g.,
+hotplugged CPUs might be different from builtin ones. Therefore it
+should not be used in architecture-independent code that involves
+correctness, e.g., to determine whether TLB flushes are required (in
+combination with the accessed bit).
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Reviewed-by: Barry Song <baohua@kernel.org>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Acked-by: Will Deacon <will@kernel.org>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: Ib49b44fb56df3333a2ff1fcc496fb1980b976e7a
+---
+ arch/arm64/include/asm/pgtable.h | 15 ++-------------
+ arch/x86/include/asm/pgtable.h   |  6 +++---
+ include/linux/pgtable.h          | 13 +++++++++++++
+ mm/memory.c                      | 14 +-------------
+ 4 files changed, 19 insertions(+), 29 deletions(-)
+
+--- a/arch/arm64/include/asm/pgtable.h
++++ b/arch/arm64/include/asm/pgtable.h
+@@ -1082,24 +1082,13 @@ static inline void update_mmu_cache(stru
+  * page after fork() + CoW for pfn mappings. We don't always have a
+  * hardware-managed access flag on arm64.
+  */
+-static inline bool arch_faults_on_old_pte(void)
+-{
+-	/* The register read below requires a stable CPU to make any sense */
+-	cant_migrate();
+-
+-	return !cpu_has_hw_af();
+-}
+-#define arch_faults_on_old_pte		arch_faults_on_old_pte
++#define arch_has_hw_pte_young		cpu_has_hw_af
+ 
+ /*
+  * Experimentally, it's cheap to set the access flag in hardware and we
+  * benefit from prefaulting mappings as 'old' to start with.
+  */
+-static inline bool arch_wants_old_prefaulted_pte(void)
+-{
+-	return !arch_faults_on_old_pte();
+-}
+-#define arch_wants_old_prefaulted_pte	arch_wants_old_prefaulted_pte
++#define arch_wants_old_prefaulted_pte	cpu_has_hw_af
+ 
+ static inline bool pud_sect_supported(void)
+ {
+--- a/arch/x86/include/asm/pgtable.h
++++ b/arch/x86/include/asm/pgtable.h
+@@ -1431,10 +1431,10 @@ static inline bool arch_has_pfn_modify_c
+ 	return boot_cpu_has_bug(X86_BUG_L1TF);
+ }
+ 
+-#define arch_faults_on_old_pte arch_faults_on_old_pte
+-static inline bool arch_faults_on_old_pte(void)
++#define arch_has_hw_pte_young arch_has_hw_pte_young
++static inline bool arch_has_hw_pte_young(void)
+ {
+-	return false;
++	return true;
+ }
+ 
+ #ifdef CONFIG_PAGE_TABLE_CHECK
+--- a/include/linux/pgtable.h
++++ b/include/linux/pgtable.h
+@@ -260,6 +260,19 @@ static inline int pmdp_clear_flush_young
+ #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
+ #endif
+ 
++#ifndef arch_has_hw_pte_young
++/*
++ * Return whether the accessed bit is supported on the local CPU.
++ *
++ * This stub assumes accessing through an old PTE triggers a page fault.
++ * Architectures that automatically set the access bit should overwrite it.
++ */
++static inline bool arch_has_hw_pte_young(void)
++{
++	return false;
++}
++#endif
++
+ #ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR
+ static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
+ 				       unsigned long address,
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -125,18 +125,6 @@ int randomize_va_space __read_mostly =
+ 					2;
+ #endif
+ 
+-#ifndef arch_faults_on_old_pte
+-static inline bool arch_faults_on_old_pte(void)
+-{
+-	/*
+-	 * Those arches which don't have hw access flag feature need to
+-	 * implement their own helper. By default, "true" means pagefault
+-	 * will be hit on old pte.
+-	 */
+-	return true;
+-}
+-#endif
+-
+ #ifndef arch_wants_old_prefaulted_pte
+ static inline bool arch_wants_old_prefaulted_pte(void)
+ {
+@@ -2872,7 +2860,7 @@ static inline bool __wp_page_copy_user(s
+ 	 * On architectures with software "accessed" bits, we would
+ 	 * take a double page fault, so mark it accessed here.
+ 	 */
+-	if (arch_faults_on_old_pte() && !pte_young(vmf->orig_pte)) {
++	if (!arch_has_hw_pte_young() && !pte_young(vmf->orig_pte)) {
+ 		pte_t entry;
+ 
+ 		vmf->pte = pte_offset_map_lock(mm, vmf->pmd, addr, &vmf->ptl);
diff --git a/target/linux/generic/backport-6.0/101-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch b/target/linux/generic/backport-6.0/101-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch
new file mode 100644
index 000000000..2d105ad6a
--- /dev/null
+++ b/target/linux/generic/backport-6.0/101-mm-x86-add-CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG.patch
@@ -0,0 +1,132 @@
+From 0c0016e6f53b52166fe4da61c81fa6b27f4650cd Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Sat, 26 Sep 2020 21:17:18 -0600
+Subject: [PATCH 02/14] mm: x86: add CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Some architectures support the accessed bit in non-leaf PMD entries,
+e.g., x86 sets the accessed bit in a non-leaf PMD entry when using it
+as part of linear address translation [1]. Page table walkers that
+clear the accessed bit may use this capability to reduce their search
+space.
+
+Note that:
+1. Although an inline function is preferable, this capability is added
+   as a configuration option for consistency with the existing macros.
+2. Due to the little interest in other varieties, this capability was
+   only tested on Intel and AMD CPUs.
+
+Thanks to the following developers for their efforts [2][3].
+  Randy Dunlap <rdunlap@infradead.org>
+  Stephen Rothwell <sfr@canb.auug.org.au>
+
+[1]: Intel 64 and IA-32 Architectures Software Developer's Manual
+     Volume 3 (June 2021), section 4.8
+[2] https://lore.kernel.org/r/bfdcc7c8-922f-61a9-aa15-7e7250f04af7@infradead.org/
+[3] https://lore.kernel.org/r/20220413151513.5a0d7a7e@canb.auug.org.au/
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Reviewed-by: Barry Song <baohua@kernel.org>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I1a17be3ae926f721f7b17ea1539e5c39e8c4f9a8
+---
+ arch/Kconfig                   | 8 ++++++++
+ arch/x86/Kconfig               | 1 +
+ arch/x86/include/asm/pgtable.h | 3 ++-
+ arch/x86/mm/pgtable.c          | 5 ++++-
+ include/linux/pgtable.h        | 4 ++--
+ 5 files changed, 17 insertions(+), 4 deletions(-)
+
+--- a/arch/Kconfig
++++ b/arch/Kconfig
+@@ -1418,6 +1418,14 @@ config DYNAMIC_SIGFRAME
+ config HAVE_ARCH_NODE_DEV_GROUP
+ 	bool
+ 
++config ARCH_HAS_NONLEAF_PMD_YOUNG
++	bool
++	help
++	  Architectures that select this option are capable of setting the
++	  accessed bit in non-leaf PMD entries when using them as part of linear
++	  address translations. Page table walkers that clear the accessed bit
++	  may use this capability to reduce their search space.
++
+ source "kernel/gcov/Kconfig"
+ 
+ source "scripts/gcc-plugins/Kconfig"
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -85,6 +85,7 @@ config X86
+ 	select ARCH_HAS_PMEM_API		if X86_64
+ 	select ARCH_HAS_PTE_DEVMAP		if X86_64
+ 	select ARCH_HAS_PTE_SPECIAL
++	select ARCH_HAS_NONLEAF_PMD_YOUNG	if PGTABLE_LEVELS > 2
+ 	select ARCH_HAS_UACCESS_FLUSHCACHE	if X86_64
+ 	select ARCH_HAS_COPY_MC			if X86_64
+ 	select ARCH_HAS_SET_MEMORY
+--- a/arch/x86/include/asm/pgtable.h
++++ b/arch/x86/include/asm/pgtable.h
+@@ -815,7 +815,8 @@ static inline unsigned long pmd_page_vad
+ 
+ static inline int pmd_bad(pmd_t pmd)
+ {
+-	return (pmd_flags(pmd) & ~_PAGE_USER) != _KERNPG_TABLE;
++	return (pmd_flags(pmd) & ~(_PAGE_USER | _PAGE_ACCESSED)) !=
++	       (_KERNPG_TABLE & ~_PAGE_ACCESSED);
+ }
+ 
+ static inline unsigned long pages_to_mb(unsigned long npg)
+--- a/arch/x86/mm/pgtable.c
++++ b/arch/x86/mm/pgtable.c
+@@ -550,7 +550,7 @@ int ptep_test_and_clear_young(struct vm_
+ 	return ret;
+ }
+ 
+-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
++#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG)
+ int pmdp_test_and_clear_young(struct vm_area_struct *vma,
+ 			      unsigned long addr, pmd_t *pmdp)
+ {
+@@ -562,6 +562,9 @@ int pmdp_test_and_clear_young(struct vm_
+ 
+ 	return ret;
+ }
++#endif
++
++#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+ int pudp_test_and_clear_young(struct vm_area_struct *vma,
+ 			      unsigned long addr, pud_t *pudp)
+ {
+--- a/include/linux/pgtable.h
++++ b/include/linux/pgtable.h
+@@ -213,7 +213,7 @@ static inline int ptep_test_and_clear_yo
+ #endif
+ 
+ #ifndef __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG
+-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
++#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG)
+ static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma,
+ 					    unsigned long address,
+ 					    pmd_t *pmdp)
+@@ -234,7 +234,7 @@ static inline int pmdp_test_and_clear_yo
+ 	BUILD_BUG();
+ 	return 0;
+ }
+-#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
++#endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG */
+ #endif
+ 
+ #ifndef __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
diff --git a/target/linux/generic/backport-6.0/102-mm-vmscan.c-refactor-shrink_node.patch b/target/linux/generic/backport-6.0/102-mm-vmscan.c-refactor-shrink_node.patch
new file mode 100644
index 000000000..f7c39744b
--- /dev/null
+++ b/target/linux/generic/backport-6.0/102-mm-vmscan.c-refactor-shrink_node.patch
@@ -0,0 +1,254 @@
+From d8e0edcddc441574410a047ede56f79c849a6d37 Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Sun, 27 Sep 2020 20:49:08 -0600
+Subject: [PATCH 03/14] mm/vmscan.c: refactor shrink_node()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This patch refactors shrink_node() to improve readability for the
+upcoming changes to mm/vmscan.c.
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Reviewed-by: Barry Song <baohua@kernel.org>
+Reviewed-by: Miaohe Lin <linmiaohe@huawei.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: Iae734b5b4030205b7db6e8c841f747b6f6ae1a04
+---
+ mm/vmscan.c | 198 +++++++++++++++++++++++++++-------------------------
+ 1 file changed, 104 insertions(+), 94 deletions(-)
+
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -2728,6 +2728,109 @@ enum scan_balance {
+ 	SCAN_FILE,
+ };
+ 
++static void prepare_scan_count(pg_data_t *pgdat, struct scan_control *sc)
++{
++	unsigned long file;
++	struct lruvec *target_lruvec;
++
++	target_lruvec = mem_cgroup_lruvec(sc->target_mem_cgroup, pgdat);
++
++	/*
++	 * Flush the memory cgroup stats, so that we read accurate per-memcg
++	 * lruvec stats for heuristics.
++	 */
++	mem_cgroup_flush_stats();
++
++	/*
++	 * Determine the scan balance between anon and file LRUs.
++	 */
++	spin_lock_irq(&target_lruvec->lru_lock);
++	sc->anon_cost = target_lruvec->anon_cost;
++	sc->file_cost = target_lruvec->file_cost;
++	spin_unlock_irq(&target_lruvec->lru_lock);
++
++	/*
++	 * Target desirable inactive:active list ratios for the anon
++	 * and file LRU lists.
++	 */
++	if (!sc->force_deactivate) {
++		unsigned long refaults;
++
++		refaults = lruvec_page_state(target_lruvec,
++				WORKINGSET_ACTIVATE_ANON);
++		if (refaults != target_lruvec->refaults[0] ||
++			inactive_is_low(target_lruvec, LRU_INACTIVE_ANON))
++			sc->may_deactivate |= DEACTIVATE_ANON;
++		else
++			sc->may_deactivate &= ~DEACTIVATE_ANON;
++
++		/*
++		 * When refaults are being observed, it means a new
++		 * workingset is being established. Deactivate to get
++		 * rid of any stale active pages quickly.
++		 */
++		refaults = lruvec_page_state(target_lruvec,
++				WORKINGSET_ACTIVATE_FILE);
++		if (refaults != target_lruvec->refaults[1] ||
++		    inactive_is_low(target_lruvec, LRU_INACTIVE_FILE))
++			sc->may_deactivate |= DEACTIVATE_FILE;
++		else
++			sc->may_deactivate &= ~DEACTIVATE_FILE;
++	} else
++		sc->may_deactivate = DEACTIVATE_ANON | DEACTIVATE_FILE;
++
++	/*
++	 * If we have plenty of inactive file pages that aren't
++	 * thrashing, try to reclaim those first before touching
++	 * anonymous pages.
++	 */
++	file = lruvec_page_state(target_lruvec, NR_INACTIVE_FILE);
++	if (file >> sc->priority && !(sc->may_deactivate & DEACTIVATE_FILE))
++		sc->cache_trim_mode = 1;
++	else
++		sc->cache_trim_mode = 0;
++
++	/*
++	 * Prevent the reclaimer from falling into the cache trap: as
++	 * cache pages start out inactive, every cache fault will tip
++	 * the scan balance towards the file LRU.  And as the file LRU
++	 * shrinks, so does the window for rotation from references.
++	 * This means we have a runaway feedback loop where a tiny
++	 * thrashing file LRU becomes infinitely more attractive than
++	 * anon pages.  Try to detect this based on file LRU size.
++	 */
++	if (!cgroup_reclaim(sc)) {
++		unsigned long total_high_wmark = 0;
++		unsigned long free, anon;
++		int z;
++
++		free = sum_zone_node_page_state(pgdat->node_id, NR_FREE_PAGES);
++		file = node_page_state(pgdat, NR_ACTIVE_FILE) +
++			   node_page_state(pgdat, NR_INACTIVE_FILE);
++
++		for (z = 0; z < MAX_NR_ZONES; z++) {
++			struct zone *zone = &pgdat->node_zones[z];
++
++			if (!managed_zone(zone))
++				continue;
++
++			total_high_wmark += high_wmark_pages(zone);
++		}
++
++		/*
++		 * Consider anon: if that's low too, this isn't a
++		 * runaway file reclaim problem, but rather just
++		 * extreme pressure. Reclaim as per usual then.
++		 */
++		anon = node_page_state(pgdat, NR_INACTIVE_ANON);
++
++		sc->file_is_tiny =
++			file + free <= total_high_wmark &&
++			!(sc->may_deactivate & DEACTIVATE_ANON) &&
++			anon >> sc->priority;
++	}
++}
++
+ /*
+  * Determine how aggressively the anon and file LRU lists should be
+  * scanned.
+@@ -3197,109 +3300,16 @@ static void shrink_node(pg_data_t *pgdat
+ 	unsigned long nr_reclaimed, nr_scanned;
+ 	struct lruvec *target_lruvec;
+ 	bool reclaimable = false;
+-	unsigned long file;
+ 
+ 	target_lruvec = mem_cgroup_lruvec(sc->target_mem_cgroup, pgdat);
+ 
+ again:
+-	/*
+-	 * Flush the memory cgroup stats, so that we read accurate per-memcg
+-	 * lruvec stats for heuristics.
+-	 */
+-	mem_cgroup_flush_stats();
+-
+ 	memset(&sc->nr, 0, sizeof(sc->nr));
+ 
+ 	nr_reclaimed = sc->nr_reclaimed;
+ 	nr_scanned = sc->nr_scanned;
+ 
+-	/*
+-	 * Determine the scan balance between anon and file LRUs.
+-	 */
+-	spin_lock_irq(&target_lruvec->lru_lock);
+-	sc->anon_cost = target_lruvec->anon_cost;
+-	sc->file_cost = target_lruvec->file_cost;
+-	spin_unlock_irq(&target_lruvec->lru_lock);
+-
+-	/*
+-	 * Target desirable inactive:active list ratios for the anon
+-	 * and file LRU lists.
+-	 */
+-	if (!sc->force_deactivate) {
+-		unsigned long refaults;
+-
+-		refaults = lruvec_page_state(target_lruvec,
+-				WORKINGSET_ACTIVATE_ANON);
+-		if (refaults != target_lruvec->refaults[0] ||
+-			inactive_is_low(target_lruvec, LRU_INACTIVE_ANON))
+-			sc->may_deactivate |= DEACTIVATE_ANON;
+-		else
+-			sc->may_deactivate &= ~DEACTIVATE_ANON;
+-
+-		/*
+-		 * When refaults are being observed, it means a new
+-		 * workingset is being established. Deactivate to get
+-		 * rid of any stale active pages quickly.
+-		 */
+-		refaults = lruvec_page_state(target_lruvec,
+-				WORKINGSET_ACTIVATE_FILE);
+-		if (refaults != target_lruvec->refaults[1] ||
+-		    inactive_is_low(target_lruvec, LRU_INACTIVE_FILE))
+-			sc->may_deactivate |= DEACTIVATE_FILE;
+-		else
+-			sc->may_deactivate &= ~DEACTIVATE_FILE;
+-	} else
+-		sc->may_deactivate = DEACTIVATE_ANON | DEACTIVATE_FILE;
+-
+-	/*
+-	 * If we have plenty of inactive file pages that aren't
+-	 * thrashing, try to reclaim those first before touching
+-	 * anonymous pages.
+-	 */
+-	file = lruvec_page_state(target_lruvec, NR_INACTIVE_FILE);
+-	if (file >> sc->priority && !(sc->may_deactivate & DEACTIVATE_FILE))
+-		sc->cache_trim_mode = 1;
+-	else
+-		sc->cache_trim_mode = 0;
+-
+-	/*
+-	 * Prevent the reclaimer from falling into the cache trap: as
+-	 * cache pages start out inactive, every cache fault will tip
+-	 * the scan balance towards the file LRU.  And as the file LRU
+-	 * shrinks, so does the window for rotation from references.
+-	 * This means we have a runaway feedback loop where a tiny
+-	 * thrashing file LRU becomes infinitely more attractive than
+-	 * anon pages.  Try to detect this based on file LRU size.
+-	 */
+-	if (!cgroup_reclaim(sc)) {
+-		unsigned long total_high_wmark = 0;
+-		unsigned long free, anon;
+-		int z;
+-
+-		free = sum_zone_node_page_state(pgdat->node_id, NR_FREE_PAGES);
+-		file = node_page_state(pgdat, NR_ACTIVE_FILE) +
+-			   node_page_state(pgdat, NR_INACTIVE_FILE);
+-
+-		for (z = 0; z < MAX_NR_ZONES; z++) {
+-			struct zone *zone = &pgdat->node_zones[z];
+-			if (!managed_zone(zone))
+-				continue;
+-
+-			total_high_wmark += high_wmark_pages(zone);
+-		}
+-
+-		/*
+-		 * Consider anon: if that's low too, this isn't a
+-		 * runaway file reclaim problem, but rather just
+-		 * extreme pressure. Reclaim as per usual then.
+-		 */
+-		anon = node_page_state(pgdat, NR_INACTIVE_ANON);
+-
+-		sc->file_is_tiny =
+-			file + free <= total_high_wmark &&
+-			!(sc->may_deactivate & DEACTIVATE_ANON) &&
+-			anon >> sc->priority;
+-	}
++	prepare_scan_count(pgdat, sc);
+ 
+ 	shrink_node_memcgs(pgdat, sc);
+ 
diff --git a/target/linux/generic/backport-6.0/103-Revert-include-linux-mm_inline.h-fold-__update_lru_s.patch b/target/linux/generic/backport-6.0/103-Revert-include-linux-mm_inline.h-fold-__update_lru_s.patch
new file mode 100644
index 000000000..2a6a1f24f
--- /dev/null
+++ b/target/linux/generic/backport-6.0/103-Revert-include-linux-mm_inline.h-fold-__update_lru_s.patch
@@ -0,0 +1,59 @@
+From bc14d2c7c6d0fb8c79ad0fc5eab488b977cbcccf Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Sun, 6 Mar 2022 20:22:40 -0700
+Subject: [PATCH 04/14] Revert "include/linux/mm_inline.h: fold
+ __update_lru_size() into its sole caller"
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This patch undoes the following refactor:
+commit 289ccba18af4 ("include/linux/mm_inline.h: fold __update_lru_size() into its sole caller")
+
+The upcoming changes to include/linux/mm_inline.h will reuse
+__update_lru_size().
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Reviewed-by: Miaohe Lin <linmiaohe@huawei.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I6155c407d50199a43b179c7f45904d4b7c052118
+---
+ include/linux/mm_inline.h | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+--- a/include/linux/mm_inline.h
++++ b/include/linux/mm_inline.h
+@@ -34,7 +34,7 @@ static inline int page_is_file_lru(struc
+ 	return folio_is_file_lru(page_folio(page));
+ }
+ 
+-static __always_inline void update_lru_size(struct lruvec *lruvec,
++static __always_inline void __update_lru_size(struct lruvec *lruvec,
+ 				enum lru_list lru, enum zone_type zid,
+ 				long nr_pages)
+ {
+@@ -43,6 +43,13 @@ static __always_inline void update_lru_s
+ 	__mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
+ 	__mod_zone_page_state(&pgdat->node_zones[zid],
+ 				NR_ZONE_LRU_BASE + lru, nr_pages);
++}
++
++static __always_inline void update_lru_size(struct lruvec *lruvec,
++				enum lru_list lru, enum zone_type zid,
++				long nr_pages)
++{
++	__update_lru_size(lruvec, lru, zid, nr_pages);
+ #ifdef CONFIG_MEMCG
+ 	mem_cgroup_update_lru_size(lruvec, lru, zid, nr_pages);
+ #endif
diff --git a/target/linux/generic/backport-6.0/104-mm-multi-gen-LRU-groundwork.patch b/target/linux/generic/backport-6.0/104-mm-multi-gen-LRU-groundwork.patch
new file mode 100644
index 000000000..4750bdd99
--- /dev/null
+++ b/target/linux/generic/backport-6.0/104-mm-multi-gen-LRU-groundwork.patch
@@ -0,0 +1,777 @@
+From 8c6beb4548c216da9dae5e1a7612a108396e3f9e Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Mon, 25 Jan 2021 21:12:33 -0700
+Subject: [PATCH 05/14] mm: multi-gen LRU: groundwork
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Evictable pages are divided into multiple generations for each lruvec.
+The youngest generation number is stored in lrugen->max_seq for both
+anon and file types as they are aged on an equal footing. The oldest
+generation numbers are stored in lrugen->min_seq[] separately for anon
+and file types as clean file pages can be evicted regardless of swap
+constraints. These three variables are monotonically increasing.
+
+Generation numbers are truncated into order_base_2(MAX_NR_GENS+1) bits
+in order to fit into the gen counter in folio->flags. Each truncated
+generation number is an index to lrugen->lists[]. The sliding window
+technique is used to track at least MIN_NR_GENS and at most
+MAX_NR_GENS generations. The gen counter stores a value within [1,
+MAX_NR_GENS] while a page is on one of lrugen->lists[]. Otherwise it
+stores 0.
+
+There are two conceptually independent procedures: "the aging", which
+produces young generations, and "the eviction", which consumes old
+generations. They form a closed-loop system, i.e., "the page reclaim".
+Both procedures can be invoked from userspace for the purposes of
+working set estimation and proactive reclaim. These techniques are
+commonly used to optimize job scheduling (bin packing) in data
+centers [1][2].
+
+To avoid confusion, the terms "hot" and "cold" will be applied to the
+multi-gen LRU, as a new convention; the terms "active" and "inactive"
+will be applied to the active/inactive LRU, as usual.
+
+The protection of hot pages and the selection of cold pages are based
+on page access channels and patterns. There are two access channels:
+one through page tables and the other through file descriptors. The
+protection of the former channel is by design stronger because:
+1. The uncertainty in determining the access patterns of the former
+   channel is higher due to the approximation of the accessed bit.
+2. The cost of evicting the former channel is higher due to the TLB
+   flushes required and the likelihood of encountering the dirty bit.
+3. The penalty of underprotecting the former channel is higher because
+   applications usually do not prepare themselves for major page
+   faults like they do for blocked I/O. E.g., GUI applications
+   commonly use dedicated I/O threads to avoid blocking rendering
+   threads.
+There are also two access patterns: one with temporal locality and the
+other without. For the reasons listed above, the former channel is
+assumed to follow the former pattern unless VM_SEQ_READ or
+VM_RAND_READ is present; the latter channel is assumed to follow the
+latter pattern unless outlying refaults have been observed [3][4].
+
+The next patch will address the "outlying refaults". Three macros,
+i.e., LRU_REFS_WIDTH, LRU_REFS_PGOFF and LRU_REFS_MASK, used later are
+added in this patch to make the entire patchset less diffy.
+
+A page is added to the youngest generation on faulting. The aging
+needs to check the accessed bit at least twice before handing this
+page over to the eviction. The first check takes care of the accessed
+bit set on the initial fault; the second check makes sure this page
+has not been used since then. This protocol, AKA second chance,
+requires a minimum of two generations, hence MIN_NR_GENS.
+
+[1] https://dl.acm.org/doi/10.1145/3297858.3304053
+[2] https://dl.acm.org/doi/10.1145/3503222.3507731
+[3] https://lwn.net/Articles/495543/
+[4] https://lwn.net/Articles/815342/
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I71de7cd15b8dfa6f9fdd838023474693c4fee0a7
+---
+ fs/fuse/dev.c                     |   3 +-
+ include/linux/mm_inline.h         | 175 ++++++++++++++++++++++++++++++
+ include/linux/mmzone.h            | 102 +++++++++++++++++
+ include/linux/page-flags-layout.h |  13 ++-
+ include/linux/page-flags.h        |   4 +-
+ include/linux/sched.h             |   4 +
+ kernel/bounds.c                   |   5 +
+ mm/Kconfig                        |   8 ++
+ mm/huge_memory.c                  |   3 +-
+ mm/memcontrol.c                   |   2 +
+ mm/memory.c                       |  25 +++++
+ mm/mm_init.c                      |   6 +-
+ mm/mmzone.c                       |   2 +
+ mm/swap.c                         |  11 +-
+ mm/vmscan.c                       |  75 +++++++++++++
+ 15 files changed, 424 insertions(+), 14 deletions(-)
+
+--- a/fs/fuse/dev.c
++++ b/fs/fuse/dev.c
+@@ -776,7 +776,8 @@ static int fuse_check_page(struct page *
+ 	       1 << PG_active |
+ 	       1 << PG_workingset |
+ 	       1 << PG_reclaim |
+-	       1 << PG_waiters))) {
++	       1 << PG_waiters |
++	       LRU_GEN_MASK | LRU_REFS_MASK))) {
+ 		dump_page(page, "fuse: trying to steal weird page");
+ 		return 1;
+ 	}
+--- a/include/linux/mm_inline.h
++++ b/include/linux/mm_inline.h
+@@ -40,6 +40,9 @@ static __always_inline void __update_lru
+ {
+ 	struct pglist_data *pgdat = lruvec_pgdat(lruvec);
+ 
++	lockdep_assert_held(&lruvec->lru_lock);
++	WARN_ON_ONCE(nr_pages != (int)nr_pages);
++
+ 	__mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
+ 	__mod_zone_page_state(&pgdat->node_zones[zid],
+ 				NR_ZONE_LRU_BASE + lru, nr_pages);
+@@ -101,11 +104,177 @@ static __always_inline enum lru_list fol
+ 	return lru;
+ }
+ 
++#ifdef CONFIG_LRU_GEN
++
++static inline bool lru_gen_enabled(void)
++{
++	return true;
++}
++
++static inline bool lru_gen_in_fault(void)
++{
++	return current->in_lru_fault;
++}
++
++static inline int lru_gen_from_seq(unsigned long seq)
++{
++	return seq % MAX_NR_GENS;
++}
++
++static inline int folio_lru_gen(struct folio *folio)
++{
++	unsigned long flags = READ_ONCE(folio->flags);
++
++	return ((flags & LRU_GEN_MASK) >> LRU_GEN_PGOFF) - 1;
++}
++
++static inline bool lru_gen_is_active(struct lruvec *lruvec, int gen)
++{
++	unsigned long max_seq = lruvec->lrugen.max_seq;
++
++	VM_WARN_ON_ONCE(gen >= MAX_NR_GENS);
++
++	/* see the comment on MIN_NR_GENS */
++	return gen == lru_gen_from_seq(max_seq) || gen == lru_gen_from_seq(max_seq - 1);
++}
++
++static inline void lru_gen_update_size(struct lruvec *lruvec, struct folio *folio,
++				       int old_gen, int new_gen)
++{
++	int type = folio_is_file_lru(folio);
++	int zone = folio_zonenum(folio);
++	int delta = folio_nr_pages(folio);
++	enum lru_list lru = type * LRU_INACTIVE_FILE;
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++
++	VM_WARN_ON_ONCE(old_gen != -1 && old_gen >= MAX_NR_GENS);
++	VM_WARN_ON_ONCE(new_gen != -1 && new_gen >= MAX_NR_GENS);
++	VM_WARN_ON_ONCE(old_gen == -1 && new_gen == -1);
++
++	if (old_gen >= 0)
++		WRITE_ONCE(lrugen->nr_pages[old_gen][type][zone],
++			   lrugen->nr_pages[old_gen][type][zone] - delta);
++	if (new_gen >= 0)
++		WRITE_ONCE(lrugen->nr_pages[new_gen][type][zone],
++			   lrugen->nr_pages[new_gen][type][zone] + delta);
++
++	/* addition */
++	if (old_gen < 0) {
++		if (lru_gen_is_active(lruvec, new_gen))
++			lru += LRU_ACTIVE;
++		__update_lru_size(lruvec, lru, zone, delta);
++		return;
++	}
++
++	/* deletion */
++	if (new_gen < 0) {
++		if (lru_gen_is_active(lruvec, old_gen))
++			lru += LRU_ACTIVE;
++		__update_lru_size(lruvec, lru, zone, -delta);
++		return;
++	}
++}
++
++static inline bool lru_gen_add_folio(struct lruvec *lruvec, struct folio *folio, bool reclaiming)
++{
++	unsigned long seq;
++	unsigned long flags;
++	int gen = folio_lru_gen(folio);
++	int type = folio_is_file_lru(folio);
++	int zone = folio_zonenum(folio);
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++
++	VM_WARN_ON_ONCE_FOLIO(gen != -1, folio);
++
++	if (folio_test_unevictable(folio))
++		return false;
++	/*
++	 * There are three common cases for this page:
++	 * 1. If it's hot, e.g., freshly faulted in or previously hot and
++	 *    migrated, add it to the youngest generation.
++	 * 2. If it's cold but can't be evicted immediately, i.e., an anon page
++	 *    not in swapcache or a dirty page pending writeback, add it to the
++	 *    second oldest generation.
++	 * 3. Everything else (clean, cold) is added to the oldest generation.
++	 */
++	if (folio_test_active(folio))
++		seq = lrugen->max_seq;
++	else if ((type == LRU_GEN_ANON && !folio_test_swapcache(folio)) ||
++		 (folio_test_reclaim(folio) &&
++		  (folio_test_dirty(folio) || folio_test_writeback(folio))))
++		seq = lrugen->min_seq[type] + 1;
++	else
++		seq = lrugen->min_seq[type];
++
++	gen = lru_gen_from_seq(seq);
++	flags = (gen + 1UL) << LRU_GEN_PGOFF;
++	/* see the comment on MIN_NR_GENS about PG_active */
++	set_mask_bits(&folio->flags, LRU_GEN_MASK | BIT(PG_active), flags);
++
++	lru_gen_update_size(lruvec, folio, -1, gen);
++	/* for folio_rotate_reclaimable() */
++	if (reclaiming)
++		list_add_tail(&folio->lru, &lrugen->lists[gen][type][zone]);
++	else
++		list_add(&folio->lru, &lrugen->lists[gen][type][zone]);
++
++	return true;
++}
++
++static inline bool lru_gen_del_folio(struct lruvec *lruvec, struct folio *folio, bool reclaiming)
++{
++	unsigned long flags;
++	int gen = folio_lru_gen(folio);
++
++	if (gen < 0)
++		return false;
++
++	VM_WARN_ON_ONCE_FOLIO(folio_test_active(folio), folio);
++	VM_WARN_ON_ONCE_FOLIO(folio_test_unevictable(folio), folio);
++
++	/* for folio_migrate_flags() */
++	flags = !reclaiming && lru_gen_is_active(lruvec, gen) ? BIT(PG_active) : 0;
++	flags = set_mask_bits(&folio->flags, LRU_GEN_MASK, flags);
++	gen = ((flags & LRU_GEN_MASK) >> LRU_GEN_PGOFF) - 1;
++
++	lru_gen_update_size(lruvec, folio, gen, -1);
++	list_del(&folio->lru);
++
++	return true;
++}
++
++#else /* !CONFIG_LRU_GEN */
++
++static inline bool lru_gen_enabled(void)
++{
++	return false;
++}
++
++static inline bool lru_gen_in_fault(void)
++{
++	return false;
++}
++
++static inline bool lru_gen_add_folio(struct lruvec *lruvec, struct folio *folio, bool reclaiming)
++{
++	return false;
++}
++
++static inline bool lru_gen_del_folio(struct lruvec *lruvec, struct folio *folio, bool reclaiming)
++{
++	return false;
++}
++
++#endif /* CONFIG_LRU_GEN */
++
+ static __always_inline
+ void lruvec_add_folio(struct lruvec *lruvec, struct folio *folio)
+ {
+ 	enum lru_list lru = folio_lru_list(folio);
+ 
++	if (lru_gen_add_folio(lruvec, folio, false))
++		return;
++
+ 	update_lru_size(lruvec, lru, folio_zonenum(folio),
+ 			folio_nr_pages(folio));
+ 	if (lru != LRU_UNEVICTABLE)
+@@ -123,6 +292,9 @@ void lruvec_add_folio_tail(struct lruvec
+ {
+ 	enum lru_list lru = folio_lru_list(folio);
+ 
++	if (lru_gen_add_folio(lruvec, folio, true))
++		return;
++
+ 	update_lru_size(lruvec, lru, folio_zonenum(folio),
+ 			folio_nr_pages(folio));
+ 	/* This is not expected to be used on LRU_UNEVICTABLE */
+@@ -140,6 +312,9 @@ void lruvec_del_folio(struct lruvec *lru
+ {
+ 	enum lru_list lru = folio_lru_list(folio);
+ 
++	if (lru_gen_del_folio(lruvec, folio, false))
++		return;
++
+ 	if (lru != LRU_UNEVICTABLE)
+ 		list_del(&folio->lru);
+ 	update_lru_size(lruvec, lru, folio_zonenum(folio),
+--- a/include/linux/mmzone.h
++++ b/include/linux/mmzone.h
+@@ -314,6 +314,102 @@ enum lruvec_flags {
+ 					 */
+ };
+ 
++#endif /* !__GENERATING_BOUNDS_H */
++
++/*
++ * Evictable pages are divided into multiple generations. The youngest and the
++ * oldest generation numbers, max_seq and min_seq, are monotonically increasing.
++ * They form a sliding window of a variable size [MIN_NR_GENS, MAX_NR_GENS]. An
++ * offset within MAX_NR_GENS, i.e., gen, indexes the LRU list of the
++ * corresponding generation. The gen counter in folio->flags stores gen+1 while
++ * a page is on one of lrugen->lists[]. Otherwise it stores 0.
++ *
++ * A page is added to the youngest generation on faulting. The aging needs to
++ * check the accessed bit at least twice before handing this page over to the
++ * eviction. The first check takes care of the accessed bit set on the initial
++ * fault; the second check makes sure this page hasn't been used since then.
++ * This process, AKA second chance, requires a minimum of two generations,
++ * hence MIN_NR_GENS. And to maintain ABI compatibility with the active/inactive
++ * LRU, e.g., /proc/vmstat, these two generations are considered active; the
++ * rest of generations, if they exist, are considered inactive. See
++ * lru_gen_is_active().
++ *
++ * PG_active is always cleared while a page is on one of lrugen->lists[] so that
++ * the aging needs not to worry about it. And it's set again when a page
++ * considered active is isolated for non-reclaiming purposes, e.g., migration.
++ * See lru_gen_add_folio() and lru_gen_del_folio().
++ *
++ * MAX_NR_GENS is set to 4 so that the multi-gen LRU can support twice the
++ * number of categories of the active/inactive LRU when keeping track of
++ * accesses through page tables. This requires order_base_2(MAX_NR_GENS+1) bits
++ * in folio->flags.
++ */
++#define MIN_NR_GENS		2U
++#define MAX_NR_GENS		4U
++
++#ifndef __GENERATING_BOUNDS_H
++
++struct lruvec;
++
++#define LRU_GEN_MASK		((BIT(LRU_GEN_WIDTH) - 1) << LRU_GEN_PGOFF)
++#define LRU_REFS_MASK		((BIT(LRU_REFS_WIDTH) - 1) << LRU_REFS_PGOFF)
++
++#ifdef CONFIG_LRU_GEN
++
++enum {
++	LRU_GEN_ANON,
++	LRU_GEN_FILE,
++};
++
++/*
++ * The youngest generation number is stored in max_seq for both anon and file
++ * types as they are aged on an equal footing. The oldest generation numbers are
++ * stored in min_seq[] separately for anon and file types as clean file pages
++ * can be evicted regardless of swap constraints.
++ *
++ * Normally anon and file min_seq are in sync. But if swapping is constrained,
++ * e.g., out of swap space, file min_seq is allowed to advance and leave anon
++ * min_seq behind.
++ *
++ * The number of pages in each generation is eventually consistent and therefore
++ * can be transiently negative.
++ */
++struct lru_gen_struct {
++	/* the aging increments the youngest generation number */
++	unsigned long max_seq;
++	/* the eviction increments the oldest generation numbers */
++	unsigned long min_seq[ANON_AND_FILE];
++	/* the multi-gen LRU lists, lazily sorted on eviction */
++	struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES];
++	/* the multi-gen LRU sizes, eventually consistent */
++	long nr_pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES];
++};
++
++void lru_gen_init_lruvec(struct lruvec *lruvec);
++
++#ifdef CONFIG_MEMCG
++void lru_gen_init_memcg(struct mem_cgroup *memcg);
++void lru_gen_exit_memcg(struct mem_cgroup *memcg);
++#endif
++
++#else /* !CONFIG_LRU_GEN */
++
++static inline void lru_gen_init_lruvec(struct lruvec *lruvec)
++{
++}
++
++#ifdef CONFIG_MEMCG
++static inline void lru_gen_init_memcg(struct mem_cgroup *memcg)
++{
++}
++
++static inline void lru_gen_exit_memcg(struct mem_cgroup *memcg)
++{
++}
++#endif
++
++#endif /* CONFIG_LRU_GEN */
++
+ struct lruvec {
+ 	struct list_head		lists[NR_LRU_LISTS];
+ 	/* per lruvec lru_lock for memcg */
+@@ -331,6 +427,10 @@ struct lruvec {
+ 	unsigned long			refaults[ANON_AND_FILE];
+ 	/* Various lruvec state flags (enum lruvec_flags) */
+ 	unsigned long			flags;
++#ifdef CONFIG_LRU_GEN
++	/* evictable pages divided into generations */
++	struct lru_gen_struct		lrugen;
++#endif
+ #ifdef CONFIG_MEMCG
+ 	struct pglist_data *pgdat;
+ #endif
+@@ -746,6 +846,8 @@ static inline bool zone_is_empty(struct
+ #define ZONES_PGOFF		(NODES_PGOFF - ZONES_WIDTH)
+ #define LAST_CPUPID_PGOFF	(ZONES_PGOFF - LAST_CPUPID_WIDTH)
+ #define KASAN_TAG_PGOFF		(LAST_CPUPID_PGOFF - KASAN_TAG_WIDTH)
++#define LRU_GEN_PGOFF		(KASAN_TAG_PGOFF - LRU_GEN_WIDTH)
++#define LRU_REFS_PGOFF		(LRU_GEN_PGOFF - LRU_REFS_WIDTH)
+ 
+ /*
+  * Define the bit shifts to access each section.  For non-existent
+--- a/include/linux/page-flags-layout.h
++++ b/include/linux/page-flags-layout.h
+@@ -55,7 +55,8 @@
+ #define SECTIONS_WIDTH		0
+ #endif
+ 
+-#if ZONES_WIDTH + SECTIONS_WIDTH + NODES_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS
++#if ZONES_WIDTH + LRU_GEN_WIDTH + SECTIONS_WIDTH + NODES_SHIFT \
++	<= BITS_PER_LONG - NR_PAGEFLAGS
+ #define NODES_WIDTH		NODES_SHIFT
+ #elif defined(CONFIG_SPARSEMEM_VMEMMAP)
+ #error "Vmemmap: No space for nodes field in page flags"
+@@ -89,8 +90,8 @@
+ #define LAST_CPUPID_SHIFT 0
+ #endif
+ 
+-#if ZONES_WIDTH + SECTIONS_WIDTH + NODES_WIDTH + KASAN_TAG_WIDTH + LAST_CPUPID_SHIFT \
+-	<= BITS_PER_LONG - NR_PAGEFLAGS
++#if ZONES_WIDTH + LRU_GEN_WIDTH + SECTIONS_WIDTH + NODES_WIDTH + \
++	KASAN_TAG_WIDTH + LAST_CPUPID_SHIFT <= BITS_PER_LONG - NR_PAGEFLAGS
+ #define LAST_CPUPID_WIDTH LAST_CPUPID_SHIFT
+ #else
+ #define LAST_CPUPID_WIDTH 0
+@@ -100,10 +101,12 @@
+ #define LAST_CPUPID_NOT_IN_PAGE_FLAGS
+ #endif
+ 
+-#if ZONES_WIDTH + SECTIONS_WIDTH + NODES_WIDTH + KASAN_TAG_WIDTH + LAST_CPUPID_WIDTH \
+-	> BITS_PER_LONG - NR_PAGEFLAGS
++#if ZONES_WIDTH + LRU_GEN_WIDTH + SECTIONS_WIDTH + NODES_WIDTH + \
++	KASAN_TAG_WIDTH + LAST_CPUPID_WIDTH > BITS_PER_LONG - NR_PAGEFLAGS
+ #error "Not enough bits in page flags"
+ #endif
+ 
++#define LRU_REFS_WIDTH	0
++
+ #endif
+ #endif /* _LINUX_PAGE_FLAGS_LAYOUT */
+--- a/include/linux/page-flags.h
++++ b/include/linux/page-flags.h
+@@ -1058,7 +1058,7 @@ static __always_inline void __ClearPageA
+ 	 1UL << PG_private	| 1UL << PG_private_2	|	\
+ 	 1UL << PG_writeback	| 1UL << PG_reserved	|	\
+ 	 1UL << PG_slab		| 1UL << PG_active 	|	\
+-	 1UL << PG_unevictable	| __PG_MLOCKED)
++	 1UL << PG_unevictable	| __PG_MLOCKED | LRU_GEN_MASK)
+ 
+ /*
+  * Flags checked when a page is prepped for return by the page allocator.
+@@ -1069,7 +1069,7 @@ static __always_inline void __ClearPageA
+  * alloc-free cycle to prevent from reusing the page.
+  */
+ #define PAGE_FLAGS_CHECK_AT_PREP	\
+-	(PAGEFLAGS_MASK & ~__PG_HWPOISON)
++	((PAGEFLAGS_MASK & ~__PG_HWPOISON) | LRU_GEN_MASK | LRU_REFS_MASK)
+ 
+ #define PAGE_FLAGS_PRIVATE				\
+ 	(1UL << PG_private | 1UL << PG_private_2)
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -914,6 +914,10 @@ struct task_struct {
+ #ifdef CONFIG_MEMCG
+ 	unsigned			in_user_fault:1;
+ #endif
++#ifdef CONFIG_LRU_GEN
++	/* whether the LRU algorithm may apply to this access */
++	unsigned			in_lru_fault:1;
++#endif
+ #ifdef CONFIG_COMPAT_BRK
+ 	unsigned			brk_randomized:1;
+ #endif
+--- a/kernel/bounds.c
++++ b/kernel/bounds.c
+@@ -22,6 +22,11 @@ int main(void)
+ 	DEFINE(NR_CPUS_BITS, ilog2(CONFIG_NR_CPUS));
+ #endif
+ 	DEFINE(SPINLOCK_SIZE, sizeof(spinlock_t));
++#ifdef CONFIG_LRU_GEN
++	DEFINE(LRU_GEN_WIDTH, order_base_2(MAX_NR_GENS + 1));
++#else
++	DEFINE(LRU_GEN_WIDTH, 0);
++#endif
+ 	/* End of constants */
+ 
+ 	return 0;
+--- a/mm/Kconfig
++++ b/mm/Kconfig
+@@ -1124,6 +1124,14 @@ config PTE_MARKER_UFFD_WP
+ 	  purposes.  It is required to enable userfaultfd write protection on
+ 	  file-backed memory types like shmem and hugetlbfs.
+ 
++config LRU_GEN
++	bool "Multi-Gen LRU"
++	depends on MMU
++	# make sure folio->flags has enough spare bits
++	depends on 64BIT || !SPARSEMEM || SPARSEMEM_VMEMMAP
++	help
++	  A high performance LRU implementation to overcommit memory.
++
+ source "mm/damon/Kconfig"
+ 
+ endmenu
+--- a/mm/huge_memory.c
++++ b/mm/huge_memory.c
+@@ -2438,7 +2438,8 @@ static void __split_huge_page_tail(struc
+ #ifdef CONFIG_64BIT
+ 			 (1L << PG_arch_2) |
+ #endif
+-			 (1L << PG_dirty)));
++			 (1L << PG_dirty) |
++			 LRU_GEN_MASK | LRU_REFS_MASK));
+ 
+ 	/* ->mapping in first tail page is compound_mapcount */
+ 	VM_BUG_ON_PAGE(tail > 2 && page_tail->mapping != TAIL_MAPPING,
+--- a/mm/memcontrol.c
++++ b/mm/memcontrol.c
+@@ -5170,6 +5170,7 @@ static void __mem_cgroup_free(struct mem
+ 
+ static void mem_cgroup_free(struct mem_cgroup *memcg)
+ {
++	lru_gen_exit_memcg(memcg);
+ 	memcg_wb_domain_exit(memcg);
+ 	__mem_cgroup_free(memcg);
+ }
+@@ -5228,6 +5229,7 @@ static struct mem_cgroup *mem_cgroup_all
+ 	memcg->deferred_split_queue.split_queue_len = 0;
+ #endif
+ 	idr_replace(&mem_cgroup_idr, memcg, memcg->id.id);
++	lru_gen_init_memcg(memcg);
+ 	return memcg;
+ fail:
+ 	mem_cgroup_id_remove(memcg);
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -5110,6 +5110,27 @@ static inline void mm_account_fault(stru
+ 		perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, address);
+ }
+ 
++#ifdef CONFIG_LRU_GEN
++static void lru_gen_enter_fault(struct vm_area_struct *vma)
++{
++	/* the LRU algorithm doesn't apply to sequential or random reads */
++	current->in_lru_fault = !(vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ));
++}
++
++static void lru_gen_exit_fault(void)
++{
++	current->in_lru_fault = false;
++}
++#else
++static void lru_gen_enter_fault(struct vm_area_struct *vma)
++{
++}
++
++static void lru_gen_exit_fault(void)
++{
++}
++#endif /* CONFIG_LRU_GEN */
++
+ /*
+  * By the time we get here, we already hold the mm semaphore
+  *
+@@ -5141,11 +5162,15 @@ vm_fault_t handle_mm_fault(struct vm_are
+ 	if (flags & FAULT_FLAG_USER)
+ 		mem_cgroup_enter_user_fault();
+ 
++	lru_gen_enter_fault(vma);
++
+ 	if (unlikely(is_vm_hugetlb_page(vma)))
+ 		ret = hugetlb_fault(vma->vm_mm, vma, address, flags);
+ 	else
+ 		ret = __handle_mm_fault(vma, address, flags);
+ 
++	lru_gen_exit_fault();
++
+ 	if (flags & FAULT_FLAG_USER) {
+ 		mem_cgroup_exit_user_fault();
+ 		/*
+--- a/mm/mm_init.c
++++ b/mm/mm_init.c
+@@ -65,14 +65,16 @@ void __init mminit_verify_pageflags_layo
+ 
+ 	shift = 8 * sizeof(unsigned long);
+ 	width = shift - SECTIONS_WIDTH - NODES_WIDTH - ZONES_WIDTH
+-		- LAST_CPUPID_SHIFT - KASAN_TAG_WIDTH;
++		- LAST_CPUPID_SHIFT - KASAN_TAG_WIDTH - LRU_GEN_WIDTH - LRU_REFS_WIDTH;
+ 	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_widths",
+-		"Section %d Node %d Zone %d Lastcpupid %d Kasantag %d Flags %d\n",
++		"Section %d Node %d Zone %d Lastcpupid %d Kasantag %d Gen %d Tier %d Flags %d\n",
+ 		SECTIONS_WIDTH,
+ 		NODES_WIDTH,
+ 		ZONES_WIDTH,
+ 		LAST_CPUPID_WIDTH,
+ 		KASAN_TAG_WIDTH,
++		LRU_GEN_WIDTH,
++		LRU_REFS_WIDTH,
+ 		NR_PAGEFLAGS);
+ 	mminit_dprintk(MMINIT_TRACE, "pageflags_layout_shifts",
+ 		"Section %d Node %d Zone %d Lastcpupid %d Kasantag %d\n",
+--- a/mm/mmzone.c
++++ b/mm/mmzone.c
+@@ -88,6 +88,8 @@ void lruvec_init(struct lruvec *lruvec)
+ 	 * Poison its list head, so that any operations on it would crash.
+ 	 */
+ 	list_del(&lruvec->lists[LRU_UNEVICTABLE]);
++
++	lru_gen_init_lruvec(lruvec);
+ }
+ 
+ #if defined(CONFIG_NUMA_BALANCING) && !defined(LAST_CPUPID_NOT_IN_PAGE_FLAGS)
+--- a/mm/swap.c
++++ b/mm/swap.c
+@@ -484,6 +484,11 @@ void folio_add_lru(struct folio *folio)
+ 			folio_test_unevictable(folio), folio);
+ 	VM_BUG_ON_FOLIO(folio_test_lru(folio), folio);
+ 
++	/* see the comment in lru_gen_add_folio() */
++	if (lru_gen_enabled() && !folio_test_unevictable(folio) &&
++	    lru_gen_in_fault() && !(current->flags & PF_MEMALLOC))
++		folio_set_active(folio);
++
+ 	folio_get(folio);
+ 	local_lock(&cpu_fbatches.lock);
+ 	fbatch = this_cpu_ptr(&cpu_fbatches.lru_add);
+@@ -575,7 +580,7 @@ static void lru_deactivate_file_fn(struc
+ 
+ static void lru_deactivate_fn(struct lruvec *lruvec, struct folio *folio)
+ {
+-	if (folio_test_active(folio) && !folio_test_unevictable(folio)) {
++	if (!folio_test_unevictable(folio) && (folio_test_active(folio) || lru_gen_enabled())) {
+ 		long nr_pages = folio_nr_pages(folio);
+ 
+ 		lruvec_del_folio(lruvec, folio);
+@@ -688,8 +693,8 @@ void deactivate_page(struct page *page)
+ {
+ 	struct folio *folio = page_folio(page);
+ 
+-	if (folio_test_lru(folio) && folio_test_active(folio) &&
+-	    !folio_test_unevictable(folio)) {
++	if (folio_test_lru(folio) && !folio_test_unevictable(folio) &&
++	    (folio_test_active(folio) || lru_gen_enabled())) {
+ 		struct folio_batch *fbatch;
+ 
+ 		folio_get(folio);
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -3050,6 +3050,81 @@ static bool can_age_anon_pages(struct pg
+ 	return can_demote(pgdat->node_id, sc);
+ }
+ 
++#ifdef CONFIG_LRU_GEN
++
++/******************************************************************************
++ *                          shorthand helpers
++ ******************************************************************************/
++
++#define for_each_gen_type_zone(gen, type, zone)				\
++	for ((gen) = 0; (gen) < MAX_NR_GENS; (gen)++)			\
++		for ((type) = 0; (type) < ANON_AND_FILE; (type)++)	\
++			for ((zone) = 0; (zone) < MAX_NR_ZONES; (zone)++)
++
++static struct lruvec __maybe_unused *get_lruvec(struct mem_cgroup *memcg, int nid)
++{
++	struct pglist_data *pgdat = NODE_DATA(nid);
++
++#ifdef CONFIG_MEMCG
++	if (memcg) {
++		struct lruvec *lruvec = &memcg->nodeinfo[nid]->lruvec;
++
++		/* for hotadd_new_pgdat() */
++		if (!lruvec->pgdat)
++			lruvec->pgdat = pgdat;
++
++		return lruvec;
++	}
++#endif
++	VM_WARN_ON_ONCE(!mem_cgroup_disabled());
++
++	return pgdat ? &pgdat->__lruvec : NULL;
++}
++
++/******************************************************************************
++ *                          initialization
++ ******************************************************************************/
++
++void lru_gen_init_lruvec(struct lruvec *lruvec)
++{
++	int gen, type, zone;
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++
++	lrugen->max_seq = MIN_NR_GENS + 1;
++
++	for_each_gen_type_zone(gen, type, zone)
++		INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]);
++}
++
++#ifdef CONFIG_MEMCG
++void lru_gen_init_memcg(struct mem_cgroup *memcg)
++{
++}
++
++void lru_gen_exit_memcg(struct mem_cgroup *memcg)
++{
++	int nid;
++
++	for_each_node(nid) {
++		struct lruvec *lruvec = get_lruvec(memcg, nid);
++
++		VM_WARN_ON_ONCE(memchr_inv(lruvec->lrugen.nr_pages, 0,
++					   sizeof(lruvec->lrugen.nr_pages)));
++	}
++}
++#endif
++
++static int __init init_lru_gen(void)
++{
++	BUILD_BUG_ON(MIN_NR_GENS + 1 >= MAX_NR_GENS);
++	BUILD_BUG_ON(BIT(LRU_GEN_WIDTH) <= MAX_NR_GENS);
++
++	return 0;
++};
++late_initcall(init_lru_gen);
++
++#endif /* CONFIG_LRU_GEN */
++
+ static void shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
+ {
+ 	unsigned long nr[NR_LRU_LISTS];
diff --git a/target/linux/generic/backport-6.0/105-mm-multi-gen-LRU-minimal-implementation.patch b/target/linux/generic/backport-6.0/105-mm-multi-gen-LRU-minimal-implementation.patch
new file mode 100644
index 000000000..0952c9704
--- /dev/null
+++ b/target/linux/generic/backport-6.0/105-mm-multi-gen-LRU-minimal-implementation.patch
@@ -0,0 +1,1425 @@
+From b676b5241d96d7fb2bf298190e750c6099cc0313 Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Thu, 27 Jan 2022 20:32:37 -0700
+Subject: [PATCH 06/14] mm: multi-gen LRU: minimal implementation
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+To avoid confusion, the terms "promotion" and "demotion" will be
+applied to the multi-gen LRU, as a new convention; the terms
+"activation" and "deactivation" will be applied to the active/inactive
+LRU, as usual.
+
+The aging produces young generations. Given an lruvec, it increments
+max_seq when max_seq-min_seq+1 approaches MIN_NR_GENS. The aging
+promotes hot pages to the youngest generation when it finds them
+accessed through page tables; the demotion of cold pages happens
+consequently when it increments max_seq. Promotion in the aging path
+does not involve any LRU list operations, only the updates of the gen
+counter and lrugen->nr_pages[]; demotion, unless as the result of the
+increment of max_seq, requires LRU list operations, e.g.,
+lru_deactivate_fn(). The aging has the complexity O(nr_hot_pages),
+since it is only interested in hot pages.
+
+The eviction consumes old generations. Given an lruvec, it increments
+min_seq when lrugen->lists[] indexed by min_seq%MAX_NR_GENS becomes
+empty. A feedback loop modeled after the PID controller monitors
+refaults over anon and file types and decides which type to evict when
+both types are available from the same generation.
+
+The protection of pages accessed multiple times through file
+descriptors takes place in the eviction path. Each generation is
+divided into multiple tiers. A page accessed N times through file
+descriptors is in tier order_base_2(N). Tiers do not have dedicated
+lrugen->lists[], only bits in folio->flags. The aforementioned
+feedback loop also monitors refaults over all tiers and decides when
+to protect pages in which tiers (N>1), using the first tier (N=0,1) as
+a baseline. The first tier contains single-use unmapped clean pages,
+which are most likely the best choices. In contrast to promotion in
+the aging path, the protection of a page in the eviction path is
+achieved by moving this page to the next generation, i.e., min_seq+1,
+if the feedback loop decides so. This approach has the following
+advantages:
+1. It removes the cost of activation in the buffered access path by
+   inferring whether pages accessed multiple times through file
+   descriptors are statistically hot and thus worth protecting in the
+   eviction path.
+2. It takes pages accessed through page tables into account and avoids
+   overprotecting pages accessed multiple times through file
+   descriptors. (Pages accessed through page tables are in the first
+   tier, since N=0.)
+3. More tiers provide better protection for pages accessed more than
+   twice through file descriptors, when under heavy buffered I/O
+   workloads.
+
+Server benchmark results:
+  Single workload:
+    fio (buffered I/O): +[30, 32]%
+                IOPS         BW
+      5.19-rc1: 2673k        10.2GiB/s
+      patch1-6: 3491k        13.3GiB/s
+
+  Single workload:
+    memcached (anon): -[4, 6]%
+                Ops/sec      KB/sec
+      5.19-rc1: 1161501.04   45177.25
+      patch1-6: 1106168.46   43025.04
+
+  Configurations:
+    CPU: two Xeon 6154
+    Mem: total 256G
+
+    Node 1 was only used as a ram disk to reduce the variance in the
+    results.
+
+    patch drivers/block/brd.c <<EOF
+    99,100c99,100
+    < 	gfp_flags = GFP_NOIO | __GFP_ZERO | __GFP_HIGHMEM;
+    < 	page = alloc_page(gfp_flags);
+    ---
+    > 	gfp_flags = GFP_NOIO | __GFP_ZERO | __GFP_HIGHMEM | __GFP_THISNODE;
+    > 	page = alloc_pages_node(1, gfp_flags, 0);
+    EOF
+
+    cat >>/etc/systemd/system.conf <<EOF
+    CPUAffinity=numa
+    NUMAPolicy=bind
+    NUMAMask=0
+    EOF
+
+    cat >>/etc/memcached.conf <<EOF
+    -m 184320
+    -s /var/run/memcached/memcached.sock
+    -a 0766
+    -t 36
+    -B binary
+    EOF
+
+    cat fio.sh
+    modprobe brd rd_nr=1 rd_size=113246208
+    swapoff -a
+    mkfs.ext4 /dev/ram0
+    mount -t ext4 /dev/ram0 /mnt
+
+    mkdir /sys/fs/cgroup/user.slice/test
+    echo 38654705664 >/sys/fs/cgroup/user.slice/test/memory.max
+    echo $$ >/sys/fs/cgroup/user.slice/test/cgroup.procs
+    fio -name=mglru --numjobs=72 --directory=/mnt --size=1408m \
+      --buffered=1 --ioengine=io_uring --iodepth=128 \
+      --iodepth_batch_submit=32 --iodepth_batch_complete=32 \
+      --rw=randread --random_distribution=random --norandommap \
+      --time_based --ramp_time=10m --runtime=5m --group_reporting
+
+    cat memcached.sh
+    modprobe brd rd_nr=1 rd_size=113246208
+    swapoff -a
+    mkswap /dev/ram0
+    swapon /dev/ram0
+
+    memtier_benchmark -S /var/run/memcached/memcached.sock \
+      -P memcache_binary -n allkeys --key-minimum=1 \
+      --key-maximum=65000000 --key-pattern=P:P -c 1 -t 36 \
+      --ratio 1:0 --pipeline 8 -d 2000
+
+    memtier_benchmark -S /var/run/memcached/memcached.sock \
+      -P memcache_binary -n allkeys --key-minimum=1 \
+      --key-maximum=65000000 --key-pattern=R:R -c 1 -t 36 \
+      --ratio 0:1 --pipeline 8 --randomize --distinct-client-seed
+
+Client benchmark results:
+  kswapd profiles:
+    5.19-rc1
+      40.33%  page_vma_mapped_walk (overhead)
+      21.80%  lzo1x_1_do_compress (real work)
+       7.53%  do_raw_spin_lock
+       3.95%  _raw_spin_unlock_irq
+       2.52%  vma_interval_tree_iter_next
+       2.37%  folio_referenced_one
+       2.28%  vma_interval_tree_subtree_search
+       1.97%  anon_vma_interval_tree_iter_first
+       1.60%  ptep_clear_flush
+       1.06%  __zram_bvec_write
+
+    patch1-6
+      39.03%  lzo1x_1_do_compress (real work)
+      18.47%  page_vma_mapped_walk (overhead)
+       6.74%  _raw_spin_unlock_irq
+       3.97%  do_raw_spin_lock
+       2.49%  ptep_clear_flush
+       2.48%  anon_vma_interval_tree_iter_first
+       1.92%  folio_referenced_one
+       1.88%  __zram_bvec_write
+       1.48%  memmove
+       1.31%  vma_interval_tree_iter_next
+
+  Configurations:
+    CPU: single Snapdragon 7c
+    Mem: total 4G
+
+    ChromeOS MemoryPressure [1]
+
+[1] https://chromium.googlesource.com/chromiumos/platform/tast-tests/
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: Id47465f46f1f77f1e9f0be3972e380ddcfa37cc0
+---
+ include/linux/mm_inline.h         |  36 ++
+ include/linux/mmzone.h            |  41 ++
+ include/linux/page-flags-layout.h |   5 +-
+ kernel/bounds.c                   |   2 +
+ mm/Kconfig                        |  11 +
+ mm/swap.c                         |  39 ++
+ mm/vmscan.c                       | 792 +++++++++++++++++++++++++++++-
+ mm/workingset.c                   | 110 ++++-
+ 8 files changed, 1025 insertions(+), 11 deletions(-)
+
+--- a/include/linux/mm_inline.h
++++ b/include/linux/mm_inline.h
+@@ -121,6 +121,33 @@ static inline int lru_gen_from_seq(unsig
+ 	return seq % MAX_NR_GENS;
+ }
+ 
++static inline int lru_hist_from_seq(unsigned long seq)
++{
++	return seq % NR_HIST_GENS;
++}
++
++static inline int lru_tier_from_refs(int refs)
++{
++	VM_WARN_ON_ONCE(refs > BIT(LRU_REFS_WIDTH));
++
++	/* see the comment in folio_lru_refs() */
++	return order_base_2(refs + 1);
++}
++
++static inline int folio_lru_refs(struct folio *folio)
++{
++	unsigned long flags = READ_ONCE(folio->flags);
++	bool workingset = flags & BIT(PG_workingset);
++
++	/*
++	 * Return the number of accesses beyond PG_referenced, i.e., N-1 if the
++	 * total number of accesses is N>1, since N=0,1 both map to the first
++	 * tier. lru_tier_from_refs() will account for this off-by-one. Also see
++	 * the comment on MAX_NR_TIERS.
++	 */
++	return ((flags & LRU_REFS_MASK) >> LRU_REFS_PGOFF) + workingset;
++}
++
+ static inline int folio_lru_gen(struct folio *folio)
+ {
+ 	unsigned long flags = READ_ONCE(folio->flags);
+@@ -173,6 +200,15 @@ static inline void lru_gen_update_size(s
+ 		__update_lru_size(lruvec, lru, zone, -delta);
+ 		return;
+ 	}
++
++	/* promotion */
++	if (!lru_gen_is_active(lruvec, old_gen) && lru_gen_is_active(lruvec, new_gen)) {
++		__update_lru_size(lruvec, lru, zone, -delta);
++		__update_lru_size(lruvec, lru + LRU_ACTIVE, zone, delta);
++	}
++
++	/* demotion requires isolation, e.g., lru_deactivate_fn() */
++	VM_WARN_ON_ONCE(lru_gen_is_active(lruvec, old_gen) && !lru_gen_is_active(lruvec, new_gen));
+ }
+ 
+ static inline bool lru_gen_add_folio(struct lruvec *lruvec, struct folio *folio, bool reclaiming)
+--- a/include/linux/mmzone.h
++++ b/include/linux/mmzone.h
+@@ -347,6 +347,28 @@ enum lruvec_flags {
+ #define MIN_NR_GENS		2U
+ #define MAX_NR_GENS		4U
+ 
++/*
++ * Each generation is divided into multiple tiers. A page accessed N times
++ * through file descriptors is in tier order_base_2(N). A page in the first tier
++ * (N=0,1) is marked by PG_referenced unless it was faulted in through page
++ * tables or read ahead. A page in any other tier (N>1) is marked by
++ * PG_referenced and PG_workingset. This implies a minimum of two tiers is
++ * supported without using additional bits in folio->flags.
++ *
++ * In contrast to moving across generations which requires the LRU lock, moving
++ * across tiers only involves atomic operations on folio->flags and therefore
++ * has a negligible cost in the buffered access path. In the eviction path,
++ * comparisons of refaulted/(evicted+protected) from the first tier and the
++ * rest infer whether pages accessed multiple times through file descriptors
++ * are statistically hot and thus worth protecting.
++ *
++ * MAX_NR_TIERS is set to 4 so that the multi-gen LRU can support twice the
++ * number of categories of the active/inactive LRU when keeping track of
++ * accesses through file descriptors. This uses MAX_NR_TIERS-2 spare bits in
++ * folio->flags.
++ */
++#define MAX_NR_TIERS		4U
++
+ #ifndef __GENERATING_BOUNDS_H
+ 
+ struct lruvec;
+@@ -361,6 +383,16 @@ enum {
+ 	LRU_GEN_FILE,
+ };
+ 
++#define MIN_LRU_BATCH		BITS_PER_LONG
++#define MAX_LRU_BATCH		(MIN_LRU_BATCH * 64)
++
++/* whether to keep historical stats from evicted generations */
++#ifdef CONFIG_LRU_GEN_STATS
++#define NR_HIST_GENS		MAX_NR_GENS
++#else
++#define NR_HIST_GENS		1U
++#endif
++
+ /*
+  * The youngest generation number is stored in max_seq for both anon and file
+  * types as they are aged on an equal footing. The oldest generation numbers are
+@@ -383,6 +415,15 @@ struct lru_gen_struct {
+ 	struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES];
+ 	/* the multi-gen LRU sizes, eventually consistent */
+ 	long nr_pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES];
++	/* the exponential moving average of refaulted */
++	unsigned long avg_refaulted[ANON_AND_FILE][MAX_NR_TIERS];
++	/* the exponential moving average of evicted+protected */
++	unsigned long avg_total[ANON_AND_FILE][MAX_NR_TIERS];
++	/* the first tier doesn't need protection, hence the minus one */
++	unsigned long protected[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS - 1];
++	/* can be modified without holding the LRU lock */
++	atomic_long_t evicted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS];
++	atomic_long_t refaulted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS];
+ };
+ 
+ void lru_gen_init_lruvec(struct lruvec *lruvec);
+--- a/include/linux/page-flags-layout.h
++++ b/include/linux/page-flags-layout.h
+@@ -106,7 +106,10 @@
+ #error "Not enough bits in page flags"
+ #endif
+ 
+-#define LRU_REFS_WIDTH	0
++/* see the comment on MAX_NR_TIERS */
++#define LRU_REFS_WIDTH	min(__LRU_REFS_WIDTH, BITS_PER_LONG - NR_PAGEFLAGS - \
++			    ZONES_WIDTH - LRU_GEN_WIDTH - SECTIONS_WIDTH - \
++			    NODES_WIDTH - KASAN_TAG_WIDTH - LAST_CPUPID_WIDTH)
+ 
+ #endif
+ #endif /* _LINUX_PAGE_FLAGS_LAYOUT */
+--- a/kernel/bounds.c
++++ b/kernel/bounds.c
+@@ -24,8 +24,10 @@ int main(void)
+ 	DEFINE(SPINLOCK_SIZE, sizeof(spinlock_t));
+ #ifdef CONFIG_LRU_GEN
+ 	DEFINE(LRU_GEN_WIDTH, order_base_2(MAX_NR_GENS + 1));
++	DEFINE(__LRU_REFS_WIDTH, MAX_NR_TIERS - 2);
+ #else
+ 	DEFINE(LRU_GEN_WIDTH, 0);
++	DEFINE(__LRU_REFS_WIDTH, 0);
+ #endif
+ 	/* End of constants */
+ 
+--- a/mm/Kconfig
++++ b/mm/Kconfig
+@@ -1124,6 +1124,7 @@ config PTE_MARKER_UFFD_WP
+ 	  purposes.  It is required to enable userfaultfd write protection on
+ 	  file-backed memory types like shmem and hugetlbfs.
+ 
++# multi-gen LRU {
+ config LRU_GEN
+ 	bool "Multi-Gen LRU"
+ 	depends on MMU
+@@ -1132,6 +1133,16 @@ config LRU_GEN
+ 	help
+ 	  A high performance LRU implementation to overcommit memory.
+ 
++config LRU_GEN_STATS
++	bool "Full stats for debugging"
++	depends on LRU_GEN
++	help
++	  Do not enable this option unless you plan to look at historical stats
++	  from evicted generations for debugging purpose.
++
++	  This option has a per-memcg and per-node memory overhead.
++# }
++
+ source "mm/damon/Kconfig"
+ 
+ endmenu
+--- a/mm/swap.c
++++ b/mm/swap.c
+@@ -428,6 +428,40 @@ static void __lru_cache_activate_folio(s
+ 	local_unlock(&cpu_fbatches.lock);
+ }
+ 
++#ifdef CONFIG_LRU_GEN
++static void folio_inc_refs(struct folio *folio)
++{
++	unsigned long new_flags, old_flags = READ_ONCE(folio->flags);
++
++	if (folio_test_unevictable(folio))
++		return;
++
++	if (!folio_test_referenced(folio)) {
++		folio_set_referenced(folio);
++		return;
++	}
++
++	if (!folio_test_workingset(folio)) {
++		folio_set_workingset(folio);
++		return;
++	}
++
++	/* see the comment on MAX_NR_TIERS */
++	do {
++		new_flags = old_flags & LRU_REFS_MASK;
++		if (new_flags == LRU_REFS_MASK)
++			break;
++
++		new_flags += BIT(LRU_REFS_PGOFF);
++		new_flags |= old_flags & ~LRU_REFS_MASK;
++	} while (!try_cmpxchg(&folio->flags, &old_flags, new_flags));
++}
++#else
++static void folio_inc_refs(struct folio *folio)
++{
++}
++#endif /* CONFIG_LRU_GEN */
++
+ /*
+  * Mark a page as having seen activity.
+  *
+@@ -440,6 +474,11 @@ static void __lru_cache_activate_folio(s
+  */
+ void folio_mark_accessed(struct folio *folio)
+ {
++	if (lru_gen_enabled()) {
++		folio_inc_refs(folio);
++		return;
++	}
++
+ 	if (!folio_test_referenced(folio)) {
+ 		folio_set_referenced(folio);
+ 	} else if (folio_test_unevictable(folio)) {
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -1334,9 +1334,11 @@ static int __remove_mapping(struct addre
+ 
+ 	if (folio_test_swapcache(folio)) {
+ 		swp_entry_t swap = folio_swap_entry(folio);
+-		mem_cgroup_swapout(folio, swap);
++
++		/* get a shadow entry before mem_cgroup_swapout() clears folio_memcg() */
+ 		if (reclaimed && !mapping_exiting(mapping))
+ 			shadow = workingset_eviction(folio, target_memcg);
++		mem_cgroup_swapout(folio, swap);
+ 		__delete_from_swap_cache(folio, swap, shadow);
+ 		xa_unlock_irq(&mapping->i_pages);
+ 		put_swap_page(&folio->page, swap);
+@@ -2733,6 +2735,9 @@ static void prepare_scan_count(pg_data_t
+ 	unsigned long file;
+ 	struct lruvec *target_lruvec;
+ 
++	if (lru_gen_enabled())
++		return;
++
+ 	target_lruvec = mem_cgroup_lruvec(sc->target_mem_cgroup, pgdat);
+ 
+ 	/*
+@@ -3056,6 +3061,17 @@ static bool can_age_anon_pages(struct pg
+  *                          shorthand helpers
+  ******************************************************************************/
+ 
++#define LRU_REFS_FLAGS	(BIT(PG_referenced) | BIT(PG_workingset))
++
++#define DEFINE_MAX_SEQ(lruvec)						\
++	unsigned long max_seq = READ_ONCE((lruvec)->lrugen.max_seq)
++
++#define DEFINE_MIN_SEQ(lruvec)						\
++	unsigned long min_seq[ANON_AND_FILE] = {			\
++		READ_ONCE((lruvec)->lrugen.min_seq[LRU_GEN_ANON]),	\
++		READ_ONCE((lruvec)->lrugen.min_seq[LRU_GEN_FILE]),	\
++	}
++
+ #define for_each_gen_type_zone(gen, type, zone)				\
+ 	for ((gen) = 0; (gen) < MAX_NR_GENS; (gen)++)			\
+ 		for ((type) = 0; (type) < ANON_AND_FILE; (type)++)	\
+@@ -3081,6 +3097,745 @@ static struct lruvec __maybe_unused *get
+ 	return pgdat ? &pgdat->__lruvec : NULL;
+ }
+ 
++static int get_swappiness(struct lruvec *lruvec, struct scan_control *sc)
++{
++	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
++	struct pglist_data *pgdat = lruvec_pgdat(lruvec);
++
++	if (!can_demote(pgdat->node_id, sc) &&
++	    mem_cgroup_get_nr_swap_pages(memcg) < MIN_LRU_BATCH)
++		return 0;
++
++	return mem_cgroup_swappiness(memcg);
++}
++
++static int get_nr_gens(struct lruvec *lruvec, int type)
++{
++	return lruvec->lrugen.max_seq - lruvec->lrugen.min_seq[type] + 1;
++}
++
++static bool __maybe_unused seq_is_valid(struct lruvec *lruvec)
++{
++	/* see the comment on lru_gen_struct */
++	return get_nr_gens(lruvec, LRU_GEN_FILE) >= MIN_NR_GENS &&
++	       get_nr_gens(lruvec, LRU_GEN_FILE) <= get_nr_gens(lruvec, LRU_GEN_ANON) &&
++	       get_nr_gens(lruvec, LRU_GEN_ANON) <= MAX_NR_GENS;
++}
++
++/******************************************************************************
++ *                          refault feedback loop
++ ******************************************************************************/
++
++/*
++ * A feedback loop based on Proportional-Integral-Derivative (PID) controller.
++ *
++ * The P term is refaulted/(evicted+protected) from a tier in the generation
++ * currently being evicted; the I term is the exponential moving average of the
++ * P term over the generations previously evicted, using the smoothing factor
++ * 1/2; the D term isn't supported.
++ *
++ * The setpoint (SP) is always the first tier of one type; the process variable
++ * (PV) is either any tier of the other type or any other tier of the same
++ * type.
++ *
++ * The error is the difference between the SP and the PV; the correction is to
++ * turn off protection when SP>PV or turn on protection when SP<PV.
++ *
++ * For future optimizations:
++ * 1. The D term may discount the other two terms over time so that long-lived
++ *    generations can resist stale information.
++ */
++struct ctrl_pos {
++	unsigned long refaulted;
++	unsigned long total;
++	int gain;
++};
++
++static void read_ctrl_pos(struct lruvec *lruvec, int type, int tier, int gain,
++			  struct ctrl_pos *pos)
++{
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++	int hist = lru_hist_from_seq(lrugen->min_seq[type]);
++
++	pos->refaulted = lrugen->avg_refaulted[type][tier] +
++			 atomic_long_read(&lrugen->refaulted[hist][type][tier]);
++	pos->total = lrugen->avg_total[type][tier] +
++		     atomic_long_read(&lrugen->evicted[hist][type][tier]);
++	if (tier)
++		pos->total += lrugen->protected[hist][type][tier - 1];
++	pos->gain = gain;
++}
++
++static void reset_ctrl_pos(struct lruvec *lruvec, int type, bool carryover)
++{
++	int hist, tier;
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++	bool clear = carryover ? NR_HIST_GENS == 1 : NR_HIST_GENS > 1;
++	unsigned long seq = carryover ? lrugen->min_seq[type] : lrugen->max_seq + 1;
++
++	lockdep_assert_held(&lruvec->lru_lock);
++
++	if (!carryover && !clear)
++		return;
++
++	hist = lru_hist_from_seq(seq);
++
++	for (tier = 0; tier < MAX_NR_TIERS; tier++) {
++		if (carryover) {
++			unsigned long sum;
++
++			sum = lrugen->avg_refaulted[type][tier] +
++			      atomic_long_read(&lrugen->refaulted[hist][type][tier]);
++			WRITE_ONCE(lrugen->avg_refaulted[type][tier], sum / 2);
++
++			sum = lrugen->avg_total[type][tier] +
++			      atomic_long_read(&lrugen->evicted[hist][type][tier]);
++			if (tier)
++				sum += lrugen->protected[hist][type][tier - 1];
++			WRITE_ONCE(lrugen->avg_total[type][tier], sum / 2);
++		}
++
++		if (clear) {
++			atomic_long_set(&lrugen->refaulted[hist][type][tier], 0);
++			atomic_long_set(&lrugen->evicted[hist][type][tier], 0);
++			if (tier)
++				WRITE_ONCE(lrugen->protected[hist][type][tier - 1], 0);
++		}
++	}
++}
++
++static bool positive_ctrl_err(struct ctrl_pos *sp, struct ctrl_pos *pv)
++{
++	/*
++	 * Return true if the PV has a limited number of refaults or a lower
++	 * refaulted/total than the SP.
++	 */
++	return pv->refaulted < MIN_LRU_BATCH ||
++	       pv->refaulted * (sp->total + MIN_LRU_BATCH) * sp->gain <=
++	       (sp->refaulted + 1) * pv->total * pv->gain;
++}
++
++/******************************************************************************
++ *                          the aging
++ ******************************************************************************/
++
++/* protect pages accessed multiple times through file descriptors */
++static int folio_inc_gen(struct lruvec *lruvec, struct folio *folio, bool reclaiming)
++{
++	int type = folio_is_file_lru(folio);
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++	int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]);
++	unsigned long new_flags, old_flags = READ_ONCE(folio->flags);
++
++	VM_WARN_ON_ONCE_FOLIO(!(old_flags & LRU_GEN_MASK), folio);
++
++	do {
++		new_gen = (old_gen + 1) % MAX_NR_GENS;
++
++		new_flags = old_flags & ~(LRU_GEN_MASK | LRU_REFS_MASK | LRU_REFS_FLAGS);
++		new_flags |= (new_gen + 1UL) << LRU_GEN_PGOFF;
++		/* for folio_end_writeback() */
++		if (reclaiming)
++			new_flags |= BIT(PG_reclaim);
++	} while (!try_cmpxchg(&folio->flags, &old_flags, new_flags));
++
++	lru_gen_update_size(lruvec, folio, old_gen, new_gen);
++
++	return new_gen;
++}
++
++static void inc_min_seq(struct lruvec *lruvec, int type)
++{
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++
++	reset_ctrl_pos(lruvec, type, true);
++	WRITE_ONCE(lrugen->min_seq[type], lrugen->min_seq[type] + 1);
++}
++
++static bool try_to_inc_min_seq(struct lruvec *lruvec, bool can_swap)
++{
++	int gen, type, zone;
++	bool success = false;
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++	DEFINE_MIN_SEQ(lruvec);
++
++	VM_WARN_ON_ONCE(!seq_is_valid(lruvec));
++
++	/* find the oldest populated generation */
++	for (type = !can_swap; type < ANON_AND_FILE; type++) {
++		while (min_seq[type] + MIN_NR_GENS <= lrugen->max_seq) {
++			gen = lru_gen_from_seq(min_seq[type]);
++
++			for (zone = 0; zone < MAX_NR_ZONES; zone++) {
++				if (!list_empty(&lrugen->lists[gen][type][zone]))
++					goto next;
++			}
++
++			min_seq[type]++;
++		}
++next:
++		;
++	}
++
++	/* see the comment on lru_gen_struct */
++	if (can_swap) {
++		min_seq[LRU_GEN_ANON] = min(min_seq[LRU_GEN_ANON], min_seq[LRU_GEN_FILE]);
++		min_seq[LRU_GEN_FILE] = max(min_seq[LRU_GEN_ANON], lrugen->min_seq[LRU_GEN_FILE]);
++	}
++
++	for (type = !can_swap; type < ANON_AND_FILE; type++) {
++		if (min_seq[type] == lrugen->min_seq[type])
++			continue;
++
++		reset_ctrl_pos(lruvec, type, true);
++		WRITE_ONCE(lrugen->min_seq[type], min_seq[type]);
++		success = true;
++	}
++
++	return success;
++}
++
++static void inc_max_seq(struct lruvec *lruvec, unsigned long max_seq, bool can_swap)
++{
++	int prev, next;
++	int type, zone;
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++
++	spin_lock_irq(&lruvec->lru_lock);
++
++	VM_WARN_ON_ONCE(!seq_is_valid(lruvec));
++
++	if (max_seq != lrugen->max_seq)
++		goto unlock;
++
++	for (type = ANON_AND_FILE - 1; type >= 0; type--) {
++		if (get_nr_gens(lruvec, type) != MAX_NR_GENS)
++			continue;
++
++		VM_WARN_ON_ONCE(type == LRU_GEN_FILE || can_swap);
++
++		inc_min_seq(lruvec, type);
++	}
++
++	/*
++	 * Update the active/inactive LRU sizes for compatibility. Both sides of
++	 * the current max_seq need to be covered, since max_seq+1 can overlap
++	 * with min_seq[LRU_GEN_ANON] if swapping is constrained. And if they do
++	 * overlap, cold/hot inversion happens.
++	 */
++	prev = lru_gen_from_seq(lrugen->max_seq - 1);
++	next = lru_gen_from_seq(lrugen->max_seq + 1);
++
++	for (type = 0; type < ANON_AND_FILE; type++) {
++		for (zone = 0; zone < MAX_NR_ZONES; zone++) {
++			enum lru_list lru = type * LRU_INACTIVE_FILE;
++			long delta = lrugen->nr_pages[prev][type][zone] -
++				     lrugen->nr_pages[next][type][zone];
++
++			if (!delta)
++				continue;
++
++			__update_lru_size(lruvec, lru, zone, delta);
++			__update_lru_size(lruvec, lru + LRU_ACTIVE, zone, -delta);
++		}
++	}
++
++	for (type = 0; type < ANON_AND_FILE; type++)
++		reset_ctrl_pos(lruvec, type, false);
++
++	/* make sure preceding modifications appear */
++	smp_store_release(&lrugen->max_seq, lrugen->max_seq + 1);
++unlock:
++	spin_unlock_irq(&lruvec->lru_lock);
++}
++
++static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq, unsigned long *min_seq,
++			     struct scan_control *sc, bool can_swap, unsigned long *nr_to_scan)
++{
++	int gen, type, zone;
++	unsigned long old = 0;
++	unsigned long young = 0;
++	unsigned long total = 0;
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
++
++	for (type = !can_swap; type < ANON_AND_FILE; type++) {
++		unsigned long seq;
++
++		for (seq = min_seq[type]; seq <= max_seq; seq++) {
++			unsigned long size = 0;
++
++			gen = lru_gen_from_seq(seq);
++
++			for (zone = 0; zone < MAX_NR_ZONES; zone++)
++				size += max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L);
++
++			total += size;
++			if (seq == max_seq)
++				young += size;
++			else if (seq + MIN_NR_GENS == max_seq)
++				old += size;
++		}
++	}
++
++	/* try to scrape all its memory if this memcg was deleted */
++	*nr_to_scan = mem_cgroup_online(memcg) ? (total >> sc->priority) : total;
++
++	/*
++	 * The aging tries to be lazy to reduce the overhead, while the eviction
++	 * stalls when the number of generations reaches MIN_NR_GENS. Hence, the
++	 * ideal number of generations is MIN_NR_GENS+1.
++	 */
++	if (min_seq[!can_swap] + MIN_NR_GENS > max_seq)
++		return true;
++	if (min_seq[!can_swap] + MIN_NR_GENS < max_seq)
++		return false;
++
++	/*
++	 * It's also ideal to spread pages out evenly, i.e., 1/(MIN_NR_GENS+1)
++	 * of the total number of pages for each generation. A reasonable range
++	 * for this average portion is [1/MIN_NR_GENS, 1/(MIN_NR_GENS+2)]. The
++	 * aging cares about the upper bound of hot pages, while the eviction
++	 * cares about the lower bound of cold pages.
++	 */
++	if (young * MIN_NR_GENS > total)
++		return true;
++	if (old * (MIN_NR_GENS + 2) < total)
++		return true;
++
++	return false;
++}
++
++static void age_lruvec(struct lruvec *lruvec, struct scan_control *sc)
++{
++	bool need_aging;
++	unsigned long nr_to_scan;
++	int swappiness = get_swappiness(lruvec, sc);
++	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
++	DEFINE_MAX_SEQ(lruvec);
++	DEFINE_MIN_SEQ(lruvec);
++
++	VM_WARN_ON_ONCE(sc->memcg_low_reclaim);
++
++	mem_cgroup_calculate_protection(NULL, memcg);
++
++	if (mem_cgroup_below_min(memcg))
++		return;
++
++	need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, swappiness, &nr_to_scan);
++	if (need_aging)
++		inc_max_seq(lruvec, max_seq, swappiness);
++}
++
++static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc)
++{
++	struct mem_cgroup *memcg;
++
++	VM_WARN_ON_ONCE(!current_is_kswapd());
++
++	memcg = mem_cgroup_iter(NULL, NULL, NULL);
++	do {
++		struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat);
++
++		age_lruvec(lruvec, sc);
++
++		cond_resched();
++	} while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)));
++}
++
++/******************************************************************************
++ *                          the eviction
++ ******************************************************************************/
++
++static bool sort_folio(struct lruvec *lruvec, struct folio *folio, int tier_idx)
++{
++	bool success;
++	int gen = folio_lru_gen(folio);
++	int type = folio_is_file_lru(folio);
++	int zone = folio_zonenum(folio);
++	int delta = folio_nr_pages(folio);
++	int refs = folio_lru_refs(folio);
++	int tier = lru_tier_from_refs(refs);
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++
++	VM_WARN_ON_ONCE_FOLIO(gen >= MAX_NR_GENS, folio);
++
++	/* unevictable */
++	if (!folio_evictable(folio)) {
++		success = lru_gen_del_folio(lruvec, folio, true);
++		VM_WARN_ON_ONCE_FOLIO(!success, folio);
++		folio_set_unevictable(folio);
++		lruvec_add_folio(lruvec, folio);
++		__count_vm_events(UNEVICTABLE_PGCULLED, delta);
++		return true;
++	}
++
++	/* dirty lazyfree */
++	if (type == LRU_GEN_FILE && folio_test_anon(folio) && folio_test_dirty(folio)) {
++		success = lru_gen_del_folio(lruvec, folio, true);
++		VM_WARN_ON_ONCE_FOLIO(!success, folio);
++		folio_set_swapbacked(folio);
++		lruvec_add_folio_tail(lruvec, folio);
++		return true;
++	}
++
++	/* protected */
++	if (tier > tier_idx) {
++		int hist = lru_hist_from_seq(lrugen->min_seq[type]);
++
++		gen = folio_inc_gen(lruvec, folio, false);
++		list_move_tail(&folio->lru, &lrugen->lists[gen][type][zone]);
++
++		WRITE_ONCE(lrugen->protected[hist][type][tier - 1],
++			   lrugen->protected[hist][type][tier - 1] + delta);
++		__mod_lruvec_state(lruvec, WORKINGSET_ACTIVATE_BASE + type, delta);
++		return true;
++	}
++
++	/* waiting for writeback */
++	if (folio_test_locked(folio) || folio_test_writeback(folio) ||
++	    (type == LRU_GEN_FILE && folio_test_dirty(folio))) {
++		gen = folio_inc_gen(lruvec, folio, true);
++		list_move(&folio->lru, &lrugen->lists[gen][type][zone]);
++		return true;
++	}
++
++	return false;
++}
++
++static bool isolate_folio(struct lruvec *lruvec, struct folio *folio, struct scan_control *sc)
++{
++	bool success;
++
++	/* unmapping inhibited */
++	if (!sc->may_unmap && folio_mapped(folio))
++		return false;
++
++	/* swapping inhibited */
++	if (!(sc->may_writepage && (sc->gfp_mask & __GFP_IO)) &&
++	    (folio_test_dirty(folio) ||
++	     (folio_test_anon(folio) && !folio_test_swapcache(folio))))
++		return false;
++
++	/* raced with release_pages() */
++	if (!folio_try_get(folio))
++		return false;
++
++	/* raced with another isolation */
++	if (!folio_test_clear_lru(folio)) {
++		folio_put(folio);
++		return false;
++	}
++
++	/* see the comment on MAX_NR_TIERS */
++	if (!folio_test_referenced(folio))
++		set_mask_bits(&folio->flags, LRU_REFS_MASK | LRU_REFS_FLAGS, 0);
++
++	/* for shrink_page_list() */
++	folio_clear_reclaim(folio);
++	folio_clear_referenced(folio);
++
++	success = lru_gen_del_folio(lruvec, folio, true);
++	VM_WARN_ON_ONCE_FOLIO(!success, folio);
++
++	return true;
++}
++
++static int scan_folios(struct lruvec *lruvec, struct scan_control *sc,
++		       int type, int tier, struct list_head *list)
++{
++	int gen, zone;
++	enum vm_event_item item;
++	int sorted = 0;
++	int scanned = 0;
++	int isolated = 0;
++	int remaining = MAX_LRU_BATCH;
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
++
++	VM_WARN_ON_ONCE(!list_empty(list));
++
++	if (get_nr_gens(lruvec, type) == MIN_NR_GENS)
++		return 0;
++
++	gen = lru_gen_from_seq(lrugen->min_seq[type]);
++
++	for (zone = sc->reclaim_idx; zone >= 0; zone--) {
++		LIST_HEAD(moved);
++		int skipped = 0;
++		struct list_head *head = &lrugen->lists[gen][type][zone];
++
++		while (!list_empty(head)) {
++			struct folio *folio = lru_to_folio(head);
++			int delta = folio_nr_pages(folio);
++
++			VM_WARN_ON_ONCE_FOLIO(folio_test_unevictable(folio), folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_test_active(folio), folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_is_file_lru(folio) != type, folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_zonenum(folio) != zone, folio);
++
++			scanned += delta;
++
++			if (sort_folio(lruvec, folio, tier))
++				sorted += delta;
++			else if (isolate_folio(lruvec, folio, sc)) {
++				list_add(&folio->lru, list);
++				isolated += delta;
++			} else {
++				list_move(&folio->lru, &moved);
++				skipped += delta;
++			}
++
++			if (!--remaining || max(isolated, skipped) >= MIN_LRU_BATCH)
++				break;
++		}
++
++		if (skipped) {
++			list_splice(&moved, head);
++			__count_zid_vm_events(PGSCAN_SKIP, zone, skipped);
++		}
++
++		if (!remaining || isolated >= MIN_LRU_BATCH)
++			break;
++	}
++
++	item = current_is_kswapd() ? PGSCAN_KSWAPD : PGSCAN_DIRECT;
++	if (!cgroup_reclaim(sc)) {
++		__count_vm_events(item, isolated);
++		__count_vm_events(PGREFILL, sorted);
++	}
++	__count_memcg_events(memcg, item, isolated);
++	__count_memcg_events(memcg, PGREFILL, sorted);
++	__count_vm_events(PGSCAN_ANON + type, isolated);
++
++	/*
++	 * There might not be eligible pages due to reclaim_idx, may_unmap and
++	 * may_writepage. Check the remaining to prevent livelock if it's not
++	 * making progress.
++	 */
++	return isolated || !remaining ? scanned : 0;
++}
++
++static int get_tier_idx(struct lruvec *lruvec, int type)
++{
++	int tier;
++	struct ctrl_pos sp, pv;
++
++	/*
++	 * To leave a margin for fluctuations, use a larger gain factor (1:2).
++	 * This value is chosen because any other tier would have at least twice
++	 * as many refaults as the first tier.
++	 */
++	read_ctrl_pos(lruvec, type, 0, 1, &sp);
++	for (tier = 1; tier < MAX_NR_TIERS; tier++) {
++		read_ctrl_pos(lruvec, type, tier, 2, &pv);
++		if (!positive_ctrl_err(&sp, &pv))
++			break;
++	}
++
++	return tier - 1;
++}
++
++static int get_type_to_scan(struct lruvec *lruvec, int swappiness, int *tier_idx)
++{
++	int type, tier;
++	struct ctrl_pos sp, pv;
++	int gain[ANON_AND_FILE] = { swappiness, 200 - swappiness };
++
++	/*
++	 * Compare the first tier of anon with that of file to determine which
++	 * type to scan. Also need to compare other tiers of the selected type
++	 * with the first tier of the other type to determine the last tier (of
++	 * the selected type) to evict.
++	 */
++	read_ctrl_pos(lruvec, LRU_GEN_ANON, 0, gain[LRU_GEN_ANON], &sp);
++	read_ctrl_pos(lruvec, LRU_GEN_FILE, 0, gain[LRU_GEN_FILE], &pv);
++	type = positive_ctrl_err(&sp, &pv);
++
++	read_ctrl_pos(lruvec, !type, 0, gain[!type], &sp);
++	for (tier = 1; tier < MAX_NR_TIERS; tier++) {
++		read_ctrl_pos(lruvec, type, tier, gain[type], &pv);
++		if (!positive_ctrl_err(&sp, &pv))
++			break;
++	}
++
++	*tier_idx = tier - 1;
++
++	return type;
++}
++
++static int isolate_folios(struct lruvec *lruvec, struct scan_control *sc, int swappiness,
++			  int *type_scanned, struct list_head *list)
++{
++	int i;
++	int type;
++	int scanned;
++	int tier = -1;
++	DEFINE_MIN_SEQ(lruvec);
++
++	/*
++	 * Try to make the obvious choice first. When anon and file are both
++	 * available from the same generation, interpret swappiness 1 as file
++	 * first and 200 as anon first.
++	 */
++	if (!swappiness)
++		type = LRU_GEN_FILE;
++	else if (min_seq[LRU_GEN_ANON] < min_seq[LRU_GEN_FILE])
++		type = LRU_GEN_ANON;
++	else if (swappiness == 1)
++		type = LRU_GEN_FILE;
++	else if (swappiness == 200)
++		type = LRU_GEN_ANON;
++	else
++		type = get_type_to_scan(lruvec, swappiness, &tier);
++
++	for (i = !swappiness; i < ANON_AND_FILE; i++) {
++		if (tier < 0)
++			tier = get_tier_idx(lruvec, type);
++
++		scanned = scan_folios(lruvec, sc, type, tier, list);
++		if (scanned)
++			break;
++
++		type = !type;
++		tier = -1;
++	}
++
++	*type_scanned = type;
++
++	return scanned;
++}
++
++static int evict_folios(struct lruvec *lruvec, struct scan_control *sc, int swappiness)
++{
++	int type;
++	int scanned;
++	int reclaimed;
++	LIST_HEAD(list);
++	struct folio *folio;
++	enum vm_event_item item;
++	struct reclaim_stat stat;
++	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
++	struct pglist_data *pgdat = lruvec_pgdat(lruvec);
++
++	spin_lock_irq(&lruvec->lru_lock);
++
++	scanned = isolate_folios(lruvec, sc, swappiness, &type, &list);
++
++	scanned += try_to_inc_min_seq(lruvec, swappiness);
++
++	if (get_nr_gens(lruvec, !swappiness) == MIN_NR_GENS)
++		scanned = 0;
++
++	spin_unlock_irq(&lruvec->lru_lock);
++
++	if (list_empty(&list))
++		return scanned;
++
++	reclaimed = shrink_page_list(&list, pgdat, sc, &stat, false);
++
++	list_for_each_entry(folio, &list, lru) {
++		/* restore LRU_REFS_FLAGS cleared by isolate_folio() */
++		if (folio_test_workingset(folio))
++			folio_set_referenced(folio);
++
++		/* don't add rejected pages to the oldest generation */
++		if (folio_test_reclaim(folio) &&
++		    (folio_test_dirty(folio) || folio_test_writeback(folio)))
++			folio_clear_active(folio);
++		else
++			folio_set_active(folio);
++	}
++
++	spin_lock_irq(&lruvec->lru_lock);
++
++	move_pages_to_lru(lruvec, &list);
++
++	item = current_is_kswapd() ? PGSTEAL_KSWAPD : PGSTEAL_DIRECT;
++	if (!cgroup_reclaim(sc))
++		__count_vm_events(item, reclaimed);
++	__count_memcg_events(memcg, item, reclaimed);
++	__count_vm_events(PGSTEAL_ANON + type, reclaimed);
++
++	spin_unlock_irq(&lruvec->lru_lock);
++
++	mem_cgroup_uncharge_list(&list);
++	free_unref_page_list(&list);
++
++	sc->nr_reclaimed += reclaimed;
++
++	return scanned;
++}
++
++static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc,
++				    bool can_swap)
++{
++	bool need_aging;
++	unsigned long nr_to_scan;
++	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
++	DEFINE_MAX_SEQ(lruvec);
++	DEFINE_MIN_SEQ(lruvec);
++
++	if (mem_cgroup_below_min(memcg) ||
++	    (mem_cgroup_below_low(memcg) && !sc->memcg_low_reclaim))
++		return 0;
++
++	need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, can_swap, &nr_to_scan);
++	if (!need_aging)
++		return nr_to_scan;
++
++	/* skip the aging path at the default priority */
++	if (sc->priority == DEF_PRIORITY)
++		goto done;
++
++	/* leave the work to lru_gen_age_node() */
++	if (current_is_kswapd())
++		return 0;
++
++	inc_max_seq(lruvec, max_seq, can_swap);
++done:
++	return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0;
++}
++
++static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
++{
++	struct blk_plug plug;
++	unsigned long scanned = 0;
++
++	lru_add_drain();
++
++	blk_start_plug(&plug);
++
++	while (true) {
++		int delta;
++		int swappiness;
++		unsigned long nr_to_scan;
++
++		if (sc->may_swap)
++			swappiness = get_swappiness(lruvec, sc);
++		else if (!cgroup_reclaim(sc) && get_swappiness(lruvec, sc))
++			swappiness = 1;
++		else
++			swappiness = 0;
++
++		nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness);
++		if (!nr_to_scan)
++			break;
++
++		delta = evict_folios(lruvec, sc, swappiness);
++		if (!delta)
++			break;
++
++		scanned += delta;
++		if (scanned >= nr_to_scan)
++			break;
++
++		cond_resched();
++	}
++
++	blk_finish_plug(&plug);
++}
++
+ /******************************************************************************
+  *                          initialization
+  ******************************************************************************/
+@@ -3123,6 +3878,16 @@ static int __init init_lru_gen(void)
+ };
+ late_initcall(init_lru_gen);
+ 
++#else /* !CONFIG_LRU_GEN */
++
++static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc)
++{
++}
++
++static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
++{
++}
++
+ #endif /* CONFIG_LRU_GEN */
+ 
+ static void shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
+@@ -3136,6 +3901,11 @@ static void shrink_lruvec(struct lruvec
+ 	struct blk_plug plug;
+ 	bool scan_adjusted;
+ 
++	if (lru_gen_enabled()) {
++		lru_gen_shrink_lruvec(lruvec, sc);
++		return;
++	}
++
+ 	get_scan_count(lruvec, sc, nr);
+ 
+ 	/* Record the original scan target for proportional adjustments later */
+@@ -3642,6 +4412,9 @@ static void snapshot_refaults(struct mem
+ 	struct lruvec *target_lruvec;
+ 	unsigned long refaults;
+ 
++	if (lru_gen_enabled())
++		return;
++
+ 	target_lruvec = mem_cgroup_lruvec(target_memcg, pgdat);
+ 	refaults = lruvec_page_state(target_lruvec, WORKINGSET_ACTIVATE_ANON);
+ 	target_lruvec->refaults[0] = refaults;
+@@ -4008,12 +4781,16 @@ unsigned long try_to_free_mem_cgroup_pag
+ }
+ #endif
+ 
+-static void age_active_anon(struct pglist_data *pgdat,
+-				struct scan_control *sc)
++static void kswapd_age_node(struct pglist_data *pgdat, struct scan_control *sc)
+ {
+ 	struct mem_cgroup *memcg;
+ 	struct lruvec *lruvec;
+ 
++	if (lru_gen_enabled()) {
++		lru_gen_age_node(pgdat, sc);
++		return;
++	}
++
+ 	if (!can_age_anon_pages(pgdat, sc))
+ 		return;
+ 
+@@ -4333,12 +5110,11 @@ restart:
+ 		sc.may_swap = !nr_boost_reclaim;
+ 
+ 		/*
+-		 * Do some background aging of the anon list, to give
+-		 * pages a chance to be referenced before reclaiming. All
+-		 * pages are rotated regardless of classzone as this is
+-		 * about consistent aging.
++		 * Do some background aging, to give pages a chance to be
++		 * referenced before reclaiming. All pages are rotated
++		 * regardless of classzone as this is about consistent aging.
+ 		 */
+-		age_active_anon(pgdat, &sc);
++		kswapd_age_node(pgdat, &sc);
+ 
+ 		/*
+ 		 * If we're getting trouble reclaiming, start doing writepage
+--- a/mm/workingset.c
++++ b/mm/workingset.c
+@@ -187,7 +187,6 @@ static unsigned int bucket_order __read_
+ static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction,
+ 			 bool workingset)
+ {
+-	eviction >>= bucket_order;
+ 	eviction &= EVICTION_MASK;
+ 	eviction = (eviction << MEM_CGROUP_ID_SHIFT) | memcgid;
+ 	eviction = (eviction << NODES_SHIFT) | pgdat->node_id;
+@@ -212,10 +211,107 @@ static void unpack_shadow(void *shadow,
+ 
+ 	*memcgidp = memcgid;
+ 	*pgdat = NODE_DATA(nid);
+-	*evictionp = entry << bucket_order;
++	*evictionp = entry;
+ 	*workingsetp = workingset;
+ }
+ 
++#ifdef CONFIG_LRU_GEN
++
++static void *lru_gen_eviction(struct folio *folio)
++{
++	int hist;
++	unsigned long token;
++	unsigned long min_seq;
++	struct lruvec *lruvec;
++	struct lru_gen_struct *lrugen;
++	int type = folio_is_file_lru(folio);
++	int delta = folio_nr_pages(folio);
++	int refs = folio_lru_refs(folio);
++	int tier = lru_tier_from_refs(refs);
++	struct mem_cgroup *memcg = folio_memcg(folio);
++	struct pglist_data *pgdat = folio_pgdat(folio);
++
++	BUILD_BUG_ON(LRU_GEN_WIDTH + LRU_REFS_WIDTH > BITS_PER_LONG - EVICTION_SHIFT);
++
++	lruvec = mem_cgroup_lruvec(memcg, pgdat);
++	lrugen = &lruvec->lrugen;
++	min_seq = READ_ONCE(lrugen->min_seq[type]);
++	token = (min_seq << LRU_REFS_WIDTH) | max(refs - 1, 0);
++
++	hist = lru_hist_from_seq(min_seq);
++	atomic_long_add(delta, &lrugen->evicted[hist][type][tier]);
++
++	return pack_shadow(mem_cgroup_id(memcg), pgdat, token, refs);
++}
++
++static void lru_gen_refault(struct folio *folio, void *shadow)
++{
++	int hist, tier, refs;
++	int memcg_id;
++	bool workingset;
++	unsigned long token;
++	unsigned long min_seq;
++	struct lruvec *lruvec;
++	struct lru_gen_struct *lrugen;
++	struct mem_cgroup *memcg;
++	struct pglist_data *pgdat;
++	int type = folio_is_file_lru(folio);
++	int delta = folio_nr_pages(folio);
++
++	unpack_shadow(shadow, &memcg_id, &pgdat, &token, &workingset);
++
++	if (pgdat != folio_pgdat(folio))
++		return;
++
++	rcu_read_lock();
++
++	memcg = folio_memcg_rcu(folio);
++	if (memcg_id != mem_cgroup_id(memcg))
++		goto unlock;
++
++	lruvec = mem_cgroup_lruvec(memcg, pgdat);
++	lrugen = &lruvec->lrugen;
++
++	min_seq = READ_ONCE(lrugen->min_seq[type]);
++	if ((token >> LRU_REFS_WIDTH) != (min_seq & (EVICTION_MASK >> LRU_REFS_WIDTH)))
++		goto unlock;
++
++	hist = lru_hist_from_seq(min_seq);
++	/* see the comment in folio_lru_refs() */
++	refs = (token & (BIT(LRU_REFS_WIDTH) - 1)) + workingset;
++	tier = lru_tier_from_refs(refs);
++
++	atomic_long_add(delta, &lrugen->refaulted[hist][type][tier]);
++	mod_lruvec_state(lruvec, WORKINGSET_REFAULT_BASE + type, delta);
++
++	/*
++	 * Count the following two cases as stalls:
++	 * 1. For pages accessed through page tables, hotter pages pushed out
++	 *    hot pages which refaulted immediately.
++	 * 2. For pages accessed multiple times through file descriptors,
++	 *    numbers of accesses might have been out of the range.
++	 */
++	if (lru_gen_in_fault() || refs == BIT(LRU_REFS_WIDTH)) {
++		folio_set_workingset(folio);
++		mod_lruvec_state(lruvec, WORKINGSET_RESTORE_BASE + type, delta);
++	}
++unlock:
++	rcu_read_unlock();
++}
++
++#else /* !CONFIG_LRU_GEN */
++
++static void *lru_gen_eviction(struct folio *folio)
++{
++	return NULL;
++}
++
++static void lru_gen_refault(struct folio *folio, void *shadow)
++{
++}
++
++#endif /* CONFIG_LRU_GEN */
++
+ /**
+  * workingset_age_nonresident - age non-resident entries as LRU ages
+  * @lruvec: the lruvec that was aged
+@@ -264,10 +360,14 @@ void *workingset_eviction(struct folio *
+ 	VM_BUG_ON_FOLIO(folio_ref_count(folio), folio);
+ 	VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio);
+ 
++	if (lru_gen_enabled())
++		return lru_gen_eviction(folio);
++
+ 	lruvec = mem_cgroup_lruvec(target_memcg, pgdat);
+ 	/* XXX: target_memcg can be NULL, go through lruvec */
+ 	memcgid = mem_cgroup_id(lruvec_memcg(lruvec));
+ 	eviction = atomic_long_read(&lruvec->nonresident_age);
++	eviction >>= bucket_order;
+ 	workingset_age_nonresident(lruvec, folio_nr_pages(folio));
+ 	return pack_shadow(memcgid, pgdat, eviction,
+ 				folio_test_workingset(folio));
+@@ -298,7 +398,13 @@ void workingset_refault(struct folio *fo
+ 	int memcgid;
+ 	long nr;
+ 
++	if (lru_gen_enabled()) {
++		lru_gen_refault(folio, shadow);
++		return;
++	}
++
+ 	unpack_shadow(shadow, &memcgid, &pgdat, &eviction, &workingset);
++	eviction <<= bucket_order;
+ 
+ 	rcu_read_lock();
+ 	/*
diff --git a/target/linux/generic/backport-6.0/106-mm-multi-gen-LRU-exploit-locality-in-rmap.patch b/target/linux/generic/backport-6.0/106-mm-multi-gen-LRU-exploit-locality-in-rmap.patch
new file mode 100644
index 000000000..729db5afa
--- /dev/null
+++ b/target/linux/generic/backport-6.0/106-mm-multi-gen-LRU-exploit-locality-in-rmap.patch
@@ -0,0 +1,476 @@
+From 93fa87bdef9e7fa9977355c4712c000f31639231 Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Thu, 27 Jan 2022 20:43:22 -0700
+Subject: [PATCH 07/14] mm: multi-gen LRU: exploit locality in rmap
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Searching the rmap for PTEs mapping each page on an LRU list (to test
+and clear the accessed bit) can be expensive because pages from
+different VMAs (PA space) are not cache friendly to the rmap (VA
+space). For workloads mostly using mapped pages, searching the rmap
+can incur the highest CPU cost in the reclaim path.
+
+This patch exploits spatial locality to reduce the trips into the
+rmap. When shrink_page_list() walks the rmap and finds a young PTE, a
+new function lru_gen_look_around() scans at most BITS_PER_LONG-1
+adjacent PTEs. On finding another young PTE, it clears the accessed
+bit and updates the gen counter of the page mapped by this PTE to
+(max_seq%MAX_NR_GENS)+1.
+
+Server benchmark results:
+  Single workload:
+    fio (buffered I/O): no change
+
+  Single workload:
+    memcached (anon): +[3, 5]%
+                Ops/sec      KB/sec
+      patch1-6: 1106168.46   43025.04
+      patch1-7: 1147696.57   44640.29
+
+  Configurations:
+    no change
+
+Client benchmark results:
+  kswapd profiles:
+    patch1-6
+      39.03%  lzo1x_1_do_compress (real work)
+      18.47%  page_vma_mapped_walk (overhead)
+       6.74%  _raw_spin_unlock_irq
+       3.97%  do_raw_spin_lock
+       2.49%  ptep_clear_flush
+       2.48%  anon_vma_interval_tree_iter_first
+       1.92%  folio_referenced_one
+       1.88%  __zram_bvec_write
+       1.48%  memmove
+       1.31%  vma_interval_tree_iter_next
+
+    patch1-7
+      48.16%  lzo1x_1_do_compress (real work)
+       8.20%  page_vma_mapped_walk (overhead)
+       7.06%  _raw_spin_unlock_irq
+       2.92%  ptep_clear_flush
+       2.53%  __zram_bvec_write
+       2.11%  do_raw_spin_lock
+       2.02%  memmove
+       1.93%  lru_gen_look_around
+       1.56%  free_unref_page_list
+       1.40%  memset
+
+  Configurations:
+    no change
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Acked-by: Barry Song <baohua@kernel.org>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I4b9ca0fd20f566ce554e703f14cee3fe0048c2fd
+---
+ include/linux/memcontrol.h |  31 +++++++
+ include/linux/mm.h         |   5 +
+ include/linux/mmzone.h     |   6 ++
+ mm/internal.h              |   1 +
+ mm/memcontrol.c            |   1 +
+ mm/rmap.c                  |   6 ++
+ mm/swap.c                  |   4 +-
+ mm/vmscan.c                | 184 +++++++++++++++++++++++++++++++++++++
+ 8 files changed, 236 insertions(+), 2 deletions(-)
+
+--- a/include/linux/memcontrol.h
++++ b/include/linux/memcontrol.h
+@@ -444,6 +444,7 @@ static inline struct obj_cgroup *__folio
+  * - LRU isolation
+  * - lock_page_memcg()
+  * - exclusive reference
++ * - mem_cgroup_trylock_pages()
+  *
+  * For a kmem folio a caller should hold an rcu read lock to protect memcg
+  * associated with a kmem folio from being released.
+@@ -505,6 +506,7 @@ static inline struct mem_cgroup *folio_m
+  * - LRU isolation
+  * - lock_page_memcg()
+  * - exclusive reference
++ * - mem_cgroup_trylock_pages()
+  *
+  * For a kmem page a caller should hold an rcu read lock to protect memcg
+  * associated with a kmem page from being released.
+@@ -959,6 +961,23 @@ void unlock_page_memcg(struct page *page
+ 
+ void __mod_memcg_state(struct mem_cgroup *memcg, int idx, int val);
+ 
++/* try to stablize folio_memcg() for all the pages in a memcg */
++static inline bool mem_cgroup_trylock_pages(struct mem_cgroup *memcg)
++{
++	rcu_read_lock();
++
++	if (mem_cgroup_disabled() || !atomic_read(&memcg->moving_account))
++		return true;
++
++	rcu_read_unlock();
++	return false;
++}
++
++static inline void mem_cgroup_unlock_pages(void)
++{
++	rcu_read_unlock();
++}
++
+ /* idx can be of type enum memcg_stat_item or node_stat_item */
+ static inline void mod_memcg_state(struct mem_cgroup *memcg,
+ 				   int idx, int val)
+@@ -1433,6 +1452,18 @@ static inline void folio_memcg_unlock(st
+ {
+ }
+ 
++static inline bool mem_cgroup_trylock_pages(struct mem_cgroup *memcg)
++{
++	/* to match folio_memcg_rcu() */
++	rcu_read_lock();
++	return true;
++}
++
++static inline void mem_cgroup_unlock_pages(void)
++{
++	rcu_read_unlock();
++}
++
+ static inline void mem_cgroup_handle_over_high(void)
+ {
+ }
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -1465,6 +1465,11 @@ static inline unsigned long folio_pfn(st
+ 	return page_to_pfn(&folio->page);
+ }
+ 
++static inline struct folio *pfn_folio(unsigned long pfn)
++{
++	return page_folio(pfn_to_page(pfn));
++}
++
+ static inline atomic_t *folio_pincount_ptr(struct folio *folio)
+ {
+ 	return &folio_page(folio, 1)->compound_pincount;
+--- a/include/linux/mmzone.h
++++ b/include/linux/mmzone.h
+@@ -372,6 +372,7 @@ enum lruvec_flags {
+ #ifndef __GENERATING_BOUNDS_H
+ 
+ struct lruvec;
++struct page_vma_mapped_walk;
+ 
+ #define LRU_GEN_MASK		((BIT(LRU_GEN_WIDTH) - 1) << LRU_GEN_PGOFF)
+ #define LRU_REFS_MASK		((BIT(LRU_REFS_WIDTH) - 1) << LRU_REFS_PGOFF)
+@@ -427,6 +428,7 @@ struct lru_gen_struct {
+ };
+ 
+ void lru_gen_init_lruvec(struct lruvec *lruvec);
++void lru_gen_look_around(struct page_vma_mapped_walk *pvmw);
+ 
+ #ifdef CONFIG_MEMCG
+ void lru_gen_init_memcg(struct mem_cgroup *memcg);
+@@ -439,6 +441,10 @@ static inline void lru_gen_init_lruvec(s
+ {
+ }
+ 
++static inline void lru_gen_look_around(struct page_vma_mapped_walk *pvmw)
++{
++}
++
+ #ifdef CONFIG_MEMCG
+ static inline void lru_gen_init_memcg(struct mem_cgroup *memcg)
+ {
+--- a/mm/internal.h
++++ b/mm/internal.h
+@@ -83,6 +83,7 @@ vm_fault_t do_swap_page(struct vm_fault
+ void folio_rotate_reclaimable(struct folio *folio);
+ bool __folio_end_writeback(struct folio *folio);
+ void deactivate_file_folio(struct folio *folio);
++void folio_activate(struct folio *folio);
+ 
+ void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma,
+ 		unsigned long floor, unsigned long ceiling);
+--- a/mm/memcontrol.c
++++ b/mm/memcontrol.c
+@@ -2789,6 +2789,7 @@ static void commit_charge(struct folio *
+ 	 * - LRU isolation
+ 	 * - lock_page_memcg()
+ 	 * - exclusive reference
++	 * - mem_cgroup_trylock_pages()
+ 	 */
+ 	folio->memcg_data = (unsigned long)memcg;
+ }
+--- a/mm/rmap.c
++++ b/mm/rmap.c
+@@ -833,6 +833,12 @@ static bool folio_referenced_one(struct
+ 		}
+ 
+ 		if (pvmw.pte) {
++			if (lru_gen_enabled() && pte_young(*pvmw.pte) &&
++			    !(vma->vm_flags & (VM_SEQ_READ | VM_RAND_READ))) {
++				lru_gen_look_around(&pvmw);
++				referenced++;
++			}
++
+ 			if (ptep_clear_flush_young_notify(vma, address,
+ 						pvmw.pte)) {
+ 				/*
+--- a/mm/swap.c
++++ b/mm/swap.c
+@@ -366,7 +366,7 @@ static void folio_activate_drain(int cpu
+ 		folio_batch_move_lru(fbatch, folio_activate_fn);
+ }
+ 
+-static void folio_activate(struct folio *folio)
++void folio_activate(struct folio *folio)
+ {
+ 	if (folio_test_lru(folio) && !folio_test_active(folio) &&
+ 	    !folio_test_unevictable(folio)) {
+@@ -385,7 +385,7 @@ static inline void folio_activate_drain(
+ {
+ }
+ 
+-static void folio_activate(struct folio *folio)
++void folio_activate(struct folio *folio)
+ {
+ 	struct lruvec *lruvec;
+ 
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -1635,6 +1635,11 @@ retry:
+ 		if (!sc->may_unmap && folio_mapped(folio))
+ 			goto keep_locked;
+ 
++		/* folio_update_gen() tried to promote this page? */
++		if (lru_gen_enabled() && !ignore_references &&
++		    folio_mapped(folio) && folio_test_referenced(folio))
++			goto keep_locked;
++
+ 		/*
+ 		 * The number of dirty pages determines if a node is marked
+ 		 * reclaim_congested. kswapd will stall and start writing
+@@ -3219,6 +3224,29 @@ static bool positive_ctrl_err(struct ctr
+  *                          the aging
+  ******************************************************************************/
+ 
++/* promote pages accessed through page tables */
++static int folio_update_gen(struct folio *folio, int gen)
++{
++	unsigned long new_flags, old_flags = READ_ONCE(folio->flags);
++
++	VM_WARN_ON_ONCE(gen >= MAX_NR_GENS);
++	VM_WARN_ON_ONCE(!rcu_read_lock_held());
++
++	do {
++		/* lru_gen_del_folio() has isolated this page? */
++		if (!(old_flags & LRU_GEN_MASK)) {
++			/* for shrink_page_list() */
++			new_flags = old_flags | BIT(PG_referenced);
++			continue;
++		}
++
++		new_flags = old_flags & ~(LRU_GEN_MASK | LRU_REFS_MASK | LRU_REFS_FLAGS);
++		new_flags |= (gen + 1UL) << LRU_GEN_PGOFF;
++	} while (!try_cmpxchg(&folio->flags, &old_flags, new_flags));
++
++	return ((old_flags & LRU_GEN_MASK) >> LRU_GEN_PGOFF) - 1;
++}
++
+ /* protect pages accessed multiple times through file descriptors */
+ static int folio_inc_gen(struct lruvec *lruvec, struct folio *folio, bool reclaiming)
+ {
+@@ -3230,6 +3258,11 @@ static int folio_inc_gen(struct lruvec *
+ 	VM_WARN_ON_ONCE_FOLIO(!(old_flags & LRU_GEN_MASK), folio);
+ 
+ 	do {
++		new_gen = ((old_flags & LRU_GEN_MASK) >> LRU_GEN_PGOFF) - 1;
++		/* folio_update_gen() has promoted this page? */
++		if (new_gen >= 0 && new_gen != old_gen)
++			return new_gen;
++
+ 		new_gen = (old_gen + 1) % MAX_NR_GENS;
+ 
+ 		new_flags = old_flags & ~(LRU_GEN_MASK | LRU_REFS_MASK | LRU_REFS_FLAGS);
+@@ -3244,6 +3277,43 @@ static int folio_inc_gen(struct lruvec *
+ 	return new_gen;
+ }
+ 
++static unsigned long get_pte_pfn(pte_t pte, struct vm_area_struct *vma, unsigned long addr)
++{
++	unsigned long pfn = pte_pfn(pte);
++
++	VM_WARN_ON_ONCE(addr < vma->vm_start || addr >= vma->vm_end);
++
++	if (!pte_present(pte) || is_zero_pfn(pfn))
++		return -1;
++
++	if (WARN_ON_ONCE(pte_devmap(pte) || pte_special(pte)))
++		return -1;
++
++	if (WARN_ON_ONCE(!pfn_valid(pfn)))
++		return -1;
++
++	return pfn;
++}
++
++static struct folio *get_pfn_folio(unsigned long pfn, struct mem_cgroup *memcg,
++				   struct pglist_data *pgdat)
++{
++	struct folio *folio;
++
++	/* try to avoid unnecessary memory loads */
++	if (pfn < pgdat->node_start_pfn || pfn >= pgdat_end_pfn(pgdat))
++		return NULL;
++
++	folio = pfn_folio(pfn);
++	if (folio_nid(folio) != pgdat->node_id)
++		return NULL;
++
++	if (folio_memcg_rcu(folio) != memcg)
++		return NULL;
++
++	return folio;
++}
++
+ static void inc_min_seq(struct lruvec *lruvec, int type)
+ {
+ 	struct lru_gen_struct *lrugen = &lruvec->lrugen;
+@@ -3443,6 +3513,114 @@ static void lru_gen_age_node(struct pgli
+ 	} while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)));
+ }
+ 
++/*
++ * This function exploits spatial locality when shrink_page_list() walks the
++ * rmap. It scans the adjacent PTEs of a young PTE and promotes hot pages.
++ */
++void lru_gen_look_around(struct page_vma_mapped_walk *pvmw)
++{
++	int i;
++	pte_t *pte;
++	unsigned long start;
++	unsigned long end;
++	unsigned long addr;
++	unsigned long bitmap[BITS_TO_LONGS(MIN_LRU_BATCH)] = {};
++	struct folio *folio = pfn_folio(pvmw->pfn);
++	struct mem_cgroup *memcg = folio_memcg(folio);
++	struct pglist_data *pgdat = folio_pgdat(folio);
++	struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat);
++	DEFINE_MAX_SEQ(lruvec);
++	int old_gen, new_gen = lru_gen_from_seq(max_seq);
++
++	lockdep_assert_held(pvmw->ptl);
++	VM_WARN_ON_ONCE_FOLIO(folio_test_lru(folio), folio);
++
++	if (spin_is_contended(pvmw->ptl))
++		return;
++
++	start = max(pvmw->address & PMD_MASK, pvmw->vma->vm_start);
++	end = min(pvmw->address | ~PMD_MASK, pvmw->vma->vm_end - 1) + 1;
++
++	if (end - start > MIN_LRU_BATCH * PAGE_SIZE) {
++		if (pvmw->address - start < MIN_LRU_BATCH * PAGE_SIZE / 2)
++			end = start + MIN_LRU_BATCH * PAGE_SIZE;
++		else if (end - pvmw->address < MIN_LRU_BATCH * PAGE_SIZE / 2)
++			start = end - MIN_LRU_BATCH * PAGE_SIZE;
++		else {
++			start = pvmw->address - MIN_LRU_BATCH * PAGE_SIZE / 2;
++			end = pvmw->address + MIN_LRU_BATCH * PAGE_SIZE / 2;
++		}
++	}
++
++	pte = pvmw->pte - (pvmw->address - start) / PAGE_SIZE;
++
++	rcu_read_lock();
++	arch_enter_lazy_mmu_mode();
++
++	for (i = 0, addr = start; addr != end; i++, addr += PAGE_SIZE) {
++		unsigned long pfn;
++
++		pfn = get_pte_pfn(pte[i], pvmw->vma, addr);
++		if (pfn == -1)
++			continue;
++
++		if (!pte_young(pte[i]))
++			continue;
++
++		folio = get_pfn_folio(pfn, memcg, pgdat);
++		if (!folio)
++			continue;
++
++		if (!ptep_test_and_clear_young(pvmw->vma, addr, pte + i))
++			VM_WARN_ON_ONCE(true);
++
++		if (pte_dirty(pte[i]) && !folio_test_dirty(folio) &&
++		    !(folio_test_anon(folio) && folio_test_swapbacked(folio) &&
++		      !folio_test_swapcache(folio)))
++			folio_mark_dirty(folio);
++
++		old_gen = folio_lru_gen(folio);
++		if (old_gen < 0)
++			folio_set_referenced(folio);
++		else if (old_gen != new_gen)
++			__set_bit(i, bitmap);
++	}
++
++	arch_leave_lazy_mmu_mode();
++	rcu_read_unlock();
++
++	if (bitmap_weight(bitmap, MIN_LRU_BATCH) < PAGEVEC_SIZE) {
++		for_each_set_bit(i, bitmap, MIN_LRU_BATCH) {
++			folio = pfn_folio(pte_pfn(pte[i]));
++			folio_activate(folio);
++		}
++		return;
++	}
++
++	/* folio_update_gen() requires stable folio_memcg() */
++	if (!mem_cgroup_trylock_pages(memcg))
++		return;
++
++	spin_lock_irq(&lruvec->lru_lock);
++	new_gen = lru_gen_from_seq(lruvec->lrugen.max_seq);
++
++	for_each_set_bit(i, bitmap, MIN_LRU_BATCH) {
++		folio = pfn_folio(pte_pfn(pte[i]));
++		if (folio_memcg_rcu(folio) != memcg)
++			continue;
++
++		old_gen = folio_update_gen(folio, new_gen);
++		if (old_gen < 0 || old_gen == new_gen)
++			continue;
++
++		lru_gen_update_size(lruvec, folio, old_gen, new_gen);
++	}
++
++	spin_unlock_irq(&lruvec->lru_lock);
++
++	mem_cgroup_unlock_pages();
++}
++
+ /******************************************************************************
+  *                          the eviction
+  ******************************************************************************/
+@@ -3479,6 +3657,12 @@ static bool sort_folio(struct lruvec *lr
+ 		return true;
+ 	}
+ 
++	/* promoted */
++	if (gen != lru_gen_from_seq(lrugen->min_seq[type])) {
++		list_move(&folio->lru, &lrugen->lists[gen][type][zone]);
++		return true;
++	}
++
+ 	/* protected */
+ 	if (tier > tier_idx) {
+ 		int hist = lru_hist_from_seq(lrugen->min_seq[type]);
diff --git a/target/linux/generic/backport-6.0/107-mm-multi-gen-LRU-support-page-table-walks.patch b/target/linux/generic/backport-6.0/107-mm-multi-gen-LRU-support-page-table-walks.patch
new file mode 100644
index 000000000..de8109ca5
--- /dev/null
+++ b/target/linux/generic/backport-6.0/107-mm-multi-gen-LRU-support-page-table-walks.patch
@@ -0,0 +1,1662 @@
+From 1901916ee0f75841efdee055df64fa86d0512d53 Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Thu, 27 Jan 2022 19:23:01 -0700
+Subject: [PATCH 08/14] mm: multi-gen LRU: support page table walks
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+To further exploit spatial locality, the aging prefers to walk page
+tables to search for young PTEs and promote hot pages. A kill switch
+will be added in the next patch to disable this behavior. When
+disabled, the aging relies on the rmap only.
+
+NB: this behavior has nothing similar with the page table scanning in
+the 2.4 kernel [1], which searches page tables for old PTEs, adds cold
+pages to swapcache and unmaps them.
+
+To avoid confusion, the term "iteration" specifically means the
+traversal of an entire mm_struct list; the term "walk" will be applied
+to page tables and the rmap, as usual.
+
+An mm_struct list is maintained for each memcg, and an mm_struct
+follows its owner task to the new memcg when this task is migrated.
+Given an lruvec, the aging iterates lruvec_memcg()->mm_list and calls
+walk_page_range() with each mm_struct on this list to promote hot
+pages before it increments max_seq.
+
+When multiple page table walkers iterate the same list, each of them
+gets a unique mm_struct; therefore they can run concurrently. Page
+table walkers ignore any misplaced pages, e.g., if an mm_struct was
+migrated, pages it left in the previous memcg will not be promoted
+when its current memcg is under reclaim. Similarly, page table walkers
+will not promote pages from nodes other than the one under reclaim.
+
+This patch uses the following optimizations when walking page tables:
+1. It tracks the usage of mm_struct's between context switches so that
+   page table walkers can skip processes that have been sleeping since
+   the last iteration.
+2. It uses generational Bloom filters to record populated branches so
+   that page table walkers can reduce their search space based on the
+   query results, e.g., to skip page tables containing mostly holes or
+   misplaced pages.
+3. It takes advantage of the accessed bit in non-leaf PMD entries when
+   CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y.
+4. It does not zigzag between a PGD table and the same PMD table
+   spanning multiple VMAs. IOW, it finishes all the VMAs within the
+   range of the same PMD table before it returns to a PGD table. This
+   improves the cache performance for workloads that have large
+   numbers of tiny VMAs [2], especially when CONFIG_PGTABLE_LEVELS=5.
+
+Server benchmark results:
+  Single workload:
+    fio (buffered I/O): no change
+
+  Single workload:
+    memcached (anon): +[8, 10]%
+                Ops/sec      KB/sec
+      patch1-7: 1147696.57   44640.29
+      patch1-8: 1245274.91   48435.66
+
+  Configurations:
+    no change
+
+Client benchmark results:
+  kswapd profiles:
+    patch1-7
+      48.16%  lzo1x_1_do_compress (real work)
+       8.20%  page_vma_mapped_walk (overhead)
+       7.06%  _raw_spin_unlock_irq
+       2.92%  ptep_clear_flush
+       2.53%  __zram_bvec_write
+       2.11%  do_raw_spin_lock
+       2.02%  memmove
+       1.93%  lru_gen_look_around
+       1.56%  free_unref_page_list
+       1.40%  memset
+
+    patch1-8
+      49.44%  lzo1x_1_do_compress (real work)
+       6.19%  page_vma_mapped_walk (overhead)
+       5.97%  _raw_spin_unlock_irq
+       3.13%  get_pfn_folio
+       2.85%  ptep_clear_flush
+       2.42%  __zram_bvec_write
+       2.08%  do_raw_spin_lock
+       1.92%  memmove
+       1.44%  alloc_zspage
+       1.36%  memset
+
+  Configurations:
+    no change
+
+Thanks to the following developers for their efforts [3].
+  kernel test robot <lkp@intel.com>
+
+[1] https://lwn.net/Articles/23732/
+[2] https://llvm.org/docs/ScudoHardenedAllocator.html
+[3] https://lore.kernel.org/r/202204160827.ekEARWQo-lkp@intel.com/
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I1065451af34154306418510c19e03ea798dc13af
+---
+ fs/exec.c                  |    2 +
+ include/linux/memcontrol.h |    5 +
+ include/linux/mm_types.h   |   76 +++
+ include/linux/mmzone.h     |   56 +-
+ include/linux/swap.h       |    4 +
+ kernel/exit.c              |    1 +
+ kernel/fork.c              |    9 +
+ kernel/sched/core.c        |    1 +
+ mm/memcontrol.c            |   25 +
+ mm/vmscan.c                | 1008 +++++++++++++++++++++++++++++++++++-
+ 10 files changed, 1170 insertions(+), 17 deletions(-)
+
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -1011,6 +1011,7 @@ static int exec_mmap(struct mm_struct *m
+ 	active_mm = tsk->active_mm;
+ 	tsk->active_mm = mm;
+ 	tsk->mm = mm;
++	lru_gen_add_mm(mm);
+ 	/*
+ 	 * This prevents preemption while active_mm is being loaded and
+ 	 * it and mm are being updated, which could cause problems for
+@@ -1026,6 +1027,7 @@ static int exec_mmap(struct mm_struct *m
+ 	tsk->mm->vmacache_seqnum = 0;
+ 	vmacache_flush(tsk);
+ 	task_unlock(tsk);
++	lru_gen_use_mm(mm);
+ 	if (old_mm) {
+ 		mmap_read_unlock(old_mm);
+ 		BUG_ON(active_mm != old_mm);
+--- a/include/linux/memcontrol.h
++++ b/include/linux/memcontrol.h
+@@ -350,6 +350,11 @@ struct mem_cgroup {
+ 	struct deferred_split deferred_split_queue;
+ #endif
+ 
++#ifdef CONFIG_LRU_GEN
++	/* per-memcg mm_struct list */
++	struct lru_gen_mm_list mm_list;
++#endif
++
+ 	struct mem_cgroup_per_node *nodeinfo[];
+ };
+ 
+--- a/include/linux/mm_types.h
++++ b/include/linux/mm_types.h
+@@ -672,6 +672,22 @@ struct mm_struct {
+ 		 */
+ 		unsigned long ksm_merging_pages;
+ #endif
++#ifdef CONFIG_LRU_GEN
++		struct {
++			/* this mm_struct is on lru_gen_mm_list */
++			struct list_head list;
++			/*
++			 * Set when switching to this mm_struct, as a hint of
++			 * whether it has been used since the last time per-node
++			 * page table walkers cleared the corresponding bits.
++			 */
++			unsigned long bitmap;
++#ifdef CONFIG_MEMCG
++			/* points to the memcg of "owner" above */
++			struct mem_cgroup *memcg;
++#endif
++		} lru_gen;
++#endif /* CONFIG_LRU_GEN */
+ 	} __randomize_layout;
+ 
+ 	/*
+@@ -698,6 +714,66 @@ static inline cpumask_t *mm_cpumask(stru
+ 	return (struct cpumask *)&mm->cpu_bitmap;
+ }
+ 
++#ifdef CONFIG_LRU_GEN
++
++struct lru_gen_mm_list {
++	/* mm_struct list for page table walkers */
++	struct list_head fifo;
++	/* protects the list above */
++	spinlock_t lock;
++};
++
++void lru_gen_add_mm(struct mm_struct *mm);
++void lru_gen_del_mm(struct mm_struct *mm);
++#ifdef CONFIG_MEMCG
++void lru_gen_migrate_mm(struct mm_struct *mm);
++#endif
++
++static inline void lru_gen_init_mm(struct mm_struct *mm)
++{
++	INIT_LIST_HEAD(&mm->lru_gen.list);
++	mm->lru_gen.bitmap = 0;
++#ifdef CONFIG_MEMCG
++	mm->lru_gen.memcg = NULL;
++#endif
++}
++
++static inline void lru_gen_use_mm(struct mm_struct *mm)
++{
++	/*
++	 * When the bitmap is set, page reclaim knows this mm_struct has been
++	 * used since the last time it cleared the bitmap. So it might be worth
++	 * walking the page tables of this mm_struct to clear the accessed bit.
++	 */
++	WRITE_ONCE(mm->lru_gen.bitmap, -1);
++}
++
++#else /* !CONFIG_LRU_GEN */
++
++static inline void lru_gen_add_mm(struct mm_struct *mm)
++{
++}
++
++static inline void lru_gen_del_mm(struct mm_struct *mm)
++{
++}
++
++#ifdef CONFIG_MEMCG
++static inline void lru_gen_migrate_mm(struct mm_struct *mm)
++{
++}
++#endif
++
++static inline void lru_gen_init_mm(struct mm_struct *mm)
++{
++}
++
++static inline void lru_gen_use_mm(struct mm_struct *mm)
++{
++}
++
++#endif /* CONFIG_LRU_GEN */
++
+ struct mmu_gather;
+ extern void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm);
+ extern void tlb_gather_mmu_fullmm(struct mmu_gather *tlb, struct mm_struct *mm);
+--- a/include/linux/mmzone.h
++++ b/include/linux/mmzone.h
+@@ -405,7 +405,7 @@ enum {
+  * min_seq behind.
+  *
+  * The number of pages in each generation is eventually consistent and therefore
+- * can be transiently negative.
++ * can be transiently negative when reset_batch_size() is pending.
+  */
+ struct lru_gen_struct {
+ 	/* the aging increments the youngest generation number */
+@@ -427,6 +427,53 @@ struct lru_gen_struct {
+ 	atomic_long_t refaulted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS];
+ };
+ 
++enum {
++	MM_LEAF_TOTAL,		/* total leaf entries */
++	MM_LEAF_OLD,		/* old leaf entries */
++	MM_LEAF_YOUNG,		/* young leaf entries */
++	MM_NONLEAF_TOTAL,	/* total non-leaf entries */
++	MM_NONLEAF_FOUND,	/* non-leaf entries found in Bloom filters */
++	MM_NONLEAF_ADDED,	/* non-leaf entries added to Bloom filters */
++	NR_MM_STATS
++};
++
++/* double-buffering Bloom filters */
++#define NR_BLOOM_FILTERS	2
++
++struct lru_gen_mm_state {
++	/* set to max_seq after each iteration */
++	unsigned long seq;
++	/* where the current iteration continues (inclusive) */
++	struct list_head *head;
++	/* where the last iteration ended (exclusive) */
++	struct list_head *tail;
++	/* to wait for the last page table walker to finish */
++	struct wait_queue_head wait;
++	/* Bloom filters flip after each iteration */
++	unsigned long *filters[NR_BLOOM_FILTERS];
++	/* the mm stats for debugging */
++	unsigned long stats[NR_HIST_GENS][NR_MM_STATS];
++	/* the number of concurrent page table walkers */
++	int nr_walkers;
++};
++
++struct lru_gen_mm_walk {
++	/* the lruvec under reclaim */
++	struct lruvec *lruvec;
++	/* unstable max_seq from lru_gen_struct */
++	unsigned long max_seq;
++	/* the next address within an mm to scan */
++	unsigned long next_addr;
++	/* to batch promoted pages */
++	int nr_pages[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES];
++	/* to batch the mm stats */
++	int mm_stats[NR_MM_STATS];
++	/* total batched items */
++	int batched;
++	bool can_swap;
++	bool force_scan;
++};
++
+ void lru_gen_init_lruvec(struct lruvec *lruvec);
+ void lru_gen_look_around(struct page_vma_mapped_walk *pvmw);
+ 
+@@ -477,6 +524,8 @@ struct lruvec {
+ #ifdef CONFIG_LRU_GEN
+ 	/* evictable pages divided into generations */
+ 	struct lru_gen_struct		lrugen;
++	/* to concurrently iterate lru_gen_mm_list */
++	struct lru_gen_mm_state		mm_state;
+ #endif
+ #ifdef CONFIG_MEMCG
+ 	struct pglist_data *pgdat;
+@@ -1156,6 +1205,11 @@ typedef struct pglist_data {
+ 
+ 	unsigned long		flags;
+ 
++#ifdef CONFIG_LRU_GEN
++	/* kswap mm walk data */
++	struct lru_gen_mm_walk	mm_walk;
++#endif
++
+ 	ZONE_PADDING(_pad2_)
+ 
+ 	/* Per-node vmstats */
+--- a/include/linux/swap.h
++++ b/include/linux/swap.h
+@@ -162,6 +162,10 @@ union swap_header {
+  */
+ struct reclaim_state {
+ 	unsigned long reclaimed_slab;
++#ifdef CONFIG_LRU_GEN
++	/* per-thread mm walk data */
++	struct lru_gen_mm_walk *mm_walk;
++#endif
+ };
+ 
+ #ifdef __KERNEL__
+--- a/kernel/exit.c
++++ b/kernel/exit.c
+@@ -466,6 +466,7 @@ assign_new_owner:
+ 		goto retry;
+ 	}
+ 	WRITE_ONCE(mm->owner, c);
++	lru_gen_migrate_mm(mm);
+ 	task_unlock(c);
+ 	put_task_struct(c);
+ }
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -1152,6 +1152,7 @@ static struct mm_struct *mm_init(struct
+ 		goto fail_nocontext;
+ 
+ 	mm->user_ns = get_user_ns(user_ns);
++	lru_gen_init_mm(mm);
+ 	return mm;
+ 
+ fail_nocontext:
+@@ -1194,6 +1195,7 @@ static inline void __mmput(struct mm_str
+ 	}
+ 	if (mm->binfmt)
+ 		module_put(mm->binfmt->module);
++	lru_gen_del_mm(mm);
+ 	mmdrop(mm);
+ }
+ 
+@@ -2692,6 +2694,13 @@ pid_t kernel_clone(struct kernel_clone_a
+ 		get_task_struct(p);
+ 	}
+ 
++	if (IS_ENABLED(CONFIG_LRU_GEN) && !(clone_flags & CLONE_VM)) {
++		/* lock the task to synchronize with memcg migration */
++		task_lock(p);
++		lru_gen_add_mm(p->mm);
++		task_unlock(p);
++	}
++
+ 	wake_up_new_task(p);
+ 
+ 	/* forking complete and child started to run, tell ptracer */
+--- a/kernel/sched/core.c
++++ b/kernel/sched/core.c
+@@ -5166,6 +5166,7 @@ context_switch(struct rq *rq, struct tas
+ 		 * finish_task_switch()'s mmdrop().
+ 		 */
+ 		switch_mm_irqs_off(prev->active_mm, next->mm, next);
++		lru_gen_use_mm(next->mm);
+ 
+ 		if (!prev->mm) {                        // from kernel
+ 			/* will mmdrop() in finish_task_switch(). */
+--- a/mm/memcontrol.c
++++ b/mm/memcontrol.c
+@@ -6199,6 +6199,30 @@ static void mem_cgroup_move_task(void)
+ }
+ #endif
+ 
++#ifdef CONFIG_LRU_GEN
++static void mem_cgroup_attach(struct cgroup_taskset *tset)
++{
++	struct task_struct *task;
++	struct cgroup_subsys_state *css;
++
++	/* find the first leader if there is any */
++	cgroup_taskset_for_each_leader(task, css, tset)
++		break;
++
++	if (!task)
++		return;
++
++	task_lock(task);
++	if (task->mm && READ_ONCE(task->mm->owner) == task)
++		lru_gen_migrate_mm(task->mm);
++	task_unlock(task);
++}
++#else
++static void mem_cgroup_attach(struct cgroup_taskset *tset)
++{
++}
++#endif /* CONFIG_LRU_GEN */
++
+ static int seq_puts_memcg_tunable(struct seq_file *m, unsigned long value)
+ {
+ 	if (value == PAGE_COUNTER_MAX)
+@@ -6604,6 +6628,7 @@ struct cgroup_subsys memory_cgrp_subsys
+ 	.css_reset = mem_cgroup_css_reset,
+ 	.css_rstat_flush = mem_cgroup_css_rstat_flush,
+ 	.can_attach = mem_cgroup_can_attach,
++	.attach = mem_cgroup_attach,
+ 	.cancel_attach = mem_cgroup_cancel_attach,
+ 	.post_attach = mem_cgroup_move_task,
+ 	.dfl_cftypes = memory_files,
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -49,6 +49,8 @@
+ #include <linux/printk.h>
+ #include <linux/dax.h>
+ #include <linux/psi.h>
++#include <linux/pagewalk.h>
++#include <linux/shmem_fs.h>
+ 
+ #include <asm/tlbflush.h>
+ #include <asm/div64.h>
+@@ -3082,7 +3084,7 @@ static bool can_age_anon_pages(struct pg
+ 		for ((type) = 0; (type) < ANON_AND_FILE; (type)++)	\
+ 			for ((zone) = 0; (zone) < MAX_NR_ZONES; (zone)++)
+ 
+-static struct lruvec __maybe_unused *get_lruvec(struct mem_cgroup *memcg, int nid)
++static struct lruvec *get_lruvec(struct mem_cgroup *memcg, int nid)
+ {
+ 	struct pglist_data *pgdat = NODE_DATA(nid);
+ 
+@@ -3128,6 +3130,371 @@ static bool __maybe_unused seq_is_valid(
+ }
+ 
+ /******************************************************************************
++ *                          mm_struct list
++ ******************************************************************************/
++
++static struct lru_gen_mm_list *get_mm_list(struct mem_cgroup *memcg)
++{
++	static struct lru_gen_mm_list mm_list = {
++		.fifo = LIST_HEAD_INIT(mm_list.fifo),
++		.lock = __SPIN_LOCK_UNLOCKED(mm_list.lock),
++	};
++
++#ifdef CONFIG_MEMCG
++	if (memcg)
++		return &memcg->mm_list;
++#endif
++	VM_WARN_ON_ONCE(!mem_cgroup_disabled());
++
++	return &mm_list;
++}
++
++void lru_gen_add_mm(struct mm_struct *mm)
++{
++	int nid;
++	struct mem_cgroup *memcg = get_mem_cgroup_from_mm(mm);
++	struct lru_gen_mm_list *mm_list = get_mm_list(memcg);
++
++	VM_WARN_ON_ONCE(!list_empty(&mm->lru_gen.list));
++#ifdef CONFIG_MEMCG
++	VM_WARN_ON_ONCE(mm->lru_gen.memcg);
++	mm->lru_gen.memcg = memcg;
++#endif
++	spin_lock(&mm_list->lock);
++
++	for_each_node_state(nid, N_MEMORY) {
++		struct lruvec *lruvec = get_lruvec(memcg, nid);
++
++		if (!lruvec)
++			continue;
++
++		/* the first addition since the last iteration */
++		if (lruvec->mm_state.tail == &mm_list->fifo)
++			lruvec->mm_state.tail = &mm->lru_gen.list;
++	}
++
++	list_add_tail(&mm->lru_gen.list, &mm_list->fifo);
++
++	spin_unlock(&mm_list->lock);
++}
++
++void lru_gen_del_mm(struct mm_struct *mm)
++{
++	int nid;
++	struct lru_gen_mm_list *mm_list;
++	struct mem_cgroup *memcg = NULL;
++
++	if (list_empty(&mm->lru_gen.list))
++		return;
++
++#ifdef CONFIG_MEMCG
++	memcg = mm->lru_gen.memcg;
++#endif
++	mm_list = get_mm_list(memcg);
++
++	spin_lock(&mm_list->lock);
++
++	for_each_node(nid) {
++		struct lruvec *lruvec = get_lruvec(memcg, nid);
++
++		if (!lruvec)
++			continue;
++
++		/* where the last iteration ended (exclusive) */
++		if (lruvec->mm_state.tail == &mm->lru_gen.list)
++			lruvec->mm_state.tail = lruvec->mm_state.tail->next;
++
++		/* where the current iteration continues (inclusive) */
++		if (lruvec->mm_state.head != &mm->lru_gen.list)
++			continue;
++
++		lruvec->mm_state.head = lruvec->mm_state.head->next;
++		/* the deletion ends the current iteration */
++		if (lruvec->mm_state.head == &mm_list->fifo)
++			WRITE_ONCE(lruvec->mm_state.seq, lruvec->mm_state.seq + 1);
++	}
++
++	list_del_init(&mm->lru_gen.list);
++
++	spin_unlock(&mm_list->lock);
++
++#ifdef CONFIG_MEMCG
++	mem_cgroup_put(mm->lru_gen.memcg);
++	mm->lru_gen.memcg = NULL;
++#endif
++}
++
++#ifdef CONFIG_MEMCG
++void lru_gen_migrate_mm(struct mm_struct *mm)
++{
++	struct mem_cgroup *memcg;
++	struct task_struct *task = rcu_dereference_protected(mm->owner, true);
++
++	VM_WARN_ON_ONCE(task->mm != mm);
++	lockdep_assert_held(&task->alloc_lock);
++
++	/* for mm_update_next_owner() */
++	if (mem_cgroup_disabled())
++		return;
++
++	rcu_read_lock();
++	memcg = mem_cgroup_from_task(task);
++	rcu_read_unlock();
++	if (memcg == mm->lru_gen.memcg)
++		return;
++
++	VM_WARN_ON_ONCE(!mm->lru_gen.memcg);
++	VM_WARN_ON_ONCE(list_empty(&mm->lru_gen.list));
++
++	lru_gen_del_mm(mm);
++	lru_gen_add_mm(mm);
++}
++#endif
++
++/*
++ * Bloom filters with m=1<<15, k=2 and the false positive rates of ~1/5 when
++ * n=10,000 and ~1/2 when n=20,000, where, conventionally, m is the number of
++ * bits in a bitmap, k is the number of hash functions and n is the number of
++ * inserted items.
++ *
++ * Page table walkers use one of the two filters to reduce their search space.
++ * To get rid of non-leaf entries that no longer have enough leaf entries, the
++ * aging uses the double-buffering technique to flip to the other filter each
++ * time it produces a new generation. For non-leaf entries that have enough
++ * leaf entries, the aging carries them over to the next generation in
++ * walk_pmd_range(); the eviction also report them when walking the rmap
++ * in lru_gen_look_around().
++ *
++ * For future optimizations:
++ * 1. It's not necessary to keep both filters all the time. The spare one can be
++ *    freed after the RCU grace period and reallocated if needed again.
++ * 2. And when reallocating, it's worth scaling its size according to the number
++ *    of inserted entries in the other filter, to reduce the memory overhead on
++ *    small systems and false positives on large systems.
++ * 3. Jenkins' hash function is an alternative to Knuth's.
++ */
++#define BLOOM_FILTER_SHIFT	15
++
++static inline int filter_gen_from_seq(unsigned long seq)
++{
++	return seq % NR_BLOOM_FILTERS;
++}
++
++static void get_item_key(void *item, int *key)
++{
++	u32 hash = hash_ptr(item, BLOOM_FILTER_SHIFT * 2);
++
++	BUILD_BUG_ON(BLOOM_FILTER_SHIFT * 2 > BITS_PER_TYPE(u32));
++
++	key[0] = hash & (BIT(BLOOM_FILTER_SHIFT) - 1);
++	key[1] = hash >> BLOOM_FILTER_SHIFT;
++}
++
++static void reset_bloom_filter(struct lruvec *lruvec, unsigned long seq)
++{
++	unsigned long *filter;
++	int gen = filter_gen_from_seq(seq);
++
++	filter = lruvec->mm_state.filters[gen];
++	if (filter) {
++		bitmap_clear(filter, 0, BIT(BLOOM_FILTER_SHIFT));
++		return;
++	}
++
++	filter = bitmap_zalloc(BIT(BLOOM_FILTER_SHIFT),
++			       __GFP_HIGH | __GFP_NOMEMALLOC | __GFP_NOWARN);
++	WRITE_ONCE(lruvec->mm_state.filters[gen], filter);
++}
++
++static void update_bloom_filter(struct lruvec *lruvec, unsigned long seq, void *item)
++{
++	int key[2];
++	unsigned long *filter;
++	int gen = filter_gen_from_seq(seq);
++
++	filter = READ_ONCE(lruvec->mm_state.filters[gen]);
++	if (!filter)
++		return;
++
++	get_item_key(item, key);
++
++	if (!test_bit(key[0], filter))
++		set_bit(key[0], filter);
++	if (!test_bit(key[1], filter))
++		set_bit(key[1], filter);
++}
++
++static bool test_bloom_filter(struct lruvec *lruvec, unsigned long seq, void *item)
++{
++	int key[2];
++	unsigned long *filter;
++	int gen = filter_gen_from_seq(seq);
++
++	filter = READ_ONCE(lruvec->mm_state.filters[gen]);
++	if (!filter)
++		return true;
++
++	get_item_key(item, key);
++
++	return test_bit(key[0], filter) && test_bit(key[1], filter);
++}
++
++static void reset_mm_stats(struct lruvec *lruvec, struct lru_gen_mm_walk *walk, bool last)
++{
++	int i;
++	int hist;
++
++	lockdep_assert_held(&get_mm_list(lruvec_memcg(lruvec))->lock);
++
++	if (walk) {
++		hist = lru_hist_from_seq(walk->max_seq);
++
++		for (i = 0; i < NR_MM_STATS; i++) {
++			WRITE_ONCE(lruvec->mm_state.stats[hist][i],
++				   lruvec->mm_state.stats[hist][i] + walk->mm_stats[i]);
++			walk->mm_stats[i] = 0;
++		}
++	}
++
++	if (NR_HIST_GENS > 1 && last) {
++		hist = lru_hist_from_seq(lruvec->mm_state.seq + 1);
++
++		for (i = 0; i < NR_MM_STATS; i++)
++			WRITE_ONCE(lruvec->mm_state.stats[hist][i], 0);
++	}
++}
++
++static bool should_skip_mm(struct mm_struct *mm, struct lru_gen_mm_walk *walk)
++{
++	int type;
++	unsigned long size = 0;
++	struct pglist_data *pgdat = lruvec_pgdat(walk->lruvec);
++	int key = pgdat->node_id % BITS_PER_TYPE(mm->lru_gen.bitmap);
++
++	if (!walk->force_scan && !test_bit(key, &mm->lru_gen.bitmap))
++		return true;
++
++	clear_bit(key, &mm->lru_gen.bitmap);
++
++	for (type = !walk->can_swap; type < ANON_AND_FILE; type++) {
++		size += type ? get_mm_counter(mm, MM_FILEPAGES) :
++			       get_mm_counter(mm, MM_ANONPAGES) +
++			       get_mm_counter(mm, MM_SHMEMPAGES);
++	}
++
++	if (size < MIN_LRU_BATCH)
++		return true;
++
++	return !mmget_not_zero(mm);
++}
++
++static bool iterate_mm_list(struct lruvec *lruvec, struct lru_gen_mm_walk *walk,
++			    struct mm_struct **iter)
++{
++	bool first = false;
++	bool last = true;
++	struct mm_struct *mm = NULL;
++	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
++	struct lru_gen_mm_list *mm_list = get_mm_list(memcg);
++	struct lru_gen_mm_state *mm_state = &lruvec->mm_state;
++
++	/*
++	 * There are four interesting cases for this page table walker:
++	 * 1. It tries to start a new iteration of mm_list with a stale max_seq;
++	 *    there is nothing left to do.
++	 * 2. It's the first of the current generation, and it needs to reset
++	 *    the Bloom filter for the next generation.
++	 * 3. It reaches the end of mm_list, and it needs to increment
++	 *    mm_state->seq; the iteration is done.
++	 * 4. It's the last of the current generation, and it needs to reset the
++	 *    mm stats counters for the next generation.
++	 */
++	spin_lock(&mm_list->lock);
++
++	VM_WARN_ON_ONCE(mm_state->seq + 1 < walk->max_seq);
++	VM_WARN_ON_ONCE(*iter && mm_state->seq > walk->max_seq);
++	VM_WARN_ON_ONCE(*iter && !mm_state->nr_walkers);
++
++	if (walk->max_seq <= mm_state->seq) {
++		if (!*iter)
++			last = false;
++		goto done;
++	}
++
++	if (!mm_state->nr_walkers) {
++		VM_WARN_ON_ONCE(mm_state->head && mm_state->head != &mm_list->fifo);
++
++		mm_state->head = mm_list->fifo.next;
++		first = true;
++	}
++
++	while (!mm && mm_state->head != &mm_list->fifo) {
++		mm = list_entry(mm_state->head, struct mm_struct, lru_gen.list);
++
++		mm_state->head = mm_state->head->next;
++
++		/* force scan for those added after the last iteration */
++		if (!mm_state->tail || mm_state->tail == &mm->lru_gen.list) {
++			mm_state->tail = mm_state->head;
++			walk->force_scan = true;
++		}
++
++		if (should_skip_mm(mm, walk))
++			mm = NULL;
++	}
++
++	if (mm_state->head == &mm_list->fifo)
++		WRITE_ONCE(mm_state->seq, mm_state->seq + 1);
++done:
++	if (*iter && !mm)
++		mm_state->nr_walkers--;
++	if (!*iter && mm)
++		mm_state->nr_walkers++;
++
++	if (mm_state->nr_walkers)
++		last = false;
++
++	if (*iter || last)
++		reset_mm_stats(lruvec, walk, last);
++
++	spin_unlock(&mm_list->lock);
++
++	if (mm && first)
++		reset_bloom_filter(lruvec, walk->max_seq + 1);
++
++	if (*iter)
++		mmput_async(*iter);
++
++	*iter = mm;
++
++	return last;
++}
++
++static bool iterate_mm_list_nowalk(struct lruvec *lruvec, unsigned long max_seq)
++{
++	bool success = false;
++	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
++	struct lru_gen_mm_list *mm_list = get_mm_list(memcg);
++	struct lru_gen_mm_state *mm_state = &lruvec->mm_state;
++
++	spin_lock(&mm_list->lock);
++
++	VM_WARN_ON_ONCE(mm_state->seq + 1 < max_seq);
++
++	if (max_seq > mm_state->seq && !mm_state->nr_walkers) {
++		VM_WARN_ON_ONCE(mm_state->head && mm_state->head != &mm_list->fifo);
++
++		WRITE_ONCE(mm_state->seq, mm_state->seq + 1);
++		reset_mm_stats(lruvec, NULL, true);
++		success = true;
++	}
++
++	spin_unlock(&mm_list->lock);
++
++	return success;
++}
++
++/******************************************************************************
+  *                          refault feedback loop
+  ******************************************************************************/
+ 
+@@ -3277,6 +3644,118 @@ static int folio_inc_gen(struct lruvec *
+ 	return new_gen;
+ }
+ 
++static void update_batch_size(struct lru_gen_mm_walk *walk, struct folio *folio,
++			      int old_gen, int new_gen)
++{
++	int type = folio_is_file_lru(folio);
++	int zone = folio_zonenum(folio);
++	int delta = folio_nr_pages(folio);
++
++	VM_WARN_ON_ONCE(old_gen >= MAX_NR_GENS);
++	VM_WARN_ON_ONCE(new_gen >= MAX_NR_GENS);
++
++	walk->batched++;
++
++	walk->nr_pages[old_gen][type][zone] -= delta;
++	walk->nr_pages[new_gen][type][zone] += delta;
++}
++
++static void reset_batch_size(struct lruvec *lruvec, struct lru_gen_mm_walk *walk)
++{
++	int gen, type, zone;
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++
++	walk->batched = 0;
++
++	for_each_gen_type_zone(gen, type, zone) {
++		enum lru_list lru = type * LRU_INACTIVE_FILE;
++		int delta = walk->nr_pages[gen][type][zone];
++
++		if (!delta)
++			continue;
++
++		walk->nr_pages[gen][type][zone] = 0;
++		WRITE_ONCE(lrugen->nr_pages[gen][type][zone],
++			   lrugen->nr_pages[gen][type][zone] + delta);
++
++		if (lru_gen_is_active(lruvec, gen))
++			lru += LRU_ACTIVE;
++		__update_lru_size(lruvec, lru, zone, delta);
++	}
++}
++
++static int should_skip_vma(unsigned long start, unsigned long end, struct mm_walk *args)
++{
++	struct address_space *mapping;
++	struct vm_area_struct *vma = args->vma;
++	struct lru_gen_mm_walk *walk = args->private;
++
++	if (!vma_is_accessible(vma))
++		return true;
++
++	if (is_vm_hugetlb_page(vma))
++		return true;
++
++	if (vma->vm_flags & (VM_LOCKED | VM_SPECIAL | VM_SEQ_READ | VM_RAND_READ))
++		return true;
++
++	if (vma == get_gate_vma(vma->vm_mm))
++		return true;
++
++	if (vma_is_anonymous(vma))
++		return !walk->can_swap;
++
++	if (WARN_ON_ONCE(!vma->vm_file || !vma->vm_file->f_mapping))
++		return true;
++
++	mapping = vma->vm_file->f_mapping;
++	if (mapping_unevictable(mapping))
++		return true;
++
++	if (shmem_mapping(mapping))
++		return !walk->can_swap;
++
++	/* to exclude special mappings like dax, etc. */
++	return !mapping->a_ops->read_folio;
++}
++
++/*
++ * Some userspace memory allocators map many single-page VMAs. Instead of
++ * returning back to the PGD table for each of such VMAs, finish an entire PMD
++ * table to reduce zigzags and improve cache performance.
++ */
++static bool get_next_vma(unsigned long mask, unsigned long size, struct mm_walk *args,
++			 unsigned long *vm_start, unsigned long *vm_end)
++{
++	unsigned long start = round_up(*vm_end, size);
++	unsigned long end = (start | ~mask) + 1;
++
++	VM_WARN_ON_ONCE(mask & size);
++	VM_WARN_ON_ONCE((start & mask) != (*vm_start & mask));
++
++	while (args->vma) {
++		if (start >= args->vma->vm_end) {
++			args->vma = args->vma->vm_next;
++			continue;
++		}
++
++		if (end && end <= args->vma->vm_start)
++			return false;
++
++		if (should_skip_vma(args->vma->vm_start, args->vma->vm_end, args)) {
++			args->vma = args->vma->vm_next;
++			continue;
++		}
++
++		*vm_start = max(start, args->vma->vm_start);
++		*vm_end = min(end - 1, args->vma->vm_end - 1) + 1;
++
++		return true;
++	}
++
++	return false;
++}
++
+ static unsigned long get_pte_pfn(pte_t pte, struct vm_area_struct *vma, unsigned long addr)
+ {
+ 	unsigned long pfn = pte_pfn(pte);
+@@ -3295,8 +3774,28 @@ static unsigned long get_pte_pfn(pte_t p
+ 	return pfn;
+ }
+ 
++#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG)
++static unsigned long get_pmd_pfn(pmd_t pmd, struct vm_area_struct *vma, unsigned long addr)
++{
++	unsigned long pfn = pmd_pfn(pmd);
++
++	VM_WARN_ON_ONCE(addr < vma->vm_start || addr >= vma->vm_end);
++
++	if (!pmd_present(pmd) || is_huge_zero_pmd(pmd))
++		return -1;
++
++	if (WARN_ON_ONCE(pmd_devmap(pmd)))
++		return -1;
++
++	if (WARN_ON_ONCE(!pfn_valid(pfn)))
++		return -1;
++
++	return pfn;
++}
++#endif
++
+ static struct folio *get_pfn_folio(unsigned long pfn, struct mem_cgroup *memcg,
+-				   struct pglist_data *pgdat)
++				   struct pglist_data *pgdat, bool can_swap)
+ {
+ 	struct folio *folio;
+ 
+@@ -3311,9 +3810,375 @@ static struct folio *get_pfn_folio(unsig
+ 	if (folio_memcg_rcu(folio) != memcg)
+ 		return NULL;
+ 
++	/* file VMAs can contain anon pages from COW */
++	if (!folio_is_file_lru(folio) && !can_swap)
++		return NULL;
++
+ 	return folio;
+ }
+ 
++static bool suitable_to_scan(int total, int young)
++{
++	int n = clamp_t(int, cache_line_size() / sizeof(pte_t), 2, 8);
++
++	/* suitable if the average number of young PTEs per cacheline is >=1 */
++	return young * n >= total;
++}
++
++static bool walk_pte_range(pmd_t *pmd, unsigned long start, unsigned long end,
++			   struct mm_walk *args)
++{
++	int i;
++	pte_t *pte;
++	spinlock_t *ptl;
++	unsigned long addr;
++	int total = 0;
++	int young = 0;
++	struct lru_gen_mm_walk *walk = args->private;
++	struct mem_cgroup *memcg = lruvec_memcg(walk->lruvec);
++	struct pglist_data *pgdat = lruvec_pgdat(walk->lruvec);
++	int old_gen, new_gen = lru_gen_from_seq(walk->max_seq);
++
++	VM_WARN_ON_ONCE(pmd_leaf(*pmd));
++
++	ptl = pte_lockptr(args->mm, pmd);
++	if (!spin_trylock(ptl))
++		return false;
++
++	arch_enter_lazy_mmu_mode();
++
++	pte = pte_offset_map(pmd, start & PMD_MASK);
++restart:
++	for (i = pte_index(start), addr = start; addr != end; i++, addr += PAGE_SIZE) {
++		unsigned long pfn;
++		struct folio *folio;
++
++		total++;
++		walk->mm_stats[MM_LEAF_TOTAL]++;
++
++		pfn = get_pte_pfn(pte[i], args->vma, addr);
++		if (pfn == -1)
++			continue;
++
++		if (!pte_young(pte[i])) {
++			walk->mm_stats[MM_LEAF_OLD]++;
++			continue;
++		}
++
++		folio = get_pfn_folio(pfn, memcg, pgdat, walk->can_swap);
++		if (!folio)
++			continue;
++
++		if (!ptep_test_and_clear_young(args->vma, addr, pte + i))
++			VM_WARN_ON_ONCE(true);
++
++		young++;
++		walk->mm_stats[MM_LEAF_YOUNG]++;
++
++		if (pte_dirty(pte[i]) && !folio_test_dirty(folio) &&
++		    !(folio_test_anon(folio) && folio_test_swapbacked(folio) &&
++		      !folio_test_swapcache(folio)))
++			folio_mark_dirty(folio);
++
++		old_gen = folio_update_gen(folio, new_gen);
++		if (old_gen >= 0 && old_gen != new_gen)
++			update_batch_size(walk, folio, old_gen, new_gen);
++	}
++
++	if (i < PTRS_PER_PTE && get_next_vma(PMD_MASK, PAGE_SIZE, args, &start, &end))
++		goto restart;
++
++	pte_unmap(pte);
++
++	arch_leave_lazy_mmu_mode();
++	spin_unlock(ptl);
++
++	return suitable_to_scan(total, young);
++}
++
++#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG)
++static void walk_pmd_range_locked(pud_t *pud, unsigned long next, struct vm_area_struct *vma,
++				  struct mm_walk *args, unsigned long *bitmap, unsigned long *start)
++{
++	int i;
++	pmd_t *pmd;
++	spinlock_t *ptl;
++	struct lru_gen_mm_walk *walk = args->private;
++	struct mem_cgroup *memcg = lruvec_memcg(walk->lruvec);
++	struct pglist_data *pgdat = lruvec_pgdat(walk->lruvec);
++	int old_gen, new_gen = lru_gen_from_seq(walk->max_seq);
++
++	VM_WARN_ON_ONCE(pud_leaf(*pud));
++
++	/* try to batch at most 1+MIN_LRU_BATCH+1 entries */
++	if (*start == -1) {
++		*start = next;
++		return;
++	}
++
++	i = next == -1 ? 0 : pmd_index(next) - pmd_index(*start);
++	if (i && i <= MIN_LRU_BATCH) {
++		__set_bit(i - 1, bitmap);
++		return;
++	}
++
++	pmd = pmd_offset(pud, *start);
++
++	ptl = pmd_lockptr(args->mm, pmd);
++	if (!spin_trylock(ptl))
++		goto done;
++
++	arch_enter_lazy_mmu_mode();
++
++	do {
++		unsigned long pfn;
++		struct folio *folio;
++		unsigned long addr = i ? (*start & PMD_MASK) + i * PMD_SIZE : *start;
++
++		pfn = get_pmd_pfn(pmd[i], vma, addr);
++		if (pfn == -1)
++			goto next;
++
++		if (!pmd_trans_huge(pmd[i])) {
++			if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG))
++				pmdp_test_and_clear_young(vma, addr, pmd + i);
++			goto next;
++		}
++
++		folio = get_pfn_folio(pfn, memcg, pgdat, walk->can_swap);
++		if (!folio)
++			goto next;
++
++		if (!pmdp_test_and_clear_young(vma, addr, pmd + i))
++			goto next;
++
++		walk->mm_stats[MM_LEAF_YOUNG]++;
++
++		if (pmd_dirty(pmd[i]) && !folio_test_dirty(folio) &&
++		    !(folio_test_anon(folio) && folio_test_swapbacked(folio) &&
++		      !folio_test_swapcache(folio)))
++			folio_mark_dirty(folio);
++
++		old_gen = folio_update_gen(folio, new_gen);
++		if (old_gen >= 0 && old_gen != new_gen)
++			update_batch_size(walk, folio, old_gen, new_gen);
++next:
++		i = i > MIN_LRU_BATCH ? 0 : find_next_bit(bitmap, MIN_LRU_BATCH, i) + 1;
++	} while (i <= MIN_LRU_BATCH);
++
++	arch_leave_lazy_mmu_mode();
++	spin_unlock(ptl);
++done:
++	*start = -1;
++	bitmap_zero(bitmap, MIN_LRU_BATCH);
++}
++#else
++static void walk_pmd_range_locked(pud_t *pud, unsigned long next, struct vm_area_struct *vma,
++				  struct mm_walk *args, unsigned long *bitmap, unsigned long *start)
++{
++}
++#endif
++
++static void walk_pmd_range(pud_t *pud, unsigned long start, unsigned long end,
++			   struct mm_walk *args)
++{
++	int i;
++	pmd_t *pmd;
++	unsigned long next;
++	unsigned long addr;
++	struct vm_area_struct *vma;
++	unsigned long pos = -1;
++	struct lru_gen_mm_walk *walk = args->private;
++	unsigned long bitmap[BITS_TO_LONGS(MIN_LRU_BATCH)] = {};
++
++	VM_WARN_ON_ONCE(pud_leaf(*pud));
++
++	/*
++	 * Finish an entire PMD in two passes: the first only reaches to PTE
++	 * tables to avoid taking the PMD lock; the second, if necessary, takes
++	 * the PMD lock to clear the accessed bit in PMD entries.
++	 */
++	pmd = pmd_offset(pud, start & PUD_MASK);
++restart:
++	/* walk_pte_range() may call get_next_vma() */
++	vma = args->vma;
++	for (i = pmd_index(start), addr = start; addr != end; i++, addr = next) {
++		pmd_t val = pmd_read_atomic(pmd + i);
++
++		/* for pmd_read_atomic() */
++		barrier();
++
++		next = pmd_addr_end(addr, end);
++
++		if (!pmd_present(val) || is_huge_zero_pmd(val)) {
++			walk->mm_stats[MM_LEAF_TOTAL]++;
++			continue;
++		}
++
++#ifdef CONFIG_TRANSPARENT_HUGEPAGE
++		if (pmd_trans_huge(val)) {
++			unsigned long pfn = pmd_pfn(val);
++			struct pglist_data *pgdat = lruvec_pgdat(walk->lruvec);
++
++			walk->mm_stats[MM_LEAF_TOTAL]++;
++
++			if (!pmd_young(val)) {
++				walk->mm_stats[MM_LEAF_OLD]++;
++				continue;
++			}
++
++			/* try to avoid unnecessary memory loads */
++			if (pfn < pgdat->node_start_pfn || pfn >= pgdat_end_pfn(pgdat))
++				continue;
++
++			walk_pmd_range_locked(pud, addr, vma, args, bitmap, &pos);
++			continue;
++		}
++#endif
++		walk->mm_stats[MM_NONLEAF_TOTAL]++;
++
++#ifdef CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG
++		if (!pmd_young(val))
++			continue;
++
++		walk_pmd_range_locked(pud, addr, vma, args, bitmap, &pos);
++#endif
++		if (!walk->force_scan && !test_bloom_filter(walk->lruvec, walk->max_seq, pmd + i))
++			continue;
++
++		walk->mm_stats[MM_NONLEAF_FOUND]++;
++
++		if (!walk_pte_range(&val, addr, next, args))
++			continue;
++
++		walk->mm_stats[MM_NONLEAF_ADDED]++;
++
++		/* carry over to the next generation */
++		update_bloom_filter(walk->lruvec, walk->max_seq + 1, pmd + i);
++	}
++
++	walk_pmd_range_locked(pud, -1, vma, args, bitmap, &pos);
++
++	if (i < PTRS_PER_PMD && get_next_vma(PUD_MASK, PMD_SIZE, args, &start, &end))
++		goto restart;
++}
++
++static int walk_pud_range(p4d_t *p4d, unsigned long start, unsigned long end,
++			  struct mm_walk *args)
++{
++	int i;
++	pud_t *pud;
++	unsigned long addr;
++	unsigned long next;
++	struct lru_gen_mm_walk *walk = args->private;
++
++	VM_WARN_ON_ONCE(p4d_leaf(*p4d));
++
++	pud = pud_offset(p4d, start & P4D_MASK);
++restart:
++	for (i = pud_index(start), addr = start; addr != end; i++, addr = next) {
++		pud_t val = READ_ONCE(pud[i]);
++
++		next = pud_addr_end(addr, end);
++
++		if (!pud_present(val) || WARN_ON_ONCE(pud_leaf(val)))
++			continue;
++
++		walk_pmd_range(&val, addr, next, args);
++
++		/* a racy check to curtail the waiting time */
++		if (wq_has_sleeper(&walk->lruvec->mm_state.wait))
++			return 1;
++
++		if (need_resched() || walk->batched >= MAX_LRU_BATCH) {
++			end = (addr | ~PUD_MASK) + 1;
++			goto done;
++		}
++	}
++
++	if (i < PTRS_PER_PUD && get_next_vma(P4D_MASK, PUD_SIZE, args, &start, &end))
++		goto restart;
++
++	end = round_up(end, P4D_SIZE);
++done:
++	if (!end || !args->vma)
++		return 1;
++
++	walk->next_addr = max(end, args->vma->vm_start);
++
++	return -EAGAIN;
++}
++
++static void walk_mm(struct lruvec *lruvec, struct mm_struct *mm, struct lru_gen_mm_walk *walk)
++{
++	static const struct mm_walk_ops mm_walk_ops = {
++		.test_walk = should_skip_vma,
++		.p4d_entry = walk_pud_range,
++	};
++
++	int err;
++	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
++
++	walk->next_addr = FIRST_USER_ADDRESS;
++
++	do {
++		err = -EBUSY;
++
++		/* folio_update_gen() requires stable folio_memcg() */
++		if (!mem_cgroup_trylock_pages(memcg))
++			break;
++
++		/* the caller might be holding the lock for write */
++		if (mmap_read_trylock(mm)) {
++			err = walk_page_range(mm, walk->next_addr, ULONG_MAX, &mm_walk_ops, walk);
++
++			mmap_read_unlock(mm);
++		}
++
++		mem_cgroup_unlock_pages();
++
++		if (walk->batched) {
++			spin_lock_irq(&lruvec->lru_lock);
++			reset_batch_size(lruvec, walk);
++			spin_unlock_irq(&lruvec->lru_lock);
++		}
++
++		cond_resched();
++	} while (err == -EAGAIN);
++}
++
++static struct lru_gen_mm_walk *set_mm_walk(struct pglist_data *pgdat)
++{
++	struct lru_gen_mm_walk *walk = current->reclaim_state->mm_walk;
++
++	if (pgdat && current_is_kswapd()) {
++		VM_WARN_ON_ONCE(walk);
++
++		walk = &pgdat->mm_walk;
++	} else if (!pgdat && !walk) {
++		VM_WARN_ON_ONCE(current_is_kswapd());
++
++		walk = kzalloc(sizeof(*walk), __GFP_HIGH | __GFP_NOMEMALLOC | __GFP_NOWARN);
++	}
++
++	current->reclaim_state->mm_walk = walk;
++
++	return walk;
++}
++
++static void clear_mm_walk(void)
++{
++	struct lru_gen_mm_walk *walk = current->reclaim_state->mm_walk;
++
++	VM_WARN_ON_ONCE(walk && memchr_inv(walk->nr_pages, 0, sizeof(walk->nr_pages)));
++	VM_WARN_ON_ONCE(walk && memchr_inv(walk->mm_stats, 0, sizeof(walk->mm_stats)));
++
++	current->reclaim_state->mm_walk = NULL;
++
++	if (!current_is_kswapd())
++		kfree(walk);
++}
++
+ static void inc_min_seq(struct lruvec *lruvec, int type)
+ {
+ 	struct lru_gen_struct *lrugen = &lruvec->lrugen;
+@@ -3365,7 +4230,7 @@ next:
+ 	return success;
+ }
+ 
+-static void inc_max_seq(struct lruvec *lruvec, unsigned long max_seq, bool can_swap)
++static void inc_max_seq(struct lruvec *lruvec, bool can_swap)
+ {
+ 	int prev, next;
+ 	int type, zone;
+@@ -3375,9 +4240,6 @@ static void inc_max_seq(struct lruvec *l
+ 
+ 	VM_WARN_ON_ONCE(!seq_is_valid(lruvec));
+ 
+-	if (max_seq != lrugen->max_seq)
+-		goto unlock;
+-
+ 	for (type = ANON_AND_FILE - 1; type >= 0; type--) {
+ 		if (get_nr_gens(lruvec, type) != MAX_NR_GENS)
+ 			continue;
+@@ -3415,10 +4277,74 @@ static void inc_max_seq(struct lruvec *l
+ 
+ 	/* make sure preceding modifications appear */
+ 	smp_store_release(&lrugen->max_seq, lrugen->max_seq + 1);
+-unlock:
++
+ 	spin_unlock_irq(&lruvec->lru_lock);
+ }
+ 
++static bool try_to_inc_max_seq(struct lruvec *lruvec, unsigned long max_seq,
++			       struct scan_control *sc, bool can_swap)
++{
++	bool success;
++	struct lru_gen_mm_walk *walk;
++	struct mm_struct *mm = NULL;
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++
++	VM_WARN_ON_ONCE(max_seq > READ_ONCE(lrugen->max_seq));
++
++	/* see the comment in iterate_mm_list() */
++	if (max_seq <= READ_ONCE(lruvec->mm_state.seq)) {
++		success = false;
++		goto done;
++	}
++
++	/*
++	 * If the hardware doesn't automatically set the accessed bit, fallback
++	 * to lru_gen_look_around(), which only clears the accessed bit in a
++	 * handful of PTEs. Spreading the work out over a period of time usually
++	 * is less efficient, but it avoids bursty page faults.
++	 */
++	if (!arch_has_hw_pte_young()) {
++		success = iterate_mm_list_nowalk(lruvec, max_seq);
++		goto done;
++	}
++
++	walk = set_mm_walk(NULL);
++	if (!walk) {
++		success = iterate_mm_list_nowalk(lruvec, max_seq);
++		goto done;
++	}
++
++	walk->lruvec = lruvec;
++	walk->max_seq = max_seq;
++	walk->can_swap = can_swap;
++	walk->force_scan = false;
++
++	do {
++		success = iterate_mm_list(lruvec, walk, &mm);
++		if (mm)
++			walk_mm(lruvec, mm, walk);
++
++		cond_resched();
++	} while (mm);
++done:
++	if (!success) {
++		if (sc->priority <= DEF_PRIORITY - 2)
++			wait_event_killable(lruvec->mm_state.wait,
++					    max_seq < READ_ONCE(lrugen->max_seq));
++
++		return max_seq < READ_ONCE(lrugen->max_seq);
++	}
++
++	VM_WARN_ON_ONCE(max_seq != READ_ONCE(lrugen->max_seq));
++
++	inc_max_seq(lruvec, can_swap);
++	/* either this sees any waiters or they will see updated max_seq */
++	if (wq_has_sleeper(&lruvec->mm_state.wait))
++		wake_up_all(&lruvec->mm_state.wait);
++
++	return true;
++}
++
+ static bool should_run_aging(struct lruvec *lruvec, unsigned long max_seq, unsigned long *min_seq,
+ 			     struct scan_control *sc, bool can_swap, unsigned long *nr_to_scan)
+ {
+@@ -3494,7 +4420,7 @@ static void age_lruvec(struct lruvec *lr
+ 
+ 	need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, swappiness, &nr_to_scan);
+ 	if (need_aging)
+-		inc_max_seq(lruvec, max_seq, swappiness);
++		try_to_inc_max_seq(lruvec, max_seq, sc, swappiness);
+ }
+ 
+ static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc)
+@@ -3503,6 +4429,8 @@ static void lru_gen_age_node(struct pgli
+ 
+ 	VM_WARN_ON_ONCE(!current_is_kswapd());
+ 
++	set_mm_walk(pgdat);
++
+ 	memcg = mem_cgroup_iter(NULL, NULL, NULL);
+ 	do {
+ 		struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat);
+@@ -3511,11 +4439,16 @@ static void lru_gen_age_node(struct pgli
+ 
+ 		cond_resched();
+ 	} while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)));
++
++	clear_mm_walk();
+ }
+ 
+ /*
+  * This function exploits spatial locality when shrink_page_list() walks the
+- * rmap. It scans the adjacent PTEs of a young PTE and promotes hot pages.
++ * rmap. It scans the adjacent PTEs of a young PTE and promotes hot pages. If
++ * the scan was done cacheline efficiently, it adds the PMD entry pointing to
++ * the PTE table to the Bloom filter. This forms a feedback loop between the
++ * eviction and the aging.
+  */
+ void lru_gen_look_around(struct page_vma_mapped_walk *pvmw)
+ {
+@@ -3524,6 +4457,8 @@ void lru_gen_look_around(struct page_vma
+ 	unsigned long start;
+ 	unsigned long end;
+ 	unsigned long addr;
++	struct lru_gen_mm_walk *walk;
++	int young = 0;
+ 	unsigned long bitmap[BITS_TO_LONGS(MIN_LRU_BATCH)] = {};
+ 	struct folio *folio = pfn_folio(pvmw->pfn);
+ 	struct mem_cgroup *memcg = folio_memcg(folio);
+@@ -3538,6 +4473,9 @@ void lru_gen_look_around(struct page_vma
+ 	if (spin_is_contended(pvmw->ptl))
+ 		return;
+ 
++	/* avoid taking the LRU lock under the PTL when possible */
++	walk = current->reclaim_state ? current->reclaim_state->mm_walk : NULL;
++
+ 	start = max(pvmw->address & PMD_MASK, pvmw->vma->vm_start);
+ 	end = min(pvmw->address | ~PMD_MASK, pvmw->vma->vm_end - 1) + 1;
+ 
+@@ -3567,13 +4505,15 @@ void lru_gen_look_around(struct page_vma
+ 		if (!pte_young(pte[i]))
+ 			continue;
+ 
+-		folio = get_pfn_folio(pfn, memcg, pgdat);
++		folio = get_pfn_folio(pfn, memcg, pgdat, !walk || walk->can_swap);
+ 		if (!folio)
+ 			continue;
+ 
+ 		if (!ptep_test_and_clear_young(pvmw->vma, addr, pte + i))
+ 			VM_WARN_ON_ONCE(true);
+ 
++		young++;
++
+ 		if (pte_dirty(pte[i]) && !folio_test_dirty(folio) &&
+ 		    !(folio_test_anon(folio) && folio_test_swapbacked(folio) &&
+ 		      !folio_test_swapcache(folio)))
+@@ -3589,7 +4529,11 @@ void lru_gen_look_around(struct page_vma
+ 	arch_leave_lazy_mmu_mode();
+ 	rcu_read_unlock();
+ 
+-	if (bitmap_weight(bitmap, MIN_LRU_BATCH) < PAGEVEC_SIZE) {
++	/* feedback from rmap walkers to page table walkers */
++	if (suitable_to_scan(i, young))
++		update_bloom_filter(lruvec, max_seq, pvmw->pmd);
++
++	if (!walk && bitmap_weight(bitmap, MIN_LRU_BATCH) < PAGEVEC_SIZE) {
+ 		for_each_set_bit(i, bitmap, MIN_LRU_BATCH) {
+ 			folio = pfn_folio(pte_pfn(pte[i]));
+ 			folio_activate(folio);
+@@ -3601,8 +4545,10 @@ void lru_gen_look_around(struct page_vma
+ 	if (!mem_cgroup_trylock_pages(memcg))
+ 		return;
+ 
+-	spin_lock_irq(&lruvec->lru_lock);
+-	new_gen = lru_gen_from_seq(lruvec->lrugen.max_seq);
++	if (!walk) {
++		spin_lock_irq(&lruvec->lru_lock);
++		new_gen = lru_gen_from_seq(lruvec->lrugen.max_seq);
++	}
+ 
+ 	for_each_set_bit(i, bitmap, MIN_LRU_BATCH) {
+ 		folio = pfn_folio(pte_pfn(pte[i]));
+@@ -3613,10 +4559,14 @@ void lru_gen_look_around(struct page_vma
+ 		if (old_gen < 0 || old_gen == new_gen)
+ 			continue;
+ 
+-		lru_gen_update_size(lruvec, folio, old_gen, new_gen);
++		if (walk)
++			update_batch_size(walk, folio, old_gen, new_gen);
++		else
++			lru_gen_update_size(lruvec, folio, old_gen, new_gen);
+ 	}
+ 
+-	spin_unlock_irq(&lruvec->lru_lock);
++	if (!walk)
++		spin_unlock_irq(&lruvec->lru_lock);
+ 
+ 	mem_cgroup_unlock_pages();
+ }
+@@ -3899,6 +4849,7 @@ static int evict_folios(struct lruvec *l
+ 	struct folio *folio;
+ 	enum vm_event_item item;
+ 	struct reclaim_stat stat;
++	struct lru_gen_mm_walk *walk;
+ 	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
+ 	struct pglist_data *pgdat = lruvec_pgdat(lruvec);
+ 
+@@ -3935,6 +4886,10 @@ static int evict_folios(struct lruvec *l
+ 
+ 	move_pages_to_lru(lruvec, &list);
+ 
++	walk = current->reclaim_state->mm_walk;
++	if (walk && walk->batched)
++		reset_batch_size(lruvec, walk);
++
+ 	item = current_is_kswapd() ? PGSTEAL_KSWAPD : PGSTEAL_DIRECT;
+ 	if (!cgroup_reclaim(sc))
+ 		__count_vm_events(item, reclaimed);
+@@ -3951,6 +4906,11 @@ static int evict_folios(struct lruvec *l
+ 	return scanned;
+ }
+ 
++/*
++ * For future optimizations:
++ * 1. Defer try_to_inc_max_seq() to workqueues to reduce latency for memcg
++ *    reclaim.
++ */
+ static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc,
+ 				    bool can_swap)
+ {
+@@ -3976,7 +4936,8 @@ static unsigned long get_nr_to_scan(stru
+ 	if (current_is_kswapd())
+ 		return 0;
+ 
+-	inc_max_seq(lruvec, max_seq, can_swap);
++	if (try_to_inc_max_seq(lruvec, max_seq, sc, can_swap))
++		return nr_to_scan;
+ done:
+ 	return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0;
+ }
+@@ -3990,6 +4951,8 @@ static void lru_gen_shrink_lruvec(struct
+ 
+ 	blk_start_plug(&plug);
+ 
++	set_mm_walk(lruvec_pgdat(lruvec));
++
+ 	while (true) {
+ 		int delta;
+ 		int swappiness;
+@@ -4017,6 +4980,8 @@ static void lru_gen_shrink_lruvec(struct
+ 		cond_resched();
+ 	}
+ 
++	clear_mm_walk();
++
+ 	blk_finish_plug(&plug);
+ }
+ 
+@@ -4033,15 +4998,21 @@ void lru_gen_init_lruvec(struct lruvec *
+ 
+ 	for_each_gen_type_zone(gen, type, zone)
+ 		INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]);
++
++	lruvec->mm_state.seq = MIN_NR_GENS;
++	init_waitqueue_head(&lruvec->mm_state.wait);
+ }
+ 
+ #ifdef CONFIG_MEMCG
+ void lru_gen_init_memcg(struct mem_cgroup *memcg)
+ {
++	INIT_LIST_HEAD(&memcg->mm_list.fifo);
++	spin_lock_init(&memcg->mm_list.lock);
+ }
+ 
+ void lru_gen_exit_memcg(struct mem_cgroup *memcg)
+ {
++	int i;
+ 	int nid;
+ 
+ 	for_each_node(nid) {
+@@ -4049,6 +5020,11 @@ void lru_gen_exit_memcg(struct mem_cgrou
+ 
+ 		VM_WARN_ON_ONCE(memchr_inv(lruvec->lrugen.nr_pages, 0,
+ 					   sizeof(lruvec->lrugen.nr_pages)));
++
++		for (i = 0; i < NR_BLOOM_FILTERS; i++) {
++			bitmap_free(lruvec->mm_state.filters[i]);
++			lruvec->mm_state.filters[i] = NULL;
++		}
+ 	}
+ }
+ #endif
diff --git a/target/linux/generic/backport-6.0/108-mm-multi-gen-LRU-optimize-multiple-memcgs.patch b/target/linux/generic/backport-6.0/108-mm-multi-gen-LRU-optimize-multiple-memcgs.patch
new file mode 100644
index 000000000..5430cc66e
--- /dev/null
+++ b/target/linux/generic/backport-6.0/108-mm-multi-gen-LRU-optimize-multiple-memcgs.patch
@@ -0,0 +1,290 @@
+From 6b9670b94ba2b49b289b997121062500e32fc3e4 Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Thu, 27 Jan 2022 19:59:54 -0700
+Subject: [PATCH 09/14] mm: multi-gen LRU: optimize multiple memcgs
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+When multiple memcgs are available, it is possible to use generations
+as a frame of reference to make better choices and improve overall
+performance under global memory pressure. This patch adds a basic
+optimization to select memcgs that can drop single-use unmapped clean
+pages first. Doing so reduces the chance of going into the aging path
+or swapping, which can be costly.
+
+A typical example that benefits from this optimization is a server
+running mixed types of workloads, e.g., heavy anon workload in one
+memcg and heavy buffered I/O workload in the other.
+
+Though this optimization can be applied to both kswapd and direct
+reclaim, it is only added to kswapd to keep the patchset manageable.
+Later improvements may cover the direct reclaim path.
+
+While ensuring certain fairness to all eligible memcgs, proportional
+scans of individual memcgs also require proper backoff to avoid
+overshooting their aggregate reclaim target by too much. Otherwise it
+can cause high direct reclaim latency. The conditions for backoff are:
+1. At low priorities, for direct reclaim, if aging fairness or direct
+   reclaim latency is at risk, i.e., aging one memcg multiple times or
+   swapping after the target is met.
+2. At high priorities, for global reclaim, if per-zone free pages are
+   above respective watermarks.
+
+Server benchmark results:
+  Mixed workloads:
+    fio (buffered I/O): +[19, 21]%
+                IOPS         BW
+      patch1-8: 1880k        7343MiB/s
+      patch1-9: 2252k        8796MiB/s
+
+    memcached (anon): +[119, 123]%
+                Ops/sec      KB/sec
+      patch1-8: 862768.65    33514.68
+      patch1-9: 1911022.12   74234.54
+
+  Mixed workloads:
+    fio (buffered I/O): +[75, 77]%
+                IOPS         BW
+      5.19-rc1: 1279k        4996MiB/s
+      patch1-9: 2252k        8796MiB/s
+
+    memcached (anon): +[13, 15]%
+                Ops/sec      KB/sec
+      5.19-rc1: 1673524.04   65008.87
+      patch1-9: 1911022.12   74234.54
+
+  Configurations:
+    (changes since patch 6)
+
+    cat mixed.sh
+    modprobe brd rd_nr=2 rd_size=56623104
+
+    swapoff -a
+    mkswap /dev/ram0
+    swapon /dev/ram0
+
+    mkfs.ext4 /dev/ram1
+    mount -t ext4 /dev/ram1 /mnt
+
+    memtier_benchmark -S /var/run/memcached/memcached.sock \
+      -P memcache_binary -n allkeys --key-minimum=1 \
+      --key-maximum=50000000 --key-pattern=P:P -c 1 -t 36 \
+      --ratio 1:0 --pipeline 8 -d 2000
+
+    fio -name=mglru --numjobs=36 --directory=/mnt --size=1408m \
+      --buffered=1 --ioengine=io_uring --iodepth=128 \
+      --iodepth_batch_submit=32 --iodepth_batch_complete=32 \
+      --rw=randread --random_distribution=random --norandommap \
+      --time_based --ramp_time=10m --runtime=90m --group_reporting &
+    pid=$!
+
+    sleep 200
+
+    memtier_benchmark -S /var/run/memcached/memcached.sock \
+      -P memcache_binary -n allkeys --key-minimum=1 \
+      --key-maximum=50000000 --key-pattern=R:R -c 1 -t 36 \
+      --ratio 0:1 --pipeline 8 --randomize --distinct-client-seed
+
+    kill -INT $pid
+    wait
+
+Client benchmark results:
+  no change (CONFIG_MEMCG=n)
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I7e00e0c733437e534ac98031cf8154a681becc00
+---
+ mm/vmscan.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 95 insertions(+), 9 deletions(-)
+
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -131,6 +131,12 @@ struct scan_control {
+ 	/* Always discard instead of demoting to lower tier memory */
+ 	unsigned int no_demotion:1;
+ 
++#ifdef CONFIG_LRU_GEN
++	/* help kswapd make better choices among multiple memcgs */
++	unsigned int memcgs_need_aging:1;
++	unsigned long last_reclaimed;
++#endif
++
+ 	/* Allocation order */
+ 	s8 order;
+ 
+@@ -4429,6 +4435,19 @@ static void lru_gen_age_node(struct pgli
+ 
+ 	VM_WARN_ON_ONCE(!current_is_kswapd());
+ 
++	sc->last_reclaimed = sc->nr_reclaimed;
++
++	/*
++	 * To reduce the chance of going into the aging path, which can be
++	 * costly, optimistically skip it if the flag below was cleared in the
++	 * eviction path. This improves the overall performance when multiple
++	 * memcgs are available.
++	 */
++	if (!sc->memcgs_need_aging) {
++		sc->memcgs_need_aging = true;
++		return;
++	}
++
+ 	set_mm_walk(pgdat);
+ 
+ 	memcg = mem_cgroup_iter(NULL, NULL, NULL);
+@@ -4840,7 +4859,8 @@ static int isolate_folios(struct lruvec
+ 	return scanned;
+ }
+ 
+-static int evict_folios(struct lruvec *lruvec, struct scan_control *sc, int swappiness)
++static int evict_folios(struct lruvec *lruvec, struct scan_control *sc, int swappiness,
++			bool *need_swapping)
+ {
+ 	int type;
+ 	int scanned;
+@@ -4903,6 +4923,9 @@ static int evict_folios(struct lruvec *l
+ 
+ 	sc->nr_reclaimed += reclaimed;
+ 
++	if (need_swapping && type == LRU_GEN_ANON)
++		*need_swapping = true;
++
+ 	return scanned;
+ }
+ 
+@@ -4912,9 +4935,8 @@ static int evict_folios(struct lruvec *l
+  *    reclaim.
+  */
+ static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_control *sc,
+-				    bool can_swap)
++				    bool can_swap, bool *need_aging)
+ {
+-	bool need_aging;
+ 	unsigned long nr_to_scan;
+ 	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
+ 	DEFINE_MAX_SEQ(lruvec);
+@@ -4924,8 +4946,8 @@ static unsigned long get_nr_to_scan(stru
+ 	    (mem_cgroup_below_low(memcg) && !sc->memcg_low_reclaim))
+ 		return 0;
+ 
+-	need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, can_swap, &nr_to_scan);
+-	if (!need_aging)
++	*need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, can_swap, &nr_to_scan);
++	if (!*need_aging)
+ 		return nr_to_scan;
+ 
+ 	/* skip the aging path at the default priority */
+@@ -4942,10 +4964,67 @@ done:
+ 	return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0;
+ }
+ 
++static bool should_abort_scan(struct lruvec *lruvec, unsigned long seq,
++			      struct scan_control *sc, bool need_swapping)
++{
++	int i;
++	DEFINE_MAX_SEQ(lruvec);
++
++	if (!current_is_kswapd()) {
++		/* age each memcg at most once to ensure fairness */
++		if (max_seq - seq > 1)
++			return true;
++
++		/* over-swapping can increase allocation latency */
++		if (sc->nr_reclaimed >= sc->nr_to_reclaim && need_swapping)
++			return true;
++
++		/* give this thread a chance to exit and free its memory */
++		if (fatal_signal_pending(current)) {
++			sc->nr_reclaimed += MIN_LRU_BATCH;
++			return true;
++		}
++
++		if (cgroup_reclaim(sc))
++			return false;
++	} else if (sc->nr_reclaimed - sc->last_reclaimed < sc->nr_to_reclaim)
++		return false;
++
++	/* keep scanning at low priorities to ensure fairness */
++	if (sc->priority > DEF_PRIORITY - 2)
++		return false;
++
++	/*
++	 * A minimum amount of work was done under global memory pressure. For
++	 * kswapd, it may be overshooting. For direct reclaim, the allocation
++	 * may succeed if all suitable zones are somewhat safe. In either case,
++	 * it's better to stop now, and restart later if necessary.
++	 */
++	for (i = 0; i <= sc->reclaim_idx; i++) {
++		unsigned long wmark;
++		struct zone *zone = lruvec_pgdat(lruvec)->node_zones + i;
++
++		if (!managed_zone(zone))
++			continue;
++
++		wmark = current_is_kswapd() ? high_wmark_pages(zone) : low_wmark_pages(zone);
++		if (wmark > zone_page_state(zone, NR_FREE_PAGES))
++			return false;
++	}
++
++	sc->nr_reclaimed += MIN_LRU_BATCH;
++
++	return true;
++}
++
+ static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_control *sc)
+ {
+ 	struct blk_plug plug;
++	bool need_aging = false;
++	bool need_swapping = false;
+ 	unsigned long scanned = 0;
++	unsigned long reclaimed = sc->nr_reclaimed;
++	DEFINE_MAX_SEQ(lruvec);
+ 
+ 	lru_add_drain();
+ 
+@@ -4965,21 +5044,28 @@ static void lru_gen_shrink_lruvec(struct
+ 		else
+ 			swappiness = 0;
+ 
+-		nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness);
++		nr_to_scan = get_nr_to_scan(lruvec, sc, swappiness, &need_aging);
+ 		if (!nr_to_scan)
+-			break;
++			goto done;
+ 
+-		delta = evict_folios(lruvec, sc, swappiness);
++		delta = evict_folios(lruvec, sc, swappiness, &need_swapping);
+ 		if (!delta)
+-			break;
++			goto done;
+ 
+ 		scanned += delta;
+ 		if (scanned >= nr_to_scan)
+ 			break;
+ 
++		if (should_abort_scan(lruvec, max_seq, sc, need_swapping))
++			break;
++
+ 		cond_resched();
+ 	}
+ 
++	/* see the comment in lru_gen_age_node() */
++	if (sc->nr_reclaimed - reclaimed >= MIN_LRU_BATCH && !need_aging)
++		sc->memcgs_need_aging = false;
++done:
+ 	clear_mm_walk();
+ 
+ 	blk_finish_plug(&plug);
diff --git a/target/linux/generic/backport-6.0/109-mm-multi-gen-LRU-kill-switch.patch b/target/linux/generic/backport-6.0/109-mm-multi-gen-LRU-kill-switch.patch
new file mode 100644
index 000000000..384365a33
--- /dev/null
+++ b/target/linux/generic/backport-6.0/109-mm-multi-gen-LRU-kill-switch.patch
@@ -0,0 +1,475 @@
+From ef61bb3622ee0f36e055dfd5006badff08f5ce61 Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Thu, 27 Jan 2022 19:52:09 -0700
+Subject: [PATCH 10/14] mm: multi-gen LRU: kill switch
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add /sys/kernel/mm/lru_gen/enabled as a kill switch. Components that
+can be disabled include:
+  0x0001: the multi-gen LRU core
+  0x0002: walking page table, when arch_has_hw_pte_young() returns
+          true
+  0x0004: clearing the accessed bit in non-leaf PMD entries, when
+          CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y
+  [yYnN]: apply to all the components above
+E.g.,
+  echo y >/sys/kernel/mm/lru_gen/enabled
+  cat /sys/kernel/mm/lru_gen/enabled
+  0x0007
+  echo 5 >/sys/kernel/mm/lru_gen/enabled
+  cat /sys/kernel/mm/lru_gen/enabled
+  0x0005
+
+NB: the page table walks happen on the scale of seconds under heavy
+memory pressure, in which case the mmap_lock contention is a lesser
+concern, compared with the LRU lock contention and the I/O congestion.
+So far the only well-known case of the mmap_lock contention happens on
+Android, due to Scudo [1] which allocates several thousand VMAs for
+merely a few hundred MBs. The SPF and the Maple Tree also have
+provided their own assessments [2][3]. However, if walking page tables
+does worsen the mmap_lock contention, the kill switch can be used to
+disable it. In this case the multi-gen LRU will suffer a minor
+performance degradation, as shown previously.
+
+Clearing the accessed bit in non-leaf PMD entries can also be
+disabled, since this behavior was not tested on x86 varieties other
+than Intel and AMD.
+
+[1] https://source.android.com/devices/tech/debug/scudo
+[2] https://lore.kernel.org/r/20220128131006.67712-1-michel@lespinasse.org/
+[3] https://lore.kernel.org/r/20220426150616.3937571-1-Liam.Howlett@oracle.com/
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I4c909618e8fed7fb1337f6624bbe542ec920a515
+---
+ include/linux/cgroup.h          |  15 ++-
+ include/linux/mm_inline.h       |  15 ++-
+ include/linux/mmzone.h          |   9 ++
+ kernel/cgroup/cgroup-internal.h |   1 -
+ mm/Kconfig                      |   6 +
+ mm/vmscan.c                     | 228 +++++++++++++++++++++++++++++++-
+ 6 files changed, 265 insertions(+), 9 deletions(-)
+
+--- a/include/linux/cgroup.h
++++ b/include/linux/cgroup.h
+@@ -432,6 +432,18 @@ static inline void cgroup_put(struct cgr
+ 	css_put(&cgrp->self);
+ }
+ 
++extern struct mutex cgroup_mutex;
++
++static inline void cgroup_lock(void)
++{
++	mutex_lock(&cgroup_mutex);
++}
++
++static inline void cgroup_unlock(void)
++{
++	mutex_unlock(&cgroup_mutex);
++}
++
+ /**
+  * task_css_set_check - obtain a task's css_set with extra access conditions
+  * @task: the task to obtain css_set for
+@@ -446,7 +458,6 @@ static inline void cgroup_put(struct cgr
+  * as locks used during the cgroup_subsys::attach() methods.
+  */
+ #ifdef CONFIG_PROVE_RCU
+-extern struct mutex cgroup_mutex;
+ extern spinlock_t css_set_lock;
+ #define task_css_set_check(task, __c)					\
+ 	rcu_dereference_check((task)->cgroups,				\
+@@ -708,6 +719,8 @@ struct cgroup;
+ static inline u64 cgroup_id(const struct cgroup *cgrp) { return 1; }
+ static inline void css_get(struct cgroup_subsys_state *css) {}
+ static inline void css_put(struct cgroup_subsys_state *css) {}
++static inline void cgroup_lock(void) {}
++static inline void cgroup_unlock(void) {}
+ static inline int cgroup_attach_task_all(struct task_struct *from,
+ 					 struct task_struct *t) { return 0; }
+ static inline int cgroupstats_build(struct cgroupstats *stats,
+--- a/include/linux/mm_inline.h
++++ b/include/linux/mm_inline.h
+@@ -106,10 +106,21 @@ static __always_inline enum lru_list fol
+ 
+ #ifdef CONFIG_LRU_GEN
+ 
++#ifdef CONFIG_LRU_GEN_ENABLED
+ static inline bool lru_gen_enabled(void)
+ {
+-	return true;
++	DECLARE_STATIC_KEY_TRUE(lru_gen_caps[NR_LRU_GEN_CAPS]);
++
++	return static_branch_likely(&lru_gen_caps[LRU_GEN_CORE]);
++}
++#else
++static inline bool lru_gen_enabled(void)
++{
++	DECLARE_STATIC_KEY_FALSE(lru_gen_caps[NR_LRU_GEN_CAPS]);
++
++	return static_branch_unlikely(&lru_gen_caps[LRU_GEN_CORE]);
+ }
++#endif
+ 
+ static inline bool lru_gen_in_fault(void)
+ {
+@@ -222,7 +233,7 @@ static inline bool lru_gen_add_folio(str
+ 
+ 	VM_WARN_ON_ONCE_FOLIO(gen != -1, folio);
+ 
+-	if (folio_test_unevictable(folio))
++	if (folio_test_unevictable(folio) || !lrugen->enabled)
+ 		return false;
+ 	/*
+ 	 * There are three common cases for this page:
+--- a/include/linux/mmzone.h
++++ b/include/linux/mmzone.h
+@@ -384,6 +384,13 @@ enum {
+ 	LRU_GEN_FILE,
+ };
+ 
++enum {
++	LRU_GEN_CORE,
++	LRU_GEN_MM_WALK,
++	LRU_GEN_NONLEAF_YOUNG,
++	NR_LRU_GEN_CAPS
++};
++
+ #define MIN_LRU_BATCH		BITS_PER_LONG
+ #define MAX_LRU_BATCH		(MIN_LRU_BATCH * 64)
+ 
+@@ -425,6 +432,8 @@ struct lru_gen_struct {
+ 	/* can be modified without holding the LRU lock */
+ 	atomic_long_t evicted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS];
+ 	atomic_long_t refaulted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS];
++	/* whether the multi-gen LRU is enabled */
++	bool enabled;
+ };
+ 
+ enum {
+--- a/kernel/cgroup/cgroup-internal.h
++++ b/kernel/cgroup/cgroup-internal.h
+@@ -164,7 +164,6 @@ struct cgroup_mgctx {
+ #define DEFINE_CGROUP_MGCTX(name)						\
+ 	struct cgroup_mgctx name = CGROUP_MGCTX_INIT(name)
+ 
+-extern struct mutex cgroup_mutex;
+ extern spinlock_t css_set_lock;
+ extern struct cgroup_subsys *cgroup_subsys[];
+ extern struct list_head cgroup_roots;
+--- a/mm/Kconfig
++++ b/mm/Kconfig
+@@ -1133,6 +1133,12 @@ config LRU_GEN
+ 	help
+ 	  A high performance LRU implementation to overcommit memory.
+ 
++config LRU_GEN_ENABLED
++	bool "Enable by default"
++	depends on LRU_GEN
++	help
++	  This option enables the multi-gen LRU by default.
++
+ config LRU_GEN_STATS
+ 	bool "Full stats for debugging"
+ 	depends on LRU_GEN
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -51,6 +51,7 @@
+ #include <linux/psi.h>
+ #include <linux/pagewalk.h>
+ #include <linux/shmem_fs.h>
++#include <linux/ctype.h>
+ 
+ #include <asm/tlbflush.h>
+ #include <asm/div64.h>
+@@ -3070,6 +3071,14 @@ static bool can_age_anon_pages(struct pg
+ 
+ #ifdef CONFIG_LRU_GEN
+ 
++#ifdef CONFIG_LRU_GEN_ENABLED
++DEFINE_STATIC_KEY_ARRAY_TRUE(lru_gen_caps, NR_LRU_GEN_CAPS);
++#define get_cap(cap)	static_branch_likely(&lru_gen_caps[cap])
++#else
++DEFINE_STATIC_KEY_ARRAY_FALSE(lru_gen_caps, NR_LRU_GEN_CAPS);
++#define get_cap(cap)	static_branch_unlikely(&lru_gen_caps[cap])
++#endif
++
+ /******************************************************************************
+  *                          shorthand helpers
+  ******************************************************************************/
+@@ -3946,7 +3955,8 @@ static void walk_pmd_range_locked(pud_t
+ 			goto next;
+ 
+ 		if (!pmd_trans_huge(pmd[i])) {
+-			if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG))
++			if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) &&
++			    get_cap(LRU_GEN_NONLEAF_YOUNG))
+ 				pmdp_test_and_clear_young(vma, addr, pmd + i);
+ 			goto next;
+ 		}
+@@ -4044,10 +4054,12 @@ restart:
+ 		walk->mm_stats[MM_NONLEAF_TOTAL]++;
+ 
+ #ifdef CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG
+-		if (!pmd_young(val))
+-			continue;
++		if (get_cap(LRU_GEN_NONLEAF_YOUNG)) {
++			if (!pmd_young(val))
++				continue;
+ 
+-		walk_pmd_range_locked(pud, addr, vma, args, bitmap, &pos);
++			walk_pmd_range_locked(pud, addr, vma, args, bitmap, &pos);
++		}
+ #endif
+ 		if (!walk->force_scan && !test_bloom_filter(walk->lruvec, walk->max_seq, pmd + i))
+ 			continue;
+@@ -4309,7 +4321,7 @@ static bool try_to_inc_max_seq(struct lr
+ 	 * handful of PTEs. Spreading the work out over a period of time usually
+ 	 * is less efficient, but it avoids bursty page faults.
+ 	 */
+-	if (!arch_has_hw_pte_young()) {
++	if (!(arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK))) {
+ 		success = iterate_mm_list_nowalk(lruvec, max_seq);
+ 		goto done;
+ 	}
+@@ -5072,6 +5084,208 @@ done:
+ }
+ 
+ /******************************************************************************
++ *                          state change
++ ******************************************************************************/
++
++static bool __maybe_unused state_is_valid(struct lruvec *lruvec)
++{
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++
++	if (lrugen->enabled) {
++		enum lru_list lru;
++
++		for_each_evictable_lru(lru) {
++			if (!list_empty(&lruvec->lists[lru]))
++				return false;
++		}
++	} else {
++		int gen, type, zone;
++
++		for_each_gen_type_zone(gen, type, zone) {
++			if (!list_empty(&lrugen->lists[gen][type][zone]))
++				return false;
++		}
++	}
++
++	return true;
++}
++
++static bool fill_evictable(struct lruvec *lruvec)
++{
++	enum lru_list lru;
++	int remaining = MAX_LRU_BATCH;
++
++	for_each_evictable_lru(lru) {
++		int type = is_file_lru(lru);
++		bool active = is_active_lru(lru);
++		struct list_head *head = &lruvec->lists[lru];
++
++		while (!list_empty(head)) {
++			bool success;
++			struct folio *folio = lru_to_folio(head);
++
++			VM_WARN_ON_ONCE_FOLIO(folio_test_unevictable(folio), folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_test_active(folio) != active, folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_is_file_lru(folio) != type, folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_lru_gen(folio) != -1, folio);
++
++			lruvec_del_folio(lruvec, folio);
++			success = lru_gen_add_folio(lruvec, folio, false);
++			VM_WARN_ON_ONCE(!success);
++
++			if (!--remaining)
++				return false;
++		}
++	}
++
++	return true;
++}
++
++static bool drain_evictable(struct lruvec *lruvec)
++{
++	int gen, type, zone;
++	int remaining = MAX_LRU_BATCH;
++
++	for_each_gen_type_zone(gen, type, zone) {
++		struct list_head *head = &lruvec->lrugen.lists[gen][type][zone];
++
++		while (!list_empty(head)) {
++			bool success;
++			struct folio *folio = lru_to_folio(head);
++
++			VM_WARN_ON_ONCE_FOLIO(folio_test_unevictable(folio), folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_test_active(folio), folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_is_file_lru(folio) != type, folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_zonenum(folio) != zone, folio);
++
++			success = lru_gen_del_folio(lruvec, folio, false);
++			VM_WARN_ON_ONCE(!success);
++			lruvec_add_folio(lruvec, folio);
++
++			if (!--remaining)
++				return false;
++		}
++	}
++
++	return true;
++}
++
++static void lru_gen_change_state(bool enabled)
++{
++	static DEFINE_MUTEX(state_mutex);
++
++	struct mem_cgroup *memcg;
++
++	cgroup_lock();
++	cpus_read_lock();
++	get_online_mems();
++	mutex_lock(&state_mutex);
++
++	if (enabled == lru_gen_enabled())
++		goto unlock;
++
++	if (enabled)
++		static_branch_enable_cpuslocked(&lru_gen_caps[LRU_GEN_CORE]);
++	else
++		static_branch_disable_cpuslocked(&lru_gen_caps[LRU_GEN_CORE]);
++
++	memcg = mem_cgroup_iter(NULL, NULL, NULL);
++	do {
++		int nid;
++
++		for_each_node(nid) {
++			struct lruvec *lruvec = get_lruvec(memcg, nid);
++
++			if (!lruvec)
++				continue;
++
++			spin_lock_irq(&lruvec->lru_lock);
++
++			VM_WARN_ON_ONCE(!seq_is_valid(lruvec));
++			VM_WARN_ON_ONCE(!state_is_valid(lruvec));
++
++			lruvec->lrugen.enabled = enabled;
++
++			while (!(enabled ? fill_evictable(lruvec) : drain_evictable(lruvec))) {
++				spin_unlock_irq(&lruvec->lru_lock);
++				cond_resched();
++				spin_lock_irq(&lruvec->lru_lock);
++			}
++
++			spin_unlock_irq(&lruvec->lru_lock);
++		}
++
++		cond_resched();
++	} while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)));
++unlock:
++	mutex_unlock(&state_mutex);
++	put_online_mems();
++	cpus_read_unlock();
++	cgroup_unlock();
++}
++
++/******************************************************************************
++ *                          sysfs interface
++ ******************************************************************************/
++
++static ssize_t show_enabled(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
++{
++	unsigned int caps = 0;
++
++	if (get_cap(LRU_GEN_CORE))
++		caps |= BIT(LRU_GEN_CORE);
++
++	if (arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK))
++		caps |= BIT(LRU_GEN_MM_WALK);
++
++	if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) && get_cap(LRU_GEN_NONLEAF_YOUNG))
++		caps |= BIT(LRU_GEN_NONLEAF_YOUNG);
++
++	return snprintf(buf, PAGE_SIZE, "0x%04x\n", caps);
++}
++
++static ssize_t store_enabled(struct kobject *kobj, struct kobj_attribute *attr,
++			     const char *buf, size_t len)
++{
++	int i;
++	unsigned int caps;
++
++	if (tolower(*buf) == 'n')
++		caps = 0;
++	else if (tolower(*buf) == 'y')
++		caps = -1;
++	else if (kstrtouint(buf, 0, &caps))
++		return -EINVAL;
++
++	for (i = 0; i < NR_LRU_GEN_CAPS; i++) {
++		bool enabled = caps & BIT(i);
++
++		if (i == LRU_GEN_CORE)
++			lru_gen_change_state(enabled);
++		else if (enabled)
++			static_branch_enable(&lru_gen_caps[i]);
++		else
++			static_branch_disable(&lru_gen_caps[i]);
++	}
++
++	return len;
++}
++
++static struct kobj_attribute lru_gen_enabled_attr = __ATTR(
++	enabled, 0644, show_enabled, store_enabled
++);
++
++static struct attribute *lru_gen_attrs[] = {
++	&lru_gen_enabled_attr.attr,
++	NULL
++};
++
++static struct attribute_group lru_gen_attr_group = {
++	.name = "lru_gen",
++	.attrs = lru_gen_attrs,
++};
++
++/******************************************************************************
+  *                          initialization
+  ******************************************************************************/
+ 
+@@ -5081,6 +5295,7 @@ void lru_gen_init_lruvec(struct lruvec *
+ 	struct lru_gen_struct *lrugen = &lruvec->lrugen;
+ 
+ 	lrugen->max_seq = MIN_NR_GENS + 1;
++	lrugen->enabled = lru_gen_enabled();
+ 
+ 	for_each_gen_type_zone(gen, type, zone)
+ 		INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]);
+@@ -5120,6 +5335,9 @@ static int __init init_lru_gen(void)
+ 	BUILD_BUG_ON(MIN_NR_GENS + 1 >= MAX_NR_GENS);
+ 	BUILD_BUG_ON(BIT(LRU_GEN_WIDTH) <= MAX_NR_GENS);
+ 
++	if (sysfs_create_group(mm_kobj, &lru_gen_attr_group))
++		pr_err("lru_gen: failed to create sysfs group\n");
++
+ 	return 0;
+ };
+ late_initcall(init_lru_gen);
diff --git a/target/linux/generic/backport-6.0/110-mm-multi-gen-LRU-thrashing-prevention.patch b/target/linux/generic/backport-6.0/110-mm-multi-gen-LRU-thrashing-prevention.patch
new file mode 100644
index 000000000..58492dcff
--- /dev/null
+++ b/target/linux/generic/backport-6.0/110-mm-multi-gen-LRU-thrashing-prevention.patch
@@ -0,0 +1,202 @@
+From 9d92c76fb8ac09ff195024139575d8c4db66b672 Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Thu, 27 Jan 2022 20:08:50 -0700
+Subject: [PATCH 11/14] mm: multi-gen LRU: thrashing prevention
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add /sys/kernel/mm/lru_gen/min_ttl_ms for thrashing prevention, as
+requested by many desktop users [1].
+
+When set to value N, it prevents the working set of N milliseconds
+from getting evicted. The OOM killer is triggered if this working set
+cannot be kept in memory. Based on the average human detectable lag
+(~100ms), N=1000 usually eliminates intolerable lags due to thrashing.
+Larger values like N=3000 make lags less noticeable at the risk of
+premature OOM kills.
+
+Compared with the size-based approach [2], this time-based approach
+has the following advantages:
+1. It is easier to configure because it is agnostic to applications
+   and memory sizes.
+2. It is more reliable because it is directly wired to the OOM killer.
+
+[1] https://lore.kernel.org/r/Ydza%2FzXKY9ATRoh6@google.com/
+[2] https://lore.kernel.org/r/20101028191523.GA14972@google.com/
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I007499d7e47374b59fd620e8c3962940bc9f788e
+---
+ include/linux/mmzone.h |  2 ++
+ mm/vmscan.c            | 74 ++++++++++++++++++++++++++++++++++++++++--
+ 2 files changed, 73 insertions(+), 3 deletions(-)
+
+--- a/include/linux/mmzone.h
++++ b/include/linux/mmzone.h
+@@ -419,6 +419,8 @@ struct lru_gen_struct {
+ 	unsigned long max_seq;
+ 	/* the eviction increments the oldest generation numbers */
+ 	unsigned long min_seq[ANON_AND_FILE];
++	/* the birth time of each generation in jiffies */
++	unsigned long timestamps[MAX_NR_GENS];
+ 	/* the multi-gen LRU lists, lazily sorted on eviction */
+ 	struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES];
+ 	/* the multi-gen LRU sizes, eventually consistent */
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -4293,6 +4293,7 @@ static void inc_max_seq(struct lruvec *l
+ 	for (type = 0; type < ANON_AND_FILE; type++)
+ 		reset_ctrl_pos(lruvec, type, false);
+ 
++	WRITE_ONCE(lrugen->timestamps[next], jiffies);
+ 	/* make sure preceding modifications appear */
+ 	smp_store_release(&lrugen->max_seq, lrugen->max_seq + 1);
+ 
+@@ -4420,7 +4421,7 @@ static bool should_run_aging(struct lruv
+ 	return false;
+ }
+ 
+-static void age_lruvec(struct lruvec *lruvec, struct scan_control *sc)
++static bool age_lruvec(struct lruvec *lruvec, struct scan_control *sc, unsigned long min_ttl)
+ {
+ 	bool need_aging;
+ 	unsigned long nr_to_scan;
+@@ -4434,16 +4435,36 @@ static void age_lruvec(struct lruvec *lr
+ 	mem_cgroup_calculate_protection(NULL, memcg);
+ 
+ 	if (mem_cgroup_below_min(memcg))
+-		return;
++		return false;
+ 
+ 	need_aging = should_run_aging(lruvec, max_seq, min_seq, sc, swappiness, &nr_to_scan);
++
++	if (min_ttl) {
++		int gen = lru_gen_from_seq(min_seq[LRU_GEN_FILE]);
++		unsigned long birth = READ_ONCE(lruvec->lrugen.timestamps[gen]);
++
++		if (time_is_after_jiffies(birth + min_ttl))
++			return false;
++
++		/* the size is likely too small to be helpful */
++		if (!nr_to_scan && sc->priority != DEF_PRIORITY)
++			return false;
++	}
++
+ 	if (need_aging)
+ 		try_to_inc_max_seq(lruvec, max_seq, sc, swappiness);
++
++	return true;
+ }
+ 
++/* to protect the working set of the last N jiffies */
++static unsigned long lru_gen_min_ttl __read_mostly;
++
+ static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_control *sc)
+ {
+ 	struct mem_cgroup *memcg;
++	bool success = false;
++	unsigned long min_ttl = READ_ONCE(lru_gen_min_ttl);
+ 
+ 	VM_WARN_ON_ONCE(!current_is_kswapd());
+ 
+@@ -4466,12 +4487,32 @@ static void lru_gen_age_node(struct pgli
+ 	do {
+ 		struct lruvec *lruvec = mem_cgroup_lruvec(memcg, pgdat);
+ 
+-		age_lruvec(lruvec, sc);
++		if (age_lruvec(lruvec, sc, min_ttl))
++			success = true;
+ 
+ 		cond_resched();
+ 	} while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)));
+ 
+ 	clear_mm_walk();
++
++	/* check the order to exclude compaction-induced reclaim */
++	if (success || !min_ttl || sc->order)
++		return;
++
++	/*
++	 * The main goal is to OOM kill if every generation from all memcgs is
++	 * younger than min_ttl. However, another possibility is all memcgs are
++	 * either below min or empty.
++	 */
++	if (mutex_trylock(&oom_lock)) {
++		struct oom_control oc = {
++			.gfp_mask = sc->gfp_mask,
++		};
++
++		out_of_memory(&oc);
++
++		mutex_unlock(&oom_lock);
++	}
+ }
+ 
+ /*
+@@ -5228,6 +5269,28 @@ unlock:
+  *                          sysfs interface
+  ******************************************************************************/
+ 
++static ssize_t show_min_ttl(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
++{
++	return sprintf(buf, "%u\n", jiffies_to_msecs(READ_ONCE(lru_gen_min_ttl)));
++}
++
++static ssize_t store_min_ttl(struct kobject *kobj, struct kobj_attribute *attr,
++			     const char *buf, size_t len)
++{
++	unsigned int msecs;
++
++	if (kstrtouint(buf, 0, &msecs))
++		return -EINVAL;
++
++	WRITE_ONCE(lru_gen_min_ttl, msecs_to_jiffies(msecs));
++
++	return len;
++}
++
++static struct kobj_attribute lru_gen_min_ttl_attr = __ATTR(
++	min_ttl_ms, 0644, show_min_ttl, store_min_ttl
++);
++
+ static ssize_t show_enabled(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
+ {
+ 	unsigned int caps = 0;
+@@ -5276,6 +5339,7 @@ static struct kobj_attribute lru_gen_ena
+ );
+ 
+ static struct attribute *lru_gen_attrs[] = {
++	&lru_gen_min_ttl_attr.attr,
+ 	&lru_gen_enabled_attr.attr,
+ 	NULL
+ };
+@@ -5291,12 +5355,16 @@ static struct attribute_group lru_gen_at
+ 
+ void lru_gen_init_lruvec(struct lruvec *lruvec)
+ {
++	int i;
+ 	int gen, type, zone;
+ 	struct lru_gen_struct *lrugen = &lruvec->lrugen;
+ 
+ 	lrugen->max_seq = MIN_NR_GENS + 1;
+ 	lrugen->enabled = lru_gen_enabled();
+ 
++	for (i = 0; i <= MIN_NR_GENS + 1; i++)
++		lrugen->timestamps[i] = jiffies;
++
+ 	for_each_gen_type_zone(gen, type, zone)
+ 		INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]);
+ 
diff --git a/target/linux/generic/backport-6.0/111-mm-multi-gen-LRU-debugfs-interface.patch b/target/linux/generic/backport-6.0/111-mm-multi-gen-LRU-debugfs-interface.patch
new file mode 100644
index 000000000..2c63332f9
--- /dev/null
+++ b/target/linux/generic/backport-6.0/111-mm-multi-gen-LRU-debugfs-interface.patch
@@ -0,0 +1,557 @@
+From d1e0e5fcdea16d4ceead496a0ea2fdbb6bc5bfe4 Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Thu, 27 Jan 2022 20:12:41 -0700
+Subject: [PATCH 12/14] mm: multi-gen LRU: debugfs interface
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add /sys/kernel/debug/lru_gen for working set estimation and proactive
+reclaim. These techniques are commonly used to optimize job scheduling
+(bin packing) in data centers [1][2].
+
+Compared with the page table-based approach and the PFN-based
+approach, this lruvec-based approach has the following advantages:
+1. It offers better choices because it is aware of memcgs, NUMA nodes,
+   shared mappings and unmapped page cache.
+2. It is more scalable because it is O(nr_hot_pages), whereas the
+   PFN-based approach is O(nr_total_pages).
+
+Add /sys/kernel/debug/lru_gen_full for debugging.
+
+[1] https://dl.acm.org/doi/10.1145/3297858.3304053
+[2] https://dl.acm.org/doi/10.1145/3503222.3507731
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Reviewed-by: Qi Zheng <zhengqi.arch@bytedance.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I7bb06f14e0a94901a076cc3767d0855d4f1ea3ab
+---
+ include/linux/nodemask.h |   1 +
+ mm/vmscan.c              | 411 ++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 402 insertions(+), 10 deletions(-)
+
+--- a/include/linux/nodemask.h
++++ b/include/linux/nodemask.h
+@@ -493,6 +493,7 @@ static inline int num_node_state(enum no
+ #define first_online_node	0
+ #define first_memory_node	0
+ #define next_online_node(nid)	(MAX_NUMNODES)
++#define next_memory_node(nid)	(MAX_NUMNODES)
+ #define nr_node_ids		1U
+ #define nr_online_nodes		1U
+ 
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -52,6 +52,7 @@
+ #include <linux/pagewalk.h>
+ #include <linux/shmem_fs.h>
+ #include <linux/ctype.h>
++#include <linux/debugfs.h>
+ 
+ #include <asm/tlbflush.h>
+ #include <asm/div64.h>
+@@ -4197,12 +4198,40 @@ static void clear_mm_walk(void)
+ 		kfree(walk);
+ }
+ 
+-static void inc_min_seq(struct lruvec *lruvec, int type)
++static bool inc_min_seq(struct lruvec *lruvec, int type, bool can_swap)
+ {
++	int zone;
++	int remaining = MAX_LRU_BATCH;
+ 	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++	int new_gen, old_gen = lru_gen_from_seq(lrugen->min_seq[type]);
++
++	if (type == LRU_GEN_ANON && !can_swap)
++		goto done;
++
++	/* prevent cold/hot inversion if force_scan is true */
++	for (zone = 0; zone < MAX_NR_ZONES; zone++) {
++		struct list_head *head = &lrugen->lists[old_gen][type][zone];
++
++		while (!list_empty(head)) {
++			struct folio *folio = lru_to_folio(head);
++
++			VM_WARN_ON_ONCE_FOLIO(folio_test_unevictable(folio), folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_test_active(folio), folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_is_file_lru(folio) != type, folio);
++			VM_WARN_ON_ONCE_FOLIO(folio_zonenum(folio) != zone, folio);
+ 
++			new_gen = folio_inc_gen(lruvec, folio, false);
++			list_move_tail(&folio->lru, &lrugen->lists[new_gen][type][zone]);
++
++			if (!--remaining)
++				return false;
++		}
++	}
++done:
+ 	reset_ctrl_pos(lruvec, type, true);
+ 	WRITE_ONCE(lrugen->min_seq[type], lrugen->min_seq[type] + 1);
++
++	return true;
+ }
+ 
+ static bool try_to_inc_min_seq(struct lruvec *lruvec, bool can_swap)
+@@ -4248,7 +4277,7 @@ next:
+ 	return success;
+ }
+ 
+-static void inc_max_seq(struct lruvec *lruvec, bool can_swap)
++static void inc_max_seq(struct lruvec *lruvec, bool can_swap, bool force_scan)
+ {
+ 	int prev, next;
+ 	int type, zone;
+@@ -4262,9 +4291,13 @@ static void inc_max_seq(struct lruvec *l
+ 		if (get_nr_gens(lruvec, type) != MAX_NR_GENS)
+ 			continue;
+ 
+-		VM_WARN_ON_ONCE(type == LRU_GEN_FILE || can_swap);
++		VM_WARN_ON_ONCE(!force_scan && (type == LRU_GEN_FILE || can_swap));
+ 
+-		inc_min_seq(lruvec, type);
++		while (!inc_min_seq(lruvec, type, can_swap)) {
++			spin_unlock_irq(&lruvec->lru_lock);
++			cond_resched();
++			spin_lock_irq(&lruvec->lru_lock);
++		}
+ 	}
+ 
+ 	/*
+@@ -4301,7 +4334,7 @@ static void inc_max_seq(struct lruvec *l
+ }
+ 
+ static bool try_to_inc_max_seq(struct lruvec *lruvec, unsigned long max_seq,
+-			       struct scan_control *sc, bool can_swap)
++			       struct scan_control *sc, bool can_swap, bool force_scan)
+ {
+ 	bool success;
+ 	struct lru_gen_mm_walk *walk;
+@@ -4322,7 +4355,7 @@ static bool try_to_inc_max_seq(struct lr
+ 	 * handful of PTEs. Spreading the work out over a period of time usually
+ 	 * is less efficient, but it avoids bursty page faults.
+ 	 */
+-	if (!(arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK))) {
++	if (!force_scan && !(arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK))) {
+ 		success = iterate_mm_list_nowalk(lruvec, max_seq);
+ 		goto done;
+ 	}
+@@ -4336,7 +4369,7 @@ static bool try_to_inc_max_seq(struct lr
+ 	walk->lruvec = lruvec;
+ 	walk->max_seq = max_seq;
+ 	walk->can_swap = can_swap;
+-	walk->force_scan = false;
++	walk->force_scan = force_scan;
+ 
+ 	do {
+ 		success = iterate_mm_list(lruvec, walk, &mm);
+@@ -4356,7 +4389,7 @@ done:
+ 
+ 	VM_WARN_ON_ONCE(max_seq != READ_ONCE(lrugen->max_seq));
+ 
+-	inc_max_seq(lruvec, can_swap);
++	inc_max_seq(lruvec, can_swap, force_scan);
+ 	/* either this sees any waiters or they will see updated max_seq */
+ 	if (wq_has_sleeper(&lruvec->mm_state.wait))
+ 		wake_up_all(&lruvec->mm_state.wait);
+@@ -4452,7 +4485,7 @@ static bool age_lruvec(struct lruvec *lr
+ 	}
+ 
+ 	if (need_aging)
+-		try_to_inc_max_seq(lruvec, max_seq, sc, swappiness);
++		try_to_inc_max_seq(lruvec, max_seq, sc, swappiness, false);
+ 
+ 	return true;
+ }
+@@ -5011,7 +5044,7 @@ static unsigned long get_nr_to_scan(stru
+ 	if (current_is_kswapd())
+ 		return 0;
+ 
+-	if (try_to_inc_max_seq(lruvec, max_seq, sc, can_swap))
++	if (try_to_inc_max_seq(lruvec, max_seq, sc, can_swap, false))
+ 		return nr_to_scan;
+ done:
+ 	return min_seq[!can_swap] + MIN_NR_GENS <= max_seq ? nr_to_scan : 0;
+@@ -5350,6 +5383,361 @@ static struct attribute_group lru_gen_at
+ };
+ 
+ /******************************************************************************
++ *                          debugfs interface
++ ******************************************************************************/
++
++static void *lru_gen_seq_start(struct seq_file *m, loff_t *pos)
++{
++	struct mem_cgroup *memcg;
++	loff_t nr_to_skip = *pos;
++
++	m->private = kvmalloc(PATH_MAX, GFP_KERNEL);
++	if (!m->private)
++		return ERR_PTR(-ENOMEM);
++
++	memcg = mem_cgroup_iter(NULL, NULL, NULL);
++	do {
++		int nid;
++
++		for_each_node_state(nid, N_MEMORY) {
++			if (!nr_to_skip--)
++				return get_lruvec(memcg, nid);
++		}
++	} while ((memcg = mem_cgroup_iter(NULL, memcg, NULL)));
++
++	return NULL;
++}
++
++static void lru_gen_seq_stop(struct seq_file *m, void *v)
++{
++	if (!IS_ERR_OR_NULL(v))
++		mem_cgroup_iter_break(NULL, lruvec_memcg(v));
++
++	kvfree(m->private);
++	m->private = NULL;
++}
++
++static void *lru_gen_seq_next(struct seq_file *m, void *v, loff_t *pos)
++{
++	int nid = lruvec_pgdat(v)->node_id;
++	struct mem_cgroup *memcg = lruvec_memcg(v);
++
++	++*pos;
++
++	nid = next_memory_node(nid);
++	if (nid == MAX_NUMNODES) {
++		memcg = mem_cgroup_iter(NULL, memcg, NULL);
++		if (!memcg)
++			return NULL;
++
++		nid = first_memory_node;
++	}
++
++	return get_lruvec(memcg, nid);
++}
++
++static void lru_gen_seq_show_full(struct seq_file *m, struct lruvec *lruvec,
++				  unsigned long max_seq, unsigned long *min_seq,
++				  unsigned long seq)
++{
++	int i;
++	int type, tier;
++	int hist = lru_hist_from_seq(seq);
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++
++	for (tier = 0; tier < MAX_NR_TIERS; tier++) {
++		seq_printf(m, "            %10d", tier);
++		for (type = 0; type < ANON_AND_FILE; type++) {
++			const char *s = "   ";
++			unsigned long n[3] = {};
++
++			if (seq == max_seq) {
++				s = "RT ";
++				n[0] = READ_ONCE(lrugen->avg_refaulted[type][tier]);
++				n[1] = READ_ONCE(lrugen->avg_total[type][tier]);
++			} else if (seq == min_seq[type] || NR_HIST_GENS > 1) {
++				s = "rep";
++				n[0] = atomic_long_read(&lrugen->refaulted[hist][type][tier]);
++				n[1] = atomic_long_read(&lrugen->evicted[hist][type][tier]);
++				if (tier)
++					n[2] = READ_ONCE(lrugen->protected[hist][type][tier - 1]);
++			}
++
++			for (i = 0; i < 3; i++)
++				seq_printf(m, " %10lu%c", n[i], s[i]);
++		}
++		seq_putc(m, '\n');
++	}
++
++	seq_puts(m, "                      ");
++	for (i = 0; i < NR_MM_STATS; i++) {
++		const char *s = "      ";
++		unsigned long n = 0;
++
++		if (seq == max_seq && NR_HIST_GENS == 1) {
++			s = "LOYNFA";
++			n = READ_ONCE(lruvec->mm_state.stats[hist][i]);
++		} else if (seq != max_seq && NR_HIST_GENS > 1) {
++			s = "loynfa";
++			n = READ_ONCE(lruvec->mm_state.stats[hist][i]);
++		}
++
++		seq_printf(m, " %10lu%c", n, s[i]);
++	}
++	seq_putc(m, '\n');
++}
++
++static int lru_gen_seq_show(struct seq_file *m, void *v)
++{
++	unsigned long seq;
++	bool full = !debugfs_real_fops(m->file)->write;
++	struct lruvec *lruvec = v;
++	struct lru_gen_struct *lrugen = &lruvec->lrugen;
++	int nid = lruvec_pgdat(lruvec)->node_id;
++	struct mem_cgroup *memcg = lruvec_memcg(lruvec);
++	DEFINE_MAX_SEQ(lruvec);
++	DEFINE_MIN_SEQ(lruvec);
++
++	if (nid == first_memory_node) {
++		const char *path = memcg ? m->private : "";
++
++#ifdef CONFIG_MEMCG
++		if (memcg)
++			cgroup_path(memcg->css.cgroup, m->private, PATH_MAX);
++#endif
++		seq_printf(m, "memcg %5hu %s\n", mem_cgroup_id(memcg), path);
++	}
++
++	seq_printf(m, " node %5d\n", nid);
++
++	if (!full)
++		seq = min_seq[LRU_GEN_ANON];
++	else if (max_seq >= MAX_NR_GENS)
++		seq = max_seq - MAX_NR_GENS + 1;
++	else
++		seq = 0;
++
++	for (; seq <= max_seq; seq++) {
++		int type, zone;
++		int gen = lru_gen_from_seq(seq);
++		unsigned long birth = READ_ONCE(lruvec->lrugen.timestamps[gen]);
++
++		seq_printf(m, " %10lu %10u", seq, jiffies_to_msecs(jiffies - birth));
++
++		for (type = 0; type < ANON_AND_FILE; type++) {
++			unsigned long size = 0;
++			char mark = full && seq < min_seq[type] ? 'x' : ' ';
++
++			for (zone = 0; zone < MAX_NR_ZONES; zone++)
++				size += max(READ_ONCE(lrugen->nr_pages[gen][type][zone]), 0L);
++
++			seq_printf(m, " %10lu%c", size, mark);
++		}
++
++		seq_putc(m, '\n');
++
++		if (full)
++			lru_gen_seq_show_full(m, lruvec, max_seq, min_seq, seq);
++	}
++
++	return 0;
++}
++
++static const struct seq_operations lru_gen_seq_ops = {
++	.start = lru_gen_seq_start,
++	.stop = lru_gen_seq_stop,
++	.next = lru_gen_seq_next,
++	.show = lru_gen_seq_show,
++};
++
++static int run_aging(struct lruvec *lruvec, unsigned long seq, struct scan_control *sc,
++		     bool can_swap, bool force_scan)
++{
++	DEFINE_MAX_SEQ(lruvec);
++	DEFINE_MIN_SEQ(lruvec);
++
++	if (seq < max_seq)
++		return 0;
++
++	if (seq > max_seq)
++		return -EINVAL;
++
++	if (!force_scan && min_seq[!can_swap] + MAX_NR_GENS - 1 <= max_seq)
++		return -ERANGE;
++
++	try_to_inc_max_seq(lruvec, max_seq, sc, can_swap, force_scan);
++
++	return 0;
++}
++
++static int run_eviction(struct lruvec *lruvec, unsigned long seq, struct scan_control *sc,
++			int swappiness, unsigned long nr_to_reclaim)
++{
++	DEFINE_MAX_SEQ(lruvec);
++
++	if (seq + MIN_NR_GENS > max_seq)
++		return -EINVAL;
++
++	sc->nr_reclaimed = 0;
++
++	while (!signal_pending(current)) {
++		DEFINE_MIN_SEQ(lruvec);
++
++		if (seq < min_seq[!swappiness])
++			return 0;
++
++		if (sc->nr_reclaimed >= nr_to_reclaim)
++			return 0;
++
++		if (!evict_folios(lruvec, sc, swappiness, NULL))
++			return 0;
++
++		cond_resched();
++	}
++
++	return -EINTR;
++}
++
++static int run_cmd(char cmd, int memcg_id, int nid, unsigned long seq,
++		   struct scan_control *sc, int swappiness, unsigned long opt)
++{
++	struct lruvec *lruvec;
++	int err = -EINVAL;
++	struct mem_cgroup *memcg = NULL;
++
++	if (nid < 0 || nid >= MAX_NUMNODES || !node_state(nid, N_MEMORY))
++		return -EINVAL;
++
++	if (!mem_cgroup_disabled()) {
++		rcu_read_lock();
++		memcg = mem_cgroup_from_id(memcg_id);
++#ifdef CONFIG_MEMCG
++		if (memcg && !css_tryget(&memcg->css))
++			memcg = NULL;
++#endif
++		rcu_read_unlock();
++
++		if (!memcg)
++			return -EINVAL;
++	}
++
++	if (memcg_id != mem_cgroup_id(memcg))
++		goto done;
++
++	lruvec = get_lruvec(memcg, nid);
++
++	if (swappiness < 0)
++		swappiness = get_swappiness(lruvec, sc);
++	else if (swappiness > 200)
++		goto done;
++
++	switch (cmd) {
++	case '+':
++		err = run_aging(lruvec, seq, sc, swappiness, opt);
++		break;
++	case '-':
++		err = run_eviction(lruvec, seq, sc, swappiness, opt);
++		break;
++	}
++done:
++	mem_cgroup_put(memcg);
++
++	return err;
++}
++
++static ssize_t lru_gen_seq_write(struct file *file, const char __user *src,
++				 size_t len, loff_t *pos)
++{
++	void *buf;
++	char *cur, *next;
++	unsigned int flags;
++	struct blk_plug plug;
++	int err = -EINVAL;
++	struct scan_control sc = {
++		.may_writepage = true,
++		.may_unmap = true,
++		.may_swap = true,
++		.reclaim_idx = MAX_NR_ZONES - 1,
++		.gfp_mask = GFP_KERNEL,
++	};
++
++	buf = kvmalloc(len + 1, GFP_KERNEL);
++	if (!buf)
++		return -ENOMEM;
++
++	if (copy_from_user(buf, src, len)) {
++		kvfree(buf);
++		return -EFAULT;
++	}
++
++	set_task_reclaim_state(current, &sc.reclaim_state);
++	flags = memalloc_noreclaim_save();
++	blk_start_plug(&plug);
++	if (!set_mm_walk(NULL)) {
++		err = -ENOMEM;
++		goto done;
++	}
++
++	next = buf;
++	next[len] = '\0';
++
++	while ((cur = strsep(&next, ",;\n"))) {
++		int n;
++		int end;
++		char cmd;
++		unsigned int memcg_id;
++		unsigned int nid;
++		unsigned long seq;
++		unsigned int swappiness = -1;
++		unsigned long opt = -1;
++
++		cur = skip_spaces(cur);
++		if (!*cur)
++			continue;
++
++		n = sscanf(cur, "%c %u %u %lu %n %u %n %lu %n", &cmd, &memcg_id, &nid,
++			   &seq, &end, &swappiness, &end, &opt, &end);
++		if (n < 4 || cur[end]) {
++			err = -EINVAL;
++			break;
++		}
++
++		err = run_cmd(cmd, memcg_id, nid, seq, &sc, swappiness, opt);
++		if (err)
++			break;
++	}
++done:
++	clear_mm_walk();
++	blk_finish_plug(&plug);
++	memalloc_noreclaim_restore(flags);
++	set_task_reclaim_state(current, NULL);
++
++	kvfree(buf);
++
++	return err ? : len;
++}
++
++static int lru_gen_seq_open(struct inode *inode, struct file *file)
++{
++	return seq_open(file, &lru_gen_seq_ops);
++}
++
++static const struct file_operations lru_gen_rw_fops = {
++	.open = lru_gen_seq_open,
++	.read = seq_read,
++	.write = lru_gen_seq_write,
++	.llseek = seq_lseek,
++	.release = seq_release,
++};
++
++static const struct file_operations lru_gen_ro_fops = {
++	.open = lru_gen_seq_open,
++	.read = seq_read,
++	.llseek = seq_lseek,
++	.release = seq_release,
++};
++
++/******************************************************************************
+  *                          initialization
+  ******************************************************************************/
+ 
+@@ -5406,6 +5794,9 @@ static int __init init_lru_gen(void)
+ 	if (sysfs_create_group(mm_kobj, &lru_gen_attr_group))
+ 		pr_err("lru_gen: failed to create sysfs group\n");
+ 
++	debugfs_create_file("lru_gen", 0644, NULL, NULL, &lru_gen_rw_fops);
++	debugfs_create_file("lru_gen_full", 0444, NULL, NULL, &lru_gen_ro_fops);
++
+ 	return 0;
+ };
+ late_initcall(init_lru_gen);
diff --git a/target/linux/generic/backport-6.0/112-mm-multi-gen-LRU-admin-guide.patch b/target/linux/generic/backport-6.0/112-mm-multi-gen-LRU-admin-guide.patch
new file mode 100644
index 000000000..bbf418b84
--- /dev/null
+++ b/target/linux/generic/backport-6.0/112-mm-multi-gen-LRU-admin-guide.patch
@@ -0,0 +1,253 @@
+From 22199c9b30ffcc332be643577709a2af960e6786 Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Sun, 23 Jan 2022 16:44:43 -0700
+Subject: [PATCH 13/14] mm: multi-gen LRU: admin guide
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add an admin guide.
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I1902178bcbb5adfa0a748c4d284a6456059bdd7e
+---
+ Documentation/admin-guide/mm/index.rst        |   1 +
+ Documentation/admin-guide/mm/multigen_lru.rst | 162 ++++++++++++++++++
+ mm/Kconfig                                    |   3 +-
+ mm/vmscan.c                                   |   4 +
+ 4 files changed, 169 insertions(+), 1 deletion(-)
+ create mode 100644 Documentation/admin-guide/mm/multigen_lru.rst
+
+--- a/Documentation/admin-guide/mm/index.rst
++++ b/Documentation/admin-guide/mm/index.rst
+@@ -32,6 +32,7 @@ the Linux memory management.
+    idle_page_tracking
+    ksm
+    memory-hotplug
++   multigen_lru
+    nommu-mmap
+    numa_memory_policy
+    numaperf
+--- /dev/null
++++ b/Documentation/admin-guide/mm/multigen_lru.rst
+@@ -0,0 +1,162 @@
++.. SPDX-License-Identifier: GPL-2.0
++
++=============
++Multi-Gen LRU
++=============
++The multi-gen LRU is an alternative LRU implementation that optimizes
++page reclaim and improves performance under memory pressure. Page
++reclaim decides the kernel's caching policy and ability to overcommit
++memory. It directly impacts the kswapd CPU usage and RAM efficiency.
++
++Quick start
++===========
++Build the kernel with the following configurations.
++
++* ``CONFIG_LRU_GEN=y``
++* ``CONFIG_LRU_GEN_ENABLED=y``
++
++All set!
++
++Runtime options
++===============
++``/sys/kernel/mm/lru_gen/`` contains stable ABIs described in the
++following subsections.
++
++Kill switch
++-----------
++``enabled`` accepts different values to enable or disable the
++following components. Its default value depends on
++``CONFIG_LRU_GEN_ENABLED``. All the components should be enabled
++unless some of them have unforeseen side effects. Writing to
++``enabled`` has no effect when a component is not supported by the
++hardware, and valid values will be accepted even when the main switch
++is off.
++
++====== ===============================================================
++Values Components
++====== ===============================================================
++0x0001 The main switch for the multi-gen LRU.
++0x0002 Clearing the accessed bit in leaf page table entries in large
++       batches, when MMU sets it (e.g., on x86). This behavior can
++       theoretically worsen lock contention (mmap_lock). If it is
++       disabled, the multi-gen LRU will suffer a minor performance
++       degradation for workloads that contiguously map hot pages,
++       whose accessed bits can be otherwise cleared by fewer larger
++       batches.
++0x0004 Clearing the accessed bit in non-leaf page table entries as
++       well, when MMU sets it (e.g., on x86). This behavior was not
++       verified on x86 varieties other than Intel and AMD. If it is
++       disabled, the multi-gen LRU will suffer a negligible
++       performance degradation.
++[yYnN] Apply to all the components above.
++====== ===============================================================
++
++E.g.,
++::
++
++    echo y >/sys/kernel/mm/lru_gen/enabled
++    cat /sys/kernel/mm/lru_gen/enabled
++    0x0007
++    echo 5 >/sys/kernel/mm/lru_gen/enabled
++    cat /sys/kernel/mm/lru_gen/enabled
++    0x0005
++
++Thrashing prevention
++--------------------
++Personal computers are more sensitive to thrashing because it can
++cause janks (lags when rendering UI) and negatively impact user
++experience. The multi-gen LRU offers thrashing prevention to the
++majority of laptop and desktop users who do not have ``oomd``.
++
++Users can write ``N`` to ``min_ttl_ms`` to prevent the working set of
++``N`` milliseconds from getting evicted. The OOM killer is triggered
++if this working set cannot be kept in memory. In other words, this
++option works as an adjustable pressure relief valve, and when open, it
++terminates applications that are hopefully not being used.
++
++Based on the average human detectable lag (~100ms), ``N=1000`` usually
++eliminates intolerable janks due to thrashing. Larger values like
++``N=3000`` make janks less noticeable at the risk of premature OOM
++kills.
++
++The default value ``0`` means disabled.
++
++Experimental features
++=====================
++``/sys/kernel/debug/lru_gen`` accepts commands described in the
++following subsections. Multiple command lines are supported, so does
++concatenation with delimiters ``,`` and ``;``.
++
++``/sys/kernel/debug/lru_gen_full`` provides additional stats for
++debugging. ``CONFIG_LRU_GEN_STATS=y`` keeps historical stats from
++evicted generations in this file.
++
++Working set estimation
++----------------------
++Working set estimation measures how much memory an application needs
++in a given time interval, and it is usually done with little impact on
++the performance of the application. E.g., data centers want to
++optimize job scheduling (bin packing) to improve memory utilizations.
++When a new job comes in, the job scheduler needs to find out whether
++each server it manages can allocate a certain amount of memory for
++this new job before it can pick a candidate. To do so, the job
++scheduler needs to estimate the working sets of the existing jobs.
++
++When it is read, ``lru_gen`` returns a histogram of numbers of pages
++accessed over different time intervals for each memcg and node.
++``MAX_NR_GENS`` decides the number of bins for each histogram. The
++histograms are noncumulative.
++::
++
++    memcg  memcg_id  memcg_path
++       node  node_id
++           min_gen_nr  age_in_ms  nr_anon_pages  nr_file_pages
++           ...
++           max_gen_nr  age_in_ms  nr_anon_pages  nr_file_pages
++
++Each bin contains an estimated number of pages that have been accessed
++within ``age_in_ms``. E.g., ``min_gen_nr`` contains the coldest pages
++and ``max_gen_nr`` contains the hottest pages, since ``age_in_ms`` of
++the former is the largest and that of the latter is the smallest.
++
++Users can write the following command to ``lru_gen`` to create a new
++generation ``max_gen_nr+1``:
++
++    ``+ memcg_id node_id max_gen_nr [can_swap [force_scan]]``
++
++``can_swap`` defaults to the swap setting and, if it is set to ``1``,
++it forces the scan of anon pages when swap is off, and vice versa.
++``force_scan`` defaults to ``1`` and, if it is set to ``0``, it
++employs heuristics to reduce the overhead, which is likely to reduce
++the coverage as well.
++
++A typical use case is that a job scheduler runs this command at a
++certain time interval to create new generations, and it ranks the
++servers it manages based on the sizes of their cold pages defined by
++this time interval.
++
++Proactive reclaim
++-----------------
++Proactive reclaim induces page reclaim when there is no memory
++pressure. It usually targets cold pages only. E.g., when a new job
++comes in, the job scheduler wants to proactively reclaim cold pages on
++the server it selected, to improve the chance of successfully landing
++this new job.
++
++Users can write the following command to ``lru_gen`` to evict
++generations less than or equal to ``min_gen_nr``.
++
++    ``- memcg_id node_id min_gen_nr [swappiness [nr_to_reclaim]]``
++
++``min_gen_nr`` should be less than ``max_gen_nr-1``, since
++``max_gen_nr`` and ``max_gen_nr-1`` are not fully aged (equivalent to
++the active list) and therefore cannot be evicted. ``swappiness``
++overrides the default value in ``/proc/sys/vm/swappiness``.
++``nr_to_reclaim`` limits the number of pages to evict.
++
++A typical use case is that a job scheduler runs this command before it
++tries to land a new job on a server. If it fails to materialize enough
++cold pages because of the overestimation, it retries on the next
++server according to the ranking result obtained from the working set
++estimation step. This less forceful approach limits the impacts on the
++existing jobs.
+--- a/mm/Kconfig
++++ b/mm/Kconfig
+@@ -1131,7 +1131,8 @@ config LRU_GEN
+ 	# make sure folio->flags has enough spare bits
+ 	depends on 64BIT || !SPARSEMEM || SPARSEMEM_VMEMMAP
+ 	help
+-	  A high performance LRU implementation to overcommit memory.
++	  A high performance LRU implementation to overcommit memory. See
++	  Documentation/admin-guide/mm/multigen_lru.rst for details.
+ 
+ config LRU_GEN_ENABLED
+ 	bool "Enable by default"
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -5307,6 +5307,7 @@ static ssize_t show_min_ttl(struct kobje
+ 	return sprintf(buf, "%u\n", jiffies_to_msecs(READ_ONCE(lru_gen_min_ttl)));
+ }
+ 
++/* see Documentation/admin-guide/mm/multigen_lru.rst for details */
+ static ssize_t store_min_ttl(struct kobject *kobj, struct kobj_attribute *attr,
+ 			     const char *buf, size_t len)
+ {
+@@ -5340,6 +5341,7 @@ static ssize_t show_enabled(struct kobje
+ 	return snprintf(buf, PAGE_SIZE, "0x%04x\n", caps);
+ }
+ 
++/* see Documentation/admin-guide/mm/multigen_lru.rst for details */
+ static ssize_t store_enabled(struct kobject *kobj, struct kobj_attribute *attr,
+ 			     const char *buf, size_t len)
+ {
+@@ -5487,6 +5489,7 @@ static void lru_gen_seq_show_full(struct
+ 	seq_putc(m, '\n');
+ }
+ 
++/* see Documentation/admin-guide/mm/multigen_lru.rst for details */
+ static int lru_gen_seq_show(struct seq_file *m, void *v)
+ {
+ 	unsigned long seq;
+@@ -5645,6 +5648,7 @@ done:
+ 	return err;
+ }
+ 
++/* see Documentation/admin-guide/mm/multigen_lru.rst for details */
+ static ssize_t lru_gen_seq_write(struct file *file, const char __user *src,
+ 				 size_t len, loff_t *pos)
+ {
diff --git a/target/linux/generic/backport-6.0/113-mm-multi-gen-LRU-design-doc.patch b/target/linux/generic/backport-6.0/113-mm-multi-gen-LRU-design-doc.patch
new file mode 100644
index 000000000..bf1dc061c
--- /dev/null
+++ b/target/linux/generic/backport-6.0/113-mm-multi-gen-LRU-design-doc.patch
@@ -0,0 +1,202 @@
+From bd82a74f6b5c0a75ef61be5e9be34319bb17328f Mon Sep 17 00:00:00 2001
+From: Yu Zhao <yuzhao@google.com>
+Date: Sun, 6 Mar 2022 20:35:00 -0700
+Subject: [PATCH 14/14] mm: multi-gen LRU: design doc
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add a design doc.
+
+Signed-off-by: Yu Zhao <yuzhao@google.com>
+Acked-by: Brian Geffon <bgeffon@google.com>
+Acked-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
+Acked-by: Oleksandr Natalenko <oleksandr@natalenko.name>
+Acked-by: Steven Barrett <steven@liquorix.net>
+Acked-by: Suleiman Souhlal <suleiman@google.com>
+Tested-by: Daniel Byrne <djbyrne@mtu.edu>
+Tested-by: Donald Carr <d@chaos-reins.com>
+Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
+Tested-by: Konstantin Kharlamov <Hi-Angel@yandex.ru>
+Tested-by: Shuang Zhai <szhai2@cs.rochester.edu>
+Tested-by: Sofia Trinh <sofia.trinh@edi.works>
+Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
+Change-Id: I958afcabf5abc37b3e58f72638d35a349c31b98d
+---
+ Documentation/mm/index.rst        |   1 +
+ Documentation/mm/multigen_lru.rst | 159 ++++++++++++++++++++++++++++++
+ 2 files changed, 160 insertions(+)
+ create mode 100644 Documentation/mm/multigen_lru.rst
+
+--- a/Documentation/mm/index.rst
++++ b/Documentation/mm/index.rst
+@@ -51,6 +51,7 @@ above structured documentation, or delet
+    ksm
+    memory-model
+    mmu_notifier
++   multigen_lru
+    numa
+    overcommit-accounting
+    page_migration
+--- /dev/null
++++ b/Documentation/mm/multigen_lru.rst
+@@ -0,0 +1,159 @@
++.. SPDX-License-Identifier: GPL-2.0
++
++=============
++Multi-Gen LRU
++=============
++The multi-gen LRU is an alternative LRU implementation that optimizes
++page reclaim and improves performance under memory pressure. Page
++reclaim decides the kernel's caching policy and ability to overcommit
++memory. It directly impacts the kswapd CPU usage and RAM efficiency.
++
++Design overview
++===============
++Objectives
++----------
++The design objectives are:
++
++* Good representation of access recency
++* Try to profit from spatial locality
++* Fast paths to make obvious choices
++* Simple self-correcting heuristics
++
++The representation of access recency is at the core of all LRU
++implementations. In the multi-gen LRU, each generation represents a
++group of pages with similar access recency. Generations establish a
++(time-based) common frame of reference and therefore help make better
++choices, e.g., between different memcgs on a computer or different
++computers in a data center (for job scheduling).
++
++Exploiting spatial locality improves efficiency when gathering the
++accessed bit. A rmap walk targets a single page and does not try to
++profit from discovering a young PTE. A page table walk can sweep all
++the young PTEs in an address space, but the address space can be too
++sparse to make a profit. The key is to optimize both methods and use
++them in combination.
++
++Fast paths reduce code complexity and runtime overhead. Unmapped pages
++do not require TLB flushes; clean pages do not require writeback.
++These facts are only helpful when other conditions, e.g., access
++recency, are similar. With generations as a common frame of reference,
++additional factors stand out. But obvious choices might not be good
++choices; thus self-correction is necessary.
++
++The benefits of simple self-correcting heuristics are self-evident.
++Again, with generations as a common frame of reference, this becomes
++attainable. Specifically, pages in the same generation can be
++categorized based on additional factors, and a feedback loop can
++statistically compare the refault percentages across those categories
++and infer which of them are better choices.
++
++Assumptions
++-----------
++The protection of hot pages and the selection of cold pages are based
++on page access channels and patterns. There are two access channels:
++
++* Accesses through page tables
++* Accesses through file descriptors
++
++The protection of the former channel is by design stronger because:
++
++1. The uncertainty in determining the access patterns of the former
++   channel is higher due to the approximation of the accessed bit.
++2. The cost of evicting the former channel is higher due to the TLB
++   flushes required and the likelihood of encountering the dirty bit.
++3. The penalty of underprotecting the former channel is higher because
++   applications usually do not prepare themselves for major page
++   faults like they do for blocked I/O. E.g., GUI applications
++   commonly use dedicated I/O threads to avoid blocking rendering
++   threads.
++
++There are also two access patterns:
++
++* Accesses exhibiting temporal locality
++* Accesses not exhibiting temporal locality
++
++For the reasons listed above, the former channel is assumed to follow
++the former pattern unless ``VM_SEQ_READ`` or ``VM_RAND_READ`` is
++present, and the latter channel is assumed to follow the latter
++pattern unless outlying refaults have been observed.
++
++Workflow overview
++=================
++Evictable pages are divided into multiple generations for each
++``lruvec``. The youngest generation number is stored in
++``lrugen->max_seq`` for both anon and file types as they are aged on
++an equal footing. The oldest generation numbers are stored in
++``lrugen->min_seq[]`` separately for anon and file types as clean file
++pages can be evicted regardless of swap constraints. These three
++variables are monotonically increasing.
++
++Generation numbers are truncated into ``order_base_2(MAX_NR_GENS+1)``
++bits in order to fit into the gen counter in ``folio->flags``. Each
++truncated generation number is an index to ``lrugen->lists[]``. The
++sliding window technique is used to track at least ``MIN_NR_GENS`` and
++at most ``MAX_NR_GENS`` generations. The gen counter stores a value
++within ``[1, MAX_NR_GENS]`` while a page is on one of
++``lrugen->lists[]``; otherwise it stores zero.
++
++Each generation is divided into multiple tiers. A page accessed ``N``
++times through file descriptors is in tier ``order_base_2(N)``. Unlike
++generations, tiers do not have dedicated ``lrugen->lists[]``. In
++contrast to moving across generations, which requires the LRU lock,
++moving across tiers only involves atomic operations on
++``folio->flags`` and therefore has a negligible cost. A feedback loop
++modeled after the PID controller monitors refaults over all the tiers
++from anon and file types and decides which tiers from which types to
++evict or protect.
++
++There are two conceptually independent procedures: the aging and the
++eviction. They form a closed-loop system, i.e., the page reclaim.
++
++Aging
++-----
++The aging produces young generations. Given an ``lruvec``, it
++increments ``max_seq`` when ``max_seq-min_seq+1`` approaches
++``MIN_NR_GENS``. The aging promotes hot pages to the youngest
++generation when it finds them accessed through page tables; the
++demotion of cold pages happens consequently when it increments
++``max_seq``. The aging uses page table walks and rmap walks to find
++young PTEs. For the former, it iterates ``lruvec_memcg()->mm_list``
++and calls ``walk_page_range()`` with each ``mm_struct`` on this list
++to scan PTEs, and after each iteration, it increments ``max_seq``. For
++the latter, when the eviction walks the rmap and finds a young PTE,
++the aging scans the adjacent PTEs. For both, on finding a young PTE,
++the aging clears the accessed bit and updates the gen counter of the
++page mapped by this PTE to ``(max_seq%MAX_NR_GENS)+1``.
++
++Eviction
++--------
++The eviction consumes old generations. Given an ``lruvec``, it
++increments ``min_seq`` when ``lrugen->lists[]`` indexed by
++``min_seq%MAX_NR_GENS`` becomes empty. To select a type and a tier to
++evict from, it first compares ``min_seq[]`` to select the older type.
++If both types are equally old, it selects the one whose first tier has
++a lower refault percentage. The first tier contains single-use
++unmapped clean pages, which are the best bet. The eviction sorts a
++page according to its gen counter if the aging has found this page
++accessed through page tables and updated its gen counter. It also
++moves a page to the next generation, i.e., ``min_seq+1``, if this page
++was accessed multiple times through file descriptors and the feedback
++loop has detected outlying refaults from the tier this page is in. To
++this end, the feedback loop uses the first tier as the baseline, for
++the reason stated earlier.
++
++Summary
++-------
++The multi-gen LRU can be disassembled into the following parts:
++
++* Generations
++* Rmap walks
++* Page table walks
++* Bloom filters
++* PID controller
++
++The aging and the eviction form a producer-consumer model;
++specifically, the latter drives the former by the sliding window over
++generations. Within the aging, rmap walks drive page table walks by
++inserting hot densely populated page tables to the Bloom filters.
++Within the eviction, the PID controller uses refaults as the feedback
++to select types to evict and tiers to protect.
diff --git a/target/linux/generic/config-5.15 b/target/linux/generic/config-5.15
index 87fcb2e92..8105c0860 100644
--- a/target/linux/generic/config-5.15
+++ b/target/linux/generic/config-5.15
@@ -3534,9 +3534,7 @@ CONFIG_MODULE_UNLOAD=y
 # CONFIG_MPL115_SPI is not set
 # CONFIG_MPL3115 is not set
 # CONFIG_MPLS is not set
-CONFIG_MPTCP=y
-CONFIG_INET_MPTCP_DIAG=m
-CONFIG_MPTCP_IPV6=y
+# CONFIG_MPTCP is not set
 # CONFIG_MPU3050_I2C is not set
 # CONFIG_MQ_IOSCHED_DEADLINE is not set
 # CONFIG_MQ_IOSCHED_KYBER is not set
diff --git a/target/linux/generic/config-6.0 b/target/linux/generic/config-6.0
new file mode 100644
index 000000000..f5bb5afa8
--- /dev/null
+++ b/target/linux/generic/config-6.0
@@ -0,0 +1,7563 @@
+# CONFIG_104_QUAD_8 is not set
+CONFIG_32BIT=y
+CONFIG_64BIT_TIME=y
+# CONFIG_6LOWPAN is not set
+# CONFIG_6LOWPAN_DEBUGFS is not set
+# CONFIG_6PACK is not set
+# CONFIG_8139CP is not set
+# CONFIG_8139TOO is not set
+# CONFIG_9P_FS is not set
+# CONFIG_AB3100_CORE is not set
+# CONFIG_AB8500_CORE is not set
+# CONFIG_ABP060MG is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_ACCESSIBILITY is not set
+# CONFIG_ACENIC is not set
+# CONFIG_ACERHDF is not set
+# CONFIG_ACER_WIRELESS is not set
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_ACPI_ALS is not set
+# CONFIG_ACPI_APEI is not set
+# CONFIG_ACPI_BUTTON is not set
+# CONFIG_ACPI_CONFIGFS is not set
+# CONFIG_ACPI_CUSTOM_METHOD is not set
+# CONFIG_ACPI_EXTLOG is not set
+# CONFIG_ACPI_HED is not set
+# CONFIG_ACPI_NFIT is not set
+# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set
+# CONFIG_ACPI_TABLE_UPGRADE is not set
+# CONFIG_ACPI_VIDEO is not set
+# CONFIG_AD2S1200 is not set
+# CONFIG_AD2S1210 is not set
+# CONFIG_AD2S90 is not set
+# CONFIG_AD5064 is not set
+# CONFIG_AD525X_DPOT is not set
+# CONFIG_AD5272 is not set
+# CONFIG_AD5360 is not set
+# CONFIG_AD5380 is not set
+# CONFIG_AD5421 is not set
+# CONFIG_AD5446 is not set
+# CONFIG_AD5449 is not set
+# CONFIG_AD5504 is not set
+# CONFIG_AD5592R is not set
+# CONFIG_AD5593R is not set
+# CONFIG_AD5624R_SPI is not set
+# CONFIG_AD5686 is not set
+# CONFIG_AD5686_SPI is not set
+# CONFIG_AD5696_I2C is not set
+# CONFIG_AD5755 is not set
+# CONFIG_AD5758 is not set
+# CONFIG_AD5761 is not set
+# CONFIG_AD5764 is not set
+# CONFIG_AD5766 is not set
+# CONFIG_AD5770R is not set
+# CONFIG_AD5791 is not set
+# CONFIG_AD5933 is not set
+# CONFIG_AD7091R5 is not set
+# CONFIG_AD7124 is not set
+# CONFIG_AD7150 is not set
+# CONFIG_AD7152 is not set
+# CONFIG_AD7192 is not set
+# CONFIG_AD7266 is not set
+# CONFIG_AD7280 is not set
+# CONFIG_AD7291 is not set
+# CONFIG_AD7292 is not set
+# CONFIG_AD7298 is not set
+# CONFIG_AD7303 is not set
+# CONFIG_AD7476 is not set
+# CONFIG_AD7606 is not set
+# CONFIG_AD7606_IFACE_PARALLEL is not set
+# CONFIG_AD7606_IFACE_SPI is not set
+# CONFIG_AD7746 is not set
+# CONFIG_AD7766 is not set
+# CONFIG_AD7768_1 is not set
+# CONFIG_AD7780 is not set
+# CONFIG_AD7791 is not set
+# CONFIG_AD7793 is not set
+# CONFIG_AD7816 is not set
+# CONFIG_AD7887 is not set
+# CONFIG_AD7923 is not set
+# CONFIG_AD7949 is not set
+# CONFIG_AD799X is not set
+# CONFIG_AD8366 is not set
+# CONFIG_AD8801 is not set
+# CONFIG_AD9467 is not set
+# CONFIG_AD9523 is not set
+# CONFIG_AD9832 is not set
+# CONFIG_AD9834 is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+# CONFIG_ADE7854 is not set
+# CONFIG_ADF4350 is not set
+# CONFIG_ADF4371 is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADIN1100_PHY is not set
+# CONFIG_ADIN_PHY is not set
+# CONFIG_ADIS16080 is not set
+# CONFIG_ADIS16130 is not set
+# CONFIG_ADIS16136 is not set
+# CONFIG_ADIS16201 is not set
+# CONFIG_ADIS16203 is not set
+# CONFIG_ADIS16209 is not set
+# CONFIG_ADIS16240 is not set
+# CONFIG_ADIS16260 is not set
+# CONFIG_ADIS16400 is not set
+# CONFIG_ADIS16460 is not set
+# CONFIG_ADIS16475 is not set
+# CONFIG_ADIS16480 is not set
+# CONFIG_ADI_AXI_ADC is not set
+# CONFIG_ADJD_S311 is not set
+# CONFIG_ADM6996_PHY is not set
+# CONFIG_ADM8211 is not set
+# CONFIG_ADT7316 is not set
+# CONFIG_ADUX1020 is not set
+CONFIG_ADVISE_SYSCALLS=y
+# CONFIG_ADV_SWBUTTON is not set
+# CONFIG_ADXL345_I2C is not set
+# CONFIG_ADXL345_SPI is not set
+# CONFIG_ADXL372_I2C is not set
+# CONFIG_ADXL372_SPI is not set
+# CONFIG_ADXRS290 is not set
+# CONFIG_ADXRS450 is not set
+CONFIG_AEABI=y
+# CONFIG_AFE4403 is not set
+# CONFIG_AFE4404 is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_AFS_DEBUG_CURSOR is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_AF_KCM is not set
+# CONFIG_AF_RXRPC is not set
+# CONFIG_AF_RXRPC_INJECT_LOSS is not set
+# CONFIG_AF_RXRPC_IPV6 is not set
+# CONFIG_AF_UNIX_OOB is not set
+# CONFIG_AGP is not set
+# CONFIG_AHCI_CEVA is not set
+# CONFIG_AHCI_IMX is not set
+# CONFIG_AHCI_MVEBU is not set
+# CONFIG_AHCI_QORIQ is not set
+CONFIG_AIO=y
+# CONFIG_AIRO is not set
+# CONFIG_AIRO_CS is not set
+# CONFIG_AIX_PARTITION is not set
+# CONFIG_AK09911 is not set
+# CONFIG_AK8974 is not set
+# CONFIG_AK8975 is not set
+# CONFIG_AL3010 is not set
+# CONFIG_AL3320A is not set
+# CONFIG_ALIM7101_WDT is not set
+CONFIG_ALLOW_DEV_COREDUMP=y
+# CONFIG_ALTERA_MBOX is not set
+# CONFIG_ALTERA_MSGDMA is not set
+# CONFIG_ALTERA_STAPL is not set
+# CONFIG_ALTERA_TSE is not set
+# CONFIG_ALX is not set
+# CONFIG_AL_FIC is not set
+# CONFIG_AM2315 is not set
+# CONFIG_AM335X_PHY_USB is not set
+# CONFIG_AMBA_PL08X is not set
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_AMD_MEM_ENCRYPT is not set
+# CONFIG_AMD_PHY is not set
+# CONFIG_AMD_XGBE is not set
+# CONFIG_AMD_XGBE_HAVE_ECC is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_AMILO_RFKILL is not set
+# CONFIG_AMT is not set
+# CONFIG_ANDROID is not set
+# CONFIG_ANDROID_BINDER_IPC is not set
+CONFIG_ANON_INODES=y
+# CONFIG_ANON_VMA_NAME is not set
+# CONFIG_APDS9300 is not set
+# CONFIG_APDS9802ALS is not set
+# CONFIG_APDS9960 is not set
+# CONFIG_APM8018X is not set
+# CONFIG_APM_EMULATION is not set
+# CONFIG_APPLE_AIC is not set
+# CONFIG_APPLE_GMUX is not set
+# CONFIG_APPLE_MFI_FASTCHARGE is not set
+# CONFIG_APPLE_PROPERTIES is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AQTION is not set
+# CONFIG_AQUANTIA_PHY is not set
+# CONFIG_AR5523 is not set
+# CONFIG_AR7 is not set
+# CONFIG_AR8216_PHY is not set
+# CONFIG_AR8216_PHY_LEDS is not set
+# CONFIG_ARCH_ACTIONS is not set
+# CONFIG_ARCH_AGILEX is not set
+# CONFIG_ARCH_ALPINE is not set
+# CONFIG_ARCH_APPLE is not set
+# CONFIG_ARCH_ARTPEC is not set
+# CONFIG_ARCH_ASPEED is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_AXXIA is not set
+# CONFIG_ARCH_BCM is not set
+# CONFIG_ARCH_BCM2835 is not set
+# CONFIG_ARCH_BCM4908 is not set
+# CONFIG_ARCH_BCMBCA is not set
+# CONFIG_ARCH_BCM_21664 is not set
+# CONFIG_ARCH_BCM_23550 is not set
+# CONFIG_ARCH_BCM_281XX is not set
+# CONFIG_ARCH_BCM_5301X is not set
+# CONFIG_ARCH_BCM_53573 is not set
+# CONFIG_ARCH_BCM_63XX is not set
+# CONFIG_ARCH_BCM_CYGNUS is not set
+# CONFIG_ARCH_BCM_IPROC is not set
+# CONFIG_ARCH_BCM_NSP is not set
+# CONFIG_ARCH_BERLIN is not set
+CONFIG_ARCH_BINFMT_ELF_STATE=y
+# CONFIG_ARCH_BITMAIN is not set
+# CONFIG_ARCH_BRCMSTB is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CNS3XXX is not set
+# CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_DIGICOLOR is not set
+# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set
+# CONFIG_ARCH_DOVE is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_EXYNOS is not set
+CONFIG_ARCH_FLATMEM_ENABLE=y
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_HI3xxx is not set
+# CONFIG_ARCH_HIGHBANK is not set
+# CONFIG_ARCH_HISI is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_INTEL_SOCFPGA is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_K3 is not set
+# CONFIG_ARCH_KEEMBAY is not set
+# CONFIG_ARCH_KEYSTONE is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_LAYERSCAPE is not set
+# CONFIG_ARCH_LG1K is not set
+# CONFIG_ARCH_LPC32XX is not set
+# CONFIG_ARCH_MEDIATEK is not set
+# CONFIG_ARCH_MESON is not set
+# CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE is not set
+# CONFIG_ARCH_MILBEAUT is not set
+CONFIG_ARCH_MMAP_RND_BITS=18
+CONFIG_ARCH_MMAP_RND_BITS_MAX=16
+CONFIG_ARCH_MMAP_RND_BITS_MIN=8
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_MSTARV7 is not set
+# CONFIG_ARCH_MULTIPLATFORM is not set
+# CONFIG_ARCH_MULTI_V6 is not set
+# CONFIG_ARCH_MULTI_V7 is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_MVEBU is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_MXS is not set
+# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_NPCM is not set
+# CONFIG_ARCH_NSPIRE is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_OMAP1 is not set
+# CONFIG_ARCH_OMAP2 is not set
+# CONFIG_ARCH_OMAP2PLUS is not set
+# CONFIG_ARCH_OMAP3 is not set
+# CONFIG_ARCH_OMAP4 is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_OXNAS is not set
+# CONFIG_ARCH_PICOXCELL is not set
+# CONFIG_ARCH_PRIMA2 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_QCOM is not set
+# CONFIG_ARCH_RANDOM is not set
+# CONFIG_ARCH_RDA is not set
+# CONFIG_ARCH_REALTEK is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_RENESAS is not set
+# CONFIG_ARCH_ROCKCHIP is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_S32 is not set
+# CONFIG_ARCH_S3C24XX is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_S5PV210 is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_SEATTLE is not set
+# CONFIG_ARCH_SHMOBILE is not set
+# CONFIG_ARCH_SIRF is not set
+# CONFIG_ARCH_SOCFPGA is not set
+# CONFIG_ARCH_SPARX5 is not set
+# CONFIG_ARCH_SPRD is not set
+# CONFIG_ARCH_STI is not set
+# CONFIG_ARCH_STM32 is not set
+# CONFIG_ARCH_STRATIX10 is not set
+# CONFIG_ARCH_SUNXI is not set
+# CONFIG_ARCH_SYNQUACER is not set
+# CONFIG_ARCH_TANGO is not set
+# CONFIG_ARCH_TEGRA is not set
+# CONFIG_ARCH_THUNDER is not set
+# CONFIG_ARCH_THUNDER2 is not set
+# CONFIG_ARCH_U300 is not set
+# CONFIG_ARCH_U8500 is not set
+# CONFIG_ARCH_UNIPHIER is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_VEXPRESS is not set
+# CONFIG_ARCH_VIRT is not set
+# CONFIG_ARCH_VISCONTI is not set
+# CONFIG_ARCH_VT8500 is not set
+# CONFIG_ARCH_VULCAN is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_WANTS_NO_INSTR is not set
+# CONFIG_ARCH_WANTS_THP_SWAP is not set
+# CONFIG_ARCH_WM8505 is not set
+# CONFIG_ARCH_WM8750 is not set
+# CONFIG_ARCH_WM8850 is not set
+# CONFIG_ARCH_XGENE is not set
+# CONFIG_ARCH_ZX is not set
+# CONFIG_ARCH_ZYNQ is not set
+# CONFIG_ARCH_ZYNQMP is not set
+# CONFIG_ARCNET is not set
+# CONFIG_ARC_EMAC is not set
+# CONFIG_ARC_IRQ_NO_AUTOSAVE is not set
+# CONFIG_ARM64_16K_PAGES is not set
+CONFIG_ARM64_4K_PAGES=y
+# CONFIG_ARM64_64K_PAGES is not set
+# CONFIG_ARM64_AMU_EXTN is not set
+# CONFIG_ARM64_BTI is not set
+# CONFIG_ARM64_CRYPTO is not set
+# CONFIG_ARM64_E0PD is not set
+# CONFIG_ARM64_EPAN is not set
+# CONFIG_ARM64_ERRATUM_1024718 is not set
+# CONFIG_ARM64_ERRATUM_1165522 is not set
+# CONFIG_ARM64_ERRATUM_1286807 is not set
+# CONFIG_ARM64_ERRATUM_1319367 is not set
+# CONFIG_ARM64_ERRATUM_1418040 is not set
+# CONFIG_ARM64_ERRATUM_1463225 is not set
+# CONFIG_ARM64_ERRATUM_1508412 is not set
+# CONFIG_ARM64_ERRATUM_1530923 is not set
+# CONFIG_ARM64_ERRATUM_1542419 is not set
+# CONFIG_ARM64_ERRATUM_1742098 is not set
+# CONFIG_ARM64_ERRATUM_2051678 is not set
+# CONFIG_ARM64_ERRATUM_2054223 is not set
+# CONFIG_ARM64_ERRATUM_2067961 is not set
+# CONFIG_ARM64_ERRATUM_2077057 is not set
+# CONFIG_ARM64_ERRATUM_2441009 is not set
+# CONFIG_ARM64_ERRATUM_819472 is not set
+# CONFIG_ARM64_ERRATUM_824069 is not set
+# CONFIG_ARM64_ERRATUM_826319 is not set
+# CONFIG_ARM64_ERRATUM_827319 is not set
+# CONFIG_ARM64_ERRATUM_832075 is not set
+# CONFIG_ARM64_ERRATUM_834220 is not set
+# CONFIG_ARM64_ERRATUM_843419 is not set
+# CONFIG_ARM64_ERRATUM_845719 is not set
+# CONFIG_ARM64_ERRATUM_858921 is not set
+# CONFIG_ARM64_HW_AFDBM is not set
+# CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419 is not set
+# CONFIG_ARM64_LSE_ATOMICS is not set
+# CONFIG_ARM64_MODULE_PLTS is not set
+# CONFIG_ARM64_MTE is not set
+# CONFIG_ARM64_PAN is not set
+# CONFIG_ARM64_PMEM is not set
+# CONFIG_ARM64_PSEUDO_NMI is not set
+# CONFIG_ARM64_PTDUMP_DEBUGFS is not set
+# CONFIG_ARM64_PTR_AUTH is not set
+# CONFIG_ARM64_PTR_AUTH_KERNEL is not set
+# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
+# CONFIG_ARM64_RAS_EXTN is not set
+# CONFIG_ARM64_RELOC_TEST is not set
+# CONFIG_ARM64_SME is not set
+# CONFIG_ARM64_SVE is not set
+CONFIG_ARM64_SW_TTBR0_PAN=y
+# CONFIG_ARM64_TAGGED_ADDR_ABI is not set
+# CONFIG_ARM64_TLB_RANGE is not set
+# CONFIG_ARM64_UAO is not set
+# CONFIG_ARM64_USE_LSE_ATOMICS is not set
+CONFIG_ARM64_VA_BITS_39=y
+# CONFIG_ARM64_VA_BITS_48 is not set
+# CONFIG_ARM64_VHE is not set
+# CONFIG_ARM_APPENDED_DTB is not set
+# CONFIG_ARM_ARCH_TIMER is not set
+# CONFIG_ARM_ARCH_TIMER_EVTSTREAM is not set
+# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set
+# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set
+# CONFIG_ARM_CCI is not set
+# CONFIG_ARM_CCI400_PMU is not set
+# CONFIG_ARM_CCI5xx_PMU is not set
+# CONFIG_ARM_CCI_PMU is not set
+# CONFIG_ARM_CCN is not set
+# CONFIG_ARM_CMN is not set
+# CONFIG_ARM_CPUIDLE is not set
+CONFIG_ARM_CPU_TOPOLOGY=y
+# CONFIG_ARM_CRYPTO is not set
+CONFIG_ARM_DMA_MEM_BUFFERABLE=y
+# CONFIG_ARM_DSU_PMU is not set
+# CONFIG_ARM_ERRATA_326103 is not set
+# CONFIG_ARM_ERRATA_364296 is not set
+# CONFIG_ARM_ERRATA_411920 is not set
+# CONFIG_ARM_ERRATA_430973 is not set
+# CONFIG_ARM_ERRATA_458693 is not set
+# CONFIG_ARM_ERRATA_460075 is not set
+# CONFIG_ARM_ERRATA_643719 is not set
+# CONFIG_ARM_ERRATA_720789 is not set
+# CONFIG_ARM_ERRATA_742230 is not set
+# CONFIG_ARM_ERRATA_742231 is not set
+# CONFIG_ARM_ERRATA_743622 is not set
+# CONFIG_ARM_ERRATA_751472 is not set
+# CONFIG_ARM_ERRATA_754322 is not set
+# CONFIG_ARM_ERRATA_754327 is not set
+# CONFIG_ARM_ERRATA_764369 is not set
+# CONFIG_ARM_ERRATA_773022 is not set
+# CONFIG_ARM_ERRATA_775420 is not set
+# CONFIG_ARM_ERRATA_798181 is not set
+# CONFIG_ARM_ERRATA_814220 is not set
+# CONFIG_ARM_ERRATA_818325_852422 is not set
+# CONFIG_ARM_ERRATA_821420 is not set
+# CONFIG_ARM_ERRATA_825619 is not set
+# CONFIG_ARM_ERRATA_852421 is not set
+# CONFIG_ARM_ERRATA_852423 is not set
+# CONFIG_ARM_ERRATA_857271 is not set
+# CONFIG_ARM_ERRATA_857272 is not set
+# CONFIG_ARM_FFA_TRANSPORT is not set
+CONFIG_ARM_GIC_MAX_NR=1
+# CONFIG_ARM_GT_INITIAL_PRESCALER_VAL is not set
+# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set
+# CONFIG_ARM_KPROBES_TEST is not set
+# CONFIG_ARM_LPAE is not set
+# CONFIG_ARM_MHU is not set
+# CONFIG_ARM_MHU_V2 is not set
+# CONFIG_ARM_MODULE_PLTS is not set
+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
+# CONFIG_ARM_PSCI is not set
+# CONFIG_ARM_PSCI_CHECKER is not set
+# CONFIG_ARM_PSCI_CPUIDLE is not set
+# CONFIG_ARM_PTDUMP_DEBUGFS is not set
+# CONFIG_ARM_SBSA_WATCHDOG is not set
+# CONFIG_ARM_SCMI_AVOID_FASTCHANNELS is not set
+# CONFIG_ARM_SCMI_POWER_CONTROL is not set
+# CONFIG_ARM_SCMI_POWER_DOMAIN is not set
+# CONFIG_ARM_SCMI_PROTOCOL is not set
+# CONFIG_ARM_SCPI_PROTOCOL is not set
+# CONFIG_ARM_SDE_INTERFACE is not set
+# CONFIG_ARM_SMCCC_SOC_ID is not set
+# CONFIG_ARM_SMC_WATCHDOG is not set
+# CONFIG_ARM_SP805_WATCHDOG is not set
+# CONFIG_ARM_SPE_PMU is not set
+# CONFIG_ARM_THUMBEE is not set
+# CONFIG_ARM_TIMER_SP804 is not set
+# CONFIG_ARM_UNWIND is not set
+# CONFIG_ARM_VIRT_EXT is not set
+# CONFIG_AS3935 is not set
+# CONFIG_AS73211 is not set
+# CONFIG_ASM9260_TIMER is not set
+# CONFIG_ASN1 is not set
+# CONFIG_ASUS_LAPTOP is not set
+# CONFIG_ASUS_WIRELESS is not set
+# CONFIG_ASYMMETRIC_KEY_TYPE is not set
+# CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE is not set
+# CONFIG_ASYNC_RAID6_TEST is not set
+# CONFIG_ASYNC_TX_DMA is not set
+# CONFIG_AT76C50X_USB is not set
+# CONFIG_AT803X_PHY is not set
+# CONFIG_AT91_SAMA5D2_ADC is not set
+# CONFIG_ATA is not set
+# CONFIG_ATAGS is not set
+CONFIG_ATAGS_PROC=y
+# CONFIG_ATALK is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_ATA_ACPI is not set
+CONFIG_ATA_BMDMA=y
+# CONFIG_ATA_FORCE is not set
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_ATA_LEDS is not set
+# CONFIG_ATA_NONSTANDARD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_ATA_PIIX is not set
+CONFIG_ATA_SFF=y
+# CONFIG_ATA_VERBOSE_ERROR is not set
+# CONFIG_ATH10K is not set
+# CONFIG_ATH25 is not set
+# CONFIG_ATH5K is not set
+# CONFIG_ATH6KL is not set
+# CONFIG_ATH79 is not set
+# CONFIG_ATH9K is not set
+# CONFIG_ATH9K_HTC is not set
+# CONFIG_ATH_DEBUG is not set
+# CONFIG_ATL1 is not set
+# CONFIG_ATL1C is not set
+# CONFIG_ATL1E is not set
+# CONFIG_ATL2 is not set
+# CONFIG_ATLAS_EZO_SENSOR is not set
+# CONFIG_ATLAS_PH_SENSOR is not set
+# CONFIG_ATM is not set
+# CONFIG_ATMEL is not set
+# CONFIG_ATMEL_PIT is not set
+# CONFIG_ATMEL_SSC is not set
+# CONFIG_ATM_AMBASSADOR is not set
+# CONFIG_ATM_BR2684 is not set
+CONFIG_ATM_BR2684_IPFILTER=y
+# CONFIG_ATM_CLIP is not set
+CONFIG_ATM_CLIP_NO_ICMP=y
+# CONFIG_ATM_DRIVERS is not set
+# CONFIG_ATM_DUMMY is not set
+# CONFIG_ATM_ENI is not set
+# CONFIG_ATM_FIRESTREAM is not set
+# CONFIG_ATM_FORE200E is not set
+# CONFIG_ATM_HE is not set
+# CONFIG_ATM_HORIZON is not set
+# CONFIG_ATM_IA is not set
+# CONFIG_ATM_IDT77252 is not set
+# CONFIG_ATM_LANAI is not set
+# CONFIG_ATM_LANE is not set
+# CONFIG_ATM_MPOA is not set
+# CONFIG_ATM_NICSTAR is not set
+# CONFIG_ATM_SOLOS is not set
+# CONFIG_ATM_TCP is not set
+# CONFIG_ATM_ZATM is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_ATP is not set
+# CONFIG_AUDIT is not set
+# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
+# CONFIG_AURORA_NB8800 is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTO_ZRELADDR is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_AX25 is not set
+# CONFIG_AX25_DAMA_SLAVE is not set
+# CONFIG_AX88796 is not set
+# CONFIG_AX88796B_PHY is not set
+# CONFIG_AXP20X_ADC is not set
+# CONFIG_AXP20X_POWER is not set
+# CONFIG_AXP288_ADC is not set
+# CONFIG_AXP288_FUEL_GAUGE is not set
+# CONFIG_B43 is not set
+# CONFIG_B43LEGACY is not set
+# CONFIG_B44 is not set
+# CONFIG_B53 is not set
+# CONFIG_BACKLIGHT_ADP8860 is not set
+# CONFIG_BACKLIGHT_ADP8870 is not set
+# CONFIG_BACKLIGHT_APPLE is not set
+# CONFIG_BACKLIGHT_ARCXCNN is not set
+# CONFIG_BACKLIGHT_BD6107 is not set
+# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
+# CONFIG_BACKLIGHT_GENERIC is not set
+# CONFIG_BACKLIGHT_GPIO is not set
+# CONFIG_BACKLIGHT_KTD253 is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+# CONFIG_BACKLIGHT_LED is not set
+# CONFIG_BACKLIGHT_LM3630A is not set
+# CONFIG_BACKLIGHT_LM3639 is not set
+# CONFIG_BACKLIGHT_LP855X is not set
+# CONFIG_BACKLIGHT_LV5207LP is not set
+# CONFIG_BACKLIGHT_PANDORA is not set
+# CONFIG_BACKLIGHT_PM8941_WLED is not set
+# CONFIG_BACKLIGHT_PWM is not set
+# CONFIG_BACKLIGHT_QCOM_WLED is not set
+# CONFIG_BACKLIGHT_RPI is not set
+# CONFIG_BACKLIGHT_SAHARA is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_BAREUDP is not set
+CONFIG_BASE_FULL=y
+CONFIG_BASE_SMALL=0
+# CONFIG_BATMAN_ADV is not set
+# CONFIG_BATTERY_BQ27XXX is not set
+# CONFIG_BATTERY_BQ27XXX_HDQ is not set
+# CONFIG_BATTERY_CW2015 is not set
+# CONFIG_BATTERY_DS2760 is not set
+# CONFIG_BATTERY_DS2780 is not set
+# CONFIG_BATTERY_DS2781 is not set
+# CONFIG_BATTERY_DS2782 is not set
+# CONFIG_BATTERY_GAUGE_LTC2941 is not set
+# CONFIG_BATTERY_GOLDFISH is not set
+# CONFIG_BATTERY_LEGO_EV3 is not set
+# CONFIG_BATTERY_MAX17040 is not set
+# CONFIG_BATTERY_MAX17042 is not set
+# CONFIG_BATTERY_MAX1721X is not set
+# CONFIG_BATTERY_RT5033 is not set
+# CONFIG_BATTERY_SAMSUNG_SDI is not set
+# CONFIG_BATTERY_SBS is not set
+# CONFIG_BATTERY_UG3105 is not set
+# CONFIG_BAYCOM_EPP is not set
+# CONFIG_BAYCOM_PAR is not set
+# CONFIG_BAYCOM_SER_FDX is not set
+# CONFIG_BAYCOM_SER_HDX is not set
+# CONFIG_BCACHE is not set
+# CONFIG_BCM47XX is not set
+# CONFIG_BCM54140_PHY is not set
+# CONFIG_BCM63XX is not set
+# CONFIG_BCM63XX_PHY is not set
+# CONFIG_BCM7038_WDT is not set
+# CONFIG_BCM7XXX_PHY is not set
+# CONFIG_BCM84881_PHY is not set
+# CONFIG_BCM87XX_PHY is not set
+# CONFIG_BCMA is not set
+# CONFIG_BCMA_DRIVER_GPIO is not set
+CONFIG_BCMA_POSSIBLE=y
+# CONFIG_BCMGENET is not set
+# CONFIG_BCM_IPROC_ADC is not set
+# CONFIG_BCM_KONA_USB2_PHY is not set
+# CONFIG_BCM_SBA_RAID is not set
+# CONFIG_BCM_VK is not set
+# CONFIG_BDI_SWITCH is not set
+# CONFIG_BE2ISCSI is not set
+# CONFIG_BE2NET is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_BGMAC is not set
+# CONFIG_BH1750 is not set
+# CONFIG_BH1780 is not set
+# CONFIG_BIG_KEYS is not set
+# CONFIG_BIG_LITTLE is not set
+# CONFIG_BINARY_PRINTF is not set
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_ELF_FDPIC is not set
+# CONFIG_BINFMT_FLAT is not set
+# CONFIG_BINFMT_MISC is not set
+CONFIG_BINFMT_SCRIPT=y
+CONFIG_BITREVERSE=y
+# CONFIG_BLK_CGROUP_IOCOST is not set
+# CONFIG_BLK_CGROUP_IOLATENCY is not set
+# CONFIG_BLK_CGROUP_IOPRIO is not set
+# CONFIG_BLK_CMDLINE_PARSER is not set
+# CONFIG_BLK_DEBUG_FS is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_BLK_DEV_4DRIVES is not set
+# CONFIG_BLK_DEV_AEC62XX is not set
+# CONFIG_BLK_DEV_ALI14XX is not set
+# CONFIG_BLK_DEV_ALI15X3 is not set
+# CONFIG_BLK_DEV_AMD74XX is not set
+# CONFIG_BLK_DEV_ATIIXP is not set
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_BSGLIB is not set
+# CONFIG_BLK_DEV_BSG_COMMON is not set
+# CONFIG_BLK_DEV_CMD640 is not set
+# CONFIG_BLK_DEV_CMD64X is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_CS5520 is not set
+# CONFIG_BLK_DEV_CS5530 is not set
+# CONFIG_BLK_DEV_CS5535 is not set
+# CONFIG_BLK_DEV_CS5536 is not set
+# CONFIG_BLK_DEV_CY82C693 is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_DELKIN is not set
+# CONFIG_BLK_DEV_DRBD is not set
+# CONFIG_BLK_DEV_DTC2278 is not set
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_BLK_DEV_HPT366 is not set
+# CONFIG_BLK_DEV_HT6560B is not set
+# CONFIG_BLK_DEV_IDEACPI is not set
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDECS is not set
+# CONFIG_BLK_DEV_IDEPCI is not set
+# CONFIG_BLK_DEV_IDEPNP is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDE_AU1XXX is not set
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_BLK_DEV_INTEGRITY is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_BLK_DEV_IT8172 is not set
+# CONFIG_BLK_DEV_IT8213 is not set
+# CONFIG_BLK_DEV_IT821X is not set
+# CONFIG_BLK_DEV_JMICRON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_NS87415 is not set
+# CONFIG_BLK_DEV_NULL_BLK is not set
+# CONFIG_BLK_DEV_NVME is not set
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
+# CONFIG_BLK_DEV_PIIX is not set
+# CONFIG_BLK_DEV_PLATFORM is not set
+# CONFIG_BLK_DEV_PMEM is not set
+# CONFIG_BLK_DEV_QD65XX is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_RBD is not set
+# CONFIG_BLK_DEV_RSXX is not set
+# CONFIG_BLK_DEV_RZ1000 is not set
+# CONFIG_BLK_DEV_SC1200 is not set
+# CONFIG_BLK_DEV_SD is not set
+# CONFIG_BLK_DEV_SIIMAGE is not set
+# CONFIG_BLK_DEV_SIS5513 is not set
+# CONFIG_BLK_DEV_SKD is not set
+# CONFIG_BLK_DEV_SL82C105 is not set
+# CONFIG_BLK_DEV_SLC90E66 is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_BLK_DEV_SVWKS is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_TC86C001 is not set
+# CONFIG_BLK_DEV_THROTTLING is not set
+# CONFIG_BLK_DEV_TRIFLEX is not set
+# CONFIG_BLK_DEV_TRM290 is not set
+# CONFIG_BLK_DEV_UBLK is not set
+# CONFIG_BLK_DEV_UMC8672 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_BLK_DEV_ZONED is not set
+# CONFIG_BLK_INLINE_ENCRYPTION is not set
+# CONFIG_BLK_SED_OPAL is not set
+# CONFIG_BLK_WBT is not set
+CONFIG_BLOCK=y
+# CONFIG_BLOCK_LEGACY_AUTOLOAD is not set
+# CONFIG_BMA180 is not set
+# CONFIG_BMA220 is not set
+# CONFIG_BMA400 is not set
+# CONFIG_BMC150_ACCEL is not set
+# CONFIG_BMC150_MAGN is not set
+# CONFIG_BMC150_MAGN_I2C is not set
+# CONFIG_BMC150_MAGN_SPI is not set
+# CONFIG_BME680 is not set
+# CONFIG_BMG160 is not set
+# CONFIG_BMI088_ACCEL is not set
+# CONFIG_BMI160_I2C is not set
+# CONFIG_BMI160_SPI is not set
+# CONFIG_BMIPS_GENERIC is not set
+# CONFIG_BMP280 is not set
+# CONFIG_BNA is not set
+# CONFIG_BNX2 is not set
+# CONFIG_BNX2X is not set
+# CONFIG_BNX2X_SRIOV is not set
+# CONFIG_BNXT is not set
+# CONFIG_BONDING is not set
+# CONFIG_BOOKE_WDT is not set
+CONFIG_BOOKE_WDT_DEFAULT_TIMEOUT=3
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+# CONFIG_BOOTTIME_TRACING is not set
+# CONFIG_BOOT_CONFIG is not set
+# CONFIG_BOOT_PRINTK_DELAY is not set
+CONFIG_BOOT_RAW=y
+# CONFIG_BOUNCE is not set
+CONFIG_BPF=y
+# CONFIG_BPFILTER is not set
+CONFIG_BPF_JIT=y
+# CONFIG_BPF_JIT_ALWAYS_ON is not set
+CONFIG_BPF_JIT_DEFAULT_ON=y
+# CONFIG_BPF_PRELOAD is not set
+# CONFIG_BPF_STREAM_PARSER is not set
+CONFIG_BPF_SYSCALL=y
+CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
+# CONFIG_BPQETHER is not set
+CONFIG_BQL=y
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_BRCMFMAC is not set
+# CONFIG_BRCMSMAC is not set
+# CONFIG_BRCMSTB_GISB_ARB is not set
+CONFIG_BRIDGE=y
+# CONFIG_BRIDGE_CFM is not set
+# CONFIG_BRIDGE_EBT_802_3 is not set
+# CONFIG_BRIDGE_EBT_AMONG is not set
+# CONFIG_BRIDGE_EBT_ARP is not set
+# CONFIG_BRIDGE_EBT_ARPREPLY is not set
+# CONFIG_BRIDGE_EBT_BROUTE is not set
+# CONFIG_BRIDGE_EBT_DNAT is not set
+# CONFIG_BRIDGE_EBT_IP is not set
+# CONFIG_BRIDGE_EBT_IP6 is not set
+# CONFIG_BRIDGE_EBT_LIMIT is not set
+# CONFIG_BRIDGE_EBT_LOG is not set
+# CONFIG_BRIDGE_EBT_MARK is not set
+# CONFIG_BRIDGE_EBT_MARK_T is not set
+# CONFIG_BRIDGE_EBT_NFLOG is not set
+# CONFIG_BRIDGE_EBT_PKTTYPE is not set
+# CONFIG_BRIDGE_EBT_REDIRECT is not set
+# CONFIG_BRIDGE_EBT_SNAT is not set
+# CONFIG_BRIDGE_EBT_STP is not set
+# CONFIG_BRIDGE_EBT_T_FILTER is not set
+# CONFIG_BRIDGE_EBT_T_NAT is not set
+# CONFIG_BRIDGE_EBT_VLAN is not set
+CONFIG_BRIDGE_IGMP_SNOOPING=y
+# CONFIG_BRIDGE_MRP is not set
+# CONFIG_BRIDGE_NETFILTER is not set
+# CONFIG_BRIDGE_NF_EBTABLES is not set
+CONFIG_BRIDGE_VLAN_FILTERING=y
+# CONFIG_BROADCOM_PHY is not set
+CONFIG_BROKEN_ON_SMP=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+# CONFIG_BT is not set
+# CONFIG_BTRFS_ASSERT is not set
+# CONFIG_BTRFS_DEBUG is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_BTRFS_FS_POSIX_ACL is not set
+# CONFIG_BTRFS_FS_REF_VERIFY is not set
+# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set
+# CONFIG_BT_AOSPEXT is not set
+# CONFIG_BT_ATH3K is not set
+# CONFIG_BT_BNEP is not set
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+# CONFIG_BT_BREDR is not set
+# CONFIG_BT_CMTP is not set
+# CONFIG_BT_FEATURE_DEBUG is not set
+# CONFIG_BT_HCIBCM203X is not set
+# CONFIG_BT_HCIBFUSB is not set
+# CONFIG_BT_HCIBLUECARD is not set
+# CONFIG_BT_HCIBPA10X is not set
+# CONFIG_BT_HCIBT3C is not set
+# CONFIG_BT_HCIBTSDIO is not set
+# CONFIG_BT_HCIBTUSB is not set
+# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set
+# CONFIG_BT_HCIBTUSB_MTK is not set
+# CONFIG_BT_HCIBTUSB_RTL is not set
+# CONFIG_BT_HCIDTL1 is not set
+# CONFIG_BT_HCIUART is not set
+# CONFIG_BT_HCIUART_3WIRE is not set
+# CONFIG_BT_HCIUART_AG6XX is not set
+# CONFIG_BT_HCIUART_ATH3K is not set
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_H4=y
+# CONFIG_BT_HCIUART_LL is not set
+# CONFIG_BT_HCIUART_MRVL is not set
+# CONFIG_BT_HCIUART_QCA is not set
+# CONFIG_BT_HCIUART_RTL is not set
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_BT_HIDP is not set
+# CONFIG_BT_HS is not set
+# CONFIG_BT_LE is not set
+# CONFIG_BT_LEDS is not set
+# CONFIG_BT_MRVL is not set
+# CONFIG_BT_MSFTEXT is not set
+# CONFIG_BT_MTKSDIO is not set
+# CONFIG_BT_MTKUART is not set
+# CONFIG_BT_RFCOMM is not set
+CONFIG_BT_RFCOMM_TTY=y
+# CONFIG_BT_SELFTEST is not set
+CONFIG_BUG=y
+# CONFIG_BUG_ON_DATA_CORRUPTION is not set
+CONFIG_BUILDTIME_EXTABLE_SORT=y
+CONFIG_BUILDTIME_TABLE_SORT=y
+# CONFIG_BUILD_BIN2C is not set
+CONFIG_BUILD_SALT=""
+# CONFIG_C2PORT is not set
+CONFIG_CACHE_L2X0_PMU=y
+# CONFIG_CADENCE_WATCHDOG is not set
+# CONFIG_CAIF is not set
+# CONFIG_CAN is not set
+# CONFIG_CAN_BCM is not set
+# CONFIG_CAN_DEBUG_DEVICES is not set
+# CONFIG_CAN_DEV is not set
+# CONFIG_CAN_ETAS_ES58X is not set
+# CONFIG_CAN_GS_USB is not set
+# CONFIG_CAN_GW is not set
+# CONFIG_CAN_HI311X is not set
+# CONFIG_CAN_IFI_CANFD is not set
+# CONFIG_CAN_ISOTP is not set
+# CONFIG_CAN_J1939 is not set
+# CONFIG_CAN_KVASER_PCIEFD is not set
+# CONFIG_CAN_MCBA_USB is not set
+# CONFIG_CAN_MCP251XFD is not set
+# CONFIG_CAN_M_CAN is not set
+# CONFIG_CAN_PEAK_PCIEFD is not set
+# CONFIG_CAN_RAW is not set
+# CONFIG_CAN_RCAR is not set
+# CONFIG_CAN_RCAR_CANFD is not set
+# CONFIG_CAN_SLCAN is not set
+# CONFIG_CAN_SUN4I is not set
+# CONFIG_CAN_UCAN is not set
+# CONFIG_CAN_VCAN is not set
+# CONFIG_CAN_VXCAN is not set
+# CONFIG_CAPI_AVM is not set
+# CONFIG_CAPI_EICON is not set
+# CONFIG_CAPI_TRACE is not set
+CONFIG_CARDBUS=y
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_CARL9170 is not set
+# CONFIG_CASSINI is not set
+# CONFIG_CAVIUM_CPT is not set
+# CONFIG_CAVIUM_ERRATUM_22375 is not set
+# CONFIG_CAVIUM_ERRATUM_23144 is not set
+# CONFIG_CAVIUM_ERRATUM_23154 is not set
+# CONFIG_CAVIUM_ERRATUM_27456 is not set
+# CONFIG_CAVIUM_ERRATUM_30115 is not set
+# CONFIG_CAVIUM_OCTEON_SOC is not set
+# CONFIG_CAVIUM_PTP is not set
+# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set
+# CONFIG_CB710_CORE is not set
+# CONFIG_CC10001_ADC is not set
+# CONFIG_CCS811 is not set
+CONFIG_CC_CAN_LINK=y
+CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_CEPH_FS is not set
+# CONFIG_CEPH_LIB is not set
+# CONFIG_CFG80211 is not set
+# CONFIG_CFG80211_CERTIFICATION_ONUS is not set
+# CONFIG_CGROUPS is not set
+# CONFIG_CGROUP_FAVOR_DYNMODS is not set
+# CONFIG_CGROUP_MISC is not set
+# CONFIG_CHARGER_ADP5061 is not set
+# CONFIG_CHARGER_BD99954 is not set
+# CONFIG_CHARGER_BQ2415X is not set
+# CONFIG_CHARGER_BQ24190 is not set
+# CONFIG_CHARGER_BQ24257 is not set
+# CONFIG_CHARGER_BQ24735 is not set
+# CONFIG_CHARGER_BQ2515X is not set
+# CONFIG_CHARGER_BQ256XX is not set
+# CONFIG_CHARGER_BQ25890 is not set
+# CONFIG_CHARGER_BQ25980 is not set
+# CONFIG_CHARGER_DETECTOR_MAX14656 is not set
+# CONFIG_CHARGER_GPIO is not set
+# CONFIG_CHARGER_ISP1704 is not set
+# CONFIG_CHARGER_LP8727 is not set
+# CONFIG_CHARGER_LT3651 is not set
+# CONFIG_CHARGER_LTC3651 is not set
+# CONFIG_CHARGER_LTC4162L is not set
+# CONFIG_CHARGER_MANAGER is not set
+# CONFIG_CHARGER_MAX77976 is not set
+# CONFIG_CHARGER_MAX8903 is not set
+# CONFIG_CHARGER_RT9455 is not set
+# CONFIG_CHARGER_SBS is not set
+# CONFIG_CHARGER_SMB347 is not set
+# CONFIG_CHARGER_TWL4030 is not set
+# CONFIG_CHARGER_UCS1002 is not set
+# CONFIG_CHASH_SELFTEST is not set
+# CONFIG_CHASH_STATS is not set
+# CONFIG_CHECKPOINT_RESTORE is not set
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_CHELSIO_T4 is not set
+# CONFIG_CHELSIO_T4VF is not set
+# CONFIG_CHROME_PLATFORMS is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_CHR_DEV_SCH is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_CIFS is not set
+# CONFIG_CIFS_ACL is not set
+CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y
+# CONFIG_CIFS_DEBUG is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_FSCACHE is not set
+# CONFIG_CIFS_NFSD_EXPORT is not set
+CONFIG_CIFS_POSIX=y
+# CONFIG_CIFS_SMB2 is not set
+# CONFIG_CIFS_STATS is not set
+# CONFIG_CIFS_STATS2 is not set
+# CONFIG_CIFS_SWN_UPCALL is not set
+# CONFIG_CIFS_WEAK_PW_HASH is not set
+CONFIG_CIFS_XATTR=y
+# CONFIG_CIO_DAC is not set
+# CONFIG_CLEANCACHE is not set
+# CONFIG_CLKSRC_VERSATILE is not set
+# CONFIG_CLK_HSDK is not set
+# CONFIG_CLK_ICST is not set
+# CONFIG_CLK_QORIQ is not set
+# CONFIG_CLK_SP810 is not set
+# CONFIG_CLOCK_THERMAL is not set
+CONFIG_CLS_U32_MARK=y
+# CONFIG_CLS_U32_PERF is not set
+# CONFIG_CM32181 is not set
+# CONFIG_CM3232 is not set
+# CONFIG_CM3323 is not set
+# CONFIG_CM3605 is not set
+# CONFIG_CM36651 is not set
+# CONFIG_CMA is not set
+# CONFIG_CMA_SYSFS is not set
+CONFIG_CMDLINE=""
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_CMDLINE_EXTEND is not set
+# CONFIG_CMDLINE_FORCE is not set
+# CONFIG_CMDLINE_FROM_BOOTLOADER is not set
+# CONFIG_CMDLINE_PARTITION is not set
+# CONFIG_CNIC is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_CODE_PATCHING_SELFTEST is not set
+# CONFIG_COMEDI is not set
+# CONFIG_COMMON_CLK_AXI_CLKGEN is not set
+# CONFIG_COMMON_CLK_CDCE706 is not set
+# CONFIG_COMMON_CLK_CDCE925 is not set
+# CONFIG_COMMON_CLK_CS2000_CP is not set
+# CONFIG_COMMON_CLK_FIXED_MMIO is not set
+# CONFIG_COMMON_CLK_IPROC is not set
+# CONFIG_COMMON_CLK_LAN966X is not set
+# CONFIG_COMMON_CLK_MAX9485 is not set
+# CONFIG_COMMON_CLK_MT6765 is not set
+# CONFIG_COMMON_CLK_MT8167 is not set
+# CONFIG_COMMON_CLK_MT8167_AUDSYS is not set
+# CONFIG_COMMON_CLK_MT8167_IMGSYS is not set
+# CONFIG_COMMON_CLK_MT8167_MFGCFG is not set
+# CONFIG_COMMON_CLK_MT8167_MMSYS is not set
+# CONFIG_COMMON_CLK_MT8167_VDECSYS is not set
+# CONFIG_COMMON_CLK_NXP is not set
+# CONFIG_COMMON_CLK_PIC32 is not set
+# CONFIG_COMMON_CLK_PWM is not set
+# CONFIG_COMMON_CLK_PXA is not set
+# CONFIG_COMMON_CLK_QCOM is not set
+# CONFIG_COMMON_CLK_RK808 is not set
+# CONFIG_COMMON_CLK_ROCKCHIP is not set
+# CONFIG_COMMON_CLK_RS9_PCIE is not set
+# CONFIG_COMMON_CLK_SI514 is not set
+# CONFIG_COMMON_CLK_SI5341 is not set
+# CONFIG_COMMON_CLK_SI5351 is not set
+# CONFIG_COMMON_CLK_SI544 is not set
+# CONFIG_COMMON_CLK_SI570 is not set
+# CONFIG_COMMON_CLK_VC5 is not set
+# CONFIG_COMMON_CLK_XGENE is not set
+# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set
+CONFIG_COMPACTION=y
+# CONFIG_COMPAL_LAPTOP is not set
+# CONFIG_COMPAT is not set
+# CONFIG_COMPAT_32BIT_TIME is not set
+# CONFIG_COMPAT_BRK is not set
+# CONFIG_COMPILE_TEST is not set
+# CONFIG_CONFIGFS_FS is not set
+# CONFIG_CONFIG_KVM_AMD_SEV is not set
+# CONFIG_CONNECTOR is not set
+CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7
+CONFIG_CONSOLE_LOGLEVEL_QUIET=4
+CONFIG_CONSTRUCTORS=y
+# CONFIG_CONTEXT_SWITCH_TRACER is not set
+# CONFIG_COPS is not set
+# CONFIG_CORDIC is not set
+# CONFIG_COREDUMP is not set
+# CONFIG_CORESIGHT is not set
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+# CONFIG_CORTINA_PHY is not set
+# CONFIG_COUNTER is not set
+# CONFIG_CPA_DEBUG is not set
+# CONFIG_CPU_BIG_ENDIAN is not set
+# CONFIG_CPU_BPREDICT_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set
+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
+# CONFIG_CPU_FREQ_THERMAL is not set
+# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set
+# CONFIG_CPU_IDLE is not set
+# CONFIG_CPU_IDLE_GOV_LADDER is not set
+# CONFIG_CPU_IDLE_GOV_MENU is not set
+# CONFIG_CPU_IDLE_GOV_TEO is not set
+# CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set
+# CONFIG_CPU_ISOLATION is not set
+CONFIG_CPU_LITTLE_ENDIAN=y
+# CONFIG_CPU_NO_EFFICIENT_FFS is not set
+CONFIG_CPU_SW_DOMAIN_PAN=y
+# CONFIG_CPU_THERMAL is not set
+# CONFIG_CRAMFS is not set
+CONFIG_CRAMFS_BLOCKDEV=y
+# CONFIG_CRAMFS_MTD is not set
+CONFIG_CRASHLOG=y
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_CRC32_BIT is not set
+CONFIG_CRC32_SARWATE=y
+# CONFIG_CRC32_SELFTEST is not set
+# CONFIG_CRC32_SLICEBY4 is not set
+# CONFIG_CRC32_SLICEBY8 is not set
+# CONFIG_CRC4 is not set
+# CONFIG_CRC64 is not set
+# CONFIG_CRC64_ROCKSOFT is not set
+# CONFIG_CRC7 is not set
+# CONFIG_CRC8 is not set
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC_ITU_T is not set
+# CONFIG_CRC_T10DIF is not set
+CONFIG_CROSS_COMPILE=""
+# CONFIG_CROSS_MEMORY_ATTACH is not set
+CONFIG_CRYPTO=y
+# CONFIG_CRYPTO_842 is not set
+CONFIG_CRYPTO_ACOMP2=y
+# CONFIG_CRYPTO_ADIANTUM is not set
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+# CONFIG_CRYPTO_AEGIS128 is not set
+# CONFIG_CRYPTO_AEGIS128L is not set
+# CONFIG_CRYPTO_AEGIS128L_AESNI_SSE2 is not set
+# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set
+# CONFIG_CRYPTO_AEGIS256 is not set
+# CONFIG_CRYPTO_AEGIS256_AESNI_SSE2 is not set
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_AES_586 is not set
+# CONFIG_CRYPTO_AES_ARM is not set
+# CONFIG_CRYPTO_AES_ARM64 is not set
+# CONFIG_CRYPTO_AES_ARM64_BS is not set
+# CONFIG_CRYPTO_AES_ARM64_CE is not set
+# CONFIG_CRYPTO_AES_ARM64_CE_BLK is not set
+# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set
+# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set
+# CONFIG_CRYPTO_AES_ARM_BS is not set
+# CONFIG_CRYPTO_AES_ARM_CE is not set
+# CONFIG_CRYPTO_AES_NI_INTEL is not set
+# CONFIG_CRYPTO_AES_TI is not set
+CONFIG_CRYPTO_AKCIPHER=y
+CONFIG_CRYPTO_AKCIPHER2=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S is not set
+# CONFIG_CRYPTO_ARIA is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+# CONFIG_CRYPTO_BLAKE2B is not set
+CONFIG_CRYPTO_BLAKE2B_NEON=y
+# CONFIG_CRYPTO_BLAKE2S is not set
+CONFIG_CRYPTO_BLAKE2S_ARM=y
+# CONFIG_CRYPTO_BLAKE2S_X86 is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_CCM=y
+# CONFIG_CRYPTO_CFB is not set
+# CONFIG_CRYPTO_CHACHA20 is not set
+# CONFIG_CRYPTO_CHACHA20POLY1305 is not set
+# CONFIG_CRYPTO_CHACHA20_NEON is not set
+# CONFIG_CRYPTO_CHACHA20_X86_64 is not set
+# CONFIG_CRYPTO_CHACHA_MIPS is not set
+# CONFIG_CRYPTO_CMAC is not set
+# CONFIG_CRYPTO_CRC32 is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CRC32C_INTEL is not set
+# CONFIG_CRYPTO_CRC32_ARM_CE is not set
+# CONFIG_CRYPTO_CRCT10DIF is not set
+# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_CTR=y
+# CONFIG_CRYPTO_CTS is not set
+# CONFIG_CRYPTO_CURVE25519 is not set
+# CONFIG_CRYPTO_CURVE25519_NEON is not set
+# CONFIG_CRYPTO_CURVE25519_X86 is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set
+# CONFIG_CRYPTO_DEV_ATMEL_AES is not set
+# CONFIG_CRYPTO_DEV_ATMEL_AUTHENC is not set
+# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set
+# CONFIG_CRYPTO_DEV_ATMEL_SHA is not set
+# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set
+# CONFIG_CRYPTO_DEV_ATMEL_TDES is not set
+# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set
+# CONFIG_CRYPTO_DEV_CCP is not set
+# CONFIG_CRYPTO_DEV_CCP_DEBUGFS is not set
+# CONFIG_CRYPTO_DEV_CCREE is not set
+# CONFIG_CRYPTO_DEV_FSL_CAAM is not set
+# CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC is not set
+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
+# CONFIG_CRYPTO_DEV_HISI_SEC is not set
+# CONFIG_CRYPTO_DEV_HISI_ZIP is not set
+# CONFIG_CRYPTO_DEV_IMGTEC_HASH is not set
+# CONFIG_CRYPTO_DEV_MARVELL_CESA is not set
+# CONFIG_CRYPTO_DEV_MV_CESA is not set
+# CONFIG_CRYPTO_DEV_MXC_SCC is not set
+# CONFIG_CRYPTO_DEV_MXS_DCP is not set
+# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set
+# CONFIG_CRYPTO_DEV_QAT_4XXX is not set
+# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set
+# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set
+# CONFIG_CRYPTO_DEV_QAT_C62X is not set
+# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set
+# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set
+# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set
+# CONFIG_CRYPTO_DEV_QCE is not set
+# CONFIG_CRYPTO_DEV_S5P is not set
+# CONFIG_CRYPTO_DEV_SAFEXCEL is not set
+# CONFIG_CRYPTO_DEV_SAHARA is not set
+# CONFIG_CRYPTO_DEV_SP_PSP is not set
+# CONFIG_CRYPTO_DEV_TALITOS is not set
+# CONFIG_CRYPTO_DEV_VIRTIO is not set
+# CONFIG_CRYPTO_DH is not set
+# CONFIG_CRYPTO_DRBG_CTR is not set
+# CONFIG_CRYPTO_DRBG_HASH is not set
+# CONFIG_CRYPTO_DRBG_MENU is not set
+# CONFIG_CRYPTO_ECB is not set
+# CONFIG_CRYPTO_ECDH is not set
+# CONFIG_CRYPTO_ECDSA is not set
+# CONFIG_CRYPTO_ECHAINIV is not set
+# CONFIG_CRYPTO_ECRDSA is not set
+# CONFIG_CRYPTO_ESSIV is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_FIPS is not set
+CONFIG_CRYPTO_GCM=y
+CONFIG_CRYPTO_GF128MUL=y
+CONFIG_CRYPTO_GHASH=y
+# CONFIG_CRYPTO_GHASH_ARM64_CE is not set
+# CONFIG_CRYPTO_GHASH_ARM_CE is not set
+# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+# CONFIG_CRYPTO_HCTR2 is not set
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_HW is not set
+# CONFIG_CRYPTO_JITTERENTROPY is not set
+# CONFIG_CRYPTO_KEYWRAP is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+CONFIG_CRYPTO_KPP=y
+CONFIG_CRYPTO_KPP2=y
+CONFIG_CRYPTO_LIB_AES=y
+CONFIG_CRYPTO_LIB_ARC4=y
+# CONFIG_CRYPTO_LIB_BLAKE2S is not set
+CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
+# CONFIG_CRYPTO_LIB_CHACHA is not set
+# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set
+# CONFIG_CRYPTO_LIB_CURVE25519 is not set
+# CONFIG_CRYPTO_LIB_POLY1305 is not set
+CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9
+# CONFIG_CRYPTO_LIB_SHA256 is not set
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_LZ4 is not set
+# CONFIG_CRYPTO_LZ4HC is not set
+# CONFIG_CRYPTO_LZO is not set
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
+# CONFIG_CRYPTO_MCRYPTD is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_MORUS1280 is not set
+# CONFIG_CRYPTO_MORUS1280_AVX2 is not set
+# CONFIG_CRYPTO_MORUS1280_SSE2 is not set
+# CONFIG_CRYPTO_MORUS640 is not set
+# CONFIG_CRYPTO_MORUS640_SSE2 is not set
+# CONFIG_CRYPTO_NHPOLY1305_NEON is not set
+CONFIG_CRYPTO_NULL=y
+CONFIG_CRYPTO_NULL2=y
+# CONFIG_CRYPTO_OFB is not set
+# CONFIG_CRYPTO_PCBC is not set
+# CONFIG_CRYPTO_PCOMP is not set
+# CONFIG_CRYPTO_PCOMP2 is not set
+CONFIG_CRYPTO_PCRYPT=y
+# CONFIG_CRYPTO_POLY1305 is not set
+# CONFIG_CRYPTO_POLY1305_ARM is not set
+# CONFIG_CRYPTO_POLY1305_MIPS is not set
+# CONFIG_CRYPTO_POLY1305_NEON is not set
+# CONFIG_CRYPTO_POLY1305_X86_64 is not set
+# CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+# CONFIG_CRYPTO_RNG is not set
+# CONFIG_CRYPTO_RSA is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SALSA20_586 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SEQIV is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA1_ARM is not set
+# CONFIG_CRYPTO_SHA1_ARM64_CE is not set
+# CONFIG_CRYPTO_SHA1_ARM_CE is not set
+# CONFIG_CRYPTO_SHA1_ARM_NEON is not set
+CONFIG_CRYPTO_SHA256=y
+# CONFIG_CRYPTO_SHA256_ARM is not set
+# CONFIG_CRYPTO_SHA256_ARM64 is not set
+# CONFIG_CRYPTO_SHA256_SSSE3 is not set
+# CONFIG_CRYPTO_SHA2_ARM64_CE is not set
+# CONFIG_CRYPTO_SHA2_ARM_CE is not set
+# CONFIG_CRYPTO_SHA3 is not set
+# CONFIG_CRYPTO_SHA3_ARM64 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_SHA512_ARM is not set
+# CONFIG_CRYPTO_SHA512_ARM64 is not set
+# CONFIG_CRYPTO_SHA512_ARM64_CE is not set
+# CONFIG_CRYPTO_SIMD is not set
+CONFIG_CRYPTO_SKCIPHER=y
+CONFIG_CRYPTO_SKCIPHER2=y
+# CONFIG_CRYPTO_SM2 is not set
+# CONFIG_CRYPTO_SM3 is not set
+# CONFIG_CRYPTO_SM3_ARM64_CE is not set
+# CONFIG_CRYPTO_SM3_GENERIC is not set
+# CONFIG_CRYPTO_SM4 is not set
+# CONFIG_CRYPTO_SM4_ARM64_CE is not set
+# CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set
+# CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set
+# CONFIG_CRYPTO_SM4_GENERIC is not set
+# CONFIG_CRYPTO_SPECK is not set
+# CONFIG_CRYPTO_STATS is not set
+# CONFIG_CRYPTO_STREEBOG is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TEST is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_TWOFISH_586 is not set
+# CONFIG_CRYPTO_TWOFISH_COMMON is not set
+# CONFIG_CRYPTO_USER is not set
+# CONFIG_CRYPTO_USER_API_AEAD is not set
+# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set
+# CONFIG_CRYPTO_USER_API_HASH is not set
+# CONFIG_CRYPTO_USER_API_RNG is not set
+# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set
+# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
+# CONFIG_CRYPTO_VMAC is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_XTS is not set
+# CONFIG_CRYPTO_XXHASH is not set
+# CONFIG_CRYPTO_ZLIB is not set
+# CONFIG_CRYPTO_ZSTD is not set
+# CONFIG_CS5535_MFGPT is not set
+# CONFIG_CS89x0 is not set
+# CONFIG_CS89x0_PLATFORM is not set
+# CONFIG_CSD_LOCK_WAIT_DEBUG is not set
+# CONFIG_CURRENT_POINTER_IN_TPIDRURO is not set
+# CONFIG_CUSE is not set
+# CONFIG_CW1200 is not set
+# CONFIG_CXD2880_SPI_DRV is not set
+# CONFIG_CXL_AFU_DRIVER_OPS is not set
+# CONFIG_CXL_BASE is not set
+# CONFIG_CXL_BUS is not set
+# CONFIG_CXL_EEH is not set
+# CONFIG_CXL_KERNEL_API is not set
+# CONFIG_CXL_LIB is not set
+# CONFIG_CYPRESS_FIRMWARE is not set
+# CONFIG_DA280 is not set
+# CONFIG_DA311 is not set
+# CONFIG_DAMON is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_DAX is not set
+# CONFIG_DCB is not set
+# CONFIG_DDR is not set
+# CONFIG_DEBUG_ALIGN_RODATA is not set
+# CONFIG_DEBUG_ATOMIC_SLEEP is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_EFI is not set
+# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set
+# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_FS_ALLOW_ALL=y
+# CONFIG_DEBUG_FS_ALLOW_NONE is not set
+# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set
+# CONFIG_DEBUG_GPIO is not set
+# CONFIG_DEBUG_HIGHMEM is not set
+# CONFIG_DEBUG_ICEDCC is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_INFO_BTF is not set
+# CONFIG_DEBUG_INFO_COMPRESSED is not set
+# CONFIG_DEBUG_INFO_DWARF4 is not set
+CONFIG_DEBUG_INFO_DWARF5=y
+# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set
+# CONFIG_DEBUG_INFO_NONE is not set
+CONFIG_DEBUG_INFO_REDUCED=y
+# CONFIG_DEBUG_INFO_SPLIT is not set
+# CONFIG_DEBUG_IRQFLAGS is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_KMAP_LOCAL is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_KOBJECT_RELEASE is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_LL is not set
+# CONFIG_DEBUG_LL_UART_8250 is not set
+# CONFIG_DEBUG_LL_UART_PL01X is not set
+# CONFIG_DEBUG_LOCKDEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_DEBUG_MAPLE_TREE is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
+# CONFIG_DEBUG_MISC is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_NET is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_NX_TEST is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUG_PAGE_REF is not set
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+# CONFIG_DEBUG_PER_CPU_MAPS is not set
+# CONFIG_DEBUG_PINCTRL is not set
+# CONFIG_DEBUG_PI_LIST is not set
+# CONFIG_DEBUG_PLIST is not set
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_DEBUG_RODATA_TEST is not set
+# CONFIG_DEBUG_RSEQ is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_SECTION_MISMATCH is not set
+# CONFIG_DEBUG_SEMIHOSTING is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_SHIRQ is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
+# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set
+# CONFIG_DEBUG_TIMEKEEPING is not set
+# CONFIG_DEBUG_UART_8250_PALMCHIP is not set
+# CONFIG_DEBUG_UART_8250_WORD is not set
+# CONFIG_DEBUG_UART_BCM63XX is not set
+# CONFIG_DEBUG_UART_FLOW_CONTROL is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_VIRTUAL is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_VM_PGTABLE is not set
+# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
+# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set
+# CONFIG_DEBUG_WX is not set
+# CONFIG_DEBUG_ZBOOT is not set
+# CONFIG_DECNET is not set
+CONFIG_DEFAULT_CUBIC=y
+CONFIG_DEFAULT_DEADLINE=y
+CONFIG_DEFAULT_HOSTNAME="(none)"
+CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
+CONFIG_DEFAULT_INIT=""
+CONFIG_DEFAULT_IOSCHED="deadline"
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_PFIFO_FAST=y
+# CONFIG_DEFAULT_RENO is not set
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_DEFAULT_SECURITY_DAC=y
+# CONFIG_DEFAULT_SECURITY_SELINUX is not set
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
+# CONFIG_DELL_LAPTOP is not set
+# CONFIG_DELL_RBTN is not set
+# CONFIG_DELL_SMBIOS is not set
+# CONFIG_DELL_SMO8800 is not set
+# CONFIG_DEPRECATED_PARAM_STRUCT is not set
+# CONFIG_DETECT_HUNG_TASK is not set
+# CONFIG_DEVKMEM is not set
+# CONFIG_DEVMEM is not set
+CONFIG_DEVPORT=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_DEVTMPFS is not set
+# CONFIG_DEVTMPFS_MOUNT is not set
+# CONFIG_DEVTMPFS_SAFE is not set
+# CONFIG_DEV_DAX is not set
+# CONFIG_DGAP is not set
+# CONFIG_DGNC is not set
+# CONFIG_DHT11 is not set
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_DISPLAY_CONNECTOR_ANALOG_TV is not set
+# CONFIG_DISPLAY_CONNECTOR_DVI is not set
+# CONFIG_DISPLAY_CONNECTOR_HDMI is not set
+# CONFIG_DISPLAY_ENCODER_TFP410 is not set
+# CONFIG_DISPLAY_ENCODER_TPD12S015 is not set
+# CONFIG_DISPLAY_PANEL_DPI is not set
+# CONFIG_DISPLAY_PANEL_LGPHILIPS_LB035Q02 is not set
+# CONFIG_DISPLAY_PANEL_TPO_TD028TTEC1 is not set
+# CONFIG_DISPLAY_PANEL_TPO_TD043MTEA1 is not set
+# CONFIG_DL2K is not set
+# CONFIG_DLHL60D is not set
+# CONFIG_DLM is not set
+# CONFIG_DM9000 is not set
+# CONFIG_DM9051 is not set
+# CONFIG_DMABUF_DEBUG is not set
+# CONFIG_DMABUF_HEAPS is not set
+# CONFIG_DMABUF_MOVE_NOTIFY is not set
+# CONFIG_DMABUF_SELFTESTS is not set
+# CONFIG_DMABUF_SYSFS_STATS is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_DMADEVICES_DEBUG is not set
+# CONFIG_DMARD06 is not set
+# CONFIG_DMARD09 is not set
+# CONFIG_DMARD10 is not set
+# CONFIG_DMASCC is not set
+# CONFIG_DMATEST is not set
+# CONFIG_DMA_API_DEBUG is not set
+CONFIG_DMA_COHERENT_POOL=y
+CONFIG_DMA_DECLARE_COHERENT=y
+# CONFIG_DMA_ENGINE is not set
+# CONFIG_DMA_FENCE_TRACE is not set
+# CONFIG_DMA_JZ4780 is not set
+# CONFIG_DMA_MAP_BENCHMARK is not set
+CONFIG_DMA_NONCOHERENT_MMAP=y
+# CONFIG_DMA_NOOP_OPS is not set
+# CONFIG_DMA_PERNUMA_CMA is not set
+# CONFIG_DMA_RESTRICTED_POOL is not set
+# CONFIG_DMA_SHARED_BUFFER is not set
+# CONFIG_DMA_VIRT_OPS is not set
+# CONFIG_DM_CACHE is not set
+# CONFIG_DM_CLONE is not set
+# CONFIG_DM_DEBUG is not set
+# CONFIG_DM_DELAY is not set
+# CONFIG_DM_DUST is not set
+# CONFIG_DM_EBS is not set
+# CONFIG_DM_ERA is not set
+# CONFIG_DM_FLAKEY is not set
+# CONFIG_DM_INTEGRITY is not set
+# CONFIG_DM_LOG_USERSPACE is not set
+# CONFIG_DM_LOG_WRITES is not set
+# CONFIG_DM_MQ_DEFAULT is not set
+# CONFIG_DM_MULTIPATH is not set
+# CONFIG_DM_RAID is not set
+# CONFIG_DM_SWITCH is not set
+# CONFIG_DM_THIN_PROVISIONING is not set
+# CONFIG_DM_UEVENT is not set
+# CONFIG_DM_UNSTRIPED is not set
+# CONFIG_DM_VERITY is not set
+# CONFIG_DM_WRITECACHE is not set
+# CONFIG_DM_ZERO is not set
+# CONFIG_DNET is not set
+# CONFIG_DNOTIFY is not set
+# CONFIG_DNS_RESOLVER is not set
+CONFIG_DOUBLEFAULT=y
+# CONFIG_DP83822_PHY is not set
+# CONFIG_DP83848_PHY is not set
+# CONFIG_DP83867_PHY is not set
+# CONFIG_DP83869_PHY is not set
+# CONFIG_DP83TC811_PHY is not set
+# CONFIG_DP83TD510_PHY is not set
+# CONFIG_DPOT_DAC is not set
+# CONFIG_DPS310 is not set
+CONFIG_DQL=y
+# CONFIG_DRAGONRISE_FF is not set
+# CONFIG_DRM is not set
+# CONFIG_DRM_AMDGPU is not set
+# CONFIG_DRM_AMDGPU_CIK is not set
+# CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set
+# CONFIG_DRM_AMDGPU_SI is not set
+# CONFIG_DRM_AMDGPU_USERPTR is not set
+# CONFIG_DRM_AMD_ACP is not set
+# CONFIG_DRM_AMD_DC_DCN2_0 is not set
+# CONFIG_DRM_AMD_DC_DCN3_0 is not set
+# CONFIG_DRM_AMD_DC_HDCP is not set
+# CONFIG_DRM_AMD_DC_SI is not set
+# CONFIG_DRM_ANALOGIX_ANX6345 is not set
+# CONFIG_DRM_ANALOGIX_ANX78XX is not set
+# CONFIG_DRM_ARCPGU is not set
+# CONFIG_DRM_ARMADA is not set
+# CONFIG_DRM_AST is not set
+# CONFIG_DRM_BOCHS is not set
+# CONFIG_DRM_CDNS_DSI is not set
+# CONFIG_DRM_CDNS_MHDP8546 is not set
+# CONFIG_DRM_CHRONTEL_CH7033 is not set
+# CONFIG_DRM_CIRRUS_QEMU is not set
+# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
+# CONFIG_DRM_DEBUG_MM is not set
+# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
+# CONFIG_DRM_DEBUG_SELFTEST is not set
+# CONFIG_DRM_DISPLAY_CONNECTOR is not set
+# CONFIG_DRM_DP_AUX_CHARDEV is not set
+# CONFIG_DRM_DP_CEC is not set
+# CONFIG_DRM_DUMB_VGA_DAC is not set
+# CONFIG_DRM_DW_HDMI_CEC is not set
+# CONFIG_DRM_ETNAVIV is not set
+# CONFIG_DRM_EXYNOS is not set
+# CONFIG_DRM_FBDEV_EMULATION is not set
+# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
+# CONFIG_DRM_FSL_DCU is not set
+# CONFIG_DRM_GM12U320 is not set
+# CONFIG_DRM_GMA500 is not set
+# CONFIG_DRM_GUD is not set
+# CONFIG_DRM_HDLCD is not set
+# CONFIG_DRM_HISI_HIBMC is not set
+# CONFIG_DRM_HISI_KIRIN is not set
+# CONFIG_DRM_I2C_ADV7511 is not set
+# CONFIG_DRM_I2C_CH7006 is not set
+# CONFIG_DRM_I2C_NXP_TDA9950 is not set
+# CONFIG_DRM_I2C_NXP_TDA998X is not set
+# CONFIG_DRM_I2C_SIL164 is not set
+# CONFIG_DRM_I915 is not set
+CONFIG_DRM_I915_REQUEST_TIMEOUT=20000
+# CONFIG_DRM_IMX8QM_LDB is not set
+# CONFIG_DRM_IMX8QXP_LDB is not set
+# CONFIG_DRM_IMX8QXP_PIXEL_COMBINER is not set
+# CONFIG_DRM_IMX8QXP_PIXEL_LINK_TO_DPI is not set
+# CONFIG_DRM_IMX_LCDIF is not set
+# CONFIG_DRM_KOMEDA is not set
+# CONFIG_DRM_LEGACY is not set
+# CONFIG_DRM_LIB_RANDOM is not set
+# CONFIG_DRM_LIMA is not set
+# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
+# CONFIG_DRM_LOGICVC is not set
+# CONFIG_DRM_LONTIUM_LT9611 is not set
+# CONFIG_DRM_LVDS_CODEC is not set
+# CONFIG_DRM_LVDS_ENCODER is not set
+# CONFIG_DRM_MALI_DISPLAY is not set
+# CONFIG_DRM_MCDE is not set
+# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set
+# CONFIG_DRM_MGAG200 is not set
+# CONFIG_DRM_MXSFB is not set
+# CONFIG_DRM_NOUVEAU is not set
+# CONFIG_DRM_NWL_MIPI_DSI is not set
+# CONFIG_DRM_NXP_PTN3460 is not set
+# CONFIG_DRM_OMAP is not set
+# CONFIG_DRM_PANEL_ARM_VERSATILE is not set
+# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set
+# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set
+# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set
+# CONFIG_DRM_PANEL_EBBG_FT8719 is not set
+# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set
+# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set
+# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set
+# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set
+# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set
+# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set
+# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set
+# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set
+# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set
+# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set
+# CONFIG_DRM_PANEL_LG_LB035Q02 is not set
+# CONFIG_DRM_PANEL_LG_LG4573 is not set
+# CONFIG_DRM_PANEL_LVDS is not set
+# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set
+# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set
+# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set
+# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set
+# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set
+# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set
+# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set
+# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set
+# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set
+# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set
+# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set
+# CONFIG_DRM_PANEL_ROCKTECH_JH057N00900 is not set
+# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set
+# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set
+# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set
+# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set
+# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set
+# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set
+# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set
+# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set
+# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set
+# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set
+# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set
+# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set
+# CONFIG_DRM_PANEL_SIMPLE is not set
+# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set
+# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set
+# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set
+# CONFIG_DRM_PANEL_SONY_ACX424AKP is not set
+# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set
+# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set
+# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set
+# CONFIG_DRM_PANEL_TPO_TPG110 is not set
+# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set
+# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set
+# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set
+# CONFIG_DRM_PANFROST is not set
+# CONFIG_DRM_PARADE_PS8622 is not set
+# CONFIG_DRM_PARADE_PS8640 is not set
+# CONFIG_DRM_PL111 is not set
+# CONFIG_DRM_QXL is not set
+# CONFIG_DRM_RADEON is not set
+# CONFIG_DRM_RADEON_USERPTR is not set
+# CONFIG_DRM_RCAR_DW_HDMI is not set
+# CONFIG_DRM_RCAR_LVDS is not set
+# CONFIG_DRM_SII902X is not set
+# CONFIG_DRM_SII9234 is not set
+# CONFIG_DRM_SIL_SII8620 is not set
+# CONFIG_DRM_SIMPLE_BRIDGE is not set
+# CONFIG_DRM_STI is not set
+# CONFIG_DRM_STM is not set
+# CONFIG_DRM_SUN4I is not set
+# CONFIG_DRM_THINE_THC63LVD1024 is not set
+# CONFIG_DRM_TIDSS is not set
+# CONFIG_DRM_TILCDC is not set
+# CONFIG_DRM_TINYDRM is not set
+# CONFIG_DRM_TI_DLPC3433 is not set
+# CONFIG_DRM_TI_SN65DSI86 is not set
+# CONFIG_DRM_TI_TFP410 is not set
+# CONFIG_DRM_TI_TPD12S015 is not set
+# CONFIG_DRM_TOSHIBA_TC358762 is not set
+# CONFIG_DRM_TOSHIBA_TC358764 is not set
+# CONFIG_DRM_TOSHIBA_TC358767 is not set
+# CONFIG_DRM_TOSHIBA_TC358768 is not set
+# CONFIG_DRM_TOSHIBA_TC358775 is not set
+# CONFIG_DRM_TVE200 is not set
+# CONFIG_DRM_UDL is not set
+# CONFIG_DRM_VBOXVIDEO is not set
+# CONFIG_DRM_VC4_HDMI_CEC is not set
+# CONFIG_DRM_VGEM is not set
+# CONFIG_DRM_VIRTIO_GPU is not set
+# CONFIG_DRM_VKMS is not set
+# CONFIG_DRM_VMWGFX is not set
+# CONFIG_DRM_XEN is not set
+# CONFIG_DRM_XEN_FRONTEND is not set
+# CONFIG_DS1682 is not set
+# CONFIG_DS1803 is not set
+# CONFIG_DS4424 is not set
+# CONFIG_DST_CACHE is not set
+# CONFIG_DTLK is not set
+# CONFIG_DUMMY is not set
+CONFIG_DUMMY_CONSOLE_COLUMNS=80
+CONFIG_DUMMY_CONSOLE_ROWS=25
+# CONFIG_DUMMY_IRQ is not set
+# CONFIG_DVB_A8293 is not set
+# CONFIG_DVB_AF9013 is not set
+# CONFIG_DVB_AF9033 is not set
+# CONFIG_DVB_AS102 is not set
+# CONFIG_DVB_ASCOT2E is not set
+# CONFIG_DVB_ATBM8830 is not set
+# CONFIG_DVB_AU8522_DTV is not set
+# CONFIG_DVB_AU8522_V4L is not set
+# CONFIG_DVB_B2C2_FLEXCOP_USB is not set
+# CONFIG_DVB_BCM3510 is not set
+# CONFIG_DVB_CORE is not set
+# CONFIG_DVB_CX22700 is not set
+# CONFIG_DVB_CX22702 is not set
+# CONFIG_DVB_CX24110 is not set
+# CONFIG_DVB_CX24116 is not set
+# CONFIG_DVB_CX24117 is not set
+# CONFIG_DVB_CX24120 is not set
+# CONFIG_DVB_CX24123 is not set
+# CONFIG_DVB_CXD2099 is not set
+# CONFIG_DVB_CXD2820R is not set
+# CONFIG_DVB_CXD2841ER is not set
+# CONFIG_DVB_CXD2880 is not set
+# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set
+# CONFIG_DVB_DIB3000MB is not set
+# CONFIG_DVB_DIB3000MC is not set
+# CONFIG_DVB_DIB7000M is not set
+# CONFIG_DVB_DIB7000P is not set
+# CONFIG_DVB_DIB8000 is not set
+# CONFIG_DVB_DIB9000 is not set
+# CONFIG_DVB_DRX39XYJ is not set
+# CONFIG_DVB_DRXD is not set
+# CONFIG_DVB_DRXK is not set
+# CONFIG_DVB_DS3000 is not set
+# CONFIG_DVB_DUMMY_FE is not set
+# CONFIG_DVB_DYNAMIC_MINORS is not set
+# CONFIG_DVB_EC100 is not set
+# CONFIG_DVB_FIREDTV is not set
+# CONFIG_DVB_HELENE is not set
+# CONFIG_DVB_HORUS3A is not set
+# CONFIG_DVB_ISL6405 is not set
+# CONFIG_DVB_ISL6421 is not set
+# CONFIG_DVB_ISL6423 is not set
+# CONFIG_DVB_IX2505V is not set
+# CONFIG_DVB_L64781 is not set
+# CONFIG_DVB_LG2160 is not set
+# CONFIG_DVB_LGDT3305 is not set
+# CONFIG_DVB_LGDT3306A is not set
+# CONFIG_DVB_LGDT330X is not set
+# CONFIG_DVB_LGS8GL5 is not set
+# CONFIG_DVB_LGS8GXX is not set
+# CONFIG_DVB_LNBH25 is not set
+# CONFIG_DVB_LNBH29 is not set
+# CONFIG_DVB_LNBP21 is not set
+# CONFIG_DVB_LNBP22 is not set
+# CONFIG_DVB_M88DS3103 is not set
+# CONFIG_DVB_M88RS2000 is not set
+CONFIG_DVB_MAX_ADAPTERS=16
+# CONFIG_DVB_MB86A16 is not set
+# CONFIG_DVB_MB86A20S is not set
+# CONFIG_DVB_MMAP is not set
+# CONFIG_DVB_MN88443X is not set
+# CONFIG_DVB_MN88472 is not set
+# CONFIG_DVB_MN88473 is not set
+# CONFIG_DVB_MT312 is not set
+# CONFIG_DVB_MT352 is not set
+# CONFIG_DVB_MXL5XX is not set
+# CONFIG_DVB_MXL692 is not set
+# CONFIG_DVB_NET is not set
+# CONFIG_DVB_NXT200X is not set
+# CONFIG_DVB_NXT6000 is not set
+# CONFIG_DVB_OR51132 is not set
+# CONFIG_DVB_OR51211 is not set
+# CONFIG_DVB_PLATFORM_DRIVERS is not set
+# CONFIG_DVB_PLL is not set
+# CONFIG_DVB_RTL2830 is not set
+# CONFIG_DVB_RTL2832 is not set
+# CONFIG_DVB_RTL2832_SDR is not set
+# CONFIG_DVB_S5H1409 is not set
+# CONFIG_DVB_S5H1411 is not set
+# CONFIG_DVB_S5H1420 is not set
+# CONFIG_DVB_S5H1432 is not set
+# CONFIG_DVB_S921 is not set
+# CONFIG_DVB_SI2165 is not set
+# CONFIG_DVB_SI2168 is not set
+# CONFIG_DVB_SI21XX is not set
+# CONFIG_DVB_SP2 is not set
+# CONFIG_DVB_SP8870 is not set
+# CONFIG_DVB_SP887X is not set
+# CONFIG_DVB_STB0899 is not set
+# CONFIG_DVB_STB6000 is not set
+# CONFIG_DVB_STB6100 is not set
+# CONFIG_DVB_STV0288 is not set
+# CONFIG_DVB_STV0297 is not set
+# CONFIG_DVB_STV0299 is not set
+# CONFIG_DVB_STV0367 is not set
+# CONFIG_DVB_STV0900 is not set
+# CONFIG_DVB_STV090x is not set
+# CONFIG_DVB_STV0910 is not set
+# CONFIG_DVB_STV6110 is not set
+# CONFIG_DVB_STV6110x is not set
+# CONFIG_DVB_STV6111 is not set
+# CONFIG_DVB_TC90522 is not set
+# CONFIG_DVB_TDA10021 is not set
+# CONFIG_DVB_TDA10023 is not set
+# CONFIG_DVB_TDA10048 is not set
+# CONFIG_DVB_TDA1004X is not set
+# CONFIG_DVB_TDA10071 is not set
+# CONFIG_DVB_TDA10086 is not set
+# CONFIG_DVB_TDA18271C2DD is not set
+# CONFIG_DVB_TDA665x is not set
+# CONFIG_DVB_TDA8083 is not set
+# CONFIG_DVB_TDA8261 is not set
+# CONFIG_DVB_TDA826X is not set
+# CONFIG_DVB_TEST_DRIVERS is not set
+# CONFIG_DVB_TS2020 is not set
+# CONFIG_DVB_TTUSB_BUDGET is not set
+# CONFIG_DVB_TTUSB_DEC is not set
+# CONFIG_DVB_TUA6100 is not set
+# CONFIG_DVB_TUNER_CX24113 is not set
+# CONFIG_DVB_TUNER_DIB0070 is not set
+# CONFIG_DVB_TUNER_DIB0090 is not set
+# CONFIG_DVB_TUNER_ITD1000 is not set
+# CONFIG_DVB_ULE_DEBUG is not set
+# CONFIG_DVB_USB_V2 is not set
+# CONFIG_DVB_VES1820 is not set
+# CONFIG_DVB_VES1X93 is not set
+# CONFIG_DVB_ZD1301_DEMOD is not set
+# CONFIG_DVB_ZL10036 is not set
+# CONFIG_DVB_ZL10039 is not set
+# CONFIG_DVB_ZL10353 is not set
+# CONFIG_DWC_XLGMAC is not set
+# CONFIG_DWMAC_DWC_QOS_ETH is not set
+# CONFIG_DWMAC_INTEL_PLAT is not set
+# CONFIG_DWMAC_IPQ806X is not set
+# CONFIG_DWMAC_LOONGSON is not set
+# CONFIG_DWMAC_LPC18XX is not set
+# CONFIG_DWMAC_MESON is not set
+# CONFIG_DWMAC_ROCKCHIP is not set
+# CONFIG_DWMAC_SOCFPGA is not set
+# CONFIG_DWMAC_STI is not set
+# CONFIG_DW_AXI_DMAC is not set
+# CONFIG_DW_DMAC is not set
+# CONFIG_DW_DMAC_PCI is not set
+# CONFIG_DW_EDMA is not set
+# CONFIG_DW_EDMA_PCIE is not set
+# CONFIG_DW_WATCHDOG is not set
+# CONFIG_DW_XDATA_PCIE is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+CONFIG_DYNAMIC_DEBUG_CORE=y
+# CONFIG_E100 is not set
+# CONFIG_E1000 is not set
+# CONFIG_E1000E is not set
+# CONFIG_E1000E_HWTS is not set
+# CONFIG_EARLY_PRINTK_8250 is not set
+# CONFIG_EARLY_PRINTK_USB_XDBC is not set
+# CONFIG_EBC_C384_WDT is not set
+# CONFIG_ECHO is not set
+# CONFIG_ECRYPT_FS is not set
+# CONFIG_EDAC is not set
+# CONFIG_EEEPC_LAPTOP is not set
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_EEPROM_93XX46 is not set
+# CONFIG_EEPROM_AT24 is not set
+# CONFIG_EEPROM_AT25 is not set
+# CONFIG_EEPROM_DIGSY_MTC_CFG is not set
+# CONFIG_EEPROM_EE1004 is not set
+# CONFIG_EEPROM_IDT_89HPESX is not set
+# CONFIG_EEPROM_LEGACY is not set
+# CONFIG_EEPROM_MAX6875 is not set
+# CONFIG_EFI is not set
+CONFIG_EFI_PARTITION=y
+# CONFIG_EFS_FS is not set
+CONFIG_ELFCORE=y
+# CONFIG_ELF_CORE is not set
+# CONFIG_EMAC_ROCKCHIP is not set
+CONFIG_EMBEDDED=y
+# CONFIG_EM_TIMER_STI is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+# CONFIG_ENA_ETHERNET is not set
+# CONFIG_ENC28J60 is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_ENCRYPTED_KEYS is not set
+# CONFIG_ENCX24J600 is not set
+# CONFIG_ENERGY_MODEL is not set
+# CONFIG_ENIC is not set
+# CONFIG_ENVELOPE_DETECTOR is not set
+# CONFIG_EPAPR_PARAVIRT is not set
+# CONFIG_EPIC100 is not set
+CONFIG_EPOLL=y
+# CONFIG_EQUALIZER is not set
+# CONFIG_EROFS_FS is not set
+# CONFIG_ET131X is not set
+CONFIG_ETHERNET=y
+# CONFIG_ETHOC is not set
+CONFIG_ETHTOOL_NETLINK=y
+CONFIG_EVENTFD=y
+# CONFIG_EVM is not set
+# CONFIG_EXCLUSIVE_SYSTEM_RAM is not set
+# CONFIG_EXFAT_FS is not set
+CONFIG_EXPERT=y
+CONFIG_EXPORTFS=y
+# CONFIG_EXPORTFS_BLOCK_OPS is not set
+# CONFIG_EXT2_FS is not set
+CONFIG_EXT2_FS_XATTR=y
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4_DEBUG is not set
+# CONFIG_EXT4_ENCRYPTION is not set
+# CONFIG_EXT4_FS is not set
+# CONFIG_EXT4_FS_POSIX_ACL is not set
+# CONFIG_EXT4_FS_SECURITY is not set
+CONFIG_EXT4_USE_FOR_EXT2=y
+# CONFIG_EXTCON is not set
+# CONFIG_EXTCON_ADC_JACK is not set
+# CONFIG_EXTCON_ARIZONA is not set
+# CONFIG_EXTCON_AXP288 is not set
+# CONFIG_EXTCON_FSA9480 is not set
+# CONFIG_EXTCON_GPIO is not set
+# CONFIG_EXTCON_INTEL_INT3496 is not set
+# CONFIG_EXTCON_MAX3355 is not set
+# CONFIG_EXTCON_PTN5150 is not set
+# CONFIG_EXTCON_QCOM_SPMI_MISC is not set
+# CONFIG_EXTCON_RT8973A is not set
+# CONFIG_EXTCON_SM5502 is not set
+# CONFIG_EXTCON_USBC_TUSB320 is not set
+# CONFIG_EXTCON_USB_GPIO is not set
+CONFIG_EXTRA_FIRMWARE=""
+CONFIG_EXTRA_TARGETS=""
+# CONFIG_EXYNOS_ADC is not set
+# CONFIG_EXYNOS_VIDEO is not set
+# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set
+# CONFIG_EZX_PCAP is not set
+# CONFIG_F2FS_CHECK_FS is not set
+# CONFIG_F2FS_FAULT_INJECTION is not set
+# CONFIG_F2FS_FS is not set
+# CONFIG_F2FS_FS_COMPRESSION is not set
+# CONFIG_F2FS_FS_ENCRYPTION is not set
+# CONFIG_F2FS_FS_POSIX_ACL is not set
+# CONFIG_F2FS_FS_SECURITY is not set
+CONFIG_F2FS_FS_XATTR=y
+# CONFIG_F2FS_IOSTAT is not set
+# CONFIG_F2FS_IO_TRACE is not set
+CONFIG_F2FS_STAT_FS=y
+# CONFIG_F2FS_UNFAIR_RWSEM is not set
+# CONFIG_FAILOVER is not set
+# CONFIG_FAIR_GROUP_SCHED is not set
+# CONFIG_FANOTIFY is not set
+# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_FAT_DEFAULT_UTF8 is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_FB is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_ARC is not set
+# CONFIG_FB_ARK is not set
+# CONFIG_FB_ARMCLCD is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_AUO_K190X is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_BIG_ENDIAN is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+# CONFIG_FB_BOTH_ENDIAN is not set
+# CONFIG_FB_BROADSHEET is not set
+# CONFIG_FB_CARMINE is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_DA8XX is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_FLEX is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_GEODE is not set
+# CONFIG_FB_GOLDFISH is not set
+# CONFIG_FB_HGA is not set
+# CONFIG_FB_I740 is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_IMX is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_LE80578 is not set
+# CONFIG_FB_LITTLE_ENDIAN is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_MXS is not set
+# CONFIG_FB_N411 is not set
+# CONFIG_FB_NEOMAGIC is not set
+CONFIG_FB_NOTIFY=y
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_OF is not set
+# CONFIG_FB_OMAP2 is not set
+# CONFIG_FB_OPENCORES is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_PM3 is not set
+# CONFIG_FB_PS3 is not set
+# CONFIG_FB_PXA is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_S3 is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIMPLE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_SM712 is not set
+# CONFIG_FB_SM750 is not set
+# CONFIG_FB_SMSCUFX is not set
+# CONFIG_FB_SSD1307 is not set
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_TFT is not set
+# CONFIG_FB_TFT_AGM1264K_FL is not set
+# CONFIG_FB_TFT_BD663474 is not set
+# CONFIG_FB_TFT_FBTFT_DEVICE is not set
+# CONFIG_FB_TFT_HX8340BN is not set
+# CONFIG_FB_TFT_HX8347D is not set
+# CONFIG_FB_TFT_HX8353D is not set
+# CONFIG_FB_TFT_HX8357D is not set
+# CONFIG_FB_TFT_ILI9163 is not set
+# CONFIG_FB_TFT_ILI9320 is not set
+# CONFIG_FB_TFT_ILI9325 is not set
+# CONFIG_FB_TFT_ILI9340 is not set
+# CONFIG_FB_TFT_ILI9341 is not set
+# CONFIG_FB_TFT_ILI9481 is not set
+# CONFIG_FB_TFT_ILI9486 is not set
+# CONFIG_FB_TFT_PCD8544 is not set
+# CONFIG_FB_TFT_RA8875 is not set
+# CONFIG_FB_TFT_S6D02A1 is not set
+# CONFIG_FB_TFT_S6D1121 is not set
+# CONFIG_FB_TFT_SEPS525 is not set
+# CONFIG_FB_TFT_SH1106 is not set
+# CONFIG_FB_TFT_SSD1289 is not set
+# CONFIG_FB_TFT_SSD1305 is not set
+# CONFIG_FB_TFT_SSD1306 is not set
+# CONFIG_FB_TFT_SSD1325 is not set
+# CONFIG_FB_TFT_SSD1331 is not set
+# CONFIG_FB_TFT_SSD1351 is not set
+# CONFIG_FB_TFT_ST7735R is not set
+# CONFIG_FB_TFT_ST7789V is not set
+# CONFIG_FB_TFT_TINYLCD is not set
+# CONFIG_FB_TFT_TLS8204 is not set
+# CONFIG_FB_TFT_UC1611 is not set
+# CONFIG_FB_TFT_UC1701 is not set
+# CONFIG_FB_TFT_UPD161704 is not set
+# CONFIG_FB_TFT_WATTEROTT is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_TMIO is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_UDL is not set
+# CONFIG_FB_UVESA is not set
+# CONFIG_FB_VGA16 is not set
+# CONFIG_FB_VIA is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_VT8623 is not set
+# CONFIG_FB_XGI is not set
+# CONFIG_FCOE is not set
+# CONFIG_FCOE_FNIC is not set
+# CONFIG_FDDI is not set
+# CONFIG_FEALNX is not set
+# CONFIG_FENCE_TRACE is not set
+# CONFIG_FHANDLE is not set
+CONFIG_FIB_RULES=y
+# CONFIG_FIELDBUS_DEV is not set
+CONFIG_FILE_LOCKING=y
+# CONFIG_FIND_BIT_BENCHMARK is not set
+# CONFIG_FIREWIRE is not set
+# CONFIG_FIREWIRE_NOSY is not set
+# CONFIG_FIREWIRE_SERIAL is not set
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FIRMWARE_IN_KERNEL is not set
+# CONFIG_FIRMWARE_MEMMAP is not set
+# CONFIG_FIT_PARTITION is not set
+# CONFIG_FIXED_PHY is not set
+CONFIG_FLATMEM=y
+CONFIG_FLATMEM_MANUAL=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_FM10K is not set
+# CONFIG_FMC is not set
+# CONFIG_FONTS is not set
+# CONFIG_FONT_6x8 is not set
+# CONFIG_FONT_TER16x32 is not set
+# CONFIG_FORCEDETH is not set
+CONFIG_FORCE_MAX_ZONEORDER=11
+CONFIG_FORTIFY_SOURCE=y
+# CONFIG_FPGA is not set
+# CONFIG_FRAMEBUFFER_CONSOLE is not set
+# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set
+# CONFIG_FRAME_POINTER is not set
+CONFIG_FRAME_WARN=1024
+# CONFIG_FREEZER is not set
+# CONFIG_FRONTSWAP is not set
+# CONFIG_FSCACHE is not set
+# CONFIG_FSI is not set
+# CONFIG_FSL_EDMA is not set
+# CONFIG_FSL_ERRATUM_A008585 is not set
+# CONFIG_FSL_MC_BUS is not set
+# CONFIG_FSL_PQ_MDIO is not set
+# CONFIG_FSL_QDMA is not set
+# CONFIG_FSL_RCPM is not set
+# CONFIG_FSL_XGMAC_MDIO is not set
+CONFIG_FSNOTIFY=y
+# CONFIG_FS_DAX is not set
+# CONFIG_FS_ENCRYPTION is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_FS_VERITY is not set
+# CONFIG_FTGMAC100 is not set
+# CONFIG_FTL is not set
+# CONFIG_FTMAC100 is not set
+# CONFIG_FTRACE is not set
+# CONFIG_FTRACE_STARTUP_TEST is not set
+# CONFIG_FTR_FIXUP_SELFTEST is not set
+# CONFIG_FTWDT010_WATCHDOG is not set
+# CONFIG_FUJITSU_ERRATUM_010001 is not set
+# CONFIG_FUJITSU_ES is not set
+# CONFIG_FUJITSU_LAPTOP is not set
+# CONFIG_FUJITSU_TABLET is not set
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_FUN_ETH is not set
+# CONFIG_FUSE_FS is not set
+# CONFIG_FUSION is not set
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+# CONFIG_FUSION_SPI is not set
+CONFIG_FUTEX=y
+CONFIG_FUTEX_PI=y
+# CONFIG_FWNODE_MDIO is not set
+# CONFIG_FW_CFG_SYSFS is not set
+CONFIG_FW_LOADER=y
+# CONFIG_FW_LOADER_COMPRESS is not set
+CONFIG_FW_LOADER_USER_HELPER=y
+CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y
+# CONFIG_FW_UPLOAD is not set
+# CONFIG_FXAS21002C is not set
+# CONFIG_FXLS8962AF_I2C is not set
+# CONFIG_FXLS8962AF_SPI is not set
+# CONFIG_FXOS8700_I2C is not set
+# CONFIG_FXOS8700_SPI is not set
+CONFIG_GACT_PROB=y
+# CONFIG_GADGET_UAC1 is not set
+# CONFIG_GAMEPORT is not set
+# CONFIG_GATEWORKS_GW16083 is not set
+# CONFIG_GCC_PLUGINS is not set
+# CONFIG_GCOV is not set
+# CONFIG_GCOV_KERNEL is not set
+# CONFIG_GDB_SCRIPTS is not set
+# CONFIG_GEMINI_ETHERNET is not set
+# CONFIG_GENERIC_ADC_BATTERY is not set
+# CONFIG_GENERIC_ADC_THERMAL is not set
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+# CONFIG_GENERIC_CPU_DEVICES is not set
+# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+CONFIG_GENERIC_HWEIGHT=y
+# CONFIG_GENERIC_IRQ_DEBUGFS is not set
+CONFIG_GENERIC_IRQ_IPI=y
+CONFIG_GENERIC_IRQ_PROBE=y
+# CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED is not set
+CONFIG_GENERIC_NET_UTILS=y
+# CONFIG_GENERIC_PHY is not set
+# CONFIG_GENERIC_PINCONF is not set
+# CONFIG_GENERIC_PINCTRL_GROUPS is not set
+# CONFIG_GENERIC_PINMUX_FUNCTIONS is not set
+CONFIG_GENERIC_PTDUMP=y
+CONFIG_GENERIC_VDSO_TIME_NS=y
+# CONFIG_GENEVE is not set
+# CONFIG_GENWQE is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_GIGASET_CAPI is not set
+# CONFIG_GIGASET_DEBUG is not set
+# CONFIG_GIGASET_DUMMYLL is not set
+# CONFIG_GLOB_SELFTEST is not set
+# CONFIG_GNSS is not set
+# CONFIG_GOLDFISH is not set
+# CONFIG_GOOGLE_FIRMWARE is not set
+# CONFIG_GP2AP002 is not set
+# CONFIG_GP2AP020A00F is not set
+# CONFIG_GPD_POCKET_FAN is not set
+# CONFIG_GPIOLIB is not set
+CONFIG_GPIOLIB_FASTPATH_LIMIT=512
+# CONFIG_GPIO_104_DIO_48E is not set
+# CONFIG_GPIO_104_IDIO_16 is not set
+# CONFIG_GPIO_104_IDI_48 is not set
+# CONFIG_GPIO_74X164 is not set
+# CONFIG_GPIO_74XX_MMIO is not set
+# CONFIG_GPIO_ADNP is not set
+# CONFIG_GPIO_ADP5588 is not set
+# CONFIG_GPIO_AGGREGATOR is not set
+# CONFIG_GPIO_ALTERA is not set
+# CONFIG_GPIO_AMD8111 is not set
+# CONFIG_GPIO_AMDPT is not set
+# CONFIG_GPIO_AMD_FCH is not set
+# CONFIG_GPIO_BCM_KONA is not set
+# CONFIG_GPIO_BT8XX is not set
+# CONFIG_GPIO_CADENCE is not set
+# CONFIG_GPIO_CASCADE is not set
+# CONFIG_GPIO_CDEV is not set
+# CONFIG_GPIO_CDEV_V1 is not set
+# CONFIG_GPIO_CS5535 is not set
+# CONFIG_GPIO_DWAPB is not set
+# CONFIG_GPIO_EM is not set
+# CONFIG_GPIO_EXAR is not set
+# CONFIG_GPIO_F7188X is not set
+# CONFIG_GPIO_FTGPIO010 is not set
+# CONFIG_GPIO_GENERIC_PLATFORM is not set
+# CONFIG_GPIO_GPIO_MM is not set
+# CONFIG_GPIO_GRGPIO is not set
+# CONFIG_GPIO_GW_PLD is not set
+# CONFIG_GPIO_HLWD is not set
+# CONFIG_GPIO_ICH is not set
+# CONFIG_GPIO_IT87 is not set
+# CONFIG_GPIO_LOGICVC is not set
+# CONFIG_GPIO_LYNXPOINT is not set
+# CONFIG_GPIO_MAX3191X is not set
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_GPIO_MAX7301 is not set
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_MB86S7X is not set
+# CONFIG_GPIO_MC33880 is not set
+# CONFIG_GPIO_MCP23S08 is not set
+# CONFIG_GPIO_ML_IOH is not set
+# CONFIG_GPIO_MOCKUP is not set
+# CONFIG_GPIO_MPC8XXX is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCA953X_IRQ is not set
+# CONFIG_GPIO_PCA9570 is not set
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_GPIO_PCH is not set
+# CONFIG_GPIO_PCIE_IDIO_24 is not set
+# CONFIG_GPIO_PCI_IDIO_16 is not set
+# CONFIG_GPIO_PISOSR is not set
+# CONFIG_GPIO_PL061 is not set
+# CONFIG_GPIO_RCAR is not set
+# CONFIG_GPIO_RDC321X is not set
+# CONFIG_GPIO_ROCKCHIP is not set
+# CONFIG_GPIO_SAMA5D2_PIOBU is not set
+# CONFIG_GPIO_SCH is not set
+# CONFIG_GPIO_SCH311X is not set
+# CONFIG_GPIO_SIFIVE is not set
+# CONFIG_GPIO_SIM is not set
+# CONFIG_GPIO_SX150X is not set
+# CONFIG_GPIO_SYSCON is not set
+CONFIG_GPIO_SYSFS=y
+# CONFIG_GPIO_TPIC2810 is not set
+# CONFIG_GPIO_TS4900 is not set
+# CONFIG_GPIO_TS5500 is not set
+# CONFIG_GPIO_VX855 is not set
+# CONFIG_GPIO_WATCHDOG is not set
+# CONFIG_GPIO_WINBOND is not set
+# CONFIG_GPIO_WS16C48 is not set
+# CONFIG_GPIO_XGENE is not set
+# CONFIG_GPIO_XILINX is not set
+# CONFIG_GPIO_XRA1403 is not set
+# CONFIG_GPIO_ZEVIO is not set
+# CONFIG_GPIO_ZX is not set
+# CONFIG_GREENASIA_FF is not set
+# CONFIG_GREYBUS is not set
+# CONFIG_GS_FPGABOOT is not set
+# CONFIG_GTP is not set
+# CONFIG_GUP_BENCHMARK is not set
+# CONFIG_GUP_TEST is not set
+# CONFIG_GVE is not set
+# CONFIG_HABANA_AI is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_HAPPYMEAL is not set
+CONFIG_HARDENED_USERCOPY=y
+# CONFIG_HARDENED_USERCOPY_FALLBACK is not set
+# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set
+CONFIG_HARDEN_EL2_VECTORS=y
+# CONFIG_HARDLOCKUP_DETECTOR is not set
+# CONFIG_HAVE_ARM_ARCH_TIMER is not set
+# CONFIG_HCALL_STATS is not set
+# CONFIG_HDC100X is not set
+# CONFIG_HDC2010 is not set
+# CONFIG_HDLC is not set
+# CONFIG_HDLC_CISCO is not set
+# CONFIG_HDLC_FR is not set
+# CONFIG_HDLC_PPP is not set
+# CONFIG_HDLC_RAW is not set
+# CONFIG_HDLC_RAW_ETH is not set
+# CONFIG_HDMI_LPE_AUDIO is not set
+# CONFIG_HDQ_MASTER_OMAP is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_HEADERS_INSTALL is not set
+# CONFIG_HEADER_TEST is not set
+# CONFIG_HERMES is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_HFSPLUS_FS_POSIX_ACL is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFS_FS_POSIX_ACL is not set
+# CONFIG_HI8435 is not set
+# CONFIG_HIBERNATION is not set
+# CONFIG_HID is not set
+# CONFIG_HIDRAW is not set
+# CONFIG_HID_A4TECH is not set
+# CONFIG_HID_ACCUTOUCH is not set
+# CONFIG_HID_ACRUX is not set
+# CONFIG_HID_ACRUX_FF is not set
+# CONFIG_HID_ALPS is not set
+# CONFIG_HID_APPLE is not set
+# CONFIG_HID_APPLEIR is not set
+# CONFIG_HID_ASUS is not set
+# CONFIG_HID_AUREAL is not set
+# CONFIG_HID_BATTERY_STRENGTH is not set
+# CONFIG_HID_BELKIN is not set
+# CONFIG_HID_BETOP_FF is not set
+# CONFIG_HID_BIGBEN_FF is not set
+# CONFIG_HID_CHERRY is not set
+# CONFIG_HID_CHICONY is not set
+# CONFIG_HID_CMEDIA is not set
+# CONFIG_HID_CORSAIR is not set
+# CONFIG_HID_COUGAR is not set
+# CONFIG_HID_CP2112 is not set
+# CONFIG_HID_CREATIVE_SB0540 is not set
+# CONFIG_HID_CYPRESS is not set
+# CONFIG_HID_DRAGONRISE is not set
+# CONFIG_HID_ELAN is not set
+# CONFIG_HID_ELECOM is not set
+# CONFIG_HID_ELO is not set
+# CONFIG_HID_EMS_FF is not set
+# CONFIG_HID_EZKEY is not set
+# CONFIG_HID_FT260 is not set
+# CONFIG_HID_GEMBIRD is not set
+# CONFIG_HID_GENERIC is not set
+# CONFIG_HID_GFRM is not set
+# CONFIG_HID_GLORIOUS is not set
+# CONFIG_HID_GOOGLE_HAMMER is not set
+# CONFIG_HID_GREENASIA is not set
+# CONFIG_HID_GT683R is not set
+# CONFIG_HID_GYRATION is not set
+# CONFIG_HID_HOLTEK is not set
+# CONFIG_HID_ICADE is not set
+# CONFIG_HID_ITE is not set
+# CONFIG_HID_JABRA is not set
+# CONFIG_HID_KENSINGTON is not set
+# CONFIG_HID_KEYTOUCH is not set
+# CONFIG_HID_KYE is not set
+# CONFIG_HID_LCPOWER is not set
+# CONFIG_HID_LED is not set
+# CONFIG_HID_LENOVO is not set
+# CONFIG_HID_LETSKETCH is not set
+# CONFIG_HID_LOGITECH is not set
+# CONFIG_HID_LOGITECH_DJ is not set
+# CONFIG_HID_LOGITECH_HIDPP is not set
+# CONFIG_HID_MACALLY is not set
+# CONFIG_HID_MAGICMOUSE is not set
+# CONFIG_HID_MALTRON is not set
+# CONFIG_HID_MAYFLASH is not set
+# CONFIG_HID_MCP2221 is not set
+# CONFIG_HID_MEGAWORLD_FF is not set
+# CONFIG_HID_MICROSOFT is not set
+# CONFIG_HID_MONTEREY is not set
+# CONFIG_HID_MULTITOUCH is not set
+# CONFIG_HID_NINTENDO is not set
+# CONFIG_HID_NTI is not set
+# CONFIG_HID_NTRIG is not set
+# CONFIG_HID_ORTEK is not set
+# CONFIG_HID_PANTHERLORD is not set
+# CONFIG_HID_PENMOUNT is not set
+# CONFIG_HID_PETALYNX is not set
+# CONFIG_HID_PICOLCD is not set
+# CONFIG_HID_PID is not set
+# CONFIG_HID_PLANTRONICS is not set
+# CONFIG_HID_PLAYSTATION is not set
+# CONFIG_HID_PRIMAX is not set
+# CONFIG_HID_PRODIKEYS is not set
+# CONFIG_HID_RAZER is not set
+# CONFIG_HID_REDRAGON is not set
+# CONFIG_HID_RETRODE is not set
+# CONFIG_HID_RMI is not set
+# CONFIG_HID_ROCCAT is not set
+# CONFIG_HID_SAITEK is not set
+# CONFIG_HID_SAMSUNG is not set
+# CONFIG_HID_SEMITEK is not set
+# CONFIG_HID_SENSOR_HUB is not set
+# CONFIG_HID_SIGMAMICRO is not set
+# CONFIG_HID_SMARTJOYPLUS is not set
+# CONFIG_HID_SONY is not set
+# CONFIG_HID_SPEEDLINK is not set
+# CONFIG_HID_STEAM is not set
+# CONFIG_HID_STEELSERIES is not set
+# CONFIG_HID_SUNPLUS is not set
+# CONFIG_HID_THINGM is not set
+# CONFIG_HID_THRUSTMASTER is not set
+# CONFIG_HID_TIVO is not set
+# CONFIG_HID_TOPSEED is not set
+# CONFIG_HID_TWINHAN is not set
+# CONFIG_HID_U2FZERO is not set
+# CONFIG_HID_UCLOGIC is not set
+# CONFIG_HID_UDRAW_PS3 is not set
+# CONFIG_HID_VIEWSONIC is not set
+# CONFIG_HID_VIVALDI is not set
+# CONFIG_HID_WACOM is not set
+# CONFIG_HID_WALTOP is not set
+# CONFIG_HID_WIIMOTE is not set
+# CONFIG_HID_XIAOM is not set
+# CONFIG_HID_XIAOMI is not set
+# CONFIG_HID_XINMO is not set
+# CONFIG_HID_ZEROPLUS is not set
+# CONFIG_HID_ZYDACRON is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_HIGH_RES_TIMERS=y
+# CONFIG_HINIC is not set
+# CONFIG_HIP04_ETH is not set
+# CONFIG_HIPPI is not set
+# CONFIG_HISILICON_ERRATUM_161010101 is not set
+# CONFIG_HISILICON_ERRATUM_161600802 is not set
+# CONFIG_HISI_DMA is not set
+# CONFIG_HISI_FEMAC is not set
+# CONFIG_HISI_HIKEY_USB is not set
+# CONFIG_HISI_PCIE_PMU is not set
+# CONFIG_HIX5HD2_GMAC is not set
+# CONFIG_HMC425 is not set
+# CONFIG_HMC6352 is not set
+# CONFIG_HNS is not set
+# CONFIG_HNS3 is not set
+# CONFIG_HNS3_PMU is not set
+# CONFIG_HNS_DSAF is not set
+# CONFIG_HNS_ENET is not set
+# CONFIG_HOSTAP is not set
+# CONFIG_HOSTAP_CS is not set
+# CONFIG_HOSTAP_PCI is not set
+# CONFIG_HOSTAP_PLX is not set
+# CONFIG_HOTPLUG_CPU is not set
+# CONFIG_HOTPLUG_PCI is not set
+# CONFIG_HOTPLUG_PCI_SHPC is not set
+# CONFIG_HP03 is not set
+# CONFIG_HP100 is not set
+# CONFIG_HP206C is not set
+CONFIG_HPET_MMAP_DEFAULT=y
+# CONFIG_HPFS_FS is not set
+# CONFIG_HP_ILO is not set
+# CONFIG_HP_WIRELESS is not set
+# CONFIG_HSA_AMD is not set
+# CONFIG_HSI is not set
+# CONFIG_HSR is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_I2CPLD is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTE is not set
+# CONFIG_HTS221 is not set
+# CONFIG_HTU21 is not set
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_HVC_DCC is not set
+# CONFIG_HVC_UDBG is not set
+# CONFIG_HWLAT_TRACER is not set
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+# CONFIG_HWMON_VID is not set
+# CONFIG_HWSPINLOCK is not set
+# CONFIG_HWSPINLOCK_OMAP is not set
+CONFIG_HW_PERF_EVENTS=y
+# CONFIG_HW_RANDOM is not set
+# CONFIG_HW_RANDOM_AMD is not set
+# CONFIG_HW_RANDOM_ARM_SMCCC_TRNG is not set
+# CONFIG_HW_RANDOM_ATMEL is not set
+# CONFIG_HW_RANDOM_BA431 is not set
+# CONFIG_HW_RANDOM_CAVIUM is not set
+# CONFIG_HW_RANDOM_CCTRNG is not set
+# CONFIG_HW_RANDOM_CN10K is not set
+# CONFIG_HW_RANDOM_EXYNOS is not set
+# CONFIG_HW_RANDOM_GEODE is not set
+# CONFIG_HW_RANDOM_INTEL is not set
+# CONFIG_HW_RANDOM_IPROC_RNG200 is not set
+# CONFIG_HW_RANDOM_MTK is not set
+# CONFIG_HW_RANDOM_OMAP is not set
+# CONFIG_HW_RANDOM_OMAP3_ROM is not set
+# CONFIG_HW_RANDOM_PPC4XX is not set
+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+CONFIG_HW_RANDOM_TPM=y
+# CONFIG_HW_RANDOM_VIA is not set
+# CONFIG_HW_RANDOM_VIRTIO is not set
+# CONFIG_HW_RANDOM_XIPHERA is not set
+# CONFIG_HX711 is not set
+# CONFIG_HYPERV is not set
+# CONFIG_HYPERV_TSCPAGE is not set
+# CONFIG_HYSDN is not set
+CONFIG_HZ=100
+CONFIG_HZ_100=y
+# CONFIG_HZ_1000 is not set
+# CONFIG_HZ_1024 is not set
+# CONFIG_HZ_128 is not set
+# CONFIG_HZ_200 is not set
+# CONFIG_HZ_24 is not set
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_256 is not set
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_48 is not set
+# CONFIG_HZ_500 is not set
+# CONFIG_HZ_PERIODIC is not set
+# CONFIG_I2C is not set
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCA is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set
+# CONFIG_I2C_AU1550 is not set
+# CONFIG_I2C_BCM2835 is not set
+# CONFIG_I2C_BCM_IPROC is not set
+# CONFIG_I2C_CADENCE is not set
+# CONFIG_I2C_CBUS_GPIO is not set
+# CONFIG_I2C_CHARDEV is not set
+# CONFIG_I2C_COMPAT is not set
+# CONFIG_I2C_CP2615 is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEMUX_PINCTRL is not set
+# CONFIG_I2C_DESIGNWARE_PCI is not set
+# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
+# CONFIG_I2C_DESIGNWARE_SLAVE is not set
+# CONFIG_I2C_DIOLAN_U2C is not set
+# CONFIG_I2C_EG20T is not set
+# CONFIG_I2C_ELEKTOR is not set
+# CONFIG_I2C_EMEV2 is not set
+# CONFIG_I2C_GPIO is not set
+# CONFIG_I2C_GPIO_FAULT_INJECTOR is not set
+# CONFIG_I2C_HELPER_AUTO is not set
+# CONFIG_I2C_HID is not set
+# CONFIG_I2C_HID_OF is not set
+# CONFIG_I2C_HID_OF_ELAN is not set
+# CONFIG_I2C_HID_OF_GOODIX is not set
+# CONFIG_I2C_HISI is not set
+# CONFIG_I2C_I801 is not set
+# CONFIG_I2C_IBM_IIC is not set
+# CONFIG_I2C_IMG is not set
+# CONFIG_I2C_ISCH is not set
+# CONFIG_I2C_ISMT is not set
+# CONFIG_I2C_JZ4780 is not set
+# CONFIG_I2C_MLXCPLD is not set
+# CONFIG_I2C_MPC is not set
+# CONFIG_I2C_MT65XX is not set
+# CONFIG_I2C_MUX is not set
+# CONFIG_I2C_MUX_GPIO is not set
+# CONFIG_I2C_MUX_GPMUX is not set
+# CONFIG_I2C_MUX_LTC4306 is not set
+# CONFIG_I2C_MUX_MLXCPLD is not set
+# CONFIG_I2C_MUX_PCA9541 is not set
+# CONFIG_I2C_MUX_PCA954x is not set
+# CONFIG_I2C_MUX_PINCTRL is not set
+# CONFIG_I2C_MUX_REG is not set
+# CONFIG_I2C_MV64XXX is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_NOMADIK is not set
+# CONFIG_I2C_NVIDIA_GPU is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_OCTEON is not set
+# CONFIG_I2C_PARPORT is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PCA_ISA is not set
+# CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_PIIX4 is not set
+# CONFIG_I2C_PXA_PCI is not set
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_RCAR is not set
+# CONFIG_I2C_RK3X is not set
+# CONFIG_I2C_ROBOTFUZZ_OSIF is not set
+# CONFIG_I2C_S3C2410 is not set
+# CONFIG_I2C_SCMI is not set
+# CONFIG_I2C_SH_MOBILE is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_SLAVE is not set
+# CONFIG_I2C_SLAVE_EEPROM is not set
+# CONFIG_I2C_SMBUS is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_THUNDERX is not set
+# CONFIG_I2C_TINY_USB is not set
+# CONFIG_I2C_VERSATILE is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2C_VIRTIO is not set
+# CONFIG_I2C_XILINX is not set
+# CONFIG_I3C is not set
+# CONFIG_I40E is not set
+# CONFIG_I40EVF is not set
+# CONFIG_I6300ESB_WDT is not set
+# CONFIG_I82092 is not set
+# CONFIG_I82365 is not set
+# CONFIG_IAQCORE is not set
+# CONFIG_IBM_ASM is not set
+# CONFIG_IBM_EMAC_DEBUG is not set
+# CONFIG_IBM_EMAC_EMAC4 is not set
+# CONFIG_IBM_EMAC_MAL_CLR_ICINTSTAT is not set
+# CONFIG_IBM_EMAC_MAL_COMMON_ERR is not set
+# CONFIG_IBM_EMAC_NO_FLOW_CTRL is not set
+# CONFIG_IBM_EMAC_RGMII is not set
+# CONFIG_IBM_EMAC_TAH is not set
+# CONFIG_IBM_EMAC_ZMII is not set
+# CONFIG_ICE is not set
+# CONFIG_ICP10100 is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_ICS932S401 is not set
+# CONFIG_ICST is not set
+# CONFIG_IDE is not set
+# CONFIG_IDEAPAD_LAPTOP is not set
+# CONFIG_IDE_GD is not set
+# CONFIG_IDE_PROC_FS is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+# CONFIG_IDLE_PAGE_TRACKING is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_IEEE802154_ADF7242 is not set
+# CONFIG_IEEE802154_ATUSB is not set
+# CONFIG_IEEE802154_CA8210 is not set
+# CONFIG_IEEE802154_HWSIM is not set
+# CONFIG_IEEE802154_MCR20A is not set
+# CONFIG_IFB is not set
+# CONFIG_IGB is not set
+# CONFIG_IGBVF is not set
+# CONFIG_IGB_HWMON is not set
+# CONFIG_IGC is not set
+# CONFIG_IIO is not set
+# CONFIG_IIO_BUFFER is not set
+# CONFIG_IIO_BUFFER_CB is not set
+# CONFIG_IIO_BUFFER_DMA is not set
+# CONFIG_IIO_BUFFER_DMAENGINE is not set
+# CONFIG_IIO_BUFFER_HDC2010 is not set
+# CONFIG_IIO_BUFFER_HW_CONSUMER is not set
+# CONFIG_IIO_CONFIGFS is not set
+CONFIG_IIO_CONSUMERS_PER_TRIGGER=2
+# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set
+# CONFIG_IIO_INTERRUPT_TRIGGER is not set
+# CONFIG_IIO_MUX is not set
+# CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set
+# CONFIG_IIO_RESCALE is not set
+# CONFIG_IIO_SIMPLE_DUMMY is not set
+# CONFIG_IIO_SSP_SENSORHUB is not set
+# CONFIG_IIO_ST_ACCEL_3AXIS is not set
+# CONFIG_IIO_ST_GYRO_3AXIS is not set
+# CONFIG_IIO_ST_LSM6DSX is not set
+# CONFIG_IIO_ST_LSM9DS0 is not set
+# CONFIG_IIO_ST_MAGN_3AXIS is not set
+# CONFIG_IIO_ST_PRESS is not set
+# CONFIG_IIO_SW_DEVICE is not set
+# CONFIG_IIO_SW_TRIGGER is not set
+# CONFIG_IIO_SYSFS_TRIGGER is not set
+# CONFIG_IIO_TRIGGER is not set
+# CONFIG_IIO_TRIGGERED_EVENT is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
+# CONFIG_IKHEADERS is not set
+# CONFIG_IMA is not set
+# CONFIG_IMAGE_CMDLINE_HACK is not set
+# CONFIG_IMGPDC_WDT is not set
+# CONFIG_IMG_MDC_DMA is not set
+# CONFIG_IMX7D_ADC is not set
+# CONFIG_IMX_IPUV3_CORE is not set
+# CONFIG_IMX_THERMAL is not set
+# CONFIG_INA2XX_ADC is not set
+# CONFIG_INDIRECT_PIO is not set
+CONFIG_INET=y
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_ESPINTCP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_INET6_XFRM_MODE_BEET is not set
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET6_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_ESPINTCP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_LRO is not set
+# CONFIG_INET_TCP_DIAG is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_UDP_DIAG is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INFINIBAND is not set
+# CONFIG_INFTL is not set
+# CONFIG_INGENIC_ADC is not set
+# CONFIG_INGENIC_CGU_JZ4725B is not set
+# CONFIG_INGENIC_CGU_JZ4740 is not set
+# CONFIG_INGENIC_CGU_JZ4770 is not set
+# CONFIG_INGENIC_CGU_JZ4780 is not set
+# CONFIG_INGENIC_CGU_X1000 is not set
+# CONFIG_INGENIC_CGU_X1830 is not set
+# CONFIG_INGENIC_OST is not set
+# CONFIG_INGENIC_SYSOST is not set
+# CONFIG_INGENIC_TCU_CLK is not set
+# CONFIG_INGENIC_TCU_IRQ is not set
+# CONFIG_INGENIC_TIMER is not set
+CONFIG_INIT_ENV_ARG_LIMIT=32
+# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
+# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
+CONFIG_INIT_STACK_NONE=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_INPUT is not set
+# CONFIG_INPUT_AD714X is not set
+# CONFIG_INPUT_ADXL34X is not set
+# CONFIG_INPUT_APANEL is not set
+# CONFIG_INPUT_ATI_REMOTE2 is not set
+# CONFIG_INPUT_ATLAS_BTNS is not set
+# CONFIG_INPUT_ATMEL_CAPTOUCH is not set
+# CONFIG_INPUT_AXP20X_PEK is not set
+# CONFIG_INPUT_BMA150 is not set
+# CONFIG_INPUT_CM109 is not set
+# CONFIG_INPUT_CMA3000 is not set
+# CONFIG_INPUT_DA7280_HAPTICS is not set
+# CONFIG_INPUT_DRV260X_HAPTICS is not set
+# CONFIG_INPUT_DRV2665_HAPTICS is not set
+# CONFIG_INPUT_DRV2667_HAPTICS is not set
+# CONFIG_INPUT_E3X0_BUTTON is not set
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_GP2A is not set
+# CONFIG_INPUT_GPIO_BEEPER is not set
+# CONFIG_INPUT_GPIO_DECODER is not set
+# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
+# CONFIG_INPUT_GPIO_TILT_POLLED is not set
+# CONFIG_INPUT_GPIO_VIBRA is not set
+# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set
+# CONFIG_INPUT_IMS_PCU is not set
+# CONFIG_INPUT_IQS269A is not set
+# CONFIG_INPUT_IQS626A is not set
+# CONFIG_INPUT_IQS7222 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_KEYSPAN_REMOTE is not set
+# CONFIG_INPUT_KXTJ9 is not set
+# CONFIG_INPUT_LEDS is not set
+# CONFIG_INPUT_MATRIXKMAP is not set
+# CONFIG_INPUT_MAX8997_HAPTIC is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_MMA8450 is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_MPU3050 is not set
+# CONFIG_INPUT_MSM_VIBRATOR is not set
+# CONFIG_INPUT_PALMAS_PWRBUTTON is not set
+# CONFIG_INPUT_PCF8574 is not set
+# CONFIG_INPUT_PCSPKR is not set
+# CONFIG_INPUT_POLLDEV is not set
+# CONFIG_INPUT_POWERMATE is not set
+# CONFIG_INPUT_PWM_BEEPER is not set
+# CONFIG_INPUT_PWM_VIBRA is not set
+# CONFIG_INPUT_REGULATOR_HAPTIC is not set
+# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set
+# CONFIG_INPUT_SPARSEKMAP is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_TPS65218_PWRBUTTON is not set
+# CONFIG_INPUT_TWL4030_PWRBUTTON is not set
+# CONFIG_INPUT_TWL4030_VIBRA is not set
+# CONFIG_INPUT_TWL6040_VIBRA is not set
+# CONFIG_INPUT_UINPUT is not set
+# CONFIG_INPUT_WISTRON_BTNS is not set
+# CONFIG_INPUT_YEALINK is not set
+# CONFIG_INT340X_THERMAL is not set
+# CONFIG_INTEGRITY is not set
+# CONFIG_INTEGRITY_AUDIT is not set
+# CONFIG_INTEGRITY_SIGNATURE is not set
+# CONFIG_INTEL_ATOMISP2_LED is not set
+# CONFIG_INTEL_ATOMISP2_PM is not set
+# CONFIG_INTEL_CHT_INT33FE is not set
+# CONFIG_INTEL_HID_EVENT is not set
+# CONFIG_INTEL_IDLE is not set
+# CONFIG_INTEL_IDMA64 is not set
+# CONFIG_INTEL_INT0002_VGPIO is not set
+# CONFIG_INTEL_IOATDMA is not set
+# CONFIG_INTEL_ISH_HID is not set
+# CONFIG_INTEL_MEI is not set
+# CONFIG_INTEL_MEI_ME is not set
+# CONFIG_INTEL_MEI_TXE is not set
+# CONFIG_INTEL_MIC_CARD is not set
+# CONFIG_INTEL_MIC_HOST is not set
+# CONFIG_INTEL_MID_PTI is not set
+# CONFIG_INTEL_OAKTRAIL is not set
+# CONFIG_INTEL_PMC_CORE is not set
+# CONFIG_INTEL_PUNIT_IPC is not set
+# CONFIG_INTEL_RST is not set
+# CONFIG_INTEL_SMARTCONNECT is not set
+# CONFIG_INTEL_SOC_PMIC is not set
+# CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set
+# CONFIG_INTEL_SOC_PMIC_CHTWC is not set
+# CONFIG_INTEL_TCC_COOLING is not set
+# CONFIG_INTEL_TH is not set
+# CONFIG_INTEL_VBTN is not set
+# CONFIG_INTEL_XWAY_PHY is not set
+# CONFIG_INTERCONNECT is not set
+# CONFIG_INTERVAL_TREE_TEST is not set
+# CONFIG_INV_ICM42600_I2C is not set
+# CONFIG_INV_ICM42600_SPI is not set
+# CONFIG_INV_MPU6050_I2C is not set
+# CONFIG_INV_MPU6050_IIO is not set
+# CONFIG_INV_MPU6050_SPI is not set
+# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
+# CONFIG_IOMMU_DMA_PCI_SAC is not set
+# CONFIG_IOMMU_SUPPORT is not set
+# CONFIG_IONIC is not set
+# CONFIG_IOSCHED_BFQ is not set
+# CONFIG_IOSCHED_CFQ is not set
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IO_STRICT_DEVMEM=y
+# CONFIG_IO_URING is not set
+CONFIG_IO_WQ=y
+# CONFIG_IP17XX_PHY is not set
+# CONFIG_IP5XXX_POWER is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_IPTABLES is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_RPFILTER is not set
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_SRH is not set
+# CONFIG_IP6_NF_NAT is not set
+# CONFIG_IP6_NF_RAW is not set
+# CONFIG_IP6_NF_SECURITY is not set
+# CONFIG_IP6_NF_TARGET_HL is not set
+# CONFIG_IP6_NF_TARGET_MASQUERADE is not set
+# CONFIG_IP6_NF_TARGET_REJECT is not set
+# CONFIG_IP6_NF_TARGET_SYNPROXY is not set
+# CONFIG_IPACK_BUS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_IPMB_DEVICE_INTERFACE is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_IPV6 is not set
+# CONFIG_IPV6_FOU is not set
+# CONFIG_IPV6_FOU_TUNNEL is not set
+# CONFIG_IPV6_ILA is not set
+# CONFIG_IPV6_IOAM6_LWTUNNEL is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_IPV6_MROUTE_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+CONFIG_IPV6_NDISC_NODETYPE=y
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_ROUTE_INFO is not set
+# CONFIG_IPV6_RPL_LWTUNNEL is not set
+# CONFIG_IPV6_SEG6_HMAC is not set
+# CONFIG_IPV6_SEG6_LWTUNNEL is not set
+# CONFIG_IPV6_SIT is not set
+# CONFIG_IPV6_SIT_6RD is not set
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_VTI is not set
+# CONFIG_IPVLAN is not set
+# CONFIG_IPVTAP is not set
+# CONFIG_IPW2100 is not set
+# CONFIG_IPW2100_DEBUG is not set
+CONFIG_IPW2100_MONITOR=y
+# CONFIG_IPW2200 is not set
+# CONFIG_IPW2200_DEBUG is not set
+CONFIG_IPW2200_MONITOR=y
+# CONFIG_IPW2200_PROMISCUOUS is not set
+# CONFIG_IPW2200_QOS is not set
+# CONFIG_IPW2200_RADIOTAP is not set
+# CONFIG_IPWIRELESS is not set
+# CONFIG_IPX is not set
+CONFIG_IP_ADVANCED_ROUTER=y
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_FIB_TRIE_STATS is not set
+# CONFIG_IP_MROUTE is not set
+CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_MULTIPLE_TABLES=y
+# CONFIG_IP_NF_ARPFILTER is not set
+# CONFIG_IP_NF_ARPTABLES is not set
+# CONFIG_IP_NF_ARP_MANGLE is not set
+# CONFIG_IP_NF_FILTER is not set
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_MANGLE is not set
+# CONFIG_IP_NF_MATCH_AH is not set
+# CONFIG_IP_NF_MATCH_ECN is not set
+# CONFIG_IP_NF_MATCH_RPFILTER is not set
+# CONFIG_IP_NF_MATCH_TTL is not set
+# CONFIG_IP_NF_RAW is not set
+# CONFIG_IP_NF_SECURITY is not set
+# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_MASQUERADE is not set
+# CONFIG_IP_NF_TARGET_NETMAP is not set
+# CONFIG_IP_NF_TARGET_REDIRECT is not set
+# CONFIG_IP_NF_TARGET_REJECT is not set
+# CONFIG_IP_NF_TARGET_SYNPROXY is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+# CONFIG_IP_PIMSM_V1 is not set
+# CONFIG_IP_PIMSM_V2 is not set
+# CONFIG_IP_PNP is not set
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+# CONFIG_IP_SCTP is not set
+# CONFIG_IP_SET is not set
+# CONFIG_IP_SET_HASH_IPMAC is not set
+# CONFIG_IP_VS is not set
+# CONFIG_IP_VS_MH is not set
+CONFIG_IP_VS_MH_TAB_INDEX=10
+# CONFIG_IP_VS_TWOS is not set
+# CONFIG_IRDA is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_IRQ_ALL_CPUS is not set
+# CONFIG_IRQ_DOMAIN_DEBUG is not set
+# CONFIG_IRQ_POLL is not set
+# CONFIG_IRQ_TIME_ACCOUNTING is not set
+# CONFIG_IR_GPIO_CIR is not set
+# CONFIG_IR_HIX5HD2 is not set
+# CONFIG_IR_IGORPLUGUSB is not set
+# CONFIG_IR_IGUANA is not set
+# CONFIG_IR_IMG is not set
+# CONFIG_IR_IMON is not set
+# CONFIG_IR_JVC_DECODER is not set
+# CONFIG_IR_LIRC_CODEC is not set
+# CONFIG_IR_MCEUSB is not set
+# CONFIG_IR_NEC_DECODER is not set
+# CONFIG_IR_RC5_DECODER is not set
+# CONFIG_IR_RC6_DECODER is not set
+# CONFIG_IR_REDRAT3 is not set
+# CONFIG_IR_SONY_DECODER is not set
+# CONFIG_IR_STREAMZAP is not set
+# CONFIG_IR_TTUSBIR is not set
+# CONFIG_ISA_BUS is not set
+# CONFIG_ISA_BUS_API is not set
+# CONFIG_ISCSI_BOOT_SYSFS is not set
+# CONFIG_ISCSI_TCP is not set
+CONFIG_ISDN=y
+# CONFIG_ISDN_AUDIO is not set
+# CONFIG_ISDN_CAPI is not set
+# CONFIG_ISDN_CAPI_CAPIDRV is not set
+# CONFIG_ISDN_DIVERSION is not set
+# CONFIG_ISDN_DRV_ACT2000 is not set
+# CONFIG_ISDN_DRV_GIGASET is not set
+# CONFIG_ISDN_DRV_HISAX is not set
+# CONFIG_ISDN_DRV_ICN is not set
+# CONFIG_ISDN_DRV_LOOP is not set
+# CONFIG_ISDN_DRV_PCBIT is not set
+# CONFIG_ISDN_DRV_SC is not set
+# CONFIG_ISDN_I4L is not set
+# CONFIG_ISL29003 is not set
+# CONFIG_ISL29020 is not set
+# CONFIG_ISL29125 is not set
+# CONFIG_ISL29501 is not set
+# CONFIG_ISO9660_FS is not set
+# CONFIG_ISS4xx is not set
+# CONFIG_ITG3200 is not set
+# CONFIG_IWL3945 is not set
+# CONFIG_IWLWIFI is not set
+# CONFIG_IXGB is not set
+# CONFIG_IXGBE is not set
+# CONFIG_IXGBEVF is not set
+# CONFIG_JAILHOUSE_GUEST is not set
+# CONFIG_JBD2_DEBUG is not set
+# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
+# CONFIG_JFFS2_CMODE_NONE is not set
+CONFIG_JFFS2_CMODE_PRIORITY=y
+# CONFIG_JFFS2_CMODE_SIZE is not set
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# CONFIG_JFFS2_FS_POSIX_ACL is not set
+# CONFIG_JFFS2_FS_SECURITY is not set
+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+CONFIG_JFFS2_FS_XATTR=y
+CONFIG_JFFS2_LZMA=y
+# CONFIG_JFFS2_LZO is not set
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+CONFIG_JFFS2_SUMMARY=y
+# CONFIG_JFFS2_ZLIB is not set
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_JFS_POSIX_ACL is not set
+# CONFIG_JFS_SECURITY is not set
+# CONFIG_JFS_STATISTICS is not set
+# CONFIG_JME is not set
+CONFIG_JOLIET=y
+# CONFIG_JSA1212 is not set
+# CONFIG_JUMP_LABEL is not set
+# CONFIG_JZ4740_WDT is not set
+# CONFIG_JZ4770_PHY is not set
+# CONFIG_KALLSYMS is not set
+# CONFIG_KALLSYMS_ABSOLUTE_PERCPU is not set
+# CONFIG_KALLSYMS_ALL is not set
+CONFIG_KALLSYMS_BASE_RELATIVE=y
+# CONFIG_KALLSYMS_UNCOMPRESSED is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_KASAN is not set
+CONFIG_KASAN_STACK=y
+# CONFIG_KCMP is not set
+# CONFIG_KCOV is not set
+# CONFIG_KCSAN is not set
+# CONFIG_KERNEL_BZIP2 is not set
+# CONFIG_KERNEL_CAT is not set
+# CONFIG_KERNEL_GZIP is not set
+# CONFIG_KERNEL_LZ4 is not set
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_LZO is not set
+CONFIG_KERNEL_MODE_NEON=y
+CONFIG_KERNEL_XZ=y
+# CONFIG_KERNEL_ZSTD is not set
+CONFIG_KERNFS=y
+# CONFIG_KEXEC is not set
+# CONFIG_KEXEC_FILE is not set
+# CONFIG_KEYBOARD_ADC is not set
+# CONFIG_KEYBOARD_ADP5588 is not set
+# CONFIG_KEYBOARD_ADP5589 is not set
+# CONFIG_KEYBOARD_APPLESPI is not set
+# CONFIG_KEYBOARD_ATKBD is not set
+# CONFIG_KEYBOARD_BCM is not set
+# CONFIG_KEYBOARD_CAP11XX is not set
+# CONFIG_KEYBOARD_CYPRESS_SF is not set
+# CONFIG_KEYBOARD_DLINK_DIR685 is not set
+# CONFIG_KEYBOARD_GPIO is not set
+# CONFIG_KEYBOARD_GPIO_POLLED is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_LM8323 is not set
+# CONFIG_KEYBOARD_LM8333 is not set
+# CONFIG_KEYBOARD_MATRIX is not set
+# CONFIG_KEYBOARD_MAX7359 is not set
+# CONFIG_KEYBOARD_MCS is not set
+# CONFIG_KEYBOARD_MPR121 is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_OMAP4 is not set
+# CONFIG_KEYBOARD_OPENCORES is not set
+# CONFIG_KEYBOARD_PXA27x is not set
+# CONFIG_KEYBOARD_QT1050 is not set
+# CONFIG_KEYBOARD_QT1070 is not set
+# CONFIG_KEYBOARD_QT2160 is not set
+# CONFIG_KEYBOARD_SAMSUNG is not set
+# CONFIG_KEYBOARD_SH_KEYSC is not set
+# CONFIG_KEYBOARD_SNVS_PWRKEY is not set
+# CONFIG_KEYBOARD_STMPE is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_TCA6416 is not set
+# CONFIG_KEYBOARD_TCA8418 is not set
+# CONFIG_KEYBOARD_TEGRA is not set
+# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set
+# CONFIG_KEYBOARD_TWL4030 is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYS is not set
+# CONFIG_KEYS_REQUEST_CACHE is not set
+# CONFIG_KEY_DH_OPERATIONS is not set
+# CONFIG_KFENCE is not set
+# CONFIG_KGDB is not set
+# CONFIG_KMAP_LOCAL is not set
+# CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY is not set
+# CONFIG_KMEMCHECK is not set
+# CONFIG_KMX61 is not set
+# CONFIG_KPC2000 is not set
+# CONFIG_KPROBES is not set
+# CONFIG_KPROBES_SANITY_TEST is not set
+# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set
+# CONFIG_KPROBE_EVENT_GEN_TEST is not set
+# CONFIG_KS7010 is not set
+# CONFIG_KS8842 is not set
+# CONFIG_KS8851 is not set
+# CONFIG_KS8851_MLL is not set
+# CONFIG_KSM is not set
+# CONFIG_KSZ884X_PCI is not set
+# CONFIG_KUNIT is not set
+CONFIG_KUSER_HELPERS=y
+# CONFIG_KVM_AMD is not set
+# CONFIG_KVM_AMD_SEV is not set
+# CONFIG_KVM_GUEST is not set
+# CONFIG_KVM_INTEL is not set
+# CONFIG_KVM_WERROR is not set
+# CONFIG_KXCJK1013 is not set
+# CONFIG_KXSD9 is not set
+# CONFIG_L2TP is not set
+# CONFIG_L2TP_ETH is not set
+# CONFIG_L2TP_IP is not set
+# CONFIG_L2TP_V3 is not set
+# CONFIG_LAN743X is not set
+# CONFIG_LANMEDIA is not set
+# CONFIG_LANTIQ is not set
+# CONFIG_LAPB is not set
+# CONFIG_LASAT is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_LATTICE_ECP3_CONFIG is not set
+CONFIG_LBDAF=y
+# CONFIG_LCD_AMS369FG06 is not set
+# CONFIG_LCD_CLASS_DEVICE is not set
+# CONFIG_LCD_HX8357 is not set
+# CONFIG_LCD_ILI922X is not set
+# CONFIG_LCD_ILI9320 is not set
+# CONFIG_LCD_L4F00242T03 is not set
+# CONFIG_LCD_LD9040 is not set
+# CONFIG_LCD_LMS283GF05 is not set
+# CONFIG_LCD_LMS501KF03 is not set
+# CONFIG_LCD_LTV350QV is not set
+# CONFIG_LCD_OTM3225A is not set
+# CONFIG_LCD_S6E63M0 is not set
+# CONFIG_LCD_TDO24M is not set
+# CONFIG_LCD_VGG2432A4 is not set
+CONFIG_LDISC_AUTOLOAD=y
+# CONFIG_LDM_PARTITION is not set
+CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y
+# CONFIG_LEDS_AN30259A is not set
+# CONFIG_LEDS_APU is not set
+# CONFIG_LEDS_AW2013 is not set
+# CONFIG_LEDS_BCM6328 is not set
+# CONFIG_LEDS_BCM6358 is not set
+# CONFIG_LEDS_BD2802 is not set
+# CONFIG_LEDS_BLINKM is not set
+CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y
+CONFIG_LEDS_CLASS=y
+# CONFIG_LEDS_CLASS_FLASH is not set
+CONFIG_LEDS_CLASS_MULTICOLOR=y
+# CONFIG_LEDS_CR0014114 is not set
+# CONFIG_LEDS_DAC124S085 is not set
+# CONFIG_LEDS_EL15203000 is not set
+# CONFIG_LEDS_GPIO is not set
+# CONFIG_LEDS_INTEL_SS4200 is not set
+# CONFIG_LEDS_IS31FL319X is not set
+# CONFIG_LEDS_IS31FL32XX is not set
+# CONFIG_LEDS_LM3530 is not set
+# CONFIG_LEDS_LM3532 is not set
+# CONFIG_LEDS_LM355x is not set
+# CONFIG_LEDS_LM3642 is not set
+# CONFIG_LEDS_LM3692X is not set
+# CONFIG_LEDS_LP3944 is not set
+# CONFIG_LEDS_LP3952 is not set
+# CONFIG_LEDS_LP50XX is not set
+# CONFIG_LEDS_LP5521 is not set
+# CONFIG_LEDS_LP5523 is not set
+# CONFIG_LEDS_LP5562 is not set
+# CONFIG_LEDS_LP55XX_COMMON is not set
+# CONFIG_LEDS_LP8501 is not set
+# CONFIG_LEDS_LP8860 is not set
+# CONFIG_LEDS_LT3593 is not set
+# CONFIG_LEDS_MLXCPLD is not set
+# CONFIG_LEDS_MLXREG is not set
+# CONFIG_LEDS_NIC78BX is not set
+# CONFIG_LEDS_NS2 is not set
+# CONFIG_LEDS_OT200 is not set
+# CONFIG_LEDS_PCA9532 is not set
+# CONFIG_LEDS_PCA955X is not set
+# CONFIG_LEDS_PCA963X is not set
+# CONFIG_LEDS_PWM is not set
+# CONFIG_LEDS_PWM_MULTICOLOR is not set
+# CONFIG_LEDS_REGULATOR is not set
+# CONFIG_LEDS_SPI_BYTE is not set
+# CONFIG_LEDS_SYSCON is not set
+# CONFIG_LEDS_TCA6507 is not set
+# CONFIG_LEDS_TI_LMU_COMMON is not set
+# CONFIG_LEDS_TLC591XX is not set
+CONFIG_LEDS_TRIGGERS=y
+# CONFIG_LEDS_TRIGGER_ACTIVITY is not set
+# CONFIG_LEDS_TRIGGER_AUDIO is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_CAMERA is not set
+# CONFIG_LEDS_TRIGGER_CPU is not set
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+# CONFIG_LEDS_TRIGGER_DISK is not set
+# CONFIG_LEDS_TRIGGER_GPIO is not set
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+# CONFIG_LEDS_TRIGGER_MTD is not set
+CONFIG_LEDS_TRIGGER_NETDEV=y
+# CONFIG_LEDS_TRIGGER_ONESHOT is not set
+# CONFIG_LEDS_TRIGGER_PANIC is not set
+# CONFIG_LEDS_TRIGGER_PATTERN is not set
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_TRANSIENT is not set
+# CONFIG_LEDS_TRIGGER_TTY is not set
+# CONFIG_LEDS_TURRIS_OMNIA is not set
+# CONFIG_LEDS_USER is not set
+# CONFIG_LED_TRIGGER_PHY is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_LGUEST is not set
+# CONFIG_LIB80211 is not set
+# CONFIG_LIB80211_CRYPT_CCMP is not set
+# CONFIG_LIB80211_CRYPT_TKIP is not set
+# CONFIG_LIB80211_CRYPT_WEP is not set
+# CONFIG_LIB80211_DEBUG is not set
+# CONFIG_LIBCRC32C is not set
+# CONFIG_LIBERTAS is not set
+# CONFIG_LIBERTAS_THINFIRM is not set
+# CONFIG_LIBERTAS_USB is not set
+# CONFIG_LIBFC is not set
+# CONFIG_LIBFCOE is not set
+# CONFIG_LIBIPW_DEBUG is not set
+# CONFIG_LIBNVDIMM is not set
+CONFIG_LIB_MEMNEQ=y
+# CONFIG_LIDAR_LITE_V2 is not set
+CONFIG_LINEAR_RANGES=y
+# CONFIG_LIQUIDIO is not set
+# CONFIG_LIQUIDIO_VF is not set
+# CONFIG_LIS3L02DQ is not set
+# CONFIG_LITEX_LITEETH is not set
+# CONFIG_LITEX_SOC_CONTROLLER is not set
+# CONFIG_LKDTM is not set
+CONFIG_LLC=y
+# CONFIG_LLC2 is not set
+# CONFIG_LMK04832 is not set
+# CONFIG_LMP91000 is not set
+# CONFIG_LNET is not set
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+# CONFIG_LOCKD is not set
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_LOCKD_V4=y
+# CONFIG_LOCKUP_DETECTOR is not set
+# CONFIG_LOCK_EVENT_COUNTS is not set
+# CONFIG_LOCK_STAT is not set
+# CONFIG_LOCK_TORTURE_TEST is not set
+# CONFIG_LOGFS is not set
+# CONFIG_LOGIG940_FF is not set
+# CONFIG_LOGIRUMBLEPAD2_FF is not set
+# CONFIG_LOGITECH_FF is not set
+# CONFIG_LOGIWHEELS_FF is not set
+# CONFIG_LOGO is not set
+CONFIG_LOG_BUF_SHIFT=17
+CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
+# CONFIG_LOONGSON_MC146818 is not set
+# CONFIG_LPC_ICH is not set
+# CONFIG_LPC_SCH is not set
+# CONFIG_LP_CONSOLE is not set
+CONFIG_LRU_GEN=y
+CONFIG_LRU_GEN_ENABLED=y
+# CONFIG_LRU_GEN_STATS is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity"
+CONFIG_LSM_MMAP_MIN_ADDR=65536
+# CONFIG_LTC1660 is not set
+# CONFIG_LTC2471 is not set
+# CONFIG_LTC2485 is not set
+# CONFIG_LTC2496 is not set
+# CONFIG_LTC2497 is not set
+# CONFIG_LTC2632 is not set
+# CONFIG_LTC2983 is not set
+# CONFIG_LTE_GDM724X is not set
+# CONFIG_LTO_NONE is not set
+# CONFIG_LTPC is not set
+# CONFIG_LTR501 is not set
+# CONFIG_LUSTRE_FS is not set
+# CONFIG_LV0104CS is not set
+# CONFIG_LWTUNNEL is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_LZ4HC_COMPRESS is not set
+# CONFIG_LZ4_COMPRESS is not set
+# CONFIG_LZ4_DECOMPRESS is not set
+CONFIG_LZMA_COMPRESS=y
+CONFIG_LZMA_DECOMPRESS=y
+# CONFIG_LZO_COMPRESS is not set
+# CONFIG_LZO_DECOMPRESS is not set
+# CONFIG_M62332 is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_MAC80211_MESSAGE_TRACING is not set
+CONFIG_MAC80211_STA_HASH_MAX_SIZE=0
+# CONFIG_MACB is not set
+# CONFIG_MACH_ASM9260 is not set
+# CONFIG_MACH_DECSTATION is not set
+# CONFIG_MACH_INGENIC is not set
+# CONFIG_MACH_INGENIC_SOC is not set
+# CONFIG_MACH_JAZZ is not set
+# CONFIG_MACH_JZ4740 is not set
+# CONFIG_MACH_LOONGSON2EF is not set
+# CONFIG_MACH_LOONGSON32 is not set
+# CONFIG_MACH_LOONGSON64 is not set
+# CONFIG_MACH_PIC32 is not set
+# CONFIG_MACH_PISTACHIO is not set
+# CONFIG_MACH_TX39XX is not set
+# CONFIG_MACH_TX49XX is not set
+# CONFIG_MACH_VR41XX is not set
+# CONFIG_MACH_XILFPGA is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+# CONFIG_MACSEC is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_MACVTAP is not set
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_MAC_PARTITION is not set
+# CONFIG_MAG3110 is not set
+# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
+# CONFIG_MAGIC_SYSRQ_SERIAL is not set
+CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE=""
+# CONFIG_MAILBOX is not set
+# CONFIG_MANAGER_SBS is not set
+# CONFIG_MANDATORY_FILE_LOCKING is not set
+# CONFIG_MANGLE_BOOTARGS is not set
+# CONFIG_MARVELL_10G_PHY is not set
+# CONFIG_MARVELL_88X2222_PHY is not set
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_MAX1027 is not set
+# CONFIG_MAX11100 is not set
+# CONFIG_MAX1118 is not set
+# CONFIG_MAX1241 is not set
+# CONFIG_MAX1363 is not set
+# CONFIG_MAX30100 is not set
+# CONFIG_MAX30102 is not set
+# CONFIG_MAX31856 is not set
+# CONFIG_MAX44000 is not set
+# CONFIG_MAX44009 is not set
+# CONFIG_MAX517 is not set
+# CONFIG_MAX5432 is not set
+# CONFIG_MAX5481 is not set
+# CONFIG_MAX5487 is not set
+# CONFIG_MAX5821 is not set
+# CONFIG_MAX63XX_WATCHDOG is not set
+# CONFIG_MAX9611 is not set
+# CONFIG_MAXIM_THERMOCOUPLE is not set
+# CONFIG_MAXLINEAR_GPHY is not set
+CONFIG_MAY_USE_DEVLINK=y
+# CONFIG_MB1232 is not set
+# CONFIG_MC3230 is not set
+# CONFIG_MCB is not set
+# CONFIG_MCP320X is not set
+# CONFIG_MCP3422 is not set
+# CONFIG_MCP3911 is not set
+# CONFIG_MCP4018 is not set
+# CONFIG_MCP41010 is not set
+# CONFIG_MCP4131 is not set
+# CONFIG_MCP4531 is not set
+# CONFIG_MCP4725 is not set
+# CONFIG_MCP4922 is not set
+# CONFIG_MCPM is not set
+# CONFIG_MCTP is not set
+# CONFIG_MD is not set
+# CONFIG_MDIO_BCM_UNIMAC is not set
+# CONFIG_MDIO_BITBANG is not set
+# CONFIG_MDIO_BUS_MUX_GPIO is not set
+# CONFIG_MDIO_BUS_MUX_MMIOREG is not set
+# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set
+# CONFIG_MDIO_DEVICE is not set
+# CONFIG_MDIO_DEVRES is not set
+# CONFIG_MDIO_HISI_FEMAC is not set
+# CONFIG_MDIO_IPQ4019 is not set
+# CONFIG_MDIO_IPQ8064 is not set
+# CONFIG_MDIO_MSCC_MIIM is not set
+# CONFIG_MDIO_MVUSB is not set
+# CONFIG_MDIO_OCTEON is not set
+# CONFIG_MDIO_THUNDER is not set
+# CONFIG_MDIO_XPCS is not set
+# CONFIG_MD_FAULTY is not set
+# CONFIG_MEDIATEK_GE_PHY is not set
+# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set
+# CONFIG_MEDIA_ATTACH is not set
+# CONFIG_MEDIA_CAMERA_SUPPORT is not set
+# CONFIG_MEDIA_CEC_SUPPORT is not set
+# CONFIG_MEDIA_CONTROLLER is not set
+# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set
+# CONFIG_MEDIA_PCI_SUPPORT is not set
+# CONFIG_MEDIA_PLATFORM_SUPPORT is not set
+# CONFIG_MEDIA_RADIO_SUPPORT is not set
+# CONFIG_MEDIA_RC_SUPPORT is not set
+# CONFIG_MEDIA_SDR_SUPPORT is not set
+# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
+# CONFIG_MEDIA_SUPPORT is not set
+# CONFIG_MEDIA_SUPPORT_FILTER is not set
+# CONFIG_MEDIA_TEST_SUPPORT is not set
+# CONFIG_MEDIA_TUNER_E4000 is not set
+# CONFIG_MEDIA_TUNER_FC0011 is not set
+# CONFIG_MEDIA_TUNER_FC0012 is not set
+# CONFIG_MEDIA_TUNER_FC0013 is not set
+# CONFIG_MEDIA_TUNER_FC2580 is not set
+# CONFIG_MEDIA_TUNER_IT913X is not set
+# CONFIG_MEDIA_TUNER_M88RS6000T is not set
+# CONFIG_MEDIA_TUNER_MAX2165 is not set
+# CONFIG_MEDIA_TUNER_MC44S803 is not set
+# CONFIG_MEDIA_TUNER_MSI001 is not set
+# CONFIG_MEDIA_TUNER_MT2060 is not set
+# CONFIG_MEDIA_TUNER_MT2063 is not set
+# CONFIG_MEDIA_TUNER_MT20XX is not set
+# CONFIG_MEDIA_TUNER_MT2131 is not set
+# CONFIG_MEDIA_TUNER_MT2266 is not set
+# CONFIG_MEDIA_TUNER_MXL301RF is not set
+# CONFIG_MEDIA_TUNER_MXL5005S is not set
+# CONFIG_MEDIA_TUNER_MXL5007T is not set
+# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set
+# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set
+# CONFIG_MEDIA_TUNER_QT1010 is not set
+# CONFIG_MEDIA_TUNER_R820T is not set
+# CONFIG_MEDIA_TUNER_SI2157 is not set
+# CONFIG_MEDIA_TUNER_SIMPLE is not set
+# CONFIG_MEDIA_TUNER_TDA18212 is not set
+# CONFIG_MEDIA_TUNER_TDA18218 is not set
+# CONFIG_MEDIA_TUNER_TDA18250 is not set
+# CONFIG_MEDIA_TUNER_TDA18271 is not set
+# CONFIG_MEDIA_TUNER_TDA827X is not set
+# CONFIG_MEDIA_TUNER_TDA8290 is not set
+# CONFIG_MEDIA_TUNER_TDA9887 is not set
+# CONFIG_MEDIA_TUNER_TEA5761 is not set
+# CONFIG_MEDIA_TUNER_TEA5767 is not set
+# CONFIG_MEDIA_TUNER_TUA9001 is not set
+# CONFIG_MEDIA_TUNER_XC2028 is not set
+# CONFIG_MEDIA_TUNER_XC4000 is not set
+# CONFIG_MEDIA_TUNER_XC5000 is not set
+# CONFIG_MEDIA_USB_SUPPORT is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_MELLANOX_PLATFORM is not set
+CONFIG_MEMBARRIER=y
+# CONFIG_MEMORY is not set
+# CONFIG_MEMORY_FAILURE is not set
+# CONFIG_MEMORY_HOTPLUG is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_MEMTEST is not set
+# CONFIG_MEN_A21_WDT is not set
+# CONFIG_MESON_SM is not set
+CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
+# CONFIG_MFD_88PM800 is not set
+# CONFIG_MFD_88PM805 is not set
+# CONFIG_MFD_88PM860X is not set
+# CONFIG_MFD_AAT2870_CORE is not set
+# CONFIG_MFD_AC100 is not set
+# CONFIG_MFD_ACT8945A is not set
+# CONFIG_MFD_ARIZONA_I2C is not set
+# CONFIG_MFD_ARIZONA_SPI is not set
+# CONFIG_MFD_AS3711 is not set
+# CONFIG_MFD_AS3722 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_MFD_ATC260X_I2C is not set
+# CONFIG_MFD_ATMEL_FLEXCOM is not set
+# CONFIG_MFD_ATMEL_HLCDC is not set
+# CONFIG_MFD_AXP20X is not set
+# CONFIG_MFD_AXP20X_I2C is not set
+# CONFIG_MFD_BCM590XX is not set
+# CONFIG_MFD_BD9571MWV is not set
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_CPCAP is not set
+# CONFIG_MFD_CROS_EC is not set
+# CONFIG_MFD_CS5535 is not set
+# CONFIG_MFD_DA9052_I2C is not set
+# CONFIG_MFD_DA9052_SPI is not set
+# CONFIG_MFD_DA9055 is not set
+# CONFIG_MFD_DA9062 is not set
+# CONFIG_MFD_DA9063 is not set
+# CONFIG_MFD_DA9150 is not set
+# CONFIG_MFD_DLN2 is not set
+# CONFIG_MFD_EXYNOS_LPASS is not set
+# CONFIG_MFD_GATEWORKS_GSC is not set
+# CONFIG_MFD_HI6421_PMIC is not set
+# CONFIG_MFD_INTEL_M10_BMC is not set
+# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set
+# CONFIG_MFD_IQS62X is not set
+# CONFIG_MFD_JANZ_CMODIO is not set
+# CONFIG_MFD_KEMPLD is not set
+# CONFIG_MFD_LM3533 is not set
+# CONFIG_MFD_LOCHNAGAR is not set
+# CONFIG_MFD_LP3943 is not set
+# CONFIG_MFD_LP8788 is not set
+# CONFIG_MFD_MADERA is not set
+# CONFIG_MFD_MAX14577 is not set
+# CONFIG_MFD_MAX77620 is not set
+# CONFIG_MFD_MAX77650 is not set
+# CONFIG_MFD_MAX77686 is not set
+# CONFIG_MFD_MAX77693 is not set
+# CONFIG_MFD_MAX77714 is not set
+# CONFIG_MFD_MAX77843 is not set
+# CONFIG_MFD_MAX8907 is not set
+# CONFIG_MFD_MAX8925 is not set
+# CONFIG_MFD_MAX8997 is not set
+# CONFIG_MFD_MAX8998 is not set
+# CONFIG_MFD_MC13XXX is not set
+# CONFIG_MFD_MC13XXX_I2C is not set
+# CONFIG_MFD_MC13XXX_SPI is not set
+# CONFIG_MFD_MENF21BMC is not set
+# CONFIG_MFD_MP2629 is not set
+# CONFIG_MFD_MT6360 is not set
+# CONFIG_MFD_MT6397 is not set
+# CONFIG_MFD_NTXEC is not set
+# CONFIG_MFD_OMAP_USB_HOST is not set
+# CONFIG_MFD_PALMAS is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_MFD_PM8921_CORE is not set
+# CONFIG_MFD_PM8XXX is not set
+# CONFIG_MFD_QCOM_PM8008 is not set
+# CONFIG_MFD_RC5T583 is not set
+# CONFIG_MFD_RDC321X is not set
+# CONFIG_MFD_RETU is not set
+# CONFIG_MFD_RK808 is not set
+# CONFIG_MFD_RN5T618 is not set
+# CONFIG_MFD_ROHM_BD70528 is not set
+# CONFIG_MFD_ROHM_BD71828 is not set
+# CONFIG_MFD_ROHM_BD718XX is not set
+# CONFIG_MFD_ROHM_BD957XMUF is not set
+# CONFIG_MFD_RSMU_I2C is not set
+# CONFIG_MFD_RSMU_SPI is not set
+# CONFIG_MFD_RT4831 is not set
+# CONFIG_MFD_RT5033 is not set
+# CONFIG_MFD_RTSX_PCI is not set
+# CONFIG_MFD_RTSX_USB is not set
+# CONFIG_MFD_SEC_CORE is not set
+# CONFIG_MFD_SI476X_CORE is not set
+# CONFIG_MFD_SIMPLE_MFD_I2C is not set
+# CONFIG_MFD_SKY81452 is not set
+# CONFIG_MFD_SL28CPLD is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_SMSC is not set
+# CONFIG_MFD_STMFX is not set
+# CONFIG_MFD_STMPE is not set
+# CONFIG_MFD_STPMIC1 is not set
+# CONFIG_MFD_SYSCON is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC3589X is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+# CONFIG_MFD_TIMBERDALE is not set
+# CONFIG_MFD_TI_AM335X_TSCADC is not set
+# CONFIG_MFD_TI_LMU is not set
+# CONFIG_MFD_TI_LP873X is not set
+# CONFIG_MFD_TI_LP87565 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_TPS65086 is not set
+# CONFIG_MFD_TPS65090 is not set
+# CONFIG_MFD_TPS65217 is not set
+# CONFIG_MFD_TPS65218 is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_MFD_TPS65910 is not set
+# CONFIG_MFD_TPS65912 is not set
+# CONFIG_MFD_TPS65912_I2C is not set
+# CONFIG_MFD_TPS65912_SPI is not set
+# CONFIG_MFD_TPS68470 is not set
+# CONFIG_MFD_TPS80031 is not set
+# CONFIG_MFD_TQMX86 is not set
+# CONFIG_MFD_VIPERBOARD is not set
+# CONFIG_MFD_VX855 is not set
+# CONFIG_MFD_WL1273_CORE is not set
+# CONFIG_MFD_WM831X is not set
+# CONFIG_MFD_WM831X_I2C is not set
+# CONFIG_MFD_WM831X_SPI is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM8994 is not set
+# CONFIG_MG_DISK is not set
+# CONFIG_MHI_BUS is not set
+# CONFIG_MHI_BUS_EP is not set
+# CONFIG_MICREL_KS8995MA is not set
+# CONFIG_MICREL_PHY is not set
+# CONFIG_MICROCHIP_KSZ is not set
+# CONFIG_MICROCHIP_PHY is not set
+# CONFIG_MICROCHIP_PIT64B is not set
+# CONFIG_MICROCHIP_T1_PHY is not set
+# CONFIG_MICROSEMI_PHY is not set
+# CONFIG_MICROSOFT_MANA is not set
+# CONFIG_MIGRATION is not set
+CONFIG_MII=y
+# CONFIG_MIKROTIK is not set
+# CONFIG_MIKROTIK_RB532 is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_MIPS_ALCHEMY is not set
+# CONFIG_MIPS_CDMM is not set
+# CONFIG_MIPS_COBALT is not set
+# CONFIG_MIPS_FPU_EMULATOR is not set
+# CONFIG_MIPS_FP_SUPPORT is not set
+# CONFIG_MIPS_GENERIC is not set
+# CONFIG_MIPS_GENERIC_KERNEL is not set
+# CONFIG_MIPS_MALTA is not set
+# CONFIG_MIPS_O32_FP64_SUPPORT is not set
+# CONFIG_MIPS_PARAVIRT is not set
+# CONFIG_MIPS_PLATFORM_DEVICES is not set
+# CONFIG_MIPS_SEAD3 is not set
+# CONFIG_MISC_ALCOR_PCI is not set
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_MISC_RTSX_PCI is not set
+# CONFIG_MISC_RTSX_USB is not set
+# CONFIG_MISDN is not set
+# CONFIG_MISDN_AVMFRITZ is not set
+# CONFIG_MISDN_HFCPCI is not set
+# CONFIG_MISDN_HFCUSB is not set
+# CONFIG_MISDN_INFINEON is not set
+# CONFIG_MISDN_NETJET is not set
+# CONFIG_MISDN_SPEEDFAX is not set
+# CONFIG_MISDN_W6692 is not set
+# CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY is not set
+# CONFIG_MKISS is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_MLX4_EN is not set
+# CONFIG_MLX5_CORE is not set
+# CONFIG_MLX5_SF is not set
+# CONFIG_MLX90614 is not set
+# CONFIG_MLX90632 is not set
+# CONFIG_MLXFW is not set
+# CONFIG_MLXSW_CORE is not set
+# CONFIG_MLX_CPLD_PLATFORM is not set
+# CONFIG_MLX_PLATFORM is not set
+# CONFIG_MMA7455_I2C is not set
+# CONFIG_MMA7455_SPI is not set
+# CONFIG_MMA7660 is not set
+# CONFIG_MMA8452 is not set
+# CONFIG_MMA9551 is not set
+# CONFIG_MMA9553 is not set
+# CONFIG_MMC is not set
+# CONFIG_MMC35240 is not set
+# CONFIG_MMC_ARMMMCI is not set
+# CONFIG_MMC_AU1X is not set
+# CONFIG_MMC_BLOCK is not set
+CONFIG_MMC_BLOCK_MINORS=8
+# CONFIG_MMC_CAVIUM_THUNDERX is not set
+# CONFIG_MMC_CB710 is not set
+# CONFIG_MMC_CQHCI is not set
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_DW is not set
+# CONFIG_MMC_DW_ROCKCHIP is not set
+# CONFIG_MMC_HSQ is not set
+# CONFIG_MMC_JZ4740 is not set
+# CONFIG_MMC_MTK is not set
+# CONFIG_MMC_MVSDIO is not set
+# CONFIG_MMC_S3C is not set
+# CONFIG_MMC_SDHCI is not set
+# CONFIG_MMC_SDHCI_ACPI is not set
+# CONFIG_MMC_SDHCI_AM654 is not set
+# CONFIG_MMC_SDHCI_BCM_KONA is not set
+# CONFIG_MMC_SDHCI_CADENCE is not set
+# CONFIG_MMC_SDHCI_F_SDH30 is not set
+# CONFIG_MMC_SDHCI_IPROC is not set
+# CONFIG_MMC_SDHCI_MILBEAUT is not set
+# CONFIG_MMC_SDHCI_MSM is not set
+# CONFIG_MMC_SDHCI_OF_ARASAN is not set
+# CONFIG_MMC_SDHCI_OF_ASPEED is not set
+# CONFIG_MMC_SDHCI_OF_AT91 is not set
+# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set
+# CONFIG_MMC_SDHCI_OF_ESDHC is not set
+# CONFIG_MMC_SDHCI_OF_HLWD is not set
+# CONFIG_MMC_SDHCI_OMAP is not set
+# CONFIG_MMC_SDHCI_PXAV2 is not set
+# CONFIG_MMC_SDHCI_PXAV3 is not set
+# CONFIG_MMC_SDHCI_S3C is not set
+# CONFIG_MMC_SDHCI_XENON is not set
+# CONFIG_MMC_SDRICOH_CS is not set
+# CONFIG_MMC_SPI is not set
+# CONFIG_MMC_STM32_SDMMC is not set
+# CONFIG_MMC_TEST is not set
+# CONFIG_MMC_TIFM_SD is not set
+# CONFIG_MMC_TOSHIBA_PCI is not set
+# CONFIG_MMC_USDHI6ROL0 is not set
+# CONFIG_MMC_USHC is not set
+# CONFIG_MMC_VIA_SDMMC is not set
+# CONFIG_MMC_VUB300 is not set
+# CONFIG_MMIOTRACE is not set
+CONFIG_MMU=y
+CONFIG_MMU_GATHER_RCU_TABLE_FREE=y
+CONFIG_MMU_GATHER_TABLE_FREE=y
+CONFIG_MODPROBE_PATH="/sbin/modprobe"
+CONFIG_MODULES=y
+# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
+# CONFIG_MODULE_COMPRESS_GZIP is not set
+CONFIG_MODULE_COMPRESS_NONE=y
+# CONFIG_MODULE_COMPRESS_XZ is not set
+# CONFIG_MODULE_COMPRESS_ZSTD is not set
+# CONFIG_MODULE_FORCE_LOAD is not set
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODULE_SIG is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_MODULE_STRIPPED=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MOST is not set
+# CONFIG_MOTORCOMM_PHY is not set
+# CONFIG_MOUSE_APPLETOUCH is not set
+# CONFIG_MOUSE_ELAN_I2C is not set
+# CONFIG_MOUSE_GPIO is not set
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_MOUSE_PS2_FOCALTECH is not set
+# CONFIG_MOUSE_PS2_SENTELIC is not set
+# CONFIG_MOUSE_SYNAPTICS_I2C is not set
+# CONFIG_MOUSE_SYNAPTICS_USB is not set
+# CONFIG_MOXTET is not set
+# CONFIG_MPL115 is not set
+# CONFIG_MPL115_I2C is not set
+# CONFIG_MPL115_SPI is not set
+# CONFIG_MPL3115 is not set
+# CONFIG_MPLS is not set
+# CONFIG_MPTCP is not set
+# CONFIG_MPU3050_I2C is not set
+# CONFIG_MQ_IOSCHED_DEADLINE is not set
+# CONFIG_MQ_IOSCHED_KYBER is not set
+# CONFIG_MS5611 is not set
+# CONFIG_MS5637 is not set
+# CONFIG_MSCC_OCELOT_SWITCH is not set
+# CONFIG_MSDOS_FS is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_MSE102X is not set
+# CONFIG_MSI_BITMAP_SELFTEST is not set
+# CONFIG_MSI_LAPTOP is not set
+# CONFIG_MST_IRQ is not set
+CONFIG_MTD=y
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_AFS_PARTS is not set
+# CONFIG_MTD_AR7_PARTS is not set
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_MTD_BLOCK2MTD is not set
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_CMDLINE_PARTS is not set
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_DATAFLASH is not set
+# CONFIG_MTD_DOCG3 is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_GPIO_ADDR is not set
+# CONFIG_MTD_HYPERBUS is not set
+# CONFIG_MTD_IMPA7 is not set
+# CONFIG_MTD_INTEL_VR_NOR is not set
+# CONFIG_MTD_JEDECPROBE is not set
+# CONFIG_MTD_LATCH_ADDR is not set
+# CONFIG_MTD_LPDDR is not set
+# CONFIG_MTD_LPDDR2_NVM is not set
+# CONFIG_MTD_M25P80 is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MCHP23K256 is not set
+# CONFIG_MTD_MCHP48L640 is not set
+# CONFIG_MTD_MT81xx_NOR is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_MYLOADER_PARTS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_AMS_DELTA is not set
+# CONFIG_MTD_NAND_AR934X is not set
+# CONFIG_MTD_NAND_AR934X_HW_ECC is not set
+# CONFIG_MTD_NAND_ARASAN is not set
+# CONFIG_MTD_NAND_ATMEL is not set
+# CONFIG_MTD_NAND_AU1550 is not set
+# CONFIG_MTD_NAND_BCH is not set
+# CONFIG_MTD_NAND_BF5XX is not set
+# CONFIG_MTD_NAND_BRCMNAND is not set
+# CONFIG_MTD_NAND_CADENCE is not set
+# CONFIG_MTD_NAND_CAFE is not set
+# CONFIG_MTD_NAND_CM_X270 is not set
+# CONFIG_MTD_NAND_CS553X is not set
+# CONFIG_MTD_NAND_DAVINCI is not set
+# CONFIG_MTD_NAND_DENALI is not set
+# CONFIG_MTD_NAND_DENALI_DT is not set
+# CONFIG_MTD_NAND_DENALI_PCI is not set
+CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xff108018
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_DOCG4 is not set
+# CONFIG_MTD_NAND_ECC is not set
+# CONFIG_MTD_NAND_ECC_BCH is not set
+# CONFIG_MTD_NAND_ECC_MXIC is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+# CONFIG_MTD_NAND_ECC_SW_BCH is not set
+# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set
+# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set
+# CONFIG_MTD_NAND_FSL_ELBC is not set
+# CONFIG_MTD_NAND_FSL_IFC is not set
+# CONFIG_MTD_NAND_FSL_UPM is not set
+# CONFIG_MTD_NAND_FSMC is not set
+# CONFIG_MTD_NAND_GPIO is not set
+# CONFIG_MTD_NAND_GPMI_NAND is not set
+# CONFIG_MTD_NAND_HISI504 is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_MTD_NAND_INTEL_LGM is not set
+# CONFIG_MTD_NAND_JZ4740 is not set
+# CONFIG_MTD_NAND_MPC5121_NFC is not set
+# CONFIG_MTD_NAND_MTK is not set
+# CONFIG_MTD_NAND_MTK_BMT is not set
+# CONFIG_MTD_NAND_MXC is not set
+# CONFIG_MTD_NAND_MXIC is not set
+# CONFIG_MTD_NAND_NANDSIM is not set
+# CONFIG_MTD_NAND_NDFC is not set
+# CONFIG_MTD_NAND_NUC900 is not set
+# CONFIG_MTD_NAND_OMAP2 is not set
+# CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set
+# CONFIG_MTD_NAND_ORION is not set
+# CONFIG_MTD_NAND_PASEMI is not set
+# CONFIG_MTD_NAND_PLATFORM is not set
+# CONFIG_MTD_NAND_PXA3xx is not set
+# CONFIG_MTD_NAND_RB4XX is not set
+# CONFIG_MTD_NAND_RB750 is not set
+# CONFIG_MTD_NAND_RB91X is not set
+# CONFIG_MTD_NAND_RICOH is not set
+# CONFIG_MTD_NAND_S3C2410 is not set
+# CONFIG_MTD_NAND_SHARPSL is not set
+# CONFIG_MTD_NAND_SH_FLCTL is not set
+# CONFIG_MTD_NAND_SOCRATES is not set
+# CONFIG_MTD_NAND_TMIO is not set
+# CONFIG_MTD_NAND_TXX9NDFMC is not set
+CONFIG_MTD_OF_PARTS=y
+# CONFIG_MTD_ONENAND is not set
+# CONFIG_MTD_OOPS is not set
+# CONFIG_MTD_OTP is not set
+# CONFIG_MTD_PARTITIONED_MASTER is not set
+# CONFIG_MTD_PCI is not set
+# CONFIG_MTD_PCMCIA is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_PHYSMAP_COMPAT is not set
+# CONFIG_MTD_PHYSMAP_GEMINI is not set
+# CONFIG_MTD_PHYSMAP_GPIO_ADDR is not set
+# CONFIG_MTD_PHYSMAP_IXP4XX is not set
+CONFIG_MTD_PHYSMAP_OF=y
+# CONFIG_MTD_PHYSMAP_OF_GEMINI is not set
+# CONFIG_MTD_PHYSMAP_OF_VERSATILE is not set
+# CONFIG_MTD_PHYSMAP_VERSATILE is not set
+# CONFIG_MTD_PLATRAM is not set
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_RAW_NAND is not set
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_ROM is not set
+CONFIG_MTD_ROOTFS_ROOT_DEV=y
+# CONFIG_MTD_ROUTERBOOT_PARTS is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_SM_COMMON is not set
+# CONFIG_MTD_SPINAND_MT29F is not set
+# CONFIG_MTD_SPI_NAND is not set
+# CONFIG_MTD_SPI_NOR is not set
+CONFIG_MTD_SPI_NOR_SWP_DISABLE=y
+# CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE is not set
+# CONFIG_MTD_SPI_NOR_SWP_KEEP is not set
+# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=4096
+CONFIG_MTD_SPLIT=y
+# CONFIG_MTD_SPLIT_BCM63XX_FW is not set
+# CONFIG_MTD_SPLIT_BCM_WFI_FW is not set
+# CONFIG_MTD_SPLIT_BRNIMAGE_FW is not set
+# CONFIG_MTD_SPLIT_ELF_FW is not set
+# CONFIG_MTD_SPLIT_EVA_FW is not set
+# CONFIG_MTD_SPLIT_FIRMWARE is not set
+CONFIG_MTD_SPLIT_FIRMWARE_NAME="firmware"
+# CONFIG_MTD_SPLIT_FIT_FW is not set
+# CONFIG_MTD_SPLIT_H3C_VFS is not set
+# CONFIG_MTD_SPLIT_JIMAGE_FW is not set
+# CONFIG_MTD_SPLIT_LZMA_FW is not set
+# CONFIG_MTD_SPLIT_MINOR_FW is not set
+# CONFIG_MTD_SPLIT_SEAMA_FW is not set
+CONFIG_MTD_SPLIT_SQUASHFS_ROOT=y
+CONFIG_MTD_SPLIT_SUPPORT=y
+# CONFIG_MTD_SPLIT_TPLINK_FW is not set
+# CONFIG_MTD_SPLIT_TRX_FW is not set
+# CONFIG_MTD_SPLIT_UIMAGE_FW is not set
+# CONFIG_MTD_SPLIT_WRGG_FW is not set
+# CONFIG_MTD_SST25L is not set
+# CONFIG_MTD_SWAP is not set
+# CONFIG_MTD_TESTS is not set
+# CONFIG_MTD_UBI is not set
+# CONFIG_MTD_UBI_FASTMAP is not set
+# CONFIG_MTD_UBI_GLUEBI is not set
+# CONFIG_MTD_UIMAGE_SPLIT is not set
+# CONFIG_MTD_VIRT_CONCAT is not set
+# CONFIG_MTK_MMC is not set
+# CONFIG_MTK_MMSYS is not set
+CONFIG_MULTIUSER=y
+# CONFIG_MUTEX_SPIN_ON_OWNER is not set
+# CONFIG_MV643XX_ETH is not set
+# CONFIG_MVMDIO is not set
+# CONFIG_MVNETA_BM is not set
+# CONFIG_MVSW61XX_PHY is not set
+# CONFIG_MVSWITCH_PHY is not set
+# CONFIG_MV_XOR_V2 is not set
+# CONFIG_MWAVE is not set
+# CONFIG_MWL8K is not set
+# CONFIG_MXC4005 is not set
+# CONFIG_MXC6255 is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NAMESPACES is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_NATSEMI is not set
+# CONFIG_NAU7802 is not set
+# CONFIG_NBPFAXI_DMA is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_ND_BLK is not set
+# CONFIG_NE2000 is not set
+# CONFIG_NE2K_PCI is not set
+# CONFIG_NEC_MARKEINS is not set
+CONFIG_NET=y
+# CONFIG_NETCONSOLE is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVSIM is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_NETFILTER_ADVANCED is not set
+# CONFIG_NETFILTER_DEBUG is not set
+# CONFIG_NETFILTER_EGRESS is not set
+# CONFIG_NETFILTER_INGRESS is not set
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NETFILTER_NETLINK_ACCT is not set
+# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set
+# CONFIG_NETFILTER_NETLINK_HOOK is not set
+# CONFIG_NETFILTER_NETLINK_LOG is not set
+# CONFIG_NETFILTER_NETLINK_OSF is not set
+# CONFIG_NETFILTER_NETLINK_QUEUE is not set
+# CONFIG_NETFILTER_XTABLES is not set
+# CONFIG_NETFILTER_XTABLES_COMPAT is not set
+# CONFIG_NETFILTER_XT_CONNMARK is not set
+# CONFIG_NETFILTER_XT_MARK is not set
+# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_BPF is not set
+# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set
+# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
+# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set
+# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
+# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set
+# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set
+# CONFIG_NETFILTER_XT_MATCH_CPU is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ECN is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
+# CONFIG_NETFILTER_XT_MATCH_HL is not set
+# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set
+# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set
+# CONFIG_NETFILTER_XT_MATCH_L2TP is not set
+# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
+# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
+# CONFIG_NETFILTER_XT_MATCH_MAC is not set
+# CONFIG_NETFILTER_XT_MATCH_MARK is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set
+# CONFIG_NETFILTER_XT_MATCH_OSF is not set
+# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
+# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_RECENT is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set
+# CONFIG_NETFILTER_XT_MATCH_STATE is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_TIME is not set
+# CONFIG_NETFILTER_XT_MATCH_U32 is not set
+# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set
+# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
+# CONFIG_NETFILTER_XT_TARGET_CT is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+# CONFIG_NETFILTER_XT_TARGET_HL is not set
+# CONFIG_NETFILTER_XT_TARGET_HMARK is not set
+# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set
+# CONFIG_NETFILTER_XT_TARGET_LED is not set
+# CONFIG_NETFILTER_XT_TARGET_LOG is not set
+# CONFIG_NETFILTER_XT_TARGET_MARK is not set
+# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
+# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
+# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set
+# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
+# CONFIG_NETFILTER_XT_TARGET_TEE is not set
+# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set
+# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
+# CONFIG_NETFS_STATS is not set
+# CONFIG_NETFS_SUPPORT is not set
+# CONFIG_NETLABEL is not set
+# CONFIG_NETLINK_DIAG is not set
+# CONFIG_NETLINK_MMAP is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NETROM is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_NET_9P is not set
+# CONFIG_NET_ACT_BPF is not set
+# CONFIG_NET_ACT_CSUM is not set
+# CONFIG_NET_ACT_CT is not set
+# CONFIG_NET_ACT_GACT is not set
+# CONFIG_NET_ACT_GATE is not set
+# CONFIG_NET_ACT_IFE is not set
+# CONFIG_NET_ACT_IPT is not set
+# CONFIG_NET_ACT_MIRRED is not set
+# CONFIG_NET_ACT_MPLS is not set
+# CONFIG_NET_ACT_NAT is not set
+# CONFIG_NET_ACT_PEDIT is not set
+# CONFIG_NET_ACT_POLICE is not set
+# CONFIG_NET_ACT_SAMPLE is not set
+# CONFIG_NET_ACT_SIMP is not set
+# CONFIG_NET_ACT_SKBEDIT is not set
+# CONFIG_NET_ACT_SKBMOD is not set
+# CONFIG_NET_ACT_TUNNEL_KEY is not set
+# CONFIG_NET_ACT_VLAN is not set
+CONFIG_NET_CADENCE=y
+# CONFIG_NET_CALXEDA_XGMAC is not set
+CONFIG_NET_CLS=y
+# CONFIG_NET_CLS_ACT is not set
+# CONFIG_NET_CLS_BASIC is not set
+# CONFIG_NET_CLS_BPF is not set
+# CONFIG_NET_CLS_FLOW is not set
+# CONFIG_NET_CLS_FLOWER is not set
+# CONFIG_NET_CLS_FW is not set
+CONFIG_NET_CLS_IND=y
+# CONFIG_NET_CLS_MATCHALL is not set
+# CONFIG_NET_CLS_ROUTE4 is not set
+# CONFIG_NET_CLS_RSVP is not set
+# CONFIG_NET_CLS_RSVP6 is not set
+# CONFIG_NET_CLS_TCINDEX is not set
+# CONFIG_NET_CLS_U32 is not set
+CONFIG_NET_CORE=y
+# CONFIG_NET_DEVLINK is not set
+# CONFIG_NET_DEV_REFCNT_TRACKER is not set
+# CONFIG_NET_DROP_MONITOR is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_NET_DSA_AR9331 is not set
+# CONFIG_NET_DSA_BCM_SF2 is not set
+# CONFIG_NET_DSA_LANTIQ_GSWIP is not set
+# CONFIG_NET_DSA_LEGACY is not set
+# CONFIG_NET_DSA_LOOP is not set
+# CONFIG_NET_DSA_MICROCHIP_KSZ8795 is not set
+# CONFIG_NET_DSA_MICROCHIP_KSZ9477 is not set
+# CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON is not set
+# CONFIG_NET_DSA_MSCC_SEVILLE is not set
+# CONFIG_NET_DSA_MT7530 is not set
+# CONFIG_NET_DSA_MV88E6060 is not set
+# CONFIG_NET_DSA_MV88E6123_61_65 is not set
+# CONFIG_NET_DSA_MV88E6131 is not set
+# CONFIG_NET_DSA_MV88E6171 is not set
+# CONFIG_NET_DSA_MV88E6352 is not set
+# CONFIG_NET_DSA_MV88E6XXX is not set
+# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
+# CONFIG_NET_DSA_MV88E6XXX_PTP is not set
+# CONFIG_NET_DSA_QCA8K is not set
+# CONFIG_NET_DSA_REALTEK_SMI is not set
+# CONFIG_NET_DSA_SJA1105 is not set
+# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set
+# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set
+# CONFIG_NET_DSA_TAG_8021Q is not set
+# CONFIG_NET_DSA_TAG_AR9331 is not set
+# CONFIG_NET_DSA_TAG_BRCM is not set
+# CONFIG_NET_DSA_TAG_BRCM_LEGACY is not set
+# CONFIG_NET_DSA_TAG_BRCM_PREPEND is not set
+# CONFIG_NET_DSA_TAG_DSA is not set
+# CONFIG_NET_DSA_TAG_DSA_COMMON is not set
+# CONFIG_NET_DSA_TAG_EDSA is not set
+# CONFIG_NET_DSA_TAG_GSWIP is not set
+# CONFIG_NET_DSA_TAG_HELLCREEK is not set
+# CONFIG_NET_DSA_TAG_KSZ is not set
+# CONFIG_NET_DSA_TAG_LAN9303 is not set
+# CONFIG_NET_DSA_TAG_MTK is not set
+# CONFIG_NET_DSA_TAG_OCELOT is not set
+# CONFIG_NET_DSA_TAG_OCELOT_8021Q is not set
+# CONFIG_NET_DSA_TAG_QCA is not set
+# CONFIG_NET_DSA_TAG_RTL4_A is not set
+# CONFIG_NET_DSA_TAG_RTL8_4 is not set
+# CONFIG_NET_DSA_TAG_RZN1_A5PSW is not set
+# CONFIG_NET_DSA_TAG_SJA1105 is not set
+# CONFIG_NET_DSA_TAG_TRAILER is not set
+# CONFIG_NET_DSA_TAG_XRS700X is not set
+# CONFIG_NET_DSA_VITESSE_VSC73XX is not set
+# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set
+# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set
+# CONFIG_NET_DSA_XRS700X_I2C is not set
+# CONFIG_NET_DSA_XRS700X_MDIO is not set
+# CONFIG_NET_EMATCH is not set
+# CONFIG_NET_EMATCH_CANID is not set
+# CONFIG_NET_EMATCH_CMP is not set
+# CONFIG_NET_EMATCH_IPT is not set
+# CONFIG_NET_EMATCH_META is not set
+# CONFIG_NET_EMATCH_NBYTE is not set
+CONFIG_NET_EMATCH_STACK=32
+# CONFIG_NET_EMATCH_TEXT is not set
+# CONFIG_NET_EMATCH_U32 is not set
+# CONFIG_NET_FAILOVER is not set
+# CONFIG_NET_FC is not set
+# CONFIG_NET_FOU is not set
+# CONFIG_NET_FOU_IP_TUNNELS is not set
+# CONFIG_NET_IFE is not set
+# CONFIG_NET_IPGRE is not set
+CONFIG_NET_IPGRE_BROADCAST=y
+# CONFIG_NET_IPGRE_DEMUX is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPVTI is not set
+# CONFIG_NET_IP_TUNNEL is not set
+# CONFIG_NET_KEY is not set
+# CONFIG_NET_KEY_MIGRATE is not set
+# CONFIG_NET_L3_MASTER_DEV is not set
+# CONFIG_NET_MEDIATEK_STAR_EMAC is not set
+# CONFIG_NET_MPLS_GSO is not set
+# CONFIG_NET_NCSI is not set
+# CONFIG_NET_NSH is not set
+# CONFIG_NET_NS_REFCNT_TRACKER is not set
+# CONFIG_NET_PACKET_ENGINE is not set
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_NET_PTP_CLASSIFY is not set
+CONFIG_NET_RX_BUSY_POLL=y
+# CONFIG_NET_SB1000 is not set
+CONFIG_NET_SCHED=y
+# CONFIG_NET_SCH_ATM is not set
+# CONFIG_NET_SCH_CAKE is not set
+# CONFIG_NET_SCH_CBQ is not set
+# CONFIG_NET_SCH_CBS is not set
+# CONFIG_NET_SCH_CHOKE is not set
+# CONFIG_NET_SCH_CODEL is not set
+# CONFIG_NET_SCH_DEFAULT is not set
+# CONFIG_NET_SCH_DRR is not set
+# CONFIG_NET_SCH_DSMARK is not set
+# CONFIG_NET_SCH_ETF is not set
+# CONFIG_NET_SCH_ETS is not set
+CONFIG_NET_SCH_FIFO=y
+# CONFIG_NET_SCH_FQ is not set
+CONFIG_NET_SCH_FQ_CODEL=y
+# CONFIG_NET_SCH_FQ_PIE is not set
+# CONFIG_NET_SCH_GRED is not set
+# CONFIG_NET_SCH_HFSC is not set
+# CONFIG_NET_SCH_HHF is not set
+# CONFIG_NET_SCH_HTB is not set
+# CONFIG_NET_SCH_INGRESS is not set
+# CONFIG_NET_SCH_MQPRIO is not set
+# CONFIG_NET_SCH_MULTIQ is not set
+# CONFIG_NET_SCH_NETEM is not set
+# CONFIG_NET_SCH_PIE is not set
+# CONFIG_NET_SCH_PLUG is not set
+# CONFIG_NET_SCH_PRIO is not set
+# CONFIG_NET_SCH_QFQ is not set
+# CONFIG_NET_SCH_RED is not set
+# CONFIG_NET_SCH_SFB is not set
+# CONFIG_NET_SCH_SFQ is not set
+# CONFIG_NET_SCH_SKBPRIO is not set
+# CONFIG_NET_SCH_TAPRIO is not set
+# CONFIG_NET_SCH_TBF is not set
+# CONFIG_NET_SCH_TEQL is not set
+# CONFIG_NET_SCTPPROBE is not set
+# CONFIG_NET_SELFTESTS is not set
+# CONFIG_NET_SOCK_MSG is not set
+# CONFIG_NET_SWITCHDEV is not set
+# CONFIG_NET_TCPPROBE is not set
+# CONFIG_NET_TC_SKB_EXT is not set
+# CONFIG_NET_TEAM is not set
+# CONFIG_NET_TULIP is not set
+# CONFIG_NET_UDP_TUNNEL is not set
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_NET_VENDOR_8390=y
+CONFIG_NET_VENDOR_ADAPTEC=y
+CONFIG_NET_VENDOR_AGERE=y
+CONFIG_NET_VENDOR_ALACRITECH=y
+CONFIG_NET_VENDOR_ALTEON=y
+CONFIG_NET_VENDOR_AMAZON=y
+CONFIG_NET_VENDOR_AMD=y
+CONFIG_NET_VENDOR_AQUANTIA=y
+CONFIG_NET_VENDOR_ARC=y
+CONFIG_NET_VENDOR_ASIX=y
+CONFIG_NET_VENDOR_ATHEROS=y
+CONFIG_NET_VENDOR_AURORA=y
+CONFIG_NET_VENDOR_BROADCOM=y
+CONFIG_NET_VENDOR_BROCADE=y
+CONFIG_NET_VENDOR_CADENCE=y
+CONFIG_NET_VENDOR_CAVIUM=y
+CONFIG_NET_VENDOR_CHELSIO=y
+CONFIG_NET_VENDOR_CIRRUS=y
+CONFIG_NET_VENDOR_CISCO=y
+CONFIG_NET_VENDOR_CORTINA=y
+CONFIG_NET_VENDOR_DAVICOM=y
+CONFIG_NET_VENDOR_DEC=y
+CONFIG_NET_VENDOR_DLINK=y
+CONFIG_NET_VENDOR_EMULEX=y
+CONFIG_NET_VENDOR_ENGLEDER=y
+CONFIG_NET_VENDOR_EXAR=y
+CONFIG_NET_VENDOR_EZCHIP=y
+CONFIG_NET_VENDOR_FARADAY=y
+CONFIG_NET_VENDOR_FREESCALE=y
+CONFIG_NET_VENDOR_FUJITSU=y
+CONFIG_NET_VENDOR_FUNGIBLE=y
+CONFIG_NET_VENDOR_GOOGLE=y
+CONFIG_NET_VENDOR_HISILICON=y
+CONFIG_NET_VENDOR_HP=y
+CONFIG_NET_VENDOR_HUAWEI=y
+CONFIG_NET_VENDOR_I825XX=y
+CONFIG_NET_VENDOR_IBM=y
+CONFIG_NET_VENDOR_INTEL=y
+CONFIG_NET_VENDOR_LITEX=y
+CONFIG_NET_VENDOR_MARVELL=y
+CONFIG_NET_VENDOR_MELLANOX=y
+CONFIG_NET_VENDOR_MICREL=y
+CONFIG_NET_VENDOR_MICROCHIP=y
+CONFIG_NET_VENDOR_MICROSEMI=y
+CONFIG_NET_VENDOR_MICROSOFT=y
+CONFIG_NET_VENDOR_MYRI=y
+CONFIG_NET_VENDOR_NATSEMI=y
+CONFIG_NET_VENDOR_NETERION=y
+CONFIG_NET_VENDOR_NETRONOME=y
+CONFIG_NET_VENDOR_NI=y
+CONFIG_NET_VENDOR_NVIDIA=y
+CONFIG_NET_VENDOR_OKI=y
+CONFIG_NET_VENDOR_PACKET_ENGINES=y
+CONFIG_NET_VENDOR_PENSANDO=y
+CONFIG_NET_VENDOR_QLOGIC=y
+CONFIG_NET_VENDOR_QUALCOMM=y
+CONFIG_NET_VENDOR_RDC=y
+CONFIG_NET_VENDOR_REALTEK=y
+CONFIG_NET_VENDOR_RENESAS=y
+CONFIG_NET_VENDOR_ROCKER=y
+CONFIG_NET_VENDOR_SAMSUNG=y
+CONFIG_NET_VENDOR_SEEQ=y
+CONFIG_NET_VENDOR_SILAN=y
+CONFIG_NET_VENDOR_SIS=y
+CONFIG_NET_VENDOR_SMSC=y
+CONFIG_NET_VENDOR_SOCIONEXT=y
+CONFIG_NET_VENDOR_SOLARFLARE=y
+CONFIG_NET_VENDOR_STMICRO=y
+CONFIG_NET_VENDOR_SUN=y
+CONFIG_NET_VENDOR_SYNOPSYS=y
+CONFIG_NET_VENDOR_TEHUTI=y
+CONFIG_NET_VENDOR_TI=y
+CONFIG_NET_VENDOR_TOSHIBA=y
+CONFIG_NET_VENDOR_VERTEXCOM=y
+CONFIG_NET_VENDOR_VIA=y
+CONFIG_NET_VENDOR_WANGXUN=y
+CONFIG_NET_VENDOR_WIZNET=y
+CONFIG_NET_VENDOR_XILINX=y
+CONFIG_NET_VENDOR_XIRCOM=y
+# CONFIG_NET_VRF is not set
+# CONFIG_NET_XGENE is not set
+CONFIG_NEW_LEDS=y
+# CONFIG_NFC is not set
+# CONFIG_NFP is not set
+# CONFIG_NFSD is not set
+# CONFIG_NFSD_V2_ACL is not set
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+# CONFIG_NFS_ACL_SUPPORT is not set
+CONFIG_NFS_COMMON=y
+# CONFIG_NFS_DISABLE_UDP_SUPPORT is not set
+# CONFIG_NFS_FS is not set
+# CONFIG_NFS_FSCACHE is not set
+# CONFIG_NFS_SWAP is not set
+# CONFIG_NFS_V2 is not set
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_V4_1 is not set
+# CONFIG_NFTL is not set
+# CONFIG_NFT_BRIDGE_META is not set
+# CONFIG_NFT_BRIDGE_REJECT is not set
+# CONFIG_NFT_CONNLIMIT is not set
+# CONFIG_NFT_DUP_IPV4 is not set
+# CONFIG_NFT_DUP_IPV6 is not set
+# CONFIG_NFT_FIB_IPV4 is not set
+# CONFIG_NFT_FIB_IPV6 is not set
+# CONFIG_NFT_FIB_NETDEV is not set
+# CONFIG_NFT_FLOW_OFFLOAD is not set
+# CONFIG_NFT_OBJREF is not set
+# CONFIG_NFT_OSF is not set
+# CONFIG_NFT_REJECT_NETDEV is not set
+# CONFIG_NFT_RT is not set
+# CONFIG_NFT_SET_BITMAP is not set
+# CONFIG_NFT_SOCKET is not set
+# CONFIG_NFT_SYNPROXY is not set
+# CONFIG_NFT_TPROXY is not set
+# CONFIG_NFT_TUNNEL is not set
+# CONFIG_NFT_XFRM is not set
+# CONFIG_NF_CONNTRACK is not set
+# CONFIG_NF_CONNTRACK_AMANDA is not set
+# CONFIG_NF_CONNTRACK_BRIDGE is not set
+# CONFIG_NF_CONNTRACK_EVENTS is not set
+# CONFIG_NF_CONNTRACK_FTP is not set
+# CONFIG_NF_CONNTRACK_H323 is not set
+# CONFIG_NF_CONNTRACK_IPV4 is not set
+# CONFIG_NF_CONNTRACK_IPV6 is not set
+# CONFIG_NF_CONNTRACK_IRC is not set
+# CONFIG_NF_CONNTRACK_LABELS is not set
+# CONFIG_NF_CONNTRACK_MARK is not set
+# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
+# CONFIG_NF_CONNTRACK_PPTP is not set
+CONFIG_NF_CONNTRACK_PROCFS=y
+# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
+# CONFIG_NF_CONNTRACK_SANE is not set
+# CONFIG_NF_CONNTRACK_SECMARK is not set
+# CONFIG_NF_CONNTRACK_SIP is not set
+# CONFIG_NF_CONNTRACK_SNMP is not set
+# CONFIG_NF_CONNTRACK_TFTP is not set
+# CONFIG_NF_CONNTRACK_TIMEOUT is not set
+# CONFIG_NF_CONNTRACK_TIMESTAMP is not set
+# CONFIG_NF_CONNTRACK_ZONES is not set
+# CONFIG_NF_CT_NETLINK is not set
+# CONFIG_NF_CT_NETLINK_HELPER is not set
+# CONFIG_NF_CT_NETLINK_TIMEOUT is not set
+# CONFIG_NF_CT_PROTO_DCCP is not set
+# CONFIG_NF_CT_PROTO_GRE is not set
+# CONFIG_NF_CT_PROTO_SCTP is not set
+# CONFIG_NF_CT_PROTO_UDPLITE is not set
+# CONFIG_NF_DEFRAG_IPV4 is not set
+# CONFIG_NF_DUP_IPV4 is not set
+# CONFIG_NF_DUP_IPV6 is not set
+# CONFIG_NF_FLOW_TABLE is not set
+# CONFIG_NF_FLOW_TABLE_PROCFS is not set
+# CONFIG_NF_LOG_ARP is not set
+CONFIG_NF_LOG_IPV4=y
+CONFIG_NF_LOG_IPV6=y
+CONFIG_NF_LOG_SYSLOG=y
+# CONFIG_NF_NAT is not set
+# CONFIG_NF_NAT_AMANDA is not set
+# CONFIG_NF_NAT_FTP is not set
+# CONFIG_NF_NAT_H323 is not set
+# CONFIG_NF_NAT_IPV6 is not set
+# CONFIG_NF_NAT_IRC is not set
+CONFIG_NF_NAT_MASQUERADE_IPV4=y
+CONFIG_NF_NAT_MASQUERADE_IPV6=y
+# CONFIG_NF_NAT_NEEDED is not set
+# CONFIG_NF_NAT_PPTP is not set
+# CONFIG_NF_NAT_PROTO_GRE is not set
+# CONFIG_NF_NAT_SIP is not set
+# CONFIG_NF_NAT_SNMP_BASIC is not set
+# CONFIG_NF_NAT_TFTP is not set
+# CONFIG_NF_REJECT_IPV4 is not set
+# CONFIG_NF_REJECT_IPV6 is not set
+# CONFIG_NF_SOCKET_IPV4 is not set
+# CONFIG_NF_SOCKET_IPV6 is not set
+# CONFIG_NF_TABLES is not set
+CONFIG_NF_TABLES_ARP=y
+CONFIG_NF_TABLES_BRIDGE=y
+CONFIG_NF_TABLES_INET=y
+CONFIG_NF_TABLES_IPV4=y
+CONFIG_NF_TABLES_IPV6=y
+CONFIG_NF_TABLES_NETDEV=y
+# CONFIG_NF_TABLES_SET is not set
+# CONFIG_NF_TPROXY_IPV4 is not set
+# CONFIG_NF_TPROXY_IPV6 is not set
+# CONFIG_NI65 is not set
+# CONFIG_NI903X_WDT is not set
+# CONFIG_NIC7018_WDT is not set
+# CONFIG_NILFS2_FS is not set
+# CONFIG_NIU is not set
+# CONFIG_NI_XGE_MANAGEMENT_ENET is not set
+CONFIG_NLATTR=y
+# CONFIG_NLMON is not set
+# CONFIG_NLM_XLP_BOARD is not set
+# CONFIG_NLM_XLR_BOARD is not set
+# CONFIG_NLS is not set
+# CONFIG_NLS_ASCII is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_MAC_CELTIC is not set
+# CONFIG_NLS_MAC_CENTEURO is not set
+# CONFIG_NLS_MAC_CROATIAN is not set
+# CONFIG_NLS_MAC_CYRILLIC is not set
+# CONFIG_NLS_MAC_GAELIC is not set
+# CONFIG_NLS_MAC_GREEK is not set
+# CONFIG_NLS_MAC_ICELAND is not set
+# CONFIG_NLS_MAC_INUIT is not set
+# CONFIG_NLS_MAC_ROMAN is not set
+# CONFIG_NLS_MAC_ROMANIAN is not set
+# CONFIG_NLS_MAC_TURKISH is not set
+# CONFIG_NLS_UTF8 is not set
+CONFIG_NMI_LOG_BUF_SHIFT=13
+# CONFIG_NOA1305 is not set
+# CONFIG_NOP_USB_XCEIV is not set
+# CONFIG_NORTEL_HERMES is not set
+# CONFIG_NOTIFIER_ERROR_INJECTION is not set
+# CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT is not set
+# CONFIG_NOZOMI is not set
+# CONFIG_NO_BOOTMEM is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_NO_HZ_FULL is not set
+# CONFIG_NO_HZ_IDLE is not set
+CONFIG_NR_CPUS=256
+CONFIG_NR_LRU_GENS=7
+# CONFIG_NS83820 is not set
+# CONFIG_NTB is not set
+# CONFIG_NTFS3_FS is not set
+# CONFIG_NTFS_DEBUG is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_NTP_PPS is not set
+# CONFIG_NULL_TTY is not set
+# CONFIG_NUMA is not set
+# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set
+# CONFIG_NVM is not set
+# CONFIG_NVMEM is not set
+# CONFIG_NVMEM_BCM_OCOTP is not set
+# CONFIG_NVMEM_IMX_OCOTP is not set
+# CONFIG_NVMEM_NINTENDO_OTP is not set
+# CONFIG_NVMEM_REBOOT_MODE is not set
+CONFIG_NVMEM_RMEM=y
+# CONFIG_NVMEM_SYSFS is not set
+# CONFIG_NVME_AUTH is not set
+# CONFIG_NVME_FC is not set
+# CONFIG_NVME_TARGET is not set
+# CONFIG_NVME_TCP is not set
+# CONFIG_NVME_VERBOSE_ERRORS is not set
+# CONFIG_NVRAM is not set
+# CONFIG_NV_TCO is not set
+# CONFIG_NXP_C45_TJA11XX_PHY is not set
+# CONFIG_NXP_STB220 is not set
+# CONFIG_NXP_STB225 is not set
+# CONFIG_NXP_TJA11XX_PHY is not set
+# CONFIG_N_GSM is not set
+# CONFIG_OABI_COMPAT is not set
+# CONFIG_OBS600 is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_OCTEON_EP is not set
+# CONFIG_OCTEONTX2_AF is not set
+# CONFIG_OCTEONTX2_PF is not set
+# CONFIG_OF_MDIO is not set
+# CONFIG_OF_OVERLAY is not set
+CONFIG_OF_RESERVED_MEM=y
+# CONFIG_OF_UNITTEST is not set
+# CONFIG_OID_REGISTRY is not set
+# CONFIG_OMAP2_DSS_DEBUG is not set
+# CONFIG_OMAP2_DSS_DEBUGFS is not set
+# CONFIG_OMAP2_DSS_SDI is not set
+# CONFIG_OMAP_OCP2SCP is not set
+# CONFIG_OMAP_USB2 is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_OPENVSWITCH is not set
+# CONFIG_OPEN_DICE is not set
+# CONFIG_OPROFILE is not set
+# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set
+# CONFIG_OPT3001 is not set
+CONFIG_OPTIMIZE_INLINING=y
+# CONFIG_ORANGEFS_FS is not set
+# CONFIG_ORION_WATCHDOG is not set
+# CONFIG_OSF_PARTITION is not set
+CONFIG_OVERLAY_FS=y
+# CONFIG_OVERLAY_FS_INDEX is not set
+# CONFIG_OVERLAY_FS_METACOPY is not set
+CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y
+# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set
+CONFIG_OVERLAY_FS_XINO_AUTO=y
+# CONFIG_OWL_LOADER is not set
+# CONFIG_P54_COMMON is not set
+# CONFIG_PA12203001 is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_DIAG is not set
+# CONFIG_PACKING is not set
+# CONFIG_PAGE_EXTENSION is not set
+# CONFIG_PAGE_OWNER is not set
+# CONFIG_PAGE_POISONING is not set
+# CONFIG_PAGE_POOL_STATS is not set
+# CONFIG_PAGE_REPORTING is not set
+# CONFIG_PAGE_SIZE_16KB is not set
+# CONFIG_PAGE_SIZE_32KB is not set
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_64KB is not set
+# CONFIG_PAGE_SIZE_8KB is not set
+# CONFIG_PAGE_SIZE_LESS_THAN_64KB is not set
+# CONFIG_PAGE_TABLE_CHECK is not set
+# CONFIG_PALMAS_GPADC is not set
+# CONFIG_PANASONIC_LAPTOP is not set
+# CONFIG_PANEL is not set
+CONFIG_PANIC_ON_OOPS=y
+CONFIG_PANIC_ON_OOPS_VALUE=1
+CONFIG_PANIC_TIMEOUT=1
+# CONFIG_PANTHERLORD_FF is not set
+# CONFIG_PARAVIRT is not set
+# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
+# CONFIG_PARPORT is not set
+# CONFIG_PARPORT_1284 is not set
+# CONFIG_PARPORT_AX88796 is not set
+# CONFIG_PARPORT_GSC is not set
+# CONFIG_PARPORT_PC is not set
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARASAN_CF is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_ATP867X is not set
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CS5535 is not set
+# CONFIG_PATA_CS5536 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IMX is not set
+# CONFIG_PATA_ISAPNP is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_LEGACY is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NINJA32 is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_NS87415 is not set
+# CONFIG_PATA_OCTEON_CF is not set
+# CONFIG_PATA_OF_PLATFORM is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PCMCIA is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_PLATFORM is not set
+# CONFIG_PATA_QDI is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RDC is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SCH is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_TOSHIBA is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+# CONFIG_PATA_WINBOND_VLB is not set
+# CONFIG_PC104 is not set
+# CONFIG_PC300TOO is not set
+# CONFIG_PCCARD is not set
+# CONFIG_PCH_DMA is not set
+# CONFIG_PCH_GBE is not set
+# CONFIG_PCH_PHUB is not set
+# CONFIG_PCI is not set
+# CONFIG_PCI200SYN is not set
+# CONFIG_PCIEAER is not set
+# CONFIG_PCIEAER_INJECT is not set
+# CONFIG_PCIEASPM is not set
+# CONFIG_PCIEPORTBUS is not set
+# CONFIG_PCIE_AL is not set
+# CONFIG_PCIE_ALTERA is not set
+# CONFIG_PCIE_ARMADA_8K is not set
+CONFIG_PCIE_BUS_DEFAULT=y
+# CONFIG_PCIE_BUS_PEER2PEER is not set
+# CONFIG_PCIE_BUS_PERFORMANCE is not set
+# CONFIG_PCIE_BUS_SAFE is not set
+# CONFIG_PCIE_BUS_TUNE_OFF is not set
+# CONFIG_PCIE_BW is not set
+# CONFIG_PCIE_CADENCE_HOST is not set
+# CONFIG_PCIE_CADENCE_PLAT_HOST is not set
+# CONFIG_PCIE_DPC is not set
+# CONFIG_PCIE_DW is not set
+# CONFIG_PCIE_DW_HOST is not set
+# CONFIG_PCIE_DW_PLAT is not set
+# CONFIG_PCIE_DW_PLAT_HOST is not set
+# CONFIG_PCIE_ECRC is not set
+# CONFIG_PCIE_IPROC is not set
+# CONFIG_PCIE_KIRIN is not set
+# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set
+# CONFIG_PCIE_MICROCHIP_HOST is not set
+# CONFIG_PCIE_PTM is not set
+# CONFIG_PCIE_ROCKCHIP_DW_HOST is not set
+# CONFIG_PCIE_XILINX is not set
+# CONFIG_PCIPCWATCHDOG is not set
+# CONFIG_PCI_ATMEL is not set
+# CONFIG_PCI_CNB20LE_QUIRK is not set
+# CONFIG_PCI_DEBUG is not set
+# CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set
+# CONFIG_PCI_ENDPOINT is not set
+# CONFIG_PCI_ENDPOINT_TEST is not set
+# CONFIG_PCI_FTPCI100 is not set
+# CONFIG_PCI_HERMES is not set
+# CONFIG_PCI_HISI is not set
+# CONFIG_PCI_HOST_GENERIC is not set
+# CONFIG_PCI_HOST_THUNDER_ECAM is not set
+# CONFIG_PCI_HOST_THUNDER_PEM is not set
+# CONFIG_PCI_IOV is not set
+# CONFIG_PCI_J721E_HOST is not set
+# CONFIG_PCI_LAYERSCAPE is not set
+# CONFIG_PCI_MESON is not set
+# CONFIG_PCI_MSI is not set
+# CONFIG_PCI_PASID is not set
+# CONFIG_PCI_PF_STUB is not set
+# CONFIG_PCI_PRI is not set
+CONFIG_PCI_QUIRKS=y
+# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set
+# CONFIG_PCI_STUB is not set
+# CONFIG_PCI_SW_SWITCHTEC is not set
+CONFIG_PCI_SYSCALL=y
+# CONFIG_PCI_V3_SEMI is not set
+# CONFIG_PCI_XGENE is not set
+# CONFIG_PCMCIA is not set
+# CONFIG_PCMCIA_3C574 is not set
+# CONFIG_PCMCIA_3C589 is not set
+# CONFIG_PCMCIA_AHA152X is not set
+# CONFIG_PCMCIA_ATMEL is not set
+# CONFIG_PCMCIA_AXNET is not set
+# CONFIG_PCMCIA_DEBUG is not set
+# CONFIG_PCMCIA_FDOMAIN is not set
+# CONFIG_PCMCIA_FMVJ18X is not set
+# CONFIG_PCMCIA_HERMES is not set
+# CONFIG_PCMCIA_LOAD_CIS is not set
+# CONFIG_PCMCIA_NINJA_SCSI is not set
+# CONFIG_PCMCIA_NMCLAN is not set
+# CONFIG_PCMCIA_PCNET is not set
+# CONFIG_PCMCIA_QLOGIC is not set
+# CONFIG_PCMCIA_RAYCS is not set
+# CONFIG_PCMCIA_SMC91C92 is not set
+# CONFIG_PCMCIA_SPECTRUM is not set
+# CONFIG_PCMCIA_SYM53C500 is not set
+# CONFIG_PCMCIA_WL3501 is not set
+# CONFIG_PCMCIA_XIRC2PS is not set
+# CONFIG_PCMCIA_XIRCOM is not set
+# CONFIG_PCNET32 is not set
+CONFIG_PCPU_DEV_REFCNT=y
+# CONFIG_PCSPKR_PLATFORM is not set
+# CONFIG_PCS_XPCS is not set
+# CONFIG_PD6729 is not set
+# CONFIG_PDA_POWER is not set
+# CONFIG_PDC_ADMA is not set
+# CONFIG_PECI is not set
+# CONFIG_PERCPU_STATS is not set
+# CONFIG_PERCPU_TEST is not set
+# CONFIG_PERF_EVENTS is not set
+# CONFIG_PERF_EVENTS_AMD_POWER is not set
+# CONFIG_PERSISTENT_KEYRINGS is not set
+# CONFIG_PHANTOM is not set
+# CONFIG_PHONET is not set
+# CONFIG_PHYLIB is not set
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+# CONFIG_PHY_CADENCE_DP is not set
+# CONFIG_PHY_CADENCE_DPHY is not set
+# CONFIG_PHY_CADENCE_DPHY_RX is not set
+# CONFIG_PHY_CADENCE_SALVO is not set
+# CONFIG_PHY_CADENCE_SIERRA is not set
+# CONFIG_PHY_CADENCE_TORRENT is not set
+# CONFIG_PHY_CAN_TRANSCEIVER is not set
+# CONFIG_PHY_CPCAP_USB is not set
+# CONFIG_PHY_EXYNOS_DP_VIDEO is not set
+# CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set
+# CONFIG_PHY_FSL_IMX8MQ_USB is not set
+# CONFIG_PHY_FSL_IMX8M_PCIE is not set
+# CONFIG_PHY_INTEL_KEEMBAY_EMMC is not set
+# CONFIG_PHY_LAN966X_SERDES is not set
+# CONFIG_PHY_MAPPHONE_MDM6600 is not set
+# CONFIG_PHY_MIXEL_MIPI_DPHY is not set
+# CONFIG_PHY_MTK_HDMI is not set
+# CONFIG_PHY_MVEBU_CP110_UTMI is not set
+# CONFIG_PHY_OCELOT_SERDES is not set
+# CONFIG_PHY_PXA_28NM_HSIC is not set
+# CONFIG_PHY_PXA_28NM_USB2 is not set
+# CONFIG_PHY_QCOM_DWC3 is not set
+# CONFIG_PHY_QCOM_USB_HS is not set
+# CONFIG_PHY_QCOM_USB_HSIC is not set
+# CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY is not set
+# CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set
+# CONFIG_PHY_ROCKCHIP_INNO_USB2 is not set
+# CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY is not set
+# CONFIG_PHY_SAMSUNG_USB2 is not set
+# CONFIG_PHY_TUSB1210 is not set
+# CONFIG_PHY_XGENE is not set
+# CONFIG_PI433 is not set
+# CONFIG_PID_IN_CONTEXTIDR is not set
+# CONFIG_PID_NS is not set
+CONFIG_PINCONF=y
+# CONFIG_PINCTRL is not set
+# CONFIG_PINCTRL_AMD is not set
+# CONFIG_PINCTRL_AXP209 is not set
+# CONFIG_PINCTRL_CEDARFORK is not set
+# CONFIG_PINCTRL_EXYNOS is not set
+# CONFIG_PINCTRL_EXYNOS5440 is not set
+# CONFIG_PINCTRL_ICELAKE is not set
+# CONFIG_PINCTRL_INGENIC is not set
+# CONFIG_PINCTRL_MCP23S08 is not set
+CONFIG_PINCTRL_MICROCHIP_SGPIO=y
+# CONFIG_PINCTRL_MSM8X74 is not set
+# CONFIG_PINCTRL_MT6779 is not set
+# CONFIG_PINCTRL_MT8167 is not set
+# CONFIG_PINCTRL_MT8192 is not set
+# CONFIG_PINCTRL_MTK_V2 is not set
+# CONFIG_PINCTRL_OCELOT is not set
+# CONFIG_PINCTRL_ROCKCHIP is not set
+CONFIG_PINCTRL_SINGLE=y
+# CONFIG_PINCTRL_STMFX is not set
+# CONFIG_PINCTRL_SX150X is not set
+# CONFIG_PING is not set
+CONFIG_PINMUX=y
+# CONFIG_PKCS7_MESSAGE_PARSER is not set
+# CONFIG_PL310_ERRATA_588369 is not set
+# CONFIG_PL310_ERRATA_727915 is not set
+# CONFIG_PL310_ERRATA_753970 is not set
+# CONFIG_PL310_ERRATA_769419 is not set
+# CONFIG_PL320_MBOX is not set
+# CONFIG_PL330_DMA is not set
+# CONFIG_PLATFORM_MHU is not set
+# CONFIG_PLAT_SPEAR is not set
+# CONFIG_PLIP is not set
+# CONFIG_PLX_DMA is not set
+# CONFIG_PLX_HERMES is not set
+# CONFIG_PM is not set
+# CONFIG_PMBUS is not set
+# CONFIG_PMC_MSP is not set
+# CONFIG_PMIC_ADP5520 is not set
+# CONFIG_PMIC_DA903X is not set
+# CONFIG_PMS7003 is not set
+# CONFIG_PM_AUTOSLEEP is not set
+# CONFIG_PM_DEBUG is not set
+# CONFIG_PM_DEVFREQ is not set
+# CONFIG_PM_WAKELOCKS is not set
+# CONFIG_POSIX_CPU_TIMERS_TASK_WORK is not set
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_POSIX_TIMERS=y
+# CONFIG_POWERCAP is not set
+# CONFIG_POWER_AVS is not set
+# CONFIG_POWER_RESET is not set
+# CONFIG_POWER_RESET_BRCMKONA is not set
+# CONFIG_POWER_RESET_BRCMSTB is not set
+# CONFIG_POWER_RESET_GPIO is not set
+# CONFIG_POWER_RESET_GPIO_RESTART is not set
+# CONFIG_POWER_RESET_LINKSTATION is not set
+# CONFIG_POWER_RESET_LTC2952 is not set
+# CONFIG_POWER_RESET_PIIX4_POWEROFF is not set
+# CONFIG_POWER_RESET_REGULATOR is not set
+# CONFIG_POWER_RESET_RESTART is not set
+# CONFIG_POWER_RESET_SYSCON is not set
+# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set
+# CONFIG_POWER_RESET_VERSATILE is not set
+# CONFIG_POWER_RESET_XGENE is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+# CONFIG_POWER_SUPPLY_HWMON is not set
+# CONFIG_PPC4xx_GPIO is not set
+# CONFIG_PPC_16K_PAGES is not set
+# CONFIG_PPC_256K_PAGES is not set
+CONFIG_PPC_4K_PAGES=y
+# CONFIG_PPC_64K_PAGES is not set
+# CONFIG_PPC_DISABLE_WERROR is not set
+# CONFIG_PPC_EMULATED_STATS is not set
+# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set
+# CONFIG_PPP is not set
+# CONFIG_PPPOATM is not set
+# CONFIG_PPPOE is not set
+# CONFIG_PPPOL2TP is not set
+# CONFIG_PPP_ASYNC is not set
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPP_DEFLATE is not set
+CONFIG_PPP_FILTER=y
+# CONFIG_PPP_MPPE is not set
+CONFIG_PPP_MULTILINK=y
+# CONFIG_PPP_SYNC_TTY is not set
+# CONFIG_PPS is not set
+# CONFIG_PPS_CLIENT_GPIO is not set
+# CONFIG_PPS_CLIENT_KTIMER is not set
+# CONFIG_PPS_CLIENT_LDISC is not set
+# CONFIG_PPS_CLIENT_PARPORT is not set
+# CONFIG_PPS_DEBUG is not set
+# CONFIG_PPTP is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_PREEMPTIRQ_DELAY_TEST is not set
+# CONFIG_PREEMPTIRQ_EVENTS is not set
+# CONFIG_PREEMPT_BUILD is not set
+# CONFIG_PREEMPT_DYNAMIC is not set
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_NONE_BUILD is not set
+# CONFIG_PREEMPT_TRACER is not set
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PRESTERA is not set
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_PRIME_NUMBERS is not set
+CONFIG_PRINTK=y
+# CONFIG_PRINTK_CALLER is not set
+# CONFIG_PRINTK_INDEX is not set
+CONFIG_PRINTK_NMI=y
+CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
+# CONFIG_PRINTK_TIME is not set
+CONFIG_PRINT_STACK_DEPTH=64
+# CONFIG_PRISM2_USB is not set
+# CONFIG_PRISM54 is not set
+# CONFIG_PROC_CHILDREN is not set
+CONFIG_PROC_FS=y
+# CONFIG_PROC_KCORE is not set
+# CONFIG_PROC_PAGE_MONITOR is not set
+# CONFIG_PROC_STRIPPED is not set
+CONFIG_PROC_SYSCTL=y
+# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILING is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_PROVE_RAW_LOCK_NESTING is not set
+# CONFIG_PROVE_RCU is not set
+# CONFIG_PROVE_RCU_LIST is not set
+# CONFIG_PROVE_RCU_REPEATEDLY is not set
+# CONFIG_PSAMPLE is not set
+# CONFIG_PSB6970_PHY is not set
+# CONFIG_PSI is not set
+# CONFIG_PSTORE is not set
+# CONFIG_PTDUMP_DEBUGFS is not set
+# CONFIG_PTP_1588_CLOCK is not set
+# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set
+# CONFIG_PTP_1588_CLOCK_IDTCM is not set
+# CONFIG_PTP_1588_CLOCK_IXP46X is not set
+# CONFIG_PTP_1588_CLOCK_KVM is not set
+# CONFIG_PTP_1588_CLOCK_OCP is not set
+# CONFIG_PTP_1588_CLOCK_OPTIONAL is not set
+# CONFIG_PTP_1588_CLOCK_PCH is not set
+# CONFIG_PTP_1588_CLOCK_VMW is not set
+# CONFIG_PUBLIC_KEY_ALGO_RSA is not set
+# CONFIG_PVPANIC is not set
+# CONFIG_PWM is not set
+# CONFIG_PWM_ATMEL_TCB is not set
+# CONFIG_PWM_CLK is not set
+# CONFIG_PWM_DEBUG is not set
+# CONFIG_PWM_DWC is not set
+# CONFIG_PWM_FSL_FTM is not set
+# CONFIG_PWM_PCA9685 is not set
+# CONFIG_PWM_ROCKCHIP is not set
+# CONFIG_PWM_XILINX is not set
+CONFIG_PWRSEQ_EMMC=y
+# CONFIG_PWRSEQ_SD8787 is not set
+CONFIG_PWRSEQ_SIMPLE=y
+# CONFIG_QCA7000 is not set
+# CONFIG_QCA7000_SPI is not set
+# CONFIG_QCA7000_UART is not set
+# CONFIG_QCOM_EMAC is not set
+# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set
+# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set
+# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set
+# CONFIG_QCOM_HIDMA is not set
+# CONFIG_QCOM_HIDMA_MGMT is not set
+# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set
+# CONFIG_QCOM_SCM is not set
+# CONFIG_QCOM_SPMI_ADC5 is not set
+# CONFIG_QCOM_SPMI_IADC is not set
+# CONFIG_QCOM_SPMI_TEMP_ALARM is not set
+# CONFIG_QCOM_SPMI_VADC is not set
+# CONFIG_QED is not set
+# CONFIG_QLA3XXX is not set
+# CONFIG_QLCNIC is not set
+# CONFIG_QLGE is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX6FS_FS is not set
+# CONFIG_QORIQ_CPUFREQ is not set
+# CONFIG_QORIQ_THERMAL is not set
+# CONFIG_QRTR is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_QUEUED_LOCK_STAT is not set
+# CONFIG_QUICC_ENGINE is not set
+# CONFIG_QUOTA is not set
+# CONFIG_QUOTACTL is not set
+# CONFIG_QUOTA_DEBUG is not set
+# CONFIG_R3964 is not set
+# CONFIG_R6040 is not set
+# CONFIG_R8169 is not set
+# CONFIG_R8188EU is not set
+# CONFIG_R8712U is not set
+# CONFIG_R8723AU is not set
+# CONFIG_RADIO_ADAPTERS is not set
+# CONFIG_RADIO_AZTECH is not set
+# CONFIG_RADIO_CADET is not set
+# CONFIG_RADIO_GEMTEK is not set
+# CONFIG_RADIO_MAXIRADIO is not set
+# CONFIG_RADIO_RTRACK is not set
+# CONFIG_RADIO_RTRACK2 is not set
+# CONFIG_RADIO_SF16FMI is not set
+# CONFIG_RADIO_SF16FMR2 is not set
+# CONFIG_RADIO_TERRATEC is not set
+# CONFIG_RADIO_TRUST is not set
+# CONFIG_RADIO_TYPHOON is not set
+# CONFIG_RADIO_ZOLTRIX is not set
+# CONFIG_RAID6_PQ_BENCHMARK is not set
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_RALINK is not set
+# CONFIG_RANDOM32_SELFTEST is not set
+# CONFIG_RANDOMIZE_BASE is not set
+# CONFIG_RANDOMIZE_KSTACK_OFFSET is not set
+# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set
+# CONFIG_RANDOM_TRUST_BOOTLOADER is not set
+# CONFIG_RANDOM_TRUST_CPU is not set
+# CONFIG_RAPIDIO is not set
+# CONFIG_RAS is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_RBTREE_TEST is not set
+# CONFIG_RCU_BOOST is not set
+CONFIG_RCU_CPU_STALL_TIMEOUT=21
+# CONFIG_RCU_EQS_DEBUG is not set
+# CONFIG_RCU_EXPEDITE_BOOT is not set
+# CONFIG_RCU_EXPERT is not set
+CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=20
+CONFIG_RCU_KTHREAD_PRIO=0
+CONFIG_RCU_NEED_SEGCBLIST=y
+# CONFIG_RCU_PERF_TEST is not set
+# CONFIG_RCU_REF_SCALE_TEST is not set
+# CONFIG_RCU_SCALE_TEST is not set
+CONFIG_RCU_STALL_COMMON=y
+# CONFIG_RCU_STRICT_GRACE_PERIOD is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_RCU_TORTURE_TEST_SLOW_INIT_DELAY=3
+# CONFIG_RCU_TRACE is not set
+# CONFIG_RC_ATI_REMOTE is not set
+# CONFIG_RC_CORE is not set
+# CONFIG_RC_DECODERS is not set
+# CONFIG_RC_LOOPBACK is not set
+# CONFIG_RC_MAP is not set
+# CONFIG_RDS is not set
+# CONFIG_RD_BZIP2 is not set
+# CONFIG_RD_GZIP is not set
+# CONFIG_RD_LZ4 is not set
+# CONFIG_RD_LZMA is not set
+# CONFIG_RD_LZO is not set
+# CONFIG_RD_XZ is not set
+# CONFIG_RD_ZSTD is not set
+# CONFIG_READABLE_ASM is not set
+# CONFIG_READ_ONLY_THP_FOR_FS is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_REDWOOD is not set
+# CONFIG_REED_SOLOMON_TEST is not set
+# CONFIG_REGMAP is not set
+# CONFIG_REGMAP_I2C is not set
+# CONFIG_REGMAP_MMIO is not set
+# CONFIG_REGMAP_SPI is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_REGULATOR_88PG86X is not set
+# CONFIG_REGULATOR_ACT8865 is not set
+# CONFIG_REGULATOR_AD5398 is not set
+# CONFIG_REGULATOR_ANATOP is not set
+# CONFIG_REGULATOR_DA9121 is not set
+# CONFIG_REGULATOR_DA9210 is not set
+# CONFIG_REGULATOR_DA9211 is not set
+# CONFIG_REGULATOR_DEBUG is not set
+# CONFIG_REGULATOR_FAN53555 is not set
+# CONFIG_REGULATOR_FAN53880 is not set
+# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
+# CONFIG_REGULATOR_GPIO is not set
+# CONFIG_REGULATOR_ISL6271A is not set
+# CONFIG_REGULATOR_ISL9305 is not set
+# CONFIG_REGULATOR_LP3971 is not set
+# CONFIG_REGULATOR_LP3972 is not set
+# CONFIG_REGULATOR_LP872X is not set
+# CONFIG_REGULATOR_LP8755 is not set
+# CONFIG_REGULATOR_LTC3589 is not set
+# CONFIG_REGULATOR_LTC3676 is not set
+# CONFIG_REGULATOR_MAX1586 is not set
+# CONFIG_REGULATOR_MAX20086 is not set
+# CONFIG_REGULATOR_MAX77620 is not set
+# CONFIG_REGULATOR_MAX77826 is not set
+# CONFIG_REGULATOR_MAX8649 is not set
+# CONFIG_REGULATOR_MAX8660 is not set
+# CONFIG_REGULATOR_MAX8893 is not set
+# CONFIG_REGULATOR_MAX8952 is not set
+# CONFIG_REGULATOR_MAX8973 is not set
+# CONFIG_REGULATOR_MCP16502 is not set
+# CONFIG_REGULATOR_MP5416 is not set
+# CONFIG_REGULATOR_MP8859 is not set
+# CONFIG_REGULATOR_MP886X is not set
+# CONFIG_REGULATOR_MPQ7920 is not set
+# CONFIG_REGULATOR_MT6311 is not set
+# CONFIG_REGULATOR_PCA9450 is not set
+# CONFIG_REGULATOR_PF8X00 is not set
+# CONFIG_REGULATOR_PFUZE100 is not set
+# CONFIG_REGULATOR_PV88060 is not set
+# CONFIG_REGULATOR_PV88080 is not set
+# CONFIG_REGULATOR_PV88090 is not set
+# CONFIG_REGULATOR_PWM is not set
+# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set
+# CONFIG_REGULATOR_RT4801 is not set
+# CONFIG_REGULATOR_RT5190A is not set
+# CONFIG_REGULATOR_RT5759 is not set
+# CONFIG_REGULATOR_RT6160 is not set
+# CONFIG_REGULATOR_RT6245 is not set
+# CONFIG_REGULATOR_RTMV20 is not set
+# CONFIG_REGULATOR_RTQ2134 is not set
+# CONFIG_REGULATOR_RTQ6752 is not set
+# CONFIG_REGULATOR_SLG51000 is not set
+# CONFIG_REGULATOR_SY7636A is not set
+# CONFIG_REGULATOR_SY8106A is not set
+# CONFIG_REGULATOR_SY8824X is not set
+# CONFIG_REGULATOR_SY8827N is not set
+# CONFIG_REGULATOR_TI_ABB is not set
+# CONFIG_REGULATOR_TPS51632 is not set
+# CONFIG_REGULATOR_TPS62360 is not set
+# CONFIG_REGULATOR_TPS6286X is not set
+# CONFIG_REGULATOR_TPS65023 is not set
+# CONFIG_REGULATOR_TPS6507X is not set
+# CONFIG_REGULATOR_TPS65132 is not set
+# CONFIG_REGULATOR_TPS6524X is not set
+# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
+# CONFIG_REGULATOR_VCTRL is not set
+# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_FS_POSIX_ACL is not set
+# CONFIG_REISERFS_FS_SECURITY is not set
+CONFIG_REISERFS_FS_XATTR=y
+# CONFIG_REISERFS_PROC_INFO is not set
+# CONFIG_RELAY is not set
+# CONFIG_RELOCATABLE is not set
+# CONFIG_REMOTEPROC is not set
+# CONFIG_RENESAS_PHY is not set
+# CONFIG_RESET_ATH79 is not set
+# CONFIG_RESET_BERLIN is not set
+# CONFIG_RESET_BRCMSTB_RESCAL is not set
+# CONFIG_RESET_CONTROLLER is not set
+# CONFIG_RESET_IMX7 is not set
+# CONFIG_RESET_INTEL_GW is not set
+# CONFIG_RESET_LANTIQ is not set
+# CONFIG_RESET_LPC18XX is not set
+# CONFIG_RESET_MCHP_SPARX5 is not set
+# CONFIG_RESET_MESON is not set
+# CONFIG_RESET_PISTACHIO is not set
+# CONFIG_RESET_SIMPLE is not set
+# CONFIG_RESET_SOCFPGA is not set
+# CONFIG_RESET_STM32 is not set
+# CONFIG_RESET_SUNXI is not set
+# CONFIG_RESET_TEGRA_BPMP is not set
+# CONFIG_RESET_TI_SYSCON is not set
+# CONFIG_RESET_TI_TPS380X is not set
+# CONFIG_RESET_ZYNQ is not set
+# CONFIG_RFD77402 is not set
+# CONFIG_RFD_FTL is not set
+CONFIG_RFKILL=y
+# CONFIG_RFKILL_FULL is not set
+# CONFIG_RFKILL_GPIO is not set
+# CONFIG_RFKILL_INPUT is not set
+# CONFIG_RFKILL_LEDS is not set
+# CONFIG_RFKILL_REGULATOR is not set
+# CONFIG_RING_BUFFER_BENCHMARK is not set
+# CONFIG_RING_BUFFER_STARTUP_TEST is not set
+# CONFIG_RMI4_CORE is not set
+# CONFIG_RMNET is not set
+# CONFIG_ROCKCHIP_DW_HDMI is not set
+# CONFIG_ROCKCHIP_IODOMAIN is not set
+# CONFIG_ROCKCHIP_IOMMU is not set
+# CONFIG_ROCKCHIP_MBOX is not set
+# CONFIG_ROCKCHIP_PHY is not set
+# CONFIG_ROCKCHIP_PM_DOMAINS is not set
+# CONFIG_ROCKCHIP_SARADC is not set
+# CONFIG_ROCKCHIP_THERMAL is not set
+# CONFIG_ROCKCHIP_VOP2 is not set
+# CONFIG_ROCKER is not set
+# CONFIG_RODATA_FULL_DEFAULT_ENABLED is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_ROSE is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPMSG_QCOM_GLINK_RPM is not set
+# CONFIG_RPMSG_VIRTIO is not set
+# CONFIG_RPR0521 is not set
+# CONFIG_RSEQ is not set
+# CONFIG_RT2X00 is not set
+# CONFIG_RTC_CLASS is not set
+# CONFIG_RTC_DEBUG is not set
+# CONFIG_RTC_DRV_ABB5ZES3 is not set
+# CONFIG_RTC_DRV_ABEOZ9 is not set
+# CONFIG_RTC_DRV_ABX80X is not set
+# CONFIG_RTC_DRV_ARMADA38X is not set
+# CONFIG_RTC_DRV_AU1XXX is not set
+# CONFIG_RTC_DRV_BQ32K is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_CADENCE is not set
+CONFIG_RTC_DRV_CMOS=y
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1302 is not set
+# CONFIG_RTC_DRV_DS1305 is not set
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1307_CENTURY is not set
+# CONFIG_RTC_DRV_DS1307_HWMON is not set
+# CONFIG_RTC_DRV_DS1343 is not set
+# CONFIG_RTC_DRV_DS1347 is not set
+# CONFIG_RTC_DRV_DS1374 is not set
+# CONFIG_RTC_DRV_DS1390 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS1685_FAMILY is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_DS2404 is not set
+# CONFIG_RTC_DRV_DS3232 is not set
+# CONFIG_RTC_DRV_DS3234 is not set
+# CONFIG_RTC_DRV_EM3027 is not set
+# CONFIG_RTC_DRV_EP93XX is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+# CONFIG_RTC_DRV_FTRTC010 is not set
+# CONFIG_RTC_DRV_GENERIC is not set
+# CONFIG_RTC_DRV_GOLDFISH is not set
+# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set
+# CONFIG_RTC_DRV_HYM8563 is not set
+# CONFIG_RTC_DRV_ISL12022 is not set
+# CONFIG_RTC_DRV_ISL12026 is not set
+# CONFIG_RTC_DRV_ISL12057 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_JZ4740 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_M41T93 is not set
+# CONFIG_RTC_DRV_M41T94 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_MAX6916 is not set
+# CONFIG_RTC_DRV_MCP795 is not set
+# CONFIG_RTC_DRV_MOXART is not set
+# CONFIG_RTC_DRV_MPC5121 is not set
+# CONFIG_RTC_DRV_MSM6242 is not set
+# CONFIG_RTC_DRV_MT2712 is not set
+# CONFIG_RTC_DRV_NCT3018Y is not set
+# CONFIG_RTC_DRV_OMAP is not set
+# CONFIG_RTC_DRV_PCF2123 is not set
+# CONFIG_RTC_DRV_PCF2127 is not set
+# CONFIG_RTC_DRV_PCF85063 is not set
+# CONFIG_RTC_DRV_PCF8523 is not set
+# CONFIG_RTC_DRV_PCF85363 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_PL030 is not set
+# CONFIG_RTC_DRV_PL031 is not set
+# CONFIG_RTC_DRV_PS3 is not set
+# CONFIG_RTC_DRV_PT7C4338 is not set
+# CONFIG_RTC_DRV_R7301 is not set
+# CONFIG_RTC_DRV_R9701 is not set
+# CONFIG_RTC_DRV_RK808  is not set
+# CONFIG_RTC_DRV_RP5C01 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_RTC7301 is not set
+# CONFIG_RTC_DRV_RV3028 is not set
+# CONFIG_RTC_DRV_RV3029C2 is not set
+# CONFIG_RTC_DRV_RV3032 is not set
+# CONFIG_RTC_DRV_RV8803 is not set
+# CONFIG_RTC_DRV_RX4581 is not set
+# CONFIG_RTC_DRV_RX6110 is not set
+# CONFIG_RTC_DRV_RX8010 is not set
+# CONFIG_RTC_DRV_RX8025 is not set
+# CONFIG_RTC_DRV_RX8581 is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_SD3078 is not set
+# CONFIG_RTC_DRV_SNVS is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_SUN6I is not set
+# CONFIG_RTC_DRV_TEST is not set
+# CONFIG_RTC_DRV_V3020 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_XGENE is not set
+# CONFIG_RTC_DRV_ZYNQMP is not set
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_NVMEM is not set
+CONFIG_RTC_SYSTOHC=y
+CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
+# CONFIG_RTL8180 is not set
+# CONFIG_RTL8187 is not set
+# CONFIG_RTL8192E is not set
+# CONFIG_RTL8192U is not set
+# CONFIG_RTL8306_PHY is not set
+# CONFIG_RTL8366RB_PHY is not set
+# CONFIG_RTL8366S_PHY is not set
+# CONFIG_RTL8366_SMI is not set
+# CONFIG_RTL8366_SMI_DEBUG_FS is not set
+# CONFIG_RTL8367B_PHY is not set
+# CONFIG_RTL8367_PHY is not set
+# CONFIG_RTLLIB is not set
+# CONFIG_RTL_CARDS is not set
+# CONFIG_RTS5208 is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_RUNTIME_DEBUG is not set
+CONFIG_RUNTIME_TESTING_MENU=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_RXKAD=y
+# CONFIG_S2IO is not set
+# CONFIG_SAMPLES is not set
+# CONFIG_SAMSUNG_LAPTOP is not set
+# CONFIG_SATA_ACARD_AHCI is not set
+# CONFIG_SATA_AHCI is not set
+# CONFIG_SATA_AHCI_PLATFORM is not set
+# CONFIG_SATA_DWC is not set
+# CONFIG_SATA_FSL is not set
+# CONFIG_SATA_HIGHBANK is not set
+# CONFIG_SATA_HOST is not set
+# CONFIG_SATA_INIC162X is not set
+CONFIG_SATA_MOBILE_LPM_POLICY=0
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_SATA_PMP is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_RCAR is not set
+# CONFIG_SATA_SIL is not set
+# CONFIG_SATA_SIL24 is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_SVW is not set
+# CONFIG_SATA_SX4 is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+# CONFIG_SBC_FITPC2_WATCHDOG is not set
+CONFIG_SBITMAP=y
+# CONFIG_SC92031 is not set
+# CONFIG_SCA3000 is not set
+# CONFIG_SCA3300 is not set
+# CONFIG_SCACHE_DEBUGFS is not set
+# CONFIG_SCC is not set
+# CONFIG_SCD30_CORE is not set
+# CONFIG_SCF_TORTURE_TEST is not set
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_SCHED_AUTOGROUP is not set
+# CONFIG_SCHED_CLUSTER is not set
+# CONFIG_SCHED_DEBUG is not set
+CONFIG_SCHED_HRTICK=y
+# CONFIG_SCHED_MC is not set
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+# CONFIG_SCHED_SMT is not set
+# CONFIG_SCHED_STACK_END_CHECK is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_SCR24X is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_3W_SAS is not set
+# CONFIG_SCSI_7000FASST is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_AM53C974 is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_SCSI_BFA_FC is not set
+# CONFIG_SCSI_BNX2X_FCOE is not set
+# CONFIG_SCSI_BNX2_ISCSI is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_CHELSIO_FCOE is not set
+# CONFIG_SCSI_COMMON is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_CXGB3_ISCSI is not set
+# CONFIG_SCSI_CXGB4_ISCSI is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_DH is not set
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_ESAS2R is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_FDOMAIN_PCI is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_HISI_SAS is not set
+# CONFIG_SCSI_HPSA is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_ISCI is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_LOGGING is not set
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+# CONFIG_SCSI_LPFC is not set
+CONFIG_SCSI_MOD=y
+# CONFIG_SCSI_MPI3MR is not set
+# CONFIG_SCSI_MPT2SAS is not set
+# CONFIG_SCSI_MPT3SAS is not set
+# CONFIG_SCSI_MQ_DEFAULT is not set
+# CONFIG_SCSI_MVSAS is not set
+# CONFIG_SCSI_MVSAS_DEBUG is not set
+# CONFIG_SCSI_MVUMI is not set
+# CONFIG_SCSI_MYRB is not set
+# CONFIG_SCSI_MYRS is not set
+# CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_OSD_INITIATOR is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PM8001 is not set
+# CONFIG_SCSI_PMCRAID is not set
+CONFIG_SCSI_PROC_FS=y
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+# CONFIG_SCSI_SMARTPQI is not set
+# CONFIG_SCSI_SNIC is not set
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_UFSHCD is not set
+# CONFIG_SCSI_UFS_HWMON is not set
+# CONFIG_SCSI_ULTRASTOR is not set
+# CONFIG_SCSI_VIRTIO is not set
+# CONFIG_SCSI_WD719X is not set
+# CONFIG_SCx200_ACB is not set
+# CONFIG_SDIO_UART is not set
+# CONFIG_SDR_MAX2175 is not set
+# CONFIG_SDR_PLATFORM_DRIVERS is not set
+# CONFIG_SD_ADC_MODULATOR is not set
+# CONFIG_SECCOMP is not set
+# CONFIG_SECCOMP_CACHE_DEBUG is not set
+CONFIG_SECTION_MISMATCH_WARN_ONLY=y
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_SECURITY_APPARMOR is not set
+CONFIG_SECURITY_DMESG_RESTRICT=y
+# CONFIG_SECURITY_LOADPIN is not set
+# CONFIG_SECURITY_LOCKDOWN_LSM is not set
+# CONFIG_SECURITY_NETWORK_XFRM is not set
+# CONFIG_SECURITY_PATH is not set
+# CONFIG_SECURITY_SAFESETID is not set
+# CONFIG_SECURITY_SELINUX_AVC_STATS is not set
+# CONFIG_SECURITY_SELINUX_BOOTPARAM is not set
+CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0
+# CONFIG_SECURITY_SELINUX_DEVELOP is not set
+# CONFIG_SECURITY_SELINUX_DISABLE is not set
+# CONFIG_SECURITY_SMACK is not set
+# CONFIG_SECURITY_TOMOYO is not set
+# CONFIG_SECURITY_YAMA is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+# CONFIG_SENSIRION_SGP30 is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ABITUGURU3 is not set
+# CONFIG_SENSORS_ACPI_POWER is not set
+# CONFIG_SENSORS_AD7314 is not set
+# CONFIG_SENSORS_AD7414 is not set
+# CONFIG_SENSORS_AD7418 is not set
+# CONFIG_SENSORS_ADC128D818 is not set
+# CONFIG_SENSORS_ADCXX is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1029 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM1177 is not set
+# CONFIG_SENSORS_ADM1266 is not set
+# CONFIG_SENSORS_ADM1275 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ADS1015 is not set
+# CONFIG_SENSORS_ADS7828 is not set
+# CONFIG_SENSORS_ADS7871 is not set
+# CONFIG_SENSORS_ADT7310 is not set
+# CONFIG_SENSORS_ADT7410 is not set
+# CONFIG_SENSORS_ADT7411 is not set
+# CONFIG_SENSORS_ADT7462 is not set
+# CONFIG_SENSORS_ADT7470 is not set
+# CONFIG_SENSORS_ADT7475 is not set
+# CONFIG_SENSORS_AHT10 is not set
+# CONFIG_SENSORS_AMC6821 is not set
+# CONFIG_SENSORS_APDS990X is not set
+# CONFIG_SENSORS_APPLESMC is not set
+# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set
+# CONFIG_SENSORS_AS370 is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ASC7621 is not set
+# CONFIG_SENSORS_ASPEED is not set
+# CONFIG_SENSORS_ATK0110 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_AXI_FAN_CONTROL is not set
+# CONFIG_SENSORS_BEL_PFE is not set
+# CONFIG_SENSORS_BH1770 is not set
+# CONFIG_SENSORS_BH1780 is not set
+# CONFIG_SENSORS_BPA_RS600 is not set
+# CONFIG_SENSORS_CORETEMP is not set
+# CONFIG_SENSORS_CORSAIR_CPRO is not set
+# CONFIG_SENSORS_CORSAIR_PSU is not set
+# CONFIG_SENSORS_DELL_SMM is not set
+# CONFIG_SENSORS_DME1737 is not set
+# CONFIG_SENSORS_DPS920AB is not set
+# CONFIG_SENSORS_DRIVETEMP is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_DS620 is not set
+# CONFIG_SENSORS_EMC1403 is not set
+# CONFIG_SENSORS_EMC2103 is not set
+# CONFIG_SENSORS_EMC6W201 is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_F71882FG is not set
+# CONFIG_SENSORS_F75375S is not set
+# CONFIG_SENSORS_FAM15H_POWER is not set
+# CONFIG_SENSORS_FSCHMD is not set
+# CONFIG_SENSORS_FSP_3Y is not set
+# CONFIG_SENSORS_FTSTEUTATES is not set
+# CONFIG_SENSORS_G760A is not set
+# CONFIG_SENSORS_G762 is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_GPIO_FAN is not set
+# CONFIG_SENSORS_GSC is not set
+# CONFIG_SENSORS_HDAPS is not set
+# CONFIG_SENSORS_HIH6130 is not set
+# CONFIG_SENSORS_HMC5843 is not set
+# CONFIG_SENSORS_HMC5843_I2C is not set
+# CONFIG_SENSORS_HMC5843_SPI is not set
+# CONFIG_SENSORS_HTU21 is not set
+# CONFIG_SENSORS_I5500 is not set
+# CONFIG_SENSORS_I5K_AMB is not set
+# CONFIG_SENSORS_IBM_CFFPS is not set
+# CONFIG_SENSORS_IIO_HWMON is not set
+# CONFIG_SENSORS_INA209 is not set
+# CONFIG_SENSORS_INA238 is not set
+# CONFIG_SENSORS_INA2XX is not set
+# CONFIG_SENSORS_INA3221 is not set
+# CONFIG_SENSORS_INSPUR_IPSPS is not set
+# CONFIG_SENSORS_IR35221 is not set
+# CONFIG_SENSORS_IR36021 is not set
+# CONFIG_SENSORS_IR38064 is not set
+# CONFIG_SENSORS_IRPS5401 is not set
+# CONFIG_SENSORS_ISL29018 is not set
+# CONFIG_SENSORS_ISL29028 is not set
+# CONFIG_SENSORS_ISL68137 is not set
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_JC42 is not set
+# CONFIG_SENSORS_K10TEMP is not set
+# CONFIG_SENSORS_K8TEMP is not set
+# CONFIG_SENSORS_LINEAGE is not set
+# CONFIG_SENSORS_LIS3LV02D is not set
+# CONFIG_SENSORS_LIS3_I2C is not set
+# CONFIG_SENSORS_LIS3_SPI is not set
+# CONFIG_SENSORS_LM25066 is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM70 is not set
+# CONFIG_SENSORS_LM73 is not set
+# CONFIG_SENSORS_LM75 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_LM93 is not set
+# CONFIG_SENSORS_LM95234 is not set
+# CONFIG_SENSORS_LM95241 is not set
+# CONFIG_SENSORS_LM95245 is not set
+# CONFIG_SENSORS_LTC2945 is not set
+# CONFIG_SENSORS_LTC2947_I2C is not set
+# CONFIG_SENSORS_LTC2947_SPI is not set
+# CONFIG_SENSORS_LTC2978 is not set
+# CONFIG_SENSORS_LTC2990 is not set
+# CONFIG_SENSORS_LTC2992 is not set
+# CONFIG_SENSORS_LTC3815 is not set
+# CONFIG_SENSORS_LTC4151 is not set
+# CONFIG_SENSORS_LTC4215 is not set
+# CONFIG_SENSORS_LTC4222 is not set
+# CONFIG_SENSORS_LTC4245 is not set
+# CONFIG_SENSORS_LTC4260 is not set
+# CONFIG_SENSORS_LTC4261 is not set
+# CONFIG_SENSORS_LTQ_CPUTEMP is not set
+# CONFIG_SENSORS_MAX1111 is not set
+# CONFIG_SENSORS_MAX127 is not set
+# CONFIG_SENSORS_MAX15301 is not set
+# CONFIG_SENSORS_MAX16064 is not set
+# CONFIG_SENSORS_MAX16065 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_MAX16601 is not set
+# CONFIG_SENSORS_MAX1668 is not set
+# CONFIG_SENSORS_MAX197 is not set
+# CONFIG_SENSORS_MAX20730 is not set
+# CONFIG_SENSORS_MAX20751 is not set
+# CONFIG_SENSORS_MAX31722 is not set
+# CONFIG_SENSORS_MAX31730 is not set
+# CONFIG_SENSORS_MAX31785 is not set
+# CONFIG_SENSORS_MAX31790 is not set
+# CONFIG_SENSORS_MAX34440 is not set
+# CONFIG_SENSORS_MAX6620 is not set
+# CONFIG_SENSORS_MAX6621 is not set
+# CONFIG_SENSORS_MAX6639 is not set
+# CONFIG_SENSORS_MAX6642 is not set
+# CONFIG_SENSORS_MAX6650 is not set
+# CONFIG_SENSORS_MAX6697 is not set
+# CONFIG_SENSORS_MAX8688 is not set
+# CONFIG_SENSORS_MCP3021 is not set
+# CONFIG_SENSORS_MP2888 is not set
+# CONFIG_SENSORS_MP2975 is not set
+# CONFIG_SENSORS_MR75203 is not set
+# CONFIG_SENSORS_NCT6683 is not set
+# CONFIG_SENSORS_NCT6775 is not set
+# CONFIG_SENSORS_NCT6775_I2C is not set
+# CONFIG_SENSORS_NCT7802 is not set
+# CONFIG_SENSORS_NCT7904 is not set
+# CONFIG_SENSORS_NPCM7XX is not set
+# CONFIG_SENSORS_NSA320 is not set
+# CONFIG_SENSORS_NTC_THERMISTOR is not set
+# CONFIG_SENSORS_NZXT_KRAKEN2 is not set
+# CONFIG_SENSORS_NZXT_SMART2 is not set
+# CONFIG_SENSORS_OCC_P8_I2C is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_PIM4328 is not set
+# CONFIG_SENSORS_PM6764TR is not set
+# CONFIG_SENSORS_PMBUS is not set
+# CONFIG_SENSORS_POWR1220 is not set
+# CONFIG_SENSORS_PWM_FAN is not set
+# CONFIG_SENSORS_PXE1610 is not set
+# CONFIG_SENSORS_Q54SJ108A2 is not set
+# CONFIG_SENSORS_RM3100_I2C is not set
+# CONFIG_SENSORS_RM3100_SPI is not set
+# CONFIG_SENSORS_SBRMI is not set
+# CONFIG_SENSORS_SBTSI is not set
+# CONFIG_SENSORS_SCH5627 is not set
+# CONFIG_SENSORS_SCH5636 is not set
+# CONFIG_SENSORS_SCH56XX_COMMON is not set
+# CONFIG_SENSORS_SHT15 is not set
+# CONFIG_SENSORS_SHT21 is not set
+# CONFIG_SENSORS_SHT3x is not set
+# CONFIG_SENSORS_SHT4x is not set
+# CONFIG_SENSORS_SHTC1 is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_SMM665 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_STPDDC60 is not set
+# CONFIG_SENSORS_STTS751 is not set
+# CONFIG_SENSORS_SY7636A is not set
+# CONFIG_SENSORS_TC654 is not set
+# CONFIG_SENSORS_TC74 is not set
+# CONFIG_SENSORS_THMC50 is not set
+# CONFIG_SENSORS_TMP102 is not set
+# CONFIG_SENSORS_TMP103 is not set
+# CONFIG_SENSORS_TMP108 is not set
+# CONFIG_SENSORS_TMP401 is not set
+# CONFIG_SENSORS_TMP421 is not set
+# CONFIG_SENSORS_TMP464 is not set
+# CONFIG_SENSORS_TMP513 is not set
+# CONFIG_SENSORS_TPS23861 is not set
+# CONFIG_SENSORS_TPS40422 is not set
+# CONFIG_SENSORS_TPS53679 is not set
+# CONFIG_SENSORS_TSL2550 is not set
+# CONFIG_SENSORS_TSL2563 is not set
+# CONFIG_SENSORS_UCD9000 is not set
+# CONFIG_SENSORS_UCD9200 is not set
+# CONFIG_SENSORS_VEXPRESS is not set
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_VIA_CPUTEMP is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_VT8231 is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83773G is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83793 is not set
+# CONFIG_SENSORS_W83795 is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83L786NG is not set
+# CONFIG_SENSORS_XDPE122 is not set
+# CONFIG_SENSORS_XGENE is not set
+# CONFIG_SENSORS_ZL6100 is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_16550A_VARIANTS=y
+# CONFIG_SERIAL_8250_ACCENT is not set
+# CONFIG_SERIAL_8250_ASPEED_VUART is not set
+# CONFIG_SERIAL_8250_BOCA is not set
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_CS is not set
+# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+CONFIG_SERIAL_8250_DMA=y
+# CONFIG_SERIAL_8250_DW is not set
+# CONFIG_SERIAL_8250_EM is not set
+# CONFIG_SERIAL_8250_EXAR is not set
+# CONFIG_SERIAL_8250_EXAR_ST16C554 is not set
+# CONFIG_SERIAL_8250_EXTENDED is not set
+# CONFIG_SERIAL_8250_FINTEK is not set
+# CONFIG_SERIAL_8250_FOURPORT is not set
+# CONFIG_SERIAL_8250_HUB6 is not set
+# CONFIG_SERIAL_8250_INGENIC is not set
+# CONFIG_SERIAL_8250_LPSS is not set
+# CONFIG_SERIAL_8250_MANY_PORTS is not set
+# CONFIG_SERIAL_8250_MID is not set
+# CONFIG_SERIAL_8250_MOXA is not set
+CONFIG_SERIAL_8250_NR_UARTS=2
+# CONFIG_SERIAL_8250_PCI is not set
+# CONFIG_SERIAL_8250_PERICOM is not set
+# CONFIG_SERIAL_8250_RSA is not set
+# CONFIG_SERIAL_8250_RT288X is not set
+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+# CONFIG_SERIAL_AMBA_PL010 is not set
+# CONFIG_SERIAL_AMBA_PL011 is not set
+# CONFIG_SERIAL_ARC is not set
+# CONFIG_SERIAL_BCM63XX is not set
+# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_DEV_BUS is not set
+CONFIG_SERIAL_EARLYCON=y
+# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set
+# CONFIG_SERIAL_FSL_LINFLEXUART is not set
+# CONFIG_SERIAL_FSL_LPUART is not set
+# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set
+# CONFIG_SERIAL_IFX6X60 is not set
+# CONFIG_SERIAL_JSM is not set
+# CONFIG_SERIAL_MAX3100 is not set
+# CONFIG_SERIAL_MAX310X is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_SERIAL_OF_PLATFORM is not set
+# CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set
+# CONFIG_SERIAL_PCH_UART is not set
+# CONFIG_SERIAL_RP2 is not set
+# CONFIG_SERIAL_SC16IS7XX is not set
+# CONFIG_SERIAL_SCCNXP is not set
+# CONFIG_SERIAL_SH_SCI is not set
+# CONFIG_SERIAL_SIFIVE is not set
+# CONFIG_SERIAL_SPRD is not set
+# CONFIG_SERIAL_STM32 is not set
+# CONFIG_SERIAL_ST_ASC is not set
+# CONFIG_SERIAL_TIMBERDALE is not set
+# CONFIG_SERIAL_UARTLITE is not set
+# CONFIG_SERIAL_XILINX_PS_UART is not set
+# CONFIG_SERIO is not set
+# CONFIG_SERIO_ALTERA_PS2 is not set
+# CONFIG_SERIO_AMBAKMI is not set
+# CONFIG_SERIO_APBPS2 is not set
+# CONFIG_SERIO_ARC_PS2 is not set
+# CONFIG_SERIO_CT82C710 is not set
+# CONFIG_SERIO_GPIO_PS2 is not set
+# CONFIG_SERIO_I8042 is not set
+# CONFIG_SERIO_LIBPS2 is not set
+# CONFIG_SERIO_PARKBD is not set
+# CONFIG_SERIO_PCIPS2 is not set
+# CONFIG_SERIO_PS2MULT is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_SUN4I_PS2 is not set
+# CONFIG_SFC is not set
+# CONFIG_SFC_FALCON is not set
+# CONFIG_SFI is not set
+# CONFIG_SFP is not set
+# CONFIG_SF_PDMA is not set
+# CONFIG_SGETMASK_SYSCALL is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_SGI_IP22 is not set
+# CONFIG_SGI_IP27 is not set
+# CONFIG_SGI_IP28 is not set
+# CONFIG_SGI_IP30 is not set
+# CONFIG_SGI_IP32 is not set
+# CONFIG_SGI_MFD_IOC3 is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_SG_POOL is not set
+# CONFIG_SG_SPLIT is not set
+CONFIG_SHMEM=y
+# CONFIG_SHORTCUT_FE is not set
+# CONFIG_SHRINKER_DEBUG is not set
+# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set
+# CONFIG_SH_ETH is not set
+# CONFIG_SH_TIMER_CMT is not set
+# CONFIG_SH_TIMER_MTU2 is not set
+# CONFIG_SH_TIMER_TMU is not set
+# CONFIG_SI1133 is not set
+# CONFIG_SI1145 is not set
+# CONFIG_SI7005 is not set
+# CONFIG_SI7020 is not set
+# CONFIG_SIBYTE_BIGSUR is not set
+# CONFIG_SIBYTE_CARMEL is not set
+# CONFIG_SIBYTE_CRHINE is not set
+# CONFIG_SIBYTE_CRHONE is not set
+# CONFIG_SIBYTE_LITTLESUR is not set
+# CONFIG_SIBYTE_RHONE is not set
+# CONFIG_SIBYTE_SENTOSA is not set
+# CONFIG_SIBYTE_SWARM is not set
+CONFIG_SIGNALFD=y
+# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set
+# CONFIG_SIMPLE_GPIO is not set
+# CONFIG_SIMPLE_PM_BUS is not set
+# CONFIG_SIOX is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SIS900 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_SKY2_DEBUG is not set
+# CONFIG_SLAB is not set
+CONFIG_SLABINFO=y
+# CONFIG_SLAB_FREELIST_HARDENED is not set
+# CONFIG_SLAB_FREELIST_RANDOM is not set
+CONFIG_SLAB_MERGE_DEFAULT=y
+# CONFIG_SLHC is not set
+# CONFIG_SLICOSS is not set
+# CONFIG_SLIMBUS is not set
+# CONFIG_SLIP is not set
+# CONFIG_SLOB is not set
+CONFIG_SLUB=y
+CONFIG_SLUB_CPU_PARTIAL=y
+# CONFIG_SLUB_DEBUG is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_MEMCG_SYSFS_ON is not set
+# CONFIG_SLUB_STATS is not set
+# CONFIG_SMARTJOYPLUS_FF is not set
+# CONFIG_SMB_SERVER is not set
+# CONFIG_SMC911X is not set
+# CONFIG_SMC9194 is not set
+# CONFIG_SMC91X is not set
+# CONFIG_SMP is not set
+# CONFIG_SMSC911X is not set
+# CONFIG_SMSC9420 is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_SMS_SDIO_DRV is not set
+# CONFIG_SMS_USB_DRV is not set
+# CONFIG_SM_FTL is not set
+# CONFIG_SND is not set
+# CONFIG_SND_AC97_POWER_SAVE is not set
+# CONFIG_SND_AD1816A is not set
+# CONFIG_SND_AD1848 is not set
+# CONFIG_SND_AD1889 is not set
+# CONFIG_SND_ADLIB is not set
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ALOOP is not set
+# CONFIG_SND_ALS100 is not set
+# CONFIG_SND_ALS300 is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_ARM is not set
+# CONFIG_SND_ASIHPI is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_ATMEL_AC97C is not set
+# CONFIG_SND_ATMEL_SOC is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AUDIO_GRAPH_CARD is not set
+# CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set
+# CONFIG_SND_AW2 is not set
+# CONFIG_SND_AZT2320 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BCD2000 is not set
+# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CA0106 is not set
+# CONFIG_SND_CMI8330 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_CS4231 is not set
+# CONFIG_SND_CS4236 is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS5530 is not set
+# CONFIG_SND_CS5535AUDIO is not set
+# CONFIG_SND_CTXFI is not set
+# CONFIG_SND_DARLA20 is not set
+# CONFIG_SND_DARLA24 is not set
+# CONFIG_SND_DEBUG is not set
+# CONFIG_SND_DESIGNWARE_I2S is not set
+CONFIG_SND_DRIVERS=y
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_DYNAMIC_MINORS is not set
+# CONFIG_SND_ECHO3G is not set
+# CONFIG_SND_EDMA_SOC is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_EMU10K1_SEQ is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1688 is not set
+# CONFIG_SND_ES18XX is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_FIREWIRE is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_GINA20 is not set
+# CONFIG_SND_GINA24 is not set
+# CONFIG_SND_GUSCLASSIC is not set
+# CONFIG_SND_GUSEXTREME is not set
+# CONFIG_SND_GUSMAX is not set
+# CONFIG_SND_HDA_INTEL is not set
+# CONFIG_SND_HDA_INTEL_DETECT_DMIC is not set
+# CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM is not set
+CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0
+CONFIG_SND_HDA_PREALLOC_SIZE=64
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
+# CONFIG_SND_HRTIMER is not set
+# CONFIG_SND_HWDEP is not set
+# CONFIG_SND_I2S_HI6210_I2S is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INDIGO is not set
+# CONFIG_SND_INDIGODJ is not set
+# CONFIG_SND_INDIGODJX is not set
+# CONFIG_SND_INDIGOIO is not set
+# CONFIG_SND_INDIGOIOX is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_INTERWAVE is not set
+# CONFIG_SND_INTERWAVE_STB is not set
+# CONFIG_SND_ISA is not set
+# CONFIG_SND_JZ4740_SOC_I2S is not set
+# CONFIG_SND_KIRKWOOD_SOC is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_LAYLA20 is not set
+# CONFIG_SND_LAYLA24 is not set
+# CONFIG_SND_LOLA is not set
+# CONFIG_SND_LX6464ES is not set
+# CONFIG_SND_MAESTRO3 is not set
+CONFIG_SND_MAX_CARDS=16
+# CONFIG_SND_MIA is not set
+# CONFIG_SND_MIPS is not set
+# CONFIG_SND_MIRO is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_MIXER_OSS is not set
+# CONFIG_SND_MONA is not set
+# CONFIG_SND_MPC52xx_SOC_EFIKA is not set
+# CONFIG_SND_MPU401 is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_MTS64 is not set
+# CONFIG_SND_MXS_SOC is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_OPL3SA2 is not set
+# CONFIG_SND_OPL3_LIB_SEQ is not set
+# CONFIG_SND_OPL4_LIB_SEQ is not set
+# CONFIG_SND_OPTI92X_AD1848 is not set
+# CONFIG_SND_OPTI92X_CS4231 is not set
+# CONFIG_SND_OPTI93X is not set
+CONFIG_SND_OSSEMUL=y
+# CONFIG_SND_OXYGEN is not set
+CONFIG_SND_PCI=y
+# CONFIG_SND_PCM is not set
+# CONFIG_SND_PCMCIA is not set
+# CONFIG_SND_PCM_OSS is not set
+CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_PCM_TIMER is not set
+# CONFIG_SND_PCM_XRUN_DEBUG is not set
+# CONFIG_SND_PCXHR is not set
+# CONFIG_SND_PDAUDIOCF is not set
+# CONFIG_SND_PORTMAN2X4 is not set
+# CONFIG_SND_POWERPC_SOC is not set
+# CONFIG_SND_PPC is not set
+CONFIG_SND_PROC_FS=y
+# CONFIG_SND_RAWMIDI is not set
+# CONFIG_SND_RAWMIDI_SEQ is not set
+# CONFIG_SND_RIPTIDE is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_RTCTIMER is not set
+# CONFIG_SND_SB16 is not set
+# CONFIG_SND_SB8 is not set
+# CONFIG_SND_SBAWE is not set
+# CONFIG_SND_SBAWE_SEQ is not set
+# CONFIG_SND_SE6X is not set
+# CONFIG_SND_SEQUENCER is not set
+# CONFIG_SND_SERIAL_GENERIC is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_SIMPLE_CARD is not set
+# CONFIG_SND_SIMPLE_SCU_CARD is not set
+# CONFIG_SND_SIS7019 is not set
+# CONFIG_SND_SOC is not set
+# CONFIG_SND_SOC_AC97_CODEC is not set
+# CONFIG_SND_SOC_ADAU1372_I2C is not set
+# CONFIG_SND_SOC_ADAU1372_SPI is not set
+# CONFIG_SND_SOC_ADAU1701 is not set
+# CONFIG_SND_SOC_ADAU1761_I2C is not set
+# CONFIG_SND_SOC_ADAU1761_SPI is not set
+# CONFIG_SND_SOC_ADAU7002 is not set
+# CONFIG_SND_SOC_ADAU7118_HW is not set
+# CONFIG_SND_SOC_ADAU7118_I2C is not set
+# CONFIG_SND_SOC_AK4104 is not set
+# CONFIG_SND_SOC_AK4118 is not set
+# CONFIG_SND_SOC_AK4458 is not set
+# CONFIG_SND_SOC_AK4554 is not set
+# CONFIG_SND_SOC_AK4613 is not set
+# CONFIG_SND_SOC_AK4642 is not set
+# CONFIG_SND_SOC_AK5386 is not set
+# CONFIG_SND_SOC_AK5558 is not set
+# CONFIG_SND_SOC_ALC5623 is not set
+# CONFIG_SND_SOC_AMD_ACP is not set
+# CONFIG_SND_SOC_AMD_ACP3x is not set
+# CONFIG_SND_SOC_AMD_RENOIR is not set
+# CONFIG_SND_SOC_AU1XAUDIO is not set
+# CONFIG_SND_SOC_AU1XPSC is not set
+# CONFIG_SND_SOC_BD28623 is not set
+# CONFIG_SND_SOC_BT_SCO is not set
+# CONFIG_SND_SOC_CS35L32 is not set
+# CONFIG_SND_SOC_CS35L33 is not set
+# CONFIG_SND_SOC_CS35L34 is not set
+# CONFIG_SND_SOC_CS35L35 is not set
+# CONFIG_SND_SOC_CS35L36 is not set
+# CONFIG_SND_SOC_CS4234 is not set
+# CONFIG_SND_SOC_CS4265 is not set
+# CONFIG_SND_SOC_CS4270 is not set
+# CONFIG_SND_SOC_CS4271 is not set
+# CONFIG_SND_SOC_CS4271_I2C is not set
+# CONFIG_SND_SOC_CS4271_SPI is not set
+# CONFIG_SND_SOC_CS42L42 is not set
+# CONFIG_SND_SOC_CS42L51_I2C is not set
+# CONFIG_SND_SOC_CS42L52 is not set
+# CONFIG_SND_SOC_CS42L56 is not set
+# CONFIG_SND_SOC_CS42L73 is not set
+# CONFIG_SND_SOC_CS42XX8_I2C is not set
+# CONFIG_SND_SOC_CS43130 is not set
+# CONFIG_SND_SOC_CS4341 is not set
+# CONFIG_SND_SOC_CS4349 is not set
+# CONFIG_SND_SOC_CS53L30 is not set
+# CONFIG_SND_SOC_CX2072X is not set
+# CONFIG_SND_SOC_DA7213 is not set
+# CONFIG_SND_SOC_DIO2125 is not set
+# CONFIG_SND_SOC_DMIC is not set
+# CONFIG_SND_SOC_ES7134 is not set
+# CONFIG_SND_SOC_ES7241 is not set
+# CONFIG_SND_SOC_ES8316 is not set
+# CONFIG_SND_SOC_ES8328 is not set
+# CONFIG_SND_SOC_ES8328_I2C is not set
+# CONFIG_SND_SOC_ES8328_SPI is not set
+# CONFIG_SND_SOC_EUKREA_TLV320 is not set
+# CONFIG_SND_SOC_FSL_ASOC_CARD is not set
+# CONFIG_SND_SOC_FSL_ASRC is not set
+# CONFIG_SND_SOC_FSL_AUDMIX is not set
+# CONFIG_SND_SOC_FSL_ESAI is not set
+# CONFIG_SND_SOC_FSL_MICFIL is not set
+# CONFIG_SND_SOC_FSL_SAI is not set
+# CONFIG_SND_SOC_FSL_SPDIF is not set
+# CONFIG_SND_SOC_FSL_SSI is not set
+# CONFIG_SND_SOC_FSL_XCVR is not set
+# CONFIG_SND_SOC_GTM601 is not set
+# CONFIG_SND_SOC_ICS43432 is not set
+# CONFIG_SND_SOC_IMG is not set
+# CONFIG_SND_SOC_IMX_AUDMIX is not set
+# CONFIG_SND_SOC_IMX_AUDMUX is not set
+# CONFIG_SND_SOC_IMX_ES8328 is not set
+# CONFIG_SND_SOC_IMX_SPDIF is not set
+# CONFIG_SND_SOC_IMX_WM8962 is not set
+# CONFIG_SND_SOC_INNO_RK3036 is not set
+# CONFIG_SND_SOC_INTEL_APL is not set
+# CONFIG_SND_SOC_INTEL_BAYTRAIL is not set
+# CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH is not set
+# CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH is not set
+# CONFIG_SND_SOC_INTEL_BXT_RT298_MACH is not set
+# CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH is not set
+# CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH is not set
+# CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH is not set
+# CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH is not set
+# CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH is not set
+# CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH is not set
+# CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH is not set
+# CONFIG_SND_SOC_INTEL_CATPT is not set
+# CONFIG_SND_SOC_INTEL_CFL is not set
+# CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH is not set
+# CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH is not set
+# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH is not set
+# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH is not set
+# CONFIG_SND_SOC_INTEL_CML_H is not set
+# CONFIG_SND_SOC_INTEL_CML_LP is not set
+# CONFIG_SND_SOC_INTEL_CNL is not set
+# CONFIG_SND_SOC_INTEL_GLK is not set
+# CONFIG_SND_SOC_INTEL_HASWELL is not set
+# CONFIG_SND_SOC_INTEL_KBL is not set
+# CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH is not set
+# CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH is not set
+# CONFIG_SND_SOC_INTEL_KEEMBAY is not set
+# CONFIG_SND_SOC_INTEL_SKL is not set
+# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH is not set
+# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH is not set
+# CONFIG_SND_SOC_INTEL_SKL_RT286_MACH is not set
+# CONFIG_SND_SOC_INTEL_SKYLAKE is not set
+# CONFIG_SND_SOC_INTEL_SST is not set
+CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
+# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set
+# CONFIG_SND_SOC_JZ4725B_CODEC is not set
+# CONFIG_SND_SOC_JZ4740_CODEC is not set
+# CONFIG_SND_SOC_JZ4770_CODEC is not set
+# CONFIG_SND_SOC_LPASS_RX_MACRO is not set
+# CONFIG_SND_SOC_LPASS_TX_MACRO is not set
+# CONFIG_SND_SOC_LPASS_VA_MACRO is not set
+# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set
+# CONFIG_SND_SOC_MA120X0P is not set
+# CONFIG_SND_SOC_MAX9759 is not set
+# CONFIG_SND_SOC_MAX98088 is not set
+# CONFIG_SND_SOC_MAX98357A is not set
+# CONFIG_SND_SOC_MAX98373 is not set
+# CONFIG_SND_SOC_MAX98373_I2C is not set
+# CONFIG_SND_SOC_MAX98390 is not set
+# CONFIG_SND_SOC_MAX98504 is not set
+# CONFIG_SND_SOC_MAX9860 is not set
+# CONFIG_SND_SOC_MAX9867 is not set
+# CONFIG_SND_SOC_MAX98927 is not set
+# CONFIG_SND_SOC_MEDIATEK is not set
+# CONFIG_SND_SOC_MPC5200_AC97 is not set
+# CONFIG_SND_SOC_MPC5200_I2S is not set
+# CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set
+# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set
+# CONFIG_SND_SOC_MT2701 is not set
+# CONFIG_SND_SOC_MT6351 is not set
+# CONFIG_SND_SOC_MT6358 is not set
+# CONFIG_SND_SOC_MT6660 is not set
+# CONFIG_SND_SOC_MT6797 is not set
+# CONFIG_SND_SOC_MT8173 is not set
+# CONFIG_SND_SOC_MT8183 is not set
+# CONFIG_SND_SOC_MTK_BTCVSD is not set
+# CONFIG_SND_SOC_NAU8315 is not set
+# CONFIG_SND_SOC_NAU8540 is not set
+# CONFIG_SND_SOC_NAU8810 is not set
+# CONFIG_SND_SOC_NAU8822 is not set
+# CONFIG_SND_SOC_NAU8824 is not set
+# CONFIG_SND_SOC_PCM1681 is not set
+# CONFIG_SND_SOC_PCM1789_I2C is not set
+# CONFIG_SND_SOC_PCM1792A is not set
+# CONFIG_SND_SOC_PCM179X_I2C is not set
+# CONFIG_SND_SOC_PCM179X_SPI is not set
+# CONFIG_SND_SOC_PCM186X_I2C is not set
+# CONFIG_SND_SOC_PCM186X_SPI is not set
+# CONFIG_SND_SOC_PCM3060_I2C is not set
+# CONFIG_SND_SOC_PCM3060_SPI is not set
+# CONFIG_SND_SOC_PCM3168A_I2C is not set
+# CONFIG_SND_SOC_PCM3168A_SPI is not set
+# CONFIG_SND_SOC_PCM512x_I2C is not set
+# CONFIG_SND_SOC_PCM512x_SPI is not set
+# CONFIG_SND_SOC_QCOM is not set
+# CONFIG_SND_SOC_RK3328 is not set
+# CONFIG_SND_SOC_RK817 is not set
+# CONFIG_SND_SOC_ROCKCHIP_SPDIF is not set
+# CONFIG_SND_SOC_RT5616 is not set
+# CONFIG_SND_SOC_RT5631 is not set
+# CONFIG_SND_SOC_RT5640 is not set
+# CONFIG_SND_SOC_RT5659 is not set
+# CONFIG_SND_SOC_RT5677_SPI is not set
+# CONFIG_SND_SOC_SGTL5000 is not set
+# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set
+# CONFIG_SND_SOC_SIMPLE_MUX is not set
+# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
+# CONFIG_SND_SOC_SOF_TOPLEVEL is not set
+# CONFIG_SND_SOC_SPDIF is not set
+# CONFIG_SND_SOC_SSM2305 is not set
+# CONFIG_SND_SOC_SSM2602_I2C is not set
+# CONFIG_SND_SOC_SSM2602_SPI is not set
+# CONFIG_SND_SOC_SSM4567 is not set
+# CONFIG_SND_SOC_STA32X is not set
+# CONFIG_SND_SOC_STA350 is not set
+# CONFIG_SND_SOC_STI_SAS is not set
+# CONFIG_SND_SOC_TAS2552 is not set
+# CONFIG_SND_SOC_TAS2562 is not set
+# CONFIG_SND_SOC_TAS2764 is not set
+# CONFIG_SND_SOC_TAS2770 is not set
+# CONFIG_SND_SOC_TAS5086 is not set
+# CONFIG_SND_SOC_TAS571X is not set
+# CONFIG_SND_SOC_TAS5720 is not set
+# CONFIG_SND_SOC_TAS6424 is not set
+# CONFIG_SND_SOC_TDA7419 is not set
+# CONFIG_SND_SOC_TFA9879 is not set
+# CONFIG_SND_SOC_TFA989X is not set
+# CONFIG_SND_SOC_TLV320ADCX140 is not set
+# CONFIG_SND_SOC_TLV320AIC23_I2C is not set
+# CONFIG_SND_SOC_TLV320AIC23_SPI is not set
+# CONFIG_SND_SOC_TLV320AIC31XX is not set
+# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set
+# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set
+# CONFIG_SND_SOC_TLV320AIC3X is not set
+# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set
+# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set
+# CONFIG_SND_SOC_TPA6130A2 is not set
+# CONFIG_SND_SOC_TS3A227E is not set
+# CONFIG_SND_SOC_TSCS42XX is not set
+# CONFIG_SND_SOC_TSCS454 is not set
+# CONFIG_SND_SOC_UDA1334 is not set
+# CONFIG_SND_SOC_WM8510 is not set
+# CONFIG_SND_SOC_WM8523 is not set
+# CONFIG_SND_SOC_WM8524 is not set
+# CONFIG_SND_SOC_WM8580 is not set
+# CONFIG_SND_SOC_WM8711 is not set
+# CONFIG_SND_SOC_WM8728 is not set
+# CONFIG_SND_SOC_WM8731 is not set
+# CONFIG_SND_SOC_WM8737 is not set
+# CONFIG_SND_SOC_WM8741 is not set
+# CONFIG_SND_SOC_WM8750 is not set
+# CONFIG_SND_SOC_WM8753 is not set
+# CONFIG_SND_SOC_WM8770 is not set
+# CONFIG_SND_SOC_WM8776 is not set
+# CONFIG_SND_SOC_WM8782 is not set
+# CONFIG_SND_SOC_WM8804_I2C is not set
+# CONFIG_SND_SOC_WM8804_SPI is not set
+# CONFIG_SND_SOC_WM8903 is not set
+# CONFIG_SND_SOC_WM8904 is not set
+# CONFIG_SND_SOC_WM8960 is not set
+# CONFIG_SND_SOC_WM8962 is not set
+# CONFIG_SND_SOC_WM8974 is not set
+# CONFIG_SND_SOC_WM8978 is not set
+# CONFIG_SND_SOC_WM8985 is not set
+# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set
+# CONFIG_SND_SOC_XILINX_I2S is not set
+# CONFIG_SND_SOC_XILINX_SPDIF is not set
+# CONFIG_SND_SOC_XTFPGA_I2S is not set
+# CONFIG_SND_SOC_ZL38060 is not set
+# CONFIG_SND_SOC_ZX_AUD96P22 is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_SPI is not set
+# CONFIG_SND_SSCAPE is not set
+# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI is not set
+# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI is not set
+# CONFIG_SND_SUN4I_CODEC is not set
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_TIMER is not set
+# CONFIG_SND_TRIDENT is not set
+CONFIG_SND_USB=y
+# CONFIG_SND_USB_6FIRE is not set
+# CONFIG_SND_USB_AUDIO is not set
+# CONFIG_SND_USB_CAIAQ is not set
+# CONFIG_SND_USB_HIFACE is not set
+# CONFIG_SND_USB_POD is not set
+# CONFIG_SND_USB_PODHD is not set
+# CONFIG_SND_USB_TONEPORT is not set
+# CONFIG_SND_USB_UA101 is not set
+# CONFIG_SND_USB_US122L is not set
+# CONFIG_SND_USB_USX2Y is not set
+# CONFIG_SND_USB_VARIAX is not set
+# CONFIG_SND_VERBOSE_PRINTK is not set
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VIA82XX_MODEM is not set
+# CONFIG_SND_VIRTUOSO is not set
+# CONFIG_SND_VX222 is not set
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_WAVEFRONT is not set
+CONFIG_SND_X86=y
+# CONFIG_SND_XEN_FRONTEND is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SNI_RM is not set
+# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set
+# CONFIG_SOCK_CGROUP_DATA is not set
+# CONFIG_SOCK_RX_QUEUE_MAPPING is not set
+# CONFIG_SOC_AM33XX is not set
+# CONFIG_SOC_AM43XX is not set
+# CONFIG_SOC_BRCMSTB is not set
+# CONFIG_SOC_CAMERA is not set
+# CONFIG_SOC_DRA7XX is not set
+# CONFIG_SOC_HAS_OMAP2_SDRC is not set
+# CONFIG_SOC_OMAP5 is not set
+# CONFIG_SOC_TI is not set
+# CONFIG_SOFTLOCKUP_DETECTOR is not set
+# CONFIG_SOFT_WATCHDOG is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_SONYPI is not set
+# CONFIG_SONY_LAPTOP is not set
+# CONFIG_SOUND is not set
+# CONFIG_SOUNDWIRE is not set
+# CONFIG_SOUND_OSS_CORE is not set
+# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set
+# CONFIG_SOUND_PRIME is not set
+# CONFIG_SP5100_TCO is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_STATIC is not set
+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+# CONFIG_SPARSE_IRQ is not set
+# CONFIG_SPARSE_RCU_POINTER is not set
+# CONFIG_SPEAKUP is not set
+# CONFIG_SPI is not set
+# CONFIG_SPINLOCK_TEST is not set
+# CONFIG_SPI_ALTERA is not set
+# CONFIG_SPI_ALTERA_CORE is not set
+# CONFIG_SPI_AMD is not set
+# CONFIG_SPI_AU1550 is not set
+# CONFIG_SPI_AX88796C is not set
+# CONFIG_SPI_AXI_SPI_ENGINE is not set
+# CONFIG_SPI_BCM2835 is not set
+# CONFIG_SPI_BCM_QSPI is not set
+# CONFIG_SPI_BITBANG is not set
+# CONFIG_SPI_BUTTERFLY is not set
+# CONFIG_SPI_CADENCE is not set
+# CONFIG_SPI_CADENCE_QUADSPI is not set
+# CONFIG_SPI_CADENCE_XSPI is not set
+# CONFIG_SPI_DEBUG is not set
+# CONFIG_SPI_DESIGNWARE is not set
+# CONFIG_SPI_FSL_DSPI is not set
+# CONFIG_SPI_FSL_ESPI is not set
+# CONFIG_SPI_FSL_SPI is not set
+# CONFIG_SPI_GPIO is not set
+# CONFIG_SPI_GPIO_OLD is not set
+# CONFIG_SPI_IMG_SPFI is not set
+# CONFIG_SPI_LANTIQ_SSC is not set
+# CONFIG_SPI_LM70_LLP is not set
+# CONFIG_SPI_LOOPBACK_TEST is not set
+# CONFIG_SPI_MASTER is not set
+# CONFIG_SPI_MEM is not set
+# CONFIG_SPI_MICROCHIP_CORE is not set
+# CONFIG_SPI_MPC52xx is not set
+# CONFIG_SPI_MPC52xx_PSC is not set
+# CONFIG_SPI_MTK_QUADSPI is not set
+# CONFIG_SPI_MUX is not set
+# CONFIG_SPI_MXIC is not set
+# CONFIG_SPI_NXP_FLEXSPI is not set
+# CONFIG_SPI_OCTEON is not set
+# CONFIG_SPI_OC_TINY is not set
+# CONFIG_SPI_ORION is not set
+# CONFIG_SPI_PL022 is not set
+# CONFIG_SPI_PPC4xx is not set
+# CONFIG_SPI_PXA2XX is not set
+# CONFIG_SPI_PXA2XX_PCI is not set
+# CONFIG_SPI_QCOM_QSPI is not set
+# CONFIG_SPI_ROCKCHIP is not set
+CONFIG_SPI_ROCKCHIP_SFC=y
+# CONFIG_SPI_S3C64XX is not set
+# CONFIG_SPI_SC18IS602 is not set
+# CONFIG_SPI_SIFIVE is not set
+# CONFIG_SPI_SLAVE is not set
+# CONFIG_SPI_SPIDEV is not set
+# CONFIG_SPI_THUNDERX is not set
+# CONFIG_SPI_TI_QSPI is not set
+# CONFIG_SPI_TLE62X0 is not set
+# CONFIG_SPI_TOPCLIFF_PCH is not set
+# CONFIG_SPI_XCOMM is not set
+# CONFIG_SPI_XILINX is not set
+# CONFIG_SPI_XWAY is not set
+# CONFIG_SPI_ZYNQMP_GQSPI is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_SPMI is not set
+# CONFIG_SPS30 is not set
+# CONFIG_SPS30_I2C is not set
+CONFIG_SQUASHFS=y
+# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
+# CONFIG_SQUASHFS_DECOMP_MULTI is not set
+CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
+# CONFIG_SQUASHFS_DECOMP_SINGLE is not set
+CONFIG_SQUASHFS_EMBEDDED=y
+# CONFIG_SQUASHFS_FILE_CACHE is not set
+CONFIG_SQUASHFS_FILE_DIRECT=y
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+# CONFIG_SQUASHFS_LZ4 is not set
+# CONFIG_SQUASHFS_LZO is not set
+# CONFIG_SQUASHFS_XATTR is not set
+CONFIG_SQUASHFS_XZ=y
+# CONFIG_SQUASHFS_ZLIB is not set
+# CONFIG_SQUASHFS_ZSTD is not set
+# CONFIG_SRAM is not set
+# CONFIG_SRF04 is not set
+# CONFIG_SRF08 is not set
+# CONFIG_SSB is not set
+# CONFIG_SSB_DEBUG is not set
+# CONFIG_SSB_DRIVER_GPIO is not set
+# CONFIG_SSB_HOST_SOC is not set
+# CONFIG_SSB_PCMCIAHOST is not set
+CONFIG_SSB_POSSIBLE=y
+# CONFIG_SSB_SDIOHOST is not set
+# CONFIG_SSB_SILENT is not set
+# CONFIG_SSFDC is not set
+# CONFIG_STACKPROTECTOR is not set
+# CONFIG_STACKPROTECTOR_PER_TASK is not set
+# CONFIG_STACKPROTECTOR_STRONG is not set
+# CONFIG_STACKTRACE is not set
+# CONFIG_STACKTRACE_BUILD_ID is not set
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_STACK_HASH_ORDER=20
+# CONFIG_STACK_TRACER is not set
+# CONFIG_STACK_VALIDATION is not set
+CONFIG_STAGING=y
+# CONFIG_STAGING_BOARD is not set
+# CONFIG_STAGING_GASKET_FRAMEWORK is not set
+# CONFIG_STAGING_MEDIA is not set
+CONFIG_STANDALONE=y
+# CONFIG_STATIC_KEYS_SELFTEST is not set
+# CONFIG_STATIC_USERMODEHELPER is not set
+CONFIG_STDBINUTILS=y
+# CONFIG_STE10XP is not set
+# CONFIG_STE_MODEM_RPROC is not set
+# CONFIG_STK3310 is not set
+# CONFIG_STK8312 is not set
+# CONFIG_STK8BA50 is not set
+# CONFIG_STM is not set
+# CONFIG_STMMAC_ETH is not set
+# CONFIG_STMMAC_PCI is not set
+# CONFIG_STMMAC_PLATFORM is not set
+# CONFIG_STM_DUMMY is not set
+# CONFIG_STM_SOURCE_CONSOLE is not set
+CONFIG_STP=y
+# CONFIG_STREAM_PARSER is not set
+# CONFIG_STRICT_DEVMEM is not set
+CONFIG_STRICT_KERNEL_RWX=y
+CONFIG_STRICT_MODULE_RWX=y
+# CONFIG_STRING_SELFTEST is not set
+CONFIG_STRIP_ASM_SYMS=y
+# CONFIG_STX104 is not set
+# CONFIG_ST_UVIS25 is not set
+# CONFIG_SUN4I_GPADC is not set
+# CONFIG_SUN50I_DE2_BUS is not set
+# CONFIG_SUN50I_ERRATUM_UNKNOWN1 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_SUNRPC is not set
+# CONFIG_SUNRPC_DEBUG is not set
+CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES=y
+# CONFIG_SUNRPC_GSS is not set
+# CONFIG_SUNXI_SRAM is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_SURFACE_3_BUTTON is not set
+# CONFIG_SURFACE_PLATFORMS is not set
+# CONFIG_SUSPEND is not set
+# CONFIG_SUSPEND_SKIP_SYNC is not set
+CONFIG_SWAP=y
+# CONFIG_SWCONFIG is not set
+# CONFIG_SWCONFIG_B53 is not set
+# CONFIG_SWCONFIG_B53_MDIO_DRIVER is not set
+# CONFIG_SWCONFIG_B53_MMAP_DRIVER is not set
+# CONFIG_SWCONFIG_B53_SPI_DRIVER is not set
+# CONFIG_SWCONFIG_B53_SRAB_DRIVER is not set
+# CONFIG_SWCONFIG_LEDS is not set
+# CONFIG_SW_SYNC is not set
+# CONFIG_SX9310 is not set
+# CONFIG_SX9500 is not set
+# CONFIG_SXGBE_ETH is not set
+CONFIG_SYMBOLIC_ERRNAME=y
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_SYNC_FILE is not set
+# CONFIG_SYNOPSYS_DWC_ETH_QOS is not set
+# CONFIG_SYNTH_EVENTS is not set
+CONFIG_SYN_COOKIES=y
+# CONFIG_SYSCON_REBOOT_MODE is not set
+CONFIG_SYSCTL=y
+# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_SYSFS=y
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_SYSFS_SYSCALL is not set
+# CONFIG_SYSTEMPORT is not set
+# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set
+# CONFIG_SYSTEM_DATA_VERIFICATION is not set
+# CONFIG_SYSTEM_TRUSTED_KEYRING is not set
+CONFIG_SYSTEM_TRUSTED_KEYS=""
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_T5403 is not set
+# CONFIG_TARGET_CORE is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_TASKS_RCU is not set
+CONFIG_TASKS_TRACE_RCU_READ_MB=y
+# CONFIG_TASK_XACCT is not set
+# CONFIG_TC35815 is not set
+# CONFIG_TCG_ATMEL is not set
+# CONFIG_TCG_CRB is not set
+# CONFIG_TCG_FTPM_TEE is not set
+# CONFIG_TCG_INFINEON is not set
+# CONFIG_TCG_NSC is not set
+# CONFIG_TCG_ST33_I2C is not set
+# CONFIG_TCG_TIS is not set
+# CONFIG_TCG_TIS_I2C is not set
+# CONFIG_TCG_TIS_I2C_ATMEL is not set
+# CONFIG_TCG_TIS_I2C_CR50 is not set
+# CONFIG_TCG_TIS_I2C_INFINEON is not set
+# CONFIG_TCG_TIS_I2C_NUVOTON is not set
+# CONFIG_TCG_TIS_SPI is not set
+# CONFIG_TCG_TIS_ST33ZP24_I2C is not set
+# CONFIG_TCG_TIS_ST33ZP24_SPI is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_TCG_VTPM_PROXY is not set
+# CONFIG_TCG_XEN is not set
+# CONFIG_TCIC is not set
+CONFIG_TCP_CONG_ADVANCED=y
+# CONFIG_TCP_CONG_BBR is not set
+# CONFIG_TCP_CONG_BIC is not set
+# CONFIG_TCP_CONG_CDG is not set
+CONFIG_TCP_CONG_CUBIC=y
+# CONFIG_TCP_CONG_DCTCP is not set
+# CONFIG_TCP_CONG_HSTCP is not set
+# CONFIG_TCP_CONG_HTCP is not set
+# CONFIG_TCP_CONG_HYBLA is not set
+# CONFIG_TCP_CONG_ILLINOIS is not set
+# CONFIG_TCP_CONG_LP is not set
+# CONFIG_TCP_CONG_NV is not set
+# CONFIG_TCP_CONG_SCALABLE is not set
+# CONFIG_TCP_CONG_VEGAS is not set
+# CONFIG_TCP_CONG_VENO is not set
+# CONFIG_TCP_CONG_WESTWOOD is not set
+# CONFIG_TCP_CONG_YEAH is not set
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_TCS3414 is not set
+# CONFIG_TCS3472 is not set
+# CONFIG_TEE is not set
+# CONFIG_TEGRA_AHB is not set
+# CONFIG_TEGRA_HOST1X is not set
+# CONFIG_TEHUTI is not set
+# CONFIG_TERANETICS_PHY is not set
+# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
+# CONFIG_TEST_BITFIELD is not set
+# CONFIG_TEST_BITMAP is not set
+# CONFIG_TEST_BITOPS is not set
+# CONFIG_TEST_BLACKHOLE_DEV is not set
+# CONFIG_TEST_BPF is not set
+# CONFIG_TEST_DIV64 is not set
+# CONFIG_TEST_FIRMWARE is not set
+# CONFIG_TEST_FREE_PAGES is not set
+# CONFIG_TEST_HASH is not set
+# CONFIG_TEST_HEXDUMP is not set
+# CONFIG_TEST_IDA is not set
+# CONFIG_TEST_KMOD is not set
+# CONFIG_TEST_KSTRTOX is not set
+# CONFIG_TEST_LIST_SORT is not set
+# CONFIG_TEST_LKM is not set
+# CONFIG_TEST_LOCKUP is not set
+# CONFIG_TEST_MEMCAT_P is not set
+# CONFIG_TEST_MEMINIT is not set
+# CONFIG_TEST_MIN_HEAP is not set
+# CONFIG_TEST_OVERFLOW is not set
+# CONFIG_TEST_POWER is not set
+# CONFIG_TEST_PRINTF is not set
+# CONFIG_TEST_REF_TRACKER is not set
+# CONFIG_TEST_RHASHTABLE is not set
+# CONFIG_TEST_SCANF is not set
+# CONFIG_TEST_SIPHASH is not set
+# CONFIG_TEST_SORT is not set
+# CONFIG_TEST_STACKINIT is not set
+# CONFIG_TEST_STATIC_KEYS is not set
+# CONFIG_TEST_STRING_HELPERS is not set
+# CONFIG_TEST_STRSCPY is not set
+# CONFIG_TEST_SYSCTL is not set
+# CONFIG_TEST_UDELAY is not set
+# CONFIG_TEST_USER_COPY is not set
+# CONFIG_TEST_UUID is not set
+# CONFIG_TEST_VMALLOC is not set
+# CONFIG_TEST_XARRAY is not set
+CONFIG_TEXTSEARCH=y
+# CONFIG_TEXTSEARCH_BM is not set
+# CONFIG_TEXTSEARCH_FSM is not set
+# CONFIG_TEXTSEARCH_KMP is not set
+# CONFIG_THERMAL is not set
+# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
+# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set
+# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
+# CONFIG_THERMAL_EMULATION is not set
+# CONFIG_THERMAL_GOV_BANG_BANG is not set
+# CONFIG_THERMAL_GOV_FAIR_SHARE is not set
+# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set
+# CONFIG_THERMAL_GOV_USER_SPACE is not set
+# CONFIG_THERMAL_HWMON is not set
+# CONFIG_THERMAL_MMIO is not set
+# CONFIG_THERMAL_NETLINK is not set
+# CONFIG_THERMAL_STATISTICS is not set
+# CONFIG_THERMAL_WRITABLE_TRIPS is not set
+# CONFIG_THINKPAD_ACPI is not set
+CONFIG_THIN_ARCHIVES=y
+# CONFIG_THREAD_INFO_IN_TASK is not set
+# CONFIG_THRUSTMASTER_FF is not set
+# CONFIG_THUMB2_KERNEL is not set
+# CONFIG_THUNDERBOLT is not set
+# CONFIG_THUNDER_NIC_BGX is not set
+# CONFIG_THUNDER_NIC_PF is not set
+# CONFIG_THUNDER_NIC_RGX is not set
+# CONFIG_THUNDER_NIC_VF is not set
+# CONFIG_TICK_CPU_ACCOUNTING is not set
+CONFIG_TICK_ONESHOT=y
+CONFIG_TIERS_PER_GEN=4
+# CONFIG_TIFM_CORE is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_TIMB_DMA is not set
+CONFIG_TIMERFD=y
+# CONFIG_TIMER_STATS is not set
+# CONFIG_TIME_NS is not set
+# CONFIG_TINYDRM_HX8357D is not set
+# CONFIG_TINYDRM_ILI9225 is not set
+# CONFIG_TINYDRM_ILI9341 is not set
+# CONFIG_TINYDRM_ILI9486 is not set
+# CONFIG_TINYDRM_MI0283QT is not set
+# CONFIG_TINYDRM_REPAPER is not set
+# CONFIG_TINYDRM_ST7586 is not set
+# CONFIG_TINYDRM_ST7735R is not set
+CONFIG_TINY_RCU=y
+# CONFIG_TIPC is not set
+# CONFIG_TI_ADC081C is not set
+# CONFIG_TI_ADC0832 is not set
+# CONFIG_TI_ADC084S021 is not set
+# CONFIG_TI_ADC108S102 is not set
+# CONFIG_TI_ADC12138 is not set
+# CONFIG_TI_ADC128S052 is not set
+# CONFIG_TI_ADC161S626 is not set
+# CONFIG_TI_ADS1015 is not set
+# CONFIG_TI_ADS124S08 is not set
+# CONFIG_TI_ADS131E08 is not set
+# CONFIG_TI_ADS7950 is not set
+# CONFIG_TI_ADS8344 is not set
+# CONFIG_TI_ADS8688 is not set
+# CONFIG_TI_AM335X_ADC is not set
+# CONFIG_TI_CPSW is not set
+# CONFIG_TI_CPSW_ALE is not set
+# CONFIG_TI_CPSW_PHY_SEL is not set
+# CONFIG_TI_CPTS is not set
+# CONFIG_TI_DAC082S085 is not set
+# CONFIG_TI_DAC5571 is not set
+# CONFIG_TI_DAC7311 is not set
+# CONFIG_TI_DAC7512 is not set
+# CONFIG_TI_DAC7612 is not set
+# CONFIG_TI_DAVINCI_CPDMA is not set
+# CONFIG_TI_DAVINCI_MDIO is not set
+# CONFIG_TI_ST is not set
+# CONFIG_TI_SYSCON_RESET is not set
+# CONFIG_TI_TLC4541 is not set
+# CONFIG_TI_TSC2046 is not set
+# CONFIG_TLAN is not set
+# CONFIG_TLS is not set
+# CONFIG_TMD_HERMES is not set
+# CONFIG_TMP006 is not set
+# CONFIG_TMP007 is not set
+# CONFIG_TMP117 is not set
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_INODE64 is not set
+# CONFIG_TMPFS_POSIX_ACL is not set
+CONFIG_TMPFS_XATTR=y
+# CONFIG_TOPSTAR_LAPTOP is not set
+# CONFIG_TORTURE_TEST is not set
+# CONFIG_TOSHIBA_HAPS is not set
+# CONFIG_TOUCHSCREEN_88PM860X is not set
+# CONFIG_TOUCHSCREEN_AD7877 is not set
+# CONFIG_TOUCHSCREEN_AD7879 is not set
+# CONFIG_TOUCHSCREEN_AD7879_I2C is not set
+# CONFIG_TOUCHSCREEN_AD7879_SPI is not set
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_ADS7846 is not set
+# CONFIG_TOUCHSCREEN_AR1021_I2C is not set
+# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
+# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set
+# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
+# CONFIG_TOUCHSCREEN_BU21013 is not set
+# CONFIG_TOUCHSCREEN_BU21029 is not set
+# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set
+# CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set
+# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set
+# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set
+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
+# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
+# CONFIG_TOUCHSCREEN_CYTTSP4_I2C is not set
+# CONFIG_TOUCHSCREEN_CYTTSP4_SPI is not set
+# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
+# CONFIG_TOUCHSCREEN_CYTTSP_I2C is not set
+# CONFIG_TOUCHSCREEN_CYTTSP_SPI is not set
+# CONFIG_TOUCHSCREEN_DA9034 is not set
+# CONFIG_TOUCHSCREEN_DA9052 is not set
+# CONFIG_TOUCHSCREEN_DYNAPRO is not set
+# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
+# CONFIG_TOUCHSCREEN_EETI is not set
+# CONFIG_TOUCHSCREEN_EGALAX is not set
+# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
+# CONFIG_TOUCHSCREEN_EKTF2127 is not set
+# CONFIG_TOUCHSCREEN_ELAN is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_EXC3000 is not set
+# CONFIG_TOUCHSCREEN_FUJITSU is not set
+# CONFIG_TOUCHSCREEN_GOODIX is not set
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
+# CONFIG_TOUCHSCREEN_HIDEEP is not set
+# CONFIG_TOUCHSCREEN_HP600 is not set
+# CONFIG_TOUCHSCREEN_HP7XX is not set
+# CONFIG_TOUCHSCREEN_HTCPEN is not set
+# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set
+# CONFIG_TOUCHSCREEN_ILI210X is not set
+# CONFIG_TOUCHSCREEN_ILITEK is not set
+# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set
+# CONFIG_TOUCHSCREEN_INEXIO is not set
+# CONFIG_TOUCHSCREEN_IPAQ_MICRO is not set
+# CONFIG_TOUCHSCREEN_IPROC is not set
+# CONFIG_TOUCHSCREEN_IQS5XX is not set
+# CONFIG_TOUCHSCREEN_LPC32XX is not set
+# CONFIG_TOUCHSCREEN_MAX11801 is not set
+# CONFIG_TOUCHSCREEN_MC13783 is not set
+# CONFIG_TOUCHSCREEN_MCS5000 is not set
+# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
+# CONFIG_TOUCHSCREEN_MIGOR is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_MMS114 is not set
+# CONFIG_TOUCHSCREEN_MSG2638 is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MX25 is not set
+# CONFIG_TOUCHSCREEN_MXS_LRADC is not set
+# CONFIG_TOUCHSCREEN_PCAP is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_PIXCIR is not set
+# CONFIG_TOUCHSCREEN_PROPERTIES is not set
+# CONFIG_TOUCHSCREEN_RASPBERRYPI_FW is not set
+# CONFIG_TOUCHSCREEN_RM_TS is not set
+# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set
+# CONFIG_TOUCHSCREEN_RPI_FT5406 is not set
+# CONFIG_TOUCHSCREEN_S3C2410 is not set
+# CONFIG_TOUCHSCREEN_S6SY761 is not set
+# CONFIG_TOUCHSCREEN_SILEAD is not set
+# CONFIG_TOUCHSCREEN_SIS_I2C is not set
+# CONFIG_TOUCHSCREEN_ST1232 is not set
+# CONFIG_TOUCHSCREEN_STMFTS is not set
+# CONFIG_TOUCHSCREEN_STMPE is not set
+# CONFIG_TOUCHSCREEN_SUN4I is not set
+# CONFIG_TOUCHSCREEN_SUR40 is not set
+# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set
+# CONFIG_TOUCHSCREEN_SX8654 is not set
+# CONFIG_TOUCHSCREEN_TI_AM335X_TSC is not set
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_TPS6507X is not set
+# CONFIG_TOUCHSCREEN_TS4800 is not set
+# CONFIG_TOUCHSCREEN_TSC2004 is not set
+# CONFIG_TOUCHSCREEN_TSC2005 is not set
+# CONFIG_TOUCHSCREEN_TSC2007 is not set
+# CONFIG_TOUCHSCREEN_TSC2007_IIO is not set
+# CONFIG_TOUCHSCREEN_TSC200X_CORE is not set
+# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+# CONFIG_TOUCHSCREEN_USB_3M is not set
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set
+# CONFIG_TOUCHSCREEN_USB_E2I is not set
+# CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set
+# CONFIG_TOUCHSCREEN_USB_EGALAX is not set
+# CONFIG_TOUCHSCREEN_USB_ELO is not set
+# CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set
+# CONFIG_TOUCHSCREEN_USB_ETURBO is not set
+# CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set
+# CONFIG_TOUCHSCREEN_USB_GOTOP is not set
+# CONFIG_TOUCHSCREEN_USB_GUNZE is not set
+# CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set
+# CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set
+# CONFIG_TOUCHSCREEN_USB_ITM is not set
+# CONFIG_TOUCHSCREEN_USB_JASTEC is not set
+# CONFIG_TOUCHSCREEN_USB_NEXIO is not set
+# CONFIG_TOUCHSCREEN_USB_PANJIT is not set
+# CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set
+# CONFIG_TOUCHSCREEN_W90X900 is not set
+# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
+# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set
+# CONFIG_TOUCHSCREEN_WM831X is not set
+# CONFIG_TOUCHSCREEN_WM9705 is not set
+# CONFIG_TOUCHSCREEN_WM9712 is not set
+# CONFIG_TOUCHSCREEN_WM9713 is not set
+# CONFIG_TOUCHSCREEN_WM97XX is not set
+# CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE is not set
+# CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE is not set
+# CONFIG_TOUCHSCREEN_ZET6223 is not set
+# CONFIG_TOUCHSCREEN_ZFORCE is not set
+# CONFIG_TOUCHSCREEN_ZINITIX is not set
+# CONFIG_TPL0102 is not set
+# CONFIG_TPS6105X is not set
+# CONFIG_TPS65010 is not set
+# CONFIG_TPS6507X is not set
+# CONFIG_TRACEPOINT_BENCHMARK is not set
+# CONFIG_TRACER_SNAPSHOT is not set
+# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set
+# CONFIG_TRACE_BRANCH_PROFILING is not set
+# CONFIG_TRACE_EVAL_MAP_FILE is not set
+# CONFIG_TRACE_EVENT_INJECT is not set
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+# CONFIG_TRACE_SINK is not set
+# CONFIG_TRACING_EVENTS_GPIO is not set
+CONFIG_TRACING_SUPPORT=y
+CONFIG_TRAD_SIGNALS=y
+# CONFIG_TRANSPARENT_HUGEPAGE is not set
+# CONFIG_TRANS_TABLE is not set
+# CONFIG_TREE_RCU is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_TRIM_UNUSED_KSYMS is not set
+# CONFIG_TRUSTED_FOUNDATIONS is not set
+# CONFIG_TRUSTED_KEYS is not set
+# CONFIG_TRUSTED_KEYS_TPM is not set
+# CONFIG_TSL2583 is not set
+# CONFIG_TSL2591 is not set
+# CONFIG_TSL2772 is not set
+# CONFIG_TSL2x7x is not set
+# CONFIG_TSL4531 is not set
+# CONFIG_TSNEP is not set
+# CONFIG_TSYS01 is not set
+# CONFIG_TSYS02D is not set
+# CONFIG_TTPCI_EEPROM is not set
+CONFIG_TTY=y
+# CONFIG_TTY_PRINTK is not set
+# CONFIG_TUN is not set
+# CONFIG_TUN_VNET_CROSS_LE is not set
+# CONFIG_TWL4030_CORE is not set
+# CONFIG_TWL4030_MADC is not set
+# CONFIG_TWL6030_GPADC is not set
+# CONFIG_TWL6040_CORE is not set
+# CONFIG_TXGBE is not set
+# CONFIG_TYPEC is not set
+# CONFIG_TYPEC_ANX7411 is not set
+# CONFIG_TYPEC_MUX_FSA4480 is not set
+# CONFIG_TYPEC_RT1719 is not set
+# CONFIG_TYPEC_TCPM is not set
+# CONFIG_TYPEC_UCSI is not set
+# CONFIG_TYPEC_WUSB3801 is not set
+# CONFIG_TYPHOON is not set
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+# CONFIG_UBIFS_ATIME_SUPPORT is not set
+# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
+# CONFIG_UBIFS_FS_AUTHENTICATION is not set
+# CONFIG_UBIFS_FS_ENCRYPTION is not set
+CONFIG_UBIFS_FS_LZO=y
+# CONFIG_UBIFS_FS_SECURITY is not set
+CONFIG_UBIFS_FS_XATTR=y
+CONFIG_UBIFS_FS_ZLIB=y
+CONFIG_UBIFS_FS_ZSTD=y
+# CONFIG_UBSAN is not set
+CONFIG_UBSAN_ALIGNMENT=y
+# CONFIG_UCB1400_CORE is not set
+# CONFIG_UCSI is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDMABUF is not set
+CONFIG_UEVENT_HELPER=y
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_UFS_FS is not set
+# CONFIG_UHID is not set
+CONFIG_UID16=y
+# CONFIG_UIO is not set
+# CONFIG_ULTRA is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_UNICODE is not set
+# CONFIG_UNISYSSPAR is not set
+# CONFIG_UNISYS_VISORBUS is not set
+CONFIG_UNIX=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_UNIX_DIAG is not set
+CONFIG_UNIX_SCM=y
+# CONFIG_UNMAP_KERNEL_AT_EL0 is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_UNWINDER_FRAME_POINTER is not set
+# CONFIG_UPROBES is not set
+# CONFIG_UPROBE_EVENTS is not set
+# CONFIG_US5182D is not set
+# CONFIG_USB is not set
+# CONFIG_USB4 is not set
+# CONFIG_USBIP_CORE is not set
+CONFIG_USBIP_VHCI_HC_PORTS=8
+CONFIG_USBIP_VHCI_NR_HCS=1
+# CONFIG_USBIP_VUDC is not set
+# CONFIG_USBPCWATCHDOG is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_AIRSPY is not set
+CONFIG_USB_ALI_M5632=y
+# CONFIG_USB_AMD5536UDC is not set
+CONFIG_USB_AN2720=y
+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARMLINUX=y
+# CONFIG_USB_ATM is not set
+CONFIG_USB_AUTOSUSPEND_DELAY=2
+# CONFIG_USB_BDC_UDC is not set
+CONFIG_USB_BELKIN=y
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_CDC_COMPOSITE is not set
+# CONFIG_USB_CDNS3 is not set
+# CONFIG_USB_CDNS_SUPPORT is not set
+# CONFIG_USB_CHAOSKEY is not set
+# CONFIG_USB_CHIPIDEA is not set
+# CONFIG_USB_CHIPIDEA_GENERIC is not set
+# CONFIG_USB_CHIPIDEA_IMX is not set
+# CONFIG_USB_CHIPIDEA_MSM is not set
+# CONFIG_USB_CHIPIDEA_PCI is not set
+# CONFIG_USB_CHIPIDEA_TEGRA is not set
+# CONFIG_USB_CONFIGFS is not set
+# CONFIG_USB_CONN_GPIO is not set
+# CONFIG_USB_CXACRU is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+CONFIG_USB_DEFAULT_PERSIST=y
+# CONFIG_USB_DSBR is not set
+# CONFIG_USB_DUMMY_HCD is not set
+# CONFIG_USB_DWC2 is not set
+# CONFIG_USB_DWC2_DEBUG is not set
+# CONFIG_USB_DWC2_DUAL_ROLE is not set
+# CONFIG_USB_DWC2_HOST is not set
+# CONFIG_USB_DWC2_PERIPHERAL is not set
+# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set
+# CONFIG_USB_DWC3 is not set
+# CONFIG_USB_DWC3_EXYNOS is not set
+# CONFIG_USB_DWC3_HAPS is not set
+# CONFIG_USB_DWC3_KEYSTONE is not set
+# CONFIG_USB_DWC3_OF_SIMPLE is not set
+# CONFIG_USB_DWC3_PCI is not set
+# CONFIG_USB_DWC3_QCOM is not set
+# CONFIG_USB_DWC3_ULPI is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_EG20T is not set
+# CONFIG_USB_EHCI_ATH79 is not set
+# CONFIG_USB_EHCI_FSL is not set
+# CONFIG_USB_EHCI_HCD is not set
+# CONFIG_USB_EHCI_HCD_AT91 is not set
+# CONFIG_USB_EHCI_HCD_OMAP is not set
+# CONFIG_USB_EHCI_HCD_PPC_OF is not set
+# CONFIG_USB_EHCI_MSM is not set
+# CONFIG_USB_EHCI_MV is not set
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+# CONFIG_USB_EHSET_TEST_FIXTURE is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EPSON2888 is not set
+# CONFIG_USB_EZUSB_FX2 is not set
+# CONFIG_USB_FEW_INIT_RETRIES is not set
+# CONFIG_USB_FOTG210_HCD is not set
+# CONFIG_USB_FOTG210_UDC is not set
+# CONFIG_USB_FSL_USB2 is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_FUNCTIONFS is not set
+# CONFIG_USB_FUSB300 is not set
+# CONFIG_USB_GADGET is not set
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_GADGET_DEBUG is not set
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+# CONFIG_USB_GADGET_DEBUG_FS is not set
+CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
+CONFIG_USB_GADGET_VBUS_DRAW=2
+# CONFIG_USB_GADGET_XILINX is not set
+# CONFIG_USB_GL860 is not set
+# CONFIG_USB_GOKU is not set
+# CONFIG_USB_GPIO_VBUS is not set
+# CONFIG_USB_GR_UDC is not set
+# CONFIG_USB_GSPCA is not set
+# CONFIG_USB_GSPCA_BENQ is not set
+# CONFIG_USB_GSPCA_CONEX is not set
+# CONFIG_USB_GSPCA_CPIA1 is not set
+# CONFIG_USB_GSPCA_DTCS033 is not set
+# CONFIG_USB_GSPCA_ETOMS is not set
+# CONFIG_USB_GSPCA_FINEPIX is not set
+# CONFIG_USB_GSPCA_JEILINJ is not set
+# CONFIG_USB_GSPCA_JL2005BCD is not set
+# CONFIG_USB_GSPCA_KINECT is not set
+# CONFIG_USB_GSPCA_KONICA is not set
+# CONFIG_USB_GSPCA_MARS is not set
+# CONFIG_USB_GSPCA_MR97310A is not set
+# CONFIG_USB_GSPCA_NW80X is not set
+# CONFIG_USB_GSPCA_OV519 is not set
+# CONFIG_USB_GSPCA_OV534 is not set
+# CONFIG_USB_GSPCA_OV534_9 is not set
+# CONFIG_USB_GSPCA_PAC207 is not set
+# CONFIG_USB_GSPCA_PAC7302 is not set
+# CONFIG_USB_GSPCA_PAC7311 is not set
+# CONFIG_USB_GSPCA_SE401 is not set
+# CONFIG_USB_GSPCA_SN9C2028 is not set
+# CONFIG_USB_GSPCA_SN9C20X is not set
+# CONFIG_USB_GSPCA_SONIXB is not set
+# CONFIG_USB_GSPCA_SONIXJ is not set
+# CONFIG_USB_GSPCA_SPCA1528 is not set
+# CONFIG_USB_GSPCA_SPCA500 is not set
+# CONFIG_USB_GSPCA_SPCA501 is not set
+# CONFIG_USB_GSPCA_SPCA505 is not set
+# CONFIG_USB_GSPCA_SPCA506 is not set
+# CONFIG_USB_GSPCA_SPCA508 is not set
+# CONFIG_USB_GSPCA_SPCA561 is not set
+# CONFIG_USB_GSPCA_SQ905 is not set
+# CONFIG_USB_GSPCA_SQ905C is not set
+# CONFIG_USB_GSPCA_SQ930X is not set
+# CONFIG_USB_GSPCA_STK014 is not set
+# CONFIG_USB_GSPCA_STK1135 is not set
+# CONFIG_USB_GSPCA_STV0680 is not set
+# CONFIG_USB_GSPCA_SUNPLUS is not set
+# CONFIG_USB_GSPCA_T613 is not set
+# CONFIG_USB_GSPCA_TOPRO is not set
+# CONFIG_USB_GSPCA_TOUPTEK is not set
+# CONFIG_USB_GSPCA_TV8532 is not set
+# CONFIG_USB_GSPCA_VC032X is not set
+# CONFIG_USB_GSPCA_VICAM is not set
+# CONFIG_USB_GSPCA_XIRLINK_CIT is not set
+# CONFIG_USB_GSPCA_ZC3XX is not set
+# CONFIG_USB_G_ACM_MS is not set
+# CONFIG_USB_G_DBGP is not set
+# CONFIG_USB_G_HID is not set
+# CONFIG_USB_G_MULTI is not set
+# CONFIG_USB_G_NCM is not set
+# CONFIG_USB_G_NOKIA is not set
+# CONFIG_USB_G_PRINTER is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_G_WEBCAM is not set
+# CONFIG_USB_HACKRF is not set
+# CONFIG_USB_HCD_TEST_MODE is not set
+# CONFIG_USB_HID is not set
+# CONFIG_USB_HIDDEV is not set
+# CONFIG_USB_HSIC_USB3503 is not set
+# CONFIG_USB_HSIC_USB4604 is not set
+# CONFIG_USB_HSO is not set
+# CONFIG_USB_HUB_USB251XB is not set
+# CONFIG_USB_HWA_HCD is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_IMX21_HCD is not set
+# CONFIG_USB_IOWARRIOR is not set
+# CONFIG_USB_IPHETH is not set
+# CONFIG_USB_ISIGHTFW is not set
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1301 is not set
+# CONFIG_USB_ISP1362_HCD is not set
+# CONFIG_USB_ISP1760 is not set
+# CONFIG_USB_ISP1760_HCD is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_KBD is not set
+# CONFIG_USB_KC2190 is not set
+# CONFIG_USB_LAN78XX is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set
+# CONFIG_USB_LED_TRIG is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LGM_PHY is not set
+# CONFIG_USB_LINK_LAYER_TEST is not set
+# CONFIG_USB_M5602 is not set
+# CONFIG_USB_M66592 is not set
+# CONFIG_USB_MASS_STORAGE is not set
+# CONFIG_USB_MAX3420_UDC is not set
+# CONFIG_USB_MAX3421_HCD is not set
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_MON is not set
+# CONFIG_USB_MOUSE is not set
+# CONFIG_USB_MSI2500 is not set
+# CONFIG_USB_MSM_OTG is not set
+# CONFIG_USB_MTU3 is not set
+# CONFIG_USB_MUSB_HDRC is not set
+# CONFIG_USB_MV_U3D is not set
+# CONFIG_USB_MV_UDC is not set
+# CONFIG_USB_MXS_PHY is not set
+# CONFIG_USB_NET2272 is not set
+# CONFIG_USB_NET2280 is not set
+# CONFIG_USB_NET_AQC111 is not set
+# CONFIG_USB_NET_AX88179_178A is not set
+# CONFIG_USB_NET_AX8817X is not set
+# CONFIG_USB_NET_CDCETHER is not set
+# CONFIG_USB_NET_CDC_EEM is not set
+# CONFIG_USB_NET_CDC_MBIM is not set
+# CONFIG_USB_NET_CDC_NCM is not set
+# CONFIG_USB_NET_CDC_SUBSET is not set
+# CONFIG_USB_NET_CH9200 is not set
+# CONFIG_USB_NET_CX82310_ETH is not set
+# CONFIG_USB_NET_DM9601 is not set
+# CONFIG_USB_NET_DRIVERS is not set
+# CONFIG_USB_NET_GL620A is not set
+# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set
+# CONFIG_USB_NET_INT51X1 is not set
+# CONFIG_USB_NET_KALMIA is not set
+# CONFIG_USB_NET_MCS7830 is not set
+# CONFIG_USB_NET_NET1080 is not set
+# CONFIG_USB_NET_PLUSB is not set
+# CONFIG_USB_NET_QMI_WWAN is not set
+# CONFIG_USB_NET_RNDIS_HOST is not set
+# CONFIG_USB_NET_RNDIS_WLAN is not set
+# CONFIG_USB_NET_SMSC75XX is not set
+# CONFIG_USB_NET_SMSC95XX is not set
+# CONFIG_USB_NET_SR9700 is not set
+# CONFIG_USB_NET_SR9800 is not set
+# CONFIG_USB_NET_ZAURUS is not set
+# CONFIG_USB_OHCI_HCD is not set
+# CONFIG_USB_OHCI_HCD_PCI is not set
+# CONFIG_USB_OHCI_HCD_PPC_OF is not set
+# CONFIG_USB_OHCI_HCD_PPC_OF_BE is not set
+# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
+# CONFIG_USB_OHCI_HCD_SSB is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_ONBOARD_HUB is not set
+# CONFIG_USB_OTG is not set
+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set
+# CONFIG_USB_OTG_FSM is not set
+# CONFIG_USB_OTG_PRODUCTLIST is not set
+# CONFIG_USB_OTG_WHITELIST is not set
+# CONFIG_USB_OXU210HP_HCD is not set
+# CONFIG_USB_PCI is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_PHY is not set
+# CONFIG_USB_PRINTER is not set
+# CONFIG_USB_PWC_INPUT_EVDEV is not set
+# CONFIG_USB_PXA27X is not set
+# CONFIG_USB_R8A66597 is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_RAW_GADGET is not set
+# CONFIG_USB_RCAR_PHY is not set
+# CONFIG_USB_RENESAS_USBHS is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_ROLES_INTEL_XHCI is not set
+# CONFIG_USB_ROLE_SWITCH is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_RTL8152 is not set
+# CONFIG_USB_RTL8153_ECM is not set
+# CONFIG_USB_S2255 is not set
+# CONFIG_USB_SERIAL is not set
+# CONFIG_USB_SERIAL_AIRCABLE is not set
+# CONFIG_USB_SERIAL_ARK3116 is not set
+# CONFIG_USB_SERIAL_BELKIN is not set
+# CONFIG_USB_SERIAL_CH341 is not set
+# CONFIG_USB_SERIAL_CP210X is not set
+# CONFIG_USB_SERIAL_CYBERJACK is not set
+# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
+# CONFIG_USB_SERIAL_DEBUG is not set
+# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
+# CONFIG_USB_SERIAL_EDGEPORT is not set
+# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
+# CONFIG_USB_SERIAL_EMPEG is not set
+# CONFIG_USB_SERIAL_F81232 is not set
+# CONFIG_USB_SERIAL_F8153X is not set
+# CONFIG_USB_SERIAL_FTDI_SIO is not set
+# CONFIG_USB_SERIAL_GARMIN is not set
+CONFIG_USB_SERIAL_GENERIC=y
+# CONFIG_USB_SERIAL_IPAQ is not set
+# CONFIG_USB_SERIAL_IPW is not set
+# CONFIG_USB_SERIAL_IR is not set
+# CONFIG_USB_SERIAL_IUU is not set
+# CONFIG_USB_SERIAL_KEYSPAN is not set
+CONFIG_USB_SERIAL_KEYSPAN_MPR=y
+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
+CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
+# CONFIG_USB_SERIAL_KLSI is not set
+# CONFIG_USB_SERIAL_KOBIL_SCT is not set
+# CONFIG_USB_SERIAL_MCT_U232 is not set
+# CONFIG_USB_SERIAL_METRO is not set
+# CONFIG_USB_SERIAL_MOS7715_PARPORT is not set
+# CONFIG_USB_SERIAL_MOS7720 is not set
+# CONFIG_USB_SERIAL_MOS7840 is not set
+# CONFIG_USB_SERIAL_MXUPORT is not set
+# CONFIG_USB_SERIAL_NAVMAN is not set
+# CONFIG_USB_SERIAL_OMNINET is not set
+# CONFIG_USB_SERIAL_OPTICON is not set
+# CONFIG_USB_SERIAL_OPTION is not set
+# CONFIG_USB_SERIAL_OTI6858 is not set
+# CONFIG_USB_SERIAL_PL2303 is not set
+# CONFIG_USB_SERIAL_QCAUX is not set
+# CONFIG_USB_SERIAL_QT2 is not set
+# CONFIG_USB_SERIAL_QUALCOMM is not set
+# CONFIG_USB_SERIAL_SAFE is not set
+CONFIG_USB_SERIAL_SAFE_PADDED=y
+# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
+# CONFIG_USB_SERIAL_SIMPLE is not set
+# CONFIG_USB_SERIAL_SPCP8X5 is not set
+# CONFIG_USB_SERIAL_SSU100 is not set
+# CONFIG_USB_SERIAL_SYMBOL is not set
+# CONFIG_USB_SERIAL_TI is not set
+# CONFIG_USB_SERIAL_UPD78F0730 is not set
+# CONFIG_USB_SERIAL_VISOR is not set
+# CONFIG_USB_SERIAL_WHITEHEAT is not set
+# CONFIG_USB_SERIAL_WISHBONE is not set
+# CONFIG_USB_SERIAL_XIRCOM is not set
+# CONFIG_USB_SERIAL_XR is not set
+# CONFIG_USB_SERIAL_XSENS_MT is not set
+# CONFIG_USB_SEVSEG is not set
+# CONFIG_USB_SIERRA_NET is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_SNP_UDC_PLAT is not set
+# CONFIG_USB_SPEEDTOUCH is not set
+# CONFIG_USB_STKWEBCAM is not set
+# CONFIG_USB_STORAGE is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_ENE_UB6250 is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_ONETOUCH is not set
+# CONFIG_USB_STORAGE_REALTEK is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STV06XX is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_USB_SWITCH_FSA9480 is not set
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_TMC is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_UAS is not set
+# CONFIG_USB_UEAGLEATM is not set
+# CONFIG_USB_ULPI is not set
+# CONFIG_USB_ULPI_BUS is not set
+# CONFIG_USB_USBNET is not set
+# CONFIG_USB_USS720 is not set
+# CONFIG_USB_VIDEO_CLASS is not set
+CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
+# CONFIG_USB_VL600 is not set
+# CONFIG_USB_WDM is not set
+# CONFIG_USB_WHCI_HCD is not set
+# CONFIG_USB_WUSB is not set
+# CONFIG_USB_WUSB_CBAF is not set
+# CONFIG_USB_XHCI_DBGCAP is not set
+# CONFIG_USB_XHCI_HCD is not set
+# CONFIG_USB_XHCI_MVEBU is not set
+# CONFIG_USB_XHCI_PCI_RENESAS is not set
+# CONFIG_USB_XUSBATM is not set
+# CONFIG_USB_YUREX is not set
+# CONFIG_USB_ZD1201 is not set
+# CONFIG_USB_ZERO is not set
+# CONFIG_USB_ZR364XX is not set
+# CONFIG_USELIB is not set
+# CONFIG_USERFAULTFD is not set
+# CONFIG_USERIO is not set
+# CONFIG_USER_DECRYPTED_DATA is not set
+# CONFIG_USE_OF is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_UWB is not set
+# CONFIG_U_SERIAL_CONSOLE is not set
+# CONFIG_V4L_MEM2MEM_DRIVERS is not set
+# CONFIG_V4L_PLATFORM_DRIVERS is not set
+# CONFIG_V4L_TEST_DRIVERS is not set
+# CONFIG_VALIDATE_FS_PARSER is not set
+# CONFIG_VBOXGUEST is not set
+# CONFIG_VCNL3020 is not set
+# CONFIG_VCNL4000 is not set
+# CONFIG_VCNL4035 is not set
+# CONFIG_VCPU_STALL_DETECTOR is not set
+# CONFIG_VDPA is not set
+CONFIG_VDSO=y
+# CONFIG_VEML6030 is not set
+# CONFIG_VEML6070 is not set
+# CONFIG_VETH is not set
+# CONFIG_VEXPRESS_CONFIG is not set
+# CONFIG_VF610_ADC is not set
+# CONFIG_VF610_DAC is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_VFIO is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_VGA_ARB is not set
+# CONFIG_VGA_SWITCHEROO is not set
+# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set
+CONFIG_VHOST_MENU=y
+# CONFIG_VHOST_NET is not set
+# CONFIG_VHOST_VSOCK is not set
+# CONFIG_VIA_RHINE is not set
+# CONFIG_VIA_VELOCITY is not set
+# CONFIG_VIDEO_AD5820 is not set
+# CONFIG_VIDEO_AD9389B is not set
+# CONFIG_VIDEO_ADP1653 is not set
+# CONFIG_VIDEO_ADV7170 is not set
+# CONFIG_VIDEO_ADV7175 is not set
+# CONFIG_VIDEO_ADV7180 is not set
+# CONFIG_VIDEO_ADV7183 is not set
+# CONFIG_VIDEO_ADV7343 is not set
+# CONFIG_VIDEO_ADV7393 is not set
+# CONFIG_VIDEO_ADV748X is not set
+# CONFIG_VIDEO_ADV7511 is not set
+# CONFIG_VIDEO_ADV7604 is not set
+# CONFIG_VIDEO_ADV7842 is not set
+# CONFIG_VIDEO_ADV_DEBUG is not set
+# CONFIG_VIDEO_AK7375 is not set
+# CONFIG_VIDEO_AK881X is not set
+# CONFIG_VIDEO_ASPEED is not set
+# CONFIG_VIDEO_AU0828 is not set
+# CONFIG_VIDEO_BT819 is not set
+# CONFIG_VIDEO_BT848 is not set
+# CONFIG_VIDEO_BT856 is not set
+# CONFIG_VIDEO_BT866 is not set
+# CONFIG_VIDEO_CADENCE is not set
+# CONFIG_VIDEO_CAFE_CCIC is not set
+# CONFIG_VIDEO_CCS is not set
+# CONFIG_VIDEO_CS3308 is not set
+# CONFIG_VIDEO_CS5345 is not set
+# CONFIG_VIDEO_CS53L32A is not set
+# CONFIG_VIDEO_CX231XX is not set
+# CONFIG_VIDEO_CX2341X is not set
+# CONFIG_VIDEO_CX25840 is not set
+# CONFIG_VIDEO_CX88 is not set
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_VIDEO_DM6446_CCDC is not set
+# CONFIG_VIDEO_DT3155 is not set
+# CONFIG_VIDEO_DW9714 is not set
+# CONFIG_VIDEO_DW9768 is not set
+# CONFIG_VIDEO_DW9807_VCM is not set
+# CONFIG_VIDEO_EM28XX is not set
+# CONFIG_VIDEO_ET8EK8 is not set
+# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
+# CONFIG_VIDEO_GO7007 is not set
+# CONFIG_VIDEO_GS1662 is not set
+# CONFIG_VIDEO_HANTRO_ROCKCHIP is not set
+# CONFIG_VIDEO_HDPVR is not set
+# CONFIG_VIDEO_HEXIUM_GEMINI is not set
+# CONFIG_VIDEO_HEXIUM_ORION is not set
+# CONFIG_VIDEO_HI556 is not set
+# CONFIG_VIDEO_I2C is not set
+# CONFIG_VIDEO_IMX214 is not set
+# CONFIG_VIDEO_IMX219 is not set
+# CONFIG_VIDEO_IMX258 is not set
+# CONFIG_VIDEO_IMX274 is not set
+# CONFIG_VIDEO_IMX290 is not set
+# CONFIG_VIDEO_IMX319 is not set
+# CONFIG_VIDEO_IMX334 is not set
+# CONFIG_VIDEO_IMX355 is not set
+# CONFIG_VIDEO_IMX477 is not set
+# CONFIG_VIDEO_IRS1125 is not set
+# CONFIG_VIDEO_IR_I2C is not set
+# CONFIG_VIDEO_IVTV is not set
+# CONFIG_VIDEO_KS0127 is not set
+# CONFIG_VIDEO_LM3560 is not set
+# CONFIG_VIDEO_LM3646 is not set
+# CONFIG_VIDEO_M52790 is not set
+# CONFIG_VIDEO_M5MOLS is not set
+# CONFIG_VIDEO_MAX9286 is not set
+# CONFIG_VIDEO_ML86V7667 is not set
+# CONFIG_VIDEO_MSP3400 is not set
+# CONFIG_VIDEO_MT9M001 is not set
+# CONFIG_VIDEO_MT9M032 is not set
+# CONFIG_VIDEO_MT9M111 is not set
+# CONFIG_VIDEO_MT9P031 is not set
+# CONFIG_VIDEO_MT9T001 is not set
+# CONFIG_VIDEO_MT9T112 is not set
+# CONFIG_VIDEO_MT9V011 is not set
+# CONFIG_VIDEO_MT9V032 is not set
+# CONFIG_VIDEO_MT9V111 is not set
+# CONFIG_VIDEO_MUX is not set
+# CONFIG_VIDEO_MXB is not set
+# CONFIG_VIDEO_NOON010PC30 is not set
+# CONFIG_VIDEO_OMAP2_VOUT is not set
+# CONFIG_VIDEO_OV02A10 is not set
+# CONFIG_VIDEO_OV13858 is not set
+# CONFIG_VIDEO_OV2640 is not set
+# CONFIG_VIDEO_OV2659 is not set
+# CONFIG_VIDEO_OV2680 is not set
+# CONFIG_VIDEO_OV2685 is not set
+# CONFIG_VIDEO_OV2740 is not set
+# CONFIG_VIDEO_OV5640 is not set
+# CONFIG_VIDEO_OV5645 is not set
+# CONFIG_VIDEO_OV5647 is not set
+# CONFIG_VIDEO_OV5670 is not set
+# CONFIG_VIDEO_OV5675 is not set
+# CONFIG_VIDEO_OV5695 is not set
+# CONFIG_VIDEO_OV6650 is not set
+# CONFIG_VIDEO_OV7251 is not set
+# CONFIG_VIDEO_OV7640 is not set
+# CONFIG_VIDEO_OV7670 is not set
+# CONFIG_VIDEO_OV772X is not set
+# CONFIG_VIDEO_OV7740 is not set
+# CONFIG_VIDEO_OV8856 is not set
+# CONFIG_VIDEO_OV9281 is not set
+# CONFIG_VIDEO_OV9640 is not set
+# CONFIG_VIDEO_OV9650 is not set
+# CONFIG_VIDEO_PVRUSB2 is not set
+# CONFIG_VIDEO_RDACM20 is not set
+# CONFIG_VIDEO_RDACM21 is not set
+# CONFIG_VIDEO_RJ54N1 is not set
+# CONFIG_VIDEO_S5C73M3 is not set
+# CONFIG_VIDEO_S5K4ECGX is not set
+# CONFIG_VIDEO_S5K5BAF is not set
+# CONFIG_VIDEO_S5K6A3 is not set
+# CONFIG_VIDEO_S5K6AA is not set
+# CONFIG_VIDEO_SAA6588 is not set
+# CONFIG_VIDEO_SAA6752HS is not set
+# CONFIG_VIDEO_SAA7110 is not set
+# CONFIG_VIDEO_SAA711X is not set
+# CONFIG_VIDEO_SAA7127 is not set
+# CONFIG_VIDEO_SAA7134 is not set
+# CONFIG_VIDEO_SAA717X is not set
+# CONFIG_VIDEO_SAA7185 is not set
+# CONFIG_VIDEO_SH_MOBILE_CEU is not set
+# CONFIG_VIDEO_SMIAPP is not set
+# CONFIG_VIDEO_SONY_BTF_MPX is not set
+# CONFIG_VIDEO_SR030PC30 is not set
+# CONFIG_VIDEO_STK1160_COMMON is not set
+# CONFIG_VIDEO_ST_MIPID02 is not set
+# CONFIG_VIDEO_TC358743 is not set
+# CONFIG_VIDEO_TDA1997X is not set
+# CONFIG_VIDEO_TDA7432 is not set
+# CONFIG_VIDEO_TDA9840 is not set
+# CONFIG_VIDEO_TEA6415C is not set
+# CONFIG_VIDEO_TEA6420 is not set
+# CONFIG_VIDEO_THS7303 is not set
+# CONFIG_VIDEO_THS8200 is not set
+# CONFIG_VIDEO_TIMBERDALE is not set
+# CONFIG_VIDEO_TLV320AIC23B is not set
+# CONFIG_VIDEO_TM6000 is not set
+# CONFIG_VIDEO_TVAUDIO is not set
+# CONFIG_VIDEO_TVP514X is not set
+# CONFIG_VIDEO_TVP5150 is not set
+# CONFIG_VIDEO_TVP7002 is not set
+# CONFIG_VIDEO_TW2804 is not set
+# CONFIG_VIDEO_TW9903 is not set
+# CONFIG_VIDEO_TW9906 is not set
+# CONFIG_VIDEO_TW9910 is not set
+# CONFIG_VIDEO_UDA1342 is not set
+# CONFIG_VIDEO_UPD64031A is not set
+# CONFIG_VIDEO_UPD64083 is not set
+# CONFIG_VIDEO_USBTV is not set
+# CONFIG_VIDEO_USBVISION is not set
+# CONFIG_VIDEO_V4L2 is not set
+# CONFIG_VIDEO_VP27SMPX is not set
+# CONFIG_VIDEO_VPX3220 is not set
+# CONFIG_VIDEO_VS6624 is not set
+# CONFIG_VIDEO_WM8739 is not set
+# CONFIG_VIDEO_WM8775 is not set
+# CONFIG_VIDEO_XILINX is not set
+# CONFIG_VIDEO_ZORAN is not set
+# CONFIG_VIRTIO_BALLOON is not set
+# CONFIG_VIRTIO_BLK_SCSI is not set
+# CONFIG_VIRTIO_CONSOLE is not set
+# CONFIG_VIRTIO_FS is not set
+# CONFIG_VIRTIO_INPUT is not set
+CONFIG_VIRTIO_MENU=y
+# CONFIG_VIRTIO_MMIO is not set
+# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set
+# CONFIG_VIRTIO_PCI is not set
+# CONFIG_VIRTUALIZATION is not set
+# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
+# CONFIG_VIRT_DRIVERS is not set
+CONFIG_VIRT_TO_BUS=y
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_VL53L0X_I2C is not set
+# CONFIG_VL6180 is not set
+CONFIG_VLAN_8021Q=y
+# CONFIG_VLAN_8021Q_GVRP is not set
+# CONFIG_VLAN_8021Q_MVRP is not set
+# CONFIG_VMAP_STACK is not set
+# CONFIG_VME_BUS is not set
+# CONFIG_VMLINUX_MAP is not set
+# CONFIG_VMSPLIT_1G is not set
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_2G_OPT is not set
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_3G_OPT is not set
+# CONFIG_VMWARE_PVSCSI is not set
+# CONFIG_VMWARE_VMCI is not set
+# CONFIG_VMXNET3 is not set
+# CONFIG_VM_EVENT_COUNTERS is not set
+# CONFIG_VOP_BUS is not set
+# CONFIG_VORTEX is not set
+# CONFIG_VSOCKETS is not set
+# CONFIG_VSOCKETS_DIAG is not set
+# CONFIG_VT is not set
+# CONFIG_VT6655 is not set
+# CONFIG_VT6656 is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_VXGE is not set
+# CONFIG_VXLAN is not set
+# CONFIG_VZ89X is not set
+# CONFIG_W1 is not set
+# CONFIG_W1_CON is not set
+# CONFIG_W1_MASTER_DS1WM is not set
+# CONFIG_W1_MASTER_DS2482 is not set
+# CONFIG_W1_MASTER_DS2490 is not set
+# CONFIG_W1_MASTER_GPIO is not set
+# CONFIG_W1_MASTER_MATROX is not set
+# CONFIG_W1_MASTER_SGI is not set
+# CONFIG_W1_SLAVE_DS2405 is not set
+# CONFIG_W1_SLAVE_DS2406 is not set
+# CONFIG_W1_SLAVE_DS2408 is not set
+# CONFIG_W1_SLAVE_DS2413 is not set
+# CONFIG_W1_SLAVE_DS2423 is not set
+# CONFIG_W1_SLAVE_DS2430 is not set
+# CONFIG_W1_SLAVE_DS2431 is not set
+# CONFIG_W1_SLAVE_DS2433 is not set
+# CONFIG_W1_SLAVE_DS2438 is not set
+# CONFIG_W1_SLAVE_DS250X is not set
+# CONFIG_W1_SLAVE_DS2780 is not set
+# CONFIG_W1_SLAVE_DS2781 is not set
+# CONFIG_W1_SLAVE_DS2805 is not set
+# CONFIG_W1_SLAVE_DS28E04 is not set
+# CONFIG_W1_SLAVE_DS28E17 is not set
+# CONFIG_W1_SLAVE_SMEM is not set
+# CONFIG_W1_SLAVE_THERM is not set
+# CONFIG_W83627HF_WDT is not set
+# CONFIG_W83877F_WDT is not set
+# CONFIG_W83977F_WDT is not set
+# CONFIG_WAN is not set
+# CONFIG_WANXL is not set
+# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_CORE is not set
+CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y
+# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+CONFIG_WATCHDOG_OPEN_TIMEOUT=0
+# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set
+# CONFIG_WATCHDOG_SYSFS is not set
+# CONFIG_WATCH_QUEUE is not set
+# CONFIG_WD80x3 is not set
+# CONFIG_WDAT_WDT is not set
+# CONFIG_WDTPCI is not set
+# CONFIG_WERROR is not set
+CONFIG_WEXT_CORE=y
+CONFIG_WEXT_PRIV=y
+CONFIG_WEXT_PROC=y
+CONFIG_WEXT_SPY=y
+CONFIG_WILINK_PLATFORM_DATA=y
+# CONFIG_WIMAX is not set
+# CONFIG_WIREGUARD is not set
+CONFIG_WIRELESS=y
+CONFIG_WIRELESS_EXT=y
+# CONFIG_WIRELESS_WDS is not set
+# CONFIG_WIZNET_W5100 is not set
+# CONFIG_WIZNET_W5300 is not set
+# CONFIG_WL1251 is not set
+# CONFIG_WL12XX is not set
+# CONFIG_WL18XX is not set
+CONFIG_WLAN=y
+# CONFIG_WLAN_VENDOR_ADMTEK is not set
+# CONFIG_WLAN_VENDOR_ATH is not set
+# CONFIG_WLAN_VENDOR_ATMEL is not set
+# CONFIG_WLAN_VENDOR_BROADCOM is not set
+# CONFIG_WLAN_VENDOR_CISCO is not set
+# CONFIG_WLAN_VENDOR_INTEL is not set
+# CONFIG_WLAN_VENDOR_INTERSIL is not set
+# CONFIG_WLAN_VENDOR_MARVELL is not set
+# CONFIG_WLAN_VENDOR_MEDIATEK is not set
+# CONFIG_WLAN_VENDOR_MICROCHIP is not set
+# CONFIG_WLAN_VENDOR_PURELIFI is not set
+# CONFIG_WLAN_VENDOR_QUANTENNA is not set
+# CONFIG_WLAN_VENDOR_RALINK is not set
+# CONFIG_WLAN_VENDOR_REALTEK is not set
+# CONFIG_WLAN_VENDOR_RSI is not set
+# CONFIG_WLAN_VENDOR_SILABS is not set
+# CONFIG_WLAN_VENDOR_ST is not set
+# CONFIG_WLAN_VENDOR_TI is not set
+# CONFIG_WLAN_VENDOR_ZYDAS is not set
+# CONFIG_WLCORE is not set
+CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y
+# CONFIG_WQ_WATCHDOG is not set
+# CONFIG_WWAN is not set
+# CONFIG_WW_MUTEX_SELFTEST is not set
+# CONFIG_X25 is not set
+# CONFIG_X509_CERTIFICATE_PARSER is not set
+# CONFIG_X86_PKG_TEMP_THERMAL is not set
+CONFIG_X86_SYSFB=y
+# CONFIG_XDP_SOCKETS is not set
+# CONFIG_XEN is not set
+# CONFIG_XEN_GRANT_DMA_ALLOC is not set
+# CONFIG_XEN_PVCALLS_FRONTEND is not set
+CONFIG_XEN_SCRUB_PAGES_DEFAULT=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_INTERFACE is not set
+# CONFIG_XFRM_IPCOMP is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_XFRM_STATISTICS is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFS_DEBUG is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_XFS_ONLINE_SCRUB is not set
+# CONFIG_XFS_POSIX_ACL is not set
+# CONFIG_XFS_QUOTA is not set
+# CONFIG_XFS_RT is not set
+# CONFIG_XFS_SUPPORT_V4 is not set
+# CONFIG_XFS_WARN is not set
+# CONFIG_XILINX_AXI_EMAC is not set
+# CONFIG_XILINX_DMA is not set
+# CONFIG_XILINX_EMACLITE is not set
+# CONFIG_XILINX_GMII2RGMII is not set
+# CONFIG_XILINX_INTC is not set
+# CONFIG_XILINX_LL_TEMAC is not set
+# CONFIG_XILINX_SDFEC is not set
+# CONFIG_XILINX_VCU is not set
+# CONFIG_XILINX_WATCHDOG is not set
+# CONFIG_XILINX_XADC is not set
+# CONFIG_XILINX_ZYNQMP_DMA is not set
+# CONFIG_XILINX_ZYNQMP_DPDMA is not set
+# CONFIG_XILLYBUS is not set
+# CONFIG_XILLYUSB is not set
+# CONFIG_XIL_AXIS_FIFO is not set
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_XMON is not set
+# CONFIG_XXHASH is not set
+CONFIG_XZ_DEC=y
+# CONFIG_XZ_DEC_ARM is not set
+# CONFIG_XZ_DEC_ARMTHUMB is not set
+# CONFIG_XZ_DEC_BCJ is not set
+# CONFIG_XZ_DEC_IA64 is not set
+# CONFIG_XZ_DEC_MICROLZMA is not set
+# CONFIG_XZ_DEC_POWERPC is not set
+# CONFIG_XZ_DEC_SPARC is not set
+# CONFIG_XZ_DEC_TEST is not set
+# CONFIG_XZ_DEC_X86 is not set
+# CONFIG_YAM is not set
+# CONFIG_YAMAHA_YAS530 is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_YENTA is not set
+# CONFIG_YENTA_O2 is not set
+# CONFIG_YENTA_RICOH is not set
+# CONFIG_YENTA_TI is not set
+# CONFIG_YENTA_TOSHIBA is not set
+# CONFIG_ZBUD is not set
+# CONFIG_ZD1211RW is not set
+# CONFIG_ZD1211RW_DEBUG is not set
+# CONFIG_ZEROPLUS_FF is not set
+# CONFIG_ZERO_CALL_USED_REGS is not set
+# CONFIG_ZIIRAVE_WATCHDOG is not set
+# CONFIG_ZISOFS is not set
+# CONFIG_ZLIB_DEFLATE is not set
+# CONFIG_ZLIB_INFLATE is not set
+CONFIG_ZONE_DMA=y
+# CONFIG_ZONE_DMA32 is not set
+# CONFIG_ZOPT2201 is not set
+# CONFIG_ZPA2326 is not set
+# CONFIG_ZPOOL is not set
+# CONFIG_ZRAM is not set
+# CONFIG_ZRAM_MEMORY_TRACKING is not set
+# CONFIG_ZSMALLOC is not set
+# CONFIG_ZSTD_COMPRESS is not set
+# CONFIG_ZSTD_DECOMPRESS is not set
+# CONFIG_ZSWAP is not set
+# CONFIG_ZX_TDM is not set
diff --git a/target/linux/generic/hack-6.0/204-module_strip.patch b/target/linux/generic/hack-6.0/204-module_strip.patch
new file mode 100644
index 000000000..fd5298bf4
--- /dev/null
+++ b/target/linux/generic/hack-6.0/204-module_strip.patch
@@ -0,0 +1,174 @@
+From a779a482fb9b9f8fcdf8b2519c789b4b9bb5dd05 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 16:56:48 +0200
+Subject: build: add a hack for removing non-essential module info
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/module.h      | 13 ++++++++-----
+ include/linux/moduleparam.h | 15 ++++++++++++---
+ init/Kconfig                |  7 +++++++
+ kernel/module.c             |  5 ++++-
+ scripts/mod/modpost.c       | 12 ++++++++++++
+ 5 files changed, 43 insertions(+), 9 deletions(-)
+
+--- a/include/linux/module.h
++++ b/include/linux/module.h
+@@ -164,6 +164,7 @@ extern void cleanup_module(void);
+ 
+ /* Generic info of form tag = "info" */
+ #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
++#define MODULE_INFO_STRIP(tag, info) __MODULE_INFO_STRIP(tag, tag, info)
+ 
+ /* For userspace: you can also call me... */
+ #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias)
+@@ -233,12 +234,12 @@ extern void cleanup_module(void);
+  * Author(s), use "Name <email>" or just "Name", for multiple
+  * authors use multiple MODULE_AUTHOR() statements/lines.
+  */
+-#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)
++#define MODULE_AUTHOR(_author) MODULE_INFO_STRIP(author, _author)
+ 
+ /* What your module does. */
+-#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
++#define MODULE_DESCRIPTION(_description) MODULE_INFO_STRIP(description, _description)
+ 
+-#ifdef MODULE
++#if defined(MODULE) && !defined(CONFIG_MODULE_STRIPPED)
+ /* Creates an alias so file2alias.c can find device table. */
+ #define MODULE_DEVICE_TABLE(type, name)					\
+ extern typeof(name) __mod_##type##__##name##_device_table		\
+@@ -265,7 +266,9 @@ extern typeof(name) __mod_##type##__##na
+  */
+ 
+ #if defined(MODULE) || !defined(CONFIG_SYSFS)
+-#define MODULE_VERSION(_version) MODULE_INFO(version, _version)
++#define MODULE_VERSION(_version) MODULE_INFO_STRIP(version, _version)
++#elif defined(CONFIG_MODULE_STRIPPED)
++#define MODULE_VERSION(_version) __MODULE_INFO_DISABLED(version)
+ #else
+ #define MODULE_VERSION(_version)					\
+ 	MODULE_INFO(version, _version);					\
+@@ -288,7 +291,7 @@ extern typeof(name) __mod_##type##__##na
+ /* Optional firmware file (or files) needed by the module
+  * format is simply firmware file name.  Multiple firmware
+  * files require multiple MODULE_FIRMWARE() specifiers */
+-#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware)
++#define MODULE_FIRMWARE(_firmware) MODULE_INFO_STRIP(firmware, _firmware)
+ 
+ #define MODULE_IMPORT_NS(ns)	MODULE_INFO(import_ns, __stringify(ns))
+ 
+--- a/include/linux/moduleparam.h
++++ b/include/linux/moduleparam.h
+@@ -20,6 +20,16 @@
+ /* Chosen so that structs with an unsigned long line up. */
+ #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
+ 
++/* This struct is here for syntactic coherency, it is not used */
++#define __MODULE_INFO_DISABLED(name)					  \
++  struct __UNIQUE_ID(name) {}
++
++#ifdef CONFIG_MODULE_STRIPPED
++#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO_DISABLED(name)
++#else
++#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO(tag, name, info)
++#endif
++
+ #define __MODULE_INFO(tag, name, info)					  \
+ 	static const char __UNIQUE_ID(name)[]				  \
+ 		__used __section(".modinfo") __aligned(1)		  \
+@@ -31,7 +41,7 @@
+ /* One for each parameter, describing how to use it.  Some files do
+    multiple of these per line, so can't just use MODULE_INFO. */
+ #define MODULE_PARM_DESC(_parm, desc) \
+-	__MODULE_INFO(parm, _parm, #_parm ":" desc)
++	__MODULE_INFO_STRIP(parm, _parm, #_parm ":" desc)
+ 
+ struct kernel_param;
+ 
+--- a/kernel/module/Kconfig
++++ b/kernel/module/Kconfig
+@@ -286,6 +286,13 @@ config UNUSED_KSYMS_WHITELIST
+ 	  one per line. The path can be absolute, or relative to the kernel
+ 	  source tree.
+ 
++config MODULE_STRIPPED
++	bool "Reduce module size"
++	depends on MODULES
++	help
++	  Remove module parameter descriptions, author info, version, aliases,
++	  device tables, etc.
++
+ config MODULES_TREE_LOOKUP
+ 	def_bool y
+ 	depends on PERF_EVENTS || TRACING || CFI_CLANG
+--- a/kernel/module/main.c
++++ b/kernel/module/main.c
+@@ -1954,9 +1954,11 @@ static int setup_load_info(struct load_i
+ 
+ static int check_modinfo(struct module *mod, struct load_info *info, int flags)
+ {
+-	const char *modmagic = get_modinfo(info, "vermagic");
+ 	int err;
+ 
++#ifndef CONFIG_MODULE_STRIPPED
++	const char *modmagic = get_modinfo(info, "vermagic");
++
+ 	if (flags & MODULE_INIT_IGNORE_VERMAGIC)
+ 		modmagic = NULL;
+ 
+@@ -1977,6 +1979,7 @@ static int check_modinfo(struct module *
+ 				mod->name);
+ 		add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
+ 	}
++#endif
+ 
+ 	check_modinfo_retpoline(mod, info);
+ 
+--- a/scripts/mod/modpost.c
++++ b/scripts/mod/modpost.c
+@@ -1817,7 +1817,9 @@ static void read_symbols(const char *mod
+ 		symname = remove_dot(info.strtab + sym->st_name);
+ 
+ 		handle_symbol(mod, &info, sym, symname);
++#ifndef CONFIG_MODULE_STRIPPED
+ 		handle_moddevtable(mod, &info, sym, symname);
++#endif
+ 	}
+ 
+ 	for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
+@@ -1980,8 +1982,10 @@ static void add_header(struct buffer *b,
+ 	buf_printf(b, "BUILD_SALT;\n");
+ 	buf_printf(b, "BUILD_LTO_INFO;\n");
+ 	buf_printf(b, "\n");
++#ifndef CONFIG_MODULE_STRIPPED
+ 	buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
+ 	buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n");
++#endif
+ 	buf_printf(b, "\n");
+ 	buf_printf(b, "__visible struct module __this_module\n");
+ 	buf_printf(b, "__section(\".gnu.linkonce.this_module\") = {\n");
+@@ -2101,11 +2105,13 @@ static void add_depends(struct buffer *b
+ 
+ static void add_srcversion(struct buffer *b, struct module *mod)
+ {
++#ifndef CONFIG_MODULE_STRIPPED
+ 	if (mod->srcversion[0]) {
+ 		buf_printf(b, "\n");
+ 		buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n",
+ 			   mod->srcversion);
+ 	}
++#endif
+ }
+ 
+ static void write_buf(struct buffer *b, const char *fname)
+@@ -2191,7 +2197,9 @@ static void write_mod_c_file(struct modu
+ 	add_exported_symbols(&buf, mod);
+ 	add_versions(&buf, mod);
+ 	add_depends(&buf, mod);
++#ifndef CONFIG_MODULE_STRIPPED
+ 	add_moddevtable(&buf, mod);
++#endif
+ 	add_srcversion(&buf, mod);
+ 
+ 	ret = snprintf(fname, sizeof(fname), "%s.mod.c", mod->name);
diff --git a/target/linux/generic/hack-6.0/205-kconfig-exit.patch b/target/linux/generic/hack-6.0/205-kconfig-exit.patch
new file mode 100644
index 000000000..f1b50283d
--- /dev/null
+++ b/target/linux/generic/hack-6.0/205-kconfig-exit.patch
@@ -0,0 +1,11 @@
+--- a/scripts/kconfig/conf.c
++++ b/scripts/kconfig/conf.c
+@@ -432,6 +432,8 @@ static int conf_sym(struct menu *menu)
+ 				break;
+ 			continue;
+ 		case 0:
++			if (!sym_has_value(sym) && !tty_stdio && getenv("FAIL_ON_UNCONFIGURED"))
++				exit(1);
+ 			newval = oldval;
+ 			break;
+ 		case '?':
diff --git a/target/linux/generic/hack-6.0/210-darwin_scripts_include.patch b/target/linux/generic/hack-6.0/210-darwin_scripts_include.patch
new file mode 100644
index 000000000..c9612536d
--- /dev/null
+++ b/target/linux/generic/hack-6.0/210-darwin_scripts_include.patch
@@ -0,0 +1,3053 @@
+From db7c30dcd9a0391bf13b62c9f91e144d762ef43a Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Fri, 7 Jul 2017 17:00:49 +0200
+Subject: Add an OSX specific patch to make the kernel be compiled
+
+lede-commit: 3fc2a24f0422b2f55f9ed43f116db3111f700526
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+---
+ scripts/kconfig/Makefile   |    3 +
+ scripts/mod/elf.h          | 3007 ++++++++++++++++++++++++++++++++++++++++++++
+ scripts/mod/mk_elfconfig.c |    4 +
+ scripts/mod/modpost.h      |    4 +
+ 4 files changed, 3018 insertions(+)
+ create mode 100644 scripts/mod/elf.h
+
+--- /dev/null
++++ b/scripts/mod/elf.h
+@@ -0,0 +1,3007 @@
++/* This file defines standard ELF types, structures, and macros.
++   Copyright (C) 1995-2012 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, see
++   <http://www.gnu.org/licenses/>.  */
++
++#ifndef _ELF_H
++#define	_ELF_H 1
++
++/* Standard ELF types.  */
++
++#include <stdint.h>
++
++/* Type for a 16-bit quantity.  */
++typedef uint16_t Elf32_Half;
++typedef uint16_t Elf64_Half;
++
++/* Types for signed and unsigned 32-bit quantities.  */
++typedef uint32_t Elf32_Word;
++typedef	int32_t  Elf32_Sword;
++typedef uint32_t Elf64_Word;
++typedef	int32_t  Elf64_Sword;
++
++/* Types for signed and unsigned 64-bit quantities.  */
++typedef uint64_t Elf32_Xword;
++typedef	int64_t  Elf32_Sxword;
++typedef uint64_t Elf64_Xword;
++typedef	int64_t  Elf64_Sxword;
++
++/* Type of addresses.  */
++typedef uint32_t Elf32_Addr;
++typedef uint64_t Elf64_Addr;
++
++/* Type of file offsets.  */
++typedef uint32_t Elf32_Off;
++typedef uint64_t Elf64_Off;
++
++/* Type for section indices, which are 16-bit quantities.  */
++typedef uint16_t Elf32_Section;
++typedef uint16_t Elf64_Section;
++
++/* Type for version symbol information.  */
++typedef Elf32_Half Elf32_Versym;
++typedef Elf64_Half Elf64_Versym;
++
++
++/* The ELF file header.  This appears at the start of every ELF file.  */
++
++#define EI_NIDENT (16)
++
++typedef struct
++{
++  unsigned char	e_ident[EI_NIDENT];	/* Magic number and other info */
++  Elf32_Half	e_type;			/* Object file type */
++  Elf32_Half	e_machine;		/* Architecture */
++  Elf32_Word	e_version;		/* Object file version */
++  Elf32_Addr	e_entry;		/* Entry point virtual address */
++  Elf32_Off	e_phoff;		/* Program header table file offset */
++  Elf32_Off	e_shoff;		/* Section header table file offset */
++  Elf32_Word	e_flags;		/* Processor-specific flags */
++  Elf32_Half	e_ehsize;		/* ELF header size in bytes */
++  Elf32_Half	e_phentsize;		/* Program header table entry size */
++  Elf32_Half	e_phnum;		/* Program header table entry count */
++  Elf32_Half	e_shentsize;		/* Section header table entry size */
++  Elf32_Half	e_shnum;		/* Section header table entry count */
++  Elf32_Half	e_shstrndx;		/* Section header string table index */
++} Elf32_Ehdr;
++
++typedef struct
++{
++  unsigned char	e_ident[EI_NIDENT];	/* Magic number and other info */
++  Elf64_Half	e_type;			/* Object file type */
++  Elf64_Half	e_machine;		/* Architecture */
++  Elf64_Word	e_version;		/* Object file version */
++  Elf64_Addr	e_entry;		/* Entry point virtual address */
++  Elf64_Off	e_phoff;		/* Program header table file offset */
++  Elf64_Off	e_shoff;		/* Section header table file offset */
++  Elf64_Word	e_flags;		/* Processor-specific flags */
++  Elf64_Half	e_ehsize;		/* ELF header size in bytes */
++  Elf64_Half	e_phentsize;		/* Program header table entry size */
++  Elf64_Half	e_phnum;		/* Program header table entry count */
++  Elf64_Half	e_shentsize;		/* Section header table entry size */
++  Elf64_Half	e_shnum;		/* Section header table entry count */
++  Elf64_Half	e_shstrndx;		/* Section header string table index */
++} Elf64_Ehdr;
++
++/* Fields in the e_ident array.  The EI_* macros are indices into the
++   array.  The macros under each EI_* macro are the values the byte
++   may have.  */
++
++#define EI_MAG0		0		/* File identification byte 0 index */
++#define ELFMAG0		0x7f		/* Magic number byte 0 */
++
++#define EI_MAG1		1		/* File identification byte 1 index */
++#define ELFMAG1		'E'		/* Magic number byte 1 */
++
++#define EI_MAG2		2		/* File identification byte 2 index */
++#define ELFMAG2		'L'		/* Magic number byte 2 */
++
++#define EI_MAG3		3		/* File identification byte 3 index */
++#define ELFMAG3		'F'		/* Magic number byte 3 */
++
++/* Conglomeration of the identification bytes, for easy testing as a word.  */
++#define	ELFMAG		"\177ELF"
++#define	SELFMAG		4
++
++#define EI_CLASS	4		/* File class byte index */
++#define ELFCLASSNONE	0		/* Invalid class */
++#define ELFCLASS32	1		/* 32-bit objects */
++#define ELFCLASS64	2		/* 64-bit objects */
++#define ELFCLASSNUM	3
++
++#define EI_DATA		5		/* Data encoding byte index */
++#define ELFDATANONE	0		/* Invalid data encoding */
++#define ELFDATA2LSB	1		/* 2's complement, little endian */
++#define ELFDATA2MSB	2		/* 2's complement, big endian */
++#define ELFDATANUM	3
++
++#define EI_VERSION	6		/* File version byte index */
++					/* Value must be EV_CURRENT */
++
++#define EI_OSABI	7		/* OS ABI identification */
++#define ELFOSABI_NONE		0	/* UNIX System V ABI */
++#define ELFOSABI_SYSV		0	/* Alias.  */
++#define ELFOSABI_HPUX		1	/* HP-UX */
++#define ELFOSABI_NETBSD		2	/* NetBSD.  */
++#define ELFOSABI_GNU		3	/* Object uses GNU ELF extensions.  */
++#define ELFOSABI_LINUX		ELFOSABI_GNU /* Compatibility alias.  */
++#define ELFOSABI_SOLARIS	6	/* Sun Solaris.  */
++#define ELFOSABI_AIX		7	/* IBM AIX.  */
++#define ELFOSABI_IRIX		8	/* SGI Irix.  */
++#define ELFOSABI_FREEBSD	9	/* FreeBSD.  */
++#define ELFOSABI_TRU64		10	/* Compaq TRU64 UNIX.  */
++#define ELFOSABI_MODESTO	11	/* Novell Modesto.  */
++#define ELFOSABI_OPENBSD	12	/* OpenBSD.  */
++#define ELFOSABI_ARM_AEABI	64	/* ARM EABI */
++#define ELFOSABI_ARM		97	/* ARM */
++#define ELFOSABI_STANDALONE	255	/* Standalone (embedded) application */
++
++#define EI_ABIVERSION	8		/* ABI version */
++
++#define EI_PAD		9		/* Byte index of padding bytes */
++
++/* Legal values for e_type (object file type).  */
++
++#define ET_NONE		0		/* No file type */
++#define ET_REL		1		/* Relocatable file */
++#define ET_EXEC		2		/* Executable file */
++#define ET_DYN		3		/* Shared object file */
++#define ET_CORE		4		/* Core file */
++#define	ET_NUM		5		/* Number of defined types */
++#define ET_LOOS		0xfe00		/* OS-specific range start */
++#define ET_HIOS		0xfeff		/* OS-specific range end */
++#define ET_LOPROC	0xff00		/* Processor-specific range start */
++#define ET_HIPROC	0xffff		/* Processor-specific range end */
++
++/* Legal values for e_machine (architecture).  */
++
++#define EM_NONE		 0		/* No machine */
++#define EM_M32		 1		/* AT&T WE 32100 */
++#define EM_SPARC	 2		/* SUN SPARC */
++#define EM_386		 3		/* Intel 80386 */
++#define EM_68K		 4		/* Motorola m68k family */
++#define EM_88K		 5		/* Motorola m88k family */
++#define EM_860		 7		/* Intel 80860 */
++#define EM_MIPS		 8		/* MIPS R3000 big-endian */
++#define EM_S370		 9		/* IBM System/370 */
++#define EM_MIPS_RS3_LE	10		/* MIPS R3000 little-endian */
++
++#define EM_PARISC	15		/* HPPA */
++#define EM_VPP500	17		/* Fujitsu VPP500 */
++#define EM_SPARC32PLUS	18		/* Sun's "v8plus" */
++#define EM_960		19		/* Intel 80960 */
++#define EM_PPC		20		/* PowerPC */
++#define EM_PPC64	21		/* PowerPC 64-bit */
++#define EM_S390		22		/* IBM S390 */
++
++#define EM_V800		36		/* NEC V800 series */
++#define EM_FR20		37		/* Fujitsu FR20 */
++#define EM_RH32		38		/* TRW RH-32 */
++#define EM_RCE		39		/* Motorola RCE */
++#define EM_ARM		40		/* ARM */
++#define EM_FAKE_ALPHA	41		/* Digital Alpha */
++#define EM_SH		42		/* Hitachi SH */
++#define EM_SPARCV9	43		/* SPARC v9 64-bit */
++#define EM_TRICORE	44		/* Siemens Tricore */
++#define EM_ARC		45		/* Argonaut RISC Core */
++#define EM_H8_300	46		/* Hitachi H8/300 */
++#define EM_H8_300H	47		/* Hitachi H8/300H */
++#define EM_H8S		48		/* Hitachi H8S */
++#define EM_H8_500	49		/* Hitachi H8/500 */
++#define EM_IA_64	50		/* Intel Merced */
++#define EM_MIPS_X	51		/* Stanford MIPS-X */
++#define EM_COLDFIRE	52		/* Motorola Coldfire */
++#define EM_68HC12	53		/* Motorola M68HC12 */
++#define EM_MMA		54		/* Fujitsu MMA Multimedia Accelerator*/
++#define EM_PCP		55		/* Siemens PCP */
++#define EM_NCPU		56		/* Sony nCPU embeeded RISC */
++#define EM_NDR1		57		/* Denso NDR1 microprocessor */
++#define EM_STARCORE	58		/* Motorola Start*Core processor */
++#define EM_ME16		59		/* Toyota ME16 processor */
++#define EM_ST100	60		/* STMicroelectronic ST100 processor */
++#define EM_TINYJ	61		/* Advanced Logic Corp. Tinyj emb.fam*/
++#define EM_X86_64	62		/* AMD x86-64 architecture */
++#define EM_PDSP		63		/* Sony DSP Processor */
++
++#define EM_FX66		66		/* Siemens FX66 microcontroller */
++#define EM_ST9PLUS	67		/* STMicroelectronics ST9+ 8/16 mc */
++#define EM_ST7		68		/* STmicroelectronics ST7 8 bit mc */
++#define EM_68HC16	69		/* Motorola MC68HC16 microcontroller */
++#define EM_68HC11	70		/* Motorola MC68HC11 microcontroller */
++#define EM_68HC08	71		/* Motorola MC68HC08 microcontroller */
++#define EM_68HC05	72		/* Motorola MC68HC05 microcontroller */
++#define EM_SVX		73		/* Silicon Graphics SVx */
++#define EM_ST19		74		/* STMicroelectronics ST19 8 bit mc */
++#define EM_VAX		75		/* Digital VAX */
++#define EM_CRIS		76		/* Axis Communications 32-bit embedded processor */
++#define EM_JAVELIN	77		/* Infineon Technologies 32-bit embedded processor */
++#define EM_FIREPATH	78		/* Element 14 64-bit DSP Processor */
++#define EM_ZSP		79		/* LSI Logic 16-bit DSP Processor */
++#define EM_MMIX		80		/* Donald Knuth's educational 64-bit processor */
++#define EM_HUANY	81		/* Harvard University machine-independent object files */
++#define EM_PRISM	82		/* SiTera Prism */
++#define EM_AVR		83		/* Atmel AVR 8-bit microcontroller */
++#define EM_FR30		84		/* Fujitsu FR30 */
++#define EM_D10V		85		/* Mitsubishi D10V */
++#define EM_D30V		86		/* Mitsubishi D30V */
++#define EM_V850		87		/* NEC v850 */
++#define EM_M32R		88		/* Mitsubishi M32R */
++#define EM_MN10300	89		/* Matsushita MN10300 */
++#define EM_MN10200	90		/* Matsushita MN10200 */
++#define EM_PJ		91		/* picoJava */
++#define EM_OPENRISC	92		/* OpenRISC 32-bit embedded processor */
++#define EM_ARC_A5	93		/* ARC Cores Tangent-A5 */
++#define EM_XTENSA	94		/* Tensilica Xtensa Architecture */
++#define EM_TILEPRO	188		/* Tilera TILEPro */
++#define EM_TILEGX	191		/* Tilera TILE-Gx */
++#define EM_NUM		192
++
++/* If it is necessary to assign new unofficial EM_* values, please
++   pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
++   chances of collision with official or non-GNU unofficial values.  */
++
++#define EM_ALPHA	0x9026
++
++/* Legal values for e_version (version).  */
++
++#define EV_NONE		0		/* Invalid ELF version */
++#define EV_CURRENT	1		/* Current version */
++#define EV_NUM		2
++
++/* Section header.  */
++
++typedef struct
++{
++  Elf32_Word	sh_name;		/* Section name (string tbl index) */
++  Elf32_Word	sh_type;		/* Section type */
++  Elf32_Word	sh_flags;		/* Section flags */
++  Elf32_Addr	sh_addr;		/* Section virtual addr at execution */
++  Elf32_Off	sh_offset;		/* Section file offset */
++  Elf32_Word	sh_size;		/* Section size in bytes */
++  Elf32_Word	sh_link;		/* Link to another section */
++  Elf32_Word	sh_info;		/* Additional section information */
++  Elf32_Word	sh_addralign;		/* Section alignment */
++  Elf32_Word	sh_entsize;		/* Entry size if section holds table */
++} Elf32_Shdr;
++
++typedef struct
++{
++  Elf64_Word	sh_name;		/* Section name (string tbl index) */
++  Elf64_Word	sh_type;		/* Section type */
++  Elf64_Xword	sh_flags;		/* Section flags */
++  Elf64_Addr	sh_addr;		/* Section virtual addr at execution */
++  Elf64_Off	sh_offset;		/* Section file offset */
++  Elf64_Xword	sh_size;		/* Section size in bytes */
++  Elf64_Word	sh_link;		/* Link to another section */
++  Elf64_Word	sh_info;		/* Additional section information */
++  Elf64_Xword	sh_addralign;		/* Section alignment */
++  Elf64_Xword	sh_entsize;		/* Entry size if section holds table */
++} Elf64_Shdr;
++
++/* Special section indices.  */
++
++#define SHN_UNDEF	0		/* Undefined section */
++#define SHN_LORESERVE	0xff00		/* Start of reserved indices */
++#define SHN_LOPROC	0xff00		/* Start of processor-specific */
++#define SHN_BEFORE	0xff00		/* Order section before all others
++					   (Solaris).  */
++#define SHN_AFTER	0xff01		/* Order section after all others
++					   (Solaris).  */
++#define SHN_HIPROC	0xff1f		/* End of processor-specific */
++#define SHN_LOOS	0xff20		/* Start of OS-specific */
++#define SHN_HIOS	0xff3f		/* End of OS-specific */
++#define SHN_ABS		0xfff1		/* Associated symbol is absolute */
++#define SHN_COMMON	0xfff2		/* Associated symbol is common */
++#define SHN_XINDEX	0xffff		/* Index is in extra table.  */
++#define SHN_HIRESERVE	0xffff		/* End of reserved indices */
++
++/* Legal values for sh_type (section type).  */
++
++#define SHT_NULL	  0		/* Section header table entry unused */
++#define SHT_PROGBITS	  1		/* Program data */
++#define SHT_SYMTAB	  2		/* Symbol table */
++#define SHT_STRTAB	  3		/* String table */
++#define SHT_RELA	  4		/* Relocation entries with addends */
++#define SHT_HASH	  5		/* Symbol hash table */
++#define SHT_DYNAMIC	  6		/* Dynamic linking information */
++#define SHT_NOTE	  7		/* Notes */
++#define SHT_NOBITS	  8		/* Program space with no data (bss) */
++#define SHT_REL		  9		/* Relocation entries, no addends */
++#define SHT_SHLIB	  10		/* Reserved */
++#define SHT_DYNSYM	  11		/* Dynamic linker symbol table */
++#define SHT_INIT_ARRAY	  14		/* Array of constructors */
++#define SHT_FINI_ARRAY	  15		/* Array of destructors */
++#define SHT_PREINIT_ARRAY 16		/* Array of pre-constructors */
++#define SHT_GROUP	  17		/* Section group */
++#define SHT_SYMTAB_SHNDX  18		/* Extended section indeces */
++#define	SHT_NUM		  19		/* Number of defined types.  */
++#define SHT_LOOS	  0x60000000	/* Start OS-specific.  */
++#define SHT_GNU_ATTRIBUTES 0x6ffffff5	/* Object attributes.  */
++#define SHT_GNU_HASH	  0x6ffffff6	/* GNU-style hash table.  */
++#define SHT_GNU_LIBLIST	  0x6ffffff7	/* Prelink library list */
++#define SHT_CHECKSUM	  0x6ffffff8	/* Checksum for DSO content.  */
++#define SHT_LOSUNW	  0x6ffffffa	/* Sun-specific low bound.  */
++#define SHT_SUNW_move	  0x6ffffffa
++#define SHT_SUNW_COMDAT   0x6ffffffb
++#define SHT_SUNW_syminfo  0x6ffffffc
++#define SHT_GNU_verdef	  0x6ffffffd	/* Version definition section.  */
++#define SHT_GNU_verneed	  0x6ffffffe	/* Version needs section.  */
++#define SHT_GNU_versym	  0x6fffffff	/* Version symbol table.  */
++#define SHT_HISUNW	  0x6fffffff	/* Sun-specific high bound.  */
++#define SHT_HIOS	  0x6fffffff	/* End OS-specific type */
++#define SHT_LOPROC	  0x70000000	/* Start of processor-specific */
++#define SHT_HIPROC	  0x7fffffff	/* End of processor-specific */
++#define SHT_LOUSER	  0x80000000	/* Start of application-specific */
++#define SHT_HIUSER	  0x8fffffff	/* End of application-specific */
++
++/* Legal values for sh_flags (section flags).  */
++
++#define SHF_WRITE	     (1 << 0)	/* Writable */
++#define SHF_ALLOC	     (1 << 1)	/* Occupies memory during execution */
++#define SHF_EXECINSTR	     (1 << 2)	/* Executable */
++#define SHF_MERGE	     (1 << 4)	/* Might be merged */
++#define SHF_STRINGS	     (1 << 5)	/* Contains nul-terminated strings */
++#define SHF_INFO_LINK	     (1 << 6)	/* `sh_info' contains SHT index */
++#define SHF_LINK_ORDER	     (1 << 7)	/* Preserve order after combining */
++#define SHF_OS_NONCONFORMING (1 << 8)	/* Non-standard OS specific handling
++					   required */
++#define SHF_GROUP	     (1 << 9)	/* Section is member of a group.  */
++#define SHF_TLS		     (1 << 10)	/* Section hold thread-local data.  */
++#define SHF_MASKOS	     0x0ff00000	/* OS-specific.  */
++#define SHF_MASKPROC	     0xf0000000	/* Processor-specific */
++#define SHF_ORDERED	     (1 << 30)	/* Special ordering requirement
++					   (Solaris).  */
++#define SHF_EXCLUDE	     (1 << 31)	/* Section is excluded unless
++					   referenced or allocated (Solaris).*/
++
++/* Section group handling.  */
++#define GRP_COMDAT	0x1		/* Mark group as COMDAT.  */
++
++/* Symbol table entry.  */
++
++typedef struct
++{
++  Elf32_Word	st_name;		/* Symbol name (string tbl index) */
++  Elf32_Addr	st_value;		/* Symbol value */
++  Elf32_Word	st_size;		/* Symbol size */
++  unsigned char	st_info;		/* Symbol type and binding */
++  unsigned char	st_other;		/* Symbol visibility */
++  Elf32_Section	st_shndx;		/* Section index */
++} Elf32_Sym;
++
++typedef struct
++{
++  Elf64_Word	st_name;		/* Symbol name (string tbl index) */
++  unsigned char	st_info;		/* Symbol type and binding */
++  unsigned char st_other;		/* Symbol visibility */
++  Elf64_Section	st_shndx;		/* Section index */
++  Elf64_Addr	st_value;		/* Symbol value */
++  Elf64_Xword	st_size;		/* Symbol size */
++} Elf64_Sym;
++
++/* The syminfo section if available contains additional information about
++   every dynamic symbol.  */
++
++typedef struct
++{
++  Elf32_Half si_boundto;		/* Direct bindings, symbol bound to */
++  Elf32_Half si_flags;			/* Per symbol flags */
++} Elf32_Syminfo;
++
++typedef struct
++{
++  Elf64_Half si_boundto;		/* Direct bindings, symbol bound to */
++  Elf64_Half si_flags;			/* Per symbol flags */
++} Elf64_Syminfo;
++
++/* Possible values for si_boundto.  */
++#define SYMINFO_BT_SELF		0xffff	/* Symbol bound to self */
++#define SYMINFO_BT_PARENT	0xfffe	/* Symbol bound to parent */
++#define SYMINFO_BT_LOWRESERVE	0xff00	/* Beginning of reserved entries */
++
++/* Possible bitmasks for si_flags.  */
++#define SYMINFO_FLG_DIRECT	0x0001	/* Direct bound symbol */
++#define SYMINFO_FLG_PASSTHRU	0x0002	/* Pass-thru symbol for translator */
++#define SYMINFO_FLG_COPY	0x0004	/* Symbol is a copy-reloc */
++#define SYMINFO_FLG_LAZYLOAD	0x0008	/* Symbol bound to object to be lazy
++					   loaded */
++/* Syminfo version values.  */
++#define SYMINFO_NONE		0
++#define SYMINFO_CURRENT		1
++#define SYMINFO_NUM		2
++
++
++/* How to extract and insert information held in the st_info field.  */
++
++#define ELF32_ST_BIND(val)		(((unsigned char) (val)) >> 4)
++#define ELF32_ST_TYPE(val)		((val) & 0xf)
++#define ELF32_ST_INFO(bind, type)	(((bind) << 4) + ((type) & 0xf))
++
++/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field.  */
++#define ELF64_ST_BIND(val)		ELF32_ST_BIND (val)
++#define ELF64_ST_TYPE(val)		ELF32_ST_TYPE (val)
++#define ELF64_ST_INFO(bind, type)	ELF32_ST_INFO ((bind), (type))
++
++/* Legal values for ST_BIND subfield of st_info (symbol binding).  */
++
++#define STB_LOCAL	0		/* Local symbol */
++#define STB_GLOBAL	1		/* Global symbol */
++#define STB_WEAK	2		/* Weak symbol */
++#define	STB_NUM		3		/* Number of defined types.  */
++#define STB_LOOS	10		/* Start of OS-specific */
++#define STB_GNU_UNIQUE	10		/* Unique symbol.  */
++#define STB_HIOS	12		/* End of OS-specific */
++#define STB_LOPROC	13		/* Start of processor-specific */
++#define STB_HIPROC	15		/* End of processor-specific */
++
++/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
++
++#define STT_NOTYPE	0		/* Symbol type is unspecified */
++#define STT_OBJECT	1		/* Symbol is a data object */
++#define STT_FUNC	2		/* Symbol is a code object */
++#define STT_SECTION	3		/* Symbol associated with a section */
++#define STT_FILE	4		/* Symbol's name is file name */
++#define STT_COMMON	5		/* Symbol is a common data object */
++#define STT_TLS		6		/* Symbol is thread-local data object*/
++#define	STT_NUM		7		/* Number of defined types.  */
++#define STT_LOOS	10		/* Start of OS-specific */
++#define STT_GNU_IFUNC	10		/* Symbol is indirect code object */
++#define STT_HIOS	12		/* End of OS-specific */
++#define STT_LOPROC	13		/* Start of processor-specific */
++#define STT_HIPROC	15		/* End of processor-specific */
++
++
++/* Symbol table indices are found in the hash buckets and chain table
++   of a symbol hash table section.  This special index value indicates
++   the end of a chain, meaning no further symbols are found in that bucket.  */
++
++#define STN_UNDEF	0		/* End of a chain.  */
++
++
++/* How to extract and insert information held in the st_other field.  */
++
++#define ELF32_ST_VISIBILITY(o)	((o) & 0x03)
++
++/* For ELF64 the definitions are the same.  */
++#define ELF64_ST_VISIBILITY(o)	ELF32_ST_VISIBILITY (o)
++
++/* Symbol visibility specification encoded in the st_other field.  */
++#define STV_DEFAULT	0		/* Default symbol visibility rules */
++#define STV_INTERNAL	1		/* Processor specific hidden class */
++#define STV_HIDDEN	2		/* Sym unavailable in other modules */
++#define STV_PROTECTED	3		/* Not preemptible, not exported */
++
++
++/* Relocation table entry without addend (in section of type SHT_REL).  */
++
++typedef struct
++{
++  Elf32_Addr	r_offset;		/* Address */
++  Elf32_Word	r_info;			/* Relocation type and symbol index */
++} Elf32_Rel;
++
++/* I have seen two different definitions of the Elf64_Rel and
++   Elf64_Rela structures, so we'll leave them out until Novell (or
++   whoever) gets their act together.  */
++/* The following, at least, is used on Sparc v9, MIPS, and Alpha.  */
++
++typedef struct
++{
++  Elf64_Addr	r_offset;		/* Address */
++  Elf64_Xword	r_info;			/* Relocation type and symbol index */
++} Elf64_Rel;
++
++/* Relocation table entry with addend (in section of type SHT_RELA).  */
++
++typedef struct
++{
++  Elf32_Addr	r_offset;		/* Address */
++  Elf32_Word	r_info;			/* Relocation type and symbol index */
++  Elf32_Sword	r_addend;		/* Addend */
++} Elf32_Rela;
++
++typedef struct
++{
++  Elf64_Addr	r_offset;		/* Address */
++  Elf64_Xword	r_info;			/* Relocation type and symbol index */
++  Elf64_Sxword	r_addend;		/* Addend */
++} Elf64_Rela;
++
++/* How to extract and insert information held in the r_info field.  */
++
++#define ELF32_R_SYM(val)		((val) >> 8)
++#define ELF32_R_TYPE(val)		((val) & 0xff)
++#define ELF32_R_INFO(sym, type)		(((sym) << 8) + ((type) & 0xff))
++
++#define ELF64_R_SYM(i)			((i) >> 32)
++#define ELF64_R_TYPE(i)			((i) & 0xffffffff)
++#define ELF64_R_INFO(sym,type)		((((Elf64_Xword) (sym)) << 32) + (type))
++
++/* Program segment header.  */
++
++typedef struct
++{
++  Elf32_Word	p_type;			/* Segment type */
++  Elf32_Off	p_offset;		/* Segment file offset */
++  Elf32_Addr	p_vaddr;		/* Segment virtual address */
++  Elf32_Addr	p_paddr;		/* Segment physical address */
++  Elf32_Word	p_filesz;		/* Segment size in file */
++  Elf32_Word	p_memsz;		/* Segment size in memory */
++  Elf32_Word	p_flags;		/* Segment flags */
++  Elf32_Word	p_align;		/* Segment alignment */
++} Elf32_Phdr;
++
++typedef struct
++{
++  Elf64_Word	p_type;			/* Segment type */
++  Elf64_Word	p_flags;		/* Segment flags */
++  Elf64_Off	p_offset;		/* Segment file offset */
++  Elf64_Addr	p_vaddr;		/* Segment virtual address */
++  Elf64_Addr	p_paddr;		/* Segment physical address */
++  Elf64_Xword	p_filesz;		/* Segment size in file */
++  Elf64_Xword	p_memsz;		/* Segment size in memory */
++  Elf64_Xword	p_align;		/* Segment alignment */
++} Elf64_Phdr;
++
++/* Special value for e_phnum.  This indicates that the real number of
++   program headers is too large to fit into e_phnum.  Instead the real
++   value is in the field sh_info of section 0.  */
++
++#define PN_XNUM		0xffff
++
++/* Legal values for p_type (segment type).  */
++
++#define	PT_NULL		0		/* Program header table entry unused */
++#define PT_LOAD		1		/* Loadable program segment */
++#define PT_DYNAMIC	2		/* Dynamic linking information */
++#define PT_INTERP	3		/* Program interpreter */
++#define PT_NOTE		4		/* Auxiliary information */
++#define PT_SHLIB	5		/* Reserved */
++#define PT_PHDR		6		/* Entry for header table itself */
++#define PT_TLS		7		/* Thread-local storage segment */
++#define	PT_NUM		8		/* Number of defined types */
++#define PT_LOOS		0x60000000	/* Start of OS-specific */
++#define PT_GNU_EH_FRAME	0x6474e550	/* GCC .eh_frame_hdr segment */
++#define PT_GNU_STACK	0x6474e551	/* Indicates stack executability */
++#define PT_GNU_RELRO	0x6474e552	/* Read-only after relocation */
++#define PT_LOSUNW	0x6ffffffa
++#define PT_SUNWBSS	0x6ffffffa	/* Sun Specific segment */
++#define PT_SUNWSTACK	0x6ffffffb	/* Stack segment */
++#define PT_HISUNW	0x6fffffff
++#define PT_HIOS		0x6fffffff	/* End of OS-specific */
++#define PT_LOPROC	0x70000000	/* Start of processor-specific */
++#define PT_HIPROC	0x7fffffff	/* End of processor-specific */
++
++/* Legal values for p_flags (segment flags).  */
++
++#define PF_X		(1 << 0)	/* Segment is executable */
++#define PF_W		(1 << 1)	/* Segment is writable */
++#define PF_R		(1 << 2)	/* Segment is readable */
++#define PF_MASKOS	0x0ff00000	/* OS-specific */
++#define PF_MASKPROC	0xf0000000	/* Processor-specific */
++
++/* Legal values for note segment descriptor types for core files. */
++
++#define NT_PRSTATUS	1		/* Contains copy of prstatus struct */
++#define NT_FPREGSET	2		/* Contains copy of fpregset struct */
++#define NT_PRPSINFO	3		/* Contains copy of prpsinfo struct */
++#define NT_PRXREG	4		/* Contains copy of prxregset struct */
++#define NT_TASKSTRUCT	4		/* Contains copy of task structure */
++#define NT_PLATFORM	5		/* String from sysinfo(SI_PLATFORM) */
++#define NT_AUXV		6		/* Contains copy of auxv array */
++#define NT_GWINDOWS	7		/* Contains copy of gwindows struct */
++#define NT_ASRS		8		/* Contains copy of asrset struct */
++#define NT_PSTATUS	10		/* Contains copy of pstatus struct */
++#define NT_PSINFO	13		/* Contains copy of psinfo struct */
++#define NT_PRCRED	14		/* Contains copy of prcred struct */
++#define NT_UTSNAME	15		/* Contains copy of utsname struct */
++#define NT_LWPSTATUS	16		/* Contains copy of lwpstatus struct */
++#define NT_LWPSINFO	17		/* Contains copy of lwpinfo struct */
++#define NT_PRFPXREG	20		/* Contains copy of fprxregset struct */
++#define NT_PRXFPREG	0x46e62b7f	/* Contains copy of user_fxsr_struct */
++#define NT_PPC_VMX	0x100		/* PowerPC Altivec/VMX registers */
++#define NT_PPC_SPE	0x101		/* PowerPC SPE/EVR registers */
++#define NT_PPC_VSX	0x102		/* PowerPC VSX registers */
++#define NT_386_TLS	0x200		/* i386 TLS slots (struct user_desc) */
++#define NT_386_IOPERM	0x201		/* x86 io permission bitmap (1=deny) */
++#define NT_X86_XSTATE	0x202		/* x86 extended state using xsave */
++
++/* Legal values for the note segment descriptor types for object files.  */
++
++#define NT_VERSION	1		/* Contains a version string.  */
++
++
++/* Dynamic section entry.  */
++
++typedef struct
++{
++  Elf32_Sword	d_tag;			/* Dynamic entry type */
++  union
++    {
++      Elf32_Word d_val;			/* Integer value */
++      Elf32_Addr d_ptr;			/* Address value */
++    } d_un;
++} Elf32_Dyn;
++
++typedef struct
++{
++  Elf64_Sxword	d_tag;			/* Dynamic entry type */
++  union
++    {
++      Elf64_Xword d_val;		/* Integer value */
++      Elf64_Addr d_ptr;			/* Address value */
++    } d_un;
++} Elf64_Dyn;
++
++/* Legal values for d_tag (dynamic entry type).  */
++
++#define DT_NULL		0		/* Marks end of dynamic section */
++#define DT_NEEDED	1		/* Name of needed library */
++#define DT_PLTRELSZ	2		/* Size in bytes of PLT relocs */
++#define DT_PLTGOT	3		/* Processor defined value */
++#define DT_HASH		4		/* Address of symbol hash table */
++#define DT_STRTAB	5		/* Address of string table */
++#define DT_SYMTAB	6		/* Address of symbol table */
++#define DT_RELA		7		/* Address of Rela relocs */
++#define DT_RELASZ	8		/* Total size of Rela relocs */
++#define DT_RELAENT	9		/* Size of one Rela reloc */
++#define DT_STRSZ	10		/* Size of string table */
++#define DT_SYMENT	11		/* Size of one symbol table entry */
++#define DT_INIT		12		/* Address of init function */
++#define DT_FINI		13		/* Address of termination function */
++#define DT_SONAME	14		/* Name of shared object */
++#define DT_RPATH	15		/* Library search path (deprecated) */
++#define DT_SYMBOLIC	16		/* Start symbol search here */
++#define DT_REL		17		/* Address of Rel relocs */
++#define DT_RELSZ	18		/* Total size of Rel relocs */
++#define DT_RELENT	19		/* Size of one Rel reloc */
++#define DT_PLTREL	20		/* Type of reloc in PLT */
++#define DT_DEBUG	21		/* For debugging; unspecified */
++#define DT_TEXTREL	22		/* Reloc might modify .text */
++#define DT_JMPREL	23		/* Address of PLT relocs */
++#define	DT_BIND_NOW	24		/* Process relocations of object */
++#define	DT_INIT_ARRAY	25		/* Array with addresses of init fct */
++#define	DT_FINI_ARRAY	26		/* Array with addresses of fini fct */
++#define	DT_INIT_ARRAYSZ	27		/* Size in bytes of DT_INIT_ARRAY */
++#define	DT_FINI_ARRAYSZ	28		/* Size in bytes of DT_FINI_ARRAY */
++#define DT_RUNPATH	29		/* Library search path */
++#define DT_FLAGS	30		/* Flags for the object being loaded */
++#define DT_ENCODING	32		/* Start of encoded range */
++#define DT_PREINIT_ARRAY 32		/* Array with addresses of preinit fct*/
++#define DT_PREINIT_ARRAYSZ 33		/* size in bytes of DT_PREINIT_ARRAY */
++#define	DT_NUM		34		/* Number used */
++#define DT_LOOS		0x6000000d	/* Start of OS-specific */
++#define DT_HIOS		0x6ffff000	/* End of OS-specific */
++#define DT_LOPROC	0x70000000	/* Start of processor-specific */
++#define DT_HIPROC	0x7fffffff	/* End of processor-specific */
++#define	DT_PROCNUM	DT_MIPS_NUM	/* Most used by any processor */
++
++/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
++   Dyn.d_un.d_val field of the Elf*_Dyn structure.  This follows Sun's
++   approach.  */
++#define DT_VALRNGLO	0x6ffffd00
++#define DT_GNU_PRELINKED 0x6ffffdf5	/* Prelinking timestamp */
++#define DT_GNU_CONFLICTSZ 0x6ffffdf6	/* Size of conflict section */
++#define DT_GNU_LIBLISTSZ 0x6ffffdf7	/* Size of library list */
++#define DT_CHECKSUM	0x6ffffdf8
++#define DT_PLTPADSZ	0x6ffffdf9
++#define DT_MOVEENT	0x6ffffdfa
++#define DT_MOVESZ	0x6ffffdfb
++#define DT_FEATURE_1	0x6ffffdfc	/* Feature selection (DTF_*).  */
++#define DT_POSFLAG_1	0x6ffffdfd	/* Flags for DT_* entries, effecting
++					   the following DT_* entry.  */
++#define DT_SYMINSZ	0x6ffffdfe	/* Size of syminfo table (in bytes) */
++#define DT_SYMINENT	0x6ffffdff	/* Entry size of syminfo */
++#define DT_VALRNGHI	0x6ffffdff
++#define DT_VALTAGIDX(tag)	(DT_VALRNGHI - (tag))	/* Reverse order! */
++#define DT_VALNUM 12
++
++/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
++   Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
++
++   If any adjustment is made to the ELF object after it has been
++   built these entries will need to be adjusted.  */
++#define DT_ADDRRNGLO	0x6ffffe00
++#define DT_GNU_HASH	0x6ffffef5	/* GNU-style hash table.  */
++#define DT_TLSDESC_PLT	0x6ffffef6
++#define DT_TLSDESC_GOT	0x6ffffef7
++#define DT_GNU_CONFLICT	0x6ffffef8	/* Start of conflict section */
++#define DT_GNU_LIBLIST	0x6ffffef9	/* Library list */
++#define DT_CONFIG	0x6ffffefa	/* Configuration information.  */
++#define DT_DEPAUDIT	0x6ffffefb	/* Dependency auditing.  */
++#define DT_AUDIT	0x6ffffefc	/* Object auditing.  */
++#define	DT_PLTPAD	0x6ffffefd	/* PLT padding.  */
++#define	DT_MOVETAB	0x6ffffefe	/* Move table.  */
++#define DT_SYMINFO	0x6ffffeff	/* Syminfo table.  */
++#define DT_ADDRRNGHI	0x6ffffeff
++#define DT_ADDRTAGIDX(tag)	(DT_ADDRRNGHI - (tag))	/* Reverse order! */
++#define DT_ADDRNUM 11
++
++/* The versioning entry types.  The next are defined as part of the
++   GNU extension.  */
++#define DT_VERSYM	0x6ffffff0
++
++#define DT_RELACOUNT	0x6ffffff9
++#define DT_RELCOUNT	0x6ffffffa
++
++/* These were chosen by Sun.  */
++#define DT_FLAGS_1	0x6ffffffb	/* State flags, see DF_1_* below.  */
++#define	DT_VERDEF	0x6ffffffc	/* Address of version definition
++					   table */
++#define	DT_VERDEFNUM	0x6ffffffd	/* Number of version definitions */
++#define	DT_VERNEED	0x6ffffffe	/* Address of table with needed
++					   versions */
++#define	DT_VERNEEDNUM	0x6fffffff	/* Number of needed versions */
++#define DT_VERSIONTAGIDX(tag)	(DT_VERNEEDNUM - (tag))	/* Reverse order! */
++#define DT_VERSIONTAGNUM 16
++
++/* Sun added these machine-independent extensions in the "processor-specific"
++   range.  Be compatible.  */
++#define DT_AUXILIARY    0x7ffffffd      /* Shared object to load before self */
++#define DT_FILTER       0x7fffffff      /* Shared object to get values from */
++#define DT_EXTRATAGIDX(tag)	((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
++#define DT_EXTRANUM	3
++
++/* Values of `d_un.d_val' in the DT_FLAGS entry.  */
++#define DF_ORIGIN	0x00000001	/* Object may use DF_ORIGIN */
++#define DF_SYMBOLIC	0x00000002	/* Symbol resolutions starts here */
++#define DF_TEXTREL	0x00000004	/* Object contains text relocations */
++#define DF_BIND_NOW	0x00000008	/* No lazy binding for this object */
++#define DF_STATIC_TLS	0x00000010	/* Module uses the static TLS model */
++
++/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
++   entry in the dynamic section.  */
++#define DF_1_NOW	0x00000001	/* Set RTLD_NOW for this object.  */
++#define DF_1_GLOBAL	0x00000002	/* Set RTLD_GLOBAL for this object.  */
++#define DF_1_GROUP	0x00000004	/* Set RTLD_GROUP for this object.  */
++#define DF_1_NODELETE	0x00000008	/* Set RTLD_NODELETE for this object.*/
++#define DF_1_LOADFLTR	0x00000010	/* Trigger filtee loading at runtime.*/
++#define DF_1_INITFIRST	0x00000020	/* Set RTLD_INITFIRST for this object*/
++#define DF_1_NOOPEN	0x00000040	/* Set RTLD_NOOPEN for this object.  */
++#define DF_1_ORIGIN	0x00000080	/* $ORIGIN must be handled.  */
++#define DF_1_DIRECT	0x00000100	/* Direct binding enabled.  */
++#define DF_1_TRANS	0x00000200
++#define DF_1_INTERPOSE	0x00000400	/* Object is used to interpose.  */
++#define DF_1_NODEFLIB	0x00000800	/* Ignore default lib search path.  */
++#define DF_1_NODUMP	0x00001000	/* Object can't be dldump'ed.  */
++#define DF_1_CONFALT	0x00002000	/* Configuration alternative created.*/
++#define DF_1_ENDFILTEE	0x00004000	/* Filtee terminates filters search. */
++#define	DF_1_DISPRELDNE	0x00008000	/* Disp reloc applied at build time. */
++#define	DF_1_DISPRELPND	0x00010000	/* Disp reloc applied at run-time.  */
++
++/* Flags for the feature selection in DT_FEATURE_1.  */
++#define DTF_1_PARINIT	0x00000001
++#define DTF_1_CONFEXP	0x00000002
++
++/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry.  */
++#define DF_P1_LAZYLOAD	0x00000001	/* Lazyload following object.  */
++#define DF_P1_GROUPPERM	0x00000002	/* Symbols from next object are not
++					   generally available.  */
++
++/* Version definition sections.  */
++
++typedef struct
++{
++  Elf32_Half	vd_version;		/* Version revision */
++  Elf32_Half	vd_flags;		/* Version information */
++  Elf32_Half	vd_ndx;			/* Version Index */
++  Elf32_Half	vd_cnt;			/* Number of associated aux entries */
++  Elf32_Word	vd_hash;		/* Version name hash value */
++  Elf32_Word	vd_aux;			/* Offset in bytes to verdaux array */
++  Elf32_Word	vd_next;		/* Offset in bytes to next verdef
++					   entry */
++} Elf32_Verdef;
++
++typedef struct
++{
++  Elf64_Half	vd_version;		/* Version revision */
++  Elf64_Half	vd_flags;		/* Version information */
++  Elf64_Half	vd_ndx;			/* Version Index */
++  Elf64_Half	vd_cnt;			/* Number of associated aux entries */
++  Elf64_Word	vd_hash;		/* Version name hash value */
++  Elf64_Word	vd_aux;			/* Offset in bytes to verdaux array */
++  Elf64_Word	vd_next;		/* Offset in bytes to next verdef
++					   entry */
++} Elf64_Verdef;
++
++
++/* Legal values for vd_version (version revision).  */
++#define VER_DEF_NONE	0		/* No version */
++#define VER_DEF_CURRENT	1		/* Current version */
++#define VER_DEF_NUM	2		/* Given version number */
++
++/* Legal values for vd_flags (version information flags).  */
++#define VER_FLG_BASE	0x1		/* Version definition of file itself */
++#define VER_FLG_WEAK	0x2		/* Weak version identifier */
++
++/* Versym symbol index values.  */
++#define	VER_NDX_LOCAL		0	/* Symbol is local.  */
++#define	VER_NDX_GLOBAL		1	/* Symbol is global.  */
++#define	VER_NDX_LORESERVE	0xff00	/* Beginning of reserved entries.  */
++#define	VER_NDX_ELIMINATE	0xff01	/* Symbol is to be eliminated.  */
++
++/* Auxialiary version information.  */
++
++typedef struct
++{
++  Elf32_Word	vda_name;		/* Version or dependency names */
++  Elf32_Word	vda_next;		/* Offset in bytes to next verdaux
++					   entry */
++} Elf32_Verdaux;
++
++typedef struct
++{
++  Elf64_Word	vda_name;		/* Version or dependency names */
++  Elf64_Word	vda_next;		/* Offset in bytes to next verdaux
++					   entry */
++} Elf64_Verdaux;
++
++
++/* Version dependency section.  */
++
++typedef struct
++{
++  Elf32_Half	vn_version;		/* Version of structure */
++  Elf32_Half	vn_cnt;			/* Number of associated aux entries */
++  Elf32_Word	vn_file;		/* Offset of filename for this
++					   dependency */
++  Elf32_Word	vn_aux;			/* Offset in bytes to vernaux array */
++  Elf32_Word	vn_next;		/* Offset in bytes to next verneed
++					   entry */
++} Elf32_Verneed;
++
++typedef struct
++{
++  Elf64_Half	vn_version;		/* Version of structure */
++  Elf64_Half	vn_cnt;			/* Number of associated aux entries */
++  Elf64_Word	vn_file;		/* Offset of filename for this
++					   dependency */
++  Elf64_Word	vn_aux;			/* Offset in bytes to vernaux array */
++  Elf64_Word	vn_next;		/* Offset in bytes to next verneed
++					   entry */
++} Elf64_Verneed;
++
++
++/* Legal values for vn_version (version revision).  */
++#define VER_NEED_NONE	 0		/* No version */
++#define VER_NEED_CURRENT 1		/* Current version */
++#define VER_NEED_NUM	 2		/* Given version number */
++
++/* Auxiliary needed version information.  */
++
++typedef struct
++{
++  Elf32_Word	vna_hash;		/* Hash value of dependency name */
++  Elf32_Half	vna_flags;		/* Dependency specific information */
++  Elf32_Half	vna_other;		/* Unused */
++  Elf32_Word	vna_name;		/* Dependency name string offset */
++  Elf32_Word	vna_next;		/* Offset in bytes to next vernaux
++					   entry */
++} Elf32_Vernaux;
++
++typedef struct
++{
++  Elf64_Word	vna_hash;		/* Hash value of dependency name */
++  Elf64_Half	vna_flags;		/* Dependency specific information */
++  Elf64_Half	vna_other;		/* Unused */
++  Elf64_Word	vna_name;		/* Dependency name string offset */
++  Elf64_Word	vna_next;		/* Offset in bytes to next vernaux
++					   entry */
++} Elf64_Vernaux;
++
++
++/* Legal values for vna_flags.  */
++#define VER_FLG_WEAK	0x2		/* Weak version identifier */
++
++
++/* Auxiliary vector.  */
++
++/* This vector is normally only used by the program interpreter.  The
++   usual definition in an ABI supplement uses the name auxv_t.  The
++   vector is not usually defined in a standard <elf.h> file, but it
++   can't hurt.  We rename it to avoid conflicts.  The sizes of these
++   types are an arrangement between the exec server and the program
++   interpreter, so we don't fully specify them here.  */
++
++typedef struct
++{
++  uint32_t a_type;		/* Entry type */
++  union
++    {
++      uint32_t a_val;		/* Integer value */
++      /* We use to have pointer elements added here.  We cannot do that,
++	 though, since it does not work when using 32-bit definitions
++	 on 64-bit platforms and vice versa.  */
++    } a_un;
++} Elf32_auxv_t;
++
++typedef struct
++{
++  uint64_t a_type;		/* Entry type */
++  union
++    {
++      uint64_t a_val;		/* Integer value */
++      /* We use to have pointer elements added here.  We cannot do that,
++	 though, since it does not work when using 32-bit definitions
++	 on 64-bit platforms and vice versa.  */
++    } a_un;
++} Elf64_auxv_t;
++
++/* Legal values for a_type (entry type).  */
++
++#define AT_NULL		0		/* End of vector */
++#define AT_IGNORE	1		/* Entry should be ignored */
++#define AT_EXECFD	2		/* File descriptor of program */
++#define AT_PHDR		3		/* Program headers for program */
++#define AT_PHENT	4		/* Size of program header entry */
++#define AT_PHNUM	5		/* Number of program headers */
++#define AT_PAGESZ	6		/* System page size */
++#define AT_BASE		7		/* Base address of interpreter */
++#define AT_FLAGS	8		/* Flags */
++#define AT_ENTRY	9		/* Entry point of program */
++#define AT_NOTELF	10		/* Program is not ELF */
++#define AT_UID		11		/* Real uid */
++#define AT_EUID		12		/* Effective uid */
++#define AT_GID		13		/* Real gid */
++#define AT_EGID		14		/* Effective gid */
++#define AT_CLKTCK	17		/* Frequency of times() */
++
++/* Some more special a_type values describing the hardware.  */
++#define AT_PLATFORM	15		/* String identifying platform.  */
++#define AT_HWCAP	16		/* Machine dependent hints about
++					   processor capabilities.  */
++
++/* This entry gives some information about the FPU initialization
++   performed by the kernel.  */
++#define AT_FPUCW	18		/* Used FPU control word.  */
++
++/* Cache block sizes.  */
++#define AT_DCACHEBSIZE	19		/* Data cache block size.  */
++#define AT_ICACHEBSIZE	20		/* Instruction cache block size.  */
++#define AT_UCACHEBSIZE	21		/* Unified cache block size.  */
++
++/* A special ignored value for PPC, used by the kernel to control the
++   interpretation of the AUXV. Must be > 16.  */
++#define AT_IGNOREPPC	22		/* Entry should be ignored.  */
++
++#define	AT_SECURE	23		/* Boolean, was exec setuid-like?  */
++
++#define AT_BASE_PLATFORM 24		/* String identifying real platforms.*/
++
++#define AT_RANDOM	25		/* Address of 16 random bytes.  */
++
++#define AT_EXECFN	31		/* Filename of executable.  */
++
++/* Pointer to the global system page used for system calls and other
++   nice things.  */
++#define AT_SYSINFO	32
++#define AT_SYSINFO_EHDR	33
++
++/* Shapes of the caches.  Bits 0-3 contains associativity; bits 4-7 contains
++   log2 of line size; mask those to get cache size.  */
++#define AT_L1I_CACHESHAPE	34
++#define AT_L1D_CACHESHAPE	35
++#define AT_L2_CACHESHAPE	36
++#define AT_L3_CACHESHAPE	37
++
++/* Note section contents.  Each entry in the note section begins with
++   a header of a fixed form.  */
++
++typedef struct
++{
++  Elf32_Word n_namesz;			/* Length of the note's name.  */
++  Elf32_Word n_descsz;			/* Length of the note's descriptor.  */
++  Elf32_Word n_type;			/* Type of the note.  */
++} Elf32_Nhdr;
++
++typedef struct
++{
++  Elf64_Word n_namesz;			/* Length of the note's name.  */
++  Elf64_Word n_descsz;			/* Length of the note's descriptor.  */
++  Elf64_Word n_type;			/* Type of the note.  */
++} Elf64_Nhdr;
++
++/* Known names of notes.  */
++
++/* Solaris entries in the note section have this name.  */
++#define ELF_NOTE_SOLARIS	"SUNW Solaris"
++
++/* Note entries for GNU systems have this name.  */
++#define ELF_NOTE_GNU		"GNU"
++
++
++/* Defined types of notes for Solaris.  */
++
++/* Value of descriptor (one word) is desired pagesize for the binary.  */
++#define ELF_NOTE_PAGESIZE_HINT	1
++
++
++/* Defined note types for GNU systems.  */
++
++/* ABI information.  The descriptor consists of words:
++   word 0: OS descriptor
++   word 1: major version of the ABI
++   word 2: minor version of the ABI
++   word 3: subminor version of the ABI
++*/
++#define NT_GNU_ABI_TAG	1
++#define ELF_NOTE_ABI	NT_GNU_ABI_TAG /* Old name.  */
++
++/* Known OSes.  These values can appear in word 0 of an
++   NT_GNU_ABI_TAG note section entry.  */
++#define ELF_NOTE_OS_LINUX	0
++#define ELF_NOTE_OS_GNU		1
++#define ELF_NOTE_OS_SOLARIS2	2
++#define ELF_NOTE_OS_FREEBSD	3
++
++/* Synthetic hwcap information.  The descriptor begins with two words:
++   word 0: number of entries
++   word 1: bitmask of enabled entries
++   Then follow variable-length entries, one byte followed by a
++   '\0'-terminated hwcap name string.  The byte gives the bit
++   number to test if enabled, (1U << bit) & bitmask.  */
++#define NT_GNU_HWCAP	2
++
++/* Build ID bits as generated by ld --build-id.
++   The descriptor consists of any nonzero number of bytes.  */
++#define NT_GNU_BUILD_ID	3
++
++/* Version note generated by GNU gold containing a version string.  */
++#define NT_GNU_GOLD_VERSION	4
++
++
++/* Move records.  */
++typedef struct
++{
++  Elf32_Xword m_value;		/* Symbol value.  */
++  Elf32_Word m_info;		/* Size and index.  */
++  Elf32_Word m_poffset;		/* Symbol offset.  */
++  Elf32_Half m_repeat;		/* Repeat count.  */
++  Elf32_Half m_stride;		/* Stride info.  */
++} Elf32_Move;
++
++typedef struct
++{
++  Elf64_Xword m_value;		/* Symbol value.  */
++  Elf64_Xword m_info;		/* Size and index.  */
++  Elf64_Xword m_poffset;	/* Symbol offset.  */
++  Elf64_Half m_repeat;		/* Repeat count.  */
++  Elf64_Half m_stride;		/* Stride info.  */
++} Elf64_Move;
++
++/* Macro to construct move records.  */
++#define ELF32_M_SYM(info)	((info) >> 8)
++#define ELF32_M_SIZE(info)	((unsigned char) (info))
++#define ELF32_M_INFO(sym, size)	(((sym) << 8) + (unsigned char) (size))
++
++#define ELF64_M_SYM(info)	ELF32_M_SYM (info)
++#define ELF64_M_SIZE(info)	ELF32_M_SIZE (info)
++#define ELF64_M_INFO(sym, size)	ELF32_M_INFO (sym, size)
++
++
++/* Motorola 68k specific definitions.  */
++
++/* Values for Elf32_Ehdr.e_flags.  */
++#define EF_CPU32	0x00810000
++
++/* m68k relocs.  */
++
++#define R_68K_NONE	0		/* No reloc */
++#define R_68K_32	1		/* Direct 32 bit  */
++#define R_68K_16	2		/* Direct 16 bit  */
++#define R_68K_8		3		/* Direct 8 bit  */
++#define R_68K_PC32	4		/* PC relative 32 bit */
++#define R_68K_PC16	5		/* PC relative 16 bit */
++#define R_68K_PC8	6		/* PC relative 8 bit */
++#define R_68K_GOT32	7		/* 32 bit PC relative GOT entry */
++#define R_68K_GOT16	8		/* 16 bit PC relative GOT entry */
++#define R_68K_GOT8	9		/* 8 bit PC relative GOT entry */
++#define R_68K_GOT32O	10		/* 32 bit GOT offset */
++#define R_68K_GOT16O	11		/* 16 bit GOT offset */
++#define R_68K_GOT8O	12		/* 8 bit GOT offset */
++#define R_68K_PLT32	13		/* 32 bit PC relative PLT address */
++#define R_68K_PLT16	14		/* 16 bit PC relative PLT address */
++#define R_68K_PLT8	15		/* 8 bit PC relative PLT address */
++#define R_68K_PLT32O	16		/* 32 bit PLT offset */
++#define R_68K_PLT16O	17		/* 16 bit PLT offset */
++#define R_68K_PLT8O	18		/* 8 bit PLT offset */
++#define R_68K_COPY	19		/* Copy symbol at runtime */
++#define R_68K_GLOB_DAT	20		/* Create GOT entry */
++#define R_68K_JMP_SLOT	21		/* Create PLT entry */
++#define R_68K_RELATIVE	22		/* Adjust by program base */
++#define R_68K_TLS_GD32      25          /* 32 bit GOT offset for GD */
++#define R_68K_TLS_GD16      26          /* 16 bit GOT offset for GD */
++#define R_68K_TLS_GD8       27          /* 8 bit GOT offset for GD */
++#define R_68K_TLS_LDM32     28          /* 32 bit GOT offset for LDM */
++#define R_68K_TLS_LDM16     29          /* 16 bit GOT offset for LDM */
++#define R_68K_TLS_LDM8      30          /* 8 bit GOT offset for LDM */
++#define R_68K_TLS_LDO32     31          /* 32 bit module-relative offset */
++#define R_68K_TLS_LDO16     32          /* 16 bit module-relative offset */
++#define R_68K_TLS_LDO8      33          /* 8 bit module-relative offset */
++#define R_68K_TLS_IE32      34          /* 32 bit GOT offset for IE */
++#define R_68K_TLS_IE16      35          /* 16 bit GOT offset for IE */
++#define R_68K_TLS_IE8       36          /* 8 bit GOT offset for IE */
++#define R_68K_TLS_LE32      37          /* 32 bit offset relative to
++					   static TLS block */
++#define R_68K_TLS_LE16      38          /* 16 bit offset relative to
++					   static TLS block */
++#define R_68K_TLS_LE8       39          /* 8 bit offset relative to
++					   static TLS block */
++#define R_68K_TLS_DTPMOD32  40          /* 32 bit module number */
++#define R_68K_TLS_DTPREL32  41          /* 32 bit module-relative offset */
++#define R_68K_TLS_TPREL32   42          /* 32 bit TP-relative offset */
++/* Keep this the last entry.  */
++#define R_68K_NUM	43
++
++/* Intel 80386 specific definitions.  */
++
++/* i386 relocs.  */
++
++#define R_386_NONE	   0		/* No reloc */
++#define R_386_32	   1		/* Direct 32 bit  */
++#define R_386_PC32	   2		/* PC relative 32 bit */
++#define R_386_GOT32	   3		/* 32 bit GOT entry */
++#define R_386_PLT32	   4		/* 32 bit PLT address */
++#define R_386_COPY	   5		/* Copy symbol at runtime */
++#define R_386_GLOB_DAT	   6		/* Create GOT entry */
++#define R_386_JMP_SLOT	   7		/* Create PLT entry */
++#define R_386_RELATIVE	   8		/* Adjust by program base */
++#define R_386_GOTOFF	   9		/* 32 bit offset to GOT */
++#define R_386_GOTPC	   10		/* 32 bit PC relative offset to GOT */
++#define R_386_32PLT	   11
++#define R_386_TLS_TPOFF	   14		/* Offset in static TLS block */
++#define R_386_TLS_IE	   15		/* Address of GOT entry for static TLS
++					   block offset */
++#define R_386_TLS_GOTIE	   16		/* GOT entry for static TLS block
++					   offset */
++#define R_386_TLS_LE	   17		/* Offset relative to static TLS
++					   block */
++#define R_386_TLS_GD	   18		/* Direct 32 bit for GNU version of
++					   general dynamic thread local data */
++#define R_386_TLS_LDM	   19		/* Direct 32 bit for GNU version of
++					   local dynamic thread local data
++					   in LE code */
++#define R_386_16	   20
++#define R_386_PC16	   21
++#define R_386_8		   22
++#define R_386_PC8	   23
++#define R_386_TLS_GD_32	   24		/* Direct 32 bit for general dynamic
++					   thread local data */
++#define R_386_TLS_GD_PUSH  25		/* Tag for pushl in GD TLS code */
++#define R_386_TLS_GD_CALL  26		/* Relocation for call to
++					   __tls_get_addr() */
++#define R_386_TLS_GD_POP   27		/* Tag for popl in GD TLS code */
++#define R_386_TLS_LDM_32   28		/* Direct 32 bit for local dynamic
++					   thread local data in LE code */
++#define R_386_TLS_LDM_PUSH 29		/* Tag for pushl in LDM TLS code */
++#define R_386_TLS_LDM_CALL 30		/* Relocation for call to
++					   __tls_get_addr() in LDM code */
++#define R_386_TLS_LDM_POP  31		/* Tag for popl in LDM TLS code */
++#define R_386_TLS_LDO_32   32		/* Offset relative to TLS block */
++#define R_386_TLS_IE_32	   33		/* GOT entry for negated static TLS
++					   block offset */
++#define R_386_TLS_LE_32	   34		/* Negated offset relative to static
++					   TLS block */
++#define R_386_TLS_DTPMOD32 35		/* ID of module containing symbol */
++#define R_386_TLS_DTPOFF32 36		/* Offset in TLS block */
++#define R_386_TLS_TPOFF32  37		/* Negated offset in static TLS block */
++/* 38? */
++#define R_386_TLS_GOTDESC  39		/* GOT offset for TLS descriptor.  */
++#define R_386_TLS_DESC_CALL 40		/* Marker of call through TLS
++					   descriptor for
++					   relaxation.  */
++#define R_386_TLS_DESC     41		/* TLS descriptor containing
++					   pointer to code and to
++					   argument, returning the TLS
++					   offset for the symbol.  */
++#define R_386_IRELATIVE	   42		/* Adjust indirectly by program base */
++/* Keep this the last entry.  */
++#define R_386_NUM	   43
++
++/* SUN SPARC specific definitions.  */
++
++/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
++
++#define STT_SPARC_REGISTER	13	/* Global register reserved to app. */
++
++/* Values for Elf64_Ehdr.e_flags.  */
++
++#define EF_SPARCV9_MM		3
++#define EF_SPARCV9_TSO		0
++#define EF_SPARCV9_PSO		1
++#define EF_SPARCV9_RMO		2
++#define EF_SPARC_LEDATA		0x800000 /* little endian data */
++#define EF_SPARC_EXT_MASK	0xFFFF00
++#define EF_SPARC_32PLUS		0x000100 /* generic V8+ features */
++#define EF_SPARC_SUN_US1	0x000200 /* Sun UltraSPARC1 extensions */
++#define EF_SPARC_HAL_R1		0x000400 /* HAL R1 extensions */
++#define EF_SPARC_SUN_US3	0x000800 /* Sun UltraSPARCIII extensions */
++
++/* SPARC relocs.  */
++
++#define R_SPARC_NONE		0	/* No reloc */
++#define R_SPARC_8		1	/* Direct 8 bit */
++#define R_SPARC_16		2	/* Direct 16 bit */
++#define R_SPARC_32		3	/* Direct 32 bit */
++#define R_SPARC_DISP8		4	/* PC relative 8 bit */
++#define R_SPARC_DISP16		5	/* PC relative 16 bit */
++#define R_SPARC_DISP32		6	/* PC relative 32 bit */
++#define R_SPARC_WDISP30		7	/* PC relative 30 bit shifted */
++#define R_SPARC_WDISP22		8	/* PC relative 22 bit shifted */
++#define R_SPARC_HI22		9	/* High 22 bit */
++#define R_SPARC_22		10	/* Direct 22 bit */
++#define R_SPARC_13		11	/* Direct 13 bit */
++#define R_SPARC_LO10		12	/* Truncated 10 bit */
++#define R_SPARC_GOT10		13	/* Truncated 10 bit GOT entry */
++#define R_SPARC_GOT13		14	/* 13 bit GOT entry */
++#define R_SPARC_GOT22		15	/* 22 bit GOT entry shifted */
++#define R_SPARC_PC10		16	/* PC relative 10 bit truncated */
++#define R_SPARC_PC22		17	/* PC relative 22 bit shifted */
++#define R_SPARC_WPLT30		18	/* 30 bit PC relative PLT address */
++#define R_SPARC_COPY		19	/* Copy symbol at runtime */
++#define R_SPARC_GLOB_DAT	20	/* Create GOT entry */
++#define R_SPARC_JMP_SLOT	21	/* Create PLT entry */
++#define R_SPARC_RELATIVE	22	/* Adjust by program base */
++#define R_SPARC_UA32		23	/* Direct 32 bit unaligned */
++
++/* Additional Sparc64 relocs.  */
++
++#define R_SPARC_PLT32		24	/* Direct 32 bit ref to PLT entry */
++#define R_SPARC_HIPLT22		25	/* High 22 bit PLT entry */
++#define R_SPARC_LOPLT10		26	/* Truncated 10 bit PLT entry */
++#define R_SPARC_PCPLT32		27	/* PC rel 32 bit ref to PLT entry */
++#define R_SPARC_PCPLT22		28	/* PC rel high 22 bit PLT entry */
++#define R_SPARC_PCPLT10		29	/* PC rel trunc 10 bit PLT entry */
++#define R_SPARC_10		30	/* Direct 10 bit */
++#define R_SPARC_11		31	/* Direct 11 bit */
++#define R_SPARC_64		32	/* Direct 64 bit */
++#define R_SPARC_OLO10		33	/* 10bit with secondary 13bit addend */
++#define R_SPARC_HH22		34	/* Top 22 bits of direct 64 bit */
++#define R_SPARC_HM10		35	/* High middle 10 bits of ... */
++#define R_SPARC_LM22		36	/* Low middle 22 bits of ... */
++#define R_SPARC_PC_HH22		37	/* Top 22 bits of pc rel 64 bit */
++#define R_SPARC_PC_HM10		38	/* High middle 10 bit of ... */
++#define R_SPARC_PC_LM22		39	/* Low miggle 22 bits of ... */
++#define R_SPARC_WDISP16		40	/* PC relative 16 bit shifted */
++#define R_SPARC_WDISP19		41	/* PC relative 19 bit shifted */
++#define R_SPARC_GLOB_JMP	42	/* was part of v9 ABI but was removed */
++#define R_SPARC_7		43	/* Direct 7 bit */
++#define R_SPARC_5		44	/* Direct 5 bit */
++#define R_SPARC_6		45	/* Direct 6 bit */
++#define R_SPARC_DISP64		46	/* PC relative 64 bit */
++#define R_SPARC_PLT64		47	/* Direct 64 bit ref to PLT entry */
++#define R_SPARC_HIX22		48	/* High 22 bit complemented */
++#define R_SPARC_LOX10		49	/* Truncated 11 bit complemented */
++#define R_SPARC_H44		50	/* Direct high 12 of 44 bit */
++#define R_SPARC_M44		51	/* Direct mid 22 of 44 bit */
++#define R_SPARC_L44		52	/* Direct low 10 of 44 bit */
++#define R_SPARC_REGISTER	53	/* Global register usage */
++#define R_SPARC_UA64		54	/* Direct 64 bit unaligned */
++#define R_SPARC_UA16		55	/* Direct 16 bit unaligned */
++#define R_SPARC_TLS_GD_HI22	56
++#define R_SPARC_TLS_GD_LO10	57
++#define R_SPARC_TLS_GD_ADD	58
++#define R_SPARC_TLS_GD_CALL	59
++#define R_SPARC_TLS_LDM_HI22	60
++#define R_SPARC_TLS_LDM_LO10	61
++#define R_SPARC_TLS_LDM_ADD	62
++#define R_SPARC_TLS_LDM_CALL	63
++#define R_SPARC_TLS_LDO_HIX22	64
++#define R_SPARC_TLS_LDO_LOX10	65
++#define R_SPARC_TLS_LDO_ADD	66
++#define R_SPARC_TLS_IE_HI22	67
++#define R_SPARC_TLS_IE_LO10	68
++#define R_SPARC_TLS_IE_LD	69
++#define R_SPARC_TLS_IE_LDX	70
++#define R_SPARC_TLS_IE_ADD	71
++#define R_SPARC_TLS_LE_HIX22	72
++#define R_SPARC_TLS_LE_LOX10	73
++#define R_SPARC_TLS_DTPMOD32	74
++#define R_SPARC_TLS_DTPMOD64	75
++#define R_SPARC_TLS_DTPOFF32	76
++#define R_SPARC_TLS_DTPOFF64	77
++#define R_SPARC_TLS_TPOFF32	78
++#define R_SPARC_TLS_TPOFF64	79
++#define R_SPARC_GOTDATA_HIX22	80
++#define R_SPARC_GOTDATA_LOX10	81
++#define R_SPARC_GOTDATA_OP_HIX22	82
++#define R_SPARC_GOTDATA_OP_LOX10	83
++#define R_SPARC_GOTDATA_OP	84
++#define R_SPARC_H34		85
++#define R_SPARC_SIZE32		86
++#define R_SPARC_SIZE64		87
++#define R_SPARC_WDISP10		88
++#define R_SPARC_JMP_IREL	248
++#define R_SPARC_IRELATIVE	249
++#define R_SPARC_GNU_VTINHERIT	250
++#define R_SPARC_GNU_VTENTRY	251
++#define R_SPARC_REV32		252
++/* Keep this the last entry.  */
++#define R_SPARC_NUM		253
++
++/* For Sparc64, legal values for d_tag of Elf64_Dyn.  */
++
++#define DT_SPARC_REGISTER 0x70000001
++#define DT_SPARC_NUM	2
++
++/* MIPS R3000 specific definitions.  */
++
++/* Legal values for e_flags field of Elf32_Ehdr.  */
++
++#define EF_MIPS_NOREORDER   1		/* A .noreorder directive was used */
++#define EF_MIPS_PIC	    2		/* Contains PIC code */
++#define EF_MIPS_CPIC	    4		/* Uses PIC calling sequence */
++#define EF_MIPS_XGOT	    8
++#define EF_MIPS_64BIT_WHIRL 16
++#define EF_MIPS_ABI2	    32
++#define EF_MIPS_ABI_ON32    64
++#define EF_MIPS_ARCH	    0xf0000000	/* MIPS architecture level */
++
++/* Legal values for MIPS architecture level.  */
++
++#define EF_MIPS_ARCH_1	    0x00000000	/* -mips1 code.  */
++#define EF_MIPS_ARCH_2	    0x10000000	/* -mips2 code.  */
++#define EF_MIPS_ARCH_3	    0x20000000	/* -mips3 code.  */
++#define EF_MIPS_ARCH_4	    0x30000000	/* -mips4 code.  */
++#define EF_MIPS_ARCH_5	    0x40000000	/* -mips5 code.  */
++#define EF_MIPS_ARCH_32	    0x60000000	/* MIPS32 code.  */
++#define EF_MIPS_ARCH_64	    0x70000000	/* MIPS64 code.  */
++
++/* The following are non-official names and should not be used.  */
++
++#define E_MIPS_ARCH_1	  0x00000000	/* -mips1 code.  */
++#define E_MIPS_ARCH_2	  0x10000000	/* -mips2 code.  */
++#define E_MIPS_ARCH_3	  0x20000000	/* -mips3 code.  */
++#define E_MIPS_ARCH_4	  0x30000000	/* -mips4 code.  */
++#define E_MIPS_ARCH_5	  0x40000000	/* -mips5 code.  */
++#define E_MIPS_ARCH_32	  0x60000000	/* MIPS32 code.  */
++#define E_MIPS_ARCH_64	  0x70000000	/* MIPS64 code.  */
++
++/* Special section indices.  */
++
++#define SHN_MIPS_ACOMMON    0xff00	/* Allocated common symbols */
++#define SHN_MIPS_TEXT	    0xff01	/* Allocated test symbols.  */
++#define SHN_MIPS_DATA	    0xff02	/* Allocated data symbols.  */
++#define SHN_MIPS_SCOMMON    0xff03	/* Small common symbols */
++#define SHN_MIPS_SUNDEFINED 0xff04	/* Small undefined symbols */
++
++/* Legal values for sh_type field of Elf32_Shdr.  */
++
++#define SHT_MIPS_LIBLIST       0x70000000 /* Shared objects used in link */
++#define SHT_MIPS_MSYM	       0x70000001
++#define SHT_MIPS_CONFLICT      0x70000002 /* Conflicting symbols */
++#define SHT_MIPS_GPTAB	       0x70000003 /* Global data area sizes */
++#define SHT_MIPS_UCODE	       0x70000004 /* Reserved for SGI/MIPS compilers */
++#define SHT_MIPS_DEBUG	       0x70000005 /* MIPS ECOFF debugging information*/
++#define SHT_MIPS_REGINFO       0x70000006 /* Register usage information */
++#define SHT_MIPS_PACKAGE       0x70000007
++#define SHT_MIPS_PACKSYM       0x70000008
++#define SHT_MIPS_RELD	       0x70000009
++#define SHT_MIPS_IFACE         0x7000000b
++#define SHT_MIPS_CONTENT       0x7000000c
++#define SHT_MIPS_OPTIONS       0x7000000d /* Miscellaneous options.  */
++#define SHT_MIPS_SHDR	       0x70000010
++#define SHT_MIPS_FDESC	       0x70000011
++#define SHT_MIPS_EXTSYM	       0x70000012
++#define SHT_MIPS_DENSE	       0x70000013
++#define SHT_MIPS_PDESC	       0x70000014
++#define SHT_MIPS_LOCSYM	       0x70000015
++#define SHT_MIPS_AUXSYM	       0x70000016
++#define SHT_MIPS_OPTSYM	       0x70000017
++#define SHT_MIPS_LOCSTR	       0x70000018
++#define SHT_MIPS_LINE	       0x70000019
++#define SHT_MIPS_RFDESC	       0x7000001a
++#define SHT_MIPS_DELTASYM      0x7000001b
++#define SHT_MIPS_DELTAINST     0x7000001c
++#define SHT_MIPS_DELTACLASS    0x7000001d
++#define SHT_MIPS_DWARF         0x7000001e /* DWARF debugging information.  */
++#define SHT_MIPS_DELTADECL     0x7000001f
++#define SHT_MIPS_SYMBOL_LIB    0x70000020
++#define SHT_MIPS_EVENTS	       0x70000021 /* Event section.  */
++#define SHT_MIPS_TRANSLATE     0x70000022
++#define SHT_MIPS_PIXIE	       0x70000023
++#define SHT_MIPS_XLATE	       0x70000024
++#define SHT_MIPS_XLATE_DEBUG   0x70000025
++#define SHT_MIPS_WHIRL	       0x70000026
++#define SHT_MIPS_EH_REGION     0x70000027
++#define SHT_MIPS_XLATE_OLD     0x70000028
++#define SHT_MIPS_PDR_EXCEPTION 0x70000029
++
++/* Legal values for sh_flags field of Elf32_Shdr.  */
++
++#define SHF_MIPS_GPREL	 0x10000000	/* Must be part of global data area */
++#define SHF_MIPS_MERGE	 0x20000000
++#define SHF_MIPS_ADDR	 0x40000000
++#define SHF_MIPS_STRINGS 0x80000000
++#define SHF_MIPS_NOSTRIP 0x08000000
++#define SHF_MIPS_LOCAL	 0x04000000
++#define SHF_MIPS_NAMES	 0x02000000
++#define SHF_MIPS_NODUPE	 0x01000000
++
++
++/* Symbol tables.  */
++
++/* MIPS specific values for `st_other'.  */
++#define STO_MIPS_DEFAULT		0x0
++#define STO_MIPS_INTERNAL		0x1
++#define STO_MIPS_HIDDEN			0x2
++#define STO_MIPS_PROTECTED		0x3
++#define STO_MIPS_PLT			0x8
++#define STO_MIPS_SC_ALIGN_UNUSED	0xff
++
++/* MIPS specific values for `st_info'.  */
++#define STB_MIPS_SPLIT_COMMON		13
++
++/* Entries found in sections of type SHT_MIPS_GPTAB.  */
++
++typedef union
++{
++  struct
++    {
++      Elf32_Word gt_current_g_value;	/* -G value used for compilation */
++      Elf32_Word gt_unused;		/* Not used */
++    } gt_header;			/* First entry in section */
++  struct
++    {
++      Elf32_Word gt_g_value;		/* If this value were used for -G */
++      Elf32_Word gt_bytes;		/* This many bytes would be used */
++    } gt_entry;				/* Subsequent entries in section */
++} Elf32_gptab;
++
++/* Entry found in sections of type SHT_MIPS_REGINFO.  */
++
++typedef struct
++{
++  Elf32_Word	ri_gprmask;		/* General registers used */
++  Elf32_Word	ri_cprmask[4];		/* Coprocessor registers used */
++  Elf32_Sword	ri_gp_value;		/* $gp register value */
++} Elf32_RegInfo;
++
++/* Entries found in sections of type SHT_MIPS_OPTIONS.  */
++
++typedef struct
++{
++  unsigned char kind;		/* Determines interpretation of the
++				   variable part of descriptor.  */
++  unsigned char size;		/* Size of descriptor, including header.  */
++  Elf32_Section section;	/* Section header index of section affected,
++				   0 for global options.  */
++  Elf32_Word info;		/* Kind-specific information.  */
++} Elf_Options;
++
++/* Values for `kind' field in Elf_Options.  */
++
++#define ODK_NULL	0	/* Undefined.  */
++#define ODK_REGINFO	1	/* Register usage information.  */
++#define ODK_EXCEPTIONS	2	/* Exception processing options.  */
++#define ODK_PAD		3	/* Section padding options.  */
++#define ODK_HWPATCH	4	/* Hardware workarounds performed */
++#define ODK_FILL	5	/* record the fill value used by the linker. */
++#define ODK_TAGS	6	/* reserve space for desktop tools to write. */
++#define ODK_HWAND	7	/* HW workarounds.  'AND' bits when merging. */
++#define ODK_HWOR	8	/* HW workarounds.  'OR' bits when merging.  */
++
++/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries.  */
++
++#define OEX_FPU_MIN	0x1f	/* FPE's which MUST be enabled.  */
++#define OEX_FPU_MAX	0x1f00	/* FPE's which MAY be enabled.  */
++#define OEX_PAGE0	0x10000	/* page zero must be mapped.  */
++#define OEX_SMM		0x20000	/* Force sequential memory mode?  */
++#define OEX_FPDBUG	0x40000	/* Force floating point debug mode?  */
++#define OEX_PRECISEFP	OEX_FPDBUG
++#define OEX_DISMISS	0x80000	/* Dismiss invalid address faults?  */
++
++#define OEX_FPU_INVAL	0x10
++#define OEX_FPU_DIV0	0x08
++#define OEX_FPU_OFLO	0x04
++#define OEX_FPU_UFLO	0x02
++#define OEX_FPU_INEX	0x01
++
++/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry.  */
++
++#define OHW_R4KEOP	0x1	/* R4000 end-of-page patch.  */
++#define OHW_R8KPFETCH	0x2	/* may need R8000 prefetch patch.  */
++#define OHW_R5KEOP	0x4	/* R5000 end-of-page patch.  */
++#define OHW_R5KCVTL	0x8	/* R5000 cvt.[ds].l bug.  clean=1.  */
++
++#define OPAD_PREFIX	0x1
++#define OPAD_POSTFIX	0x2
++#define OPAD_SYMBOL	0x4
++
++/* Entry found in `.options' section.  */
++
++typedef struct
++{
++  Elf32_Word hwp_flags1;	/* Extra flags.  */
++  Elf32_Word hwp_flags2;	/* Extra flags.  */
++} Elf_Options_Hw;
++
++/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries.  */
++
++#define OHWA0_R4KEOP_CHECKED	0x00000001
++#define OHWA1_R4KEOP_CLEAN	0x00000002
++
++/* MIPS relocs.  */
++
++#define R_MIPS_NONE		0	/* No reloc */
++#define R_MIPS_16		1	/* Direct 16 bit */
++#define R_MIPS_32		2	/* Direct 32 bit */
++#define R_MIPS_REL32		3	/* PC relative 32 bit */
++#define R_MIPS_26		4	/* Direct 26 bit shifted */
++#define R_MIPS_HI16		5	/* High 16 bit */
++#define R_MIPS_LO16		6	/* Low 16 bit */
++#define R_MIPS_GPREL16		7	/* GP relative 16 bit */
++#define R_MIPS_LITERAL		8	/* 16 bit literal entry */
++#define R_MIPS_GOT16		9	/* 16 bit GOT entry */
++#define R_MIPS_PC16		10	/* PC relative 16 bit */
++#define R_MIPS_CALL16		11	/* 16 bit GOT entry for function */
++#define R_MIPS_GPREL32		12	/* GP relative 32 bit */
++
++#define R_MIPS_SHIFT5		16
++#define R_MIPS_SHIFT6		17
++#define R_MIPS_64		18
++#define R_MIPS_GOT_DISP		19
++#define R_MIPS_GOT_PAGE		20
++#define R_MIPS_GOT_OFST		21
++#define R_MIPS_GOT_HI16		22
++#define R_MIPS_GOT_LO16		23
++#define R_MIPS_SUB		24
++#define R_MIPS_INSERT_A		25
++#define R_MIPS_INSERT_B		26
++#define R_MIPS_DELETE		27
++#define R_MIPS_HIGHER		28
++#define R_MIPS_HIGHEST		29
++#define R_MIPS_CALL_HI16	30
++#define R_MIPS_CALL_LO16	31
++#define R_MIPS_SCN_DISP		32
++#define R_MIPS_REL16		33
++#define R_MIPS_ADD_IMMEDIATE	34
++#define R_MIPS_PJUMP		35
++#define R_MIPS_RELGOT		36
++#define R_MIPS_JALR		37
++#define R_MIPS_TLS_DTPMOD32	38	/* Module number 32 bit */
++#define R_MIPS_TLS_DTPREL32	39	/* Module-relative offset 32 bit */
++#define R_MIPS_TLS_DTPMOD64	40	/* Module number 64 bit */
++#define R_MIPS_TLS_DTPREL64	41	/* Module-relative offset 64 bit */
++#define R_MIPS_TLS_GD		42	/* 16 bit GOT offset for GD */
++#define R_MIPS_TLS_LDM		43	/* 16 bit GOT offset for LDM */
++#define R_MIPS_TLS_DTPREL_HI16	44	/* Module-relative offset, high 16 bits */
++#define R_MIPS_TLS_DTPREL_LO16	45	/* Module-relative offset, low 16 bits */
++#define R_MIPS_TLS_GOTTPREL	46	/* 16 bit GOT offset for IE */
++#define R_MIPS_TLS_TPREL32	47	/* TP-relative offset, 32 bit */
++#define R_MIPS_TLS_TPREL64	48	/* TP-relative offset, 64 bit */
++#define R_MIPS_TLS_TPREL_HI16	49	/* TP-relative offset, high 16 bits */
++#define R_MIPS_TLS_TPREL_LO16	50	/* TP-relative offset, low 16 bits */
++#define R_MIPS_GLOB_DAT		51
++#define R_MIPS_COPY		126
++#define R_MIPS_JUMP_SLOT        127
++/* Keep this the last entry.  */
++#define R_MIPS_NUM		128
++
++/* Legal values for p_type field of Elf32_Phdr.  */
++
++#define PT_MIPS_REGINFO	0x70000000	/* Register usage information */
++#define PT_MIPS_RTPROC  0x70000001	/* Runtime procedure table. */
++#define PT_MIPS_OPTIONS 0x70000002
++
++/* Special program header types.  */
++
++#define PF_MIPS_LOCAL	0x10000000
++
++/* Legal values for d_tag field of Elf32_Dyn.  */
++
++#define DT_MIPS_RLD_VERSION  0x70000001	/* Runtime linker interface version */
++#define DT_MIPS_TIME_STAMP   0x70000002	/* Timestamp */
++#define DT_MIPS_ICHECKSUM    0x70000003	/* Checksum */
++#define DT_MIPS_IVERSION     0x70000004	/* Version string (string tbl index) */
++#define DT_MIPS_FLAGS	     0x70000005	/* Flags */
++#define DT_MIPS_BASE_ADDRESS 0x70000006	/* Base address */
++#define DT_MIPS_MSYM	     0x70000007
++#define DT_MIPS_CONFLICT     0x70000008	/* Address of CONFLICT section */
++#define DT_MIPS_LIBLIST	     0x70000009	/* Address of LIBLIST section */
++#define DT_MIPS_LOCAL_GOTNO  0x7000000a	/* Number of local GOT entries */
++#define DT_MIPS_CONFLICTNO   0x7000000b	/* Number of CONFLICT entries */
++#define DT_MIPS_LIBLISTNO    0x70000010	/* Number of LIBLIST entries */
++#define DT_MIPS_SYMTABNO     0x70000011	/* Number of DYNSYM entries */
++#define DT_MIPS_UNREFEXTNO   0x70000012	/* First external DYNSYM */
++#define DT_MIPS_GOTSYM	     0x70000013	/* First GOT entry in DYNSYM */
++#define DT_MIPS_HIPAGENO     0x70000014	/* Number of GOT page table entries */
++#define DT_MIPS_RLD_MAP	     0x70000016	/* Address of run time loader map.  */
++#define DT_MIPS_DELTA_CLASS  0x70000017	/* Delta C++ class definition.  */
++#define DT_MIPS_DELTA_CLASS_NO    0x70000018 /* Number of entries in
++						DT_MIPS_DELTA_CLASS.  */
++#define DT_MIPS_DELTA_INSTANCE    0x70000019 /* Delta C++ class instances.  */
++#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in
++						DT_MIPS_DELTA_INSTANCE.  */
++#define DT_MIPS_DELTA_RELOC  0x7000001b /* Delta relocations.  */
++#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in
++					     DT_MIPS_DELTA_RELOC.  */
++#define DT_MIPS_DELTA_SYM    0x7000001d /* Delta symbols that Delta
++					   relocations refer to.  */
++#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in
++					   DT_MIPS_DELTA_SYM.  */
++#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the
++					     class declaration.  */
++#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in
++						DT_MIPS_DELTA_CLASSSYM.  */
++#define DT_MIPS_CXX_FLAGS    0x70000022 /* Flags indicating for C++ flavor.  */
++#define DT_MIPS_PIXIE_INIT   0x70000023
++#define DT_MIPS_SYMBOL_LIB   0x70000024
++#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
++#define DT_MIPS_LOCAL_GOTIDX 0x70000026
++#define DT_MIPS_HIDDEN_GOTIDX 0x70000027
++#define DT_MIPS_PROTECTED_GOTIDX 0x70000028
++#define DT_MIPS_OPTIONS	     0x70000029 /* Address of .options.  */
++#define DT_MIPS_INTERFACE    0x7000002a /* Address of .interface.  */
++#define DT_MIPS_DYNSTR_ALIGN 0x7000002b
++#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */
++#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve
++						    function stored in GOT.  */
++#define DT_MIPS_PERF_SUFFIX  0x7000002e /* Default suffix of dso to be added
++					   by rld on dlopen() calls.  */
++#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
++#define DT_MIPS_GP_VALUE     0x70000030 /* GP value for aux GOTs.  */
++#define DT_MIPS_AUX_DYNAMIC  0x70000031 /* Address of aux .dynamic.  */
++/* The address of .got.plt in an executable using the new non-PIC ABI.  */
++#define DT_MIPS_PLTGOT	     0x70000032
++/* The base of the PLT in an executable using the new non-PIC ABI if that
++   PLT is writable.  For a non-writable PLT, this is omitted or has a zero
++   value.  */
++#define DT_MIPS_RWPLT        0x70000034
++#define DT_MIPS_NUM	     0x35
++
++/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry.  */
++
++#define RHF_NONE		   0		/* No flags */
++#define RHF_QUICKSTART		   (1 << 0)	/* Use quickstart */
++#define RHF_NOTPOT		   (1 << 1)	/* Hash size not power of 2 */
++#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2)	/* Ignore LD_LIBRARY_PATH */
++#define RHF_NO_MOVE		   (1 << 3)
++#define RHF_SGI_ONLY		   (1 << 4)
++#define RHF_GUARANTEE_INIT	   (1 << 5)
++#define RHF_DELTA_C_PLUS_PLUS	   (1 << 6)
++#define RHF_GUARANTEE_START_INIT   (1 << 7)
++#define RHF_PIXIE		   (1 << 8)
++#define RHF_DEFAULT_DELAY_LOAD	   (1 << 9)
++#define RHF_REQUICKSTART	   (1 << 10)
++#define RHF_REQUICKSTARTED	   (1 << 11)
++#define RHF_CORD		   (1 << 12)
++#define RHF_NO_UNRES_UNDEF	   (1 << 13)
++#define RHF_RLD_ORDER_SAFE	   (1 << 14)
++
++/* Entries found in sections of type SHT_MIPS_LIBLIST.  */
++
++typedef struct
++{
++  Elf32_Word l_name;		/* Name (string table index) */
++  Elf32_Word l_time_stamp;	/* Timestamp */
++  Elf32_Word l_checksum;	/* Checksum */
++  Elf32_Word l_version;		/* Interface version */
++  Elf32_Word l_flags;		/* Flags */
++} Elf32_Lib;
++
++typedef struct
++{
++  Elf64_Word l_name;		/* Name (string table index) */
++  Elf64_Word l_time_stamp;	/* Timestamp */
++  Elf64_Word l_checksum;	/* Checksum */
++  Elf64_Word l_version;		/* Interface version */
++  Elf64_Word l_flags;		/* Flags */
++} Elf64_Lib;
++
++
++/* Legal values for l_flags.  */
++
++#define LL_NONE		  0
++#define LL_EXACT_MATCH	  (1 << 0)	/* Require exact match */
++#define LL_IGNORE_INT_VER (1 << 1)	/* Ignore interface version */
++#define LL_REQUIRE_MINOR  (1 << 2)
++#define LL_EXPORTS	  (1 << 3)
++#define LL_DELAY_LOAD	  (1 << 4)
++#define LL_DELTA	  (1 << 5)
++
++/* Entries found in sections of type SHT_MIPS_CONFLICT.  */
++
++typedef Elf32_Addr Elf32_Conflict;
++
++
++/* HPPA specific definitions.  */
++
++/* Legal values for e_flags field of Elf32_Ehdr.  */
++
++#define EF_PARISC_TRAPNIL	0x00010000 /* Trap nil pointer dereference.  */
++#define EF_PARISC_EXT		0x00020000 /* Program uses arch. extensions. */
++#define EF_PARISC_LSB		0x00040000 /* Program expects little endian. */
++#define EF_PARISC_WIDE		0x00080000 /* Program expects wide mode.  */
++#define EF_PARISC_NO_KABP	0x00100000 /* No kernel assisted branch
++					      prediction.  */
++#define EF_PARISC_LAZYSWAP	0x00400000 /* Allow lazy swapping.  */
++#define EF_PARISC_ARCH		0x0000ffff /* Architecture version.  */
++
++/* Defined values for `e_flags & EF_PARISC_ARCH' are:  */
++
++#define EFA_PARISC_1_0		    0x020b /* PA-RISC 1.0 big-endian.  */
++#define EFA_PARISC_1_1		    0x0210 /* PA-RISC 1.1 big-endian.  */
++#define EFA_PARISC_2_0		    0x0214 /* PA-RISC 2.0 big-endian.  */
++
++/* Additional section indeces.  */
++
++#define SHN_PARISC_ANSI_COMMON	0xff00	   /* Section for tenatively declared
++					      symbols in ANSI C.  */
++#define SHN_PARISC_HUGE_COMMON	0xff01	   /* Common blocks in huge model.  */
++
++/* Legal values for sh_type field of Elf32_Shdr.  */
++
++#define SHT_PARISC_EXT		0x70000000 /* Contains product specific ext. */
++#define SHT_PARISC_UNWIND	0x70000001 /* Unwind information.  */
++#define SHT_PARISC_DOC		0x70000002 /* Debug info for optimized code. */
++
++/* Legal values for sh_flags field of Elf32_Shdr.  */
++
++#define SHF_PARISC_SHORT	0x20000000 /* Section with short addressing. */
++#define SHF_PARISC_HUGE		0x40000000 /* Section far from gp.  */
++#define SHF_PARISC_SBP		0x80000000 /* Static branch prediction code. */
++
++/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
++
++#define STT_PARISC_MILLICODE	13	/* Millicode function entry point.  */
++
++#define STT_HP_OPAQUE		(STT_LOOS + 0x1)
++#define STT_HP_STUB		(STT_LOOS + 0x2)
++
++/* HPPA relocs.  */
++
++#define R_PARISC_NONE		0	/* No reloc.  */
++#define R_PARISC_DIR32		1	/* Direct 32-bit reference.  */
++#define R_PARISC_DIR21L		2	/* Left 21 bits of eff. address.  */
++#define R_PARISC_DIR17R		3	/* Right 17 bits of eff. address.  */
++#define R_PARISC_DIR17F		4	/* 17 bits of eff. address.  */
++#define R_PARISC_DIR14R		6	/* Right 14 bits of eff. address.  */
++#define R_PARISC_PCREL32	9	/* 32-bit rel. address.  */
++#define R_PARISC_PCREL21L	10	/* Left 21 bits of rel. address.  */
++#define R_PARISC_PCREL17R	11	/* Right 17 bits of rel. address.  */
++#define R_PARISC_PCREL17F	12	/* 17 bits of rel. address.  */
++#define R_PARISC_PCREL14R	14	/* Right 14 bits of rel. address.  */
++#define R_PARISC_DPREL21L	18	/* Left 21 bits of rel. address.  */
++#define R_PARISC_DPREL14R	22	/* Right 14 bits of rel. address.  */
++#define R_PARISC_GPREL21L	26	/* GP-relative, left 21 bits.  */
++#define R_PARISC_GPREL14R	30	/* GP-relative, right 14 bits.  */
++#define R_PARISC_LTOFF21L	34	/* LT-relative, left 21 bits.  */
++#define R_PARISC_LTOFF14R	38	/* LT-relative, right 14 bits.  */
++#define R_PARISC_SECREL32	41	/* 32 bits section rel. address.  */
++#define R_PARISC_SEGBASE	48	/* No relocation, set segment base.  */
++#define R_PARISC_SEGREL32	49	/* 32 bits segment rel. address.  */
++#define R_PARISC_PLTOFF21L	50	/* PLT rel. address, left 21 bits.  */
++#define R_PARISC_PLTOFF14R	54	/* PLT rel. address, right 14 bits.  */
++#define R_PARISC_LTOFF_FPTR32	57	/* 32 bits LT-rel. function pointer. */
++#define R_PARISC_LTOFF_FPTR21L	58	/* LT-rel. fct ptr, left 21 bits. */
++#define R_PARISC_LTOFF_FPTR14R	62	/* LT-rel. fct ptr, right 14 bits. */
++#define R_PARISC_FPTR64		64	/* 64 bits function address.  */
++#define R_PARISC_PLABEL32	65	/* 32 bits function address.  */
++#define R_PARISC_PLABEL21L	66	/* Left 21 bits of fdesc address.  */
++#define R_PARISC_PLABEL14R	70	/* Right 14 bits of fdesc address.  */
++#define R_PARISC_PCREL64	72	/* 64 bits PC-rel. address.  */
++#define R_PARISC_PCREL22F	74	/* 22 bits PC-rel. address.  */
++#define R_PARISC_PCREL14WR	75	/* PC-rel. address, right 14 bits.  */
++#define R_PARISC_PCREL14DR	76	/* PC rel. address, right 14 bits.  */
++#define R_PARISC_PCREL16F	77	/* 16 bits PC-rel. address.  */
++#define R_PARISC_PCREL16WF	78	/* 16 bits PC-rel. address.  */
++#define R_PARISC_PCREL16DF	79	/* 16 bits PC-rel. address.  */
++#define R_PARISC_DIR64		80	/* 64 bits of eff. address.  */
++#define R_PARISC_DIR14WR	83	/* 14 bits of eff. address.  */
++#define R_PARISC_DIR14DR	84	/* 14 bits of eff. address.  */
++#define R_PARISC_DIR16F		85	/* 16 bits of eff. address.  */
++#define R_PARISC_DIR16WF	86	/* 16 bits of eff. address.  */
++#define R_PARISC_DIR16DF	87	/* 16 bits of eff. address.  */
++#define R_PARISC_GPREL64	88	/* 64 bits of GP-rel. address.  */
++#define R_PARISC_GPREL14WR	91	/* GP-rel. address, right 14 bits.  */
++#define R_PARISC_GPREL14DR	92	/* GP-rel. address, right 14 bits.  */
++#define R_PARISC_GPREL16F	93	/* 16 bits GP-rel. address.  */
++#define R_PARISC_GPREL16WF	94	/* 16 bits GP-rel. address.  */
++#define R_PARISC_GPREL16DF	95	/* 16 bits GP-rel. address.  */
++#define R_PARISC_LTOFF64	96	/* 64 bits LT-rel. address.  */
++#define R_PARISC_LTOFF14WR	99	/* LT-rel. address, right 14 bits.  */
++#define R_PARISC_LTOFF14DR	100	/* LT-rel. address, right 14 bits.  */
++#define R_PARISC_LTOFF16F	101	/* 16 bits LT-rel. address.  */
++#define R_PARISC_LTOFF16WF	102	/* 16 bits LT-rel. address.  */
++#define R_PARISC_LTOFF16DF	103	/* 16 bits LT-rel. address.  */
++#define R_PARISC_SECREL64	104	/* 64 bits section rel. address.  */
++#define R_PARISC_SEGREL64	112	/* 64 bits segment rel. address.  */
++#define R_PARISC_PLTOFF14WR	115	/* PLT-rel. address, right 14 bits.  */
++#define R_PARISC_PLTOFF14DR	116	/* PLT-rel. address, right 14 bits.  */
++#define R_PARISC_PLTOFF16F	117	/* 16 bits LT-rel. address.  */
++#define R_PARISC_PLTOFF16WF	118	/* 16 bits PLT-rel. address.  */
++#define R_PARISC_PLTOFF16DF	119	/* 16 bits PLT-rel. address.  */
++#define R_PARISC_LTOFF_FPTR64	120	/* 64 bits LT-rel. function ptr.  */
++#define R_PARISC_LTOFF_FPTR14WR	123	/* LT-rel. fct. ptr., right 14 bits. */
++#define R_PARISC_LTOFF_FPTR14DR	124	/* LT-rel. fct. ptr., right 14 bits. */
++#define R_PARISC_LTOFF_FPTR16F	125	/* 16 bits LT-rel. function ptr.  */
++#define R_PARISC_LTOFF_FPTR16WF	126	/* 16 bits LT-rel. function ptr.  */
++#define R_PARISC_LTOFF_FPTR16DF	127	/* 16 bits LT-rel. function ptr.  */
++#define R_PARISC_LORESERVE	128
++#define R_PARISC_COPY		128	/* Copy relocation.  */
++#define R_PARISC_IPLT		129	/* Dynamic reloc, imported PLT */
++#define R_PARISC_EPLT		130	/* Dynamic reloc, exported PLT */
++#define R_PARISC_TPREL32	153	/* 32 bits TP-rel. address.  */
++#define R_PARISC_TPREL21L	154	/* TP-rel. address, left 21 bits.  */
++#define R_PARISC_TPREL14R	158	/* TP-rel. address, right 14 bits.  */
++#define R_PARISC_LTOFF_TP21L	162	/* LT-TP-rel. address, left 21 bits. */
++#define R_PARISC_LTOFF_TP14R	166	/* LT-TP-rel. address, right 14 bits.*/
++#define R_PARISC_LTOFF_TP14F	167	/* 14 bits LT-TP-rel. address.  */
++#define R_PARISC_TPREL64	216	/* 64 bits TP-rel. address.  */
++#define R_PARISC_TPREL14WR	219	/* TP-rel. address, right 14 bits.  */
++#define R_PARISC_TPREL14DR	220	/* TP-rel. address, right 14 bits.  */
++#define R_PARISC_TPREL16F	221	/* 16 bits TP-rel. address.  */
++#define R_PARISC_TPREL16WF	222	/* 16 bits TP-rel. address.  */
++#define R_PARISC_TPREL16DF	223	/* 16 bits TP-rel. address.  */
++#define R_PARISC_LTOFF_TP64	224	/* 64 bits LT-TP-rel. address.  */
++#define R_PARISC_LTOFF_TP14WR	227	/* LT-TP-rel. address, right 14 bits.*/
++#define R_PARISC_LTOFF_TP14DR	228	/* LT-TP-rel. address, right 14 bits.*/
++#define R_PARISC_LTOFF_TP16F	229	/* 16 bits LT-TP-rel. address.  */
++#define R_PARISC_LTOFF_TP16WF	230	/* 16 bits LT-TP-rel. address.  */
++#define R_PARISC_LTOFF_TP16DF	231	/* 16 bits LT-TP-rel. address.  */
++#define R_PARISC_GNU_VTENTRY	232
++#define R_PARISC_GNU_VTINHERIT	233
++#define R_PARISC_TLS_GD21L	234	/* GD 21-bit left.  */
++#define R_PARISC_TLS_GD14R	235	/* GD 14-bit right.  */
++#define R_PARISC_TLS_GDCALL	236	/* GD call to __t_g_a.  */
++#define R_PARISC_TLS_LDM21L	237	/* LD module 21-bit left.  */
++#define R_PARISC_TLS_LDM14R	238	/* LD module 14-bit right.  */
++#define R_PARISC_TLS_LDMCALL	239	/* LD module call to __t_g_a.  */
++#define R_PARISC_TLS_LDO21L	240	/* LD offset 21-bit left.  */
++#define R_PARISC_TLS_LDO14R	241	/* LD offset 14-bit right.  */
++#define R_PARISC_TLS_DTPMOD32	242	/* DTP module 32-bit.  */
++#define R_PARISC_TLS_DTPMOD64	243	/* DTP module 64-bit.  */
++#define R_PARISC_TLS_DTPOFF32	244	/* DTP offset 32-bit.  */
++#define R_PARISC_TLS_DTPOFF64	245	/* DTP offset 32-bit.  */
++#define R_PARISC_TLS_LE21L	R_PARISC_TPREL21L
++#define R_PARISC_TLS_LE14R	R_PARISC_TPREL14R
++#define R_PARISC_TLS_IE21L	R_PARISC_LTOFF_TP21L
++#define R_PARISC_TLS_IE14R	R_PARISC_LTOFF_TP14R
++#define R_PARISC_TLS_TPREL32	R_PARISC_TPREL32
++#define R_PARISC_TLS_TPREL64	R_PARISC_TPREL64
++#define R_PARISC_HIRESERVE	255
++
++/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr.  */
++
++#define PT_HP_TLS		(PT_LOOS + 0x0)
++#define PT_HP_CORE_NONE		(PT_LOOS + 0x1)
++#define PT_HP_CORE_VERSION	(PT_LOOS + 0x2)
++#define PT_HP_CORE_KERNEL	(PT_LOOS + 0x3)
++#define PT_HP_CORE_COMM		(PT_LOOS + 0x4)
++#define PT_HP_CORE_PROC		(PT_LOOS + 0x5)
++#define PT_HP_CORE_LOADABLE	(PT_LOOS + 0x6)
++#define PT_HP_CORE_STACK	(PT_LOOS + 0x7)
++#define PT_HP_CORE_SHM		(PT_LOOS + 0x8)
++#define PT_HP_CORE_MMF		(PT_LOOS + 0x9)
++#define PT_HP_PARALLEL		(PT_LOOS + 0x10)
++#define PT_HP_FASTBIND		(PT_LOOS + 0x11)
++#define PT_HP_OPT_ANNOT		(PT_LOOS + 0x12)
++#define PT_HP_HSL_ANNOT		(PT_LOOS + 0x13)
++#define PT_HP_STACK		(PT_LOOS + 0x14)
++
++#define PT_PARISC_ARCHEXT	0x70000000
++#define PT_PARISC_UNWIND	0x70000001
++
++/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr.  */
++
++#define PF_PARISC_SBP		0x08000000
++
++#define PF_HP_PAGE_SIZE		0x00100000
++#define PF_HP_FAR_SHARED	0x00200000
++#define PF_HP_NEAR_SHARED	0x00400000
++#define PF_HP_CODE		0x01000000
++#define PF_HP_MODIFY		0x02000000
++#define PF_HP_LAZYSWAP		0x04000000
++#define PF_HP_SBP		0x08000000
++
++
++/* Alpha specific definitions.  */
++
++/* Legal values for e_flags field of Elf64_Ehdr.  */
++
++#define EF_ALPHA_32BIT		1	/* All addresses must be < 2GB.  */
++#define EF_ALPHA_CANRELAX	2	/* Relocations for relaxing exist.  */
++
++/* Legal values for sh_type field of Elf64_Shdr.  */
++
++/* These two are primerily concerned with ECOFF debugging info.  */
++#define SHT_ALPHA_DEBUG		0x70000001
++#define SHT_ALPHA_REGINFO	0x70000002
++
++/* Legal values for sh_flags field of Elf64_Shdr.  */
++
++#define SHF_ALPHA_GPREL		0x10000000
++
++/* Legal values for st_other field of Elf64_Sym.  */
++#define STO_ALPHA_NOPV		0x80	/* No PV required.  */
++#define STO_ALPHA_STD_GPLOAD	0x88	/* PV only used for initial ldgp.  */
++
++/* Alpha relocs.  */
++
++#define R_ALPHA_NONE		0	/* No reloc */
++#define R_ALPHA_REFLONG		1	/* Direct 32 bit */
++#define R_ALPHA_REFQUAD		2	/* Direct 64 bit */
++#define R_ALPHA_GPREL32		3	/* GP relative 32 bit */
++#define R_ALPHA_LITERAL		4	/* GP relative 16 bit w/optimization */
++#define R_ALPHA_LITUSE		5	/* Optimization hint for LITERAL */
++#define R_ALPHA_GPDISP		6	/* Add displacement to GP */
++#define R_ALPHA_BRADDR		7	/* PC+4 relative 23 bit shifted */
++#define R_ALPHA_HINT		8	/* PC+4 relative 16 bit shifted */
++#define R_ALPHA_SREL16		9	/* PC relative 16 bit */
++#define R_ALPHA_SREL32		10	/* PC relative 32 bit */
++#define R_ALPHA_SREL64		11	/* PC relative 64 bit */
++#define R_ALPHA_GPRELHIGH	17	/* GP relative 32 bit, high 16 bits */
++#define R_ALPHA_GPRELLOW	18	/* GP relative 32 bit, low 16 bits */
++#define R_ALPHA_GPREL16		19	/* GP relative 16 bit */
++#define R_ALPHA_COPY		24	/* Copy symbol at runtime */
++#define R_ALPHA_GLOB_DAT	25	/* Create GOT entry */
++#define R_ALPHA_JMP_SLOT	26	/* Create PLT entry */
++#define R_ALPHA_RELATIVE	27	/* Adjust by program base */
++#define R_ALPHA_TLS_GD_HI	28
++#define R_ALPHA_TLSGD		29
++#define R_ALPHA_TLS_LDM		30
++#define R_ALPHA_DTPMOD64	31
++#define R_ALPHA_GOTDTPREL	32
++#define R_ALPHA_DTPREL64	33
++#define R_ALPHA_DTPRELHI	34
++#define R_ALPHA_DTPRELLO	35
++#define R_ALPHA_DTPREL16	36
++#define R_ALPHA_GOTTPREL	37
++#define R_ALPHA_TPREL64		38
++#define R_ALPHA_TPRELHI		39
++#define R_ALPHA_TPRELLO		40
++#define R_ALPHA_TPREL16		41
++/* Keep this the last entry.  */
++#define R_ALPHA_NUM		46
++
++/* Magic values of the LITUSE relocation addend.  */
++#define LITUSE_ALPHA_ADDR	0
++#define LITUSE_ALPHA_BASE	1
++#define LITUSE_ALPHA_BYTOFF	2
++#define LITUSE_ALPHA_JSR	3
++#define LITUSE_ALPHA_TLS_GD	4
++#define LITUSE_ALPHA_TLS_LDM	5
++
++/* Legal values for d_tag of Elf64_Dyn.  */
++#define DT_ALPHA_PLTRO		(DT_LOPROC + 0)
++#define DT_ALPHA_NUM		1
++
++/* PowerPC specific declarations */
++
++/* Values for Elf32/64_Ehdr.e_flags.  */
++#define EF_PPC_EMB		0x80000000	/* PowerPC embedded flag */
++
++/* Cygnus local bits below */
++#define EF_PPC_RELOCATABLE	0x00010000	/* PowerPC -mrelocatable flag*/
++#define EF_PPC_RELOCATABLE_LIB	0x00008000	/* PowerPC -mrelocatable-lib
++						   flag */
++
++/* PowerPC relocations defined by the ABIs */
++#define R_PPC_NONE		0
++#define R_PPC_ADDR32		1	/* 32bit absolute address */
++#define R_PPC_ADDR24		2	/* 26bit address, 2 bits ignored.  */
++#define R_PPC_ADDR16		3	/* 16bit absolute address */
++#define R_PPC_ADDR16_LO		4	/* lower 16bit of absolute address */
++#define R_PPC_ADDR16_HI		5	/* high 16bit of absolute address */
++#define R_PPC_ADDR16_HA		6	/* adjusted high 16bit */
++#define R_PPC_ADDR14		7	/* 16bit address, 2 bits ignored */
++#define R_PPC_ADDR14_BRTAKEN	8
++#define R_PPC_ADDR14_BRNTAKEN	9
++#define R_PPC_REL24		10	/* PC relative 26 bit */
++#define R_PPC_REL14		11	/* PC relative 16 bit */
++#define R_PPC_REL14_BRTAKEN	12
++#define R_PPC_REL14_BRNTAKEN	13
++#define R_PPC_GOT16		14
++#define R_PPC_GOT16_LO		15
++#define R_PPC_GOT16_HI		16
++#define R_PPC_GOT16_HA		17
++#define R_PPC_PLTREL24		18
++#define R_PPC_COPY		19
++#define R_PPC_GLOB_DAT		20
++#define R_PPC_JMP_SLOT		21
++#define R_PPC_RELATIVE		22
++#define R_PPC_LOCAL24PC		23
++#define R_PPC_UADDR32		24
++#define R_PPC_UADDR16		25
++#define R_PPC_REL32		26
++#define R_PPC_PLT32		27
++#define R_PPC_PLTREL32		28
++#define R_PPC_PLT16_LO		29
++#define R_PPC_PLT16_HI		30
++#define R_PPC_PLT16_HA		31
++#define R_PPC_SDAREL16		32
++#define R_PPC_SECTOFF		33
++#define R_PPC_SECTOFF_LO	34
++#define R_PPC_SECTOFF_HI	35
++#define R_PPC_SECTOFF_HA	36
++
++/* PowerPC relocations defined for the TLS access ABI.  */
++#define R_PPC_TLS		67 /* none	(sym+add)@tls */
++#define R_PPC_DTPMOD32		68 /* word32	(sym+add)@dtpmod */
++#define R_PPC_TPREL16		69 /* half16*	(sym+add)@tprel */
++#define R_PPC_TPREL16_LO	70 /* half16	(sym+add)@tprel@l */
++#define R_PPC_TPREL16_HI	71 /* half16	(sym+add)@tprel@h */
++#define R_PPC_TPREL16_HA	72 /* half16	(sym+add)@tprel@ha */
++#define R_PPC_TPREL32		73 /* word32	(sym+add)@tprel */
++#define R_PPC_DTPREL16		74 /* half16*	(sym+add)@dtprel */
++#define R_PPC_DTPREL16_LO	75 /* half16	(sym+add)@dtprel@l */
++#define R_PPC_DTPREL16_HI	76 /* half16	(sym+add)@dtprel@h */
++#define R_PPC_DTPREL16_HA	77 /* half16	(sym+add)@dtprel@ha */
++#define R_PPC_DTPREL32		78 /* word32	(sym+add)@dtprel */
++#define R_PPC_GOT_TLSGD16	79 /* half16*	(sym+add)@got@tlsgd */
++#define R_PPC_GOT_TLSGD16_LO	80 /* half16	(sym+add)@got@tlsgd@l */
++#define R_PPC_GOT_TLSGD16_HI	81 /* half16	(sym+add)@got@tlsgd@h */
++#define R_PPC_GOT_TLSGD16_HA	82 /* half16	(sym+add)@got@tlsgd@ha */
++#define R_PPC_GOT_TLSLD16	83 /* half16*	(sym+add)@got@tlsld */
++#define R_PPC_GOT_TLSLD16_LO	84 /* half16	(sym+add)@got@tlsld@l */
++#define R_PPC_GOT_TLSLD16_HI	85 /* half16	(sym+add)@got@tlsld@h */
++#define R_PPC_GOT_TLSLD16_HA	86 /* half16	(sym+add)@got@tlsld@ha */
++#define R_PPC_GOT_TPREL16	87 /* half16*	(sym+add)@got@tprel */
++#define R_PPC_GOT_TPREL16_LO	88 /* half16	(sym+add)@got@tprel@l */
++#define R_PPC_GOT_TPREL16_HI	89 /* half16	(sym+add)@got@tprel@h */
++#define R_PPC_GOT_TPREL16_HA	90 /* half16	(sym+add)@got@tprel@ha */
++#define R_PPC_GOT_DTPREL16	91 /* half16*	(sym+add)@got@dtprel */
++#define R_PPC_GOT_DTPREL16_LO	92 /* half16*	(sym+add)@got@dtprel@l */
++#define R_PPC_GOT_DTPREL16_HI	93 /* half16*	(sym+add)@got@dtprel@h */
++#define R_PPC_GOT_DTPREL16_HA	94 /* half16*	(sym+add)@got@dtprel@ha */
++
++/* The remaining relocs are from the Embedded ELF ABI, and are not
++   in the SVR4 ELF ABI.  */
++#define R_PPC_EMB_NADDR32	101
++#define R_PPC_EMB_NADDR16	102
++#define R_PPC_EMB_NADDR16_LO	103
++#define R_PPC_EMB_NADDR16_HI	104
++#define R_PPC_EMB_NADDR16_HA	105
++#define R_PPC_EMB_SDAI16	106
++#define R_PPC_EMB_SDA2I16	107
++#define R_PPC_EMB_SDA2REL	108
++#define R_PPC_EMB_SDA21		109	/* 16 bit offset in SDA */
++#define R_PPC_EMB_MRKREF	110
++#define R_PPC_EMB_RELSEC16	111
++#define R_PPC_EMB_RELST_LO	112
++#define R_PPC_EMB_RELST_HI	113
++#define R_PPC_EMB_RELST_HA	114
++#define R_PPC_EMB_BIT_FLD	115
++#define R_PPC_EMB_RELSDA	116	/* 16 bit relative offset in SDA */
++
++/* Diab tool relocations.  */
++#define R_PPC_DIAB_SDA21_LO	180	/* like EMB_SDA21, but lower 16 bit */
++#define R_PPC_DIAB_SDA21_HI	181	/* like EMB_SDA21, but high 16 bit */
++#define R_PPC_DIAB_SDA21_HA	182	/* like EMB_SDA21, adjusted high 16 */
++#define R_PPC_DIAB_RELSDA_LO	183	/* like EMB_RELSDA, but lower 16 bit */
++#define R_PPC_DIAB_RELSDA_HI	184	/* like EMB_RELSDA, but high 16 bit */
++#define R_PPC_DIAB_RELSDA_HA	185	/* like EMB_RELSDA, adjusted high 16 */
++
++/* GNU extension to support local ifunc.  */
++#define R_PPC_IRELATIVE		248
++
++/* GNU relocs used in PIC code sequences.  */
++#define R_PPC_REL16		249	/* half16   (sym+add-.) */
++#define R_PPC_REL16_LO		250	/* half16   (sym+add-.)@l */
++#define R_PPC_REL16_HI		251	/* half16   (sym+add-.)@h */
++#define R_PPC_REL16_HA		252	/* half16   (sym+add-.)@ha */
++
++/* This is a phony reloc to handle any old fashioned TOC16 references
++   that may still be in object files.  */
++#define R_PPC_TOC16		255
++
++/* PowerPC specific values for the Dyn d_tag field.  */
++#define DT_PPC_GOT		(DT_LOPROC + 0)
++#define DT_PPC_NUM		1
++
++/* PowerPC64 relocations defined by the ABIs */
++#define R_PPC64_NONE		R_PPC_NONE
++#define R_PPC64_ADDR32		R_PPC_ADDR32 /* 32bit absolute address */
++#define R_PPC64_ADDR24		R_PPC_ADDR24 /* 26bit address, word aligned */
++#define R_PPC64_ADDR16		R_PPC_ADDR16 /* 16bit absolute address */
++#define R_PPC64_ADDR16_LO	R_PPC_ADDR16_LO	/* lower 16bits of address */
++#define R_PPC64_ADDR16_HI	R_PPC_ADDR16_HI	/* high 16bits of address. */
++#define R_PPC64_ADDR16_HA	R_PPC_ADDR16_HA /* adjusted high 16bits.  */
++#define R_PPC64_ADDR14		R_PPC_ADDR14 /* 16bit address, word aligned */
++#define R_PPC64_ADDR14_BRTAKEN	R_PPC_ADDR14_BRTAKEN
++#define R_PPC64_ADDR14_BRNTAKEN	R_PPC_ADDR14_BRNTAKEN
++#define R_PPC64_REL24		R_PPC_REL24 /* PC-rel. 26 bit, word aligned */
++#define R_PPC64_REL14		R_PPC_REL14 /* PC relative 16 bit */
++#define R_PPC64_REL14_BRTAKEN	R_PPC_REL14_BRTAKEN
++#define R_PPC64_REL14_BRNTAKEN	R_PPC_REL14_BRNTAKEN
++#define R_PPC64_GOT16		R_PPC_GOT16
++#define R_PPC64_GOT16_LO	R_PPC_GOT16_LO
++#define R_PPC64_GOT16_HI	R_PPC_GOT16_HI
++#define R_PPC64_GOT16_HA	R_PPC_GOT16_HA
++
++#define R_PPC64_COPY		R_PPC_COPY
++#define R_PPC64_GLOB_DAT	R_PPC_GLOB_DAT
++#define R_PPC64_JMP_SLOT	R_PPC_JMP_SLOT
++#define R_PPC64_RELATIVE	R_PPC_RELATIVE
++
++#define R_PPC64_UADDR32		R_PPC_UADDR32
++#define R_PPC64_UADDR16		R_PPC_UADDR16
++#define R_PPC64_REL32		R_PPC_REL32
++#define R_PPC64_PLT32		R_PPC_PLT32
++#define R_PPC64_PLTREL32	R_PPC_PLTREL32
++#define R_PPC64_PLT16_LO	R_PPC_PLT16_LO
++#define R_PPC64_PLT16_HI	R_PPC_PLT16_HI
++#define R_PPC64_PLT16_HA	R_PPC_PLT16_HA
++
++#define R_PPC64_SECTOFF		R_PPC_SECTOFF
++#define R_PPC64_SECTOFF_LO	R_PPC_SECTOFF_LO
++#define R_PPC64_SECTOFF_HI	R_PPC_SECTOFF_HI
++#define R_PPC64_SECTOFF_HA	R_PPC_SECTOFF_HA
++#define R_PPC64_ADDR30		37 /* word30 (S + A - P) >> 2 */
++#define R_PPC64_ADDR64		38 /* doubleword64 S + A */
++#define R_PPC64_ADDR16_HIGHER	39 /* half16 #higher(S + A) */
++#define R_PPC64_ADDR16_HIGHERA	40 /* half16 #highera(S + A) */
++#define R_PPC64_ADDR16_HIGHEST	41 /* half16 #highest(S + A) */
++#define R_PPC64_ADDR16_HIGHESTA	42 /* half16 #highesta(S + A) */
++#define R_PPC64_UADDR64		43 /* doubleword64 S + A */
++#define R_PPC64_REL64		44 /* doubleword64 S + A - P */
++#define R_PPC64_PLT64		45 /* doubleword64 L + A */
++#define R_PPC64_PLTREL64	46 /* doubleword64 L + A - P */
++#define R_PPC64_TOC16		47 /* half16* S + A - .TOC */
++#define R_PPC64_TOC16_LO	48 /* half16 #lo(S + A - .TOC.) */
++#define R_PPC64_TOC16_HI	49 /* half16 #hi(S + A - .TOC.) */
++#define R_PPC64_TOC16_HA	50 /* half16 #ha(S + A - .TOC.) */
++#define R_PPC64_TOC		51 /* doubleword64 .TOC */
++#define R_PPC64_PLTGOT16	52 /* half16* M + A */
++#define R_PPC64_PLTGOT16_LO	53 /* half16 #lo(M + A) */
++#define R_PPC64_PLTGOT16_HI	54 /* half16 #hi(M + A) */
++#define R_PPC64_PLTGOT16_HA	55 /* half16 #ha(M + A) */
++
++#define R_PPC64_ADDR16_DS	56 /* half16ds* (S + A) >> 2 */
++#define R_PPC64_ADDR16_LO_DS	57 /* half16ds  #lo(S + A) >> 2 */
++#define R_PPC64_GOT16_DS	58 /* half16ds* (G + A) >> 2 */
++#define R_PPC64_GOT16_LO_DS	59 /* half16ds  #lo(G + A) >> 2 */
++#define R_PPC64_PLT16_LO_DS	60 /* half16ds  #lo(L + A) >> 2 */
++#define R_PPC64_SECTOFF_DS	61 /* half16ds* (R + A) >> 2 */
++#define R_PPC64_SECTOFF_LO_DS	62 /* half16ds  #lo(R + A) >> 2 */
++#define R_PPC64_TOC16_DS	63 /* half16ds* (S + A - .TOC.) >> 2 */
++#define R_PPC64_TOC16_LO_DS	64 /* half16ds  #lo(S + A - .TOC.) >> 2 */
++#define R_PPC64_PLTGOT16_DS	65 /* half16ds* (M + A) >> 2 */
++#define R_PPC64_PLTGOT16_LO_DS	66 /* half16ds  #lo(M + A) >> 2 */
++
++/* PowerPC64 relocations defined for the TLS access ABI.  */
++#define R_PPC64_TLS		67 /* none	(sym+add)@tls */
++#define R_PPC64_DTPMOD64	68 /* doubleword64 (sym+add)@dtpmod */
++#define R_PPC64_TPREL16		69 /* half16*	(sym+add)@tprel */
++#define R_PPC64_TPREL16_LO	70 /* half16	(sym+add)@tprel@l */
++#define R_PPC64_TPREL16_HI	71 /* half16	(sym+add)@tprel@h */
++#define R_PPC64_TPREL16_HA	72 /* half16	(sym+add)@tprel@ha */
++#define R_PPC64_TPREL64		73 /* doubleword64 (sym+add)@tprel */
++#define R_PPC64_DTPREL16	74 /* half16*	(sym+add)@dtprel */
++#define R_PPC64_DTPREL16_LO	75 /* half16	(sym+add)@dtprel@l */
++#define R_PPC64_DTPREL16_HI	76 /* half16	(sym+add)@dtprel@h */
++#define R_PPC64_DTPREL16_HA	77 /* half16	(sym+add)@dtprel@ha */
++#define R_PPC64_DTPREL64	78 /* doubleword64 (sym+add)@dtprel */
++#define R_PPC64_GOT_TLSGD16	79 /* half16*	(sym+add)@got@tlsgd */
++#define R_PPC64_GOT_TLSGD16_LO	80 /* half16	(sym+add)@got@tlsgd@l */
++#define R_PPC64_GOT_TLSGD16_HI	81 /* half16	(sym+add)@got@tlsgd@h */
++#define R_PPC64_GOT_TLSGD16_HA	82 /* half16	(sym+add)@got@tlsgd@ha */
++#define R_PPC64_GOT_TLSLD16	83 /* half16*	(sym+add)@got@tlsld */
++#define R_PPC64_GOT_TLSLD16_LO	84 /* half16	(sym+add)@got@tlsld@l */
++#define R_PPC64_GOT_TLSLD16_HI	85 /* half16	(sym+add)@got@tlsld@h */
++#define R_PPC64_GOT_TLSLD16_HA	86 /* half16	(sym+add)@got@tlsld@ha */
++#define R_PPC64_GOT_TPREL16_DS	87 /* half16ds*	(sym+add)@got@tprel */
++#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */
++#define R_PPC64_GOT_TPREL16_HI	89 /* half16	(sym+add)@got@tprel@h */
++#define R_PPC64_GOT_TPREL16_HA	90 /* half16	(sym+add)@got@tprel@ha */
++#define R_PPC64_GOT_DTPREL16_DS	91 /* half16ds*	(sym+add)@got@dtprel */
++#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */
++#define R_PPC64_GOT_DTPREL16_HI	93 /* half16	(sym+add)@got@dtprel@h */
++#define R_PPC64_GOT_DTPREL16_HA	94 /* half16	(sym+add)@got@dtprel@ha */
++#define R_PPC64_TPREL16_DS	95 /* half16ds*	(sym+add)@tprel */
++#define R_PPC64_TPREL16_LO_DS	96 /* half16ds	(sym+add)@tprel@l */
++#define R_PPC64_TPREL16_HIGHER	97 /* half16	(sym+add)@tprel@higher */
++#define R_PPC64_TPREL16_HIGHERA	98 /* half16	(sym+add)@tprel@highera */
++#define R_PPC64_TPREL16_HIGHEST	99 /* half16	(sym+add)@tprel@highest */
++#define R_PPC64_TPREL16_HIGHESTA 100 /* half16	(sym+add)@tprel@highesta */
++#define R_PPC64_DTPREL16_DS	101 /* half16ds* (sym+add)@dtprel */
++#define R_PPC64_DTPREL16_LO_DS	102 /* half16ds	(sym+add)@dtprel@l */
++#define R_PPC64_DTPREL16_HIGHER	103 /* half16	(sym+add)@dtprel@higher */
++#define R_PPC64_DTPREL16_HIGHERA 104 /* half16	(sym+add)@dtprel@highera */
++#define R_PPC64_DTPREL16_HIGHEST 105 /* half16	(sym+add)@dtprel@highest */
++#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16	(sym+add)@dtprel@highesta */
++
++/* GNU extension to support local ifunc.  */
++#define R_PPC64_JMP_IREL	247
++#define R_PPC64_IRELATIVE	248
++#define R_PPC64_REL16		249	/* half16   (sym+add-.) */
++#define R_PPC64_REL16_LO	250	/* half16   (sym+add-.)@l */
++#define R_PPC64_REL16_HI	251	/* half16   (sym+add-.)@h */
++#define R_PPC64_REL16_HA	252	/* half16   (sym+add-.)@ha */
++
++/* PowerPC64 specific values for the Dyn d_tag field.  */
++#define DT_PPC64_GLINK  (DT_LOPROC + 0)
++#define DT_PPC64_OPD	(DT_LOPROC + 1)
++#define DT_PPC64_OPDSZ	(DT_LOPROC + 2)
++#define DT_PPC64_NUM    3
++
++
++/* ARM specific declarations */
++
++/* Processor specific flags for the ELF header e_flags field.  */
++#define EF_ARM_RELEXEC		0x01
++#define EF_ARM_HASENTRY		0x02
++#define EF_ARM_INTERWORK	0x04
++#define EF_ARM_APCS_26		0x08
++#define EF_ARM_APCS_FLOAT	0x10
++#define EF_ARM_PIC		0x20
++#define EF_ARM_ALIGN8		0x40 /* 8-bit structure alignment is in use */
++#define EF_ARM_NEW_ABI		0x80
++#define EF_ARM_OLD_ABI		0x100
++#define EF_ARM_SOFT_FLOAT	0x200
++#define EF_ARM_VFP_FLOAT	0x400
++#define EF_ARM_MAVERICK_FLOAT	0x800
++
++
++/* Other constants defined in the ARM ELF spec. version B-01.  */
++/* NB. These conflict with values defined above.  */
++#define EF_ARM_SYMSARESORTED	0x04
++#define EF_ARM_DYNSYMSUSESEGIDX	0x08
++#define EF_ARM_MAPSYMSFIRST	0x10
++#define EF_ARM_EABIMASK		0XFF000000
++
++/* Constants defined in AAELF.  */
++#define EF_ARM_BE8	    0x00800000
++#define EF_ARM_LE8	    0x00400000
++
++#define EF_ARM_EABI_VERSION(flags)	((flags) & EF_ARM_EABIMASK)
++#define EF_ARM_EABI_UNKNOWN	0x00000000
++#define EF_ARM_EABI_VER1	0x01000000
++#define EF_ARM_EABI_VER2	0x02000000
++#define EF_ARM_EABI_VER3	0x03000000
++#define EF_ARM_EABI_VER4	0x04000000
++#define EF_ARM_EABI_VER5	0x05000000
++
++/* Additional symbol types for Thumb.  */
++#define STT_ARM_TFUNC		STT_LOPROC /* A Thumb function.  */
++#define STT_ARM_16BIT		STT_HIPROC /* A Thumb label.  */
++
++/* ARM-specific values for sh_flags */
++#define SHF_ARM_ENTRYSECT	0x10000000 /* Section contains an entry point */
++#define SHF_ARM_COMDEF		0x80000000 /* Section may be multiply defined
++					      in the input to a link step.  */
++
++/* ARM-specific program header flags */
++#define PF_ARM_SB		0x10000000 /* Segment contains the location
++					      addressed by the static base. */
++#define PF_ARM_PI		0x20000000 /* Position-independent segment.  */
++#define PF_ARM_ABS		0x40000000 /* Absolute segment.  */
++
++/* Processor specific values for the Phdr p_type field.  */
++#define PT_ARM_EXIDX		(PT_LOPROC + 1)	/* ARM unwind segment.  */
++
++/* Processor specific values for the Shdr sh_type field.  */
++#define SHT_ARM_EXIDX		(SHT_LOPROC + 1) /* ARM unwind section.  */
++#define SHT_ARM_PREEMPTMAP	(SHT_LOPROC + 2) /* Preemption details.  */
++#define SHT_ARM_ATTRIBUTES	(SHT_LOPROC + 3) /* ARM attributes section.  */
++
++
++/* ARM relocs.  */
++
++#define R_ARM_NONE		0	/* No reloc */
++#define R_ARM_PC24		1	/* PC relative 26 bit branch */
++#define R_ARM_ABS32		2	/* Direct 32 bit  */
++#define R_ARM_REL32		3	/* PC relative 32 bit */
++#define R_ARM_PC13		4
++#define R_ARM_ABS16		5	/* Direct 16 bit */
++#define R_ARM_ABS12		6	/* Direct 12 bit */
++#define R_ARM_THM_ABS5		7
++#define R_ARM_ABS8		8	/* Direct 8 bit */
++#define R_ARM_SBREL32		9
++#define R_ARM_THM_PC22		10
++#define R_ARM_THM_PC8		11
++#define R_ARM_AMP_VCALL9	12
++#define R_ARM_SWI24		13	/* Obsolete static relocation.  */
++#define R_ARM_TLS_DESC		13      /* Dynamic relocation.  */
++#define R_ARM_THM_SWI8		14
++#define R_ARM_XPC25		15
++#define R_ARM_THM_XPC22		16
++#define R_ARM_TLS_DTPMOD32	17	/* ID of module containing symbol */
++#define R_ARM_TLS_DTPOFF32	18	/* Offset in TLS block */
++#define R_ARM_TLS_TPOFF32	19	/* Offset in static TLS block */
++#define R_ARM_COPY		20	/* Copy symbol at runtime */
++#define R_ARM_GLOB_DAT		21	/* Create GOT entry */
++#define R_ARM_JUMP_SLOT		22	/* Create PLT entry */
++#define R_ARM_RELATIVE		23	/* Adjust by program base */
++#define R_ARM_GOTOFF		24	/* 32 bit offset to GOT */
++#define R_ARM_GOTPC		25	/* 32 bit PC relative offset to GOT */
++#define R_ARM_GOT32		26	/* 32 bit GOT entry */
++#define R_ARM_PLT32		27	/* 32 bit PLT address */
++#define R_ARM_ALU_PCREL_7_0	32
++#define R_ARM_ALU_PCREL_15_8	33
++#define R_ARM_ALU_PCREL_23_15	34
++#define R_ARM_LDR_SBREL_11_0	35
++#define R_ARM_ALU_SBREL_19_12	36
++#define R_ARM_ALU_SBREL_27_20	37
++#define R_ARM_TLS_GOTDESC	90
++#define R_ARM_TLS_CALL		91
++#define R_ARM_TLS_DESCSEQ	92
++#define R_ARM_THM_TLS_CALL	93
++#define R_ARM_GNU_VTENTRY	100
++#define R_ARM_GNU_VTINHERIT	101
++#define R_ARM_THM_PC11		102	/* thumb unconditional branch */
++#define R_ARM_THM_PC9		103	/* thumb conditional branch */
++#define R_ARM_TLS_GD32		104	/* PC-rel 32 bit for global dynamic
++					   thread local data */
++#define R_ARM_TLS_LDM32		105	/* PC-rel 32 bit for local dynamic
++					   thread local data */
++#define R_ARM_TLS_LDO32		106	/* 32 bit offset relative to TLS
++					   block */
++#define R_ARM_TLS_IE32		107	/* PC-rel 32 bit for GOT entry of
++					   static TLS block offset */
++#define R_ARM_TLS_LE32		108	/* 32 bit offset relative to static
++					   TLS block */
++#define	R_ARM_THM_TLS_DESCSEQ	129
++#define R_ARM_IRELATIVE		160
++#define R_ARM_RXPC25		249
++#define R_ARM_RSBREL32		250
++#define R_ARM_THM_RPC22		251
++#define R_ARM_RREL32		252
++#define R_ARM_RABS22		253
++#define R_ARM_RPC24		254
++#define R_ARM_RBASE		255
++/* Keep this the last entry.  */
++#define R_ARM_NUM		256
++
++/* IA-64 specific declarations.  */
++
++/* Processor specific flags for the Ehdr e_flags field.  */
++#define EF_IA_64_MASKOS		0x0000000f	/* os-specific flags */
++#define EF_IA_64_ABI64		0x00000010	/* 64-bit ABI */
++#define EF_IA_64_ARCH		0xff000000	/* arch. version mask */
++
++/* Processor specific values for the Phdr p_type field.  */
++#define PT_IA_64_ARCHEXT	(PT_LOPROC + 0)	/* arch extension bits */
++#define PT_IA_64_UNWIND		(PT_LOPROC + 1)	/* ia64 unwind bits */
++#define PT_IA_64_HP_OPT_ANOT	(PT_LOOS + 0x12)
++#define PT_IA_64_HP_HSL_ANOT	(PT_LOOS + 0x13)
++#define PT_IA_64_HP_STACK	(PT_LOOS + 0x14)
++
++/* Processor specific flags for the Phdr p_flags field.  */
++#define PF_IA_64_NORECOV	0x80000000	/* spec insns w/o recovery */
++
++/* Processor specific values for the Shdr sh_type field.  */
++#define SHT_IA_64_EXT		(SHT_LOPROC + 0) /* extension bits */
++#define SHT_IA_64_UNWIND	(SHT_LOPROC + 1) /* unwind bits */
++
++/* Processor specific flags for the Shdr sh_flags field.  */
++#define SHF_IA_64_SHORT		0x10000000	/* section near gp */
++#define SHF_IA_64_NORECOV	0x20000000	/* spec insns w/o recovery */
++
++/* Processor specific values for the Dyn d_tag field.  */
++#define DT_IA_64_PLT_RESERVE	(DT_LOPROC + 0)
++#define DT_IA_64_NUM		1
++
++/* IA-64 relocations.  */
++#define R_IA64_NONE		0x00	/* none */
++#define R_IA64_IMM14		0x21	/* symbol + addend, add imm14 */
++#define R_IA64_IMM22		0x22	/* symbol + addend, add imm22 */
++#define R_IA64_IMM64		0x23	/* symbol + addend, mov imm64 */
++#define R_IA64_DIR32MSB		0x24	/* symbol + addend, data4 MSB */
++#define R_IA64_DIR32LSB		0x25	/* symbol + addend, data4 LSB */
++#define R_IA64_DIR64MSB		0x26	/* symbol + addend, data8 MSB */
++#define R_IA64_DIR64LSB		0x27	/* symbol + addend, data8 LSB */
++#define R_IA64_GPREL22		0x2a	/* @gprel(sym + add), add imm22 */
++#define R_IA64_GPREL64I		0x2b	/* @gprel(sym + add), mov imm64 */
++#define R_IA64_GPREL32MSB	0x2c	/* @gprel(sym + add), data4 MSB */
++#define R_IA64_GPREL32LSB	0x2d	/* @gprel(sym + add), data4 LSB */
++#define R_IA64_GPREL64MSB	0x2e	/* @gprel(sym + add), data8 MSB */
++#define R_IA64_GPREL64LSB	0x2f	/* @gprel(sym + add), data8 LSB */
++#define R_IA64_LTOFF22		0x32	/* @ltoff(sym + add), add imm22 */
++#define R_IA64_LTOFF64I		0x33	/* @ltoff(sym + add), mov imm64 */
++#define R_IA64_PLTOFF22		0x3a	/* @pltoff(sym + add), add imm22 */
++#define R_IA64_PLTOFF64I	0x3b	/* @pltoff(sym + add), mov imm64 */
++#define R_IA64_PLTOFF64MSB	0x3e	/* @pltoff(sym + add), data8 MSB */
++#define R_IA64_PLTOFF64LSB	0x3f	/* @pltoff(sym + add), data8 LSB */
++#define R_IA64_FPTR64I		0x43	/* @fptr(sym + add), mov imm64 */
++#define R_IA64_FPTR32MSB	0x44	/* @fptr(sym + add), data4 MSB */
++#define R_IA64_FPTR32LSB	0x45	/* @fptr(sym + add), data4 LSB */
++#define R_IA64_FPTR64MSB	0x46	/* @fptr(sym + add), data8 MSB */
++#define R_IA64_FPTR64LSB	0x47	/* @fptr(sym + add), data8 LSB */
++#define R_IA64_PCREL60B		0x48	/* @pcrel(sym + add), brl */
++#define R_IA64_PCREL21B		0x49	/* @pcrel(sym + add), ptb, call */
++#define R_IA64_PCREL21M		0x4a	/* @pcrel(sym + add), chk.s */
++#define R_IA64_PCREL21F		0x4b	/* @pcrel(sym + add), fchkf */
++#define R_IA64_PCREL32MSB	0x4c	/* @pcrel(sym + add), data4 MSB */
++#define R_IA64_PCREL32LSB	0x4d	/* @pcrel(sym + add), data4 LSB */
++#define R_IA64_PCREL64MSB	0x4e	/* @pcrel(sym + add), data8 MSB */
++#define R_IA64_PCREL64LSB	0x4f	/* @pcrel(sym + add), data8 LSB */
++#define R_IA64_LTOFF_FPTR22	0x52	/* @ltoff(@fptr(s+a)), imm22 */
++#define R_IA64_LTOFF_FPTR64I	0x53	/* @ltoff(@fptr(s+a)), imm64 */
++#define R_IA64_LTOFF_FPTR32MSB	0x54	/* @ltoff(@fptr(s+a)), data4 MSB */
++#define R_IA64_LTOFF_FPTR32LSB	0x55	/* @ltoff(@fptr(s+a)), data4 LSB */
++#define R_IA64_LTOFF_FPTR64MSB	0x56	/* @ltoff(@fptr(s+a)), data8 MSB */
++#define R_IA64_LTOFF_FPTR64LSB	0x57	/* @ltoff(@fptr(s+a)), data8 LSB */
++#define R_IA64_SEGREL32MSB	0x5c	/* @segrel(sym + add), data4 MSB */
++#define R_IA64_SEGREL32LSB	0x5d	/* @segrel(sym + add), data4 LSB */
++#define R_IA64_SEGREL64MSB	0x5e	/* @segrel(sym + add), data8 MSB */
++#define R_IA64_SEGREL64LSB	0x5f	/* @segrel(sym + add), data8 LSB */
++#define R_IA64_SECREL32MSB	0x64	/* @secrel(sym + add), data4 MSB */
++#define R_IA64_SECREL32LSB	0x65	/* @secrel(sym + add), data4 LSB */
++#define R_IA64_SECREL64MSB	0x66	/* @secrel(sym + add), data8 MSB */
++#define R_IA64_SECREL64LSB	0x67	/* @secrel(sym + add), data8 LSB */
++#define R_IA64_REL32MSB		0x6c	/* data 4 + REL */
++#define R_IA64_REL32LSB		0x6d	/* data 4 + REL */
++#define R_IA64_REL64MSB		0x6e	/* data 8 + REL */
++#define R_IA64_REL64LSB		0x6f	/* data 8 + REL */
++#define R_IA64_LTV32MSB		0x74	/* symbol + addend, data4 MSB */
++#define R_IA64_LTV32LSB		0x75	/* symbol + addend, data4 LSB */
++#define R_IA64_LTV64MSB		0x76	/* symbol + addend, data8 MSB */
++#define R_IA64_LTV64LSB		0x77	/* symbol + addend, data8 LSB */
++#define R_IA64_PCREL21BI	0x79	/* @pcrel(sym + add), 21bit inst */
++#define R_IA64_PCREL22		0x7a	/* @pcrel(sym + add), 22bit inst */
++#define R_IA64_PCREL64I		0x7b	/* @pcrel(sym + add), 64bit inst */
++#define R_IA64_IPLTMSB		0x80	/* dynamic reloc, imported PLT, MSB */
++#define R_IA64_IPLTLSB		0x81	/* dynamic reloc, imported PLT, LSB */
++#define R_IA64_COPY		0x84	/* copy relocation */
++#define R_IA64_SUB		0x85	/* Addend and symbol difference */
++#define R_IA64_LTOFF22X		0x86	/* LTOFF22, relaxable.  */
++#define R_IA64_LDXMOV		0x87	/* Use of LTOFF22X.  */
++#define R_IA64_TPREL14		0x91	/* @tprel(sym + add), imm14 */
++#define R_IA64_TPREL22		0x92	/* @tprel(sym + add), imm22 */
++#define R_IA64_TPREL64I		0x93	/* @tprel(sym + add), imm64 */
++#define R_IA64_TPREL64MSB	0x96	/* @tprel(sym + add), data8 MSB */
++#define R_IA64_TPREL64LSB	0x97	/* @tprel(sym + add), data8 LSB */
++#define R_IA64_LTOFF_TPREL22	0x9a	/* @ltoff(@tprel(s+a)), imm2 */
++#define R_IA64_DTPMOD64MSB	0xa6	/* @dtpmod(sym + add), data8 MSB */
++#define R_IA64_DTPMOD64LSB	0xa7	/* @dtpmod(sym + add), data8 LSB */
++#define R_IA64_LTOFF_DTPMOD22	0xaa	/* @ltoff(@dtpmod(sym + add)), imm22 */
++#define R_IA64_DTPREL14		0xb1	/* @dtprel(sym + add), imm14 */
++#define R_IA64_DTPREL22		0xb2	/* @dtprel(sym + add), imm22 */
++#define R_IA64_DTPREL64I	0xb3	/* @dtprel(sym + add), imm64 */
++#define R_IA64_DTPREL32MSB	0xb4	/* @dtprel(sym + add), data4 MSB */
++#define R_IA64_DTPREL32LSB	0xb5	/* @dtprel(sym + add), data4 LSB */
++#define R_IA64_DTPREL64MSB	0xb6	/* @dtprel(sym + add), data8 MSB */
++#define R_IA64_DTPREL64LSB	0xb7	/* @dtprel(sym + add), data8 LSB */
++#define R_IA64_LTOFF_DTPREL22	0xba	/* @ltoff(@dtprel(s+a)), imm22 */
++
++/* SH specific declarations */
++
++/* Processor specific flags for the ELF header e_flags field.  */
++#define EF_SH_MACH_MASK		0x1f
++#define EF_SH_UNKNOWN		0x0
++#define EF_SH1			0x1
++#define EF_SH2			0x2
++#define EF_SH3			0x3
++#define EF_SH_DSP		0x4
++#define EF_SH3_DSP		0x5
++#define EF_SH4AL_DSP		0x6
++#define EF_SH3E			0x8
++#define EF_SH4			0x9
++#define EF_SH2E			0xb
++#define EF_SH4A			0xc
++#define EF_SH2A			0xd
++#define EF_SH4_NOFPU		0x10
++#define EF_SH4A_NOFPU		0x11
++#define EF_SH4_NOMMU_NOFPU	0x12
++#define EF_SH2A_NOFPU		0x13
++#define EF_SH3_NOMMU		0x14
++#define EF_SH2A_SH4_NOFPU	0x15
++#define EF_SH2A_SH3_NOFPU	0x16
++#define EF_SH2A_SH4		0x17
++#define EF_SH2A_SH3E		0x18
++
++/* SH relocs.  */
++#define	R_SH_NONE		0
++#define	R_SH_DIR32		1
++#define	R_SH_REL32		2
++#define	R_SH_DIR8WPN		3
++#define	R_SH_IND12W		4
++#define	R_SH_DIR8WPL		5
++#define	R_SH_DIR8WPZ		6
++#define	R_SH_DIR8BP		7
++#define	R_SH_DIR8W		8
++#define	R_SH_DIR8L		9
++#define	R_SH_SWITCH16		25
++#define	R_SH_SWITCH32		26
++#define	R_SH_USES		27
++#define	R_SH_COUNT		28
++#define	R_SH_ALIGN		29
++#define	R_SH_CODE		30
++#define	R_SH_DATA		31
++#define	R_SH_LABEL		32
++#define	R_SH_SWITCH8		33
++#define	R_SH_GNU_VTINHERIT	34
++#define	R_SH_GNU_VTENTRY	35
++#define	R_SH_TLS_GD_32		144
++#define	R_SH_TLS_LD_32		145
++#define	R_SH_TLS_LDO_32		146
++#define	R_SH_TLS_IE_32		147
++#define	R_SH_TLS_LE_32		148
++#define	R_SH_TLS_DTPMOD32	149
++#define	R_SH_TLS_DTPOFF32	150
++#define	R_SH_TLS_TPOFF32	151
++#define	R_SH_GOT32		160
++#define	R_SH_PLT32		161
++#define	R_SH_COPY		162
++#define	R_SH_GLOB_DAT		163
++#define	R_SH_JMP_SLOT		164
++#define	R_SH_RELATIVE		165
++#define	R_SH_GOTOFF		166
++#define	R_SH_GOTPC		167
++/* Keep this the last entry.  */
++#define	R_SH_NUM		256
++
++/* S/390 specific definitions.  */
++
++/* Valid values for the e_flags field.  */
++
++#define EF_S390_HIGH_GPRS    0x00000001  /* High GPRs kernel facility needed.  */
++
++/* Additional s390 relocs */
++
++#define R_390_NONE		0	/* No reloc.  */
++#define R_390_8			1	/* Direct 8 bit.  */
++#define R_390_12		2	/* Direct 12 bit.  */
++#define R_390_16		3	/* Direct 16 bit.  */
++#define R_390_32		4	/* Direct 32 bit.  */
++#define R_390_PC32		5	/* PC relative 32 bit.	*/
++#define R_390_GOT12		6	/* 12 bit GOT offset.  */
++#define R_390_GOT32		7	/* 32 bit GOT offset.  */
++#define R_390_PLT32		8	/* 32 bit PC relative PLT address.  */
++#define R_390_COPY		9	/* Copy symbol at runtime.  */
++#define R_390_GLOB_DAT		10	/* Create GOT entry.  */
++#define R_390_JMP_SLOT		11	/* Create PLT entry.  */
++#define R_390_RELATIVE		12	/* Adjust by program base.  */
++#define R_390_GOTOFF32		13	/* 32 bit offset to GOT.	 */
++#define R_390_GOTPC		14	/* 32 bit PC relative offset to GOT.  */
++#define R_390_GOT16		15	/* 16 bit GOT offset.  */
++#define R_390_PC16		16	/* PC relative 16 bit.	*/
++#define R_390_PC16DBL		17	/* PC relative 16 bit shifted by 1.  */
++#define R_390_PLT16DBL		18	/* 16 bit PC rel. PLT shifted by 1.  */
++#define R_390_PC32DBL		19	/* PC relative 32 bit shifted by 1.  */
++#define R_390_PLT32DBL		20	/* 32 bit PC rel. PLT shifted by 1.  */
++#define R_390_GOTPCDBL		21	/* 32 bit PC rel. GOT shifted by 1.  */
++#define R_390_64		22	/* Direct 64 bit.  */
++#define R_390_PC64		23	/* PC relative 64 bit.	*/
++#define R_390_GOT64		24	/* 64 bit GOT offset.  */
++#define R_390_PLT64		25	/* 64 bit PC relative PLT address.  */
++#define R_390_GOTENT		26	/* 32 bit PC rel. to GOT entry >> 1. */
++#define R_390_GOTOFF16		27	/* 16 bit offset to GOT. */
++#define R_390_GOTOFF64		28	/* 64 bit offset to GOT. */
++#define R_390_GOTPLT12		29	/* 12 bit offset to jump slot.	*/
++#define R_390_GOTPLT16		30	/* 16 bit offset to jump slot.	*/
++#define R_390_GOTPLT32		31	/* 32 bit offset to jump slot.	*/
++#define R_390_GOTPLT64		32	/* 64 bit offset to jump slot.	*/
++#define R_390_GOTPLTENT		33	/* 32 bit rel. offset to jump slot.  */
++#define R_390_PLTOFF16		34	/* 16 bit offset from GOT to PLT. */
++#define R_390_PLTOFF32		35	/* 32 bit offset from GOT to PLT. */
++#define R_390_PLTOFF64		36	/* 16 bit offset from GOT to PLT. */
++#define R_390_TLS_LOAD		37	/* Tag for load insn in TLS code.  */
++#define R_390_TLS_GDCALL	38	/* Tag for function call in general
++					   dynamic TLS code. */
++#define R_390_TLS_LDCALL	39	/* Tag for function call in local
++					   dynamic TLS code. */
++#define R_390_TLS_GD32		40	/* Direct 32 bit for general dynamic
++					   thread local data.  */
++#define R_390_TLS_GD64		41	/* Direct 64 bit for general dynamic
++					  thread local data.  */
++#define R_390_TLS_GOTIE12	42	/* 12 bit GOT offset for static TLS
++					   block offset.  */
++#define R_390_TLS_GOTIE32	43	/* 32 bit GOT offset for static TLS
++					   block offset.  */
++#define R_390_TLS_GOTIE64	44	/* 64 bit GOT offset for static TLS
++					   block offset. */
++#define R_390_TLS_LDM32		45	/* Direct 32 bit for local dynamic
++					   thread local data in LE code.  */
++#define R_390_TLS_LDM64		46	/* Direct 64 bit for local dynamic
++					   thread local data in LE code.  */
++#define R_390_TLS_IE32		47	/* 32 bit address of GOT entry for
++					   negated static TLS block offset.  */
++#define R_390_TLS_IE64		48	/* 64 bit address of GOT entry for
++					   negated static TLS block offset.  */
++#define R_390_TLS_IEENT		49	/* 32 bit rel. offset to GOT entry for
++					   negated static TLS block offset.  */
++#define R_390_TLS_LE32		50	/* 32 bit negated offset relative to
++					   static TLS block.  */
++#define R_390_TLS_LE64		51	/* 64 bit negated offset relative to
++					   static TLS block.  */
++#define R_390_TLS_LDO32		52	/* 32 bit offset relative to TLS
++					   block.  */
++#define R_390_TLS_LDO64		53	/* 64 bit offset relative to TLS
++					   block.  */
++#define R_390_TLS_DTPMOD	54	/* ID of module containing symbol.  */
++#define R_390_TLS_DTPOFF	55	/* Offset in TLS block.	 */
++#define R_390_TLS_TPOFF		56	/* Negated offset in static TLS
++					   block.  */
++#define R_390_20		57	/* Direct 20 bit.  */
++#define R_390_GOT20		58	/* 20 bit GOT offset.  */
++#define R_390_GOTPLT20		59	/* 20 bit offset to jump slot.  */
++#define R_390_TLS_GOTIE20	60	/* 20 bit GOT offset for static TLS
++					   block offset.  */
++#define R_390_IRELATIVE         61      /* STT_GNU_IFUNC relocation.  */
++/* Keep this the last entry.  */
++#define R_390_NUM		62
++
++
++/* CRIS relocations.  */
++#define R_CRIS_NONE		0
++#define R_CRIS_8		1
++#define R_CRIS_16		2
++#define R_CRIS_32		3
++#define R_CRIS_8_PCREL		4
++#define R_CRIS_16_PCREL		5
++#define R_CRIS_32_PCREL		6
++#define R_CRIS_GNU_VTINHERIT	7
++#define R_CRIS_GNU_VTENTRY	8
++#define R_CRIS_COPY		9
++#define R_CRIS_GLOB_DAT		10
++#define R_CRIS_JUMP_SLOT	11
++#define R_CRIS_RELATIVE		12
++#define R_CRIS_16_GOT		13
++#define R_CRIS_32_GOT		14
++#define R_CRIS_16_GOTPLT	15
++#define R_CRIS_32_GOTPLT	16
++#define R_CRIS_32_GOTREL	17
++#define R_CRIS_32_PLT_GOTREL	18
++#define R_CRIS_32_PLT_PCREL	19
++
++#define R_CRIS_NUM		20
++
++
++/* AMD x86-64 relocations.  */
++#define R_X86_64_NONE		0	/* No reloc */
++#define R_X86_64_64		1	/* Direct 64 bit  */
++#define R_X86_64_PC32		2	/* PC relative 32 bit signed */
++#define R_X86_64_GOT32		3	/* 32 bit GOT entry */
++#define R_X86_64_PLT32		4	/* 32 bit PLT address */
++#define R_X86_64_COPY		5	/* Copy symbol at runtime */
++#define R_X86_64_GLOB_DAT	6	/* Create GOT entry */
++#define R_X86_64_JUMP_SLOT	7	/* Create PLT entry */
++#define R_X86_64_RELATIVE	8	/* Adjust by program base */
++#define R_X86_64_GOTPCREL	9	/* 32 bit signed PC relative
++					   offset to GOT */
++#define R_X86_64_32		10	/* Direct 32 bit zero extended */
++#define R_X86_64_32S		11	/* Direct 32 bit sign extended */
++#define R_X86_64_16		12	/* Direct 16 bit zero extended */
++#define R_X86_64_PC16		13	/* 16 bit sign extended pc relative */
++#define R_X86_64_8		14	/* Direct 8 bit sign extended  */
++#define R_X86_64_PC8		15	/* 8 bit sign extended pc relative */
++#define R_X86_64_DTPMOD64	16	/* ID of module containing symbol */
++#define R_X86_64_DTPOFF64	17	/* Offset in module's TLS block */
++#define R_X86_64_TPOFF64	18	/* Offset in initial TLS block */
++#define R_X86_64_TLSGD		19	/* 32 bit signed PC relative offset
++					   to two GOT entries for GD symbol */
++#define R_X86_64_TLSLD		20	/* 32 bit signed PC relative offset
++					   to two GOT entries for LD symbol */
++#define R_X86_64_DTPOFF32	21	/* Offset in TLS block */
++#define R_X86_64_GOTTPOFF	22	/* 32 bit signed PC relative offset
++					   to GOT entry for IE symbol */
++#define R_X86_64_TPOFF32	23	/* Offset in initial TLS block */
++#define R_X86_64_PC64		24	/* PC relative 64 bit */
++#define R_X86_64_GOTOFF64	25	/* 64 bit offset to GOT */
++#define R_X86_64_GOTPC32	26	/* 32 bit signed pc relative
++					   offset to GOT */
++#define R_X86_64_GOT64		27	/* 64-bit GOT entry offset */
++#define R_X86_64_GOTPCREL64	28	/* 64-bit PC relative offset
++					   to GOT entry */
++#define R_X86_64_GOTPC64	29	/* 64-bit PC relative offset to GOT */
++#define R_X86_64_GOTPLT64	30 	/* like GOT64, says PLT entry needed */
++#define R_X86_64_PLTOFF64	31	/* 64-bit GOT relative offset
++					   to PLT entry */
++#define R_X86_64_SIZE32		32	/* Size of symbol plus 32-bit addend */
++#define R_X86_64_SIZE64		33	/* Size of symbol plus 64-bit addend */
++#define R_X86_64_GOTPC32_TLSDESC 34	/* GOT offset for TLS descriptor.  */
++#define R_X86_64_TLSDESC_CALL   35	/* Marker for call through TLS
++					   descriptor.  */
++#define R_X86_64_TLSDESC        36	/* TLS descriptor.  */
++#define R_X86_64_IRELATIVE	37	/* Adjust indirectly by program base */
++#define R_X86_64_RELATIVE64	38	/* 64-bit adjust by program base */
++
++#define R_X86_64_NUM		39
++
++
++/* AM33 relocations.  */
++#define R_MN10300_NONE		0	/* No reloc.  */
++#define R_MN10300_32		1	/* Direct 32 bit.  */
++#define R_MN10300_16		2	/* Direct 16 bit.  */
++#define R_MN10300_8		3	/* Direct 8 bit.  */
++#define R_MN10300_PCREL32	4	/* PC-relative 32-bit.  */
++#define R_MN10300_PCREL16	5	/* PC-relative 16-bit signed.  */
++#define R_MN10300_PCREL8	6	/* PC-relative 8-bit signed.  */
++#define R_MN10300_GNU_VTINHERIT	7	/* Ancient C++ vtable garbage... */
++#define R_MN10300_GNU_VTENTRY	8	/* ... collection annotation.  */
++#define R_MN10300_24		9	/* Direct 24 bit.  */
++#define R_MN10300_GOTPC32	10	/* 32-bit PCrel offset to GOT.  */
++#define R_MN10300_GOTPC16	11	/* 16-bit PCrel offset to GOT.  */
++#define R_MN10300_GOTOFF32	12	/* 32-bit offset from GOT.  */
++#define R_MN10300_GOTOFF24	13	/* 24-bit offset from GOT.  */
++#define R_MN10300_GOTOFF16	14	/* 16-bit offset from GOT.  */
++#define R_MN10300_PLT32		15	/* 32-bit PCrel to PLT entry.  */
++#define R_MN10300_PLT16		16	/* 16-bit PCrel to PLT entry.  */
++#define R_MN10300_GOT32		17	/* 32-bit offset to GOT entry.  */
++#define R_MN10300_GOT24		18	/* 24-bit offset to GOT entry.  */
++#define R_MN10300_GOT16		19	/* 16-bit offset to GOT entry.  */
++#define R_MN10300_COPY		20	/* Copy symbol at runtime.  */
++#define R_MN10300_GLOB_DAT	21	/* Create GOT entry.  */
++#define R_MN10300_JMP_SLOT	22	/* Create PLT entry.  */
++#define R_MN10300_RELATIVE	23	/* Adjust by program base.  */
++
++#define R_MN10300_NUM		24
++
++
++/* M32R relocs.  */
++#define R_M32R_NONE		0	/* No reloc. */
++#define R_M32R_16		1	/* Direct 16 bit. */
++#define R_M32R_32		2	/* Direct 32 bit. */
++#define R_M32R_24		3	/* Direct 24 bit. */
++#define R_M32R_10_PCREL		4	/* PC relative 10 bit shifted. */
++#define R_M32R_18_PCREL		5	/* PC relative 18 bit shifted. */
++#define R_M32R_26_PCREL		6	/* PC relative 26 bit shifted. */
++#define R_M32R_HI16_ULO		7	/* High 16 bit with unsigned low. */
++#define R_M32R_HI16_SLO		8	/* High 16 bit with signed low. */
++#define R_M32R_LO16		9	/* Low 16 bit. */
++#define R_M32R_SDA16		10	/* 16 bit offset in SDA. */
++#define R_M32R_GNU_VTINHERIT	11
++#define R_M32R_GNU_VTENTRY	12
++/* M32R relocs use SHT_RELA.  */
++#define R_M32R_16_RELA		33	/* Direct 16 bit. */
++#define R_M32R_32_RELA		34	/* Direct 32 bit. */
++#define R_M32R_24_RELA		35	/* Direct 24 bit. */
++#define R_M32R_10_PCREL_RELA	36	/* PC relative 10 bit shifted. */
++#define R_M32R_18_PCREL_RELA	37	/* PC relative 18 bit shifted. */
++#define R_M32R_26_PCREL_RELA	38	/* PC relative 26 bit shifted. */
++#define R_M32R_HI16_ULO_RELA	39	/* High 16 bit with unsigned low */
++#define R_M32R_HI16_SLO_RELA	40	/* High 16 bit with signed low */
++#define R_M32R_LO16_RELA	41	/* Low 16 bit */
++#define R_M32R_SDA16_RELA	42	/* 16 bit offset in SDA */
++#define R_M32R_RELA_GNU_VTINHERIT	43
++#define R_M32R_RELA_GNU_VTENTRY	44
++#define R_M32R_REL32		45	/* PC relative 32 bit.  */
++
++#define R_M32R_GOT24		48	/* 24 bit GOT entry */
++#define R_M32R_26_PLTREL	49	/* 26 bit PC relative to PLT shifted */
++#define R_M32R_COPY		50	/* Copy symbol at runtime */
++#define R_M32R_GLOB_DAT		51	/* Create GOT entry */
++#define R_M32R_JMP_SLOT		52	/* Create PLT entry */
++#define R_M32R_RELATIVE		53	/* Adjust by program base */
++#define R_M32R_GOTOFF		54	/* 24 bit offset to GOT */
++#define R_M32R_GOTPC24		55	/* 24 bit PC relative offset to GOT */
++#define R_M32R_GOT16_HI_ULO	56	/* High 16 bit GOT entry with unsigned
++					   low */
++#define R_M32R_GOT16_HI_SLO	57	/* High 16 bit GOT entry with signed
++					   low */
++#define R_M32R_GOT16_LO		58	/* Low 16 bit GOT entry */
++#define R_M32R_GOTPC_HI_ULO	59	/* High 16 bit PC relative offset to
++					   GOT with unsigned low */
++#define R_M32R_GOTPC_HI_SLO	60	/* High 16 bit PC relative offset to
++					   GOT with signed low */
++#define R_M32R_GOTPC_LO		61	/* Low 16 bit PC relative offset to
++					   GOT */
++#define R_M32R_GOTOFF_HI_ULO	62	/* High 16 bit offset to GOT
++					   with unsigned low */
++#define R_M32R_GOTOFF_HI_SLO	63	/* High 16 bit offset to GOT
++					   with signed low */
++#define R_M32R_GOTOFF_LO	64	/* Low 16 bit offset to GOT */
++#define R_M32R_NUM		256	/* Keep this the last entry. */
++
++
++/* TILEPro relocations.  */
++#define R_TILEPRO_NONE		0	/* No reloc */
++#define R_TILEPRO_32		1	/* Direct 32 bit */
++#define R_TILEPRO_16		2	/* Direct 16 bit */
++#define R_TILEPRO_8		3	/* Direct 8 bit */
++#define R_TILEPRO_32_PCREL	4	/* PC relative 32 bit */
++#define R_TILEPRO_16_PCREL	5	/* PC relative 16 bit */
++#define R_TILEPRO_8_PCREL	6	/* PC relative 8 bit */
++#define R_TILEPRO_LO16		7	/* Low 16 bit */
++#define R_TILEPRO_HI16		8	/* High 16 bit */
++#define R_TILEPRO_HA16		9	/* High 16 bit, adjusted */
++#define R_TILEPRO_COPY		10	/* Copy relocation */
++#define R_TILEPRO_GLOB_DAT	11	/* Create GOT entry */
++#define R_TILEPRO_JMP_SLOT	12	/* Create PLT entry */
++#define R_TILEPRO_RELATIVE	13	/* Adjust by program base */
++#define R_TILEPRO_BROFF_X1	14	/* X1 pipe branch offset */
++#define R_TILEPRO_JOFFLONG_X1	15	/* X1 pipe jump offset */
++#define R_TILEPRO_JOFFLONG_X1_PLT 16	/* X1 pipe jump offset to PLT */
++#define R_TILEPRO_IMM8_X0	17	/* X0 pipe 8-bit */
++#define R_TILEPRO_IMM8_Y0	18	/* Y0 pipe 8-bit */
++#define R_TILEPRO_IMM8_X1	19	/* X1 pipe 8-bit */
++#define R_TILEPRO_IMM8_Y1	20	/* Y1 pipe 8-bit */
++#define R_TILEPRO_MT_IMM15_X1	21	/* X1 pipe mtspr */
++#define R_TILEPRO_MF_IMM15_X1	22	/* X1 pipe mfspr */
++#define R_TILEPRO_IMM16_X0	23	/* X0 pipe 16-bit */
++#define R_TILEPRO_IMM16_X1	24	/* X1 pipe 16-bit */
++#define R_TILEPRO_IMM16_X0_LO	25	/* X0 pipe low 16-bit */
++#define R_TILEPRO_IMM16_X1_LO	26	/* X1 pipe low 16-bit */
++#define R_TILEPRO_IMM16_X0_HI	27	/* X0 pipe high 16-bit */
++#define R_TILEPRO_IMM16_X1_HI	28	/* X1 pipe high 16-bit */
++#define R_TILEPRO_IMM16_X0_HA	29	/* X0 pipe high 16-bit, adjusted */
++#define R_TILEPRO_IMM16_X1_HA	30	/* X1 pipe high 16-bit, adjusted */
++#define R_TILEPRO_IMM16_X0_PCREL 31	/* X0 pipe PC relative 16 bit */
++#define R_TILEPRO_IMM16_X1_PCREL 32	/* X1 pipe PC relative 16 bit */
++#define R_TILEPRO_IMM16_X0_LO_PCREL 33	/* X0 pipe PC relative low 16 bit */
++#define R_TILEPRO_IMM16_X1_LO_PCREL 34	/* X1 pipe PC relative low 16 bit */
++#define R_TILEPRO_IMM16_X0_HI_PCREL 35	/* X0 pipe PC relative high 16 bit */
++#define R_TILEPRO_IMM16_X1_HI_PCREL 36	/* X1 pipe PC relative high 16 bit */
++#define R_TILEPRO_IMM16_X0_HA_PCREL 37	/* X0 pipe PC relative ha() 16 bit */
++#define R_TILEPRO_IMM16_X1_HA_PCREL 38	/* X1 pipe PC relative ha() 16 bit */
++#define R_TILEPRO_IMM16_X0_GOT	39	/* X0 pipe 16-bit GOT offset */
++#define R_TILEPRO_IMM16_X1_GOT	40	/* X1 pipe 16-bit GOT offset */
++#define R_TILEPRO_IMM16_X0_GOT_LO 41	/* X0 pipe low 16-bit GOT offset */
++#define R_TILEPRO_IMM16_X1_GOT_LO 42	/* X1 pipe low 16-bit GOT offset */
++#define R_TILEPRO_IMM16_X0_GOT_HI 43	/* X0 pipe high 16-bit GOT offset */
++#define R_TILEPRO_IMM16_X1_GOT_HI 44	/* X1 pipe high 16-bit GOT offset */
++#define R_TILEPRO_IMM16_X0_GOT_HA 45	/* X0 pipe ha() 16-bit GOT offset */
++#define R_TILEPRO_IMM16_X1_GOT_HA 46	/* X1 pipe ha() 16-bit GOT offset */
++#define R_TILEPRO_MMSTART_X0	47	/* X0 pipe mm "start" */
++#define R_TILEPRO_MMEND_X0	48	/* X0 pipe mm "end" */
++#define R_TILEPRO_MMSTART_X1	49	/* X1 pipe mm "start" */
++#define R_TILEPRO_MMEND_X1	50	/* X1 pipe mm "end" */
++#define R_TILEPRO_SHAMT_X0	51	/* X0 pipe shift amount */
++#define R_TILEPRO_SHAMT_X1	52	/* X1 pipe shift amount */
++#define R_TILEPRO_SHAMT_Y0	53	/* Y0 pipe shift amount */
++#define R_TILEPRO_SHAMT_Y1	54	/* Y1 pipe shift amount */
++#define R_TILEPRO_DEST_IMM8_X1	55	/* X1 pipe destination 8-bit */
++/* Relocs 56-59 are currently not defined.  */
++#define R_TILEPRO_TLS_GD_CALL	60	/* "jal" for TLS GD */
++#define R_TILEPRO_IMM8_X0_TLS_GD_ADD 61	/* X0 pipe "addi" for TLS GD */
++#define R_TILEPRO_IMM8_X1_TLS_GD_ADD 62	/* X1 pipe "addi" for TLS GD */
++#define R_TILEPRO_IMM8_Y0_TLS_GD_ADD 63	/* Y0 pipe "addi" for TLS GD */
++#define R_TILEPRO_IMM8_Y1_TLS_GD_ADD 64	/* Y1 pipe "addi" for TLS GD */
++#define R_TILEPRO_TLS_IE_LOAD	65	/* "lw_tls" for TLS IE */
++#define R_TILEPRO_IMM16_X0_TLS_GD 66	/* X0 pipe 16-bit TLS GD offset */
++#define R_TILEPRO_IMM16_X1_TLS_GD 67	/* X1 pipe 16-bit TLS GD offset */
++#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68	/* X0 pipe low 16-bit TLS GD offset */
++#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69	/* X1 pipe low 16-bit TLS GD offset */
++#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70	/* X0 pipe high 16-bit TLS GD offset */
++#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71	/* X1 pipe high 16-bit TLS GD offset */
++#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72	/* X0 pipe ha() 16-bit TLS GD offset */
++#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73	/* X1 pipe ha() 16-bit TLS GD offset */
++#define R_TILEPRO_IMM16_X0_TLS_IE 74	/* X0 pipe 16-bit TLS IE offset */
++#define R_TILEPRO_IMM16_X1_TLS_IE 75	/* X1 pipe 16-bit TLS IE offset */
++#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76	/* X0 pipe low 16-bit TLS IE offset */
++#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77	/* X1 pipe low 16-bit TLS IE offset */
++#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78	/* X0 pipe high 16-bit TLS IE offset */
++#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79	/* X1 pipe high 16-bit TLS IE offset */
++#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80	/* X0 pipe ha() 16-bit TLS IE offset */
++#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81	/* X1 pipe ha() 16-bit TLS IE offset */
++#define R_TILEPRO_TLS_DTPMOD32	82	/* ID of module containing symbol */
++#define R_TILEPRO_TLS_DTPOFF32	83	/* Offset in TLS block */
++#define R_TILEPRO_TLS_TPOFF32	84	/* Offset in static TLS block */
++#define R_TILEPRO_IMM16_X0_TLS_LE 85	/* X0 pipe 16-bit TLS LE offset */
++#define R_TILEPRO_IMM16_X1_TLS_LE 86	/* X1 pipe 16-bit TLS LE offset */
++#define R_TILEPRO_IMM16_X0_TLS_LE_LO 87	/* X0 pipe low 16-bit TLS LE offset */
++#define R_TILEPRO_IMM16_X1_TLS_LE_LO 88	/* X1 pipe low 16-bit TLS LE offset */
++#define R_TILEPRO_IMM16_X0_TLS_LE_HI 89	/* X0 pipe high 16-bit TLS LE offset */
++#define R_TILEPRO_IMM16_X1_TLS_LE_HI 90	/* X1 pipe high 16-bit TLS LE offset */
++#define R_TILEPRO_IMM16_X0_TLS_LE_HA 91	/* X0 pipe ha() 16-bit TLS LE offset */
++#define R_TILEPRO_IMM16_X1_TLS_LE_HA 92	/* X1 pipe ha() 16-bit TLS LE offset */
++
++#define R_TILEPRO_GNU_VTINHERIT	128	/* GNU C++ vtable hierarchy */
++#define R_TILEPRO_GNU_VTENTRY	129	/* GNU C++ vtable member usage */
++
++#define R_TILEPRO_NUM		130
++
++
++/* TILE-Gx relocations.  */
++#define R_TILEGX_NONE		0	/* No reloc */
++#define R_TILEGX_64		1	/* Direct 64 bit */
++#define R_TILEGX_32		2	/* Direct 32 bit */
++#define R_TILEGX_16		3	/* Direct 16 bit */
++#define R_TILEGX_8		4	/* Direct 8 bit */
++#define R_TILEGX_64_PCREL	5	/* PC relative 64 bit */
++#define R_TILEGX_32_PCREL	6	/* PC relative 32 bit */
++#define R_TILEGX_16_PCREL	7	/* PC relative 16 bit */
++#define R_TILEGX_8_PCREL	8	/* PC relative 8 bit */
++#define R_TILEGX_HW0		9	/* hword 0 16-bit */
++#define R_TILEGX_HW1		10	/* hword 1 16-bit */
++#define R_TILEGX_HW2		11	/* hword 2 16-bit */
++#define R_TILEGX_HW3		12	/* hword 3 16-bit */
++#define R_TILEGX_HW0_LAST	13	/* last hword 0 16-bit */
++#define R_TILEGX_HW1_LAST	14	/* last hword 1 16-bit */
++#define R_TILEGX_HW2_LAST	15	/* last hword 2 16-bit */
++#define R_TILEGX_COPY		16	/* Copy relocation */
++#define R_TILEGX_GLOB_DAT	17	/* Create GOT entry */
++#define R_TILEGX_JMP_SLOT	18	/* Create PLT entry */
++#define R_TILEGX_RELATIVE	19	/* Adjust by program base */
++#define R_TILEGX_BROFF_X1	20	/* X1 pipe branch offset */
++#define R_TILEGX_JUMPOFF_X1	21	/* X1 pipe jump offset */
++#define R_TILEGX_JUMPOFF_X1_PLT	22	/* X1 pipe jump offset to PLT */
++#define R_TILEGX_IMM8_X0	23	/* X0 pipe 8-bit */
++#define R_TILEGX_IMM8_Y0	24	/* Y0 pipe 8-bit */
++#define R_TILEGX_IMM8_X1	25	/* X1 pipe 8-bit */
++#define R_TILEGX_IMM8_Y1	26	/* Y1 pipe 8-bit */
++#define R_TILEGX_DEST_IMM8_X1	27	/* X1 pipe destination 8-bit */
++#define R_TILEGX_MT_IMM14_X1	28	/* X1 pipe mtspr */
++#define R_TILEGX_MF_IMM14_X1	29	/* X1 pipe mfspr */
++#define R_TILEGX_MMSTART_X0	30	/* X0 pipe mm "start" */
++#define R_TILEGX_MMEND_X0	31	/* X0 pipe mm "end" */
++#define R_TILEGX_SHAMT_X0	32	/* X0 pipe shift amount */
++#define R_TILEGX_SHAMT_X1	33	/* X1 pipe shift amount */
++#define R_TILEGX_SHAMT_Y0	34	/* Y0 pipe shift amount */
++#define R_TILEGX_SHAMT_Y1	35	/* Y1 pipe shift amount */
++#define R_TILEGX_IMM16_X0_HW0	36	/* X0 pipe hword 0 */
++#define R_TILEGX_IMM16_X1_HW0	37	/* X1 pipe hword 0 */
++#define R_TILEGX_IMM16_X0_HW1	38	/* X0 pipe hword 1 */
++#define R_TILEGX_IMM16_X1_HW1	39	/* X1 pipe hword 1 */
++#define R_TILEGX_IMM16_X0_HW2	40	/* X0 pipe hword 2 */
++#define R_TILEGX_IMM16_X1_HW2	41	/* X1 pipe hword 2 */
++#define R_TILEGX_IMM16_X0_HW3	42	/* X0 pipe hword 3 */
++#define R_TILEGX_IMM16_X1_HW3	43	/* X1 pipe hword 3 */
++#define R_TILEGX_IMM16_X0_HW0_LAST 44	/* X0 pipe last hword 0 */
++#define R_TILEGX_IMM16_X1_HW0_LAST 45	/* X1 pipe last hword 0 */
++#define R_TILEGX_IMM16_X0_HW1_LAST 46	/* X0 pipe last hword 1 */
++#define R_TILEGX_IMM16_X1_HW1_LAST 47	/* X1 pipe last hword 1 */
++#define R_TILEGX_IMM16_X0_HW2_LAST 48	/* X0 pipe last hword 2 */
++#define R_TILEGX_IMM16_X1_HW2_LAST 49	/* X1 pipe last hword 2 */
++#define R_TILEGX_IMM16_X0_HW0_PCREL 50	/* X0 pipe PC relative hword 0 */
++#define R_TILEGX_IMM16_X1_HW0_PCREL 51	/* X1 pipe PC relative hword 0 */
++#define R_TILEGX_IMM16_X0_HW1_PCREL 52	/* X0 pipe PC relative hword 1 */
++#define R_TILEGX_IMM16_X1_HW1_PCREL 53	/* X1 pipe PC relative hword 1 */
++#define R_TILEGX_IMM16_X0_HW2_PCREL 54	/* X0 pipe PC relative hword 2 */
++#define R_TILEGX_IMM16_X1_HW2_PCREL 55	/* X1 pipe PC relative hword 2 */
++#define R_TILEGX_IMM16_X0_HW3_PCREL 56	/* X0 pipe PC relative hword 3 */
++#define R_TILEGX_IMM16_X1_HW3_PCREL 57	/* X1 pipe PC relative hword 3 */
++#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL 58 /* X0 pipe PC-rel last hword 0 */
++#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL 59 /* X1 pipe PC-rel last hword 0 */
++#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL 60 /* X0 pipe PC-rel last hword 1 */
++#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL 61 /* X1 pipe PC-rel last hword 1 */
++#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL 62 /* X0 pipe PC-rel last hword 2 */
++#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */
++#define R_TILEGX_IMM16_X0_HW0_GOT 64	/* X0 pipe hword 0 GOT offset */
++#define R_TILEGX_IMM16_X1_HW0_GOT 65	/* X1 pipe hword 0 GOT offset */
++/* Relocs 66-71 are currently not defined.  */
++#define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */
++#define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */
++#define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */
++#define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */
++/* Relocs 76-77 are currently not defined.  */
++#define R_TILEGX_IMM16_X0_HW0_TLS_GD 78	/* X0 pipe hword 0 TLS GD offset */
++#define R_TILEGX_IMM16_X1_HW0_TLS_GD 79	/* X1 pipe hword 0 TLS GD offset */
++#define R_TILEGX_IMM16_X0_HW0_TLS_LE 80	/* X0 pipe hword 0 TLS LE offset */
++#define R_TILEGX_IMM16_X1_HW0_TLS_LE 81	/* X1 pipe hword 0 TLS LE offset */
++#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE 82 /* X0 pipe last hword 0 LE off */
++#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE 83 /* X1 pipe last hword 0 LE off */
++#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE 84 /* X0 pipe last hword 1 LE off */
++#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE 85 /* X1 pipe last hword 1 LE off */
++#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD 86 /* X0 pipe last hword 0 GD off */
++#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD 87 /* X1 pipe last hword 0 GD off */
++#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD 88 /* X0 pipe last hword 1 GD off */
++#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD 89 /* X1 pipe last hword 1 GD off */
++/* Relocs 90-91 are currently not defined.  */
++#define R_TILEGX_IMM16_X0_HW0_TLS_IE 92	/* X0 pipe hword 0 TLS IE offset */
++#define R_TILEGX_IMM16_X1_HW0_TLS_IE 93	/* X1 pipe hword 0 TLS IE offset */
++/* Relocs 94-99 are currently not defined.  */
++#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */
++#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */
++#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */
++#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE 103 /* X1 pipe last hword 1 IE off */
++/* Relocs 104-105 are currently not defined.  */
++#define R_TILEGX_TLS_DTPMOD64	106	/* 64-bit ID of symbol's module */
++#define R_TILEGX_TLS_DTPOFF64	107	/* 64-bit offset in TLS block */
++#define R_TILEGX_TLS_TPOFF64	108	/* 64-bit offset in static TLS block */
++#define R_TILEGX_TLS_DTPMOD32	109	/* 32-bit ID of symbol's module */
++#define R_TILEGX_TLS_DTPOFF32	110	/* 32-bit offset in TLS block */
++#define R_TILEGX_TLS_TPOFF32	111	/* 32-bit offset in static TLS block */
++#define R_TILEGX_TLS_GD_CALL	112	/* "jal" for TLS GD */
++#define R_TILEGX_IMM8_X0_TLS_GD_ADD 113	/* X0 pipe "addi" for TLS GD */
++#define R_TILEGX_IMM8_X1_TLS_GD_ADD 114	/* X1 pipe "addi" for TLS GD */
++#define R_TILEGX_IMM8_Y0_TLS_GD_ADD 115	/* Y0 pipe "addi" for TLS GD */
++#define R_TILEGX_IMM8_Y1_TLS_GD_ADD 116	/* Y1 pipe "addi" for TLS GD */
++#define R_TILEGX_TLS_IE_LOAD	117	/* "ld_tls" for TLS IE */
++#define R_TILEGX_IMM8_X0_TLS_ADD 118	/* X0 pipe "addi" for TLS GD/IE */
++#define R_TILEGX_IMM8_X1_TLS_ADD 119	/* X1 pipe "addi" for TLS GD/IE */
++#define R_TILEGX_IMM8_Y0_TLS_ADD 120	/* Y0 pipe "addi" for TLS GD/IE */
++#define R_TILEGX_IMM8_Y1_TLS_ADD 121	/* Y1 pipe "addi" for TLS GD/IE */
++
++#define R_TILEGX_GNU_VTINHERIT	128	/* GNU C++ vtable hierarchy */
++#define R_TILEGX_GNU_VTENTRY	129	/* GNU C++ vtable member usage */
++
++#define R_TILEGX_NUM		130
++
++#endif	/* elf.h */
+--- a/scripts/mod/mk_elfconfig.c
++++ b/scripts/mod/mk_elfconfig.c
+@@ -2,7 +2,11 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
++#ifndef __APPLE__
+ #include <elf.h>
++#else
++#include "elf.h"
++#endif
+ 
+ int
+ main(int argc, char **argv)
+--- a/scripts/mod/modpost.h
++++ b/scripts/mod/modpost.h
+@@ -9,7 +9,11 @@
+ #include <sys/mman.h>
+ #include <fcntl.h>
+ #include <unistd.h>
++#if !(defined(__APPLE__) || defined(__CYGWIN__))
+ #include <elf.h>
++#else
++#include "elf.h"
++#endif
+ 
+ #include "list.h"
+ #include "elfconfig.h"
diff --git a/target/linux/generic/hack-6.0/211-darwin-uuid-typedef-clash.patch b/target/linux/generic/hack-6.0/211-darwin-uuid-typedef-clash.patch
new file mode 100644
index 000000000..50a622714
--- /dev/null
+++ b/target/linux/generic/hack-6.0/211-darwin-uuid-typedef-clash.patch
@@ -0,0 +1,22 @@
+From e44fc2af1ddc452b6659d08c16973d65c73b7d0a Mon Sep 17 00:00:00 2001
+From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
+Date: Wed, 5 Feb 2020 18:36:43 +0000
+Subject: [PATCH] file2alias: build on macos
+
+Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
+---
+ scripts/mod/file2alias.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/scripts/mod/file2alias.c
++++ b/scripts/mod/file2alias.c
+@@ -38,6 +38,9 @@ typedef struct {
+ 	__u8 b[16];
+ } guid_t;
+ 
++#ifdef __APPLE__
++#define uuid_t compat_uuid_t
++#endif
+ /* backwards compatibility, don't use in new code */
+ typedef struct {
+ 	__u8 b[16];
diff --git a/target/linux/generic/hack-6.0/212-tools_portability.patch b/target/linux/generic/hack-6.0/212-tools_portability.patch
new file mode 100644
index 000000000..3e74a76f4
--- /dev/null
+++ b/target/linux/generic/hack-6.0/212-tools_portability.patch
@@ -0,0 +1,83 @@
+From 48232d3d931c95953ce2ddfe7da7bb164aef6a73 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:03:16 +0200
+Subject: fix portability of some includes files in tools/ used on the host
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ tools/include/tools/be_byteshift.h |  4 ++++
+ tools/include/tools/le_byteshift.h |  4 ++++
+ tools/include/tools/linux_types.h  | 22 ++++++++++++++++++++++
+ 3 files changed, 30 insertions(+)
+ create mode 100644 tools/include/tools/linux_types.h
+
+--- a/tools/include/tools/be_byteshift.h
++++ b/tools/include/tools/be_byteshift.h
+@@ -2,6 +2,10 @@
+ #ifndef _TOOLS_BE_BYTESHIFT_H
+ #define _TOOLS_BE_BYTESHIFT_H
+ 
++#ifndef __linux__
++#include "linux_types.h"
++#endif
++
+ #include <stdint.h>
+ 
+ static inline uint16_t __get_unaligned_be16(const uint8_t *p)
+--- a/tools/include/tools/le_byteshift.h
++++ b/tools/include/tools/le_byteshift.h
+@@ -2,6 +2,10 @@
+ #ifndef _TOOLS_LE_BYTESHIFT_H
+ #define _TOOLS_LE_BYTESHIFT_H
+ 
++#ifndef __linux__
++#include "linux_types.h"
++#endif
++
+ #include <stdint.h>
+ 
+ static inline uint16_t __get_unaligned_le16(const uint8_t *p)
+--- /dev/null
++++ b/tools/include/tools/linux_types.h
+@@ -0,0 +1,26 @@
++#ifndef __LINUX_TYPES_H
++#define __LINUX_TYPES_H
++
++#include <stdint.h>
++
++typedef int8_t __s8;
++typedef uint8_t __u8;
++typedef uint8_t __be8;
++typedef uint8_t __le8;
++
++typedef int16_t __s16;
++typedef uint16_t __u16;
++typedef uint16_t __be16;
++typedef uint16_t __le16;
++
++typedef int32_t __s32;
++typedef uint32_t __u32;
++typedef uint32_t __be32;
++typedef uint32_t __le32;
++
++typedef int64_t __s64;
++typedef uint64_t __u64;
++typedef uint64_t __be64;
++typedef uint64_t __le64;
++
++#endif
+--- a/tools/include/linux/types.h
++++ b/tools/include/linux/types.h
+@@ -10,8 +10,12 @@
+ #define __SANE_USERSPACE_TYPES__	/* For PPC64, to get LL64 types */
+ #endif
+ 
++#ifndef __linux__
++#include <tools/linux_types.h>
++#else
+ #include <asm/types.h>
+ #include <asm/posix_types.h>
++#endif
+ 
+ struct page;
+ struct kmem_cache;
diff --git a/target/linux/generic/hack-6.0/214-spidev_h_portability.patch b/target/linux/generic/hack-6.0/214-spidev_h_portability.patch
new file mode 100644
index 000000000..db754a290
--- /dev/null
+++ b/target/linux/generic/hack-6.0/214-spidev_h_portability.patch
@@ -0,0 +1,24 @@
+From be9be95ff10e16a5b4ad36f903978d0cc5747024 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:04:08 +0200
+Subject: kernel: fix linux/spi/spidev.h portability issues with musl
+
+Felix will try to get this define included into musl
+
+lede-commit: 795e7cf60de19e7a076a46874fab7bb88b43bbff
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/uapi/linux/spi/spidev.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/include/uapi/linux/spi/spidev.h
++++ b/include/uapi/linux/spi/spidev.h
+@@ -93,7 +93,7 @@ struct spi_ioc_transfer {
+ 
+ /* not all platforms use <asm-generic/ioctl.h> or _IOC_TYPECHECK() ... */
+ #define SPI_MSGSIZE(N) \
+-	((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \
++	((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << 13)) \
+ 		? ((N)*(sizeof (struct spi_ioc_transfer))) : 0)
+ #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)])
+ 
diff --git a/target/linux/generic/hack-6.0/220-arm-gc_sections.patch b/target/linux/generic/hack-6.0/220-arm-gc_sections.patch
new file mode 100644
index 000000000..6cfc3236b
--- /dev/null
+++ b/target/linux/generic/hack-6.0/220-arm-gc_sections.patch
@@ -0,0 +1,123 @@
+From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 15 Jul 2017 23:42:36 +0200
+Subject: use -ffunction-sections, -fdata-sections and --gc-sections
+
+In combination with kernel symbol export stripping this significantly reduces
+the kernel image size. Used on both ARM and MIPS architectures.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -121,6 +121,7 @@ config ARM
+ 	select HAVE_UID16
+ 	select HAVE_VIRT_CPU_ACCOUNTING_GEN
+ 	select IRQ_FORCED_THREADING
++	select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
+ 	select MODULES_USE_ELF_REL
+ 	select NEED_DMA_MAP_STATE
+ 	select OF_EARLY_FLATTREE if OF
+--- a/arch/arm/boot/compressed/Makefile
++++ b/arch/arm/boot/compressed/Makefile
+@@ -91,6 +91,7 @@ endif
+ ifeq ($(CONFIG_USE_OF),y)
+ OBJS	+= $(libfdt_objs) fdt_check_mem_start.o
+ endif
++KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
+ 
+ OBJS	+= lib1funcs.o ashldi3.o bswapsdi2.o
+ 
+--- a/arch/arm/kernel/vmlinux.lds.S
++++ b/arch/arm/kernel/vmlinux.lds.S
+@@ -75,7 +75,7 @@ SECTIONS
+ 	. = ALIGN(4);
+ 	__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
+ 		__start___ex_table = .;
+-		ARM_MMU_KEEP(*(__ex_table))
++		KEEP(*(__ex_table))
+ 		__stop___ex_table = .;
+ 	}
+ 
+@@ -100,24 +100,24 @@ SECTIONS
+ 	}
+ 	.init.arch.info : {
+ 		__arch_info_begin = .;
+-		*(.arch.info.init)
++		KEEP(*(.arch.info.init))
+ 		__arch_info_end = .;
+ 	}
+ 	.init.tagtable : {
+ 		__tagtable_begin = .;
+-		*(.taglist.init)
++		KEEP(*(.taglist.init))
+ 		__tagtable_end = .;
+ 	}
+ #ifdef CONFIG_SMP_ON_UP
+ 	.init.smpalt : {
+ 		__smpalt_begin = .;
+-		*(.alt.smp.init)
++		KEEP(*(.alt.smp.init))
+ 		__smpalt_end = .;
+ 	}
+ #endif
+ 	.init.pv_table : {
+ 		__pv_table_begin = .;
+-		*(.pv_table)
++		KEEP(*(.pv_table))
+ 		__pv_table_end = .;
+ 	}
+ 
+--- a/arch/arm/include/asm/vmlinux.lds.h
++++ b/arch/arm/include/asm/vmlinux.lds.h
+@@ -42,13 +42,13 @@
+ #define PROC_INFO							\
+ 		. = ALIGN(4);						\
+ 		__proc_info_begin = .;					\
+-		*(.proc.info.init)					\
++		KEEP(*(.proc.info.init))				\
+ 		__proc_info_end = .;
+ 
+ #define IDMAP_TEXT							\
+ 		ALIGN_FUNCTION();					\
+ 		__idmap_text_start = .;					\
+-		*(.idmap.text)						\
++		KEEP(*(.idmap.text))					\
+ 		__idmap_text_end = .;					\
+ 
+ #define ARM_DISCARD							\
+@@ -109,12 +109,12 @@
+ 	. = ALIGN(8);							\
+ 	.ARM.unwind_idx : {						\
+ 		__start_unwind_idx = .;					\
+-		*(.ARM.exidx*)						\
++		KEEP(*(.ARM.exidx*))					\
+ 		__stop_unwind_idx = .;					\
+ 	}								\
+ 	.ARM.unwind_tab : {						\
+ 		__start_unwind_tab = .;					\
+-		*(.ARM.extab*)						\
++		KEEP(*(.ARM.extab*))					\
+ 		__stop_unwind_tab = .;					\
+ 	}
+ 
+@@ -126,7 +126,7 @@
+ 	__vectors_lma = .;						\
+ 	OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) {		\
+ 		.vectors {						\
+-			*(.vectors)					\
++			KEEP(*(.vectors))				\
+ 		}							\
+ 		.vectors.bhb.loop8 {					\
+ 			*(.vectors.bhb.loop8)				\
+@@ -144,7 +144,7 @@
+ 									\
+ 	__stubs_lma = .;						\
+ 	.stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) {		\
+-		*(.stubs)						\
++		KEEP(*(.stubs))						\
+ 	}								\
+ 	ARM_LMA(__stubs, .stubs);					\
+ 	. = __stubs_lma + SIZEOF(.stubs);				\
diff --git a/target/linux/generic/hack-6.0/221-module_exports.patch b/target/linux/generic/hack-6.0/221-module_exports.patch
new file mode 100644
index 000000000..13c5b58d8
--- /dev/null
+++ b/target/linux/generic/hack-6.0/221-module_exports.patch
@@ -0,0 +1,102 @@
+From b14784e7883390c20ed3ff904892255404a5914b Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:05:53 +0200
+Subject: add an optional config option for stripping all unnecessary symbol exports from the kernel image
+
+lede-commit: bb5a40c64b7c4f4848509fa0a6625055fc9e66cc
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/asm-generic/vmlinux.lds.h | 18 +++++++++++++++---
+ include/linux/export.h            |  9 ++++++++-
+ scripts/Makefile.build            |  2 +-
+ 3 files changed, 24 insertions(+), 5 deletions(-)
+
+--- a/include/asm-generic/vmlinux.lds.h
++++ b/include/asm-generic/vmlinux.lds.h
+@@ -81,6 +81,16 @@
+ #define RO_EXCEPTION_TABLE
+ #endif
+ 
++#ifndef SYMTAB_KEEP
++#define SYMTAB_KEEP KEEP(*(SORT(___ksymtab+*)))
++#define SYMTAB_KEEP_GPL KEEP(*(SORT(___ksymtab_gpl+*)))
++#endif
++
++#ifndef SYMTAB_DISCARD
++#define SYMTAB_DISCARD
++#define SYMTAB_DISCARD_GPL
++#endif
++
+ /* Align . to a 8 byte boundary equals to maximum function alignment. */
+ #define ALIGN_FUNCTION()  . = ALIGN(8)
+ 
+@@ -478,14 +488,14 @@
+ 	/* Kernel symbol table: Normal symbols */			\
+ 	__ksymtab         : AT(ADDR(__ksymtab) - LOAD_OFFSET) {		\
+ 		__start___ksymtab = .;					\
+-		KEEP(*(SORT(___ksymtab+*)))				\
++		SYMTAB_KEEP						\
+ 		__stop___ksymtab = .;					\
+ 	}								\
+ 									\
+ 	/* Kernel symbol table: GPL-only symbols */			\
+ 	__ksymtab_gpl     : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) {	\
+ 		__start___ksymtab_gpl = .;				\
+-		KEEP(*(SORT(___ksymtab_gpl+*)))				\
++		SYMTAB_KEEP_GPL						\
+ 		__stop___ksymtab_gpl = .;				\
+ 	}								\
+ 									\
+@@ -505,7 +515,7 @@
+ 									\
+ 	/* Kernel symbol table: strings */				\
+         __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) {	\
+-		*(__ksymtab_strings)					\
++		*(__ksymtab_strings+*)					\
+ 	}								\
+ 									\
+ 	/* __*init sections */						\
+@@ -1023,6 +1033,8 @@
+ 
+ #define COMMON_DISCARDS							\
+ 	SANITIZER_DISCARDS						\
++	SYMTAB_DISCARD							\
++	SYMTAB_DISCARD_GPL						\
+ 	*(.discard)							\
+ 	*(.discard.*)							\
+ 	*(.modinfo)							\
+--- a/include/linux/export.h
++++ b/include/linux/export.h
+@@ -72,6 +72,12 @@ struct kernel_symbol {
+ 
+ #else
+ 
++#ifdef MODULE
++#define __EXPORT_SUFFIX(sym)
++#else
++#define __EXPORT_SUFFIX(sym) "+" #sym
++#endif
++
+ /*
+  * For every exported symbol, do the following:
+  *
+@@ -87,7 +93,7 @@ struct kernel_symbol {
+ 	extern typeof(sym) sym;							\
+ 	extern const char __kstrtab_##sym[];					\
+ 	extern const char __kstrtabns_##sym[];					\
+-	asm("	.section \"__ksymtab_strings\",\"aMS\",%progbits,1	\n"	\
++	asm("	.section \"__ksymtab_strings" __EXPORT_SUFFIX(sym) "\",\"aMS\",%progbits,1	\n"	\
+ 	    "__kstrtab_" #sym ":					\n"	\
+ 	    "	.asciz 	\"" #sym "\"					\n"	\
+ 	    "__kstrtabns_" #sym ":					\n"	\
+--- a/scripts/Makefile.build
++++ b/scripts/Makefile.build
+@@ -328,7 +328,7 @@ targets += $(real-dtb-y) $(lib-y) $(alwa
+ # Linker scripts preprocessor (.lds.S -> .lds)
+ # ---------------------------------------------------------------------------
+ quiet_cmd_cpp_lds_S = LDS     $@
+-      cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \
++      cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -U$(ARCH) \
+ 	                     -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
+ 
+ $(obj)/%.lds: $(src)/%.lds.S FORCE
diff --git a/target/linux/generic/hack-6.0/230-openwrt_lzma_options.patch b/target/linux/generic/hack-6.0/230-openwrt_lzma_options.patch
new file mode 100644
index 000000000..1adc6b9fa
--- /dev/null
+++ b/target/linux/generic/hack-6.0/230-openwrt_lzma_options.patch
@@ -0,0 +1,34 @@
+From b3d00b452467f621317953d9e4c6f9ae8dcfd271 Mon Sep 17 00:00:00 2001
+From: Imre Kaloz <kaloz@openwrt.org>
+Date: Fri, 7 Jul 2017 17:06:55 +0200
+Subject: use the openwrt lzma options for now
+
+lede-commit: 548de949f392049420a6a1feeef118b30ab8ea8c
+Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
+---
+ lib/decompress.c              |  1 +
+ scripts/Makefile.lib          |  2 +-
+ usr/gen_initramfs_list.sh | 10 +++++-----
+ 3 files changed, 7 insertions(+), 6 deletions(-)
+
+--- a/lib/decompress.c
++++ b/lib/decompress.c
+@@ -53,6 +53,7 @@ static const struct compress_format comp
+ 	{ {0x1f, 0x9e}, "gzip", gunzip },
+ 	{ {0x42, 0x5a}, "bzip2", bunzip2 },
+ 	{ {0x5d, 0x00}, "lzma", unlzma },
++	{ {0x6d, 0x00}, "lzma-openwrt", unlzma },
+ 	{ {0xfd, 0x37}, "xz", unxz },
+ 	{ {0x89, 0x4c}, "lzo", unlzo },
+ 	{ {0x02, 0x21}, "lz4", unlz4 },
+--- a/scripts/Makefile.lib
++++ b/scripts/Makefile.lib
+@@ -421,7 +421,7 @@ quiet_cmd_bzip2_with_size = BZIP2   $@
+ # ---------------------------------------------------------------------------
+ 
+ quiet_cmd_lzma = LZMA    $@
+-      cmd_lzma = cat $(real-prereqs) | $(LZMA) -9 > $@
++      cmd_lzma = { cat $(real-prereqs) | $(LZMA) e -d20 -lc1 -lp2 -pb2 -eos -si -so; $(size_append); } > $@
+ 
+ quiet_cmd_lzma_with_size = LZMA    $@
+       cmd_lzma_with_size = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@
diff --git a/target/linux/generic/hack-6.0/249-udp-tunnel-selection.patch b/target/linux/generic/hack-6.0/249-udp-tunnel-selection.patch
new file mode 100644
index 000000000..2c74298df
--- /dev/null
+++ b/target/linux/generic/hack-6.0/249-udp-tunnel-selection.patch
@@ -0,0 +1,11 @@
+--- a/net/ipv4/Kconfig
++++ b/net/ipv4/Kconfig
+@@ -315,7 +315,7 @@ config NET_IPVTI
+ 	  on top.
+ 
+ config NET_UDP_TUNNEL
+-	tristate
++	tristate "IP: UDP tunneling support"
+ 	select NET_IP_TUNNEL
+ 	default n
+ 
diff --git a/target/linux/generic/hack-6.0/250-netfilter_depends.patch b/target/linux/generic/hack-6.0/250-netfilter_depends.patch
new file mode 100644
index 000000000..fbb5a6115
--- /dev/null
+++ b/target/linux/generic/hack-6.0/250-netfilter_depends.patch
@@ -0,0 +1,27 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: hack: net: remove bogus netfilter dependencies
+
+lede-commit: 589d2a377dee27d206fc3725325309cf649e4df6
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/netfilter/Kconfig | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/net/netfilter/Kconfig
++++ b/net/netfilter/Kconfig
+@@ -253,7 +253,6 @@ config NF_CONNTRACK_FTP
+ 
+ config NF_CONNTRACK_H323
+ 	tristate "H.323 protocol support"
+-	depends on IPV6 || IPV6=n
+ 	depends on NETFILTER_ADVANCED
+ 	help
+ 	  H.323 is a VoIP signalling protocol from ITU-T. As one of the most
+@@ -1118,7 +1117,6 @@ config NETFILTER_XT_TARGET_SECMARK
+ 
+ config NETFILTER_XT_TARGET_TCPMSS
+ 	tristate '"TCPMSS" target support'
+-	depends on IPV6 || IPV6=n
+ 	default m if NETFILTER_ADVANCED=n
+ 	help
+ 	  This option adds a `TCPMSS' target, which allows you to alter the
diff --git a/target/linux/generic/hack-6.0/251-kconfig.patch b/target/linux/generic/hack-6.0/251-kconfig.patch
new file mode 100644
index 000000000..6027f20b2
--- /dev/null
+++ b/target/linux/generic/hack-6.0/251-kconfig.patch
@@ -0,0 +1,199 @@
+From da3c50704f14132f4adf80d48e9a4cd5d46e54c9 Mon Sep 17 00:00:00 2001
+From: John Crispin <john@phrozen.org>
+Date: Fri, 7 Jul 2017 17:09:21 +0200
+Subject: kconfig: owrt specifc dependencies
+
+Signed-off-by: John Crispin <john@phrozen.org>
+---
+ crypto/Kconfig        | 10 +++++-----
+ drivers/bcma/Kconfig  |  1 +
+ drivers/ssb/Kconfig   |  3 ++-
+ lib/Kconfig           |  8 ++++----
+ net/netfilter/Kconfig |  2 +-
+ net/wireless/Kconfig  | 17 ++++++++++-------
+ sound/core/Kconfig    |  4 ++--
+ 7 files changed, 25 insertions(+), 20 deletions(-)
+
+--- a/crypto/Kconfig
++++ b/crypto/Kconfig
+@@ -55,7 +55,7 @@ config CRYPTO_FIPS_VERSION
+ 	  By default the KERNELRELEASE value is used.
+ 
+ config CRYPTO_ALGAPI
+-	tristate
++	tristate "ALGAPI"
+ 	select CRYPTO_ALGAPI2
+ 	help
+ 	  This option provides the API for cryptographic algorithms.
+@@ -64,7 +64,7 @@ config CRYPTO_ALGAPI2
+ 	tristate
+ 
+ config CRYPTO_AEAD
+-	tristate
++	tristate "AEAD"
+ 	select CRYPTO_AEAD2
+ 	select CRYPTO_ALGAPI
+ 
+@@ -75,7 +75,7 @@ config CRYPTO_AEAD2
+ 	select CRYPTO_RNG2
+ 
+ config CRYPTO_SKCIPHER
+-	tristate
++	tristate "SKCIPHER"
+ 	select CRYPTO_SKCIPHER2
+ 	select CRYPTO_ALGAPI
+ 
+@@ -85,7 +85,7 @@ config CRYPTO_SKCIPHER2
+ 	select CRYPTO_RNG2
+ 
+ config CRYPTO_HASH
+-	tristate
++	tristate "HASH"
+ 	select CRYPTO_HASH2
+ 	select CRYPTO_ALGAPI
+ 
+@@ -94,7 +94,7 @@ config CRYPTO_HASH2
+ 	select CRYPTO_ALGAPI2
+ 
+ config CRYPTO_RNG
+-	tristate
++	tristate "RNG"
+ 	select CRYPTO_RNG2
+ 	select CRYPTO_ALGAPI
+ 
+--- a/drivers/bcma/Kconfig
++++ b/drivers/bcma/Kconfig
+@@ -16,6 +16,7 @@ if BCMA
+ # Support for Block-I/O. SELECT this from the driver that needs it.
+ config BCMA_BLOCKIO
+ 	bool
++	default y
+ 
+ config BCMA_HOST_PCI_POSSIBLE
+ 	bool
+--- a/drivers/ssb/Kconfig
++++ b/drivers/ssb/Kconfig
+@@ -29,6 +29,7 @@ config SSB_SPROM
+ config SSB_BLOCKIO
+ 	bool
+ 	depends on SSB
++	default y
+ 
+ config SSB_PCIHOST_POSSIBLE
+ 	bool
+@@ -49,7 +50,7 @@ config SSB_PCIHOST
+ config SSB_B43_PCI_BRIDGE
+ 	bool
+ 	depends on SSB_PCIHOST
+-	default n
++	default y
+ 
+ config SSB_PCMCIAHOST_POSSIBLE
+ 	bool
+--- a/lib/Kconfig
++++ b/lib/Kconfig
+@@ -456,16 +456,16 @@ config BCH_CONST_T
+ # Textsearch support is select'ed if needed
+ #
+ config TEXTSEARCH
+-	bool
++	bool "Textsearch support"
+ 
+ config TEXTSEARCH_KMP
+-	tristate
++	tristate "Textsearch KMP"
+ 
+ config TEXTSEARCH_BM
+-	tristate
++	tristate "Textsearch BM"
+ 
+ config TEXTSEARCH_FSM
+-	tristate
++	tristate "Textsearch FSM"
+ 
+ config BTREE
+ 	bool
+--- a/net/netfilter/Kconfig
++++ b/net/netfilter/Kconfig
+@@ -22,7 +22,7 @@ config NETFILTER_SKIP_EGRESS
+ 	def_bool NETFILTER_EGRESS && (NET_CLS_ACT || IFB)
+ 
+ config NETFILTER_NETLINK
+-	tristate
++	tristate "Netfilter NFNETLINK interface"
+ 
+ config NETFILTER_FAMILY_BRIDGE
+ 	bool
+--- a/net/wireless/Kconfig
++++ b/net/wireless/Kconfig
+@@ -1,6 +1,6 @@
+ # SPDX-License-Identifier: GPL-2.0-only
+ config WIRELESS_EXT
+-	bool
++	bool "Wireless extensions"
+ 
+ config WEXT_CORE
+ 	def_bool y
+@@ -12,10 +12,10 @@ config WEXT_PROC
+ 	depends on WEXT_CORE
+ 
+ config WEXT_SPY
+-	bool
++	bool "WEXT_SPY"
+ 
+ config WEXT_PRIV
+-	bool
++	bool "WEXT_PRIV"
+ 
+ config CFG80211
+ 	tristate "cfg80211 - wireless configuration API"
+@@ -204,7 +204,7 @@ config CFG80211_WEXT_EXPORT
+ endif # CFG80211
+ 
+ config LIB80211
+-	tristate
++	tristate "LIB80211"
+ 	default n
+ 	help
+ 	  This options enables a library of common routines used
+@@ -213,17 +213,17 @@ config LIB80211
+ 	  Drivers should select this themselves if needed.
+ 
+ config LIB80211_CRYPT_WEP
+-	tristate
++	tristate "LIB80211_CRYPT_WEP"
+ 	select CRYPTO_LIB_ARC4
+ 
+ config LIB80211_CRYPT_CCMP
+-	tristate
++	tristate "LIB80211_CRYPT_CCMP"
+ 	select CRYPTO
+ 	select CRYPTO_AES
+ 	select CRYPTO_CCM
+ 
+ config LIB80211_CRYPT_TKIP
+-	tristate
++	tristate "LIB80211_CRYPT_TKIP"
+ 	select CRYPTO_LIB_ARC4
+ 
+ config LIB80211_DEBUG
+--- a/sound/core/Kconfig
++++ b/sound/core/Kconfig
+@@ -17,7 +17,7 @@ config SND_DMAENGINE_PCM
+ 	tristate
+ 
+ config SND_HWDEP
+-	tristate
++	tristate "Sound hardware support"
+ 
+ config SND_SEQ_DEVICE
+ 	tristate
+@@ -27,7 +27,7 @@ config SND_RAWMIDI
+ 	select SND_SEQ_DEVICE if SND_SEQUENCER != n
+ 
+ config SND_COMPRESS_OFFLOAD
+-	tristate
++	tristate "Compression offloading support"
+ 
+ config SND_JACK
+ 	bool
diff --git a/target/linux/generic/hack-6.0/252-SATA_PMP.patch b/target/linux/generic/hack-6.0/252-SATA_PMP.patch
new file mode 100644
index 000000000..6502d1d6e
--- /dev/null
+++ b/target/linux/generic/hack-6.0/252-SATA_PMP.patch
@@ -0,0 +1,23 @@
+From 8c817e33be829c7249c2cfd59ff48ad5fac6a31d Mon Sep 17 00:00:00 2001
+From: Sungbo Eo <mans0n@gorani.run>
+Date: Fri, 7 Jul 2017 17:09:21 +0200
+Subject: [PATCH] kconfig: solidify SATA_PMP config
+
+SATA_PMP option in kernel config file disappears for every kernel_oldconfig refresh.
+To prevent this, SATA_HOST is now selected automatically when SATA_PMP is enabled.
+This patch can be dropped if SATA_MV is ever re-added into the config.
+---
+ drivers/ata/Kconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/ata/Kconfig
++++ b/drivers/ata/Kconfig
+@@ -112,7 +112,7 @@ config SATA_ZPODD
+ 
+ config SATA_PMP
+ 	bool "SATA Port Multiplier support"
+-	depends on SATA_HOST
++	select SATA_HOST
+ 	default y
+ 	help
+ 	  This option adds support for SATA Port Multipliers
diff --git a/target/linux/generic/hack-6.0/253-ksmbd-config.patch b/target/linux/generic/hack-6.0/253-ksmbd-config.patch
new file mode 100644
index 000000000..890374d28
--- /dev/null
+++ b/target/linux/generic/hack-6.0/253-ksmbd-config.patch
@@ -0,0 +1,22 @@
+--- a/init/Kconfig
++++ b/init/Kconfig
+@@ -1954,7 +1954,7 @@ config PADATA
+ 	bool
+ 
+ config ASN1
+-	tristate
++	tristate "ASN1"
+ 	help
+ 	  Build a simple ASN.1 grammar compiler that produces a bytecode output
+ 	  that can be interpreted by the ASN.1 stream decoder and used to
+--- a/lib/Kconfig
++++ b/lib/Kconfig
+@@ -627,7 +627,7 @@ config LIBFDT
+ 	bool
+ 
+ config OID_REGISTRY
+-	tristate
++	tristate "OID"
+ 	help
+ 	  Enable fast lookup object identifier registry.
+ 
diff --git a/target/linux/generic/hack-6.0/259-regmap_dynamic.patch b/target/linux/generic/hack-6.0/259-regmap_dynamic.patch
new file mode 100644
index 000000000..6339784cb
--- /dev/null
+++ b/target/linux/generic/hack-6.0/259-regmap_dynamic.patch
@@ -0,0 +1,144 @@
+From 811d9e2268a62b830cfe93cd8bc929afcb8b198b Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 15 Jul 2017 21:12:38 +0200
+Subject: kernel: move regmap bloat out of the kernel image if it is only being used in modules
+
+lede-commit: 96f39119815028073583e4fca3a9c5fe9141e998
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/base/regmap/Kconfig  | 15 ++++++++++-----
+ drivers/base/regmap/Makefile | 12 ++++++++----
+ drivers/base/regmap/regmap.c |  3 +++
+ include/linux/regmap.h       |  2 +-
+ 4 files changed, 22 insertions(+), 10 deletions(-)
+
+--- a/drivers/base/regmap/Kconfig
++++ b/drivers/base/regmap/Kconfig
+@@ -4,10 +4,9 @@
+ # subsystems should select the appropriate symbols.
+ 
+ config REGMAP
+-	default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_SOUNDWIRE_MBQ || REGMAP_SCCB || REGMAP_I3C || REGMAP_SPI_AVMM || REGMAP_MDIO)
+ 	select IRQ_DOMAIN if REGMAP_IRQ
+ 	select MDIO_BUS if REGMAP_MDIO
+-	bool
++	tristate
+ 
+ config REGCACHE_COMPRESSED
+ 	select LZO_COMPRESS
+@@ -15,53 +14,67 @@ config REGCACHE_COMPRESSED
+ 	bool
+ 
+ config REGMAP_AC97
++	select REGMAP
+ 	tristate
+ 
+ config REGMAP_I2C
++	select REGMAP
+ 	tristate
+ 	depends on I2C
+ 
+ config REGMAP_SLIMBUS
++	select REGMAP
+ 	tristate
+ 	depends on SLIMBUS
+ 
+ config REGMAP_SPI
++	select REGMAP
+ 	tristate
+ 	depends on SPI
+ 
+ config REGMAP_SPMI
++	select REGMAP
+ 	tristate
+ 	depends on SPMI
+ 
+ config REGMAP_W1
++	select REGMAP
+ 	tristate
+ 	depends on W1
+ 
+ config REGMAP_MDIO
++	select REGMAP
+ 	tristate
+ 
+ config REGMAP_MMIO
++	select REGMAP
+ 	tristate
+ 
+ config REGMAP_IRQ
++	select REGMAP
+ 	bool
+ 
+ config REGMAP_SOUNDWIRE
++	select REGMAP
+ 	tristate
+ 	depends on SOUNDWIRE
+ 
+ config REGMAP_SOUNDWIRE_MBQ
++	select REGMAP
+ 	tristate
+ 	depends on SOUNDWIRE
+ 
+ config REGMAP_SCCB
++	select REGMAP
+ 	tristate
+ 	depends on I2C
+ 
+ config REGMAP_I3C
++	select REGMAP
+ 	tristate
+ 	depends on I3C
+ 
+ config REGMAP_SPI_AVMM
++	select REGMAP
+ 	tristate
+ 	depends on SPI
+--- a/drivers/base/regmap/Makefile
++++ b/drivers/base/regmap/Makefile
+@@ -2,10 +2,14 @@
+ # For include/trace/define_trace.h to include trace.h
+ CFLAGS_regmap.o := -I$(src)
+ 
+-obj-$(CONFIG_REGMAP) += regmap.o regcache.o
+-obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-flat.o
+-obj-$(CONFIG_REGCACHE_COMPRESSED) += regcache-lzo.o
+-obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o
++regmap-core-objs = regmap.o regcache.o regcache-rbtree.o regcache-flat.o
++ifdef CONFIG_DEBUG_FS
++regmap-core-objs += regmap-debugfs.o
++endif
++ifdef CONFIG_REGCACHE_COMPRESSED
++regmap-core-objs += regcache-lzo.o
++endif
++obj-$(CONFIG_REGMAP) += regmap-core.o
+ obj-$(CONFIG_REGMAP_AC97) += regmap-ac97.o
+ obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o
+ obj-$(CONFIG_REGMAP_SLIMBUS) += regmap-slimbus.o
+--- a/drivers/base/regmap/regmap.c
++++ b/drivers/base/regmap/regmap.c
+@@ -9,6 +9,7 @@
+ #include <linux/device.h>
+ #include <linux/slab.h>
+ #include <linux/export.h>
++#include <linux/module.h>
+ #include <linux/mutex.h>
+ #include <linux/err.h>
+ #include <linux/property.h>
+@@ -3384,3 +3385,5 @@ static int __init regmap_initcall(void)
+ 	return 0;
+ }
+ postcore_initcall(regmap_initcall);
++
++MODULE_LICENSE("GPL");
+--- a/include/linux/regmap.h
++++ b/include/linux/regmap.h
+@@ -180,7 +180,7 @@ struct reg_sequence {
+ 	__ret ?: __tmp; \
+ })
+ 
+-#ifdef CONFIG_REGMAP
++#if IS_REACHABLE(CONFIG_REGMAP)
+ 
+ enum regmap_endian {
+ 	/* Unspecified -> 0 -> Backwards compatible default */
diff --git a/target/linux/generic/hack-6.0/260-crypto_test_dependencies.patch b/target/linux/generic/hack-6.0/260-crypto_test_dependencies.patch
new file mode 100644
index 000000000..7ea517496
--- /dev/null
+++ b/target/linux/generic/hack-6.0/260-crypto_test_dependencies.patch
@@ -0,0 +1,52 @@
+From fd1799b0bf5efa46dd3e6dfbbf3955564807e508 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:12:51 +0200
+Subject: kernel: prevent cryptomgr from pulling in useless extra dependencies for tests that are not run
+
+Reduces kernel size after LZMA by about 5k on MIPS
+
+lede-commit: 044c316167e076479a344c59905e5b435b84a77f
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ crypto/Kconfig   | 13 ++++++-------
+ crypto/algboss.c |  4 ++++
+ 2 files changed, 10 insertions(+), 7 deletions(-)
+
+--- a/crypto/Kconfig
++++ b/crypto/Kconfig
+@@ -142,13 +142,13 @@ config CRYPTO_MANAGER
+ 	  cbc(aes).
+ 
+ config CRYPTO_MANAGER2
+-	def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y)
+-	select CRYPTO_AEAD2
+-	select CRYPTO_HASH2
+-	select CRYPTO_SKCIPHER2
+-	select CRYPTO_AKCIPHER2
+-	select CRYPTO_KPP2
+-	select CRYPTO_ACOMP2
++	def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y && !CRYPTO_MANAGER_DISABLE_TESTS)
++	select CRYPTO_AEAD2 if !CRYPTO_MANAGER_DISABLE_TESTS
++	select CRYPTO_HASH2 if !CRYPTO_MANAGER_DISABLE_TESTS
++	select CRYPTO_SKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS
++	select CRYPTO_AKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS
++	select CRYPTO_KPP2 if !CRYPTO_MANAGER_DISABLE_TESTS
++	select CRYPTO_ACOMP2 if !CRYPTO_MANAGER_DISABLE_TESTS
+ 
+ config CRYPTO_USER
+ 	tristate "Userspace cryptographic algorithm configuration"
+--- a/crypto/algboss.c
++++ b/crypto/algboss.c
+@@ -211,8 +211,12 @@ static int cryptomgr_schedule_test(struc
+ 	type = alg->cra_flags;
+ 
+ 	/* Do not test internal algorithms. */
++#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
++	type |= CRYPTO_ALG_TESTED;
++#else
+ 	if (type & CRYPTO_ALG_INTERNAL)
+ 		type |= CRYPTO_ALG_TESTED;
++#endif
+ 
+ 	param->type = type;
+ 
diff --git a/target/linux/generic/hack-6.0/261-lib-arc4-unhide.patch b/target/linux/generic/hack-6.0/261-lib-arc4-unhide.patch
new file mode 100644
index 000000000..4ffd8cfa3
--- /dev/null
+++ b/target/linux/generic/hack-6.0/261-lib-arc4-unhide.patch
@@ -0,0 +1,15 @@
+This makes it possible to select CONFIG_CRYPTO_LIB_ARC4 directly. We 
+need this to be able to compile this into the kernel and make use of it 
+from backports.
+
+--- a/lib/crypto/Kconfig
++++ b/lib/crypto/Kconfig
+@@ -6,7 +6,7 @@ config CRYPTO_LIB_AES
+ 	tristate
+ 
+ config CRYPTO_LIB_ARC4
+-	tristate
++	tristate "ARC4 cipher library"
+ 
+ config CRYPTO_ARCH_HAVE_LIB_BLAKE2S
+ 	bool
diff --git a/target/linux/generic/hack-6.0/280-rfkill-stubs.patch b/target/linux/generic/hack-6.0/280-rfkill-stubs.patch
new file mode 100644
index 000000000..7a650d132
--- /dev/null
+++ b/target/linux/generic/hack-6.0/280-rfkill-stubs.patch
@@ -0,0 +1,84 @@
+From 236c1acdfef5958010ac9814a9872e0a46fd78ee Mon Sep 17 00:00:00 2001
+From: John Crispin <john@phrozen.org>
+Date: Fri, 7 Jul 2017 17:13:44 +0200
+Subject: rfkill: add fake rfkill support
+
+allow building of modules depending on RFKILL even if RFKILL is not enabled.
+
+Signed-off-by: John Crispin <john@phrozen.org>
+---
+ include/linux/rfkill.h |  2 +-
+ net/Makefile           |  2 +-
+ net/rfkill/Kconfig     | 14 +++++++++-----
+ net/rfkill/Makefile    |  2 +-
+ 4 files changed, 12 insertions(+), 8 deletions(-)
+
+--- a/include/linux/rfkill.h
++++ b/include/linux/rfkill.h
+@@ -64,7 +64,7 @@ struct rfkill_ops {
+ 	int	(*set_block)(void *data, bool blocked);
+ };
+ 
+-#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
++#if defined(CONFIG_RFKILL_FULL) || defined(CONFIG_RFKILL_FULL_MODULE)
+ /**
+  * rfkill_alloc - Allocate rfkill structure
+  * @name: name of the struct -- the string is not copied internally
+--- a/net/Makefile
++++ b/net/Makefile
+@@ -52,7 +52,7 @@ obj-$(CONFIG_TIPC)		+= tipc/
+ obj-$(CONFIG_NETLABEL)		+= netlabel/
+ obj-$(CONFIG_IUCV)		+= iucv/
+ obj-$(CONFIG_SMC)		+= smc/
+-obj-$(CONFIG_RFKILL)		+= rfkill/
++obj-$(CONFIG_RFKILL_FULL)	+= rfkill/
+ obj-$(CONFIG_NET_9P)		+= 9p/
+ obj-$(CONFIG_CAIF)		+= caif/
+ obj-$(CONFIG_DCB)		+= dcb/
+--- a/net/rfkill/Kconfig
++++ b/net/rfkill/Kconfig
+@@ -2,7 +2,11 @@
+ #
+ # RF switch subsystem configuration
+ #
+-menuconfig RFKILL
++config RFKILL
++	bool
++	default y
++
++menuconfig RFKILL_FULL
+ 	tristate "RF switch subsystem support"
+ 	help
+ 	  Say Y here if you want to have control over RF switches
+@@ -14,19 +18,19 @@ menuconfig RFKILL
+ # LED trigger support
+ config RFKILL_LEDS
+ 	bool
+-	depends on RFKILL
++	depends on RFKILL_FULL
+ 	depends on LEDS_TRIGGERS = y || RFKILL = LEDS_TRIGGERS
+ 	default y
+ 
+ config RFKILL_INPUT
+ 	bool "RF switch input support" if EXPERT
+-	depends on RFKILL
++	depends on RFKILL_FULL
+ 	depends on INPUT = y || RFKILL = INPUT
+ 	default y if !EXPERT
+ 
+ config RFKILL_GPIO
+ 	tristate "GPIO RFKILL driver"
+-	depends on RFKILL
++	depends on RFKILL_FULL
+ 	depends on GPIOLIB || COMPILE_TEST
+ 	default n
+ 	help
+--- a/net/rfkill/Makefile
++++ b/net/rfkill/Makefile
+@@ -5,5 +5,5 @@
+ 
+ rfkill-y			+= core.o
+ rfkill-$(CONFIG_RFKILL_INPUT)	+= input.o
+-obj-$(CONFIG_RFKILL)		+= rfkill.o
++obj-$(CONFIG_RFKILL_FULL)	+= rfkill.o
+ obj-$(CONFIG_RFKILL_GPIO)	+= rfkill-gpio.o
diff --git a/target/linux/generic/hack-6.0/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch b/target/linux/generic/hack-6.0/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch
new file mode 100644
index 000000000..f21f20013
--- /dev/null
+++ b/target/linux/generic/hack-6.0/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch
@@ -0,0 +1,64 @@
+From: Ben Menchaca <ben.menchaca@qca.qualcomm.com>
+Date: Fri, 7 Jun 2013 18:35:22 -0500
+Subject: MIPS: r4k_cache: use more efficient cache blast
+
+Optimize the compiler output for larger cache blast cases that are
+common for DMA-based networking.
+
+Signed-off-by: Ben Menchaca <ben.menchaca@qca.qualcomm.com>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+--- a/arch/mips/include/asm/r4kcache.h
++++ b/arch/mips/include/asm/r4kcache.h
+@@ -286,14 +286,46 @@ static inline void prot##extra##blast_##
+ 						    unsigned long end)	\
+ {									\
+ 	unsigned long lsize = cpu_##desc##_line_size();			\
++	unsigned long lsize_2 = lsize * 2;				\
++	unsigned long lsize_3 = lsize * 3;				\
++	unsigned long lsize_4 = lsize * 4;				\
++	unsigned long lsize_5 = lsize * 5;				\
++	unsigned long lsize_6 = lsize * 6;				\
++	unsigned long lsize_7 = lsize * 7;				\
++	unsigned long lsize_8 = lsize * 8;				\
+ 	unsigned long addr = start & ~(lsize - 1);			\
+-	unsigned long aend = (end - 1) & ~(lsize - 1);			\
++	unsigned long aend = (end + lsize - 1) & ~(lsize - 1);		\
++	int lines = (aend - addr) / lsize;				\
+ 									\
+-	while (1) {							\
++	while (lines >= 8) {						\
++		prot##cache_op(hitop, addr);				\
++		prot##cache_op(hitop, addr + lsize);			\
++		prot##cache_op(hitop, addr + lsize_2);			\
++		prot##cache_op(hitop, addr + lsize_3);			\
++		prot##cache_op(hitop, addr + lsize_4);			\
++		prot##cache_op(hitop, addr + lsize_5);			\
++		prot##cache_op(hitop, addr + lsize_6);			\
++		prot##cache_op(hitop, addr + lsize_7);			\
++		addr += lsize_8;					\
++		lines -= 8;						\
++	}								\
++									\
++	if (lines & 0x4) {						\
++		prot##cache_op(hitop, addr);				\
++		prot##cache_op(hitop, addr + lsize);			\
++		prot##cache_op(hitop, addr + lsize_2);			\
++		prot##cache_op(hitop, addr + lsize_3);			\
++		addr += lsize_4;					\
++	}								\
++									\
++	if (lines & 0x2) {						\
++		prot##cache_op(hitop, addr);				\
++		prot##cache_op(hitop, addr + lsize);			\
++		addr += lsize_2;					\
++	}								\
++									\
++	if (lines & 0x1) {						\
+ 		prot##cache_op(hitop, addr);				\
+-		if (addr == aend)					\
+-			break;						\
+-		addr += lsize;						\
+ 	}								\
+ }
+ 
diff --git a/target/linux/generic/hack-6.0/301-mips_image_cmdline_hack.patch b/target/linux/generic/hack-6.0/301-mips_image_cmdline_hack.patch
new file mode 100644
index 000000000..eaf839601
--- /dev/null
+++ b/target/linux/generic/hack-6.0/301-mips_image_cmdline_hack.patch
@@ -0,0 +1,38 @@
+From: John Crispin <john@phrozen.org>
+Subject: hack: kernel: add generic image_cmdline hack to MIPS targets
+
+lede-commit: d59f5b3a987a48508257a0ddbaeadc7909f9f976
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ arch/mips/Kconfig       | 4 ++++
+ arch/mips/kernel/head.S | 6 ++++++
+ 2 files changed, 10 insertions(+)
+
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -1112,6 +1112,10 @@ config MIPS_MSC
+ config SYNC_R4K
+ 	bool
+ 
++config IMAGE_CMDLINE_HACK
++	bool "OpenWrt specific image command line hack"
++	default n
++
+ config NO_IOPORT_MAP
+ 	def_bool n
+ 
+--- a/arch/mips/kernel/head.S
++++ b/arch/mips/kernel/head.S
+@@ -79,6 +79,12 @@ FEXPORT(__kernel_entry)
+ 	j	kernel_entry
+ #endif /* CONFIG_BOOT_RAW */
+ 
++#ifdef CONFIG_IMAGE_CMDLINE_HACK
++	.ascii	"CMDLINE:"
++EXPORT(__image_cmdline)
++	.fill	0x400
++#endif /* CONFIG_IMAGE_CMDLINE_HACK */
++
+ 	__REF
+ 
+ NESTED(kernel_entry, 16, sp)			# kernel entry point
diff --git a/target/linux/generic/hack-6.0/321-powerpc_crtsavres_prereq.patch b/target/linux/generic/hack-6.0/321-powerpc_crtsavres_prereq.patch
new file mode 100644
index 000000000..17eba0b35
--- /dev/null
+++ b/target/linux/generic/hack-6.0/321-powerpc_crtsavres_prereq.patch
@@ -0,0 +1,38 @@
+From 107c0964cb8db7ca28ac5199426414fdab3c274d Mon Sep 17 00:00:00 2001
+From: "Alexandros C. Couloumbis" <alex@ozo.com>
+Date: Fri, 7 Jul 2017 17:14:51 +0200
+Subject: hack: arch: powerpc: drop register save/restore library from modules
+
+Upstream GCC uses a libgcc function for saving/restoring registers. This
+makes the code bigger, and upstream kernels need to carry that function
+for every single kernel module. Our GCC is patched to avoid those
+references, so we can drop the extra bloat for modules.
+
+lede-commit: e8e1084654f50904e6bf77b70b2de3f137d7b3ec
+Signed-off-by: Alexandros C. Couloumbis <alex@ozo.com>
+---
+ arch/powerpc/Makefile | 1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/arch/powerpc/Makefile
++++ b/arch/powerpc/Makefile
+@@ -42,19 +42,6 @@ machine-$(CONFIG_PPC64) += 64
+ machine-$(CONFIG_CPU_LITTLE_ENDIAN) += le
+ UTS_MACHINE := $(subst $(space),,$(machine-y))
+ 
+-# XXX This needs to be before we override LD below
+-ifdef CONFIG_PPC32
+-KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
+-else
+-ifeq ($(call ld-ifversion, -ge, 22500, y),y)
+-# Have the linker provide sfpr if possible.
+-# There is a corresponding test in arch/powerpc/lib/Makefile
+-KBUILD_LDFLAGS_MODULE += --save-restore-funcs
+-else
+-KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
+-endif
+-endif
+-
+ ifdef CONFIG_CPU_LITTLE_ENDIAN
+ KBUILD_CFLAGS	+= -mlittle-endian
+ KBUILD_LDFLAGS	+= -EL
diff --git a/target/linux/generic/hack-6.0/410-block-fit-partition-parser.patch b/target/linux/generic/hack-6.0/410-block-fit-partition-parser.patch
new file mode 100644
index 000000000..38856ded7
--- /dev/null
+++ b/target/linux/generic/hack-6.0/410-block-fit-partition-parser.patch
@@ -0,0 +1,196 @@
+--- a/block/blk.h
++++ b/block/blk.h
+@@ -406,6 +406,8 @@ void blk_free_ext_minor(unsigned int min
+ #define ADDPART_FLAG_NONE	0
+ #define ADDPART_FLAG_RAID	1
+ #define ADDPART_FLAG_WHOLEDISK	2
++#define ADDPART_FLAG_READONLY	4
++#define ADDPART_FLAG_ROOTDEV	8
+ int bdev_add_partition(struct gendisk *disk, int partno, sector_t start,
+ 		sector_t length);
+ int bdev_del_partition(struct gendisk *disk, int partno);
+--- a/block/partitions/Kconfig
++++ b/block/partitions/Kconfig
+@@ -103,6 +103,13 @@ config ATARI_PARTITION
+ 	  Say Y here if you would like to use hard disks under Linux which
+ 	  were partitioned under the Atari OS.
+ 
++config FIT_PARTITION
++	bool "Flattened-Image-Tree (FIT) partition support" if PARTITION_ADVANCED
++	default n
++	help
++	  Say Y here if your system needs to mount the filesystem part of
++	  a Flattened-Image-Tree (FIT) image commonly used with Das U-Boot.
++
+ config IBM_PARTITION
+ 	bool "IBM disk label and partition support"
+ 	depends on PARTITION_ADVANCED && S390
+--- a/block/partitions/Makefile
++++ b/block/partitions/Makefile
+@@ -8,6 +8,7 @@ obj-$(CONFIG_ACORN_PARTITION) += acorn.o
+ obj-$(CONFIG_AMIGA_PARTITION) += amiga.o
+ obj-$(CONFIG_ATARI_PARTITION) += atari.o
+ obj-$(CONFIG_AIX_PARTITION) += aix.o
++obj-$(CONFIG_FIT_PARTITION) += fit.o
+ obj-$(CONFIG_CMDLINE_PARTITION) += cmdline.o
+ obj-$(CONFIG_MAC_PARTITION) += mac.o
+ obj-$(CONFIG_LDM_PARTITION) += ldm.o
+--- a/block/partitions/check.h
++++ b/block/partitions/check.h
+@@ -57,6 +57,7 @@ int amiga_partition(struct parsed_partit
+ int atari_partition(struct parsed_partitions *state);
+ int cmdline_partition(struct parsed_partitions *state);
+ int efi_partition(struct parsed_partitions *state);
++int fit_partition(struct parsed_partitions *state);
+ int ibm_partition(struct parsed_partitions *);
+ int karma_partition(struct parsed_partitions *state);
+ int ldm_partition(struct parsed_partitions *state);
+@@ -67,3 +68,5 @@ int sgi_partition(struct parsed_partitio
+ int sun_partition(struct parsed_partitions *state);
+ int sysv68_partition(struct parsed_partitions *state);
+ int ultrix_partition(struct parsed_partitions *state);
++
++int parse_fit_partitions(struct parsed_partitions *state, u64 start_sector, u64 nr_sectors, int *slot, int add_remain);
+--- a/block/partitions/core.c
++++ b/block/partitions/core.c
+@@ -10,6 +10,10 @@
+ #include <linux/ctype.h>
+ #include <linux/vmalloc.h>
+ #include <linux/raid/detect.h>
++#ifdef CONFIG_FIT_PARTITION
++#include <linux/root_dev.h>
++#endif
++
+ #include "check.h"
+ 
+ static int (*check_part[])(struct parsed_partitions *) = {
+@@ -46,6 +50,9 @@ static int (*check_part[])(struct parsed
+ #ifdef CONFIG_EFI_PARTITION
+ 	efi_partition,		/* this must come before msdos */
+ #endif
++#ifdef CONFIG_FIT_PARTITION
++	fit_partition,
++#endif
+ #ifdef CONFIG_SGI_PARTITION
+ 	sgi_partition,
+ #endif
+@@ -398,6 +405,11 @@ static struct block_device *add_partitio
+ 			goto out_del;
+ 	}
+ 
++#ifdef CONFIG_FIT_PARTITION
++	if (flags & ADDPART_FLAG_READONLY)
++		bdev->bd_read_only = true;
++#endif
++
+ 	/* everything is up and running, commence */
+ 	err = xa_insert(&disk->part_tbl, partno, bdev, GFP_KERNEL);
+ 	if (err)
+@@ -585,6 +597,11 @@ static bool blk_add_partition(struct gen
+ 	    (state->parts[p].flags & ADDPART_FLAG_RAID))
+ 		md_autodetect_dev(part->bd_dev);
+ 
++#ifdef CONFIG_FIT_PARTITION
++	if ((state->parts[p].flags & ADDPART_FLAG_ROOTDEV) && ROOT_DEV == 0)
++		ROOT_DEV = part->bd_dev;
++#endif
++
+ 	return true;
+ }
+ 
+--- a/drivers/mtd/ubi/block.c
++++ b/drivers/mtd/ubi/block.c
+@@ -433,6 +433,9 @@ int ubiblock_create(struct ubi_volume_in
+ 	}
+ 	gd->flags |= GENHD_FL_NO_PART;
+ 	gd->private_data = dev;
++#ifdef CONFIG_FIT_PARTITION
++	gd->flags |= GENHD_FL_EXT_DEVT;
++#endif
+ 	sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id);
+ 	set_capacity(gd, disk_capacity);
+ 	dev->gd = gd;
+--- a/drivers/mtd/mtd_blkdevs.c
++++ b/drivers/mtd/mtd_blkdevs.c
+@@ -346,6 +346,9 @@ int add_mtd_blktrans_dev(struct mtd_blkt
+ 	gd->first_minor = (new->devnum) << tr->part_bits;
+ 	gd->minors = 1 << tr->part_bits;
+ 	gd->fops = &mtd_block_ops;
++#ifdef CONFIG_FIT_PARTITION
++	gd->flags |= GENHD_FL_EXT_DEVT;
++#endif
+ 
+ 	if (tr->part_bits) {
+ 		if (new->devnum < 26)
+--- a/block/partitions/efi.c
++++ b/block/partitions/efi.c
+@@ -716,6 +716,9 @@ int efi_partition(struct parsed_partitio
+ 	gpt_entry *ptes = NULL;
+ 	u32 i;
+ 	unsigned ssz = queue_logical_block_size(state->disk->queue) / 512;
++#ifdef CONFIG_FIT_PARTITION
++	u32 extra_slot = 64;
++#endif
+ 
+ 	if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) {
+ 		kfree(gpt);
+@@ -749,6 +752,11 @@ int efi_partition(struct parsed_partitio
+ 				ARRAY_SIZE(ptes[i].partition_name));
+ 		utf16_le_to_7bit(ptes[i].partition_name, label_max, info->volname);
+ 		state->parts[i + 1].has_info = true;
++#ifdef CONFIG_FIT_PARTITION
++		/* If this is a U-Boot FIT volume it may have subpartitions */
++		if (!efi_guidcmp(ptes[i].partition_type_guid, PARTITION_LINUX_FIT_GUID))
++			(void) parse_fit_partitions(state, start * ssz, size * ssz, &extra_slot, 1);
++#endif
+ 	}
+ 	kfree(ptes);
+ 	kfree(gpt);
+--- a/block/partitions/efi.h
++++ b/block/partitions/efi.h
+@@ -51,6 +51,9 @@
+ #define PARTITION_LINUX_LVM_GUID \
+     EFI_GUID( 0xe6d6d379, 0xf507, 0x44c2, \
+               0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28)
++#define PARTITION_LINUX_FIT_GUID \
++    EFI_GUID( 0xcae9be83, 0xb15f, 0x49cc, \
++              0x86, 0x3f, 0x08, 0x1b, 0x74, 0x4a, 0x2d, 0x93)
+ 
+ typedef struct _gpt_header {
+ 	__le64 signature;
+--- a/block/partitions/msdos.c
++++ b/block/partitions/msdos.c
+@@ -564,6 +564,15 @@ static void parse_minix(struct parsed_pa
+ #endif /* CONFIG_MINIX_SUBPARTITION */
+ }
+ 
++static void parse_fit_mbr(struct parsed_partitions *state,
++			  sector_t offset, sector_t size, int origin)
++{
++#ifdef CONFIG_FIT_PARTITION
++	u32 extra_slot = 64;
++	(void) parse_fit_partitions(state, offset, size, &extra_slot, 1);
++#endif /* CONFIG_FIT_PARTITION */
++}
++
+ static struct {
+ 	unsigned char id;
+ 	void (*parse)(struct parsed_partitions *, sector_t, sector_t, int);
+@@ -575,6 +584,7 @@ static struct {
+ 	{UNIXWARE_PARTITION, parse_unixware},
+ 	{SOLARIS_X86_PARTITION, parse_solaris_x86},
+ 	{NEW_SOLARIS_X86_PARTITION, parse_solaris_x86},
++	{FIT_PARTITION, parse_fit_mbr},
+ 	{0, NULL},
+ };
+ 
+--- a/include/linux/msdos_partition.h
++++ b/include/linux/msdos_partition.h
+@@ -31,6 +31,7 @@ enum msdos_sys_ind {
+ 	LINUX_LVM_PARTITION = 0x8e,
+ 	LINUX_RAID_PARTITION = 0xfd,	/* autodetect RAID partition */
+ 
++	FIT_PARTITION = 0x2e,		/* U-Boot uImage.FIT */
+ 	SOLARIS_X86_PARTITION =	0x82,	/* also Linux swap partitions */
+ 	NEW_SOLARIS_X86_PARTITION = 0xbf,
+ 
diff --git a/target/linux/generic/hack-6.0/420-mtd-set-rootfs-to-be-root-dev.patch b/target/linux/generic/hack-6.0/420-mtd-set-rootfs-to-be-root-dev.patch
new file mode 100644
index 000000000..b1b2021e8
--- /dev/null
+++ b/target/linux/generic/hack-6.0/420-mtd-set-rootfs-to-be-root-dev.patch
@@ -0,0 +1,39 @@
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: kernel/3.1[02]: move MTD root device setup code to mtdcore
+
+The current code only allows to automatically set
+root device on MTD partitions. Move the code to MTD
+core to allow to use it with all MTD devices.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/mtd/mtdcore.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/drivers/mtd/mtdcore.c
++++ b/drivers/mtd/mtdcore.c
+@@ -27,6 +27,7 @@
+ #include <linux/reboot.h>
+ #include <linux/leds.h>
+ #include <linux/debugfs.h>
++#include <linux/root_dev.h>
+ #include <linux/nvmem-provider.h>
+ 
+ #include <linux/mtd/mtd.h>
+@@ -748,6 +749,16 @@ int add_mtd_device(struct mtd_info *mtd)
+ 	   of this try_ nonsense, and no bitching about it
+ 	   either. :) */
+ 	__module_get(THIS_MODULE);
++
++	if (!strcmp(mtd->name, "rootfs") &&
++	    IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) &&
++	    ROOT_DEV == 0) {
++		unsigned int index = mtd->index;
++		pr_notice("mtd: device %d (%s) set to be root filesystem\n",
++			  mtd->index, mtd->name);
++		ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, index);
++	}
++
+ 	return 0;
+ 
+ fail_nvmem_add:
diff --git a/target/linux/generic/hack-6.0/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch b/target/linux/generic/hack-6.0/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch
new file mode 100644
index 000000000..965a331a1
--- /dev/null
+++ b/target/linux/generic/hack-6.0/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch
@@ -0,0 +1,120 @@
+From 6fa9e3678eb002246df1280322b6a024853950a5 Mon Sep 17 00:00:00 2001
+From: Ansuel Smith <ansuelsmth@gmail.com>
+Date: Mon, 11 Oct 2021 00:53:14 +0200
+Subject: [PATCH] drivers: mtd: parsers: add nvmem support to cmdlinepart
+
+Assuming cmdlinepart is only one level deep partition scheme and that
+static partition are also defined in DTS, we can assign an of_node for
+partition declared from bootargs. cmdlinepart have priority than
+fiexed-partition parser so in this specific case the parser doesn't
+assign an of_node. Fix this by searching a defined of_node using a
+similar fixed_partition parser and if a partition is found with the same
+label, check that it has the same offset and size and return the DT
+of_node to correctly use NVMEM cells.
+
+Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+---
+ drivers/mtd/parsers/cmdlinepart.c | 71 +++++++++++++++++++++++++++++++
+ 1 file changed, 71 insertions(+)
+
+--- a/drivers/mtd/parsers/cmdlinepart.c
++++ b/drivers/mtd/parsers/cmdlinepart.c
+@@ -43,6 +43,7 @@
+ #include <linux/mtd/partitions.h>
+ #include <linux/module.h>
+ #include <linux/err.h>
++#include <linux/of.h>
+ 
+ /* debug macro */
+ #if 0
+@@ -323,6 +324,68 @@ static int mtdpart_setup_real(char *s)
+ 	return 0;
+ }
+ 
++static int search_fixed_partition(struct mtd_info *master,
++				  struct mtd_partition *target_part,
++				  struct mtd_partition *fixed_part)
++{
++	struct device_node *mtd_node;
++	struct device_node *ofpart_node;
++	struct device_node *pp;
++	struct mtd_partition part;
++	const char *partname;
++
++	mtd_node = mtd_get_of_node(master);
++	if (!mtd_node)
++		return -EINVAL;
++
++	ofpart_node = of_get_child_by_name(mtd_node, "partitions");
++
++	for_each_child_of_node(ofpart_node,  pp) {
++		const __be32 *reg;
++		int len;
++		int a_cells, s_cells;
++
++		reg = of_get_property(pp, "reg", &len);
++		if (!reg) {
++			pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n",
++				 master->name, pp,
++				 mtd_node);
++			continue;
++		}
++
++		a_cells = of_n_addr_cells(pp);
++		s_cells = of_n_size_cells(pp);
++		if (len / 4 != a_cells + s_cells) {
++			pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n",
++				 master->name, pp,
++				 mtd_node);
++			continue;
++		}
++
++		part.offset = of_read_number(reg, a_cells);
++		part.size = of_read_number(reg + a_cells, s_cells);
++		part.of_node = pp;
++
++		partname = of_get_property(pp, "label", &len);
++		if (!partname)
++			partname = of_get_property(pp, "name", &len);
++		part.name = partname;
++
++		if (!strncmp(target_part->name, part.name, len)) {
++			if (part.offset != target_part->offset)
++				return -EINVAL;
++
++			if (part.size != target_part->size)
++				return -EINVAL;
++
++			memcpy(fixed_part, &part, sizeof(struct mtd_partition));
++			return 0;
++		}
++	}
++
++	return -EINVAL;
++}
++
+ /*
+  * Main function to be called from the MTD mapping driver/device to
+  * obtain the partitioning information. At this point the command line
+@@ -338,6 +401,7 @@ static int parse_cmdline_partitions(stru
+ 	int i, err;
+ 	struct cmdline_mtd_partition *part;
+ 	const char *mtd_id = master->name;
++	struct mtd_partition fixed_part;
+ 
+ 	/* parse command line */
+ 	if (!cmdline_parsed) {
+@@ -382,6 +446,13 @@ static int parse_cmdline_partitions(stru
+ 				sizeof(*part->parts) * (part->num_parts - i));
+ 			i--;
+ 		}
++
++		err = search_fixed_partition(master, &part->parts[i], &fixed_part);
++		if (!err) {
++			part->parts[i].of_node = fixed_part.of_node;
++			pr_info("Found partition defined in DT for %s. Assigning OF node to support nvmem.",
++				part->parts[i].name);
++		}
+ 	}
+ 
+ 	*pparts = kmemdup(part->parts, sizeof(*part->parts) * part->num_parts,
diff --git a/target/linux/generic/hack-6.0/430-mtk-bmt-support.patch b/target/linux/generic/hack-6.0/430-mtk-bmt-support.patch
new file mode 100644
index 000000000..f782e07cd
--- /dev/null
+++ b/target/linux/generic/hack-6.0/430-mtk-bmt-support.patch
@@ -0,0 +1,23 @@
+--- a/drivers/mtd/nand/Kconfig
++++ b/drivers/mtd/nand/Kconfig
+@@ -61,6 +61,10 @@ config MTD_NAND_ECC_MEDIATEK
+ 	help
+ 	  This enables support for the hardware ECC engine from Mediatek.
+ 
++config MTD_NAND_MTK_BMT
++	bool "Support MediaTek NAND Bad-block Management Table"
++	default n
++
+ endmenu
+ 
+ endmenu
+--- a/drivers/mtd/nand/Makefile
++++ b/drivers/mtd/nand/Makefile
+@@ -3,6 +3,7 @@
+ nandcore-objs := core.o bbt.o
+ obj-$(CONFIG_MTD_NAND_CORE) += nandcore.o
+ obj-$(CONFIG_MTD_NAND_ECC_MEDIATEK) += ecc-mtk.o
++obj-$(CONFIG_MTD_NAND_MTK_BMT)	+= mtk_bmt.o mtk_bmt_v2.o mtk_bmt_bbt.o mtk_bmt_nmbm.o
+ 
+ obj-y	+= onenand/
+ obj-y	+= raw/
diff --git a/target/linux/generic/hack-6.0/531-debloat_lzma.patch b/target/linux/generic/hack-6.0/531-debloat_lzma.patch
new file mode 100644
index 000000000..2f70eee3e
--- /dev/null
+++ b/target/linux/generic/hack-6.0/531-debloat_lzma.patch
@@ -0,0 +1,1040 @@
+From 3fd297761ac246c54d7723c57fca95c112b99465 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 15 Jul 2017 21:15:44 +0200
+Subject: lzma: de-bloat the lzma library used by jffs2
+
+lede-commit: 3fd1dd08fbcbb78b34efefd32c3032e5c99108d6
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/lzma/LzFind.h  |  17 ---
+ include/linux/lzma/LzmaDec.h | 101 ---------------
+ include/linux/lzma/LzmaEnc.h |  20 ---
+ lib/lzma/LzFind.c            | 287 ++++---------------------------------------
+ lib/lzma/LzmaDec.c           |  86 +------------
+ lib/lzma/LzmaEnc.c           | 172 ++------------------------
+ 6 files changed, 42 insertions(+), 641 deletions(-)
+
+--- a/include/linux/lzma/LzFind.h
++++ b/include/linux/lzma/LzFind.h
+@@ -55,11 +55,6 @@ typedef struct _CMatchFinder
+ 
+ #define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
+ 
+-int MatchFinder_NeedMove(CMatchFinder *p);
+-Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
+-void MatchFinder_MoveBlock(CMatchFinder *p);
+-void MatchFinder_ReadIfRequired(CMatchFinder *p);
+-
+ void MatchFinder_Construct(CMatchFinder *p);
+ 
+ /* Conditions:
+@@ -70,12 +65,6 @@ int MatchFinder_Create(CMatchFinder *p,
+     UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
+     ISzAlloc *alloc);
+ void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
+-void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
+-void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
+-
+-UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
+-    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
+-    UInt32 *distances, UInt32 maxLen);
+ 
+ /*
+ Conditions:
+@@ -102,12 +91,6 @@ typedef struct _IMatchFinder
+ 
+ void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
+ 
+-void MatchFinder_Init(CMatchFinder *p);
+-UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
+-UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
+-void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
+-void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
+-
+ #ifdef __cplusplus
+ }
+ #endif
+--- a/include/linux/lzma/LzmaDec.h
++++ b/include/linux/lzma/LzmaDec.h
+@@ -31,14 +31,6 @@ typedef struct _CLzmaProps
+   UInt32 dicSize;
+ } CLzmaProps;
+ 
+-/* LzmaProps_Decode - decodes properties
+-Returns:
+-  SZ_OK
+-  SZ_ERROR_UNSUPPORTED - Unsupported properties
+-*/
+-
+-SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
+-
+ 
+ /* ---------- LZMA Decoder state ---------- */
+ 
+@@ -70,8 +62,6 @@ typedef struct
+ 
+ #define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
+ 
+-void LzmaDec_Init(CLzmaDec *p);
+-
+ /* There are two types of LZMA streams:
+      0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
+      1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
+@@ -108,97 +98,6 @@ typedef enum
+ 
+ /* ELzmaStatus is used only as output value for function call */
+ 
+-
+-/* ---------- Interfaces ---------- */
+-
+-/* There are 3 levels of interfaces:
+-     1) Dictionary Interface
+-     2) Buffer Interface
+-     3) One Call Interface
+-   You can select any of these interfaces, but don't mix functions from different
+-   groups for same object. */
+-
+-
+-/* There are two variants to allocate state for Dictionary Interface:
+-     1) LzmaDec_Allocate / LzmaDec_Free
+-     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
+-   You can use variant 2, if you set dictionary buffer manually.
+-   For Buffer Interface you must always use variant 1.
+-
+-LzmaDec_Allocate* can return:
+-  SZ_OK
+-  SZ_ERROR_MEM         - Memory allocation error
+-  SZ_ERROR_UNSUPPORTED - Unsupported properties
+-*/
+-
+-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
+-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
+-
+-SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
+-void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
+-
+-/* ---------- Dictionary Interface ---------- */
+-
+-/* You can use it, if you want to eliminate the overhead for data copying from
+-   dictionary to some other external buffer.
+-   You must work with CLzmaDec variables directly in this interface.
+-
+-   STEPS:
+-     LzmaDec_Constr()
+-     LzmaDec_Allocate()
+-     for (each new stream)
+-     {
+-       LzmaDec_Init()
+-       while (it needs more decompression)
+-       {
+-         LzmaDec_DecodeToDic()
+-         use data from CLzmaDec::dic and update CLzmaDec::dicPos
+-       }
+-     }
+-     LzmaDec_Free()
+-*/
+-
+-/* LzmaDec_DecodeToDic
+-
+-   The decoding to internal dictionary buffer (CLzmaDec::dic).
+-   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
+-
+-finishMode:
+-  It has meaning only if the decoding reaches output limit (dicLimit).
+-  LZMA_FINISH_ANY - Decode just dicLimit bytes.
+-  LZMA_FINISH_END - Stream must be finished after dicLimit.
+-
+-Returns:
+-  SZ_OK
+-    status:
+-      LZMA_STATUS_FINISHED_WITH_MARK
+-      LZMA_STATUS_NOT_FINISHED
+-      LZMA_STATUS_NEEDS_MORE_INPUT
+-      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
+-  SZ_ERROR_DATA - Data error
+-*/
+-
+-SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
+-    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
+-
+-
+-/* ---------- Buffer Interface ---------- */
+-
+-/* It's zlib-like interface.
+-   See LzmaDec_DecodeToDic description for information about STEPS and return results,
+-   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
+-   to work with CLzmaDec variables manually.
+-
+-finishMode:
+-  It has meaning only if the decoding reaches output limit (*destLen).
+-  LZMA_FINISH_ANY - Decode just destLen bytes.
+-  LZMA_FINISH_END - Stream must be finished after (*destLen).
+-*/
+-
+-SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
+-    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
+-
+-
+ /* ---------- One Call Interface ---------- */
+ 
+ /* LzmaDecode
+--- a/include/linux/lzma/LzmaEnc.h
++++ b/include/linux/lzma/LzmaEnc.h
+@@ -31,9 +31,6 @@ typedef struct _CLzmaEncProps
+ } CLzmaEncProps;
+ 
+ void LzmaEncProps_Init(CLzmaEncProps *p);
+-void LzmaEncProps_Normalize(CLzmaEncProps *p);
+-UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
+-
+ 
+ /* ---------- CLzmaEncHandle Interface ---------- */
+ 
+@@ -53,26 +50,9 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *
+ void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
+ SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
+ SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
+-SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
+-    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
+ SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
+     int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
+ 
+-/* ---------- One Call Interface ---------- */
+-
+-/* LzmaEncode
+-Return code:
+-  SZ_OK               - OK
+-  SZ_ERROR_MEM        - Memory allocation error
+-  SZ_ERROR_PARAM      - Incorrect paramater
+-  SZ_ERROR_OUTPUT_EOF - output buffer overflow
+-  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)
+-*/
+-
+-SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
+-    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
+-    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
+-
+ #ifdef __cplusplus
+ }
+ #endif
+--- a/lib/lzma/LzFind.c
++++ b/lib/lzma/LzFind.c
+@@ -14,9 +14,15 @@
+ 
+ #define kStartMaxLen 3
+ 
++#if 0
++#define DIRECT_INPUT	p->directInput
++#else
++#define DIRECT_INPUT	1
++#endif
++
+ static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
+ {
+-  if (!p->directInput)
++  if (!DIRECT_INPUT)
+   {
+     alloc->Free(alloc, p->bufferBase);
+     p->bufferBase = 0;
+@@ -28,7 +34,7 @@ static void LzInWindow_Free(CMatchFinder
+ static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)
+ {
+   UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
+-  if (p->directInput)
++  if (DIRECT_INPUT)
+   {
+     p->blockSize = blockSize;
+     return 1;
+@@ -42,12 +48,12 @@ static int LzInWindow_Create(CMatchFinde
+   return (p->bufferBase != 0);
+ }
+ 
+-Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
+-Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
++static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
++static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
+ 
+-UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
++static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
+ 
+-void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
++static void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
+ {
+   p->posLimit -= subValue;
+   p->pos -= subValue;
+@@ -58,7 +64,7 @@ static void MatchFinder_ReadBlock(CMatch
+ {
+   if (p->streamEndWasReached || p->result != SZ_OK)
+     return;
+-  if (p->directInput)
++  if (DIRECT_INPUT)
+   {
+     UInt32 curSize = 0xFFFFFFFF - p->streamPos;
+     if (curSize > p->directInputRem)
+@@ -89,7 +95,7 @@ static void MatchFinder_ReadBlock(CMatch
+   }
+ }
+ 
+-void MatchFinder_MoveBlock(CMatchFinder *p)
++static void MatchFinder_MoveBlock(CMatchFinder *p)
+ {
+   memmove(p->bufferBase,
+     p->buffer - p->keepSizeBefore,
+@@ -97,22 +103,14 @@ void MatchFinder_MoveBlock(CMatchFinder
+   p->buffer = p->bufferBase + p->keepSizeBefore;
+ }
+ 
+-int MatchFinder_NeedMove(CMatchFinder *p)
++static int MatchFinder_NeedMove(CMatchFinder *p)
+ {
+-  if (p->directInput)
++  if (DIRECT_INPUT)
+     return 0;
+   /* if (p->streamEndWasReached) return 0; */
+   return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
+ }
+ 
+-void MatchFinder_ReadIfRequired(CMatchFinder *p)
+-{
+-  if (p->streamEndWasReached)
+-    return;
+-  if (p->keepSizeAfter >= p->streamPos - p->pos)
+-    MatchFinder_ReadBlock(p);
+-}
+-
+ static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
+ {
+   if (MatchFinder_NeedMove(p))
+@@ -268,7 +266,7 @@ static void MatchFinder_SetLimits(CMatch
+   p->posLimit = p->pos + limit;
+ }
+ 
+-void MatchFinder_Init(CMatchFinder *p)
++static void MatchFinder_Init(CMatchFinder *p)
+ {
+   UInt32 i;
+   for (i = 0; i < p->hashSizeSum; i++)
+@@ -287,7 +285,7 @@ static UInt32 MatchFinder_GetSubValue(CM
+   return (p->pos - p->historySize - 1) & kNormalizeMask;
+ }
+ 
+-void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
++static void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
+ {
+   UInt32 i;
+   for (i = 0; i < numItems; i++)
+@@ -319,38 +317,7 @@ static void MatchFinder_CheckLimits(CMat
+   MatchFinder_SetLimits(p);
+ }
+ 
+-static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
+-    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
+-    UInt32 *distances, UInt32 maxLen)
+-{
+-  son[_cyclicBufferPos] = curMatch;
+-  for (;;)
+-  {
+-    UInt32 delta = pos - curMatch;
+-    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
+-      return distances;
+-    {
+-      const Byte *pb = cur - delta;
+-      curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
+-      if (pb[maxLen] == cur[maxLen] && *pb == *cur)
+-      {
+-        UInt32 len = 0;
+-        while (++len != lenLimit)
+-          if (pb[len] != cur[len])
+-            break;
+-        if (maxLen < len)
+-        {
+-          *distances++ = maxLen = len;
+-          *distances++ = delta - 1;
+-          if (len == lenLimit)
+-            return distances;
+-        }
+-      }
+-    }
+-  }
+-}
+-
+-UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
++static UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
+     UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
+     UInt32 *distances, UInt32 maxLen)
+ {
+@@ -460,10 +427,10 @@ static void SkipMatchesSpec(UInt32 lenLi
+   p->buffer++; \
+   if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
+ 
+-#define MOVE_POS_RET MOVE_POS return offset;
+-
+ static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
+ 
++#define MOVE_POS_RET MatchFinder_MovePos(p); return offset;
++
+ #define GET_MATCHES_HEADER2(minLen, ret_op) \
+   UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \
+   lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
+@@ -479,62 +446,7 @@ static void MatchFinder_MovePos(CMatchFi
+   distances + offset, maxLen) - distances); MOVE_POS_RET;
+ 
+ #define SKIP_FOOTER \
+-  SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
+-
+-static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+-{
+-  UInt32 offset;
+-  GET_MATCHES_HEADER(2)
+-  HASH2_CALC;
+-  curMatch = p->hash[hashValue];
+-  p->hash[hashValue] = p->pos;
+-  offset = 0;
+-  GET_MATCHES_FOOTER(offset, 1)
+-}
+-
+-UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+-{
+-  UInt32 offset;
+-  GET_MATCHES_HEADER(3)
+-  HASH_ZIP_CALC;
+-  curMatch = p->hash[hashValue];
+-  p->hash[hashValue] = p->pos;
+-  offset = 0;
+-  GET_MATCHES_FOOTER(offset, 2)
+-}
+-
+-static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+-{
+-  UInt32 hash2Value, delta2, maxLen, offset;
+-  GET_MATCHES_HEADER(3)
+-
+-  HASH3_CALC;
+-
+-  delta2 = p->pos - p->hash[hash2Value];
+-  curMatch = p->hash[kFix3HashSize + hashValue];
+-
+-  p->hash[hash2Value] =
+-  p->hash[kFix3HashSize + hashValue] = p->pos;
+-
+-
+-  maxLen = 2;
+-  offset = 0;
+-  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
+-  {
+-    for (; maxLen != lenLimit; maxLen++)
+-      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
+-        break;
+-    distances[0] = maxLen;
+-    distances[1] = delta2 - 1;
+-    offset = 2;
+-    if (maxLen == lenLimit)
+-    {
+-      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
+-      MOVE_POS_RET;
+-    }
+-  }
+-  GET_MATCHES_FOOTER(offset, maxLen)
+-}
++  SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MatchFinder_MovePos(p);
+ 
+ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+ {
+@@ -583,108 +495,6 @@ static UInt32 Bt4_MatchFinder_GetMatches
+   GET_MATCHES_FOOTER(offset, maxLen)
+ }
+ 
+-static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+-{
+-  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
+-  GET_MATCHES_HEADER(4)
+-
+-  HASH4_CALC;
+-
+-  delta2 = p->pos - p->hash[                hash2Value];
+-  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
+-  curMatch = p->hash[kFix4HashSize + hashValue];
+-
+-  p->hash[                hash2Value] =
+-  p->hash[kFix3HashSize + hash3Value] =
+-  p->hash[kFix4HashSize + hashValue] = p->pos;
+-
+-  maxLen = 1;
+-  offset = 0;
+-  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
+-  {
+-    distances[0] = maxLen = 2;
+-    distances[1] = delta2 - 1;
+-    offset = 2;
+-  }
+-  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
+-  {
+-    maxLen = 3;
+-    distances[offset + 1] = delta3 - 1;
+-    offset += 2;
+-    delta2 = delta3;
+-  }
+-  if (offset != 0)
+-  {
+-    for (; maxLen != lenLimit; maxLen++)
+-      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
+-        break;
+-    distances[offset - 2] = maxLen;
+-    if (maxLen == lenLimit)
+-    {
+-      p->son[p->cyclicBufferPos] = curMatch;
+-      MOVE_POS_RET;
+-    }
+-  }
+-  if (maxLen < 3)
+-    maxLen = 3;
+-  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
+-    distances + offset, maxLen) - (distances));
+-  MOVE_POS_RET
+-}
+-
+-UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+-{
+-  UInt32 offset;
+-  GET_MATCHES_HEADER(3)
+-  HASH_ZIP_CALC;
+-  curMatch = p->hash[hashValue];
+-  p->hash[hashValue] = p->pos;
+-  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
+-    distances, 2) - (distances));
+-  MOVE_POS_RET
+-}
+-
+-static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-{
+-  do
+-  {
+-    SKIP_HEADER(2)
+-    HASH2_CALC;
+-    curMatch = p->hash[hashValue];
+-    p->hash[hashValue] = p->pos;
+-    SKIP_FOOTER
+-  }
+-  while (--num != 0);
+-}
+-
+-void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-{
+-  do
+-  {
+-    SKIP_HEADER(3)
+-    HASH_ZIP_CALC;
+-    curMatch = p->hash[hashValue];
+-    p->hash[hashValue] = p->pos;
+-    SKIP_FOOTER
+-  }
+-  while (--num != 0);
+-}
+-
+-static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-{
+-  do
+-  {
+-    UInt32 hash2Value;
+-    SKIP_HEADER(3)
+-    HASH3_CALC;
+-    curMatch = p->hash[kFix3HashSize + hashValue];
+-    p->hash[hash2Value] =
+-    p->hash[kFix3HashSize + hashValue] = p->pos;
+-    SKIP_FOOTER
+-  }
+-  while (--num != 0);
+-}
+-
+ static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+ {
+   do
+@@ -701,61 +511,12 @@ static void Bt4_MatchFinder_Skip(CMatchF
+   while (--num != 0);
+ }
+ 
+-static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-{
+-  do
+-  {
+-    UInt32 hash2Value, hash3Value;
+-    SKIP_HEADER(4)
+-    HASH4_CALC;
+-    curMatch = p->hash[kFix4HashSize + hashValue];
+-    p->hash[                hash2Value] =
+-    p->hash[kFix3HashSize + hash3Value] =
+-    p->hash[kFix4HashSize + hashValue] = p->pos;
+-    p->son[p->cyclicBufferPos] = curMatch;
+-    MOVE_POS
+-  }
+-  while (--num != 0);
+-}
+-
+-void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-{
+-  do
+-  {
+-    SKIP_HEADER(3)
+-    HASH_ZIP_CALC;
+-    curMatch = p->hash[hashValue];
+-    p->hash[hashValue] = p->pos;
+-    p->son[p->cyclicBufferPos] = curMatch;
+-    MOVE_POS
+-  }
+-  while (--num != 0);
+-}
+-
+ void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)
+ {
+   vTable->Init = (Mf_Init_Func)MatchFinder_Init;
+   vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;
+   vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
+   vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
+-  if (!p->btMode)
+-  {
+-    vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
+-    vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
+-  }
+-  else if (p->numHashBytes == 2)
+-  {
+-    vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
+-    vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
+-  }
+-  else if (p->numHashBytes == 3)
+-  {
+-    vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
+-    vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
+-  }
+-  else
+-  {
+-    vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
+-    vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
+-  }
++  vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
++  vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
+ }
+--- a/lib/lzma/LzmaDec.c
++++ b/lib/lzma/LzmaDec.c
+@@ -682,7 +682,7 @@ static void LzmaDec_InitRc(CLzmaDec *p,
+   p->needFlush = 0;
+ }
+ 
+-void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
++static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
+ {
+   p->needFlush = 1;
+   p->remainLen = 0;
+@@ -698,7 +698,7 @@ void LzmaDec_InitDicAndState(CLzmaDec *p
+     p->needInitState = 1;
+ }
+ 
+-void LzmaDec_Init(CLzmaDec *p)
++static void LzmaDec_Init(CLzmaDec *p)
+ {
+   p->dicPos = 0;
+   LzmaDec_InitDicAndState(p, True, True);
+@@ -716,7 +716,7 @@ static void LzmaDec_InitStateReal(CLzmaD
+   p->needInitState = 0;
+ }
+ 
+-SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
++static SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
+     ELzmaFinishMode finishMode, ELzmaStatus *status)
+ {
+   SizeT inSize = *srcLen;
+@@ -837,65 +837,13 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, Si
+   return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
+ }
+ 
+-SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
+-{
+-  SizeT outSize = *destLen;
+-  SizeT inSize = *srcLen;
+-  *srcLen = *destLen = 0;
+-  for (;;)
+-  {
+-    SizeT inSizeCur = inSize, outSizeCur, dicPos;
+-    ELzmaFinishMode curFinishMode;
+-    SRes res;
+-    if (p->dicPos == p->dicBufSize)
+-      p->dicPos = 0;
+-    dicPos = p->dicPos;
+-    if (outSize > p->dicBufSize - dicPos)
+-    {
+-      outSizeCur = p->dicBufSize;
+-      curFinishMode = LZMA_FINISH_ANY;
+-    }
+-    else
+-    {
+-      outSizeCur = dicPos + outSize;
+-      curFinishMode = finishMode;
+-    }
+-
+-    res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
+-    src += inSizeCur;
+-    inSize -= inSizeCur;
+-    *srcLen += inSizeCur;
+-    outSizeCur = p->dicPos - dicPos;
+-    memcpy(dest, p->dic + dicPos, outSizeCur);
+-    dest += outSizeCur;
+-    outSize -= outSizeCur;
+-    *destLen += outSizeCur;
+-    if (res != 0)
+-      return res;
+-    if (outSizeCur == 0 || outSize == 0)
+-      return SZ_OK;
+-  }
+-}
+-
+-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
++static void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
+ {
+   alloc->Free(alloc, p->probs);
+   p->probs = 0;
+ }
+ 
+-static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
+-{
+-  alloc->Free(alloc, p->dic);
+-  p->dic = 0;
+-}
+-
+-void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
+-{
+-  LzmaDec_FreeProbs(p, alloc);
+-  LzmaDec_FreeDict(p, alloc);
+-}
+-
+-SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
++static SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
+ {
+   UInt32 dicSize;
+   Byte d;
+@@ -935,7 +883,7 @@ static SRes LzmaDec_AllocateProbs2(CLzma
+   return SZ_OK;
+ }
+ 
+-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
++static SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
+ {
+   CLzmaProps propNew;
+   RINOK(LzmaProps_Decode(&propNew, props, propsSize));
+@@ -943,28 +891,6 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p,
+   p->prop = propNew;
+   return SZ_OK;
+ }
+-
+-SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
+-{
+-  CLzmaProps propNew;
+-  SizeT dicBufSize;
+-  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
+-  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
+-  dicBufSize = propNew.dicSize;
+-  if (p->dic == 0 || dicBufSize != p->dicBufSize)
+-  {
+-    LzmaDec_FreeDict(p, alloc);
+-    p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
+-    if (p->dic == 0)
+-    {
+-      LzmaDec_FreeProbs(p, alloc);
+-      return SZ_ERROR_MEM;
+-    }
+-  }
+-  p->dicBufSize = dicBufSize;
+-  p->prop = propNew;
+-  return SZ_OK;
+-}
+ 
+ SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
+     const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
+--- a/lib/lzma/LzmaEnc.c
++++ b/lib/lzma/LzmaEnc.c
+@@ -53,7 +53,7 @@ void LzmaEncProps_Init(CLzmaEncProps *p)
+   p->writeEndMark = 0;
+ }
+ 
+-void LzmaEncProps_Normalize(CLzmaEncProps *p)
++static void LzmaEncProps_Normalize(CLzmaEncProps *p)
+ {
+   int level = p->level;
+   if (level < 0) level = 5;
+@@ -76,7 +76,7 @@ void LzmaEncProps_Normalize(CLzmaEncProp
+       #endif
+ }
+ 
+-UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
++static UInt32 __maybe_unused LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
+ {
+   CLzmaEncProps props = *props2;
+   LzmaEncProps_Normalize(&props);
+@@ -93,7 +93,7 @@ UInt32 LzmaEncProps_GetDictSize(const CL
+ 
+ #define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
+ 
+-UInt32 GetPosSlot1(UInt32 pos)
++static UInt32 GetPosSlot1(UInt32 pos)
+ {
+   UInt32 res;
+   BSR2_RET(pos, res);
+@@ -107,7 +107,7 @@ UInt32 GetPosSlot1(UInt32 pos)
+ #define kNumLogBits (9 + (int)sizeof(size_t) / 2)
+ #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
+ 
+-void LzmaEnc_FastPosInit(Byte *g_FastPos)
++static void LzmaEnc_FastPosInit(Byte *g_FastPos)
+ {
+   int c = 2, slotFast;
+   g_FastPos[0] = 0;
+@@ -339,58 +339,6 @@ typedef struct
+   CSaveState saveState;
+ } CLzmaEnc;
+ 
+-void LzmaEnc_SaveState(CLzmaEncHandle pp)
+-{
+-  CLzmaEnc *p = (CLzmaEnc *)pp;
+-  CSaveState *dest = &p->saveState;
+-  int i;
+-  dest->lenEnc = p->lenEnc;
+-  dest->repLenEnc = p->repLenEnc;
+-  dest->state = p->state;
+-
+-  for (i = 0; i < kNumStates; i++)
+-  {
+-    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
+-    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
+-  }
+-  for (i = 0; i < kNumLenToPosStates; i++)
+-    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
+-  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
+-  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
+-  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
+-  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
+-  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
+-  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
+-  memcpy(dest->reps, p->reps, sizeof(p->reps));
+-  memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
+-}
+-
+-void LzmaEnc_RestoreState(CLzmaEncHandle pp)
+-{
+-  CLzmaEnc *dest = (CLzmaEnc *)pp;
+-  const CSaveState *p = &dest->saveState;
+-  int i;
+-  dest->lenEnc = p->lenEnc;
+-  dest->repLenEnc = p->repLenEnc;
+-  dest->state = p->state;
+-
+-  for (i = 0; i < kNumStates; i++)
+-  {
+-    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
+-    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
+-  }
+-  for (i = 0; i < kNumLenToPosStates; i++)
+-    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
+-  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
+-  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
+-  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
+-  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
+-  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
+-  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
+-  memcpy(dest->reps, p->reps, sizeof(p->reps));
+-  memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));
+-}
+-
+ SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)
+ {
+   CLzmaEnc *p = (CLzmaEnc *)pp;
+@@ -600,7 +548,7 @@ static void LitEnc_EncodeMatched(CRangeE
+   while (symbol < 0x10000);
+ }
+ 
+-void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
++static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
+ {
+   UInt32 i;
+   for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
+@@ -1676,7 +1624,7 @@ static void FillDistancesPrices(CLzmaEnc
+   p->matchPriceCount = 0;
+ }
+ 
+-void LzmaEnc_Construct(CLzmaEnc *p)
++static void LzmaEnc_Construct(CLzmaEnc *p)
+ {
+   RangeEnc_Construct(&p->rc);
+   MatchFinder_Construct(&p->matchFinderBase);
+@@ -1709,7 +1657,7 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *
+   return p;
+ }
+ 
+-void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
++static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
+ {
+   alloc->Free(alloc, p->litProbs);
+   alloc->Free(alloc, p->saveState.litProbs);
+@@ -1717,7 +1665,7 @@ void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAl
+   p->saveState.litProbs = 0;
+ }
+ 
+-void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
++static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
+ {
+   #ifndef _7ZIP_ST
+   MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);
+@@ -1947,7 +1895,7 @@ static SRes LzmaEnc_Alloc(CLzmaEnc *p, U
+   return SZ_OK;
+ }
+ 
+-void LzmaEnc_Init(CLzmaEnc *p)
++static void LzmaEnc_Init(CLzmaEnc *p)
+ {
+   UInt32 i;
+   p->state = 0;
+@@ -2005,7 +1953,7 @@ void LzmaEnc_Init(CLzmaEnc *p)
+   p->lpMask = (1 << p->lp) - 1;
+ }
+ 
+-void LzmaEnc_InitPrices(CLzmaEnc *p)
++static void LzmaEnc_InitPrices(CLzmaEnc *p)
+ {
+   if (!p->fastMode)
+   {
+@@ -2037,26 +1985,6 @@ static SRes LzmaEnc_AllocAndInit(CLzmaEn
+   return SZ_OK;
+ }
+ 
+-static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,
+-    ISzAlloc *alloc, ISzAlloc *allocBig)
+-{
+-  CLzmaEnc *p = (CLzmaEnc *)pp;
+-  p->matchFinderBase.stream = inStream;
+-  p->needInit = 1;
+-  p->rc.outStream = outStream;
+-  return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);
+-}
+-
+-SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,
+-    ISeqInStream *inStream, UInt32 keepWindowSize,
+-    ISzAlloc *alloc, ISzAlloc *allocBig)
+-{
+-  CLzmaEnc *p = (CLzmaEnc *)pp;
+-  p->matchFinderBase.stream = inStream;
+-  p->needInit = 1;
+-  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
+-}
+-
+ static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)
+ {
+   p->matchFinderBase.directInput = 1;
+@@ -2064,7 +1992,7 @@ static void LzmaEnc_SetInputBuf(CLzmaEnc
+   p->matchFinderBase.directInputRem = srcLen;
+ }
+ 
+-SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
++static SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
+     UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
+ {
+   CLzmaEnc *p = (CLzmaEnc *)pp;
+@@ -2074,7 +2002,7 @@ SRes LzmaEnc_MemPrepare(CLzmaEncHandle p
+   return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
+ }
+ 
+-void LzmaEnc_Finish(CLzmaEncHandle pp)
++static void LzmaEnc_Finish(CLzmaEncHandle pp)
+ {
+   #ifndef _7ZIP_ST
+   CLzmaEnc *p = (CLzmaEnc *)pp;
+@@ -2107,53 +2035,6 @@ static size_t MyWrite(void *pp, const vo
+   return size;
+ }
+ 
+-
+-UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
+-{
+-  const CLzmaEnc *p = (CLzmaEnc *)pp;
+-  return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
+-}
+-
+-const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)
+-{
+-  const CLzmaEnc *p = (CLzmaEnc *)pp;
+-  return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
+-}
+-
+-SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
+-    Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
+-{
+-  CLzmaEnc *p = (CLzmaEnc *)pp;
+-  UInt64 nowPos64;
+-  SRes res;
+-  CSeqOutStreamBuf outStream;
+-
+-  outStream.funcTable.Write = MyWrite;
+-  outStream.data = dest;
+-  outStream.rem = *destLen;
+-  outStream.overflow = False;
+-
+-  p->writeEndMark = False;
+-  p->finished = False;
+-  p->result = SZ_OK;
+-
+-  if (reInit)
+-    LzmaEnc_Init(p);
+-  LzmaEnc_InitPrices(p);
+-  nowPos64 = p->nowPos64;
+-  RangeEnc_Init(&p->rc);
+-  p->rc.outStream = &outStream.funcTable;
+-
+-  res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);
+-
+-  *unpackSize = (UInt32)(p->nowPos64 - nowPos64);
+-  *destLen -= outStream.rem;
+-  if (outStream.overflow)
+-    return SZ_ERROR_OUTPUT_EOF;
+-
+-  return res;
+-}
+-
+ static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)
+ {
+   SRes res = SZ_OK;
+@@ -2184,13 +2065,6 @@ static SRes LzmaEnc_Encode2(CLzmaEnc *p,
+   return res;
+ }
+ 
+-SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,
+-    ISzAlloc *alloc, ISzAlloc *allocBig)
+-{
+-  RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));
+-  return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);
+-}
+-
+ SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)
+ {
+   CLzmaEnc *p = (CLzmaEnc *)pp;
+@@ -2247,25 +2121,3 @@ SRes LzmaEnc_MemEncode(CLzmaEncHandle pp
+     return SZ_ERROR_OUTPUT_EOF;
+   return res;
+ }
+-
+-SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
+-    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
+-    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
+-{
+-  CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);
+-  SRes res;
+-  if (p == 0)
+-    return SZ_ERROR_MEM;
+-
+-  res = LzmaEnc_SetProps(p, props);
+-  if (res == SZ_OK)
+-  {
+-    res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);
+-    if (res == SZ_OK)
+-      res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,
+-          writeEndMark, progress, alloc, allocBig);
+-  }
+-
+-  LzmaEnc_Destroy(p, alloc, allocBig);
+-  return res;
+-}
diff --git a/target/linux/generic/hack-6.0/640-bridge-only-accept-EAP-locally.patch b/target/linux/generic/hack-6.0/640-bridge-only-accept-EAP-locally.patch
new file mode 100644
index 000000000..2356c58a5
--- /dev/null
+++ b/target/linux/generic/hack-6.0/640-bridge-only-accept-EAP-locally.patch
@@ -0,0 +1,41 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:18:54 +0200
+Subject: bridge: only accept EAP locally
+
+When bridging, do not forward EAP frames to other ports, only deliver
+them locally, regardless of the state.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+[add disable_eap_hack sysfs attribute]
+Signed-off-by: Etienne Champetier <champetier.etienne@gmail.com>
+---
+
+--- a/net/bridge/br_input.c
++++ b/net/bridge/br_input.c
+@@ -133,10 +133,14 @@ int br_handle_frame_finish(struct net *n
+ 		}
+ 	}
+ 
++	BR_INPUT_SKB_CB(skb)->brdev = br->dev;
++
++	if (skb->protocol == htons(ETH_P_PAE) && !br->disable_eap_hack)
++		return br_pass_frame_up(skb);
++
+ 	if (state == BR_STATE_LEARNING)
+ 		goto drop;
+ 
+-	BR_INPUT_SKB_CB(skb)->brdev = br->dev;
+ 	BR_INPUT_SKB_CB(skb)->src_port_isolated = !!(p->flags & BR_ISOLATED);
+ 
+ 	if (IS_ENABLED(CONFIG_INET) &&
+--- a/net/bridge/br_private.h
++++ b/net/bridge/br_private.h
+@@ -482,6 +482,8 @@ struct net_bridge {
+ 	u16				group_fwd_mask;
+ 	u16				group_fwd_mask_required;
+ 
++	bool				disable_eap_hack;
++
+ 	/* STP */
+ 	bridge_id			designated_root;
+ 	bridge_id			bridge_id;
diff --git a/target/linux/generic/hack-6.0/645-netfilter-connmark-introduce-set-dscpmark.patch b/target/linux/generic/hack-6.0/645-netfilter-connmark-introduce-set-dscpmark.patch
new file mode 100644
index 000000000..2d3fe01a7
--- /dev/null
+++ b/target/linux/generic/hack-6.0/645-netfilter-connmark-introduce-set-dscpmark.patch
@@ -0,0 +1,212 @@
+From eda40b8c8c82e0f2789d6bc8bf63846dce2e8f32 Mon Sep 17 00:00:00 2001
+From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
+Date: Sat, 23 Mar 2019 09:29:49 +0000
+Subject: [PATCH] netfilter: connmark: introduce set-dscpmark
+
+set-dscpmark is a method of storing the DSCP of an ip packet into
+conntrack mark.  In combination with a suitable tc filter action
+(act_ctinfo) DSCP values are able to be stored in the mark on egress and
+restored on ingress across links that otherwise alter or bleach DSCP.
+
+This is useful for qdiscs such as CAKE which are able to shape according
+to policies based on DSCP.
+
+Ingress classification is traditionally a challenging task since
+iptables rules haven't yet run and tc filter/eBPF programs are pre-NAT
+lookups, hence are unable to see internal IPv4 addresses as used on the
+typical home masquerading gateway.
+
+x_tables CONNMARK set-dscpmark target solves the problem of storing the
+DSCP to the conntrack mark in a way suitable for the new act_ctinfo tc
+action to restore.
+
+The set-dscpmark option accepts 2 parameters, a 32bit 'dscpmask' and a
+32bit 'statemask'.  The dscp mask must be 6 contiguous bits and
+represents the area where the DSCP will be stored in the connmark.  The
+state mask is a minimum 1 bit length mask that must not overlap with the
+dscpmask.  It represents a flag which is set when the DSCP has been
+stored in the conntrack mark. This is useful to implement a 'one shot'
+iptables based classification where the 'complicated' iptables rules are
+only run once to classify the connection on initial (egress) packet and
+subsequent packets are all marked/restored with the same DSCP.  A state
+mask of zero disables the setting of a status bit/s.
+
+example syntax with a suitably modified iptables user space application:
+
+iptables -A QOS_MARK_eth0 -t mangle -j CONNMARK --set-dscpmark 0xfc000000/0x01000000
+
+Would store the DSCP in the top 6 bits of the 32bit mark field, and use
+the LSB of the top byte as the 'DSCP has been stored' marker.
+
+|----0xFC----conntrack mark----000000---|
+| Bits 31-26 | bit 25 | bit24 |~~~ Bit 0|
+| DSCP       | unused | flag  |unused   |
+|-----------------------0x01---000000---|
+      ^                   ^
+      |                   |
+      ---|             Conditional flag
+         |             set this when dscp
+|-ip diffserv-|        stored in mark
+| 6 bits      |
+|-------------|
+
+an identically configured tc action to restore looks like:
+
+tc filter show dev eth0 ingress
+filter parent ffff: protocol all pref 10 u32 chain 0
+filter parent ffff: protocol all pref 10 u32 chain 0 fh 800: ht divisor 1
+filter parent ffff: protocol all pref 10 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1: not_in_hw
+  match 00000000/00000000 at 0
+	action order 1: ctinfo zone 0 pipe
+	 index 2 ref 1 bind 1 dscp 0xfc000000/0x1000000
+
+	action order 2: mirred (Egress Redirect to device ifb4eth0) stolen
+	index 1 ref 1 bind 1
+
+|----0xFC----conntrack mark----000000---|
+| Bits 31-26 | bit 25 | bit24 |~~~ Bit 0|
+| DSCP       | unused | flag  |unused   |
+|-----------------------0x01---000000---|
+      |                   |
+      |                   |
+      ---|             Conditional flag
+         v             only restore if set
+|-ip diffserv-|
+| 6 bits      |
+|-------------|
+
+Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
+---
+ include/uapi/linux/netfilter/xt_connmark.h | 10 ++++
+ net/netfilter/xt_connmark.c                | 55 ++++++++++++++++++----
+ 2 files changed, 57 insertions(+), 8 deletions(-)
+
+--- a/include/uapi/linux/netfilter/xt_connmark.h
++++ b/include/uapi/linux/netfilter/xt_connmark.h
+@@ -20,6 +20,11 @@ enum {
+ };
+ 
+ enum {
++	XT_CONNMARK_VALUE =	(1 << 0),
++	XT_CONNMARK_DSCP = 	(1 << 1)
++};
++
++enum {
+ 	D_SHIFT_LEFT = 0,
+ 	D_SHIFT_RIGHT,
+ };
+@@ -34,6 +39,11 @@ struct xt_connmark_tginfo2 {
+ 	__u8 shift_dir, shift_bits, mode;
+ };
+ 
++struct xt_connmark_tginfo3 {
++	__u32 ctmark, ctmask, nfmask;
++	__u8 shift_dir, shift_bits, mode, func;
++};
++
+ struct xt_connmark_mtinfo1 {
+ 	__u32 mark, mask;
+ 	__u8 invert;
+--- a/net/netfilter/xt_connmark.c
++++ b/net/netfilter/xt_connmark.c
+@@ -24,12 +24,13 @@ MODULE_ALIAS("ipt_connmark");
+ MODULE_ALIAS("ip6t_connmark");
+ 
+ static unsigned int
+-connmark_tg_shift(struct sk_buff *skb, const struct xt_connmark_tginfo2 *info)
++connmark_tg_shift(struct sk_buff *skb, const struct xt_connmark_tginfo3 *info)
+ {
+ 	enum ip_conntrack_info ctinfo;
+ 	u_int32_t new_targetmark;
+ 	struct nf_conn *ct;
+ 	u_int32_t newmark;
++	u_int8_t dscp;
+ 
+ 	ct = nf_ct_get(skb, &ctinfo);
+ 	if (ct == NULL)
+@@ -37,12 +38,24 @@ connmark_tg_shift(struct sk_buff *skb, c
+ 
+ 	switch (info->mode) {
+ 	case XT_CONNMARK_SET:
+-		newmark = (ct->mark & ~info->ctmask) ^ info->ctmark;
+-		if (info->shift_dir == D_SHIFT_RIGHT)
+-			newmark >>= info->shift_bits;
+-		else
+-			newmark <<= info->shift_bits;
++		newmark = ct->mark;
++		if (info->func & XT_CONNMARK_VALUE) {
++			newmark = (newmark & ~info->ctmask) ^ info->ctmark;
++			if (info->shift_dir == D_SHIFT_RIGHT)
++				newmark >>= info->shift_bits;
++			else
++				newmark <<= info->shift_bits;
++		} else if (info->func & XT_CONNMARK_DSCP) {
++			if (skb->protocol == htons(ETH_P_IP))
++				dscp = ipv4_get_dsfield(ip_hdr(skb)) >> 2;
++			else if (skb->protocol == htons(ETH_P_IPV6))
++				dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> 2;
++			else	/* protocol doesn't have diffserv */
++				break;
+ 
++			newmark = (newmark & ~info->ctmark) |
++				  (info->ctmask | (dscp << info->shift_bits));
++		}
+ 		if (ct->mark != newmark) {
+ 			ct->mark = newmark;
+ 			nf_conntrack_event_cache(IPCT_MARK, ct);
+@@ -81,20 +94,36 @@ static unsigned int
+ connmark_tg(struct sk_buff *skb, const struct xt_action_param *par)
+ {
+ 	const struct xt_connmark_tginfo1 *info = par->targinfo;
+-	const struct xt_connmark_tginfo2 info2 = {
++	const struct xt_connmark_tginfo3 info3 = {
+ 		.ctmark	= info->ctmark,
+ 		.ctmask	= info->ctmask,
+ 		.nfmask	= info->nfmask,
+ 		.mode	= info->mode,
++		.func	= XT_CONNMARK_VALUE
+ 	};
+ 
+-	return connmark_tg_shift(skb, &info2);
++	return connmark_tg_shift(skb, &info3);
+ }
+ 
+ static unsigned int
+ connmark_tg_v2(struct sk_buff *skb, const struct xt_action_param *par)
+ {
+ 	const struct xt_connmark_tginfo2 *info = par->targinfo;
++	const struct xt_connmark_tginfo3 info3 = {
++		.ctmark	= info->ctmark,
++		.ctmask	= info->ctmask,
++		.nfmask	= info->nfmask,
++		.mode	= info->mode,
++		.func	= XT_CONNMARK_VALUE
++	};
++
++	return connmark_tg_shift(skb, &info3);
++}
++
++static unsigned int
++connmark_tg_v3(struct sk_buff *skb, const struct xt_action_param *par)
++{
++	const struct xt_connmark_tginfo3 *info = par->targinfo;
+ 
+ 	return connmark_tg_shift(skb, info);
+ }
+@@ -165,6 +194,16 @@ static struct xt_target connmark_tg_reg[
+ 		.targetsize     = sizeof(struct xt_connmark_tginfo2),
+ 		.destroy        = connmark_tg_destroy,
+ 		.me             = THIS_MODULE,
++	},
++	{
++		.name           = "CONNMARK",
++		.revision       = 3,
++		.family         = NFPROTO_UNSPEC,
++		.checkentry     = connmark_tg_check,
++		.target         = connmark_tg_v3,
++		.targetsize     = sizeof(struct xt_connmark_tginfo3),
++		.destroy        = connmark_tg_destroy,
++		.me             = THIS_MODULE,
+ 	}
+ };
+ 
diff --git a/target/linux/generic/hack-6.0/650-netfilter-add-xt_FLOWOFFLOAD-target.patch b/target/linux/generic/hack-6.0/650-netfilter-add-xt_FLOWOFFLOAD-target.patch
new file mode 100644
index 000000000..85be7a7af
--- /dev/null
+++ b/target/linux/generic/hack-6.0/650-netfilter-add-xt_FLOWOFFLOAD-target.patch
@@ -0,0 +1,776 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Tue, 20 Feb 2018 15:56:02 +0100
+Subject: [PATCH] netfilter: add xt_FLOWOFFLOAD target
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ create mode 100644 net/netfilter/xt_OFFLOAD.c
+
+--- a/net/netfilter/Kconfig
++++ b/net/netfilter/Kconfig
+@@ -712,8 +712,6 @@ config NFT_REJECT_NETDEV
+ 
+ endif # NF_TABLES_NETDEV
+ 
+-endif # NF_TABLES
+-
+ config NF_FLOW_TABLE_INET
+ 	tristate "Netfilter flow table mixed IPv4/IPv6 module"
+ 	depends on NF_FLOW_TABLE
+@@ -722,11 +720,12 @@ config NF_FLOW_TABLE_INET
+ 
+ 	  To compile it as a module, choose M here.
+ 
++endif # NF_TABLES
++
+ config NF_FLOW_TABLE
+ 	tristate "Netfilter flow table module"
+ 	depends on NETFILTER_INGRESS
+ 	depends on NF_CONNTRACK
+-	depends on NF_TABLES
+ 	help
+ 	  This option adds the flow table core infrastructure.
+ 
+@@ -1023,6 +1022,15 @@ config NETFILTER_XT_TARGET_NOTRACK
+ 	depends on NETFILTER_ADVANCED
+ 	select NETFILTER_XT_TARGET_CT
+ 
++config NETFILTER_XT_TARGET_FLOWOFFLOAD
++	tristate '"FLOWOFFLOAD" target support'
++	depends on NF_FLOW_TABLE
++	depends on NETFILTER_INGRESS
++	help
++	  This option adds a `FLOWOFFLOAD' target, which uses the nf_flow_offload
++	  module to speed up processing of packets by bypassing the usual
++	  netfilter chains
++
+ config NETFILTER_XT_TARGET_RATEEST
+ 	tristate '"RATEEST" target support'
+ 	depends on NETFILTER_ADVANCED
+--- a/net/netfilter/Makefile
++++ b/net/netfilter/Makefile
+@@ -148,6 +148,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CLASSIF
+ obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o
+ obj-$(CONFIG_NETFILTER_XT_TARGET_CT) += xt_CT.o
+ obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o
++obj-$(CONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD) += xt_FLOWOFFLOAD.o
+ obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o
+ obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o
+ obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o
+--- /dev/null
++++ b/net/netfilter/xt_FLOWOFFLOAD.c
+@@ -0,0 +1,694 @@
++/*
++ * Copyright (C) 2018-2021 Felix Fietkau <nbd@nbd.name>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ */
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/netfilter.h>
++#include <linux/netfilter/xt_FLOWOFFLOAD.h>
++#include <linux/if_vlan.h>
++#include <net/ip.h>
++#include <net/netfilter/nf_conntrack.h>
++#include <net/netfilter/nf_conntrack_extend.h>
++#include <net/netfilter/nf_conntrack_helper.h>
++#include <net/netfilter/nf_flow_table.h>
++
++struct xt_flowoffload_hook {
++	struct hlist_node list;
++	struct nf_hook_ops ops;
++	struct net *net;
++	bool registered;
++	bool used;
++};
++
++struct xt_flowoffload_table {
++	struct nf_flowtable ft;
++	struct hlist_head hooks;
++	struct delayed_work work;
++};
++
++struct nf_forward_info {
++	const struct net_device *indev;
++	const struct net_device *outdev;
++	const struct net_device *hw_outdev;
++	struct id {
++		__u16	id;
++		__be16	proto;
++	} encap[NF_FLOW_TABLE_ENCAP_MAX];
++	u8 num_encaps;
++	u8 ingress_vlans;
++	u8 h_source[ETH_ALEN];
++	u8 h_dest[ETH_ALEN];
++	enum flow_offload_xmit_type xmit_type;
++};
++
++static DEFINE_SPINLOCK(hooks_lock);
++
++struct xt_flowoffload_table flowtable[2];
++
++static unsigned int
++xt_flowoffload_net_hook(void *priv, struct sk_buff *skb,
++			const struct nf_hook_state *state)
++{
++	struct vlan_ethhdr *veth;
++	__be16 proto;
++
++	switch (skb->protocol) {
++	case htons(ETH_P_8021Q):
++		veth = (struct vlan_ethhdr *)skb_mac_header(skb);
++		proto = veth->h_vlan_encapsulated_proto;
++		break;
++	case htons(ETH_P_PPP_SES):
++		proto = nf_flow_pppoe_proto(skb);
++		break;
++	default:
++		proto = skb->protocol;
++		break;
++	}
++
++	switch (proto) {
++	case htons(ETH_P_IP):
++		return nf_flow_offload_ip_hook(priv, skb, state);
++	case htons(ETH_P_IPV6):
++		return nf_flow_offload_ipv6_hook(priv, skb, state);
++	}
++
++	return NF_ACCEPT;
++}
++
++static int
++xt_flowoffload_create_hook(struct xt_flowoffload_table *table,
++			   struct net_device *dev)
++{
++	struct xt_flowoffload_hook *hook;
++	struct nf_hook_ops *ops;
++
++	hook = kzalloc(sizeof(*hook), GFP_ATOMIC);
++	if (!hook)
++		return -ENOMEM;
++
++	ops = &hook->ops;
++	ops->pf = NFPROTO_NETDEV;
++	ops->hooknum = NF_NETDEV_INGRESS;
++	ops->priority = 10;
++	ops->priv = &table->ft;
++	ops->hook = xt_flowoffload_net_hook;
++	ops->dev = dev;
++
++	hlist_add_head(&hook->list, &table->hooks);
++	mod_delayed_work(system_power_efficient_wq, &table->work, 0);
++
++	return 0;
++}
++
++static struct xt_flowoffload_hook *
++flow_offload_lookup_hook(struct xt_flowoffload_table *table,
++			 struct net_device *dev)
++{
++	struct xt_flowoffload_hook *hook;
++
++	hlist_for_each_entry(hook, &table->hooks, list) {
++		if (hook->ops.dev == dev)
++			return hook;
++	}
++
++	return NULL;
++}
++
++static void
++xt_flowoffload_check_device(struct xt_flowoffload_table *table,
++			    struct net_device *dev)
++{
++	struct xt_flowoffload_hook *hook;
++
++	if (!dev)
++		return;
++
++	spin_lock_bh(&hooks_lock);
++	hook = flow_offload_lookup_hook(table, dev);
++	if (hook)
++		hook->used = true;
++	else
++		xt_flowoffload_create_hook(table, dev);
++	spin_unlock_bh(&hooks_lock);
++}
++
++static void
++xt_flowoffload_register_hooks(struct xt_flowoffload_table *table)
++{
++	struct xt_flowoffload_hook *hook;
++
++restart:
++	hlist_for_each_entry(hook, &table->hooks, list) {
++		if (hook->registered)
++			continue;
++
++		hook->registered = true;
++		hook->net = dev_net(hook->ops.dev);
++		spin_unlock_bh(&hooks_lock);
++		nf_register_net_hook(hook->net, &hook->ops);
++		if (table->ft.flags & NF_FLOWTABLE_HW_OFFLOAD)
++			table->ft.type->setup(&table->ft, hook->ops.dev,
++					      FLOW_BLOCK_BIND);
++		spin_lock_bh(&hooks_lock);
++		goto restart;
++	}
++
++}
++
++static bool
++xt_flowoffload_cleanup_hooks(struct xt_flowoffload_table *table)
++{
++	struct xt_flowoffload_hook *hook;
++	bool active = false;
++
++restart:
++	spin_lock_bh(&hooks_lock);
++	hlist_for_each_entry(hook, &table->hooks, list) {
++		if (hook->used || !hook->registered) {
++			active = true;
++			continue;
++		}
++
++		hlist_del(&hook->list);
++		spin_unlock_bh(&hooks_lock);
++		if (table->ft.flags & NF_FLOWTABLE_HW_OFFLOAD)
++			table->ft.type->setup(&table->ft, hook->ops.dev,
++					      FLOW_BLOCK_UNBIND);
++		nf_unregister_net_hook(hook->net, &hook->ops);
++		kfree(hook);
++		goto restart;
++	}
++	spin_unlock_bh(&hooks_lock);
++
++	return active;
++}
++
++static void
++xt_flowoffload_check_hook(struct flow_offload *flow, void *data)
++{
++	struct xt_flowoffload_table *table = data;
++	struct flow_offload_tuple *tuple0 = &flow->tuplehash[0].tuple;
++	struct flow_offload_tuple *tuple1 = &flow->tuplehash[1].tuple;
++	struct xt_flowoffload_hook *hook;
++
++	spin_lock_bh(&hooks_lock);
++	hlist_for_each_entry(hook, &table->hooks, list) {
++		if (hook->ops.dev->ifindex != tuple0->iifidx &&
++		    hook->ops.dev->ifindex != tuple1->iifidx)
++			continue;
++
++		hook->used = true;
++	}
++	spin_unlock_bh(&hooks_lock);
++}
++
++static void
++xt_flowoffload_hook_work(struct work_struct *work)
++{
++	struct xt_flowoffload_table *table;
++	struct xt_flowoffload_hook *hook;
++	int err;
++
++	table = container_of(work, struct xt_flowoffload_table, work.work);
++
++	spin_lock_bh(&hooks_lock);
++	xt_flowoffload_register_hooks(table);
++	hlist_for_each_entry(hook, &table->hooks, list)
++		hook->used = false;
++	spin_unlock_bh(&hooks_lock);
++
++
++
++	if (err && err != -EAGAIN)
++		goto out;
++
++	if (!xt_flowoffload_cleanup_hooks(table))
++		return;
++
++out:
++	queue_delayed_work(system_power_efficient_wq, &table->work, HZ);
++}
++
++static bool
++xt_flowoffload_skip(struct sk_buff *skb, int family)
++{
++	if (skb_sec_path(skb))
++		return true;
++
++	if (family == NFPROTO_IPV4) {
++		const struct ip_options *opt = &(IPCB(skb)->opt);
++
++		if (unlikely(opt->optlen))
++			return true;
++	}
++
++	return false;
++}
++
++static enum flow_offload_xmit_type nf_xmit_type(struct dst_entry *dst)
++{
++	if (dst_xfrm(dst))
++		return FLOW_OFFLOAD_XMIT_XFRM;
++
++	return FLOW_OFFLOAD_XMIT_NEIGH;
++}
++
++static void nf_default_forward_path(struct nf_flow_route *route,
++				    struct dst_entry *dst_cache,
++				    enum ip_conntrack_dir dir,
++				    struct net_device **dev)
++{
++	dev[!dir] = dst_cache->dev;
++	route->tuple[!dir].in.ifindex	= dst_cache->dev->ifindex;
++	route->tuple[dir].dst		= dst_cache;
++	route->tuple[dir].xmit_type	= nf_xmit_type(dst_cache);
++}
++
++static bool nf_is_valid_ether_device(const struct net_device *dev)
++{
++	if (!dev || (dev->flags & IFF_LOOPBACK) || dev->type != ARPHRD_ETHER ||
++	    dev->addr_len != ETH_ALEN || !is_valid_ether_addr(dev->dev_addr))
++		return false;
++
++	return true;
++}
++
++static void nf_dev_path_info(const struct net_device_path_stack *stack,
++			     struct nf_forward_info *info,
++			     unsigned char *ha)
++{
++	const struct net_device_path *path;
++	int i;
++
++	memcpy(info->h_dest, ha, ETH_ALEN);
++
++	for (i = 0; i < stack->num_paths; i++) {
++		path = &stack->path[i];
++		switch (path->type) {
++		case DEV_PATH_ETHERNET:
++		case DEV_PATH_DSA:
++		case DEV_PATH_VLAN:
++		case DEV_PATH_PPPOE:
++			info->indev = path->dev;
++			if (is_zero_ether_addr(info->h_source))
++				memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN);
++
++			if (path->type == DEV_PATH_ETHERNET)
++				break;
++			if (path->type == DEV_PATH_DSA) {
++				i = stack->num_paths;
++				break;
++			}
++
++			/* DEV_PATH_VLAN and DEV_PATH_PPPOE */
++			if (info->num_encaps >= NF_FLOW_TABLE_ENCAP_MAX) {
++				info->indev = NULL;
++				break;
++			}
++			if (!info->outdev)
++				info->outdev = path->dev;
++			info->encap[info->num_encaps].id = path->encap.id;
++			info->encap[info->num_encaps].proto = path->encap.proto;
++			info->num_encaps++;
++			if (path->type == DEV_PATH_PPPOE)
++				memcpy(info->h_dest, path->encap.h_dest, ETH_ALEN);
++			break;
++		case DEV_PATH_BRIDGE:
++			if (is_zero_ether_addr(info->h_source))
++				memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN);
++
++			switch (path->bridge.vlan_mode) {
++			case DEV_PATH_BR_VLAN_UNTAG_HW:
++				info->ingress_vlans |= BIT(info->num_encaps - 1);
++				break;
++			case DEV_PATH_BR_VLAN_TAG:
++				info->encap[info->num_encaps].id = path->bridge.vlan_id;
++				info->encap[info->num_encaps].proto = path->bridge.vlan_proto;
++				info->num_encaps++;
++				break;
++			case DEV_PATH_BR_VLAN_UNTAG:
++				info->num_encaps--;
++				break;
++			case DEV_PATH_BR_VLAN_KEEP:
++				break;
++			}
++			break;
++		default:
++			info->indev = NULL;
++			break;
++		}
++	}
++	if (!info->outdev)
++		info->outdev = info->indev;
++
++	info->hw_outdev = info->indev;
++
++	if (nf_is_valid_ether_device(info->indev))
++		info->xmit_type = FLOW_OFFLOAD_XMIT_DIRECT;
++}
++
++static int nf_dev_fill_forward_path(const struct nf_flow_route *route,
++				     const struct dst_entry *dst_cache,
++				     const struct nf_conn *ct,
++				     enum ip_conntrack_dir dir, u8 *ha,
++				     struct net_device_path_stack *stack)
++{
++	const void *daddr = &ct->tuplehash[!dir].tuple.src.u3;
++	struct net_device *dev = dst_cache->dev;
++	struct neighbour *n;
++	u8 nud_state;
++
++	if (!nf_is_valid_ether_device(dev))
++		goto out;
++
++	n = dst_neigh_lookup(dst_cache, daddr);
++	if (!n)
++		return -1;
++
++	read_lock_bh(&n->lock);
++	nud_state = n->nud_state;
++	ether_addr_copy(ha, n->ha);
++	read_unlock_bh(&n->lock);
++	neigh_release(n);
++
++	if (!(nud_state & NUD_VALID))
++		return -1;
++
++out:
++	return dev_fill_forward_path(dev, ha, stack);
++}
++
++static void nf_dev_forward_path(struct nf_flow_route *route,
++				const struct nf_conn *ct,
++				enum ip_conntrack_dir dir,
++				struct net_device **devs)
++{
++	const struct dst_entry *dst = route->tuple[dir].dst;
++	struct net_device_path_stack stack;
++	struct nf_forward_info info = {};
++	unsigned char ha[ETH_ALEN];
++	int i;
++
++	if (nf_dev_fill_forward_path(route, dst, ct, dir, ha, &stack) >= 0)
++		nf_dev_path_info(&stack, &info, ha);
++
++	devs[!dir] = (struct net_device *)info.indev;
++	if (!info.indev)
++		return;
++
++	route->tuple[!dir].in.ifindex = info.indev->ifindex;
++	for (i = 0; i < info.num_encaps; i++) {
++		route->tuple[!dir].in.encap[i].id = info.encap[i].id;
++		route->tuple[!dir].in.encap[i].proto = info.encap[i].proto;
++	}
++	route->tuple[!dir].in.num_encaps = info.num_encaps;
++	route->tuple[!dir].in.ingress_vlans = info.ingress_vlans;
++
++	if (info.xmit_type == FLOW_OFFLOAD_XMIT_DIRECT) {
++		memcpy(route->tuple[dir].out.h_source, info.h_source, ETH_ALEN);
++		memcpy(route->tuple[dir].out.h_dest, info.h_dest, ETH_ALEN);
++		route->tuple[dir].out.ifindex = info.outdev->ifindex;
++		route->tuple[dir].out.hw_ifindex = info.hw_outdev->ifindex;
++		route->tuple[dir].xmit_type = info.xmit_type;
++	}
++}
++
++static int
++xt_flowoffload_route(struct sk_buff *skb, const struct nf_conn *ct,
++		     const struct xt_action_param *par,
++		     struct nf_flow_route *route, enum ip_conntrack_dir dir,
++		     struct net_device **devs)
++{
++	struct dst_entry *this_dst = skb_dst(skb);
++	struct dst_entry *other_dst = NULL;
++	struct flowi fl;
++
++	memset(&fl, 0, sizeof(fl));
++	switch (xt_family(par)) {
++	case NFPROTO_IPV4:
++		fl.u.ip4.daddr = ct->tuplehash[dir].tuple.src.u3.ip;
++		fl.u.ip4.flowi4_oif = xt_in(par)->ifindex;
++		break;
++	case NFPROTO_IPV6:
++		fl.u.ip6.saddr = ct->tuplehash[!dir].tuple.dst.u3.in6;
++		fl.u.ip6.daddr = ct->tuplehash[dir].tuple.src.u3.in6;
++		fl.u.ip6.flowi6_oif = xt_in(par)->ifindex;
++		break;
++	}
++
++	nf_route(xt_net(par), &other_dst, &fl, false, xt_family(par));
++	if (!other_dst)
++		return -ENOENT;
++
++	nf_default_forward_path(route, this_dst, dir, devs);
++	nf_default_forward_path(route, other_dst, !dir, devs);
++
++	if (route->tuple[dir].xmit_type	== FLOW_OFFLOAD_XMIT_NEIGH &&
++	    route->tuple[!dir].xmit_type == FLOW_OFFLOAD_XMIT_NEIGH) {
++		nf_dev_forward_path(route, ct, dir, devs);
++		nf_dev_forward_path(route, ct, !dir, devs);
++	}
++
++	return 0;
++}
++
++static unsigned int
++flowoffload_tg(struct sk_buff *skb, const struct xt_action_param *par)
++{
++	struct xt_flowoffload_table *table;
++	const struct xt_flowoffload_target_info *info = par->targinfo;
++	struct tcphdr _tcph, *tcph = NULL;
++	enum ip_conntrack_info ctinfo;
++	enum ip_conntrack_dir dir;
++	struct nf_flow_route route = {};
++	struct flow_offload *flow = NULL;
++	struct net_device *devs[2] = {};
++	struct nf_conn *ct;
++	struct net *net;
++
++	if (xt_flowoffload_skip(skb, xt_family(par)))
++		return XT_CONTINUE;
++
++	ct = nf_ct_get(skb, &ctinfo);
++	if (ct == NULL)
++		return XT_CONTINUE;
++
++	switch (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum) {
++	case IPPROTO_TCP:
++		if (ct->proto.tcp.state != TCP_CONNTRACK_ESTABLISHED)
++			return XT_CONTINUE;
++
++		tcph = skb_header_pointer(skb, par->thoff,
++					  sizeof(_tcph), &_tcph);
++		if (unlikely(!tcph || tcph->fin || tcph->rst))
++			return XT_CONTINUE;
++		break;
++	case IPPROTO_UDP:
++		break;
++	default:
++		return XT_CONTINUE;
++	}
++
++	if (nf_ct_ext_exist(ct, NF_CT_EXT_HELPER) ||
++	    ct->status & (IPS_SEQ_ADJUST | IPS_NAT_CLASH))
++		return XT_CONTINUE;
++
++	if (!nf_ct_is_confirmed(ct))
++		return XT_CONTINUE;
++
++	devs[dir] = xt_out(par);
++	devs[!dir] = xt_in(par);
++
++	if (!devs[dir] || !devs[!dir])
++		return XT_CONTINUE;
++
++	if (test_and_set_bit(IPS_OFFLOAD_BIT, &ct->status))
++		return XT_CONTINUE;
++
++	dir = CTINFO2DIR(ctinfo);
++
++	if (xt_flowoffload_route(skb, ct, par, &route, dir, devs) < 0)
++		goto err_flow_route;
++
++	flow = flow_offload_alloc(ct);
++	if (!flow)
++		goto err_flow_alloc;
++
++	if (flow_offload_route_init(flow, &route) < 0)
++		goto err_flow_add;
++
++	if (tcph) {
++		ct->proto.tcp.seen[0].flags |= IP_CT_TCP_FLAG_BE_LIBERAL;
++		ct->proto.tcp.seen[1].flags |= IP_CT_TCP_FLAG_BE_LIBERAL;
++	}
++
++	table = &flowtable[!!(info->flags & XT_FLOWOFFLOAD_HW)];
++
++	net = read_pnet(&table->ft.net);
++	if (!net)
++		write_pnet(&table->ft.net, xt_net(par));
++
++	if (flow_offload_add(&table->ft, flow) < 0)
++		goto err_flow_add;
++
++	xt_flowoffload_check_device(table, devs[0]);
++	xt_flowoffload_check_device(table, devs[1]);
++
++	dst_release(route.tuple[!dir].dst);
++
++	return XT_CONTINUE;
++
++err_flow_add:
++	flow_offload_free(flow);
++err_flow_alloc:
++	dst_release(route.tuple[!dir].dst);
++err_flow_route:
++	clear_bit(IPS_OFFLOAD_BIT, &ct->status);
++
++	return XT_CONTINUE;
++}
++
++static int flowoffload_chk(const struct xt_tgchk_param *par)
++{
++	struct xt_flowoffload_target_info *info = par->targinfo;
++
++	if (info->flags & ~XT_FLOWOFFLOAD_MASK)
++		return -EINVAL;
++
++	return 0;
++}
++
++static struct xt_target offload_tg_reg __read_mostly = {
++	.family		= NFPROTO_UNSPEC,
++	.name		= "FLOWOFFLOAD",
++	.revision	= 0,
++	.targetsize	= sizeof(struct xt_flowoffload_target_info),
++	.usersize	= sizeof(struct xt_flowoffload_target_info),
++	.checkentry	= flowoffload_chk,
++	.target		= flowoffload_tg,
++	.me		= THIS_MODULE,
++};
++
++static int flow_offload_netdev_event(struct notifier_block *this,
++				     unsigned long event, void *ptr)
++{
++	struct xt_flowoffload_hook *hook0, *hook1;
++	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
++
++	if (event != NETDEV_UNREGISTER)
++		return NOTIFY_DONE;
++
++	spin_lock_bh(&hooks_lock);
++	hook0 = flow_offload_lookup_hook(&flowtable[0], dev);
++	if (hook0)
++		hlist_del(&hook0->list);
++
++	hook1 = flow_offload_lookup_hook(&flowtable[1], dev);
++	if (hook1)
++		hlist_del(&hook1->list);
++	spin_unlock_bh(&hooks_lock);
++
++	if (hook0) {
++		nf_unregister_net_hook(hook0->net, &hook0->ops);
++		kfree(hook0);
++	}
++
++	if (hook1) {
++		nf_unregister_net_hook(hook1->net, &hook1->ops);
++		kfree(hook1);
++	}
++
++	nf_flow_table_cleanup(dev);
++
++	return NOTIFY_DONE;
++}
++
++static struct notifier_block flow_offload_netdev_notifier = {
++	.notifier_call	= flow_offload_netdev_event,
++};
++
++static int nf_flow_rule_route_inet(struct net *net,
++				   const struct flow_offload *flow,
++				   enum flow_offload_tuple_dir dir,
++				   struct nf_flow_rule *flow_rule)
++{
++	const struct flow_offload_tuple *flow_tuple = &flow->tuplehash[dir].tuple;
++	int err;
++
++	switch (flow_tuple->l3proto) {
++	case NFPROTO_IPV4:
++		err = nf_flow_rule_route_ipv4(net, flow, dir, flow_rule);
++		break;
++	case NFPROTO_IPV6:
++		err = nf_flow_rule_route_ipv6(net, flow, dir, flow_rule);
++		break;
++	default:
++		err = -1;
++		break;
++	}
++
++	return err;
++}
++
++static struct nf_flowtable_type flowtable_inet = {
++	.family		= NFPROTO_INET,
++	.init		= nf_flow_table_init,
++	.setup		= nf_flow_table_offload_setup,
++	.action		= nf_flow_rule_route_inet,
++	.free		= nf_flow_table_free,
++	.hook		= xt_flowoffload_net_hook,
++	.owner		= THIS_MODULE,
++};
++
++static int init_flowtable(struct xt_flowoffload_table *tbl)
++{
++	INIT_DELAYED_WORK(&tbl->work, xt_flowoffload_hook_work);
++	tbl->ft.type = &flowtable_inet;
++
++	return nf_flow_table_init(&tbl->ft);
++}
++
++static int __init xt_flowoffload_tg_init(void)
++{
++	int ret;
++
++	register_netdevice_notifier(&flow_offload_netdev_notifier);
++
++	ret = init_flowtable(&flowtable[0]);
++	if (ret)
++		return ret;
++
++	ret = init_flowtable(&flowtable[1]);
++	if (ret)
++		goto cleanup;
++
++	flowtable[1].ft.flags = NF_FLOWTABLE_HW_OFFLOAD;
++
++	ret = xt_register_target(&offload_tg_reg);
++	if (ret)
++		goto cleanup2;
++
++	return 0;
++
++cleanup2:
++	nf_flow_table_free(&flowtable[1].ft);
++cleanup:
++	nf_flow_table_free(&flowtable[0].ft);
++	return ret;
++}
++
++static void __exit xt_flowoffload_tg_exit(void)
++{
++	xt_unregister_target(&offload_tg_reg);
++	unregister_netdevice_notifier(&flow_offload_netdev_notifier);
++	nf_flow_table_free(&flowtable[0].ft);
++	nf_flow_table_free(&flowtable[1].ft);
++}
++
++MODULE_LICENSE("GPL");
++module_init(xt_flowoffload_tg_init);
++module_exit(xt_flowoffload_tg_exit);
+--- /dev/null
++++ b/include/uapi/linux/netfilter/xt_FLOWOFFLOAD.h
+@@ -0,0 +1,17 @@
++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
++#ifndef _XT_FLOWOFFLOAD_H
++#define _XT_FLOWOFFLOAD_H
++
++#include <linux/types.h>
++
++enum {
++	XT_FLOWOFFLOAD_HW	= 1 << 0,
++
++	XT_FLOWOFFLOAD_MASK	= XT_FLOWOFFLOAD_HW
++};
++
++struct xt_flowoffload_target_info {
++	__u32 flags;
++};
++
++#endif /* _XT_FLOWOFFLOAD_H */
diff --git a/target/linux/generic/hack-6.0/651-wireless_mesh_header.patch b/target/linux/generic/hack-6.0/651-wireless_mesh_header.patch
new file mode 100644
index 000000000..fd7d5346a
--- /dev/null
+++ b/target/linux/generic/hack-6.0/651-wireless_mesh_header.patch
@@ -0,0 +1,24 @@
+From 6d3bc769657b0ee7c7506dad9911111c4226a7ea Mon Sep 17 00:00:00 2001
+From: Imre Kaloz <kaloz@openwrt.org>
+Date: Fri, 7 Jul 2017 17:21:05 +0200
+Subject: mac80211: increase wireless mesh header size
+
+lede-commit 3d4466cfd8f75f717efdb1f96fdde3c70d865fc1
+Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
+---
+ include/linux/netdevice.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -149,8 +149,8 @@ static inline bool dev_xmit_complete(int
+ 
+ #if defined(CONFIG_HYPERV_NET)
+ # define LL_MAX_HEADER 128
+-#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
+-# if defined(CONFIG_MAC80211_MESH)
++#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25) || 1
++# if defined(CONFIG_MAC80211_MESH) || 1
+ #  define LL_MAX_HEADER 128
+ # else
+ #  define LL_MAX_HEADER 96
diff --git a/target/linux/generic/hack-6.0/660-fq_codel_defaults.patch b/target/linux/generic/hack-6.0/660-fq_codel_defaults.patch
new file mode 100644
index 000000000..ba21555a0
--- /dev/null
+++ b/target/linux/generic/hack-6.0/660-fq_codel_defaults.patch
@@ -0,0 +1,27 @@
+From a6ccb238939b25851474a279b20367fd24a0e816 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:21:53 +0200
+Subject:  hack: net: fq_codel: tune defaults for small devices
+
+Assume that x86_64 devices always have a big memory and do not need this 
+optimization compared to devices with only 32 MB or 64 MB RAM.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/sched/sch_fq_codel.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/sched/sch_fq_codel.c
++++ b/net/sched/sch_fq_codel.c
+@@ -476,7 +476,11 @@ static int fq_codel_init(struct Qdisc *s
+ 
+ 	sch->limit = 10*1024;
+ 	q->flows_cnt = 1024;
++#ifdef CONFIG_X86_64
+ 	q->memory_limit = 32 << 20; /* 32 MBytes */
++#else
++	q->memory_limit = 4 << 20; /* 4 MBytes */
++#endif
+ 	q->drop_batch_size = 64;
+ 	q->quantum = psched_mtu(qdisc_dev(sch));
+ 	INIT_LIST_HEAD(&q->new_flows);
diff --git a/target/linux/generic/hack-6.0/661-use_fq_codel_by_default.patch b/target/linux/generic/hack-6.0/661-use_fq_codel_by_default.patch
new file mode 100644
index 000000000..c76ba3693
--- /dev/null
+++ b/target/linux/generic/hack-6.0/661-use_fq_codel_by_default.patch
@@ -0,0 +1,100 @@
+From 1d418f7e88035ed7a94073f6354246c66e9193e9 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:22:58 +0200
+Subject: fq_codel: switch default qdisc from pfifo_fast to fq_codel and remove pfifo_fast
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/net/sch_generic.h | 3 ++-
+ net/sched/Kconfig         | 3 ++-
+ net/sched/sch_api.c       | 2 +-
+ net/sched/sch_fq_codel.c  | 3 ++-
+ net/sched/sch_generic.c   | 4 ++--
+ 5 files changed, 9 insertions(+), 6 deletions(-)
+
+--- a/include/net/sch_generic.h
++++ b/include/net/sch_generic.h
+@@ -585,12 +585,13 @@ extern struct Qdisc_ops noop_qdisc_ops;
+ extern struct Qdisc_ops pfifo_fast_ops;
+ extern struct Qdisc_ops mq_qdisc_ops;
+ extern struct Qdisc_ops noqueue_qdisc_ops;
++extern struct Qdisc_ops fq_codel_qdisc_ops;
+ extern const struct Qdisc_ops *default_qdisc_ops;
+ static inline const struct Qdisc_ops *
+ get_default_qdisc_ops(const struct net_device *dev, int ntx)
+ {
+ 	return ntx < dev->real_num_tx_queues ?
+-			default_qdisc_ops : &pfifo_fast_ops;
++			default_qdisc_ops : &fq_codel_qdisc_ops;
+ }
+ 
+ struct Qdisc_class_common {
+--- a/net/sched/Kconfig
++++ b/net/sched/Kconfig
+@@ -4,8 +4,9 @@
+ #
+ 
+ menuconfig NET_SCHED
+-	bool "QoS and/or fair queueing"
++	def_bool y
+ 	select NET_SCH_FIFO
++	select NET_SCH_FQ_CODEL
+ 	help
+ 	  When the kernel has several packets to send out over a network
+ 	  device, it has to decide which ones to send first, which ones to
+--- a/net/sched/sch_api.c
++++ b/net/sched/sch_api.c
+@@ -2276,7 +2276,7 @@ static int __init pktsched_init(void)
+ 		return err;
+ 	}
+ 
+-	register_qdisc(&pfifo_fast_ops);
++	register_qdisc(&fq_codel_qdisc_ops);
+ 	register_qdisc(&pfifo_qdisc_ops);
+ 	register_qdisc(&bfifo_qdisc_ops);
+ 	register_qdisc(&pfifo_head_drop_qdisc_ops);
+--- a/net/sched/sch_fq_codel.c
++++ b/net/sched/sch_fq_codel.c
+@@ -721,7 +721,7 @@ static const struct Qdisc_class_ops fq_c
+ 	.walk		=	fq_codel_walk,
+ };
+ 
+-static struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = {
++struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = {
+ 	.cl_ops		=	&fq_codel_class_ops,
+ 	.id		=	"fq_codel",
+ 	.priv_size	=	sizeof(struct fq_codel_sched_data),
+@@ -736,6 +736,7 @@ static struct Qdisc_ops fq_codel_qdisc_o
+ 	.dump_stats =	fq_codel_dump_stats,
+ 	.owner		=	THIS_MODULE,
+ };
++EXPORT_SYMBOL(fq_codel_qdisc_ops);
+ 
+ static int __init fq_codel_module_init(void)
+ {
+--- a/net/sched/sch_generic.c
++++ b/net/sched/sch_generic.c
+@@ -32,7 +32,7 @@
+ #include <net/xfrm.h>
+ 
+ /* Qdisc to use by default */
+-const struct Qdisc_ops *default_qdisc_ops = &pfifo_fast_ops;
++const struct Qdisc_ops *default_qdisc_ops = &fq_codel_qdisc_ops;
+ EXPORT_SYMBOL(default_qdisc_ops);
+ 
+ static void qdisc_maybe_clear_missed(struct Qdisc *q,
+@@ -1142,12 +1142,12 @@ static void attach_one_default_qdisc(str
+ 				     void *_unused)
+ {
+ 	struct Qdisc *qdisc;
+-	const struct Qdisc_ops *ops = default_qdisc_ops;
++	const struct Qdisc_ops *ops = &fq_codel_qdisc_ops;
+ 
+ 	if (dev->priv_flags & IFF_NO_QUEUE)
+ 		ops = &noqueue_qdisc_ops;
+ 	else if(dev->type == ARPHRD_CAN)
+-		ops = &pfifo_fast_ops;
++		ops = &fq_codel_qdisc_ops;
+ 
+ 	qdisc = qdisc_create_dflt(dev_queue, ops, TC_H_ROOT, NULL);
+ 	if (!qdisc)
diff --git a/target/linux/generic/hack-6.0/700-swconfig_switch_drivers.patch b/target/linux/generic/hack-6.0/700-swconfig_switch_drivers.patch
new file mode 100644
index 000000000..560937a7c
--- /dev/null
+++ b/target/linux/generic/hack-6.0/700-swconfig_switch_drivers.patch
@@ -0,0 +1,129 @@
+From 36e516290611e613aa92996cb4339561452695b4 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:24:23 +0200
+Subject: net: swconfig: adds openwrt switch layer
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/net/phy/Kconfig   | 83 +++++++++++++++++++++++++++++++++++++++++++++++
+ drivers/net/phy/Makefile  | 15 +++++++++
+ include/uapi/linux/Kbuild |  1 +
+ 3 files changed, 99 insertions(+)
+
+--- a/drivers/net/phy/Kconfig
++++ b/drivers/net/phy/Kconfig
+@@ -61,6 +61,80 @@ config SFP
+ 	depends on HWMON || HWMON=n
+ 	select MDIO_I2C
+ 
++comment "Switch configuration API + drivers"
++
++config SWCONFIG
++	tristate "Switch configuration API"
++	help
++	  Switch configuration API using netlink. This allows
++	  you to configure the VLAN features of certain switches.
++
++config SWCONFIG_LEDS
++	bool "Switch LED trigger support"
++	depends on (SWCONFIG && LEDS_TRIGGERS)
++
++config ADM6996_PHY
++	tristate "Driver for ADM6996 switches"
++	select SWCONFIG
++	help
++	  Currently supports the ADM6996FC and ADM6996M switches.
++	  Support for FC is very limited.
++
++config AR8216_PHY
++	tristate "Driver for Atheros AR8216 switches"
++	select SWCONFIG
++
++config AR8216_PHY_LEDS
++	bool "Atheros AR8216 switch LED support"
++	depends on (AR8216_PHY && LEDS_CLASS)
++
++source "drivers/net/phy/b53/Kconfig"
++
++config IP17XX_PHY
++	tristate "Driver for IC+ IP17xx switches"
++	select SWCONFIG
++
++config PSB6970_PHY
++	tristate "Lantiq XWAY Tantos (PSB6970) Ethernet switch"
++	select SWCONFIG
++	select ETHERNET_PACKET_MANGLE
++
++config RTL8306_PHY
++	tristate "Driver for Realtek RTL8306S switches"
++	select SWCONFIG
++
++config RTL8366_SMI
++	tristate "Driver for the RTL8366 SMI interface"
++	depends on GPIOLIB
++	help
++	  This module implements the SMI interface protocol which is used
++	  by some RTL8366 ethernet switch devices via the generic GPIO API.
++
++if RTL8366_SMI
++
++config RTL8366_SMI_DEBUG_FS
++	bool "RTL8366 SMI interface debugfs support"
++        depends on DEBUG_FS
++        default n
++
++config RTL8366S_PHY
++	tristate "Driver for the Realtek RTL8366S switch"
++	select SWCONFIG
++
++config RTL8366RB_PHY
++	tristate "Driver for the Realtek RTL8366RB switch"
++	select SWCONFIG
++
++config RTL8367_PHY
++	tristate "Driver for the Realtek RTL8367R/M switches"
++	select SWCONFIG
++
++config RTL8367B_PHY
++	tristate "Driver fot the Realtek RTL8367R-VB switch"
++	select SWCONFIG
++
++endif # RTL8366_SMI
++
+ comment "MII PHY device drivers"
+ 
+ config AMD_PHY
+--- a/drivers/net/phy/Makefile
++++ b/drivers/net/phy/Makefile
+@@ -24,6 +24,19 @@ libphy-$(CONFIG_LED_TRIGGER_PHY)	+= phy_
+ obj-$(CONFIG_PHYLINK)		+= phylink.o
+ obj-$(CONFIG_PHYLIB)		+= libphy.o
+ 
++obj-$(CONFIG_SWCONFIG)		+= swconfig.o
++obj-$(CONFIG_ADM6996_PHY)	+= adm6996.o
++obj-$(CONFIG_AR8216_PHY)	+= ar8216.o ar8327.o
++obj-$(CONFIG_SWCONFIG_B53)	+= b53/
++obj-$(CONFIG_IP17XX_PHY)	+= ip17xx.o
++obj-$(CONFIG_PSB6970_PHY)	+= psb6970.o
++obj-$(CONFIG_RTL8306_PHY)	+= rtl8306.o
++obj-$(CONFIG_RTL8366_SMI)	+= rtl8366_smi.o
++obj-$(CONFIG_RTL8366S_PHY)	+= rtl8366s.o
++obj-$(CONFIG_RTL8366RB_PHY)	+= rtl8366rb.o
++obj-$(CONFIG_RTL8367_PHY)	+= rtl8367.o
++obj-$(CONFIG_RTL8367B_PHY)	+= rtl8367b.o
++
+ obj-$(CONFIG_NETWORK_PHY_TIMESTAMPING) += mii_timestamper.o
+ 
+ obj-$(CONFIG_SFP)		+= sfp.o
+--- a/include/linux/platform_data/b53.h
++++ b/include/linux/platform_data/b53.h
+@@ -29,6 +29,9 @@ struct b53_platform_data {
+ 	u32 chip_id;
+ 	u16 enabled_ports;
+ 
++	/* allow to specify an ethX alias */
++	const char *alias;
++
+ 	/* only used by MMAP'd driver */
+ 	unsigned big_endian:1;
+ 	void __iomem *regs;
diff --git a/target/linux/generic/hack-6.0/760-net-usb-r8152-add-LED-configuration-from-OF.patch b/target/linux/generic/hack-6.0/760-net-usb-r8152-add-LED-configuration-from-OF.patch
new file mode 100644
index 000000000..db471b4f0
--- /dev/null
+++ b/target/linux/generic/hack-6.0/760-net-usb-r8152-add-LED-configuration-from-OF.patch
@@ -0,0 +1,74 @@
+From 82985725e071f2a5735052f18e109a32aeac3a0b Mon Sep 17 00:00:00 2001
+From: David Bauer <mail@david-bauer.net>
+Date: Sun, 26 Jul 2020 02:38:31 +0200
+Subject: [PATCH] net: usb: r8152: add LED configuration from OF
+
+This adds the ability to configure the LED configuration register using
+OF. This way, the correct value for board specific LED configuration can
+be determined.
+
+Signed-off-by: David Bauer <mail@david-bauer.net>
+---
+ drivers/net/usb/r8152.c | 23 +++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+
+--- a/drivers/net/usb/r8152.c
++++ b/drivers/net/usb/r8152.c
+@@ -11,6 +11,7 @@
+ #include <linux/mii.h>
+ #include <linux/ethtool.h>
+ #include <linux/usb.h>
++#include <linux/of.h>
+ #include <linux/crc32.h>
+ #include <linux/if_vlan.h>
+ #include <linux/uaccess.h>
+@@ -6866,6 +6867,22 @@ static void rtl_tally_reset(struct r8152
+ 	ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data);
+ }
+ 
++static int r8152_led_configuration(struct r8152 *tp)
++{
++	u32 led_data;
++	int ret;
++
++	ret = of_property_read_u32(tp->udev->dev.of_node, "realtek,led-data",
++								&led_data);
++
++	if (ret)
++		return ret;
++	
++	ocp_write_word(tp, MCU_TYPE_PLA, PLA_LEDSEL, led_data);
++
++	return 0;
++}
++
+ static void r8152b_init(struct r8152 *tp)
+ {
+ 	u32 ocp_data;
+@@ -6907,6 +6924,8 @@ static void r8152b_init(struct r8152 *tp
+ 	ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
+ 	ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
+ 	ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
++
++	r8152_led_configuration(tp);
+ }
+ 
+ static void r8153_init(struct r8152 *tp)
+@@ -7047,6 +7066,8 @@ static void r8153_init(struct r8152 *tp)
+ 		tp->coalesce = COALESCE_SLOW;
+ 		break;
+ 	}
++
++	r8152_led_configuration(tp);
+ }
+ 
+ static void r8153b_init(struct r8152 *tp)
+@@ -7129,6 +7150,8 @@ static void r8153b_init(struct r8152 *tp
+ 	rtl_tally_reset(tp);
+ 
+ 	tp->coalesce = 15000;	/* 15 us */
++
++	r8152_led_configuration(tp);
+ }
+ 
+ static void r8153c_init(struct r8152 *tp)
diff --git a/target/linux/generic/hack-6.0/761-dt-bindings-net-add-RTL8152-binding-documentation.patch b/target/linux/generic/hack-6.0/761-dt-bindings-net-add-RTL8152-binding-documentation.patch
new file mode 100644
index 000000000..be262b993
--- /dev/null
+++ b/target/linux/generic/hack-6.0/761-dt-bindings-net-add-RTL8152-binding-documentation.patch
@@ -0,0 +1,54 @@
+From 3ee05f4aa64fc86af3be5bc176ba5808de9260a7 Mon Sep 17 00:00:00 2001
+From: David Bauer <mail@david-bauer.net>
+Date: Sun, 26 Jul 2020 15:30:33 +0200
+Subject: [PATCH] dt-bindings: net: add RTL8152 binding documentation
+
+Add binding documentation for the Realtek RTL8152 / RTL8153 USB ethernet
+adapters.
+
+Signed-off-by: David Bauer <mail@david-bauer.net>
+---
+ .../bindings/net/realtek,rtl8152.yaml         | 36 +++++++++++++++++++
+ 1 file changed, 36 insertions(+)
+ create mode 100644 Documentation/devicetree/bindings/net/realtek,rtl8152.yaml
+
+--- /dev/null
++++ b/Documentation/devicetree/bindings/net/realtek,rtl8152.yaml
+@@ -0,0 +1,36 @@
++# SPDX-License-Identifier: GPL-2.0
++%YAML 1.2
++---
++$id: http://devicetree.org/schemas/net/realtek,rtl8152.yaml#
++$schema: http://devicetree.org/meta-schemas/core.yaml#
++
++title: Realtek RTL8152/RTL8153 series USB ethernet
++
++maintainers:
++  - David Bauer <mail@david-bauer.net>
++
++properties:
++  compatible:
++    oneOf:
++      - items:
++          - enum:
++              - realtek,rtl8152
++              - realtek,rtl8153
++
++  reg:
++    description: The device number on the USB bus
++
++  realtek,led-data:
++    description: Value to be written to the LED configuration register.
++
++required:
++  - compatible
++  - reg
++
++examples:
++  - |
++    usb-eth@2 {
++      compatible = "realtek,rtl8153";
++      reg = <2>;
++      realtek,led-data = <0x87>;
++    };
+\ No newline at end of file
diff --git a/target/linux/generic/hack-6.0/773-bgmac-add-srab-switch.patch b/target/linux/generic/hack-6.0/773-bgmac-add-srab-switch.patch
new file mode 100644
index 000000000..076051b5b
--- /dev/null
+++ b/target/linux/generic/hack-6.0/773-bgmac-add-srab-switch.patch
@@ -0,0 +1,98 @@
+From 3cb240533ab787899dc7f17aa7d6c5b4810e2e58 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Fri, 7 Jul 2017 17:26:01 +0200
+Subject: bcm53xx: bgmac: use srab switch driver
+
+use the srab switch driver on these SoCs.
+
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+---
+ drivers/net/ethernet/broadcom/bgmac-bcma.c |  1 +
+ drivers/net/ethernet/broadcom/bgmac.c      | 24 ++++++++++++++++++++++++
+ drivers/net/ethernet/broadcom/bgmac.h      |  4 ++++
+ 3 files changed, 29 insertions(+)
+
+--- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
++++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
+@@ -280,6 +280,7 @@ static int bgmac_probe(struct bcma_devic
+ 		bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
+ 		bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
+ 		bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
++		bgmac->feature_flags |= BGMAC_FEAT_SRAB;
+ 		break;
+ 	default:
+ 		bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -12,6 +12,7 @@
+ #include <linux/bcma/bcma.h>
+ #include <linux/etherdevice.h>
+ #include <linux/interrupt.h>
++#include <linux/platform_data/b53.h>
+ #include <linux/bcm47xx_nvram.h>
+ #include <linux/phy.h>
+ #include <linux/phy_fixed.h>
+@@ -1408,6 +1409,17 @@ static const struct ethtool_ops bgmac_et
+ 	.set_link_ksettings     = phy_ethtool_set_link_ksettings,
+ };
+ 
++static struct b53_platform_data bgmac_b53_pdata = {
++};
++
++static struct platform_device bgmac_b53_dev = {
++	.name		= "b53-srab-switch",
++	.id		= -1,
++	.dev		= {
++		.platform_data = &bgmac_b53_pdata,
++	},
++};
++
+ /**************************************************
+  * MII
+  **************************************************/
+@@ -1542,6 +1554,14 @@ int bgmac_enet_probe(struct bgmac *bgmac
+ 	/* Omit FCS from max MTU size */
+ 	net_dev->max_mtu = BGMAC_RX_MAX_FRAME_SIZE - ETH_FCS_LEN;
+ 
++	if ((bgmac->feature_flags & BGMAC_FEAT_SRAB) && !bgmac_b53_pdata.regs) {
++		bgmac_b53_pdata.regs = ioremap_nocache(0x18007000, 0x1000);
++
++		err = platform_device_register(&bgmac_b53_dev);
++		if (!err)
++			bgmac->b53_device = &bgmac_b53_dev;
++	}
++
+ 	err = register_netdev(bgmac->net_dev);
+ 	if (err) {
+ 		dev_err(bgmac->dev, "Cannot register net device\n");
+@@ -1564,6 +1584,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe);
+ 
+ void bgmac_enet_remove(struct bgmac *bgmac)
+ {
++	if (bgmac->b53_device)
++		platform_device_unregister(&bgmac_b53_dev);
++	bgmac->b53_device = NULL;
++
+ 	unregister_netdev(bgmac->net_dev);
+ 	phy_disconnect(bgmac->net_dev->phydev);
+ 	netif_napi_del(&bgmac->napi);
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -388,6 +388,7 @@
+ #define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII	BIT(18)
+ #define BGMAC_FEAT_CC7_IF_TYPE_RGMII	BIT(19)
+ #define BGMAC_FEAT_IDM_MASK		BIT(20)
++#define BGMAC_FEAT_SRAB			BIT(21)
+ 
+ struct bgmac_slot_info {
+ 	union {
+@@ -493,6 +494,9 @@ struct bgmac {
+ 	void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask,
+ 			      u32 set);
+ 	int (*phy_connect)(struct bgmac *bgmac);
++
++	/* platform device for associated switch */
++	struct platform_device *b53_device;
+ };
+ 
+ struct bgmac *bgmac_alloc(struct device *dev);
diff --git a/target/linux/generic/hack-6.0/780-usb-net-MeigLink_modem_support.patch b/target/linux/generic/hack-6.0/780-usb-net-MeigLink_modem_support.patch
new file mode 100644
index 000000000..54ae94d33
--- /dev/null
+++ b/target/linux/generic/hack-6.0/780-usb-net-MeigLink_modem_support.patch
@@ -0,0 +1,33 @@
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -1088,6 +1088,7 @@ static const struct usb_device_id produc
+ 	{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)},	/* Quectel EM160R-GL */
+ 	{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)},	/* Quectel RM500Q-GL */
+ 	{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0801)},	/* Quectel RM520N */
++	{QMI_MATCH_FF_FF_FF(0x05c6, 0xf601)},   /* MeigLink SLM750 */
+ 
+ 	/* 3. Combined interface devices matching on interface number */
+ 	{QMI_FIXED_INTF(0x0408, 0xea42, 4)},	/* Yota / Megafon M100-1 */
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -243,6 +243,8 @@ static void option_instat_callback(struc
+ #define UBLOX_PRODUCT_R6XX			0x90fa
+ /* These Yuga products use Qualcomm's vendor ID */
+ #define YUGA_PRODUCT_CLM920_NC5			0x9625
++/* These MeigLink products use Qualcomm's vendor ID */
++#define MEIGLINK_PRODUCT_SLM750			0xf601
+ 
+ #define QUECTEL_VENDOR_ID			0x2c7c
+ /* These Quectel products use Quectel's vendor ID */
+@@ -1143,6 +1145,11 @@ static const struct usb_device_id option
+ 	  .driver_info = ZLP },
+ 	{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96),
+ 	  .driver_info = RSVD(4) },
++	/* Meiglink products using Qualcomm vendor ID */
++	// Works OK. In case of some issues check macros that are used by Quectel Products
++	{ USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, MEIGLINK_PRODUCT_SLM750, 0xff, 0xff, 0xff),
++	  .driver_info = NUMEP2 },
++	{ USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, MEIGLINK_PRODUCT_SLM750, 0xff, 0, 0) },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff),
+ 	  .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 },
+ 	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0, 0) },
diff --git a/target/linux/generic/hack-6.0/800-GPIO-add-named-gpio-exports.patch b/target/linux/generic/hack-6.0/800-GPIO-add-named-gpio-exports.patch
new file mode 100644
index 000000000..8894874ed
--- /dev/null
+++ b/target/linux/generic/hack-6.0/800-GPIO-add-named-gpio-exports.patch
@@ -0,0 +1,162 @@
+From cc809a441d8f2924f785eb863dfa6aef47a25b0b Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Tue, 12 Aug 2014 20:49:27 +0200
+Subject: [PATCH 30/36] GPIO: add named gpio exports
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+--- a/drivers/gpio/gpiolib-of.c
++++ b/drivers/gpio/gpiolib-of.c
+@@ -19,6 +19,8 @@
+ #include <linux/pinctrl/pinctrl.h>
+ #include <linux/slab.h>
+ #include <linux/gpio/machine.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
+ 
+ #include "gpiolib.h"
+ #include "gpiolib-of.h"
+@@ -1066,3 +1068,72 @@ void of_gpio_dev_init(struct gpio_chip *
+ 	else
+ 		gc->of_node = gdev->dev.of_node;
+ }
++
++#ifdef CONFIG_GPIO_SYSFS
++
++static struct of_device_id gpio_export_ids[] = {
++	{ .compatible = "gpio-export" },
++	{ /* sentinel */ }
++};
++
++static int of_gpio_export_probe(struct platform_device *pdev)
++{
++	struct device_node *np = pdev->dev.of_node;
++	struct device_node *cnp;
++	u32 val;
++	int nb = 0;
++
++	for_each_child_of_node(np, cnp) {
++		const char *name = NULL;
++		int gpio;
++		bool dmc;
++		int max_gpio = 1;
++		int i;
++
++		of_property_read_string(cnp, "gpio-export,name", &name);
++
++		if (!name)
++			max_gpio = of_gpio_count(cnp);
++
++		for (i = 0; i < max_gpio; i++) {
++			unsigned flags = 0;
++			enum of_gpio_flags of_flags;
++
++			gpio = of_get_gpio_flags(cnp, i, &of_flags);
++			if (!gpio_is_valid(gpio))
++				return gpio;
++
++			if (of_flags == OF_GPIO_ACTIVE_LOW)
++				flags |= GPIOF_ACTIVE_LOW;
++
++			if (!of_property_read_u32(cnp, "gpio-export,output", &val))
++				flags |= val ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
++			else
++				flags |= GPIOF_IN;
++
++			if (devm_gpio_request_one(&pdev->dev, gpio, flags, name ? name : of_node_full_name(np)))
++				continue;
++
++			dmc = of_property_read_bool(cnp, "gpio-export,direction_may_change");
++			gpio_export_with_name(gpio, dmc, name);
++			nb++;
++		}
++	}
++
++	dev_info(&pdev->dev, "%d gpio(s) exported\n", nb);
++
++	return 0;
++}
++
++static struct platform_driver gpio_export_driver = {
++	.driver		= {
++		.name		= "gpio-export",
++		.owner	= THIS_MODULE,
++		.of_match_table	= of_match_ptr(gpio_export_ids),
++	},
++	.probe		= of_gpio_export_probe,
++};
++
++module_platform_driver(gpio_export_driver);
++
++#endif
+--- a/include/asm-generic/gpio.h
++++ b/include/asm-generic/gpio.h
+@@ -125,6 +125,12 @@ static inline int gpio_export(unsigned g
+ 	return gpiod_export(gpio_to_desc(gpio), direction_may_change);
+ }
+ 
++int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name);
++static inline int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name)
++{
++	return __gpiod_export(gpio_to_desc(gpio), direction_may_change, name);
++}
++
+ static inline int gpio_export_link(struct device *dev, const char *name,
+ 				   unsigned gpio)
+ {
+--- a/include/linux/gpio/consumer.h
++++ b/include/linux/gpio/consumer.h
+@@ -728,6 +728,7 @@ static inline struct gpio_desc *acpi_get
+ 
+ #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)
+ 
++int _gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name);
+ int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
+ int gpiod_export_link(struct device *dev, const char *name,
+ 		      struct gpio_desc *desc);
+@@ -735,6 +736,13 @@ void gpiod_unexport(struct gpio_desc *de
+ 
+ #else  /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
+ 
++static inline int _gpiod_export(struct gpio_desc *desc,
++			       bool direction_may_change,
++			       const char *name)
++{
++	return -ENOSYS;
++}
++
+ static inline int gpiod_export(struct gpio_desc *desc,
+ 			       bool direction_may_change)
+ {
+--- a/drivers/gpio/gpiolib-sysfs.c
++++ b/drivers/gpio/gpiolib-sysfs.c
+@@ -544,7 +544,7 @@ static struct class gpio_class = {
+  *
+  * Returns zero on success, else an error.
+  */
+-int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
++int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name)
+ {
+ 	struct gpio_chip	*chip;
+ 	struct gpio_device	*gdev;
+@@ -606,6 +606,8 @@ int gpiod_export(struct gpio_desc *desc,
+ 	offset = gpio_chip_hwgpio(desc);
+ 	if (chip->names && chip->names[offset])
+ 		ioname = chip->names[offset];
++	if (name)
++		ioname = name;
+ 
+ 	dev = device_create_with_groups(&gpio_class, &gdev->dev,
+ 					MKDEV(0, 0), data, gpio_groups,
+@@ -627,6 +629,12 @@ err_unlock:
+ 	gpiod_dbg(desc, "%s: status %d\n", __func__, status);
+ 	return status;
+ }
++EXPORT_SYMBOL_GPL(__gpiod_export);
++
++int gpiod_export(struct gpio_desc *desc, bool direction_may_change)
++{
++	return __gpiod_export(desc, direction_may_change, NULL);
++}
+ EXPORT_SYMBOL_GPL(gpiod_export);
+ 
+ static int match_export(struct device *dev, const void *desc)
diff --git a/target/linux/generic/hack-6.0/902-debloat_proc.patch b/target/linux/generic/hack-6.0/902-debloat_proc.patch
new file mode 100644
index 000000000..2f6e483a9
--- /dev/null
+++ b/target/linux/generic/hack-6.0/902-debloat_proc.patch
@@ -0,0 +1,408 @@
+From 9e3f1d0805b2d919904dd9a4ff0d956314cc3cba Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 8 Jul 2017 08:20:09 +0200
+Subject: debloat: procfs
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ fs/locks.c               |  2 ++
+ fs/proc/Kconfig          |  5 +++++
+ fs/proc/consoles.c       |  3 +++
+ fs/proc/proc_tty.c       | 11 ++++++++++-
+ include/net/snmp.h       | 18 +++++++++++++++++-
+ ipc/msg.c                |  3 +++
+ ipc/sem.c                |  2 ++
+ ipc/shm.c                |  2 ++
+ ipc/util.c               |  3 +++
+ kernel/exec_domain.c     |  2 ++
+ kernel/irq/proc.c        |  9 +++++++++
+ kernel/time/timer_list.c |  2 ++
+ mm/vmalloc.c             |  2 ++
+ mm/vmstat.c              |  8 +++++---
+ net/8021q/vlanproc.c     |  6 ++++++
+ net/core/net-procfs.c    | 18 ++++++++++++------
+ net/core/sock.c          |  2 ++
+ net/ipv4/fib_trie.c      | 18 ++++++++++++------
+ net/ipv4/proc.c          |  3 +++
+ net/ipv4/route.c         |  3 +++
+ 20 files changed, 105 insertions(+), 17 deletions(-)
+
+--- a/fs/locks.c
++++ b/fs/locks.c
+@@ -2885,6 +2885,8 @@ static const struct seq_operations locks
+ 
+ static int __init proc_locks_init(void)
+ {
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return 0;
+ 	proc_create_seq_private("locks", 0, NULL, &locks_seq_operations,
+ 			sizeof(struct locks_iterator), NULL);
+ 	return 0;
+--- a/fs/proc/Kconfig
++++ b/fs/proc/Kconfig
+@@ -100,6 +100,11 @@ config PROC_CHILDREN
+ 	  Say Y if you are running any user-space software which takes benefit from
+ 	  this interface. For example, rkt is such a piece of software.
+ 
++config PROC_STRIPPED
++	default n
++	depends on EXPERT
++	bool "Strip non-essential /proc functionality to reduce code size"
++
+ config PROC_PID_ARCH_STATUS
+ 	def_bool n
+ 	depends on PROC_FS
+--- a/fs/proc/consoles.c
++++ b/fs/proc/consoles.c
+@@ -92,6 +92,9 @@ static const struct seq_operations conso
+ 
+ static int __init proc_consoles_init(void)
+ {
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return 0;
++
+ 	proc_create_seq("consoles", 0, NULL, &consoles_op);
+ 	return 0;
+ }
+--- a/fs/proc/proc_tty.c
++++ b/fs/proc/proc_tty.c
+@@ -131,7 +131,10 @@ static const struct seq_operations tty_d
+ void proc_tty_register_driver(struct tty_driver *driver)
+ {
+ 	struct proc_dir_entry *ent;
+-		
++
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return;
++
+ 	if (!driver->driver_name || driver->proc_entry ||
+ 	    !driver->ops->proc_show)
+ 		return;
+@@ -148,6 +151,9 @@ void proc_tty_unregister_driver(struct t
+ {
+ 	struct proc_dir_entry *ent;
+ 
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return;
++
+ 	ent = driver->proc_entry;
+ 	if (!ent)
+ 		return;
+@@ -162,6 +168,9 @@ void proc_tty_unregister_driver(struct t
+  */
+ void __init proc_tty_init(void)
+ {
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return;
++
+ 	if (!proc_mkdir("tty", NULL))
+ 		return;
+ 	proc_mkdir("tty/ldisc", NULL);	/* Preserved: it's userspace visible */
+--- a/include/net/snmp.h
++++ b/include/net/snmp.h
+@@ -124,6 +124,21 @@ struct linux_tls_mib {
+ #define DECLARE_SNMP_STAT(type, name)	\
+ 	extern __typeof__(type) __percpu *name
+ 
++#ifdef CONFIG_PROC_STRIPPED
++#define __SNMP_STATS_DUMMY(mib)	\
++	do { (void) mib->mibs[0]; } while(0)
++
++#define __SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)
++#define SNMP_INC_STATS_ATOMIC_LONG(mib, field) __SNMP_STATS_DUMMY(mib)
++#define SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)
++#define SNMP_DEC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)
++#define __SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib)
++#define SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib)
++#define SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib)
++#define __SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib)
++
++#else
++
+ #define __SNMP_INC_STATS(mib, field)	\
+ 			__this_cpu_inc(mib->mibs[field])
+ 
+@@ -154,8 +169,9 @@ struct linux_tls_mib {
+ 		__this_cpu_add(ptr[basefield##OCTETS], addend);	\
+ 	} while (0)
+ 
++#endif
+ 
+-#if BITS_PER_LONG==32
++#if (BITS_PER_LONG==32) && !defined(CONFIG_PROC_STRIPPED)
+ 
+ #define __SNMP_ADD_STATS64(mib, field, addend) 				\
+ 	do {								\
+--- a/ipc/msg.c
++++ b/ipc/msg.c
+@@ -1350,6 +1350,9 @@ void __init msg_init(void)
+ {
+ 	msg_init_ns(&init_ipc_ns);
+ 
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return;
++
+ 	ipc_init_proc_interface("sysvipc/msg",
+ 				"       key      msqid perms      cbytes       qnum lspid lrpid   uid   gid  cuid  cgid      stime      rtime      ctime\n",
+ 				IPC_MSG_IDS, sysvipc_msg_proc_show);
+--- a/ipc/sem.c
++++ b/ipc/sem.c
+@@ -268,6 +268,8 @@ void sem_exit_ns(struct ipc_namespace *n
+ void __init sem_init(void)
+ {
+ 	sem_init_ns(&init_ipc_ns);
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return;
+ 	ipc_init_proc_interface("sysvipc/sem",
+ 				"       key      semid perms      nsems   uid   gid  cuid  cgid      otime      ctime\n",
+ 				IPC_SEM_IDS, sysvipc_sem_proc_show);
+--- a/ipc/shm.c
++++ b/ipc/shm.c
+@@ -154,6 +154,8 @@ pure_initcall(ipc_ns_init);
+ 
+ void __init shm_init(void)
+ {
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return;
+ 	ipc_init_proc_interface("sysvipc/shm",
+ #if BITS_PER_LONG <= 32
+ 				"       key      shmid perms       size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime        rss       swap\n",
+--- a/ipc/util.c
++++ b/ipc/util.c
+@@ -141,6 +141,9 @@ void __init ipc_init_proc_interface(cons
+ 	struct proc_dir_entry *pde;
+ 	struct ipc_proc_iface *iface;
+ 
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return;
++
+ 	iface = kmalloc(sizeof(*iface), GFP_KERNEL);
+ 	if (!iface)
+ 		return;
+--- a/kernel/exec_domain.c
++++ b/kernel/exec_domain.c
+@@ -29,6 +29,8 @@ static int execdomains_proc_show(struct
+ 
+ static int __init proc_execdomains_init(void)
+ {
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return 0;
+ 	proc_create_single("execdomains", 0, NULL, execdomains_proc_show);
+ 	return 0;
+ }
+--- a/kernel/irq/proc.c
++++ b/kernel/irq/proc.c
+@@ -341,6 +341,9 @@ void register_irq_proc(unsigned int irq,
+ 	void __maybe_unused *irqp = (void *)(unsigned long) irq;
+ 	char name [MAX_NAMELEN];
+ 
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))
++		return;
++
+ 	if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip))
+ 		return;
+ 
+@@ -394,6 +397,9 @@ void unregister_irq_proc(unsigned int ir
+ {
+ 	char name [MAX_NAMELEN];
+ 
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))
++		return;
++
+ 	if (!root_irq_dir || !desc->dir)
+ 		return;
+ #ifdef CONFIG_SMP
+@@ -432,6 +438,9 @@ void init_irq_proc(void)
+ 	unsigned int irq;
+ 	struct irq_desc *desc;
+ 
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))
++		return;
++
+ 	/* create /proc/irq */
+ 	root_irq_dir = proc_mkdir("irq", NULL);
+ 	if (!root_irq_dir)
+--- a/kernel/time/timer_list.c
++++ b/kernel/time/timer_list.c
+@@ -350,6 +350,8 @@ static int __init init_timer_list_procfs
+ {
+ 	struct proc_dir_entry *pe;
+ 
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return 0;
+ 	pe = proc_create_seq_private("timer_list", 0400, NULL, &timer_list_sops,
+ 			sizeof(struct timer_list_iter), NULL);
+ 	if (!pe)
+--- a/mm/vmalloc.c
++++ b/mm/vmalloc.c
+@@ -4160,6 +4160,8 @@ static const struct seq_operations vmall
+ 
+ static int __init proc_vmalloc_init(void)
+ {
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return 0;
+ 	if (IS_ENABLED(CONFIG_NUMA))
+ 		proc_create_seq_private("vmallocinfo", 0400, NULL,
+ 				&vmalloc_op,
+--- a/mm/vmstat.c
++++ b/mm/vmstat.c
+@@ -2127,10 +2127,12 @@ void __init init_mm_internals(void)
+ #endif
+ 	migrate_on_reclaim_init();
+ #ifdef CONFIG_PROC_FS
+-	proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op);
+-	proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op);
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {
++		proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op);
++		proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op);
++		proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op);
++	}
+ 	proc_create_seq("vmstat", 0444, NULL, &vmstat_op);
+-	proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op);
+ #endif
+ }
+ 
+--- a/net/8021q/vlanproc.c
++++ b/net/8021q/vlanproc.c
+@@ -93,6 +93,9 @@ void vlan_proc_cleanup(struct net *net)
+ {
+ 	struct vlan_net *vn = net_generic(net, vlan_net_id);
+ 
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return;
++
+ 	if (vn->proc_vlan_conf)
+ 		remove_proc_entry(name_conf, vn->proc_vlan_dir);
+ 
+@@ -112,6 +115,9 @@ int __net_init vlan_proc_init(struct net
+ {
+ 	struct vlan_net *vn = net_generic(net, vlan_net_id);
+ 
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return 0;
++
+ 	vn->proc_vlan_dir = proc_net_mkdir(net, name_root, net->proc_net);
+ 	if (!vn->proc_vlan_dir)
+ 		goto err;
+--- a/net/core/net-procfs.c
++++ b/net/core/net-procfs.c
+@@ -319,10 +319,12 @@ static int __net_init dev_proc_net_init(
+ 	if (!proc_create_net("dev", 0444, net->proc_net, &dev_seq_ops,
+ 			sizeof(struct seq_net_private)))
+ 		goto out;
+-	if (!proc_create_seq("softnet_stat", 0444, net->proc_net,
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
++			!proc_create_seq("softnet_stat", 0444, net->proc_net,
+ 			 &softnet_seq_ops))
+ 		goto out_dev;
+-	if (!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops,
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
++			!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops,
+ 			sizeof(struct seq_net_private)))
+ 		goto out_softnet;
+ 
+@@ -332,9 +334,11 @@ static int __net_init dev_proc_net_init(
+ out:
+ 	return rc;
+ out_ptype:
+-	remove_proc_entry("ptype", net->proc_net);
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
++		remove_proc_entry("ptype", net->proc_net);
+ out_softnet:
+-	remove_proc_entry("softnet_stat", net->proc_net);
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
++		remove_proc_entry("softnet_stat", net->proc_net);
+ out_dev:
+ 	remove_proc_entry("dev", net->proc_net);
+ 	goto out;
+@@ -344,8 +348,10 @@ static void __net_exit dev_proc_net_exit
+ {
+ 	wext_proc_exit(net);
+ 
+-	remove_proc_entry("ptype", net->proc_net);
+-	remove_proc_entry("softnet_stat", net->proc_net);
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {
++		remove_proc_entry("ptype", net->proc_net);
++		remove_proc_entry("softnet_stat", net->proc_net);
++	}
+ 	remove_proc_entry("dev", net->proc_net);
+ }
+ 
+--- a/net/core/sock.c
++++ b/net/core/sock.c
+@@ -4005,6 +4005,8 @@ static __net_initdata struct pernet_oper
+ 
+ static int __init proto_init(void)
+ {
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return 0;
+ 	return register_pernet_subsys(&proto_net_ops);
+ }
+ 
+--- a/net/ipv4/fib_trie.c
++++ b/net/ipv4/fib_trie.c
+@@ -3029,11 +3029,13 @@ static const struct seq_operations fib_r
+ 
+ int __net_init fib_proc_init(struct net *net)
+ {
+-	if (!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops,
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
++			!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops,
+ 			sizeof(struct fib_trie_iter)))
+ 		goto out1;
+ 
+-	if (!proc_create_net_single("fib_triestat", 0444, net->proc_net,
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
++			!proc_create_net_single("fib_triestat", 0444, net->proc_net,
+ 			fib_triestat_seq_show, NULL))
+ 		goto out2;
+ 
+@@ -3044,17 +3046,21 @@ int __net_init fib_proc_init(struct net
+ 	return 0;
+ 
+ out3:
+-	remove_proc_entry("fib_triestat", net->proc_net);
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
++		remove_proc_entry("fib_triestat", net->proc_net);
+ out2:
+-	remove_proc_entry("fib_trie", net->proc_net);
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
++		remove_proc_entry("fib_trie", net->proc_net);
+ out1:
+ 	return -ENOMEM;
+ }
+ 
+ void __net_exit fib_proc_exit(struct net *net)
+ {
+-	remove_proc_entry("fib_trie", net->proc_net);
+-	remove_proc_entry("fib_triestat", net->proc_net);
++	if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {
++		remove_proc_entry("fib_trie", net->proc_net);
++		remove_proc_entry("fib_triestat", net->proc_net);
++	}
+ 	remove_proc_entry("route", net->proc_net);
+ }
+ 
+--- a/net/ipv4/proc.c
++++ b/net/ipv4/proc.c
+@@ -553,5 +553,8 @@ static __net_initdata struct pernet_oper
+ 
+ int __init ip_misc_proc_init(void)
+ {
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return 0;
++
+ 	return register_pernet_subsys(&ip_proc_ops);
+ }
+--- a/net/ipv4/route.c
++++ b/net/ipv4/route.c
+@@ -380,6 +380,9 @@ static struct pernet_operations ip_rt_pr
+ 
+ static int __init ip_rt_proc_init(void)
+ {
++	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
++		return 0;
++
+ 	return register_pernet_subsys(&ip_rt_proc_ops);
+ }
+ 
diff --git a/target/linux/generic/hack-6.0/904-debloat_dma_buf.patch b/target/linux/generic/hack-6.0/904-debloat_dma_buf.patch
new file mode 100644
index 000000000..6e03eb808
--- /dev/null
+++ b/target/linux/generic/hack-6.0/904-debloat_dma_buf.patch
@@ -0,0 +1,93 @@
+From e3692cb2fcd5ba1244512a0f43b8118f65f1c375 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 8 Jul 2017 08:20:43 +0200
+Subject: debloat: dmabuf
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/base/Kconfig      |  2 +-
+ drivers/dma-buf/Makefile  | 10 +++++++---
+ drivers/dma-buf/dma-buf.c |  4 +++-
+ kernel/sched/core.c       |  1 +
+ 4 files changed, 12 insertions(+), 5 deletions(-)
+
+--- a/drivers/base/Kconfig
++++ b/drivers/base/Kconfig
+@@ -198,7 +198,7 @@ config SOC_BUS
+ source "drivers/base/regmap/Kconfig"
+ 
+ config DMA_SHARED_BUFFER
+-	bool
++	tristate
+ 	default n
+ 	select IRQ_WORK
+ 	help
+--- a/drivers/dma-buf/heaps/Makefile
++++ b/drivers/dma-buf/heaps/Makefile
+@@ -1,3 +1,3 @@
+ # SPDX-License-Identifier: GPL-2.0
+-obj-$(CONFIG_DMABUF_HEAPS_SYSTEM)	+= system_heap.o
+-obj-$(CONFIG_DMABUF_HEAPS_CMA)		+= cma_heap.o
++dma-buf-objs-$(CONFIG_DMABUF_HEAPS_SYSTEM)	+= system_heap.o
++dma-buf-objs-$(CONFIG_DMABUF_HEAPS_CMA)		+= cma_heap.o
+--- a/drivers/dma-buf/Makefile
++++ b/drivers/dma-buf/Makefile
+@@ -1,12 +1,14 @@
+ # SPDX-License-Identifier: GPL-2.0-only
+-obj-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
++obj-$(CONFIG_DMA_SHARED_BUFFER) := dma-shared-buffer.o
++
++dma-buf-objs-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
+ 	 dma-fence-unwrap.o dma-resv.o
+-obj-$(CONFIG_DMABUF_HEAPS)	+= dma-heap.o
+-obj-$(CONFIG_DMABUF_HEAPS)	+= heaps/
+-obj-$(CONFIG_SYNC_FILE)		+= sync_file.o
+-obj-$(CONFIG_SW_SYNC)		+= sw_sync.o sync_debug.o
+-obj-$(CONFIG_UDMABUF)		+= udmabuf.o
+-obj-$(CONFIG_DMABUF_SYSFS_STATS) += dma-buf-sysfs-stats.o
++dma-buf-objs-$(CONFIG_DMABUF_HEAPS)	+= dma-heap.o
++obj-$(CONFIG_DMABUF_HEAPS)		+= heaps/
++dma-buf-objs-$(CONFIG_SYNC_FILE)	+= sync_file.o
++dma-buf-objs-$(CONFIG_SW_SYNC)		+= sw_sync.o sync_debug.o
++dma-buf-objs-$(CONFIG_UDMABUF)		+= udmabuf.o
++dma-buf-objs-$(CONFIG_DMABUF_SYSFS_STATS) += udmabuf.o
+ 
+ dmabuf_selftests-y := \
+ 	selftest.o \
+@@ -15,4 +17,6 @@ dmabuf_selftests-y := \
+ 	st-dma-fence-unwrap.o \
+ 	st-dma-resv.o
+ 
+-obj-$(CONFIG_DMABUF_SELFTESTS)	+= dmabuf_selftests.o
++dma-buf-objs-$(CONFIG_DMABUF_SELFTESTS)	+= dmabuf_selftests.o
++
++dma-shared-buffer-objs :=  $(dma-buf-objs-y)
+--- a/drivers/dma-buf/dma-buf.c
++++ b/drivers/dma-buf/dma-buf.c
+@@ -1578,4 +1578,5 @@ static void __exit dma_buf_deinit(void)
+ 	kern_unmount(dma_buf_mnt);
+ 	dma_buf_uninit_sysfs_statistics();
+ }
+-__exitcall(dma_buf_deinit);
++module_exit(dma_buf_deinit);
++MODULE_LICENSE("GPL");
+--- a/kernel/sched/core.c
++++ b/kernel/sched/core.c
+@@ -4319,6 +4319,7 @@ int wake_up_state(struct task_struct *p,
+ {
+ 	return try_to_wake_up(p, state, 0);
+ }
++EXPORT_SYMBOL_GPL(wake_up_state);
+ 
+ /*
+  * Perform scheduler related setup for a newly forked process p.
+--- a/fs/d_path.c
++++ b/fs/d_path.c
+@@ -314,6 +314,7 @@ char *dynamic_dname(struct dentry *dentr
+ 	buffer += buflen - sz;
+ 	return memcpy(buffer, temp, sz);
+ }
++EXPORT_SYMBOL_GPL(dynamic_dname);
+ 
+ char *simple_dname(struct dentry *dentry, char *buffer, int buflen)
+ {
diff --git a/target/linux/generic/hack-6.0/910-kobject_uevent.patch b/target/linux/generic/hack-6.0/910-kobject_uevent.patch
new file mode 100644
index 000000000..c4c41ca40
--- /dev/null
+++ b/target/linux/generic/hack-6.0/910-kobject_uevent.patch
@@ -0,0 +1,32 @@
+From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sun, 16 Jul 2017 16:56:10 +0200
+Subject: lib: add uevent_next_seqnum()
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/kobject.h |  5 +++++
+ lib/kobject_uevent.c    | 37 +++++++++++++++++++++++++++++++++++++
+ 2 files changed, 42 insertions(+)
+
+--- a/lib/kobject_uevent.c
++++ b/lib/kobject_uevent.c
+@@ -179,6 +179,18 @@ out:
+ 	return r;
+ }
+ 
++u64 uevent_next_seqnum(void)
++{
++	u64 seq;
++
++	mutex_lock(&uevent_sock_mutex);
++	seq = ++uevent_seqnum;
++	mutex_unlock(&uevent_sock_mutex);
++
++	return seq;
++}
++EXPORT_SYMBOL_GPL(uevent_next_seqnum);
++
+ /**
+  * kobject_synth_uevent - send synthetic uevent with arguments
+  *
diff --git a/target/linux/generic/hack-6.0/911-kobject_add_broadcast_uevent.patch b/target/linux/generic/hack-6.0/911-kobject_add_broadcast_uevent.patch
new file mode 100644
index 000000000..9854585d2
--- /dev/null
+++ b/target/linux/generic/hack-6.0/911-kobject_add_broadcast_uevent.patch
@@ -0,0 +1,76 @@
+From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sun, 16 Jul 2017 16:56:10 +0200
+Subject: lib: add uevent_next_seqnum()
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/kobject.h |  5 +++++
+ lib/kobject_uevent.c    | 37 +++++++++++++++++++++++++++++++++++++
+ 2 files changed, 42 insertions(+)
+
+--- a/include/linux/kobject.h
++++ b/include/linux/kobject.h
+@@ -32,6 +32,8 @@
+ #define UEVENT_NUM_ENVP			64	/* number of env pointers */
+ #define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */
+ 
++struct sk_buff;
++
+ #ifdef CONFIG_UEVENT_HELPER
+ /* path to the userspace helper executed on an event */
+ extern char uevent_helper[];
+@@ -224,4 +226,7 @@ int kobject_synth_uevent(struct kobject
+ __printf(2, 3)
+ int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);
+ 
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++		     gfp_t allocation);
++
+ #endif /* _KOBJECT_H_ */
+--- a/lib/kobject_uevent.c
++++ b/lib/kobject_uevent.c
+@@ -691,6 +691,43 @@ int add_uevent_var(struct kobj_uevent_en
+ EXPORT_SYMBOL_GPL(add_uevent_var);
+ 
+ #if defined(CONFIG_NET)
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++		     gfp_t allocation)
++{
++	struct uevent_sock *ue_sk;
++	int err = 0;
++
++	/* send netlink message */
++	mutex_lock(&uevent_sock_mutex);
++	list_for_each_entry(ue_sk, &uevent_sock_list, list) {
++		struct sock *uevent_sock = ue_sk->sk;
++		struct sk_buff *skb2;
++
++		skb2 = skb_clone(skb, allocation);
++		if (!skb2)
++			break;
++
++		err = netlink_broadcast(uevent_sock, skb2, pid, group,
++					allocation);
++		if (err)
++			break;
++	}
++	mutex_unlock(&uevent_sock_mutex);
++
++	kfree_skb(skb);
++	return err;
++}
++#else
++int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
++		     gfp_t allocation)
++{
++	kfree_skb(skb);
++	return 0;
++}
++#endif
++EXPORT_SYMBOL_GPL(broadcast_uevent);
++
++#if defined(CONFIG_NET)
+ static int uevent_net_broadcast(struct sock *usk, struct sk_buff *skb,
+ 				struct netlink_ext_ack *extack)
+ {
diff --git a/target/linux/generic/hack-6.0/920-device_tree_cmdline.patch b/target/linux/generic/hack-6.0/920-device_tree_cmdline.patch
new file mode 100644
index 000000000..a3a76f66a
--- /dev/null
+++ b/target/linux/generic/hack-6.0/920-device_tree_cmdline.patch
@@ -0,0 +1,12 @@
+--- a/drivers/of/fdt.c
++++ b/drivers/of/fdt.c
+@@ -1179,6 +1179,9 @@ int __init early_init_dt_scan_chosen(cha
+ 	p = of_get_flat_dt_prop(node, "bootargs", &l);
+ 	if (p != NULL && l > 0)
+ 		strlcpy(cmdline, p, min(l, COMMAND_LINE_SIZE));
++	p = of_get_flat_dt_prop(node, "bootargs-append", &l);
++	if (p != NULL && l > 0)
++		strlcat(cmdline, p, min_t(int, strlen(cmdline) + (int)l, COMMAND_LINE_SIZE));
+ 
+ 	/*
+ 	 * CONFIG_CMDLINE is meant to be a default in case nothing else
diff --git a/target/linux/generic/hack-6.0/952-add-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-6.0/952-add-net-conntrack-events-support-multiple-registrant.patch
new file mode 100644
index 000000000..8c9cd95bb
--- /dev/null
+++ b/target/linux/generic/hack-6.0/952-add-net-conntrack-events-support-multiple-registrant.patch
@@ -0,0 +1,352 @@
+From 42824d4b753f84ccf885eca602c5037338b546c8 Mon Sep 17 00:00:00 2001
+From: Zhi Chen <zhichen@codeaurora.org>
+Date: Tue, 13 Jan 2015 14:28:18 -0800
+Subject: [PATCH 3/3] net: conntrack events, support multiple registrant
+
+Merging this patch from kernel 3.4:
+This was supported by old (.28) kernel versions but removed
+because of it's overhead.
+But we need this feature for NA connection manager. Both ipv4
+and ipv6 modules needs to register themselves to ct events.
+
+Change-Id: Iebfb254590fb594f5baf232f849d1b7ae45ef757
+Signed-off-by: Zhi Chen <zhichen@codeaurora.org>
+---
+ include/net/netfilter/nf_conntrack_ecache.h |  15 ++-
+ include/net/netns/conntrack.h               |   3 +
+ net/netfilter/Kconfig                       |   8 ++
+ net/netfilter/nf_conntrack_core.c           |   4 +
+ net/netfilter/nf_conntrack_ecache.c         | 103 +++++++++++++++++++-
+ net/netfilter/nf_conntrack_netlink.c        |  17 ++++
+ 6 files changed, 146 insertions(+), 4 deletions(-)
+
+--- a/include/net/netfilter/nf_conntrack_ecache.h
++++ b/include/net/netfilter/nf_conntrack_ecache.h
+@@ -65,9 +65,14 @@ struct nf_ct_event_notifier {
+ 	int (*exp_event)(unsigned int events, const struct nf_exp_event *item);
+ };
+ 
+-void nf_conntrack_register_notifier(struct net *net,
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);
++extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);
++#else
++int nf_conntrack_register_notifier(struct net *net,
+ 				   const struct nf_ct_event_notifier *nb);
+ void nf_conntrack_unregister_notifier(struct net *net);
++#endif
+ 
+ void nf_ct_deliver_cached_events(struct nf_conn *ct);
+ int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,
+@@ -98,11 +103,13 @@ static inline void
+ nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)
+ {
+ #ifdef CONFIG_NF_CONNTRACK_EVENTS
+-	struct net *net = nf_ct_net(ct);
+ 	struct nf_conntrack_ecache *e;
++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++	struct net *net = nf_ct_net(ct);
+ 
+ 	if (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))
+ 		return;
++#endif
+ 
+ 	e = nf_ct_ecache_find(ct);
+ 	if (e == NULL)
+@@ -117,20 +124,34 @@ nf_conntrack_event_report(enum ip_conntr
+ 			  u32 portid, int report)
+ {
+ #ifdef CONFIG_NF_CONNTRACK_EVENTS
+-	if (nf_ct_ecache_exist(ct))
+-		return nf_conntrack_eventmask_report(1 << event, ct, portid, report);
++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++	const struct net *net = nf_ct_net(ct);
++
++	if (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))
++		return 0;
+ #endif
++
++	return nf_conntrack_eventmask_report(1 << event, ct, portid, report);
++#else
+ 	return 0;
++#endif
+ }
+ 
+ static inline int
+ nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)
+ {
+ #ifdef CONFIG_NF_CONNTRACK_EVENTS
+-	if (nf_ct_ecache_exist(ct))
+-		return nf_conntrack_eventmask_report(1 << event, ct, 0, 0);
++#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++	const struct net *net = nf_ct_net(ct);
++
++	if (!rcu_access_pointer(net->ct.nf_conntrack_event_cb))
++		return 0;
+ #endif
++
++	return nf_conntrack_eventmask_report(1 << event, ct, 0, 0);
++#else
+ 	return 0;
++#endif
+ }
+ 
+ #ifdef CONFIG_NF_CONNTRACK_EVENTS
+--- a/include/net/netns/conntrack.h
++++ b/include/net/netns/conntrack.h
+@@ -106,6 +106,9 @@ struct netns_ct {
+ 	u8			sysctl_checksum;
+ 
+ 	struct ip_conntrack_stat __percpu *stat;
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++	struct atomic_notifier_head nf_conntrack_chain;
++#endif
+ 	struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb;
+ 	struct nf_ip_net	nf_ct_proto;
+ #if defined(CONFIG_NF_CONNTRACK_LABELS)
+--- a/net/netfilter/Kconfig
++++ b/net/netfilter/Kconfig
+@@ -161,6 +161,14 @@ config NF_CONNTRACK_EVENTS
+ 
+ 	  If unsure, say `N'.
+ 
++config NF_CONNTRACK_CHAIN_EVENTS
++	bool "Register multiple callbacks to ct events"
++	depends on NF_CONNTRACK_EVENTS
++	help
++	  Support multiple registrations.
++
++	  If unsure, say `N'.
++
+ config NF_CONNTRACK_TIMEOUT
+ 	bool  'Connection tracking timeout'
+ 	depends on NETFILTER_ADVANCED
+--- a/net/netfilter/nf_conntrack_core.c
++++ b/net/netfilter/nf_conntrack_core.c
+@@ -2803,6 +2803,10 @@ int nf_conntrack_init_net(struct net *ne
+ 	nf_conntrack_ecache_pernet_init(net);
+ 	nf_conntrack_proto_pernet_init(net);
+ 
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++	ATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain);
++#endif
++
+ 	return 0;
+ 
+ err_expect:
+--- a/net/netfilter/nf_conntrack_ecache.c
++++ b/net/netfilter/nf_conntrack_ecache.c
+@@ -17,6 +17,9 @@
+ #include <linux/stddef.h>
+ #include <linux/err.h>
+ #include <linux/kernel.h>
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++#include <linux/notifier.h>
++#endif
+ #include <linux/netdevice.h>
+ #include <linux/slab.h>
+ #include <linux/export.h>
+@@ -162,6 +165,35 @@ static int __nf_conntrack_eventmask_repo
+ 	return ret;
+ }
+ 
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct,
++				  u32 portid, int report)
++{
++	struct nf_conntrack_ecache *e;
++	struct net *net = nf_ct_net(ct);
++
++	e = nf_ct_ecache_find(ct);
++	if (e == NULL)
++		return 0;
++
++	if (nf_ct_is_confirmed(ct)) {
++		struct nf_ct_event item = {
++			.ct = ct,
++			.portid	= e->portid ? e->portid : portid,
++			.report = report
++		};
++		/* This is a resent of a destroy event? If so, skip missed */
++		unsigned long missed = e->portid ? 0 : e->missed;
++
++		if (!((eventmask | missed) & e->ctmask))
++			return 0;
++
++		atomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item);
++	}
++
++	return 0;
++}
++#else
+ int nf_conntrack_eventmask_report(unsigned int events, struct nf_conn *ct,
+ 				  u32 portid, int report)
+ {
+@@ -197,10 +229,52 @@ int nf_conntrack_eventmask_report(unsign
+ 
+ 	return ret;
+ }
++#endif
+ EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report);
+ 
+ /* deliver cached events and clear cache entry - must be called with locally
+  * disabled softirqs */
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++void nf_ct_deliver_cached_events(struct nf_conn *ct)
++{
++	unsigned long events, missed;
++	struct nf_conntrack_ecache *e;
++	struct nf_ct_event item;
++	struct net *net = nf_ct_net(ct);
++
++	e = nf_ct_ecache_find(ct);
++	if (e == NULL)
++		return;
++
++	events = xchg(&e->cache, 0);
++
++	if (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events)
++		return;
++
++	/* We make a copy of the missed event cache without taking
++	 * the lock, thus we may send missed events twice. However,
++	 * this does not harm and it happens very rarely. */
++	missed = e->missed;
++
++	if (!((events | missed) & e->ctmask))
++		return;
++
++	item.ct = ct;
++	item.portid = 0;
++	item.report = 0;
++
++	atomic_notifier_call_chain(&net->ct.nf_conntrack_chain,
++			events | missed,
++			&item);
++
++	if (likely(!missed))
++		return;
++
++	spin_lock_bh(&ct->lock);
++		e->missed &= ~missed;
++	spin_unlock_bh(&ct->lock);
++}
++#else
+ void nf_ct_deliver_cached_events(struct nf_conn *ct)
+ {
+ 	struct nf_conntrack_ecache *e;
+@@ -226,6 +300,7 @@ void nf_ct_deliver_cached_events(struct
+ 	 */
+ 	__nf_conntrack_eventmask_report(e, events, e->missed, &item);
+ }
++#endif
+ EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events);
+ 
+ void nf_ct_expect_event_report(enum ip_conntrack_expect_events event,
+@@ -258,20 +333,43 @@ out_unlock:
+ 	rcu_read_unlock();
+ }
+ 
+-void nf_conntrack_register_notifier(struct net *net,
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++int nf_conntrack_register_notifier(struct net *net,
++				   struct notifier_block *nb)
++{
++	return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);
++}
++#else
++int nf_conntrack_register_notifier(struct net *net,
+ 				    const struct nf_ct_event_notifier *new)
+ {
++	int ret;
+ 	struct nf_ct_event_notifier *notify;
+ 
+ 	mutex_lock(&nf_ct_ecache_mutex);
+ 	notify = rcu_dereference_protected(net->ct.nf_conntrack_event_cb,
+ 					   lockdep_is_held(&nf_ct_ecache_mutex));
+ 	WARN_ON_ONCE(notify);
++	if (notify != NULL) {
++		ret = -EBUSY;
++		goto out_unlock;
++	}
++
+ 	rcu_assign_pointer(net->ct.nf_conntrack_event_cb, new);
+-	mutex_unlock(&nf_ct_ecache_mutex);
++	ret = 0;
++out_unlock:
++ 	mutex_unlock(&nf_ct_ecache_mutex);
++	return ret;
+ }
++#endif
+ EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier);
+ 
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb)
++{
++	return atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);
++}
++#else
+ void nf_conntrack_unregister_notifier(struct net *net)
+ {
+ 	mutex_lock(&nf_ct_ecache_mutex);
+@@ -279,6 +377,7 @@ void nf_conntrack_unregister_notifier(st
+ 	mutex_unlock(&nf_ct_ecache_mutex);
+ 	/* synchronize_rcu() is called after netns pre_exit */
+ }
++#endif
+ EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier);
+ 
+ void nf_conntrack_ecache_work(struct net *net, enum nf_ct_ecache_state state)
+--- a/net/netfilter/nf_conntrack_netlink.c
++++ b/net/netfilter/nf_conntrack_netlink.c
+@@ -712,12 +712,19 @@ static size_t ctnetlink_nlmsg_size(const
+ }
+ 
+ static int
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++ctnetlink_conntrack_event(struct notifier_block *this, unsigned long events, void *ptr)
++#else
+ ctnetlink_conntrack_event(unsigned int events, const struct nf_ct_event *item)
++#endif
+ {
+ 	const struct nf_conntrack_zone *zone;
+ 	struct net *net;
+ 	struct nlmsghdr *nlh;
+ 	struct nlattr *nest_parms;
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++	struct nf_ct_event *item = (struct nf_ct_event *)ptr;
++#endif
+ 	struct nf_conn *ct = item->ct;
+ 	struct sk_buff *skb;
+ 	unsigned int type;
+@@ -3745,11 +3752,17 @@ static int ctnetlink_stat_exp_cpu(struct
+ }
+ 
+ #ifdef CONFIG_NF_CONNTRACK_EVENTS
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++static struct notifier_block ctnl_notifier = {
++	.notifier_call = ctnetlink_conntrack_event
++};
++#else
+ static struct nf_ct_event_notifier ctnl_notifier = {
+ 	.ct_event = ctnetlink_conntrack_event,
+ 	.exp_event = ctnetlink_expect_event,
+ };
+ #endif
++#endif
+ 
+ static const struct nfnl_callback ctnl_cb[IPCTNL_MSG_MAX] = {
+ 	[IPCTNL_MSG_CT_NEW]	= {
+@@ -3848,8 +3861,12 @@ static int __net_init ctnetlink_net_init
+ static void ctnetlink_net_pre_exit(struct net *net)
+ {
+ #ifdef CONFIG_NF_CONNTRACK_EVENTS
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++	nf_conntrack_unregister_notifier(net,&ctnl_notifier);
++#else
+ 	nf_conntrack_unregister_notifier(net);
+ #endif
++#endif
+ }
+ 
+ static struct pernet_operations ctnetlink_net_ops = {
diff --git a/target/linux/generic/hack-6.0/953-net-patch-linux-kernel-to-support-shortcut-fe.patch b/target/linux/generic/hack-6.0/953-net-patch-linux-kernel-to-support-shortcut-fe.patch
new file mode 100644
index 000000000..95fbdfc28
--- /dev/null
+++ b/target/linux/generic/hack-6.0/953-net-patch-linux-kernel-to-support-shortcut-fe.patch
@@ -0,0 +1,204 @@
+--- a/include/linux/if_bridge.h
++++ b/include/linux/if_bridge.h
+@@ -69,6 +69,9 @@ void brioctl_set(int (*hook)(struct net
+ int br_ioctl_call(struct net *net, struct net_bridge *br, unsigned int cmd,
+ 		  struct ifreq *ifr, void __user *uarg);
+ 
++extern void br_dev_update_stats(struct net_device *dev,
++				struct rtnl_link_stats64 *nlstats);
++
+ #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING)
+ int br_multicast_list_adjacent(struct net_device *dev,
+ 			       struct list_head *br_ip_list);
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -979,6 +979,10 @@ struct sk_buff {
+ 	__u8			csum_not_inet:1;
+ 	__u8			scm_io_uring:1;
+ 
++#ifdef CONFIG_SHORTCUT_FE
++	__u8			fast_forwarded:1;
++#endif
++
+ #ifdef CONFIG_NET_SCHED
+ 	__u16			tc_index;	/* traffic control index */
+ #endif
+--- a/include/linux/timer.h
++++ b/include/linux/timer.h
+@@ -18,6 +18,10 @@ struct timer_list {
+ 	void			(*function)(struct timer_list *);
+ 	u32			flags;
+ 
++#ifdef CONFIG_SHORTCUT_FE
++	unsigned long		cust_data;
++#endif
++
+ #ifdef CONFIG_LOCKDEP
+ 	struct lockdep_map	lockdep_map;
+ #endif
+--- a/include/net/netfilter/nf_conntrack_ecache.h
++++ b/include/net/netfilter/nf_conntrack_ecache.h
+@@ -68,6 +68,8 @@ struct nf_ct_event_notifier {
+ #ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
+ extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb);
+ extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb);
++extern int nf_conntrack_register_chain_notifier(struct net *net, struct notifier_block *nb);
++extern int nf_conntrack_unregister_chain_notifier(struct net *net, struct notifier_block *nb);
+ #else
+ int nf_conntrack_register_notifier(struct net *net,
+ 				   const struct nf_ct_event_notifier *nb);
+--- a/net/Kconfig
++++ b/net/Kconfig
+@@ -460,6 +460,9 @@ config FAILOVER
+ 	  migration of VMs with direct attached VFs by failing over to the
+ 	  paravirtual datapath when the VF is unplugged.
+ 
++config SHORTCUT_FE
++	bool "Enables kernel network stack path for Shortcut  Forwarding Engine"
++
+ config ETHTOOL_NETLINK
+ 	bool "Netlink interface for ethtool"
+ 	default y
+--- a/net/bridge/br_if.c
++++ b/net/bridge/br_if.c
+@@ -774,6 +774,28 @@ void br_port_flags_change(struct net_bri
+ 		br_recalculate_neigh_suppress_enabled(br);
+ }
+ 
++void br_dev_update_stats(struct net_device *dev,
++			 struct rtnl_link_stats64 *nlstats)
++{
++	
++	struct pcpu_sw_netstats *stats;
++
++	/* Is this a bridge? */
++	if (!(dev->priv_flags & IFF_EBRIDGE))
++		return;
++
++	
++	stats = this_cpu_ptr(dev->tstats);
++
++	u64_stats_update_begin(&stats->syncp);
++	u64_stats_add(&stats->rx_packets, nlstats->rx_packets);
++	u64_stats_add(&stats->rx_bytes, nlstats->rx_bytes);
++	u64_stats_add(&stats->tx_packets, nlstats->tx_packets);
++	u64_stats_add(&stats->tx_bytes, nlstats->tx_bytes);
++	u64_stats_update_end(&stats->syncp);
++}
++EXPORT_SYMBOL_GPL(br_dev_update_stats);
++
+ bool br_port_flag_is_set(const struct net_device *dev, unsigned long flag)
+ {
+ 	struct net_bridge_port *p;
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -3581,9 +3581,17 @@ static int xmit_one(struct sk_buff *skb,
+ {
+ 	unsigned int len;
+ 	int rc;
+-
++#ifdef CONFIG_SHORTCUT_FE
++	/* If this skb has been fast forwarded then we don't want it to
++	 * go to any taps (by definition we're trying to bypass them).
++	 */
++	if (!skb->fast_forwarded) {
++#endif
+ 	if (dev_nit_active(dev))
+ 		dev_queue_xmit_nit(skb, dev);
++#ifdef CONFIG_SHORTCUT_FE
++	}
++#endif
+ 
+ 	len = skb->len;
+ 	trace_net_dev_start_xmit(skb, dev);
+@@ -5233,6 +5241,11 @@ void netdev_rx_handler_unregister(struct
+ }
+ EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister);
+ 
++#ifdef CONFIG_SHORTCUT_FE
++int (*athrs_fast_nat_recv)(struct sk_buff *skb) __rcu __read_mostly;
++EXPORT_SYMBOL_GPL(athrs_fast_nat_recv);
++#endif
++
+ /*
+  * Limit the use of PFMEMALLOC reserves to those protocols that implement
+  * the special handling of PFMEMALLOC skbs.
+@@ -5281,6 +5294,10 @@ static int __netif_receive_skb_core(stru
+ 	int ret = NET_RX_DROP;
+ 	__be16 type;
+ 
++#ifdef CONFIG_SHORTCUT_FE
++	int (*fast_recv)(struct sk_buff *skb);
++#endif
++
+ 	net_timestamp_check(!READ_ONCE(netdev_tstamp_prequeue), skb);
+ 
+ 	trace_netif_receive_skb(skb);
+@@ -5318,6 +5335,15 @@ another_round:
+ 			goto out;
+ 	}
+ 
++#ifdef CONFIG_SHORTCUT_FE
++	fast_recv = rcu_dereference(athrs_fast_nat_recv);
++	if (fast_recv) {
++		if (fast_recv(skb)) {
++			ret = NET_RX_SUCCESS;
++			goto out;
++		}
++	}
++#endif
+ 	if (skb_skip_tc_classify(skb))
+ 		goto skip_classify;
+ 
+--- a/net/netfilter/nf_conntrack_ecache.c
++++ b/net/netfilter/nf_conntrack_ecache.c
+@@ -143,12 +143,23 @@ static int __nf_conntrack_eventmask_repo
+ 	rcu_read_lock();
+ 
+ 	notify = rcu_dereference(net->ct.nf_conntrack_event_cb);
+-	if (!notify) {
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++	if (!notify && !rcu_dereference_raw(net->ct.nf_conntrack_chain.head))
++#else
++	if (!notify) 
++#endif
++	{
+ 		rcu_read_unlock();
+ 		return 0;
+ 	}
+-
++#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS
++		ret = atomic_notifier_call_chain(&net->ct.nf_conntrack_chain,
++			events | missed, &item);
++		if (notify)
++			ret = notify->ct_event(events | missed, item);
++#else
+ 	ret = notify->ct_event(events | missed, item);
++#endif
+ 	rcu_read_unlock();
+ 
+ 	if (likely(ret >= 0 && missed == 0))
+@@ -339,6 +350,11 @@ int nf_conntrack_register_notifier(struc
+ {
+ 	return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);
+ }
++int nf_conntrack_register_chain_notifier(struct net *net, struct notifier_block *nb)
++{
++	return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb);
++}
++EXPORT_SYMBOL_GPL(nf_conntrack_register_chain_notifier);
+ #else
+ int nf_conntrack_register_notifier(struct net *net,
+ 				    const struct nf_ct_event_notifier *new)
+@@ -369,6 +385,11 @@ int nf_conntrack_unregister_notifier(str
+ {
+ 	return atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);
+ }
++int nf_conntrack_unregister_chain_notifier(struct net *net, struct notifier_block *nb)
++{
++	return atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb);
++}
++EXPORT_SYMBOL_GPL(nf_conntrack_unregister_chain_notifier);
+ #else
+ void nf_conntrack_unregister_notifier(struct net *net)
+ {
diff --git a/target/linux/generic/hack-6.0/992-add-ndo-do-ioctl.patch b/target/linux/generic/hack-6.0/992-add-ndo-do-ioctl.patch
new file mode 100644
index 000000000..da206e4b4
--- /dev/null
+++ b/target/linux/generic/hack-6.0/992-add-ndo-do-ioctl.patch
@@ -0,0 +1,12 @@
+--- a/net/wireless/wext-core.c
++++ b/net/wireless/wext-core.c
+@@ -956,6 +956,9 @@ static int wireless_process_ioctl(struct
+ 		else if (private)
+ 			return private(dev, iwr, cmd, info, handler);
+ 	}
++	/* Old driver API : call driver ioctl handler */
++	if (dev->netdev_ops->ndo_do_ioctl)
++		return dev->netdev_ops->ndo_do_ioctl(dev, (struct ifreq *) iwr, cmd);
+ 	return -EOPNOTSUPP;
+ }
+ 
diff --git a/target/linux/generic/pending-6.0/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch b/target/linux/generic/pending-6.0/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch
new file mode 100644
index 000000000..15f1e4171
--- /dev/null
+++ b/target/linux/generic/pending-6.0/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch
@@ -0,0 +1,29 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Thu, 22 Oct 2020 22:00:03 +0200
+Subject: [PATCH] compiler.h: only include asm/rwonce.h for kernel code
+
+This header file is not in uapi, which makes any user space code that includes
+linux/compiler.h to fail with the error 'asm/rwonce.h: No such file or directory'
+
+Fixes: e506ea451254 ("compiler.h: Split {READ,WRITE}_ONCE definitions out into rwonce.h")
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/include/linux/compiler.h
++++ b/include/linux/compiler.h
+@@ -213,6 +213,8 @@ void ftrace_likely_update(struct ftrace_
+ #define function_nocfi(x) (x)
+ #endif
+ 
++#include <asm/rwonce.h>
++
+ #endif /* __KERNEL__ */
+ 
+ /*
+@@ -251,6 +253,4 @@ static inline void *offset_to_ptr(const
+  */
+ #define prevent_tail_call_optimization()	mb()
+ 
+-#include <asm/rwonce.h>
+-
+ #endif /* __LINUX_COMPILER_H */
diff --git a/target/linux/generic/pending-6.0/101-Use-stddefs.h-instead-of-compiler.h.patch b/target/linux/generic/pending-6.0/101-Use-stddefs.h-instead-of-compiler.h.patch
new file mode 100644
index 000000000..824b9444e
--- /dev/null
+++ b/target/linux/generic/pending-6.0/101-Use-stddefs.h-instead-of-compiler.h.patch
@@ -0,0 +1,11 @@
+--- a/include/uapi/linux/swab.h
++++ b/include/uapi/linux/swab.h
+@@ -3,7 +3,7 @@
+ #define _UAPI_LINUX_SWAB_H
+ 
+ #include <linux/types.h>
+-#include <linux/compiler.h>
++#include <linux/stddef.h>
+ #include <asm/bitsperlong.h>
+ #include <asm/swab.h>
+ 
diff --git a/target/linux/generic/pending-6.0/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch b/target/linux/generic/pending-6.0/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch
new file mode 100644
index 000000000..7ce3d491c
--- /dev/null
+++ b/target/linux/generic/pending-6.0/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch
@@ -0,0 +1,57 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Wed, 18 Apr 2018 10:50:05 +0200
+Subject: [PATCH] MIPS: only process negative stack offsets on stack traces
+
+Fixes endless back traces in cases where the compiler emits a stack
+pointer increase in a branch delay slot (probably for some form of
+function return).
+
+[    3.475442] BUG: MAX_STACK_TRACE_ENTRIES too low!
+[    3.480070] turning off the locking correctness validator.
+[    3.485521] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.34 #0
+[    3.491475] Stack : 00000000 00000000 00000000 00000000 80e0fce2 00000034 00000000 00000000
+[    3.499764]         87c3838c 80696377 8061047c 00000000 00000001 00000001 87c2d850 6534689f
+[    3.508059]         00000000 00000000 80e10000 00000000 00000000 000000cf 0000000f 00000000
+[    3.516353]         00000000 806a0000 00076891 00000000 00000000 00000000 ffffffff 00000000
+[    3.524648]         806c0000 00000004 80e10000 806a0000 00000003 80690000 00000000 80700000
+[    3.532942]         ...
+[    3.535362] Call Trace:
+[    3.537818] [<80010a48>] show_stack+0x58/0x100
+[    3.542207] [<804c2f78>] dump_stack+0xe8/0x170
+[    3.546613] [<80079f90>] save_trace+0xf0/0x110
+[    3.551010] [<8007b1ec>] mark_lock+0x33c/0x78c
+[    3.555413] [<8007bf48>] __lock_acquire+0x2ac/0x1a08
+[    3.560337] [<8007de60>] lock_acquire+0x64/0x8c
+[    3.564846] [<804e1570>] _raw_spin_lock_irqsave+0x54/0x78
+[    3.570186] [<801b618c>] kernfs_notify+0x94/0xac
+[    3.574770] [<801b7b10>] sysfs_notify+0x74/0xa0
+[    3.579257] [<801b618c>] kernfs_notify+0x94/0xac
+[    3.583839] [<801b7b10>] sysfs_notify+0x74/0xa0
+[    3.588329] [<801b618c>] kernfs_notify+0x94/0xac
+[    3.592911] [<801b7b10>] sysfs_notify+0x74/0xa0
+[    3.597401] [<801b618c>] kernfs_notify+0x94/0xac
+[    3.601983] [<801b7b10>] sysfs_notify+0x74/0xa0
+[    3.606473] [<801b618c>] kernfs_notify+0x94/0xac
+[    3.611055] [<801b7b10>] sysfs_notify+0x74/0xa0
+[    3.615545] [<801b618c>] kernfs_notify+0x94/0xac
+[    3.620125] [<801b7b10>] sysfs_notify+0x74/0xa0
+[    3.624619] [<801b618c>] kernfs_notify+0x94/0xac
+[    3.629197] [<801b7b10>] sysfs_notify+0x74/0xa0
+[    3.633691] [<801b618c>] kernfs_notify+0x94/0xac
+[    3.638269] [<801b7b10>] sysfs_notify+0x74/0xa0
+[    3.642763] [<801b618c>] kernfs_notify+0x94/0xac
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/arch/mips/kernel/process.c
++++ b/arch/mips/kernel/process.c
+@@ -394,6 +394,8 @@ static inline int is_sp_move_ins(union m
+ 
+ 	if (ip->i_format.opcode == addiu_op ||
+ 	    ip->i_format.opcode == daddiu_op) {
++		if (ip->i_format.simmediate > 0)
++			return 0;
+ 		*frame_size = -ip->i_format.simmediate;
+ 		return 1;
+ 	}
diff --git a/target/linux/generic/pending-6.0/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-6.0/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch
new file mode 100644
index 000000000..a61558e2e
--- /dev/null
+++ b/target/linux/generic/pending-6.0/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch
@@ -0,0 +1,82 @@
+From: Tobias Wolf <dev-NTEO@vplace.de>
+Subject: mm: Fix alloc_node_mem_map with ARCH_PFN_OFFSET calculation
+
+An rt288x (ralink) based router (Belkin F5D8235 v1) does not boot with any
+kernel beyond version 4.3 resulting in:
+
+BUG: Bad page state in process swapper  pfn:086ac
+
+bisect resulted in:
+
+a1c34a3bf00af2cede839879502e12dc68491ad5 is the first bad commit
+commit a1c34a3bf00af2cede839879502e12dc68491ad5
+Author: Laura Abbott <laura@labbott.name>
+Date:   Thu Nov 5 18:48:46 2015 -0800
+
+    mm: Don't offset memmap for flatmem
+
+    Srinivas Kandagatla reported bad page messages when trying to remove the
+    bottom 2MB on an ARM based IFC6410 board
+
+      BUG: Bad page state in process swapper  pfn:fffa8
+      page:ef7fb500 count:0 mapcount:0 mapping:  (null) index:0x0
+      flags: 0x96640253(locked|error|dirty|active|arch_1|reclaim|mlocked)
+      page dumped because: PAGE_FLAGS_CHECK_AT_FREE flag(s) set
+      bad because of flags:
+      flags: 0x200041(locked|active|mlocked)
+      Modules linked in:
+      CPU: 0 PID: 0 Comm: swapper Not tainted 3.19.0-rc3-00007-g412f9ba-dirty
+#816
+      Hardware name: Qualcomm (Flattened Device Tree)
+        unwind_backtrace
+        show_stack
+        dump_stack
+        bad_page
+        free_pages_prepare
+        free_hot_cold_page
+        __free_pages
+        free_highmem_page
+        mem_init
+        start_kernel
+      Disabling lock debugging due to kernel taint
+    [...]
+:040000 040000 2de013c372345fd471cd58f0553c9b38b0ef1cc4
+0a8156f848733dfa21e16c196dfb6c0a76290709 M      mm
+
+This fix for ARM does not account ARCH_PFN_OFFSET for mem_map as later used by
+page_to_pfn anymore.
+
+The following output was generated with two hacked in printk statements:
+
+printk("before %p vs. %p or %p\n", mem_map, mem_map - offset, mem_map -
+(pgdat->node_start_pfn - ARCH_PFN_OFFSET));
+		if (page_to_pfn(mem_map) != pgdat->node_start_pfn)
+			mem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET);
+printk("after %p\n", mem_map);
+
+Output:
+
+[    0.000000] before 8861b280 vs. 8861b280 or 8851b280
+[    0.000000] after 8851b280
+
+As seen in the first line mem_map with subtraction of offset does not equal the
+mem_map after subtraction of ARCH_PFN_OFFSET.
+
+After adding the offset of ARCH_PFN_OFFSET as well to mem_map as the
+previously calculated offset is zero for the named platform it is able to boot
+4.4 and 4.9-rc7 again.
+
+Signed-off-by: Tobias Wolf <dev-NTEO@vplace.de>
+---
+
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -7837,7 +7837,7 @@ static void __init alloc_node_mem_map(st
+ 	if (pgdat == NODE_DATA(0)) {
+ 		mem_map = NODE_DATA(0)->node_mem_map;
+ 		if (page_to_pfn(mem_map) != pgdat->node_start_pfn)
+-			mem_map -= offset;
++			mem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET);
+ 	}
+ #endif
+ }
diff --git a/target/linux/generic/pending-6.0/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch b/target/linux/generic/pending-6.0/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch
new file mode 100644
index 000000000..8f40ae3ba
--- /dev/null
+++ b/target/linux/generic/pending-6.0/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch
@@ -0,0 +1,81 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: jffs2: use .rename2 and add RENAME_WHITEOUT support
+
+It is required for renames on overlayfs
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/fs/jffs2/dir.c
++++ b/fs/jffs2/dir.c
+@@ -614,8 +614,8 @@ static int jffs2_rmdir (struct inode *di
+ 	return ret;
+ }
+ 
+-static int jffs2_mknod (struct user_namespace *mnt_userns, struct inode *dir_i,
+-		        struct dentry *dentry, umode_t mode, dev_t rdev)
++static int __jffs2_mknod (struct user_namespace *mnt_userns, struct inode *dir_i,
++			  struct dentry *dentry, umode_t mode, dev_t rdev, bool whiteout)
+ {
+ 	struct jffs2_inode_info *f, *dir_f;
+ 	struct jffs2_sb_info *c;
+@@ -754,7 +754,11 @@ static int jffs2_mknod (struct user_name
+ 	mutex_unlock(&dir_f->sem);
+ 	jffs2_complete_reservation(c);
+ 
+-	d_instantiate_new(dentry, inode);
++	if (!whiteout)
++		d_instantiate_new(dentry, inode);
++	else
++		unlock_new_inode(inode);
++
+ 	return 0;
+ 
+  fail:
+@@ -762,6 +766,19 @@ static int jffs2_mknod (struct user_name
+ 	return ret;
+ }
+ 
++static int jffs2_mknod (struct user_namespace *mnt_userns, struct inode *dir_i,
++			  struct dentry *dentry, umode_t mode, dev_t rdev)
++{
++	return __jffs2_mknod(mnt_userns, dir_i, dentry, mode, rdev, false);
++}
++
++static int jffs2_whiteout (struct user_namespace *mnt_userns, struct inode *old_dir,
++			    struct dentry *old_dentry)
++{
++	return __jffs2_mknod(mnt_userns, old_dir, old_dentry, S_IFCHR | WHITEOUT_MODE,
++			     WHITEOUT_DEV, true);
++}
++
+ static int jffs2_rename (struct user_namespace *mnt_userns,
+ 			 struct inode *old_dir_i, struct dentry *old_dentry,
+ 			 struct inode *new_dir_i, struct dentry *new_dentry,
+@@ -773,7 +790,7 @@ static int jffs2_rename (struct user_nam
+ 	uint8_t type;
+ 	uint32_t now;
+ 
+-	if (flags & ~RENAME_NOREPLACE)
++	if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT))
+ 		return -EINVAL;
+ 
+ 	/* The VFS will check for us and prevent trying to rename a
+@@ -839,9 +856,14 @@ static int jffs2_rename (struct user_nam
+ 	if (d_is_dir(old_dentry) && !victim_f)
+ 		inc_nlink(new_dir_i);
+ 
+-	/* Unlink the original */
+-	ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
+-			      old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
++	if (flags & RENAME_WHITEOUT)
++		/* Replace with whiteout */
++		ret = jffs2_whiteout(mnt_userns, old_dir_i, old_dentry);
++	else
++		/* Unlink the original */
++		ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
++				      old_dentry->d_name.name,
++				      old_dentry->d_name.len, NULL, now);
+ 
+ 	/* We don't touch inode->i_nlink */
+ 
diff --git a/target/linux/generic/pending-6.0/141-jffs2-add-RENAME_EXCHANGE-support.patch b/target/linux/generic/pending-6.0/141-jffs2-add-RENAME_EXCHANGE-support.patch
new file mode 100644
index 000000000..f58fc791d
--- /dev/null
+++ b/target/linux/generic/pending-6.0/141-jffs2-add-RENAME_EXCHANGE-support.patch
@@ -0,0 +1,73 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: jffs2: add RENAME_EXCHANGE support
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/fs/jffs2/dir.c
++++ b/fs/jffs2/dir.c
+@@ -787,18 +787,31 @@ static int jffs2_rename (struct user_nam
+ 	int ret;
+ 	struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb);
+ 	struct jffs2_inode_info *victim_f = NULL;
++	struct inode *fst_inode = d_inode(old_dentry);
++	struct inode *snd_inode = d_inode(new_dentry);
+ 	uint8_t type;
+ 	uint32_t now;
+ 
+-	if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT))
++	if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT|RENAME_EXCHANGE))
+ 		return -EINVAL;
+ 
++	if ((flags & RENAME_EXCHANGE) && (old_dir_i != new_dir_i)) {
++		if (S_ISDIR(fst_inode->i_mode) && !S_ISDIR(snd_inode->i_mode)) {
++			inc_nlink(new_dir_i);
++			drop_nlink(old_dir_i);
++		}
++		else if (!S_ISDIR(fst_inode->i_mode) && S_ISDIR(snd_inode->i_mode)) {
++			drop_nlink(new_dir_i);
++			inc_nlink(old_dir_i);
++		}
++	}
++
+ 	/* The VFS will check for us and prevent trying to rename a
+ 	 * file over a directory and vice versa, but if it's a directory,
+ 	 * the VFS can't check whether the victim is empty. The filesystem
+ 	 * needs to do that for itself.
+ 	 */
+-	if (d_really_is_positive(new_dentry)) {
++	if (d_really_is_positive(new_dentry) && !(flags & RENAME_EXCHANGE)) {
+ 		victim_f = JFFS2_INODE_INFO(d_inode(new_dentry));
+ 		if (d_is_dir(new_dentry)) {
+ 			struct jffs2_full_dirent *fd;
+@@ -833,7 +846,7 @@ static int jffs2_rename (struct user_nam
+ 	if (ret)
+ 		return ret;
+ 
+-	if (victim_f) {
++	if (victim_f && !(flags & RENAME_EXCHANGE)) {
+ 		/* There was a victim. Kill it off nicely */
+ 		if (d_is_dir(new_dentry))
+ 			clear_nlink(d_inode(new_dentry));
+@@ -859,6 +872,12 @@ static int jffs2_rename (struct user_nam
+ 	if (flags & RENAME_WHITEOUT)
+ 		/* Replace with whiteout */
+ 		ret = jffs2_whiteout(mnt_userns, old_dir_i, old_dentry);
++	else if (flags & RENAME_EXCHANGE)
++		/* Replace the original */
++		ret = jffs2_do_link(c, JFFS2_INODE_INFO(old_dir_i),
++				    d_inode(new_dentry)->i_ino, type,
++				    old_dentry->d_name.name, old_dentry->d_name.len,
++				    now);
+ 	else
+ 		/* Unlink the original */
+ 		ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
+@@ -890,7 +909,7 @@ static int jffs2_rename (struct user_nam
+ 		return ret;
+ 	}
+ 
+-	if (d_is_dir(old_dentry))
++	if (d_is_dir(old_dentry) && !(flags & RENAME_EXCHANGE))
+ 		drop_nlink(old_dir_i);
+ 
+ 	new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now);
diff --git a/target/linux/generic/pending-6.0/142-jffs2-add-splice-ops.patch b/target/linux/generic/pending-6.0/142-jffs2-add-splice-ops.patch
new file mode 100644
index 000000000..de847a1f5
--- /dev/null
+++ b/target/linux/generic/pending-6.0/142-jffs2-add-splice-ops.patch
@@ -0,0 +1,20 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: jffs2: add splice ops
+
+Add splice_read using generic_file_splice_read.
+Add splice_write using iter_file_splice_write
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/fs/jffs2/file.c
++++ b/fs/jffs2/file.c
+@@ -53,6 +53,8 @@ const struct file_operations jffs2_file_
+ 	.open =		generic_file_open,
+  	.read_iter =	generic_file_read_iter,
+  	.write_iter =	generic_file_write_iter,
++	.splice_read =	generic_file_splice_read,
++	.splice_write =	iter_file_splice_write,
+ 	.unlocked_ioctl=jffs2_ioctl,
+ 	.mmap =		generic_file_readonly_mmap,
+ 	.fsync =	jffs2_fsync,
diff --git a/target/linux/generic/pending-6.0/150-bridge_allow_receiption_on_disabled_port.patch b/target/linux/generic/pending-6.0/150-bridge_allow_receiption_on_disabled_port.patch
new file mode 100644
index 000000000..93a2d146b
--- /dev/null
+++ b/target/linux/generic/pending-6.0/150-bridge_allow_receiption_on_disabled_port.patch
@@ -0,0 +1,45 @@
+From: Stephen Hemminger <stephen@networkplumber.org>
+Subject: bridge: allow receiption on disabled port
+
+When an ethernet device is enslaved to a bridge, and the bridge STP
+detects loss of carrier (or operational state down), then normally
+packet receiption is blocked.
+
+This breaks control applications like WPA which maybe expecting to
+receive packets to negotiate to bring link up. The bridge needs to
+block forwarding packets from these disabled ports, but there is no
+hard requirement to not allow local packet delivery.
+
+Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+
+--- a/net/bridge/br_input.c
++++ b/net/bridge/br_input.c
+@@ -222,6 +222,9 @@ static void __br_handle_local_finish(str
+ /* note: already called with rcu_read_lock */
+ static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
+ {
++	struct net_bridge_port *p = br_port_get_rcu(skb->dev);
++
++	if (p->state != BR_STATE_DISABLED)
+ 	__br_handle_local_finish(skb);
+ 
+ 	/* return 1 to signal the okfn() was called so it's ok to use the skb */
+@@ -390,6 +393,17 @@ forward:
+ 		goto defer_stp_filtering;
+ 
+ 	switch (p->state) {
++	case BR_STATE_DISABLED:
++		if (ether_addr_equal(p->br->dev->dev_addr, dest))
++			skb->pkt_type = PACKET_HOST;
++
++		if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING,
++			dev_net(skb->dev), NULL, skb, skb->dev, NULL,
++			br_handle_local_finish) == 1) {
++			return RX_HANDLER_PASS;
++		}
++		break;
++
+ 	case BR_STATE_FORWARDING:
+ 	case BR_STATE_LEARNING:
+ defer_stp_filtering:
diff --git a/target/linux/generic/pending-6.0/190-rtc-rs5c372-support_alarms_up_to_1_week.patch b/target/linux/generic/pending-6.0/190-rtc-rs5c372-support_alarms_up_to_1_week.patch
new file mode 100644
index 000000000..2f5c2228c
--- /dev/null
+++ b/target/linux/generic/pending-6.0/190-rtc-rs5c372-support_alarms_up_to_1_week.patch
@@ -0,0 +1,94 @@
+From: Daniel González Cabanelas <dgcbueu@gmail.com>
+Subject: [PATCH 1/2] rtc: rs5c372: support alarms up to 1 week
+
+The Ricoh R2221x, R2223x, RS5C372, RV5C387A chips can handle 1 week
+alarms.
+
+Read the "wday" alarm register and convert it to a date to support up 1
+week in our driver.
+
+Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com>
+---
+ drivers/rtc/rtc-rs5c372.c | 48 ++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 42 insertions(+), 6 deletions(-)
+
+--- a/drivers/rtc/rtc-rs5c372.c
++++ b/drivers/rtc/rtc-rs5c372.c
+@@ -399,7 +399,9 @@ static int rs5c_read_alarm(struct device
+ {
+ 	struct i2c_client	*client = to_i2c_client(dev);
+ 	struct rs5c372		*rs5c = i2c_get_clientdata(client);
+-	int			status;
++	int			status, wday_offs;
++	struct rtc_time 	rtc;
++	unsigned long 		alarm_secs;
+ 
+ 	status = rs5c_get_regs(rs5c);
+ 	if (status < 0)
+@@ -409,6 +411,30 @@ static int rs5c_read_alarm(struct device
+ 	t->time.tm_sec = 0;
+ 	t->time.tm_min = bcd2bin(rs5c->regs[RS5C_REG_ALARM_A_MIN] & 0x7f);
+ 	t->time.tm_hour = rs5c_reg2hr(rs5c, rs5c->regs[RS5C_REG_ALARM_A_HOURS]);
++	t->time.tm_wday = ffs(rs5c->regs[RS5C_REG_ALARM_A_WDAY] & 0x7f) - 1;
++
++	/* determine the day, month and year based on alarm wday, taking as a
++	 * reference the current time from the rtc
++	 */
++	status = rs5c372_rtc_read_time(dev, &rtc);
++	if (status < 0)
++		return status;
++
++	wday_offs = t->time.tm_wday - rtc.tm_wday;
++	alarm_secs = mktime64(rtc.tm_year + 1900,
++			      rtc.tm_mon + 1,
++			      rtc.tm_mday + wday_offs,
++			      t->time.tm_hour,
++			      t->time.tm_min,
++			      t->time.tm_sec);
++
++	if (wday_offs < 0 || (wday_offs == 0 &&
++			      (t->time.tm_hour < rtc.tm_hour ||
++			       (t->time.tm_hour == rtc.tm_hour &&
++				t->time.tm_min <= rtc.tm_min))))
++		alarm_secs += 7 * 86400;
++
++	rtc_time64_to_tm(alarm_secs, &t->time);
+ 
+ 	/* ... and status */
+ 	t->enabled = !!(rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE);
+@@ -423,12 +449,20 @@ static int rs5c_set_alarm(struct device
+ 	struct rs5c372		*rs5c = i2c_get_clientdata(client);
+ 	int			status, addr, i;
+ 	unsigned char		buf[3];
++	struct rtc_time 	rtc_tm;
++	unsigned long 		rtc_secs, alarm_secs;
+ 
+-	/* only handle up to 24 hours in the future, like RTC_ALM_SET */
+-	if (t->time.tm_mday != -1
+-			|| t->time.tm_mon != -1
+-			|| t->time.tm_year != -1)
++	/* chip only can handle alarms up to one week in the future*/
++	status = rs5c372_rtc_read_time(dev, &rtc_tm);
++	if (status)
++		return status;
++	rtc_secs = rtc_tm_to_time64(&rtc_tm);
++	alarm_secs = rtc_tm_to_time64(&t->time);
++	if (alarm_secs >= rtc_secs + 7 * 86400) {
++		dev_err(dev, "%s: alarm maximum is one week in the future (%d)\n",
++			__func__, status);
+ 		return -EINVAL;
++	}
+ 
+ 	/* REVISIT: round up tm_sec */
+ 
+@@ -449,7 +483,9 @@ static int rs5c_set_alarm(struct device
+ 	/* set alarm */
+ 	buf[0] = bin2bcd(t->time.tm_min);
+ 	buf[1] = rs5c_hr2reg(rs5c, t->time.tm_hour);
+-	buf[2] = 0x7f;	/* any/all days */
++	/* each bit is the day of the week, 0x7f means all days */
++	buf[2] = (t->time.tm_wday >= 0 && t->time.tm_wday < 7) ?
++		  BIT(t->time.tm_wday) : 0x7f;
+ 
+ 	for (i = 0; i < sizeof(buf); i++) {
+ 		addr = RS5C_ADDR(RS5C_REG_ALARM_A_MIN + i);
diff --git a/target/linux/generic/pending-6.0/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch b/target/linux/generic/pending-6.0/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch
new file mode 100644
index 000000000..0ed070bc5
--- /dev/null
+++ b/target/linux/generic/pending-6.0/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch
@@ -0,0 +1,70 @@
+From: Daniel González Cabanelas <dgcbueu@gmail.com>
+Subject: [PATCH 2/2] rtc: rs5c372: let the alarm to be used as wakeup source
+
+Currently there is no use for the interrupts on the rs5c372 RTC and the
+wakealarm isn't enabled. There are some devices like NASes which use this
+RTC to wake up from the power off state when the INTR pin is activated by
+the alarm clock.
+
+Enable the alarm and let to be used as a wakeup source.
+
+Tested on a Buffalo LS421DE NAS.
+
+Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com>
+---
+ drivers/rtc/rtc-rs5c372.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+--- a/drivers/rtc/rtc-rs5c372.c
++++ b/drivers/rtc/rtc-rs5c372.c
+@@ -833,6 +833,7 @@ static int rs5c372_probe(struct i2c_clie
+ 	int err = 0;
+ 	int smbus_mode = 0;
+ 	struct rs5c372 *rs5c372;
++	bool rs5c372_can_wakeup_device = false;
+ 
+ 	dev_dbg(&client->dev, "%s\n", __func__);
+ 
+@@ -868,6 +869,12 @@ static int rs5c372_probe(struct i2c_clie
+ 	else
+ 		rs5c372->type = id->driver_data;
+ 
++#ifdef CONFIG_OF
++	if(of_property_read_bool(client->dev.of_node,
++					      "wakeup-source"))
++		rs5c372_can_wakeup_device = true;
++#endif
++
+ 	/* we read registers 0x0f then 0x00-0x0f; skip the first one */
+ 	rs5c372->regs = &rs5c372->buf[1];
+ 	rs5c372->smbus = smbus_mode;
+@@ -901,6 +908,8 @@ static int rs5c372_probe(struct i2c_clie
+ 		goto exit;
+ 	}
+ 
++	rs5c372->has_irq = 1;
++
+ 	/* if the oscillator lost power and no other software (like
+ 	 * the bootloader) set it up, do it here.
+ 	 *
+@@ -927,6 +936,10 @@ static int rs5c372_probe(struct i2c_clie
+ 			);
+ 
+ 	/* REVISIT use client->irq to register alarm irq ... */
++	if (rs5c372_can_wakeup_device) {
++		device_init_wakeup(&client->dev, true);
++	}
++
+ 	rs5c372->rtc = devm_rtc_device_register(&client->dev,
+ 					rs5c372_driver.driver.name,
+ 					&rs5c372_rtc_ops, THIS_MODULE);
+@@ -940,6 +953,9 @@ static int rs5c372_probe(struct i2c_clie
+ 	if (err)
+ 		goto exit;
+ 
++	/* the rs5c372 alarm only supports a minute accuracy */
++
++
+ 	return 0;
+ 
+ exit:
diff --git a/target/linux/generic/pending-6.0/201-extra_optimization.patch b/target/linux/generic/pending-6.0/201-extra_optimization.patch
new file mode 100644
index 000000000..fa958eb04
--- /dev/null
+++ b/target/linux/generic/pending-6.0/201-extra_optimization.patch
@@ -0,0 +1,25 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: Upgrade to Linux 2.6.19
+
+- Includes large parts of the patch from #1021 by dpalffy
+- Includes RB532 NAND driver changes by n0-1
+
+[john@phrozen.org: feix will add this to his upstream queue]
+
+lede-commit: bff468813f78f81e36ebb2a3f4354de7365e640f
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ Makefile | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/Makefile
++++ b/Makefile
+@@ -759,7 +759,7 @@ KBUILD_CFLAGS	+= $(call cc-disable-warni
+ ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
+ KBUILD_CFLAGS += -O2
+ else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+-KBUILD_CFLAGS += -Os
++KBUILD_CFLAGS += -Os -fno-reorder-blocks -fno-tree-ch
+ endif
+ 
+ # Tell gcc to never replace conditional load with a non-conditional one
diff --git a/target/linux/generic/pending-6.0/203-kallsyms_uncompressed.patch b/target/linux/generic/pending-6.0/203-kallsyms_uncompressed.patch
new file mode 100644
index 000000000..70f3cb00d
--- /dev/null
+++ b/target/linux/generic/pending-6.0/203-kallsyms_uncompressed.patch
@@ -0,0 +1,119 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: add a config option for keeping the kallsyms table uncompressed, saving ~9kb kernel size after lzma on ar71xx
+
+[john@phrozen.org: added to my upstream queue 30.12.2016]
+lede-commit: e0e3509b5ce2ccf93d4d67ea907613f5f7ec2eed
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ init/Kconfig            | 11 +++++++++++
+ kernel/kallsyms.c       |  8 ++++++++
+ scripts/kallsyms.c      | 12 ++++++++++++
+ scripts/link-vmlinux.sh |  4 ++++
+ 4 files changed, 35 insertions(+)
+
+--- a/init/Kconfig
++++ b/init/Kconfig
+@@ -1464,6 +1464,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
+ 	  the unaligned access emulation.
+ 	  see arch/parisc/kernel/unaligned.c for reference
+ 
++config KALLSYMS_UNCOMPRESSED
++	bool "Keep kallsyms uncompressed"
++	depends on KALLSYMS
++	help
++		Normally kallsyms contains compressed symbols (using a token table),
++		reducing the uncompressed kernel image size. Keeping the symbol table
++		uncompressed significantly improves the size of this part in compressed
++		kernel images.
++
++		Say N unless you need compressed kernel images to be small.
++
+ config HAVE_PCSPKR_PLATFORM
+ 	bool
+ 
+--- a/kernel/kallsyms.c
++++ b/kernel/kallsyms.c
+@@ -61,6 +61,11 @@ static unsigned int kallsyms_expand_symb
+ 	 * For every byte on the compressed symbol data, copy the table
+ 	 * entry for that byte.
+ 	 */
++#ifdef CONFIG_KALLSYMS_UNCOMPRESSED
++	memcpy(result, data + 1, len - 1);
++	result += len - 1;
++	len = 0;
++#endif
+ 	while (len) {
+ 		tptr = &kallsyms_token_table[kallsyms_token_index[*data]];
+ 		data++;
+@@ -93,6 +98,9 @@ tail:
+  */
+ static char kallsyms_get_symbol_type(unsigned int off)
+ {
++#ifdef CONFIG_KALLSYMS_UNCOMPRESSED
++	return kallsyms_names[off + 1];
++#endif
+ 	/*
+ 	 * Get just the first code, look it up in the token table,
+ 	 * and return the first char from this token.
+--- a/scripts/kallsyms.c
++++ b/scripts/kallsyms.c
+@@ -58,6 +58,7 @@ static struct addr_range percpu_range =
+ static struct sym_entry **table;
+ static unsigned int table_size, table_cnt;
+ static int all_symbols;
++static int uncompressed;
+ static int absolute_percpu;
+ static int base_relative;
+ 
+@@ -487,6 +488,9 @@ static void write_src(void)
+ 
+ 	free(markers);
+ 
++	if (uncompressed)
++		return;
++
+ 	output_label("kallsyms_token_table");
+ 	off = 0;
+ 	for (i = 0; i < 256; i++) {
+@@ -538,6 +542,9 @@ static unsigned char *find_token(unsigne
+ {
+ 	int i;
+ 
++	if (uncompressed)
++		return NULL;
++
+ 	for (i = 0; i < len - 1; i++) {
+ 		if (str[i] == token[0] && str[i+1] == token[1])
+ 			return &str[i];
+@@ -610,6 +617,9 @@ static void optimize_result(void)
+ {
+ 	int i, best;
+ 
++	if (uncompressed)
++		return;
++
+ 	/* using the '\0' symbol last allows compress_symbols to use standard
+ 	 * fast string functions */
+ 	for (i = 255; i >= 0; i--) {
+@@ -774,6 +784,8 @@ int main(int argc, char **argv)
+ 				absolute_percpu = 1;
+ 			else if (strcmp(argv[i], "--base-relative") == 0)
+ 				base_relative = 1;
++			else if (strcmp(argv[i], "--uncompressed") == 0)
++				uncompressed = 1;
+ 			else
+ 				usage();
+ 		}
+--- a/scripts/link-vmlinux.sh
++++ b/scripts/link-vmlinux.sh
+@@ -156,6 +156,10 @@ kallsyms()
+ 		kallsymopt="${kallsymopt} --base-relative"
+ 	fi
+ 
++	if [ -n "${CONFIG_KALLSYMS_UNCOMPRESSED}" ]; then
++		kallsymopt="${kallsymopt} --uncompressed"
++	fi
++
+ 	info KSYMS ${2}
+ 	${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2}
+ }
diff --git a/target/linux/generic/pending-6.0/205-backtrace_module_info.patch b/target/linux/generic/pending-6.0/205-backtrace_module_info.patch
new file mode 100644
index 000000000..5f4f6e493
--- /dev/null
+++ b/target/linux/generic/pending-6.0/205-backtrace_module_info.patch
@@ -0,0 +1,41 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: when KALLSYMS is disabled, print module address + size for matching backtrace entries
+
+[john@phrozen.org: felix will add this to his upstream queue]
+
+lede-commit 53827cdc824556cda910b23ce5030c363b8f1461
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ lib/vsprintf.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+--- a/lib/vsprintf.c
++++ b/lib/vsprintf.c
+@@ -980,8 +980,10 @@ char *symbol_string(char *buf, char *end
+ 		    struct printf_spec spec, const char *fmt)
+ {
+ 	unsigned long value;
+-#ifdef CONFIG_KALLSYMS
+ 	char sym[KSYM_SYMBOL_LEN];
++#ifndef CONFIG_KALLSYMS
++	struct module *mod;
++	int len;
+ #endif
+ 
+ 	if (fmt[1] == 'R')
+@@ -1002,8 +1004,14 @@ char *symbol_string(char *buf, char *end
+ 
+ 	return string_nocheck(buf, end, sym, spec);
+ #else
+-	return special_hex_number(buf, end, value, sizeof(void *));
++	len = snprintf(sym, sizeof(sym), "0x%lx", value);
++	mod = __module_address(value);
++	if (mod)
++		snprintf(sym + len, sizeof(sym) - len, " [%s@%p+0x%x]",
++			 mod->name, mod->core_layout.base,
++			 mod->core_layout.size);
+ #endif
++	return string(buf, end, sym, spec);
+ }
+ 
+ static const struct printf_spec default_str_spec = {
diff --git a/target/linux/generic/pending-6.0/240-remove-unsane-filenames-from-deps_initramfs-list.patch b/target/linux/generic/pending-6.0/240-remove-unsane-filenames-from-deps_initramfs-list.patch
new file mode 100644
index 000000000..9e78284ec
--- /dev/null
+++ b/target/linux/generic/pending-6.0/240-remove-unsane-filenames-from-deps_initramfs-list.patch
@@ -0,0 +1,30 @@
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: usr: sanitize deps_initramfs list
+
+If any filename in the intramfs dependency
+list contains a colon, that causes a kernel
+build error like this:
+
+/devel/openwrt/build_dir/linux-ar71xx_generic/linux-3.6.6/usr/Makefile:58: *** multiple target patterns.  Stop.
+make[5]: *** [usr] Error 2
+
+Fix it by removing such filenames from the
+deps_initramfs list.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ usr/Makefile | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+--- a/usr/Makefile
++++ b/usr/Makefile
+@@ -56,6 +56,8 @@ hostprogs := gen_init_cpio
+ # The dependency list is generated by gen_initramfs.sh -l
+ -include $(obj)/.initramfs_data.cpio.d
+ 
++deps_initramfs := $(foreach v,$(deps_initramfs),$(if $(findstring :,$(v)),,$(v)))
++
+ # do not try to update files included in initramfs
+ $(deps_initramfs): ;
+ 
diff --git a/target/linux/generic/pending-6.0/261-enable_wilink_platform_without_drivers.patch b/target/linux/generic/pending-6.0/261-enable_wilink_platform_without_drivers.patch
new file mode 100644
index 000000000..cd31f9d93
--- /dev/null
+++ b/target/linux/generic/pending-6.0/261-enable_wilink_platform_without_drivers.patch
@@ -0,0 +1,20 @@
+From: Imre Kaloz <kaloz@openwrt.org>
+Subject: [PATCH] hack: net: wireless: make the wl12xx glue code available with
+ compat-wireless, too
+
+Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
+---
+ drivers/net/wireless/ti/Kconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/ti/Kconfig
++++ b/drivers/net/wireless/ti/Kconfig
+@@ -20,7 +20,7 @@ source "drivers/net/wireless/ti/wlcore/K
+ 
+ config WILINK_PLATFORM_DATA
+ 	bool "TI WiLink platform data"
+-	depends on WLCORE_SDIO || WL1251_SDIO
++	depends on WLCORE_SDIO || WL1251_SDIO || ARCH_OMAP2PLUS
+ 	default y
+ 	help
+ 	Small platform data bit needed to pass data to the sdio modules.
diff --git a/target/linux/generic/pending-6.0/270-platform-mikrotik-build-bits.patch b/target/linux/generic/pending-6.0/270-platform-mikrotik-build-bits.patch
new file mode 100644
index 000000000..cda3c5472
--- /dev/null
+++ b/target/linux/generic/pending-6.0/270-platform-mikrotik-build-bits.patch
@@ -0,0 +1,35 @@
+From c2deb5ef01a0ef09088832744cbace9e239a6ee0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= <hacks@slashdirt.org>
+Date: Sat, 28 Mar 2020 12:11:50 +0100
+Subject: [PATCH] generic: platform/mikrotik build bits (5.4)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This patch adds platform/mikrotik kernel build bits
+
+Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
+---
+ drivers/platform/Kconfig  | 2 ++
+ drivers/platform/Makefile | 1 +
+ 2 files changed, 3 insertions(+)
+
+--- a/drivers/platform/Kconfig
++++ b/drivers/platform/Kconfig
+@@ -9,6 +9,8 @@ source "drivers/platform/chrome/Kconfig"
+ 
+ source "drivers/platform/mellanox/Kconfig"
+ 
++source "drivers/platform/mikrotik/Kconfig"
++
+ source "drivers/platform/olpc/Kconfig"
+ 
+ source "drivers/platform/surface/Kconfig"
+--- a/drivers/platform/Makefile
++++ b/drivers/platform/Makefile
+@@ -9,4 +9,5 @@ obj-$(CONFIG_MIPS)		+= mips/
+ obj-$(CONFIG_OLPC_EC)		+= olpc/
+ obj-$(CONFIG_GOLDFISH)		+= goldfish/
+ obj-$(CONFIG_CHROME_PLATFORMS)	+= chrome/
++obj-$(CONFIG_MIKROTIK)		+= mikrotik/
+ obj-$(CONFIG_SURFACE_PLATFORMS)	+= surface/
diff --git a/target/linux/generic/pending-6.0/300-mips_expose_boot_raw.patch b/target/linux/generic/pending-6.0/300-mips_expose_boot_raw.patch
new file mode 100644
index 000000000..a4413e919
--- /dev/null
+++ b/target/linux/generic/pending-6.0/300-mips_expose_boot_raw.patch
@@ -0,0 +1,40 @@
+From: Mark Miller <mark@mirell.org>
+Subject: mips: expose CONFIG_BOOT_RAW
+
+This exposes the CONFIG_BOOT_RAW symbol in Kconfig. This is needed on
+certain Broadcom chipsets running CFE in order to load the kernel.
+
+Signed-off-by: Mark Miller <mark@mirell.org>
+Acked-by: Rob Landley <rob@landley.net>
+---
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -1032,9 +1032,6 @@ config FW_ARC
+ config ARCH_MAY_HAVE_PC_FDC
+ 	bool
+ 
+-config BOOT_RAW
+-	bool
+-
+ config CEVT_BCM1480
+ 	bool
+ 
+@@ -3089,6 +3086,18 @@ choice
+ 		bool "Extend builtin kernel arguments with bootloader arguments"
+ endchoice
+ 
++config BOOT_RAW
++	bool "Enable the kernel to be executed from the load address"
++	default n
++	help
++	 Allow the kernel to be executed from the load address for
++	 bootloaders which cannot read the ELF format. This places
++	 a jump to start_kernel at the load address.
++
++	 If unsure, say N.
++
++
++
+ endmenu
+ 
+ config LOCKDEP_SUPPORT
diff --git a/target/linux/generic/pending-6.0/302-mips_no_branch_likely.patch b/target/linux/generic/pending-6.0/302-mips_no_branch_likely.patch
new file mode 100644
index 000000000..542fba651
--- /dev/null
+++ b/target/linux/generic/pending-6.0/302-mips_no_branch_likely.patch
@@ -0,0 +1,22 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: mips: use -mno-branch-likely for kernel and userspace
+
+saves ~11k kernel size after lzma and ~12k squashfs size in the
+
+lede-commit: 41a039f46450ffae9483d6216422098669da2900
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/mips/Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/mips/Makefile
++++ b/arch/mips/Makefile
+@@ -94,7 +94,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
+ # machines may also.  Since BFD is incredibly buggy with respect to
+ # crossformat linking we rely on the elf2ecoff tool for format conversion.
+ #
+-cflags-y			+= -G 0 -mno-abicalls -fno-pic -pipe
++cflags-y			+= -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
+ cflags-y			+= -msoft-float
+ LDFLAGS_vmlinux			+= -G 0 -static -n -nostdlib
+ KBUILD_AFLAGS_MODULE		+= -mlong-calls
diff --git a/target/linux/generic/pending-6.0/305-mips_module_reloc.patch b/target/linux/generic/pending-6.0/305-mips_module_reloc.patch
new file mode 100644
index 000000000..e8936ae08
--- /dev/null
+++ b/target/linux/generic/pending-6.0/305-mips_module_reloc.patch
@@ -0,0 +1,370 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: mips: replace -mlong-calls with -mno-long-calls to make function calls faster in kernel modules to achieve this, try to
+
+lede-commit: 3b3d64743ba2a874df9d70cd19e242205b0a788c
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/mips/Makefile             |   5 +
+ arch/mips/include/asm/module.h |   5 +
+ arch/mips/kernel/module.c      | 279 ++++++++++++++++++++++++++++++++++++++++-
+ 3 files changed, 284 insertions(+), 5 deletions(-)
+
+--- a/arch/mips/Makefile
++++ b/arch/mips/Makefile
+@@ -97,8 +97,18 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
+ cflags-y			+= -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
+ cflags-y			+= -msoft-float
+ LDFLAGS_vmlinux			+= -G 0 -static -n -nostdlib
++ifdef CONFIG_64BIT
+ KBUILD_AFLAGS_MODULE		+= -mlong-calls
+ KBUILD_CFLAGS_MODULE		+= -mlong-calls
++else
++  ifdef CONFIG_DYNAMIC_FTRACE
++    KBUILD_AFLAGS_MODULE	+= -mlong-calls
++    KBUILD_CFLAGS_MODULE	+= -mlong-calls
++  else
++    KBUILD_AFLAGS_MODULE	+= -mno-long-calls
++    KBUILD_CFLAGS_MODULE	+= -mno-long-calls
++  endif
++endif
+ 
+ ifeq ($(CONFIG_RELOCATABLE),y)
+ LDFLAGS_vmlinux			+= --emit-relocs
+--- a/arch/mips/include/asm/module.h
++++ b/arch/mips/include/asm/module.h
+@@ -12,6 +12,11 @@ struct mod_arch_specific {
+ 	const struct exception_table_entry *dbe_start;
+ 	const struct exception_table_entry *dbe_end;
+ 	struct mips_hi16 *r_mips_hi16_list;
++
++	void *phys_plt_tbl;
++	void *virt_plt_tbl;
++	unsigned int phys_plt_offset;
++	unsigned int virt_plt_offset;
+ };
+ 
+ typedef uint8_t Elf64_Byte;		/* Type for a 8-bit quantity.  */
+--- a/arch/mips/kernel/module.c
++++ b/arch/mips/kernel/module.c
+@@ -32,23 +32,261 @@ struct mips_hi16 {
+ static LIST_HEAD(dbe_list);
+ static DEFINE_SPINLOCK(dbe_lock);
+ 
+-#ifdef MODULE_START
++/*
++ * Get the potential max trampolines size required of the init and
++ * non-init sections. Only used if we cannot find enough contiguous
++ * physically mapped memory to put the module into.
++ */
++static unsigned int
++get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
++             const char *secstrings, unsigned int symindex, bool is_init)
++{
++	unsigned long ret = 0;
++	unsigned int i, j;
++	Elf_Sym *syms;
++
++	/* Everything marked ALLOC (this includes the exported symbols) */
++	for (i = 1; i < hdr->e_shnum; ++i) {
++		unsigned int info = sechdrs[i].sh_info;
++
++		if (sechdrs[i].sh_type != SHT_REL
++		    && sechdrs[i].sh_type != SHT_RELA)
++			continue;
++
++		/* Not a valid relocation section? */
++		if (info >= hdr->e_shnum)
++			continue;
++
++		/* Don't bother with non-allocated sections */
++		if (!(sechdrs[info].sh_flags & SHF_ALLOC))
++			continue;
++
++		/* If it's called *.init*, and we're not init, we're
++                   not interested */
++		if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0)
++		    != is_init)
++			continue;
++
++		syms = (Elf_Sym *) sechdrs[symindex].sh_addr;
++		if (sechdrs[i].sh_type == SHT_REL) {
++			Elf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr;
++			unsigned int size = sechdrs[i].sh_size / sizeof(*rel);
++
++			for (j = 0; j < size; ++j) {
++				Elf_Sym *sym;
++
++				if (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26)
++					continue;
++
++				sym = syms + ELF_MIPS_R_SYM(rel[j]);
++				if (!is_init && sym->st_shndx != SHN_UNDEF)
++					continue;
++
++				ret += 4 * sizeof(int);
++			}
++		} else {
++			Elf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr;
++			unsigned int size = sechdrs[i].sh_size / sizeof(*rela);
++
++			for (j = 0; j < size; ++j) {
++				Elf_Sym *sym;
++
++				if (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26)
++					continue;
++
++				sym = syms + ELF_MIPS_R_SYM(rela[j]);
++				if (!is_init && sym->st_shndx != SHN_UNDEF)
++					continue;
++
++				ret += 4 * sizeof(int);
++			}
++		}
++	}
++
++	return ret;
++}
++
++#ifndef MODULE_START
++static void *alloc_phys(unsigned long size)
++{
++	unsigned order;
++	struct page *page;
++	struct page *p;
++
++	size = PAGE_ALIGN(size);
++	order = get_order(size);
++
++	page = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN |
++			__GFP_THISNODE, order);
++	if (!page)
++		return NULL;
++
++	split_page(page, order);
++
++	/* mark all pages except for the last one */
++	for (p = page; p + 1 < page + (size >> PAGE_SHIFT); ++p)
++		set_bit(PG_owner_priv_1, &p->flags);
++
++	for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p)
++		__free_page(p);
++
++	return page_address(page);
++}
++#endif
++
++static void free_phys(void *ptr)
++{
++	struct page *page;
++	bool free;
++
++	page = virt_to_page(ptr);
++	do {
++		free = test_and_clear_bit(PG_owner_priv_1, &page->flags);
++		__free_page(page);
++		page++;
++	} while (free);
++}
++
+ void *module_alloc(unsigned long size)
+ {
++#ifdef MODULE_START
+ 	return __vmalloc_node_range(size, 1, MODULE_START, MODULE_END,
+ 				GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE,
+ 				__builtin_return_address(0));
++#else
++	void *ptr;
++
++	if (size == 0)
++		return NULL;
++
++	ptr = alloc_phys(size);
++
++	/* If we failed to allocate physically contiguous memory,
++	 * fall back to regular vmalloc. The module loader code will
++	 * create jump tables to handle long jumps */
++	if (!ptr)
++		return vmalloc(size);
++
++	return ptr;
++#endif
+ }
++
++static inline bool is_phys_addr(void *ptr)
++{
++#ifdef CONFIG_64BIT
++	return (KSEGX((unsigned long)ptr) == CKSEG0);
++#else
++	return (KSEGX(ptr) == KSEG0);
+ #endif
++}
++
++/* Free memory returned from module_alloc */
++void module_memfree(void *module_region)
++{
++	if (is_phys_addr(module_region))
++		free_phys(module_region);
++	else
++		vfree(module_region);
++}
++
++static void *__module_alloc(int size, bool phys)
++{
++	void *ptr;
++
++	if (phys)
++		ptr = kmalloc(size, GFP_KERNEL);
++	else
++		ptr = vmalloc(size);
++	return ptr;
++}
++
++static void __module_free(void *ptr)
++{
++	if (is_phys_addr(ptr))
++		kfree(ptr);
++	else
++		vfree(ptr);
++}
++
++int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
++			      char *secstrings, struct module *mod)
++{
++	unsigned int symindex = 0;
++	unsigned int core_size, init_size;
++	int i;
++
++	mod->arch.phys_plt_offset = 0;
++	mod->arch.virt_plt_offset = 0;
++	mod->arch.phys_plt_tbl = NULL;
++	mod->arch.virt_plt_tbl = NULL;
++
++	if (IS_ENABLED(CONFIG_64BIT))
++		return 0;
++
++	for (i = 1; i < hdr->e_shnum; i++)
++		if (sechdrs[i].sh_type == SHT_SYMTAB)
++			symindex = i;
++
++	core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false);
++	init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true);
++
++	if ((core_size + init_size) == 0)
++		return 0;
++
++	mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1);
++	if (!mod->arch.phys_plt_tbl)
++		return -ENOMEM;
++
++	mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0);
++	if (!mod->arch.virt_plt_tbl) {
++		__module_free(mod->arch.phys_plt_tbl);
++		mod->arch.phys_plt_tbl = NULL;
++		return -ENOMEM;
++	}
++
++	return 0;
++}
+ 
+ static void apply_r_mips_32(u32 *location, u32 base, Elf_Addr v)
+ {
+ 	*location = base + v;
+ }
+ 
++static Elf_Addr add_plt_entry_to(unsigned *plt_offset,
++				 void *start, Elf_Addr v)
++{
++	unsigned *tramp = start + *plt_offset;
++	*plt_offset += 4 * sizeof(int);
++
++	/* adjust carry for addiu */
++	if (v & 0x00008000)
++		v += 0x10000;
++
++	tramp[0] = 0x3c190000 | (v >> 16);      /* lui t9, hi16 */
++	tramp[1] = 0x27390000 | (v & 0xffff);   /* addiu t9, t9, lo16 */
++	tramp[2] = 0x03200008;                  /* jr t9 */
++	tramp[3] = 0x00000000;                  /* nop */
++
++	return (Elf_Addr) tramp;
++}
++
++static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v)
++{
++	if (is_phys_addr(location))
++		return add_plt_entry_to(&me->arch.phys_plt_offset,
++				me->arch.phys_plt_tbl, v);
++	else
++		return add_plt_entry_to(&me->arch.virt_plt_offset,
++				me->arch.virt_plt_tbl, v);
++
++}
++
++
+ static int apply_r_mips_26(struct module *me, u32 *location, u32 base,
+ 			   Elf_Addr v)
+ {
++	u32 ofs = base & 0x03ffffff;
++
+ 	if (v % 4) {
+ 		pr_err("module %s: dangerous R_MIPS_26 relocation\n",
+ 		       me->name);
+@@ -56,13 +294,17 @@ static int apply_r_mips_26(struct module
+ 	}
+ 
+ 	if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
+-		pr_err("module %s: relocation overflow\n",
+-		       me->name);
+-		return -ENOEXEC;
++		v = add_plt_entry(me, location, v + (ofs << 2));
++		if (!v) {
++			pr_err("module %s: relocation overflow\n",
++			       me->name);
++			return -ENOEXEC;
++		}
++		ofs = 0;
+ 	}
+ 
+ 	*location = (*location & ~0x03ffffff) |
+-		    ((base + (v >> 2)) & 0x03ffffff);
++		    ((ofs + (v >> 2)) & 0x03ffffff);
+ 
+ 	return 0;
+ }
+@@ -442,9 +684,36 @@ int module_finalize(const Elf_Ehdr *hdr,
+ 		list_add(&me->arch.dbe_list, &dbe_list);
+ 		spin_unlock_irq(&dbe_lock);
+ 	}
++
++	/* Get rid of the fixup trampoline if we're running the module
++	 * from physically mapped address space */
++	if (me->arch.phys_plt_offset == 0) {
++		__module_free(me->arch.phys_plt_tbl);
++		me->arch.phys_plt_tbl = NULL;
++	}
++	if (me->arch.virt_plt_offset == 0) {
++		__module_free(me->arch.virt_plt_tbl);
++		me->arch.virt_plt_tbl = NULL;
++	}
++
+ 	return 0;
+ }
+ 
++void module_arch_freeing_init(struct module *mod)
++{
++	if (mod->state == MODULE_STATE_LIVE)
++		return;
++
++	if (mod->arch.phys_plt_tbl) {
++		__module_free(mod->arch.phys_plt_tbl);
++		mod->arch.phys_plt_tbl = NULL;
++	}
++	if (mod->arch.virt_plt_tbl) {
++		__module_free(mod->arch.virt_plt_tbl);
++		mod->arch.virt_plt_tbl = NULL;
++	}
++}
++
+ void module_arch_cleanup(struct module *mod)
+ {
+ 	spin_lock_irq(&dbe_lock);
diff --git a/target/linux/generic/pending-6.0/307-mips_highmem_offset.patch b/target/linux/generic/pending-6.0/307-mips_highmem_offset.patch
new file mode 100644
index 000000000..0529b0c5c
--- /dev/null
+++ b/target/linux/generic/pending-6.0/307-mips_highmem_offset.patch
@@ -0,0 +1,19 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: adjust mips highmem offset to avoid the need for -mlong-calls on systems with >256M RAM
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/mips/include/asm/mach-generic/spaces.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/mips/include/asm/mach-generic/spaces.h
++++ b/arch/mips/include/asm/mach-generic/spaces.h
+@@ -46,7 +46,7 @@
+  * Memory above this physical address will be considered highmem.
+  */
+ #ifndef HIGHMEM_START
+-#define HIGHMEM_START		_AC(0x20000000, UL)
++#define HIGHMEM_START		_AC(0x10000000, UL)
+ #endif
+ 
+ #endif /* CONFIG_32BIT */
diff --git a/target/linux/generic/pending-6.0/308-mips32r2_tune.patch b/target/linux/generic/pending-6.0/308-mips32r2_tune.patch
new file mode 100644
index 000000000..db410a6bc
--- /dev/null
+++ b/target/linux/generic/pending-6.0/308-mips32r2_tune.patch
@@ -0,0 +1,22 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: add -mtune=34kc to MIPS CFLAGS when building for mips32r2
+
+This provides a good tradeoff across at least 24Kc-74Kc, while also
+producing smaller code.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/mips/Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/mips/Makefile
++++ b/arch/mips/Makefile
+@@ -172,7 +172,7 @@ cflags-$(CONFIG_CPU_R4300)	+= -march=r43
+ cflags-$(CONFIG_CPU_R4X00)	+= -march=r4600 -Wa,--trap
+ cflags-$(CONFIG_CPU_TX49XX)	+= -march=r4600 -Wa,--trap
+ cflags-$(CONFIG_CPU_MIPS32_R1)	+= -march=mips32 -Wa,--trap
+-cflags-$(CONFIG_CPU_MIPS32_R2)	+= -march=mips32r2 -Wa,--trap
++cflags-$(CONFIG_CPU_MIPS32_R2)	+= -march=mips32r2 -mtune=34kc -Wa,--trap
+ cflags-$(CONFIG_CPU_MIPS32_R5)	+= -march=mips32r5 -Wa,--trap -modd-spreg
+ cflags-$(CONFIG_CPU_MIPS32_R6)	+= -march=mips32r6 -Wa,--trap -modd-spreg
+ cflags-$(CONFIG_CPU_MIPS64_R1)	+= -march=mips64 -Wa,--trap
diff --git a/target/linux/generic/pending-6.0/310-arm_module_unresolved_weak_sym.patch b/target/linux/generic/pending-6.0/310-arm_module_unresolved_weak_sym.patch
new file mode 100644
index 000000000..54cc9ba64
--- /dev/null
+++ b/target/linux/generic/pending-6.0/310-arm_module_unresolved_weak_sym.patch
@@ -0,0 +1,22 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: fix errors in unresolved weak symbols on arm
+
+lede-commit: 570699d4838a907c3ef9f2819bf19eb72997b32f
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/arm/kernel/module.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/arch/arm/kernel/module.c
++++ b/arch/arm/kernel/module.c
+@@ -146,6 +146,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons
+ 			return -ENOEXEC;
+ 		}
+ 
++		if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) &&
++		    ELF_ST_BIND(sym->st_info) == STB_WEAK)
++			continue;
++
+ 		loc = dstsec->sh_addr + rel->r_offset;
+ 
+ 		switch (ELF32_R_TYPE(rel->r_info)) {
diff --git a/target/linux/generic/pending-6.0/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch b/target/linux/generic/pending-6.0/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch
new file mode 100644
index 000000000..8d2a9b144
--- /dev/null
+++ b/target/linux/generic/pending-6.0/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch
@@ -0,0 +1,284 @@
+From: Yousong Zhou <yszhou4tech@gmail.com>
+Subject: MIPS: kexec: Accept command line parameters from userspace.
+
+Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
+---
+ arch/mips/kernel/machine_kexec.c   |  153 +++++++++++++++++++++++++++++++-----
+ arch/mips/kernel/machine_kexec.h   |   20 +++++
+ arch/mips/kernel/relocate_kernel.S |   21 +++--
+ 3 files changed, 167 insertions(+), 27 deletions(-)
+ create mode 100644 arch/mips/kernel/machine_kexec.h
+
+--- a/arch/mips/kernel/machine_kexec.c
++++ b/arch/mips/kernel/machine_kexec.c
+@@ -9,14 +9,11 @@
+ #include <linux/delay.h>
+ #include <linux/libfdt.h>
+ 
++#include <asm/bootinfo.h>
+ #include <asm/cacheflush.h>
+ #include <asm/page.h>
+-
+-extern const unsigned char relocate_new_kernel[];
+-extern const size_t relocate_new_kernel_size;
+-
+-extern unsigned long kexec_start_address;
+-extern unsigned long kexec_indirection_page;
++#include <linux/uaccess.h>
++#include "machine_kexec.h"
+ 
+ static unsigned long reboot_code_buffer;
+ 
+@@ -30,6 +27,101 @@ void (*_crash_smp_send_stop)(void) = NUL
+ void (*_machine_kexec_shutdown)(void) = NULL;
+ void (*_machine_crash_shutdown)(struct pt_regs *regs) = NULL;
+ 
++static void machine_kexec_print_args(void)
++{
++	unsigned long argc = (int)kexec_args[0];
++	int i;
++
++	pr_info("kexec_args[0] (argc): %lu\n", argc);
++	pr_info("kexec_args[1] (argv): %p\n", (void *)kexec_args[1]);
++	pr_info("kexec_args[2] (env ): %p\n", (void *)kexec_args[2]);
++	pr_info("kexec_args[3] (desc): %p\n", (void *)kexec_args[3]);
++
++	for (i = 0; i < argc; i++) {
++		pr_info("kexec_argv[%d] = %p, %s\n",
++				i, kexec_argv[i], kexec_argv[i]);
++	}
++}
++
++static void machine_kexec_init_argv(struct kimage *image)
++{
++	void __user *buf = NULL;
++	size_t bufsz;
++	size_t size;
++	int i;
++
++	bufsz = 0;
++	for (i = 0; i < image->nr_segments; i++) {
++		struct kexec_segment *seg;
++
++		seg = &image->segment[i];
++		if (seg->bufsz < 6)
++			continue;
++
++		if (strncmp((char *) seg->buf, "kexec ", 6))
++			continue;
++
++		buf = seg->buf;
++		bufsz = seg->bufsz;
++		break;
++	}
++
++	if (!buf)
++		return;
++
++	size = KEXEC_COMMAND_LINE_SIZE;
++	size = min(size, bufsz);
++	if (size < bufsz)
++		pr_warn("kexec command line truncated to %zd bytes\n", size);
++
++	/* Copy to kernel space */
++	if (copy_from_user(kexec_argv_buf, buf, size))
++		pr_warn("kexec command line copy to kernel space failed\n");
++
++	kexec_argv_buf[size - 1] = 0;
++}
++
++static void machine_kexec_parse_argv(struct kimage *image)
++{
++	char *reboot_code_buffer;
++	int reloc_delta;
++	char *ptr;
++	int argc;
++	int i;
++
++	ptr = kexec_argv_buf;
++	argc = 0;
++
++	/*
++	 * convert command line string to array of parameters
++	 * (as bootloader does).
++	 */
++	while (ptr && *ptr && (KEXEC_MAX_ARGC > argc)) {
++		if (*ptr == ' ') {
++			*ptr++ = '\0';
++			continue;
++		}
++
++		kexec_argv[argc++] = ptr;
++		ptr = strchr(ptr, ' ');
++	}
++
++	if (!argc)
++		return;
++
++	kexec_args[0] = argc;
++	kexec_args[1] = (unsigned long)kexec_argv;
++	kexec_args[2] = 0;
++	kexec_args[3] = 0;
++
++	reboot_code_buffer = page_address(image->control_code_page);
++	reloc_delta = reboot_code_buffer - (char *)kexec_relocate_new_kernel;
++
++	kexec_args[1] += reloc_delta;
++	for (i = 0; i < argc; i++)
++		kexec_argv[i] += reloc_delta;
++}
++
+ static void kexec_image_info(const struct kimage *kimage)
+ {
+ 	unsigned long i;
+@@ -99,6 +191,18 @@ machine_kexec_prepare(struct kimage *kim
+ #endif
+ 
+ 	kexec_image_info(kimage);
++	/*
++	 * Whenever arguments passed from kexec-tools, Init the arguments as
++	 * the original ones to try avoiding booting failure.
++	 */
++
++	kexec_args[0] = fw_arg0;
++	kexec_args[1] = fw_arg1;
++	kexec_args[2] = fw_arg2;
++	kexec_args[3] = fw_arg3;
++
++	machine_kexec_init_argv(kimage);
++	machine_kexec_parse_argv(kimage);
+ 
+ 	if (_machine_kexec_prepare)
+ 		return _machine_kexec_prepare(kimage);
+@@ -161,7 +265,7 @@ machine_crash_shutdown(struct pt_regs *r
+ void kexec_nonboot_cpu_jump(void)
+ {
+ 	local_flush_icache_range((unsigned long)relocated_kexec_smp_wait,
+-				 reboot_code_buffer + relocate_new_kernel_size);
++				 reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE);
+ 
+ 	relocated_kexec_smp_wait(NULL);
+ }
+@@ -199,7 +303,7 @@ void kexec_reboot(void)
+ 	 * machine_kexec() CPU.
+ 	 */
+ 	local_flush_icache_range(reboot_code_buffer,
+-				 reboot_code_buffer + relocate_new_kernel_size);
++				 reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE);
+ 
+ 	do_kexec = (void *)reboot_code_buffer;
+ 	do_kexec();
+@@ -212,10 +316,12 @@ machine_kexec(struct kimage *image)
+ 	unsigned long *ptr;
+ 
+ 	reboot_code_buffer =
+-	  (unsigned long)page_address(image->control_code_page);
++		(unsigned long)page_address(image->control_code_page);
++	pr_info("reboot_code_buffer = %p\n", (void *)reboot_code_buffer);
+ 
+ 	kexec_start_address =
+ 		(unsigned long) phys_to_virt(image->start);
++	pr_info("kexec_start_address = %p\n", (void *)kexec_start_address);
+ 
+ 	if (image->type == KEXEC_TYPE_DEFAULT) {
+ 		kexec_indirection_page =
+@@ -223,9 +329,19 @@ machine_kexec(struct kimage *image)
+ 	} else {
+ 		kexec_indirection_page = (unsigned long)&image->head;
+ 	}
++	pr_info("kexec_indirection_page = %p\n", (void *)kexec_indirection_page);
+ 
+-	memcpy((void*)reboot_code_buffer, relocate_new_kernel,
+-	       relocate_new_kernel_size);
++	pr_info("Where is memcpy: %p\n", memcpy);
++	pr_info("kexec_relocate_new_kernel = %p, kexec_relocate_new_kernel_end = %p\n",
++		(void *)kexec_relocate_new_kernel, &kexec_relocate_new_kernel_end);
++	pr_info("Copy %lu bytes from %p to %p\n", KEXEC_RELOCATE_NEW_KERNEL_SIZE,
++		(void *)kexec_relocate_new_kernel, (void *)reboot_code_buffer);
++	memcpy((void*)reboot_code_buffer, kexec_relocate_new_kernel,
++	       KEXEC_RELOCATE_NEW_KERNEL_SIZE);
++
++	pr_info("Before _print_args().\n");
++	machine_kexec_print_args();
++	pr_info("Before eval loop.\n");
+ 
+ 	/*
+ 	 * The generic kexec code builds a page list with physical
+@@ -256,7 +372,7 @@ machine_kexec(struct kimage *image)
+ #ifdef CONFIG_SMP
+ 	/* All secondary cpus now may jump to kexec_wait cycle */
+ 	relocated_kexec_smp_wait = reboot_code_buffer +
+-		(void *)(kexec_smp_wait - relocate_new_kernel);
++		(void *)(kexec_smp_wait - kexec_relocate_new_kernel);
+ 	smp_wmb();
+ 	atomic_set(&kexec_ready_to_reboot, 1);
+ #endif
+--- /dev/null
++++ b/arch/mips/kernel/machine_kexec.h
+@@ -0,0 +1,20 @@
++#ifndef _MACHINE_KEXEC_H
++#define _MACHINE_KEXEC_H
++
++#ifndef __ASSEMBLY__
++extern const unsigned char kexec_relocate_new_kernel[];
++extern unsigned long kexec_relocate_new_kernel_end;
++extern unsigned long kexec_start_address;
++extern unsigned long kexec_indirection_page;
++
++extern char kexec_argv_buf[];
++extern char *kexec_argv[];
++
++#define KEXEC_RELOCATE_NEW_KERNEL_SIZE	((unsigned long)&kexec_relocate_new_kernel_end - (unsigned long)kexec_relocate_new_kernel)
++#endif /* !__ASSEMBLY__ */
++
++#define KEXEC_COMMAND_LINE_SIZE		256
++#define KEXEC_ARGV_SIZE			(KEXEC_COMMAND_LINE_SIZE / 16)
++#define KEXEC_MAX_ARGC			(KEXEC_ARGV_SIZE / sizeof(long))
++
++#endif
+--- a/arch/mips/kernel/relocate_kernel.S
++++ b/arch/mips/kernel/relocate_kernel.S
+@@ -10,10 +10,12 @@
+ #include <asm/mipsregs.h>
+ #include <asm/stackframe.h>
+ #include <asm/addrspace.h>
++#include "machine_kexec.h"
+ 
+ #include <kernel-entry-init.h>
+ 
+-LEAF(relocate_new_kernel)
++LEAF(kexec_relocate_new_kernel)
++
+ 	PTR_L a0,	arg0
+ 	PTR_L a1,	arg1
+ 	PTR_L a2,	arg2
+@@ -98,7 +100,7 @@ done:
+ #endif
+ 	/* jump to kexec_start_address */
+ 	j		s1
+-	END(relocate_new_kernel)
++	END(kexec_relocate_new_kernel)
+ 
+ #ifdef CONFIG_SMP
+ /*
+@@ -181,9 +183,15 @@ kexec_indirection_page:
+ 	PTR_WD		0
+ 	.size		kexec_indirection_page, PTRSIZE
+ 
+-relocate_new_kernel_end:
++kexec_argv_buf:
++	EXPORT(kexec_argv_buf)
++	.skip		KEXEC_COMMAND_LINE_SIZE
++	.size		kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE
++
++kexec_argv:
++	EXPORT(kexec_argv)
++	.skip		KEXEC_ARGV_SIZE
++	.size		kexec_argv, KEXEC_ARGV_SIZE
+ 
+-relocate_new_kernel_size:
+-	EXPORT(relocate_new_kernel_size)
+-	PTR_WD		relocate_new_kernel_end - relocate_new_kernel
+-	.size		relocate_new_kernel_size, PTRSIZE
++kexec_relocate_new_kernel_end:
++	EXPORT(kexec_relocate_new_kernel_end)
diff --git a/target/linux/generic/pending-6.0/332-arc-add-OWRTDTB-section.patch b/target/linux/generic/pending-6.0/332-arc-add-OWRTDTB-section.patch
new file mode 100644
index 000000000..30158cf39
--- /dev/null
+++ b/target/linux/generic/pending-6.0/332-arc-add-OWRTDTB-section.patch
@@ -0,0 +1,84 @@
+From bb0c3b0175240bf152fd7c644821a0cf9f77c37c Mon Sep 17 00:00:00 2001
+From: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
+Date: Fri, 15 Mar 2019 18:53:38 +0300
+Subject: [PATCH] arc add OWRTDTB section
+
+This change allows OpenWRT to patch resulting kernel binary with
+external .dtb.
+
+That allows us to re-use exactky the same vmlinux on different boards
+given its ARC core configurations match (at least cache line sizes etc).
+
+""patch-dtb" searches for ASCII "OWRTDTB:" strign and copies external
+.dtb right after it, keeping the string in place.
+
+Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
+Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
+Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
+---
+ arch/arc/kernel/head.S        | 10 ++++++++++
+ arch/arc/kernel/setup.c       |  4 +++-
+ arch/arc/kernel/vmlinux.lds.S | 13 +++++++++++++
+ 3 files changed, 26 insertions(+), 1 deletion(-)
+
+--- a/arch/arc/kernel/head.S
++++ b/arch/arc/kernel/head.S
+@@ -88,6 +88,16 @@
+ 	DSP_EARLY_INIT
+ .endm
+ 
++	; Here "patch-dtb" will embed external .dtb
++	; Note "patch-dtb" searches for ASCII "OWRTDTB:" string
++	; and pastes .dtb right after it, hense the string precedes
++	; __image_dtb symbol.
++	.section .owrt, "aw",@progbits
++	.ascii  "OWRTDTB:"
++ENTRY(__image_dtb)
++	.fill   0x4000
++END(__image_dtb)
++
+ 	.section .init.text, "ax",@progbits
+ 
+ ;----------------------------------------------------------------
+--- a/arch/arc/kernel/setup.c
++++ b/arch/arc/kernel/setup.c
+@@ -495,6 +495,8 @@ static inline bool uboot_arg_invalid(uns
+ /* We always pass 0 as magic from U-boot */
+ #define UBOOT_MAGIC_VALUE	0
+ 
++extern struct boot_param_header __image_dtb;
++
+ void __init handle_uboot_args(void)
+ {
+ 	bool use_embedded_dtb = true;
+@@ -533,7 +535,7 @@ void __init handle_uboot_args(void)
+ ignore_uboot_args:
+ 
+ 	if (use_embedded_dtb) {
+-		machine_desc = setup_machine_fdt(__dtb_start);
++		machine_desc = setup_machine_fdt(&__image_dtb);
+ 		if (!machine_desc)
+ 			panic("Embedded DT invalid\n");
+ 	}
+--- a/arch/arc/kernel/vmlinux.lds.S
++++ b/arch/arc/kernel/vmlinux.lds.S
+@@ -27,6 +27,19 @@ SECTIONS
+ 
+ 	. = CONFIG_LINUX_LINK_BASE;
+ 
++	/*
++	* In OpenWRT we want to patch built binary embedding .dtb of choice.
++	* This is implemented with "patch-dtb" utility which searches for
++	* "OWRTDTB:" string in first 16k of image and if it is found
++	* copies .dtb right after mentioned string.
++	*
++	* Note: "OWRTDTB:" won't be overwritten with .dtb, .dtb will follow it.
++	*/
++ 	.owrt : {
++		*(.owrt)
++	. = ALIGN(PAGE_SIZE);
++	}
++
+ 	_int_vec_base_lds = .;
+ 	.vector : {
+ 		*(.vector)
diff --git a/target/linux/generic/pending-6.0/333-arc-enable-unaligned-access-in-kernel-mode.patch b/target/linux/generic/pending-6.0/333-arc-enable-unaligned-access-in-kernel-mode.patch
new file mode 100644
index 000000000..1848a84cc
--- /dev/null
+++ b/target/linux/generic/pending-6.0/333-arc-enable-unaligned-access-in-kernel-mode.patch
@@ -0,0 +1,24 @@
+From: Alexey Brodkin <abrodkin@synopsys.com>
+Subject: arc: enable unaligned access in kernel mode
+
+This enables misaligned access handling even in kernel mode.
+Some wireless drivers (ath9k-htc and mt7601u) use misaligned accesses
+here and there and to cope with that without fixing stuff in the drivers
+we're just gracefully handling it on ARC.
+
+Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
+---
+ arch/arc/kernel/unaligned.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/arc/kernel/unaligned.c
++++ b/arch/arc/kernel/unaligned.c
+@@ -202,7 +202,7 @@ int misaligned_fixup(unsigned long addre
+ 	char buf[TASK_COMM_LEN];
+ 
+ 	/* handle user mode only and only if enabled by sysadmin */
+-	if (!user_mode(regs) || !unaligned_enabled)
++	if (!unaligned_enabled)
+ 		return 1;
+ 
+ 	if (no_unaligned_warning) {
diff --git a/target/linux/generic/pending-6.0/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch b/target/linux/generic/pending-6.0/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch
new file mode 100644
index 000000000..5c29d1c45
--- /dev/null
+++ b/target/linux/generic/pending-6.0/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch
@@ -0,0 +1,25 @@
+From 66770a004afe10df11d3902e16eaa0c2c39436bb Mon Sep 17 00:00:00 2001
+From: Pawel Dembicki <paweldembicki@gmail.com>
+Date: Fri, 24 May 2019 17:56:19 +0200
+Subject: [PATCH] powerpc: Enable kernel XZ compression option on PPC_85xx
+
+Enable kernel XZ compression option on PPC_85xx. Tested with
+simpleImage on TP-Link TL-WDR4900 (Freescale P1014 processor).
+
+Suggested-by: Christian Lamparter <chunkeey@gmail.com>
+Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
+---
+ arch/powerpc/Kconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/powerpc/Kconfig
++++ b/arch/powerpc/Kconfig
+@@ -228,7 +228,7 @@ config PPC
+ 	select HAVE_KERNEL_GZIP
+ 	select HAVE_KERNEL_LZMA			if DEFAULT_UIMAGE
+ 	select HAVE_KERNEL_LZO			if DEFAULT_UIMAGE
+-	select HAVE_KERNEL_XZ			if PPC_BOOK3S || 44x
++	select HAVE_KERNEL_XZ			if PPC_BOOK3S || 44x || PPC_85xx
+ 	select HAVE_KPROBES
+ 	select HAVE_KPROBES_ON_FTRACE
+ 	select HAVE_KRETPROBES
diff --git a/target/linux/generic/pending-6.0/400-mtd-mtdsplit-support.patch b/target/linux/generic/pending-6.0/400-mtd-mtdsplit-support.patch
new file mode 100644
index 000000000..d24122afc
--- /dev/null
+++ b/target/linux/generic/pending-6.0/400-mtd-mtdsplit-support.patch
@@ -0,0 +1,314 @@
+--- a/drivers/mtd/Kconfig
++++ b/drivers/mtd/Kconfig
+@@ -12,6 +12,25 @@ menuconfig MTD
+ 
+ if MTD
+ 
++menu "OpenWrt specific MTD options"
++
++config MTD_ROOTFS_ROOT_DEV
++	bool "Automatically set 'rootfs' partition to be root filesystem"
++	default y
++
++config MTD_SPLIT_FIRMWARE
++	bool "Automatically split firmware partition for kernel+rootfs"
++	default y
++
++config MTD_SPLIT_FIRMWARE_NAME
++	string "Firmware partition name"
++	depends on MTD_SPLIT_FIRMWARE
++	default "firmware"
++
++source "drivers/mtd/mtdsplit/Kconfig"
++
++endmenu
++
+ config MTD_TESTS
+ 	tristate "MTD tests support (DANGEROUS)"
+ 	depends on m
+--- a/drivers/mtd/mtdpart.c
++++ b/drivers/mtd/mtdpart.c
+@@ -15,11 +15,13 @@
+ #include <linux/kmod.h>
+ #include <linux/mtd/mtd.h>
+ #include <linux/mtd/partitions.h>
++#include <linux/magic.h>
+ #include <linux/err.h>
+ #include <linux/of.h>
+ #include <linux/of_platform.h>
+ 
+ #include "mtdcore.h"
++#include "mtdsplit/mtdsplit.h"
+ 
+ /*
+  * MTD methods which simply translate the effective address and pass through
+@@ -236,6 +238,146 @@ static int mtd_add_partition_attrs(struc
+ 	return ret;
+ }
+ 
++static DEFINE_SPINLOCK(part_parser_lock);
++static LIST_HEAD(part_parsers);
++
++static struct mtd_part_parser *mtd_part_parser_get(const char *name)
++{
++	struct mtd_part_parser *p, *ret = NULL;
++
++	spin_lock(&part_parser_lock);
++
++	list_for_each_entry(p, &part_parsers, list)
++		if (!strcmp(p->name, name) && try_module_get(p->owner)) {
++			ret = p;
++			break;
++		}
++
++	spin_unlock(&part_parser_lock);
++
++	return ret;
++}
++
++static inline void mtd_part_parser_put(const struct mtd_part_parser *p)
++{
++	module_put(p->owner);
++}
++
++static struct mtd_part_parser *
++get_partition_parser_by_type(enum mtd_parser_type type,
++			     struct mtd_part_parser *start)
++{
++	struct mtd_part_parser *p, *ret = NULL;
++
++	spin_lock(&part_parser_lock);
++
++	p = list_prepare_entry(start, &part_parsers, list);
++	if (start)
++		mtd_part_parser_put(start);
++
++	list_for_each_entry_continue(p, &part_parsers, list) {
++		if (p->type == type && try_module_get(p->owner)) {
++			ret = p;
++			break;
++		}
++	}
++
++	spin_unlock(&part_parser_lock);
++
++	return ret;
++}
++
++static int parse_mtd_partitions_by_type(struct mtd_info *master,
++					enum mtd_parser_type type,
++					const struct mtd_partition **pparts,
++					struct mtd_part_parser_data *data)
++{
++	struct mtd_part_parser *prev = NULL;
++	int ret = 0;
++
++	while (1) {
++		struct mtd_part_parser *parser;
++
++		parser = get_partition_parser_by_type(type, prev);
++		if (!parser)
++			break;
++
++		ret = (*parser->parse_fn)(master, pparts, data);
++
++		if (ret > 0) {
++			mtd_part_parser_put(parser);
++			printk(KERN_NOTICE
++			       "%d %s partitions found on MTD device %s\n",
++			       ret, parser->name, master->name);
++			break;
++		}
++
++		prev = parser;
++	}
++
++	return ret;
++}
++
++static int
++run_parsers_by_type(struct mtd_info *child, enum mtd_parser_type type)
++{
++	struct mtd_partition *parts;
++	int nr_parts;
++	int i;
++
++	nr_parts = parse_mtd_partitions_by_type(child, type, (const struct mtd_partition **)&parts,
++						NULL);
++	if (nr_parts <= 0)
++		return nr_parts;
++
++	if (WARN_ON(!parts))
++		return 0;
++
++	for (i = 0; i < nr_parts; i++) {
++		/* adjust partition offsets */
++		parts[i].offset += child->part.offset;
++
++		mtd_add_partition(child->parent,
++				  parts[i].name,
++				  parts[i].offset,
++				  parts[i].size);
++	}
++
++	kfree(parts);
++
++	return nr_parts;
++}
++
++#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
++#define SPLIT_FIRMWARE_NAME	CONFIG_MTD_SPLIT_FIRMWARE_NAME
++#else
++#define SPLIT_FIRMWARE_NAME	"unused"
++#endif
++
++static void split_firmware(struct mtd_info *master, struct mtd_info *part)
++{
++	run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE);
++}
++
++static void mtd_partition_split(struct mtd_info *master, struct mtd_info *part)
++{
++	static int rootfs_found = 0;
++
++	if (rootfs_found)
++		return;
++
++	if (!strcmp(part->name, "rootfs")) {
++		run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS);
++
++		rootfs_found = 1;
++	}
++
++	if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) &&
++	    !strcmp(part->name, SPLIT_FIRMWARE_NAME) &&
++	    !of_find_property(mtd_get_of_node(part), "compatible", NULL))
++		split_firmware(master, part);
++}
++
+ int mtd_add_partition(struct mtd_info *parent, const char *name,
+ 		      long long offset, long long length)
+ {
+@@ -274,6 +416,7 @@ int mtd_add_partition(struct mtd_info *p
+ 	if (ret)
+ 		goto err_remove_part;
+ 
++	mtd_partition_split(parent, child);
+ 	mtd_add_partition_attrs(child);
+ 
+ 	return 0;
+@@ -422,6 +565,7 @@ int add_mtd_partitions(struct mtd_info *
+ 			goto err_del_partitions;
+ 		}
+ 
++		mtd_partition_split(master, child);
+ 		mtd_add_partition_attrs(child);
+ 
+ 		/* Look for subpartitions */
+@@ -438,31 +582,6 @@ err_del_partitions:
+ 	return ret;
+ }
+ 
+-static DEFINE_SPINLOCK(part_parser_lock);
+-static LIST_HEAD(part_parsers);
+-
+-static struct mtd_part_parser *mtd_part_parser_get(const char *name)
+-{
+-	struct mtd_part_parser *p, *ret = NULL;
+-
+-	spin_lock(&part_parser_lock);
+-
+-	list_for_each_entry(p, &part_parsers, list)
+-		if (!strcmp(p->name, name) && try_module_get(p->owner)) {
+-			ret = p;
+-			break;
+-		}
+-
+-	spin_unlock(&part_parser_lock);
+-
+-	return ret;
+-}
+-
+-static inline void mtd_part_parser_put(const struct mtd_part_parser *p)
+-{
+-	module_put(p->owner);
+-}
+-
+ /*
+  * Many partition parsers just expected the core to kfree() all their data in
+  * one chunk. Do that by default.
+--- a/include/linux/mtd/partitions.h
++++ b/include/linux/mtd/partitions.h
+@@ -75,6 +75,12 @@ struct mtd_part_parser_data {
+  * Functions dealing with the various ways of partitioning the space
+  */
+ 
++enum mtd_parser_type {
++	MTD_PARSER_TYPE_DEVICE = 0,
++	MTD_PARSER_TYPE_ROOTFS,
++	MTD_PARSER_TYPE_FIRMWARE,
++};
++
+ struct mtd_part_parser {
+ 	struct list_head list;
+ 	struct module *owner;
+@@ -83,6 +89,7 @@ struct mtd_part_parser {
+ 	int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
+ 			struct mtd_part_parser_data *);
+ 	void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);
++	enum mtd_parser_type type;
+ };
+ 
+ /* Container for passing around a set of parsed partitions */
+--- a/drivers/mtd/Makefile
++++ b/drivers/mtd/Makefile
+@@ -9,6 +9,8 @@ mtd-y				:= mtdcore.o mtdsuper.o mtdconc
+ 
+ obj-y				+= parsers/
+ 
++obj-$(CONFIG_MTD_SPLIT)		+= mtdsplit/
++
+ # 'Users' - code which presents functionality to userspace.
+ obj-$(CONFIG_MTD_BLKDEVS)	+= mtd_blkdevs.o
+ obj-$(CONFIG_MTD_BLOCK)		+= mtdblock.o
+--- a/include/linux/mtd/mtd.h
++++ b/include/linux/mtd/mtd.h
+@@ -608,6 +608,24 @@ static inline void mtd_align_erase_req(s
+ 		req->len += mtd->erasesize - mod;
+ }
+ 
++static inline uint64_t mtd_roundup_to_eb(uint64_t sz, struct mtd_info *mtd)
++{
++	if (mtd_mod_by_eb(sz, mtd) == 0)
++		return sz;
++
++	/* Round up to next erase block */
++	return (mtd_div_by_eb(sz, mtd) + 1) * mtd->erasesize;
++}
++
++static inline uint64_t mtd_rounddown_to_eb(uint64_t sz, struct mtd_info *mtd)
++{
++	if (mtd_mod_by_eb(sz, mtd) == 0)
++		return sz;
++
++	/* Round down to the start of the current erase block */
++	return (mtd_div_by_eb(sz, mtd)) * mtd->erasesize;
++}
++
+ static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd)
+ {
+ 	if (mtd->writesize_shift)
+@@ -680,6 +698,13 @@ extern void __put_mtd_device(struct mtd_
+ extern struct mtd_info *get_mtd_device_nm(const char *name);
+ extern void put_mtd_device(struct mtd_info *mtd);
+ 
++static inline uint64_t mtdpart_get_offset(const struct mtd_info *mtd)
++{
++	if (!mtd_is_partition(mtd))
++		return 0;
++
++	return mtd->part.offset;
++}
+ 
+ struct mtd_notifier {
+ 	void (*add)(struct mtd_info *mtd);
diff --git a/target/linux/generic/pending-6.0/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch b/target/linux/generic/pending-6.0/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch
new file mode 100644
index 000000000..a91f88718
--- /dev/null
+++ b/target/linux/generic/pending-6.0/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch
@@ -0,0 +1,389 @@
+From patchwork Tue Jun  8 04:07:19 2021
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+X-Patchwork-Submitter: John Thomson <git@johnthomson.fastmail.com.au>
+X-Patchwork-Id: 1489105
+X-Patchwork-Delegate: tudor.ambarus@gmail.com
+Return-Path: 
+ <linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>
+X-Original-To: incoming@patchwork.ozlabs.org
+Delivered-To: patchwork-incoming@bilbo.ozlabs.org
+Authentication-Results: ozlabs.org;
+ spf=none (no SPF record) smtp.mailfrom=lists.infradead.org
+ (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org;
+ envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;
+ receiver=<UNKNOWN>)
+Authentication-Results: ozlabs.org;
+	dkim=pass (2048-bit key;
+ secure) header.d=lists.infradead.org header.i=@lists.infradead.org
+ header.a=rsa-sha256 header.s=bombadil.20210309 header.b=EMabhVoR;
+	dkim=fail reason="signature verification failed" (2048-bit key;
+ unprotected) header.d=fastmail.com.au header.i=@fastmail.com.au
+ header.a=rsa-sha256 header.s=fm3 header.b=dLzuZ6dB;
+	dkim=fail reason="signature verification failed" (2048-bit key;
+ unprotected) header.d=messagingengine.com header.i=@messagingengine.com
+ header.a=rsa-sha256 header.s=fm3 header.b=nSRGsW+C;
+	dkim-atps=neutral
+Received: from bombadil.infradead.org (bombadil.infradead.org
+ [IPv6:2607:7c80:54:e::133])
+	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
+	 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest
+ SHA256)
+	(No client certificate requested)
+	by ozlabs.org (Postfix) with ESMTPS id 4FzcFN1j1nz9sW8
+	for <incoming@patchwork.ozlabs.org>; Tue,  8 Jun 2021 14:09:28 +1000 (AEST)
+DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;
+	d=lists.infradead.org; s=bombadil.20210309; h=Sender:
+	Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:
+	List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc
+	:To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:
+	Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:
+	List-Owner; bh=6mUWQd71FwsINycGYY1qOhKz+ecWJVNtwDkTebG3XkA=; b=EMabhVoRE3ad89
+	o3L2AgyKrs+blSofUC3hoSsQe7gi3m4si8S9HW8Z+8SsS5TufUsvGwDl80qSYGlQOytQF+1yRUWvE
+	6FJ/+bqv+TwjqZFibgJ6+9OVsQN9dZ/no1R0bBXIpmrf8ORUmv58QK4ZQquaFKbyXKpFeWOC2MSv4
+	H2MAhyhTU8a3gtooH6G8+KvsJEfVgh6C+aDbwxyh2UY3chHKuw1kvL6AktbfUE2xl4zxi3x3kc70B
+	Wi3LiJBFokxVdgnROXxTU5tI0XboWYkQV64gLuQNV4XKClcuhVpzloDK8Iok6NTd7b32a7TdEFlCS
+	lGKsEKmxtUlW2FpfoduA==;
+Received: from localhost ([::1] helo=bombadil.infradead.org)
+	by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux))
+	id 1lqT1r-006OAW-DX; Tue, 08 Jun 2021 04:07:51 +0000
+Received: from new1-smtp.messagingengine.com ([66.111.4.221])
+ by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux))
+ id 1lqT1l-006O9b-Fq
+ for linux-mtd@lists.infradead.org; Tue, 08 Jun 2021 04:07:50 +0000
+Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
+ by mailnew.nyi.internal (Postfix) with ESMTP id 4456B580622;
+ Tue,  8 Jun 2021 00:07:42 -0400 (EDT)
+Received: from mailfrontend2 ([10.202.2.163])
+ by compute2.internal (MEProxy); Tue, 08 Jun 2021 00:07:42 -0400
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastmail.com.au;
+ h=from:to:cc:subject:date:message-id:mime-version
+ :content-transfer-encoding; s=fm3; bh=ZXRH+YluM1mHCS1EWUiCY/Sg8O
+ LccfHe1oW5iAay6y8=; b=dLzuZ6dBYf7ZA8tWLOBFZYLi7ERsGe/4vnMXG+ovvb
+ dNBO0+SaFGwoqYSFrfq/TeyHfKyvxrA7+LCdopIuT4abpLHxtRwtRiafQcDYCPat
+ qJIqOZO+wCZC5S9Jc1OP7+t1FviGpgevqIMotci37P+RWc5u3AweMzFljZk90E8C
+ uorV6rXagD+OssJQzllRnAIK88+rOAC9ZyXv2gWxy4d1HSCwSWgzx2vnV9CNp918
+ YC/3tiHas9krbrPIaAsdBROr7Bvoe/ShRRzruKRuvZVgg5NN90vX+/5ZjI8u04GM
+ p2bWCbC62CP6wlcgDaz+c/Sgr5ITd2GPENJsHfqmLRBA==
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
+ messagingengine.com; h=cc:content-transfer-encoding:date:from
+ :message-id:mime-version:subject:to:x-me-proxy:x-me-proxy
+ :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; bh=ZXRH+YluM1mHCS1EW
+ UiCY/Sg8OLccfHe1oW5iAay6y8=; b=nSRGsW+CQ2Zx1RVpIUu8W/VD/k5P+32BW
+ 5k2ltd+UhI3dfldBPzHrYiOP/IJqGkNW+V+rHASacW/vFygnaZoxNjRYKnOsu+26
+ wb2yK3jpl6lsNTg3N1Z4XJrYY2lf9H29DMFbhC67l0PTc050rcZk4XsKTLAlv14Q
+ VA4WREYSaX/4IN4O+ES4TMq0a/3gKZh6nvbbJXbsXfK0WlSHTGZtZmW3fyrqvbXa
+ t+R7L8vvqWvwls0pV+Sn8LeQqb7+A69w0UOnuznjkcA3sCc2YehcHbxcUEnMH+9N
+ bxOjmIDeg9/4X/829tUWUJiLhE5SFmQZ1P6oFtmbWoLrDz0ZJIVBw==
+X-ME-Sender: <xms:C-2-YD2uka4HsA6gcdsV2Ia7vebY4Yjp9E8q7KBMb54jnAzGL7-67Q>
+ <xme:C-2-YCEaxASy5VlcrvNO_jLFpMDGkFCRsuVNuZGEQsiRZygk8jPHWq7unPjeT6uYS
+ 2pUP6PrTQ2rggjEIg>
+X-ME-Received: 
+ <xmr:C-2-YD4exeK49N_YZWWf2BWDhVyCbCY3wwvjTyDOFxeugx7Jg08pzMUToo9oJjrBpcVTaA3kbfk>
+X-ME-Proxy-Cause: 
+ gggruggvucftvghtrhhoucdtuddrgeduledrfedtkedgjeduucetufdoteggodetrfdotf
+ fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen
+ uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne
+ cujfgurhephffvufffkffoggfgsedtkeertdertddtnecuhfhrohhmpeflohhhnhcuvfhh
+ ohhmshhonhcuoehgihhtsehjohhhnhhthhhomhhsohhnrdhfrghsthhmrghilhdrtghomh
+ drrghuqeenucggtffrrghtthgvrhhnpefffeeihfdukedtuedufeetieeuudfhhefhkefh
+ tefgtdeuffekffelleetveduieenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh
+ epmhgrihhlfhhrohhmpehgihhtsehjohhhnhhthhhomhhsohhnrdhfrghsthhmrghilhdr
+ tghomhdrrghu
+X-ME-Proxy: <xmx:C-2-YI0AJZGjcB3wIbI9BoC9X8VNl4i9A7cQnBkvwZ25czWJlkKCLw>
+ <xmx:C-2-YGGufw99T-O81-FeiSyEruv6_Pr0IHFhspQdxjv5k1VFTZ0lzQ>
+ <xmx:C-2-YJ8BW7DhSDSCEAPSJWrwh_hHP79qreTZtWh_kOUwSh1c0MMlAg>
+ <xmx:Du2-YJBeX2Fg9oFZVXGwEJ1ZrZnXHiAqNON8tbpzquYgcm2o_LM48g>
+Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue,
+ 8 Jun 2021 00:07:35 -0400 (EDT)
+From: John Thomson <git@johnthomson.fastmail.com.au>
+To: Miquel Raynal <miquel.raynal@bootlin.com>,
+ Richard Weinberger <richard@nod.at>, Vignesh Raghavendra <vigneshr@ti.com>,
+ Tudor Ambarus <tudor.ambarus@microchip.com>,
+ Michael Walle <michael@walle.cc>, Pratyush Yadav <p.yadav@ti.com>,
+ linux-mtd@lists.infradead.org
+Cc: linux-kernel@vger.kernel.org,
+ John Thomson <git@johnthomson.fastmail.com.au>,
+ kernel test robot <lkp@intel.com>, Dan Carpenter <dan.carpenter@oracle.com>
+Subject: [PATCH] mtd: spi-nor: write support for minor aligned partitions
+Date: Tue,  8 Jun 2021 14:07:19 +1000
+Message-Id: <20210608040719.14431-1-git@johnthomson.fastmail.com.au>
+X-Mailer: git-send-email 2.31.1
+MIME-Version: 1.0
+X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 
+X-CRM114-CacheID: sfid-20210607_210745_712053_67A7D864 
+X-CRM114-Status: GOOD (  26.99  )
+X-Spam-Score: -0.8 (/)
+X-Spam-Report: Spam detection software,
+ running on the system "bombadil.infradead.org",
+ has NOT identified this incoming email as spam.  The original
+ message has been attached to this so you can view it or label
+ similar future email.  If you have any questions, see
+ the administrator of that system for details.
+ Content preview:  Do not prevent writing to mtd partitions where a partition
+ boundary sits on a minor erasesize boundary. This addresses a FIXME that
+ has been present since the start of the linux git history: /* Doesn' [...]
+ Content analysis details:   (-0.8 points, 5.0 required)
+ pts rule name              description
+ ---- ----------------------
+ --------------------------------------------------
+ -0.7 RCVD_IN_DNSWL_LOW      RBL: Sender listed at https://www.dnswl.org/,
+ low trust [66.111.4.221 listed in list.dnswl.org]
+ -0.0 SPF_PASS               SPF: sender matches SPF record
+ -0.0 SPF_HELO_PASS          SPF: HELO matches SPF record
+ 0.0 RCVD_IN_MSPIKE_H3      RBL: Good reputation (+3)
+ [66.111.4.221 listed in wl.mailspike.net]
+ -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature
+ 0.1 DKIM_SIGNED            Message has a DKIM or DK signature,
+ not necessarily
+ valid
+ -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from
+ envelope-from domain
+ 0.0 RCVD_IN_MSPIKE_WL      Mailspike good senders
+X-BeenThere: linux-mtd@lists.infradead.org
+X-Mailman-Version: 2.1.34
+Precedence: list
+List-Id: Linux MTD discussion mailing list <linux-mtd.lists.infradead.org>
+List-Unsubscribe: <http://lists.infradead.org/mailman/options/linux-mtd>,
+ <mailto:linux-mtd-request@lists.infradead.org?subject=unsubscribe>
+List-Archive: <http://lists.infradead.org/pipermail/linux-mtd/>
+List-Post: <mailto:linux-mtd@lists.infradead.org>
+List-Help: <mailto:linux-mtd-request@lists.infradead.org?subject=help>
+List-Subscribe: <http://lists.infradead.org/mailman/listinfo/linux-mtd>,
+ <mailto:linux-mtd-request@lists.infradead.org?subject=subscribe>
+Sender: "linux-mtd" <linux-mtd-bounces@lists.infradead.org>
+Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org
+
+Do not prevent writing to mtd partitions where a partition boundary sits
+on a minor erasesize boundary.
+This addresses a FIXME that has been present since the start of the
+linux git history:
+/* Doesn't start on a boundary of major erase size */
+/* FIXME: Let it be writable if it is on a boundary of
+ * _minor_ erase size though */
+
+Allow a uniform erase region spi-nor device to be configured
+to use the non-uniform erase regions code path for an erase with:
+CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE=y
+
+On supporting hardware (SECT_4K: majority of current SPI-NOR device)
+provide the facility for an erase to use the least number
+of SPI-NOR operations, as well as access to 4K erase without
+requiring CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
+
+Introduce erasesize_minor to the mtd struct,
+the smallest erasesize supported by the device
+
+On existing devices, this is useful where write support is wanted
+for data on a 4K partition, such as some u-boot-env partitions,
+or RouterBoot soft_config, while still netting the performance
+benefits of using 64K sectors
+
+Performance:
+time mtd erase firmware
+OpenWrt 5.10 ramips MT7621 w25q128jv 0xfc0000 partition length
+
+Without this patch
+MTD_SPI_NOR_USE_4K_SECTORS=y	|n
+real    2m 11.66s		|0m 50.86s
+user    0m 0.00s		|0m 0.00s
+sys     1m 56.20s		|0m 50.80s
+
+With this patch
+MTD_SPI_NOR_USE_VARIABLE_ERASE=n|y		|4K_SECTORS=y
+real    0m 51.68s		|0m 50.85s	|2m 12.89s
+user    0m 0.00s		|0m 0.00s	|0m 0.01s
+sys     0m 46.94s		|0m 50.38s	|2m 12.46s
+
+Signed-off-by: John Thomson <git@johnthomson.fastmail.com.au>
+---
+Have not tested on variable erase regions device.
+
+checkpatch does not like the printk(KERN_WARNING
+these should be changed separately beforehand?
+
+Changes RFC -> v1:
+Fix uninitialized variable smatch warning
+Reported-by: kernel test robot <lkp@intel.com>
+Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
+---
+ drivers/mtd/mtdpart.c       | 52 ++++++++++++++++++++++++++++---------
+ drivers/mtd/spi-nor/Kconfig | 10 +++++++
+ drivers/mtd/spi-nor/core.c  | 10 +++++--
+ include/linux/mtd/mtd.h     |  2 ++
+ 4 files changed, 60 insertions(+), 14 deletions(-)
+
+--- a/drivers/mtd/mtdpart.c
++++ b/drivers/mtd/mtdpart.c
+@@ -41,10 +41,11 @@ static struct mtd_info *allocate_partiti
+ 	struct mtd_info *master = mtd_get_master(parent);
+ 	int wr_alignment = (parent->flags & MTD_NO_ERASE) ?
+ 			   master->writesize : master->erasesize;
++	int wr_alignment_minor = 0;
+ 	u64 parent_size = mtd_is_partition(parent) ?
+ 			  parent->part.size : parent->size;
+ 	struct mtd_info *child;
+-	u32 remainder;
++	u32 remainder, remainder_minor;
+ 	char *name;
+ 	u64 tmp;
+ 
+@@ -146,6 +147,7 @@ static struct mtd_info *allocate_partiti
+ 		int i, max = parent->numeraseregions;
+ 		u64 end = child->part.offset + child->part.size;
+ 		struct mtd_erase_region_info *regions = parent->eraseregions;
++		uint32_t erasesize_minor = child->erasesize;
+ 
+ 		/* Find the first erase regions which is part of this
+ 		 * partition. */
+@@ -156,15 +158,24 @@ static struct mtd_info *allocate_partiti
+ 		if (i > 0)
+ 			i--;
+ 
+-		/* Pick biggest erasesize */
+ 		for (; i < max && regions[i].offset < end; i++) {
++			/* Pick biggest erasesize */
+ 			if (child->erasesize < regions[i].erasesize)
+ 				child->erasesize = regions[i].erasesize;
++			/* Pick smallest non-zero erasesize */
++			if ((erasesize_minor > regions[i].erasesize) && (regions[i].erasesize > 0))
++				erasesize_minor = regions[i].erasesize;
+ 		}
++
++		if (erasesize_minor < child->erasesize)
++			child->erasesize_minor = erasesize_minor;
++
+ 		BUG_ON(child->erasesize == 0);
+ 	} else {
+ 		/* Single erase size */
+ 		child->erasesize = master->erasesize;
++		if (master->erasesize_minor)
++			child->erasesize_minor = master->erasesize_minor;
+ 	}
+ 
+ 	/*
+@@ -172,26 +183,43 @@ static struct mtd_info *allocate_partiti
+ 	 * exposes several regions with different erasesize. Adjust
+ 	 * wr_alignment accordingly.
+ 	 */
+-	if (!(child->flags & MTD_NO_ERASE))
++	if (!(child->flags & MTD_NO_ERASE)) {
+ 		wr_alignment = child->erasesize;
++		if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE) && child->erasesize_minor)
++			wr_alignment_minor = child->erasesize_minor;
++	}
+ 
+ 	tmp = mtd_get_master_ofs(child, 0);
+ 	remainder = do_div(tmp, wr_alignment);
+ 	if ((child->flags & MTD_WRITEABLE) && remainder) {
+-		/* Doesn't start on a boundary of major erase size */
+-		/* FIXME: Let it be writable if it is on a boundary of
+-		 * _minor_ erase size though */
+-		child->flags &= ~MTD_WRITEABLE;
+-		printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n",
+-			part->name);
++		if (wr_alignment_minor) {
++			tmp = mtd_get_master_ofs(child, 0);
++			remainder_minor = do_div(tmp, wr_alignment_minor);
++			if (remainder_minor == 0)
++				child->erasesize = child->erasesize_minor;
++		}
++
++		if ((!wr_alignment_minor) || (wr_alignment_minor && remainder_minor != 0)) {
++			child->flags &= ~MTD_WRITEABLE;
++			printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n",
++				part->name);
++		}
+ 	}
+ 
+ 	tmp = mtd_get_master_ofs(child, 0) + child->part.size;
+ 	remainder = do_div(tmp, wr_alignment);
+ 	if ((child->flags & MTD_WRITEABLE) && remainder) {
+-		child->flags &= ~MTD_WRITEABLE;
+-		printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n",
+-			part->name);
++		if (wr_alignment_minor) {
++			tmp = mtd_get_master_ofs(child, 0) + child->part.size;
++			remainder_minor = do_div(tmp, wr_alignment_minor);
++			if (remainder_minor == 0)
++				child->erasesize = child->erasesize_minor;
++		}
++		if ((!wr_alignment_minor) || (wr_alignment_minor && remainder_minor != 0)) {
++			child->flags &= ~MTD_WRITEABLE;
++			printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n",
++				part->name);
++		}
+ 	}
+ 
+ 	child->size = child->part.size;
+--- a/drivers/mtd/spi-nor/Kconfig
++++ b/drivers/mtd/spi-nor/Kconfig
+@@ -10,6 +10,16 @@ menuconfig MTD_SPI_NOR
+ 
+ if MTD_SPI_NOR
+ 
++config MTD_SPI_NOR_USE_VARIABLE_ERASE
++	bool "Disable uniform_erase to allow use of all hardware supported erasesizes"
++	depends on !MTD_SPI_NOR_USE_4K_SECTORS
++	default n
++	help
++	  Allow mixed use of all hardware supported erasesizes,
++	  by forcing spi_nor to use the multiple eraseregions code path.
++	  For example: A 68K erase will use one 64K erase, and one 4K erase
++	  on supporting hardware.
++
+ config MTD_SPI_NOR_USE_4K_SECTORS
+ 	bool "Use small 4096 B erase sectors"
+ 	default y
+--- a/drivers/mtd/spi-nor/core.c
++++ b/drivers/mtd/spi-nor/core.c
+@@ -1048,6 +1048,8 @@ static u8 spi_nor_convert_3to4_erase(u8
+ 
+ static bool spi_nor_has_uniform_erase(const struct spi_nor *nor)
+ {
++	if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE))
++		return false;
+ 	return !!nor->params->erase_map.uniform_erase_type;
+ }
+ 
+@@ -2144,6 +2146,7 @@ static int spi_nor_select_erase(struct s
+ {
+ 	struct spi_nor_erase_map *map = &nor->params->erase_map;
+ 	const struct spi_nor_erase_type *erase = NULL;
++	const struct spi_nor_erase_type *erase_minor = NULL;
+ 	struct mtd_info *mtd = &nor->mtd;
+ 	u32 wanted_size = nor->info->sector_size;
+ 	int i;
+@@ -2176,8 +2179,9 @@ static int spi_nor_select_erase(struct s
+ 	 */
+ 	for (i = SNOR_ERASE_TYPE_MAX - 1; i >= 0; i--) {
+ 		if (map->erase_type[i].size) {
+-			erase = &map->erase_type[i];
+-			break;
++			if (!erase)
++				erase = &map->erase_type[i];
++			erase_minor = &map->erase_type[i];
+ 		}
+ 	}
+ 
+@@ -2185,6 +2189,8 @@ static int spi_nor_select_erase(struct s
+ 		return -EINVAL;
+ 
+ 	mtd->erasesize = erase->size;
++	if (erase_minor && erase_minor->size < erase->size)
++		mtd->erasesize_minor = erase_minor->size;
+ 	return 0;
+ }
+ 
+--- a/include/linux/mtd/mtd.h
++++ b/include/linux/mtd/mtd.h
+@@ -238,6 +238,8 @@ struct mtd_info {
+ 	 * information below if they desire
+ 	 */
+ 	uint32_t erasesize;
++	/* "Minor" (smallest) erase size supported by the whole device */
++	uint32_t erasesize_minor;
+ 	/* Minimal writable flash unit size. In case of NOR flash it is 1 (even
+ 	 * though individual bits can be cleared), in case of NAND flash it is
+ 	 * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR
diff --git a/target/linux/generic/pending-6.0/419-mtd-redboot-add-of_match_table-with-DT-binding.patch b/target/linux/generic/pending-6.0/419-mtd-redboot-add-of_match_table-with-DT-binding.patch
new file mode 100644
index 000000000..ade36033d
--- /dev/null
+++ b/target/linux/generic/pending-6.0/419-mtd-redboot-add-of_match_table-with-DT-binding.patch
@@ -0,0 +1,22 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Subject: [PATCH] mtd: redboot: add of_match_table with DT binding
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This allows parsing RedBoot compatible partitions for properly described
+flash device in DT.
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+---
+
+--- a/drivers/mtd/parsers/redboot.c
++++ b/drivers/mtd/parsers/redboot.c
+@@ -305,6 +305,7 @@ nogood:
+ 
+ static const struct of_device_id mtd_parser_redboot_of_match_table[] = {
+ 	{ .compatible = "redboot-fis" },
++	{ .compatible = "ecoscentric,redboot-fis-partitions" },
+ 	{},
+ };
+ MODULE_DEVICE_TABLE(of, mtd_parser_redboot_of_match_table);
diff --git a/target/linux/generic/pending-6.0/420-mtd-redboot_space.patch b/target/linux/generic/pending-6.0/420-mtd-redboot_space.patch
new file mode 100644
index 000000000..5518ea71d
--- /dev/null
+++ b/target/linux/generic/pending-6.0/420-mtd-redboot_space.patch
@@ -0,0 +1,41 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: add patch for including unpartitioned space in the rootfs partition for redboot devices (if applicable)
+
+[john@phrozen.org: used by ixp and others]
+
+lede-commit: 394918851f84e4d00fa16eb900e7700e95091f00
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/redboot.c | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+--- a/drivers/mtd/parsers/redboot.c
++++ b/drivers/mtd/parsers/redboot.c
+@@ -278,14 +278,21 @@ nogood:
+ #endif
+ 		names += strlen(names) + 1;
+ 
+-#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
+ 		if (fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) {
+-			i++;
+-			parts[i].offset = parts[i - 1].size + parts[i - 1].offset;
+-			parts[i].size = fl->next->img->flash_base - parts[i].offset;
+-			parts[i].name = nullname;
+-		}
++			if (!strcmp(parts[i].name, "rootfs")) {
++				parts[i].size = fl->next->img->flash_base;
++				parts[i].size &= ~(master->erasesize - 1);
++				parts[i].size -= parts[i].offset;
++#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
++				nrparts--;
++			} else {
++				i++;
++				parts[i].offset = parts[i-1].size + parts[i-1].offset;
++				parts[i].size = fl->next->img->flash_base - parts[i].offset;
++				parts[i].name = nullname;
+ #endif
++			}
++		}
+ 		tmp_fl = fl;
+ 		fl = fl->next;
+ 		kfree(tmp_fl);
diff --git a/target/linux/generic/pending-6.0/430-mtd-add-myloader-partition-parser.patch b/target/linux/generic/pending-6.0/430-mtd-add-myloader-partition-parser.patch
new file mode 100644
index 000000000..0889c9a34
--- /dev/null
+++ b/target/linux/generic/pending-6.0/430-mtd-add-myloader-partition-parser.patch
@@ -0,0 +1,229 @@
+From: Florian Fainelli <f.fainelli@gmail.com>
+Subject: Add myloader partition table parser
+
+[john@phozen.org: shoud be upstreamable]
+
+lede-commit: d8bf22859b51faa09d22c056fe221a45d2f7a3b8
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+[adjust for kernel 5.4, add myloader.c to patch]
+Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
+
+--- a/drivers/mtd/parsers/Kconfig
++++ b/drivers/mtd/parsers/Kconfig
+@@ -57,6 +57,22 @@ config MTD_CMDLINE_PARTS
+ 
+ 	  If unsure, say 'N'.
+ 
++config MTD_MYLOADER_PARTS
++	tristate "MyLoader partition parsing"
++	depends on ADM5120 || ATH25 || ATH79
++	help
++	  MyLoader is a bootloader which allows the user to define partitions
++	  in flash devices, by putting a table in the second erase block
++	  on the device, similar to a partition table. This table gives the 
++	  offsets and lengths of the user defined partitions.
++
++	  If you need code which can detect and parse these tables, and
++	  register MTD 'partitions' corresponding to each image detected,
++	  enable this option.
++
++	  You will still need the parsing functions to be called by the driver
++	  for your particular device. It won't happen automatically.
++
+ config MTD_OF_PARTS
+ 	tristate "OpenFirmware (device tree) partitioning parser"
+ 	default y
+--- a/drivers/mtd/parsers/Makefile
++++ b/drivers/mtd/parsers/Makefile
+@@ -3,6 +3,7 @@ obj-$(CONFIG_MTD_AR7_PARTS)		+= ar7part.
+ obj-$(CONFIG_MTD_BCM47XX_PARTS)		+= bcm47xxpart.o
+ obj-$(CONFIG_MTD_BCM63XX_PARTS)		+= bcm63xxpart.o
+ obj-$(CONFIG_MTD_CMDLINE_PARTS)		+= cmdlinepart.o
++obj-$(CONFIG_MTD_MYLOADER_PARTS)		+= myloader.o
+ obj-$(CONFIG_MTD_OF_PARTS)		+= ofpart.o
+ ofpart-y				+= ofpart_core.o
+ ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908)	+= ofpart_bcm4908.o
+--- /dev/null
++++ b/drivers/mtd/parsers/myloader.c
+@@ -0,0 +1,181 @@
++/*
++ *  Parse MyLoader-style flash partition tables and produce a Linux partition
++ *  array to match.
++ *
++ *  Copyright (C) 2007-2009 Gabor Juhos <juhosg@openwrt.org>
++ *
++ *  This file was based on drivers/mtd/redboot.c
++ *  Author: Red Hat, Inc. - David Woodhouse <dwmw2@cambridge.redhat.com>
++ *
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/version.h>
++#include <linux/slab.h>
++#include <linux/init.h>
++#include <linux/vmalloc.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
++#include <linux/byteorder/generic.h>
++#include <linux/myloader.h>
++
++#define BLOCK_LEN_MIN		0x10000
++#define PART_NAME_LEN		32
++
++struct part_data {
++	struct mylo_partition_table	tab;
++	char names[MYLO_MAX_PARTITIONS][PART_NAME_LEN];
++};
++
++static int myloader_parse_partitions(struct mtd_info *master,
++				     const struct mtd_partition **pparts,
++				     struct mtd_part_parser_data *data)
++{
++	struct part_data *buf;
++	struct mylo_partition_table *tab;
++	struct mylo_partition *part;
++	struct mtd_partition *mtd_parts;
++	struct mtd_partition *mtd_part;
++	int num_parts;
++	int ret, i;
++	size_t retlen;
++	char *names;
++	unsigned long offset;
++	unsigned long blocklen;
++
++	buf = vmalloc(sizeof(*buf));
++	if (!buf) {
++		return -ENOMEM;
++		goto out;
++	}
++	tab = &buf->tab;
++
++	blocklen = master->erasesize;
++	if (blocklen < BLOCK_LEN_MIN)
++		blocklen = BLOCK_LEN_MIN;
++
++	offset = blocklen;
++
++	/* Find the partition table */
++	for (i = 0; i < 4; i++, offset += blocklen) {
++		printk(KERN_DEBUG "%s: searching for MyLoader partition table"
++				" at offset 0x%lx\n", master->name, offset);
++
++		ret = mtd_read(master, offset, sizeof(*buf), &retlen,
++			       (void *)buf);
++		if (ret)
++			goto out_free_buf;
++
++		if (retlen != sizeof(*buf)) {
++			ret = -EIO;
++			goto out_free_buf;
++		}
++
++		/* Check for Partition Table magic number */
++		if (tab->magic == le32_to_cpu(MYLO_MAGIC_PARTITIONS))
++			break;
++
++	}
++
++	if (tab->magic != le32_to_cpu(MYLO_MAGIC_PARTITIONS)) {
++		printk(KERN_DEBUG "%s: no MyLoader partition table found\n",
++			master->name);
++		ret = 0;
++		goto out_free_buf;
++	}
++
++	/* The MyLoader and the Partition Table is always present */
++	num_parts = 2;
++
++	/* Detect number of used partitions */
++	for (i = 0; i < MYLO_MAX_PARTITIONS; i++) {
++		part = &tab->partitions[i];
++
++		if (le16_to_cpu(part->type) == PARTITION_TYPE_FREE)
++			continue;
++
++		num_parts++;
++	}
++
++	mtd_parts = kzalloc((num_parts * sizeof(*mtd_part) +
++				num_parts * PART_NAME_LEN), GFP_KERNEL);
++
++	if (!mtd_parts) {
++		ret = -ENOMEM;
++		goto out_free_buf;
++	}
++
++	mtd_part = mtd_parts;
++	names = (char *)&mtd_parts[num_parts];
++
++	strncpy(names, "myloader", PART_NAME_LEN);
++	mtd_part->name = names;
++	mtd_part->offset = 0;
++	mtd_part->size = offset;
++	mtd_part->mask_flags = MTD_WRITEABLE;
++	mtd_part++;
++	names += PART_NAME_LEN;
++
++	strncpy(names, "partition_table", PART_NAME_LEN);
++	mtd_part->name = names;
++	mtd_part->offset = offset;
++	mtd_part->size = blocklen;
++	mtd_part->mask_flags = MTD_WRITEABLE;
++	mtd_part++;
++	names += PART_NAME_LEN;
++
++	for (i = 0; i < MYLO_MAX_PARTITIONS; i++) {
++		part = &tab->partitions[i];
++
++		if (le16_to_cpu(part->type) == PARTITION_TYPE_FREE)
++			continue;
++
++		if ((buf->names[i][0]) && (buf->names[i][0] != '\xff'))
++			strncpy(names, buf->names[i], PART_NAME_LEN);
++		else
++			snprintf(names, PART_NAME_LEN, "partition%d", i);
++
++		mtd_part->offset = le32_to_cpu(part->addr);
++		mtd_part->size = le32_to_cpu(part->size);
++		mtd_part->name = names;
++		mtd_part++;
++		names += PART_NAME_LEN;
++	}
++
++	*pparts = mtd_parts;
++	ret = num_parts;
++
++ out_free_buf:
++	vfree(buf);
++ out:
++	return ret;
++}
++
++static struct mtd_part_parser myloader_mtd_parser = {
++	.owner		= THIS_MODULE,
++	.parse_fn	= myloader_parse_partitions,
++	.name		= "MyLoader",
++};
++
++static int __init myloader_mtd_parser_init(void)
++{
++	register_mtd_parser(&myloader_mtd_parser);
++
++	return 0;
++}
++
++static void __exit myloader_mtd_parser_exit(void)
++{
++	deregister_mtd_parser(&myloader_mtd_parser);
++}
++
++module_init(myloader_mtd_parser_init);
++module_exit(myloader_mtd_parser_exit);
++
++MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
++MODULE_DESCRIPTION("Parsing code for MyLoader partition tables");
++MODULE_LICENSE("GPL v2");
diff --git a/target/linux/generic/pending-6.0/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch b/target/linux/generic/pending-6.0/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch
new file mode 100644
index 000000000..bcea45d00
--- /dev/null
+++ b/target/linux/generic/pending-6.0/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch
@@ -0,0 +1,68 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Subject: [PATCH] mtd: bcm47xxpart: check for bad blocks when calculating offsets
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+
+--- a/drivers/mtd/parsers/parser_trx.c
++++ b/drivers/mtd/parsers/parser_trx.c
+@@ -25,6 +25,33 @@ struct trx_header {
+ 	uint32_t offset[3];
+ } __packed;
+ 
++/*
++ * Calculate real end offset (address) for a given amount of data. It checks
++ * all blocks skipping bad ones.
++ */
++static size_t parser_trx_real_offset(struct mtd_info *mtd, size_t bytes)
++{
++	size_t real_offset = 0;
++
++	if (mtd_block_isbad(mtd, real_offset))
++		pr_warn("Base offset shouldn't be at bad block");
++
++	while (bytes >= mtd->erasesize) {
++		bytes -= mtd->erasesize;
++		real_offset += mtd->erasesize;
++		while (mtd_block_isbad(mtd, real_offset)) {
++			real_offset += mtd->erasesize;
++
++			if (real_offset >= mtd->size)
++				return real_offset - mtd->erasesize;
++		}
++	}
++
++	real_offset += bytes;
++
++	return real_offset;
++}
++
+ static const char *parser_trx_data_part_name(struct mtd_info *master,
+ 					     size_t offset)
+ {
+@@ -86,21 +113,21 @@ static int parser_trx_parse(struct mtd_i
+ 	if (trx.offset[2]) {
+ 		part = &parts[curr_part++];
+ 		part->name = "loader";
+-		part->offset = trx.offset[i];
++		part->offset = parser_trx_real_offset(mtd, trx.offset[i]);
+ 		i++;
+ 	}
+ 
+ 	if (trx.offset[i]) {
+ 		part = &parts[curr_part++];
+ 		part->name = "linux";
+-		part->offset = trx.offset[i];
++		part->offset = parser_trx_real_offset(mtd, trx.offset[i]);
+ 		i++;
+ 	}
+ 
+ 	if (trx.offset[i]) {
+ 		part = &parts[curr_part++];
+-		part->name = parser_trx_data_part_name(mtd, trx.offset[i]);
+-		part->offset = trx.offset[i];
++		part->offset = parser_trx_real_offset(mtd, trx.offset[i]);
++		part->name = parser_trx_data_part_name(mtd, part->offset);
+ 		i++;
+ 	}
+ 
diff --git a/target/linux/generic/pending-6.0/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch b/target/linux/generic/pending-6.0/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch
new file mode 100644
index 000000000..852654d92
--- /dev/null
+++ b/target/linux/generic/pending-6.0/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch
@@ -0,0 +1,37 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Subject: mtd: bcm47xxpart: detect T_Meter partition
+
+It can be found on many Netgear devices. It consists of many 0x30 blocks
+starting with 4D 54.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+---
+ drivers/mtd/bcm47xxpart.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/drivers/mtd/parsers/bcm47xxpart.c
++++ b/drivers/mtd/parsers/bcm47xxpart.c
+@@ -35,6 +35,7 @@
+ #define NVRAM_HEADER			0x48534C46	/* FLSH */
+ #define POT_MAGIC1			0x54544f50	/* POTT */
+ #define POT_MAGIC2			0x504f		/* OP */
++#define T_METER_MAGIC			0x4D540000	/* MT */
+ #define ML_MAGIC1			0x39685a42
+ #define ML_MAGIC2			0x26594131
+ #define TRX_MAGIC			0x30524448
+@@ -178,6 +179,15 @@ static int bcm47xxpart_parse(struct mtd_
+ 					     MTD_WRITEABLE);
+ 			continue;
+ 		}
++
++		/* T_Meter */
++		if ((le32_to_cpu(buf[0x000 / 4]) & 0xFFFF0000) == T_METER_MAGIC &&
++		    (le32_to_cpu(buf[0x030 / 4]) & 0xFFFF0000) == T_METER_MAGIC &&
++		    (le32_to_cpu(buf[0x060 / 4]) & 0xFFFF0000) == T_METER_MAGIC) {
++			bcm47xxpart_add_part(&parts[curr_part++], "T_Meter", offset,
++					     MTD_WRITEABLE);
++			continue;
++		}
+ 
+ 		/* TRX */
+ 		if (buf[0x000 / 4] == TRX_MAGIC) {
diff --git a/target/linux/generic/pending-6.0/435-mtd-add-routerbootpart-parser-config.patch b/target/linux/generic/pending-6.0/435-mtd-add-routerbootpart-parser-config.patch
new file mode 100644
index 000000000..30f5334af
--- /dev/null
+++ b/target/linux/generic/pending-6.0/435-mtd-add-routerbootpart-parser-config.patch
@@ -0,0 +1,38 @@
+From 4437e01fb6bca63fccdba5d6c44888b0935885c2 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= <hacks@slashdirt.org>
+Date: Tue, 24 Mar 2020 11:45:07 +0100
+Subject: [PATCH] generic: routerboot partition build bits (5.4)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This patch adds routerbootpart kernel build bits
+
+Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
+---
+ drivers/mtd/parsers/Kconfig  | 9 +++++++++
+ drivers/mtd/parsers/Makefile | 1 +
+ 2 files changed, 10 insertions(+)
+
+--- a/drivers/mtd/parsers/Kconfig
++++ b/drivers/mtd/parsers/Kconfig
+@@ -211,3 +211,12 @@ config MTD_SERCOMM_PARTS
+ 	  partition map. This partition table contains real partition
+ 	  offsets, which may differ from device to device depending on the
+ 	  number and location of bad blocks on NAND.
++
++config MTD_ROUTERBOOT_PARTS
++	tristate "RouterBoot flash partition parser"
++	depends on MTD && OF
++	help
++	 MikroTik RouterBoot is implemented as a multi segment system on the
++	 flash, some of which are fixed and some of which are located at
++	 variable offsets. This parser handles both cases via properly
++	 formatted DTS.
+--- a/drivers/mtd/parsers/Makefile
++++ b/drivers/mtd/parsers/Makefile
+@@ -15,3 +15,4 @@ obj-$(CONFIG_MTD_SERCOMM_PARTS)		+= scpa
+ obj-$(CONFIG_MTD_SHARPSL_PARTS)		+= sharpslpart.o
+ obj-$(CONFIG_MTD_REDBOOT_PARTS)		+= redboot.o
+ obj-$(CONFIG_MTD_QCOMSMEM_PARTS)	+= qcomsmempart.o
++obj-$(CONFIG_MTD_ROUTERBOOT_PARTS)		+= routerbootpart.o
diff --git a/target/linux/generic/pending-6.0/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch b/target/linux/generic/pending-6.0/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch
new file mode 100644
index 000000000..1b653fb73
--- /dev/null
+++ b/target/linux/generic/pending-6.0/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch
@@ -0,0 +1,25 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: disable cfi cmdset 0002 erase suspend
+
+on some platforms, erase suspend leads to data corruption and lockups when write
+ops collide with erase ops. this has been observed on the buffalo wzr-hp-g300nh.
+rather than play whack-a-mole with a hard to reproduce issue on a variety of devices,
+simply disable erase suspend, as it will usually not produce any useful gain on
+the small filesystems used on embedded hardware.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/chips/cfi_cmdset_0002.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/mtd/chips/cfi_cmdset_0002.c
++++ b/drivers/mtd/chips/cfi_cmdset_0002.c
+@@ -908,7 +908,7 @@ static int get_chip(struct map_info *map
+ 		return 0;
+ 
+ 	case FL_ERASING:
+-		if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
++		if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
+ 		    !(mode == FL_READY || mode == FL_POINT ||
+ 		    (mode == FL_WRITING && (cfip->EraseSuspend & 0x2))))
+ 			goto sleep;
diff --git a/target/linux/generic/pending-6.0/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch b/target/linux/generic/pending-6.0/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch
new file mode 100644
index 000000000..f2788c521
--- /dev/null
+++ b/target/linux/generic/pending-6.0/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch
@@ -0,0 +1,17 @@
+From: George Kashperko <george@znau.edu.ua>
+Subject: Issue map read after Write Buffer Load command to ensure chip is ready to receive data.
+
+Signed-off-by: George Kashperko <george@znau.edu.ua>
+---
+ drivers/mtd/chips/cfi_cmdset_0002.c |    1 +
+ 1 file changed, 1 insertion(+)
+--- a/drivers/mtd/chips/cfi_cmdset_0002.c
++++ b/drivers/mtd/chips/cfi_cmdset_0002.c
+@@ -2052,6 +2052,7 @@ static int __xipram do_write_buffer(stru
+ 
+ 	/* Write Buffer Load */
+ 	map_write(map, CMD(0x25), cmd_adr);
++	(void) map_read(map, cmd_adr);
+ 
+ 	chip->state = FL_WRITING_TO_BUFFER;
+ 
diff --git a/target/linux/generic/pending-6.0/465-m25p80-mx-disable-software-protection.patch b/target/linux/generic/pending-6.0/465-m25p80-mx-disable-software-protection.patch
new file mode 100644
index 000000000..1e2807733
--- /dev/null
+++ b/target/linux/generic/pending-6.0/465-m25p80-mx-disable-software-protection.patch
@@ -0,0 +1,18 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: Disable software protection bits for Macronix flashes.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/spi-nor/spi-nor.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/mtd/spi-nor/macronix.c
++++ b/drivers/mtd/spi-nor/macronix.c
+@@ -106,6 +106,7 @@ static void macronix_nor_default_init(st
+ {
+ 	nor->params->quad_enable = spi_nor_sr1_bit6_quad_enable;
+ 	nor->params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode;
++	nor->flags |= SNOR_F_HAS_LOCK;
+ }
+ 
+ static const struct spi_nor_fixups macronix_nor_fixups = {
diff --git a/target/linux/generic/pending-6.0/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch b/target/linux/generic/pending-6.0/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch
new file mode 100644
index 000000000..b120548d2
--- /dev/null
+++ b/target/linux/generic/pending-6.0/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch
@@ -0,0 +1,97 @@
+From: Daniel Golle <daniel@makrotopia.org>
+Subject: ubi: auto-attach mtd device named "ubi" or "data" on boot
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+---
+ drivers/mtd/ubi/build.c | 36 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 36 insertions(+)
+
+--- a/drivers/mtd/ubi/build.c
++++ b/drivers/mtd/ubi/build.c
+@@ -1184,6 +1184,73 @@ static struct mtd_info * __init open_mtd
+ 	return mtd;
+ }
+ 
++/*
++ * This function tries attaching mtd partitions named either "ubi" or "data"
++ * during boot.
++ */
++static void __init ubi_auto_attach(void)
++{
++	int err;
++	struct mtd_info *mtd;
++	loff_t offset = 0;
++	size_t len;
++	char magic[4];
++
++	/* try attaching mtd device named "ubi" or "data" */
++	mtd = open_mtd_device("ubi");
++	if (IS_ERR(mtd))
++		mtd = open_mtd_device("data");
++
++	if (IS_ERR(mtd))
++		return;
++
++	/* get the first not bad block */
++	if (mtd_can_have_bb(mtd))
++		while (mtd_block_isbad(mtd, offset)) {
++			offset += mtd->erasesize;
++
++			if (offset > mtd->size) {
++				pr_err("UBI error: Failed to find a non-bad "
++				       "block on mtd%d\n", mtd->index);
++				goto cleanup;
++			}
++		}
++
++	/* check if the read from flash was successful */
++	err = mtd_read(mtd, offset, 4, &len, (void *) magic);
++	if ((err && !mtd_is_bitflip(err)) || len != 4) {
++		pr_err("UBI error: unable to read from mtd%d\n", mtd->index);
++		goto cleanup;
++	}
++
++	/* check for a valid ubi magic */
++	if (strncmp(magic, "UBI#", 4)) {
++		pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index);
++		goto cleanup;
++	}
++
++	/* don't auto-add media types where UBI doesn't makes sense */
++	if (mtd->type != MTD_NANDFLASH &&
++	    mtd->type != MTD_NORFLASH &&
++	    mtd->type != MTD_DATAFLASH &&
++	    mtd->type != MTD_MLCNANDFLASH)
++		goto cleanup;
++
++	mutex_lock(&ubi_devices_mutex);
++	pr_notice("UBI: auto-attach mtd%d\n", mtd->index);
++	err = ubi_attach_mtd_dev(mtd, UBI_DEV_NUM_AUTO, 0, 0);
++	mutex_unlock(&ubi_devices_mutex);
++	if (err < 0) {
++		pr_err("UBI error: cannot attach mtd%d\n", mtd->index);
++		goto cleanup;
++	}
++
++	return;
++
++cleanup:
++	put_mtd_device(mtd);
++}
++
+ static int __init ubi_init(void)
+ {
+ 	int err, i, k;
+@@ -1267,6 +1334,12 @@ static int __init ubi_init(void)
+ 		}
+ 	}
+ 
++	/* auto-attach mtd devices only if built-in to the kernel and no ubi.mtd
++	 * parameter was given */
++	if (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) &&
++	    !ubi_is_module() && !mtd_devs)
++		ubi_auto_attach();
++
+ 	err = ubiblock_init();
+ 	if (err) {
+ 		pr_err("UBI error: block: cannot initialize, error %d\n", err);
diff --git a/target/linux/generic/pending-6.0/491-ubi-auto-create-ubiblock-device-for-rootfs.patch b/target/linux/generic/pending-6.0/491-ubi-auto-create-ubiblock-device-for-rootfs.patch
new file mode 100644
index 000000000..17e8d8bed
--- /dev/null
+++ b/target/linux/generic/pending-6.0/491-ubi-auto-create-ubiblock-device-for-rootfs.patch
@@ -0,0 +1,69 @@
+From: Daniel Golle <daniel@makrotopia.org>
+Subject: ubi: auto-create ubiblock device for rootfs
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+---
+ drivers/mtd/ubi/block.c | 42 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 42 insertions(+)
+
+--- a/drivers/mtd/ubi/block.c
++++ b/drivers/mtd/ubi/block.c
+@@ -653,6 +653,47 @@ static void __init ubiblock_create_from_
+ 	}
+ }
+ 
++#define UBIFS_NODE_MAGIC  0x06101831
++static inline int ubi_vol_is_ubifs(struct ubi_volume_desc *desc)
++{
++	int ret;
++	uint32_t magic_of, magic;
++	ret = ubi_read(desc, 0, (char *)&magic_of, 0, 4);
++	if (ret)
++		return 0;
++	magic = le32_to_cpu(magic_of);
++	return magic == UBIFS_NODE_MAGIC;
++}
++
++static void __init ubiblock_create_auto_rootfs(void)
++{
++	int ubi_num, ret, is_ubifs;
++	struct ubi_volume_desc *desc;
++	struct ubi_volume_info vi;
++
++	for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++) {
++		desc = ubi_open_volume_nm(ubi_num, "rootfs", UBI_READONLY);
++		if (IS_ERR(desc))
++			desc = ubi_open_volume_nm(ubi_num, "fit", UBI_READONLY);;
++
++		if (IS_ERR(desc))
++			continue;
++
++		ubi_get_volume_info(desc, &vi);
++		is_ubifs = ubi_vol_is_ubifs(desc);
++		ubi_close_volume(desc);
++		if (is_ubifs)
++			break;
++
++		ret = ubiblock_create(&vi);
++		if (ret)
++			pr_err("UBI error: block: can't add '%s' volume, err=%d\n",
++				vi.name, ret);
++		/* always break if we get here */
++		break;
++	}
++}
++
+ static void ubiblock_remove_all(void)
+ {
+ 	struct ubiblock *next;
+@@ -685,6 +726,10 @@ int __init ubiblock_init(void)
+ 	 */
+ 	ubiblock_create_from_param();
+ 
++	/* auto-attach "rootfs" volume if existing and non-ubifs */
++	if (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV))
++		ubiblock_create_auto_rootfs();
++
+ 	/*
+ 	 * Block devices are only created upon user requests, so we ignore
+ 	 * existing volumes.
diff --git a/target/linux/generic/pending-6.0/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch b/target/linux/generic/pending-6.0/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch
new file mode 100644
index 000000000..1db73cf17
--- /dev/null
+++ b/target/linux/generic/pending-6.0/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch
@@ -0,0 +1,52 @@
+From: Daniel Golle <daniel@makrotopia.org>
+Subject: try auto-mounting ubi0:rootfs in init/do_mounts.c
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+---
+ init/do_mounts.c | 28 +++++++++++++++++++++++++++-
+ 1 file changed, 27 insertions(+), 1 deletion(-)
+
+--- a/init/do_mounts.c
++++ b/init/do_mounts.c
+@@ -446,7 +446,28 @@ retry:
+ out:
+ 	put_page(page);
+ }
+- 
++
++static int __init mount_ubi_rootfs(void)
++{
++	int flags = MS_SILENT;
++	int err, tried = 0;
++
++	while (tried < 2) {
++		err = do_mount_root("ubi0:rootfs", "ubifs", flags, \
++					root_mount_data);
++		switch (err) {
++			case -EACCES:
++				flags |= MS_RDONLY;
++				tried++;
++				break;
++			default:
++				return err;
++		}
++	}
++
++	return -EINVAL;
++}
++
+ #ifdef CONFIG_ROOT_NFS
+ 
+ #define NFSROOT_TIMEOUT_MIN	5
+@@ -583,6 +604,11 @@ void __init mount_root(void)
+ 		if (mount_nodev_root() == 0)
+ 			return;
+ 	}
++
++#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV
++	if (!mount_ubi_rootfs())
++		return;
++#endif
+ #ifdef CONFIG_BLOCK
+ 	{
+ 		int err = create_dev("/dev/root", ROOT_DEV);
diff --git a/target/linux/generic/pending-6.0/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch b/target/linux/generic/pending-6.0/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch
new file mode 100644
index 000000000..e3493ef19
--- /dev/null
+++ b/target/linux/generic/pending-6.0/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch
@@ -0,0 +1,34 @@
+From: Daniel Golle <daniel@makrotopia.org>
+Subject: ubi: set ROOT_DEV to ubiblock "rootfs" if unset
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+---
+ drivers/mtd/ubi/block.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/drivers/mtd/ubi/block.c
++++ b/drivers/mtd/ubi/block.c
+@@ -42,6 +42,7 @@
+ #include <linux/scatterlist.h>
+ #include <linux/idr.h>
+ #include <asm/div64.h>
++#include <linux/root_dev.h>
+ 
+ #include "ubi-media.h"
+ #include "ubi.h"
+@@ -459,6 +460,15 @@ int ubiblock_create(struct ubi_volume_in
+ 	dev_info(disk_to_dev(dev->gd), "created from ubi%d:%d(%s)",
+ 		 dev->ubi_num, dev->vol_id, vi->name);
+ 	mutex_unlock(&devices_mutex);
++
++	if (!strcmp(vi->name, "rootfs") &&
++	    IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) &&
++	    ROOT_DEV == 0) {
++		pr_notice("ubiblock: device ubiblock%d_%d (%s) set to be root filesystem\n",
++			  dev->ubi_num, dev->vol_id, vi->name);
++		ROOT_DEV = MKDEV(gd->major, gd->first_minor);
++	}
++
+ 	return 0;
+ 
+ out_destroy_wq:
diff --git a/target/linux/generic/pending-6.0/494-mtd-ubi-add-EOF-marker-support.patch b/target/linux/generic/pending-6.0/494-mtd-ubi-add-EOF-marker-support.patch
new file mode 100644
index 000000000..413431755
--- /dev/null
+++ b/target/linux/generic/pending-6.0/494-mtd-ubi-add-EOF-marker-support.patch
@@ -0,0 +1,60 @@
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: mtd: add EOF marker support to the UBI layer
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/mtd/ubi/attach.c | 25 ++++++++++++++++++++++---
+ drivers/mtd/ubi/ubi.h    |  1 +
+ 2 files changed, 23 insertions(+), 3 deletions(-)
+
+--- a/drivers/mtd/ubi/attach.c
++++ b/drivers/mtd/ubi/attach.c
+@@ -926,6 +926,13 @@ static bool vol_ignored(int vol_id)
+ #endif
+ }
+ 
++static bool ec_hdr_has_eof(struct ubi_ec_hdr *ech)
++{
++	return ech->padding1[0] == 'E' &&
++	       ech->padding1[1] == 'O' &&
++	       ech->padding1[2] == 'F';
++}
++
+ /**
+  * scan_peb - scan and process UBI headers of a PEB.
+  * @ubi: UBI device description object
+@@ -958,9 +965,21 @@ static int scan_peb(struct ubi_device *u
+ 		return 0;
+ 	}
+ 
+-	err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);
+-	if (err < 0)
+-		return err;
++	if (!ai->eof_found) {
++		err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);
++		if (err < 0)
++			return err;
++
++		if (ec_hdr_has_eof(ech)) {
++			pr_notice("UBI: EOF marker found, PEBs from %d will be erased\n",
++				pnum);
++			ai->eof_found = true;
++		}
++	}
++
++	if (ai->eof_found)
++		err = UBI_IO_FF_BITFLIPS;
++
+ 	switch (err) {
+ 	case 0:
+ 		break;
+--- a/drivers/mtd/ubi/ubi.h
++++ b/drivers/mtd/ubi/ubi.h
+@@ -778,6 +778,7 @@ struct ubi_attach_info {
+ 	int mean_ec;
+ 	uint64_t ec_sum;
+ 	int ec_count;
++	bool eof_found;
+ 	struct kmem_cache *aeb_slab_cache;
+ 	struct ubi_ec_hdr *ech;
+ 	struct ubi_vid_io_buf *vidb;
diff --git a/target/linux/generic/pending-6.0/495-mtd-core-add-get_mtd_device_by_node.patch b/target/linux/generic/pending-6.0/495-mtd-core-add-get_mtd_device_by_node.patch
new file mode 100644
index 000000000..c89969edf
--- /dev/null
+++ b/target/linux/generic/pending-6.0/495-mtd-core-add-get_mtd_device_by_node.patch
@@ -0,0 +1,75 @@
+From 1bd1b740f208d1cf4071932cc51860d37266c402 Mon Sep 17 00:00:00 2001
+From: Bernhard Frauendienst <kernel@nospam.obeliks.de>
+Date: Sat, 1 Sep 2018 00:30:11 +0200
+Subject: [PATCH 495/497] mtd: core: add get_mtd_device_by_node
+
+Add function to retrieve a mtd device by its OF node. Since drivers can
+assign arbitrary names to mtd devices in the absence of a label
+property, there is no other reliable way to retrieve a mtd device for a
+given OF node.
+
+Signed-off-by: Bernhard Frauendienst <kernel@nospam.obeliks.de>
+Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
+---
+ drivers/mtd/mtdcore.c   | 38 ++++++++++++++++++++++++++++++++++++++
+ include/linux/mtd/mtd.h |  2 ++
+ 2 files changed, 40 insertions(+)
+
+--- a/drivers/mtd/mtdcore.c
++++ b/drivers/mtd/mtdcore.c
+@@ -1255,6 +1255,44 @@ out_unlock:
+ }
+ EXPORT_SYMBOL_GPL(get_mtd_device_nm);
+ 
++/**
++ *	get_mtd_device_by_node - obtain a validated handle for an MTD device
++ *	by of_node
++ *	@of_node: OF node of MTD device to open
++ *
++ *	This function returns MTD device description structure in case of
++ *	success and an error code in case of failure.
++ */
++struct mtd_info *get_mtd_device_by_node(const struct device_node *of_node)
++{
++	int err = -ENODEV;
++	struct mtd_info *mtd = NULL, *other;
++
++	mutex_lock(&mtd_table_mutex);
++
++	mtd_for_each_device(other) {
++		if (of_node == other->dev.of_node) {
++			mtd = other;
++			break;
++		}
++	}
++
++	if (!mtd)
++		goto out_unlock;
++
++	err = __get_mtd_device(mtd);
++	if (err)
++		goto out_unlock;
++
++	mutex_unlock(&mtd_table_mutex);
++	return mtd;
++
++out_unlock:
++	mutex_unlock(&mtd_table_mutex);
++	return ERR_PTR(err);
++}
++EXPORT_SYMBOL_GPL(get_mtd_device_by_node);
++
+ void put_mtd_device(struct mtd_info *mtd)
+ {
+ 	mutex_lock(&mtd_table_mutex);
+--- a/include/linux/mtd/mtd.h
++++ b/include/linux/mtd/mtd.h
+@@ -698,6 +698,8 @@ extern struct mtd_info *get_mtd_device(s
+ extern int __get_mtd_device(struct mtd_info *mtd);
+ extern void __put_mtd_device(struct mtd_info *mtd);
+ extern struct mtd_info *get_mtd_device_nm(const char *name);
++extern struct mtd_info *get_mtd_device_by_node(
++		const struct device_node *of_node);
+ extern void put_mtd_device(struct mtd_info *mtd);
+ 
+ static inline uint64_t mtdpart_get_offset(const struct mtd_info *mtd)
diff --git a/target/linux/generic/pending-6.0/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch b/target/linux/generic/pending-6.0/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch
new file mode 100644
index 000000000..01f3b9ec2
--- /dev/null
+++ b/target/linux/generic/pending-6.0/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch
@@ -0,0 +1,52 @@
+From 5734c6669fba7ddb5ef491ccff7159d15dba0b59 Mon Sep 17 00:00:00 2001
+From: Bernhard Frauendienst <kernel@nospam.obeliks.de>
+Date: Wed, 5 Sep 2018 01:32:51 +0200
+Subject: [PATCH 496/497] dt-bindings: add bindings for mtd-concat devices
+
+Document virtual mtd-concat device bindings.
+
+Signed-off-by: Bernhard Frauendienst <kernel@nospam.obeliks.de>
+---
+ .../devicetree/bindings/mtd/mtd-concat.txt    | 36 +++++++++++++++++++
+ 1 file changed, 36 insertions(+)
+ create mode 100644 Documentation/devicetree/bindings/mtd/mtd-concat.txt
+
+--- /dev/null
++++ b/Documentation/devicetree/bindings/mtd/mtd-concat.txt
+@@ -0,0 +1,36 @@
++Virtual MTD concat device
++
++Requires properties:
++- devices: list of phandles to mtd nodes that should be concatenated
++
++Example:
++
++&spi {
++	flash0: flash@0 {
++		...
++	};
++	flash1: flash@1 {
++		...
++	};
++};
++
++flash {
++	compatible = "mtd-concat";
++
++	devices = <&flash0 &flash1>;
++
++	partitions {
++		compatible = "fixed-partitions";
++
++		partition@0 {
++			label = "boot";
++			reg = <0x0000000 0x0040000>;
++			read-only;
++		};
++
++		partition@40000 {
++			label = "firmware";
++			reg = <0x0040000 0x1fc0000>;
++		};
++	}
++}
diff --git a/target/linux/generic/pending-6.0/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch b/target/linux/generic/pending-6.0/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch
new file mode 100644
index 000000000..321680154
--- /dev/null
+++ b/target/linux/generic/pending-6.0/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch
@@ -0,0 +1,216 @@
+From e53f712d8eac71f54399b61038ccf87d2cee99d7 Mon Sep 17 00:00:00 2001
+From: Bernhard Frauendienst <kernel@nospam.obeliks.de>
+Date: Sat, 25 Aug 2018 12:35:22 +0200
+Subject: [PATCH 497/497] mtd: mtdconcat: add dt driver for concat devices
+
+Some mtd drivers like physmap variants have support for concatenating
+multiple mtd devices, but there is no generic way to define such a
+concat device from within the device tree.
+
+This is useful for some SoC boards that use multiple flash chips as
+memory banks of a single mtd device, with partitions spanning chip
+borders.
+
+This commit adds a driver for creating virtual mtd-concat devices. They
+must have a compatible = "mtd-concat" line, and define a list of devices
+to concat in the 'devices' property, for example:
+
+flash {
+  compatible = "mtd-concat";
+
+  devices = <&flash0 &flash1>;
+
+  partitions {
+    ...
+  };
+};
+
+The driver is added to the very end of the mtd Makefile to increase the
+likelyhood of all child devices already being loaded at the time of
+probing, preventing unnecessary deferred probes.
+
+Signed-off-by: Bernhard Frauendienst <kernel@nospam.obeliks.de>
+---
+ drivers/mtd/Kconfig                 |   2 +
+ drivers/mtd/Makefile                |   3 +
+ drivers/mtd/composite/Kconfig       |  12 +++
+ drivers/mtd/composite/Makefile      |   6 ++
+ drivers/mtd/composite/virt_concat.c | 128 ++++++++++++++++++++++++++++
+ 5 files changed, 151 insertions(+)
+ create mode 100644 drivers/mtd/composite/Kconfig
+ create mode 100644 drivers/mtd/composite/Makefile
+ create mode 100644 drivers/mtd/composite/virt_concat.c
+
+--- a/drivers/mtd/Kconfig
++++ b/drivers/mtd/Kconfig
+@@ -241,4 +241,6 @@ source "drivers/mtd/ubi/Kconfig"
+ 
+ source "drivers/mtd/hyperbus/Kconfig"
+ 
++source "drivers/mtd/composite/Kconfig"
++
+ endif # MTD
+--- a/drivers/mtd/Makefile
++++ b/drivers/mtd/Makefile
+@@ -33,3 +33,6 @@ obj-y		+= chips/ lpddr/ maps/ devices/ n
+ obj-$(CONFIG_MTD_SPI_NOR)	+= spi-nor/
+ obj-$(CONFIG_MTD_UBI)		+= ubi/
+ obj-$(CONFIG_MTD_HYPERBUS)	+= hyperbus/
++
++# Composite drivers must be loaded last
++obj-y				+= composite/
+--- /dev/null
++++ b/drivers/mtd/composite/Kconfig
+@@ -0,0 +1,12 @@
++menu "Composite MTD device drivers"
++	depends on MTD!=n
++
++config MTD_VIRT_CONCAT
++	tristate "Virtual concat MTD device"
++	help
++	  This driver allows creation of a virtual MTD concat device, which
++	  concatenates multiple underlying MTD devices to a single device.
++	  This is required by some SoC boards where multiple memory banks are
++	  used as one device with partitions spanning across device boundaries.
++
++endmenu
+--- /dev/null
++++ b/drivers/mtd/composite/Makefile
+@@ -0,0 +1,6 @@
++# SPDX-License-Identifier: GPL-2.0
++#
++# linux/drivers/mtd/composite/Makefile
++#
++
++obj-$(CONFIG_MTD_VIRT_CONCAT)   += virt_concat.o
+--- /dev/null
++++ b/drivers/mtd/composite/virt_concat.c
+@@ -0,0 +1,128 @@
++// SPDX-License-Identifier: GPL-2.0+
++/*
++ * Virtual concat MTD device driver
++ *
++ * Copyright (C) 2018 Bernhard Frauendienst
++ * Author: Bernhard Frauendienst, kernel@nospam.obeliks.de
++ */
++
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/mtd/concat.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
++#include <linux/of.h>
++#include <linux/of_platform.h>
++#include <linux/slab.h>
++
++/*
++ * struct of_virt_concat - platform device driver data.
++ * @cmtd the final mtd_concat device
++ * @num_devices the number of devices in @devices
++ * @devices points to an array of devices already loaded
++ */
++struct of_virt_concat {
++	struct mtd_info	*cmtd;
++	int num_devices;
++	struct mtd_info	**devices;
++};
++
++static int virt_concat_remove(struct platform_device *pdev)
++{
++	struct of_virt_concat *info;
++	int i;
++
++	info = platform_get_drvdata(pdev);
++	if (!info)
++		return 0;
++
++	// unset data for when this is called after a probe error
++	platform_set_drvdata(pdev, NULL);
++
++	if (info->cmtd) {
++		mtd_device_unregister(info->cmtd);
++		mtd_concat_destroy(info->cmtd);
++	}
++
++	if (info->devices) {
++		for (i = 0; i < info->num_devices; i++)
++			put_mtd_device(info->devices[i]);
++	}
++
++	return 0;
++}
++
++static int virt_concat_probe(struct platform_device *pdev)
++{
++	struct device_node *node = pdev->dev.of_node;
++	struct of_phandle_iterator it;
++	struct of_virt_concat *info;
++	struct mtd_info *mtd;
++	int err = 0, count;
++
++	count = of_count_phandle_with_args(node, "devices", NULL);
++	if (count <= 0)
++		return -EINVAL;
++
++	info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
++	if (!info)
++		return -ENOMEM;
++	info->devices = devm_kcalloc(&pdev->dev, count,
++				     sizeof(*(info->devices)), GFP_KERNEL);
++	if (!info->devices) {
++		err = -ENOMEM;
++		goto err_remove;
++	}
++
++	platform_set_drvdata(pdev, info);
++
++	of_for_each_phandle(&it, err, node, "devices", NULL, 0) {
++		mtd = get_mtd_device_by_node(it.node);
++		if (IS_ERR(mtd)) {
++			of_node_put(it.node);
++			err = -EPROBE_DEFER;
++			goto err_remove;
++		}
++
++		info->devices[info->num_devices++] = mtd;
++	}
++
++	info->cmtd = mtd_concat_create(info->devices, info->num_devices,
++				       dev_name(&pdev->dev));
++	if (!info->cmtd) {
++		err = -ENXIO;
++		goto err_remove;
++	}
++
++	info->cmtd->dev.parent = &pdev->dev;
++	mtd_set_of_node(info->cmtd, node);
++	mtd_device_register(info->cmtd, NULL, 0);
++
++	return 0;
++
++err_remove:
++	virt_concat_remove(pdev);
++
++	return err;
++}
++
++static const struct of_device_id virt_concat_of_match[] = {
++	{ .compatible = "mtd-concat", },
++	{ /* sentinel */ }
++};
++MODULE_DEVICE_TABLE(of, virt_concat_of_match);
++
++static struct platform_driver virt_concat_driver = {
++	.probe = virt_concat_probe,
++	.remove = virt_concat_remove,
++	.driver	 = {
++		.name   = "virt-mtdconcat",
++		.of_match_table = virt_concat_of_match,
++	},
++};
++
++module_platform_driver(virt_concat_driver);
++
++MODULE_LICENSE("GPL v2");
++MODULE_AUTHOR("Bernhard Frauendienst <kernel@nospam.obeliks.de>");
++MODULE_DESCRIPTION("Virtual concat MTD device driver");
diff --git a/target/linux/generic/pending-6.0/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch b/target/linux/generic/pending-6.0/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch
new file mode 100644
index 000000000..e9060e16e
--- /dev/null
+++ b/target/linux/generic/pending-6.0/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch
@@ -0,0 +1,30 @@
+From 245224608b5368c10407da07557e546743d3c489 Mon Sep 17 00:00:00 2001
+From: Nick Hainke <vincent@systemli.org>
+Date: Mon, 27 Dec 2021 09:33:13 +0100
+Subject: [PATCH 2/2] mtd: spi-nor: disable 16-bit-sr for macronix
+
+Macronix flash chips seem to consist of only one status register.
+These chips will not work with the "16-bit Write Status (01h) Command".
+Disable SNOR_F_HAS_16BIT_SR for all Macronix chips.
+
+Tested with MX25L6405D.
+
+Fixes: 39d1e3340c73 ("mtd: spi-nor: Fix clearing of QE bit on
+lock()/unlock()")
+
+Signed-off-by: David Bauer <mail@david-bauer.net>
+Signed-off-by: Nick Hainke <vincent@systemli.org>
+---
+ drivers/mtd/spi-nor/macronix.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/mtd/spi-nor/macronix.c
++++ b/drivers/mtd/spi-nor/macronix.c
+@@ -106,6 +106,7 @@ static void macronix_nor_default_init(st
+ {
+ 	nor->params->quad_enable = spi_nor_sr1_bit6_quad_enable;
+ 	nor->params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode;
++	nor->flags &= ~SNOR_F_HAS_16BIT_SR;
+ 	nor->flags |= SNOR_F_HAS_LOCK;
+ }
+ 
diff --git a/target/linux/generic/pending-6.0/500-fs_cdrom_dependencies.patch b/target/linux/generic/pending-6.0/500-fs_cdrom_dependencies.patch
new file mode 100644
index 000000000..0a5a3aae5
--- /dev/null
+++ b/target/linux/generic/pending-6.0/500-fs_cdrom_dependencies.patch
@@ -0,0 +1,40 @@
+--- a/fs/hfs/Kconfig
++++ b/fs/hfs/Kconfig
+@@ -2,6 +2,7 @@
+ config HFS_FS
+ 	tristate "Apple Macintosh file system support"
+ 	depends on BLOCK
++	select CDROM
+ 	select NLS
+ 	help
+ 	  If you say Y here, you will be able to mount Macintosh-formatted
+--- a/fs/hfsplus/Kconfig
++++ b/fs/hfsplus/Kconfig
+@@ -2,6 +2,7 @@
+ config HFSPLUS_FS
+ 	tristate "Apple Extended HFS file system support"
+ 	depends on BLOCK
++	select CDROM
+ 	select NLS
+ 	select NLS_UTF8
+ 	help
+--- a/fs/isofs/Kconfig
++++ b/fs/isofs/Kconfig
+@@ -1,6 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0-only
+ config ISO9660_FS
+ 	tristate "ISO 9660 CDROM file system support"
++	select CDROM
+ 	help
+ 	  This is the standard file system used on CD-ROMs.  It was previously
+ 	  known as "High Sierra File System" and is called "hsfs" on other
+--- a/fs/udf/Kconfig
++++ b/fs/udf/Kconfig
+@@ -1,6 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0-only
+ config UDF_FS
+ 	tristate "UDF file system support"
++	select CDROM
+ 	select CRC_ITU_T
+ 	select NLS
+ 	help
diff --git a/target/linux/generic/pending-6.0/530-jffs2_make_lzma_available.patch b/target/linux/generic/pending-6.0/530-jffs2_make_lzma_available.patch
new file mode 100644
index 000000000..38635562a
--- /dev/null
+++ b/target/linux/generic/pending-6.0/530-jffs2_make_lzma_available.patch
@@ -0,0 +1,5180 @@
+From: Alexandros C. Couloumbis <alex@ozo.com>
+Subject: fs: add jffs2/lzma support (not activated by default yet)
+
+lede-commit: c2c88d315fa0e881f8b19da07b62859b915b11b2
+Signed-off-by: Alexandros C. Couloumbis <alex@ozo.com>
+---
+ fs/jffs2/Kconfig             |    9 +
+ fs/jffs2/Makefile            |    3 +
+ fs/jffs2/compr.c             |    6 +
+ fs/jffs2/compr.h             |   10 +-
+ fs/jffs2/compr_lzma.c        |  128 +++
+ fs/jffs2/super.c             |   33 +-
+ include/linux/lzma.h         |   62 ++
+ include/linux/lzma/LzFind.h  |  115 +++
+ include/linux/lzma/LzHash.h  |   54 +
+ include/linux/lzma/LzmaDec.h |  231 +++++
+ include/linux/lzma/LzmaEnc.h |   80 ++
+ include/linux/lzma/Types.h   |  226 +++++
+ include/uapi/linux/jffs2.h   |    1 +
+ lib/Kconfig                  |    6 +
+ lib/Makefile                 |   12 +
+ lib/lzma/LzFind.c            |  761 ++++++++++++++
+ lib/lzma/LzmaDec.c           |  999 +++++++++++++++++++
+ lib/lzma/LzmaEnc.c           | 2271 ++++++++++++++++++++++++++++++++++++++++++
+ lib/lzma/Makefile            |    7 +
+ 19 files changed, 5008 insertions(+), 6 deletions(-)
+ create mode 100644 fs/jffs2/compr_lzma.c
+ create mode 100644 include/linux/lzma.h
+ create mode 100644 include/linux/lzma/LzFind.h
+ create mode 100644 include/linux/lzma/LzHash.h
+ create mode 100644 include/linux/lzma/LzmaDec.h
+ create mode 100644 include/linux/lzma/LzmaEnc.h
+ create mode 100644 include/linux/lzma/Types.h
+ create mode 100644 lib/lzma/LzFind.c
+ create mode 100644 lib/lzma/LzmaDec.c
+ create mode 100644 lib/lzma/LzmaEnc.c
+ create mode 100644 lib/lzma/Makefile
+
+--- a/fs/jffs2/Kconfig
++++ b/fs/jffs2/Kconfig
+@@ -136,6 +136,15 @@ config JFFS2_LZO
+ 	  This feature was added in July, 2007. Say 'N' if you need
+ 	  compatibility with older bootloaders or kernels.
+ 
++config JFFS2_LZMA
++	bool "JFFS2 LZMA compression support" if JFFS2_COMPRESSION_OPTIONS
++	select LZMA_COMPRESS
++	select LZMA_DECOMPRESS
++	depends on JFFS2_FS
++	default n
++	help
++	  JFFS2 wrapper to the LZMA C SDK
++
+ config JFFS2_RTIME
+ 	bool "JFFS2 RTIME compression support" if JFFS2_COMPRESSION_OPTIONS
+ 	depends on JFFS2_FS
+--- a/fs/jffs2/Makefile
++++ b/fs/jffs2/Makefile
+@@ -19,4 +19,7 @@ jffs2-$(CONFIG_JFFS2_RUBIN)	+= compr_rub
+ jffs2-$(CONFIG_JFFS2_RTIME)	+= compr_rtime.o
+ jffs2-$(CONFIG_JFFS2_ZLIB)	+= compr_zlib.o
+ jffs2-$(CONFIG_JFFS2_LZO)	+= compr_lzo.o
++jffs2-$(CONFIG_JFFS2_LZMA)	+= compr_lzma.o
+ jffs2-$(CONFIG_JFFS2_SUMMARY)   += summary.o
++
++CFLAGS_compr_lzma.o += -Iinclude/linux -Ilib/lzma
+--- a/fs/jffs2/compr.c
++++ b/fs/jffs2/compr.c
+@@ -378,6 +378,9 @@ int __init jffs2_compressors_init(void)
+ #ifdef CONFIG_JFFS2_LZO
+ 	jffs2_lzo_init();
+ #endif
++#ifdef CONFIG_JFFS2_LZMA
++	jffs2_lzma_init();
++#endif
+ /* Setting default compression mode */
+ #ifdef CONFIG_JFFS2_CMODE_NONE
+ 	jffs2_compression_mode = JFFS2_COMPR_MODE_NONE;
+@@ -401,6 +404,9 @@ int __init jffs2_compressors_init(void)
+ int jffs2_compressors_exit(void)
+ {
+ /* Unregistering compressors */
++#ifdef CONFIG_JFFS2_LZMA
++	jffs2_lzma_exit();
++#endif
+ #ifdef CONFIG_JFFS2_LZO
+ 	jffs2_lzo_exit();
+ #endif
+--- a/fs/jffs2/compr.h
++++ b/fs/jffs2/compr.h
+@@ -29,9 +29,9 @@
+ #define JFFS2_DYNRUBIN_PRIORITY  20
+ #define JFFS2_LZARI_PRIORITY     30
+ #define JFFS2_RTIME_PRIORITY     50
+-#define JFFS2_ZLIB_PRIORITY      60
+-#define JFFS2_LZO_PRIORITY       80
+-
++#define JFFS2_LZMA_PRIORITY      70
++#define JFFS2_ZLIB_PRIORITY      80
++#define JFFS2_LZO_PRIORITY       90
+ 
+ #define JFFS2_RUBINMIPS_DISABLED /* RUBINs will be used only */
+ #define JFFS2_DYNRUBIN_DISABLED  /*	   for decompression */
+@@ -101,5 +101,9 @@ void jffs2_zlib_exit(void);
+ int jffs2_lzo_init(void);
+ void jffs2_lzo_exit(void);
+ #endif
++#ifdef CONFIG_JFFS2_LZMA
++int jffs2_lzma_init(void);
++void jffs2_lzma_exit(void);
++#endif
+ 
+ #endif /* __JFFS2_COMPR_H__ */
+--- /dev/null
++++ b/fs/jffs2/compr_lzma.c
+@@ -0,0 +1,128 @@
++/*
++ * JFFS2 -- Journalling Flash File System, Version 2.
++ *
++ * For licensing information, see the file 'LICENCE' in this directory.
++ *
++ * JFFS2 wrapper to the LZMA C SDK
++ *
++ */
++
++#include <linux/lzma.h>
++#include "compr.h"
++
++#ifdef __KERNEL__
++	static DEFINE_MUTEX(deflate_mutex);
++#endif
++
++CLzmaEncHandle *p;
++Byte propsEncoded[LZMA_PROPS_SIZE];
++SizeT propsSize = sizeof(propsEncoded);
++
++STATIC void lzma_free_workspace(void)
++{
++	LzmaEnc_Destroy(p, &lzma_alloc, &lzma_alloc);
++}
++
++STATIC int INIT lzma_alloc_workspace(CLzmaEncProps *props)
++{
++	if ((p = (CLzmaEncHandle *)LzmaEnc_Create(&lzma_alloc)) == NULL)
++	{
++		PRINT_ERROR("Failed to allocate lzma deflate workspace\n");
++		return -ENOMEM;
++	}
++
++	if (LzmaEnc_SetProps(p, props) != SZ_OK)
++	{
++		lzma_free_workspace();
++		return -1;
++	}
++
++	if (LzmaEnc_WriteProperties(p, propsEncoded, &propsSize) != SZ_OK)
++	{
++		lzma_free_workspace();
++		return -1;
++	}
++
++	return 0;
++}
++
++STATIC int jffs2_lzma_compress(unsigned char *data_in, unsigned char *cpage_out,
++			      uint32_t *sourcelen, uint32_t *dstlen)
++{
++	SizeT compress_size = (SizeT)(*dstlen);
++	int ret;
++
++	#ifdef __KERNEL__
++		mutex_lock(&deflate_mutex);
++	#endif
++
++	ret = LzmaEnc_MemEncode(p, cpage_out, &compress_size, data_in, *sourcelen,
++		0, NULL, &lzma_alloc, &lzma_alloc);
++
++	#ifdef __KERNEL__
++		mutex_unlock(&deflate_mutex);
++	#endif
++
++	if (ret != SZ_OK)
++		return -1;
++
++	*dstlen = (uint32_t)compress_size;
++
++	return 0;
++}
++
++STATIC int jffs2_lzma_decompress(unsigned char *data_in, unsigned char *cpage_out,
++				 uint32_t srclen, uint32_t destlen)
++{
++	int ret;
++	SizeT dl = (SizeT)destlen;
++	SizeT sl = (SizeT)srclen;
++	ELzmaStatus status;
++
++	ret = LzmaDecode(cpage_out, &dl, data_in, &sl, propsEncoded,
++		propsSize, LZMA_FINISH_ANY, &status, &lzma_alloc);
++
++	if (ret != SZ_OK || status == LZMA_STATUS_NOT_FINISHED || dl != (SizeT)destlen)
++		return -1;
++
++	return 0;
++}
++
++static struct jffs2_compressor jffs2_lzma_comp = {
++	.priority = JFFS2_LZMA_PRIORITY,
++	.name = "lzma",
++	.compr = JFFS2_COMPR_LZMA,
++	.compress = &jffs2_lzma_compress,
++	.decompress = &jffs2_lzma_decompress,
++	.disabled = 0,
++};
++
++int INIT jffs2_lzma_init(void)
++{
++	int ret;
++	CLzmaEncProps props;
++	LzmaEncProps_Init(&props);
++
++	props.dictSize = LZMA_BEST_DICT(0x2000);
++	props.level = LZMA_BEST_LEVEL;
++	props.lc = LZMA_BEST_LC;
++	props.lp = LZMA_BEST_LP;
++	props.pb = LZMA_BEST_PB;
++	props.fb = LZMA_BEST_FB;
++
++	ret = lzma_alloc_workspace(&props);
++	if (ret < 0)
++		return ret;
++
++	ret = jffs2_register_compressor(&jffs2_lzma_comp);
++	if (ret)
++		lzma_free_workspace();
++
++	return ret;
++}
++
++void jffs2_lzma_exit(void)
++{
++	jffs2_unregister_compressor(&jffs2_lzma_comp);
++	lzma_free_workspace();
++}
+--- a/fs/jffs2/super.c
++++ b/fs/jffs2/super.c
+@@ -374,14 +374,41 @@ static int __init init_jffs2_fs(void)
+ 	BUILD_BUG_ON(sizeof(struct jffs2_raw_inode) != 68);
+ 	BUILD_BUG_ON(sizeof(struct jffs2_raw_summary) != 32);
+ 
+-	pr_info("version 2.2."
++	pr_info("version 2.2"
+ #ifdef CONFIG_JFFS2_FS_WRITEBUFFER
+ 	       " (NAND)"
+ #endif
+ #ifdef CONFIG_JFFS2_SUMMARY
+-	       " (SUMMARY) "
++	       " (SUMMARY)"
+ #endif
+-	       " © 2001-2006 Red Hat, Inc.\n");
++#ifdef CONFIG_JFFS2_ZLIB
++	       " (ZLIB)"
++#endif
++#ifdef CONFIG_JFFS2_LZO
++	       " (LZO)"
++#endif
++#ifdef CONFIG_JFFS2_LZMA
++	       " (LZMA)"
++#endif
++#ifdef CONFIG_JFFS2_RTIME
++	       " (RTIME)"
++#endif
++#ifdef CONFIG_JFFS2_RUBIN
++	       " (RUBIN)"
++#endif
++#ifdef  CONFIG_JFFS2_CMODE_NONE
++	       " (CMODE_NONE)"
++#endif
++#ifdef CONFIG_JFFS2_CMODE_PRIORITY
++	       " (CMODE_PRIORITY)"
++#endif
++#ifdef CONFIG_JFFS2_CMODE_SIZE
++	       " (CMODE_SIZE)"
++#endif
++#ifdef CONFIG_JFFS2_CMODE_FAVOURLZO
++	       " (CMODE_FAVOURLZO)"
++#endif
++	       " (c) 2001-2006 Red Hat, Inc.\n");
+ 
+ 	jffs2_inode_cachep = kmem_cache_create("jffs2_i",
+ 					     sizeof(struct jffs2_inode_info),
+--- /dev/null
++++ b/include/linux/lzma.h
+@@ -0,0 +1,62 @@
++#ifndef __LZMA_H__
++#define __LZMA_H__
++
++#ifdef __KERNEL__
++	#include <linux/kernel.h>
++	#include <linux/sched.h>
++	#include <linux/slab.h>
++	#include <linux/vmalloc.h>
++	#include <linux/init.h>
++	#define LZMA_MALLOC vmalloc
++	#define LZMA_FREE vfree
++	#define PRINT_ERROR(msg) printk(KERN_WARNING #msg)
++	#define INIT __init
++	#define STATIC static
++#else
++	#include <stdint.h>
++	#include <stdlib.h>
++	#include <stdio.h>
++	#include <unistd.h>
++	#include <string.h>
++	#include <asm/types.h>
++	#include <errno.h>
++	#include <linux/jffs2.h>
++	#ifndef PAGE_SIZE
++		extern int page_size;
++		#define PAGE_SIZE page_size
++	#endif
++	#define LZMA_MALLOC malloc
++	#define LZMA_FREE free
++	#define PRINT_ERROR(msg) fprintf(stderr, msg)
++	#define INIT
++	#define STATIC
++#endif
++
++#include "lzma/LzmaDec.h"
++#include "lzma/LzmaEnc.h"
++
++#define LZMA_BEST_LEVEL (9)
++#define LZMA_BEST_LC    (0)
++#define LZMA_BEST_LP    (0)
++#define LZMA_BEST_PB    (0)
++#define LZMA_BEST_FB  (273)
++
++#define LZMA_BEST_DICT(n) (((int)((n) / 2)) * 2)
++
++static void *p_lzma_malloc(void *p, size_t size)
++{
++	if (size == 0)
++		return NULL;
++
++	return LZMA_MALLOC(size);
++}
++
++static void p_lzma_free(void *p, void *address)
++{
++	if (address != NULL)
++		LZMA_FREE(address);
++}
++
++static ISzAlloc lzma_alloc = {p_lzma_malloc, p_lzma_free};
++
++#endif
+--- /dev/null
++++ b/include/linux/lzma/LzFind.h
+@@ -0,0 +1,115 @@
++/* LzFind.h -- Match finder for LZ algorithms
++2009-04-22 : Igor Pavlov : Public domain */
++
++#ifndef __LZ_FIND_H
++#define __LZ_FIND_H
++
++#include "Types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef UInt32 CLzRef;
++
++typedef struct _CMatchFinder
++{
++  Byte *buffer;
++  UInt32 pos;
++  UInt32 posLimit;
++  UInt32 streamPos;
++  UInt32 lenLimit;
++
++  UInt32 cyclicBufferPos;
++  UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */
++
++  UInt32 matchMaxLen;
++  CLzRef *hash;
++  CLzRef *son;
++  UInt32 hashMask;
++  UInt32 cutValue;
++
++  Byte *bufferBase;
++  ISeqInStream *stream;
++  int streamEndWasReached;
++
++  UInt32 blockSize;
++  UInt32 keepSizeBefore;
++  UInt32 keepSizeAfter;
++
++  UInt32 numHashBytes;
++  int directInput;
++  size_t directInputRem;
++  int btMode;
++  int bigHash;
++  UInt32 historySize;
++  UInt32 fixedHashSize;
++  UInt32 hashSizeSum;
++  UInt32 numSons;
++  SRes result;
++  UInt32 crc[256];
++} CMatchFinder;
++
++#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer)
++#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)])
++
++#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
++
++int MatchFinder_NeedMove(CMatchFinder *p);
++Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
++void MatchFinder_MoveBlock(CMatchFinder *p);
++void MatchFinder_ReadIfRequired(CMatchFinder *p);
++
++void MatchFinder_Construct(CMatchFinder *p);
++
++/* Conditions:
++     historySize <= 3 GB
++     keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB
++*/
++int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
++    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
++    ISzAlloc *alloc);
++void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
++void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
++void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
++
++UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
++    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
++    UInt32 *distances, UInt32 maxLen);
++
++/*
++Conditions:
++  Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.
++  Mf_GetPointerToCurrentPos_Func's result must be used only before any other function
++*/
++
++typedef void (*Mf_Init_Func)(void *object);
++typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index);
++typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object);
++typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object);
++typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances);
++typedef void (*Mf_Skip_Func)(void *object, UInt32);
++
++typedef struct _IMatchFinder
++{
++  Mf_Init_Func Init;
++  Mf_GetIndexByte_Func GetIndexByte;
++  Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;
++  Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;
++  Mf_GetMatches_Func GetMatches;
++  Mf_Skip_Func Skip;
++} IMatchFinder;
++
++void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
++
++void MatchFinder_Init(CMatchFinder *p);
++UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
++UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
++void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
++void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+--- /dev/null
++++ b/include/linux/lzma/LzHash.h
+@@ -0,0 +1,54 @@
++/* LzHash.h -- HASH functions for LZ algorithms
++2009-02-07 : Igor Pavlov : Public domain */
++
++#ifndef __LZ_HASH_H
++#define __LZ_HASH_H
++
++#define kHash2Size (1 << 10)
++#define kHash3Size (1 << 16)
++#define kHash4Size (1 << 20)
++
++#define kFix3HashSize (kHash2Size)
++#define kFix4HashSize (kHash2Size + kHash3Size)
++#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size)
++
++#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8);
++
++#define HASH3_CALC { \
++  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
++  hash2Value = temp & (kHash2Size - 1); \
++  hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; }
++
++#define HASH4_CALC { \
++  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
++  hash2Value = temp & (kHash2Size - 1); \
++  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
++  hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; }
++
++#define HASH5_CALC { \
++  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
++  hash2Value = temp & (kHash2Size - 1); \
++  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
++  hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \
++  hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \
++  hash4Value &= (kHash4Size - 1); }
++
++/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */
++#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF;
++
++
++#define MT_HASH2_CALC \
++  hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1);
++
++#define MT_HASH3_CALC { \
++  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
++  hash2Value = temp & (kHash2Size - 1); \
++  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); }
++
++#define MT_HASH4_CALC { \
++  UInt32 temp = p->crc[cur[0]] ^ cur[1]; \
++  hash2Value = temp & (kHash2Size - 1); \
++  hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \
++  hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); }
++
++#endif
+--- /dev/null
++++ b/include/linux/lzma/LzmaDec.h
+@@ -0,0 +1,231 @@
++/* LzmaDec.h -- LZMA Decoder
++2009-02-07 : Igor Pavlov : Public domain */
++
++#ifndef __LZMA_DEC_H
++#define __LZMA_DEC_H
++
++#include "Types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* #define _LZMA_PROB32 */
++/* _LZMA_PROB32 can increase the speed on some CPUs,
++   but memory usage for CLzmaDec::probs will be doubled in that case */
++
++#ifdef _LZMA_PROB32
++#define CLzmaProb UInt32
++#else
++#define CLzmaProb UInt16
++#endif
++
++
++/* ---------- LZMA Properties ---------- */
++
++#define LZMA_PROPS_SIZE 5
++
++typedef struct _CLzmaProps
++{
++  unsigned lc, lp, pb;
++  UInt32 dicSize;
++} CLzmaProps;
++
++/* LzmaProps_Decode - decodes properties
++Returns:
++  SZ_OK
++  SZ_ERROR_UNSUPPORTED - Unsupported properties
++*/
++
++SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
++
++
++/* ---------- LZMA Decoder state ---------- */
++
++/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
++   Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
++
++#define LZMA_REQUIRED_INPUT_MAX 20
++
++typedef struct
++{
++  CLzmaProps prop;
++  CLzmaProb *probs;
++  Byte *dic;
++  const Byte *buf;
++  UInt32 range, code;
++  SizeT dicPos;
++  SizeT dicBufSize;
++  UInt32 processedPos;
++  UInt32 checkDicSize;
++  unsigned state;
++  UInt32 reps[4];
++  unsigned remainLen;
++  int needFlush;
++  int needInitState;
++  UInt32 numProbs;
++  unsigned tempBufSize;
++  Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
++} CLzmaDec;
++
++#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
++
++void LzmaDec_Init(CLzmaDec *p);
++
++/* There are two types of LZMA streams:
++     0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
++     1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
++
++typedef enum
++{
++  LZMA_FINISH_ANY,   /* finish at any point */
++  LZMA_FINISH_END    /* block must be finished at the end */
++} ELzmaFinishMode;
++
++/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
++
++   You must use LZMA_FINISH_END, when you know that current output buffer
++   covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
++
++   If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
++   and output value of destLen will be less than output buffer size limit.
++   You can check status result also.
++
++   You can use multiple checks to test data integrity after full decompression:
++     1) Check Result and "status" variable.
++     2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
++     3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
++        You must use correct finish mode in that case. */
++
++typedef enum
++{
++  LZMA_STATUS_NOT_SPECIFIED,               /* use main error code instead */
++  LZMA_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */
++  LZMA_STATUS_NOT_FINISHED,                /* stream was not finished */
++  LZMA_STATUS_NEEDS_MORE_INPUT,            /* you must provide more input bytes */
++  LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK  /* there is probability that stream was finished without end mark */
++} ELzmaStatus;
++
++/* ELzmaStatus is used only as output value for function call */
++
++
++/* ---------- Interfaces ---------- */
++
++/* There are 3 levels of interfaces:
++     1) Dictionary Interface
++     2) Buffer Interface
++     3) One Call Interface
++   You can select any of these interfaces, but don't mix functions from different
++   groups for same object. */
++
++
++/* There are two variants to allocate state for Dictionary Interface:
++     1) LzmaDec_Allocate / LzmaDec_Free
++     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
++   You can use variant 2, if you set dictionary buffer manually.
++   For Buffer Interface you must always use variant 1.
++
++LzmaDec_Allocate* can return:
++  SZ_OK
++  SZ_ERROR_MEM         - Memory allocation error
++  SZ_ERROR_UNSUPPORTED - Unsupported properties
++*/
++
++SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
++void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
++
++SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
++void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
++
++/* ---------- Dictionary Interface ---------- */
++
++/* You can use it, if you want to eliminate the overhead for data copying from
++   dictionary to some other external buffer.
++   You must work with CLzmaDec variables directly in this interface.
++
++   STEPS:
++     LzmaDec_Constr()
++     LzmaDec_Allocate()
++     for (each new stream)
++     {
++       LzmaDec_Init()
++       while (it needs more decompression)
++       {
++         LzmaDec_DecodeToDic()
++         use data from CLzmaDec::dic and update CLzmaDec::dicPos
++       }
++     }
++     LzmaDec_Free()
++*/
++
++/* LzmaDec_DecodeToDic
++
++   The decoding to internal dictionary buffer (CLzmaDec::dic).
++   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
++
++finishMode:
++  It has meaning only if the decoding reaches output limit (dicLimit).
++  LZMA_FINISH_ANY - Decode just dicLimit bytes.
++  LZMA_FINISH_END - Stream must be finished after dicLimit.
++
++Returns:
++  SZ_OK
++    status:
++      LZMA_STATUS_FINISHED_WITH_MARK
++      LZMA_STATUS_NOT_FINISHED
++      LZMA_STATUS_NEEDS_MORE_INPUT
++      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
++  SZ_ERROR_DATA - Data error
++*/
++
++SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
++    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
++
++
++/* ---------- Buffer Interface ---------- */
++
++/* It's zlib-like interface.
++   See LzmaDec_DecodeToDic description for information about STEPS and return results,
++   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
++   to work with CLzmaDec variables manually.
++
++finishMode:
++  It has meaning only if the decoding reaches output limit (*destLen).
++  LZMA_FINISH_ANY - Decode just destLen bytes.
++  LZMA_FINISH_END - Stream must be finished after (*destLen).
++*/
++
++SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
++    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
++
++
++/* ---------- One Call Interface ---------- */
++
++/* LzmaDecode
++
++finishMode:
++  It has meaning only if the decoding reaches output limit (*destLen).
++  LZMA_FINISH_ANY - Decode just destLen bytes.
++  LZMA_FINISH_END - Stream must be finished after (*destLen).
++
++Returns:
++  SZ_OK
++    status:
++      LZMA_STATUS_FINISHED_WITH_MARK
++      LZMA_STATUS_NOT_FINISHED
++      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
++  SZ_ERROR_DATA - Data error
++  SZ_ERROR_MEM  - Memory allocation error
++  SZ_ERROR_UNSUPPORTED - Unsupported properties
++  SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
++*/
++
++SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
++    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
++    ELzmaStatus *status, ISzAlloc *alloc);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+--- /dev/null
++++ b/include/linux/lzma/LzmaEnc.h
+@@ -0,0 +1,80 @@
++/*  LzmaEnc.h -- LZMA Encoder
++2009-02-07 : Igor Pavlov : Public domain */
++
++#ifndef __LZMA_ENC_H
++#define __LZMA_ENC_H
++
++#include "Types.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define LZMA_PROPS_SIZE 5
++
++typedef struct _CLzmaEncProps
++{
++  int level;       /*  0 <= level <= 9 */
++  UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version
++                      (1 << 12) <= dictSize <= (1 << 30) for 64-bit version
++                       default = (1 << 24) */
++  int lc;          /* 0 <= lc <= 8, default = 3 */
++  int lp;          /* 0 <= lp <= 4, default = 0 */
++  int pb;          /* 0 <= pb <= 4, default = 2 */
++  int algo;        /* 0 - fast, 1 - normal, default = 1 */
++  int fb;          /* 5 <= fb <= 273, default = 32 */
++  int btMode;      /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */
++  int numHashBytes; /* 2, 3 or 4, default = 4 */
++  UInt32 mc;        /* 1 <= mc <= (1 << 30), default = 32 */
++  unsigned writeEndMark;  /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */
++  int numThreads;  /* 1 or 2, default = 2 */
++} CLzmaEncProps;
++
++void LzmaEncProps_Init(CLzmaEncProps *p);
++void LzmaEncProps_Normalize(CLzmaEncProps *p);
++UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2);
++
++
++/* ---------- CLzmaEncHandle Interface ---------- */
++
++/* LzmaEnc_* functions can return the following exit codes:
++Returns:
++  SZ_OK           - OK
++  SZ_ERROR_MEM    - Memory allocation error
++  SZ_ERROR_PARAM  - Incorrect paramater in props
++  SZ_ERROR_WRITE  - Write callback error.
++  SZ_ERROR_PROGRESS - some break from progress callback
++  SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
++*/
++
++typedef void * CLzmaEncHandle;
++
++CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc);
++void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
++SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
++SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
++SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream,
++    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
++SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
++    int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
++
++/* ---------- One Call Interface ---------- */
++
++/* LzmaEncode
++Return code:
++  SZ_OK               - OK
++  SZ_ERROR_MEM        - Memory allocation error
++  SZ_ERROR_PARAM      - Incorrect paramater
++  SZ_ERROR_OUTPUT_EOF - output buffer overflow
++  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)
++*/
++
++SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
++    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
++    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+--- /dev/null
++++ b/include/linux/lzma/Types.h
+@@ -0,0 +1,226 @@
++/* Types.h -- Basic types
++2009-11-23 : Igor Pavlov : Public domain */
++
++#ifndef __7Z_TYPES_H
++#define __7Z_TYPES_H
++
++#include <stddef.h>
++
++#ifdef _WIN32
++#include <windows.h>
++#endif
++
++#ifndef EXTERN_C_BEGIN
++#ifdef __cplusplus
++#define EXTERN_C_BEGIN extern "C" {
++#define EXTERN_C_END }
++#else
++#define EXTERN_C_BEGIN
++#define EXTERN_C_END
++#endif
++#endif
++
++EXTERN_C_BEGIN
++
++#define SZ_OK 0
++
++#define SZ_ERROR_DATA 1
++#define SZ_ERROR_MEM 2
++#define SZ_ERROR_CRC 3
++#define SZ_ERROR_UNSUPPORTED 4
++#define SZ_ERROR_PARAM 5
++#define SZ_ERROR_INPUT_EOF 6
++#define SZ_ERROR_OUTPUT_EOF 7
++#define SZ_ERROR_READ 8
++#define SZ_ERROR_WRITE 9
++#define SZ_ERROR_PROGRESS 10
++#define SZ_ERROR_FAIL 11
++#define SZ_ERROR_THREAD 12
++
++#define SZ_ERROR_ARCHIVE 16
++#define SZ_ERROR_NO_ARCHIVE 17
++
++typedef int SRes;
++
++#ifdef _WIN32
++typedef DWORD WRes;
++#else
++typedef int WRes;
++#endif
++
++#ifndef RINOK
++#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
++#endif
++
++typedef unsigned char Byte;
++typedef short Int16;
++typedef unsigned short UInt16;
++
++#ifdef _LZMA_UINT32_IS_ULONG
++typedef long Int32;
++typedef unsigned long UInt32;
++#else
++typedef int Int32;
++typedef unsigned int UInt32;
++#endif
++
++#ifdef _SZ_NO_INT_64
++
++/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
++   NOTES: Some code will work incorrectly in that case! */
++
++typedef long Int64;
++typedef unsigned long UInt64;
++
++#else
++
++#if defined(_MSC_VER) || defined(__BORLANDC__)
++typedef __int64 Int64;
++typedef unsigned __int64 UInt64;
++#else
++typedef long long int Int64;
++typedef unsigned long long int UInt64;
++#endif
++
++#endif
++
++#ifdef _LZMA_NO_SYSTEM_SIZE_T
++typedef UInt32 SizeT;
++#else
++typedef size_t SizeT;
++#endif
++
++typedef int Bool;
++#define True 1
++#define False 0
++
++
++#ifdef _WIN32
++#define MY_STD_CALL __stdcall
++#else
++#define MY_STD_CALL
++#endif
++
++#ifdef _MSC_VER
++
++#if _MSC_VER >= 1300
++#define MY_NO_INLINE __declspec(noinline)
++#else
++#define MY_NO_INLINE
++#endif
++
++#define MY_CDECL __cdecl
++#define MY_FAST_CALL __fastcall
++
++#else
++
++#define MY_CDECL
++#define MY_FAST_CALL
++
++#endif
++
++
++/* The following interfaces use first parameter as pointer to structure */
++
++typedef struct
++{
++  SRes (*Read)(void *p, void *buf, size_t *size);
++    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
++       (output(*size) < input(*size)) is allowed */
++} ISeqInStream;
++
++/* it can return SZ_ERROR_INPUT_EOF */
++SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);
++SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);
++SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);
++
++typedef struct
++{
++  size_t (*Write)(void *p, const void *buf, size_t size);
++    /* Returns: result - the number of actually written bytes.
++       (result < size) means error */
++} ISeqOutStream;
++
++typedef enum
++{
++  SZ_SEEK_SET = 0,
++  SZ_SEEK_CUR = 1,
++  SZ_SEEK_END = 2
++} ESzSeek;
++
++typedef struct
++{
++  SRes (*Read)(void *p, void *buf, size_t *size);  /* same as ISeqInStream::Read */
++  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
++} ISeekInStream;
++
++typedef struct
++{
++  SRes (*Look)(void *p, void **buf, size_t *size);
++    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
++       (output(*size) > input(*size)) is not allowed
++       (output(*size) < input(*size)) is allowed */
++  SRes (*Skip)(void *p, size_t offset);
++    /* offset must be <= output(*size) of Look */
++
++  SRes (*Read)(void *p, void *buf, size_t *size);
++    /* reads directly (without buffer). It's same as ISeqInStream::Read */
++  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
++} ILookInStream;
++
++SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);
++SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);
++
++/* reads via ILookInStream::Read */
++SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);
++SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);
++
++#define LookToRead_BUF_SIZE (1 << 14)
++
++typedef struct
++{
++  ILookInStream s;
++  ISeekInStream *realStream;
++  size_t pos;
++  size_t size;
++  Byte buf[LookToRead_BUF_SIZE];
++} CLookToRead;
++
++void LookToRead_CreateVTable(CLookToRead *p, int lookahead);
++void LookToRead_Init(CLookToRead *p);
++
++typedef struct
++{
++  ISeqInStream s;
++  ILookInStream *realStream;
++} CSecToLook;
++
++void SecToLook_CreateVTable(CSecToLook *p);
++
++typedef struct
++{
++  ISeqInStream s;
++  ILookInStream *realStream;
++} CSecToRead;
++
++void SecToRead_CreateVTable(CSecToRead *p);
++
++typedef struct
++{
++  SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);
++    /* Returns: result. (result != SZ_OK) means break.
++       Value (UInt64)(Int64)-1 for size means unknown value. */
++} ICompressProgress;
++
++typedef struct
++{
++  void *(*Alloc)(void *p, size_t size);
++  void (*Free)(void *p, void *address); /* address can be 0 */
++} ISzAlloc;
++
++#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
++#define IAlloc_Free(p, a) (p)->Free((p), a)
++
++EXTERN_C_END
++
++#endif
+--- a/include/uapi/linux/jffs2.h
++++ b/include/uapi/linux/jffs2.h
+@@ -46,6 +46,7 @@
+ #define JFFS2_COMPR_DYNRUBIN	0x05
+ #define JFFS2_COMPR_ZLIB	0x06
+ #define JFFS2_COMPR_LZO		0x07
++#define JFFS2_COMPR_LZMA	0x08
+ /* Compatibility flags. */
+ #define JFFS2_COMPAT_MASK 0xc000      /* What do to if an unknown nodetype is found */
+ #define JFFS2_NODE_ACCURATE 0x2000
+--- a/lib/Kconfig
++++ b/lib/Kconfig
+@@ -353,6 +353,12 @@ config ZSTD_DECOMPRESS
+ 
+ source "lib/xz/Kconfig"
+ 
++config LZMA_COMPRESS
++    tristate
++
++config LZMA_DECOMPRESS
++    tristate
++
+ #
+ # These all provide a common interface (hence the apparent duplication with
+ # ZLIB_INFLATE; DECOMPRESS_GZIP is just a wrapper.)
+--- a/lib/Makefile
++++ b/lib/Makefile
+@@ -137,6 +137,16 @@ CFLAGS_kobject.o += -DDEBUG
+ CFLAGS_kobject_uevent.o += -DDEBUG
+ endif
+ 
++ifdef CONFIG_JFFS2_ZLIB
++  CONFIG_ZLIB_INFLATE:=y
++  CONFIG_ZLIB_DEFLATE:=y
++endif
++
++ifdef CONFIG_JFFS2_LZMA
++  CONFIG_LZMA_DECOMPRESS:=y
++  CONFIG_LZMA_COMPRESS:=y
++endif
++
+ obj-$(CONFIG_DEBUG_INFO_REDUCED) += debug_info.o
+ CFLAGS_debug_info.o += $(call cc-option, -femit-struct-debug-detailed=any)
+ 
+@@ -197,6 +207,8 @@ obj-$(CONFIG_ZSTD_COMPRESS) += zstd/
+ obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd/
+ obj-$(CONFIG_XZ_DEC) += xz/
+ obj-$(CONFIG_RAID6_PQ) += raid6/
++obj-$(CONFIG_LZMA_COMPRESS) += lzma/
++obj-$(CONFIG_LZMA_DECOMPRESS) += lzma/
+ 
+ lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
+ lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
+--- /dev/null
++++ b/lib/lzma/LzFind.c
+@@ -0,0 +1,761 @@
++/* LzFind.c -- Match finder for LZ algorithms
++2009-04-22 : Igor Pavlov : Public domain */
++
++#include <string.h>
++
++#include "LzFind.h"
++#include "LzHash.h"
++
++#define kEmptyHashValue 0
++#define kMaxValForNormalize ((UInt32)0xFFFFFFFF)
++#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */
++#define kNormalizeMask (~(kNormalizeStepMin - 1))
++#define kMaxHistorySize ((UInt32)3 << 30)
++
++#define kStartMaxLen 3
++
++static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
++{
++  if (!p->directInput)
++  {
++    alloc->Free(alloc, p->bufferBase);
++    p->bufferBase = 0;
++  }
++}
++
++/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */
++
++static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)
++{
++  UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
++  if (p->directInput)
++  {
++    p->blockSize = blockSize;
++    return 1;
++  }
++  if (p->bufferBase == 0 || p->blockSize != blockSize)
++  {
++    LzInWindow_Free(p, alloc);
++    p->blockSize = blockSize;
++    p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize);
++  }
++  return (p->bufferBase != 0);
++}
++
++Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
++Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
++
++UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
++
++void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
++{
++  p->posLimit -= subValue;
++  p->pos -= subValue;
++  p->streamPos -= subValue;
++}
++
++static void MatchFinder_ReadBlock(CMatchFinder *p)
++{
++  if (p->streamEndWasReached || p->result != SZ_OK)
++    return;
++  if (p->directInput)
++  {
++    UInt32 curSize = 0xFFFFFFFF - p->streamPos;
++    if (curSize > p->directInputRem)
++      curSize = (UInt32)p->directInputRem;
++    p->directInputRem -= curSize;
++    p->streamPos += curSize;
++    if (p->directInputRem == 0)
++      p->streamEndWasReached = 1;
++    return;
++  }
++  for (;;)
++  {
++    Byte *dest = p->buffer + (p->streamPos - p->pos);
++    size_t size = (p->bufferBase + p->blockSize - dest);
++    if (size == 0)
++      return;
++    p->result = p->stream->Read(p->stream, dest, &size);
++    if (p->result != SZ_OK)
++      return;
++    if (size == 0)
++    {
++      p->streamEndWasReached = 1;
++      return;
++    }
++    p->streamPos += (UInt32)size;
++    if (p->streamPos - p->pos > p->keepSizeAfter)
++      return;
++  }
++}
++
++void MatchFinder_MoveBlock(CMatchFinder *p)
++{
++  memmove(p->bufferBase,
++    p->buffer - p->keepSizeBefore,
++    (size_t)(p->streamPos - p->pos + p->keepSizeBefore));
++  p->buffer = p->bufferBase + p->keepSizeBefore;
++}
++
++int MatchFinder_NeedMove(CMatchFinder *p)
++{
++  if (p->directInput)
++    return 0;
++  /* if (p->streamEndWasReached) return 0; */
++  return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
++}
++
++void MatchFinder_ReadIfRequired(CMatchFinder *p)
++{
++  if (p->streamEndWasReached)
++    return;
++  if (p->keepSizeAfter >= p->streamPos - p->pos)
++    MatchFinder_ReadBlock(p);
++}
++
++static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
++{
++  if (MatchFinder_NeedMove(p))
++    MatchFinder_MoveBlock(p);
++  MatchFinder_ReadBlock(p);
++}
++
++static void MatchFinder_SetDefaultSettings(CMatchFinder *p)
++{
++  p->cutValue = 32;
++  p->btMode = 1;
++  p->numHashBytes = 4;
++  p->bigHash = 0;
++}
++
++#define kCrcPoly 0xEDB88320
++
++void MatchFinder_Construct(CMatchFinder *p)
++{
++  UInt32 i;
++  p->bufferBase = 0;
++  p->directInput = 0;
++  p->hash = 0;
++  MatchFinder_SetDefaultSettings(p);
++
++  for (i = 0; i < 256; i++)
++  {
++    UInt32 r = i;
++    int j;
++    for (j = 0; j < 8; j++)
++      r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));
++    p->crc[i] = r;
++  }
++}
++
++static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc)
++{
++  alloc->Free(alloc, p->hash);
++  p->hash = 0;
++}
++
++void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc)
++{
++  MatchFinder_FreeThisClassMemory(p, alloc);
++  LzInWindow_Free(p, alloc);
++}
++
++static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc)
++{
++  size_t sizeInBytes = (size_t)num * sizeof(CLzRef);
++  if (sizeInBytes / sizeof(CLzRef) != num)
++    return 0;
++  return (CLzRef *)alloc->Alloc(alloc, sizeInBytes);
++}
++
++int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
++    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
++    ISzAlloc *alloc)
++{
++  UInt32 sizeReserv;
++  if (historySize > kMaxHistorySize)
++  {
++    MatchFinder_Free(p, alloc);
++    return 0;
++  }
++  sizeReserv = historySize >> 1;
++  if (historySize > ((UInt32)2 << 30))
++    sizeReserv = historySize >> 2;
++  sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19);
++
++  p->keepSizeBefore = historySize + keepAddBufferBefore + 1;
++  p->keepSizeAfter = matchMaxLen + keepAddBufferAfter;
++  /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */
++  if (LzInWindow_Create(p, sizeReserv, alloc))
++  {
++    UInt32 newCyclicBufferSize = historySize + 1;
++    UInt32 hs;
++    p->matchMaxLen = matchMaxLen;
++    {
++      p->fixedHashSize = 0;
++      if (p->numHashBytes == 2)
++        hs = (1 << 16) - 1;
++      else
++      {
++        hs = historySize - 1;
++        hs |= (hs >> 1);
++        hs |= (hs >> 2);
++        hs |= (hs >> 4);
++        hs |= (hs >> 8);
++        hs >>= 1;
++        hs |= 0xFFFF; /* don't change it! It's required for Deflate */
++        if (hs > (1 << 24))
++        {
++          if (p->numHashBytes == 3)
++            hs = (1 << 24) - 1;
++          else
++            hs >>= 1;
++        }
++      }
++      p->hashMask = hs;
++      hs++;
++      if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size;
++      if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size;
++      if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size;
++      hs += p->fixedHashSize;
++    }
++
++    {
++      UInt32 prevSize = p->hashSizeSum + p->numSons;
++      UInt32 newSize;
++      p->historySize = historySize;
++      p->hashSizeSum = hs;
++      p->cyclicBufferSize = newCyclicBufferSize;
++      p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize);
++      newSize = p->hashSizeSum + p->numSons;
++      if (p->hash != 0 && prevSize == newSize)
++        return 1;
++      MatchFinder_FreeThisClassMemory(p, alloc);
++      p->hash = AllocRefs(newSize, alloc);
++      if (p->hash != 0)
++      {
++        p->son = p->hash + p->hashSizeSum;
++        return 1;
++      }
++    }
++  }
++  MatchFinder_Free(p, alloc);
++  return 0;
++}
++
++static void MatchFinder_SetLimits(CMatchFinder *p)
++{
++  UInt32 limit = kMaxValForNormalize - p->pos;
++  UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos;
++  if (limit2 < limit)
++    limit = limit2;
++  limit2 = p->streamPos - p->pos;
++  if (limit2 <= p->keepSizeAfter)
++  {
++    if (limit2 > 0)
++      limit2 = 1;
++  }
++  else
++    limit2 -= p->keepSizeAfter;
++  if (limit2 < limit)
++    limit = limit2;
++  {
++    UInt32 lenLimit = p->streamPos - p->pos;
++    if (lenLimit > p->matchMaxLen)
++      lenLimit = p->matchMaxLen;
++    p->lenLimit = lenLimit;
++  }
++  p->posLimit = p->pos + limit;
++}
++
++void MatchFinder_Init(CMatchFinder *p)
++{
++  UInt32 i;
++  for (i = 0; i < p->hashSizeSum; i++)
++    p->hash[i] = kEmptyHashValue;
++  p->cyclicBufferPos = 0;
++  p->buffer = p->bufferBase;
++  p->pos = p->streamPos = p->cyclicBufferSize;
++  p->result = SZ_OK;
++  p->streamEndWasReached = 0;
++  MatchFinder_ReadBlock(p);
++  MatchFinder_SetLimits(p);
++}
++
++static UInt32 MatchFinder_GetSubValue(CMatchFinder *p)
++{
++  return (p->pos - p->historySize - 1) & kNormalizeMask;
++}
++
++void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
++{
++  UInt32 i;
++  for (i = 0; i < numItems; i++)
++  {
++    UInt32 value = items[i];
++    if (value <= subValue)
++      value = kEmptyHashValue;
++    else
++      value -= subValue;
++    items[i] = value;
++  }
++}
++
++static void MatchFinder_Normalize(CMatchFinder *p)
++{
++  UInt32 subValue = MatchFinder_GetSubValue(p);
++  MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons);
++  MatchFinder_ReduceOffsets(p, subValue);
++}
++
++static void MatchFinder_CheckLimits(CMatchFinder *p)
++{
++  if (p->pos == kMaxValForNormalize)
++    MatchFinder_Normalize(p);
++  if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos)
++    MatchFinder_CheckAndMoveAndRead(p);
++  if (p->cyclicBufferPos == p->cyclicBufferSize)
++    p->cyclicBufferPos = 0;
++  MatchFinder_SetLimits(p);
++}
++
++static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
++    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
++    UInt32 *distances, UInt32 maxLen)
++{
++  son[_cyclicBufferPos] = curMatch;
++  for (;;)
++  {
++    UInt32 delta = pos - curMatch;
++    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
++      return distances;
++    {
++      const Byte *pb = cur - delta;
++      curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
++      if (pb[maxLen] == cur[maxLen] && *pb == *cur)
++      {
++        UInt32 len = 0;
++        while (++len != lenLimit)
++          if (pb[len] != cur[len])
++            break;
++        if (maxLen < len)
++        {
++          *distances++ = maxLen = len;
++          *distances++ = delta - 1;
++          if (len == lenLimit)
++            return distances;
++        }
++      }
++    }
++  }
++}
++
++UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
++    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
++    UInt32 *distances, UInt32 maxLen)
++{
++  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
++  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
++  UInt32 len0 = 0, len1 = 0;
++  for (;;)
++  {
++    UInt32 delta = pos - curMatch;
++    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
++    {
++      *ptr0 = *ptr1 = kEmptyHashValue;
++      return distances;
++    }
++    {
++      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
++      const Byte *pb = cur - delta;
++      UInt32 len = (len0 < len1 ? len0 : len1);
++      if (pb[len] == cur[len])
++      {
++        if (++len != lenLimit && pb[len] == cur[len])
++          while (++len != lenLimit)
++            if (pb[len] != cur[len])
++              break;
++        if (maxLen < len)
++        {
++          *distances++ = maxLen = len;
++          *distances++ = delta - 1;
++          if (len == lenLimit)
++          {
++            *ptr1 = pair[0];
++            *ptr0 = pair[1];
++            return distances;
++          }
++        }
++      }
++      if (pb[len] < cur[len])
++      {
++        *ptr1 = curMatch;
++        ptr1 = pair + 1;
++        curMatch = *ptr1;
++        len1 = len;
++      }
++      else
++      {
++        *ptr0 = curMatch;
++        ptr0 = pair;
++        curMatch = *ptr0;
++        len0 = len;
++      }
++    }
++  }
++}
++
++static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
++    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue)
++{
++  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
++  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
++  UInt32 len0 = 0, len1 = 0;
++  for (;;)
++  {
++    UInt32 delta = pos - curMatch;
++    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
++    {
++      *ptr0 = *ptr1 = kEmptyHashValue;
++      return;
++    }
++    {
++      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
++      const Byte *pb = cur - delta;
++      UInt32 len = (len0 < len1 ? len0 : len1);
++      if (pb[len] == cur[len])
++      {
++        while (++len != lenLimit)
++          if (pb[len] != cur[len])
++            break;
++        {
++          if (len == lenLimit)
++          {
++            *ptr1 = pair[0];
++            *ptr0 = pair[1];
++            return;
++          }
++        }
++      }
++      if (pb[len] < cur[len])
++      {
++        *ptr1 = curMatch;
++        ptr1 = pair + 1;
++        curMatch = *ptr1;
++        len1 = len;
++      }
++      else
++      {
++        *ptr0 = curMatch;
++        ptr0 = pair;
++        curMatch = *ptr0;
++        len0 = len;
++      }
++    }
++  }
++}
++
++#define MOVE_POS \
++  ++p->cyclicBufferPos; \
++  p->buffer++; \
++  if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
++
++#define MOVE_POS_RET MOVE_POS return offset;
++
++static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
++
++#define GET_MATCHES_HEADER2(minLen, ret_op) \
++  UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \
++  lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
++  cur = p->buffer;
++
++#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0)
++#define SKIP_HEADER(minLen)        GET_MATCHES_HEADER2(minLen, continue)
++
++#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue
++
++#define GET_MATCHES_FOOTER(offset, maxLen) \
++  offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \
++  distances + offset, maxLen) - distances); MOVE_POS_RET;
++
++#define SKIP_FOOTER \
++  SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
++
++static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
++{
++  UInt32 offset;
++  GET_MATCHES_HEADER(2)
++  HASH2_CALC;
++  curMatch = p->hash[hashValue];
++  p->hash[hashValue] = p->pos;
++  offset = 0;
++  GET_MATCHES_FOOTER(offset, 1)
++}
++
++UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
++{
++  UInt32 offset;
++  GET_MATCHES_HEADER(3)
++  HASH_ZIP_CALC;
++  curMatch = p->hash[hashValue];
++  p->hash[hashValue] = p->pos;
++  offset = 0;
++  GET_MATCHES_FOOTER(offset, 2)
++}
++
++static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
++{
++  UInt32 hash2Value, delta2, maxLen, offset;
++  GET_MATCHES_HEADER(3)
++
++  HASH3_CALC;
++
++  delta2 = p->pos - p->hash[hash2Value];
++  curMatch = p->hash[kFix3HashSize + hashValue];
++
++  p->hash[hash2Value] =
++  p->hash[kFix3HashSize + hashValue] = p->pos;
++
++
++  maxLen = 2;
++  offset = 0;
++  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
++  {
++    for (; maxLen != lenLimit; maxLen++)
++      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
++        break;
++    distances[0] = maxLen;
++    distances[1] = delta2 - 1;
++    offset = 2;
++    if (maxLen == lenLimit)
++    {
++      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
++      MOVE_POS_RET;
++    }
++  }
++  GET_MATCHES_FOOTER(offset, maxLen)
++}
++
++static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
++{
++  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
++  GET_MATCHES_HEADER(4)
++
++  HASH4_CALC;
++
++  delta2 = p->pos - p->hash[                hash2Value];
++  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
++  curMatch = p->hash[kFix4HashSize + hashValue];
++
++  p->hash[                hash2Value] =
++  p->hash[kFix3HashSize + hash3Value] =
++  p->hash[kFix4HashSize + hashValue] = p->pos;
++
++  maxLen = 1;
++  offset = 0;
++  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
++  {
++    distances[0] = maxLen = 2;
++    distances[1] = delta2 - 1;
++    offset = 2;
++  }
++  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
++  {
++    maxLen = 3;
++    distances[offset + 1] = delta3 - 1;
++    offset += 2;
++    delta2 = delta3;
++  }
++  if (offset != 0)
++  {
++    for (; maxLen != lenLimit; maxLen++)
++      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
++        break;
++    distances[offset - 2] = maxLen;
++    if (maxLen == lenLimit)
++    {
++      SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
++      MOVE_POS_RET;
++    }
++  }
++  if (maxLen < 3)
++    maxLen = 3;
++  GET_MATCHES_FOOTER(offset, maxLen)
++}
++
++static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
++{
++  UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
++  GET_MATCHES_HEADER(4)
++
++  HASH4_CALC;
++
++  delta2 = p->pos - p->hash[                hash2Value];
++  delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
++  curMatch = p->hash[kFix4HashSize + hashValue];
++
++  p->hash[                hash2Value] =
++  p->hash[kFix3HashSize + hash3Value] =
++  p->hash[kFix4HashSize + hashValue] = p->pos;
++
++  maxLen = 1;
++  offset = 0;
++  if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
++  {
++    distances[0] = maxLen = 2;
++    distances[1] = delta2 - 1;
++    offset = 2;
++  }
++  if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
++  {
++    maxLen = 3;
++    distances[offset + 1] = delta3 - 1;
++    offset += 2;
++    delta2 = delta3;
++  }
++  if (offset != 0)
++  {
++    for (; maxLen != lenLimit; maxLen++)
++      if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
++        break;
++    distances[offset - 2] = maxLen;
++    if (maxLen == lenLimit)
++    {
++      p->son[p->cyclicBufferPos] = curMatch;
++      MOVE_POS_RET;
++    }
++  }
++  if (maxLen < 3)
++    maxLen = 3;
++  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
++    distances + offset, maxLen) - (distances));
++  MOVE_POS_RET
++}
++
++UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
++{
++  UInt32 offset;
++  GET_MATCHES_HEADER(3)
++  HASH_ZIP_CALC;
++  curMatch = p->hash[hashValue];
++  p->hash[hashValue] = p->pos;
++  offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
++    distances, 2) - (distances));
++  MOVE_POS_RET
++}
++
++static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
++{
++  do
++  {
++    SKIP_HEADER(2)
++    HASH2_CALC;
++    curMatch = p->hash[hashValue];
++    p->hash[hashValue] = p->pos;
++    SKIP_FOOTER
++  }
++  while (--num != 0);
++}
++
++void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
++{
++  do
++  {
++    SKIP_HEADER(3)
++    HASH_ZIP_CALC;
++    curMatch = p->hash[hashValue];
++    p->hash[hashValue] = p->pos;
++    SKIP_FOOTER
++  }
++  while (--num != 0);
++}
++
++static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
++{
++  do
++  {
++    UInt32 hash2Value;
++    SKIP_HEADER(3)
++    HASH3_CALC;
++    curMatch = p->hash[kFix3HashSize + hashValue];
++    p->hash[hash2Value] =
++    p->hash[kFix3HashSize + hashValue] = p->pos;
++    SKIP_FOOTER
++  }
++  while (--num != 0);
++}
++
++static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
++{
++  do
++  {
++    UInt32 hash2Value, hash3Value;
++    SKIP_HEADER(4)
++    HASH4_CALC;
++    curMatch = p->hash[kFix4HashSize + hashValue];
++    p->hash[                hash2Value] =
++    p->hash[kFix3HashSize + hash3Value] = p->pos;
++    p->hash[kFix4HashSize + hashValue] = p->pos;
++    SKIP_FOOTER
++  }
++  while (--num != 0);
++}
++
++static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
++{
++  do
++  {
++    UInt32 hash2Value, hash3Value;
++    SKIP_HEADER(4)
++    HASH4_CALC;
++    curMatch = p->hash[kFix4HashSize + hashValue];
++    p->hash[                hash2Value] =
++    p->hash[kFix3HashSize + hash3Value] =
++    p->hash[kFix4HashSize + hashValue] = p->pos;
++    p->son[p->cyclicBufferPos] = curMatch;
++    MOVE_POS
++  }
++  while (--num != 0);
++}
++
++void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
++{
++  do
++  {
++    SKIP_HEADER(3)
++    HASH_ZIP_CALC;
++    curMatch = p->hash[hashValue];
++    p->hash[hashValue] = p->pos;
++    p->son[p->cyclicBufferPos] = curMatch;
++    MOVE_POS
++  }
++  while (--num != 0);
++}
++
++void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)
++{
++  vTable->Init = (Mf_Init_Func)MatchFinder_Init;
++  vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;
++  vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
++  vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
++  if (!p->btMode)
++  {
++    vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
++    vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
++  }
++  else if (p->numHashBytes == 2)
++  {
++    vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
++    vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
++  }
++  else if (p->numHashBytes == 3)
++  {
++    vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
++    vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
++  }
++  else
++  {
++    vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
++    vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
++  }
++}
+--- /dev/null
++++ b/lib/lzma/LzmaDec.c
+@@ -0,0 +1,999 @@
++/* LzmaDec.c -- LZMA Decoder
++2009-09-20 : Igor Pavlov : Public domain */
++
++#include "LzmaDec.h"
++
++#include <string.h>
++
++#define kNumTopBits 24
++#define kTopValue ((UInt32)1 << kNumTopBits)
++
++#define kNumBitModelTotalBits 11
++#define kBitModelTotal (1 << kNumBitModelTotalBits)
++#define kNumMoveBits 5
++
++#define RC_INIT_SIZE 5
++
++#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
++
++#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
++#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
++#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
++#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \
++  { UPDATE_0(p); i = (i + i); A0; } else \
++  { UPDATE_1(p); i = (i + i) + 1; A1; }
++#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)
++
++#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }
++#define TREE_DECODE(probs, limit, i) \
++  { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
++
++/* #define _LZMA_SIZE_OPT */
++
++#ifdef _LZMA_SIZE_OPT
++#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
++#else
++#define TREE_6_DECODE(probs, i) \
++  { i = 1; \
++  TREE_GET_BIT(probs, i); \
++  TREE_GET_BIT(probs, i); \
++  TREE_GET_BIT(probs, i); \
++  TREE_GET_BIT(probs, i); \
++  TREE_GET_BIT(probs, i); \
++  TREE_GET_BIT(probs, i); \
++  i -= 0x40; }
++#endif
++
++#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
++
++#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
++#define UPDATE_0_CHECK range = bound;
++#define UPDATE_1_CHECK range -= bound; code -= bound;
++#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
++  { UPDATE_0_CHECK; i = (i + i); A0; } else \
++  { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
++#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
++#define TREE_DECODE_CHECK(probs, limit, i) \
++  { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
++
++
++#define kNumPosBitsMax 4
++#define kNumPosStatesMax (1 << kNumPosBitsMax)
++
++#define kLenNumLowBits 3
++#define kLenNumLowSymbols (1 << kLenNumLowBits)
++#define kLenNumMidBits 3
++#define kLenNumMidSymbols (1 << kLenNumMidBits)
++#define kLenNumHighBits 8
++#define kLenNumHighSymbols (1 << kLenNumHighBits)
++
++#define LenChoice 0
++#define LenChoice2 (LenChoice + 1)
++#define LenLow (LenChoice2 + 1)
++#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
++#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
++#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
++
++
++#define kNumStates 12
++#define kNumLitStates 7
++
++#define kStartPosModelIndex 4
++#define kEndPosModelIndex 14
++#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
++
++#define kNumPosSlotBits 6
++#define kNumLenToPosStates 4
++
++#define kNumAlignBits 4
++#define kAlignTableSize (1 << kNumAlignBits)
++
++#define kMatchMinLen 2
++#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
++
++#define IsMatch 0
++#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
++#define IsRepG0 (IsRep + kNumStates)
++#define IsRepG1 (IsRepG0 + kNumStates)
++#define IsRepG2 (IsRepG1 + kNumStates)
++#define IsRep0Long (IsRepG2 + kNumStates)
++#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
++#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
++#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
++#define LenCoder (Align + kAlignTableSize)
++#define RepLenCoder (LenCoder + kNumLenProbs)
++#define Literal (RepLenCoder + kNumLenProbs)
++
++#define LZMA_BASE_SIZE 1846
++#define LZMA_LIT_SIZE 768
++
++#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
++
++#if Literal != LZMA_BASE_SIZE
++StopCompilingDueBUG
++#endif
++
++#define LZMA_DIC_MIN (1 << 12)
++
++/* First LZMA-symbol is always decoded.
++And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization
++Out:
++  Result:
++    SZ_OK - OK
++    SZ_ERROR_DATA - Error
++  p->remainLen:
++    < kMatchSpecLenStart : normal remain
++    = kMatchSpecLenStart : finished
++    = kMatchSpecLenStart + 1 : Flush marker
++    = kMatchSpecLenStart + 2 : State Init Marker
++*/
++
++static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
++{
++  CLzmaProb *probs = p->probs;
++
++  unsigned state = p->state;
++  UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
++  unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
++  unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;
++  unsigned lc = p->prop.lc;
++
++  Byte *dic = p->dic;
++  SizeT dicBufSize = p->dicBufSize;
++  SizeT dicPos = p->dicPos;
++
++  UInt32 processedPos = p->processedPos;
++  UInt32 checkDicSize = p->checkDicSize;
++  unsigned len = 0;
++
++  const Byte *buf = p->buf;
++  UInt32 range = p->range;
++  UInt32 code = p->code;
++
++  do
++  {
++    CLzmaProb *prob;
++    UInt32 bound;
++    unsigned ttt;
++    unsigned posState = processedPos & pbMask;
++
++    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
++    IF_BIT_0(prob)
++    {
++      unsigned symbol;
++      UPDATE_0(prob);
++      prob = probs + Literal;
++      if (checkDicSize != 0 || processedPos != 0)
++        prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +
++        (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));
++
++      if (state < kNumLitStates)
++      {
++        state -= (state < 4) ? state : 3;
++        symbol = 1;
++        do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100);
++      }
++      else
++      {
++        unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
++        unsigned offs = 0x100;
++        state -= (state < 10) ? 3 : 6;
++        symbol = 1;
++        do
++        {
++          unsigned bit;
++          CLzmaProb *probLit;
++          matchByte <<= 1;
++          bit = (matchByte & offs);
++          probLit = prob + offs + bit + symbol;
++          GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)
++        }
++        while (symbol < 0x100);
++      }
++      dic[dicPos++] = (Byte)symbol;
++      processedPos++;
++      continue;
++    }
++    else
++    {
++      UPDATE_1(prob);
++      prob = probs + IsRep + state;
++      IF_BIT_0(prob)
++      {
++        UPDATE_0(prob);
++        state += kNumStates;
++        prob = probs + LenCoder;
++      }
++      else
++      {
++        UPDATE_1(prob);
++        if (checkDicSize == 0 && processedPos == 0)
++          return SZ_ERROR_DATA;
++        prob = probs + IsRepG0 + state;
++        IF_BIT_0(prob)
++        {
++          UPDATE_0(prob);
++          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
++          IF_BIT_0(prob)
++          {
++            UPDATE_0(prob);
++            dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
++            dicPos++;
++            processedPos++;
++            state = state < kNumLitStates ? 9 : 11;
++            continue;
++          }
++          UPDATE_1(prob);
++        }
++        else
++        {
++          UInt32 distance;
++          UPDATE_1(prob);
++          prob = probs + IsRepG1 + state;
++          IF_BIT_0(prob)
++          {
++            UPDATE_0(prob);
++            distance = rep1;
++          }
++          else
++          {
++            UPDATE_1(prob);
++            prob = probs + IsRepG2 + state;
++            IF_BIT_0(prob)
++            {
++              UPDATE_0(prob);
++              distance = rep2;
++            }
++            else
++            {
++              UPDATE_1(prob);
++              distance = rep3;
++              rep3 = rep2;
++            }
++            rep2 = rep1;
++          }
++          rep1 = rep0;
++          rep0 = distance;
++        }
++        state = state < kNumLitStates ? 8 : 11;
++        prob = probs + RepLenCoder;
++      }
++      {
++        unsigned limit, offset;
++        CLzmaProb *probLen = prob + LenChoice;
++        IF_BIT_0(probLen)
++        {
++          UPDATE_0(probLen);
++          probLen = prob + LenLow + (posState << kLenNumLowBits);
++          offset = 0;
++          limit = (1 << kLenNumLowBits);
++        }
++        else
++        {
++          UPDATE_1(probLen);
++          probLen = prob + LenChoice2;
++          IF_BIT_0(probLen)
++          {
++            UPDATE_0(probLen);
++            probLen = prob + LenMid + (posState << kLenNumMidBits);
++            offset = kLenNumLowSymbols;
++            limit = (1 << kLenNumMidBits);
++          }
++          else
++          {
++            UPDATE_1(probLen);
++            probLen = prob + LenHigh;
++            offset = kLenNumLowSymbols + kLenNumMidSymbols;
++            limit = (1 << kLenNumHighBits);
++          }
++        }
++        TREE_DECODE(probLen, limit, len);
++        len += offset;
++      }
++
++      if (state >= kNumStates)
++      {
++        UInt32 distance;
++        prob = probs + PosSlot +
++            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
++        TREE_6_DECODE(prob, distance);
++        if (distance >= kStartPosModelIndex)
++        {
++          unsigned posSlot = (unsigned)distance;
++          int numDirectBits = (int)(((distance >> 1) - 1));
++          distance = (2 | (distance & 1));
++          if (posSlot < kEndPosModelIndex)
++          {
++            distance <<= numDirectBits;
++            prob = probs + SpecPos + distance - posSlot - 1;
++            {
++              UInt32 mask = 1;
++              unsigned i = 1;
++              do
++              {
++                GET_BIT2(prob + i, i, ; , distance |= mask);
++                mask <<= 1;
++              }
++              while (--numDirectBits != 0);
++            }
++          }
++          else
++          {
++            numDirectBits -= kNumAlignBits;
++            do
++            {
++              NORMALIZE
++              range >>= 1;
++
++              {
++                UInt32 t;
++                code -= range;
++                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
++                distance = (distance << 1) + (t + 1);
++                code += range & t;
++              }
++              /*
++              distance <<= 1;
++              if (code >= range)
++              {
++                code -= range;
++                distance |= 1;
++              }
++              */
++            }
++            while (--numDirectBits != 0);
++            prob = probs + Align;
++            distance <<= kNumAlignBits;
++            {
++              unsigned i = 1;
++              GET_BIT2(prob + i, i, ; , distance |= 1);
++              GET_BIT2(prob + i, i, ; , distance |= 2);
++              GET_BIT2(prob + i, i, ; , distance |= 4);
++              GET_BIT2(prob + i, i, ; , distance |= 8);
++            }
++            if (distance == (UInt32)0xFFFFFFFF)
++            {
++              len += kMatchSpecLenStart;
++              state -= kNumStates;
++              break;
++            }
++          }
++        }
++        rep3 = rep2;
++        rep2 = rep1;
++        rep1 = rep0;
++        rep0 = distance + 1;
++        if (checkDicSize == 0)
++        {
++          if (distance >= processedPos)
++            return SZ_ERROR_DATA;
++        }
++        else if (distance >= checkDicSize)
++          return SZ_ERROR_DATA;
++        state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
++      }
++
++      len += kMatchMinLen;
++
++      if (limit == dicPos)
++        return SZ_ERROR_DATA;
++      {
++        SizeT rem = limit - dicPos;
++        unsigned curLen = ((rem < len) ? (unsigned)rem : len);
++        SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);
++
++        processedPos += curLen;
++
++        len -= curLen;
++        if (pos + curLen <= dicBufSize)
++        {
++          Byte *dest = dic + dicPos;
++          ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
++          const Byte *lim = dest + curLen;
++          dicPos += curLen;
++          do
++            *(dest) = (Byte)*(dest + src);
++          while (++dest != lim);
++        }
++        else
++        {
++          do
++          {
++            dic[dicPos++] = dic[pos];
++            if (++pos == dicBufSize)
++              pos = 0;
++          }
++          while (--curLen != 0);
++        }
++      }
++    }
++  }
++  while (dicPos < limit && buf < bufLimit);
++  NORMALIZE;
++  p->buf = buf;
++  p->range = range;
++  p->code = code;
++  p->remainLen = len;
++  p->dicPos = dicPos;
++  p->processedPos = processedPos;
++  p->reps[0] = rep0;
++  p->reps[1] = rep1;
++  p->reps[2] = rep2;
++  p->reps[3] = rep3;
++  p->state = state;
++
++  return SZ_OK;
++}
++
++static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
++{
++  if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)
++  {
++    Byte *dic = p->dic;
++    SizeT dicPos = p->dicPos;
++    SizeT dicBufSize = p->dicBufSize;
++    unsigned len = p->remainLen;
++    UInt32 rep0 = p->reps[0];
++    if (limit - dicPos < len)
++      len = (unsigned)(limit - dicPos);
++
++    if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)
++      p->checkDicSize = p->prop.dicSize;
++
++    p->processedPos += len;
++    p->remainLen -= len;
++    while (len-- != 0)
++    {
++      dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
++      dicPos++;
++    }
++    p->dicPos = dicPos;
++  }
++}
++
++static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
++{
++  do
++  {
++    SizeT limit2 = limit;
++    if (p->checkDicSize == 0)
++    {
++      UInt32 rem = p->prop.dicSize - p->processedPos;
++      if (limit - p->dicPos > rem)
++        limit2 = p->dicPos + rem;
++    }
++    RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));
++    if (p->processedPos >= p->prop.dicSize)
++      p->checkDicSize = p->prop.dicSize;
++    LzmaDec_WriteRem(p, limit);
++  }
++  while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
++
++  if (p->remainLen > kMatchSpecLenStart)
++  {
++    p->remainLen = kMatchSpecLenStart;
++  }
++  return 0;
++}
++
++typedef enum
++{
++  DUMMY_ERROR, /* unexpected end of input stream */
++  DUMMY_LIT,
++  DUMMY_MATCH,
++  DUMMY_REP
++} ELzmaDummy;
++
++static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
++{
++  UInt32 range = p->range;
++  UInt32 code = p->code;
++  const Byte *bufLimit = buf + inSize;
++  CLzmaProb *probs = p->probs;
++  unsigned state = p->state;
++  ELzmaDummy res;
++
++  {
++    CLzmaProb *prob;
++    UInt32 bound;
++    unsigned ttt;
++    unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);
++
++    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
++    IF_BIT_0_CHECK(prob)
++    {
++      UPDATE_0_CHECK
++
++      /* if (bufLimit - buf >= 7) return DUMMY_LIT; */
++
++      prob = probs + Literal;
++      if (p->checkDicSize != 0 || p->processedPos != 0)
++        prob += (LZMA_LIT_SIZE *
++          ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
++          (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
++
++      if (state < kNumLitStates)
++      {
++        unsigned symbol = 1;
++        do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);
++      }
++      else
++      {
++        unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
++            ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];
++        unsigned offs = 0x100;
++        unsigned symbol = 1;
++        do
++        {
++          unsigned bit;
++          CLzmaProb *probLit;
++          matchByte <<= 1;
++          bit = (matchByte & offs);
++          probLit = prob + offs + bit + symbol;
++          GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)
++        }
++        while (symbol < 0x100);
++      }
++      res = DUMMY_LIT;
++    }
++    else
++    {
++      unsigned len;
++      UPDATE_1_CHECK;
++
++      prob = probs + IsRep + state;
++      IF_BIT_0_CHECK(prob)
++      {
++        UPDATE_0_CHECK;
++        state = 0;
++        prob = probs + LenCoder;
++        res = DUMMY_MATCH;
++      }
++      else
++      {
++        UPDATE_1_CHECK;
++        res = DUMMY_REP;
++        prob = probs + IsRepG0 + state;
++        IF_BIT_0_CHECK(prob)
++        {
++          UPDATE_0_CHECK;
++          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
++          IF_BIT_0_CHECK(prob)
++          {
++            UPDATE_0_CHECK;
++            NORMALIZE_CHECK;
++            return DUMMY_REP;
++          }
++          else
++          {
++            UPDATE_1_CHECK;
++          }
++        }
++        else
++        {
++          UPDATE_1_CHECK;
++          prob = probs + IsRepG1 + state;
++          IF_BIT_0_CHECK(prob)
++          {
++            UPDATE_0_CHECK;
++          }
++          else
++          {
++            UPDATE_1_CHECK;
++            prob = probs + IsRepG2 + state;
++            IF_BIT_0_CHECK(prob)
++            {
++              UPDATE_0_CHECK;
++            }
++            else
++            {
++              UPDATE_1_CHECK;
++            }
++          }
++        }
++        state = kNumStates;
++        prob = probs + RepLenCoder;
++      }
++      {
++        unsigned limit, offset;
++        CLzmaProb *probLen = prob + LenChoice;
++        IF_BIT_0_CHECK(probLen)
++        {
++          UPDATE_0_CHECK;
++          probLen = prob + LenLow + (posState << kLenNumLowBits);
++          offset = 0;
++          limit = 1 << kLenNumLowBits;
++        }
++        else
++        {
++          UPDATE_1_CHECK;
++          probLen = prob + LenChoice2;
++          IF_BIT_0_CHECK(probLen)
++          {
++            UPDATE_0_CHECK;
++            probLen = prob + LenMid + (posState << kLenNumMidBits);
++            offset = kLenNumLowSymbols;
++            limit = 1 << kLenNumMidBits;
++          }
++          else
++          {
++            UPDATE_1_CHECK;
++            probLen = prob + LenHigh;
++            offset = kLenNumLowSymbols + kLenNumMidSymbols;
++            limit = 1 << kLenNumHighBits;
++          }
++        }
++        TREE_DECODE_CHECK(probLen, limit, len);
++        len += offset;
++      }
++
++      if (state < 4)
++      {
++        unsigned posSlot;
++        prob = probs + PosSlot +
++            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
++            kNumPosSlotBits);
++        TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);
++        if (posSlot >= kStartPosModelIndex)
++        {
++          int numDirectBits = ((posSlot >> 1) - 1);
++
++          /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
++
++          if (posSlot < kEndPosModelIndex)
++          {
++            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;
++          }
++          else
++          {
++            numDirectBits -= kNumAlignBits;
++            do
++            {
++              NORMALIZE_CHECK
++              range >>= 1;
++              code -= range & (((code - range) >> 31) - 1);
++              /* if (code >= range) code -= range; */
++            }
++            while (--numDirectBits != 0);
++            prob = probs + Align;
++            numDirectBits = kNumAlignBits;
++          }
++          {
++            unsigned i = 1;
++            do
++            {
++              GET_BIT_CHECK(prob + i, i);
++            }
++            while (--numDirectBits != 0);
++          }
++        }
++      }
++    }
++  }
++  NORMALIZE_CHECK;
++  return res;
++}
++
++
++static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
++{
++  p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);
++  p->range = 0xFFFFFFFF;
++  p->needFlush = 0;
++}
++
++void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
++{
++  p->needFlush = 1;
++  p->remainLen = 0;
++  p->tempBufSize = 0;
++
++  if (initDic)
++  {
++    p->processedPos = 0;
++    p->checkDicSize = 0;
++    p->needInitState = 1;
++  }
++  if (initState)
++    p->needInitState = 1;
++}
++
++void LzmaDec_Init(CLzmaDec *p)
++{
++  p->dicPos = 0;
++  LzmaDec_InitDicAndState(p, True, True);
++}
++
++static void LzmaDec_InitStateReal(CLzmaDec *p)
++{
++  UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));
++  UInt32 i;
++  CLzmaProb *probs = p->probs;
++  for (i = 0; i < numProbs; i++)
++    probs[i] = kBitModelTotal >> 1;
++  p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
++  p->state = 0;
++  p->needInitState = 0;
++}
++
++SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
++    ELzmaFinishMode finishMode, ELzmaStatus *status)
++{
++  SizeT inSize = *srcLen;
++  (*srcLen) = 0;
++  LzmaDec_WriteRem(p, dicLimit);
++
++  *status = LZMA_STATUS_NOT_SPECIFIED;
++
++  while (p->remainLen != kMatchSpecLenStart)
++  {
++      int checkEndMarkNow;
++
++      if (p->needFlush != 0)
++      {
++        for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
++          p->tempBuf[p->tempBufSize++] = *src++;
++        if (p->tempBufSize < RC_INIT_SIZE)
++        {
++          *status = LZMA_STATUS_NEEDS_MORE_INPUT;
++          return SZ_OK;
++        }
++        if (p->tempBuf[0] != 0)
++          return SZ_ERROR_DATA;
++
++        LzmaDec_InitRc(p, p->tempBuf);
++        p->tempBufSize = 0;
++      }
++
++      checkEndMarkNow = 0;
++      if (p->dicPos >= dicLimit)
++      {
++        if (p->remainLen == 0 && p->code == 0)
++        {
++          *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
++          return SZ_OK;
++        }
++        if (finishMode == LZMA_FINISH_ANY)
++        {
++          *status = LZMA_STATUS_NOT_FINISHED;
++          return SZ_OK;
++        }
++        if (p->remainLen != 0)
++        {
++          *status = LZMA_STATUS_NOT_FINISHED;
++          return SZ_ERROR_DATA;
++        }
++        checkEndMarkNow = 1;
++      }
++
++      if (p->needInitState)
++        LzmaDec_InitStateReal(p);
++
++      if (p->tempBufSize == 0)
++      {
++        SizeT processed;
++        const Byte *bufLimit;
++        if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
++        {
++          int dummyRes = LzmaDec_TryDummy(p, src, inSize);
++          if (dummyRes == DUMMY_ERROR)
++          {
++            memcpy(p->tempBuf, src, inSize);
++            p->tempBufSize = (unsigned)inSize;
++            (*srcLen) += inSize;
++            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
++            return SZ_OK;
++          }
++          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
++          {
++            *status = LZMA_STATUS_NOT_FINISHED;
++            return SZ_ERROR_DATA;
++          }
++          bufLimit = src;
++        }
++        else
++          bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
++        p->buf = src;
++        if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)
++          return SZ_ERROR_DATA;
++        processed = (SizeT)(p->buf - src);
++        (*srcLen) += processed;
++        src += processed;
++        inSize -= processed;
++      }
++      else
++      {
++        unsigned rem = p->tempBufSize, lookAhead = 0;
++        while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
++          p->tempBuf[rem++] = src[lookAhead++];
++        p->tempBufSize = rem;
++        if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
++        {
++          int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);
++          if (dummyRes == DUMMY_ERROR)
++          {
++            (*srcLen) += lookAhead;
++            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
++            return SZ_OK;
++          }
++          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
++          {
++            *status = LZMA_STATUS_NOT_FINISHED;
++            return SZ_ERROR_DATA;
++          }
++        }
++        p->buf = p->tempBuf;
++        if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)
++          return SZ_ERROR_DATA;
++        lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));
++        (*srcLen) += lookAhead;
++        src += lookAhead;
++        inSize -= lookAhead;
++        p->tempBufSize = 0;
++      }
++  }
++  if (p->code == 0)
++    *status = LZMA_STATUS_FINISHED_WITH_MARK;
++  return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
++}
++
++SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
++{
++  SizeT outSize = *destLen;
++  SizeT inSize = *srcLen;
++  *srcLen = *destLen = 0;
++  for (;;)
++  {
++    SizeT inSizeCur = inSize, outSizeCur, dicPos;
++    ELzmaFinishMode curFinishMode;
++    SRes res;
++    if (p->dicPos == p->dicBufSize)
++      p->dicPos = 0;
++    dicPos = p->dicPos;
++    if (outSize > p->dicBufSize - dicPos)
++    {
++      outSizeCur = p->dicBufSize;
++      curFinishMode = LZMA_FINISH_ANY;
++    }
++    else
++    {
++      outSizeCur = dicPos + outSize;
++      curFinishMode = finishMode;
++    }
++
++    res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
++    src += inSizeCur;
++    inSize -= inSizeCur;
++    *srcLen += inSizeCur;
++    outSizeCur = p->dicPos - dicPos;
++    memcpy(dest, p->dic + dicPos, outSizeCur);
++    dest += outSizeCur;
++    outSize -= outSizeCur;
++    *destLen += outSizeCur;
++    if (res != 0)
++      return res;
++    if (outSizeCur == 0 || outSize == 0)
++      return SZ_OK;
++  }
++}
++
++void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
++{
++  alloc->Free(alloc, p->probs);
++  p->probs = 0;
++}
++
++static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
++{
++  alloc->Free(alloc, p->dic);
++  p->dic = 0;
++}
++
++void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
++{
++  LzmaDec_FreeProbs(p, alloc);
++  LzmaDec_FreeDict(p, alloc);
++}
++
++SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
++{
++  UInt32 dicSize;
++  Byte d;
++
++  if (size < LZMA_PROPS_SIZE)
++    return SZ_ERROR_UNSUPPORTED;
++  else
++    dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
++
++  if (dicSize < LZMA_DIC_MIN)
++    dicSize = LZMA_DIC_MIN;
++  p->dicSize = dicSize;
++
++  d = data[0];
++  if (d >= (9 * 5 * 5))
++    return SZ_ERROR_UNSUPPORTED;
++
++  p->lc = d % 9;
++  d /= 9;
++  p->pb = d / 5;
++  p->lp = d % 5;
++
++  return SZ_OK;
++}
++
++static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)
++{
++  UInt32 numProbs = LzmaProps_GetNumProbs(propNew);
++  if (p->probs == 0 || numProbs != p->numProbs)
++  {
++    LzmaDec_FreeProbs(p, alloc);
++    p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));
++    p->numProbs = numProbs;
++    if (p->probs == 0)
++      return SZ_ERROR_MEM;
++  }
++  return SZ_OK;
++}
++
++SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
++{
++  CLzmaProps propNew;
++  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
++  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
++  p->prop = propNew;
++  return SZ_OK;
++}
++
++SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
++{
++  CLzmaProps propNew;
++  SizeT dicBufSize;
++  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
++  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
++  dicBufSize = propNew.dicSize;
++  if (p->dic == 0 || dicBufSize != p->dicBufSize)
++  {
++    LzmaDec_FreeDict(p, alloc);
++    p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
++    if (p->dic == 0)
++    {
++      LzmaDec_FreeProbs(p, alloc);
++      return SZ_ERROR_MEM;
++    }
++  }
++  p->dicBufSize = dicBufSize;
++  p->prop = propNew;
++  return SZ_OK;
++}
++
++SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
++    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
++    ELzmaStatus *status, ISzAlloc *alloc)
++{
++  CLzmaDec p;
++  SRes res;
++  SizeT inSize = *srcLen;
++  SizeT outSize = *destLen;
++  *srcLen = *destLen = 0;
++  if (inSize < RC_INIT_SIZE)
++    return SZ_ERROR_INPUT_EOF;
++
++  LzmaDec_Construct(&p);
++  res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc);
++  if (res != 0)
++    return res;
++  p.dic = dest;
++  p.dicBufSize = outSize;
++
++  LzmaDec_Init(&p);
++
++  *srcLen = inSize;
++  res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);
++
++  if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
++    res = SZ_ERROR_INPUT_EOF;
++
++  (*destLen) = p.dicPos;
++  LzmaDec_FreeProbs(&p, alloc);
++  return res;
++}
+--- /dev/null
++++ b/lib/lzma/LzmaEnc.c
+@@ -0,0 +1,2271 @@
++/* LzmaEnc.c -- LZMA Encoder
++2009-11-24 : Igor Pavlov : Public domain */
++
++#include <string.h>
++
++/* #define SHOW_STAT */
++/* #define SHOW_STAT2 */
++
++#if defined(SHOW_STAT) || defined(SHOW_STAT2)
++#include <stdio.h>
++#endif
++
++#include "LzmaEnc.h"
++
++/* disable MT */
++#define _7ZIP_ST
++
++#include "LzFind.h"
++#ifndef _7ZIP_ST
++#include "LzFindMt.h"
++#endif
++
++#ifdef SHOW_STAT
++static int ttt = 0;
++#endif
++
++#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1)
++
++#define kBlockSize (9 << 10)
++#define kUnpackBlockSize (1 << 18)
++#define kMatchArraySize (1 << 21)
++#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX)
++
++#define kNumMaxDirectBits (31)
++
++#define kNumTopBits 24
++#define kTopValue ((UInt32)1 << kNumTopBits)
++
++#define kNumBitModelTotalBits 11
++#define kBitModelTotal (1 << kNumBitModelTotalBits)
++#define kNumMoveBits 5
++#define kProbInitValue (kBitModelTotal >> 1)
++
++#define kNumMoveReducingBits 4
++#define kNumBitPriceShiftBits 4
++#define kBitPrice (1 << kNumBitPriceShiftBits)
++
++void LzmaEncProps_Init(CLzmaEncProps *p)
++{
++  p->level = 5;
++  p->dictSize = p->mc = 0;
++  p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;
++  p->writeEndMark = 0;
++}
++
++void LzmaEncProps_Normalize(CLzmaEncProps *p)
++{
++  int level = p->level;
++  if (level < 0) level = 5;
++  p->level = level;
++  if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26)));
++  if (p->lc < 0) p->lc = 3;
++  if (p->lp < 0) p->lp = 0;
++  if (p->pb < 0) p->pb = 2;
++  if (p->algo < 0) p->algo = (level < 5 ? 0 : 1);
++  if (p->fb < 0) p->fb = (level < 7 ? 32 : 64);
++  if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1);
++  if (p->numHashBytes < 0) p->numHashBytes = 4;
++  if (p->mc == 0)  p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1);
++  if (p->numThreads < 0)
++    p->numThreads =
++      #ifndef _7ZIP_ST
++      ((p->btMode && p->algo) ? 2 : 1);
++      #else
++      1;
++      #endif
++}
++
++UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
++{
++  CLzmaEncProps props = *props2;
++  LzmaEncProps_Normalize(&props);
++  return props.dictSize;
++}
++
++/* #define LZMA_LOG_BSR */
++/* Define it for Intel's CPU */
++
++
++#ifdef LZMA_LOG_BSR
++
++#define kDicLogSizeMaxCompress 30
++
++#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
++
++UInt32 GetPosSlot1(UInt32 pos)
++{
++  UInt32 res;
++  BSR2_RET(pos, res);
++  return res;
++}
++#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
++#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); }
++
++#else
++
++#define kNumLogBits (9 + (int)sizeof(size_t) / 2)
++#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
++
++void LzmaEnc_FastPosInit(Byte *g_FastPos)
++{
++  int c = 2, slotFast;
++  g_FastPos[0] = 0;
++  g_FastPos[1] = 1;
++
++  for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++)
++  {
++    UInt32 k = (1 << ((slotFast >> 1) - 1));
++    UInt32 j;
++    for (j = 0; j < k; j++, c++)
++      g_FastPos[c] = (Byte)slotFast;
++  }
++}
++
++#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \
++  (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \
++  res = p->g_FastPos[pos >> i] + (i * 2); }
++/*
++#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \
++  p->g_FastPos[pos >> 6] + 12 : \
++  p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; }
++*/
++
++#define GetPosSlot1(pos) p->g_FastPos[pos]
++#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); }
++#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); }
++
++#endif
++
++
++#define LZMA_NUM_REPS 4
++
++typedef unsigned CState;
++
++typedef struct
++{
++  UInt32 price;
++
++  CState state;
++  int prev1IsChar;
++  int prev2;
++
++  UInt32 posPrev2;
++  UInt32 backPrev2;
++
++  UInt32 posPrev;
++  UInt32 backPrev;
++  UInt32 backs[LZMA_NUM_REPS];
++} COptimal;
++
++#define kNumOpts (1 << 12)
++
++#define kNumLenToPosStates 4
++#define kNumPosSlotBits 6
++#define kDicLogSizeMin 0
++#define kDicLogSizeMax 32
++#define kDistTableSizeMax (kDicLogSizeMax * 2)
++
++
++#define kNumAlignBits 4
++#define kAlignTableSize (1 << kNumAlignBits)
++#define kAlignMask (kAlignTableSize - 1)
++
++#define kStartPosModelIndex 4
++#define kEndPosModelIndex 14
++#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex)
++
++#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
++
++#ifdef _LZMA_PROB32
++#define CLzmaProb UInt32
++#else
++#define CLzmaProb UInt16
++#endif
++
++#define LZMA_PB_MAX 4
++#define LZMA_LC_MAX 8
++#define LZMA_LP_MAX 4
++
++#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX)
++
++
++#define kLenNumLowBits 3
++#define kLenNumLowSymbols (1 << kLenNumLowBits)
++#define kLenNumMidBits 3
++#define kLenNumMidSymbols (1 << kLenNumMidBits)
++#define kLenNumHighBits 8
++#define kLenNumHighSymbols (1 << kLenNumHighBits)
++
++#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
++
++#define LZMA_MATCH_LEN_MIN 2
++#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1)
++
++#define kNumStates 12
++
++typedef struct
++{
++  CLzmaProb choice;
++  CLzmaProb choice2;
++  CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits];
++  CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits];
++  CLzmaProb high[kLenNumHighSymbols];
++} CLenEnc;
++
++typedef struct
++{
++  CLenEnc p;
++  UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal];
++  UInt32 tableSize;
++  UInt32 counters[LZMA_NUM_PB_STATES_MAX];
++} CLenPriceEnc;
++
++typedef struct
++{
++  UInt32 range;
++  Byte cache;
++  UInt64 low;
++  UInt64 cacheSize;
++  Byte *buf;
++  Byte *bufLim;
++  Byte *bufBase;
++  ISeqOutStream *outStream;
++  UInt64 processed;
++  SRes res;
++} CRangeEnc;
++
++typedef struct
++{
++  CLzmaProb *litProbs;
++
++  CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
++  CLzmaProb isRep[kNumStates];
++  CLzmaProb isRepG0[kNumStates];
++  CLzmaProb isRepG1[kNumStates];
++  CLzmaProb isRepG2[kNumStates];
++  CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
++
++  CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
++  CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];
++  CLzmaProb posAlignEncoder[1 << kNumAlignBits];
++
++  CLenPriceEnc lenEnc;
++  CLenPriceEnc repLenEnc;
++
++  UInt32 reps[LZMA_NUM_REPS];
++  UInt32 state;
++} CSaveState;
++
++typedef struct
++{
++  IMatchFinder matchFinder;
++  void *matchFinderObj;
++
++  #ifndef _7ZIP_ST
++  Bool mtMode;
++  CMatchFinderMt matchFinderMt;
++  #endif
++
++  CMatchFinder matchFinderBase;
++
++  #ifndef _7ZIP_ST
++  Byte pad[128];
++  #endif
++
++  UInt32 optimumEndIndex;
++  UInt32 optimumCurrentIndex;
++
++  UInt32 longestMatchLength;
++  UInt32 numPairs;
++  UInt32 numAvail;
++  COptimal opt[kNumOpts];
++
++  #ifndef LZMA_LOG_BSR
++  Byte g_FastPos[1 << kNumLogBits];
++  #endif
++
++  UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
++  UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1];
++  UInt32 numFastBytes;
++  UInt32 additionalOffset;
++  UInt32 reps[LZMA_NUM_REPS];
++  UInt32 state;
++
++  UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax];
++  UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances];
++  UInt32 alignPrices[kAlignTableSize];
++  UInt32 alignPriceCount;
++
++  UInt32 distTableSize;
++
++  unsigned lc, lp, pb;
++  unsigned lpMask, pbMask;
++
++  CLzmaProb *litProbs;
++
++  CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX];
++  CLzmaProb isRep[kNumStates];
++  CLzmaProb isRepG0[kNumStates];
++  CLzmaProb isRepG1[kNumStates];
++  CLzmaProb isRepG2[kNumStates];
++  CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX];
++
++  CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits];
++  CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex];
++  CLzmaProb posAlignEncoder[1 << kNumAlignBits];
++
++  CLenPriceEnc lenEnc;
++  CLenPriceEnc repLenEnc;
++
++  unsigned lclp;
++
++  Bool fastMode;
++
++  CRangeEnc rc;
++
++  Bool writeEndMark;
++  UInt64 nowPos64;
++  UInt32 matchPriceCount;
++  Bool finished;
++  Bool multiThread;
++
++  SRes result;
++  UInt32 dictSize;
++  UInt32 matchFinderCycles;
++
++  int needInit;
++
++  CSaveState saveState;
++} CLzmaEnc;
++
++void LzmaEnc_SaveState(CLzmaEncHandle pp)
++{
++  CLzmaEnc *p = (CLzmaEnc *)pp;
++  CSaveState *dest = &p->saveState;
++  int i;
++  dest->lenEnc = p->lenEnc;
++  dest->repLenEnc = p->repLenEnc;
++  dest->state = p->state;
++
++  for (i = 0; i < kNumStates; i++)
++  {
++    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
++    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
++  }
++  for (i = 0; i < kNumLenToPosStates; i++)
++    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
++  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
++  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
++  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
++  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
++  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
++  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
++  memcpy(dest->reps, p->reps, sizeof(p->reps));
++  memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
++}
++
++void LzmaEnc_RestoreState(CLzmaEncHandle pp)
++{
++  CLzmaEnc *dest = (CLzmaEnc *)pp;
++  const CSaveState *p = &dest->saveState;
++  int i;
++  dest->lenEnc = p->lenEnc;
++  dest->repLenEnc = p->repLenEnc;
++  dest->state = p->state;
++
++  for (i = 0; i < kNumStates; i++)
++  {
++    memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
++    memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
++  }
++  for (i = 0; i < kNumLenToPosStates; i++)
++    memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
++  memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
++  memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
++  memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
++  memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
++  memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
++  memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
++  memcpy(dest->reps, p->reps, sizeof(p->reps));
++  memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));
++}
++
++SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)
++{
++  CLzmaEnc *p = (CLzmaEnc *)pp;
++  CLzmaEncProps props = *props2;
++  LzmaEncProps_Normalize(&props);
++
++  if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX ||
++      props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30))
++    return SZ_ERROR_PARAM;
++  p->dictSize = props.dictSize;
++  p->matchFinderCycles = props.mc;
++  {
++    unsigned fb = props.fb;
++    if (fb < 5)
++      fb = 5;
++    if (fb > LZMA_MATCH_LEN_MAX)
++      fb = LZMA_MATCH_LEN_MAX;
++    p->numFastBytes = fb;
++  }
++  p->lc = props.lc;
++  p->lp = props.lp;
++  p->pb = props.pb;
++  p->fastMode = (props.algo == 0);
++  p->matchFinderBase.btMode = props.btMode;
++  {
++    UInt32 numHashBytes = 4;
++    if (props.btMode)
++    {
++      if (props.numHashBytes < 2)
++        numHashBytes = 2;
++      else if (props.numHashBytes < 4)
++        numHashBytes = props.numHashBytes;
++    }
++    p->matchFinderBase.numHashBytes = numHashBytes;
++  }
++
++  p->matchFinderBase.cutValue = props.mc;
++
++  p->writeEndMark = props.writeEndMark;
++
++  #ifndef _7ZIP_ST
++  /*
++  if (newMultiThread != _multiThread)
++  {
++    ReleaseMatchFinder();
++    _multiThread = newMultiThread;
++  }
++  */
++  p->multiThread = (props.numThreads > 1);
++  #endif
++
++  return SZ_OK;
++}
++
++static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4,  5,  6,   4, 5};
++static const int kMatchNextStates[kNumStates]   = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10};
++static const int kRepNextStates[kNumStates]     = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11};
++static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11};
++
++#define IsCharState(s) ((s) < 7)
++
++#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1)
++
++#define kInfinityPrice (1 << 30)
++
++static void RangeEnc_Construct(CRangeEnc *p)
++{
++  p->outStream = 0;
++  p->bufBase = 0;
++}
++
++#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize)
++
++#define RC_BUF_SIZE (1 << 16)
++static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc)
++{
++  if (p->bufBase == 0)
++  {
++    p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE);
++    if (p->bufBase == 0)
++      return 0;
++    p->bufLim = p->bufBase + RC_BUF_SIZE;
++  }
++  return 1;
++}
++
++static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc)
++{
++  alloc->Free(alloc, p->bufBase);
++  p->bufBase = 0;
++}
++
++static void RangeEnc_Init(CRangeEnc *p)
++{
++  /* Stream.Init(); */
++  p->low = 0;
++  p->range = 0xFFFFFFFF;
++  p->cacheSize = 1;
++  p->cache = 0;
++
++  p->buf = p->bufBase;
++
++  p->processed = 0;
++  p->res = SZ_OK;
++}
++
++static void RangeEnc_FlushStream(CRangeEnc *p)
++{
++  size_t num;
++  if (p->res != SZ_OK)
++    return;
++  num = p->buf - p->bufBase;
++  if (num != p->outStream->Write(p->outStream, p->bufBase, num))
++    p->res = SZ_ERROR_WRITE;
++  p->processed += num;
++  p->buf = p->bufBase;
++}
++
++static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p)
++{
++  if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0)
++  {
++    Byte temp = p->cache;
++    do
++    {
++      Byte *buf = p->buf;
++      *buf++ = (Byte)(temp + (Byte)(p->low >> 32));
++      p->buf = buf;
++      if (buf == p->bufLim)
++        RangeEnc_FlushStream(p);
++      temp = 0xFF;
++    }
++    while (--p->cacheSize != 0);
++    p->cache = (Byte)((UInt32)p->low >> 24);
++  }
++  p->cacheSize++;
++  p->low = (UInt32)p->low << 8;
++}
++
++static void RangeEnc_FlushData(CRangeEnc *p)
++{
++  int i;
++  for (i = 0; i < 5; i++)
++    RangeEnc_ShiftLow(p);
++}
++
++static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits)
++{
++  do
++  {
++    p->range >>= 1;
++    p->low += p->range & (0 - ((value >> --numBits) & 1));
++    if (p->range < kTopValue)
++    {
++      p->range <<= 8;
++      RangeEnc_ShiftLow(p);
++    }
++  }
++  while (numBits != 0);
++}
++
++static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol)
++{
++  UInt32 ttt = *prob;
++  UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt;
++  if (symbol == 0)
++  {
++    p->range = newBound;
++    ttt += (kBitModelTotal - ttt) >> kNumMoveBits;
++  }
++  else
++  {
++    p->low += newBound;
++    p->range -= newBound;
++    ttt -= ttt >> kNumMoveBits;
++  }
++  *prob = (CLzmaProb)ttt;
++  if (p->range < kTopValue)
++  {
++    p->range <<= 8;
++    RangeEnc_ShiftLow(p);
++  }
++}
++
++static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol)
++{
++  symbol |= 0x100;
++  do
++  {
++    RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1);
++    symbol <<= 1;
++  }
++  while (symbol < 0x10000);
++}
++
++static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte)
++{
++  UInt32 offs = 0x100;
++  symbol |= 0x100;
++  do
++  {
++    matchByte <<= 1;
++    RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1);
++    symbol <<= 1;
++    offs &= ~(matchByte ^ symbol);
++  }
++  while (symbol < 0x10000);
++}
++
++void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
++{
++  UInt32 i;
++  for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
++  {
++    const int kCyclesBits = kNumBitPriceShiftBits;
++    UInt32 w = i;
++    UInt32 bitCount = 0;
++    int j;
++    for (j = 0; j < kCyclesBits; j++)
++    {
++      w = w * w;
++      bitCount <<= 1;
++      while (w >= ((UInt32)1 << 16))
++      {
++        w >>= 1;
++        bitCount++;
++      }
++    }
++    ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount);
++  }
++}
++
++
++#define GET_PRICE(prob, symbol) \
++  p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
++
++#define GET_PRICEa(prob, symbol) \
++  ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits];
++
++#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits]
++#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
++
++#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits]
++#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits]
++
++static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices)
++{
++  UInt32 price = 0;
++  symbol |= 0x100;
++  do
++  {
++    price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1);
++    symbol <<= 1;
++  }
++  while (symbol < 0x10000);
++  return price;
++}
++
++static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices)
++{
++  UInt32 price = 0;
++  UInt32 offs = 0x100;
++  symbol |= 0x100;
++  do
++  {
++    matchByte <<= 1;
++    price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1);
++    symbol <<= 1;
++    offs &= ~(matchByte ^ symbol);
++  }
++  while (symbol < 0x10000);
++  return price;
++}
++
++
++static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)
++{
++  UInt32 m = 1;
++  int i;
++  for (i = numBitLevels; i != 0;)
++  {
++    UInt32 bit;
++    i--;
++    bit = (symbol >> i) & 1;
++    RangeEnc_EncodeBit(rc, probs + m, bit);
++    m = (m << 1) | bit;
++  }
++}
++
++static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol)
++{
++  UInt32 m = 1;
++  int i;
++  for (i = 0; i < numBitLevels; i++)
++  {
++    UInt32 bit = symbol & 1;
++    RangeEnc_EncodeBit(rc, probs + m, bit);
++    m = (m << 1) | bit;
++    symbol >>= 1;
++  }
++}
++
++static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)
++{
++  UInt32 price = 0;
++  symbol |= (1 << numBitLevels);
++  while (symbol != 1)
++  {
++    price += GET_PRICEa(probs[symbol >> 1], symbol & 1);
++    symbol >>= 1;
++  }
++  return price;
++}
++
++static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices)
++{
++  UInt32 price = 0;
++  UInt32 m = 1;
++  int i;
++  for (i = numBitLevels; i != 0; i--)
++  {
++    UInt32 bit = symbol & 1;
++    symbol >>= 1;
++    price += GET_PRICEa(probs[m], bit);
++    m = (m << 1) | bit;
++  }
++  return price;
++}
++
++
++static void LenEnc_Init(CLenEnc *p)
++{
++  unsigned i;
++  p->choice = p->choice2 = kProbInitValue;
++  for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++)
++    p->low[i] = kProbInitValue;
++  for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++)
++    p->mid[i] = kProbInitValue;
++  for (i = 0; i < kLenNumHighSymbols; i++)
++    p->high[i] = kProbInitValue;
++}
++
++static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState)
++{
++  if (symbol < kLenNumLowSymbols)
++  {
++    RangeEnc_EncodeBit(rc, &p->choice, 0);
++    RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol);
++  }
++  else
++  {
++    RangeEnc_EncodeBit(rc, &p->choice, 1);
++    if (symbol < kLenNumLowSymbols + kLenNumMidSymbols)
++    {
++      RangeEnc_EncodeBit(rc, &p->choice2, 0);
++      RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols);
++    }
++    else
++    {
++      RangeEnc_EncodeBit(rc, &p->choice2, 1);
++      RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols);
++    }
++  }
++}
++
++static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices)
++{
++  UInt32 a0 = GET_PRICE_0a(p->choice);
++  UInt32 a1 = GET_PRICE_1a(p->choice);
++  UInt32 b0 = a1 + GET_PRICE_0a(p->choice2);
++  UInt32 b1 = a1 + GET_PRICE_1a(p->choice2);
++  UInt32 i = 0;
++  for (i = 0; i < kLenNumLowSymbols; i++)
++  {
++    if (i >= numSymbols)
++      return;
++    prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices);
++  }
++  for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++)
++  {
++    if (i >= numSymbols)
++      return;
++    prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices);
++  }
++  for (; i < numSymbols; i++)
++    prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices);
++}
++
++static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices)
++{
++  LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices);
++  p->counters[posState] = p->tableSize;
++}
++
++static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices)
++{
++  UInt32 posState;
++  for (posState = 0; posState < numPosStates; posState++)
++    LenPriceEnc_UpdateTable(p, posState, ProbPrices);
++}
++
++static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices)
++{
++  LenEnc_Encode(&p->p, rc, symbol, posState);
++  if (updatePrice)
++    if (--p->counters[posState] == 0)
++      LenPriceEnc_UpdateTable(p, posState, ProbPrices);
++}
++
++
++
++
++static void MovePos(CLzmaEnc *p, UInt32 num)
++{
++  #ifdef SHOW_STAT
++  ttt += num;
++  printf("\n MovePos %d", num);
++  #endif
++  if (num != 0)
++  {
++    p->additionalOffset += num;
++    p->matchFinder.Skip(p->matchFinderObj, num);
++  }
++}
++
++static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes)
++{
++  UInt32 lenRes = 0, numPairs;
++  p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
++  numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches);
++  #ifdef SHOW_STAT
++  printf("\n i = %d numPairs = %d    ", ttt, numPairs / 2);
++  ttt++;
++  {
++    UInt32 i;
++    for (i = 0; i < numPairs; i += 2)
++      printf("%2d %6d   | ", p->matches[i], p->matches[i + 1]);
++  }
++  #endif
++  if (numPairs > 0)
++  {
++    lenRes = p->matches[numPairs - 2];
++    if (lenRes == p->numFastBytes)
++    {
++      const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
++      UInt32 distance = p->matches[numPairs - 1] + 1;
++      UInt32 numAvail = p->numAvail;
++      if (numAvail > LZMA_MATCH_LEN_MAX)
++        numAvail = LZMA_MATCH_LEN_MAX;
++      {
++        const Byte *pby2 = pby - distance;
++        for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++);
++      }
++    }
++  }
++  p->additionalOffset++;
++  *numDistancePairsRes = numPairs;
++  return lenRes;
++}
++
++
++#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False;
++#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False;
++#define IsShortRep(p) ((p)->backPrev == 0)
++
++static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState)
++{
++  return
++    GET_PRICE_0(p->isRepG0[state]) +
++    GET_PRICE_0(p->isRep0Long[state][posState]);
++}
++
++static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState)
++{
++  UInt32 price;
++  if (repIndex == 0)
++  {
++    price = GET_PRICE_0(p->isRepG0[state]);
++    price += GET_PRICE_1(p->isRep0Long[state][posState]);
++  }
++  else
++  {
++    price = GET_PRICE_1(p->isRepG0[state]);
++    if (repIndex == 1)
++      price += GET_PRICE_0(p->isRepG1[state]);
++    else
++    {
++      price += GET_PRICE_1(p->isRepG1[state]);
++      price += GET_PRICE(p->isRepG2[state], repIndex - 2);
++    }
++  }
++  return price;
++}
++
++static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState)
++{
++  return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] +
++    GetPureRepPrice(p, repIndex, state, posState);
++}
++
++static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur)
++{
++  UInt32 posMem = p->opt[cur].posPrev;
++  UInt32 backMem = p->opt[cur].backPrev;
++  p->optimumEndIndex = cur;
++  do
++  {
++    if (p->opt[cur].prev1IsChar)
++    {
++      MakeAsChar(&p->opt[posMem])
++      p->opt[posMem].posPrev = posMem - 1;
++      if (p->opt[cur].prev2)
++      {
++        p->opt[posMem - 1].prev1IsChar = False;
++        p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2;
++        p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2;
++      }
++    }
++    {
++      UInt32 posPrev = posMem;
++      UInt32 backCur = backMem;
++
++      backMem = p->opt[posPrev].backPrev;
++      posMem = p->opt[posPrev].posPrev;
++
++      p->opt[posPrev].backPrev = backCur;
++      p->opt[posPrev].posPrev = cur;
++      cur = posPrev;
++    }
++  }
++  while (cur != 0);
++  *backRes = p->opt[0].backPrev;
++  p->optimumCurrentIndex  = p->opt[0].posPrev;
++  return p->optimumCurrentIndex;
++}
++
++#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300)
++
++static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes)
++{
++  UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur;
++  UInt32 matchPrice, repMatchPrice, normalMatchPrice;
++  UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS];
++  UInt32 *matches;
++  const Byte *data;
++  Byte curByte, matchByte;
++  if (p->optimumEndIndex != p->optimumCurrentIndex)
++  {
++    const COptimal *opt = &p->opt[p->optimumCurrentIndex];
++    UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex;
++    *backRes = opt->backPrev;
++    p->optimumCurrentIndex = opt->posPrev;
++    return lenRes;
++  }
++  p->optimumCurrentIndex = p->optimumEndIndex = 0;
++
++  if (p->additionalOffset == 0)
++    mainLen = ReadMatchDistances(p, &numPairs);
++  else
++  {
++    mainLen = p->longestMatchLength;
++    numPairs = p->numPairs;
++  }
++
++  numAvail = p->numAvail;
++  if (numAvail < 2)
++  {
++    *backRes = (UInt32)(-1);
++    return 1;
++  }
++  if (numAvail > LZMA_MATCH_LEN_MAX)
++    numAvail = LZMA_MATCH_LEN_MAX;
++
++  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
++  repMaxIndex = 0;
++  for (i = 0; i < LZMA_NUM_REPS; i++)
++  {
++    UInt32 lenTest;
++    const Byte *data2;
++    reps[i] = p->reps[i];
++    data2 = data - (reps[i] + 1);
++    if (data[0] != data2[0] || data[1] != data2[1])
++    {
++      repLens[i] = 0;
++      continue;
++    }
++    for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);
++    repLens[i] = lenTest;
++    if (lenTest > repLens[repMaxIndex])
++      repMaxIndex = i;
++  }
++  if (repLens[repMaxIndex] >= p->numFastBytes)
++  {
++    UInt32 lenRes;
++    *backRes = repMaxIndex;
++    lenRes = repLens[repMaxIndex];
++    MovePos(p, lenRes - 1);
++    return lenRes;
++  }
++
++  matches = p->matches;
++  if (mainLen >= p->numFastBytes)
++  {
++    *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;
++    MovePos(p, mainLen - 1);
++    return mainLen;
++  }
++  curByte = *data;
++  matchByte = *(data - (reps[0] + 1));
++
++  if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2)
++  {
++    *backRes = (UInt32)-1;
++    return 1;
++  }
++
++  p->opt[0].state = (CState)p->state;
++
++  posState = (position & p->pbMask);
++
++  {
++    const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));
++    p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) +
++        (!IsCharState(p->state) ?
++          LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :
++          LitEnc_GetPrice(probs, curByte, p->ProbPrices));
++  }
++
++  MakeAsChar(&p->opt[1]);
++
++  matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]);
++  repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]);
++
++  if (matchByte == curByte)
++  {
++    UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState);
++    if (shortRepPrice < p->opt[1].price)
++    {
++      p->opt[1].price = shortRepPrice;
++      MakeAsShortRep(&p->opt[1]);
++    }
++  }
++  lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]);
++
++  if (lenEnd < 2)
++  {
++    *backRes = p->opt[1].backPrev;
++    return 1;
++  }
++
++  p->opt[1].posPrev = 0;
++  for (i = 0; i < LZMA_NUM_REPS; i++)
++    p->opt[0].backs[i] = reps[i];
++
++  len = lenEnd;
++  do
++    p->opt[len--].price = kInfinityPrice;
++  while (len >= 2);
++
++  for (i = 0; i < LZMA_NUM_REPS; i++)
++  {
++    UInt32 repLen = repLens[i];
++    UInt32 price;
++    if (repLen < 2)
++      continue;
++    price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState);
++    do
++    {
++      UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2];
++      COptimal *opt = &p->opt[repLen];
++      if (curAndLenPrice < opt->price)
++      {
++        opt->price = curAndLenPrice;
++        opt->posPrev = 0;
++        opt->backPrev = i;
++        opt->prev1IsChar = False;
++      }
++    }
++    while (--repLen >= 2);
++  }
++
++  normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]);
++
++  len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2);
++  if (len <= mainLen)
++  {
++    UInt32 offs = 0;
++    while (len > matches[offs])
++      offs += 2;
++    for (; ; len++)
++    {
++      COptimal *opt;
++      UInt32 distance = matches[offs + 1];
++
++      UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN];
++      UInt32 lenToPosState = GetLenToPosState(len);
++      if (distance < kNumFullDistances)
++        curAndLenPrice += p->distancesPrices[lenToPosState][distance];
++      else
++      {
++        UInt32 slot;
++        GetPosSlot2(distance, slot);
++        curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot];
++      }
++      opt = &p->opt[len];
++      if (curAndLenPrice < opt->price)
++      {
++        opt->price = curAndLenPrice;
++        opt->posPrev = 0;
++        opt->backPrev = distance + LZMA_NUM_REPS;
++        opt->prev1IsChar = False;
++      }
++      if (len == matches[offs])
++      {
++        offs += 2;
++        if (offs == numPairs)
++          break;
++      }
++    }
++  }
++
++  cur = 0;
++
++    #ifdef SHOW_STAT2
++    if (position >= 0)
++    {
++      unsigned i;
++      printf("\n pos = %4X", position);
++      for (i = cur; i <= lenEnd; i++)
++      printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price);
++    }
++    #endif
++
++  for (;;)
++  {
++    UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen;
++    UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice;
++    Bool nextIsChar;
++    Byte curByte, matchByte;
++    const Byte *data;
++    COptimal *curOpt;
++    COptimal *nextOpt;
++
++    cur++;
++    if (cur == lenEnd)
++      return Backward(p, backRes, cur);
++
++    newLen = ReadMatchDistances(p, &numPairs);
++    if (newLen >= p->numFastBytes)
++    {
++      p->numPairs = numPairs;
++      p->longestMatchLength = newLen;
++      return Backward(p, backRes, cur);
++    }
++    position++;
++    curOpt = &p->opt[cur];
++    posPrev = curOpt->posPrev;
++    if (curOpt->prev1IsChar)
++    {
++      posPrev--;
++      if (curOpt->prev2)
++      {
++        state = p->opt[curOpt->posPrev2].state;
++        if (curOpt->backPrev2 < LZMA_NUM_REPS)
++          state = kRepNextStates[state];
++        else
++          state = kMatchNextStates[state];
++      }
++      else
++        state = p->opt[posPrev].state;
++      state = kLiteralNextStates[state];
++    }
++    else
++      state = p->opt[posPrev].state;
++    if (posPrev == cur - 1)
++    {
++      if (IsShortRep(curOpt))
++        state = kShortRepNextStates[state];
++      else
++        state = kLiteralNextStates[state];
++    }
++    else
++    {
++      UInt32 pos;
++      const COptimal *prevOpt;
++      if (curOpt->prev1IsChar && curOpt->prev2)
++      {
++        posPrev = curOpt->posPrev2;
++        pos = curOpt->backPrev2;
++        state = kRepNextStates[state];
++      }
++      else
++      {
++        pos = curOpt->backPrev;
++        if (pos < LZMA_NUM_REPS)
++          state = kRepNextStates[state];
++        else
++          state = kMatchNextStates[state];
++      }
++      prevOpt = &p->opt[posPrev];
++      if (pos < LZMA_NUM_REPS)
++      {
++        UInt32 i;
++        reps[0] = prevOpt->backs[pos];
++        for (i = 1; i <= pos; i++)
++          reps[i] = prevOpt->backs[i - 1];
++        for (; i < LZMA_NUM_REPS; i++)
++          reps[i] = prevOpt->backs[i];
++      }
++      else
++      {
++        UInt32 i;
++        reps[0] = (pos - LZMA_NUM_REPS);
++        for (i = 1; i < LZMA_NUM_REPS; i++)
++          reps[i] = prevOpt->backs[i - 1];
++      }
++    }
++    curOpt->state = (CState)state;
++
++    curOpt->backs[0] = reps[0];
++    curOpt->backs[1] = reps[1];
++    curOpt->backs[2] = reps[2];
++    curOpt->backs[3] = reps[3];
++
++    curPrice = curOpt->price;
++    nextIsChar = False;
++    data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
++    curByte = *data;
++    matchByte = *(data - (reps[0] + 1));
++
++    posState = (position & p->pbMask);
++
++    curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]);
++    {
++      const CLzmaProb *probs = LIT_PROBS(position, *(data - 1));
++      curAnd1Price +=
++        (!IsCharState(state) ?
++          LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) :
++          LitEnc_GetPrice(probs, curByte, p->ProbPrices));
++    }
++
++    nextOpt = &p->opt[cur + 1];
++
++    if (curAnd1Price < nextOpt->price)
++    {
++      nextOpt->price = curAnd1Price;
++      nextOpt->posPrev = cur;
++      MakeAsChar(nextOpt);
++      nextIsChar = True;
++    }
++
++    matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]);
++    repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]);
++
++    if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0))
++    {
++      UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState);
++      if (shortRepPrice <= nextOpt->price)
++      {
++        nextOpt->price = shortRepPrice;
++        nextOpt->posPrev = cur;
++        MakeAsShortRep(nextOpt);
++        nextIsChar = True;
++      }
++    }
++    numAvailFull = p->numAvail;
++    {
++      UInt32 temp = kNumOpts - 1 - cur;
++      if (temp < numAvailFull)
++        numAvailFull = temp;
++    }
++
++    if (numAvailFull < 2)
++      continue;
++    numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes);
++
++    if (!nextIsChar && matchByte != curByte) /* speed optimization */
++    {
++      /* try Literal + rep0 */
++      UInt32 temp;
++      UInt32 lenTest2;
++      const Byte *data2 = data - (reps[0] + 1);
++      UInt32 limit = p->numFastBytes + 1;
++      if (limit > numAvailFull)
++        limit = numAvailFull;
++
++      for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++);
++      lenTest2 = temp - 1;
++      if (lenTest2 >= 2)
++      {
++        UInt32 state2 = kLiteralNextStates[state];
++        UInt32 posStateNext = (position + 1) & p->pbMask;
++        UInt32 nextRepMatchPrice = curAnd1Price +
++            GET_PRICE_1(p->isMatch[state2][posStateNext]) +
++            GET_PRICE_1(p->isRep[state2]);
++        /* for (; lenTest2 >= 2; lenTest2--) */
++        {
++          UInt32 curAndLenPrice;
++          COptimal *opt;
++          UInt32 offset = cur + 1 + lenTest2;
++          while (lenEnd < offset)
++            p->opt[++lenEnd].price = kInfinityPrice;
++          curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
++          opt = &p->opt[offset];
++          if (curAndLenPrice < opt->price)
++          {
++            opt->price = curAndLenPrice;
++            opt->posPrev = cur + 1;
++            opt->backPrev = 0;
++            opt->prev1IsChar = True;
++            opt->prev2 = False;
++          }
++        }
++      }
++    }
++
++    startLen = 2; /* speed optimization */
++    {
++    UInt32 repIndex;
++    for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++)
++    {
++      UInt32 lenTest;
++      UInt32 lenTestTemp;
++      UInt32 price;
++      const Byte *data2 = data - (reps[repIndex] + 1);
++      if (data[0] != data2[0] || data[1] != data2[1])
++        continue;
++      for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++);
++      while (lenEnd < cur + lenTest)
++        p->opt[++lenEnd].price = kInfinityPrice;
++      lenTestTemp = lenTest;
++      price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState);
++      do
++      {
++        UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2];
++        COptimal *opt = &p->opt[cur + lenTest];
++        if (curAndLenPrice < opt->price)
++        {
++          opt->price = curAndLenPrice;
++          opt->posPrev = cur;
++          opt->backPrev = repIndex;
++          opt->prev1IsChar = False;
++        }
++      }
++      while (--lenTest >= 2);
++      lenTest = lenTestTemp;
++
++      if (repIndex == 0)
++        startLen = lenTest + 1;
++
++      /* if (_maxMode) */
++        {
++          UInt32 lenTest2 = lenTest + 1;
++          UInt32 limit = lenTest2 + p->numFastBytes;
++          UInt32 nextRepMatchPrice;
++          if (limit > numAvailFull)
++            limit = numAvailFull;
++          for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);
++          lenTest2 -= lenTest + 1;
++          if (lenTest2 >= 2)
++          {
++            UInt32 state2 = kRepNextStates[state];
++            UInt32 posStateNext = (position + lenTest) & p->pbMask;
++            UInt32 curAndLenCharPrice =
++                price + p->repLenEnc.prices[posState][lenTest - 2] +
++                GET_PRICE_0(p->isMatch[state2][posStateNext]) +
++                LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),
++                    data[lenTest], data2[lenTest], p->ProbPrices);
++            state2 = kLiteralNextStates[state2];
++            posStateNext = (position + lenTest + 1) & p->pbMask;
++            nextRepMatchPrice = curAndLenCharPrice +
++                GET_PRICE_1(p->isMatch[state2][posStateNext]) +
++                GET_PRICE_1(p->isRep[state2]);
++
++            /* for (; lenTest2 >= 2; lenTest2--) */
++            {
++              UInt32 curAndLenPrice;
++              COptimal *opt;
++              UInt32 offset = cur + lenTest + 1 + lenTest2;
++              while (lenEnd < offset)
++                p->opt[++lenEnd].price = kInfinityPrice;
++              curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
++              opt = &p->opt[offset];
++              if (curAndLenPrice < opt->price)
++              {
++                opt->price = curAndLenPrice;
++                opt->posPrev = cur + lenTest + 1;
++                opt->backPrev = 0;
++                opt->prev1IsChar = True;
++                opt->prev2 = True;
++                opt->posPrev2 = cur;
++                opt->backPrev2 = repIndex;
++              }
++            }
++          }
++        }
++    }
++    }
++    /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */
++    if (newLen > numAvail)
++    {
++      newLen = numAvail;
++      for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2);
++      matches[numPairs] = newLen;
++      numPairs += 2;
++    }
++    if (newLen >= startLen)
++    {
++      UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]);
++      UInt32 offs, curBack, posSlot;
++      UInt32 lenTest;
++      while (lenEnd < cur + newLen)
++        p->opt[++lenEnd].price = kInfinityPrice;
++
++      offs = 0;
++      while (startLen > matches[offs])
++        offs += 2;
++      curBack = matches[offs + 1];
++      GetPosSlot2(curBack, posSlot);
++      for (lenTest = /*2*/ startLen; ; lenTest++)
++      {
++        UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN];
++        UInt32 lenToPosState = GetLenToPosState(lenTest);
++        COptimal *opt;
++        if (curBack < kNumFullDistances)
++          curAndLenPrice += p->distancesPrices[lenToPosState][curBack];
++        else
++          curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask];
++
++        opt = &p->opt[cur + lenTest];
++        if (curAndLenPrice < opt->price)
++        {
++          opt->price = curAndLenPrice;
++          opt->posPrev = cur;
++          opt->backPrev = curBack + LZMA_NUM_REPS;
++          opt->prev1IsChar = False;
++        }
++
++        if (/*_maxMode && */lenTest == matches[offs])
++        {
++          /* Try Match + Literal + Rep0 */
++          const Byte *data2 = data - (curBack + 1);
++          UInt32 lenTest2 = lenTest + 1;
++          UInt32 limit = lenTest2 + p->numFastBytes;
++          UInt32 nextRepMatchPrice;
++          if (limit > numAvailFull)
++            limit = numAvailFull;
++          for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++);
++          lenTest2 -= lenTest + 1;
++          if (lenTest2 >= 2)
++          {
++            UInt32 state2 = kMatchNextStates[state];
++            UInt32 posStateNext = (position + lenTest) & p->pbMask;
++            UInt32 curAndLenCharPrice = curAndLenPrice +
++                GET_PRICE_0(p->isMatch[state2][posStateNext]) +
++                LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]),
++                    data[lenTest], data2[lenTest], p->ProbPrices);
++            state2 = kLiteralNextStates[state2];
++            posStateNext = (posStateNext + 1) & p->pbMask;
++            nextRepMatchPrice = curAndLenCharPrice +
++                GET_PRICE_1(p->isMatch[state2][posStateNext]) +
++                GET_PRICE_1(p->isRep[state2]);
++
++            /* for (; lenTest2 >= 2; lenTest2--) */
++            {
++              UInt32 offset = cur + lenTest + 1 + lenTest2;
++              UInt32 curAndLenPrice;
++              COptimal *opt;
++              while (lenEnd < offset)
++                p->opt[++lenEnd].price = kInfinityPrice;
++              curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext);
++              opt = &p->opt[offset];
++              if (curAndLenPrice < opt->price)
++              {
++                opt->price = curAndLenPrice;
++                opt->posPrev = cur + lenTest + 1;
++                opt->backPrev = 0;
++                opt->prev1IsChar = True;
++                opt->prev2 = True;
++                opt->posPrev2 = cur;
++                opt->backPrev2 = curBack + LZMA_NUM_REPS;
++              }
++            }
++          }
++          offs += 2;
++          if (offs == numPairs)
++            break;
++          curBack = matches[offs + 1];
++          if (curBack >= kNumFullDistances)
++            GetPosSlot2(curBack, posSlot);
++        }
++      }
++    }
++  }
++}
++
++#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist))
++
++static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes)
++{
++  UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i;
++  const Byte *data;
++  const UInt32 *matches;
++
++  if (p->additionalOffset == 0)
++    mainLen = ReadMatchDistances(p, &numPairs);
++  else
++  {
++    mainLen = p->longestMatchLength;
++    numPairs = p->numPairs;
++  }
++
++  numAvail = p->numAvail;
++  *backRes = (UInt32)-1;
++  if (numAvail < 2)
++    return 1;
++  if (numAvail > LZMA_MATCH_LEN_MAX)
++    numAvail = LZMA_MATCH_LEN_MAX;
++  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
++
++  repLen = repIndex = 0;
++  for (i = 0; i < LZMA_NUM_REPS; i++)
++  {
++    UInt32 len;
++    const Byte *data2 = data - (p->reps[i] + 1);
++    if (data[0] != data2[0] || data[1] != data2[1])
++      continue;
++    for (len = 2; len < numAvail && data[len] == data2[len]; len++);
++    if (len >= p->numFastBytes)
++    {
++      *backRes = i;
++      MovePos(p, len - 1);
++      return len;
++    }
++    if (len > repLen)
++    {
++      repIndex = i;
++      repLen = len;
++    }
++  }
++
++  matches = p->matches;
++  if (mainLen >= p->numFastBytes)
++  {
++    *backRes = matches[numPairs - 1] + LZMA_NUM_REPS;
++    MovePos(p, mainLen - 1);
++    return mainLen;
++  }
++
++  mainDist = 0; /* for GCC */
++  if (mainLen >= 2)
++  {
++    mainDist = matches[numPairs - 1];
++    while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1)
++    {
++      if (!ChangePair(matches[numPairs - 3], mainDist))
++        break;
++      numPairs -= 2;
++      mainLen = matches[numPairs - 2];
++      mainDist = matches[numPairs - 1];
++    }
++    if (mainLen == 2 && mainDist >= 0x80)
++      mainLen = 1;
++  }
++
++  if (repLen >= 2 && (
++        (repLen + 1 >= mainLen) ||
++        (repLen + 2 >= mainLen && mainDist >= (1 << 9)) ||
++        (repLen + 3 >= mainLen && mainDist >= (1 << 15))))
++  {
++    *backRes = repIndex;
++    MovePos(p, repLen - 1);
++    return repLen;
++  }
++
++  if (mainLen < 2 || numAvail <= 2)
++    return 1;
++
++  p->longestMatchLength = ReadMatchDistances(p, &p->numPairs);
++  if (p->longestMatchLength >= 2)
++  {
++    UInt32 newDistance = matches[p->numPairs - 1];
++    if ((p->longestMatchLength >= mainLen && newDistance < mainDist) ||
++        (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) ||
++        (p->longestMatchLength > mainLen + 1) ||
++        (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist)))
++      return 1;
++  }
++
++  data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1;
++  for (i = 0; i < LZMA_NUM_REPS; i++)
++  {
++    UInt32 len, limit;
++    const Byte *data2 = data - (p->reps[i] + 1);
++    if (data[0] != data2[0] || data[1] != data2[1])
++      continue;
++    limit = mainLen - 1;
++    for (len = 2; len < limit && data[len] == data2[len]; len++);
++    if (len >= limit)
++      return 1;
++  }
++  *backRes = mainDist + LZMA_NUM_REPS;
++  MovePos(p, mainLen - 2);
++  return mainLen;
++}
++
++static void WriteEndMarker(CLzmaEnc *p, UInt32 posState)
++{
++  UInt32 len;
++  RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);
++  RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
++  p->state = kMatchNextStates[p->state];
++  len = LZMA_MATCH_LEN_MIN;
++  LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
++  RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1);
++  RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits);
++  RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask);
++}
++
++static SRes CheckErrors(CLzmaEnc *p)
++{
++  if (p->result != SZ_OK)
++    return p->result;
++  if (p->rc.res != SZ_OK)
++    p->result = SZ_ERROR_WRITE;
++  if (p->matchFinderBase.result != SZ_OK)
++    p->result = SZ_ERROR_READ;
++  if (p->result != SZ_OK)
++    p->finished = True;
++  return p->result;
++}
++
++static SRes Flush(CLzmaEnc *p, UInt32 nowPos)
++{
++  /* ReleaseMFStream(); */
++  p->finished = True;
++  if (p->writeEndMark)
++    WriteEndMarker(p, nowPos & p->pbMask);
++  RangeEnc_FlushData(&p->rc);
++  RangeEnc_FlushStream(&p->rc);
++  return CheckErrors(p);
++}
++
++static void FillAlignPrices(CLzmaEnc *p)
++{
++  UInt32 i;
++  for (i = 0; i < kAlignTableSize; i++)
++    p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices);
++  p->alignPriceCount = 0;
++}
++
++static void FillDistancesPrices(CLzmaEnc *p)
++{
++  UInt32 tempPrices[kNumFullDistances];
++  UInt32 i, lenToPosState;
++  for (i = kStartPosModelIndex; i < kNumFullDistances; i++)
++  {
++    UInt32 posSlot = GetPosSlot1(i);
++    UInt32 footerBits = ((posSlot >> 1) - 1);
++    UInt32 base = ((2 | (posSlot & 1)) << footerBits);
++    tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices);
++  }
++
++  for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++)
++  {
++    UInt32 posSlot;
++    const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState];
++    UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState];
++    for (posSlot = 0; posSlot < p->distTableSize; posSlot++)
++      posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices);
++    for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++)
++      posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits);
++
++    {
++      UInt32 *distancesPrices = p->distancesPrices[lenToPosState];
++      UInt32 i;
++      for (i = 0; i < kStartPosModelIndex; i++)
++        distancesPrices[i] = posSlotPrices[i];
++      for (; i < kNumFullDistances; i++)
++        distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i];
++    }
++  }
++  p->matchPriceCount = 0;
++}
++
++void LzmaEnc_Construct(CLzmaEnc *p)
++{
++  RangeEnc_Construct(&p->rc);
++  MatchFinder_Construct(&p->matchFinderBase);
++  #ifndef _7ZIP_ST
++  MatchFinderMt_Construct(&p->matchFinderMt);
++  p->matchFinderMt.MatchFinder = &p->matchFinderBase;
++  #endif
++
++  {
++    CLzmaEncProps props;
++    LzmaEncProps_Init(&props);
++    LzmaEnc_SetProps(p, &props);
++  }
++
++  #ifndef LZMA_LOG_BSR
++  LzmaEnc_FastPosInit(p->g_FastPos);
++  #endif
++
++  LzmaEnc_InitPriceTables(p->ProbPrices);
++  p->litProbs = 0;
++  p->saveState.litProbs = 0;
++}
++
++CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc)
++{
++  void *p;
++  p = alloc->Alloc(alloc, sizeof(CLzmaEnc));
++  if (p != 0)
++    LzmaEnc_Construct((CLzmaEnc *)p);
++  return p;
++}
++
++void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
++{
++  alloc->Free(alloc, p->litProbs);
++  alloc->Free(alloc, p->saveState.litProbs);
++  p->litProbs = 0;
++  p->saveState.litProbs = 0;
++}
++
++void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
++{
++  #ifndef _7ZIP_ST
++  MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);
++  #endif
++  MatchFinder_Free(&p->matchFinderBase, allocBig);
++  LzmaEnc_FreeLits(p, alloc);
++  RangeEnc_Free(&p->rc, alloc);
++}
++
++void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig)
++{
++  LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig);
++  alloc->Free(alloc, p);
++}
++
++static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize)
++{
++  UInt32 nowPos32, startPos32;
++  if (p->needInit)
++  {
++    p->matchFinder.Init(p->matchFinderObj);
++    p->needInit = 0;
++  }
++
++  if (p->finished)
++    return p->result;
++  RINOK(CheckErrors(p));
++
++  nowPos32 = (UInt32)p->nowPos64;
++  startPos32 = nowPos32;
++
++  if (p->nowPos64 == 0)
++  {
++    UInt32 numPairs;
++    Byte curByte;
++    if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)
++      return Flush(p, nowPos32);
++    ReadMatchDistances(p, &numPairs);
++    RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0);
++    p->state = kLiteralNextStates[p->state];
++    curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset);
++    LitEnc_Encode(&p->rc, p->litProbs, curByte);
++    p->additionalOffset--;
++    nowPos32++;
++  }
++
++  if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0)
++  for (;;)
++  {
++    UInt32 pos, len, posState;
++
++    if (p->fastMode)
++      len = GetOptimumFast(p, &pos);
++    else
++      len = GetOptimum(p, nowPos32, &pos);
++
++    #ifdef SHOW_STAT2
++    printf("\n pos = %4X,   len = %d   pos = %d", nowPos32, len, pos);
++    #endif
++
++    posState = nowPos32 & p->pbMask;
++    if (len == 1 && pos == (UInt32)-1)
++    {
++      Byte curByte;
++      CLzmaProb *probs;
++      const Byte *data;
++
++      RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0);
++      data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
++      curByte = *data;
++      probs = LIT_PROBS(nowPos32, *(data - 1));
++      if (IsCharState(p->state))
++        LitEnc_Encode(&p->rc, probs, curByte);
++      else
++        LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1));
++      p->state = kLiteralNextStates[p->state];
++    }
++    else
++    {
++      RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1);
++      if (pos < LZMA_NUM_REPS)
++      {
++        RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1);
++        if (pos == 0)
++        {
++          RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0);
++          RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1));
++        }
++        else
++        {
++          UInt32 distance = p->reps[pos];
++          RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1);
++          if (pos == 1)
++            RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0);
++          else
++          {
++            RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1);
++            RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2);
++            if (pos == 3)
++              p->reps[3] = p->reps[2];
++            p->reps[2] = p->reps[1];
++          }
++          p->reps[1] = p->reps[0];
++          p->reps[0] = distance;
++        }
++        if (len == 1)
++          p->state = kShortRepNextStates[p->state];
++        else
++        {
++          LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
++          p->state = kRepNextStates[p->state];
++        }
++      }
++      else
++      {
++        UInt32 posSlot;
++        RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0);
++        p->state = kMatchNextStates[p->state];
++        LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices);
++        pos -= LZMA_NUM_REPS;
++        GetPosSlot(pos, posSlot);
++        RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot);
++
++        if (posSlot >= kStartPosModelIndex)
++        {
++          UInt32 footerBits = ((posSlot >> 1) - 1);
++          UInt32 base = ((2 | (posSlot & 1)) << footerBits);
++          UInt32 posReduced = pos - base;
++
++          if (posSlot < kEndPosModelIndex)
++            RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced);
++          else
++          {
++            RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits);
++            RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask);
++            p->alignPriceCount++;
++          }
++        }
++        p->reps[3] = p->reps[2];
++        p->reps[2] = p->reps[1];
++        p->reps[1] = p->reps[0];
++        p->reps[0] = pos;
++        p->matchPriceCount++;
++      }
++    }
++    p->additionalOffset -= len;
++    nowPos32 += len;
++    if (p->additionalOffset == 0)
++    {
++      UInt32 processed;
++      if (!p->fastMode)
++      {
++        if (p->matchPriceCount >= (1 << 7))
++          FillDistancesPrices(p);
++        if (p->alignPriceCount >= kAlignTableSize)
++          FillAlignPrices(p);
++      }
++      if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0)
++        break;
++      processed = nowPos32 - startPos32;
++      if (useLimits)
++      {
++        if (processed + kNumOpts + 300 >= maxUnpackSize ||
++            RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize)
++          break;
++      }
++      else if (processed >= (1 << 15))
++      {
++        p->nowPos64 += nowPos32 - startPos32;
++        return CheckErrors(p);
++      }
++    }
++  }
++  p->nowPos64 += nowPos32 - startPos32;
++  return Flush(p, nowPos32);
++}
++
++#define kBigHashDicLimit ((UInt32)1 << 24)
++
++static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
++{
++  UInt32 beforeSize = kNumOpts;
++  Bool btMode;
++  if (!RangeEnc_Alloc(&p->rc, alloc))
++    return SZ_ERROR_MEM;
++  btMode = (p->matchFinderBase.btMode != 0);
++  #ifndef _7ZIP_ST
++  p->mtMode = (p->multiThread && !p->fastMode && btMode);
++  #endif
++
++  {
++    unsigned lclp = p->lc + p->lp;
++    if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp)
++    {
++      LzmaEnc_FreeLits(p, alloc);
++      p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));
++      p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb));
++      if (p->litProbs == 0 || p->saveState.litProbs == 0)
++      {
++        LzmaEnc_FreeLits(p, alloc);
++        return SZ_ERROR_MEM;
++      }
++      p->lclp = lclp;
++    }
++  }
++
++  p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit);
++
++  if (beforeSize + p->dictSize < keepWindowSize)
++    beforeSize = keepWindowSize - p->dictSize;
++
++  #ifndef _7ZIP_ST
++  if (p->mtMode)
++  {
++    RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig));
++    p->matchFinderObj = &p->matchFinderMt;
++    MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder);
++  }
++  else
++  #endif
++  {
++    if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig))
++      return SZ_ERROR_MEM;
++    p->matchFinderObj = &p->matchFinderBase;
++    MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder);
++  }
++  return SZ_OK;
++}
++
++void LzmaEnc_Init(CLzmaEnc *p)
++{
++  UInt32 i;
++  p->state = 0;
++  for (i = 0 ; i < LZMA_NUM_REPS; i++)
++    p->reps[i] = 0;
++
++  RangeEnc_Init(&p->rc);
++
++
++  for (i = 0; i < kNumStates; i++)
++  {
++    UInt32 j;
++    for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++)
++    {
++      p->isMatch[i][j] = kProbInitValue;
++      p->isRep0Long[i][j] = kProbInitValue;
++    }
++    p->isRep[i] = kProbInitValue;
++    p->isRepG0[i] = kProbInitValue;
++    p->isRepG1[i] = kProbInitValue;
++    p->isRepG2[i] = kProbInitValue;
++  }
++
++  {
++    UInt32 num = 0x300 << (p->lp + p->lc);
++    for (i = 0; i < num; i++)
++      p->litProbs[i] = kProbInitValue;
++  }
++
++  {
++    for (i = 0; i < kNumLenToPosStates; i++)
++    {
++      CLzmaProb *probs = p->posSlotEncoder[i];
++      UInt32 j;
++      for (j = 0; j < (1 << kNumPosSlotBits); j++)
++        probs[j] = kProbInitValue;
++    }
++  }
++  {
++    for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++)
++      p->posEncoders[i] = kProbInitValue;
++  }
++
++  LenEnc_Init(&p->lenEnc.p);
++  LenEnc_Init(&p->repLenEnc.p);
++
++  for (i = 0; i < (1 << kNumAlignBits); i++)
++    p->posAlignEncoder[i] = kProbInitValue;
++
++  p->optimumEndIndex = 0;
++  p->optimumCurrentIndex = 0;
++  p->additionalOffset = 0;
++
++  p->pbMask = (1 << p->pb) - 1;
++  p->lpMask = (1 << p->lp) - 1;
++}
++
++void LzmaEnc_InitPrices(CLzmaEnc *p)
++{
++  if (!p->fastMode)
++  {
++    FillDistancesPrices(p);
++    FillAlignPrices(p);
++  }
++
++  p->lenEnc.tableSize =
++  p->repLenEnc.tableSize =
++      p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN;
++  LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices);
++  LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices);
++}
++
++static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
++{
++  UInt32 i;
++  for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++)
++    if (p->dictSize <= ((UInt32)1 << i))
++      break;
++  p->distTableSize = i * 2;
++
++  p->finished = False;
++  p->result = SZ_OK;
++  RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig));
++  LzmaEnc_Init(p);
++  LzmaEnc_InitPrices(p);
++  p->nowPos64 = 0;
++  return SZ_OK;
++}
++
++static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,
++    ISzAlloc *alloc, ISzAlloc *allocBig)
++{
++  CLzmaEnc *p = (CLzmaEnc *)pp;
++  p->matchFinderBase.stream = inStream;
++  p->needInit = 1;
++  p->rc.outStream = outStream;
++  return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);
++}
++
++SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,
++    ISeqInStream *inStream, UInt32 keepWindowSize,
++    ISzAlloc *alloc, ISzAlloc *allocBig)
++{
++  CLzmaEnc *p = (CLzmaEnc *)pp;
++  p->matchFinderBase.stream = inStream;
++  p->needInit = 1;
++  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
++}
++
++static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)
++{
++  p->matchFinderBase.directInput = 1;
++  p->matchFinderBase.bufferBase = (Byte *)src;
++  p->matchFinderBase.directInputRem = srcLen;
++}
++
++SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
++    UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
++{
++  CLzmaEnc *p = (CLzmaEnc *)pp;
++  LzmaEnc_SetInputBuf(p, src, srcLen);
++  p->needInit = 1;
++
++  return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
++}
++
++void LzmaEnc_Finish(CLzmaEncHandle pp)
++{
++  #ifndef _7ZIP_ST
++  CLzmaEnc *p = (CLzmaEnc *)pp;
++  if (p->mtMode)
++    MatchFinderMt_ReleaseStream(&p->matchFinderMt);
++  #else
++  pp = pp;
++  #endif
++}
++
++typedef struct
++{
++  ISeqOutStream funcTable;
++  Byte *data;
++  SizeT rem;
++  Bool overflow;
++} CSeqOutStreamBuf;
++
++static size_t MyWrite(void *pp, const void *data, size_t size)
++{
++  CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp;
++  if (p->rem < size)
++  {
++    size = p->rem;
++    p->overflow = True;
++  }
++  memcpy(p->data, data, size);
++  p->rem -= size;
++  p->data += size;
++  return size;
++}
++
++
++UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
++{
++  const CLzmaEnc *p = (CLzmaEnc *)pp;
++  return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
++}
++
++const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)
++{
++  const CLzmaEnc *p = (CLzmaEnc *)pp;
++  return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
++}
++
++SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
++    Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
++{
++  CLzmaEnc *p = (CLzmaEnc *)pp;
++  UInt64 nowPos64;
++  SRes res;
++  CSeqOutStreamBuf outStream;
++
++  outStream.funcTable.Write = MyWrite;
++  outStream.data = dest;
++  outStream.rem = *destLen;
++  outStream.overflow = False;
++
++  p->writeEndMark = False;
++  p->finished = False;
++  p->result = SZ_OK;
++
++  if (reInit)
++    LzmaEnc_Init(p);
++  LzmaEnc_InitPrices(p);
++  nowPos64 = p->nowPos64;
++  RangeEnc_Init(&p->rc);
++  p->rc.outStream = &outStream.funcTable;
++
++  res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);
++
++  *unpackSize = (UInt32)(p->nowPos64 - nowPos64);
++  *destLen -= outStream.rem;
++  if (outStream.overflow)
++    return SZ_ERROR_OUTPUT_EOF;
++
++  return res;
++}
++
++static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)
++{
++  SRes res = SZ_OK;
++
++  #ifndef _7ZIP_ST
++  Byte allocaDummy[0x300];
++  int i = 0;
++  for (i = 0; i < 16; i++)
++    allocaDummy[i] = (Byte)i;
++  #endif
++
++  for (;;)
++  {
++    res = LzmaEnc_CodeOneBlock(p, False, 0, 0);
++    if (res != SZ_OK || p->finished != 0)
++      break;
++    if (progress != 0)
++    {
++      res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc));
++      if (res != SZ_OK)
++      {
++        res = SZ_ERROR_PROGRESS;
++        break;
++      }
++    }
++  }
++  LzmaEnc_Finish(p);
++  return res;
++}
++
++SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,
++    ISzAlloc *alloc, ISzAlloc *allocBig)
++{
++  RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));
++  return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);
++}
++
++SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)
++{
++  CLzmaEnc *p = (CLzmaEnc *)pp;
++  int i;
++  UInt32 dictSize = p->dictSize;
++  if (*size < LZMA_PROPS_SIZE)
++    return SZ_ERROR_PARAM;
++  *size = LZMA_PROPS_SIZE;
++  props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc);
++
++  for (i = 11; i <= 30; i++)
++  {
++    if (dictSize <= ((UInt32)2 << i))
++    {
++      dictSize = (2 << i);
++      break;
++    }
++    if (dictSize <= ((UInt32)3 << i))
++    {
++      dictSize = (3 << i);
++      break;
++    }
++  }
++
++  for (i = 0; i < 4; i++)
++    props[1 + i] = (Byte)(dictSize >> (8 * i));
++  return SZ_OK;
++}
++
++SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
++    int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
++{
++  SRes res;
++  CLzmaEnc *p = (CLzmaEnc *)pp;
++
++  CSeqOutStreamBuf outStream;
++
++  LzmaEnc_SetInputBuf(p, src, srcLen);
++
++  outStream.funcTable.Write = MyWrite;
++  outStream.data = dest;
++  outStream.rem = *destLen;
++  outStream.overflow = False;
++
++  p->writeEndMark = writeEndMark;
++
++  p->rc.outStream = &outStream.funcTable;
++  res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig);
++  if (res == SZ_OK)
++    res = LzmaEnc_Encode2(p, progress);
++
++  *destLen -= outStream.rem;
++  if (outStream.overflow)
++    return SZ_ERROR_OUTPUT_EOF;
++  return res;
++}
++
++SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
++    const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
++    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
++{
++  CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);
++  SRes res;
++  if (p == 0)
++    return SZ_ERROR_MEM;
++
++  res = LzmaEnc_SetProps(p, props);
++  if (res == SZ_OK)
++  {
++    res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);
++    if (res == SZ_OK)
++      res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,
++          writeEndMark, progress, alloc, allocBig);
++  }
++
++  LzmaEnc_Destroy(p, alloc, allocBig);
++  return res;
++}
+--- /dev/null
++++ b/lib/lzma/Makefile
+@@ -0,0 +1,7 @@
++lzma_compress-objs := LzFind.o LzmaEnc.o
++lzma_decompress-objs := LzmaDec.o
++
++obj-$(CONFIG_LZMA_COMPRESS) += lzma_compress.o
++obj-$(CONFIG_LZMA_DECOMPRESS) += lzma_decompress.o
++
++EXTRA_CFLAGS += -Iinclude/linux -Iinclude/linux/lzma -include types.h
diff --git a/target/linux/generic/pending-6.0/532-jffs2_eofdetect.patch b/target/linux/generic/pending-6.0/532-jffs2_eofdetect.patch
new file mode 100644
index 000000000..744fbd0e2
--- /dev/null
+++ b/target/linux/generic/pending-6.0/532-jffs2_eofdetect.patch
@@ -0,0 +1,65 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: fs: jffs2: EOF marker
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ fs/jffs2/build.c | 10 ++++++++++
+ fs/jffs2/scan.c  | 21 +++++++++++++++++++--
+ 2 files changed, 29 insertions(+), 2 deletions(-)
+
+--- a/fs/jffs2/build.c
++++ b/fs/jffs2/build.c
+@@ -117,6 +117,16 @@ static int jffs2_build_filesystem(struct
+ 	dbg_fsbuild("scanned flash completely\n");
+ 	jffs2_dbg_dump_block_lists_nolock(c);
+ 
++	if (c->flags & (1 << 7)) {
++		printk("%s(): unlocking the mtd device... ", __func__);
++		mtd_unlock(c->mtd, 0, c->mtd->size);
++		printk("done.\n");
++
++		printk("%s(): erasing all blocks after the end marker... ", __func__);
++		jffs2_erase_pending_blocks(c, -1);
++		printk("done.\n");
++	}
++
+ 	dbg_fsbuild("pass 1 starting\n");
+ 	c->flags |= JFFS2_SB_FLAG_BUILDING;
+ 	/* Now scan the directory tree, increasing nlink according to every dirent found. */
+--- a/fs/jffs2/scan.c
++++ b/fs/jffs2/scan.c
+@@ -148,8 +148,14 @@ int jffs2_scan_medium(struct jffs2_sb_in
+ 		/* reset summary info for next eraseblock scan */
+ 		jffs2_sum_reset_collected(s);
+ 
+-		ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
+-						buf_size, s);
++		if (c->flags & (1 << 7)) {
++			if (mtd_block_isbad(c->mtd, jeb->offset))
++				ret = BLK_STATE_BADBLOCK;
++			else
++				ret = BLK_STATE_ALLFF;
++		} else
++			ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
++							buf_size, s);
+ 
+ 		if (ret < 0)
+ 			goto out;
+@@ -567,6 +573,17 @@ full_scan:
+ 			return err;
+ 	}
+ 
++	if ((buf[0] == 0xde) &&
++		(buf[1] == 0xad) &&
++		(buf[2] == 0xc0) &&
++		(buf[3] == 0xde)) {
++		/* end of filesystem. erase everything after this point */
++		printk("%s(): End of filesystem marker found at 0x%x\n", __func__, jeb->offset);
++		c->flags |= (1 << 7);
++
++		return BLK_STATE_ALLFF;
++	}
++
+ 	/* We temporarily use 'ofs' as a pointer into the buffer/jeb */
+ 	ofs = 0;
+ 	max_ofs = EMPTY_SCAN_SIZE(c->sector_size);
diff --git a/target/linux/generic/pending-6.0/600-netfilter_conntrack_flush.patch b/target/linux/generic/pending-6.0/600-netfilter_conntrack_flush.patch
new file mode 100644
index 000000000..e4b03b9c5
--- /dev/null
+++ b/target/linux/generic/pending-6.0/600-netfilter_conntrack_flush.patch
@@ -0,0 +1,88 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: netfilter: add support for flushing conntrack via /proc
+
+lede-commit 8193bbe59a74d34d6a26d4a8cb857b1952905314
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/netfilter/nf_conntrack_standalone.c | 59 ++++++++++++++++++++++++++++++++-
+ 1 file changed, 58 insertions(+), 1 deletion(-)
+
+--- a/net/netfilter/nf_conntrack_standalone.c
++++ b/net/netfilter/nf_conntrack_standalone.c
+@@ -9,6 +9,7 @@
+ #include <linux/percpu.h>
+ #include <linux/netdevice.h>
+ #include <linux/security.h>
++#include <linux/inet.h>
+ #include <net/net_namespace.h>
+ #ifdef CONFIG_SYSCTL
+ #include <linux/sysctl.h>
+@@ -465,6 +466,56 @@ static int ct_cpu_seq_show(struct seq_fi
+ 	return 0;
+ }
+ 
++struct kill_request {
++	u16 family;
++	union nf_inet_addr addr;
++};
++
++static int kill_matching(struct nf_conn *i, void *data)
++{
++	struct kill_request *kr = data;
++	struct nf_conntrack_tuple *t1 = &i->tuplehash[IP_CT_DIR_ORIGINAL].tuple;
++	struct nf_conntrack_tuple *t2 = &i->tuplehash[IP_CT_DIR_REPLY].tuple;
++
++	if (!kr->family)
++		return 1;
++
++	if (t1->src.l3num != kr->family)
++		return 0;
++
++	return (nf_inet_addr_cmp(&kr->addr, &t1->src.u3) ||
++	        nf_inet_addr_cmp(&kr->addr, &t1->dst.u3) ||
++	        nf_inet_addr_cmp(&kr->addr, &t2->src.u3) ||
++	        nf_inet_addr_cmp(&kr->addr, &t2->dst.u3));
++}
++
++static int ct_file_write(struct file *file, char *buf, size_t count)
++{
++	struct seq_file *seq = file->private_data;
++	struct net *net = seq_file_net(seq);
++	struct kill_request kr = { };
++
++	if (count == 0)
++		return 0;
++
++	if (count >= INET6_ADDRSTRLEN)
++		count = INET6_ADDRSTRLEN - 1;
++
++	if (strnchr(buf, count, ':')) {
++		kr.family = AF_INET6;
++		if (!in6_pton(buf, count, (void *)&kr.addr, '\n', NULL))
++			return -EINVAL;
++	} else if (strnchr(buf, count, '.')) {
++		kr.family = AF_INET;
++		if (!in4_pton(buf, count, (void *)&kr.addr, '\n', NULL))
++			return -EINVAL;
++	}
++
++
++
++	return 0;
++}
++
+ static const struct seq_operations ct_cpu_seq_ops = {
+ 	.start	= ct_cpu_seq_start,
+ 	.next	= ct_cpu_seq_next,
+@@ -478,8 +529,9 @@ static int nf_conntrack_standalone_init_
+ 	kuid_t root_uid;
+ 	kgid_t root_gid;
+ 
+-	pde = proc_create_net("nf_conntrack", 0440, net->proc_net, &ct_seq_ops,
+-			sizeof(struct ct_iter_state));
++	pde = proc_create_net_data_write("nf_conntrack", 0440, net->proc_net,
++					 &ct_seq_ops, &ct_file_write,
++					 sizeof(struct ct_iter_state), NULL);
+ 	if (!pde)
+ 		goto out_nf_conntrack;
+ 
diff --git a/target/linux/generic/pending-6.0/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/pending-6.0/610-netfilter_match_bypass_default_checks.patch
new file mode 100644
index 000000000..67aec69bf
--- /dev/null
+++ b/target/linux/generic/pending-6.0/610-netfilter_match_bypass_default_checks.patch
@@ -0,0 +1,110 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: add a new version of my netfilter speedup patches for linux 2.6.39 and 3.0
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/uapi/linux/netfilter_ipv4/ip_tables.h |  1 +
+ net/ipv4/netfilter/ip_tables.c                | 37 +++++++++++++++++++++++++++
+ 2 files changed, 38 insertions(+)
+
+--- a/include/uapi/linux/netfilter_ipv4/ip_tables.h
++++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h
+@@ -89,6 +89,7 @@ struct ipt_ip {
+ #define IPT_F_FRAG		0x01	/* Set if rule is a fragment rule */
+ #define IPT_F_GOTO		0x02	/* Set if jump is a goto */
+ #define IPT_F_MASK		0x03	/* All possible flag bits mask. */
++#define IPT_F_NO_DEF_MATCH	0x80	/* Internal: no default match rules present */
+ 
+ /* Values for "inv" field in struct ipt_ip. */
+ #define IPT_INV_VIA_IN		0x01	/* Invert the sense of IN IFACE. */
+--- a/net/ipv4/netfilter/ip_tables.c
++++ b/net/ipv4/netfilter/ip_tables.c
+@@ -50,6 +50,9 @@ ip_packet_match(const struct iphdr *ip,
+ {
+ 	unsigned long ret;
+ 
++	if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
++		return true;
++
+ 	if (NF_INVF(ipinfo, IPT_INV_SRCIP,
+ 		    (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||
+ 	    NF_INVF(ipinfo, IPT_INV_DSTIP,
+@@ -80,6 +83,29 @@ ip_packet_match(const struct iphdr *ip,
+ 	return true;
+ }
+ 
++static void
++ip_checkdefault(struct ipt_ip *ip)
++{
++	static const char iface_mask[IFNAMSIZ] = {};
++
++	if (ip->invflags || ip->flags & IPT_F_FRAG)
++		return;
++
++	if (memcmp(ip->iniface_mask, iface_mask, IFNAMSIZ) != 0)
++		return;
++
++	if (memcmp(ip->outiface_mask, iface_mask, IFNAMSIZ) != 0)
++		return;
++
++	if (ip->smsk.s_addr || ip->dmsk.s_addr)
++		return;
++
++	if (ip->proto)
++		return;
++
++	ip->flags |= IPT_F_NO_DEF_MATCH;
++}
++
+ static bool
+ ip_checkentry(const struct ipt_ip *ip)
+ {
+@@ -525,6 +551,8 @@ find_check_entry(struct ipt_entry *e, st
+ 	struct xt_mtchk_param mtpar;
+ 	struct xt_entry_match *ematch;
+ 
++	ip_checkdefault(&e->ip);
++
+ 	if (!xt_percpu_counter_alloc(alloc_state, &e->counters))
+ 		return -ENOMEM;
+ 
+@@ -819,6 +847,7 @@ copy_entries_to_user(unsigned int total_
+ 	const struct xt_table_info *private = table->private;
+ 	int ret = 0;
+ 	const void *loc_cpu_entry;
++	u8 flags;
+ 
+ 	counters = alloc_counters(table);
+ 	if (IS_ERR(counters))
+@@ -846,6 +875,14 @@ copy_entries_to_user(unsigned int total_
+ 			goto free_counters;
+ 		}
+ 
++		flags = e->ip.flags & IPT_F_MASK;
++		if (copy_to_user(userptr + off
++				 + offsetof(struct ipt_entry, ip.flags),
++				 &flags, sizeof(flags)) != 0) {
++			ret = -EFAULT;
++			goto free_counters;
++		}
++
+ 		for (i = sizeof(struct ipt_entry);
+ 		     i < e->target_offset;
+ 		     i += m->u.match_size) {
+@@ -1224,12 +1261,15 @@ compat_copy_entry_to_user(struct ipt_ent
+ 	compat_uint_t origsize;
+ 	const struct xt_entry_match *ematch;
+ 	int ret = 0;
++	u8 flags = e->ip.flags & IPT_F_MASK;
+ 
+ 	origsize = *size;
+ 	ce = *dstptr;
+ 	if (copy_to_user(ce, e, sizeof(struct ipt_entry)) != 0 ||
+ 	    copy_to_user(&ce->counters, &counters[i],
+-	    sizeof(counters[i])) != 0)
++	    sizeof(counters[i])) != 0 ||
++	    copy_to_user(&ce->ip.flags, &flags,
++	    sizeof(flags)) != 0)
+ 		return -EFAULT;
+ 
+ 	*dstptr += sizeof(struct compat_ipt_entry);
diff --git a/target/linux/generic/pending-6.0/611-netfilter_match_bypass_default_table.patch b/target/linux/generic/pending-6.0/611-netfilter_match_bypass_default_table.patch
new file mode 100644
index 000000000..dd557fd3e
--- /dev/null
+++ b/target/linux/generic/pending-6.0/611-netfilter_match_bypass_default_table.patch
@@ -0,0 +1,106 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: netfilter: match bypass default table
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/ipv4/netfilter/ip_tables.c | 79 +++++++++++++++++++++++++++++++-----------
+ 1 file changed, 58 insertions(+), 21 deletions(-)
+
+--- a/net/ipv4/netfilter/ip_tables.c
++++ b/net/ipv4/netfilter/ip_tables.c
+@@ -246,6 +246,33 @@ struct ipt_entry *ipt_next_entry(const s
+ 	return (void *)entry + entry->next_offset;
+ }
+ 
++static bool
++ipt_handle_default_rule(struct ipt_entry *e, unsigned int *verdict)
++{
++	struct xt_entry_target *t;
++	struct xt_standard_target *st;
++
++	if (e->target_offset != sizeof(struct ipt_entry))
++		return false;
++
++	if (!(e->ip.flags & IPT_F_NO_DEF_MATCH))
++		return false;
++
++	t = ipt_get_target(e);
++	if (t->u.kernel.target->target)
++		return false;
++
++	st = (struct xt_standard_target *) t;
++	if (st->verdict == XT_RETURN)
++		return false;
++
++	if (st->verdict >= 0)
++		return false;
++
++	*verdict = (unsigned)(-st->verdict) - 1;
++	return true;
++}
++
+ /* Returns one of the generic firewall policies, like NF_ACCEPT. */
+ unsigned int
+ ipt_do_table(void *priv,
+@@ -267,27 +294,28 @@ ipt_do_table(void *priv,
+ 	unsigned int addend;
+ 
+ 	/* Initialization */
++	WARN_ON(!(table->valid_hooks & (1 << hook)));
++	local_bh_disable();
++	private = READ_ONCE(table->private); /* Address dependency. */
++	cpu        = smp_processor_id();
++	table_base = private->entries;
++
++	e = get_entry(table_base, private->hook_entry[hook]);
++	if (ipt_handle_default_rule(e, &verdict)) {
++		struct xt_counters *counter;
++
++		counter = xt_get_this_cpu_counter(&e->counters);
++		ADD_COUNTER(*counter, skb->len, 1);
++		local_bh_enable();
++		return verdict;
++	}
++
+ 	stackidx = 0;
+ 	ip = ip_hdr(skb);
+ 	indev = state->in ? state->in->name : nulldevname;
+ 	outdev = state->out ? state->out->name : nulldevname;
+-	/* We handle fragments by dealing with the first fragment as
+-	 * if it was a normal packet.  All other fragments are treated
+-	 * normally, except that they will NEVER match rules that ask
+-	 * things we don't know, ie. tcp syn flag or ports).  If the
+-	 * rule is also a fragment-specific rule, non-fragments won't
+-	 * match it. */
+-	acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;
+-	acpar.thoff   = ip_hdrlen(skb);
+-	acpar.hotdrop = false;
+-	acpar.state   = state;
+ 
+-	WARN_ON(!(table->valid_hooks & (1 << hook)));
+-	local_bh_disable();
+ 	addend = xt_write_recseq_begin();
+-	private = READ_ONCE(table->private); /* Address dependency. */
+-	cpu        = smp_processor_id();
+-	table_base = private->entries;
+ 	jumpstack  = (struct ipt_entry **)private->jumpstack[cpu];
+ 
+ 	/* Switch to alternate jumpstack if we're being invoked via TEE.
+@@ -300,7 +328,16 @@ ipt_do_table(void *priv,
+ 	if (static_key_false(&xt_tee_enabled))
+ 		jumpstack += private->stacksize * __this_cpu_read(nf_skb_duplicated);
+ 
+-	e = get_entry(table_base, private->hook_entry[hook]);
++	/* We handle fragments by dealing with the first fragment as
++	 * if it was a normal packet.  All other fragments are treated
++	 * normally, except that they will NEVER match rules that ask
++	 * things we don't know, ie. tcp syn flag or ports).  If the
++	 * rule is also a fragment-specific rule, non-fragments won't
++	 * match it. */
++	acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET;
++	acpar.thoff   = ip_hdrlen(skb);
++	acpar.hotdrop = false;
++	acpar.state   = state;
+ 
+ 	do {
+ 		const struct xt_entry_target *t;
diff --git a/target/linux/generic/pending-6.0/612-netfilter_match_reduce_memory_access.patch b/target/linux/generic/pending-6.0/612-netfilter_match_reduce_memory_access.patch
new file mode 100644
index 000000000..79da6778b
--- /dev/null
+++ b/target/linux/generic/pending-6.0/612-netfilter_match_reduce_memory_access.patch
@@ -0,0 +1,22 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: netfilter: reduce match memory access
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/ipv4/netfilter/ip_tables.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/net/ipv4/netfilter/ip_tables.c
++++ b/net/ipv4/netfilter/ip_tables.c
+@@ -53,9 +53,9 @@ ip_packet_match(const struct iphdr *ip,
+ 	if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
+ 		return true;
+ 
+-	if (NF_INVF(ipinfo, IPT_INV_SRCIP,
++	if (NF_INVF(ipinfo, IPT_INV_SRCIP, ipinfo->smsk.s_addr &&
+ 		    (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||
+-	    NF_INVF(ipinfo, IPT_INV_DSTIP,
++	    NF_INVF(ipinfo, IPT_INV_DSTIP, ipinfo->dmsk.s_addr &&
+ 		    (ip->daddr & ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr))
+ 		return false;
+ 
diff --git a/target/linux/generic/pending-6.0/613-netfilter_optional_tcp_window_check.patch b/target/linux/generic/pending-6.0/613-netfilter_optional_tcp_window_check.patch
new file mode 100644
index 000000000..a262ad680
--- /dev/null
+++ b/target/linux/generic/pending-6.0/613-netfilter_optional_tcp_window_check.patch
@@ -0,0 +1,83 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: netfilter: optional tcp window check
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Christian 'Ansuel' Marangi <ansuelsmth@gmail.com>
+---
+ net/netfilter/nf_conntrack_proto_tcp.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+--- a/net/netfilter/nf_conntrack_proto_tcp.c
++++ b/net/netfilter/nf_conntrack_proto_tcp.c
+@@ -490,6 +490,9 @@ static bool tcp_in_window(struct nf_conn
+ 	s32 receiver_offset;
+ 	bool res, in_recv_win;
+ 
++	if (tn->tcp_no_window_check)
++		return true;
++
+ 	/*
+ 	 * Get the required data from the packet.
+ 	 */
+@@ -1161,7 +1164,7 @@ int nf_conntrack_tcp_packet(struct nf_co
+ 		 IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED &&
+ 		 timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK])
+ 		timeout = timeouts[TCP_CONNTRACK_UNACK];
+-	else if (ct->proto.tcp.last_win == 0 &&
++	else if (!tn->tcp_no_window_check && ct->proto.tcp.last_win == 0 &&
+ 		 timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS])
+ 		timeout = timeouts[TCP_CONNTRACK_RETRANS];
+ 	else
+@@ -1477,6 +1480,9 @@ void nf_conntrack_tcp_init_net(struct ne
+ 	 */
+ 	tn->tcp_be_liberal = 0;
+ 
++	/* Skip Windows Check */
++	tn->tcp_no_window_check = 0;
++
+ 	/* If it's non-zero, we turn off RST sequence number check */
+ 	tn->tcp_ignore_invalid_rst = 0;
+ 
+--- a/net/netfilter/nf_conntrack_standalone.c
++++ b/net/netfilter/nf_conntrack_standalone.c
+@@ -635,6 +635,7 @@ enum nf_ct_sysctl_index {
+ #endif
+ 	NF_SYSCTL_CT_PROTO_TCP_LOOSE,
+ 	NF_SYSCTL_CT_PROTO_TCP_LIBERAL,
++	NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK,
+ 	NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST,
+ 	NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS,
+ 	NF_SYSCTL_CT_PROTO_TIMEOUT_UDP,
+@@ -843,6 +844,14 @@ static struct ctl_table nf_ct_sysctl_tab
+ 		.extra1 	= SYSCTL_ZERO,
+ 		.extra2 	= SYSCTL_ONE,
+ 	},
++	[NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK] = {
++		.procname       = "nf_conntrack_tcp_no_window_check",
++		.maxlen         = sizeof(u8),
++		.mode           = 0644,
++		.proc_handler	= proc_dou8vec_minmax,
++		.extra1 	= SYSCTL_ZERO,
++		.extra2 	= SYSCTL_ONE,
++	},
+ 	[NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST] = {
+ 		.procname	= "nf_conntrack_tcp_ignore_invalid_rst",
+ 		.maxlen		= sizeof(u8),
+@@ -1059,6 +1068,7 @@ static void nf_conntrack_standalone_init
+ 
+ 	XASSIGN(LOOSE, &tn->tcp_loose);
+ 	XASSIGN(LIBERAL, &tn->tcp_be_liberal);
++	XASSIGN(NO_WINDOW_CHECK, &tn->tcp_no_window_check);
+ 	XASSIGN(MAX_RETRANS, &tn->tcp_max_retrans);
+ 	XASSIGN(IGNORE_INVALID_RST, &tn->tcp_ignore_invalid_rst);
+ #undef XASSIGN
+--- a/include/net/netns/conntrack.h
++++ b/include/net/netns/conntrack.h
+@@ -26,6 +26,7 @@ struct nf_tcp_net {
+ 	unsigned int timeouts[TCP_CONNTRACK_TIMEOUT_MAX];
+ 	u8 tcp_loose;
+ 	u8 tcp_be_liberal;
++	u8 tcp_no_window_check;
+ 	u8 tcp_max_retrans;
+ 	u8 tcp_ignore_invalid_rst;
+ #if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
diff --git a/target/linux/generic/pending-6.0/620-net_sched-codel-do-not-defer-queue-length-update.patch b/target/linux/generic/pending-6.0/620-net_sched-codel-do-not-defer-queue-length-update.patch
new file mode 100644
index 000000000..4b4825ae3
--- /dev/null
+++ b/target/linux/generic/pending-6.0/620-net_sched-codel-do-not-defer-queue-length-update.patch
@@ -0,0 +1,86 @@
+From: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
+Date: Mon, 21 Aug 2017 11:14:14 +0300
+Subject: [PATCH] net_sched/codel: do not defer queue length update
+
+When codel wants to drop last packet in ->dequeue() it cannot call
+qdisc_tree_reduce_backlog() right away - it will notify parent qdisc
+about zero qlen and HTB/HFSC will deactivate class. The same class will
+be deactivated second time by caller of ->dequeue(). Currently codel and
+fq_codel defer update. This triggers warning in HFSC when it's qlen != 0
+but there is no active classes.
+
+This patch update parent queue length immediately: just temporary increase
+qlen around qdisc_tree_reduce_backlog() to prevent first class deactivation
+if we have skb to return.
+
+This might open another problem in HFSC - now operation peek could fail and
+deactivate parent class.
+
+Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581
+---
+
+--- a/net/sched/sch_codel.c
++++ b/net/sched/sch_codel.c
+@@ -95,11 +95,17 @@ static struct sk_buff *codel_qdisc_deque
+ 			    &q->stats, qdisc_pkt_len, codel_get_enqueue_time,
+ 			    drop_func, dequeue_func);
+ 
+-	/* We cant call qdisc_tree_reduce_backlog() if our qlen is 0,
+-	 * or HTB crashes. Defer it for next round.
++	/* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
++	 * parent class, dequeue in parent qdisc will do the same if we
++	 * return skb. Temporary increment qlen if we have skb.
+ 	 */
+-	if (q->stats.drop_count && sch->q.qlen) {
+-		qdisc_tree_reduce_backlog(sch, q->stats.drop_count, q->stats.drop_len);
++	if (q->stats.drop_count) {
++		if (skb)
++			sch->q.qlen++;
++		qdisc_tree_reduce_backlog(sch, q->stats.drop_count,
++					  q->stats.drop_len);
++		if (skb)
++			sch->q.qlen--;
+ 		q->stats.drop_count = 0;
+ 		q->stats.drop_len = 0;
+ 	}
+--- a/net/sched/sch_fq_codel.c
++++ b/net/sched/sch_fq_codel.c
+@@ -304,6 +304,21 @@ begin:
+ 			    &flow->cvars, &q->cstats, qdisc_pkt_len,
+ 			    codel_get_enqueue_time, drop_func, dequeue_func);
+ 
++	/* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
++	 * parent class, dequeue in parent qdisc will do the same if we
++	 * return skb. Temporary increment qlen if we have skb.
++	 */
++	if (q->cstats.drop_count) {
++		if (skb)
++			sch->q.qlen++;
++		qdisc_tree_reduce_backlog(sch, q->cstats.drop_count,
++					  q->cstats.drop_len);
++		if (skb)
++			sch->q.qlen--;
++		q->cstats.drop_count = 0;
++		q->cstats.drop_len = 0;
++	}
++
+ 	if (!skb) {
+ 		/* force a pass through old_flows to prevent starvation */
+ 		if ((head == &q->new_flows) && !list_empty(&q->old_flows))
+@@ -314,15 +329,6 @@ begin:
+ 	}
+ 	qdisc_bstats_update(sch, skb);
+ 	flow->deficit -= qdisc_pkt_len(skb);
+-	/* We cant call qdisc_tree_reduce_backlog() if our qlen is 0,
+-	 * or HTB crashes. Defer it for next round.
+-	 */
+-	if (q->cstats.drop_count && sch->q.qlen) {
+-		qdisc_tree_reduce_backlog(sch, q->cstats.drop_count,
+-					  q->cstats.drop_len);
+-		q->cstats.drop_count = 0;
+-		q->cstats.drop_len = 0;
+-	}
+ 	return skb;
+ }
+ 
diff --git a/target/linux/generic/pending-6.0/630-packet_socket_type.patch b/target/linux/generic/pending-6.0/630-packet_socket_type.patch
new file mode 100644
index 000000000..b11d87af2
--- /dev/null
+++ b/target/linux/generic/pending-6.0/630-packet_socket_type.patch
@@ -0,0 +1,138 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: net: add an optimization for dealing with raw sockets
+
+lede-commit: 4898039703d7315f0f3431c860123338ec3be0f6
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/uapi/linux/if_packet.h |  3 +++
+ net/packet/af_packet.c         | 34 +++++++++++++++++++++++++++-------
+ net/packet/internal.h          |  1 +
+ 3 files changed, 31 insertions(+), 7 deletions(-)
+
+--- a/include/uapi/linux/if_packet.h
++++ b/include/uapi/linux/if_packet.h
+@@ -33,6 +33,8 @@ struct sockaddr_ll {
+ #define PACKET_KERNEL		7		/* To kernel space	*/
+ /* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */
+ #define PACKET_FASTROUTE	6		/* Fastrouted frame	*/
++#define PACKET_MASK_ANY		0xffffffff	/* mask for packet type bits */
++
+ 
+ /* Packet socket options */
+ 
+@@ -59,6 +61,7 @@ struct sockaddr_ll {
+ #define PACKET_ROLLOVER_STATS		21
+ #define PACKET_FANOUT_DATA		22
+ #define PACKET_IGNORE_OUTGOING		23
++#define PACKET_RECV_TYPE		24
+ 
+ #define PACKET_FANOUT_HASH		0
+ #define PACKET_FANOUT_LB		1
+--- a/net/packet/af_packet.c
++++ b/net/packet/af_packet.c
+@@ -1861,6 +1861,7 @@ static int packet_rcv_spkt(struct sk_buf
+ {
+ 	struct sock *sk;
+ 	struct sockaddr_pkt *spkt;
++	struct packet_sock *po;
+ 
+ 	/*
+ 	 *	When we registered the protocol we saved the socket in the data
+@@ -1868,6 +1869,7 @@ static int packet_rcv_spkt(struct sk_buf
+ 	 */
+ 
+ 	sk = pt->af_packet_priv;
++	po = pkt_sk(sk);
+ 
+ 	/*
+ 	 *	Yank back the headers [hope the device set this
+@@ -1880,7 +1882,7 @@ static int packet_rcv_spkt(struct sk_buf
+ 	 *	so that this procedure is noop.
+ 	 */
+ 
+-	if (skb->pkt_type == PACKET_LOOPBACK)
++	if (!(po->pkt_type & (1 << skb->pkt_type)))
+ 		goto out;
+ 
+ 	if (!net_eq(dev_net(dev), sock_net(sk)))
+@@ -2128,12 +2130,12 @@ static int packet_rcv(struct sk_buff *sk
+ 	unsigned int snaplen, res;
+ 	bool is_drop_n_account = false;
+ 
+-	if (skb->pkt_type == PACKET_LOOPBACK)
+-		goto drop;
+-
+ 	sk = pt->af_packet_priv;
+ 	po = pkt_sk(sk);
+ 
++	if (!(po->pkt_type & (1 << skb->pkt_type)))
++		goto drop;
++
+ 	if (!net_eq(dev_net(dev), sock_net(sk)))
+ 		goto drop;
+ 
+@@ -2260,12 +2262,12 @@ static int tpacket_rcv(struct sk_buff *s
+ 	BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32);
+ 	BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);
+ 
+-	if (skb->pkt_type == PACKET_LOOPBACK)
+-		goto drop;
+-
+ 	sk = pt->af_packet_priv;
+ 	po = pkt_sk(sk);
+ 
++	if (!(po->pkt_type & (1 << skb->pkt_type)))
++		goto drop;
++
+ 	if (!net_eq(dev_net(dev), sock_net(sk)))
+ 		goto drop;
+ 
+@@ -3372,6 +3374,7 @@ static int packet_create(struct net *net
+ 	mutex_init(&po->pg_vec_lock);
+ 	po->rollover = NULL;
+ 	po->prot_hook.func = packet_rcv;
++	po->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK);
+ 
+ 	if (sock->type == SOCK_PACKET)
+ 		po->prot_hook.func = packet_rcv_spkt;
+@@ -4011,6 +4014,16 @@ packet_setsockopt(struct socket *sock, i
+ 		po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
+ 		return 0;
+ 	}
++	case PACKET_RECV_TYPE:
++	{
++		unsigned int val;
++		if (optlen != sizeof(val))
++			return -EINVAL;
++		if (copy_from_sockptr(&val, optval, sizeof(val)))
++			return -EFAULT;
++		po->pkt_type = val & ~BIT(PACKET_LOOPBACK);
++		return 0;
++	}
+ 	default:
+ 		return -ENOPROTOOPT;
+ 	}
+@@ -4067,6 +4080,13 @@ static int packet_getsockopt(struct sock
+ 	case PACKET_VNET_HDR:
+ 		val = po->has_vnet_hdr;
+ 		break;
++	case PACKET_RECV_TYPE:
++		if (len > sizeof(unsigned int))
++			len = sizeof(unsigned int);
++		val = po->pkt_type;
++
++		data = &val;
++		break;
+ 	case PACKET_VERSION:
+ 		val = po->tp_version;
+ 		break;
+--- a/net/packet/internal.h
++++ b/net/packet/internal.h
+@@ -137,6 +137,7 @@ struct packet_sock {
+ 	int			(*xmit)(struct sk_buff *skb);
+ 	struct packet_type	prot_hook ____cacheline_aligned_in_smp;
+ 	atomic_t		tp_drops ____cacheline_aligned_in_smp;
++	unsigned int		pkt_type;
+ };
+ 
+ static inline struct packet_sock *pkt_sk(struct sock *sk)
diff --git a/target/linux/generic/pending-6.0/655-increase_skb_pad.patch b/target/linux/generic/pending-6.0/655-increase_skb_pad.patch
new file mode 100644
index 000000000..b117a3e61
--- /dev/null
+++ b/target/linux/generic/pending-6.0/655-increase_skb_pad.patch
@@ -0,0 +1,20 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: add a few patches for avoiding unnecessary skb reallocations - significantly improves ethernet<->wireless performance
+
+lede-commit: 6f89cffc9add6939d44a6b54cf9a5e77849aa7fd
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/skbuff.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -2984,7 +2984,7 @@ static inline int pskb_network_may_pull(
+  * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
+  */
+ #ifndef NET_SKB_PAD
+-#define NET_SKB_PAD	max(32, L1_CACHE_BYTES)
++#define NET_SKB_PAD	max(64, L1_CACHE_BYTES)
+ #endif
+ 
+ int ___pskb_trim(struct sk_buff *skb, unsigned int len);
diff --git a/target/linux/generic/pending-6.0/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch b/target/linux/generic/pending-6.0/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch
new file mode 100644
index 000000000..b05891bcf
--- /dev/null
+++ b/target/linux/generic/pending-6.0/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch
@@ -0,0 +1,511 @@
+From: Steven Barth <steven@midlink.org>
+Subject: Add support for MAP-E FMRs (mesh mode)
+
+MAP-E FMRs (draft-ietf-softwire-map-10) are rules for IPv4-communication
+between MAP CEs (mesh mode) without the need to forward such data to a
+border relay. This is similar to how 6rd works but for IPv4 over IPv6.
+
+Signed-off-by: Steven Barth <cyrus@openwrt.org>
+---
+ include/net/ip6_tunnel.h       |  13 ++
+ include/uapi/linux/if_tunnel.h |  13 ++
+ net/ipv6/ip6_tunnel.c          | 276 +++++++++++++++++++++++++++++++++++++++--
+ 3 files changed, 291 insertions(+), 11 deletions(-)
+
+--- a/include/net/ip6_tunnel.h
++++ b/include/net/ip6_tunnel.h
+@@ -18,6 +18,18 @@
+ /* determine capability on a per-packet basis */
+ #define IP6_TNL_F_CAP_PER_PACKET 0x40000
+ 
++/* IPv6 tunnel FMR */
++struct __ip6_tnl_fmr {
++	struct __ip6_tnl_fmr *next; /* next fmr in list */
++	struct in6_addr ip6_prefix;
++	struct in_addr ip4_prefix;
++
++	__u8 ip6_prefix_len;
++	__u8 ip4_prefix_len;
++	__u8 ea_len;
++	__u8 offset;
++};
++
+ struct __ip6_tnl_parm {
+ 	char name[IFNAMSIZ];	/* name of tunnel device */
+ 	int link;		/* ifindex of underlying L2 interface */
+@@ -29,6 +41,7 @@ struct __ip6_tnl_parm {
+ 	__u32 flags;		/* tunnel flags */
+ 	struct in6_addr laddr;	/* local tunnel end-point address */
+ 	struct in6_addr raddr;	/* remote tunnel end-point address */
++	struct __ip6_tnl_fmr *fmrs;	/* FMRs */
+ 
+ 	__be16			i_flags;
+ 	__be16			o_flags;
+--- a/include/uapi/linux/if_tunnel.h
++++ b/include/uapi/linux/if_tunnel.h
+@@ -77,10 +77,23 @@ enum {
+ 	IFLA_IPTUN_ENCAP_DPORT,
+ 	IFLA_IPTUN_COLLECT_METADATA,
+ 	IFLA_IPTUN_FWMARK,
++	IFLA_IPTUN_FMRS,
+ 	__IFLA_IPTUN_MAX,
+ };
+ #define IFLA_IPTUN_MAX	(__IFLA_IPTUN_MAX - 1)
+ 
++enum {
++	IFLA_IPTUN_FMR_UNSPEC,
++	IFLA_IPTUN_FMR_IP6_PREFIX,
++	IFLA_IPTUN_FMR_IP4_PREFIX,
++	IFLA_IPTUN_FMR_IP6_PREFIX_LEN,
++	IFLA_IPTUN_FMR_IP4_PREFIX_LEN,
++	IFLA_IPTUN_FMR_EA_LEN,
++	IFLA_IPTUN_FMR_OFFSET,
++	__IFLA_IPTUN_FMR_MAX,
++};
++#define IFLA_IPTUN_FMR_MAX (__IFLA_IPTUN_FMR_MAX - 1)
++
+ enum tunnel_encap_types {
+ 	TUNNEL_ENCAP_NONE,
+ 	TUNNEL_ENCAP_FOU,
+--- a/net/ipv6/ip6_tunnel.c
++++ b/net/ipv6/ip6_tunnel.c
+@@ -11,6 +11,9 @@
+  *      linux/net/ipv6/sit.c and linux/net/ipv4/ipip.c
+  *
+  *      RFC 2473
++ *
++ *      Changes:
++ *      Steven Barth <cyrus@openwrt.org>:           MAP-E FMR support
+  */
+ 
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+@@ -67,9 +70,9 @@ static bool log_ecn_error = true;
+ module_param(log_ecn_error, bool, 0644);
+ MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");
+ 
+-static u32 HASH(const struct in6_addr *addr1, const struct in6_addr *addr2)
++static u32 HASH(const struct in6_addr *addr)
+ {
+-	u32 hash = ipv6_addr_hash(addr1) ^ ipv6_addr_hash(addr2);
++	u32 hash = ipv6_addr_hash(addr);
+ 
+ 	return hash_32(hash, IP6_TUNNEL_HASH_SIZE_SHIFT);
+ }
+@@ -114,17 +117,33 @@ static struct ip6_tnl *
+ ip6_tnl_lookup(struct net *net, int link,
+ 	       const struct in6_addr *remote, const struct in6_addr *local)
+ {
+-	unsigned int hash = HASH(remote, local);
++	unsigned int hash = HASH(local);
+ 	struct ip6_tnl *t, *cand = NULL;
+ 	struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
+ 	struct in6_addr any;
+ 
+ 	for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {
+ 		if (!ipv6_addr_equal(local, &t->parms.laddr) ||
+-		    !ipv6_addr_equal(remote, &t->parms.raddr) ||
+ 		    !(t->dev->flags & IFF_UP))
+ 			continue;
+ 
++		if (!ipv6_addr_equal(remote, &t->parms.raddr)) {
++			struct __ip6_tnl_fmr *fmr;
++			bool found = false;
++
++			for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) {
++				if (!ipv6_prefix_equal(remote, &fmr->ip6_prefix,
++						       fmr->ip6_prefix_len))
++					continue;
++
++				found = true;
++				break;
++			}
++
++			if (!found)
++				continue;
++		}
++
+ 		if (link == t->parms.link)
+ 			return t;
+ 		else
+@@ -132,7 +151,7 @@ ip6_tnl_lookup(struct net *net, int link
+ 	}
+ 
+ 	memset(&any, 0, sizeof(any));
+-	hash = HASH(&any, local);
++	hash = HASH(local);
+ 	for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {
+ 		if (!ipv6_addr_equal(local, &t->parms.laddr) ||
+ 		    !ipv6_addr_any(&t->parms.raddr) ||
+@@ -145,7 +164,7 @@ ip6_tnl_lookup(struct net *net, int link
+ 			cand = t;
+ 	}
+ 
+-	hash = HASH(remote, &any);
++	hash = HASH(&any);
+ 	for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {
+ 		if (!ipv6_addr_equal(remote, &t->parms.raddr) ||
+ 		    !ipv6_addr_any(&t->parms.laddr) ||
+@@ -194,7 +213,7 @@ ip6_tnl_bucket(struct ip6_tnl_net *ip6n,
+ 
+ 	if (!ipv6_addr_any(remote) || !ipv6_addr_any(local)) {
+ 		prio = 1;
+-		h = HASH(remote, local);
++		h = HASH(local);
+ 	}
+ 	return &ip6n->tnls[prio][h];
+ }
+@@ -376,6 +395,12 @@ ip6_tnl_dev_uninit(struct net_device *de
+ 	struct net *net = t->net;
+ 	struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
+ 
++	while (t->parms.fmrs) {
++		struct __ip6_tnl_fmr *next = t->parms.fmrs->next;
++		kfree(t->parms.fmrs);
++		t->parms.fmrs = next;
++	}
++
+ 	if (dev == ip6n->fb_tnl_dev)
+ 		RCU_INIT_POINTER(ip6n->tnls_wc[0], NULL);
+ 	else
+@@ -788,6 +813,107 @@ int ip6_tnl_rcv_ctl(struct ip6_tnl *t,
+ }
+ EXPORT_SYMBOL_GPL(ip6_tnl_rcv_ctl);
+ 
++/**
++ * ip4ip6_fmr_calc - calculate target / source IPv6-address based on FMR
++ *   @dest: destination IPv6 address buffer
++ *   @skb: received socket buffer
++ *   @fmr: MAP FMR
++ *   @xmit: Calculate for xmit or rcv
++ **/
++static void ip4ip6_fmr_calc(struct in6_addr *dest,
++		const struct iphdr *iph, const uint8_t *end,
++		const struct __ip6_tnl_fmr *fmr, bool xmit)
++{
++	int psidlen = fmr->ea_len - (32 - fmr->ip4_prefix_len);
++	u8 *portp = NULL;
++	bool use_dest_addr;
++	const struct iphdr *dsth = iph;
++
++	if ((u8*)dsth >= end)
++		return;
++
++	/* find significant IP header */
++	if (iph->protocol == IPPROTO_ICMP) {
++		struct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4);
++		if (ih && ((u8*)&ih[1]) <= end && (
++			ih->type == ICMP_DEST_UNREACH ||
++			ih->type == ICMP_SOURCE_QUENCH ||
++			ih->type == ICMP_TIME_EXCEEDED ||
++			ih->type == ICMP_PARAMETERPROB ||
++			ih->type == ICMP_REDIRECT))
++				dsth = (const struct iphdr*)&ih[1];
++	}
++
++	/* in xmit-path use dest port by default and source port only if
++		this is an ICMP reply to something else; vice versa in rcv-path */
++	use_dest_addr = (xmit && dsth == iph) || (!xmit && dsth != iph);
++
++	/* get dst port */
++	if (((u8*)&dsth[1]) <= end && (
++		dsth->protocol == IPPROTO_UDP ||
++		dsth->protocol == IPPROTO_TCP ||
++		dsth->protocol == IPPROTO_SCTP ||
++		dsth->protocol == IPPROTO_DCCP)) {
++			/* for UDP, TCP, SCTP and DCCP source and dest port
++			follow IPv4 header directly */
++			portp = ((u8*)dsth) + dsth->ihl * 4;
++
++			if (use_dest_addr)
++				portp += sizeof(u16);
++	} else if (iph->protocol == IPPROTO_ICMP) {
++		struct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4);
++
++		/* use icmp identifier as port */
++		if (((u8*)&ih) <= end && (
++		    (use_dest_addr && (
++		    ih->type == ICMP_ECHOREPLY ||
++			ih->type == ICMP_TIMESTAMPREPLY ||
++			ih->type == ICMP_INFO_REPLY ||
++			ih->type == ICMP_ADDRESSREPLY)) ||
++			(!use_dest_addr && (
++			ih->type == ICMP_ECHO ||
++			ih->type == ICMP_TIMESTAMP ||
++			ih->type == ICMP_INFO_REQUEST ||
++			ih->type == ICMP_ADDRESS)
++			)))
++				portp = (u8*)&ih->un.echo.id;
++	}
++
++	if ((portp && &portp[2] <= end) || psidlen == 0) {
++		int frombyte = fmr->ip6_prefix_len / 8;
++		int fromrem = fmr->ip6_prefix_len % 8;
++		int bytes = sizeof(struct in6_addr) - frombyte;
++		const u32 *addr = (use_dest_addr) ? &iph->daddr : &iph->saddr;
++		u64 eabits = ((u64)ntohl(*addr)) << (32 + fmr->ip4_prefix_len);
++		u64 t = 0;
++
++		/* extract PSID from port and add it to eabits */
++		u16 psidbits = 0;
++		if (psidlen > 0) {
++			psidbits = ((u16)portp[0]) << 8 | ((u16)portp[1]);
++			psidbits >>= 16 - psidlen - fmr->offset;
++			psidbits = (u16)(psidbits << (16 - psidlen));
++			eabits |= ((u64)psidbits) << (48 - (fmr->ea_len - psidlen));
++		}
++
++		/* rewrite destination address */
++		*dest = fmr->ip6_prefix;
++		memcpy(&dest->s6_addr[10], addr, sizeof(*addr));
++		dest->s6_addr16[7] = htons(psidbits >> (16 - psidlen));
++
++		if (bytes > sizeof(u64))
++			bytes = sizeof(u64);
++
++		/* insert eabits */
++		memcpy(&t, &dest->s6_addr[frombyte], bytes);
++		t = be64_to_cpu(t) & ~(((((u64)1) << fmr->ea_len) - 1)
++			<< (64 - fmr->ea_len - fromrem));
++		t = cpu_to_be64(t | (eabits >> fromrem));
++		memcpy(&dest->s6_addr[frombyte], &t, bytes);
++	}
++}
++
++
+ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
+ 			 const struct tnl_ptk_info *tpi,
+ 			 struct metadata_dst *tun_dst,
+@@ -840,6 +966,27 @@ static int __ip6_tnl_rcv(struct ip6_tnl
+ 	skb_reset_network_header(skb);
+ 	memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
+ 
++	if (tpi->proto == htons(ETH_P_IP) && tunnel->parms.fmrs &&
++		!ipv6_addr_equal(&ipv6h->saddr, &tunnel->parms.raddr)) {
++			/* Packet didn't come from BR, so lookup FMR */
++			struct __ip6_tnl_fmr *fmr;
++			struct in6_addr expected = tunnel->parms.raddr;
++			for (fmr = tunnel->parms.fmrs; fmr; fmr = fmr->next)
++				if (ipv6_prefix_equal(&ipv6h->saddr,
++					&fmr->ip6_prefix, fmr->ip6_prefix_len))
++						break;
++
++			/* Check that IPv6 matches IPv4 source to prevent spoofing */
++			if (fmr)
++				ip4ip6_fmr_calc(&expected, ip_hdr(skb),
++						skb_tail_pointer(skb), fmr, false);
++
++			if (!ipv6_addr_equal(&ipv6h->saddr, &expected)) {
++				rcu_read_unlock();
++				goto drop;
++			}
++	}
++
+ 	__skb_tunnel_rx(skb, tunnel->dev, tunnel->net);
+ 
+ 	err = dscp_ecn_decapsulate(tunnel, ipv6h, skb);
+@@ -987,6 +1134,7 @@ static void init_tel_txopt(struct ipv6_t
+ 	opt->ops.opt_nflen = 8;
+ }
+ 
++
+ /**
+  * ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
+  *   @t: the outgoing tunnel device
+@@ -1278,6 +1426,7 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str
+ 		u8 protocol)
+ {
+ 	struct ip6_tnl *t = netdev_priv(dev);
++	struct __ip6_tnl_fmr *fmr;
+ 	struct ipv6hdr *ipv6h;
+ 	const struct iphdr  *iph;
+ 	int encap_limit = -1;
+@@ -1377,6 +1526,18 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str
+ 	fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL);
+ 	dsfield = INET_ECN_encapsulate(dsfield, orig_dsfield);
+ 
++	/* try to find matching FMR */
++	for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) {
++		unsigned mshift = 32 - fmr->ip4_prefix_len;
++		if (ntohl(fmr->ip4_prefix.s_addr) >> mshift ==
++				ntohl(ip_hdr(skb)->daddr) >> mshift)
++			break;
++	}
++
++	/* change dstaddr according to FMR */
++	if (fmr)
++		ip4ip6_fmr_calc(&fl6.daddr, ip_hdr(skb), skb_tail_pointer(skb), fmr, true);
++
+ 	if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
+ 		return -1;
+ 
+@@ -1529,6 +1690,14 @@ ip6_tnl_change(struct ip6_tnl *t, const
+ 	t->parms.link = p->link;
+ 	t->parms.proto = p->proto;
+ 	t->parms.fwmark = p->fwmark;
++
++	while (t->parms.fmrs) {
++		struct __ip6_tnl_fmr *next = t->parms.fmrs->next;
++		kfree(t->parms.fmrs);
++		t->parms.fmrs = next;
++	}
++	t->parms.fmrs = p->fmrs;
++
+ 	dst_cache_reset(&t->dst_cache);
+ 	ip6_tnl_link_config(t);
+ }
+@@ -1563,6 +1732,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_
+ 	p->flowinfo = u->flowinfo;
+ 	p->link = u->link;
+ 	p->proto = u->proto;
++	p->fmrs = NULL;
+ 	memcpy(p->name, u->name, sizeof(u->name));
+ }
+ 
+@@ -1949,6 +2119,15 @@ static int ip6_tnl_validate(struct nlatt
+ 	return 0;
+ }
+ 
++static const struct nla_policy ip6_tnl_fmr_policy[IFLA_IPTUN_FMR_MAX + 1] = {
++	[IFLA_IPTUN_FMR_IP6_PREFIX] = { .len = sizeof(struct in6_addr) },
++	[IFLA_IPTUN_FMR_IP4_PREFIX] = { .len = sizeof(struct in_addr) },
++	[IFLA_IPTUN_FMR_IP6_PREFIX_LEN] = { .type = NLA_U8 },
++	[IFLA_IPTUN_FMR_IP4_PREFIX_LEN] = { .type = NLA_U8 },
++	[IFLA_IPTUN_FMR_EA_LEN] = { .type = NLA_U8 },
++	[IFLA_IPTUN_FMR_OFFSET] = { .type = NLA_U8 }
++};
++
+ static void ip6_tnl_netlink_parms(struct nlattr *data[],
+ 				  struct __ip6_tnl_parm *parms)
+ {
+@@ -1986,6 +2165,46 @@ static void ip6_tnl_netlink_parms(struct
+ 
+ 	if (data[IFLA_IPTUN_FWMARK])
+ 		parms->fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]);
++
++	if (data[IFLA_IPTUN_FMRS]) {
++		unsigned rem;
++		struct nlattr *fmr;
++		nla_for_each_nested(fmr, data[IFLA_IPTUN_FMRS], rem) {
++			struct nlattr *fmrd[IFLA_IPTUN_FMR_MAX + 1], *c;
++			struct __ip6_tnl_fmr *nfmr;
++
++			nla_parse_nested(fmrd, IFLA_IPTUN_FMR_MAX,
++				fmr, ip6_tnl_fmr_policy, NULL);
++
++			if (!(nfmr = kzalloc(sizeof(*nfmr), GFP_KERNEL)))
++				continue;
++
++			nfmr->offset = 6;
++
++			if ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX]))
++				nla_memcpy(&nfmr->ip6_prefix, fmrd[IFLA_IPTUN_FMR_IP6_PREFIX],
++					sizeof(nfmr->ip6_prefix));
++
++			if ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX]))
++				nla_memcpy(&nfmr->ip4_prefix, fmrd[IFLA_IPTUN_FMR_IP4_PREFIX],
++					sizeof(nfmr->ip4_prefix));
++
++			if ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX_LEN]))
++				nfmr->ip6_prefix_len = nla_get_u8(c);
++
++			if ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX_LEN]))
++				nfmr->ip4_prefix_len = nla_get_u8(c);
++
++			if ((c = fmrd[IFLA_IPTUN_FMR_EA_LEN]))
++				nfmr->ea_len = nla_get_u8(c);
++
++			if ((c = fmrd[IFLA_IPTUN_FMR_OFFSET]))
++				nfmr->offset = nla_get_u8(c);
++
++			nfmr->next = parms->fmrs;
++			parms->fmrs = nfmr;
++		}
++	}
+ }
+ 
+ static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[],
+@@ -2102,6 +2321,12 @@ static void ip6_tnl_dellink(struct net_d
+ 
+ static size_t ip6_tnl_get_size(const struct net_device *dev)
+ {
++	const struct ip6_tnl *t = netdev_priv(dev);
++	struct __ip6_tnl_fmr *c;
++	int fmrs = 0;
++	for (c = t->parms.fmrs; c; c = c->next)
++		++fmrs;
++
+ 	return
+ 		/* IFLA_IPTUN_LINK */
+ 		nla_total_size(4) +
+@@ -2131,6 +2356,24 @@ static size_t ip6_tnl_get_size(const str
+ 		nla_total_size(0) +
+ 		/* IFLA_IPTUN_FWMARK */
+ 		nla_total_size(4) +
++		/* IFLA_IPTUN_FMRS */
++		nla_total_size(0) +
++		(
++			/* nest */
++			nla_total_size(0) +
++			/* IFLA_IPTUN_FMR_IP6_PREFIX */
++			nla_total_size(sizeof(struct in6_addr)) +
++			/* IFLA_IPTUN_FMR_IP4_PREFIX */
++			nla_total_size(sizeof(struct in_addr)) +
++			/* IFLA_IPTUN_FMR_EA_LEN */
++			nla_total_size(1) +
++			/* IFLA_IPTUN_FMR_IP6_PREFIX_LEN */
++			nla_total_size(1) +
++			/* IFLA_IPTUN_FMR_IP4_PREFIX_LEN */
++			nla_total_size(1) +
++			/* IFLA_IPTUN_FMR_OFFSET */
++			nla_total_size(1)
++		) * fmrs +
+ 		0;
+ }
+ 
+@@ -2138,6 +2381,9 @@ static int ip6_tnl_fill_info(struct sk_b
+ {
+ 	struct ip6_tnl *tunnel = netdev_priv(dev);
+ 	struct __ip6_tnl_parm *parm = &tunnel->parms;
++	struct __ip6_tnl_fmr *c;
++	int fmrcnt = 0;
++	struct nlattr *fmrs;
+ 
+ 	if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) ||
+ 	    nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) ||
+@@ -2147,9 +2393,27 @@ static int ip6_tnl_fill_info(struct sk_b
+ 	    nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) ||
+ 	    nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) ||
+ 	    nla_put_u8(skb, IFLA_IPTUN_PROTO, parm->proto) ||
+-	    nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark))
++	    nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark) ||
++	    !(fmrs = nla_nest_start(skb, IFLA_IPTUN_FMRS)))
+ 		goto nla_put_failure;
+ 
++	for (c = parm->fmrs; c; c = c->next) {
++		struct nlattr *fmr = nla_nest_start(skb, ++fmrcnt);
++		if (!fmr ||
++			nla_put(skb, IFLA_IPTUN_FMR_IP6_PREFIX,
++				sizeof(c->ip6_prefix), &c->ip6_prefix) ||
++			nla_put(skb, IFLA_IPTUN_FMR_IP4_PREFIX,
++				sizeof(c->ip4_prefix), &c->ip4_prefix) ||
++			nla_put_u8(skb, IFLA_IPTUN_FMR_IP6_PREFIX_LEN, c->ip6_prefix_len) ||
++			nla_put_u8(skb, IFLA_IPTUN_FMR_IP4_PREFIX_LEN, c->ip4_prefix_len) ||
++			nla_put_u8(skb, IFLA_IPTUN_FMR_EA_LEN, c->ea_len) ||
++			nla_put_u8(skb, IFLA_IPTUN_FMR_OFFSET, c->offset))
++				goto nla_put_failure;
++
++		nla_nest_end(skb, fmr);
++	}
++	nla_nest_end(skb, fmrs);
++
+ 	if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, tunnel->encap.type) ||
+ 	    nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, tunnel->encap.sport) ||
+ 	    nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) ||
+@@ -2189,6 +2453,7 @@ static const struct nla_policy ip6_tnl_p
+ 	[IFLA_IPTUN_ENCAP_DPORT]	= { .type = NLA_U16 },
+ 	[IFLA_IPTUN_COLLECT_METADATA]	= { .type = NLA_FLAG },
+ 	[IFLA_IPTUN_FWMARK]		= { .type = NLA_U32 },
++	[IFLA_IPTUN_FMRS]		= { .type = NLA_NESTED },
+ };
+ 
+ static struct rtnl_link_ops ip6_link_ops __read_mostly = {
diff --git a/target/linux/generic/pending-6.0/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch b/target/linux/generic/pending-6.0/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch
new file mode 100644
index 000000000..b9e64b46b
--- /dev/null
+++ b/target/linux/generic/pending-6.0/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch
@@ -0,0 +1,263 @@
+From: Jonas Gorski <jogo@openwrt.org>
+Subject: ipv6: allow rejecting with "source address failed policy"
+
+RFC6204 L-14 requires rejecting traffic from invalid addresses with
+ICMPv6 Destination Unreachable, Code 5 (Source address failed ingress/
+egress policy) on the LAN side, so add an appropriate rule for that.
+
+Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+---
+ include/net/netns/ipv6.h       |  1 +
+ include/uapi/linux/fib_rules.h |  4 +++
+ include/uapi/linux/rtnetlink.h |  1 +
+ net/ipv4/fib_semantics.c       |  4 +++
+ net/ipv4/fib_trie.c            |  1 +
+ net/ipv4/ipmr.c                |  1 +
+ net/ipv6/fib6_rules.c          |  4 +++
+ net/ipv6/ip6mr.c               |  2 ++
+ net/ipv6/route.c               | 58 +++++++++++++++++++++++++++++++++++++++++-
+ 9 files changed, 75 insertions(+), 1 deletion(-)
+
+--- a/include/net/netns/ipv6.h
++++ b/include/net/netns/ipv6.h
+@@ -85,6 +85,7 @@ struct netns_ipv6 {
+ 	unsigned int		fib6_routes_require_src;
+ #endif
+ 	struct rt6_info         *ip6_prohibit_entry;
++	struct rt6_info		*ip6_policy_failed_entry;
+ 	struct rt6_info         *ip6_blk_hole_entry;
+ 	struct fib6_table       *fib6_local_tbl;
+ 	struct fib_rules_ops    *fib6_rules_ops;
+--- a/include/uapi/linux/fib_rules.h
++++ b/include/uapi/linux/fib_rules.h
+@@ -82,6 +82,10 @@ enum {
+ 	FR_ACT_BLACKHOLE,	/* Drop without notification */
+ 	FR_ACT_UNREACHABLE,	/* Drop with ENETUNREACH */
+ 	FR_ACT_PROHIBIT,	/* Drop with EACCES */
++	FR_ACT_RES9,
++	FR_ACT_RES10,
++	FR_ACT_RES11,
++	FR_ACT_POLICY_FAILED,	/* Drop with EACCES */
+ 	__FR_ACT_MAX,
+ };
+ 
+--- a/include/uapi/linux/rtnetlink.h
++++ b/include/uapi/linux/rtnetlink.h
+@@ -265,6 +265,7 @@ enum {
+ 	RTN_THROW,		/* Not in this table		*/
+ 	RTN_NAT,		/* Translate this address	*/
+ 	RTN_XRESOLVE,		/* Use external resolver	*/
++	RTN_POLICY_FAILED,	/* Failed ingress/egress policy */
+ 	__RTN_MAX
+ };
+ 
+--- a/net/ipv4/fib_semantics.c
++++ b/net/ipv4/fib_semantics.c
+@@ -144,6 +144,10 @@ const struct fib_prop fib_props[RTN_MAX
+ 		.error	= -EINVAL,
+ 		.scope	= RT_SCOPE_NOWHERE,
+ 	},
++	[RTN_POLICY_FAILED] = {
++		.error	= -EACCES,
++		.scope	= RT_SCOPE_UNIVERSE,
++	},
+ };
+ 
+ static void rt_fibinfo_free(struct rtable __rcu **rtp)
+--- a/net/ipv4/fib_trie.c
++++ b/net/ipv4/fib_trie.c
+@@ -2776,6 +2776,7 @@ static const char *const rtn_type_names[
+ 	[RTN_THROW] = "THROW",
+ 	[RTN_NAT] = "NAT",
+ 	[RTN_XRESOLVE] = "XRESOLVE",
++	[RTN_POLICY_FAILED] = "POLICY_FAILED",
+ };
+ 
+ static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
+--- a/net/ipv4/ipmr.c
++++ b/net/ipv4/ipmr.c
+@@ -180,6 +180,7 @@ static int ipmr_rule_action(struct fib_r
+ 	case FR_ACT_UNREACHABLE:
+ 		return -ENETUNREACH;
+ 	case FR_ACT_PROHIBIT:
++	case FR_ACT_POLICY_FAILED:
+ 		return -EACCES;
+ 	case FR_ACT_BLACKHOLE:
+ 	default:
+--- a/net/ipv6/fib6_rules.c
++++ b/net/ipv6/fib6_rules.c
+@@ -221,6 +221,10 @@ static int __fib6_rule_action(struct fib
+ 		err = -EACCES;
+ 		rt = net->ipv6.ip6_prohibit_entry;
+ 		goto discard_pkt;
++	case FR_ACT_POLICY_FAILED:
++		err = -EACCES;
++		rt = net->ipv6.ip6_policy_failed_entry;
++		goto discard_pkt;
+ 	}
+ 
+ 	tb_id = fib_rule_get_table(rule, arg);
+--- a/net/ipv6/ip6mr.c
++++ b/net/ipv6/ip6mr.c
+@@ -170,6 +170,8 @@ static int ip6mr_rule_action(struct fib_
+ 		return -ENETUNREACH;
+ 	case FR_ACT_PROHIBIT:
+ 		return -EACCES;
++	case FR_ACT_POLICY_FAILED:
++		return -EACCES;
+ 	case FR_ACT_BLACKHOLE:
+ 	default:
+ 		return -EINVAL;
+--- a/net/ipv6/route.c
++++ b/net/ipv6/route.c
+@@ -97,6 +97,8 @@ static int		ip6_pkt_discard(struct sk_bu
+ static int		ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
+ static int		ip6_pkt_prohibit(struct sk_buff *skb);
+ static int		ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb);
++static int		ip6_pkt_policy_failed(struct sk_buff *skb);
++static int		ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb);
+ static void		ip6_link_failure(struct sk_buff *skb);
+ static void		ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
+ 					   struct sk_buff *skb, u32 mtu,
+@@ -317,6 +319,18 @@ static const struct rt6_info ip6_prohibi
+ 	.rt6i_flags	= (RTF_REJECT | RTF_NONEXTHOP),
+ };
+ 
++static const struct rt6_info ip6_policy_failed_entry_template = {
++	.dst = {
++		.__refcnt	= ATOMIC_INIT(1),
++		.__use		= 1,
++		.obsolete	= DST_OBSOLETE_FORCE_CHK,
++		.error		= -EACCES,
++		.input		= ip6_pkt_policy_failed,
++		.output		= ip6_pkt_policy_failed_out,
++	},
++	.rt6i_flags	= (RTF_REJECT | RTF_NONEXTHOP),
++};
++
+ static const struct rt6_info ip6_blk_hole_entry_template = {
+ 	.dst = {
+ 		.__refcnt	= ATOMIC_INIT(1),
+@@ -1036,6 +1050,7 @@ static const int fib6_prop[RTN_MAX + 1]
+ 	[RTN_BLACKHOLE]	= -EINVAL,
+ 	[RTN_UNREACHABLE] = -EHOSTUNREACH,
+ 	[RTN_PROHIBIT]	= -EACCES,
++	[RTN_POLICY_FAILED] = -EACCES,
+ 	[RTN_THROW]	= -EAGAIN,
+ 	[RTN_NAT]	= -EINVAL,
+ 	[RTN_XRESOLVE]	= -EINVAL,
+@@ -1071,6 +1086,10 @@ static void ip6_rt_init_dst_reject(struc
+ 		rt->dst.output = ip6_pkt_prohibit_out;
+ 		rt->dst.input = ip6_pkt_prohibit;
+ 		break;
++	case RTN_POLICY_FAILED:
++		rt->dst.output = ip6_pkt_policy_failed_out;
++		rt->dst.input = ip6_pkt_policy_failed;
++		break;
+ 	case RTN_THROW:
+ 	case RTN_UNREACHABLE:
+ 	default:
+@@ -4539,6 +4558,17 @@ static int ip6_pkt_prohibit_out(struct n
+ 	return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
+ }
+ 
++static int ip6_pkt_policy_failed(struct sk_buff *skb)
++{
++	return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_INNOROUTES);
++}
++
++static int ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb)
++{
++	skb->dev = skb_dst(skb)->dev;
++	return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_OUTNOROUTES);
++}
++
+ /*
+  *	Allocate a dst for local (unicast / anycast) address.
+  */
+@@ -5032,7 +5062,8 @@ static int rtm_to_fib6_config(struct sk_
+ 	if (rtm->rtm_type == RTN_UNREACHABLE ||
+ 	    rtm->rtm_type == RTN_BLACKHOLE ||
+ 	    rtm->rtm_type == RTN_PROHIBIT ||
+-	    rtm->rtm_type == RTN_THROW)
++	    rtm->rtm_type == RTN_THROW ||
++	    rtm->rtm_type == RTN_POLICY_FAILED)
+ 		cfg->fc_flags |= RTF_REJECT;
+ 
+ 	if (rtm->rtm_type == RTN_LOCAL)
+@@ -6285,6 +6316,8 @@ static int ip6_route_dev_notify(struct n
+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES
+ 		net->ipv6.ip6_prohibit_entry->dst.dev = dev;
+ 		net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
++		net->ipv6.ip6_policy_failed_entry->dst.dev = dev;
++		net->ipv6.ip6_policy_failed_entry->rt6i_idev = in6_dev_get(dev);
+ 		net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
+ 		net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
+ #endif
+@@ -6296,6 +6329,7 @@ static int ip6_route_dev_notify(struct n
+ 		in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES
+ 		in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
++		in6_dev_put_clear(&net->ipv6.ip6_policy_failed_entry->rt6i_idev);
+ 		in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);
+ #endif
+ 	}
+@@ -6487,6 +6521,8 @@ static int __net_init ip6_route_net_init
+ 
+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES
+ 	net->ipv6.fib6_has_custom_rules = false;
++
++
+ 	net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
+ 					       sizeof(*net->ipv6.ip6_prohibit_entry),
+ 					       GFP_KERNEL);
+@@ -6497,11 +6533,21 @@ static int __net_init ip6_route_net_init
+ 			 ip6_template_metrics, true);
+ 	INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->rt6i_uncached);
+ 
++	net->ipv6.ip6_policy_failed_entry =
++				kmemdup(&ip6_policy_failed_entry_template,
++				sizeof(*net->ipv6.ip6_policy_failed_entry), GFP_KERNEL);
++	if (!net->ipv6.ip6_policy_failed_entry)
++		goto out_ip6_prohibit_entry;
++	net->ipv6.ip6_policy_failed_entry->dst.ops = &net->ipv6.ip6_dst_ops;
++	dst_init_metrics(&net->ipv6.ip6_policy_failed_entry->dst,
++			 ip6_template_metrics, true);
++	INIT_LIST_HEAD(&net->ipv6.ip6_policy_failed_entry->rt6i_uncached);
++
+ 	net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,
+ 					       sizeof(*net->ipv6.ip6_blk_hole_entry),
+ 					       GFP_KERNEL);
+ 	if (!net->ipv6.ip6_blk_hole_entry)
+-		goto out_ip6_prohibit_entry;
++		goto out_ip6_policy_failed_entry;
+ 	net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
+ 	dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
+ 			 ip6_template_metrics, true);
+@@ -6528,6 +6574,8 @@ out:
+ 	return ret;
+ 
+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES
++out_ip6_policy_failed_entry:
++	kfree(net->ipv6.ip6_policy_failed_entry);
+ out_ip6_prohibit_entry:
+ 	kfree(net->ipv6.ip6_prohibit_entry);
+ out_ip6_null_entry:
+@@ -6547,6 +6595,7 @@ static void __net_exit ip6_route_net_exi
+ 	kfree(net->ipv6.ip6_null_entry);
+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES
+ 	kfree(net->ipv6.ip6_prohibit_entry);
++	kfree(net->ipv6.ip6_policy_failed_entry);
+ 	kfree(net->ipv6.ip6_blk_hole_entry);
+ #endif
+ 	dst_entries_destroy(&net->ipv6.ip6_dst_ops);
+@@ -6624,6 +6673,9 @@ void __init ip6_route_init_special_entri
+ 	init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
+ 	init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
+ 	init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
++	init_net.ipv6.ip6_policy_failed_entry->dst.dev = init_net.loopback_dev;
++	init_net.ipv6.ip6_policy_failed_entry->rt6i_idev =
++		in6_dev_get(init_net.loopback_dev);
+   #endif
+ }
+ 
diff --git a/target/linux/generic/pending-6.0/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch b/target/linux/generic/pending-6.0/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch
new file mode 100644
index 000000000..94416a5d7
--- /dev/null
+++ b/target/linux/generic/pending-6.0/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch
@@ -0,0 +1,50 @@
+From: Jonas Gorski <jogo@openwrt.org>
+Subject: net: provide defines for _POLICY_FAILED until all code is updated
+
+Upstream introduced ICMPV6_POLICY_FAIL for code 5 of destination
+unreachable, conflicting with our name.
+
+Add appropriate defines to allow our code to build with the new
+name until we have updated our local patches for older kernels
+and userspace packages.
+
+Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+---
+ include/uapi/linux/fib_rules.h | 2 ++
+ include/uapi/linux/icmpv6.h    | 2 ++
+ include/uapi/linux/rtnetlink.h | 2 ++
+ 3 files changed, 6 insertions(+)
+
+--- a/include/uapi/linux/fib_rules.h
++++ b/include/uapi/linux/fib_rules.h
+@@ -89,6 +89,8 @@ enum {
+ 	__FR_ACT_MAX,
+ };
+ 
++#define FR_ACT_FAILED_POLICY FR_ACT_POLICY_FAILED
++
+ #define FR_ACT_MAX (__FR_ACT_MAX - 1)
+ 
+ #endif
+--- a/include/uapi/linux/icmpv6.h
++++ b/include/uapi/linux/icmpv6.h
+@@ -126,6 +126,8 @@ struct icmp6hdr {
+ #define ICMPV6_POLICY_FAIL		5
+ #define ICMPV6_REJECT_ROUTE		6
+ 
++#define ICMPV6_FAILED_POLICY		ICMPV6_POLICY_FAIL
++
+ /*
+  *	Codes for Time Exceeded
+  */
+--- a/include/uapi/linux/rtnetlink.h
++++ b/include/uapi/linux/rtnetlink.h
+@@ -269,6 +269,8 @@ enum {
+ 	__RTN_MAX
+ };
+ 
++#define RTN_FAILED_POLICY RTN_POLICY_FAILED
++
+ #define RTN_MAX (__RTN_MAX - 1)
+ 
+ 
diff --git a/target/linux/generic/pending-6.0/680-NET-skip-GRO-for-foreign-MAC-addresses.patch b/target/linux/generic/pending-6.0/680-NET-skip-GRO-for-foreign-MAC-addresses.patch
new file mode 100644
index 000000000..a285b1e7b
--- /dev/null
+++ b/target/linux/generic/pending-6.0/680-NET-skip-GRO-for-foreign-MAC-addresses.patch
@@ -0,0 +1,139 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: net: replace GRO optimization patch with a new one that supports VLANs/bridges with different MAC addresses
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/netdevice.h |  2 ++
+ include/linux/skbuff.h    |  3 ++-
+ net/core/dev.c            | 48 +++++++++++++++++++++++++++++++++++++++++++++++
+ net/ethernet/eth.c        | 18 +++++++++++++++++-
+ 4 files changed, 69 insertions(+), 2 deletions(-)
+
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -2117,6 +2117,8 @@ struct net_device {
+ 	struct netdev_hw_addr_list	mc;
+ 	struct netdev_hw_addr_list	dev_addrs;
+ 
++	unsigned char		local_addr_mask[MAX_ADDR_LEN];
++
+ #ifdef CONFIG_SYSFS
+ 	struct kset		*queues_kset;
+ #endif
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -956,6 +956,7 @@ struct sk_buff {
+ #ifdef CONFIG_IPV6_NDISC_NODETYPE
+ 	__u8			ndisc_nodetype:2;
+ #endif
++	__u8			gro_skip:1;
+ 
+ 	__u8			ipvs_property:1;
+ 	__u8			inner_protocol_type:1;
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -7614,6 +7614,48 @@ static void __netdev_adjacent_dev_unlink
+ 					   &upper_dev->adj_list.lower);
+ }
+ 
++static void __netdev_addr_mask(unsigned char *mask, const unsigned char *addr,
++			       struct net_device *dev)
++{
++	int i;
++
++	for (i = 0; i < dev->addr_len; i++)
++		mask[i] |= addr[i] ^ dev->dev_addr[i];
++}
++
++static void __netdev_upper_mask(unsigned char *mask, struct net_device *dev,
++				struct net_device *lower)
++{
++	struct net_device *cur;
++	struct list_head *iter;
++
++	netdev_for_each_upper_dev_rcu(dev, cur, iter) {
++		__netdev_addr_mask(mask, cur->dev_addr, lower);
++		__netdev_upper_mask(mask, cur, lower);
++	}
++}
++
++static void __netdev_update_addr_mask(struct net_device *dev)
++{
++	unsigned char mask[MAX_ADDR_LEN];
++	struct net_device *cur;
++	struct list_head *iter;
++
++	memset(mask, 0, sizeof(mask));
++	__netdev_upper_mask(mask, dev, dev);
++	memcpy(dev->local_addr_mask, mask, dev->addr_len);
++
++	netdev_for_each_lower_dev(dev, cur, iter)
++		__netdev_update_addr_mask(cur);
++}
++
++static void netdev_update_addr_mask(struct net_device *dev)
++{
++	rcu_read_lock();
++	__netdev_update_addr_mask(dev);
++	rcu_read_unlock();
++}
++
+ static int __netdev_upper_dev_link(struct net_device *dev,
+ 				   struct net_device *upper_dev, bool master,
+ 				   void *upper_priv, void *upper_info,
+@@ -7665,6 +7707,7 @@ static int __netdev_upper_dev_link(struc
+ 	if (ret)
+ 		return ret;
+ 
++	netdev_update_addr_mask(dev);
+ 	ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
+ 					    &changeupper_info.info);
+ 	ret = notifier_to_errno(ret);
+@@ -7756,6 +7799,7 @@ static void __netdev_upper_dev_unlink(st
+ 
+ 	changeupper_info.master = netdev_master_upper_dev_get(dev) == upper_dev;
+ 
++	netdev_update_addr_mask(dev);
+ 	call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER,
+ 				      &changeupper_info.info);
+ 
+@@ -8813,6 +8857,7 @@ int dev_set_mac_address(struct net_devic
+ 	if (err)
+ 		return err;
+ 	dev->addr_assign_type = NET_ADDR_SET;
++	netdev_update_addr_mask(dev);
+ 	call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
+ 	add_device_randomness(dev->dev_addr, dev->addr_len);
+ 	return 0;
+--- a/net/ethernet/eth.c
++++ b/net/ethernet/eth.c
+@@ -143,6 +143,18 @@ u32 eth_get_headlen(const struct net_dev
+ }
+ EXPORT_SYMBOL(eth_get_headlen);
+ 
++static inline bool
++eth_check_local_mask(const void *addr1, const void *addr2, const void *mask)
++{
++	const u16 *a1 = addr1;
++	const u16 *a2 = addr2;
++	const u16 *m = mask;
++
++	return (((a1[0] ^ a2[0]) & ~m[0]) |
++		((a1[1] ^ a2[1]) & ~m[1]) |
++		((a1[2] ^ a2[2]) & ~m[2]));
++}
++
+ /**
+  * eth_type_trans - determine the packet's protocol ID.
+  * @skb: received socket data
+@@ -174,6 +186,10 @@ __be16 eth_type_trans(struct sk_buff *sk
+ 		} else {
+ 			skb->pkt_type = PACKET_OTHERHOST;
+ 		}
++
++		if (eth_check_local_mask(eth->h_dest, dev->dev_addr,
++					 dev->local_addr_mask))
++			skb->gro_skip = 1;
+ 	}
+ 
+ 	/*
diff --git a/target/linux/generic/pending-6.0/682-of_net-add-mac-address-increment-support.patch b/target/linux/generic/pending-6.0/682-of_net-add-mac-address-increment-support.patch
new file mode 100644
index 000000000..f6ae9f31f
--- /dev/null
+++ b/target/linux/generic/pending-6.0/682-of_net-add-mac-address-increment-support.patch
@@ -0,0 +1,90 @@
+From 844c273286f328acf0dab5fbd5d864366b4904dc Mon Sep 17 00:00:00 2001
+From: Ansuel Smith <ansuelsmth@gmail.com>
+Date: Tue, 30 Mar 2021 18:21:14 +0200
+Subject: [PATCH] of_net: add mac-address-increment support
+
+Lots of embedded devices use the mac-address of other interface
+extracted from nvmem cells and increments it by one or two. Add two
+bindings to integrate this and directly use the right mac-address for
+the interface. Some example are some routers that use the gmac
+mac-address stored in the art partition and increments it by one for the
+wifi. mac-address-increment-byte bindings is used to tell what byte of
+the mac-address has to be increased (if not defined the last byte is
+increased) and mac-address-increment tells how much the byte decided
+early has to be increased.
+
+Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
+---
+ net/core/of_net.c | 43 +++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 39 insertions(+), 4 deletions(-)
+
+--- a/net/core/of_net.c
++++ b/net/core/of_net.c
+@@ -119,28 +119,63 @@ static int of_get_mac_addr_nvmem(struct
+  * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
+  * but is all zeros.
+  *
++ * DT can tell the system to increment the mac-address after is extracted by
++ * using:
++ * - mac-address-increment-byte to decide what byte to increase
++ *   (if not defined is increased the last byte)
++ * - mac-address-increment to decide how much to increase. The value WILL
++ *   overflow to other bytes if the increment is over 255 or the total
++ *   increment will exceed 255 of the current byte.
++ *   (example 00:01:02:03:04:ff + 1 == 00:01:02:03:05:00)
++ *   (example 00:01:02:03:04:fe + 5 == 00:01:02:03:05:03)
++ *
+  * Return: 0 on success and errno in case of error.
+ */
+ int of_get_mac_address(struct device_node *np, u8 *addr)
+ {
++	u32 inc_idx, mac_inc, mac_val;
+ 	int ret;
+ 
++	/* Check first if the increment byte is present and valid.
++	 * If not set assume to increment the last byte if found.
++	 */
++	if (of_property_read_u32(np, "mac-address-increment-byte", &inc_idx))
++		inc_idx = 5;
++	if (inc_idx < 3 || inc_idx > 5)
++		return -EINVAL;
++
+ 	if (!np)
+ 		return -ENODEV;
+ 
+ 	ret = of_get_mac_addr(np, "mac-address", addr);
+ 	if (!ret)
+-		return 0;
++		goto found;
+ 
+ 	ret = of_get_mac_addr(np, "local-mac-address", addr);
+ 	if (!ret)
+-		return 0;
++		goto found;
+ 
+ 	ret = of_get_mac_addr(np, "address", addr);
+ 	if (!ret)
+-		return 0;
++		goto found;
++
++	ret = of_get_mac_addr_nvmem(np, addr);
++	if (ret)
++		return ret;
++
++found:
++	if (!of_property_read_u32(np, "mac-address-increment", &mac_inc)) {
++		/* Convert to a contiguous value */
++		mac_val = (addr[3] << 16) + (addr[4] << 8) + addr[5];
++		mac_val += mac_inc << 8 * (5-inc_idx);
++
++		/* Apply the incremented value handling overflow case */
++		addr[3] = (mac_val >> 16) & 0xff;
++		addr[4] = (mac_val >> 8) & 0xff;
++		addr[5] = (mac_val >> 0) & 0xff;
++	}
+ 
+-	return of_get_mac_addr_nvmem(np, addr);
++	return ret;
+ }
+ EXPORT_SYMBOL(of_get_mac_address);
+ 
diff --git a/target/linux/generic/pending-6.0/683-of_net-add-mac-address-to-of-tree.patch b/target/linux/generic/pending-6.0/683-of_net-add-mac-address-to-of-tree.patch
new file mode 100644
index 000000000..88ade300a
--- /dev/null
+++ b/target/linux/generic/pending-6.0/683-of_net-add-mac-address-to-of-tree.patch
@@ -0,0 +1,38 @@
+--- a/net/core/of_net.c
++++ b/net/core/of_net.c
+@@ -95,6 +95,27 @@ static int of_get_mac_addr_nvmem(struct
+ 	return 0;
+ }
+ 
++static int of_add_mac_address(struct device_node *np, u8* addr)
++{
++	struct property *prop;
++
++	prop = kzalloc(sizeof(*prop), GFP_KERNEL);
++	if (!prop)
++		return -ENOMEM;
++
++	prop->name = "mac-address";
++	prop->length = ETH_ALEN;
++	prop->value = kmemdup(addr, ETH_ALEN, GFP_KERNEL);
++	if (!prop->value || of_update_property(np, prop))
++		goto free;
++
++	return 0;
++free:
++	kfree(prop->value);
++	kfree(prop);
++	return -ENOMEM;
++}
++
+ /**
+  * of_get_mac_address()
+  * @np:		Caller's Device Node
+@@ -175,6 +196,7 @@ found:
+ 		addr[5] = (mac_val >> 0) & 0xff;
+ 	}
+ 
++	of_add_mac_address(np, addr);
+ 	return ret;
+ }
+ EXPORT_SYMBOL(of_get_mac_address);
diff --git a/target/linux/generic/pending-6.0/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch b/target/linux/generic/pending-6.0/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch
new file mode 100644
index 000000000..4e8042380
--- /dev/null
+++ b/target/linux/generic/pending-6.0/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch
@@ -0,0 +1,26 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Thu, 8 Jul 2021 07:08:29 +0200
+Subject: [PATCH] net: ethernet: mtk_eth_soc: avoid creating duplicate offload
+ entries
+
+Sometimes multiple CLS_REPLACE calls are issued for the same connection.
+rhashtable_insert_fast does not check for these duplicates, so multiple
+hardware flow entries can be created.
+Fix this by checking for an existing entry early
+
+Fixes: 502e84e2382d ("net: ethernet: mtk_eth_soc: add flow offloading support")
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
++++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
+@@ -233,6 +233,9 @@ mtk_flow_offload_replace(struct mtk_eth
+ 	if (rhashtable_lookup(&eth->flow_table, &f->cookie, mtk_flow_ht_params))
+ 		return -EEXIST;
+ 
++	if (rhashtable_lookup(&eth->flow_table, &f->cookie, mtk_flow_ht_params))
++		return -EEXIST;
++
+ 	if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_META)) {
+ 		struct flow_match_meta match;
+ 
diff --git a/target/linux/generic/pending-6.0/703-phy-add-detach-callback-to-struct-phy_driver.patch b/target/linux/generic/pending-6.0/703-phy-add-detach-callback-to-struct-phy_driver.patch
new file mode 100644
index 000000000..c50f55431
--- /dev/null
+++ b/target/linux/generic/pending-6.0/703-phy-add-detach-callback-to-struct-phy_driver.patch
@@ -0,0 +1,38 @@
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: generic: add detach callback to struct phy_driver
+
+lede-commit: fe61fc2d7d0b3fb348b502f68f98243b3ddf5867
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/net/phy/phy_device.c | 3 +++
+ include/linux/phy.h          | 6 ++++++
+ 2 files changed, 9 insertions(+)
+
+--- a/drivers/net/phy/phy_device.c
++++ b/drivers/net/phy/phy_device.c
+@@ -1746,6 +1746,9 @@ void phy_detach(struct phy_device *phyde
+ 	struct module *ndev_owner = NULL;
+ 	struct mii_bus *bus;
+ 
++	if (phydev->drv && phydev->drv->detach)
++		phydev->drv->detach(phydev);
++
+ 	if (phydev->sysfs_links) {
+ 		if (dev)
+ 			sysfs_remove_link(&dev->dev.kobj, "phydev");
+--- a/include/linux/phy.h
++++ b/include/linux/phy.h
+@@ -827,6 +827,12 @@ struct phy_driver {
+ 	/** @handle_interrupt: Override default interrupt handling */
+ 	irqreturn_t (*handle_interrupt)(struct phy_device *phydev);
+ 
++	/*
++	 * Called before an ethernet device is detached
++	 * from the PHY.
++	 */
++	void (*detach)(struct phy_device *phydev);
++
+ 	/** @remove: Clears up any memory if needed */
+ 	void (*remove)(struct phy_device *phydev);
+ 
diff --git a/target/linux/generic/pending-6.0/721-net-phy-realtek-rtl8221-allow-to-configure-SERDES-mo.patch b/target/linux/generic/pending-6.0/721-net-phy-realtek-rtl8221-allow-to-configure-SERDES-mo.patch
new file mode 100644
index 000000000..703a0b8b7
--- /dev/null
+++ b/target/linux/generic/pending-6.0/721-net-phy-realtek-rtl8221-allow-to-configure-SERDES-mo.patch
@@ -0,0 +1,101 @@
+From ace6abaa0f9203083fe4c0a6a74da2d96410b625 Mon Sep 17 00:00:00 2001
+From: Alexander Couzens <lynxis@fe80.eu>
+Date: Sat, 13 Aug 2022 12:49:33 +0200
+Subject: [PATCH 01/10] net: phy: realtek: rtl8221: allow to configure SERDES
+ mode
+
+The rtl8221 supports multiple SERDES modes:
+- SGMII
+- 2500base-x
+- HiSGMII
+
+Further it supports rate adaption on SERDES links to allow
+slow ethernet speeds (10/100/1000mbit) to work on 2500base-x/HiSGMII
+links without reducing the SERDES speed.
+
+When operating without rate adapters the SERDES link will follow the
+ethernet speed.
+
+Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
+---
+ drivers/net/phy/realtek.c | 48 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 48 insertions(+)
+
+--- a/drivers/net/phy/realtek.c
++++ b/drivers/net/phy/realtek.c
+@@ -53,6 +53,15 @@
+ 						 RTL8201F_ISR_LINK)
+ #define RTL8201F_IER				0x13
+ 
++#define RTL8221B_MMD_SERDES_CTRL		MDIO_MMD_VEND1
++#define RTL8221B_MMD_PHY_CTRL			MDIO_MMD_VEND2
++#define RTL8221B_SERDES_OPTION			0x697a
++#define RTL8221B_SERDES_OPTION_MODE_MASK	GENMASK(5, 0)
++#define RTL8221B_SERDES_OPTION_MODE_2500BASEX_SGMII	0
++#define RTL8221B_SERDES_OPTION_MODE_HISGMII_SGMII	1
++#define RTL8221B_SERDES_OPTION_MODE_2500BASEX		2
++#define RTL8221B_SERDES_OPTION_MODE_HISGMII		3
++
+ #define RTL8366RB_POWER_SAVE			0x15
+ #define RTL8366RB_POWER_SAVE_ON			BIT(12)
+ 
+@@ -841,6 +850,43 @@ static irqreturn_t rtl9000a_handle_inter
+ 	return IRQ_HANDLED;
+ }
+ 
++static int rtl8221b_config_init(struct phy_device *phydev)
++{
++	u16 option_mode;
++
++	switch (phydev->interface) {
++	case PHY_INTERFACE_MODE_SGMII:
++	case PHY_INTERFACE_MODE_2500BASEX:
++		option_mode = RTL8221B_SERDES_OPTION_MODE_2500BASEX_SGMII;
++		break;
++	default:
++		return 0;
++	}
++
++	phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL,
++                      0x75f3, 0);
++
++	phy_modify_mmd_changed(phydev, RTL8221B_MMD_SERDES_CTRL,
++			       RTL8221B_SERDES_OPTION,
++			       RTL8221B_SERDES_OPTION_MODE_MASK, option_mode);
++	switch (option_mode) {
++        case RTL8221B_SERDES_OPTION_MODE_2500BASEX_SGMII:
++        case RTL8221B_SERDES_OPTION_MODE_2500BASEX:
++                phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6a04, 0x0503);
++                phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f10, 0xd455);
++                phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f11, 0x8020);
++                break;
++        case RTL8221B_SERDES_OPTION_MODE_HISGMII_SGMII:
++        case RTL8221B_SERDES_OPTION_MODE_HISGMII:
++                phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6a04, 0x0503);
++                phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f10, 0xd433);
++                phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f11, 0x8020);
++                break;
++	}
++
++	return 0;
++}
++
+ static struct phy_driver realtek_drvs[] = {
+ 	{
+ 		PHY_ID_MATCH_EXACT(0x00008201),
+@@ -981,6 +1027,7 @@ static struct phy_driver realtek_drvs[]
+ 		PHY_ID_MATCH_EXACT(0x001cc849),
+ 		.name           = "RTL8221B-VB-CG 2.5Gbps PHY",
+ 		.get_features   = rtl822x_get_features,
++		.config_init	= rtl8221b_config_init,
+ 		.config_aneg    = rtl822x_config_aneg,
+ 		.read_status    = rtl822x_read_status,
+ 		.suspend        = genphy_suspend,
+@@ -992,6 +1039,7 @@ static struct phy_driver realtek_drvs[]
+ 		.name           = "RTL8221B-VM-CG 2.5Gbps PHY",
+ 		.get_features   = rtl822x_get_features,
+ 		.config_aneg    = rtl822x_config_aneg,
++		.config_init	= rtl8221b_config_init,
+ 		.read_status    = rtl822x_read_status,
+ 		.suspend        = genphy_suspend,
+ 		.resume         = rtlgen_resume,
diff --git a/target/linux/generic/pending-6.0/724-net-mtk_sgmii-implement-mtk_pcs_ops.patch b/target/linux/generic/pending-6.0/724-net-mtk_sgmii-implement-mtk_pcs_ops.patch
new file mode 100644
index 000000000..cd9770665
--- /dev/null
+++ b/target/linux/generic/pending-6.0/724-net-mtk_sgmii-implement-mtk_pcs_ops.patch
@@ -0,0 +1,46 @@
+From cbfed00575d15eafd85efd9619b7ecc0836a4aa7 Mon Sep 17 00:00:00 2001
+From: Alexander Couzens <lynxis@fe80.eu>
+Date: Sat, 13 Aug 2022 14:42:12 +0200
+Subject: [PATCH 04/10] net: mtk_sgmii: implement mtk_pcs_ops
+
+Implement mtk_pcs_ops for the SGMII pcs to read the current state
+of the hardware.
+
+Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
+[added DUPLEX_FULL]
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+---
+ drivers/net/ethernet/mediatek/mtk_sgmii.c | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c
++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c
+@@ -122,10 +122,28 @@ static void mtk_pcs_link_up(struct phyli
+ 	regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val);
+ }
+ 
++static void mtk_pcs_get_state(struct phylink_pcs *pcs, struct phylink_link_state *state)
++{
++	struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs);
++	unsigned int val;
++
++	regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &val);
++	state->an_complete = !!(val & SGMII_AN_COMPLETE);
++	state->link = !!(val & SGMII_LINK_STATYS);
++	if (!state->link)
++		return;
++
++	regmap_read(mpcs->regmap, mpcs->ana_rgc3, &val);
++	state->speed = val & RG_PHY_SPEED_3_125G ? SPEED_2500 : SPEED_1000;
++	state->duplex = DUPLEX_FULL;
++	state->pause = 0;
++}
++
+ static const struct phylink_pcs_ops mtk_pcs_ops = {
+ 	.pcs_config = mtk_pcs_config,
+ 	.pcs_an_restart = mtk_pcs_restart_an,
+ 	.pcs_link_up = mtk_pcs_link_up,
++	.pcs_get_state = mtk_pcs_get_state,
+ };
+ 
+ int mtk_sgmii_init(struct mtk_sgmii *ss, struct device_node *r, u32 ana_rgc3)
diff --git a/target/linux/generic/pending-6.0/725-net-mtk_sgmii-fix-powering-up-the-SGMII-phy.patch b/target/linux/generic/pending-6.0/725-net-mtk_sgmii-fix-powering-up-the-SGMII-phy.patch
new file mode 100644
index 000000000..0fa357d48
--- /dev/null
+++ b/target/linux/generic/pending-6.0/725-net-mtk_sgmii-fix-powering-up-the-SGMII-phy.patch
@@ -0,0 +1,39 @@
+From 7f75f43fe2159123baa101fcc8c6faa0b0a4c598 Mon Sep 17 00:00:00 2001
+From: Alexander Couzens <lynxis@fe80.eu>
+Date: Sat, 13 Aug 2022 14:48:51 +0200
+Subject: [PATCH 05/10] net: mtk_sgmii: fix powering up the SGMII phy
+
+There are certain race condition when the SGMII_PHYA_PWD register still
+contains 0x9 which prevents the SGMII from working properly.
+
+The SGMII still shows link but no traffic can flow.
+
+Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
+---
+ drivers/net/ethernet/mediatek/mtk_sgmii.c | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c
++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c
+@@ -36,9 +36,7 @@ static int mtk_pcs_setup_mode_an(struct
+ 	val |= SGMII_AN_RESTART;
+ 	regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val);
+ 
+-	regmap_read(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, &val);
+-	val &= ~SGMII_PHYA_PWD;
+-	regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, val);
++	regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, 0);
+ 
+ 	return 0;
+ 
+@@ -70,9 +68,7 @@ static int mtk_pcs_setup_mode_force(stru
+ 	regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val);
+ 
+ 	/* Release PHYA power down state */
+-	regmap_read(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, &val);
+-	val &= ~SGMII_PHYA_PWD;
+-	regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, val);
++	regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, 0);
+ 
+ 	return 0;
+ }
diff --git a/target/linux/generic/pending-6.0/726-net-mtk_sgmii-ensure-the-SGMII-PHY-is-powered-down-o.patch b/target/linux/generic/pending-6.0/726-net-mtk_sgmii-ensure-the-SGMII-PHY-is-powered-down-o.patch
new file mode 100644
index 000000000..329b41cf0
--- /dev/null
+++ b/target/linux/generic/pending-6.0/726-net-mtk_sgmii-ensure-the-SGMII-PHY-is-powered-down-o.patch
@@ -0,0 +1,65 @@
+From 9daea9b71d060d93d7394ac465b2e5ee0b7e7bca Mon Sep 17 00:00:00 2001
+From: Alexander Couzens <lynxis@fe80.eu>
+Date: Mon, 15 Aug 2022 16:02:01 +0200
+Subject: [PATCH 06/10] net: mtk_sgmii: ensure the SGMII PHY is powered down on
+ configuration
+
+The code expect the PHY to be in power down (which is only true after reset).
+Allow the changes of SGMII parameters more than once.
+---
+ drivers/net/ethernet/mediatek/mtk_sgmii.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c
++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c
+@@ -7,6 +7,7 @@
+  *
+  */
+ 
++#include <linux/delay.h>
+ #include <linux/mfd/syscon.h>
+ #include <linux/of.h>
+ #include <linux/phylink.h>
+@@ -24,6 +25,9 @@ static int mtk_pcs_setup_mode_an(struct
+ {
+ 	unsigned int val;
+ 
++	/* PHYA power down */
++	regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, SGMII_PHYA_PWD);
++
+ 	/* Setup the link timer and QPHY power up inside SGMIISYS */
+ 	regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER,
+ 		     SGMII_LINK_TIMER_DEFAULT);
+@@ -36,6 +40,10 @@ static int mtk_pcs_setup_mode_an(struct
+ 	val |= SGMII_AN_RESTART;
+ 	regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val);
+ 
++	/* Release PHYA power down state
++	 * unknown how much the QPHY needs but it is racy without a sleep
++	 */
++	usleep_range(50, 100);
+ 	regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, 0);
+ 
+ 	return 0;
+@@ -50,6 +58,9 @@ static int mtk_pcs_setup_mode_force(stru
+ {
+ 	unsigned int val;
+ 
++	/* PHYA power down */
++	regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, SGMII_PHYA_PWD);
++
+ 	regmap_read(mpcs->regmap, mpcs->ana_rgc3, &val);
+ 	val &= ~RG_PHY_SPEED_MASK;
+ 	if (interface == PHY_INTERFACE_MODE_2500BASEX)
+@@ -67,7 +78,10 @@ static int mtk_pcs_setup_mode_force(stru
+ 	val |= SGMII_SPEED_1000;
+ 	regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val);
+ 
+-	/* Release PHYA power down state */
++	/* Release PHYA power down state
++	 * unknown how much the QPHY needs but it is racy without a sleep
++	 */
++	usleep_range(50, 100);
+ 	regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, 0);
+ 
+ 	return 0;
diff --git a/target/linux/generic/pending-6.0/727-net-mtk_sgmii-mtk_pcs_setup_mode_an-don-t-rely-on-re.patch b/target/linux/generic/pending-6.0/727-net-mtk_sgmii-mtk_pcs_setup_mode_an-don-t-rely-on-re.patch
new file mode 100644
index 000000000..5bc187cfc
--- /dev/null
+++ b/target/linux/generic/pending-6.0/727-net-mtk_sgmii-mtk_pcs_setup_mode_an-don-t-rely-on-re.patch
@@ -0,0 +1,31 @@
+From e4dca7affb8c03438b63bdb5fddefd6ad2431cfd Mon Sep 17 00:00:00 2001
+From: Alexander Couzens <lynxis@fe80.eu>
+Date: Mon, 15 Aug 2022 14:59:29 +0200
+Subject: [PATCH 07/10] net: mtk_sgmii: mtk_pcs_setup_mode_an: don't rely on
+ register defaults
+
+Ensure autonegotiation is enabled.
+
+Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
+---
+ drivers/net/ethernet/mediatek/mtk_sgmii.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c
++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c
+@@ -32,12 +32,13 @@ static int mtk_pcs_setup_mode_an(struct
+ 	regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER,
+ 		     SGMII_LINK_TIMER_DEFAULT);
+ 
++	/* disable remote fault & enable auto neg */
+ 	regmap_read(mpcs->regmap, SGMSYS_SGMII_MODE, &val);
+-	val |= SGMII_REMOTE_FAULT_DIS;
++	val |= SGMII_REMOTE_FAULT_DIS | SGMII_SPEED_DUPLEX_AN;
+ 	regmap_write(mpcs->regmap, SGMSYS_SGMII_MODE, val);
+ 
+ 	regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &val);
+-	val |= SGMII_AN_RESTART;
++	val |= SGMII_AN_RESTART | SGMII_AN_ENABLE;
+ 	regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val);
+ 
+ 	/* Release PHYA power down state
diff --git a/target/linux/generic/pending-6.0/728-net-mtk_sgmii-set-the-speed-according-to-the-phy-int.patch b/target/linux/generic/pending-6.0/728-net-mtk_sgmii-set-the-speed-according-to-the-phy-int.patch
new file mode 100644
index 000000000..0b17f77ee
--- /dev/null
+++ b/target/linux/generic/pending-6.0/728-net-mtk_sgmii-set-the-speed-according-to-the-phy-int.patch
@@ -0,0 +1,47 @@
+From 952b64575613d26163a5afa5ff8bfdb57840091b Mon Sep 17 00:00:00 2001
+From: Alexander Couzens <lynxis@fe80.eu>
+Date: Mon, 15 Aug 2022 15:00:14 +0200
+Subject: [PATCH 08/10] net: mtk_sgmii: set the speed according to the phy
+ interface in AN
+
+The non auto-negotioting code path is setting the correct speed for the
+interface. Ensure auto-negotiation code path is doing it as well.
+
+Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
+---
+ drivers/net/ethernet/mediatek/mtk_sgmii.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c
++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c
+@@ -21,13 +21,20 @@ static struct mtk_pcs *pcs_to_mtk_pcs(st
+ }
+ 
+ /* For SGMII interface mode */
+-static int mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs)
++static int mtk_pcs_setup_mode_an(struct mtk_pcs *mpcs, phy_interface_t interface)
+ {
+ 	unsigned int val;
+ 
+ 	/* PHYA power down */
+ 	regmap_write(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL, SGMII_PHYA_PWD);
+ 
++	/* Set SGMII phy speed */
++	regmap_read(mpcs->regmap, mpcs->ana_rgc3, &val);
++	val &= ~RG_PHY_SPEED_MASK;
++	if (interface == PHY_INTERFACE_MODE_2500BASEX)
++		val |= RG_PHY_SPEED_3_125G;
++	regmap_write(mpcs->regmap, mpcs->ana_rgc3, val);
++
+ 	/* Setup the link timer and QPHY power up inside SGMIISYS */
+ 	regmap_write(mpcs->regmap, SGMSYS_PCS_LINK_TIMER,
+ 		     SGMII_LINK_TIMER_DEFAULT);
+@@ -100,7 +107,7 @@ static int mtk_pcs_config(struct phylink
+ 	if (interface != PHY_INTERFACE_MODE_SGMII)
+ 		err = mtk_pcs_setup_mode_force(mpcs, interface);
+ 	else if (phylink_autoneg_inband(mode))
+-		err = mtk_pcs_setup_mode_an(mpcs);
++		err = mtk_pcs_setup_mode_an(mpcs, interface);
+ 
+ 	return err;
+ }
diff --git a/target/linux/generic/pending-6.0/729-net-mtk_eth_soc-improve-comment.patch b/target/linux/generic/pending-6.0/729-net-mtk_eth_soc-improve-comment.patch
new file mode 100644
index 000000000..80144850e
--- /dev/null
+++ b/target/linux/generic/pending-6.0/729-net-mtk_eth_soc-improve-comment.patch
@@ -0,0 +1,22 @@
+From 06773f19cffd6c9d34dcbc8320169afef5ab60ba Mon Sep 17 00:00:00 2001
+From: Alexander Couzens <lynxis@fe80.eu>
+Date: Mon, 15 Aug 2022 13:58:07 +0200
+Subject: [PATCH 09/10] net: mtk_eth_soc: improve comment
+
+Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
+---
+ drivers/net/ethernet/mediatek/mtk_sgmii.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c
++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c
+@@ -80,7 +80,8 @@ static int mtk_pcs_setup_mode_force(stru
+ 	val &= ~SGMII_AN_ENABLE;
+ 	regmap_write(mpcs->regmap, SGMSYS_PCS_CONTROL_1, val);
+ 
+-	/* Set the speed etc but leave the duplex unchanged */
++	/* Set the speed etc but leave the duplex unchanged.
++	 * The SGMII mode for 2.5gbit is the same as for 1gbit, expect the speed in ANA_RGC3 */
+ 	regmap_read(mpcs->regmap, SGMSYS_SGMII_MODE, &val);
+ 	val &= SGMII_DUPLEX_FULL | ~SGMII_IF_MODE_MASK;
+ 	val |= SGMII_SPEED_1000;
diff --git a/target/linux/generic/pending-6.0/730-mtk_sgmii-enable-PCS-polling-to-allow-SFP-work.patch b/target/linux/generic/pending-6.0/730-mtk_sgmii-enable-PCS-polling-to-allow-SFP-work.patch
new file mode 100644
index 000000000..d185aed7b
--- /dev/null
+++ b/target/linux/generic/pending-6.0/730-mtk_sgmii-enable-PCS-polling-to-allow-SFP-work.patch
@@ -0,0 +1,23 @@
+From 95dcd0f223d7cab6e25bc19088016e5eb4ca1804 Mon Sep 17 00:00:00 2001
+From: Alexander Couzens <lynxis@fe80.eu>
+Date: Tue, 16 Aug 2022 00:22:11 +0200
+Subject: [PATCH 10/10] mtk_sgmii: enable PCS polling to allow SFP work
+
+Currently there is no IRQ handling (even the SGMII supports it).
+Enable polling to support SFP ports.
+
+Signed-off-by: Alexander Couzens <lynxis@fe80.eu>
+---
+ drivers/net/ethernet/mediatek/mtk_sgmii.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/net/ethernet/mediatek/mtk_sgmii.c
++++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c
+@@ -182,6 +182,7 @@ int mtk_sgmii_init(struct mtk_sgmii *ss,
+ 			return PTR_ERR(ss->pcs[i].regmap);
+ 
+ 		ss->pcs[i].pcs.ops = &mtk_pcs_ops;
++		ss->pcs[i].pcs.poll = 1;
+ 	}
+ 
+ 	return 0;
diff --git a/target/linux/generic/pending-6.0/731-net-dsa-mt7530-add-support-for-in-band-link-status.patch b/target/linux/generic/pending-6.0/731-net-dsa-mt7530-add-support-for-in-band-link-status.patch
new file mode 100644
index 000000000..852114de7
--- /dev/null
+++ b/target/linux/generic/pending-6.0/731-net-dsa-mt7530-add-support-for-in-band-link-status.patch
@@ -0,0 +1,123 @@
+From 8e18c5fef75debfae3531fbd6901f3bf317d91ed Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel@makrotopia.org>
+Date: Fri, 9 Sep 2022 04:28:43 +0100
+Subject: [PATCH] net: dsa: mt7530: add support for in-band link status
+To: linux-mediatek@lists.infradead.org,
+    netdev@vger.kernel.org
+Cc: Russell King <linux@armlinux.org.uk>,
+    Sean Wang <sean.wang@mediatek.com>,
+    Landen Chao <Landen.Chao@mediatek.com>,
+    DENG Qingfang <dqfext@gmail.com>,
+    Andrew Lunn <andrew@lunn.ch>,
+    Vivien Didelot <vivien.didelot@gmail.com>,
+    Florian Fainelli <f.fainelli@gmail.com>,
+    Vladimir Oltean <olteanv@gmail.com>,
+    David S. Miller <davem@davemloft.net>,
+    Eric Dumazet <edumazet@google.com>,
+    Jakub Kicinski <kuba@kernel.org>,
+    Paolo Abeni <pabeni@redhat.com>,
+    Matthias Brugger <matthias.bgg@gmail.com>,
+    Philipp Zabel <p.zabel@pengutronix.de>
+
+Read link status from SGMII PCS for in-band managed 2500Base-X and
+1000Base-X connection on a MAC port of the MT7531. This is needed to
+get the SFP cage working which is connected to SGMII interface of
+port 5 of the MT7531 switch IC on the Bananapi BPi-R3 board.
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+---
+ drivers/net/dsa/mt7530.c | 48 +++++++++++++++++++++++++++++-----------
+ 1 file changed, 35 insertions(+), 13 deletions(-)
+
+--- a/drivers/net/dsa/mt7530.c
++++ b/drivers/net/dsa/mt7530.c
+@@ -2708,9 +2708,6 @@ mt7531_mac_config(struct dsa_switch *ds,
+ 	case PHY_INTERFACE_MODE_NA:
+ 	case PHY_INTERFACE_MODE_1000BASEX:
+ 	case PHY_INTERFACE_MODE_2500BASEX:
+-		if (phylink_autoneg_inband(mode))
+-			return -EINVAL;
+-
+ 		return mt7531_sgmii_setup_mode_force(priv, port, interface);
+ 	default:
+ 		return -EINVAL;
+@@ -2786,13 +2783,6 @@ unsupported:
+ 		return;
+ 	}
+ 
+-	if (phylink_autoneg_inband(mode) &&
+-	    state->interface != PHY_INTERFACE_MODE_SGMII) {
+-		dev_err(ds->dev, "%s: in-band negotiation unsupported\n",
+-			__func__);
+-		return;
+-	}
+-
+ 	mcr_cur = mt7530_read(priv, MT7530_PMCR_P(port));
+ 	mcr_new = mcr_cur;
+ 	mcr_new &= ~PMCR_LINK_SETTINGS_MASK;
+@@ -2929,6 +2919,9 @@ static void mt753x_phylink_get_caps(stru
+ 	config->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
+ 				   MAC_10 | MAC_100 | MAC_1000FD;
+ 
++	if ((priv->id == ID_MT7531) && mt753x_is_mac_port(port))
++		config->mac_capabilities |= MAC_2500FD;
++
+ 	/* This driver does not make use of the speed, duplex, pause or the
+ 	 * advertisement in its mac_config, so it is safe to mark this driver
+ 	 * as non-legacy.
+@@ -3024,16 +3017,43 @@ mt7531_sgmii_pcs_get_state_an(struct mt7
+ 	return 0;
+ }
+ 
++static void
++mt7531_sgmii_pcs_get_state_inband(struct mt7530_priv *priv, int port,
++				  struct phylink_link_state *state)
++{
++	unsigned int val;
++
++	val = mt7530_read(priv, MT7531_PCS_CONTROL_1(port));
++	state->link = !!(val & MT7531_SGMII_LINK_STATUS);
++	if (!state->link)
++		return;
++
++	if (state->interface == PHY_INTERFACE_MODE_2500BASEX)
++		state->speed = SPEED_2500;
++	else
++		state->speed = SPEED_1000;
++
++	state->duplex = DUPLEX_FULL;
++	state->pause = 0;
++}
++
+ static void mt7531_pcs_get_state(struct phylink_pcs *pcs,
+ 				 struct phylink_link_state *state)
+ {
+ 	struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv;
+ 	int port = pcs_to_mt753x_pcs(pcs)->port;
++	unsigned int val;
+ 
+-	if (state->interface == PHY_INTERFACE_MODE_SGMII)
++	if (state->interface == PHY_INTERFACE_MODE_SGMII) {
+ 		mt7531_sgmii_pcs_get_state_an(priv, port, state);
+-	else
+-		state->link = false;
++		return;
++	} else if ((state->interface == PHY_INTERFACE_MODE_1000BASEX) ||
++		   (state->interface == PHY_INTERFACE_MODE_2500BASEX)) {
++		mt7531_sgmii_pcs_get_state_inband(priv, port, state);
++		return;
++	}
++
++	state->link = false;
+ }
+ 
+ static int mt753x_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
+@@ -3074,6 +3094,8 @@ mt753x_setup(struct dsa_switch *ds)
+ 		priv->pcs[i].pcs.ops = priv->info->pcs_ops;
+ 		priv->pcs[i].priv = priv;
+ 		priv->pcs[i].port = i;
++		if (mt753x_is_mac_port(i))
++			priv->pcs[i].pcs.poll = 1;
+ 	}
+ 
+ 	ret = priv->info->sw_setup(ds);
diff --git a/target/linux/generic/pending-6.0/735-net-phy-at803x-fix-at8033-sgmii-mode.patch b/target/linux/generic/pending-6.0/735-net-phy-at803x-fix-at8033-sgmii-mode.patch
new file mode 100644
index 000000000..8fc90aeb9
--- /dev/null
+++ b/target/linux/generic/pending-6.0/735-net-phy-at803x-fix-at8033-sgmii-mode.patch
@@ -0,0 +1,51 @@
+From: Roman Yeryomin <roman@advem.lv>
+Subject: kernel: add at803x fix for sgmii mode
+
+Some (possibly broken) bootloaders incorreclty initialize at8033
+phy. This patch enables sgmii autonegotiation mode.
+
+[john@phrozen.org: felix added this to his upstream queue]
+
+Signed-off-by: Roman Yeryomin <roman@advem.lv>
+---
+ drivers/net/phy/at803x.c | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+--- a/drivers/net/phy/at803x.c
++++ b/drivers/net/phy/at803x.c
+@@ -84,6 +84,7 @@
+ #define AT803X_LOC_MAC_ADDR_32_47_OFFSET	0x804A
+ #define AT803X_REG_CHIP_CONFIG			0x1f
+ #define AT803X_BT_BX_REG_SEL			0x8000
++#define AT803X_SGMII_ANEG_EN			0x1000
+ 
+ #define AT803X_DEBUG_ADDR			0x1D
+ #define AT803X_DEBUG_DATA			0x1E
+@@ -946,6 +947,27 @@ static int at803x_smarteee_config(struct
+ 	struct at803x_priv *priv = phydev->priv;
+ 	u16 mask = 0, val = 0;
+ 	int ret;
++	u32 v;
++
++	if (phydev->drv->phy_id == ATH8031_PHY_ID &&
++		phydev->interface == PHY_INTERFACE_MODE_SGMII)
++	{
++		v = phy_read(phydev, AT803X_REG_CHIP_CONFIG);
++		/* select SGMII/fiber page */
++		ret = phy_write(phydev, AT803X_REG_CHIP_CONFIG,
++						v & ~AT803X_BT_BX_REG_SEL);
++		if (ret)
++			return ret;
++		/* enable SGMII autonegotiation */
++		ret = phy_write(phydev, MII_BMCR, AT803X_SGMII_ANEG_EN);
++		if (ret)
++			return ret;
++		/* select copper page */
++		ret = phy_write(phydev, AT803X_REG_CHIP_CONFIG,
++						v | AT803X_BT_BX_REG_SEL);
++		if (ret)
++			return ret;
++	}
+ 
+ 	if (priv->flags & AT803X_DISABLE_SMARTEEE)
+ 		return phy_modify_mmd(phydev, MDIO_MMD_PCS,
diff --git a/target/linux/generic/pending-6.0/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch b/target/linux/generic/pending-6.0/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch
new file mode 100644
index 000000000..530432a7c
--- /dev/null
+++ b/target/linux/generic/pending-6.0/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch
@@ -0,0 +1,27 @@
+From a1b291f3f6c80a6c5ccad7283fc472d77a2a4763 Mon Sep 17 00:00:00 2001
+From: Russell King <rmk+kernel@armlinux.org.uk>
+Date: Sun, 22 Dec 2019 12:40:11 +0000
+Subject: [PATCH] net: dsa: mv88e6xxx: fix vlan setup
+
+Provide an option that drivers can set to indicate they want to receive
+vlan configuration even when vlan filtering is disabled. This is safe
+for Marvell DSA bridges, which do not look up ingress traffic in the
+VTU if the port is in 8021Q disabled state. Whether this change is
+suitable for all DSA bridges is not known.
+
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: DENG Qingfang <dqfext@gmail.com>
+---
+ drivers/net/dsa/mv88e6xxx/chip.c |  1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/net/dsa/mv88e6xxx/chip.c
++++ b/drivers/net/dsa/mv88e6xxx/chip.c
+@@ -3678,6 +3678,7 @@ static int mv88e6xxx_setup(struct dsa_sw
+ 
+ 	chip->ds = ds;
+ 	ds->slave_mii_bus = mv88e6xxx_default_mdio_bus(chip);
++	ds->configure_vlan_while_not_filtering = true;
+ 
+ 	/* Since virtual bridges are mapped in the PVT, the number we support
+ 	 * depends on the physical switch topology. We need to let DSA figure
diff --git a/target/linux/generic/pending-6.0/761-net-dsa-mt7530-Support-EEE-features.patch b/target/linux/generic/pending-6.0/761-net-dsa-mt7530-Support-EEE-features.patch
new file mode 100644
index 000000000..e7c54249b
--- /dev/null
+++ b/target/linux/generic/pending-6.0/761-net-dsa-mt7530-Support-EEE-features.patch
@@ -0,0 +1,103 @@
+From 9cfb2d426c38272f245e9e6f62b3552d1ed5852b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= <opensource@vdorst.com>
+Date: Tue, 21 Apr 2020 00:18:08 +0200
+Subject: [PATCH] net: dsa: mt7530: Support EEE features
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: René van Dorst <opensource@vdorst.com>
+--- a/drivers/net/dsa/mt7530.c
++++ b/drivers/net/dsa/mt7530.c
+@@ -2839,9 +2839,13 @@ static void mt753x_phylink_mac_link_up(s
+ 	switch (speed) {
+ 	case SPEED_1000:
+ 		mcr |= PMCR_FORCE_SPEED_1000;
++		if (priv->eee_enable & BIT(port))
++			mcr |= PMCR_FORCE_EEE1G;
+ 		break;
+ 	case SPEED_100:
+ 		mcr |= PMCR_FORCE_SPEED_100;
++		if (priv->eee_enable & BIT(port))
++			mcr |= PMCR_FORCE_EEE100;
+ 		break;
+ 	}
+ 	if (duplex == DUPLEX_FULL) {
+@@ -3142,6 +3146,54 @@ static int mt753x_set_mac_eee(struct dsa
+ 
+ 	return 0;
+ }
++
++static int mt7530_get_mac_eee(struct dsa_switch *ds, int port,
++			      struct ethtool_eee *e)
++{
++	struct mt7530_priv *priv = ds->priv;
++	u32 eeecr, pmsr;
++
++	e->eee_enabled = !!(priv->eee_enable & BIT(port));
++
++	if (e->eee_enabled) {
++		eeecr = mt7530_read(priv, MT7530_PMEEECR_P(port));
++		e->tx_lpi_enabled = !(eeecr & LPI_MODE_EN);
++		e->tx_lpi_timer   = (eeecr >> 4) & 0xFFF;
++		pmsr = mt7530_read(priv, MT7530_PMSR_P(port));
++		e->eee_active  = e->eee_enabled && !!(pmsr & PMSR_EEE1G);
++	} else {
++		e->tx_lpi_enabled = 0;
++		e->tx_lpi_timer = 0;
++		e->eee_active = 0;
++	}
++
++	return 0;
++}
++
++static int mt7530_set_mac_eee(struct dsa_switch *ds, int port,
++			      struct ethtool_eee *e)
++{
++	struct mt7530_priv *priv = ds->priv;
++	u32 eeecr;
++
++	if (e->tx_lpi_enabled && e->tx_lpi_timer > 0xFFF)
++		return -EINVAL;
++
++	if (e->eee_enabled) {
++		priv->eee_enable |= BIT(port);
++		//MT7530_PMEEECR_P
++		eeecr = mt7530_read(priv, MT7530_PMEEECR_P(port));
++		eeecr &= 0xFFFF0000;
++		if (!e->tx_lpi_enabled)
++			eeecr |= LPI_MODE_EN;
++		eeecr = LPI_THRESH(e->tx_lpi_timer);
++		mt7530_write(priv, MT7530_PMEEECR_P(port), eeecr);
++	} else {
++		priv->eee_enable &= ~(BIT(port));
++	}
++
++	return 0;
++}
+ 
+ static const struct dsa_switch_ops mt7530_switch_ops = {
+ 	.get_tag_protocol	= mtk_get_tag_protocol,
+--- a/drivers/net/dsa/mt7530.h
++++ b/drivers/net/dsa/mt7530.h
+@@ -345,6 +345,12 @@ enum mt7530_vlan_port_acc_frm {
+ #define  MAX_RX_PKT_LEN_1552		0x2
+ #define  MAX_RX_PKT_LEN_JUMBO		0x3
+ 
++#define MT7530_PMEEECR_P(x)		(0x3004 + (x) * 0x100)
++#define  WAKEUP_TIME_1000(x)		((x & 0xFF) << 24)
++#define  WAKEUP_TIME_100(x)		((x & 0xFF) << 16)
++#define  LPI_THRESH(x)			((x & 0xFFF) << 4)
++#define  LPI_MODE_EN			BIT(0)
++
+ /* Register for MIB */
+ #define MT7530_PORT_MIB_COUNTER(x)	(0x4000 + (x) * 0x100)
+ #define MT7530_MIB_CCR			0x4fe0
+@@ -817,6 +823,7 @@ struct mt7530_priv {
+ 	unsigned int		p5_intf_sel;
+ 	u8			mirror_rx;
+ 	u8			mirror_tx;
++	u8			eee_enable;
+ 
+ 	struct mt7530_port	ports[MT7530_NUM_PORTS];
+ 	struct mt753x_pcs	pcs[MT7530_NUM_PORTS];
diff --git a/target/linux/generic/pending-6.0/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch b/target/linux/generic/pending-6.0/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch
new file mode 100644
index 000000000..005fbe933
--- /dev/null
+++ b/target/linux/generic/pending-6.0/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch
@@ -0,0 +1,27 @@
+From:   Tobias Waldekranz <tobias@waldekranz.com>
+Subject: [RFC net-next 7/7] net: dsa: mv88e6xxx: Request assisted learning on CPU port
+Date:   Sat, 16 Jan 2021 02:25:15 +0100
+Archived-At: <https://lore.kernel.org/netdev/20210116012515.3152-8-tobias@waldekranz.com/>
+
+While the hardware is capable of performing learning on the CPU port,
+it requires alot of additions to the bridge's forwarding path in order
+to handle multi-destination traffic correctly.
+
+Until that is in place, opt for the next best thing and let DSA sync
+the relevant addresses down to the hardware FDB.
+
+Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
+---
+ drivers/net/dsa/mv88e6xxx/chip.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/net/dsa/mv88e6xxx/chip.c
++++ b/drivers/net/dsa/mv88e6xxx/chip.c
+@@ -6937,6 +6937,7 @@ static int mv88e6xxx_register_switch(str
+ 	ds->ops = &mv88e6xxx_switch_ops;
+ 	ds->ageing_time_min = chip->info->age_time_coeff;
+ 	ds->ageing_time_max = chip->info->age_time_coeff * U8_MAX;
++	ds->assisted_learning_on_cpu_port = true;
+ 
+ 	/* Some chips support up to 32, but that requires enabling the
+ 	 * 5-bit port mode, which we do not support. 640k^W16 ought to
diff --git a/target/linux/generic/pending-6.0/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch b/target/linux/generic/pending-6.0/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch
new file mode 100644
index 000000000..39ba71606
--- /dev/null
+++ b/target/linux/generic/pending-6.0/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch
@@ -0,0 +1,61 @@
+From patchwork Thu Aug  5 22:23:30 2021
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
+X-Patchwork-Id: 12422209
+Date: Thu, 5 Aug 2021 23:23:30 +0100
+From: Daniel Golle <daniel@makrotopia.org>
+To: linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org,
+ linux-kernel@vger.kernel.org
+Cc: "David S. Miller" <davem@davemloft.net>, Andrew Lunn <andrew@lunn.ch>,
+ Michael Walle <michael@walle.cc>
+Subject: [PATCH] ARM: kirkwood: add missing <linux/if_ether.h> for ETH_ALEN
+Message-ID: <YQxk4jrbm31NM1US@makrotopia.org>
+MIME-Version: 1.0
+Content-Disposition: inline
+X-BeenThere: linux-arm-kernel@lists.infradead.org
+X-Mailman-Version: 2.1.34
+Precedence: list
+List-Id: <linux-arm-kernel.lists.infradead.org>
+List-Archive: <http://lists.infradead.org/pipermail/linux-arm-kernel/>
+Sender: "linux-arm-kernel" <linux-arm-kernel-bounces@lists.infradead.org>
+
+After commit 83216e3988cd1 ("of: net: pass the dst buffer to
+of_get_mac_address()") build fails for kirkwood as ETH_ALEN is not
+defined.
+
+arch/arm/mach-mvebu/kirkwood.c: In function 'kirkwood_dt_eth_fixup':
+arch/arm/mach-mvebu/kirkwood.c:87:13: error: 'ETH_ALEN' undeclared (first use in this function); did you mean 'ESTALE'?
+   u8 tmpmac[ETH_ALEN];
+             ^~~~~~~~
+             ESTALE
+arch/arm/mach-mvebu/kirkwood.c:87:13: note: each undeclared identifier is reported only once for each function it appears in
+arch/arm/mach-mvebu/kirkwood.c:87:6: warning: unused variable 'tmpmac' [-Wunused-variable]
+   u8 tmpmac[ETH_ALEN];
+      ^~~~~~
+make[5]: *** [scripts/Makefile.build:262: arch/arm/mach-mvebu/kirkwood.o] Error 1
+make[5]: *** Waiting for unfinished jobs....
+
+Add missing #include <linux/if_ether.h> to fix this.
+
+Cc: David S. Miller <davem@davemloft.net>
+Cc: Andrew Lunn <andrew@lunn.ch>
+Cc: Michael Walle <michael@walle.cc>
+Reported-by: https://buildbot.openwrt.org/master/images/#/builders/56/builds/220/steps/44/logs/stdio
+Fixes: 83216e3988cd1 ("of: net: pass the dst buffer to of_get_mac_address()")
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+---
+ arch/arm/mach-mvebu/kirkwood.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/arm/mach-mvebu/kirkwood.c
++++ b/arch/arm/mach-mvebu/kirkwood.c
+@@ -11,6 +11,7 @@
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+ #include <linux/mbus.h>
++#include <linux/if_ether.h>
+ #include <linux/of.h>
+ #include <linux/of_address.h>
+ #include <linux/of_net.h>
diff --git a/target/linux/generic/pending-6.0/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch b/target/linux/generic/pending-6.0/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch
new file mode 100644
index 000000000..478a2cb27
--- /dev/null
+++ b/target/linux/generic/pending-6.0/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch
@@ -0,0 +1,73 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Subject: [PATCH] bcma: get SoC device struct & copy its DMA params to the
+ subdevices
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+For bus devices to be fully usable it's required to set their DMA
+parameters.
+
+For years it has been missing and remained unnoticed because of
+mips_dma_alloc_coherent() silently handling the empty coherent_dma_mask.
+Kernel 4.19 came with a lot of DMA changes and caused a regression on
+the bcm47xx. Starting with the commit f8c55dc6e828 ("MIPS: use generic
+dma noncoherent ops for simple noncoherent platforms") DMA coherent
+allocations just fail. Example:
+[    1.114914] bgmac_bcma bcma0:2: Allocation of TX ring 0x200 failed
+[    1.121215] bgmac_bcma bcma0:2: Unable to alloc memory for DMA
+[    1.127626] bgmac_bcma: probe of bcma0:2 failed with error -12
+[    1.133838] bgmac_bcma: Broadcom 47xx GBit MAC driver loaded
+
+This change fixes above regression in addition to the MIPS bcm47xx
+commit 321c46b91550 ("MIPS: BCM47XX: Setup struct device for the SoC").
+
+It also fixes another *old* GPIO regression caused by a parent pointing
+to the NULL:
+[    0.157054] missing gpiochip .dev parent pointer
+[    0.157287] bcma: bus0: Error registering GPIO driver: -22
+introduced by the commit 74f4e0cc6108 ("bcma: switch GPIO portions to
+use GPIOLIB_IRQCHIP").
+
+Fixes: f8c55dc6e828 ("MIPS: use generic dma noncoherent ops for simple noncoherent platforms")
+Fixes: 74f4e0cc6108 ("bcma: switch GPIO portions to use GPIOLIB_IRQCHIP")
+Cc: linux-mips@linux-mips.org
+Cc: Christoph Hellwig <hch@lst.de>
+Cc: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+---
+
+--- a/drivers/bcma/host_soc.c
++++ b/drivers/bcma/host_soc.c
+@@ -191,6 +191,8 @@ int __init bcma_host_soc_init(struct bcm
+ 	struct bcma_bus *bus = &soc->bus;
+ 	int err;
+ 
++	bus->dev = soc->dev;
++
+ 	/* Scan bus and initialize it */
+ 	err = bcma_bus_early_register(bus);
+ 	if (err)
+--- a/drivers/bcma/main.c
++++ b/drivers/bcma/main.c
+@@ -236,13 +236,17 @@ EXPORT_SYMBOL(bcma_core_irq);
+ 
+ void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core)
+ {
+-	device_initialize(&core->dev);
++	struct device *dev = &core->dev;
++
++	device_initialize(dev);
+ 	core->dev.release = bcma_release_core_dev;
+ 	core->dev.bus = &bcma_bus_type;
+-	dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index);
++	dev_set_name(dev, "bcma%d:%d", bus->num, core->core_index);
+ 	core->dev.parent = bus->dev;
+-	if (bus->dev)
++	if (bus->dev) {
+ 		bcma_of_fill_device(bus->dev, core);
++		dma_coerce_mask_and_coherent(dev, bus->dev->coherent_dma_mask);
++	}
+ 
+ 	switch (bus->hosttype) {
+ 	case BCMA_HOSTTYPE_PCI:
diff --git a/target/linux/generic/pending-6.0/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch b/target/linux/generic/pending-6.0/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch
new file mode 100644
index 000000000..a2235a24e
--- /dev/null
+++ b/target/linux/generic/pending-6.0/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch
@@ -0,0 +1,222 @@
+From fc23ea48ba52c24f201fe5ca0132ee1a3de5a70a Mon Sep 17 00:00:00 2001
+From: Mauri Sandberg <maukka@ext.kapsi.fi>
+Date: Thu, 25 Mar 2021 11:48:05 +0200
+Subject: [PATCH 2/2] gpio: gpio-cascade: add generic GPIO cascade
+
+Adds support for building cascades of GPIO lines. That is, it allows
+setups when there is one upstream line and multiple cascaded lines, out
+of which one can be chosen at a time. The status of the upstream line
+can be conveyed to the selected cascaded line or, vice versa, the status
+of the cascaded line can be conveyed to the upstream line.
+
+A multiplexer is being used to select, which cascaded GPIO line is being
+used at any given time.
+
+At the moment only input direction is supported. In future it should be
+possible to add support for output direction, too.
+
+Signed-off-by: Mauri Sandberg <maukka@ext.kapsi.fi>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
+---
+v7 -> v8:
+ - rearrange members in struct gpio_cascade
+ - cosmetic changes in file header and in one function declaration
+ - added Reviewed-by tags by Linus and Andy
+v6 -> v7:
+ - In Kconfig add info about module name
+ - adhere to new convention that allows lines longer than 80 chars
+ - use dev_probe_err with upstream gpio line too
+ - refactor for cleaner exit of probe function.
+v5 -> v6:
+ - In Kconfig, remove dependency to OF_GPIO and select only MULTIPLEXER
+ - refactor code preferring one-liners
+ - clean up prints, removing them from success-path.
+ - don't explicitly set gpio_chip.of_node as it's done in the GPIO library
+ - use devm_gpiochip_add_data instead of gpiochip_add
+v4 -> v5:
+ - renamed gpio-mux-input -> gpio-cascade. refactored code accordingly
+   here and there and changed to use new bindings and compatible string
+   - ambigious and vague 'pin' was rename to 'upstream_line'
+ - dropped Tested-by and Reviewed-by due to changes in bindings
+ - dropped Reported-by suggested by an automatic bot as it was not really
+   appropriate to begin with
+ - functionally it's the same as v4
+v3 -> v4:
+ - Changed author email
+ - Included Tested-by and Reviewed-by from Drew
+v2 -> v3:
+ - use managed device resources
+ - update Kconfig description
+v1 -> v2:
+ - removed .owner from platform_driver as per test bot's instruction
+ - added MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE
+ - added gpio_mux_input_get_direction as it's recommended for all chips
+ - removed because this is input only chip: gpio_mux_input_set_value
+ - removed because they are not needed for input/output only chips:
+     gpio_mux_input_direction_input
+     gpio_mux_input_direction_output
+ - fixed typo in an error message
+ - added info message about successful registration
+ - removed can_sleep flag as this does not sleep while getting GPIO value
+   like I2C or SPI do
+ - Updated description in Kconfig
+---
+ drivers/gpio/Kconfig        |  15 +++++
+ drivers/gpio/Makefile       |   1 +
+ drivers/gpio/gpio-cascade.c | 117 ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 133 insertions(+)
+ create mode 100644 drivers/gpio/gpio-cascade.c
+
+--- a/drivers/gpio/Kconfig
++++ b/drivers/gpio/Kconfig
+@@ -1720,4 +1720,19 @@ config GPIO_SIM
+ 
+ endmenu
+ 
++comment "Other GPIO expanders"
++
++config GPIO_CASCADE
++	tristate "General GPIO cascade"
++	select MULTIPLEXER
++	help
++	  Say yes here to enable support for generic GPIO cascade.
++
++	  This allows building one-to-many cascades of GPIO lines using
++	  different types of multiplexers readily available. At the
++	  moment only input lines are supported.
++
++	  To build the driver as a module choose 'm' and the resulting module
++	  will be called 'gpio-cascade'.
++
+ endif
+--- a/drivers/gpio/Makefile
++++ b/drivers/gpio/Makefile
+@@ -44,6 +44,7 @@ obj-$(CONFIG_GPIO_BD9571MWV)		+= gpio-bd
+ obj-$(CONFIG_GPIO_BRCMSTB)		+= gpio-brcmstb.o
+ obj-$(CONFIG_GPIO_BT8XX)		+= gpio-bt8xx.o
+ obj-$(CONFIG_GPIO_CADENCE)		+= gpio-cadence.o
++obj-$(CONFIG_GPIO_CASCADE)		+= gpio-cascade.o
+ obj-$(CONFIG_GPIO_CLPS711X)		+= gpio-clps711x.o
+ obj-$(CONFIG_GPIO_SNPS_CREG)		+= gpio-creg-snps.o
+ obj-$(CONFIG_GPIO_CRYSTAL_COVE)		+= gpio-crystalcove.o
+--- /dev/null
++++ b/drivers/gpio/gpio-cascade.c
+@@ -0,0 +1,117 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ *  A generic GPIO cascade driver
++ *
++ *  Copyright (C) 2021 Mauri Sandberg <maukka@ext.kapsi.fi>
++ *
++ * This allows building cascades of GPIO lines in a manner illustrated
++ * below:
++ *
++ *                 /|---- Cascaded GPIO line 0
++ *  Upstream      | |---- Cascaded GPIO line 1
++ *  GPIO line ----+ | .
++ *                | | .
++ *                 \|---- Cascaded GPIO line n
++ *
++ * A multiplexer is being used to select, which cascaded line is being
++ * addressed at any given time.
++ *
++ * At the moment only input mode is supported due to lack of means for
++ * testing output functionality. At least theoretically output should be
++ * possible with open drain constructions.
++ */
++
++#include <linux/module.h>
++#include <linux/slab.h>
++#include <linux/platform_device.h>
++#include <linux/mux/consumer.h>
++
++#include <linux/gpio/consumer.h>
++#include <linux/gpio/driver.h>
++
++struct gpio_cascade {
++	struct gpio_chip	gpio_chip;
++	struct device		*parent;
++	struct mux_control	*mux_control;
++	struct gpio_desc	*upstream_line;
++};
++
++static struct gpio_cascade *chip_to_cascade(struct gpio_chip *gc)
++{
++	return container_of(gc, struct gpio_cascade, gpio_chip);
++}
++
++static int gpio_cascade_get_direction(struct gpio_chip *gc, unsigned int offset)
++{
++	return GPIO_LINE_DIRECTION_IN;
++}
++
++static int gpio_cascade_get_value(struct gpio_chip *gc, unsigned int offset)
++{
++	struct gpio_cascade *cas = chip_to_cascade(gc);
++	int ret;
++
++	ret = mux_control_select(cas->mux_control, offset);
++	if (ret)
++		return ret;
++
++	ret = gpiod_get_value(cas->upstream_line);
++	mux_control_deselect(cas->mux_control);
++	return ret;
++}
++
++static int gpio_cascade_probe(struct platform_device *pdev)
++{
++	struct device *dev = &pdev->dev;
++	struct gpio_cascade *cas;
++	struct mux_control *mc;
++	struct gpio_desc *upstream;
++	struct gpio_chip *gc;
++
++	cas = devm_kzalloc(dev, sizeof(*cas), GFP_KERNEL);
++	if (!cas)
++		return -ENOMEM;
++
++	mc = devm_mux_control_get(dev, NULL);
++	if (IS_ERR(mc))
++		return dev_err_probe(dev, PTR_ERR(mc), "unable to get mux-control\n");
++
++	cas->mux_control = mc;
++	upstream = devm_gpiod_get(dev, "upstream",  GPIOD_IN);
++	if (IS_ERR(upstream))
++		return dev_err_probe(dev, PTR_ERR(upstream), "unable to claim upstream GPIO line\n");
++
++	cas->upstream_line = upstream;
++	cas->parent = dev;
++
++	gc = &cas->gpio_chip;
++	gc->get = gpio_cascade_get_value;
++	gc->get_direction = gpio_cascade_get_direction;
++	gc->base = -1;
++	gc->ngpio = mux_control_states(mc);
++	gc->label = dev_name(cas->parent);
++	gc->parent = cas->parent;
++	gc->owner = THIS_MODULE;
++
++	platform_set_drvdata(pdev, cas);
++	return devm_gpiochip_add_data(dev, &cas->gpio_chip, NULL);
++}
++
++static const struct of_device_id gpio_cascade_id[] = {
++	{ .compatible = "gpio-cascade" },
++	{ /* sentinel */ }
++};
++MODULE_DEVICE_TABLE(of, gpio_cascade_id);
++
++static struct platform_driver gpio_cascade_driver = {
++	.driver	= {
++		.name		= "gpio-cascade",
++		.of_match_table = gpio_cascade_id,
++	},
++	.probe	= gpio_cascade_probe,
++};
++module_platform_driver(gpio_cascade_driver);
++
++MODULE_AUTHOR("Mauri Sandberg <maukka@ext.kapsi.fi>");
++MODULE_DESCRIPTION("Generic GPIO cascade");
++MODULE_LICENSE("GPL");
diff --git a/target/linux/generic/pending-6.0/810-pci_disable_common_quirks.patch b/target/linux/generic/pending-6.0/810-pci_disable_common_quirks.patch
new file mode 100644
index 000000000..858b7a2db
--- /dev/null
+++ b/target/linux/generic/pending-6.0/810-pci_disable_common_quirks.patch
@@ -0,0 +1,62 @@
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: debloat: add kernel config option to disabling common PCI quirks
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/pci/Kconfig  | 6 ++++++
+ drivers/pci/quirks.c | 6 ++++++
+ 2 files changed, 12 insertions(+)
+
+--- a/drivers/pci/Kconfig
++++ b/drivers/pci/Kconfig
+@@ -118,6 +118,13 @@ config XEN_PCIDEV_FRONTEND
+ 	  The PCI device frontend driver allows the kernel to import arbitrary
+ 	  PCI devices from a PCI backend to support PCI driver domains.
+ 
++config PCI_DISABLE_COMMON_QUIRKS
++	bool "PCI disable common quirks"
++	depends on PCI
++	help
++	  If you don't know what to do here, say N.
++
++
+ config PCI_ATS
+ 	bool
+ 
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -207,6 +207,7 @@ static void quirk_mmio_always_on(struct
+ DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_ANY_ID, PCI_ANY_ID,
+ 				PCI_CLASS_BRIDGE_HOST, 8, quirk_mmio_always_on);
+ 
++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
+ /*
+  * The Mellanox Tavor device gives false positive parity errors.  Disable
+  * parity error reporting.
+@@ -3375,6 +3376,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata);
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata);
+ 
++#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
++
+ /*
+  * Ivytown NTB BAR sizes are misreported by the hardware due to an erratum.
+  * To work around this, query the size it should be configured to by the
+@@ -3400,6 +3403,8 @@ static void quirk_intel_ntb(struct pci_d
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e08, quirk_intel_ntb);
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e0d, quirk_intel_ntb);
+ 
++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
++
+ /*
+  * Some BIOS implementations leave the Intel GPU interrupts enabled, even
+  * though no one is handling them (e.g., if the i915 driver is never
+@@ -3438,6 +3443,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq);
+ 
++#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */
++
+ /*
+  * PCI devices which are on Intel chips can skip the 10ms delay
+  * before entering D3 mode.
diff --git a/target/linux/generic/pending-6.0/811-pci_disable_usb_common_quirks.patch b/target/linux/generic/pending-6.0/811-pci_disable_usb_common_quirks.patch
new file mode 100644
index 000000000..42a839783
--- /dev/null
+++ b/target/linux/generic/pending-6.0/811-pci_disable_usb_common_quirks.patch
@@ -0,0 +1,115 @@
+From: Felix Fietkau <nbd@nbd.name>
+Subject: debloat: disable common USB quirks
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/usb/host/pci-quirks.c | 16 ++++++++++++++++
+ drivers/usb/host/pci-quirks.h | 18 +++++++++++++++++-
+ include/linux/usb/hcd.h       |  7 +++++++
+ 3 files changed, 40 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/host/pci-quirks.c
++++ b/drivers/usb/host/pci-quirks.c
+@@ -128,6 +128,8 @@ struct amd_chipset_type {
+ 	u8 rev;
+ };
+ 
++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
++
+ static struct amd_chipset_info {
+ 	struct pci_dev	*nb_dev;
+ 	struct pci_dev	*smbus_dev;
+@@ -633,6 +635,10 @@ bool usb_amd_pt_check_port(struct device
+ }
+ EXPORT_SYMBOL_GPL(usb_amd_pt_check_port);
+ 
++#endif /* CONFIG_PCI_DISABLE_COMMON_QUIRKS */
++
++#if IS_ENABLED(CONFIG_USB_UHCI_HCD)
++
+ /*
+  * Make sure the controller is completely inactive, unable to
+  * generate interrupts or do DMA.
+@@ -712,8 +718,17 @@ reset_needed:
+ 	uhci_reset_hc(pdev, base);
+ 	return 1;
+ }
++#else
++int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base)
++{
++	return 0;
++}
++
++#endif
+ EXPORT_SYMBOL_GPL(uhci_check_and_reset_hc);
+ 
++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
++
+ static inline int io_type_enabled(struct pci_dev *pdev, unsigned int mask)
+ {
+ 	u16 cmd;
+@@ -1285,3 +1300,4 @@ static void quirk_usb_early_handoff(stru
+ }
+ DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,
+ 			PCI_CLASS_SERIAL_USB, 8, quirk_usb_early_handoff);
++#endif
+--- a/drivers/usb/host/pci-quirks.h
++++ b/drivers/usb/host/pci-quirks.h
+@@ -5,6 +5,9 @@
+ #ifdef CONFIG_USB_PCI
+ void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);
+ int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base);
++#endif  /* CONFIG_USB_PCI */
++
++#if defined(CONFIG_USB_PCI) && !defined(CONFIG_PCI_DISABLE_COMMON_QUIRKS)
+ int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev);
+ bool usb_amd_hang_symptom_quirk(void);
+ bool usb_amd_prefetch_quirk(void);
+@@ -19,6 +22,18 @@ void sb800_prefetch(struct device *dev,
+ bool usb_amd_pt_check_port(struct device *device, int port);
+ #else
+ struct pci_dev;
++static inline int usb_amd_quirk_pll_check(void)
++{
++	return 0;
++}
++static inline bool usb_amd_hang_symptom_quirk(void)
++{
++	return false;
++}
++static inline bool usb_amd_prefetch_quirk(void)
++{
++	return false;
++}
+ static inline void usb_amd_quirk_pll_disable(void) {}
+ static inline void usb_amd_quirk_pll_enable(void) {}
+ static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {}
+@@ -29,6 +44,11 @@ static inline bool usb_amd_pt_check_port
+ {
+ 	return false;
+ }
++static inline void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev) {}
++static inline bool usb_xhci_needs_pci_reset(struct pci_dev *pdev)
++{
++	return false;
++}
+ #endif  /* CONFIG_USB_PCI */
+ 
+ #endif  /*  __LINUX_USB_PCI_QUIRKS_H  */
+--- a/include/linux/usb/hcd.h
++++ b/include/linux/usb/hcd.h
+@@ -484,7 +484,14 @@ extern int usb_hcd_pci_probe(struct pci_
+ extern void usb_hcd_pci_remove(struct pci_dev *dev);
+ extern void usb_hcd_pci_shutdown(struct pci_dev *dev);
+ 
++#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS
+ extern int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev);
++#else
++static inline int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev)
++{
++	return 0;
++}
++#endif
+ 
+ #ifdef CONFIG_PM
+ extern const struct dev_pm_ops usb_hcd_pci_pm_ops;
diff --git a/target/linux/generic/pending-6.0/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch b/target/linux/generic/pending-6.0/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch
new file mode 100644
index 000000000..33eb34c91
--- /dev/null
+++ b/target/linux/generic/pending-6.0/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch
@@ -0,0 +1,26 @@
+From d9c8bc8c1408f3e8529db6e4e04017b4c579c342 Mon Sep 17 00:00:00 2001
+From: Pawel Dembicki <paweldembicki@gmail.com>
+Date: Sun, 18 Feb 2018 17:08:04 +0100
+Subject: [PATCH] w1: gpio: fix problem with platfom data in w1-gpio
+
+In devices, where fdt is used, is impossible to apply platform data
+without proper fdt node.
+
+This patch allow to use platform data in devices with fdt.
+
+Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
+---
+ drivers/w1/masters/w1-gpio.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+--- a/drivers/w1/masters/w1-gpio.c
++++ b/drivers/w1/masters/w1-gpio.c
+@@ -76,7 +76,7 @@ static int w1_gpio_probe(struct platform
+ 	enum gpiod_flags gflags = GPIOD_OUT_LOW_OPEN_DRAIN;
+ 	int err;
+ 
+-	if (of_have_populated_dt()) {
++	if (of_have_populated_dt() && !dev_get_platdata(&pdev->dev)) {
+ 		pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+ 		if (!pdata)
+ 			return -ENOMEM;
diff --git a/target/linux/generic/pending-6.0/834-ledtrig-libata.patch b/target/linux/generic/pending-6.0/834-ledtrig-libata.patch
new file mode 100644
index 000000000..84415e40d
--- /dev/null
+++ b/target/linux/generic/pending-6.0/834-ledtrig-libata.patch
@@ -0,0 +1,149 @@
+From: Daniel Golle <daniel@makrotopia.org>
+Subject: libata: add ledtrig support
+
+This adds a LED trigger for each ATA port indicating disk activity.
+
+As this is needed only on specific platforms (NAS SoCs and such),
+these platforms should define ARCH_WANTS_LIBATA_LEDS if there
+are boards with LED(s) intended to indicate ATA disk activity and
+need the OS to take care of that.
+In that way, if not selected, LED trigger support not will be
+included in libata-core and both, codepaths and structures remain
+untouched.
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+---
+ drivers/ata/Kconfig       | 16 ++++++++++++++++
+ drivers/ata/libata-core.c | 41 +++++++++++++++++++++++++++++++++++++++++
+ include/linux/libata.h    |  9 +++++++++
+ 3 files changed, 66 insertions(+)
+
+--- a/drivers/ata/Kconfig
++++ b/drivers/ata/Kconfig
+@@ -67,6 +67,22 @@ config ATA_FORCE
+ 
+ 	  If unsure, say Y.
+ 
++config ARCH_WANT_LIBATA_LEDS
++	bool
++
++config ATA_LEDS
++	bool "support ATA port LED triggers"
++	depends on ARCH_WANT_LIBATA_LEDS
++	select NEW_LEDS
++	select LEDS_CLASS
++	select LEDS_TRIGGERS
++	default y
++	help
++	  This option adds a LED trigger for each registered ATA port.
++	  It is used to drive disk activity leds connected via GPIO.
++
++	  If unsure, say N.
++
+ config ATA_ACPI
+ 	bool "ATA ACPI Support"
+ 	depends on ACPI
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -663,6 +663,19 @@ u64 ata_tf_read_block(const struct ata_t
+ 	return block;
+ }
+ 
++#ifdef CONFIG_ATA_LEDS
++#define LIBATA_BLINK_DELAY 20 /* ms */
++static inline void ata_led_act(struct ata_port *ap)
++{
++	unsigned long led_delay = LIBATA_BLINK_DELAY;
++
++	if (unlikely(!ap->ledtrig))
++		return;
++
++	led_trigger_blink_oneshot(ap->ledtrig, &led_delay, &led_delay, 0);
++}
++#endif
++
+ /**
+  *	ata_build_rw_tf - Build ATA taskfile for given read/write request
+  *	@tf: Target ATA taskfile
+@@ -4621,6 +4634,9 @@ void __ata_qc_complete(struct ata_queued
+ 		link->active_tag = ATA_TAG_POISON;
+ 		ap->nr_active_links--;
+ 	}
++#ifdef CONFIG_ATA_LEDS
++	ata_led_act(ap);
++#endif
+ 
+ 	/* clear exclusive status */
+ 	if (unlikely(qc->flags & ATA_QCFLAG_CLEAR_EXCL &&
+@@ -5327,6 +5343,9 @@ struct ata_port *ata_port_alloc(struct a
+ 	ap->stats.unhandled_irq = 1;
+ 	ap->stats.idle_irq = 1;
+ #endif
++#ifdef CONFIG_ATA_LEDS
++	ap->ledtrig = kzalloc(sizeof(struct led_trigger), GFP_KERNEL);
++#endif
+ 	ata_sff_port_init(ap);
+ 
+ 	return ap;
+@@ -5362,6 +5381,12 @@ static void ata_host_release(struct kref
+ 
+ 		kfree(ap->pmp_link);
+ 		kfree(ap->slave_link);
++#ifdef CONFIG_ATA_LEDS
++		if (ap->ledtrig) {
++			led_trigger_unregister(ap->ledtrig);
++			kfree(ap->ledtrig);
++		};
++#endif
+ 		kfree(ap);
+ 		host->ports[i] = NULL;
+ 	}
+@@ -5764,7 +5789,23 @@ int ata_host_register(struct ata_host *h
+ 		host->ports[i]->print_id = atomic_inc_return(&ata_print_id);
+ 		host->ports[i]->local_port_no = i + 1;
+ 	}
++#ifdef CONFIG_ATA_LEDS
++	for (i = 0; i < host->n_ports; i++) {
++		if (unlikely(!host->ports[i]->ledtrig))
++			continue;
+ 
++		snprintf(host->ports[i]->ledtrig_name,
++			sizeof(host->ports[i]->ledtrig_name), "ata%u",
++			host->ports[i]->print_id);
++
++		host->ports[i]->ledtrig->name = host->ports[i]->ledtrig_name;
++
++		if (led_trigger_register(host->ports[i]->ledtrig)) {
++			kfree(host->ports[i]->ledtrig);
++			host->ports[i]->ledtrig = NULL;
++		}
++	}
++#endif
+ 	/* Create associated sysfs transport objects  */
+ 	for (i = 0; i < host->n_ports; i++) {
+ 		rc = ata_tport_add(host->dev,host->ports[i]);
+--- a/include/linux/libata.h
++++ b/include/linux/libata.h
+@@ -23,6 +23,9 @@
+ #include <linux/cdrom.h>
+ #include <linux/sched.h>
+ #include <linux/async.h>
++#ifdef CONFIG_ATA_LEDS
++#include <linux/leds.h>
++#endif
+ 
+ /*
+  * Define if arch has non-standard setup.  This is a _PCI_ standard
+@@ -857,6 +860,12 @@ struct ata_port {
+ #ifdef CONFIG_ATA_ACPI
+ 	struct ata_acpi_gtm	__acpi_init_gtm; /* use ata_acpi_init_gtm() */
+ #endif
++
++#ifdef CONFIG_ATA_LEDS
++	struct led_trigger	*ledtrig;
++	char			ledtrig_name[8];
++#endif
++
+ 	/* owned by EH */
+ 	u8			sector_buf[ATA_SECT_SIZE] ____cacheline_aligned;
+ };
diff --git a/target/linux/generic/pending-6.0/840-hwrng-bcm2835-set-quality-to-1000.patch b/target/linux/generic/pending-6.0/840-hwrng-bcm2835-set-quality-to-1000.patch
new file mode 100644
index 000000000..5ca8933d6
--- /dev/null
+++ b/target/linux/generic/pending-6.0/840-hwrng-bcm2835-set-quality-to-1000.patch
@@ -0,0 +1,26 @@
+From d6988cf1d16faac56899918bb2b1be8d85155e3f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
+Date: Sat, 20 Feb 2021 18:36:38 +0100
+Subject: [PATCH] hwrng: bcm2835: set quality to 1000
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This allows devices without a high precission timer to reduce boot from >100s
+to <30s.
+
+Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+---
+ drivers/char/hw_random/bcm2835-rng.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/char/hw_random/bcm2835-rng.c
++++ b/drivers/char/hw_random/bcm2835-rng.c
+@@ -170,6 +170,7 @@ static int bcm2835_rng_probe(struct plat
+ 	priv->rng.init = bcm2835_rng_init;
+ 	priv->rng.read = bcm2835_rng_read;
+ 	priv->rng.cleanup = bcm2835_rng_cleanup;
++	priv->rng.quality = 1000;
+ 
+ 	if (dev_of_node(dev)) {
+ 		rng_id = of_match_node(bcm2835_rng_of_match, dev->of_node);
diff --git a/target/linux/generic/pending-6.0/920-mangle_bootargs.patch b/target/linux/generic/pending-6.0/920-mangle_bootargs.patch
new file mode 100644
index 000000000..e87b48f4f
--- /dev/null
+++ b/target/linux/generic/pending-6.0/920-mangle_bootargs.patch
@@ -0,0 +1,71 @@
+From: Imre Kaloz <kaloz@openwrt.org>
+Subject: init: add CONFIG_MANGLE_BOOTARGS and disable it by default
+
+Enabling this option renames the bootloader supplied root=
+and rootfstype= variables, which might have to be know but
+would break the automatisms OpenWrt uses.
+
+Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
+---
+ init/Kconfig |  9 +++++++++
+ init/main.c  | 24 ++++++++++++++++++++++++
+ 2 files changed, 33 insertions(+)
+
+--- a/init/Kconfig
++++ b/init/Kconfig
+@@ -1809,6 +1809,15 @@ config EMBEDDED
+ 	  an embedded system so certain expert options are available
+ 	  for configuration.
+ 
++config MANGLE_BOOTARGS
++	bool "Rename offending bootargs"
++	depends on EXPERT
++	help
++	  Sometimes the bootloader passed bogus root= and rootfstype=
++	  parameters to the kernel, and while you want to ignore them,
++	  you need to know the values f.e. to support dual firmware
++	  layouts on the flash.
++
+ config HAVE_PERF_EVENTS
+ 	bool
+ 	help
+--- a/init/main.c
++++ b/init/main.c
+@@ -607,6 +607,29 @@ static inline void setup_nr_cpu_ids(void
+ static inline void smp_prepare_cpus(unsigned int maxcpus) { }
+ #endif
+ 
++#ifdef CONFIG_MANGLE_BOOTARGS
++static void __init mangle_bootargs(char *command_line)
++{
++	char *rootdev;
++	char *rootfs;
++
++	rootdev = strstr(command_line, "root=/dev/mtdblock");
++
++	if (rootdev)
++		strncpy(rootdev, "mangled_rootblock=", 18);
++
++	rootfs = strstr(command_line, "rootfstype");
++
++	if (rootfs)
++		strncpy(rootfs, "mangled_fs", 10);
++
++}
++#else
++static void __init mangle_bootargs(char *command_line)
++{
++}
++#endif
++
+ /*
+  * We need to store the untouched command line for future reference.
+  * We also need to store the touched command line since the parameter
+@@ -950,6 +973,7 @@ asmlinkage __visible void __init __no_sa
+ 	pr_notice("%s", linux_banner);
+ 	early_security_init();
+ 	setup_arch(&command_line);
++	mangle_bootargs(command_line);
+ 	setup_boot_config();
+ 	setup_command_line(command_line);
+ 	setup_nr_cpu_ids();
diff --git a/target/linux/rockchip/Makefile b/target/linux/rockchip/Makefile
index 5b08bbcb8..bacd4e190 100644
--- a/target/linux/rockchip/Makefile
+++ b/target/linux/rockchip/Makefile
@@ -7,7 +7,7 @@ BOARDNAME:=Rockchip
 FEATURES:=ext4 audio usb usbgadget display gpio fpu pci pcie rootfs-part boot-part squashfs
 SUBTARGETS:=armv8
 
-KERNEL_PATCHVER=5.4
+KERNEL_PATCHVER=6.0
 KERNEL_TESTING_PATCHVER=5.15
 
 define Target/Description
diff --git a/target/linux/rockchip/armv8/config-6.0 b/target/linux/rockchip/armv8/config-6.0
new file mode 100644
index 000000000..254c3517a
--- /dev/null
+++ b/target/linux/rockchip/armv8/config-6.0
@@ -0,0 +1,768 @@
+CONFIG_64BIT=y
+CONFIG_AF_UNIX_OOB=y
+CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y
+CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
+CONFIG_ARCH_DMA_ADDR_T_64BIT=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_KEEP_MEMBLOCK=y
+CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y
+CONFIG_ARCH_MMAP_RND_BITS_MAX=33
+CONFIG_ARCH_MMAP_RND_BITS_MIN=18
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11
+CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
+CONFIG_ARCH_NR_GPIO=0
+CONFIG_ARCH_PROC_KCORE_TEXT=y
+CONFIG_ARCH_ROCKCHIP=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_STACKWALK=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_ARCH_WANTS_NO_INSTR=y
+CONFIG_ARCH_WANTS_THP_SWAP=y
+CONFIG_ARC_EMAC_CORE=y
+CONFIG_ARM64=y
+CONFIG_ARM64_CNP=y
+CONFIG_ARM64_CRYPTO=y
+CONFIG_ARM64_EPAN=y
+CONFIG_ARM64_ERRATUM_2441007=y
+CONFIG_ARM64_ERRATUM_819472=y
+CONFIG_ARM64_ERRATUM_824069=y
+CONFIG_ARM64_ERRATUM_826319=y
+CONFIG_ARM64_ERRATUM_827319=y
+CONFIG_ARM64_ERRATUM_832075=y
+CONFIG_ARM64_ERRATUM_843419=y
+CONFIG_ARM64_ERRATUM_845719=y
+CONFIG_ARM64_ERRATUM_858921=y
+CONFIG_ARM64_HW_AFDBM=y
+CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y
+CONFIG_ARM64_MODULE_PLTS=y
+CONFIG_ARM64_PAGE_SHIFT=12
+CONFIG_ARM64_PAN=y
+CONFIG_ARM64_PA_BITS=48
+CONFIG_ARM64_PA_BITS_48=y
+CONFIG_ARM64_PTR_AUTH=y
+CONFIG_ARM64_PTR_AUTH_KERNEL=y
+CONFIG_ARM64_RAS_EXTN=y
+CONFIG_ARM64_SVE=y
+# CONFIG_ARM64_SW_TTBR0_PAN is not set
+CONFIG_ARM64_TAGGED_ADDR_ABI=y
+CONFIG_ARM64_VA_BITS=48
+# CONFIG_ARM64_VA_BITS_39 is not set
+CONFIG_ARM64_VA_BITS_48=y
+CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y
+CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y
+# CONFIG_ARMV8_DEPRECATED is not set
+CONFIG_ARM_AMBA=y
+CONFIG_ARM_ARCH_TIMER=y
+CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y
+CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y
+CONFIG_ARM_GIC=y
+CONFIG_ARM_GIC_V2M=y
+CONFIG_ARM_GIC_V3=y
+CONFIG_ARM_GIC_V3_ITS=y
+CONFIG_ARM_GIC_V3_ITS_PCI=y
+CONFIG_ARM_MHU=y
+CONFIG_ARM_PSCI_CPUIDLE=y
+CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y
+CONFIG_ARM_PSCI_FW=y
+CONFIG_ARM_RK3328_DMC_DEVFREQ=y
+# CONFIG_ARM_RK3399_DMC_DEVFREQ is not set
+# CONFIG_ARM_SCMI_CPUFREQ is not set
+CONFIG_ARM_SCMI_HAVE_SHMEM=y
+CONFIG_ARM_SCMI_HAVE_TRANSPORT=y
+CONFIG_ARM_SCMI_POWER_CONTROL=y
+CONFIG_ARM_SCMI_POWER_DOMAIN=y
+CONFIG_ARM_SCMI_PROTOCOL=y
+CONFIG_ARM_SCMI_TRANSPORT_MAILBOX=y
+CONFIG_ARM_SCMI_TRANSPORT_SMC=y
+# CONFIG_ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE is not set
+CONFIG_ARM_SCPI_CPUFREQ=y
+CONFIG_ARM_SCPI_POWER_DOMAIN=y
+CONFIG_ARM_SCPI_PROTOCOL=y
+CONFIG_ARM_SMMU=y
+CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y
+# CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set
+CONFIG_ARM_SMMU_V3=y
+# CONFIG_ARM_SMMU_V3_SVA is not set
+CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_GPIO=y
+CONFIG_BACKLIGHT_PWM=y
+CONFIG_BINARY_PRINTF=y
+CONFIG_BLK_DEV_BSG=y
+CONFIG_BLK_DEV_BSGLIB=y
+CONFIG_BLK_DEV_BSG_COMMON=y
+# CONFIG_BLK_DEV_INITRD is not set
+CONFIG_BLK_DEV_INTEGRITY=y
+CONFIG_BLK_DEV_INTEGRITY_T10=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_NVME=y
+CONFIG_BLK_DEV_PCIESSD_MTIP32XX=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_MQ_PCI=y
+CONFIG_BLK_PM=y
+CONFIG_BLOCK_COMPAT=y
+CONFIG_BRCMSTB_GISB_ARB=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y
+CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
+CONFIG_CHARGER_GPIO=y
+CONFIG_CLKSRC_MMIO=y
+CONFIG_CLK_PX30=y
+CONFIG_CLK_RK3308=y
+CONFIG_CLK_RK3328=y
+CONFIG_CLK_RK3368=y
+CONFIG_CLK_RK3399=y
+CONFIG_CLK_RK3568=y
+CONFIG_CLONE_BACKWARDS=y
+CONFIG_CMA=y
+CONFIG_CMA_ALIGNMENT=8
+CONFIG_CMA_AREAS=7
+# CONFIG_CMA_DEBUG is not set
+# CONFIG_CMA_DEBUGFS is not set
+CONFIG_CMA_SIZE_MBYTES=5
+# CONFIG_CMA_SIZE_SEL_MAX is not set
+CONFIG_CMA_SIZE_SEL_MBYTES=y
+# CONFIG_CMA_SIZE_SEL_MIN is not set
+# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
+CONFIG_COMMON_CLK=y
+CONFIG_COMMON_CLK_RK808=y
+CONFIG_COMMON_CLK_ROCKCHIP=y
+CONFIG_COMMON_CLK_SCMI=y
+CONFIG_COMMON_CLK_SCPI=y
+CONFIG_COMPAT=y
+CONFIG_COMPAT_32BIT_TIME=y
+CONFIG_COMPAT_BINFMT_ELF=y
+CONFIG_COMPAT_NETLINK_MESSAGES=y
+CONFIG_COMPAT_OLD_SIGACTION=y
+CONFIG_CONFIGFS_FS=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_CONTEXT_TRACKING=y
+CONFIG_CONTEXT_TRACKING_IDLE=y
+CONFIG_CONTIG_ALLOC=y
+CONFIG_CPUFREQ_DT=y
+CONFIG_CPUFREQ_DT_PLATDEV=y
+CONFIG_CPU_FREQ=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
+CONFIG_CPU_FREQ_GOV_ATTR_SET=y
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
+# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y
+CONFIG_CPU_ISOLATION=y
+CONFIG_CPU_PM=y
+CONFIG_CPU_RMAP=y
+CONFIG_CPU_THERMAL=y
+CONFIG_CRASH_CORE=y
+CONFIG_CRASH_DUMP=y
+CONFIG_CRC16=y
+# CONFIG_CRC32_SARWATE is not set
+CONFIG_CRC32_SLICEBY8=y
+CONFIG_CRC64=y
+CONFIG_CRC64_ROCKSOFT=y
+CONFIG_CRC_T10DIF=y
+CONFIG_CROSS_MEMORY_ATTACH=y
+CONFIG_CRYPTO_ADIANTUM=y
+CONFIG_CRYPTO_AEGIS128=y
+CONFIG_CRYPTO_AEGIS128_SIMD=y
+CONFIG_CRYPTO_AES_ARM64=y
+CONFIG_CRYPTO_AES_ARM64_BS=y
+CONFIG_CRYPTO_AES_ARM64_CE=y
+CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
+CONFIG_CRYPTO_AES_ARM64_CE_CCM=y
+CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y
+CONFIG_CRYPTO_AES_TI=y
+CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y
+CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y
+CONFIG_CRYPTO_AUTHENC=y
+CONFIG_CRYPTO_BLAKE2B=y
+CONFIG_CRYPTO_BLOWFISH=y
+CONFIG_CRYPTO_BLOWFISH_COMMON=y
+CONFIG_CRYPTO_CAMELLIA=y
+CONFIG_CRYPTO_CAST5=y
+CONFIG_CRYPTO_CAST6=y
+CONFIG_CRYPTO_CAST_COMMON=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_CFB=y
+CONFIG_CRYPTO_CHACHA20=y
+CONFIG_CRYPTO_CHACHA20_NEON=y
+CONFIG_CRYPTO_CRC32=y
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_CRC64_ROCKSOFT=y
+CONFIG_CRYPTO_CRCT10DIF=y
+CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y
+CONFIG_CRYPTO_CRYPTD=y
+CONFIG_CRYPTO_CTS=y
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_DEV_CCREE=y
+CONFIG_CRYPTO_DEV_ROCKCHIP=y
+CONFIG_CRYPTO_DEV_ROCKCHIP2=y
+CONFIG_CRYPTO_DEV_ROCKCHIP2_DEBUG=y
+CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG=y
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_ENGINE=y
+CONFIG_CRYPTO_ESSIV=y
+CONFIG_CRYPTO_GHASH_ARM64_CE=y
+CONFIG_CRYPTO_HCTR2=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_HW=y
+CONFIG_CRYPTO_KEYWRAP=y
+CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y
+CONFIG_CRYPTO_LIB_DES=y
+CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y
+CONFIG_CRYPTO_LIB_SHA1=y
+CONFIG_CRYPTO_LIB_SHA256=y
+CONFIG_CRYPTO_LRW=y
+CONFIG_CRYPTO_MD4=y
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
+CONFIG_CRYPTO_NHPOLY1305=y
+CONFIG_CRYPTO_NHPOLY1305_NEON=y
+CONFIG_CRYPTO_OFB=y
+CONFIG_CRYPTO_PCBC=y
+CONFIG_CRYPTO_POLY1305=y
+CONFIG_CRYPTO_POLY1305_NEON=y
+CONFIG_CRYPTO_POLYVAL=y
+CONFIG_CRYPTO_POLYVAL_ARM64_CE=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA1_ARM64_CE=y
+CONFIG_CRYPTO_SHA256_ARM64=y
+CONFIG_CRYPTO_SHA2_ARM64_CE=y
+CONFIG_CRYPTO_SHA3=y
+CONFIG_CRYPTO_SHA3_ARM64=y
+CONFIG_CRYPTO_SHA512=y
+CONFIG_CRYPTO_SHA512_ARM64=y
+CONFIG_CRYPTO_SHA512_ARM64_CE=y
+CONFIG_CRYPTO_SM3=y
+CONFIG_CRYPTO_SM3_ARM64_CE=y
+CONFIG_CRYPTO_SM3_GENERIC=y
+CONFIG_CRYPTO_SM4=y
+CONFIG_CRYPTO_SM4_ARM64_CE=y
+CONFIG_CRYPTO_SM4_ARM64_CE_BLK=y
+CONFIG_CRYPTO_SM4_ARM64_NEON_BLK=y
+CONFIG_CRYPTO_XCTR=y
+CONFIG_CRYPTO_XTS=y
+CONFIG_CRYPTO_XXHASH=y
+CONFIG_DCACHE_WORD_ACCESS=y
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y
+# CONFIG_DEVFREQ_GOV_PASSIVE is not set
+CONFIG_DEVFREQ_GOV_PERFORMANCE=y
+CONFIG_DEVFREQ_GOV_POWERSAVE=y
+CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
+CONFIG_DEVFREQ_GOV_USERSPACE=y
+# CONFIG_DEVFREQ_THERMAL is not set
+CONFIG_DEVMEM=y
+# CONFIG_DEVPORT is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_DMADEVICES=y
+CONFIG_DMA_CMA=y
+CONFIG_DMA_DIRECT_REMAP=y
+CONFIG_DMA_ENGINE=y
+CONFIG_DMA_OF=y
+CONFIG_DMA_OPS=y
+CONFIG_DMA_SHARED_BUFFER=y
+CONFIG_DNOTIFY=y
+CONFIG_DTC=y
+CONFIG_DT_IDLE_GENPD=y
+CONFIG_DT_IDLE_STATES=y
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_DWMAC_DWC_QOS_ETH=y
+CONFIG_DWMAC_GENERIC=y
+CONFIG_DWMAC_ROCKCHIP=y
+CONFIG_EDAC_SUPPORT=y
+CONFIG_EEPROM_AT24=y
+CONFIG_EMAC_ROCKCHIP=y
+CONFIG_ENERGY_MODEL=y
+CONFIG_EXCLUSIVE_SYSTEM_RAM=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXTCON=y
+CONFIG_F2FS_FS=y
+CONFIG_FANOTIFY=y
+CONFIG_FHANDLE=y
+CONFIG_FIXED_PHY=y
+CONFIG_FIX_EARLYCON_MEM=y
+# CONFIG_FORTIFY_SOURCE is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FRAME_WARN=2048
+CONFIG_FS_IOMAP=y
+CONFIG_FS_MBCACHE=y
+CONFIG_FS_POSIX_ACL=y
+CONFIG_FWNODE_MDIO=y
+CONFIG_FW_LOADER_PAGED_BUF=y
+CONFIG_FW_LOADER_SYSFS=y
+CONFIG_GCC12_NO_ARRAY_BOUNDS=y
+CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y
+CONFIG_GENERIC_ALLOCATOR=y
+CONFIG_GENERIC_ARCH_TOPOLOGY=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_GENERIC_CPU_AUTOPROBE=y
+CONFIG_GENERIC_CPU_VULNERABILITIES=y
+CONFIG_GENERIC_CSUM=y
+CONFIG_GENERIC_EARLY_IOREMAP=y
+CONFIG_GENERIC_GETTIMEOFDAY=y
+CONFIG_GENERIC_IDLE_POLL_SETUP=y
+CONFIG_GENERIC_IOREMAP=y
+CONFIG_GENERIC_IRQ_CHIP=y
+CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
+CONFIG_GENERIC_IRQ_MIGRATION=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
+CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y
+CONFIG_GENERIC_MSI_IRQ=y
+CONFIG_GENERIC_MSI_IRQ_DOMAIN=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_GENERIC_PHY=y
+CONFIG_GENERIC_PINCONF=y
+CONFIG_GENERIC_SCHED_CLOCK=y
+CONFIG_GENERIC_SMP_IDLE_THREAD=y
+CONFIG_GENERIC_STRNCPY_FROM_USER=y
+CONFIG_GENERIC_STRNLEN_USER=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIOLIB_IRQCHIP=y
+CONFIG_GPIO_CDEV=y
+CONFIG_GPIO_DWAPB=y
+CONFIG_GPIO_GENERIC=y
+CONFIG_GPIO_GENERIC_PLATFORM=y
+CONFIG_GPIO_ROCKCHIP=y
+# CONFIG_HARDENED_USERCOPY is not set
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_HID=y
+CONFIG_HID_GENERIC=y
+# CONFIG_HID_TOPRE is not set
+CONFIG_HOTPLUG_CPU=y
+CONFIG_HOTPLUG_PCI=y
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+# CONFIG_HOTPLUG_PCI_PCIE is not set
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
+# CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON is not set
+CONFIG_HWMON=y
+CONFIG_HWSPINLOCK=y
+CONFIG_HW_CONSOLE=y
+CONFIG_HW_RANDOM=y
+CONFIG_HW_RANDOM_ROCKCHIP=y
+CONFIG_HZ=250
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_COMPAT=y
+CONFIG_I2C_HELPER_AUTO=y
+CONFIG_I2C_RK3X=y
+CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
+CONFIG_INDIRECT_PIO=y
+CONFIG_INPUT=y
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_FF_MEMLESS=y
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_INPUT_LEDS=y
+CONFIG_INPUT_MATRIXKMAP=y
+# CONFIG_INPUT_MISC is not set
+CONFIG_IOMMU_API=y
+# CONFIG_IOMMU_DEBUGFS is not set
+# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set
+CONFIG_IOMMU_DEFAULT_DMA_STRICT=y
+CONFIG_IOMMU_DMA=y
+CONFIG_IOMMU_IOVA=y
+CONFIG_IOMMU_IO_PGTABLE=y
+# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set
+CONFIG_IOMMU_IO_PGTABLE_LPAE=y
+# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set
+CONFIG_IOMMU_SUPPORT=y
+# CONFIG_IO_STRICT_DEVMEM is not set
+CONFIG_IO_URING=y
+CONFIG_IRQCHIP=y
+CONFIG_IRQ_DOMAIN=y
+CONFIG_IRQ_DOMAIN_HIERARCHY=y
+CONFIG_IRQ_FORCED_THREADING=y
+CONFIG_IRQ_MSI_IOMMU=y
+CONFIG_IRQ_TIME_ACCOUNTING=y
+CONFIG_IRQ_WORK=y
+CONFIG_JBD2=y
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JLSEMI_JL2XX1_PHY=y
+CONFIG_JUMP_LABEL=y
+CONFIG_KALLSYMS=y
+CONFIG_KEXEC_CORE=y
+CONFIG_KEXEC_FILE=y
+# CONFIG_KEXEC_SIG is not set
+CONFIG_KSM=y
+# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_PWM=y
+CONFIG_LEDS_SYSCON=y
+CONFIG_LEDS_TRIGGER_CPU=y
+CONFIG_LEDS_TRIGGER_PANIC=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=16
+CONFIG_LIBCRC32C=y
+CONFIG_LIBFDT=y
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_LOCK_DEBUGGING_SUPPORT=y
+CONFIG_LOCK_SPIN_ON_OWNER=y
+CONFIG_LOG_BUF_SHIFT=19
+CONFIG_LTO_NONE=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_MAGIC_SYSRQ_SERIAL=y
+CONFIG_MAILBOX=y
+# CONFIG_MAILBOX_TEST is not set
+CONFIG_MDIO_BUS=y
+CONFIG_MDIO_BUS_MUX=y
+CONFIG_MDIO_BUS_MUX_GPIO=y
+CONFIG_MDIO_BUS_MUX_MMIOREG=y
+CONFIG_MDIO_DEVICE=y
+CONFIG_MDIO_DEVRES=y
+CONFIG_MEMFD_CREATE=y
+CONFIG_MEMORY_ISOLATION=y
+CONFIG_MFD_CORE=y
+# CONFIG_MFD_KHADAS_MCU is not set
+CONFIG_MFD_RK808=y
+CONFIG_MFD_SYSCON=y
+CONFIG_MIGRATION=y
+CONFIG_MMC=y
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_MINORS=32
+CONFIG_MMC_CQHCI=y
+CONFIG_MMC_DW=y
+# CONFIG_MMC_DW_BLUEFIELD is not set
+# CONFIG_MMC_DW_EXYNOS is not set
+# CONFIG_MMC_DW_HI3798CV200 is not set
+# CONFIG_MMC_DW_K3 is not set
+# CONFIG_MMC_DW_PCI is not set
+CONFIG_MMC_DW_PLTFM=y
+CONFIG_MMC_DW_ROCKCHIP=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_OF_ARASAN=y
+CONFIG_MMC_SDHCI_OF_DWCMSHC=y
+# CONFIG_MMC_SDHCI_PCI is not set
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MODULES_USE_ELF_RELA=y
+CONFIG_MOTORCOMM_PHY=y
+CONFIG_MQ_IOSCHED_DEADLINE=y
+# CONFIG_MTD_CFI is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+CONFIG_MTD_SPI_NOR=y
+# CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set
+CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y
+CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
+CONFIG_MTD_SPLIT_FIRMWARE=y
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+CONFIG_NET_FLOW_LIMIT=y
+CONFIG_NET_SELFTESTS=y
+CONFIG_NET_SOCK_MSG=y
+CONFIG_NLS=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NOP_USB_XCEIV=y
+CONFIG_NO_HZ_COMMON=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_NVMEM=y
+# CONFIG_NVMEM_RMEM is not set
+CONFIG_NVMEM_SYSFS=y
+CONFIG_NVME_CORE=y
+# CONFIG_NVME_HWMON is not set
+# CONFIG_NVME_MULTIPATH is not set
+CONFIG_OF=y
+CONFIG_OF_ADDRESS=y
+CONFIG_OF_DYNAMIC=y
+CONFIG_OF_EARLY_FLATTREE=y
+CONFIG_OF_FLATTREE=y
+CONFIG_OF_GPIO=y
+CONFIG_OF_IOMMU=y
+CONFIG_OF_IRQ=y
+CONFIG_OF_KOBJ=y
+CONFIG_OF_MDIO=y
+CONFIG_OF_OVERLAY=y
+CONFIG_OF_RESOLVE=y
+CONFIG_OLD_SIGSUSPEND3=y
+# CONFIG_OVERLAY_FS_XINO_AUTO is not set
+CONFIG_PADATA=y
+CONFIG_PAGE_POOL=y
+CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
+CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
+CONFIG_PAHOLE_VERSION=0
+# CONFIG_PANIC_ON_OOPS is not set
+CONFIG_PANIC_ON_OOPS_VALUE=0
+CONFIG_PANIC_TIMEOUT=0
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_PARTITION_PERCPU=y
+CONFIG_PCI=y
+CONFIG_PCIEAER=y
+CONFIG_PCIEASPM=y
+CONFIG_PCIEASPM_DEFAULT=y
+# CONFIG_PCIEASPM_PERFORMANCE is not set
+# CONFIG_PCIEASPM_POWERSAVE is not set
+# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set
+CONFIG_PCIEPORTBUS=y
+CONFIG_PCIE_DW=y
+CONFIG_PCIE_DW_HOST=y
+CONFIG_PCIE_PME=y
+CONFIG_PCIE_ROCKCHIP=y
+CONFIG_PCIE_ROCKCHIP_DW_HOST=y
+CONFIG_PCIE_ROCKCHIP_HOST=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_DOMAINS_GENERIC=y
+CONFIG_PCI_MSI=y
+CONFIG_PCI_MSI_IRQ_DOMAIN=y
+CONFIG_PCI_STUB=y
+CONFIG_PCS_XPCS=y
+CONFIG_PGTABLE_LEVELS=4
+CONFIG_PHYLIB=y
+CONFIG_PHYLINK=y
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_PHY_ROCKCHIP_DP=y
+# CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set
+CONFIG_PHY_ROCKCHIP_EMMC=y
+# CONFIG_PHY_ROCKCHIP_INNO_HDMI is not set
+CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y
+CONFIG_PHY_ROCKCHIP_PCIE=y
+CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y
+CONFIG_PHY_ROCKCHIP_TYPEC=y
+CONFIG_PHY_ROCKCHIP_USB=y
+CONFIG_PINCTRL=y
+# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set
+# CONFIG_PINCTRL_RK805 is not set
+CONFIG_PINCTRL_ROCKCHIP=y
+# CONFIG_PINCTRL_SINGLE is not set
+CONFIG_PL330_DMA=y
+CONFIG_PLATFORM_MHU=y
+CONFIG_PM=y
+CONFIG_PM_CLK=y
+CONFIG_PM_DEVFREQ=y
+CONFIG_PM_DEVFREQ_EVENT=y
+CONFIG_PM_GENERIC_DOMAINS=y
+CONFIG_PM_GENERIC_DOMAINS_OF=y
+CONFIG_PM_OPP=y
+CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
+CONFIG_POWER_RESET=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_HWMON=y
+CONFIG_PREEMPT=y
+CONFIG_PREEMPTION=y
+CONFIG_PREEMPT_BUILD=y
+CONFIG_PREEMPT_COUNT=y
+# CONFIG_PREEMPT_NONE is not set
+CONFIG_PREEMPT_RCU=y
+CONFIG_PRINTK_TIME=y
+# CONFIG_PRINT_QUOTA_WARNING is not set
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_PROC_VMCORE=y
+CONFIG_PTP_1588_CLOCK_OPTIONAL=y
+CONFIG_PWM=y
+CONFIG_PWM_ROCKCHIP=y
+CONFIG_PWM_SYSFS=y
+# CONFIG_QFMT_V1 is not set
+# CONFIG_QFMT_V2 is not set
+CONFIG_QUEUED_RWLOCKS=y
+CONFIG_QUEUED_SPINLOCKS=y
+CONFIG_QUOTA=y
+CONFIG_QUOTACTL=y
+# CONFIG_QUOTA_NETLINK_INTERFACE is not set
+CONFIG_RAID_ATTRS=y
+CONFIG_RANDOMIZE_BASE=y
+CONFIG_RANDOMIZE_MODULE_REGION_FULL=y
+CONFIG_RANDSTRUCT_NONE=y
+CONFIG_RAS=y
+CONFIG_RATIONAL=y
+# CONFIG_RAVE_SP_CORE is not set
+CONFIG_RCU_TRACE=y
+CONFIG_REALTEK_PHY=y
+CONFIG_REGMAP=y
+CONFIG_REGMAP_I2C=y
+CONFIG_REGMAP_IRQ=y
+CONFIG_REGMAP_MMIO=y
+CONFIG_REGULATOR=y
+# CONFIG_REGULATOR_ARM_SCMI is not set
+CONFIG_REGULATOR_FAN53555=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_GPIO=y
+CONFIG_REGULATOR_PWM=y
+CONFIG_REGULATOR_RK808=y
+CONFIG_RELOCATABLE=y
+CONFIG_RESET_CONTROLLER=y
+CONFIG_RESET_SCMI=y
+CONFIG_RFS_ACCEL=y
+CONFIG_ROCKCHIP_EFUSE=y
+CONFIG_ROCKCHIP_GRF=y
+CONFIG_ROCKCHIP_IODOMAIN=y
+CONFIG_ROCKCHIP_IOMMU=y
+CONFIG_ROCKCHIP_MBOX=y
+# CONFIG_ROCKCHIP_OTP is not set
+CONFIG_ROCKCHIP_PHY=y
+CONFIG_ROCKCHIP_PM_DOMAINS=y
+CONFIG_ROCKCHIP_THERMAL=y
+CONFIG_ROCKCHIP_TIMER=y
+CONFIG_RODATA_FULL_DEFAULT_ENABLED=y
+CONFIG_RPS=y
+CONFIG_RSEQ=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_RK808=y
+CONFIG_RTC_I2C_AND_SPI=y
+CONFIG_RTC_NVMEM=y
+# CONFIG_RUNTIME_TESTING_MENU is not set
+CONFIG_RWSEM_SPIN_ON_OWNER=y
+CONFIG_SCHED_MC=y
+CONFIG_SCSI=y
+CONFIG_SCSI_COMMON=y
+# CONFIG_SCSI_LOWLEVEL is not set
+# CONFIG_SCSI_PROC_FS is not set
+CONFIG_SCSI_SAS_ATTRS=y
+CONFIG_SCSI_SAS_HOST_SMP=y
+CONFIG_SCSI_SAS_LIBSAS=y
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+# CONFIG_SENSORS_ARM_SCMI is not set
+CONFIG_SENSORS_ARM_SCPI=y
+CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y
+CONFIG_SERIAL_8250_DW=y
+CONFIG_SERIAL_8250_DWLIB=y
+CONFIG_SERIAL_8250_EXAR=y
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_FSL=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_SERIAL_DEV_BUS=y
+CONFIG_SERIAL_DEV_CTRL_TTYPORT=y
+CONFIG_SERIAL_MCTRL_GPIO=y
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_SERIO=y
+CONFIG_SERIO_AMBAKMI=y
+CONFIG_SERIO_LIBPS2=y
+CONFIG_SG_POOL=y
+CONFIG_SLUB_DEBUG=y
+CONFIG_SMP=y
+CONFIG_SOCK_RX_QUEUE_MAPPING=y
+CONFIG_SPARSEMEM=y
+CONFIG_SPARSEMEM_EXTREME=y
+CONFIG_SPARSEMEM_VMEMMAP=y
+CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_SPI=y
+CONFIG_SPI_BITBANG=y
+CONFIG_SPI_DYNAMIC=y
+CONFIG_SPI_MASTER=y
+CONFIG_SPI_MEM=y
+CONFIG_SPI_ROCKCHIP=y
+CONFIG_SPI_SPIDEV=y
+# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set
+CONFIG_SQUASHFS_DECOMP_SINGLE=y
+# CONFIG_SQUASHFS_EMBEDDED is not set
+CONFIG_SQUASHFS_FILE_CACHE=y
+# CONFIG_SQUASHFS_FILE_DIRECT is not set
+CONFIG_SRAM=y
+CONFIG_SRCU=y
+CONFIG_STACKDEPOT=y
+CONFIG_STACKPROTECTOR=y
+CONFIG_STACKPROTECTOR_PER_TASK=y
+CONFIG_STACKPROTECTOR_STRONG=y
+CONFIG_STACKTRACE=y
+# CONFIG_STAGING is not set
+CONFIG_STMMAC_ETH=y
+CONFIG_STMMAC_PLATFORM=y
+# CONFIG_STMMAC_SELFTESTS is not set
+CONFIG_STRICT_DEVMEM=y
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_SWAP is not set
+CONFIG_SWIOTLB=y
+CONFIG_SWPHY=y
+CONFIG_SYNC_FILE=y
+CONFIG_SYSCTL_EXCEPTION_TRACE=y
+CONFIG_SYSFS_SYSCALL=y
+CONFIG_SYSVIPC_COMPAT=y
+# CONFIG_TEXTSEARCH is not set
+CONFIG_THERMAL=y
+CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
+CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
+CONFIG_THERMAL_EMULATION=y
+CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y
+CONFIG_THERMAL_GOV_STEP_WISE=y
+CONFIG_THERMAL_HWMON=y
+CONFIG_THERMAL_OF=y
+CONFIG_THREAD_INFO_IN_TASK=y
+CONFIG_TICK_CPU_ACCOUNTING=y
+CONFIG_TIMER_OF=y
+CONFIG_TIMER_PROBE=y
+CONFIG_TRACE_CLOCK=y
+CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y
+CONFIG_TRANSPARENT_HUGEPAGE=y
+CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
+# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set
+CONFIG_TRANS_TABLE=y
+CONFIG_TREE_RCU=y
+CONFIG_TREE_SRCU=y
+CONFIG_TYPEC=y
+CONFIG_TYPEC_FUSB302=y
+# CONFIG_TYPEC_HD3SS3220 is not set
+# CONFIG_TYPEC_MUX_PI3USB30532 is not set
+# CONFIG_TYPEC_STUSB160X is not set
+# CONFIG_TYPEC_TCPCI is not set
+CONFIG_TYPEC_TCPM=y
+# CONFIG_TYPEC_TPS6598X is not set
+# CONFIG_UACCE is not set
+# CONFIG_UCLAMP_TASK is not set
+# CONFIG_UEVENT_HELPER is not set
+CONFIG_UNINLINE_SPIN_UNLOCK=y
+CONFIG_UNMAP_KERNEL_AT_EL0=y
+CONFIG_USB=y
+CONFIG_USB_COMMON=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_DWC3_HOST=y
+CONFIG_USB_DWC3_OF_SIMPLE=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_HCD_PLATFORM=y
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+CONFIG_USB_HID=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_HCD_PLATFORM=y
+CONFIG_USB_PHY=y
+CONFIG_USB_ROLE_SWITCH=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ULPI=y
+CONFIG_USB_ULPI_BUS=y
+CONFIG_USB_ULPI_VIEWPORT=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_PLATFORM=y
+# CONFIG_VIRTIO_MENU is not set
+CONFIG_VMAP_STACK=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+# CONFIG_WATCHDOG is not set
+CONFIG_XARRAY_MULTI=y
+CONFIG_XPS=y
+CONFIG_XXHASH=y
+CONFIG_XZ_DEC_ARM=y
+CONFIG_XZ_DEC_ARMTHUMB=y
+CONFIG_XZ_DEC_BCJ=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZONE_DMA32=y
diff --git a/target/linux/rockchip/armv8/target.mk b/target/linux/rockchip/armv8/target.mk
index a5e60a613..2fd129281 100644
--- a/target/linux/rockchip/armv8/target.mk
+++ b/target/linux/rockchip/armv8/target.mk
@@ -1,8 +1,8 @@
 ARCH:=aarch64
 SUBTARGET:=armv8
-BOARDNAME:=RK33xx boards (64 bit)
+BOARDNAME:=RK33xx/RK35xx boards (64 bit)
 
 define Target/Description
-	Build firmware image for Rockchip RK33xx devices.
+	Build firmware image for Rockchip RK33xx/RK35xx devices.
 	This firmware features a 64 bit kernel.
 endef
diff --git a/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-default-timing.dtsi
similarity index 100%
rename from target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-nanopi2-timing.dtsi
rename to target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3328-dram-default-timing.dtsi
diff --git a/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dts b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dts
new file mode 100644
index 000000000..1283d4cb2
--- /dev/null
+++ b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dts
@@ -0,0 +1,710 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2021 FriendlyElec Computer Tech. Co., Ltd.
+ * (http://www.friendlyarm.com)
+ *
+ * Copyright (c) 2022 Marty Jones <mj8263788@gmail.com>
+ * Copyright (c) 2022 Tianling Shen <cnsztl@gmail.com>
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/leds/common.h>
+#include <dt-bindings/pinctrl/rockchip.h>
+#include <dt-bindings/soc/rockchip,vop2.h>
+#include "rk3568.dtsi"
+
+/ {
+	model = "FriendlyElec NanoPi R5S";
+	compatible = "friendlyarm,nanopi-r5s","rockchip,rk3568";
+
+	aliases {
+		ethernet0 = &gmac0;
+		mmc0 = &sdmmc0;
+		mmc1 = &sdhci;
+
+		led-boot = &sys_led;
+		led-failsafe = &sys_led;
+		led-running = &sys_led;
+		led-upgrade = &sys_led;
+	};
+
+	chosen: chosen {
+		stdout-path = "serial2:1500000n8";
+	};
+
+#ifdef DTS_NO_LEGACY
+	hdmi-con {
+		compatible = "hdmi-connector";
+		type = "a";
+
+		port {
+			hdmi_con_in: endpoint {
+				remote-endpoint = <&hdmi_out_con>;
+			};
+		};
+	};
+#endif
+
+	leds {
+		compatible = "gpio-leds";
+		pinctrl-0 = <&lan1_led_pin>, <&lan2_led_pin>,
+			    <&sys_led_pin>, <&wan_led_pin>;
+		pinctrl-names = "default";
+
+		lan1_led: led-0 {
+			gpios = <&gpio3 RK_PD6 GPIO_ACTIVE_HIGH>;
+			label = "green:lan1";
+		};
+
+		lan2_led: led-1 {
+			gpios = <&gpio3 RK_PD7 GPIO_ACTIVE_HIGH>;
+			label = "green:lan2";
+		};
+
+		sys_led: led-2 {
+			gpios = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>;
+			label = "red:power";
+		};
+
+		wan_led: led-3 {
+			gpios = <&gpio2 RK_PC1 GPIO_ACTIVE_HIGH>;
+			label = "green:wan";
+		};
+	};
+
+	vdd_5v: vdd-5v {
+		compatible = "regulator-fixed";
+		regulator-name = "vdd_5v";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+	};
+
+	vcc3v3_sys: vcc3v3-sys {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_sys";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		vin-supply = <&vdd_5v>;
+	};
+
+	vcc3v3_sysp: vcc3v3-sysp {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc3v3_sysp";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		vin-supply = <&vdd_5v>;
+	};
+
+	vcc5v0_sysp: vcc5v0-sysp {
+		compatible = "regulator-fixed";
+		regulator-name = "vcc5v0_sysp";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		vin-supply = <&vcc3v3_sysp>;
+	};
+
+	vcc5v0_usb_host: vcc5v0-usb-host {
+		compatible = "regulator-fixed";
+		enable-active-high;
+		gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&vcc5v0_usb_host_en>;
+		regulator-name = "vcc5v0_usb_host";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		vin-supply = <&vcc5v0_sysp>;
+	};
+
+	vcc3v3_pcie: vcc3v3-pcie {
+		compatible = "regulator-fixed";
+		enable-active-high;
+		gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;
+		regulator-name = "vcc3v3_pcie";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		startup-delay-us = <5000>;
+		vin-supply = <&vcc3v3_sysp>;
+	};
+};
+
+&combphy0 {
+	status = "okay";
+};
+
+&combphy1 {
+	status = "okay";
+};
+
+&combphy2 {
+	status = "okay";
+};
+
+&cpu0 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&cpu1 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&cpu2 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&cpu3 {
+	cpu-supply = <&vdd_cpu>;
+};
+
+&gmac0 {
+	clock_in_out = "output";
+	assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>;
+	assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>, <&cru CLK_MAC0_2TOP>;
+	assigned-clock-rates = <0>, <125000000>;
+	phy-mode = "rgmii-id";
+	pinctrl-names = "default";
+	pinctrl-0 = <&gmac0_miim
+		     &gmac0_tx_bus2
+		     &gmac0_rx_bus2
+		     &gmac0_rgmii_clk
+		     &gmac0_rgmii_bus>;
+	snps,reset-gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_LOW>;
+	snps,reset-active-low;
+	/* Reset time is 15ms, 50ms for rtl8211f */
+	snps,reset-delays-us = <0 15000 50000>;
+	tx_delay = <0x3c>;
+	rx_delay = <0x2f>;
+	phy-handle = <&rgmii_phy0>;
+	status = "okay";
+};
+
+#ifdef DTS_NO_LEGACY
+&gpu {
+	mali-supply = <&vdd_gpu>;
+	status = "okay";
+};
+
+&hdmi {
+	avdd-0v9-supply = <&vdda0v9_image>;
+	avdd-1v8-supply = <&vcca1v8_image>;
+	status = "okay";
+};
+
+&hdmi_in {
+	hdmi_in_vp0: endpoint {
+		remote-endpoint = <&vp0_out_hdmi>;
+	};
+};
+
+&hdmi_out {
+	hdmi_out_con: endpoint {
+		remote-endpoint = <&hdmi_con_in>;
+	};
+};
+
+&hdmi_sound {
+	status = "okay";
+};
+#endif
+
+&i2c0 {
+	i2c-scl-rising-time-ns = <160>;
+	i2c-scl-falling-time-ns = <30>;
+	clock-frequency = <400000>;
+	status = "okay";
+
+	vdd_cpu: regulator@1c {
+		compatible = "tcs,tcs4525";
+		reg = <0x1c>;
+		fcs,suspend-voltage-selector = <1>;
+		regulator-name = "vdd_cpu";
+		regulator-always-on;
+		regulator-boot-on;
+		regulator-min-microvolt = <712500>;
+		regulator-max-microvolt = <1390000>;
+		regulator-init-microvolt = <900000>;
+		regulator-ramp-delay = <2300>;
+		vin-supply = <&vcc3v3_sys>;
+
+		regulator-state-mem {
+			regulator-off-in-suspend;
+		};
+	};
+
+	rk809: pmic@20 {
+		compatible = "rockchip,rk809";
+		reg = <0x20>;
+		interrupt-parent = <&gpio0>;
+		interrupts = <RK_PA3 IRQ_TYPE_LEVEL_LOW>;
+		#clock-cells = <1>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&pmic_int>;
+		rockchip,system-power-controller;
+		wakeup-source;
+
+		vcc1-supply = <&vcc3v3_sys>;
+		vcc2-supply = <&vcc3v3_sys>;
+		vcc3-supply = <&vcc3v3_sys>;
+		vcc4-supply = <&vcc3v3_sys>;
+		vcc5-supply = <&vcc3v3_sys>;
+		vcc6-supply = <&vcc3v3_sys>;
+		vcc7-supply = <&vcc3v3_sys>;
+		vcc8-supply = <&vcc3v3_sys>;
+		vcc9-supply = <&vcc3v3_sys>;
+
+		regulators {
+			vdd_logic: DCDC_REG1 {
+				regulator-name = "vdd_logic";
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-init-microvolt = <900000>;
+				regulator-initial-mode = <0x2>;
+				regulator-min-microvolt = <500000>;
+				regulator-max-microvolt = <1350000>;
+				regulator-ramp-delay = <6001>;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vdd_gpu: DCDC_REG2 {
+				regulator-name = "vdd_gpu";
+				regulator-always-on;
+				regulator-init-microvolt = <900000>;
+				regulator-initial-mode = <0x2>;
+				regulator-min-microvolt = <500000>;
+				regulator-max-microvolt = <1350000>;
+				regulator-ramp-delay = <6001>;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc_ddr: DCDC_REG3 {
+				regulator-name = "vcc_ddr";
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-initial-mode = <0x2>;
+
+				regulator-state-mem {
+					regulator-on-in-suspend;
+				};
+			};
+
+			vdd_npu: DCDC_REG4 {
+				regulator-name = "vdd_npu";
+				regulator-init-microvolt = <900000>;
+				regulator-initial-mode = <0x2>;
+				regulator-min-microvolt = <500000>;
+				regulator-max-microvolt = <1350000>;
+				regulator-ramp-delay = <6001>;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc_1v8: DCDC_REG5 {
+				regulator-name = "vcc_1v8";
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vdda0v9_image: LDO_REG1 {
+				regulator-name = "vdda0v9_image";
+				regulator-min-microvolt = <900000>;
+				regulator-max-microvolt = <900000>;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vdda_0v9: LDO_REG2 {
+				regulator-name = "vdda_0v9";
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <900000>;
+				regulator-max-microvolt = <900000>;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vdda0v9_pmu: LDO_REG3 {
+				regulator-name = "vdda0v9_pmu";
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <900000>;
+				regulator-max-microvolt = <900000>;
+
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <900000>;
+				};
+			};
+
+			vccio_acodec: LDO_REG4 {
+				regulator-name = "vccio_acodec";
+				regulator-always-on;
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vccio_sd: LDO_REG5 {
+				regulator-name = "vccio_sd";
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <3300000>;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc3v3_pmu: LDO_REG6 {
+				regulator-name = "vcc3v3_pmu";
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <3300000>;
+				regulator-max-microvolt = <3300000>;
+
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <3300000>;
+				};
+			};
+
+			vcca_1v8: LDO_REG7 {
+				regulator-name = "vcca_1v8";
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcca1v8_pmu: LDO_REG8 {
+				regulator-name = "vcca1v8_pmu";
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+
+				regulator-state-mem {
+					regulator-on-in-suspend;
+					regulator-suspend-microvolt = <1800000>;
+				};
+			};
+
+			vcca1v8_image: LDO_REG9 {
+				regulator-name = "vcca1v8_image";
+				regulator-min-microvolt = <1800000>;
+				regulator-max-microvolt = <1800000>;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc_3v3: SWITCH_REG1 {
+				regulator-name = "vcc_3v3";
+				regulator-always-on;
+				regulator-boot-on;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+
+			vcc3v3_sd: SWITCH_REG2 {
+				regulator-name = "vcc3v3_sd";
+				regulator-always-on;
+				regulator-boot-on;
+
+				regulator-state-mem {
+					regulator-off-in-suspend;
+				};
+			};
+		};
+	};
+};
+
+&i2c5 {
+	i2c-scl-rising-time-ns = <160>;
+	i2c-scl-falling-time-ns = <30>;
+	clock-frequency = <400000>;
+	status = "okay";
+
+	hym8563: hym8563@51 {
+		compatible = "haoyu,hym8563";
+		reg = <0x51>;
+		interrupt-parent = <&gpio0>;
+		interrupts = <RK_PD3 IRQ_TYPE_LEVEL_LOW>;
+		#clock-cells = <0>;
+		clock-frequency = <32768>;
+		clock-output-names = "xin32k";
+		pinctrl-names = "default";
+		pinctrl-0 = <&hym8563_int>;
+	};
+};
+
+#ifdef DTS_NO_LEGACY
+&i2s0_8ch {
+	status = "okay";
+};
+#endif
+
+&mdio0 {
+	rgmii_phy0: phy@1 {
+		compatible = "ethernet-phy-ieee802.3-c22";
+		reg = <0x1>;
+		interrupt-parent = <&gpio0>;
+		interrupts = <RK_PC4 IRQ_TYPE_LEVEL_LOW>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&gmac_int>;
+	};
+};
+
+&pcie2x1 {
+	num-lanes = <1>;
+	num-viewport = <4>;
+	reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
+	status = "okay";
+
+	pcie@00 {
+		reg = <0x00000000 0 0 0 0>;
+		#address-cells = <3>;
+		#size-cells = <2>;
+
+		r8125_1: pcie@01,0 {
+			reg = <0x000000 0 0 0 0>;
+		};
+	};
+};
+
+&pcie30phy {
+	data-lanes = <1 2>;
+	status = "okay";
+};
+
+&pcie3x1 {
+	num-lanes = <1>;
+	num-viewport = <4>;
+	reset-gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
+	status = "okay";
+
+	pcie@10 {
+		reg = <0x00100000 0 0 0 0>;
+		#address-cells = <3>;
+		#size-cells = <2>;
+
+		r8125_2: pcie@10,0 {
+			reg = <0x000000 0 0 0 0>;
+		};
+	};
+};
+
+&pcie3x2 {
+	num-lanes = <1>;
+	max-link-speed = <2>;
+	num-ib-windows = <8>;
+	num-ob-windows = <8>;
+	num-viewport = <4>;
+	reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>;
+	vpcie3v3-supply = <&vcc3v3_pcie>;
+	status = "okay";
+};
+
+&pinctrl {
+	leds {
+		lan1_led_pin: lan1-led-pin {
+			rockchip,pins = <3 RK_PD6 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+
+		lan2_led_pin: lan2-led-pin {
+			rockchip,pins = <3 RK_PD7 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+
+		sys_led_pin: sys-led-pin {
+			rockchip,pins = <4 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+
+		wan_led_pin: wan-led-pin {
+			rockchip,pins = <2 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+
+	eth_phy {
+		gmac_int: gmac-int {
+			rockchip,pins = <0 RK_PC4 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
+
+	hym8563 {
+		hym8563_int: hym8563-int {
+			rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
+
+	pmic {
+		pmic_int: pmic_int {
+			rockchip,pins = <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
+
+	usb {
+		vcc5v0_usb_host_en: vcc5v0_usb_host_en {
+			rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
+};
+
+&pmu_io_domains {
+	pmuio2-supply = <&vcc3v3_pmu>;
+	vccio1-supply = <&vccio_acodec>;
+	vccio3-supply = <&vccio_sd>;
+	vccio4-supply = <&vcc_1v8>;
+	vccio5-supply = <&vcc_3v3>;
+	vccio6-supply = <&vcc_1v8>;
+	vccio7-supply = <&vcc_3v3>;
+	status = "okay";
+};
+
+&pwm0 {
+	status = "okay";
+};
+
+&rng {
+	status = "okay";
+};
+
+&saradc {
+	vref-supply = <&vcca_1v8>;
+	status = "okay";
+};
+
+&sdhci {
+	bus-width = <8>;
+	max-frequency = <200000000>;
+	non-removable;
+	pinctrl-names = "default";
+	pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd>;
+	status = "okay";
+};
+
+&sdmmc0 {
+	bus-width = <4>;
+	cap-sd-highspeed;
+	cd-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>;
+	disable-wp;
+	pinctrl-names = "default";
+	pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>;
+	sd-uhs-sdr104;
+	vmmc-supply = <&vcc3v3_sd>;
+	vqmmc-supply = <&vccio_sd>;
+	status = "okay";
+};
+
+&tsadc {
+	rockchip,hw-tshut-mode = <1>;
+	rockchip,hw-tshut-polarity = <0>;
+	status = "okay";
+};
+
+&uart2 {
+	status = "okay";
+};
+
+&usb_host0_ehci {
+	status = "okay";
+};
+
+&usb_host0_ohci {
+	status = "okay";
+};
+
+&usb_host0_xhci {
+	dr_mode = "host";
+	status = "okay";
+};
+
+&usb_host1_ehci {
+	status = "okay";
+};
+
+&usb_host1_ohci {
+	status = "okay";
+};
+
+&usb_host1_xhci {
+	status = "okay";
+};
+
+&usb2phy0 {
+	status = "okay";
+};
+
+&usb2phy0_host {
+	phy-supply = <&vcc5v0_usb_host>;
+	status = "okay";
+};
+
+&usb2phy0_otg {
+	status = "okay";
+};
+
+&usb2phy1 {
+	status = "okay";
+};
+
+&usb2phy1_host {
+	status = "okay";
+};
+
+&usb2phy1_otg {
+	status = "okay";
+};
+
+#ifdef DTS_NO_LEGACY
+&vop {
+	assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>;
+	assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>;
+	status = "okay";
+};
+
+&vop_mmu {
+	status = "okay";
+};
+
+&vp0 {
+	vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 {
+		reg = <ROCKCHIP_VOP2_EP_HDMI0>;
+		remote-endpoint = <&hdmi_in_vp0>;
+	};
+};
+#endif
diff --git a/target/linux/rockchip/modules.mk b/target/linux/rockchip/modules.mk
index d7f3bf9f1..a22a6a859 100644
--- a/target/linux/rockchip/modules.mk
+++ b/target/linux/rockchip/modules.mk
@@ -5,7 +5,8 @@
 define KernelPackage/drm-rockchip
   SUBMENU:=$(VIDEO_MENU)
   TITLE:=Rockchip DRM support
-  DEPENDS:=@TARGET_rockchip +kmod-backlight +kmod-drm-kms-helper +kmod-multimedia-input
+  DEPENDS:=@TARGET_rockchip +kmod-backlight +kmod-drm-kms-helper \
+	+kmod-multimedia-input +LINUX_6_0:kmod-drm-display-helper
   KCONFIG:= \
 	CONFIG_DRM_ROCKCHIP \
 	CONFIG_DRM_LOAD_EDID_FIRMWARE=y \
@@ -19,12 +20,14 @@ define KernelPackage/drm-rockchip
 	CONFIG_ROCKCHIP_ANALOGIX_DP=n \
 	CONFIG_ROCKCHIP_CDN_DP=n \
 	CONFIG_ROCKCHIP_DW_HDMI=y \
-	CONFIG_ROCKCHIP_INNO_HDMI=y \
 	CONFIG_ROCKCHIP_DW_MIPI_DSI=y \
+	CONFIG_ROCKCHIP_INNO_HDMI=y \
 	CONFIG_ROCKCHIP_LVDS=y \
 	CONFIG_ROCKCHIP_RGB=n \
 	CONFIG_ROCKCHIP_RK3066_HDMI=n \
-	CONFIG_DRM_DP_AUX_BUS@ge5.15 \
+	CONFIG_ROCKCHIP_VOP=y \
+	CONFIG_ROCKCHIP_VOP2=y \
+	CONFIG_DRM_GEM_CMA_HELPER \
 	CONFIG_DRM_PANEL=y \
 	CONFIG_DRM_PANEL_BRIDGE=y \
 	CONFIG_DRM_PANEL_SIMPLE
@@ -36,6 +39,7 @@ define KernelPackage/drm-rockchip
 	$(LINUX_DIR)/drivers/media/cec/core/cec.ko@ge5.10 \
 	$(LINUX_DIR)/drivers/phy/rockchip/phy-rockchip-inno-hdmi.ko \
 	$(LINUX_DIR)/drivers/gpu/drm/drm_dp_aux_bus.ko@ge5.15 \
+	$(LINUX_DIR)/drivers/gpu/drm/drm_cma_helper.ko@ge6.0 \
 	$(LINUX_DIR)/drivers/gpu/drm/panel/panel-simple.ko \
 	$(LINUX_DIR)/drivers/gpu/drm/rockchip/rockchipdrm.ko
   AUTOLOAD:=$(call AutoProbe,rockchipdrm phy-rockchip-inno-hdmi dw-hdmi-cec)
diff --git a/target/linux/rockchip/patches-5.15/203-rockchip-rk3328-Add-support-for-EmbedFire-DoorNet1.patch b/target/linux/rockchip/patches-5.15/203-rockchip-rk3328-Add-support-for-EmbedFire-DoorNet1.patch
index b0757624d..8790a2c9a 100644
--- a/target/linux/rockchip/patches-5.15/203-rockchip-rk3328-Add-support-for-EmbedFire-DoorNet1.patch
+++ b/target/linux/rockchip/patches-5.15/203-rockchip-rk3328-Add-support-for-EmbedFire-DoorNet1.patch
@@ -20,7 +20,7 @@
 +
 +#include <dt-bindings/input/input.h>
 +#include <dt-bindings/gpio/gpio.h>
-+#include "rk3328-dram-nanopi2-timing.dtsi"
++#include "rk3328-dram-default-timing.dtsi"
 +#include "rk3328.dtsi"
 +
 +/ {
diff --git a/target/linux/rockchip/patches-5.15/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-5.15/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch
index f195f2aa3..536356654 100644
--- a/target/linux/rockchip/patches-5.15/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch
+++ b/target/linux/rockchip/patches-5.15/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch
@@ -20,7 +20,7 @@ Signed-off-by: hmz007 <hmz007@gmail.com>
  
  #include <dt-bindings/input/input.h>
  #include <dt-bindings/gpio/gpio.h>
-+#include "rk3328-dram-nanopi2-timing.dtsi"
++#include "rk3328-dram-default-timing.dtsi"
  #include "rk3328.dtsi"
  
  / {
diff --git a/target/linux/rockchip/patches-5.4/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-5.4/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch
index ad0e43bbb..4ea08cdc5 100644
--- a/target/linux/rockchip/patches-5.4/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch
+++ b/target/linux/rockchip/patches-5.4/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch
@@ -20,7 +20,7 @@ Signed-off-by: hmz007 <hmz007@gmail.com>
  
  #include <dt-bindings/input/input.h>
  #include <dt-bindings/gpio/gpio.h>
-+#include "rk3328-dram-nanopi2-timing.dtsi"
++#include "rk3328-dram-default-timing.dtsi"
  #include "rk3328.dtsi"
  
  / {
diff --git a/target/linux/rockchip/patches-5.4/809-arm64-dts-doornet1-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-5.4/809-arm64-dts-doornet1-add-rk3328-dmc-relate-node.patch
index a1c09a1bf..a744447ed 100644
--- a/target/linux/rockchip/patches-5.4/809-arm64-dts-doornet1-add-rk3328-dmc-relate-node.patch
+++ b/target/linux/rockchip/patches-5.4/809-arm64-dts-doornet1-add-rk3328-dmc-relate-node.patch
@@ -13,7 +13,7 @@ Subject: [PATCH] arm64-dts-doornet1-add-rk3328-dmc-relate-node
  
  #include <dt-bindings/input/input.h>
  #include <dt-bindings/gpio/gpio.h>
-+#include "rk3328-dram-nanopi2-timing.dtsi"
++#include "rk3328-dram-default-timing.dtsi"
  #include "rk3328.dtsi"
  
  / {
diff --git a/target/linux/rockchip/patches-6.0/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch b/target/linux/rockchip/patches-6.0/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch
new file mode 100644
index 000000000..792028b29
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/005-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch
@@ -0,0 +1,31 @@
+From af20b3384e8723077cc6484160b0cf4e9be321de Mon Sep 17 00:00:00 2001
+From: Tianling Shen <cnsztl@gmail.com>
+Date: Mon, 7 Jun 2021 15:45:37 +0800
+Subject: [PATCH] arm64: dts: rockchip: add EEPROM node for NanoPi R4S
+
+NanoPi R4S has a EEPROM attached to the 2nd I2C bus (U92), which
+stores the MAC address.
+
+Signed-off-by: Tianling Shen <cnsztl@gmail.com>
+---
+ arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
+@@ -68,6 +68,15 @@
+ 	status = "disabled";
+ };
+ 
++&i2c2 {
++	eeprom@51 {
++		compatible = "microchip,24c02", "atmel,24c02";
++		reg = <0x51>;
++		pagesize = <16>;
++		read-only; /* This holds our MAC */
++	};
++};
++
+ &i2c4 {
+ 	status = "disabled";
+ };
diff --git a/target/linux/rockchip/patches-6.0/010-v6.1-phy-rockchip-Support-PCIe-v3.patch b/target/linux/rockchip/patches-6.0/010-v6.1-phy-rockchip-Support-PCIe-v3.patch
new file mode 100644
index 000000000..b3648eaa9
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/010-v6.1-phy-rockchip-Support-PCIe-v3.patch
@@ -0,0 +1,394 @@
+From 2e9bffc4f713db465177238f6033f7d367d6f151 Mon Sep 17 00:00:00 2001
+From: Shawn Lin <shawn.lin@rock-chips.com>
+Date: Thu, 25 Aug 2022 21:38:34 +0200
+Subject: [PATCH] phy: rockchip: Support PCIe v3
+
+RK3568 supports PCIe v3 using not Combphy like PCIe v2 on rk3566.
+It use a dedicated PCIe-phy. Add support for this.
+
+Initial support by Shawn Lin, modifications by Peter Geis and Frank
+Wunderlich.
+
+Add data-lanes property for splitting pcie-lanes across controllers.
+
+The data-lanes is an array where x=0 means lane is disabled and  x > 0
+means controller x is assigned to phy lane.
+
+Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
+Suggested-by: Peter Geis <pgwipeout@gmail.com>
+Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
+Link: https://lore.kernel.org/r/20220825193836.54262-4-linux@fw-web.de
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+---
+ drivers/phy/rockchip/Kconfig                  |   9 +
+ drivers/phy/rockchip/Makefile                 |   1 +
+ .../phy/rockchip/phy-rockchip-snps-pcie3.c    | 319 ++++++++++++++++++
+ include/linux/phy/pcie.h                      |  12 +
+ 4 files changed, 341 insertions(+)
+ create mode 100644 drivers/phy/rockchip/phy-rockchip-snps-pcie3.c
+ create mode 100644 include/linux/phy/pcie.h
+
+--- a/drivers/phy/rockchip/Kconfig
++++ b/drivers/phy/rockchip/Kconfig
+@@ -83,6 +83,15 @@ config PHY_ROCKCHIP_PCIE
+ 	help
+ 	  Enable this to support the Rockchip PCIe PHY.
+ 
++config PHY_ROCKCHIP_SNPS_PCIE3
++	tristate "Rockchip Snps PCIe3 PHY Driver"
++	depends on (ARCH_ROCKCHIP && OF) || COMPILE_TEST
++	depends on HAS_IOMEM
++	select GENERIC_PHY
++	select MFD_SYSCON
++	help
++	  Enable this to support the Rockchip snps PCIe3 PHY.
++
+ config PHY_ROCKCHIP_TYPEC
+ 	tristate "Rockchip TYPEC PHY Driver"
+ 	depends on OF && (ARCH_ROCKCHIP || COMPILE_TEST)
+--- a/drivers/phy/rockchip/Makefile
++++ b/drivers/phy/rockchip/Makefile
+@@ -8,5 +8,6 @@ obj-$(CONFIG_PHY_ROCKCHIP_INNO_HDMI)	+=
+ obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB2)	+= phy-rockchip-inno-usb2.o
+ obj-$(CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY)	+= phy-rockchip-naneng-combphy.o
+ obj-$(CONFIG_PHY_ROCKCHIP_PCIE)		+= phy-rockchip-pcie.o
++obj-$(CONFIG_PHY_ROCKCHIP_SNPS_PCIE3)	+= phy-rockchip-snps-pcie3.o
+ obj-$(CONFIG_PHY_ROCKCHIP_TYPEC)	+= phy-rockchip-typec.o
+ obj-$(CONFIG_PHY_ROCKCHIP_USB)		+= phy-rockchip-usb.o
+--- /dev/null
++++ b/drivers/phy/rockchip/phy-rockchip-snps-pcie3.c
+@@ -0,0 +1,319 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * Rockchip PCIE3.0 phy driver
++ *
++ * Copyright (C) 2022 Rockchip Electronics Co., Ltd.
++ */
++
++#include <linux/clk.h>
++#include <linux/delay.h>
++#include <linux/io.h>
++#include <linux/iopoll.h>
++#include <linux/kernel.h>
++#include <linux/mfd/syscon.h>
++#include <linux/module.h>
++#include <linux/of_device.h>
++#include <linux/phy/pcie.h>
++#include <linux/phy/phy.h>
++#include <linux/regmap.h>
++#include <linux/reset.h>
++
++/* Register for RK3568 */
++#define GRF_PCIE30PHY_CON1			0x4
++#define GRF_PCIE30PHY_CON6			0x18
++#define GRF_PCIE30PHY_CON9			0x24
++#define GRF_PCIE30PHY_DA_OCM			(BIT(15) | BIT(31))
++#define GRF_PCIE30PHY_STATUS0			0x80
++#define GRF_PCIE30PHY_WR_EN			(0xf << 16)
++#define SRAM_INIT_DONE(reg)			(reg & BIT(14))
++
++#define RK3568_BIFURCATION_LANE_0_1		BIT(0)
++
++/* Register for RK3588 */
++#define PHP_GRF_PCIESEL_CON			0x100
++#define RK3588_PCIE3PHY_GRF_CMN_CON0		0x0
++#define RK3588_PCIE3PHY_GRF_PHY0_STATUS1	0x904
++#define RK3588_PCIE3PHY_GRF_PHY1_STATUS1	0xa04
++#define RK3588_SRAM_INIT_DONE(reg)		(reg & BIT(0))
++
++#define RK3588_BIFURCATION_LANE_0_1		BIT(0)
++#define RK3588_BIFURCATION_LANE_2_3		BIT(1)
++#define RK3588_LANE_AGGREGATION		BIT(2)
++
++struct rockchip_p3phy_ops;
++
++struct rockchip_p3phy_priv {
++	const struct rockchip_p3phy_ops *ops;
++	void __iomem *mmio;
++	/* mode: RC, EP */
++	int mode;
++	/* pcie30_phymode: Aggregation, Bifurcation */
++	int pcie30_phymode;
++	struct regmap *phy_grf;
++	struct regmap *pipe_grf;
++	struct reset_control *p30phy;
++	struct phy *phy;
++	struct clk_bulk_data *clks;
++	int num_clks;
++	int num_lanes;
++	u32 lanes[4];
++};
++
++struct rockchip_p3phy_ops {
++	int (*phy_init)(struct rockchip_p3phy_priv *priv);
++};
++
++static int rockchip_p3phy_set_mode(struct phy *phy, enum phy_mode mode, int submode)
++{
++	struct rockchip_p3phy_priv *priv = phy_get_drvdata(phy);
++
++	/* Actually We don't care EP/RC mode, but just record it */
++	switch (submode) {
++	case PHY_MODE_PCIE_RC:
++		priv->mode = PHY_MODE_PCIE_RC;
++		break;
++	case PHY_MODE_PCIE_EP:
++		priv->mode = PHY_MODE_PCIE_EP;
++		break;
++	default:
++		dev_err(&phy->dev, "%s, invalid mode\n", __func__);
++		return -EINVAL;
++	}
++
++	return 0;
++}
++
++static int rockchip_p3phy_rk3568_init(struct rockchip_p3phy_priv *priv)
++{
++	struct phy *phy = priv->phy;
++	bool bifurcation = false;
++	int ret, i;
++	u32 reg;
++
++	/* Deassert PCIe PMA output clamp mode */
++	regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON9, GRF_PCIE30PHY_DA_OCM);
++
++	for (i = 0; i < priv->num_lanes; i++) {
++		dev_info(&phy->dev, "lane number %d, val %d\n", i, priv->lanes[i]);
++		if (priv->lanes[i] > 1)
++			bifurcation = true;
++	}
++
++	/* Set bifurcation if needed, and it doesn't care RC/EP */
++	if (bifurcation) {
++		dev_info(&phy->dev, "bifurcation enabled\n");
++		regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON6,
++			     GRF_PCIE30PHY_WR_EN | RK3568_BIFURCATION_LANE_0_1);
++		regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON1,
++			     GRF_PCIE30PHY_DA_OCM);
++	} else {
++		dev_dbg(&phy->dev, "bifurcation disabled\n");
++		regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON6,
++			     GRF_PCIE30PHY_WR_EN & ~RK3568_BIFURCATION_LANE_0_1);
++	}
++
++	reset_control_deassert(priv->p30phy);
++
++	ret = regmap_read_poll_timeout(priv->phy_grf,
++				       GRF_PCIE30PHY_STATUS0,
++				       reg, SRAM_INIT_DONE(reg),
++				       0, 500);
++	if (ret)
++		dev_err(&priv->phy->dev, "%s: lock failed 0x%x, check input refclk and power supply\n",
++		       __func__, reg);
++	return ret;
++}
++
++static const struct rockchip_p3phy_ops rk3568_ops = {
++	.phy_init = rockchip_p3phy_rk3568_init,
++};
++
++static int rockchip_p3phy_rk3588_init(struct rockchip_p3phy_priv *priv)
++{
++	u32 reg = 0;
++	u8 mode = 0;
++	int i, ret;
++
++	/* Deassert PCIe PMA output clamp mode */
++	regmap_write(priv->phy_grf, RK3588_PCIE3PHY_GRF_CMN_CON0, BIT(8) | BIT(24));
++
++	/* Set bifurcation if needed */
++	for (i = 0; i < priv->num_lanes; i++) {
++		if (!priv->lanes[i])
++			mode |= (BIT(i) << 3);
++
++		if (priv->lanes[i] > 1)
++			mode |= (BIT(i) >> 1);
++	}
++
++	if (!mode)
++		reg = RK3588_LANE_AGGREGATION;
++	else {
++		if (mode & (BIT(0) | BIT(1)))
++			reg |= RK3588_BIFURCATION_LANE_0_1;
++
++		if (mode & (BIT(2) | BIT(3)))
++			reg |= RK3588_BIFURCATION_LANE_2_3;
++	}
++
++	regmap_write(priv->phy_grf, RK3588_PCIE3PHY_GRF_CMN_CON0, (0x7<<16) | reg);
++
++	/* Set pcie1ln_sel in PHP_GRF_PCIESEL_CON */
++	if (!IS_ERR(priv->pipe_grf)) {
++		reg = (mode & (BIT(6) | BIT(7))) >> 6;
++		if (reg)
++			regmap_write(priv->pipe_grf, PHP_GRF_PCIESEL_CON,
++				     (reg << 16) | reg);
++	}
++
++	reset_control_deassert(priv->p30phy);
++
++	ret = regmap_read_poll_timeout(priv->phy_grf,
++				       RK3588_PCIE3PHY_GRF_PHY0_STATUS1,
++				       reg, RK3588_SRAM_INIT_DONE(reg),
++				       0, 500);
++	ret |= regmap_read_poll_timeout(priv->phy_grf,
++					RK3588_PCIE3PHY_GRF_PHY1_STATUS1,
++					reg, RK3588_SRAM_INIT_DONE(reg),
++					0, 500);
++	if (ret)
++		dev_err(&priv->phy->dev, "lock failed 0x%x, check input refclk and power supply\n",
++			reg);
++	return ret;
++}
++
++static const struct rockchip_p3phy_ops rk3588_ops = {
++	.phy_init = rockchip_p3phy_rk3588_init,
++};
++
++static int rochchip_p3phy_init(struct phy *phy)
++{
++	struct rockchip_p3phy_priv *priv = phy_get_drvdata(phy);
++	int ret;
++
++	ret = clk_bulk_prepare_enable(priv->num_clks, priv->clks);
++	if (ret) {
++		dev_err(&priv->phy->dev, "failed to enable PCIe bulk clks %d\n", ret);
++		return ret;
++	}
++
++	reset_control_assert(priv->p30phy);
++	udelay(1);
++
++	if (priv->ops->phy_init) {
++		ret = priv->ops->phy_init(priv);
++		if (ret)
++			clk_bulk_disable_unprepare(priv->num_clks, priv->clks);
++	}
++
++	return ret;
++}
++
++static int rochchip_p3phy_exit(struct phy *phy)
++{
++	struct rockchip_p3phy_priv *priv = phy_get_drvdata(phy);
++
++	clk_bulk_disable_unprepare(priv->num_clks, priv->clks);
++	reset_control_assert(priv->p30phy);
++	return 0;
++}
++
++static const struct phy_ops rochchip_p3phy_ops = {
++	.init = rochchip_p3phy_init,
++	.exit = rochchip_p3phy_exit,
++	.set_mode = rockchip_p3phy_set_mode,
++	.owner = THIS_MODULE,
++};
++
++static int rockchip_p3phy_probe(struct platform_device *pdev)
++{
++	struct phy_provider *phy_provider;
++	struct device *dev = &pdev->dev;
++	struct rockchip_p3phy_priv *priv;
++	struct device_node *np = dev->of_node;
++	struct resource *res;
++	int ret;
++
++	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
++	if (!priv)
++		return -ENOMEM;
++
++	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++	priv->mmio = devm_ioremap_resource(dev, res);
++	if (IS_ERR(priv->mmio)) {
++		ret = PTR_ERR(priv->mmio);
++		return ret;
++	}
++
++	priv->ops = of_device_get_match_data(&pdev->dev);
++	if (!priv->ops) {
++		dev_err(dev, "no of match data provided\n");
++		return -EINVAL;
++	}
++
++	priv->phy_grf = syscon_regmap_lookup_by_phandle(np, "rockchip,phy-grf");
++	if (IS_ERR(priv->phy_grf)) {
++		dev_err(dev, "failed to find rockchip,phy_grf regmap\n");
++		return PTR_ERR(priv->phy_grf);
++	}
++
++	priv->pipe_grf = syscon_regmap_lookup_by_phandle(dev->of_node,
++							 "rockchip,pipe-grf");
++	if (IS_ERR(priv->pipe_grf))
++		dev_info(dev, "failed to find rockchip,pipe_grf regmap\n");
++
++	priv->num_lanes = of_property_read_variable_u32_array(dev->of_node, "data-lanes",
++							     priv->lanes, 2,
++							     ARRAY_SIZE(priv->lanes));
++
++	/* if no data-lanes assume aggregation */
++	if (priv->num_lanes == -EINVAL) {
++		dev_dbg(dev, "no data-lanes property found\n");
++		priv->num_lanes = 1;
++		priv->lanes[0] = 1;
++	} else if (priv->num_lanes < 0) {
++		dev_err(dev, "failed to read data-lanes property %d\n", priv->num_lanes);
++		return priv->num_lanes;
++	}
++
++	priv->phy = devm_phy_create(dev, NULL, &rochchip_p3phy_ops);
++	if (IS_ERR(priv->phy)) {
++		dev_err(dev, "failed to create combphy\n");
++		return PTR_ERR(priv->phy);
++	}
++
++	priv->p30phy = devm_reset_control_get_optional_exclusive(dev, "phy");
++	if (IS_ERR(priv->p30phy)) {
++		return dev_err_probe(dev, PTR_ERR(priv->p30phy),
++				     "failed to get phy reset control\n");
++	}
++	if (!priv->p30phy)
++		dev_info(dev, "no phy reset control specified\n");
++
++	priv->num_clks = devm_clk_bulk_get_all(dev, &priv->clks);
++	if (priv->num_clks < 1)
++		return -ENODEV;
++
++	dev_set_drvdata(dev, priv);
++	phy_set_drvdata(priv->phy, priv);
++	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
++	return PTR_ERR_OR_ZERO(phy_provider);
++}
++
++static const struct of_device_id rockchip_p3phy_of_match[] = {
++	{ .compatible = "rockchip,rk3568-pcie3-phy", .data = &rk3568_ops },
++	{ .compatible = "rockchip,rk3588-pcie3-phy", .data = &rk3588_ops },
++	{ },
++};
++MODULE_DEVICE_TABLE(of, rockchip_p3phy_of_match);
++
++static struct platform_driver rockchip_p3phy_driver = {
++	.probe	= rockchip_p3phy_probe,
++	.driver = {
++		.name = "rockchip-snps-pcie3-phy",
++		.of_match_table = rockchip_p3phy_of_match,
++	},
++};
++module_platform_driver(rockchip_p3phy_driver);
++MODULE_DESCRIPTION("Rockchip Synopsys PCIe 3.0 PHY driver");
++MODULE_LICENSE("GPL");
+--- /dev/null
++++ b/include/linux/phy/pcie.h
+@@ -0,0 +1,12 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++/*
++ * Copyright (c) 2022 Rockchip Electronics Co., Ltd.
++ */
++#ifndef __PHY_PCIE_H
++#define __PHY_PCIE_H
++
++#define PHY_MODE_PCIE_RC 20
++#define PHY_MODE_PCIE_EP 21
++#define PHY_MODE_PCIE_BIFURCATION 22
++
++#endif
diff --git a/target/linux/rockchip/patches-6.0/011-v6.1-arm64-dts-rockchip-Add-PCIe-v3-nodes-to-rk3568.patch b/target/linux/rockchip/patches-6.0/011-v6.1-arm64-dts-rockchip-Add-PCIe-v3-nodes-to-rk3568.patch
new file mode 100644
index 000000000..670c37725
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/011-v6.1-arm64-dts-rockchip-Add-PCIe-v3-nodes-to-rk3568.patch
@@ -0,0 +1,146 @@
+From faedfa5b40f095d09040c3a040e2f8dee4a36b4b Mon Sep 17 00:00:00 2001
+From: Frank Wunderlich <frank-w@public-files.de>
+Date: Thu, 25 Aug 2022 21:38:35 +0200
+Subject: [PATCH] arm64: dts: rockchip: Add PCIe v3 nodes to rk3568
+
+Add nodes to rk356x devicetree to support PCIe v3.
+
+Signed-off-by: Peter Geis <pgwipeout@gmail.com>
+Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
+Link: https://lore.kernel.org/r/20220825193836.54262-5-linux@fw-web.de
+Signed-off-by: Heiko Stuebner <heiko@sntech.de>
+---
+ arch/arm64/boot/dts/rockchip/rk3568.dtsi | 122 +++++++++++++++++++++++
+ 1 file changed, 122 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+@@ -42,6 +42,128 @@
+ 		reg = <0x0 0xfe190200 0x0 0x20>;
+ 	};
+ 
++	pcie30_phy_grf: syscon@fdcb8000 {
++		compatible = "rockchip,rk3568-pcie3-phy-grf", "syscon";
++		reg = <0x0 0xfdcb8000 0x0 0x10000>;
++	};
++
++	pcie30phy: phy@fe8c0000 {
++		compatible = "rockchip,rk3568-pcie3-phy";
++		reg = <0x0 0xfe8c0000 0x0 0x20000>;
++		#phy-cells = <0>;
++		clocks = <&pmucru CLK_PCIE30PHY_REF_M>, <&pmucru CLK_PCIE30PHY_REF_N>,
++			 <&cru PCLK_PCIE30PHY>;
++		clock-names = "refclk_m", "refclk_n", "pclk";
++		resets = <&cru SRST_PCIE30PHY>;
++		reset-names = "phy";
++		rockchip,phy-grf = <&pcie30_phy_grf>;
++		status = "disabled";
++	};
++
++	pcie3x1: pcie@fe270000 {
++		compatible = "rockchip,rk3568-pcie";
++		#address-cells = <3>;
++		#size-cells = <2>;
++		bus-range = <0x0 0xf>;
++		clocks = <&cru ACLK_PCIE30X1_MST>, <&cru ACLK_PCIE30X1_SLV>,
++			 <&cru ACLK_PCIE30X1_DBI>, <&cru PCLK_PCIE30X1>,
++			 <&cru CLK_PCIE30X1_AUX_NDFT>;
++		clock-names = "aclk_mst", "aclk_slv",
++			      "aclk_dbi", "pclk", "aux";
++		device_type = "pci";
++		interrupts = <GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>,
++			     <GIC_SPI 159 IRQ_TYPE_LEVEL_HIGH>,
++			     <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>,
++			     <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>,
++			     <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>;
++		interrupt-names = "sys", "pmc", "msg", "legacy", "err";
++		#interrupt-cells = <1>;
++		interrupt-map-mask = <0 0 0 7>;
++		interrupt-map = <0 0 0 1 &pcie3x1_intc 0>,
++				<0 0 0 2 &pcie3x1_intc 1>,
++				<0 0 0 3 &pcie3x1_intc 2>,
++				<0 0 0 4 &pcie3x1_intc 3>;
++		linux,pci-domain = <1>;
++		num-ib-windows = <6>;
++		num-ob-windows = <2>;
++		max-link-speed = <3>;
++		msi-map = <0x0 &gic 0x1000 0x1000>;
++		num-lanes = <1>;
++		phys = <&pcie30phy>;
++		phy-names = "pcie-phy";
++		power-domains = <&power RK3568_PD_PIPE>;
++		reg = <0x3 0xc0400000 0x0 0x00400000>,
++		      <0x0 0xfe270000 0x0 0x00010000>,
++		      <0x3 0x7f000000 0x0 0x01000000>;
++		ranges = <0x01000000 0x0 0x3ef00000 0x3 0x7ef00000 0x0 0x00100000>,
++			 <0x02000000 0x0 0x00000000 0x3 0x40000000 0x0 0x3ef00000>;
++		reg-names = "dbi", "apb", "config";
++		resets = <&cru SRST_PCIE30X1_POWERUP>;
++		reset-names = "pipe";
++		/* bifurcation; lane1 when using 1+1 */
++		status = "disabled";
++
++		pcie3x1_intc: legacy-interrupt-controller {
++			interrupt-controller;
++			#address-cells = <0>;
++			#interrupt-cells = <1>;
++			interrupt-parent = <&gic>;
++			interrupts = <GIC_SPI 157 IRQ_TYPE_EDGE_RISING>;
++		};
++	};
++
++	pcie3x2: pcie@fe280000 {
++		compatible = "rockchip,rk3568-pcie";
++		#address-cells = <3>;
++		#size-cells = <2>;
++		bus-range = <0x0 0xf>;
++		clocks = <&cru ACLK_PCIE30X2_MST>, <&cru ACLK_PCIE30X2_SLV>,
++			 <&cru ACLK_PCIE30X2_DBI>, <&cru PCLK_PCIE30X2>,
++			 <&cru CLK_PCIE30X2_AUX_NDFT>;
++		clock-names = "aclk_mst", "aclk_slv",
++			      "aclk_dbi", "pclk", "aux";
++		device_type = "pci";
++		interrupts = <GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>,
++			     <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>,
++			     <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>,
++			     <GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>,
++			     <GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>;
++		interrupt-names = "sys", "pmc", "msg", "legacy", "err";
++		#interrupt-cells = <1>;
++		interrupt-map-mask = <0 0 0 7>;
++		interrupt-map = <0 0 0 1 &pcie3x2_intc 0>,
++				<0 0 0 2 &pcie3x2_intc 1>,
++				<0 0 0 3 &pcie3x2_intc 2>,
++				<0 0 0 4 &pcie3x2_intc 3>;
++		linux,pci-domain = <2>;
++		num-ib-windows = <6>;
++		num-ob-windows = <2>;
++		max-link-speed = <3>;
++		msi-map = <0x0 &gic 0x2000 0x1000>;
++		num-lanes = <2>;
++		phys = <&pcie30phy>;
++		phy-names = "pcie-phy";
++		power-domains = <&power RK3568_PD_PIPE>;
++		reg = <0x3 0xc0800000 0x0 0x00400000>,
++		      <0x0 0xfe280000 0x0 0x00010000>,
++		      <0x3 0xbf000000 0x0 0x01000000>;
++		ranges = <0x01000000 0x0 0x3ef00000 0x3 0xbef00000 0x0 0x00100000>,
++			 <0x02000000 0x0 0x00000000 0x3 0x80000000 0x0 0x3ef00000>;
++		reg-names = "dbi", "apb", "config";
++		resets = <&cru SRST_PCIE30X2_POWERUP>;
++		reset-names = "pipe";
++		/* bifurcation; lane0 when using 1+1 */
++		status = "disabled";
++
++		pcie3x2_intc: legacy-interrupt-controller {
++			interrupt-controller;
++			#address-cells = <0>;
++			#interrupt-cells = <1>;
++			interrupt-parent = <&gic>;
++			interrupts = <GIC_SPI 162 IRQ_TYPE_EDGE_RISING>;
++		};
++	};
++
+ 	gmac0: ethernet@fe2a0000 {
+ 		compatible = "rockchip,rk3568-gmac", "snps,dwmac-4.20a";
+ 		reg = <0x0 0xfe2a0000 0x0 0x10000>;
diff --git a/target/linux/rockchip/patches-6.0/100-rockchip-use-system-LED-for-OpenWrt.patch b/target/linux/rockchip/patches-6.0/100-rockchip-use-system-LED-for-OpenWrt.patch
new file mode 100644
index 000000000..051124519
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/100-rockchip-use-system-LED-for-OpenWrt.patch
@@ -0,0 +1,47 @@
+From 6731d2c9039fbe1ecf21915eab3acee0a999508a Mon Sep 17 00:00:00 2001
+From: David Bauer <mail@david-bauer.net>
+Date: Fri, 10 Jul 2020 21:38:20 +0200
+Subject: [PATCH] rockchip: use system LED for OpenWrt
+
+Use the SYS LED on the casing for showing system status.
+
+This patch is kept separate from the NanoPi R2S support patch, as i plan
+on submitting the device support upstream.
+
+Signed-off-by: David Bauer <mail@david-bauer.net>
+---
+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
+@@ -18,6 +18,13 @@
+ 		mmc0 = &sdmmc;
+ 	};
+ 
++	aliases {
++		led-boot = &sys_led;
++		led-failsafe = &sys_led;
++		led-running = &sys_led;
++		led-upgrade = &sys_led;
++	};
++
+ 	chosen {
+ 		stdout-path = "serial2:1500000n8";
+ 	};
+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
+@@ -19,6 +19,13 @@
+ 	model = "FriendlyElec NanoPi R4S";
+ 	compatible = "friendlyarm,nanopi-r4s", "rockchip,rk3399";
+ 
++	aliases {
++		led-boot = &sys_led;
++		led-failsafe = &sys_led;
++		led-running = &sys_led;
++		led-upgrade = &sys_led;
++	};
++
+ 	/delete-node/ display-subsystem;
+ 
+ 	gpio-leds {
diff --git a/target/linux/rockchip/patches-6.0/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch b/target/linux/rockchip/patches-6.0/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch
new file mode 100644
index 000000000..5fe60d1ad
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/103-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch
@@ -0,0 +1,24 @@
+From 2795c8b31a686bdb8338f9404d18ef7a154f0d75 Mon Sep 17 00:00:00 2001
+From: David Bauer <mail@david-bauer.net>
+Date: Sun, 26 Jul 2020 13:32:59 +0200
+Subject: [PATCH] arm64: rockchip: add OF node for USB eth on NanoPi R2S
+
+This adds the OF node for the USB3 ethernet adapter on the FriendlyARM
+NanoPi R2S. Add the correct value for the RTL8153 LED configuration
+register to match the blink behavior of the other port on the device.
+
+Signed-off-by: David Bauer <mail@david-bauer.net>
+---
+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 7 +++++++
+ 1 file changed, 1 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
+@@ -404,6 +404,7 @@
+ 	rtl8153: device@2 {
+ 		compatible = "usbbda,8153";
+ 		reg = <2>;
++		realtek,led-data = <0x87>;
+ 	};
+ };
+ 
diff --git a/target/linux/rockchip/patches-6.0/105-nanopi-r4s-sd-signalling.patch b/target/linux/rockchip/patches-6.0/105-nanopi-r4s-sd-signalling.patch
new file mode 100644
index 000000000..1a72b02d4
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/105-nanopi-r4s-sd-signalling.patch
@@ -0,0 +1,26 @@
+From: David Bauer <mail@david-bauer.net>
+Subject: arm64: dts: rockchip: disable UHS modes for NanoPi R4S
+
+The NanoPi R4S leaves the SD card in 1.8V signalling when rebooting
+while U-Boot requires the card to be in 3.3V mode.
+
+Remove UHS support from the SD controller so the card remains in 3.3V
+mode. This reduces transfer speeds but ensures a reboot whether from
+userspace or following a kernel panic is always working.
+
+Signed-off-by: David Bauer <mail@david-bauer.net>
+
+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
+@@ -128,6 +128,11 @@
+ 	status = "disabled";
+ };
+ 
++&sdmmc {
++	/delete-property/ sd-uhs-sdr104;
++	cap-sd-highspeed;
++};
++
+ &u2phy0_host {
+ 	phy-supply = <&vdd_5v>;
+ };
diff --git a/target/linux/rockchip/patches-6.0/106-rockchip-rock-pi-4.patch b/target/linux/rockchip/patches-6.0/106-rockchip-rock-pi-4.patch
new file mode 100644
index 000000000..c427c1c3a
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/106-rockchip-rock-pi-4.patch
@@ -0,0 +1,35 @@
+--- a/arch/arm64/boot/dts/rockchip/Makefile
++++ b/arch/arm64/boot/dts/rockchip/Makefile
+@@ -29,6 +29,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gr
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-dumo.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-inx.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-scarlet-kd.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-guangmiao-g4c.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4se.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-hugsun-x99.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-khadas-edge.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-khadas-edge-captain.dtb
+@@ -46,6 +48,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-pu
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-roc-pc.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-roc-pc-mezzanine.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-roc-pc-plus.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4a.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4a-plus.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4b.dtb
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts
+@@ -0,0 +1,13 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * Copyright (c) 2019 Akash Gajjar <Akash_Gajjar@mentor.com>
++ * Copyright (c) 2019 Pragnesh Patel <Pragnesh_Patel@mentor.com>
++ */
++
++/dts-v1/;
++#include "rk3399-rock-pi-4.dtsi"
++
++/ {
++	model = "Radxa ROCK Pi 4";
++	compatible = "radxa,rockpi4", "rockchip,rk3399";
++};
diff --git a/target/linux/rockchip/patches-6.0/107-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-6.0/107-mmc-core-set-initial-signal-voltage-on-power-off.patch
new file mode 100644
index 000000000..454ce107f
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/107-mmc-core-set-initial-signal-voltage-on-power-off.patch
@@ -0,0 +1,35 @@
+From 0d329112c709d6cfedf0fffb19f0cc6b19043f6b Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas@kwiboo.se>
+Date: Wed, 20 Feb 2019 07:38:34 +0000
+Subject: [PATCH] mmc: core: set initial signal voltage on power off
+
+Some boards have SD card connectors where the power rail cannot be switched
+off by the driver. If the card has not been power cycled, it may still be
+using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling
+will fail to boot from a UHS card that continue to use 1.8V signaling.
+
+Set initial signal voltage in mmc_power_off() to allow re-boot to function.
+
+This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),
+same issue have been seen on some Rockchip RK3399 boards.
+
+I am sending this as a RFC because I have no insights into SD/MMC subsystem,
+this change fix a re-boot issue on my boards and does not break emmc/sdio.
+Is this an acceptable workaround? Any advice is appreciated.
+
+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
+---
+ drivers/mmc/core/core.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/mmc/core/core.c
++++ b/drivers/mmc/core/core.c
+@@ -1360,6 +1360,8 @@ void mmc_power_off(struct mmc_host *host
+ 
+ 	mmc_pwrseq_power_off(host);
+ 
++	mmc_set_initial_signal_voltage(host);
++
+ 	host->ios.clock = 0;
+ 	host->ios.vdd = 0;
+ 
diff --git a/target/linux/rockchip/patches-6.0/108-net-phy-add-support-for-Motorcomm-yt8531C-phy.patch b/target/linux/rockchip/patches-6.0/108-net-phy-add-support-for-Motorcomm-yt8531C-phy.patch
new file mode 100644
index 000000000..66dc89728
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/108-net-phy-add-support-for-Motorcomm-yt8531C-phy.patch
@@ -0,0 +1,141 @@
+From cfb1aa4c805e58287dd0ce292b5c64309e3dba2f Mon Sep 17 00:00:00 2001
+From: Furkan Kardame <f.kardame@manjaro.org>
+Date: Sun,  9 Oct 2022 22:24:05 +0300
+Subject: [PATCH] net: phy: add support for Motorcomm yt8531C phy
+
+This patch adds support for Motorcomm YT8531C which is
+used in OrangePi 3 LTS, OrangePi 4 LTS and OrangePi 800
+Currently being used by Manjaro Arm kernel
+
+Signed-off-by: Peter Geis <pgwipeout@gmail.com>
+Signed-off-by: Furkan Kardame <f.kardame@manjaro.org>
+---
+ drivers/net/phy/motorcomm.c | 90 +++++++++++++++++++++++++++++++++++++
+ 1 file changed, 90 insertions(+)
+
+--- a/drivers/net/phy/motorcomm.c
++++ b/drivers/net/phy/motorcomm.c
+@@ -10,6 +10,7 @@
+ #include <linux/phy.h>
+ 
+ #define PHY_ID_YT8511		0x0000010a
++#define PHY_ID_YT8531		0x4f51e91b
+ 
+ #define YT8511_PAGE_SELECT	0x1e
+ #define YT8511_PAGE		0x1f
+@@ -38,6 +39,38 @@
+ #define YT8511_DELAY_FE_TX_EN	(0xf << 12)
+ #define YT8511_DELAY_FE_TX_DIS	(0x2 << 12)
+ 
++#define YT8531_RGMII_CONFIG1	0xa003
++
++/* TX Gig-E Delay is bits 3:0, default 0x1
++ * TX Fast-E Delay is bits 7:4, default 0xf
++ * RX Delay is bits 13:10, default 0x0
++ * Delay = 150ps * N
++ * On = 2000ps, off = 50ps
++ */
++#define YT8531_DELAY_GE_TX_EN	(0xd << 0)
++#define YT8531_DELAY_GE_TX_DIS	(0x0 << 0)
++#define YT8531_DELAY_FE_TX_EN	(0xd << 4)
++#define YT8531_DELAY_FE_TX_DIS	(0x0 << 4)
++#define YT8531_DELAY_RX_EN	(0xd << 10)
++#define YT8531_DELAY_RX_DIS	(0x0 << 10)
++#define YT8531_DELAY_MASK	(GENMASK(13, 10) | GENMASK(7, 0))
++
++#define YT8531_SYNCE_CFG	0xa012
++
++/* Clk src config is bits 3:1
++ * 3b000 src from pll
++ * 3b001 src from rx_clk
++ * 3b010 src from serdes
++ * 3b011 src from ptp_in
++ * 3b100 src from 25mhz refclk *default*
++ * 3b101 src from 25mhz ssc
++ * Clk rate select is bit 4
++ * 1b0 25mhz clk output *default*
++ * 1b1 125mhz clk output
++ * Clkout enable is bit 6
++ */
++#define YT8531_CLKCFG_125M	(BIT(6) | BIT(4) | (0x0 < 1))
++
+ static int yt8511_read_page(struct phy_device *phydev)
+ {
+ 	return __phy_read(phydev, YT8511_PAGE_SELECT);
+@@ -111,6 +144,51 @@ err_restore_page:
+ 	return phy_restore_page(phydev, oldpage, ret);
+ }
+ 
++static int yt8531_config_init(struct phy_device *phydev)
++{
++	int oldpage, ret = 0;
++	unsigned int val;
++
++	oldpage = phy_select_page(phydev, YT8531_RGMII_CONFIG1);
++	if (oldpage < 0)
++		goto err_restore_page;
++
++	/* set rgmii delay mode */
++	switch (phydev->interface) {
++	case PHY_INTERFACE_MODE_RGMII:
++		val = YT8531_DELAY_RX_DIS | YT8531_DELAY_GE_TX_DIS | YT8531_DELAY_FE_TX_DIS;
++		break;
++	case PHY_INTERFACE_MODE_RGMII_RXID:
++		val = YT8531_DELAY_RX_EN | YT8531_DELAY_GE_TX_DIS | YT8531_DELAY_FE_TX_DIS;
++		break;
++	case PHY_INTERFACE_MODE_RGMII_TXID:
++		val = YT8531_DELAY_RX_DIS | YT8531_DELAY_GE_TX_EN | YT8531_DELAY_FE_TX_EN;
++		break;
++	case PHY_INTERFACE_MODE_RGMII_ID:
++		val = YT8531_DELAY_RX_EN | YT8531_DELAY_GE_TX_EN | YT8531_DELAY_FE_TX_EN;
++		break;
++	default: /* do not support other modes */
++		ret = -EOPNOTSUPP;
++		goto err_restore_page;
++	}
++
++	ret = __phy_modify(phydev, YT8511_PAGE, YT8531_DELAY_MASK, val);
++	if (ret < 0)
++		goto err_restore_page;
++
++	/* set clock mode to 125mhz */
++	ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8531_SYNCE_CFG);
++	if (ret < 0)
++		goto err_restore_page;
++
++	ret = __phy_write(phydev, YT8511_PAGE, YT8531_CLKCFG_125M);
++	if (ret < 0)
++		goto err_restore_page;
++
++err_restore_page:
++	return phy_restore_page(phydev, oldpage, ret);
++}
++
+ static struct phy_driver motorcomm_phy_drvs[] = {
+ 	{
+ 		PHY_ID_MATCH_EXACT(PHY_ID_YT8511),
+@@ -120,7 +198,16 @@ static struct phy_driver motorcomm_phy_d
+ 		.resume		= genphy_resume,
+ 		.read_page	= yt8511_read_page,
+ 		.write_page	= yt8511_write_page,
++	}, {
++		PHY_ID_MATCH_EXACT(PHY_ID_YT8531),
++		.name		= "YT8531 Gigabit Ethernet",
++		.config_init	= yt8531_config_init,
++		.suspend	= genphy_suspend,
++		.resume		= genphy_resume,
++		.read_page	= yt8511_read_page,
++		.write_page	= yt8511_write_page,
+ 	},
++
+ };
+ 
+ module_phy_driver(motorcomm_phy_drvs);
+@@ -131,6 +218,7 @@ MODULE_LICENSE("GPL");
+ 
+ static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = {
+ 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8511) },
++	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8531) },
+ 	{ /* sentinal */ }
+ };
+ 
diff --git a/target/linux/rockchip/patches-6.0/167-crypto-rockchip-use-dev_err-for-error-message-about-.patch b/target/linux/rockchip/patches-6.0/167-crypto-rockchip-use-dev_err-for-error-message-about-.patch
new file mode 100644
index 000000000..587c7c8ed
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/167-crypto-rockchip-use-dev_err-for-error-message-about-.patch
@@ -0,0 +1,26 @@
+From 5b85875f5b63720c85f525a0b94054041ca2a118 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:39 +0000
+Subject: [PATCH 17/49] crypto: rockchip: use dev_err for error message about
+ interrupt
+
+Interrupt is mandatory so the message should be printed as error.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -371,8 +371,7 @@ static int rk_crypto_probe(struct platfo
+ 
+ 	crypto_info->irq = platform_get_irq(pdev, 0);
+ 	if (crypto_info->irq < 0) {
+-		dev_warn(crypto_info->dev,
+-			 "control Interrupt is not available.\n");
++		dev_err(&pdev->dev, "control Interrupt is not available.\n");
+ 		err = crypto_info->irq;
+ 		goto err_crypto;
+ 	}
diff --git a/target/linux/rockchip/patches-6.0/168-crypto-rockchip-do-not-use-uninitialized-variable.patch b/target/linux/rockchip/patches-6.0/168-crypto-rockchip-do-not-use-uninitialized-variable.patch
new file mode 100644
index 000000000..b9011ce16
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/168-crypto-rockchip-do-not-use-uninitialized-variable.patch
@@ -0,0 +1,24 @@
+From ccd6a7fd0b6afdfa47d3b4f6b850127031effc1f Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:40 +0000
+Subject: [PATCH 18/49] crypto: rockchip: do not use uninitialized variable
+
+crypto_info->dev is not yet set, so use pdev->dev instead.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -381,7 +381,7 @@ static int rk_crypto_probe(struct platfo
+ 			       "rk-crypto", pdev);
+ 
+ 	if (err) {
+-		dev_err(crypto_info->dev, "irq request failed.\n");
++		dev_err(&pdev->dev, "irq request failed.\n");
+ 		goto err_crypto;
+ 	}
+ 
diff --git a/target/linux/rockchip/patches-6.0/169-crypto-rockchip-do-not-do-custom-power-management.patch b/target/linux/rockchip/patches-6.0/169-crypto-rockchip-do-not-do-custom-power-management.patch
new file mode 100644
index 000000000..f5edc895f
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/169-crypto-rockchip-do-not-do-custom-power-management.patch
@@ -0,0 +1,94 @@
+From 4f973a49ea5f5c6a80468a1c8d28f57642f20f08 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:41 +0000
+Subject: [PATCH 19/49] crypto: rockchip: do not do custom power management
+
+The clock enable/disable at tfm init/exit is fragile,
+if 2 tfm are init in the same time and one is removed just after,
+it will leave the hardware uncloked even if a user remains.
+
+Instead simply enable clocks at probe time.
+We will do PM later.
+
+Fixes: ce0183cb6464b ("crypto: rockchip - switch to skcipher API")
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c          | 4 ++--
+ drivers/crypto/rockchip/rk3288_crypto.h          | 2 --
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c    | 3 +--
+ drivers/crypto/rockchip/rk3288_crypto_skcipher.c | 5 +++--
+ 4 files changed, 6 insertions(+), 8 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -394,8 +394,7 @@ static int rk_crypto_probe(struct platfo
+ 		     rk_crypto_done_task_cb, (unsigned long)crypto_info);
+ 	crypto_init_queue(&crypto_info->queue, 50);
+ 
+-	crypto_info->enable_clk = rk_crypto_enable_clk;
+-	crypto_info->disable_clk = rk_crypto_disable_clk;
++	rk_crypto_enable_clk(crypto_info);
+ 	crypto_info->load_data = rk_load_data;
+ 	crypto_info->unload_data = rk_unload_data;
+ 	crypto_info->enqueue = rk_crypto_enqueue;
+@@ -422,6 +421,7 @@ static int rk_crypto_remove(struct platf
+ 	struct rk_crypto_info *crypto_tmp = platform_get_drvdata(pdev);
+ 
+ 	rk_crypto_unregister();
++	rk_crypto_disable_clk(crypto_tmp);
+ 	tasklet_kill(&crypto_tmp->done_task);
+ 	tasklet_kill(&crypto_tmp->queue_task);
+ 	return 0;
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -220,8 +220,6 @@ struct rk_crypto_info {
+ 	int (*start)(struct rk_crypto_info *dev);
+ 	int (*update)(struct rk_crypto_info *dev);
+ 	void (*complete)(struct crypto_async_request *base, int err);
+-	int (*enable_clk)(struct rk_crypto_info *dev);
+-	void (*disable_clk)(struct rk_crypto_info *dev);
+ 	int (*load_data)(struct rk_crypto_info *dev,
+ 			 struct scatterlist *sg_src,
+ 			 struct scatterlist *sg_dst);
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -301,7 +301,7 @@ static int rk_cra_hash_init(struct crypt
+ 				 sizeof(struct rk_ahash_rctx) +
+ 				 crypto_ahash_reqsize(tctx->fallback_tfm));
+ 
+-	return tctx->dev->enable_clk(tctx->dev);
++	return 0;
+ }
+ 
+ static void rk_cra_hash_exit(struct crypto_tfm *tfm)
+@@ -309,7 +309,6 @@ static void rk_cra_hash_exit(struct cryp
+ 	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm);
+ 
+ 	free_page((unsigned long)tctx->dev->addr_vir);
+-	return tctx->dev->disable_clk(tctx->dev);
+ }
+ 
+ struct rk_crypto_tmp rk_ahash_sha1 = {
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -388,8 +388,10 @@ static int rk_ablk_init_tfm(struct crypt
+ 	ctx->dev->update = rk_ablk_rx;
+ 	ctx->dev->complete = rk_crypto_complete;
+ 	ctx->dev->addr_vir = (char *)__get_free_page(GFP_KERNEL);
++	if (!ctx->dev->addr_vir)
++		return -ENOMEM;
+ 
+-	return ctx->dev->addr_vir ? ctx->dev->enable_clk(ctx->dev) : -ENOMEM;
++	return 0;
+ }
+ 
+ static void rk_ablk_exit_tfm(struct crypto_skcipher *tfm)
+@@ -397,7 +399,6 @@ static void rk_ablk_exit_tfm(struct cryp
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 
+ 	free_page((unsigned long)ctx->dev->addr_vir);
+-	ctx->dev->disable_clk(ctx->dev);
+ }
+ 
+ struct rk_crypto_tmp rk_ecb_aes_alg = {
diff --git a/target/linux/rockchip/patches-6.0/170-crypto-rockchip-fix-privete-private-typo.patch b/target/linux/rockchip/patches-6.0/170-crypto-rockchip-fix-privete-private-typo.patch
new file mode 100644
index 000000000..4a6f519f4
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/170-crypto-rockchip-fix-privete-private-typo.patch
@@ -0,0 +1,24 @@
+From 7ea605d0e8b85ffac2bf152be86d010d9eac0193 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:42 +0000
+Subject: [PATCH 20/49] crypto: rockchip: fix privete/private typo
+
+This fix a simple typo on private word.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -235,7 +235,7 @@ struct rk_ahash_ctx {
+ 	struct crypto_ahash		*fallback_tfm;
+ };
+ 
+-/* the privete variable of hash for fallback */
++/* the private variable of hash for fallback */
+ struct rk_ahash_rctx {
+ 	struct ahash_request		fallback_req;
+ 	u32				mode;
diff --git a/target/linux/rockchip/patches-6.0/171-crypto-rockchip-do-not-store-mode-globally.patch b/target/linux/rockchip/patches-6.0/171-crypto-rockchip-do-not-store-mode-globally.patch
new file mode 100644
index 000000000..c53552bf3
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/171-crypto-rockchip-do-not-store-mode-globally.patch
@@ -0,0 +1,262 @@
+From 61b5f1fbc686ff89fe30ce4efe10ba4b23d692f0 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:43 +0000
+Subject: [PATCH 21/49] crypto: rockchip: do not store mode globally
+
+Storing the mode globally does not work if 2 requests are handled in the
+same time.
+We should store it in a request context.
+
+Fixes: ce0183cb6464b ("crypto: rockchip - switch to skcipher API")
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.h       |  5 +-
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  | 58 ++++++++++++-------
+ 2 files changed, 41 insertions(+), 22 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -245,10 +245,13 @@ struct rk_ahash_rctx {
+ struct rk_cipher_ctx {
+ 	struct rk_crypto_info		*dev;
+ 	unsigned int			keylen;
+-	u32				mode;
+ 	u8				iv[AES_BLOCK_SIZE];
+ };
+ 
++struct rk_cipher_rctx {
++	u32				mode;
++};
++
+ enum alg_type {
+ 	ALG_TYPE_HASH,
+ 	ALG_TYPE_CIPHER,
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -76,9 +76,10 @@ static int rk_aes_ecb_encrypt(struct skc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_AES_ECB_MODE;
++	rctx->mode = RK_CRYPTO_AES_ECB_MODE;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -86,9 +87,10 @@ static int rk_aes_ecb_decrypt(struct skc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_AES_ECB_MODE | RK_CRYPTO_DEC;
++	rctx->mode = RK_CRYPTO_AES_ECB_MODE | RK_CRYPTO_DEC;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -96,9 +98,10 @@ static int rk_aes_cbc_encrypt(struct skc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_AES_CBC_MODE;
++	rctx->mode = RK_CRYPTO_AES_CBC_MODE;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -106,9 +109,10 @@ static int rk_aes_cbc_decrypt(struct skc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_AES_CBC_MODE | RK_CRYPTO_DEC;
++	rctx->mode = RK_CRYPTO_AES_CBC_MODE | RK_CRYPTO_DEC;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -116,9 +120,10 @@ static int rk_des_ecb_encrypt(struct skc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = 0;
++	rctx->mode = 0;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -126,9 +131,10 @@ static int rk_des_ecb_decrypt(struct skc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_DEC;
++	rctx->mode = RK_CRYPTO_DEC;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -136,9 +142,10 @@ static int rk_des_cbc_encrypt(struct skc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC;
++	rctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -146,9 +153,10 @@ static int rk_des_cbc_decrypt(struct skc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC | RK_CRYPTO_DEC;
++	rctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC | RK_CRYPTO_DEC;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -156,9 +164,10 @@ static int rk_des3_ede_ecb_encrypt(struc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_TDES_SELECT;
++	rctx->mode = RK_CRYPTO_TDES_SELECT;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -166,9 +175,10 @@ static int rk_des3_ede_ecb_decrypt(struc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_DEC;
++	rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_DEC;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -176,9 +186,10 @@ static int rk_des3_ede_cbc_encrypt(struc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC;
++	rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC;
+ 	return rk_handle_req(dev, req);
+ }
+ 
+@@ -186,9 +197,10 @@ static int rk_des3_ede_cbc_decrypt(struc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *dev = ctx->dev;
+ 
+-	ctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC |
++	rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC |
+ 		    RK_CRYPTO_DEC;
+ 	return rk_handle_req(dev, req);
+ }
+@@ -199,6 +211,7 @@ static void rk_ablk_hw_init(struct rk_cr
+ 		skcipher_request_cast(dev->async_req);
+ 	struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req);
+ 	struct crypto_tfm *tfm = crypto_skcipher_tfm(cipher);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);
+ 	u32 ivsize, block, conf_reg = 0;
+ 
+@@ -206,22 +219,22 @@ static void rk_ablk_hw_init(struct rk_cr
+ 	ivsize = crypto_skcipher_ivsize(cipher);
+ 
+ 	if (block == DES_BLOCK_SIZE) {
+-		ctx->mode |= RK_CRYPTO_TDES_FIFO_MODE |
++		rctx->mode |= RK_CRYPTO_TDES_FIFO_MODE |
+ 			     RK_CRYPTO_TDES_BYTESWAP_KEY |
+ 			     RK_CRYPTO_TDES_BYTESWAP_IV;
+-		CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, ctx->mode);
++		CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, rctx->mode);
+ 		memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, req->iv, ivsize);
+ 		conf_reg = RK_CRYPTO_DESSEL;
+ 	} else {
+-		ctx->mode |= RK_CRYPTO_AES_FIFO_MODE |
++		rctx->mode |= RK_CRYPTO_AES_FIFO_MODE |
+ 			     RK_CRYPTO_AES_KEY_CHANGE |
+ 			     RK_CRYPTO_AES_BYTESWAP_KEY |
+ 			     RK_CRYPTO_AES_BYTESWAP_IV;
+ 		if (ctx->keylen == AES_KEYSIZE_192)
+-			ctx->mode |= RK_CRYPTO_AES_192BIT_key;
++			rctx->mode |= RK_CRYPTO_AES_192BIT_key;
+ 		else if (ctx->keylen == AES_KEYSIZE_256)
+-			ctx->mode |= RK_CRYPTO_AES_256BIT_key;
+-		CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, ctx->mode);
++			rctx->mode |= RK_CRYPTO_AES_256BIT_key;
++		CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, rctx->mode);
+ 		memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, req->iv, ivsize);
+ 	}
+ 	conf_reg |= RK_CRYPTO_BYTESWAP_BTFIFO |
+@@ -246,6 +259,7 @@ static int rk_set_data_start(struct rk_c
+ 	struct skcipher_request *req =
+ 		skcipher_request_cast(dev->async_req);
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	u32 ivsize = crypto_skcipher_ivsize(tfm);
+ 	u8 *src_last_blk = page_address(sg_page(dev->sg_src)) +
+@@ -254,7 +268,7 @@ static int rk_set_data_start(struct rk_c
+ 	/* Store the iv that need to be updated in chain mode.
+ 	 * And update the IV buffer to contain the next IV for decryption mode.
+ 	 */
+-	if (ctx->mode & RK_CRYPTO_DEC) {
++	if (rctx->mode & RK_CRYPTO_DEC) {
+ 		memcpy(ctx->iv, src_last_blk, ivsize);
+ 		sg_pcopy_to_buffer(dev->first, dev->src_nents, req->iv,
+ 				   ivsize, dev->total - ivsize);
+@@ -294,11 +308,12 @@ static void rk_iv_copyback(struct rk_cry
+ 	struct skcipher_request *req =
+ 		skcipher_request_cast(dev->async_req);
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	u32 ivsize = crypto_skcipher_ivsize(tfm);
+ 
+ 	/* Update the IV buffer to contain the next IV for encryption mode. */
+-	if (!(ctx->mode & RK_CRYPTO_DEC)) {
++	if (!(rctx->mode & RK_CRYPTO_DEC)) {
+ 		if (dev->aligned) {
+ 			memcpy(req->iv, sg_virt(dev->sg_dst) +
+ 				dev->sg_dst->length - ivsize, ivsize);
+@@ -314,11 +329,12 @@ static void rk_update_iv(struct rk_crypt
+ 	struct skcipher_request *req =
+ 		skcipher_request_cast(dev->async_req);
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	u32 ivsize = crypto_skcipher_ivsize(tfm);
+ 	u8 *new_iv = NULL;
+ 
+-	if (ctx->mode & RK_CRYPTO_DEC) {
++	if (rctx->mode & RK_CRYPTO_DEC) {
+ 		new_iv = ctx->iv;
+ 	} else {
+ 		new_iv = page_address(sg_page(dev->sg_dst)) +
diff --git a/target/linux/rockchip/patches-6.0/172-crypto-rockchip-add-fallback-for-cipher.patch b/target/linux/rockchip/patches-6.0/172-crypto-rockchip-add-fallback-for-cipher.patch
new file mode 100644
index 000000000..a82459924
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/172-crypto-rockchip-add-fallback-for-cipher.patch
@@ -0,0 +1,244 @@
+From 3a978f75f454960fbe00355bd01f3cbb8c3bca33 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:44 +0000
+Subject: [PATCH 22/49] crypto: rockchip: add fallback for cipher
+
+The hardware does not handle 0 size length request, let's add a
+fallback.
+Furthermore fallback will be used for all unaligned case the hardware
+cannot handle.
+
+Fixes: ce0183cb6464b ("crypto: rockchip - switch to skcipher API")
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/Kconfig                        |  4 +
+ drivers/crypto/rockchip/rk3288_crypto.h       |  2 +
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  | 97 ++++++++++++++++---
+ 3 files changed, 90 insertions(+), 13 deletions(-)
+
+--- a/drivers/crypto/Kconfig
++++ b/drivers/crypto/Kconfig
+@@ -669,6 +669,10 @@ config CRYPTO_DEV_IMGTEC_HASH
+ config CRYPTO_DEV_ROCKCHIP
+ 	tristate "Rockchip's Cryptographic Engine driver"
+ 	depends on OF && ARCH_ROCKCHIP
++	depends on PM
++	select CRYPTO_ECB
++	select CRYPTO_CBC
++	select CRYPTO_DES
+ 	select CRYPTO_AES
+ 	select CRYPTO_LIB_DES
+ 	select CRYPTO_MD5
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -246,10 +246,12 @@ struct rk_cipher_ctx {
+ 	struct rk_crypto_info		*dev;
+ 	unsigned int			keylen;
+ 	u8				iv[AES_BLOCK_SIZE];
++	struct crypto_skcipher *fallback_tfm;
+ };
+ 
+ struct rk_cipher_rctx {
+ 	u32				mode;
++	struct skcipher_request fallback_req;   // keep at the end
+ };
+ 
+ enum alg_type {
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -13,6 +13,63 @@
+ 
+ #define RK_CRYPTO_DEC			BIT(0)
+ 
++static int rk_cipher_need_fallback(struct skcipher_request *req)
++{
++	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
++	unsigned int bs = crypto_skcipher_blocksize(tfm);
++	struct scatterlist *sgs, *sgd;
++	unsigned int stodo, dtodo, len;
++
++	if (!req->cryptlen)
++		return true;
++
++	len = req->cryptlen;
++	sgs = req->src;
++	sgd = req->dst;
++	while (sgs && sgd) {
++		if (!IS_ALIGNED(sgs->offset, sizeof(u32))) {
++			return true;
++		}
++		if (!IS_ALIGNED(sgd->offset, sizeof(u32))) {
++			return true;
++		}
++		stodo = min(len, sgs->length);
++		if (stodo % bs) {
++			return true;
++		}
++		dtodo = min(len, sgd->length);
++		if (dtodo % bs) {
++			return true;
++		}
++		if (stodo != dtodo) {
++			return true;
++		}
++		len -= stodo;
++		sgs = sg_next(sgs);
++		sgd = sg_next(sgd);
++	}
++	return false;
++}
++
++static int rk_cipher_fallback(struct skcipher_request *areq)
++{
++	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
++	struct rk_cipher_ctx *op = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(areq);
++	int err;
++
++	skcipher_request_set_tfm(&rctx->fallback_req, op->fallback_tfm);
++	skcipher_request_set_callback(&rctx->fallback_req, areq->base.flags,
++				      areq->base.complete, areq->base.data);
++	skcipher_request_set_crypt(&rctx->fallback_req, areq->src, areq->dst,
++				   areq->cryptlen, areq->iv);
++	if (rctx->mode & RK_CRYPTO_DEC)
++		err = crypto_skcipher_decrypt(&rctx->fallback_req);
++	else
++		err = crypto_skcipher_encrypt(&rctx->fallback_req);
++	return err;
++}
++
+ static void rk_crypto_complete(struct crypto_async_request *base, int err)
+ {
+ 	if (base->complete)
+@@ -22,10 +79,10 @@ static void rk_crypto_complete(struct cr
+ static int rk_handle_req(struct rk_crypto_info *dev,
+ 			 struct skcipher_request *req)
+ {
+-	if (!IS_ALIGNED(req->cryptlen, dev->align_size))
+-		return -EINVAL;
+-	else
+-		return dev->enqueue(dev, &req->base);
++	if (rk_cipher_need_fallback(req))
++		return rk_cipher_fallback(req);
++
++	return dev->enqueue(dev, &req->base);
+ }
+ 
+ static int rk_aes_setkey(struct crypto_skcipher *cipher,
+@@ -39,7 +96,8 @@ static int rk_aes_setkey(struct crypto_s
+ 		return -EINVAL;
+ 	ctx->keylen = keylen;
+ 	memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_KEY_0, key, keylen);
+-	return 0;
++
++	return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
+ }
+ 
+ static int rk_des_setkey(struct crypto_skcipher *cipher,
+@@ -54,7 +112,8 @@ static int rk_des_setkey(struct crypto_s
+ 
+ 	ctx->keylen = keylen;
+ 	memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, key, keylen);
+-	return 0;
++
++	return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
+ }
+ 
+ static int rk_tdes_setkey(struct crypto_skcipher *cipher,
+@@ -69,7 +128,7 @@ static int rk_tdes_setkey(struct crypto_
+ 
+ 	ctx->keylen = keylen;
+ 	memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, key, keylen);
+-	return 0;
++	return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
+ }
+ 
+ static int rk_aes_ecb_encrypt(struct skcipher_request *req)
+@@ -394,6 +453,7 @@ static int rk_ablk_init_tfm(struct crypt
+ {
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
++	const char *name = crypto_tfm_alg_name(&tfm->base);
+ 	struct rk_crypto_tmp *algt;
+ 
+ 	algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+@@ -407,6 +467,16 @@ static int rk_ablk_init_tfm(struct crypt
+ 	if (!ctx->dev->addr_vir)
+ 		return -ENOMEM;
+ 
++	ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
++	if (IS_ERR(ctx->fallback_tfm)) {
++		dev_err(ctx->dev->dev, "ERROR: Cannot allocate fallback for %s %ld\n",
++			name, PTR_ERR(ctx->fallback_tfm));
++		return PTR_ERR(ctx->fallback_tfm);
++	}
++
++	tfm->reqsize = sizeof(struct rk_cipher_rctx) +
++		crypto_skcipher_reqsize(ctx->fallback_tfm);
++
+ 	return 0;
+ }
+ 
+@@ -415,6 +485,7 @@ static void rk_ablk_exit_tfm(struct cryp
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 
+ 	free_page((unsigned long)ctx->dev->addr_vir);
++	crypto_free_skcipher(ctx->fallback_tfm);
+ }
+ 
+ struct rk_crypto_tmp rk_ecb_aes_alg = {
+@@ -423,7 +494,7 @@ struct rk_crypto_tmp rk_ecb_aes_alg = {
+ 		.base.cra_name		= "ecb(aes)",
+ 		.base.cra_driver_name	= "ecb-aes-rk",
+ 		.base.cra_priority	= 300,
+-		.base.cra_flags		= CRYPTO_ALG_ASYNC,
++		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
+ 		.base.cra_blocksize	= AES_BLOCK_SIZE,
+ 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
+ 		.base.cra_alignmask	= 0x0f,
+@@ -445,7 +516,7 @@ struct rk_crypto_tmp rk_cbc_aes_alg = {
+ 		.base.cra_name		= "cbc(aes)",
+ 		.base.cra_driver_name	= "cbc-aes-rk",
+ 		.base.cra_priority	= 300,
+-		.base.cra_flags		= CRYPTO_ALG_ASYNC,
++		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
+ 		.base.cra_blocksize	= AES_BLOCK_SIZE,
+ 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
+ 		.base.cra_alignmask	= 0x0f,
+@@ -468,7 +539,7 @@ struct rk_crypto_tmp rk_ecb_des_alg = {
+ 		.base.cra_name		= "ecb(des)",
+ 		.base.cra_driver_name	= "ecb-des-rk",
+ 		.base.cra_priority	= 300,
+-		.base.cra_flags		= CRYPTO_ALG_ASYNC,
++		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
+ 		.base.cra_blocksize	= DES_BLOCK_SIZE,
+ 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
+ 		.base.cra_alignmask	= 0x07,
+@@ -490,7 +561,7 @@ struct rk_crypto_tmp rk_cbc_des_alg = {
+ 		.base.cra_name		= "cbc(des)",
+ 		.base.cra_driver_name	= "cbc-des-rk",
+ 		.base.cra_priority	= 300,
+-		.base.cra_flags		= CRYPTO_ALG_ASYNC,
++		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
+ 		.base.cra_blocksize	= DES_BLOCK_SIZE,
+ 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
+ 		.base.cra_alignmask	= 0x07,
+@@ -513,7 +584,7 @@ struct rk_crypto_tmp rk_ecb_des3_ede_alg
+ 		.base.cra_name		= "ecb(des3_ede)",
+ 		.base.cra_driver_name	= "ecb-des3-ede-rk",
+ 		.base.cra_priority	= 300,
+-		.base.cra_flags		= CRYPTO_ALG_ASYNC,
++		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
+ 		.base.cra_blocksize	= DES_BLOCK_SIZE,
+ 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
+ 		.base.cra_alignmask	= 0x07,
+@@ -535,7 +606,7 @@ struct rk_crypto_tmp rk_cbc_des3_ede_alg
+ 		.base.cra_name		= "cbc(des3_ede)",
+ 		.base.cra_driver_name	= "cbc-des3-ede-rk",
+ 		.base.cra_priority	= 300,
+-		.base.cra_flags		= CRYPTO_ALG_ASYNC,
++		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
+ 		.base.cra_blocksize	= DES_BLOCK_SIZE,
+ 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
+ 		.base.cra_alignmask	= 0x07,
diff --git a/target/linux/rockchip/patches-6.0/173-crypto-rockchip-add-fallback-for-ahash.patch b/target/linux/rockchip/patches-6.0/173-crypto-rockchip-add-fallback-for-ahash.patch
new file mode 100644
index 000000000..bfd725a63
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/173-crypto-rockchip-add-fallback-for-ahash.patch
@@ -0,0 +1,75 @@
+From ccfa662cf9f7dc8b5369f7ceb855e116e0b406be Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:45 +0000
+Subject: [PATCH 23/49] crypto: rockchip: add fallback for ahash
+
+Adds a fallback for all case hardware cannot handle.
+
+Fixes: ce0183cb6464b ("crypto: rockchip - switch to skcipher API")
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c | 38 +++++++++++++++++++
+ 1 file changed, 38 insertions(+)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -16,6 +16,40 @@
+  * so we put the fixed hash out when met zero message.
+  */
+ 
++static bool rk_ahash_need_fallback(struct ahash_request *req)
++{
++	struct scatterlist *sg;
++
++	sg = req->src;
++	while (sg) {
++		if (!IS_ALIGNED(sg->offset, sizeof(u32))) {
++			return true;
++		}
++		if (sg->length % 4) {
++			return true;
++		}
++		sg = sg_next(sg);
++	}
++	return false;
++}
++
++static int rk_ahash_digest_fb(struct ahash_request *areq)
++{
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
++	struct rk_ahash_ctx *tfmctx = crypto_ahash_ctx(tfm);
++
++	ahash_request_set_tfm(&rctx->fallback_req, tfmctx->fallback_tfm);
++	rctx->fallback_req.base.flags = areq->base.flags &
++					CRYPTO_TFM_REQ_MAY_SLEEP;
++
++	rctx->fallback_req.nbytes = areq->nbytes;
++	rctx->fallback_req.src = areq->src;
++	rctx->fallback_req.result = areq->result;
++
++	return crypto_ahash_digest(&rctx->fallback_req);
++}
++
+ static int zero_message_process(struct ahash_request *req)
+ {
+ 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
+@@ -167,6 +201,9 @@ static int rk_ahash_digest(struct ahash_
+ 	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
+ 	struct rk_crypto_info *dev = tctx->dev;
+ 
++	if (rk_ahash_need_fallback(req))
++		return rk_ahash_digest_fb(req);
++
+ 	if (!req->nbytes)
+ 		return zero_message_process(req);
+ 	else
+@@ -309,6 +346,7 @@ static void rk_cra_hash_exit(struct cryp
+ 	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm);
+ 
+ 	free_page((unsigned long)tctx->dev->addr_vir);
++	crypto_free_ahash(tctx->fallback_tfm);
+ }
+ 
+ struct rk_crypto_tmp rk_ahash_sha1 = {
diff --git a/target/linux/rockchip/patches-6.0/174-crypto-rockchip-better-handle-cipher-key.patch b/target/linux/rockchip/patches-6.0/174-crypto-rockchip-better-handle-cipher-key.patch
new file mode 100644
index 000000000..955b381c1
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/174-crypto-rockchip-better-handle-cipher-key.patch
@@ -0,0 +1,81 @@
+From 08b723e0bccdcb3c8d20dd3931a14ec32823e3e9 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:46 +0000
+Subject: [PATCH 24/49] crypto: rockchip: better handle cipher key
+
+The key should not be set in hardware too much in advance, this will
+fail it 2 TFM with different keys generate alternative requests.
+The key should be stored and used just before doing cipher operations.
+
+Fixes: ce0183cb6464b ("crypto: rockchip - switch to skcipher API")
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.h          |  1 +
+ drivers/crypto/rockchip/rk3288_crypto_skcipher.c | 10 +++++++---
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -245,6 +245,7 @@ struct rk_ahash_rctx {
+ struct rk_cipher_ctx {
+ 	struct rk_crypto_info		*dev;
+ 	unsigned int			keylen;
++	u8				key[AES_MAX_KEY_SIZE];
+ 	u8				iv[AES_BLOCK_SIZE];
+ 	struct crypto_skcipher *fallback_tfm;
+ };
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -95,7 +95,7 @@ static int rk_aes_setkey(struct crypto_s
+ 	    keylen != AES_KEYSIZE_256)
+ 		return -EINVAL;
+ 	ctx->keylen = keylen;
+-	memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_KEY_0, key, keylen);
++	memcpy(ctx->key, key, keylen);
+ 
+ 	return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
+ }
+@@ -111,7 +111,7 @@ static int rk_des_setkey(struct crypto_s
+ 		return err;
+ 
+ 	ctx->keylen = keylen;
+-	memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, key, keylen);
++	memcpy(ctx->key, key, keylen);
+ 
+ 	return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
+ }
+@@ -127,7 +127,8 @@ static int rk_tdes_setkey(struct crypto_
+ 		return err;
+ 
+ 	ctx->keylen = keylen;
+-	memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, key, keylen);
++	memcpy(ctx->key, key, keylen);
++
+ 	return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
+ }
+ 
+@@ -283,6 +284,7 @@ static void rk_ablk_hw_init(struct rk_cr
+ 			     RK_CRYPTO_TDES_BYTESWAP_IV;
+ 		CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, rctx->mode);
+ 		memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, req->iv, ivsize);
++		memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, ctx->key, ctx->keylen);
+ 		conf_reg = RK_CRYPTO_DESSEL;
+ 	} else {
+ 		rctx->mode |= RK_CRYPTO_AES_FIFO_MODE |
+@@ -295,6 +297,7 @@ static void rk_ablk_hw_init(struct rk_cr
+ 			rctx->mode |= RK_CRYPTO_AES_256BIT_key;
+ 		CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, rctx->mode);
+ 		memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, req->iv, ivsize);
++		memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_KEY_0, ctx->key, ctx->keylen);
+ 	}
+ 	conf_reg |= RK_CRYPTO_BYTESWAP_BTFIFO |
+ 		    RK_CRYPTO_BYTESWAP_BRFIFO;
+@@ -484,6 +487,7 @@ static void rk_ablk_exit_tfm(struct cryp
+ {
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 
++	memzero_explicit(ctx->key, ctx->keylen);
+ 	free_page((unsigned long)ctx->dev->addr_vir);
+ 	crypto_free_skcipher(ctx->fallback_tfm);
+ }
diff --git a/target/linux/rockchip/patches-6.0/175-crypto-rockchip-remove-non-aligned-handling.patch b/target/linux/rockchip/patches-6.0/175-crypto-rockchip-remove-non-aligned-handling.patch
new file mode 100644
index 000000000..4edbe7124
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/175-crypto-rockchip-remove-non-aligned-handling.patch
@@ -0,0 +1,262 @@
+From a02173a29e7db0431a69ae4aefde0d50af0afe17 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:47 +0000
+Subject: [PATCH 25/49] crypto: rockchip: remove non-aligned handling
+
+Now driver have fallback for un-aligned cases, remove all code handling
+those cases.
+
+Fixes: ce0183cb6464b ("crypto: rockchip - switch to skcipher API")
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c       | 69 +++++--------------
+ drivers/crypto/rockchip/rk3288_crypto.h       |  4 --
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c | 22 ++----
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  | 39 +++--------
+ 4 files changed, 31 insertions(+), 103 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -88,63 +88,26 @@ static int rk_load_data(struct rk_crypto
+ {
+ 	unsigned int count;
+ 
+-	dev->aligned = dev->aligned ?
+-		check_alignment(sg_src, sg_dst, dev->align_size) :
+-		dev->aligned;
+-	if (dev->aligned) {
+-		count = min(dev->left_bytes, sg_src->length);
+-		dev->left_bytes -= count;
++	count = min(dev->left_bytes, sg_src->length);
++	dev->left_bytes -= count;
+ 
+-		if (!dma_map_sg(dev->dev, sg_src, 1, DMA_TO_DEVICE)) {
+-			dev_err(dev->dev, "[%s:%d] dma_map_sg(src)  error\n",
++	if (!dma_map_sg(dev->dev, sg_src, 1, DMA_TO_DEVICE)) {
++		dev_err(dev->dev, "[%s:%d] dma_map_sg(src)  error\n",
+ 				__func__, __LINE__);
+-			return -EINVAL;
+-		}
+-		dev->addr_in = sg_dma_address(sg_src);
++		return -EINVAL;
++	}
++	dev->addr_in = sg_dma_address(sg_src);
+ 
+-		if (sg_dst) {
+-			if (!dma_map_sg(dev->dev, sg_dst, 1, DMA_FROM_DEVICE)) {
+-				dev_err(dev->dev,
++	if (sg_dst) {
++		if (!dma_map_sg(dev->dev, sg_dst, 1, DMA_FROM_DEVICE)) {
++			dev_err(dev->dev,
+ 					"[%s:%d] dma_map_sg(dst)  error\n",
+ 					__func__, __LINE__);
+-				dma_unmap_sg(dev->dev, sg_src, 1,
+-					     DMA_TO_DEVICE);
+-				return -EINVAL;
+-			}
+-			dev->addr_out = sg_dma_address(sg_dst);
+-		}
+-	} else {
+-		count = (dev->left_bytes > PAGE_SIZE) ?
+-			PAGE_SIZE : dev->left_bytes;
+-
+-		if (!sg_pcopy_to_buffer(dev->first, dev->src_nents,
+-					dev->addr_vir, count,
+-					dev->total - dev->left_bytes)) {
+-			dev_err(dev->dev, "[%s:%d] pcopy err\n",
+-				__func__, __LINE__);
++			dma_unmap_sg(dev->dev, sg_src, 1,
++					DMA_TO_DEVICE);
+ 			return -EINVAL;
+ 		}
+-		dev->left_bytes -= count;
+-		sg_init_one(&dev->sg_tmp, dev->addr_vir, count);
+-		if (!dma_map_sg(dev->dev, &dev->sg_tmp, 1, DMA_TO_DEVICE)) {
+-			dev_err(dev->dev, "[%s:%d] dma_map_sg(sg_tmp)  error\n",
+-				__func__, __LINE__);
+-			return -ENOMEM;
+-		}
+-		dev->addr_in = sg_dma_address(&dev->sg_tmp);
+-
+-		if (sg_dst) {
+-			if (!dma_map_sg(dev->dev, &dev->sg_tmp, 1,
+-					DMA_FROM_DEVICE)) {
+-				dev_err(dev->dev,
+-					"[%s:%d] dma_map_sg(sg_tmp)  error\n",
+-					__func__, __LINE__);
+-				dma_unmap_sg(dev->dev, &dev->sg_tmp, 1,
+-					     DMA_TO_DEVICE);
+-				return -ENOMEM;
+-			}
+-			dev->addr_out = sg_dma_address(&dev->sg_tmp);
+-		}
++		dev->addr_out = sg_dma_address(sg_dst);
+ 	}
+ 	dev->count = count;
+ 	return 0;
+@@ -154,11 +117,11 @@ static void rk_unload_data(struct rk_cry
+ {
+ 	struct scatterlist *sg_in, *sg_out;
+ 
+-	sg_in = dev->aligned ? dev->sg_src : &dev->sg_tmp;
++	sg_in = dev->sg_src;
+ 	dma_unmap_sg(dev->dev, sg_in, 1, DMA_TO_DEVICE);
+ 
+ 	if (dev->sg_dst) {
+-		sg_out = dev->aligned ? dev->sg_dst : &dev->sg_tmp;
++		sg_out = dev->sg_dst;
+ 		dma_unmap_sg(dev->dev, sg_out, 1, DMA_FROM_DEVICE);
+ 	}
+ }
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -204,12 +204,8 @@ struct rk_crypto_info {
+ 	/* the public variable */
+ 	struct scatterlist		*sg_src;
+ 	struct scatterlist		*sg_dst;
+-	struct scatterlist		sg_tmp;
+ 	struct scatterlist		*first;
+ 	unsigned int			left_bytes;
+-	void				*addr_vir;
+-	int				aligned;
+-	int				align_size;
+ 	size_t				src_nents;
+ 	size_t				dst_nents;
+ 	unsigned int			total;
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -236,8 +236,6 @@ static int rk_ahash_start(struct rk_cryp
+ 
+ 	dev->total = req->nbytes;
+ 	dev->left_bytes = req->nbytes;
+-	dev->aligned = 0;
+-	dev->align_size = 4;
+ 	dev->sg_dst = NULL;
+ 	dev->sg_src = req->src;
+ 	dev->first = req->src;
+@@ -272,15 +270,13 @@ static int rk_ahash_crypto_rx(struct rk_
+ 
+ 	dev->unload_data(dev);
+ 	if (dev->left_bytes) {
+-		if (dev->aligned) {
+-			if (sg_is_last(dev->sg_src)) {
+-				dev_warn(dev->dev, "[%s:%d], Lack of data\n",
+-					 __func__, __LINE__);
+-				err = -ENOMEM;
+-				goto out_rx;
+-			}
+-			dev->sg_src = sg_next(dev->sg_src);
++		if (sg_is_last(dev->sg_src)) {
++			dev_warn(dev->dev, "[%s:%d], Lack of data\n",
++					__func__, __LINE__);
++			err = -ENOMEM;
++			goto out_rx;
+ 		}
++		dev->sg_src = sg_next(dev->sg_src);
+ 		err = rk_ahash_set_data_start(dev);
+ 	} else {
+ 		/*
+@@ -318,11 +314,6 @@ static int rk_cra_hash_init(struct crypt
+ 	algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
+ 
+ 	tctx->dev = algt->dev;
+-	tctx->dev->addr_vir = (void *)__get_free_page(GFP_KERNEL);
+-	if (!tctx->dev->addr_vir) {
+-		dev_err(tctx->dev->dev, "failed to kmalloc for addr_vir\n");
+-		return -ENOMEM;
+-	}
+ 	tctx->dev->start = rk_ahash_start;
+ 	tctx->dev->update = rk_ahash_crypto_rx;
+ 	tctx->dev->complete = rk_ahash_crypto_complete;
+@@ -345,7 +336,6 @@ static void rk_cra_hash_exit(struct cryp
+ {
+ 	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm);
+ 
+-	free_page((unsigned long)tctx->dev->addr_vir);
+ 	crypto_free_ahash(tctx->fallback_tfm);
+ }
+ 
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -356,7 +356,6 @@ static int rk_ablk_start(struct rk_crypt
+ 	dev->src_nents = sg_nents(req->src);
+ 	dev->sg_dst = req->dst;
+ 	dev->dst_nents = sg_nents(req->dst);
+-	dev->aligned = 1;
+ 
+ 	spin_lock_irqsave(&dev->lock, flags);
+ 	rk_ablk_hw_init(dev);
+@@ -376,13 +375,9 @@ static void rk_iv_copyback(struct rk_cry
+ 
+ 	/* Update the IV buffer to contain the next IV for encryption mode. */
+ 	if (!(rctx->mode & RK_CRYPTO_DEC)) {
+-		if (dev->aligned) {
+-			memcpy(req->iv, sg_virt(dev->sg_dst) +
+-				dev->sg_dst->length - ivsize, ivsize);
+-		} else {
+-			memcpy(req->iv, dev->addr_vir +
+-				dev->count - ivsize, ivsize);
+-		}
++		memcpy(req->iv,
++		       sg_virt(dev->sg_dst) + dev->sg_dst->length - ivsize,
++		       ivsize);
+ 	}
+ }
+ 
+@@ -420,27 +415,16 @@ static int rk_ablk_rx(struct rk_crypto_i
+ 		skcipher_request_cast(dev->async_req);
+ 
+ 	dev->unload_data(dev);
+-	if (!dev->aligned) {
+-		if (!sg_pcopy_from_buffer(req->dst, dev->dst_nents,
+-					  dev->addr_vir, dev->count,
+-					  dev->total - dev->left_bytes -
+-					  dev->count)) {
+-			err = -EINVAL;
+-			goto out_rx;
+-		}
+-	}
+ 	if (dev->left_bytes) {
+ 		rk_update_iv(dev);
+-		if (dev->aligned) {
+-			if (sg_is_last(dev->sg_src)) {
+-				dev_err(dev->dev, "[%s:%d] Lack of data\n",
++		if (sg_is_last(dev->sg_src)) {
++			dev_err(dev->dev, "[%s:%d] Lack of data\n",
+ 					__func__, __LINE__);
+-				err = -ENOMEM;
+-				goto out_rx;
+-			}
+-			dev->sg_src = sg_next(dev->sg_src);
+-			dev->sg_dst = sg_next(dev->sg_dst);
++			err = -ENOMEM;
++			goto out_rx;
+ 		}
++		dev->sg_src = sg_next(dev->sg_src);
++		dev->sg_dst = sg_next(dev->sg_dst);
+ 		err = rk_set_data_start(dev);
+ 	} else {
+ 		rk_iv_copyback(dev);
+@@ -462,13 +446,9 @@ static int rk_ablk_init_tfm(struct crypt
+ 	algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+ 
+ 	ctx->dev = algt->dev;
+-	ctx->dev->align_size = crypto_tfm_alg_alignmask(crypto_skcipher_tfm(tfm)) + 1;
+ 	ctx->dev->start = rk_ablk_start;
+ 	ctx->dev->update = rk_ablk_rx;
+ 	ctx->dev->complete = rk_crypto_complete;
+-	ctx->dev->addr_vir = (char *)__get_free_page(GFP_KERNEL);
+-	if (!ctx->dev->addr_vir)
+-		return -ENOMEM;
+ 
+ 	ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
+ 	if (IS_ERR(ctx->fallback_tfm)) {
+@@ -488,7 +468,6 @@ static void rk_ablk_exit_tfm(struct cryp
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 
+ 	memzero_explicit(ctx->key, ctx->keylen);
+-	free_page((unsigned long)ctx->dev->addr_vir);
+ 	crypto_free_skcipher(ctx->fallback_tfm);
+ }
+ 
diff --git a/target/linux/rockchip/patches-6.0/176-crypto-rockchip-rework-by-using-crypto_engine.patch b/target/linux/rockchip/patches-6.0/176-crypto-rockchip-rework-by-using-crypto_engine.patch
new file mode 100644
index 000000000..538ebcd88
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/176-crypto-rockchip-rework-by-using-crypto_engine.patch
@@ -0,0 +1,881 @@
+From edc3999221d502bbb0b02b4af6110059622bb2f1 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:48 +0000
+Subject: [PATCH 26/49] crypto: rockchip: rework by using crypto_engine
+
+Instead of doing manual queue management, let's use the crypto/engine
+for that.
+In the same time, rework the requests handling to be easier to
+understand (and fix all bugs related to them).
+
+Fixes: ce0183cb6464b ("crypto: rockchip - switch to skcipher API")
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/Kconfig                        |   1 +
+ drivers/crypto/rockchip/rk3288_crypto.c       | 152 +----------
+ drivers/crypto/rockchip/rk3288_crypto.h       |  39 +--
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c | 144 +++++-----
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  | 250 +++++++++---------
+ 5 files changed, 221 insertions(+), 365 deletions(-)
+
+--- a/drivers/crypto/Kconfig
++++ b/drivers/crypto/Kconfig
+@@ -674,6 +674,7 @@ config CRYPTO_DEV_ROCKCHIP
+ 	select CRYPTO_CBC
+ 	select CRYPTO_DES
+ 	select CRYPTO_AES
++	select CRYPTO_ENGINE
+ 	select CRYPTO_LIB_DES
+ 	select CRYPTO_MD5
+ 	select CRYPTO_SHA1
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -65,149 +65,24 @@ static void rk_crypto_disable_clk(struct
+ 	clk_disable_unprepare(dev->sclk);
+ }
+ 
+-static int check_alignment(struct scatterlist *sg_src,
+-			   struct scatterlist *sg_dst,
+-			   int align_mask)
+-{
+-	int in, out, align;
+-
+-	in = IS_ALIGNED((uint32_t)sg_src->offset, 4) &&
+-	     IS_ALIGNED((uint32_t)sg_src->length, align_mask);
+-	if (!sg_dst)
+-		return in;
+-	out = IS_ALIGNED((uint32_t)sg_dst->offset, 4) &&
+-	      IS_ALIGNED((uint32_t)sg_dst->length, align_mask);
+-	align = in && out;
+-
+-	return (align && (sg_src->length == sg_dst->length));
+-}
+-
+-static int rk_load_data(struct rk_crypto_info *dev,
+-			struct scatterlist *sg_src,
+-			struct scatterlist *sg_dst)
+-{
+-	unsigned int count;
+-
+-	count = min(dev->left_bytes, sg_src->length);
+-	dev->left_bytes -= count;
+-
+-	if (!dma_map_sg(dev->dev, sg_src, 1, DMA_TO_DEVICE)) {
+-		dev_err(dev->dev, "[%s:%d] dma_map_sg(src)  error\n",
+-				__func__, __LINE__);
+-		return -EINVAL;
+-	}
+-	dev->addr_in = sg_dma_address(sg_src);
+-
+-	if (sg_dst) {
+-		if (!dma_map_sg(dev->dev, sg_dst, 1, DMA_FROM_DEVICE)) {
+-			dev_err(dev->dev,
+-					"[%s:%d] dma_map_sg(dst)  error\n",
+-					__func__, __LINE__);
+-			dma_unmap_sg(dev->dev, sg_src, 1,
+-					DMA_TO_DEVICE);
+-			return -EINVAL;
+-		}
+-		dev->addr_out = sg_dma_address(sg_dst);
+-	}
+-	dev->count = count;
+-	return 0;
+-}
+-
+-static void rk_unload_data(struct rk_crypto_info *dev)
+-{
+-	struct scatterlist *sg_in, *sg_out;
+-
+-	sg_in = dev->sg_src;
+-	dma_unmap_sg(dev->dev, sg_in, 1, DMA_TO_DEVICE);
+-
+-	if (dev->sg_dst) {
+-		sg_out = dev->sg_dst;
+-		dma_unmap_sg(dev->dev, sg_out, 1, DMA_FROM_DEVICE);
+-	}
+-}
+-
+ static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id)
+ {
+ 	struct rk_crypto_info *dev  = platform_get_drvdata(dev_id);
+ 	u32 interrupt_status;
+ 
+-	spin_lock(&dev->lock);
+ 	interrupt_status = CRYPTO_READ(dev, RK_CRYPTO_INTSTS);
+ 	CRYPTO_WRITE(dev, RK_CRYPTO_INTSTS, interrupt_status);
+ 
++	dev->status = 1;
+ 	if (interrupt_status & 0x0a) {
+ 		dev_warn(dev->dev, "DMA Error\n");
+-		dev->err = -EFAULT;
++		dev->status = 0;
+ 	}
+-	tasklet_schedule(&dev->done_task);
++	complete(&dev->complete);
+ 
+-	spin_unlock(&dev->lock);
+ 	return IRQ_HANDLED;
+ }
+ 
+-static int rk_crypto_enqueue(struct rk_crypto_info *dev,
+-			      struct crypto_async_request *async_req)
+-{
+-	unsigned long flags;
+-	int ret;
+-
+-	spin_lock_irqsave(&dev->lock, flags);
+-	ret = crypto_enqueue_request(&dev->queue, async_req);
+-	if (dev->busy) {
+-		spin_unlock_irqrestore(&dev->lock, flags);
+-		return ret;
+-	}
+-	dev->busy = true;
+-	spin_unlock_irqrestore(&dev->lock, flags);
+-	tasklet_schedule(&dev->queue_task);
+-
+-	return ret;
+-}
+-
+-static void rk_crypto_queue_task_cb(unsigned long data)
+-{
+-	struct rk_crypto_info *dev = (struct rk_crypto_info *)data;
+-	struct crypto_async_request *async_req, *backlog;
+-	unsigned long flags;
+-	int err = 0;
+-
+-	dev->err = 0;
+-	spin_lock_irqsave(&dev->lock, flags);
+-	backlog   = crypto_get_backlog(&dev->queue);
+-	async_req = crypto_dequeue_request(&dev->queue);
+-
+-	if (!async_req) {
+-		dev->busy = false;
+-		spin_unlock_irqrestore(&dev->lock, flags);
+-		return;
+-	}
+-	spin_unlock_irqrestore(&dev->lock, flags);
+-
+-	if (backlog) {
+-		backlog->complete(backlog, -EINPROGRESS);
+-		backlog = NULL;
+-	}
+-
+-	dev->async_req = async_req;
+-	err = dev->start(dev);
+-	if (err)
+-		dev->complete(dev->async_req, err);
+-}
+-
+-static void rk_crypto_done_task_cb(unsigned long data)
+-{
+-	struct rk_crypto_info *dev = (struct rk_crypto_info *)data;
+-
+-	if (dev->err) {
+-		dev->complete(dev->async_req, dev->err);
+-		return;
+-	}
+-
+-	dev->err = dev->update(dev);
+-	if (dev->err)
+-		dev->complete(dev->async_req, dev->err);
+-}
+-
+ static struct rk_crypto_tmp *rk_cipher_algs[] = {
+ 	&rk_ecb_aes_alg,
+ 	&rk_cbc_aes_alg,
+@@ -300,8 +175,6 @@ static int rk_crypto_probe(struct platfo
+ 	if (err)
+ 		goto err_crypto;
+ 
+-	spin_lock_init(&crypto_info->lock);
+-
+ 	crypto_info->reg = devm_platform_ioremap_resource(pdev, 0);
+ 	if (IS_ERR(crypto_info->reg)) {
+ 		err = PTR_ERR(crypto_info->reg);
+@@ -351,17 +224,11 @@ static int rk_crypto_probe(struct platfo
+ 	crypto_info->dev = &pdev->dev;
+ 	platform_set_drvdata(pdev, crypto_info);
+ 
+-	tasklet_init(&crypto_info->queue_task,
+-		     rk_crypto_queue_task_cb, (unsigned long)crypto_info);
+-	tasklet_init(&crypto_info->done_task,
+-		     rk_crypto_done_task_cb, (unsigned long)crypto_info);
+-	crypto_init_queue(&crypto_info->queue, 50);
++	crypto_info->engine = crypto_engine_alloc_init(&pdev->dev, true);
++	crypto_engine_start(crypto_info->engine);
++	init_completion(&crypto_info->complete);
+ 
+ 	rk_crypto_enable_clk(crypto_info);
+-	crypto_info->load_data = rk_load_data;
+-	crypto_info->unload_data = rk_unload_data;
+-	crypto_info->enqueue = rk_crypto_enqueue;
+-	crypto_info->busy = false;
+ 
+ 	err = rk_crypto_register(crypto_info);
+ 	if (err) {
+@@ -373,9 +240,9 @@ static int rk_crypto_probe(struct platfo
+ 	return 0;
+ 
+ err_register_alg:
+-	tasklet_kill(&crypto_info->queue_task);
+-	tasklet_kill(&crypto_info->done_task);
++	crypto_engine_exit(crypto_info->engine);
+ err_crypto:
++	dev_err(dev, "Crypto Accelerator not successfully registered\n");
+ 	return err;
+ }
+ 
+@@ -385,8 +252,7 @@ static int rk_crypto_remove(struct platf
+ 
+ 	rk_crypto_unregister();
+ 	rk_crypto_disable_clk(crypto_tmp);
+-	tasklet_kill(&crypto_tmp->done_task);
+-	tasklet_kill(&crypto_tmp->queue_task);
++	crypto_engine_exit(crypto_tmp->engine);
+ 	return 0;
+ }
+ 
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -5,9 +5,11 @@
+ #include <crypto/aes.h>
+ #include <crypto/internal/des.h>
+ #include <crypto/algapi.h>
++#include <linux/dma-mapping.h>
+ #include <linux/interrupt.h>
+ #include <linux/delay.h>
+ #include <linux/scatterlist.h>
++#include <crypto/engine.h>
+ #include <crypto/internal/hash.h>
+ #include <crypto/internal/skcipher.h>
+ 
+@@ -193,39 +195,15 @@ struct rk_crypto_info {
+ 	struct reset_control		*rst;
+ 	void __iomem			*reg;
+ 	int				irq;
+-	struct crypto_queue		queue;
+-	struct tasklet_struct		queue_task;
+-	struct tasklet_struct		done_task;
+-	struct crypto_async_request	*async_req;
+-	int 				err;
+-	/* device lock */
+-	spinlock_t			lock;
+-
+-	/* the public variable */
+-	struct scatterlist		*sg_src;
+-	struct scatterlist		*sg_dst;
+-	struct scatterlist		*first;
+-	unsigned int			left_bytes;
+-	size_t				src_nents;
+-	size_t				dst_nents;
+-	unsigned int			total;
+-	unsigned int			count;
+-	dma_addr_t			addr_in;
+-	dma_addr_t			addr_out;
+-	bool				busy;
+-	int (*start)(struct rk_crypto_info *dev);
+-	int (*update)(struct rk_crypto_info *dev);
+-	void (*complete)(struct crypto_async_request *base, int err);
+-	int (*load_data)(struct rk_crypto_info *dev,
+-			 struct scatterlist *sg_src,
+-			 struct scatterlist *sg_dst);
+-	void (*unload_data)(struct rk_crypto_info *dev);
+-	int (*enqueue)(struct rk_crypto_info *dev,
+-		       struct crypto_async_request *async_req);
++
++	struct crypto_engine *engine;
++	struct completion complete;
++	int status;
+ };
+ 
+ /* the private variable of hash */
+ struct rk_ahash_ctx {
++	struct crypto_engine_ctx enginectx;
+ 	struct rk_crypto_info		*dev;
+ 	/* for fallback */
+ 	struct crypto_ahash		*fallback_tfm;
+@@ -235,10 +213,12 @@ struct rk_ahash_ctx {
+ struct rk_ahash_rctx {
+ 	struct ahash_request		fallback_req;
+ 	u32				mode;
++	int nrsg;
+ };
+ 
+ /* the private variable of cipher */
+ struct rk_cipher_ctx {
++	struct crypto_engine_ctx enginectx;
+ 	struct rk_crypto_info		*dev;
+ 	unsigned int			keylen;
+ 	u8				key[AES_MAX_KEY_SIZE];
+@@ -247,6 +227,7 @@ struct rk_cipher_ctx {
+ };
+ 
+ struct rk_cipher_rctx {
++	u8 backup_iv[AES_BLOCK_SIZE];
+ 	u32				mode;
+ 	struct skcipher_request fallback_req;   // keep at the end
+ };
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -9,6 +9,7 @@
+  * Some ideas are from marvell/cesa.c and s5p-sss.c driver.
+  */
+ #include <linux/device.h>
++#include <asm/unaligned.h>
+ #include "rk3288_crypto.h"
+ 
+ /*
+@@ -72,16 +73,12 @@ static int zero_message_process(struct a
+ 	return 0;
+ }
+ 
+-static void rk_ahash_crypto_complete(struct crypto_async_request *base, int err)
++static void rk_ahash_reg_init(struct ahash_request *req)
+ {
+-	if (base->complete)
+-		base->complete(base, err);
+-}
+-
+-static void rk_ahash_reg_init(struct rk_crypto_info *dev)
+-{
+-	struct ahash_request *req = ahash_request_cast(dev->async_req);
+ 	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
++	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
++	struct rk_crypto_info *dev = tctx->dev;
+ 	int reg_status;
+ 
+ 	reg_status = CRYPTO_READ(dev, RK_CRYPTO_CTRL) |
+@@ -108,7 +105,7 @@ static void rk_ahash_reg_init(struct rk_
+ 					  RK_CRYPTO_BYTESWAP_BRFIFO |
+ 					  RK_CRYPTO_BYTESWAP_BTFIFO);
+ 
+-	CRYPTO_WRITE(dev, RK_CRYPTO_HASH_MSG_LEN, dev->total);
++	CRYPTO_WRITE(dev, RK_CRYPTO_HASH_MSG_LEN, req->nbytes);
+ }
+ 
+ static int rk_ahash_init(struct ahash_request *req)
+@@ -206,44 +203,59 @@ static int rk_ahash_digest(struct ahash_
+ 
+ 	if (!req->nbytes)
+ 		return zero_message_process(req);
+-	else
+-		return dev->enqueue(dev, &req->base);
++
++	return crypto_transfer_hash_request_to_engine(dev->engine, req);
+ }
+ 
+-static void crypto_ahash_dma_start(struct rk_crypto_info *dev)
++static void crypto_ahash_dma_start(struct rk_crypto_info *dev, struct scatterlist *sg)
+ {
+-	CRYPTO_WRITE(dev, RK_CRYPTO_HRDMAS, dev->addr_in);
+-	CRYPTO_WRITE(dev, RK_CRYPTO_HRDMAL, (dev->count + 3) / 4);
++	CRYPTO_WRITE(dev, RK_CRYPTO_HRDMAS, sg_dma_address(sg));
++	CRYPTO_WRITE(dev, RK_CRYPTO_HRDMAL, sg_dma_len(sg) / 4);
+ 	CRYPTO_WRITE(dev, RK_CRYPTO_CTRL, RK_CRYPTO_HASH_START |
+ 					  (RK_CRYPTO_HASH_START << 16));
+ }
+ 
+-static int rk_ahash_set_data_start(struct rk_crypto_info *dev)
++static int rk_hash_prepare(struct crypto_engine *engine, void *breq)
+ {
+-	int err;
++	struct ahash_request *areq = container_of(breq, struct ahash_request, base);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
++	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
++	int ret;
++
++	ret = dma_map_sg(tctx->dev->dev, areq->src, sg_nents(areq->src), DMA_TO_DEVICE);
++	if (ret <= 0)
++		return -EINVAL;
++
++	rctx->nrsg = ret;
+ 
+-	err = dev->load_data(dev, dev->sg_src, NULL);
+-	if (!err)
+-		crypto_ahash_dma_start(dev);
+-	return err;
++	return 0;
+ }
+ 
+-static int rk_ahash_start(struct rk_crypto_info *dev)
++static int rk_hash_unprepare(struct crypto_engine *engine, void *breq)
+ {
+-	struct ahash_request *req = ahash_request_cast(dev->async_req);
+-	struct crypto_ahash *tfm;
+-	struct rk_ahash_rctx *rctx;
++	struct ahash_request *areq = container_of(breq, struct ahash_request, base);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
++	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
++
++	dma_unmap_sg(tctx->dev->dev, areq->src, rctx->nrsg, DMA_TO_DEVICE);
++	return 0;
++}
++
++static int rk_hash_run(struct crypto_engine *engine, void *breq)
++{
++	struct ahash_request *areq = container_of(breq, struct ahash_request, base);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
++	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
++	struct scatterlist *sg = areq->src;
++	int err = 0;
++	int i;
++	u32 v;
+ 
+-	dev->total = req->nbytes;
+-	dev->left_bytes = req->nbytes;
+-	dev->sg_dst = NULL;
+-	dev->sg_src = req->src;
+-	dev->first = req->src;
+-	dev->src_nents = sg_nents(req->src);
+-	rctx = ahash_request_ctx(req);
+ 	rctx->mode = 0;
+ 
+-	tfm = crypto_ahash_reqtfm(req);
+ 	switch (crypto_ahash_digestsize(tfm)) {
+ 	case SHA1_DIGEST_SIZE:
+ 		rctx->mode = RK_CRYPTO_HASH_SHA1;
+@@ -255,30 +267,26 @@ static int rk_ahash_start(struct rk_cryp
+ 		rctx->mode = RK_CRYPTO_HASH_MD5;
+ 		break;
+ 	default:
+-		return -EINVAL;
++		err =  -EINVAL;
++		goto theend;
+ 	}
+ 
+-	rk_ahash_reg_init(dev);
+-	return rk_ahash_set_data_start(dev);
+-}
+-
+-static int rk_ahash_crypto_rx(struct rk_crypto_info *dev)
+-{
+-	int err = 0;
+-	struct ahash_request *req = ahash_request_cast(dev->async_req);
+-	struct crypto_ahash *tfm;
++	rk_ahash_reg_init(areq);
+ 
+-	dev->unload_data(dev);
+-	if (dev->left_bytes) {
+-		if (sg_is_last(dev->sg_src)) {
+-			dev_warn(dev->dev, "[%s:%d], Lack of data\n",
+-					__func__, __LINE__);
+-			err = -ENOMEM;
+-			goto out_rx;
++	while (sg) {
++		reinit_completion(&tctx->dev->complete);
++		tctx->dev->status = 0;
++		crypto_ahash_dma_start(tctx->dev, sg);
++		wait_for_completion_interruptible_timeout(&tctx->dev->complete,
++							  msecs_to_jiffies(2000));
++		if (!tctx->dev->status) {
++			dev_err(tctx->dev->dev, "DMA timeout\n");
++			err = -EFAULT;
++			goto theend;
+ 		}
+-		dev->sg_src = sg_next(dev->sg_src);
+-		err = rk_ahash_set_data_start(dev);
+-	} else {
++		sg = sg_next(sg);
++	}
++
+ 		/*
+ 		 * it will take some time to process date after last dma
+ 		 * transmission.
+@@ -289,18 +297,20 @@ static int rk_ahash_crypto_rx(struct rk_
+ 		 * efficiency, and make it response quickly when dma
+ 		 * complete.
+ 		 */
+-		while (!CRYPTO_READ(dev, RK_CRYPTO_HASH_STS))
+-			udelay(10);
++	while (!CRYPTO_READ(tctx->dev, RK_CRYPTO_HASH_STS))
++		udelay(10);
+ 
+-		tfm = crypto_ahash_reqtfm(req);
+-		memcpy_fromio(req->result, dev->reg + RK_CRYPTO_HASH_DOUT_0,
+-			      crypto_ahash_digestsize(tfm));
+-		dev->complete(dev->async_req, 0);
+-		tasklet_schedule(&dev->queue_task);
++	for (i = 0; i < crypto_ahash_digestsize(tfm) / 4; i++) {
++		v = readl(tctx->dev->reg + RK_CRYPTO_HASH_DOUT_0 + i * 4);
++		put_unaligned_le32(v, areq->result + i * 4);
+ 	}
+ 
+-out_rx:
+-	return err;
++theend:
++	local_bh_disable();
++	crypto_finalize_hash_request(engine, breq, err);
++	local_bh_enable();
++
++	return 0;
+ }
+ 
+ static int rk_cra_hash_init(struct crypto_tfm *tfm)
+@@ -314,9 +324,6 @@ static int rk_cra_hash_init(struct crypt
+ 	algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
+ 
+ 	tctx->dev = algt->dev;
+-	tctx->dev->start = rk_ahash_start;
+-	tctx->dev->update = rk_ahash_crypto_rx;
+-	tctx->dev->complete = rk_ahash_crypto_complete;
+ 
+ 	/* for fallback */
+ 	tctx->fallback_tfm = crypto_alloc_ahash(alg_name, 0,
+@@ -325,10 +332,15 @@ static int rk_cra_hash_init(struct crypt
+ 		dev_err(tctx->dev->dev, "Could not load fallback driver.\n");
+ 		return PTR_ERR(tctx->fallback_tfm);
+ 	}
++
+ 	crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
+ 				 sizeof(struct rk_ahash_rctx) +
+ 				 crypto_ahash_reqsize(tctx->fallback_tfm));
+ 
++	tctx->enginectx.op.do_one_request = rk_hash_run;
++	tctx->enginectx.op.prepare_request = rk_hash_prepare;
++	tctx->enginectx.op.unprepare_request = rk_hash_unprepare;
++
+ 	return 0;
+ }
+ 
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -9,6 +9,7 @@
+  * Some ideas are from marvell-cesa.c and s5p-sss.c driver.
+  */
+ #include <linux/device.h>
++#include <crypto/scatterwalk.h>
+ #include "rk3288_crypto.h"
+ 
+ #define RK_CRYPTO_DEC			BIT(0)
+@@ -70,19 +71,15 @@ static int rk_cipher_fallback(struct skc
+ 	return err;
+ }
+ 
+-static void rk_crypto_complete(struct crypto_async_request *base, int err)
+-{
+-	if (base->complete)
+-		base->complete(base, err);
+-}
+-
+ static int rk_handle_req(struct rk_crypto_info *dev,
+ 			 struct skcipher_request *req)
+ {
++	struct crypto_engine *engine = dev->engine;
++
+ 	if (rk_cipher_need_fallback(req))
+ 		return rk_cipher_fallback(req);
+ 
+-	return dev->enqueue(dev, &req->base);
++	return crypto_transfer_skcipher_request_to_engine(engine, req);
+ }
+ 
+ static int rk_aes_setkey(struct crypto_skcipher *cipher,
+@@ -265,25 +262,21 @@ static int rk_des3_ede_cbc_decrypt(struc
+ 	return rk_handle_req(dev, req);
+ }
+ 
+-static void rk_ablk_hw_init(struct rk_crypto_info *dev)
++static void rk_ablk_hw_init(struct rk_crypto_info *dev, struct skcipher_request *req)
+ {
+-	struct skcipher_request *req =
+-		skcipher_request_cast(dev->async_req);
+ 	struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req);
+ 	struct crypto_tfm *tfm = crypto_skcipher_tfm(cipher);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);
+-	u32 ivsize, block, conf_reg = 0;
++	u32 block, conf_reg = 0;
+ 
+ 	block = crypto_tfm_alg_blocksize(tfm);
+-	ivsize = crypto_skcipher_ivsize(cipher);
+ 
+ 	if (block == DES_BLOCK_SIZE) {
+ 		rctx->mode |= RK_CRYPTO_TDES_FIFO_MODE |
+ 			     RK_CRYPTO_TDES_BYTESWAP_KEY |
+ 			     RK_CRYPTO_TDES_BYTESWAP_IV;
+ 		CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, rctx->mode);
+-		memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, req->iv, ivsize);
+ 		memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, ctx->key, ctx->keylen);
+ 		conf_reg = RK_CRYPTO_DESSEL;
+ 	} else {
+@@ -296,7 +289,6 @@ static void rk_ablk_hw_init(struct rk_cr
+ 		else if (ctx->keylen == AES_KEYSIZE_256)
+ 			rctx->mode |= RK_CRYPTO_AES_256BIT_key;
+ 		CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, rctx->mode);
+-		memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, req->iv, ivsize);
+ 		memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_KEY_0, ctx->key, ctx->keylen);
+ 	}
+ 	conf_reg |= RK_CRYPTO_BYTESWAP_BTFIFO |
+@@ -306,133 +298,138 @@ static void rk_ablk_hw_init(struct rk_cr
+ 		     RK_CRYPTO_BCDMA_ERR_ENA | RK_CRYPTO_BCDMA_DONE_ENA);
+ }
+ 
+-static void crypto_dma_start(struct rk_crypto_info *dev)
+-{
+-	CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAS, dev->addr_in);
+-	CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAL, dev->count / 4);
+-	CRYPTO_WRITE(dev, RK_CRYPTO_BTDMAS, dev->addr_out);
++static void crypto_dma_start(struct rk_crypto_info *dev,
++			     struct scatterlist *sgs,
++			     struct scatterlist *sgd, unsigned int todo)
++{
++	CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAS, sg_dma_address(sgs));
++	CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAL, todo);
++	CRYPTO_WRITE(dev, RK_CRYPTO_BTDMAS, sg_dma_address(sgd));
+ 	CRYPTO_WRITE(dev, RK_CRYPTO_CTRL, RK_CRYPTO_BLOCK_START |
+ 		     _SBF(RK_CRYPTO_BLOCK_START, 16));
+ }
+ 
+-static int rk_set_data_start(struct rk_crypto_info *dev)
++static int rk_cipher_run(struct crypto_engine *engine, void *async_req)
+ {
+-	int err;
+-	struct skcipher_request *req =
+-		skcipher_request_cast(dev->async_req);
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
++	struct skcipher_request *areq = container_of(async_req, struct skcipher_request, base);
++	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+-	u32 ivsize = crypto_skcipher_ivsize(tfm);
+-	u8 *src_last_blk = page_address(sg_page(dev->sg_src)) +
+-		dev->sg_src->offset + dev->sg_src->length - ivsize;
+-
+-	/* Store the iv that need to be updated in chain mode.
+-	 * And update the IV buffer to contain the next IV for decryption mode.
+-	 */
+-	if (rctx->mode & RK_CRYPTO_DEC) {
+-		memcpy(ctx->iv, src_last_blk, ivsize);
+-		sg_pcopy_to_buffer(dev->first, dev->src_nents, req->iv,
+-				   ivsize, dev->total - ivsize);
+-	}
+-
+-	err = dev->load_data(dev, dev->sg_src, dev->sg_dst);
+-	if (!err)
+-		crypto_dma_start(dev);
+-	return err;
+-}
+-
+-static int rk_ablk_start(struct rk_crypto_info *dev)
+-{
+-	struct skcipher_request *req =
+-		skcipher_request_cast(dev->async_req);
+-	unsigned long flags;
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(areq);
++	struct scatterlist *sgs, *sgd;
+ 	int err = 0;
++	int ivsize = crypto_skcipher_ivsize(tfm);
++	int offset;
++	u8 iv[AES_BLOCK_SIZE];
++	u8 biv[AES_BLOCK_SIZE];
++	u8 *ivtouse = areq->iv;
++	unsigned int len = areq->cryptlen;
++	unsigned int todo;
++
++	ivsize = crypto_skcipher_ivsize(tfm);
++	if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) {
++		if (rctx->mode & RK_CRYPTO_DEC) {
++			offset = areq->cryptlen - ivsize;
++			scatterwalk_map_and_copy(rctx->backup_iv, areq->src,
++						 offset, ivsize, 0);
++		}
++	}
+ 
+-	dev->left_bytes = req->cryptlen;
+-	dev->total = req->cryptlen;
+-	dev->sg_src = req->src;
+-	dev->first = req->src;
+-	dev->src_nents = sg_nents(req->src);
+-	dev->sg_dst = req->dst;
+-	dev->dst_nents = sg_nents(req->dst);
+-
+-	spin_lock_irqsave(&dev->lock, flags);
+-	rk_ablk_hw_init(dev);
+-	err = rk_set_data_start(dev);
+-	spin_unlock_irqrestore(&dev->lock, flags);
+-	return err;
+-}
++	sgs = areq->src;
++	sgd = areq->dst;
+ 
+-static void rk_iv_copyback(struct rk_crypto_info *dev)
+-{
+-	struct skcipher_request *req =
+-		skcipher_request_cast(dev->async_req);
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+-	u32 ivsize = crypto_skcipher_ivsize(tfm);
++	while (sgs && sgd && len) {
++		if (!sgs->length) {
++			sgs = sg_next(sgs);
++			sgd = sg_next(sgd);
++			continue;
++		}
++		if (rctx->mode & RK_CRYPTO_DEC) {
++			/* we backup last block of source to be used as IV at next step */
++			offset = sgs->length - ivsize;
++			scatterwalk_map_and_copy(biv, sgs, offset, ivsize, 0);
++		}
++		if (sgs == sgd) {
++			err = dma_map_sg(ctx->dev->dev, sgs, 1, DMA_BIDIRECTIONAL);
++			if (err <= 0) {
++				err = -EINVAL;
++				goto theend_iv;
++			}
++		} else {
++			err = dma_map_sg(ctx->dev->dev, sgs, 1, DMA_TO_DEVICE);
++			if (err <= 0) {
++				err = -EINVAL;
++				goto theend_iv;
++			}
++			err = dma_map_sg(ctx->dev->dev, sgd, 1, DMA_FROM_DEVICE);
++			if (err <= 0) {
++				err = -EINVAL;
++				goto theend_sgs;
++			}
++		}
++		err = 0;
++		rk_ablk_hw_init(ctx->dev, areq);
++		if (ivsize) {
++			if (ivsize == DES_BLOCK_SIZE)
++				memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_IV_0, ivtouse, ivsize);
++			else
++				memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_IV_0, ivtouse, ivsize);
++		}
++		reinit_completion(&ctx->dev->complete);
++		ctx->dev->status = 0;
+ 
+-	/* Update the IV buffer to contain the next IV for encryption mode. */
+-	if (!(rctx->mode & RK_CRYPTO_DEC)) {
+-		memcpy(req->iv,
+-		       sg_virt(dev->sg_dst) + dev->sg_dst->length - ivsize,
+-		       ivsize);
++		todo = min(sg_dma_len(sgs), len);
++		len -= todo;
++		crypto_dma_start(ctx->dev, sgs, sgd, todo / 4);
++		wait_for_completion_interruptible_timeout(&ctx->dev->complete,
++							  msecs_to_jiffies(2000));
++		if (!ctx->dev->status) {
++			dev_err(ctx->dev->dev, "DMA timeout\n");
++			err = -EFAULT;
++			goto theend;
++		}
++		if (sgs == sgd) {
++			dma_unmap_sg(ctx->dev->dev, sgs, 1, DMA_BIDIRECTIONAL);
++		} else {
++			dma_unmap_sg(ctx->dev->dev, sgs, 1, DMA_TO_DEVICE);
++			dma_unmap_sg(ctx->dev->dev, sgd, 1, DMA_FROM_DEVICE);
++		}
++		if (rctx->mode & RK_CRYPTO_DEC) {
++			memcpy(iv, biv, ivsize);
++			ivtouse = iv;
++		} else {
++			offset = sgd->length - ivsize;
++			scatterwalk_map_and_copy(iv, sgd, offset, ivsize, 0);
++			ivtouse = iv;
++		}
++		sgs = sg_next(sgs);
++		sgd = sg_next(sgd);
+ 	}
+-}
+-
+-static void rk_update_iv(struct rk_crypto_info *dev)
+-{
+-	struct skcipher_request *req =
+-		skcipher_request_cast(dev->async_req);
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+-	u32 ivsize = crypto_skcipher_ivsize(tfm);
+-	u8 *new_iv = NULL;
+ 
+-	if (rctx->mode & RK_CRYPTO_DEC) {
+-		new_iv = ctx->iv;
+-	} else {
+-		new_iv = page_address(sg_page(dev->sg_dst)) +
+-			 dev->sg_dst->offset + dev->sg_dst->length - ivsize;
++	if (areq->iv && ivsize > 0) {
++		offset = areq->cryptlen - ivsize;
++		if (rctx->mode & RK_CRYPTO_DEC) {
++			memcpy(areq->iv, rctx->backup_iv, ivsize);
++			memzero_explicit(rctx->backup_iv, ivsize);
++		} else {
++			scatterwalk_map_and_copy(areq->iv, areq->dst, offset,
++						 ivsize, 0);
++		}
+ 	}
+ 
+-	if (ivsize == DES_BLOCK_SIZE)
+-		memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, new_iv, ivsize);
+-	else if (ivsize == AES_BLOCK_SIZE)
+-		memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, new_iv, ivsize);
+-}
+-
+-/* return:
+- *	true	some err was occurred
+- *	fault	no err, continue
+- */
+-static int rk_ablk_rx(struct rk_crypto_info *dev)
+-{
+-	int err = 0;
+-	struct skcipher_request *req =
+-		skcipher_request_cast(dev->async_req);
++theend:
++	local_bh_disable();
++	crypto_finalize_skcipher_request(engine, areq, err);
++	local_bh_enable();
++	return 0;
+ 
+-	dev->unload_data(dev);
+-	if (dev->left_bytes) {
+-		rk_update_iv(dev);
+-		if (sg_is_last(dev->sg_src)) {
+-			dev_err(dev->dev, "[%s:%d] Lack of data\n",
+-					__func__, __LINE__);
+-			err = -ENOMEM;
+-			goto out_rx;
+-		}
+-		dev->sg_src = sg_next(dev->sg_src);
+-		dev->sg_dst = sg_next(dev->sg_dst);
+-		err = rk_set_data_start(dev);
++theend_sgs:
++	if (sgs == sgd) {
++		dma_unmap_sg(ctx->dev->dev, sgs, 1, DMA_BIDIRECTIONAL);
+ 	} else {
+-		rk_iv_copyback(dev);
+-		/* here show the calculation is over without any err */
+-		dev->complete(dev->async_req, 0);
+-		tasklet_schedule(&dev->queue_task);
++		dma_unmap_sg(ctx->dev->dev, sgs, 1, DMA_TO_DEVICE);
++		dma_unmap_sg(ctx->dev->dev, sgd, 1, DMA_FROM_DEVICE);
+ 	}
+-out_rx:
++theend_iv:
+ 	return err;
+ }
+ 
+@@ -446,9 +443,6 @@ static int rk_ablk_init_tfm(struct crypt
+ 	algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+ 
+ 	ctx->dev = algt->dev;
+-	ctx->dev->start = rk_ablk_start;
+-	ctx->dev->update = rk_ablk_rx;
+-	ctx->dev->complete = rk_crypto_complete;
+ 
+ 	ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
+ 	if (IS_ERR(ctx->fallback_tfm)) {
+@@ -460,6 +454,8 @@ static int rk_ablk_init_tfm(struct crypt
+ 	tfm->reqsize = sizeof(struct rk_cipher_rctx) +
+ 		crypto_skcipher_reqsize(ctx->fallback_tfm);
+ 
++	ctx->enginectx.op.do_one_request = rk_cipher_run;
++
+ 	return 0;
+ }
+ 
diff --git a/target/linux/rockchip/patches-6.0/177-crypto-rockchip-rewrite-type.patch b/target/linux/rockchip/patches-6.0/177-crypto-rockchip-rewrite-type.patch
new file mode 100644
index 000000000..032310fb6
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/177-crypto-rockchip-rewrite-type.patch
@@ -0,0 +1,174 @@
+From b9d97d2708d9ae617a3bb7bbb91ca543c486f337 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:49 +0000
+Subject: [PATCH 27/49] crypto: rockchip: rewrite type
+
+Instead of using a custom type for classify algorithms, let's just use
+already defined ones.
+And let's made a bit more verbose about what is registered.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c       | 26 +++++++++++++------
+ drivers/crypto/rockchip/rk3288_crypto.h       |  7 +----
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c |  6 ++---
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  | 12 ++++-----
+ 4 files changed, 28 insertions(+), 23 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -102,12 +102,22 @@ static int rk_crypto_register(struct rk_
+ 
+ 	for (i = 0; i < ARRAY_SIZE(rk_cipher_algs); i++) {
+ 		rk_cipher_algs[i]->dev = crypto_info;
+-		if (rk_cipher_algs[i]->type == ALG_TYPE_CIPHER)
+-			err = crypto_register_skcipher(
+-					&rk_cipher_algs[i]->alg.skcipher);
+-		else
+-			err = crypto_register_ahash(
+-					&rk_cipher_algs[i]->alg.hash);
++		switch (rk_cipher_algs[i]->type) {
++		case CRYPTO_ALG_TYPE_SKCIPHER:
++			dev_info(crypto_info->dev, "Register %s as %s\n",
++				 rk_cipher_algs[i]->alg.skcipher.base.cra_name,
++				 rk_cipher_algs[i]->alg.skcipher.base.cra_driver_name);
++			err = crypto_register_skcipher(&rk_cipher_algs[i]->alg.skcipher);
++			break;
++		case CRYPTO_ALG_TYPE_AHASH:
++			dev_info(crypto_info->dev, "Register %s as %s\n",
++				 rk_cipher_algs[i]->alg.hash.halg.base.cra_name,
++				 rk_cipher_algs[i]->alg.hash.halg.base.cra_driver_name);
++			err = crypto_register_ahash(&rk_cipher_algs[i]->alg.hash);
++			break;
++		default:
++			dev_err(crypto_info->dev, "unknown algorithm\n");
++		}
+ 		if (err)
+ 			goto err_cipher_algs;
+ 	}
+@@ -115,7 +125,7 @@ static int rk_crypto_register(struct rk_
+ 
+ err_cipher_algs:
+ 	for (k = 0; k < i; k++) {
+-		if (rk_cipher_algs[i]->type == ALG_TYPE_CIPHER)
++		if (rk_cipher_algs[i]->type == CRYPTO_ALG_TYPE_SKCIPHER)
+ 			crypto_unregister_skcipher(&rk_cipher_algs[k]->alg.skcipher);
+ 		else
+ 			crypto_unregister_ahash(&rk_cipher_algs[i]->alg.hash);
+@@ -128,7 +138,7 @@ static void rk_crypto_unregister(void)
+ 	unsigned int i;
+ 
+ 	for (i = 0; i < ARRAY_SIZE(rk_cipher_algs); i++) {
+-		if (rk_cipher_algs[i]->type == ALG_TYPE_CIPHER)
++		if (rk_cipher_algs[i]->type == CRYPTO_ALG_TYPE_SKCIPHER)
+ 			crypto_unregister_skcipher(&rk_cipher_algs[i]->alg.skcipher);
+ 		else
+ 			crypto_unregister_ahash(&rk_cipher_algs[i]->alg.hash);
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -232,18 +232,13 @@ struct rk_cipher_rctx {
+ 	struct skcipher_request fallback_req;   // keep at the end
+ };
+ 
+-enum alg_type {
+-	ALG_TYPE_HASH,
+-	ALG_TYPE_CIPHER,
+-};
+-
+ struct rk_crypto_tmp {
++	u32 type;
+ 	struct rk_crypto_info		*dev;
+ 	union {
+ 		struct skcipher_alg	skcipher;
+ 		struct ahash_alg	hash;
+ 	} alg;
+-	enum alg_type			type;
+ };
+ 
+ extern struct rk_crypto_tmp rk_ecb_aes_alg;
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -352,7 +352,7 @@ static void rk_cra_hash_exit(struct cryp
+ }
+ 
+ struct rk_crypto_tmp rk_ahash_sha1 = {
+-	.type = ALG_TYPE_HASH,
++	.type = CRYPTO_ALG_TYPE_AHASH,
+ 	.alg.hash = {
+ 		.init = rk_ahash_init,
+ 		.update = rk_ahash_update,
+@@ -382,7 +382,7 @@ struct rk_crypto_tmp rk_ahash_sha1 = {
+ };
+ 
+ struct rk_crypto_tmp rk_ahash_sha256 = {
+-	.type = ALG_TYPE_HASH,
++	.type = CRYPTO_ALG_TYPE_AHASH,
+ 	.alg.hash = {
+ 		.init = rk_ahash_init,
+ 		.update = rk_ahash_update,
+@@ -412,7 +412,7 @@ struct rk_crypto_tmp rk_ahash_sha256 = {
+ };
+ 
+ struct rk_crypto_tmp rk_ahash_md5 = {
+-	.type = ALG_TYPE_HASH,
++	.type = CRYPTO_ALG_TYPE_AHASH,
+ 	.alg.hash = {
+ 		.init = rk_ahash_init,
+ 		.update = rk_ahash_update,
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -468,7 +468,7 @@ static void rk_ablk_exit_tfm(struct cryp
+ }
+ 
+ struct rk_crypto_tmp rk_ecb_aes_alg = {
+-	.type = ALG_TYPE_CIPHER,
++	.type = CRYPTO_ALG_TYPE_SKCIPHER,
+ 	.alg.skcipher = {
+ 		.base.cra_name		= "ecb(aes)",
+ 		.base.cra_driver_name	= "ecb-aes-rk",
+@@ -490,7 +490,7 @@ struct rk_crypto_tmp rk_ecb_aes_alg = {
+ };
+ 
+ struct rk_crypto_tmp rk_cbc_aes_alg = {
+-	.type = ALG_TYPE_CIPHER,
++	.type = CRYPTO_ALG_TYPE_SKCIPHER,
+ 	.alg.skcipher = {
+ 		.base.cra_name		= "cbc(aes)",
+ 		.base.cra_driver_name	= "cbc-aes-rk",
+@@ -513,7 +513,7 @@ struct rk_crypto_tmp rk_cbc_aes_alg = {
+ };
+ 
+ struct rk_crypto_tmp rk_ecb_des_alg = {
+-	.type = ALG_TYPE_CIPHER,
++	.type = CRYPTO_ALG_TYPE_SKCIPHER,
+ 	.alg.skcipher = {
+ 		.base.cra_name		= "ecb(des)",
+ 		.base.cra_driver_name	= "ecb-des-rk",
+@@ -535,7 +535,7 @@ struct rk_crypto_tmp rk_ecb_des_alg = {
+ };
+ 
+ struct rk_crypto_tmp rk_cbc_des_alg = {
+-	.type = ALG_TYPE_CIPHER,
++	.type = CRYPTO_ALG_TYPE_SKCIPHER,
+ 	.alg.skcipher = {
+ 		.base.cra_name		= "cbc(des)",
+ 		.base.cra_driver_name	= "cbc-des-rk",
+@@ -558,7 +558,7 @@ struct rk_crypto_tmp rk_cbc_des_alg = {
+ };
+ 
+ struct rk_crypto_tmp rk_ecb_des3_ede_alg = {
+-	.type = ALG_TYPE_CIPHER,
++	.type = CRYPTO_ALG_TYPE_SKCIPHER,
+ 	.alg.skcipher = {
+ 		.base.cra_name		= "ecb(des3_ede)",
+ 		.base.cra_driver_name	= "ecb-des3-ede-rk",
+@@ -580,7 +580,7 @@ struct rk_crypto_tmp rk_ecb_des3_ede_alg
+ };
+ 
+ struct rk_crypto_tmp rk_cbc_des3_ede_alg = {
+-	.type = ALG_TYPE_CIPHER,
++	.type = CRYPTO_ALG_TYPE_SKCIPHER,
+ 	.alg.skcipher = {
+ 		.base.cra_name		= "cbc(des3_ede)",
+ 		.base.cra_driver_name	= "cbc-des3-ede-rk",
diff --git a/target/linux/rockchip/patches-6.0/178-crypto-rockchip-add-debugfs.patch b/target/linux/rockchip/patches-6.0/178-crypto-rockchip-add-debugfs.patch
new file mode 100644
index 000000000..0ff54cc53
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/178-crypto-rockchip-add-debugfs.patch
@@ -0,0 +1,232 @@
+From ca19c52753332836704019bc5f423b054ea2616b Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:50 +0000
+Subject: [PATCH 28/49] crypto: rockchip: add debugfs
+
+This patch enable to access usage stats for each algorithm.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/Kconfig                        | 10 ++++
+ drivers/crypto/rockchip/rk3288_crypto.c       | 47 +++++++++++++++++++
+ drivers/crypto/rockchip/rk3288_crypto.h       | 11 +++++
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c |  8 ++++
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  | 15 ++++++
+ 5 files changed, 91 insertions(+)
+
+--- a/drivers/crypto/Kconfig
++++ b/drivers/crypto/Kconfig
+@@ -686,6 +686,16 @@ config CRYPTO_DEV_ROCKCHIP
+ 	  This driver interfaces with the hardware crypto accelerator.
+ 	  Supporting cbc/ecb chainmode, and aes/des/des3_ede cipher mode.
+ 
++config CRYPTO_DEV_ROCKCHIP_DEBUG
++	bool "Enable Rockchip crypto stats"
++	depends on CRYPTO_DEV_ROCKCHIP
++	depends on DEBUG_FS
++	help
++	  Say y to enable Rockchip crypto debug stats.
++	  This will create /sys/kernel/debug/rk3288_crypto/stats for displaying
++	  the number of requests per algorithm and other internal stats.
++
++
+ config CRYPTO_DEV_ZYNQMP_AES
+ 	tristate "Support for Xilinx ZynqMP AES hw accelerator"
+ 	depends on ZYNQMP_FIRMWARE || COMPILE_TEST
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -95,6 +95,41 @@ static struct rk_crypto_tmp *rk_cipher_a
+ 	&rk_ahash_md5,
+ };
+ 
++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG
++static int rk_crypto_debugfs_show(struct seq_file *seq, void *v)
++{
++	unsigned int i;
++
++	for (i = 0; i < ARRAY_SIZE(rk_cipher_algs); i++) {
++		if (!rk_cipher_algs[i]->dev)
++			continue;
++		switch (rk_cipher_algs[i]->type) {
++		case CRYPTO_ALG_TYPE_SKCIPHER:
++			seq_printf(seq, "%s %s reqs=%lu fallback=%lu\n",
++				   rk_cipher_algs[i]->alg.skcipher.base.cra_driver_name,
++				   rk_cipher_algs[i]->alg.skcipher.base.cra_name,
++				   rk_cipher_algs[i]->stat_req, rk_cipher_algs[i]->stat_fb);
++			seq_printf(seq, "\tfallback due to length: %lu\n",
++				   rk_cipher_algs[i]->stat_fb_len);
++			seq_printf(seq, "\tfallback due to alignment: %lu\n",
++				   rk_cipher_algs[i]->stat_fb_align);
++			seq_printf(seq, "\tfallback due to SGs: %lu\n",
++				   rk_cipher_algs[i]->stat_fb_sgdiff);
++			break;
++		case CRYPTO_ALG_TYPE_AHASH:
++			seq_printf(seq, "%s %s reqs=%lu fallback=%lu\n",
++				   rk_cipher_algs[i]->alg.hash.halg.base.cra_driver_name,
++				   rk_cipher_algs[i]->alg.hash.halg.base.cra_name,
++				   rk_cipher_algs[i]->stat_req, rk_cipher_algs[i]->stat_fb);
++			break;
++		}
++	}
++	return 0;
++}
++
++DEFINE_SHOW_ATTRIBUTE(rk_crypto_debugfs);
++#endif
++
+ static int rk_crypto_register(struct rk_crypto_info *crypto_info)
+ {
+ 	unsigned int i, k;
+@@ -246,6 +281,15 @@ static int rk_crypto_probe(struct platfo
+ 		goto err_register_alg;
+ 	}
+ 
++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG
++	/* Ignore error of debugfs */
++	crypto_info->dbgfs_dir = debugfs_create_dir("rk3288_crypto", NULL);
++	crypto_info->dbgfs_stats = debugfs_create_file("stats", 0444,
++						       crypto_info->dbgfs_dir,
++						       crypto_info,
++						       &rk_crypto_debugfs_fops);
++#endif
++
+ 	dev_info(dev, "Crypto Accelerator successfully registered\n");
+ 	return 0;
+ 
+@@ -260,6 +304,9 @@ static int rk_crypto_remove(struct platf
+ {
+ 	struct rk_crypto_info *crypto_tmp = platform_get_drvdata(pdev);
+ 
++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG
++	debugfs_remove_recursive(crypto_tmp->dbgfs_dir);
++#endif
+ 	rk_crypto_unregister();
+ 	rk_crypto_disable_clk(crypto_tmp);
+ 	crypto_engine_exit(crypto_tmp->engine);
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -7,6 +7,7 @@
+ #include <crypto/algapi.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/interrupt.h>
++#include <linux/debugfs.h>
+ #include <linux/delay.h>
+ #include <linux/scatterlist.h>
+ #include <crypto/engine.h>
+@@ -199,6 +200,10 @@ struct rk_crypto_info {
+ 	struct crypto_engine *engine;
+ 	struct completion complete;
+ 	int status;
++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG
++	struct dentry *dbgfs_dir;
++	struct dentry *dbgfs_stats;
++#endif
+ };
+ 
+ /* the private variable of hash */
+@@ -239,6 +244,12 @@ struct rk_crypto_tmp {
+ 		struct skcipher_alg	skcipher;
+ 		struct ahash_alg	hash;
+ 	} alg;
++	unsigned long stat_req;
++	unsigned long stat_fb;
++	unsigned long stat_fb_len;
++	unsigned long stat_fb_sglen;
++	unsigned long stat_fb_align;
++	unsigned long stat_fb_sgdiff;
+ };
+ 
+ extern struct rk_crypto_tmp rk_ecb_aes_alg;
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -39,6 +39,10 @@ static int rk_ahash_digest_fb(struct aha
+ 	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
+ 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
+ 	struct rk_ahash_ctx *tfmctx = crypto_ahash_ctx(tfm);
++	struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg);
++	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
++
++	algt->stat_fb++;
+ 
+ 	ahash_request_set_tfm(&rctx->fallback_req, tfmctx->fallback_tfm);
+ 	rctx->fallback_req.base.flags = areq->base.flags &
+@@ -249,6 +253,8 @@ static int rk_hash_run(struct crypto_eng
+ 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
+ 	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
+ 	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
++	struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg);
++	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
+ 	struct scatterlist *sg = areq->src;
+ 	int err = 0;
+ 	int i;
+@@ -256,6 +262,8 @@ static int rk_hash_run(struct crypto_eng
+ 
+ 	rctx->mode = 0;
+ 
++	algt->stat_req++;
++
+ 	switch (crypto_ahash_digestsize(tfm)) {
+ 	case SHA1_DIGEST_SIZE:
+ 		rctx->mode = RK_CRYPTO_HASH_SHA1;
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -18,6 +18,8 @@ static int rk_cipher_need_fallback(struc
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	unsigned int bs = crypto_skcipher_blocksize(tfm);
++	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
++	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+ 	struct scatterlist *sgs, *sgd;
+ 	unsigned int stodo, dtodo, len;
+ 
+@@ -29,20 +31,25 @@ static int rk_cipher_need_fallback(struc
+ 	sgd = req->dst;
+ 	while (sgs && sgd) {
+ 		if (!IS_ALIGNED(sgs->offset, sizeof(u32))) {
++			algt->stat_fb_align++;
+ 			return true;
+ 		}
+ 		if (!IS_ALIGNED(sgd->offset, sizeof(u32))) {
++			algt->stat_fb_align++;
+ 			return true;
+ 		}
+ 		stodo = min(len, sgs->length);
+ 		if (stodo % bs) {
++			algt->stat_fb_len++;
+ 			return true;
+ 		}
+ 		dtodo = min(len, sgd->length);
+ 		if (dtodo % bs) {
++			algt->stat_fb_len++;
+ 			return true;
+ 		}
+ 		if (stodo != dtodo) {
++			algt->stat_fb_sgdiff++;
+ 			return true;
+ 		}
+ 		len -= stodo;
+@@ -57,8 +64,12 @@ static int rk_cipher_fallback(struct skc
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
+ 	struct rk_cipher_ctx *op = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(areq);
++	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
++	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+ 	int err;
+ 
++	algt->stat_fb++;
++
+ 	skcipher_request_set_tfm(&rctx->fallback_req, op->fallback_tfm);
+ 	skcipher_request_set_callback(&rctx->fallback_req, areq->base.flags,
+ 				      areq->base.complete, areq->base.data);
+@@ -324,6 +335,10 @@ static int rk_cipher_run(struct crypto_e
+ 	u8 *ivtouse = areq->iv;
+ 	unsigned int len = areq->cryptlen;
+ 	unsigned int todo;
++	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
++	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
++
++	algt->stat_req++;
+ 
+ 	ivsize = crypto_skcipher_ivsize(tfm);
+ 	if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) {
diff --git a/target/linux/rockchip/patches-6.0/179-crypto-rockchip-introduce-PM.patch b/target/linux/rockchip/patches-6.0/179-crypto-rockchip-introduce-PM.patch
new file mode 100644
index 000000000..afe2a9a68
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/179-crypto-rockchip-introduce-PM.patch
@@ -0,0 +1,181 @@
+From a8a988a5e67068b554f92418775f274771cfb068 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:51 +0000
+Subject: [PATCH 29/49] crypto: rockchip: introduce PM
+
+Add runtime PM support for rockchip crypto.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c       | 51 ++++++++++++++++++-
+ drivers/crypto/rockchip/rk3288_crypto.h       |  1 +
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c | 10 ++++
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  |  9 ++++
+ 4 files changed, 69 insertions(+), 2 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -65,6 +65,48 @@ static void rk_crypto_disable_clk(struct
+ 	clk_disable_unprepare(dev->sclk);
+ }
+ 
++/*
++ * Power management strategy: The device is suspended unless a TFM exists for
++ * one of the algorithms proposed by this driver.
++ */
++static int rk_crypto_pm_suspend(struct device *dev)
++{
++	struct rk_crypto_info *rkdev = dev_get_drvdata(dev);
++
++	rk_crypto_disable_clk(rkdev);
++	return 0;
++}
++
++static int rk_crypto_pm_resume(struct device *dev)
++{
++	struct rk_crypto_info *rkdev = dev_get_drvdata(dev);
++
++	return rk_crypto_enable_clk(rkdev);
++}
++
++static const struct dev_pm_ops rk_crypto_pm_ops = {
++	SET_RUNTIME_PM_OPS(rk_crypto_pm_suspend, rk_crypto_pm_resume, NULL)
++};
++
++static int rk_crypto_pm_init(struct rk_crypto_info *rkdev)
++{
++	int err;
++
++	pm_runtime_use_autosuspend(rkdev->dev);
++	pm_runtime_set_autosuspend_delay(rkdev->dev, 2000);
++
++	err = pm_runtime_set_suspended(rkdev->dev);
++	if (err)
++		return err;
++	pm_runtime_enable(rkdev->dev);
++	return err;
++}
++
++static void rk_crypto_pm_exit(struct rk_crypto_info *rkdev)
++{
++	pm_runtime_disable(rkdev->dev);
++}
++
+ static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id)
+ {
+ 	struct rk_crypto_info *dev  = platform_get_drvdata(dev_id);
+@@ -273,7 +315,9 @@ static int rk_crypto_probe(struct platfo
+ 	crypto_engine_start(crypto_info->engine);
+ 	init_completion(&crypto_info->complete);
+ 
+-	rk_crypto_enable_clk(crypto_info);
++	err = rk_crypto_pm_init(crypto_info);
++	if (err)
++		goto err_pm;
+ 
+ 	err = rk_crypto_register(crypto_info);
+ 	if (err) {
+@@ -294,6 +338,8 @@ static int rk_crypto_probe(struct platfo
+ 	return 0;
+ 
+ err_register_alg:
++	rk_crypto_pm_exit(crypto_info);
++err_pm:
+ 	crypto_engine_exit(crypto_info->engine);
+ err_crypto:
+ 	dev_err(dev, "Crypto Accelerator not successfully registered\n");
+@@ -308,7 +354,7 @@ static int rk_crypto_remove(struct platf
+ 	debugfs_remove_recursive(crypto_tmp->dbgfs_dir);
+ #endif
+ 	rk_crypto_unregister();
+-	rk_crypto_disable_clk(crypto_tmp);
++	rk_crypto_pm_exit(crypto_tmp);
+ 	crypto_engine_exit(crypto_tmp->engine);
+ 	return 0;
+ }
+@@ -318,6 +364,7 @@ static struct platform_driver crypto_dri
+ 	.remove		= rk_crypto_remove,
+ 	.driver		= {
+ 		.name	= "rk3288-crypto",
++		.pm		= &rk_crypto_pm_ops,
+ 		.of_match_table	= crypto_of_id_table,
+ 	},
+ };
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -9,6 +9,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/debugfs.h>
+ #include <linux/delay.h>
++#include <linux/pm_runtime.h>
+ #include <linux/scatterlist.h>
+ #include <crypto/engine.h>
+ #include <crypto/internal/hash.h>
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -328,6 +328,7 @@ static int rk_cra_hash_init(struct crypt
+ 	struct ahash_alg *alg = __crypto_ahash_alg(tfm->__crt_alg);
+ 
+ 	const char *alg_name = crypto_tfm_alg_name(tfm);
++	int err;
+ 
+ 	algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
+ 
+@@ -349,7 +350,15 @@ static int rk_cra_hash_init(struct crypt
+ 	tctx->enginectx.op.prepare_request = rk_hash_prepare;
+ 	tctx->enginectx.op.unprepare_request = rk_hash_unprepare;
+ 
++	err = pm_runtime_resume_and_get(tctx->dev->dev);
++	if (err < 0)
++		goto error_pm;
++
+ 	return 0;
++error_pm:
++	crypto_free_ahash(tctx->fallback_tfm);
++
++	return err;
+ }
+ 
+ static void rk_cra_hash_exit(struct crypto_tfm *tfm)
+@@ -357,6 +366,7 @@ static void rk_cra_hash_exit(struct cryp
+ 	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm);
+ 
+ 	crypto_free_ahash(tctx->fallback_tfm);
++	pm_runtime_put_autosuspend(tctx->dev->dev);
+ }
+ 
+ struct rk_crypto_tmp rk_ahash_sha1 = {
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -454,6 +454,7 @@ static int rk_ablk_init_tfm(struct crypt
+ 	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
+ 	const char *name = crypto_tfm_alg_name(&tfm->base);
+ 	struct rk_crypto_tmp *algt;
++	int err;
+ 
+ 	algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+ 
+@@ -471,7 +472,14 @@ static int rk_ablk_init_tfm(struct crypt
+ 
+ 	ctx->enginectx.op.do_one_request = rk_cipher_run;
+ 
++	err = pm_runtime_resume_and_get(ctx->dev->dev);
++	if (err < 0)
++		goto error_pm;
++
+ 	return 0;
++error_pm:
++	crypto_free_skcipher(ctx->fallback_tfm);
++	return err;
+ }
+ 
+ static void rk_ablk_exit_tfm(struct crypto_skcipher *tfm)
+@@ -480,6 +488,7 @@ static void rk_ablk_exit_tfm(struct cryp
+ 
+ 	memzero_explicit(ctx->key, ctx->keylen);
+ 	crypto_free_skcipher(ctx->fallback_tfm);
++	pm_runtime_put_autosuspend(ctx->dev->dev);
+ }
+ 
+ struct rk_crypto_tmp rk_ecb_aes_alg = {
diff --git a/target/linux/rockchip/patches-6.0/180-crypto-rockchip-handle-reset-also-in-PM.patch b/target/linux/rockchip/patches-6.0/180-crypto-rockchip-handle-reset-also-in-PM.patch
new file mode 100644
index 000000000..5c7e6953f
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/180-crypto-rockchip-handle-reset-also-in-PM.patch
@@ -0,0 +1,66 @@
+From e1d7ad70ff4447218815f3b9427ee7cd8cc6836b Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:52 +0000
+Subject: [PATCH 30/49] crypto: rockchip: handle reset also in PM
+
+reset could be handled by PM functions.
+We keep the initial reset pulse to be sure the hw is a know device state
+after probe.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c | 22 ++++++++++------------
+ 1 file changed, 10 insertions(+), 12 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -74,14 +74,23 @@ static int rk_crypto_pm_suspend(struct d
+ 	struct rk_crypto_info *rkdev = dev_get_drvdata(dev);
+ 
+ 	rk_crypto_disable_clk(rkdev);
++	reset_control_assert(rkdev->rst);
++
+ 	return 0;
+ }
+ 
+ static int rk_crypto_pm_resume(struct device *dev)
+ {
+ 	struct rk_crypto_info *rkdev = dev_get_drvdata(dev);
++	int ret;
++
++	ret = rk_crypto_enable_clk(rkdev);
++	if (ret)
++		return ret;
++
++	reset_control_deassert(rkdev->rst);
++	return 0;
+ 
+-	return rk_crypto_enable_clk(rkdev);
+ }
+ 
+ static const struct dev_pm_ops rk_crypto_pm_ops = {
+@@ -222,13 +231,6 @@ static void rk_crypto_unregister(void)
+ 	}
+ }
+ 
+-static void rk_crypto_action(void *data)
+-{
+-	struct rk_crypto_info *crypto_info = data;
+-
+-	reset_control_assert(crypto_info->rst);
+-}
+-
+ static const struct of_device_id crypto_of_id_table[] = {
+ 	{ .compatible = "rockchip,rk3288-crypto" },
+ 	{}
+@@ -258,10 +260,6 @@ static int rk_crypto_probe(struct platfo
+ 	usleep_range(10, 20);
+ 	reset_control_deassert(crypto_info->rst);
+ 
+-	err = devm_add_action_or_reset(dev, rk_crypto_action, crypto_info);
+-	if (err)
+-		goto err_crypto;
+-
+ 	crypto_info->reg = devm_platform_ioremap_resource(pdev, 0);
+ 	if (IS_ERR(crypto_info->reg)) {
+ 		err = PTR_ERR(crypto_info->reg);
diff --git a/target/linux/rockchip/patches-6.0/181-crypto-rockchip-use-clk_bulk-to-simplify-clock-manag.patch b/target/linux/rockchip/patches-6.0/181-crypto-rockchip-use-clk_bulk-to-simplify-clock-manag.patch
new file mode 100644
index 000000000..2caf7f6c8
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/181-crypto-rockchip-use-clk_bulk-to-simplify-clock-manag.patch
@@ -0,0 +1,118 @@
+From b388e1b6a75d477735f7e2b90130169638b72c37 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:53 +0000
+Subject: [PATCH 31/49] crypto: rockchip: use clk_bulk to simplify clock
+ management
+
+rk3328 does not have the same clock names than rk3288, instead of using a complex
+clock management, let's use clk_bulk to simplify their handling.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c | 66 ++++---------------------
+ drivers/crypto/rockchip/rk3288_crypto.h |  6 +--
+ 2 files changed, 11 insertions(+), 61 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -22,47 +22,16 @@ static int rk_crypto_enable_clk(struct r
+ {
+ 	int err;
+ 
+-	err = clk_prepare_enable(dev->sclk);
+-	if (err) {
+-		dev_err(dev->dev, "[%s:%d], Couldn't enable clock sclk\n",
+-			__func__, __LINE__);
+-		goto err_return;
+-	}
+-	err = clk_prepare_enable(dev->aclk);
+-	if (err) {
+-		dev_err(dev->dev, "[%s:%d], Couldn't enable clock aclk\n",
+-			__func__, __LINE__);
+-		goto err_aclk;
+-	}
+-	err = clk_prepare_enable(dev->hclk);
+-	if (err) {
+-		dev_err(dev->dev, "[%s:%d], Couldn't enable clock hclk\n",
+-			__func__, __LINE__);
+-		goto err_hclk;
+-	}
+-	err = clk_prepare_enable(dev->dmaclk);
+-	if (err) {
+-		dev_err(dev->dev, "[%s:%d], Couldn't enable clock dmaclk\n",
+-			__func__, __LINE__);
+-		goto err_dmaclk;
+-	}
+-	return err;
+-err_dmaclk:
+-	clk_disable_unprepare(dev->hclk);
+-err_hclk:
+-	clk_disable_unprepare(dev->aclk);
+-err_aclk:
+-	clk_disable_unprepare(dev->sclk);
+-err_return:
++	err = clk_bulk_prepare_enable(dev->num_clks, dev->clks);
++	if (err)
++		dev_err(dev->dev, "Could not enable clock clks\n");
++
+ 	return err;
+ }
+ 
+ static void rk_crypto_disable_clk(struct rk_crypto_info *dev)
+ {
+-	clk_disable_unprepare(dev->dmaclk);
+-	clk_disable_unprepare(dev->hclk);
+-	clk_disable_unprepare(dev->aclk);
+-	clk_disable_unprepare(dev->sclk);
++	clk_bulk_disable_unprepare(dev->num_clks, dev->clks);
+ }
+ 
+ /*
+@@ -266,27 +235,10 @@ static int rk_crypto_probe(struct platfo
+ 		goto err_crypto;
+ 	}
+ 
+-	crypto_info->aclk = devm_clk_get(&pdev->dev, "aclk");
+-	if (IS_ERR(crypto_info->aclk)) {
+-		err = PTR_ERR(crypto_info->aclk);
+-		goto err_crypto;
+-	}
+-
+-	crypto_info->hclk = devm_clk_get(&pdev->dev, "hclk");
+-	if (IS_ERR(crypto_info->hclk)) {
+-		err = PTR_ERR(crypto_info->hclk);
+-		goto err_crypto;
+-	}
+-
+-	crypto_info->sclk = devm_clk_get(&pdev->dev, "sclk");
+-	if (IS_ERR(crypto_info->sclk)) {
+-		err = PTR_ERR(crypto_info->sclk);
+-		goto err_crypto;
+-	}
+-
+-	crypto_info->dmaclk = devm_clk_get(&pdev->dev, "apb_pclk");
+-	if (IS_ERR(crypto_info->dmaclk)) {
+-		err = PTR_ERR(crypto_info->dmaclk);
++	crypto_info->num_clks = devm_clk_bulk_get_all(&pdev->dev,
++						      &crypto_info->clks);
++	if (crypto_info->num_clks < 3) {
++		err = -EINVAL;
+ 		goto err_crypto;
+ 	}
+ 
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -190,10 +190,8 @@
+ 
+ struct rk_crypto_info {
+ 	struct device			*dev;
+-	struct clk			*aclk;
+-	struct clk			*hclk;
+-	struct clk			*sclk;
+-	struct clk			*dmaclk;
++	struct clk_bulk_data		*clks;
++	int num_clks;
+ 	struct reset_control		*rst;
+ 	void __iomem			*reg;
+ 	int				irq;
diff --git a/target/linux/rockchip/patches-6.0/182-crypto-rockchip-add-myself-as-maintainer.patch b/target/linux/rockchip/patches-6.0/182-crypto-rockchip-add-myself-as-maintainer.patch
new file mode 100644
index 000000000..adab9faa6
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/182-crypto-rockchip-add-myself-as-maintainer.patch
@@ -0,0 +1,30 @@
+From 771d6ebe99b61c1b143feab92e896fecc6ba16d0 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:54 +0000
+Subject: [PATCH 32/49] crypto: rockchip: add myself as maintainer
+
+Nobody is set as maintainer of rockchip crypto, I propose to do it as I
+have already reworked lot of this code.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ MAINTAINERS | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -17569,6 +17569,13 @@ F:	Documentation/ABI/*/sysfs-driver-hid-
+ F:	drivers/hid/hid-roccat*
+ F:	include/linux/hid-roccat*
+ 
++ROCKCHIP CRYPTO DRIVERS
++M:	Corentin Labbe <clabbe@baylibre.com>
++L:	linux-crypto@vger.kernel.org
++S:	Maintained
++F:	Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml
++F:	drivers/crypto/rockchip/
++
+ ROCKCHIP I2S TDM DRIVER
+ M:	Nicolas Frattaroli <frattaroli.nicolas@gmail.com>
+ L:	linux-rockchip@lists.infradead.org
diff --git a/target/linux/rockchip/patches-6.0/183-crypto-rockchip-use-read_poll_timeout.patch b/target/linux/rockchip/patches-6.0/183-crypto-rockchip-use-read_poll_timeout.patch
new file mode 100644
index 000000000..b1ae94d2e
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/183-crypto-rockchip-use-read_poll_timeout.patch
@@ -0,0 +1,54 @@
+From f7d1ea66d097a14e2c8dd312f2360db746db055f Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:55 +0000
+Subject: [PATCH 33/49] crypto: rockchip: use read_poll_timeout
+
+Use read_poll_timeout instead of open coding it.
+In the same time, fix indentation of related comment.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c | 24 +++++++++----------
+ 1 file changed, 12 insertions(+), 12 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -10,6 +10,7 @@
+  */
+ #include <linux/device.h>
+ #include <asm/unaligned.h>
++#include <linux/iopoll.h>
+ #include "rk3288_crypto.h"
+ 
+ /*
+@@ -295,18 +296,17 @@ static int rk_hash_run(struct crypto_eng
+ 		sg = sg_next(sg);
+ 	}
+ 
+-		/*
+-		 * it will take some time to process date after last dma
+-		 * transmission.
+-		 *
+-		 * waiting time is relative with the last date len,
+-		 * so cannot set a fixed time here.
+-		 * 10us makes system not call here frequently wasting
+-		 * efficiency, and make it response quickly when dma
+-		 * complete.
+-		 */
+-	while (!CRYPTO_READ(tctx->dev, RK_CRYPTO_HASH_STS))
+-		udelay(10);
++	/*
++	 * it will take some time to process date after last dma
++	 * transmission.
++	 *
++	 * waiting time is relative with the last date len,
++	 * so cannot set a fixed time here.
++	 * 10us makes system not call here frequently wasting
++	 * efficiency, and make it response quickly when dma
++	 * complete.
++	 */
++	readl_poll_timeout(tctx->dev->reg + RK_CRYPTO_HASH_STS, v, v == 0, 10, 1000);
+ 
+ 	for (i = 0; i < crypto_ahash_digestsize(tfm) / 4; i++) {
+ 		v = readl(tctx->dev->reg + RK_CRYPTO_HASH_DOUT_0 + i * 4);
diff --git a/target/linux/rockchip/patches-6.0/184-crypto-rockchip-fix-style-issue.patch b/target/linux/rockchip/patches-6.0/184-crypto-rockchip-fix-style-issue.patch
new file mode 100644
index 000000000..4c6d89be1
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/184-crypto-rockchip-fix-style-issue.patch
@@ -0,0 +1,55 @@
+From ce5aef761e09d6f17ed8f3e0dae3bf90fb06a838 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:56 +0000
+Subject: [PATCH 34/49] crypto: rockchip: fix style issue
+
+This patch fixes some warning reported by checkpatch
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -336,7 +336,7 @@ static int rk_cra_hash_init(struct crypt
+ 
+ 	/* for fallback */
+ 	tctx->fallback_tfm = crypto_alloc_ahash(alg_name, 0,
+-					       CRYPTO_ALG_NEED_FALLBACK);
++						CRYPTO_ALG_NEED_FALLBACK);
+ 	if (IS_ERR(tctx->fallback_tfm)) {
+ 		dev_err(tctx->dev->dev, "Could not load fallback driver.\n");
+ 		return PTR_ERR(tctx->fallback_tfm);
+@@ -394,8 +394,8 @@ struct rk_crypto_tmp rk_ahash_sha1 = {
+ 				  .cra_init = rk_cra_hash_init,
+ 				  .cra_exit = rk_cra_hash_exit,
+ 				  .cra_module = THIS_MODULE,
+-				  }
+-			 }
++			}
++		}
+ 	}
+ };
+ 
+@@ -424,8 +424,8 @@ struct rk_crypto_tmp rk_ahash_sha256 = {
+ 				  .cra_init = rk_cra_hash_init,
+ 				  .cra_exit = rk_cra_hash_exit,
+ 				  .cra_module = THIS_MODULE,
+-				  }
+-			 }
++			}
++		}
+ 	}
+ };
+ 
+@@ -454,7 +454,7 @@ struct rk_crypto_tmp rk_ahash_md5 = {
+ 				  .cra_init = rk_cra_hash_init,
+ 				  .cra_exit = rk_cra_hash_exit,
+ 				  .cra_module = THIS_MODULE,
+-				  }
+ 			}
++		}
+ 	}
+ };
diff --git a/target/linux/rockchip/patches-6.0/185-crypto-rockchip-add-support-for-rk3328.patch b/target/linux/rockchip/patches-6.0/185-crypto-rockchip-add-support-for-rk3328.patch
new file mode 100644
index 000000000..7319de603
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/185-crypto-rockchip-add-support-for-rk3328.patch
@@ -0,0 +1,23 @@
+From 50f01f648e6cc3d2b20674b50b662290c98e9041 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:57 +0000
+Subject: [PATCH 35/49] crypto: rockchip: add support for rk3328
+
+The rk3328 could be used as-is by the rockchip driver.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -202,6 +202,7 @@ static void rk_crypto_unregister(void)
+ 
+ static const struct of_device_id crypto_of_id_table[] = {
+ 	{ .compatible = "rockchip,rk3288-crypto" },
++	{ .compatible = "rockchip,rk3328-crypto" },
+ 	{}
+ };
+ MODULE_DEVICE_TABLE(of, crypto_of_id_table);
diff --git a/target/linux/rockchip/patches-6.0/186-crypto-rockchip-rename-ablk-functions-to-cipher.patch b/target/linux/rockchip/patches-6.0/186-crypto-rockchip-rename-ablk-functions-to-cipher.patch
new file mode 100644
index 000000000..bc6337569
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/186-crypto-rockchip-rename-ablk-functions-to-cipher.patch
@@ -0,0 +1,119 @@
+From d6996995f04ac2be833d87b94e78aa532ed9ee16 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:58 +0000
+Subject: [PATCH 36/49] crypto: rockchip: rename ablk functions to cipher
+
+Some functions have still ablk in their name even if there are
+not handling ablk_cipher anymore.
+So let's rename them.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  | 32 +++++++++----------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -273,7 +273,7 @@ static int rk_des3_ede_cbc_decrypt(struc
+ 	return rk_handle_req(dev, req);
+ }
+ 
+-static void rk_ablk_hw_init(struct rk_crypto_info *dev, struct skcipher_request *req)
++static void rk_cipher_hw_init(struct rk_crypto_info *dev, struct skcipher_request *req)
+ {
+ 	struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req);
+ 	struct crypto_tfm *tfm = crypto_skcipher_tfm(cipher);
+@@ -382,7 +382,7 @@ static int rk_cipher_run(struct crypto_e
+ 			}
+ 		}
+ 		err = 0;
+-		rk_ablk_hw_init(ctx->dev, areq);
++		rk_cipher_hw_init(ctx->dev, areq);
+ 		if (ivsize) {
+ 			if (ivsize == DES_BLOCK_SIZE)
+ 				memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_IV_0, ivtouse, ivsize);
+@@ -448,7 +448,7 @@ theend_iv:
+ 	return err;
+ }
+ 
+-static int rk_ablk_init_tfm(struct crypto_skcipher *tfm)
++static int rk_cipher_tfm_init(struct crypto_skcipher *tfm)
+ {
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
+@@ -482,7 +482,7 @@ error_pm:
+ 	return err;
+ }
+ 
+-static void rk_ablk_exit_tfm(struct crypto_skcipher *tfm)
++static void rk_cipher_tfm_exit(struct crypto_skcipher *tfm)
+ {
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 
+@@ -503,8 +503,8 @@ struct rk_crypto_tmp rk_ecb_aes_alg = {
+ 		.base.cra_alignmask	= 0x0f,
+ 		.base.cra_module	= THIS_MODULE,
+ 
+-		.init			= rk_ablk_init_tfm,
+-		.exit			= rk_ablk_exit_tfm,
++		.init			= rk_cipher_tfm_init,
++		.exit			= rk_cipher_tfm_exit,
+ 		.min_keysize		= AES_MIN_KEY_SIZE,
+ 		.max_keysize		= AES_MAX_KEY_SIZE,
+ 		.setkey			= rk_aes_setkey,
+@@ -525,8 +525,8 @@ struct rk_crypto_tmp rk_cbc_aes_alg = {
+ 		.base.cra_alignmask	= 0x0f,
+ 		.base.cra_module	= THIS_MODULE,
+ 
+-		.init			= rk_ablk_init_tfm,
+-		.exit			= rk_ablk_exit_tfm,
++		.init			= rk_cipher_tfm_init,
++		.exit			= rk_cipher_tfm_exit,
+ 		.min_keysize		= AES_MIN_KEY_SIZE,
+ 		.max_keysize		= AES_MAX_KEY_SIZE,
+ 		.ivsize			= AES_BLOCK_SIZE,
+@@ -548,8 +548,8 @@ struct rk_crypto_tmp rk_ecb_des_alg = {
+ 		.base.cra_alignmask	= 0x07,
+ 		.base.cra_module	= THIS_MODULE,
+ 
+-		.init			= rk_ablk_init_tfm,
+-		.exit			= rk_ablk_exit_tfm,
++		.init			= rk_cipher_tfm_init,
++		.exit			= rk_cipher_tfm_exit,
+ 		.min_keysize		= DES_KEY_SIZE,
+ 		.max_keysize		= DES_KEY_SIZE,
+ 		.setkey			= rk_des_setkey,
+@@ -570,8 +570,8 @@ struct rk_crypto_tmp rk_cbc_des_alg = {
+ 		.base.cra_alignmask	= 0x07,
+ 		.base.cra_module	= THIS_MODULE,
+ 
+-		.init			= rk_ablk_init_tfm,
+-		.exit			= rk_ablk_exit_tfm,
++		.init			= rk_cipher_tfm_init,
++		.exit			= rk_cipher_tfm_exit,
+ 		.min_keysize		= DES_KEY_SIZE,
+ 		.max_keysize		= DES_KEY_SIZE,
+ 		.ivsize			= DES_BLOCK_SIZE,
+@@ -593,8 +593,8 @@ struct rk_crypto_tmp rk_ecb_des3_ede_alg
+ 		.base.cra_alignmask	= 0x07,
+ 		.base.cra_module	= THIS_MODULE,
+ 
+-		.init			= rk_ablk_init_tfm,
+-		.exit			= rk_ablk_exit_tfm,
++		.init			= rk_cipher_tfm_init,
++		.exit			= rk_cipher_tfm_exit,
+ 		.min_keysize		= DES3_EDE_KEY_SIZE,
+ 		.max_keysize		= DES3_EDE_KEY_SIZE,
+ 		.setkey			= rk_tdes_setkey,
+@@ -615,8 +615,8 @@ struct rk_crypto_tmp rk_cbc_des3_ede_alg
+ 		.base.cra_alignmask	= 0x07,
+ 		.base.cra_module	= THIS_MODULE,
+ 
+-		.init			= rk_ablk_init_tfm,
+-		.exit			= rk_ablk_exit_tfm,
++		.init			= rk_cipher_tfm_init,
++		.exit			= rk_cipher_tfm_exit,
+ 		.min_keysize		= DES3_EDE_KEY_SIZE,
+ 		.max_keysize		= DES3_EDE_KEY_SIZE,
+ 		.ivsize			= DES_BLOCK_SIZE,
diff --git a/target/linux/rockchip/patches-6.0/187-crypto-rockchip-rework-rk_handle_req-function.patch b/target/linux/rockchip/patches-6.0/187-crypto-rockchip-rework-rk_handle_req-function.patch
new file mode 100644
index 000000000..136423a66
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/187-crypto-rockchip-rework-rk_handle_req-function.patch
@@ -0,0 +1,180 @@
+From d294827ca9bf9c9a893ea0b70f5cec93a3248706 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:54:59 +0000
+Subject: [PATCH 37/49] crypto: rockchip: rework rk_handle_req function
+
+This patch rework the rk_handle_req(), simply removing the
+rk_crypto_info parameter.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  | 68 +++++--------------
+ 1 file changed, 17 insertions(+), 51 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -82,10 +82,12 @@ static int rk_cipher_fallback(struct skc
+ 	return err;
+ }
+ 
+-static int rk_handle_req(struct rk_crypto_info *dev,
+-			 struct skcipher_request *req)
++static int rk_cipher_handle_req(struct skcipher_request *req)
+ {
+-	struct crypto_engine *engine = dev->engine;
++	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
++	struct rk_cipher_ctx *tctx = crypto_skcipher_ctx(tfm);
++	struct rk_crypto_info *rkc = tctx->dev;
++	struct crypto_engine *engine = rkc->engine;
+ 
+ 	if (rk_cipher_need_fallback(req))
+ 		return rk_cipher_fallback(req);
+@@ -142,135 +144,99 @@ static int rk_tdes_setkey(struct crypto_
+ 
+ static int rk_aes_ecb_encrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_AES_ECB_MODE;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_aes_ecb_decrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_AES_ECB_MODE | RK_CRYPTO_DEC;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_aes_cbc_encrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_AES_CBC_MODE;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_aes_cbc_decrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_AES_CBC_MODE | RK_CRYPTO_DEC;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_des_ecb_encrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = 0;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_des_ecb_decrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_DEC;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_des_cbc_encrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_des_cbc_decrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC | RK_CRYPTO_DEC;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_des3_ede_ecb_encrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_TDES_SELECT;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_des3_ede_ecb_decrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_DEC;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_des3_ede_cbc_encrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static int rk_des3_ede_cbc_decrypt(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *dev = ctx->dev;
+ 
+ 	rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC |
+ 		    RK_CRYPTO_DEC;
+-	return rk_handle_req(dev, req);
++	return rk_cipher_handle_req(req);
+ }
+ 
+ static void rk_cipher_hw_init(struct rk_crypto_info *dev, struct skcipher_request *req)
diff --git a/target/linux/rockchip/patches-6.0/188-crypto-rockchip-use-a-rk_crypto_info-variable-instea.patch b/target/linux/rockchip/patches-6.0/188-crypto-rockchip-use-a-rk_crypto_info-variable-instea.patch
new file mode 100644
index 000000000..b663638df
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/188-crypto-rockchip-use-a-rk_crypto_info-variable-instea.patch
@@ -0,0 +1,172 @@
+From b792b8f33d2c772cab201a068884feb0c10c1533 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:00 +0000
+Subject: [PATCH 38/49] crypto: rockchip: use a rk_crypto_info variable instead
+ of lot of indirection
+
+Instead of using lot of ctx->dev->xx indirections, use an intermediate
+variable for rk_crypto_info.
+This will help later, when 2 different rk_crypto_info would be used.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c | 23 +++++++-----
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  | 37 ++++++++++---------
+ 2 files changed, 32 insertions(+), 28 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -226,9 +226,10 @@ static int rk_hash_prepare(struct crypto
+ 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
+ 	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
+ 	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
++	struct rk_crypto_info *rkc = tctx->dev;
+ 	int ret;
+ 
+-	ret = dma_map_sg(tctx->dev->dev, areq->src, sg_nents(areq->src), DMA_TO_DEVICE);
++	ret = dma_map_sg(rkc->dev, areq->src, sg_nents(areq->src), DMA_TO_DEVICE);
+ 	if (ret <= 0)
+ 		return -EINVAL;
+ 
+@@ -243,8 +244,9 @@ static int rk_hash_unprepare(struct cryp
+ 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
+ 	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
+ 	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
++	struct rk_crypto_info *rkc = tctx->dev;
+ 
+-	dma_unmap_sg(tctx->dev->dev, areq->src, rctx->nrsg, DMA_TO_DEVICE);
++	dma_unmap_sg(rkc->dev, areq->src, rctx->nrsg, DMA_TO_DEVICE);
+ 	return 0;
+ }
+ 
+@@ -257,6 +259,7 @@ static int rk_hash_run(struct crypto_eng
+ 	struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg);
+ 	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
+ 	struct scatterlist *sg = areq->src;
++	struct rk_crypto_info *rkc = tctx->dev;
+ 	int err = 0;
+ 	int i;
+ 	u32 v;
+@@ -283,13 +286,13 @@ static int rk_hash_run(struct crypto_eng
+ 	rk_ahash_reg_init(areq);
+ 
+ 	while (sg) {
+-		reinit_completion(&tctx->dev->complete);
+-		tctx->dev->status = 0;
+-		crypto_ahash_dma_start(tctx->dev, sg);
+-		wait_for_completion_interruptible_timeout(&tctx->dev->complete,
++		reinit_completion(&rkc->complete);
++		rkc->status = 0;
++		crypto_ahash_dma_start(rkc, sg);
++		wait_for_completion_interruptible_timeout(&rkc->complete,
+ 							  msecs_to_jiffies(2000));
+-		if (!tctx->dev->status) {
+-			dev_err(tctx->dev->dev, "DMA timeout\n");
++		if (!rkc->status) {
++			dev_err(rkc->dev, "DMA timeout\n");
+ 			err = -EFAULT;
+ 			goto theend;
+ 		}
+@@ -306,10 +309,10 @@ static int rk_hash_run(struct crypto_eng
+ 	 * efficiency, and make it response quickly when dma
+ 	 * complete.
+ 	 */
+-	readl_poll_timeout(tctx->dev->reg + RK_CRYPTO_HASH_STS, v, v == 0, 10, 1000);
++	readl_poll_timeout(rkc->reg + RK_CRYPTO_HASH_STS, v, v == 0, 10, 1000);
+ 
+ 	for (i = 0; i < crypto_ahash_digestsize(tfm) / 4; i++) {
+-		v = readl(tctx->dev->reg + RK_CRYPTO_HASH_DOUT_0 + i * 4);
++		v = readl(rkc->reg + RK_CRYPTO_HASH_DOUT_0 + i * 4);
+ 		put_unaligned_le32(v, areq->result + i * 4);
+ 	}
+ 
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -303,6 +303,7 @@ static int rk_cipher_run(struct crypto_e
+ 	unsigned int todo;
+ 	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
+ 	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
++	struct rk_crypto_info *rkc = ctx->dev;
+ 
+ 	algt->stat_req++;
+ 
+@@ -330,49 +331,49 @@ static int rk_cipher_run(struct crypto_e
+ 			scatterwalk_map_and_copy(biv, sgs, offset, ivsize, 0);
+ 		}
+ 		if (sgs == sgd) {
+-			err = dma_map_sg(ctx->dev->dev, sgs, 1, DMA_BIDIRECTIONAL);
++			err = dma_map_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
+ 			if (err <= 0) {
+ 				err = -EINVAL;
+ 				goto theend_iv;
+ 			}
+ 		} else {
+-			err = dma_map_sg(ctx->dev->dev, sgs, 1, DMA_TO_DEVICE);
++			err = dma_map_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
+ 			if (err <= 0) {
+ 				err = -EINVAL;
+ 				goto theend_iv;
+ 			}
+-			err = dma_map_sg(ctx->dev->dev, sgd, 1, DMA_FROM_DEVICE);
++			err = dma_map_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
+ 			if (err <= 0) {
+ 				err = -EINVAL;
+ 				goto theend_sgs;
+ 			}
+ 		}
+ 		err = 0;
+-		rk_cipher_hw_init(ctx->dev, areq);
++		rk_cipher_hw_init(rkc, areq);
+ 		if (ivsize) {
+ 			if (ivsize == DES_BLOCK_SIZE)
+-				memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_IV_0, ivtouse, ivsize);
++				memcpy_toio(rkc->reg + RK_CRYPTO_TDES_IV_0, ivtouse, ivsize);
+ 			else
+-				memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_IV_0, ivtouse, ivsize);
++				memcpy_toio(rkc->reg + RK_CRYPTO_AES_IV_0, ivtouse, ivsize);
+ 		}
+-		reinit_completion(&ctx->dev->complete);
+-		ctx->dev->status = 0;
++		reinit_completion(&rkc->complete);
++		rkc->status = 0;
+ 
+ 		todo = min(sg_dma_len(sgs), len);
+ 		len -= todo;
+-		crypto_dma_start(ctx->dev, sgs, sgd, todo / 4);
+-		wait_for_completion_interruptible_timeout(&ctx->dev->complete,
++		crypto_dma_start(rkc, sgs, sgd, todo / 4);
++		wait_for_completion_interruptible_timeout(&rkc->complete,
+ 							  msecs_to_jiffies(2000));
+-		if (!ctx->dev->status) {
+-			dev_err(ctx->dev->dev, "DMA timeout\n");
++		if (!rkc->status) {
++			dev_err(rkc->dev, "DMA timeout\n");
+ 			err = -EFAULT;
+ 			goto theend;
+ 		}
+ 		if (sgs == sgd) {
+-			dma_unmap_sg(ctx->dev->dev, sgs, 1, DMA_BIDIRECTIONAL);
++			dma_unmap_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
+ 		} else {
+-			dma_unmap_sg(ctx->dev->dev, sgs, 1, DMA_TO_DEVICE);
+-			dma_unmap_sg(ctx->dev->dev, sgd, 1, DMA_FROM_DEVICE);
++			dma_unmap_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
++			dma_unmap_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
+ 		}
+ 		if (rctx->mode & RK_CRYPTO_DEC) {
+ 			memcpy(iv, biv, ivsize);
+@@ -405,10 +406,10 @@ theend:
+ 
+ theend_sgs:
+ 	if (sgs == sgd) {
+-		dma_unmap_sg(ctx->dev->dev, sgs, 1, DMA_BIDIRECTIONAL);
++		dma_unmap_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
+ 	} else {
+-		dma_unmap_sg(ctx->dev->dev, sgs, 1, DMA_TO_DEVICE);
+-		dma_unmap_sg(ctx->dev->dev, sgd, 1, DMA_FROM_DEVICE);
++		dma_unmap_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
++		dma_unmap_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
+ 	}
+ theend_iv:
+ 	return err;
diff --git a/target/linux/rockchip/patches-6.0/189-crypto-rockchip-use-the-rk_crypto_info-given-as-para.patch b/target/linux/rockchip/patches-6.0/189-crypto-rockchip-use-the-rk_crypto_info-given-as-para.patch
new file mode 100644
index 000000000..d5d582fd2
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/189-crypto-rockchip-use-the-rk_crypto_info-given-as-para.patch
@@ -0,0 +1,34 @@
+From 9cbaeb79b6353f2b13c592754739d33f027e6662 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:01 +0000
+Subject: [PATCH 39/49] crypto: rockchip: use the rk_crypto_info given as
+ parameter
+
+Instead of using the crypto_info from TFM ctx, use the one given as parameter.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto_skcipher.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -254,7 +254,7 @@ static void rk_cipher_hw_init(struct rk_
+ 			     RK_CRYPTO_TDES_BYTESWAP_KEY |
+ 			     RK_CRYPTO_TDES_BYTESWAP_IV;
+ 		CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, rctx->mode);
+-		memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, ctx->key, ctx->keylen);
++		memcpy_toio(dev->reg + RK_CRYPTO_TDES_KEY1_0, ctx->key, ctx->keylen);
+ 		conf_reg = RK_CRYPTO_DESSEL;
+ 	} else {
+ 		rctx->mode |= RK_CRYPTO_AES_FIFO_MODE |
+@@ -266,7 +266,7 @@ static void rk_cipher_hw_init(struct rk_
+ 		else if (ctx->keylen == AES_KEYSIZE_256)
+ 			rctx->mode |= RK_CRYPTO_AES_256BIT_key;
+ 		CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, rctx->mode);
+-		memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_KEY_0, ctx->key, ctx->keylen);
++		memcpy_toio(dev->reg + RK_CRYPTO_AES_KEY_0, ctx->key, ctx->keylen);
+ 	}
+ 	conf_reg |= RK_CRYPTO_BYTESWAP_BTFIFO |
+ 		    RK_CRYPTO_BYTESWAP_BRFIFO;
diff --git a/target/linux/rockchip/patches-6.0/190-dt-bindings-crypto-convert-rockchip-crypto-to-YAML.patch b/target/linux/rockchip/patches-6.0/190-dt-bindings-crypto-convert-rockchip-crypto-to-YAML.patch
new file mode 100644
index 000000000..6d41f1a01
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/190-dt-bindings-crypto-convert-rockchip-crypto-to-YAML.patch
@@ -0,0 +1,115 @@
+From b4f63ecb0942ead52697ef3790c79546804fe478 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:02 +0000
+Subject: [PATCH 40/49] dt-bindings: crypto: convert rockchip-crypto to YAML
+
+Convert rockchip-crypto to YAML.
+
+Reviewed-by: John Keeping <john@metanate.com>
+Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ .../crypto/rockchip,rk3288-crypto.yaml        | 64 +++++++++++++++++++
+ .../bindings/crypto/rockchip-crypto.txt       | 28 --------
+ 2 files changed, 64 insertions(+), 28 deletions(-)
+ create mode 100644 Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml
+ delete mode 100644 Documentation/devicetree/bindings/crypto/rockchip-crypto.txt
+
+--- /dev/null
++++ b/Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml
+@@ -0,0 +1,64 @@
++# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
++%YAML 1.2
++---
++$id: http://devicetree.org/schemas/crypto/rockchip,rk3288-crypto.yaml#
++$schema: http://devicetree.org/meta-schemas/core.yaml#
++
++title: Rockchip Electronics Security Accelerator
++
++maintainers:
++  - Heiko Stuebner <heiko@sntech.de>
++
++properties:
++  compatible:
++    enum:
++      - rockchip,rk3288-crypto
++
++  reg:
++    maxItems: 1
++
++  interrupts:
++    maxItems: 1
++
++  clocks:
++    maxItems: 4
++
++  clock-names:
++    items:
++      - const: aclk
++      - const: hclk
++      - const: sclk
++      - const: apb_pclk
++
++  resets:
++    maxItems: 1
++
++  reset-names:
++    items:
++      - const: crypto-rst
++
++required:
++  - compatible
++  - reg
++  - interrupts
++  - clocks
++  - clock-names
++  - resets
++  - reset-names
++
++additionalProperties: false
++
++examples:
++  - |
++    #include <dt-bindings/interrupt-controller/arm-gic.h>
++    #include <dt-bindings/clock/rk3288-cru.h>
++    crypto@ff8a0000 {
++      compatible = "rockchip,rk3288-crypto";
++      reg = <0xff8a0000 0x4000>;
++      interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
++      clocks = <&cru ACLK_CRYPTO>, <&cru HCLK_CRYPTO>,
++               <&cru SCLK_CRYPTO>, <&cru ACLK_DMAC1>;
++      clock-names = "aclk", "hclk", "sclk", "apb_pclk";
++      resets = <&cru SRST_CRYPTO>;
++      reset-names = "crypto-rst";
++    };
+--- a/Documentation/devicetree/bindings/crypto/rockchip-crypto.txt
++++ /dev/null
+@@ -1,28 +0,0 @@
+-Rockchip Electronics And Security Accelerator
+-
+-Required properties:
+-- compatible: Should be "rockchip,rk3288-crypto"
+-- reg: Base physical address of the engine and length of memory mapped
+-       region
+-- interrupts: Interrupt number
+-- clocks: Reference to the clocks about crypto
+-- clock-names: "aclk" used to clock data
+-	       "hclk" used to clock data
+-	       "sclk" used to clock crypto accelerator
+-	       "apb_pclk" used to clock dma
+-- resets: Must contain an entry for each entry in reset-names.
+-	  See ../reset/reset.txt for details.
+-- reset-names: Must include the name "crypto-rst".
+-
+-Examples:
+-
+-	crypto: cypto-controller@ff8a0000 {
+-		compatible = "rockchip,rk3288-crypto";
+-		reg = <0xff8a0000 0x4000>;
+-		interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
+-		clocks = <&cru ACLK_CRYPTO>, <&cru HCLK_CRYPTO>,
+-			 <&cru SCLK_CRYPTO>, <&cru ACLK_DMAC1>;
+-		clock-names = "aclk", "hclk", "sclk", "apb_pclk";
+-		resets = <&cru SRST_CRYPTO>;
+-		reset-names = "crypto-rst";
+-	};
diff --git a/target/linux/rockchip/patches-6.0/191-dt-bindings-crypto-rockchip-add-new-compatible.patch b/target/linux/rockchip/patches-6.0/191-dt-bindings-crypto-rockchip-add-new-compatible.patch
new file mode 100644
index 000000000..dfe6203a0
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/191-dt-bindings-crypto-rockchip-add-new-compatible.patch
@@ -0,0 +1,114 @@
+From a20c32bcc5b5067368adc5ae47c467e32ffc0994 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:03 +0000
+Subject: [PATCH 41/49] dt-bindings: crypto: rockchip: add new compatible
+
+Since driver support new compatible, we need to update the driver bindings.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ .../crypto/rockchip,rk3288-crypto.yaml        | 79 +++++++++++++++++--
+ 1 file changed, 71 insertions(+), 8 deletions(-)
+
+--- a/Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml
++++ b/Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml
+@@ -13,6 +13,8 @@ properties:
+   compatible:
+     enum:
+       - rockchip,rk3288-crypto
++      - rockchip,rk3328-crypto
++      - rockchip,rk3399-crypto
+ 
+   reg:
+     maxItems: 1
+@@ -21,21 +23,82 @@ properties:
+     maxItems: 1
+ 
+   clocks:
++    minItems: 3
+     maxItems: 4
+ 
+   clock-names:
+-    items:
+-      - const: aclk
+-      - const: hclk
+-      - const: sclk
+-      - const: apb_pclk
++    minItems: 3
++    maxItems: 4
+ 
+   resets:
+-    maxItems: 1
++    minItems: 1
++    maxItems: 3
+ 
+   reset-names:
+-    items:
+-      - const: crypto-rst
++    minItems: 1
++    maxItems: 3
++
++allOf:
++  - if:
++      properties:
++        compatible:
++          contains:
++            const: rockchip,rk3288-crypto
++    then:
++      properties:
++        clocks:
++          minItems: 4
++        clock-names:
++          items:
++            - const: aclk
++            - const: hclk
++            - const: sclk
++            - const: apb_pclk
++        resets:
++          maxItems: 1
++        reset-names:
++          items:
++            - const: crypto-rst
++  - if:
++      properties:
++        compatible:
++          contains:
++            const: rockchip,rk3328-crypto
++    then:
++      properties:
++        clocks:
++          maxItems: 3
++        clock-names:
++          items:
++            - const: hclk_master
++            - const: hclk_slave
++            - const: sclk
++        resets:
++          maxItems: 1
++        reset-names:
++          items:
++            - const: crypto-rst
++  - if:
++      properties:
++        compatible:
++          contains:
++            const: rockchip,rk3399-crypto
++    then:
++      properties:
++        clocks:
++          maxItems: 3
++        clock-names:
++          items:
++            - const: hclk_master
++            - const: hclk_slave
++            - const: sclk
++        resets:
++          minItems: 3
++        reset-names:
++          items:
++            - const: master
++            - const: slave
++            - const: crypto-rst
+ 
+ required:
+   - compatible
diff --git a/target/linux/rockchip/patches-6.0/192-clk-rk3399-use-proper-crypto0-name.patch b/target/linux/rockchip/patches-6.0/192-clk-rk3399-use-proper-crypto0-name.patch
new file mode 100644
index 000000000..6c2d5eb4c
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/192-clk-rk3399-use-proper-crypto0-name.patch
@@ -0,0 +1,37 @@
+From b55b62250202a6d95872e367963190aaad6f9f08 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:04 +0000
+Subject: [PATCH 42/49] clk: rk3399: use proper crypto0 name
+
+RK3399 has 2 crypto instance, named crypto0 and crypto1 in the TRM.
+Only reset for crypto1 is correctly named, but crypto0 is not.
+Since nobody use them , add a 0 to be consistent with the TRM and crypto1 entries.
+
+Acked-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ include/dt-bindings/clock/rk3399-cru.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/include/dt-bindings/clock/rk3399-cru.h
++++ b/include/dt-bindings/clock/rk3399-cru.h
+@@ -547,8 +547,8 @@
+ #define SRST_H_PERILP0			171
+ #define SRST_H_PERILP0_NOC		172
+ #define SRST_ROM			173
+-#define SRST_CRYPTO_S			174
+-#define SRST_CRYPTO_M			175
++#define SRST_CRYPTO0_S			174
++#define SRST_CRYPTO0_M			175
+ 
+ /* cru_softrst_con11 */
+ #define SRST_P_DCF			176
+@@ -556,7 +556,7 @@
+ #define SRST_CM0S			178
+ #define SRST_CM0S_DBG			179
+ #define SRST_CM0S_PO			180
+-#define SRST_CRYPTO			181
++#define SRST_CRYPTO0			181
+ #define SRST_P_PERILP1_SGRF		182
+ #define SRST_P_PERILP1_GRF		183
+ #define SRST_CRYPTO1_S			184
diff --git a/target/linux/rockchip/patches-6.0/193-arm64-dts-rockchip-add-rk3328-crypto-node.patch b/target/linux/rockchip/patches-6.0/193-arm64-dts-rockchip-add-rk3328-crypto-node.patch
new file mode 100644
index 000000000..ef812d7cd
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/193-arm64-dts-rockchip-add-rk3328-crypto-node.patch
@@ -0,0 +1,33 @@
+From e39620e4a26f650c72ad5624f27dfe964ccf3e03 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:05 +0000
+Subject: [PATCH 43/49] arm64: dts: rockchip: add rk3328 crypto node
+
+rk3328 has a crypto IP handled by the rk3288 crypto driver so adds a
+node for it.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+@@ -1025,6 +1025,17 @@
+ 		      (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
+ 	};
+ 
++	crypto: crypto@ff060000 {
++		compatible = "rockchip,rk3328-crypto";
++		reg = <0x0 0xff060000 0x0 0x4000>;
++		interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
++		clocks = <&cru HCLK_CRYPTO_MST>, <&cru HCLK_CRYPTO_SLV>,
++			 <&cru SCLK_CRYPTO>;
++		clock-names = "hclk_master", "hclk_slave", "sclk";
++		resets = <&cru SRST_CRYPTO>;
++		reset-names = "crypto-rst";
++	};
++
+ 	pinctrl: pinctrl {
+ 		compatible = "rockchip,rk3328-pinctrl";
+ 		rockchip,grf = <&grf>;
diff --git a/target/linux/rockchip/patches-6.0/194-arm64-dts-rockchip-rk3399-add-crypto-node.patch b/target/linux/rockchip/patches-6.0/194-arm64-dts-rockchip-rk3399-add-crypto-node.patch
new file mode 100644
index 000000000..31f7ea653
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/194-arm64-dts-rockchip-rk3399-add-crypto-node.patch
@@ -0,0 +1,43 @@
+From e0d5c068d092b0c1a60f706cb18ac71ff4ec5268 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:06 +0000
+Subject: [PATCH 44/49] arm64: dts: rockchip: rk3399: add crypto node
+
+The rk3399 has a crypto IP handled by the rk3288 crypto driver so adds a
+node for it.
+
+Tested-by Diederik de Haas <didi.debian@cknow.org>
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ arch/arm64/boot/dts/rockchip/rk3399.dtsi | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+@@ -582,6 +582,26 @@
+ 		status = "disabled";
+ 	};
+ 
++	crypto0: crypto@ff8b0000 {
++		compatible = "rockchip,rk3399-crypto";
++		reg = <0x0 0xff8b0000 0x0 0x4000>;
++		interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH 0>;
++		clocks = <&cru HCLK_M_CRYPTO0>, <&cru HCLK_S_CRYPTO0>, <&cru SCLK_CRYPTO0>;
++		clock-names = "hclk_master", "hclk_slave", "sclk";
++		resets = <&cru SRST_CRYPTO0>, <&cru SRST_CRYPTO0_S>, <&cru SRST_CRYPTO0_M>;
++		reset-names = "master", "lave", "crypto";
++	};
++
++	crypto1: crypto@ff8b8000 {
++		compatible = "rockchip,rk3399-crypto";
++		reg = <0x0 0xff8b8000 0x0 0x4000>;
++		interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH 0>;
++		clocks = <&cru HCLK_M_CRYPTO1>, <&cru HCLK_S_CRYPTO1>, <&cru SCLK_CRYPTO1>;
++		clock-names = "hclk_master", "hclk_slave", "sclk";
++		resets = <&cru SRST_CRYPTO1>, <&cru SRST_CRYPTO1_S>, <&cru SRST_CRYPTO1_M>;
++		reset-names = "master", "slave", "crypto";
++	};
++
+ 	i2c1: i2c@ff110000 {
+ 		compatible = "rockchip,rk3399-i2c";
+ 		reg = <0x0 0xff110000 0x0 0x1000>;
diff --git a/target/linux/rockchip/patches-6.0/195-crypto-rockchip-store-crypto_info-in-request-context.patch b/target/linux/rockchip/patches-6.0/195-crypto-rockchip-store-crypto_info-in-request-context.patch
new file mode 100644
index 000000000..d8c4d173e
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/195-crypto-rockchip-store-crypto_info-in-request-context.patch
@@ -0,0 +1,124 @@
+From 61900b43baea9ed606aacb824b761feca7511eaa Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:07 +0000
+Subject: [PATCH 45/49] crypto: rockchip: store crypto_info in request context
+
+The crypto_info to use must be stored in the request context.
+This will help when 2 crypto_info will be available on rk3399.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.h          |  2 ++
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c    | 14 ++++++--------
+ drivers/crypto/rockchip/rk3288_crypto_skcipher.c |  6 ++++--
+ 3 files changed, 12 insertions(+), 10 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -215,6 +215,7 @@ struct rk_ahash_ctx {
+ 
+ /* the private variable of hash for fallback */
+ struct rk_ahash_rctx {
++	struct rk_crypto_info		*dev;
+ 	struct ahash_request		fallback_req;
+ 	u32				mode;
+ 	int nrsg;
+@@ -231,6 +232,7 @@ struct rk_cipher_ctx {
+ };
+ 
+ struct rk_cipher_rctx {
++	struct rk_crypto_info		*dev;
+ 	u8 backup_iv[AES_BLOCK_SIZE];
+ 	u32				mode;
+ 	struct skcipher_request fallback_req;   // keep at the end
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -200,6 +200,7 @@ static int rk_ahash_export(struct ahash_
+ 
+ static int rk_ahash_digest(struct ahash_request *req)
+ {
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
+ 	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
+ 	struct rk_crypto_info *dev = tctx->dev;
+ 
+@@ -209,6 +210,8 @@ static int rk_ahash_digest(struct ahash_
+ 	if (!req->nbytes)
+ 		return zero_message_process(req);
+ 
++	rctx->dev = dev;
++
+ 	return crypto_transfer_hash_request_to_engine(dev->engine, req);
+ }
+ 
+@@ -223,10 +226,8 @@ static void crypto_ahash_dma_start(struc
+ static int rk_hash_prepare(struct crypto_engine *engine, void *breq)
+ {
+ 	struct ahash_request *areq = container_of(breq, struct ahash_request, base);
+-	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
+ 	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
+-	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
+-	struct rk_crypto_info *rkc = tctx->dev;
++	struct rk_crypto_info *rkc = rctx->dev;
+ 	int ret;
+ 
+ 	ret = dma_map_sg(rkc->dev, areq->src, sg_nents(areq->src), DMA_TO_DEVICE);
+@@ -241,10 +242,8 @@ static int rk_hash_prepare(struct crypto
+ static int rk_hash_unprepare(struct crypto_engine *engine, void *breq)
+ {
+ 	struct ahash_request *areq = container_of(breq, struct ahash_request, base);
+-	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
+ 	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
+-	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
+-	struct rk_crypto_info *rkc = tctx->dev;
++	struct rk_crypto_info *rkc = rctx->dev;
+ 
+ 	dma_unmap_sg(rkc->dev, areq->src, rctx->nrsg, DMA_TO_DEVICE);
+ 	return 0;
+@@ -255,11 +254,10 @@ static int rk_hash_run(struct crypto_eng
+ 	struct ahash_request *areq = container_of(breq, struct ahash_request, base);
+ 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
+ 	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
+-	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
+ 	struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg);
+ 	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
+ 	struct scatterlist *sg = areq->src;
+-	struct rk_crypto_info *rkc = tctx->dev;
++	struct rk_crypto_info *rkc = rctx->dev;
+ 	int err = 0;
+ 	int i;
+ 	u32 v;
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -86,12 +86,15 @@ static int rk_cipher_handle_req(struct s
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+ 	struct rk_cipher_ctx *tctx = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+ 	struct rk_crypto_info *rkc = tctx->dev;
+ 	struct crypto_engine *engine = rkc->engine;
+ 
+ 	if (rk_cipher_need_fallback(req))
+ 		return rk_cipher_fallback(req);
+ 
++	rctx->dev = rkc;
++
+ 	return crypto_transfer_skcipher_request_to_engine(engine, req);
+ }
+ 
+@@ -290,7 +293,6 @@ static int rk_cipher_run(struct crypto_e
+ {
+ 	struct skcipher_request *areq = container_of(async_req, struct skcipher_request, base);
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
+-	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(areq);
+ 	struct scatterlist *sgs, *sgd;
+ 	int err = 0;
+@@ -303,7 +305,7 @@ static int rk_cipher_run(struct crypto_e
+ 	unsigned int todo;
+ 	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
+ 	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+-	struct rk_crypto_info *rkc = ctx->dev;
++	struct rk_crypto_info *rkc = rctx->dev;
+ 
+ 	algt->stat_req++;
+ 
diff --git a/target/linux/rockchip/patches-6.0/196-crypto-rockchip-Check-for-clocks-numbers-and-their-f.patch b/target/linux/rockchip/patches-6.0/196-crypto-rockchip-Check-for-clocks-numbers-and-their-f.patch
new file mode 100644
index 000000000..5cebb131e
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/196-crypto-rockchip-Check-for-clocks-numbers-and-their-f.patch
@@ -0,0 +1,165 @@
+From 5301685e031d21df2b2a2d5959805f3292f3d481 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:08 +0000
+Subject: [PATCH 46/49] crypto: rockchip: Check for clocks numbers and their
+ frequencies
+
+Add the number of clocks needed for each compatible.
+Rockchip's datasheet give maximum frequencies for some clocks, so add
+checks for verifying they are within limits. Let's start with rk3288 for
+clock frequency check, other will came later.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c | 75 +++++++++++++++++++++----
+ drivers/crypto/rockchip/rk3288_crypto.h | 16 +++++-
+ 2 files changed, 79 insertions(+), 12 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -14,10 +14,58 @@
+ #include <linux/module.h>
+ #include <linux/platform_device.h>
+ #include <linux/of.h>
++#include <linux/of_device.h>
+ #include <linux/clk.h>
+ #include <linux/crypto.h>
+ #include <linux/reset.h>
+ 
++static const struct rk_variant rk3288_variant = {
++	.num_clks = 4,
++	.rkclks = {
++		{ "sclk", 150000000},
++	}
++};
++
++static const struct rk_variant rk3328_variant = {
++	.num_clks = 3,
++};
++
++static int rk_crypto_get_clks(struct rk_crypto_info *dev)
++{
++	int i, j, err;
++	unsigned long cr;
++
++	dev->num_clks = devm_clk_bulk_get_all(dev->dev, &dev->clks);
++	if (dev->num_clks < dev->variant->num_clks) {
++		dev_err(dev->dev, "Missing clocks, got %d instead of %d\n",
++			dev->num_clks, dev->variant->num_clks);
++		return -EINVAL;
++	}
++
++	for (i = 0; i < dev->num_clks; i++) {
++		cr = clk_get_rate(dev->clks[i].clk);
++		for (j = 0; j < ARRAY_SIZE(dev->variant->rkclks); j++) {
++			if (dev->variant->rkclks[j].max == 0)
++				continue;
++			if (strcmp(dev->variant->rkclks[j].name, dev->clks[i].id))
++				continue;
++			if (cr > dev->variant->rkclks[j].max) {
++				err = clk_set_rate(dev->clks[i].clk,
++						   dev->variant->rkclks[j].max);
++				if (err)
++					dev_err(dev->dev, "Fail downclocking %s from %lu to %lu\n",
++						dev->variant->rkclks[j].name, cr,
++						dev->variant->rkclks[j].max);
++				else
++					dev_info(dev->dev, "Downclocking %s from %lu to %lu\n",
++						 dev->variant->rkclks[j].name, cr,
++						 dev->variant->rkclks[j].max);
++			}
++		}
++	}
++	return 0;
++}
++
+ static int rk_crypto_enable_clk(struct rk_crypto_info *dev)
+ {
+ 	int err;
+@@ -201,8 +249,12 @@ static void rk_crypto_unregister(void)
+ }
+ 
+ static const struct of_device_id crypto_of_id_table[] = {
+-	{ .compatible = "rockchip,rk3288-crypto" },
+-	{ .compatible = "rockchip,rk3328-crypto" },
++	{ .compatible = "rockchip,rk3288-crypto",
++	  .data = &rk3288_variant,
++	},
++	{ .compatible = "rockchip,rk3328-crypto",
++	  .data = &rk3328_variant,
++	},
+ 	{}
+ };
+ MODULE_DEVICE_TABLE(of, crypto_of_id_table);
+@@ -220,6 +272,15 @@ static int rk_crypto_probe(struct platfo
+ 		goto err_crypto;
+ 	}
+ 
++	crypto_info->dev = &pdev->dev;
++	platform_set_drvdata(pdev, crypto_info);
++
++	crypto_info->variant = of_device_get_match_data(&pdev->dev);
++	if (!crypto_info->variant) {
++		dev_err(&pdev->dev, "Missing variant\n");
++		return -EINVAL;
++	}
++
+ 	crypto_info->rst = devm_reset_control_get(dev, "crypto-rst");
+ 	if (IS_ERR(crypto_info->rst)) {
+ 		err = PTR_ERR(crypto_info->rst);
+@@ -236,12 +297,9 @@ static int rk_crypto_probe(struct platfo
+ 		goto err_crypto;
+ 	}
+ 
+-	crypto_info->num_clks = devm_clk_bulk_get_all(&pdev->dev,
+-						      &crypto_info->clks);
+-	if (crypto_info->num_clks < 3) {
+-		err = -EINVAL;
++	err = rk_crypto_get_clks(crypto_info);
++	if (err)
+ 		goto err_crypto;
+-	}
+ 
+ 	crypto_info->irq = platform_get_irq(pdev, 0);
+ 	if (crypto_info->irq < 0) {
+@@ -259,9 +317,6 @@ static int rk_crypto_probe(struct platfo
+ 		goto err_crypto;
+ 	}
+ 
+-	crypto_info->dev = &pdev->dev;
+-	platform_set_drvdata(pdev, crypto_info);
+-
+ 	crypto_info->engine = crypto_engine_alloc_init(&pdev->dev, true);
+ 	crypto_engine_start(crypto_info->engine);
+ 	init_completion(&crypto_info->complete);
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -188,14 +188,26 @@
+ #define CRYPTO_WRITE(dev, offset, val)	  \
+ 		writel_relaxed((val), ((dev)->reg + (offset)))
+ 
++#define RK_MAX_CLKS 4
++
++struct rk_clks {
++	const char *name;
++	unsigned long max;
++};
++
++struct rk_variant {
++	int num_clks;
++	struct rk_clks rkclks[RK_MAX_CLKS];
++};
++
+ struct rk_crypto_info {
+ 	struct device			*dev;
+ 	struct clk_bulk_data		*clks;
+-	int num_clks;
++	int				num_clks;
+ 	struct reset_control		*rst;
+ 	void __iomem			*reg;
+ 	int				irq;
+-
++	const struct rk_variant *variant;
+ 	struct crypto_engine *engine;
+ 	struct completion complete;
+ 	int status;
diff --git a/target/linux/rockchip/patches-6.0/197-crypto-rockchip-rk_ahash_reg_init-use-crypto_info-fr.patch b/target/linux/rockchip/patches-6.0/197-crypto-rockchip-rk_ahash_reg_init-use-crypto_info-fr.patch
new file mode 100644
index 000000000..bb6b4f256
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/197-crypto-rockchip-rk_ahash_reg_init-use-crypto_info-fr.patch
@@ -0,0 +1,40 @@
+From 566cce03ee27f1288a4a029f5c7d437cc2e11eac Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:09 +0000
+Subject: [PATCH 47/49] crypto: rockchip: rk_ahash_reg_init use crypto_info
+ from parameter
+
+rk_ahash_reg_init() use crypto_info from TFM context, since we will
+remove it, let's take if from parameters.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -78,12 +78,10 @@ static int zero_message_process(struct a
+ 	return 0;
+ }
+ 
+-static void rk_ahash_reg_init(struct ahash_request *req)
++static void rk_ahash_reg_init(struct ahash_request *req,
++			      struct rk_crypto_info *dev)
+ {
+ 	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
+-	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
+-	struct rk_ahash_ctx *tctx = crypto_ahash_ctx(tfm);
+-	struct rk_crypto_info *dev = tctx->dev;
+ 	int reg_status;
+ 
+ 	reg_status = CRYPTO_READ(dev, RK_CRYPTO_CTRL) |
+@@ -281,7 +279,7 @@ static int rk_hash_run(struct crypto_eng
+ 		goto theend;
+ 	}
+ 
+-	rk_ahash_reg_init(areq);
++	rk_ahash_reg_init(areq, rkc);
+ 
+ 	while (sg) {
+ 		reinit_completion(&rkc->complete);
diff --git a/target/linux/rockchip/patches-6.0/198-crypto-rockchip-permit-to-have-more-than-one-reset.patch b/target/linux/rockchip/patches-6.0/198-crypto-rockchip-permit-to-have-more-than-one-reset.patch
new file mode 100644
index 000000000..a56241149
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/198-crypto-rockchip-permit-to-have-more-than-one-reset.patch
@@ -0,0 +1,24 @@
+From 5a73176384bd62a9ac4300805d243592e93fe5d4 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:10 +0000
+Subject: [PATCH 48/49] crypto: rockchip: permit to have more than one reset
+
+The RK3399 has 3 resets, so the driver to handle multiple resets.
+This is done by using devm_reset_control_array_get_exclusive().
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -281,7 +281,7 @@ static int rk_crypto_probe(struct platfo
+ 		return -EINVAL;
+ 	}
+ 
+-	crypto_info->rst = devm_reset_control_get(dev, "crypto-rst");
++	crypto_info->rst = devm_reset_control_array_get_exclusive(dev);
+ 	if (IS_ERR(crypto_info->rst)) {
+ 		err = PTR_ERR(crypto_info->rst);
+ 		goto err_crypto;
diff --git a/target/linux/rockchip/patches-6.0/199-crypto-rockchip-Add-support-for-RK3399.patch b/target/linux/rockchip/patches-6.0/199-crypto-rockchip-Add-support-for-RK3399.patch
new file mode 100644
index 000000000..7c5902ff5
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/199-crypto-rockchip-Add-support-for-RK3399.patch
@@ -0,0 +1,464 @@
+From 5a0b753155b5d3cbba77ecd6a017e6f3733e344e Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 07:55:11 +0000
+Subject: [PATCH 49/49] crypto: rockchip: Add support for RK3399
+
+The RK3399 has 2 rk3288 compatible crypto device named crypto0 and
+crypto1. The only difference is lack of RSA in crypto1.
+
+We need to add driver support for 2 parallel instance as only one need
+to register crypto algorithms.
+Then the driver will round robin each request on each device.
+
+For avoiding complexity (device bringup after a TFM is created), PM is
+modified to be handled per request.
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/rk3288_crypto.c       | 92 +++++++++++++++----
+ drivers/crypto/rockchip/rk3288_crypto.h       | 25 +++--
+ drivers/crypto/rockchip/rk3288_crypto_ahash.c | 37 ++++----
+ .../crypto/rockchip/rk3288_crypto_skcipher.c  | 37 ++++----
+ 4 files changed, 123 insertions(+), 68 deletions(-)
+
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -19,6 +19,23 @@
+ #include <linux/crypto.h>
+ #include <linux/reset.h>
+ 
++static struct rockchip_ip rocklist = {
++	.dev_list = LIST_HEAD_INIT(rocklist.dev_list),
++	.lock = __SPIN_LOCK_UNLOCKED(rocklist.lock),
++};
++
++struct rk_crypto_info *get_rk_crypto(void)
++{
++	struct rk_crypto_info *first;
++
++	spin_lock(&rocklist.lock);
++	first = list_first_entry_or_null(&rocklist.dev_list,
++					 struct rk_crypto_info, list);
++	list_rotate_left(&rocklist.dev_list);
++	spin_unlock(&rocklist.lock);
++	return first;
++}
++
+ static const struct rk_variant rk3288_variant = {
+ 	.num_clks = 4,
+ 	.rkclks = {
+@@ -30,6 +47,10 @@ static const struct rk_variant rk3328_va
+ 	.num_clks = 3,
+ };
+ 
++static const struct rk_variant rk3399_variant = {
++	.num_clks = 3,
++};
++
+ static int rk_crypto_get_clks(struct rk_crypto_info *dev)
+ {
+ 	int i, j, err;
+@@ -83,8 +104,8 @@ static void rk_crypto_disable_clk(struct
+ }
+ 
+ /*
+- * Power management strategy: The device is suspended unless a TFM exists for
+- * one of the algorithms proposed by this driver.
++ * Power management strategy: The device is suspended until a request
++ * is handled. For avoiding suspend/resume yoyo, the autosuspend is set to 2s.
+  */
+ static int rk_crypto_pm_suspend(struct device *dev)
+ {
+@@ -166,8 +187,17 @@ static struct rk_crypto_tmp *rk_cipher_a
+ #ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG
+ static int rk_crypto_debugfs_show(struct seq_file *seq, void *v)
+ {
++	struct rk_crypto_info *dd;
+ 	unsigned int i;
+ 
++	spin_lock(&rocklist.lock);
++	list_for_each_entry(dd, &rocklist.dev_list, list) {
++		seq_printf(seq, "%s %s requests: %lu\n",
++			   dev_driver_string(dd->dev), dev_name(dd->dev),
++			   dd->nreq);
++	}
++	spin_unlock(&rocklist.lock);
++
+ 	for (i = 0; i < ARRAY_SIZE(rk_cipher_algs); i++) {
+ 		if (!rk_cipher_algs[i]->dev)
+ 			continue;
+@@ -198,6 +228,18 @@ static int rk_crypto_debugfs_show(struct
+ DEFINE_SHOW_ATTRIBUTE(rk_crypto_debugfs);
+ #endif
+ 
++static void register_debugfs(struct rk_crypto_info *crypto_info)
++{
++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG
++	/* Ignore error of debugfs */
++	rocklist.dbgfs_dir = debugfs_create_dir("rk3288_crypto", NULL);
++	rocklist.dbgfs_stats = debugfs_create_file("stats", 0444,
++						   rocklist.dbgfs_dir,
++						   &rocklist,
++						   &rk_crypto_debugfs_fops);
++#endif
++}
++
+ static int rk_crypto_register(struct rk_crypto_info *crypto_info)
+ {
+ 	unsigned int i, k;
+@@ -255,6 +297,9 @@ static const struct of_device_id crypto_
+ 	{ .compatible = "rockchip,rk3328-crypto",
+ 	  .data = &rk3328_variant,
+ 	},
++	{ .compatible = "rockchip,rk3399-crypto",
++	  .data = &rk3399_variant,
++	},
+ 	{}
+ };
+ MODULE_DEVICE_TABLE(of, crypto_of_id_table);
+@@ -262,7 +307,7 @@ MODULE_DEVICE_TABLE(of, crypto_of_id_tab
+ static int rk_crypto_probe(struct platform_device *pdev)
+ {
+ 	struct device *dev = &pdev->dev;
+-	struct rk_crypto_info *crypto_info;
++	struct rk_crypto_info *crypto_info, *first;
+ 	int err = 0;
+ 
+ 	crypto_info = devm_kzalloc(&pdev->dev,
+@@ -325,22 +370,22 @@ static int rk_crypto_probe(struct platfo
+ 	if (err)
+ 		goto err_pm;
+ 
+-	err = rk_crypto_register(crypto_info);
+-	if (err) {
+-		dev_err(dev, "err in register alg");
+-		goto err_register_alg;
+-	}
++	spin_lock(&rocklist.lock);
++	first = list_first_entry_or_null(&rocklist.dev_list,
++					 struct rk_crypto_info, list);
++	list_add_tail(&crypto_info->list, &rocklist.dev_list);
++	spin_unlock(&rocklist.lock);
++
++	if (!first) {
++		err = rk_crypto_register(crypto_info);
++		if (err) {
++			dev_err(dev, "Fail to register crypto algorithms");
++			goto err_register_alg;
++		}
+ 
+-#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG
+-	/* Ignore error of debugfs */
+-	crypto_info->dbgfs_dir = debugfs_create_dir("rk3288_crypto", NULL);
+-	crypto_info->dbgfs_stats = debugfs_create_file("stats", 0444,
+-						       crypto_info->dbgfs_dir,
+-						       crypto_info,
+-						       &rk_crypto_debugfs_fops);
+-#endif
++		register_debugfs(crypto_info);
++	}
+ 
+-	dev_info(dev, "Crypto Accelerator successfully registered\n");
+ 	return 0;
+ 
+ err_register_alg:
+@@ -355,11 +400,20 @@ err_crypto:
+ static int rk_crypto_remove(struct platform_device *pdev)
+ {
+ 	struct rk_crypto_info *crypto_tmp = platform_get_drvdata(pdev);
++	struct rk_crypto_info *first;
++
++	spin_lock_bh(&rocklist.lock);
++	list_del(&crypto_tmp->list);
++	first = list_first_entry_or_null(&rocklist.dev_list,
++					 struct rk_crypto_info, list);
++	spin_unlock_bh(&rocklist.lock);
+ 
++	if (!first) {
+ #ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG
+-	debugfs_remove_recursive(crypto_tmp->dbgfs_dir);
++		debugfs_remove_recursive(rocklist.dbgfs_dir);
+ #endif
+-	rk_crypto_unregister();
++		rk_crypto_unregister();
++	}
+ 	rk_crypto_pm_exit(crypto_tmp);
+ 	crypto_engine_exit(crypto_tmp->engine);
+ 	return 0;
+--- a/drivers/crypto/rockchip/rk3288_crypto.h
++++ b/drivers/crypto/rockchip/rk3288_crypto.h
+@@ -190,6 +190,20 @@
+ 
+ #define RK_MAX_CLKS 4
+ 
++/*
++ * struct rockchip_ip - struct for managing a list of RK crypto instance
++ * @dev_list:		Used for doing a list of rk_crypto_info
++ * @lock:		Control access to dev_list
++ * @dbgfs_dir:		Debugfs dentry for statistic directory
++ * @dbgfs_stats:	Debugfs dentry for statistic counters
++ */
++struct rockchip_ip {
++	struct list_head	dev_list;
++	spinlock_t		lock; /* Control access to dev_list */
++	struct dentry		*dbgfs_dir;
++	struct dentry		*dbgfs_stats;
++};
++
+ struct rk_clks {
+ 	const char *name;
+ 	unsigned long max;
+@@ -201,6 +215,7 @@ struct rk_variant {
+ };
+ 
+ struct rk_crypto_info {
++	struct list_head		list;
+ 	struct device			*dev;
+ 	struct clk_bulk_data		*clks;
+ 	int				num_clks;
+@@ -208,19 +223,15 @@ struct rk_crypto_info {
+ 	void __iomem			*reg;
+ 	int				irq;
+ 	const struct rk_variant *variant;
++	unsigned long nreq;
+ 	struct crypto_engine *engine;
+ 	struct completion complete;
+ 	int status;
+-#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG
+-	struct dentry *dbgfs_dir;
+-	struct dentry *dbgfs_stats;
+-#endif
+ };
+ 
+ /* the private variable of hash */
+ struct rk_ahash_ctx {
+ 	struct crypto_engine_ctx enginectx;
+-	struct rk_crypto_info		*dev;
+ 	/* for fallback */
+ 	struct crypto_ahash		*fallback_tfm;
+ };
+@@ -236,7 +247,6 @@ struct rk_ahash_rctx {
+ /* the private variable of cipher */
+ struct rk_cipher_ctx {
+ 	struct crypto_engine_ctx enginectx;
+-	struct rk_crypto_info		*dev;
+ 	unsigned int			keylen;
+ 	u8				key[AES_MAX_KEY_SIZE];
+ 	u8				iv[AES_BLOCK_SIZE];
+@@ -252,7 +262,7 @@ struct rk_cipher_rctx {
+ 
+ struct rk_crypto_tmp {
+ 	u32 type;
+-	struct rk_crypto_info		*dev;
++	struct rk_crypto_info           *dev;
+ 	union {
+ 		struct skcipher_alg	skcipher;
+ 		struct ahash_alg	hash;
+@@ -276,4 +286,5 @@ extern struct rk_crypto_tmp rk_ahash_sha
+ extern struct rk_crypto_tmp rk_ahash_sha256;
+ extern struct rk_crypto_tmp rk_ahash_md5;
+ 
++struct rk_crypto_info *get_rk_crypto(void);
+ #endif
+--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+@@ -199,8 +199,8 @@ static int rk_ahash_export(struct ahash_
+ static int rk_ahash_digest(struct ahash_request *req)
+ {
+ 	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
+-	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
+-	struct rk_crypto_info *dev = tctx->dev;
++	struct rk_crypto_info *dev;
++	struct crypto_engine *engine;
+ 
+ 	if (rk_ahash_need_fallback(req))
+ 		return rk_ahash_digest_fb(req);
+@@ -208,9 +208,12 @@ static int rk_ahash_digest(struct ahash_
+ 	if (!req->nbytes)
+ 		return zero_message_process(req);
+ 
++	dev = get_rk_crypto();
++
+ 	rctx->dev = dev;
++	engine = dev->engine;
+ 
+-	return crypto_transfer_hash_request_to_engine(dev->engine, req);
++	return crypto_transfer_hash_request_to_engine(engine, req);
+ }
+ 
+ static void crypto_ahash_dma_start(struct rk_crypto_info *dev, struct scatterlist *sg)
+@@ -260,9 +263,14 @@ static int rk_hash_run(struct crypto_eng
+ 	int i;
+ 	u32 v;
+ 
++	err = pm_runtime_resume_and_get(rkc->dev);
++	if (err)
++		return err;
++
+ 	rctx->mode = 0;
+ 
+ 	algt->stat_req++;
++	rkc->nreq++;
+ 
+ 	switch (crypto_ahash_digestsize(tfm)) {
+ 	case SHA1_DIGEST_SIZE:
+@@ -313,6 +321,8 @@ static int rk_hash_run(struct crypto_eng
+ 	}
+ 
+ theend:
++	pm_runtime_put_autosuspend(rkc->dev);
++
+ 	local_bh_disable();
+ 	crypto_finalize_hash_request(engine, breq, err);
+ 	local_bh_enable();
+@@ -323,21 +333,15 @@ theend:
+ static int rk_cra_hash_init(struct crypto_tfm *tfm)
+ {
+ 	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm);
+-	struct rk_crypto_tmp *algt;
+-	struct ahash_alg *alg = __crypto_ahash_alg(tfm->__crt_alg);
+-
+ 	const char *alg_name = crypto_tfm_alg_name(tfm);
+-	int err;
+-
+-	algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
+-
+-	tctx->dev = algt->dev;
++	struct ahash_alg *alg = __crypto_ahash_alg(tfm->__crt_alg);
++	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.hash);
+ 
+ 	/* for fallback */
+ 	tctx->fallback_tfm = crypto_alloc_ahash(alg_name, 0,
+ 						CRYPTO_ALG_NEED_FALLBACK);
+ 	if (IS_ERR(tctx->fallback_tfm)) {
+-		dev_err(tctx->dev->dev, "Could not load fallback driver.\n");
++		dev_err(algt->dev->dev, "Could not load fallback driver.\n");
+ 		return PTR_ERR(tctx->fallback_tfm);
+ 	}
+ 
+@@ -349,15 +353,7 @@ static int rk_cra_hash_init(struct crypt
+ 	tctx->enginectx.op.prepare_request = rk_hash_prepare;
+ 	tctx->enginectx.op.unprepare_request = rk_hash_unprepare;
+ 
+-	err = pm_runtime_resume_and_get(tctx->dev->dev);
+-	if (err < 0)
+-		goto error_pm;
+-
+ 	return 0;
+-error_pm:
+-	crypto_free_ahash(tctx->fallback_tfm);
+-
+-	return err;
+ }
+ 
+ static void rk_cra_hash_exit(struct crypto_tfm *tfm)
+@@ -365,7 +361,6 @@ static void rk_cra_hash_exit(struct cryp
+ 	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm);
+ 
+ 	crypto_free_ahash(tctx->fallback_tfm);
+-	pm_runtime_put_autosuspend(tctx->dev->dev);
+ }
+ 
+ struct rk_crypto_tmp rk_ahash_sha1 = {
+--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
+@@ -17,11 +17,11 @@
+ static int rk_cipher_need_fallback(struct skcipher_request *req)
+ {
+ 	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	unsigned int bs = crypto_skcipher_blocksize(tfm);
+ 	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
+ 	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+ 	struct scatterlist *sgs, *sgd;
+ 	unsigned int stodo, dtodo, len;
++	unsigned int bs = crypto_skcipher_blocksize(tfm);
+ 
+ 	if (!req->cryptlen)
+ 		return true;
+@@ -84,15 +84,16 @@ static int rk_cipher_fallback(struct skc
+ 
+ static int rk_cipher_handle_req(struct skcipher_request *req)
+ {
+-	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+-	struct rk_cipher_ctx *tctx = crypto_skcipher_ctx(tfm);
+ 	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
+-	struct rk_crypto_info *rkc = tctx->dev;
+-	struct crypto_engine *engine = rkc->engine;
++	struct rk_crypto_info *rkc;
++	struct crypto_engine *engine;
+ 
+ 	if (rk_cipher_need_fallback(req))
+ 		return rk_cipher_fallback(req);
+ 
++	rkc = get_rk_crypto();
++
++	engine = rkc->engine;
+ 	rctx->dev = rkc;
+ 
+ 	return crypto_transfer_skcipher_request_to_engine(engine, req);
+@@ -307,7 +308,12 @@ static int rk_cipher_run(struct crypto_e
+ 	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+ 	struct rk_crypto_info *rkc = rctx->dev;
+ 
++	err = pm_runtime_resume_and_get(rkc->dev);
++	if (err)
++		return err;
++
+ 	algt->stat_req++;
++	rkc->nreq++;
+ 
+ 	ivsize = crypto_skcipher_ivsize(tfm);
+ 	if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) {
+@@ -401,6 +407,8 @@ static int rk_cipher_run(struct crypto_e
+ 	}
+ 
+ theend:
++	pm_runtime_put_autosuspend(rkc->dev);
++
+ 	local_bh_disable();
+ 	crypto_finalize_skcipher_request(engine, areq, err);
+ 	local_bh_enable();
+@@ -420,18 +428,13 @@ theend_iv:
+ static int rk_cipher_tfm_init(struct crypto_skcipher *tfm)
+ {
+ 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+-	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
+ 	const char *name = crypto_tfm_alg_name(&tfm->base);
+-	struct rk_crypto_tmp *algt;
+-	int err;
+-
+-	algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+-
+-	ctx->dev = algt->dev;
++	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
++	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
+ 
+ 	ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
+ 	if (IS_ERR(ctx->fallback_tfm)) {
+-		dev_err(ctx->dev->dev, "ERROR: Cannot allocate fallback for %s %ld\n",
++		dev_err(algt->dev->dev, "ERROR: Cannot allocate fallback for %s %ld\n",
+ 			name, PTR_ERR(ctx->fallback_tfm));
+ 		return PTR_ERR(ctx->fallback_tfm);
+ 	}
+@@ -441,14 +444,7 @@ static int rk_cipher_tfm_init(struct cry
+ 
+ 	ctx->enginectx.op.do_one_request = rk_cipher_run;
+ 
+-	err = pm_runtime_resume_and_get(ctx->dev->dev);
+-	if (err < 0)
+-		goto error_pm;
+-
+ 	return 0;
+-error_pm:
+-	crypto_free_skcipher(ctx->fallback_tfm);
+-	return err;
+ }
+ 
+ static void rk_cipher_tfm_exit(struct crypto_skcipher *tfm)
+@@ -457,7 +453,6 @@ static void rk_cipher_tfm_exit(struct cr
+ 
+ 	memzero_explicit(ctx->key, ctx->keylen);
+ 	crypto_free_skcipher(ctx->fallback_tfm);
+-	pm_runtime_put_autosuspend(ctx->dev->dev);
+ }
+ 
+ struct rk_crypto_tmp rk_ecb_aes_alg = {
diff --git a/target/linux/rockchip/patches-6.0/201-crypto-rockchip-move-kconfig-to-its-dedicated-direct.patch b/target/linux/rockchip/patches-6.0/201-crypto-rockchip-move-kconfig-to-its-dedicated-direct.patch
new file mode 100644
index 000000000..6c212a340
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/201-crypto-rockchip-move-kconfig-to-its-dedicated-direct.patch
@@ -0,0 +1,105 @@
+From e8749922cdcddc6e3d3df6a94c530df863073353 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 08:00:44 +0000
+Subject: [PATCH 1/5] crypto: rockchip: move kconfig to its dedicated directory
+
+Move all rockchip kconfig in its own subdirectory.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/Kconfig          | 32 ++------------------------------
+ drivers/crypto/Makefile         |  2 +-
+ drivers/crypto/rockchip/Kconfig | 28 ++++++++++++++++++++++++++++
+ 3 files changed, 31 insertions(+), 31 deletions(-)
+ create mode 100644 drivers/crypto/rockchip/Kconfig
+
+--- a/drivers/crypto/Kconfig
++++ b/drivers/crypto/Kconfig
+@@ -646,6 +646,8 @@ config CRYPTO_DEV_QCOM_RNG
+ 	  To compile this driver as a module, choose M here. The
+ 	  module will be called qcom-rng. If unsure, say N.
+ 
++source "drivers/crypto/rockchip/Kconfig"
++
+ config CRYPTO_DEV_VMX
+ 	bool "Support for VMX cryptographic acceleration instructions"
+ 	depends on PPC64 && VSX
+@@ -666,36 +668,6 @@ config CRYPTO_DEV_IMGTEC_HASH
+ 	  hardware hash accelerator. Supporting MD5/SHA1/SHA224/SHA256
+ 	  hashing algorithms.
+ 
+-config CRYPTO_DEV_ROCKCHIP
+-	tristate "Rockchip's Cryptographic Engine driver"
+-	depends on OF && ARCH_ROCKCHIP
+-	depends on PM
+-	select CRYPTO_ECB
+-	select CRYPTO_CBC
+-	select CRYPTO_DES
+-	select CRYPTO_AES
+-	select CRYPTO_ENGINE
+-	select CRYPTO_LIB_DES
+-	select CRYPTO_MD5
+-	select CRYPTO_SHA1
+-	select CRYPTO_SHA256
+-	select CRYPTO_HASH
+-	select CRYPTO_SKCIPHER
+-
+-	help
+-	  This driver interfaces with the hardware crypto accelerator.
+-	  Supporting cbc/ecb chainmode, and aes/des/des3_ede cipher mode.
+-
+-config CRYPTO_DEV_ROCKCHIP_DEBUG
+-	bool "Enable Rockchip crypto stats"
+-	depends on CRYPTO_DEV_ROCKCHIP
+-	depends on DEBUG_FS
+-	help
+-	  Say y to enable Rockchip crypto debug stats.
+-	  This will create /sys/kernel/debug/rk3288_crypto/stats for displaying
+-	  the number of requests per algorithm and other internal stats.
+-
+-
+ config CRYPTO_DEV_ZYNQMP_AES
+ 	tristate "Support for Xilinx ZynqMP AES hw accelerator"
+ 	depends on ZYNQMP_FIRMWARE || COMPILE_TEST
+--- a/drivers/crypto/Makefile
++++ b/drivers/crypto/Makefile
+@@ -35,7 +35,7 @@ obj-$(CONFIG_CRYPTO_DEV_PPC4XX) += amcc/
+ obj-$(CONFIG_CRYPTO_DEV_QAT) += qat/
+ obj-$(CONFIG_CRYPTO_DEV_QCE) += qce/
+ obj-$(CONFIG_CRYPTO_DEV_QCOM_RNG) += qcom-rng.o
+-obj-$(CONFIG_CRYPTO_DEV_ROCKCHIP) += rockchip/
++obj-y += rockchip/
+ obj-$(CONFIG_CRYPTO_DEV_S5P) += s5p-sss.o
+ obj-$(CONFIG_CRYPTO_DEV_SA2UL) += sa2ul.o
+ obj-$(CONFIG_CRYPTO_DEV_SAHARA) += sahara.o
+--- /dev/null
++++ b/drivers/crypto/rockchip/Kconfig
+@@ -0,0 +1,28 @@
++config CRYPTO_DEV_ROCKCHIP
++	tristate "Rockchip's Cryptographic Engine driver"
++	depends on OF && ARCH_ROCKCHIP
++	depends on PM
++	select CRYPTO_ECB
++	select CRYPTO_CBC
++	select CRYPTO_DES
++	select CRYPTO_AES
++	select CRYPTO_ENGINE
++	select CRYPTO_LIB_DES
++	select CRYPTO_MD5
++	select CRYPTO_SHA1
++	select CRYPTO_SHA256
++	select CRYPTO_HASH
++	select CRYPTO_SKCIPHER
++
++	help
++	  This driver interfaces with the hardware crypto accelerator.
++	  Supporting cbc/ecb chainmode, and aes/des/des3_ede cipher mode.
++
++config CRYPTO_DEV_ROCKCHIP_DEBUG
++	bool "Enable Rockchip crypto stats"
++	depends on CRYPTO_DEV_ROCKCHIP
++	depends on DEBUG_FS
++	help
++	  Say y to enable Rockchip crypto debug stats.
++	  This will create /sys/kernel/debug/rk3288_crypto/stats for displaying
++	  the number of requests per algorithm and other internal stats.
diff --git a/target/linux/rockchip/patches-6.0/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch b/target/linux/rockchip/patches-6.0/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch
new file mode 100644
index 000000000..013e14981
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/201-rockchip-rk3328-add-i2c0-controller-for-nanopi-r2s.patch
@@ -0,0 +1,22 @@
+From 3b7eb946b1d640d684a921e53e1e50985ab7eb89 Mon Sep 17 00:00:00 2001
+From: QiuSimons <45143996+QiuSimons@users.noreply.github.com>
+Date: Tue, 4 Aug 2020 20:17:53 +0800
+Subject: [PATCH] rockchip: rk3328: add i2c0 controller for nanopi r2s
+
+---
+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 4 ++++
+ 1 files changed, 4 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
+@@ -173,6 +173,10 @@
+ 	};
+ };
+ 
++&i2c0 {
++	status = "okay";
++};
++
+ &i2c1 {
+ 	status = "okay";
+ 
diff --git a/target/linux/rockchip/patches-6.0/202-dt-bindings-crypto-add-support-for-rockchip-crypto-r.patch b/target/linux/rockchip/patches-6.0/202-dt-bindings-crypto-add-support-for-rockchip-crypto-r.patch
new file mode 100644
index 000000000..aa9e35d31
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/202-dt-bindings-crypto-add-support-for-rockchip-crypto-r.patch
@@ -0,0 +1,89 @@
+From 03c8a180b9ba57a1bcf658c25a725b063bbade96 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 08:00:45 +0000
+Subject: [PATCH 2/5] dt-bindings: crypto: add support for
+ rockchip,crypto-rk3588
+
+Add device tree binding documentation for the Rockchip cryptographic
+offloader V2.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ .../crypto/rockchip,rk3588-crypto.yaml        | 71 +++++++++++++++++++
+ 1 file changed, 71 insertions(+)
+ create mode 100644 Documentation/devicetree/bindings/crypto/rockchip,rk3588-crypto.yaml
+
+--- /dev/null
++++ b/Documentation/devicetree/bindings/crypto/rockchip,rk3588-crypto.yaml
+@@ -0,0 +1,71 @@
++# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
++%YAML 1.2
++---
++$id: http://devicetree.org/schemas/crypto/rockchip,rk3588-crypto.yaml#
++$schema: http://devicetree.org/meta-schemas/core.yaml#
++
++title: Rockchip cryptographic offloader V2
++
++maintainers:
++  - Corentin Labbe <clabbe@baylibre.com>
++
++properties:
++  compatible:
++    enum:
++      - rockchip,rk3568-crypto
++      - rockchip,rk3588-crypto
++
++  reg:
++    maxItems: 1
++
++  interrupts:
++    maxItems: 1
++
++  clocks:
++    minItems: 4
++
++  clock-names:
++    items:
++      - const: aclk
++      - const: hclk
++      - const: sclk
++      - const: pka
++
++  resets:
++    minItems: 5
++
++  reset-names:
++    items:
++      - const: core
++      - const: a
++      - const: h
++      - const: rng
++      - const: pka
++
++required:
++  - compatible
++  - reg
++  - interrupts
++  - clocks
++  - clock-names
++  - resets
++  - reset-names
++
++additionalProperties: false
++
++examples:
++  - |
++    #include <dt-bindings/interrupt-controller/arm-gic.h>
++    #include <dt-bindings/clock/rk3568-cru.h>
++    crypto@fe380000 {
++      compatible = "rockchip,rk3588-crypto";
++      reg = <0xfe380000 0x4000>;
++      interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
++      clocks = <&cru ACLK_CRYPTO_NS>, <&cru HCLK_CRYPTO_NS>,
++               <&cru CLK_CRYPTO_NS_CORE>, <&cru CLK_CRYPTO_NS_PKA>;
++      clock-names = "aclk", "hclk", "sclk", "pka";
++      resets = <&cru SRST_CRYPTO_NS_CORE>, <&cru SRST_A_CRYPTO_NS>,
++               <&cru SRST_H_CRYPTO_NS>, <&cru SRST_CRYPTO_NS_RNG>,
++               <&cru SRST_CRYPTO_NS_PKA>;
++      reset-names = "core", "a", "h", "rng", "pka";
++    };
diff --git a/target/linux/rockchip/patches-6.0/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch b/target/linux/rockchip/patches-6.0/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch
new file mode 100644
index 000000000..e1f441ba3
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/202-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus.patch
@@ -0,0 +1,52 @@
+--- a/arch/arm64/boot/dts/rockchip/Makefile
++++ b/arch/arm64/boot/dts/rockchip/Makefile
+@@ -11,6 +11,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-od
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts
+@@ -0,0 +1,39 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++#include "rk3328-nanopi-r2s.dts"
++
++/ {
++	model = "Xunlong Orange Pi R1 Plus";
++	compatible = "xunlong,orangepi-r1-plus", "rockchip,rk3328";
++};
++
++&lan_led {
++	label = "orangepi-r1-plus:green:lan";
++};
++
++&spi0 {
++	max-freq = <48000000>;
++	status = "okay";
++
++	flash@0 {
++		compatible = "jedec,spi-nor";
++		reg = <0>;
++		spi-max-frequency = <10000000>;
++	};
++};
++
++&sys_led {
++	gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;
++	label = "orangepi-r1-plus:red:sys";
++};
++
++&sys_led_pin {
++	rockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>;
++};
++
++&uart1 {
++	status = "okay";
++};
++
++&wan_led {
++	label = "orangepi-r1-plus:green:wan";
++};
diff --git a/target/linux/rockchip/patches-6.0/203-MAINTAINERS-add-new-dt-binding-doc-to-the-right-entr.patch b/target/linux/rockchip/patches-6.0/203-MAINTAINERS-add-new-dt-binding-doc-to-the-right-entr.patch
new file mode 100644
index 000000000..a52394500
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/203-MAINTAINERS-add-new-dt-binding-doc-to-the-right-entr.patch
@@ -0,0 +1,22 @@
+From a091cb568872e3ef2e6a5c6e28e4f43465d46ca2 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 08:00:46 +0000
+Subject: [PATCH 3/5] MAINTAINERS: add new dt-binding doc to the right entry
+
+Rockchip crypto driver have a new file to be added.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ MAINTAINERS | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -17574,6 +17574,7 @@ M:	Corentin Labbe <clabbe@baylibre.com>
+ L:	linux-crypto@vger.kernel.org
+ S:	Maintained
+ F:	Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml
++F:	Documentation/devicetree/bindings/crypto/rockchip,rk3588-crypto.yaml
+ F:	drivers/crypto/rockchip/
+ 
+ ROCKCHIP I2S TDM DRIVER
diff --git a/target/linux/rockchip/patches-6.0/204-crypto-rockchip-support-the-new-crypto-IP-for-rk3568.patch b/target/linux/rockchip/patches-6.0/204-crypto-rockchip-support-the-new-crypto-IP-for-rk3568.patch
new file mode 100644
index 000000000..ecef87107
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/204-crypto-rockchip-support-the-new-crypto-IP-for-rk3568.patch
@@ -0,0 +1,1633 @@
+From 06ecfb2f7b3277c4ed1bf0172b14ae7bc0c2d4aa Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 08:00:47 +0000
+Subject: [PATCH 4/5] crypto: rockchip: support the new crypto IP for
+ rk3568/rk3588
+
+Rockchip rk3568 and rk3588 have a common crypto offloader IP.
+This driver adds support for it.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ drivers/crypto/rockchip/Kconfig               |  28 +
+ drivers/crypto/rockchip/Makefile              |   5 +
+ drivers/crypto/rockchip/rk3588_crypto.c       | 646 ++++++++++++++++++
+ drivers/crypto/rockchip/rk3588_crypto.h       | 221 ++++++
+ drivers/crypto/rockchip/rk3588_crypto_ahash.c | 346 ++++++++++
+ .../crypto/rockchip/rk3588_crypto_skcipher.c  | 340 +++++++++
+ 6 files changed, 1586 insertions(+)
+ create mode 100644 drivers/crypto/rockchip/rk3588_crypto.c
+ create mode 100644 drivers/crypto/rockchip/rk3588_crypto.h
+ create mode 100644 drivers/crypto/rockchip/rk3588_crypto_ahash.c
+ create mode 100644 drivers/crypto/rockchip/rk3588_crypto_skcipher.c
+
+--- a/drivers/crypto/rockchip/Kconfig
++++ b/drivers/crypto/rockchip/Kconfig
+@@ -26,3 +26,31 @@ config CRYPTO_DEV_ROCKCHIP_DEBUG
+ 	  Say y to enable Rockchip crypto debug stats.
+ 	  This will create /sys/kernel/debug/rk3288_crypto/stats for displaying
+ 	  the number of requests per algorithm and other internal stats.
++
++config CRYPTO_DEV_ROCKCHIP2
++	tristate "Rockchip's cryptographic offloader V2"
++	depends on OF && ARCH_ROCKCHIP
++	depends on PM
++	select CRYPTO_ECB
++	select CRYPTO_CBC
++	select CRYPTO_AES
++	select CRYPTO_MD5
++	select CRYPTO_SHA1
++	select CRYPTO_SHA256
++	select CRYPTO_SM3
++	select CRYPTO_HASH
++	select CRYPTO_SKCIPHER
++	select CRYPTO_ENGINE
++
++	help
++	  This driver interfaces with the hardware crypto offloader present
++	  on RK3568 and RK3588.
++
++config CRYPTO_DEV_ROCKCHIP2_DEBUG
++	bool "Enable Rockchip V2 crypto stats"
++	depends on CRYPTO_DEV_ROCKCHIP2
++	depends on DEBUG_FS
++	help
++	  Say y to enable Rockchip crypto debug stats.
++	  This will create /sys/kernel/debug/rk3588_crypto/stats for displaying
++	  the number of requests per algorithm and other internal stats.
+--- a/drivers/crypto/rockchip/Makefile
++++ b/drivers/crypto/rockchip/Makefile
+@@ -3,3 +3,8 @@ obj-$(CONFIG_CRYPTO_DEV_ROCKCHIP) += rk_
+ rk_crypto-objs := rk3288_crypto.o \
+ 		  rk3288_crypto_skcipher.o \
+ 		  rk3288_crypto_ahash.o
++
++obj-$(CONFIG_CRYPTO_DEV_ROCKCHIP2) += rk_crypto2.o
++rk_crypto2-objs := rk3588_crypto.o \
++		  rk3588_crypto_skcipher.o \
++		  rk3588_crypto_ahash.o
+--- /dev/null
++++ b/drivers/crypto/rockchip/rk3588_crypto.c
+@@ -0,0 +1,646 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * hardware cryptographic offloader for rk3568/rk3588 SoC
++ *
++ * Copyright (c) 2022, Corentin Labbe <clabbe@baylibre.com>
++ */
++
++#include "rk3588_crypto.h"
++#include <linux/clk.h>
++#include <linux/crypto.h>
++#include <linux/dma-mapping.h>
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/of.h>
++#include <linux/of_device.h>
++#include <linux/reset.h>
++
++static struct rockchip_ip rocklist = {
++	.dev_list = LIST_HEAD_INIT(rocklist.dev_list),
++	.lock = __SPIN_LOCK_UNLOCKED(rocklist.lock),
++};
++
++struct rk_crypto_dev *get_rk_crypto(void)
++{
++	struct rk_crypto_dev *first;
++
++	spin_lock(&rocklist.lock);
++	first = list_first_entry_or_null(&rocklist.dev_list,
++					 struct rk_crypto_dev, list);
++	list_rotate_left(&rocklist.dev_list);
++	spin_unlock(&rocklist.lock);
++	return first;
++}
++
++static const struct rk_variant rk3568_variant = {
++	.num_clks = 4,
++};
++
++static const struct rk_variant rk3588_variant = {
++	.num_clks = 4,
++};
++
++static int rk_crypto_get_clks(struct rk_crypto_dev *dev)
++{
++	int i, j, err;
++	unsigned long cr;
++
++	dev->num_clks = devm_clk_bulk_get_all(dev->dev, &dev->clks);
++	if (dev->num_clks < dev->variant->num_clks) {
++		dev_err(dev->dev, "Missing clocks, got %d instead of %d\n",
++			dev->num_clks, dev->variant->num_clks);
++		return -EINVAL;
++	}
++
++	for (i = 0; i < dev->num_clks; i++) {
++		cr = clk_get_rate(dev->clks[i].clk);
++		for (j = 0; j < ARRAY_SIZE(dev->variant->rkclks); j++) {
++			if (dev->variant->rkclks[j].max == 0)
++				continue;
++			if (strcmp(dev->variant->rkclks[j].name, dev->clks[i].id))
++				continue;
++			if (cr > dev->variant->rkclks[j].max) {
++				err = clk_set_rate(dev->clks[i].clk,
++						   dev->variant->rkclks[j].max);
++				if (err)
++					dev_err(dev->dev, "Fail downclocking %s from %lu to %lu\n",
++						dev->variant->rkclks[j].name, cr,
++						dev->variant->rkclks[j].max);
++				else
++					dev_info(dev->dev, "Downclocking %s from %lu to %lu\n",
++						 dev->variant->rkclks[j].name, cr,
++						 dev->variant->rkclks[j].max);
++			}
++		}
++	}
++	return 0;
++}
++
++static int rk_crypto_enable_clk(struct rk_crypto_dev *dev)
++{
++	int err;
++
++	err = clk_bulk_prepare_enable(dev->num_clks, dev->clks);
++	if (err)
++		dev_err(dev->dev, "Could not enable clock clks\n");
++
++	return err;
++}
++
++static void rk_crypto_disable_clk(struct rk_crypto_dev *dev)
++{
++	clk_bulk_disable_unprepare(dev->num_clks, dev->clks);
++}
++
++/*
++ * Power management strategy: The device is suspended until a request
++ * is handled. For avoiding suspend/resume yoyo, the autosuspend is set to 2s.
++ */
++static int rk_crypto_pm_suspend(struct device *dev)
++{
++	struct rk_crypto_dev *rkdev = dev_get_drvdata(dev);
++
++	rk_crypto_disable_clk(rkdev);
++	reset_control_assert(rkdev->rst);
++
++	return 0;
++}
++
++static int rk_crypto_pm_resume(struct device *dev)
++{
++	struct rk_crypto_dev *rkdev = dev_get_drvdata(dev);
++	int ret;
++
++	ret = rk_crypto_enable_clk(rkdev);
++	if (ret)
++		return ret;
++
++	reset_control_deassert(rkdev->rst);
++	return 0;
++}
++
++static const struct dev_pm_ops rk_crypto_pm_ops = {
++	SET_RUNTIME_PM_OPS(rk_crypto_pm_suspend, rk_crypto_pm_resume, NULL)
++};
++
++static int rk_crypto_pm_init(struct rk_crypto_dev *rkdev)
++{
++	int err;
++
++	pm_runtime_use_autosuspend(rkdev->dev);
++	pm_runtime_set_autosuspend_delay(rkdev->dev, 2000);
++
++	err = pm_runtime_set_suspended(rkdev->dev);
++	if (err)
++		return err;
++	pm_runtime_enable(rkdev->dev);
++	return err;
++}
++
++static void rk_crypto_pm_exit(struct rk_crypto_dev *rkdev)
++{
++	pm_runtime_disable(rkdev->dev);
++}
++
++static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id)
++{
++	struct rk_crypto_dev *rkc  = platform_get_drvdata(dev_id);
++	u32 v;
++
++	v = readl(rkc->reg + RK_CRYPTO_DMA_INT_ST);
++	writel(v, rkc->reg + RK_CRYPTO_DMA_INT_ST);
++
++	rkc->status = 1;
++	if (v & 0xF8) {
++		dev_warn(rkc->dev, "DMA Error\n");
++		rkc->status = 0;
++	}
++	complete(&rkc->complete);
++
++	return IRQ_HANDLED;
++}
++
++static struct rk_crypto_template rk_cipher_algs[] = {
++	{
++		.type = CRYPTO_ALG_TYPE_SKCIPHER,
++		.alg.skcipher = {
++			.base.cra_name		= "ecb(aes)",
++			.base.cra_driver_name	= "ecb-aes-rk2",
++			.base.cra_priority	= 300,
++			.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
++			.base.cra_blocksize	= AES_BLOCK_SIZE,
++			.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
++			.base.cra_alignmask	= 0x0f,
++			.base.cra_module	= THIS_MODULE,
++
++			.init			= rk_cipher_tfm_init,
++			.exit			= rk_cipher_tfm_exit,
++			.min_keysize		= AES_MIN_KEY_SIZE,
++			.max_keysize		= AES_MAX_KEY_SIZE,
++			.setkey			= rk_aes_setkey,
++			.encrypt		= rk_aes_ecb_encrypt,
++			.decrypt		= rk_aes_ecb_decrypt,
++		}
++	},
++	{
++		.type = CRYPTO_ALG_TYPE_SKCIPHER,
++		.alg.skcipher = {
++			.base.cra_name		= "cbc(aes)",
++			.base.cra_driver_name	= "cbc-aes-rk2",
++			.base.cra_priority	= 300,
++			.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
++			.base.cra_blocksize	= AES_BLOCK_SIZE,
++			.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
++			.base.cra_alignmask	= 0x0f,
++			.base.cra_module	= THIS_MODULE,
++
++			.init			= rk_cipher_tfm_init,
++			.exit			= rk_cipher_tfm_exit,
++			.min_keysize		= AES_MIN_KEY_SIZE,
++			.max_keysize		= AES_MAX_KEY_SIZE,
++			.ivsize			= AES_BLOCK_SIZE,
++			.setkey			= rk_aes_setkey,
++			.encrypt		= rk_aes_cbc_encrypt,
++			.decrypt		= rk_aes_cbc_decrypt,
++		}
++	},
++	{
++		.type = CRYPTO_ALG_TYPE_AHASH,
++		.rk_mode = RK_CRYPTO_MD5,
++		.alg.hash = {
++			.init = rk_ahash_init,
++			.update = rk_ahash_update,
++			.final = rk_ahash_final,
++			.finup = rk_ahash_finup,
++			.export = rk_ahash_export,
++			.import = rk_ahash_import,
++			.digest = rk_ahash_digest,
++			.halg = {
++				.digestsize = MD5_DIGEST_SIZE,
++				.statesize = sizeof(struct md5_state),
++				.base = {
++					.cra_name = "md5",
++					.cra_driver_name = "rk2-md5",
++					.cra_priority = 300,
++					.cra_flags = CRYPTO_ALG_ASYNC |
++						CRYPTO_ALG_NEED_FALLBACK,
++					.cra_blocksize = SHA1_BLOCK_SIZE,
++					.cra_ctxsize = sizeof(struct rk_ahash_ctx),
++					.cra_alignmask = 3,
++					.cra_init = rk_cra_hash_init,
++					.cra_exit = rk_cra_hash_exit,
++					.cra_module = THIS_MODULE,
++				}
++			}
++		}
++	},
++	{
++		.type = CRYPTO_ALG_TYPE_AHASH,
++		.rk_mode = RK_CRYPTO_SHA1,
++		.alg.hash = {
++			.init = rk_ahash_init,
++			.update = rk_ahash_update,
++			.final = rk_ahash_final,
++			.finup = rk_ahash_finup,
++			.export = rk_ahash_export,
++			.import = rk_ahash_import,
++			.digest = rk_ahash_digest,
++			.halg = {
++				.digestsize = SHA1_DIGEST_SIZE,
++				.statesize = sizeof(struct sha1_state),
++				.base = {
++					.cra_name = "sha1",
++					.cra_driver_name = "rk2-sha1",
++					.cra_priority = 300,
++					.cra_flags = CRYPTO_ALG_ASYNC |
++						CRYPTO_ALG_NEED_FALLBACK,
++					.cra_blocksize = SHA1_BLOCK_SIZE,
++					.cra_ctxsize = sizeof(struct rk_ahash_ctx),
++					.cra_alignmask = 3,
++					.cra_init = rk_cra_hash_init,
++					.cra_exit = rk_cra_hash_exit,
++					.cra_module = THIS_MODULE,
++				}
++			}
++		}
++	},
++	{
++		.type = CRYPTO_ALG_TYPE_AHASH,
++		.rk_mode = RK_CRYPTO_SHA256,
++		.alg.hash = {
++			.init = rk_ahash_init,
++			.update = rk_ahash_update,
++			.final = rk_ahash_final,
++			.finup = rk_ahash_finup,
++			.export = rk_ahash_export,
++			.import = rk_ahash_import,
++			.digest = rk_ahash_digest,
++			.halg = {
++				.digestsize = SHA256_DIGEST_SIZE,
++				.statesize = sizeof(struct sha256_state),
++				.base = {
++					.cra_name = "sha256",
++					.cra_driver_name = "rk2-sha256",
++					.cra_priority = 300,
++					.cra_flags = CRYPTO_ALG_ASYNC |
++						CRYPTO_ALG_NEED_FALLBACK,
++					.cra_blocksize = SHA256_BLOCK_SIZE,
++					.cra_ctxsize = sizeof(struct rk_ahash_ctx),
++					.cra_alignmask = 3,
++					.cra_init = rk_cra_hash_init,
++					.cra_exit = rk_cra_hash_exit,
++					.cra_module = THIS_MODULE,
++				}
++			}
++		}
++	},
++	{
++		.type = CRYPTO_ALG_TYPE_AHASH,
++		.rk_mode = RK_CRYPTO_SHA384,
++		.alg.hash = {
++			.init = rk_ahash_init,
++			.update = rk_ahash_update,
++			.final = rk_ahash_final,
++			.finup = rk_ahash_finup,
++			.export = rk_ahash_export,
++			.import = rk_ahash_import,
++			.digest = rk_ahash_digest,
++			.halg = {
++				.digestsize = SHA384_DIGEST_SIZE,
++				.statesize = sizeof(struct sha512_state),
++				.base = {
++					.cra_name = "sha384",
++					.cra_driver_name = "rk2-sha384",
++					.cra_priority = 300,
++					.cra_flags = CRYPTO_ALG_ASYNC |
++						CRYPTO_ALG_NEED_FALLBACK,
++					.cra_blocksize = SHA384_BLOCK_SIZE,
++					.cra_ctxsize = sizeof(struct rk_ahash_ctx),
++					.cra_alignmask = 3,
++					.cra_init = rk_cra_hash_init,
++					.cra_exit = rk_cra_hash_exit,
++					.cra_module = THIS_MODULE,
++				}
++			}
++		}
++	},
++	{
++		.type = CRYPTO_ALG_TYPE_AHASH,
++		.rk_mode = RK_CRYPTO_SHA512,
++		.alg.hash = {
++			.init = rk_ahash_init,
++			.update = rk_ahash_update,
++			.final = rk_ahash_final,
++			.finup = rk_ahash_finup,
++			.export = rk_ahash_export,
++			.import = rk_ahash_import,
++			.digest = rk_ahash_digest,
++			.halg = {
++				.digestsize = SHA512_DIGEST_SIZE,
++				.statesize = sizeof(struct sha512_state),
++				.base = {
++					.cra_name = "sha512",
++					.cra_driver_name = "rk2-sha512",
++					.cra_priority = 300,
++					.cra_flags = CRYPTO_ALG_ASYNC |
++						CRYPTO_ALG_NEED_FALLBACK,
++					.cra_blocksize = SHA512_BLOCK_SIZE,
++					.cra_ctxsize = sizeof(struct rk_ahash_ctx),
++					.cra_alignmask = 3,
++					.cra_init = rk_cra_hash_init,
++					.cra_exit = rk_cra_hash_exit,
++					.cra_module = THIS_MODULE,
++				}
++			}
++		}
++	},
++	{
++		.type = CRYPTO_ALG_TYPE_AHASH,
++		.rk_mode = RK_CRYPTO_SM3,
++		.alg.hash = {
++			.init = rk_ahash_init,
++			.update = rk_ahash_update,
++			.final = rk_ahash_final,
++			.finup = rk_ahash_finup,
++			.export = rk_ahash_export,
++			.import = rk_ahash_import,
++			.digest = rk_ahash_digest,
++			.halg = {
++				.digestsize = SM3_DIGEST_SIZE,
++				.statesize = sizeof(struct sm3_state),
++				.base = {
++					.cra_name = "sm3",
++					.cra_driver_name = "rk2-sm3",
++					.cra_priority = 300,
++					.cra_flags = CRYPTO_ALG_ASYNC |
++						CRYPTO_ALG_NEED_FALLBACK,
++					.cra_blocksize = SM3_BLOCK_SIZE,
++					.cra_ctxsize = sizeof(struct rk_ahash_ctx),
++					.cra_alignmask = 3,
++					.cra_init = rk_cra_hash_init,
++					.cra_exit = rk_cra_hash_exit,
++					.cra_module = THIS_MODULE,
++				}
++			}
++		}
++	},
++};
++
++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP2_DEBUG
++static int rk_crypto_debugfs_show(struct seq_file *seq, void *v)
++{
++	struct rk_crypto_dev *dd;
++	unsigned int i;
++
++	spin_lock(&rocklist.lock);
++	list_for_each_entry(dd, &rocklist.dev_list, list) {
++		seq_printf(seq, "%s %s requests: %lu\n",
++			   dev_driver_string(dd->dev), dev_name(dd->dev),
++			   dd->nreq);
++	}
++	spin_unlock(&rocklist.lock);
++
++	for (i = 0; i < ARRAY_SIZE(rk_cipher_algs); i++) {
++		if (!rk_cipher_algs[i].dev)
++			continue;
++		switch (rk_cipher_algs[i].type) {
++		case CRYPTO_ALG_TYPE_SKCIPHER:
++			seq_printf(seq, "%s %s reqs=%lu fallback=%lu\n",
++				   rk_cipher_algs[i].alg.skcipher.base.cra_driver_name,
++				   rk_cipher_algs[i].alg.skcipher.base.cra_name,
++				   rk_cipher_algs[i].stat_req, rk_cipher_algs[i].stat_fb);
++			seq_printf(seq, "\tfallback due to length: %lu\n",
++				   rk_cipher_algs[i].stat_fb_len);
++			seq_printf(seq, "\tfallback due to alignment: %lu\n",
++				   rk_cipher_algs[i].stat_fb_align);
++			seq_printf(seq, "\tfallback due to SGs: %lu\n",
++				   rk_cipher_algs[i].stat_fb_sgdiff);
++			break;
++		case CRYPTO_ALG_TYPE_AHASH:
++			seq_printf(seq, "%s %s reqs=%lu fallback=%lu\n",
++				   rk_cipher_algs[i].alg.hash.halg.base.cra_driver_name,
++				   rk_cipher_algs[i].alg.hash.halg.base.cra_name,
++				   rk_cipher_algs[i].stat_req, rk_cipher_algs[i].stat_fb);
++			break;
++		}
++	}
++	return 0;
++}
++
++DEFINE_SHOW_ATTRIBUTE(rk_crypto_debugfs);
++#endif
++
++static void register_debugfs(struct rk_crypto_dev *crypto_dev)
++{
++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP2_DEBUG
++	/* Ignore error of debugfs */
++	rocklist.dbgfs_dir = debugfs_create_dir("rk3588_crypto", NULL);
++	rocklist.dbgfs_stats = debugfs_create_file("stats", 0444,
++						   rocklist.dbgfs_dir,
++						   &rocklist,
++						   &rk_crypto_debugfs_fops);
++#endif
++}
++
++static int rk_crypto_register(struct rk_crypto_dev *rkc)
++{
++	unsigned int i, k;
++	int err = 0;
++
++	for (i = 0; i < ARRAY_SIZE(rk_cipher_algs); i++) {
++		rk_cipher_algs[i].dev = rkc;
++		switch (rk_cipher_algs[i].type) {
++		case CRYPTO_ALG_TYPE_SKCIPHER:
++			dev_info(rkc->dev, "Register %s as %s\n",
++				 rk_cipher_algs[i].alg.skcipher.base.cra_name,
++				 rk_cipher_algs[i].alg.skcipher.base.cra_driver_name);
++			err = crypto_register_skcipher(&rk_cipher_algs[i].alg.skcipher);
++			break;
++		case CRYPTO_ALG_TYPE_AHASH:
++			dev_info(rkc->dev, "Register %s as %s\n",
++				 rk_cipher_algs[i].alg.hash.halg.base.cra_name,
++				 rk_cipher_algs[i].alg.hash.halg.base.cra_driver_name);
++			err = crypto_register_ahash(&rk_cipher_algs[i].alg.hash);
++			break;
++		default:
++			dev_err(rkc->dev, "unknown algorithm\n");
++		}
++		if (err)
++			goto err_cipher_algs;
++	}
++	return 0;
++
++err_cipher_algs:
++	for (k = 0; k < i; k++) {
++		if (rk_cipher_algs[i].type == CRYPTO_ALG_TYPE_SKCIPHER)
++			crypto_unregister_skcipher(&rk_cipher_algs[k].alg.skcipher);
++		else
++			crypto_unregister_ahash(&rk_cipher_algs[i].alg.hash);
++	}
++	return err;
++}
++
++static void rk_crypto_unregister(void)
++{
++	unsigned int i;
++
++	for (i = 0; i < ARRAY_SIZE(rk_cipher_algs); i++) {
++		if (rk_cipher_algs[i].type == CRYPTO_ALG_TYPE_SKCIPHER)
++			crypto_unregister_skcipher(&rk_cipher_algs[i].alg.skcipher);
++		else
++			crypto_unregister_ahash(&rk_cipher_algs[i].alg.hash);
++	}
++}
++
++static const struct of_device_id crypto_of_id_table[] = {
++	{ .compatible = "rockchip,rk3568-crypto",
++	  .data = &rk3568_variant,
++	},
++	{ .compatible = "rockchip,rk3588-crypto",
++	  .data = &rk3588_variant,
++	},
++	{}
++};
++MODULE_DEVICE_TABLE(of, crypto_of_id_table);
++
++static int rk_crypto_probe(struct platform_device *pdev)
++{
++	struct device *dev = &pdev->dev;
++	struct rk_crypto_dev *rkc, *first;
++	int err = 0;
++
++	rkc = devm_kzalloc(&pdev->dev, sizeof(*rkc), GFP_KERNEL);
++	if (!rkc) {
++		err = -ENOMEM;
++		goto err_crypto;
++	}
++
++	rkc->dev = &pdev->dev;
++	platform_set_drvdata(pdev, rkc);
++
++	rkc->variant = of_device_get_match_data(&pdev->dev);
++	if (!rkc->variant) {
++		dev_err(&pdev->dev, "Missing variant\n");
++		return -EINVAL;
++	}
++
++	rkc->rst = devm_reset_control_array_get_exclusive(dev);
++	if (IS_ERR(rkc->rst)) {
++		err = PTR_ERR(rkc->rst);
++		goto err_crypto;
++	}
++
++	rkc->tl = dma_alloc_coherent(rkc->dev,
++				     sizeof(struct rk_crypto_lli) * MAX_LLI,
++				     &rkc->t_phy, GFP_KERNEL);
++	if (!rkc->tl) {
++		dev_err(rkc->dev, "Cannot get DMA memory for task\n");
++		err = -ENOMEM;
++		goto err_crypto;
++	}
++
++	reset_control_assert(rkc->rst);
++	usleep_range(10, 20);
++	reset_control_deassert(rkc->rst);
++
++	rkc->reg = devm_platform_ioremap_resource(pdev, 0);
++	if (IS_ERR(rkc->reg)) {
++		err = PTR_ERR(rkc->reg);
++		goto err_crypto;
++	}
++
++	err = rk_crypto_get_clks(rkc);
++	if (err)
++		goto err_crypto;
++
++	rkc->irq = platform_get_irq(pdev, 0);
++	if (rkc->irq < 0) {
++		dev_err(&pdev->dev, "control Interrupt is not available.\n");
++		err = rkc->irq;
++		goto err_crypto;
++	}
++
++	err = devm_request_irq(&pdev->dev, rkc->irq,
++			       rk_crypto_irq_handle, IRQF_SHARED,
++			       "rk-crypto", pdev);
++
++	if (err) {
++		dev_err(&pdev->dev, "irq request failed.\n");
++		goto err_crypto;
++	}
++
++	rkc->engine = crypto_engine_alloc_init(&pdev->dev, true);
++	crypto_engine_start(rkc->engine);
++	init_completion(&rkc->complete);
++
++	err = rk_crypto_pm_init(rkc);
++	if (err)
++		goto err_pm;
++
++	err = pm_runtime_resume_and_get(&pdev->dev);
++
++	spin_lock(&rocklist.lock);
++	first = list_first_entry_or_null(&rocklist.dev_list,
++					 struct rk_crypto_dev, list);
++	list_add_tail(&rkc->list, &rocklist.dev_list);
++	spin_unlock(&rocklist.lock);
++
++	if (!first) {
++		dev_info(dev, "Registers crypto algos\n");
++		err = rk_crypto_register(rkc);
++		if (err) {
++			dev_err(dev, "Fail to register crypto algorithms");
++			goto err_register_alg;
++		}
++
++		register_debugfs(rkc);
++	}
++
++	return 0;
++
++err_register_alg:
++	rk_crypto_pm_exit(rkc);
++err_pm:
++	crypto_engine_exit(rkc->engine);
++err_crypto:
++	dev_err(dev, "Crypto Accelerator not successfully registered\n");
++	return err;
++}
++
++static int rk_crypto_remove(struct platform_device *pdev)
++{
++	struct rk_crypto_dev *crypto_tmp = platform_get_drvdata(pdev);
++	struct rk_crypto_dev *first;
++
++	spin_lock_bh(&rocklist.lock);
++	list_del(&crypto_tmp->list);
++	first = list_first_entry_or_null(&rocklist.dev_list,
++					 struct rk_crypto_dev, list);
++	spin_unlock_bh(&rocklist.lock);
++
++	if (!first) {
++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP2_DEBUG
++		debugfs_remove_recursive(rocklist.dbgfs_dir);
++#endif
++		rk_crypto_unregister();
++	}
++	rk_crypto_pm_exit(crypto_tmp);
++	crypto_engine_exit(crypto_tmp->engine);
++	return 0;
++}
++
++static struct platform_driver crypto_driver = {
++	.probe		= rk_crypto_probe,
++	.remove		= rk_crypto_remove,
++	.driver		= {
++		.name	= "rk3588-crypto",
++		.pm		= &rk_crypto_pm_ops,
++		.of_match_table	= crypto_of_id_table,
++	},
++};
++
++module_platform_driver(crypto_driver);
++
++MODULE_DESCRIPTION("Rockchip Crypto Engine cryptographic offloader");
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Corentin Labbe <clabbe@baylibre.com>");
+--- /dev/null
++++ b/drivers/crypto/rockchip/rk3588_crypto.h
+@@ -0,0 +1,221 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++
++#include <crypto/aes.h>
++#include <crypto/engine.h>
++#include <crypto/internal/des.h>
++#include <crypto/internal/hash.h>
++#include <crypto/internal/skcipher.h>
++#include <crypto/algapi.h>
++#include <crypto/md5.h>
++#include <crypto/sha1.h>
++#include <crypto/sha2.h>
++#include <crypto/sm3.h>
++#include <linux/dma-mapping.h>
++#include <linux/interrupt.h>
++#include <linux/debugfs.h>
++#include <linux/delay.h>
++#include <linux/pm_runtime.h>
++#include <linux/scatterlist.h>
++
++#define RK_CRYPTO_CLK_CTL	0x0000
++#define RK_CRYPTO_RST_CTL	0x0004
++
++#define RK_CRYPTO_DMA_INT_EN	0x0008
++/* values for RK_CRYPTO_DMA_INT_EN */
++#define RK_CRYPTO_DMA_INT_LISTDONE	BIT(0)
++
++#define RK_CRYPTO_DMA_INT_ST	0x000C
++/* values in RK_CRYPTO_DMA_INT_ST are the same than in RK_CRYPTO_DMA_INT_EN */
++
++#define RK_CRYPTO_DMA_CTL	0x0010
++#define RK_CRYPTO_DMA_CTL_START	BIT(0)
++
++#define RK_CRYPTO_DMA_LLI_ADDR	0x0014
++
++#define RK_CRYPTO_FIFO_CTL	0x0040
++
++#define RK_CRYPTO_BC_CTL	0x0044
++#define RK_CRYPTO_AES		(0 << 8)
++#define RK_CRYPTO_MODE_ECB	(0 << 4)
++#define RK_CRYPTO_MODE_CBC	(1 << 4)
++
++#define RK_CRYPTO_HASH_CTL	0x0048
++#define RK_CRYPTO_HW_PAD	BIT(2)
++#define RK_CRYPTO_SHA1		(0 << 4)
++#define RK_CRYPTO_MD5		(1 << 4)
++#define RK_CRYPTO_SHA224	(3 << 4)
++#define RK_CRYPTO_SHA256	(2 << 4)
++#define RK_CRYPTO_SHA384	(9 << 4)
++#define RK_CRYPTO_SHA512	(8 << 4)
++#define RK_CRYPTO_SM3		(4 << 4)
++
++#define RK_CRYPTO_AES_ECB_MODE		(RK_CRYPTO_AES | RK_CRYPTO_MODE_ECB)
++#define RK_CRYPTO_AES_CBC_MODE		(RK_CRYPTO_AES | RK_CRYPTO_MODE_CBC)
++#define RK_CRYPTO_AES_CTR_MODE		3
++#define RK_CRYPTO_AES_128BIT_key	(0 << 2)
++#define RK_CRYPTO_AES_192BIT_key	(1 << 2)
++#define RK_CRYPTO_AES_256BIT_key	(2 << 2)
++
++#define RK_CRYPTO_DEC			BIT(1)
++#define RK_CRYPTO_ENABLE		BIT(0)
++
++#define RK_CRYPTO_CH0_IV_0		0x0100
++
++#define RK_CRYPTO_KEY0			0x0180
++#define RK_CRYPTO_KEY1			0x0184
++#define RK_CRYPTO_KEY2			0x0188
++#define RK_CRYPTO_KEY3			0x018C
++#define RK_CRYPTO_KEY4			0x0190
++#define RK_CRYPTO_KEY5			0x0194
++#define RK_CRYPTO_KEY6			0x0198
++#define RK_CRYPTO_KEY7			0x019C
++
++#define RK_CRYPTO_CH0_PC_LEN_0		0x0280
++
++#define RK_CRYPTO_CH0_IV_LEN		0x0300
++
++#define RK_CRYPTO_HASH_DOUT_0	0x03A0
++#define RK_CRYPTO_HASH_VALID	0x03E4
++
++#define CRYPTO_AES_VERSION	0x0680
++#define CRYPTO_DES_VERSION	0x0684
++#define CRYPTO_SM4_VERSION	0x0688
++#define CRYPTO_HASH_VERSION	0x068C
++#define CRYPTO_HMAC_VERSION	0x0690
++#define CRYPTO_RNG_VERSION	0x0694
++#define CRYPTO_PKA_VERSION	0x0698
++#define CRYPTO_CRYPTO_VERSION	0x06F0
++
++#define RK_LLI_DMA_CTRL_SRC_INT		BIT(10)
++#define RK_LLI_DMA_CTRL_DST_INT		BIT(9)
++#define RK_LLI_DMA_CTRL_LIST_INT	BIT(8)
++#define RK_LLI_DMA_CTRL_LAST		BIT(0)
++
++#define RK_LLI_STRING_LAST		BIT(2)
++#define RK_LLI_STRING_FIRST		BIT(1)
++#define RK_LLI_CIPHER_START		BIT(0)
++
++#define RK_MAX_CLKS 4
++
++/* there are no hw limit, but we need to choose a maximum of descriptor to allocate */
++#define MAX_LLI 20
++
++struct rk_crypto_lli {
++	__le32 src_addr;
++	__le32 src_len;
++	__le32 dst_addr;
++	__le32 dst_len;
++	__le32 user;
++	__le32 iv;
++	__le32 dma_ctrl;
++	__le32 next;
++};
++
++/*
++ * struct rockchip_ip - struct for managing a list of RK crypto instance
++ * @dev_list:		Used for doing a list of rk_crypto_dev
++ * @lock:		Control access to dev_list
++ * @dbgfs_dir:		Debugfs dentry for statistic directory
++ * @dbgfs_stats:	Debugfs dentry for statistic counters
++ */
++struct rockchip_ip {
++	struct list_head	dev_list;
++	spinlock_t		lock; /* Control access to dev_list */
++	struct dentry		*dbgfs_dir;
++	struct dentry		*dbgfs_stats;
++};
++
++struct rk_clks {
++	const char *name;
++	unsigned long max;
++};
++
++struct rk_variant {
++	int num_clks;
++	struct rk_clks rkclks[RK_MAX_CLKS];
++};
++
++struct rk_crypto_dev {
++	struct list_head		list;
++	struct device			*dev;
++	struct clk_bulk_data		*clks;
++	int				num_clks;
++	struct reset_control		*rst;
++	void __iomem			*reg;
++	int				irq;
++	const struct rk_variant *variant;
++	unsigned long nreq;
++	struct crypto_engine *engine;
++	struct completion complete;
++	int status;
++	struct rk_crypto_lli *tl;
++	dma_addr_t t_phy;
++};
++
++/* the private variable of hash */
++struct rk_ahash_ctx {
++	struct crypto_engine_ctx enginectx;
++	/* for fallback */
++	struct crypto_ahash		*fallback_tfm;
++};
++
++/* the private variable of hash for fallback */
++struct rk_ahash_rctx {
++	struct rk_crypto_dev		*dev;
++	struct ahash_request		fallback_req;
++	u32				mode;
++	int nrsgs;
++};
++
++/* the private variable of cipher */
++struct rk_cipher_ctx {
++	struct crypto_engine_ctx enginectx;
++	unsigned int			keylen;
++	u8				key[AES_MAX_KEY_SIZE];
++	u8				iv[AES_BLOCK_SIZE];
++	struct crypto_skcipher *fallback_tfm;
++};
++
++struct rk_cipher_rctx {
++	struct rk_crypto_dev		*dev;
++	u8 backup_iv[AES_BLOCK_SIZE];
++	u32				mode;
++	struct skcipher_request fallback_req;   // keep at the end
++};
++
++struct rk_crypto_template {
++	u32 type;
++	u32 rk_mode;
++	struct rk_crypto_dev           *dev;
++	union {
++		struct skcipher_alg	skcipher;
++		struct ahash_alg	hash;
++	} alg;
++	unsigned long stat_req;
++	unsigned long stat_fb;
++	unsigned long stat_fb_len;
++	unsigned long stat_fb_sglen;
++	unsigned long stat_fb_align;
++	unsigned long stat_fb_sgdiff;
++};
++
++struct rk_crypto_dev *get_rk_crypto(void);
++
++int rk_cipher_tfm_init(struct crypto_skcipher *tfm);
++void rk_cipher_tfm_exit(struct crypto_skcipher *tfm);
++int rk_aes_setkey(struct crypto_skcipher *cipher, const u8 *key,
++		  unsigned int keylen);
++int rk_aes_ecb_encrypt(struct skcipher_request *req);
++int rk_aes_ecb_decrypt(struct skcipher_request *req);
++int rk_aes_cbc_encrypt(struct skcipher_request *req);
++int rk_aes_cbc_decrypt(struct skcipher_request *req);
++
++int rk_ahash_init(struct ahash_request *req);
++int rk_ahash_update(struct ahash_request *req);
++int rk_ahash_final(struct ahash_request *req);
++int rk_ahash_finup(struct ahash_request *req);
++int rk_ahash_import(struct ahash_request *req, const void *in);
++int rk_ahash_export(struct ahash_request *req, void *out);
++int rk_ahash_digest(struct ahash_request *req);
++int rk_cra_hash_init(struct crypto_tfm *tfm);
++void rk_cra_hash_exit(struct crypto_tfm *tfm);
+--- /dev/null
++++ b/drivers/crypto/rockchip/rk3588_crypto_ahash.c
+@@ -0,0 +1,346 @@
++// SPDX-License-Identifier: GPL-2.0-only
++/*
++ * Crypto acceleration support for Rockchip RK3588
++ *
++ * Copyright (c) 2022 Corentin Labbe <clabbe@baylibre.com>
++ */
++#include <asm/unaligned.h>
++#include <linux/iopoll.h>
++#include "rk3588_crypto.h"
++
++static bool rk_ahash_need_fallback(struct ahash_request *areq)
++{
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
++	struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg);
++	struct rk_crypto_template *algt = container_of(alg, struct rk_crypto_template, alg.hash);
++	struct scatterlist *sg;
++
++	sg = areq->src;
++	while (sg) {
++		if (!IS_ALIGNED(sg->offset, sizeof(u32))) {
++			algt->stat_fb_align++;
++			return true;
++		}
++		if (sg->length % 4) {
++			algt->stat_fb_sglen++;
++			return true;
++		}
++		sg = sg_next(sg);
++	}
++	return false;
++}
++
++static int rk_ahash_digest_fb(struct ahash_request *areq)
++{
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
++	struct rk_ahash_ctx *tfmctx = crypto_ahash_ctx(tfm);
++	struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg);
++	struct rk_crypto_template *algt = container_of(alg, struct rk_crypto_template, alg.hash);
++
++	algt->stat_fb++;
++
++	ahash_request_set_tfm(&rctx->fallback_req, tfmctx->fallback_tfm);
++	rctx->fallback_req.base.flags = areq->base.flags &
++					CRYPTO_TFM_REQ_MAY_SLEEP;
++
++	rctx->fallback_req.nbytes = areq->nbytes;
++	rctx->fallback_req.src = areq->src;
++	rctx->fallback_req.result = areq->result;
++
++	return crypto_ahash_digest(&rctx->fallback_req);
++}
++
++static int zero_message_process(struct ahash_request *req)
++{
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
++	struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg);
++	struct rk_crypto_template *algt = container_of(alg, struct rk_crypto_template, alg.hash);
++	int digestsize = crypto_ahash_digestsize(tfm);
++
++	switch (algt->rk_mode) {
++	case RK_CRYPTO_SHA1:
++		memcpy(req->result, sha1_zero_message_hash, digestsize);
++		break;
++	case RK_CRYPTO_SHA256:
++		memcpy(req->result, sha256_zero_message_hash, digestsize);
++		break;
++	case RK_CRYPTO_SHA384:
++		memcpy(req->result, sha384_zero_message_hash, digestsize);
++		break;
++	case RK_CRYPTO_SHA512:
++		memcpy(req->result, sha512_zero_message_hash, digestsize);
++		break;
++	case RK_CRYPTO_MD5:
++		memcpy(req->result, md5_zero_message_hash, digestsize);
++		break;
++	case RK_CRYPTO_SM3:
++		memcpy(req->result, sm3_zero_message_hash, digestsize);
++		break;
++	default:
++		return -EINVAL;
++	}
++
++	return 0;
++}
++
++int rk_ahash_init(struct ahash_request *req)
++{
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
++	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
++
++	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
++	rctx->fallback_req.base.flags = req->base.flags &
++					CRYPTO_TFM_REQ_MAY_SLEEP;
++
++	return crypto_ahash_init(&rctx->fallback_req);
++}
++
++int rk_ahash_update(struct ahash_request *req)
++{
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
++	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
++
++	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
++	rctx->fallback_req.base.flags = req->base.flags &
++					CRYPTO_TFM_REQ_MAY_SLEEP;
++	rctx->fallback_req.nbytes = req->nbytes;
++	rctx->fallback_req.src = req->src;
++
++	return crypto_ahash_update(&rctx->fallback_req);
++}
++
++int rk_ahash_final(struct ahash_request *req)
++{
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
++	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
++
++	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
++	rctx->fallback_req.base.flags = req->base.flags &
++					CRYPTO_TFM_REQ_MAY_SLEEP;
++	rctx->fallback_req.result = req->result;
++
++	return crypto_ahash_final(&rctx->fallback_req);
++}
++
++int rk_ahash_finup(struct ahash_request *req)
++{
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
++	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
++
++	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
++	rctx->fallback_req.base.flags = req->base.flags &
++					CRYPTO_TFM_REQ_MAY_SLEEP;
++
++	rctx->fallback_req.nbytes = req->nbytes;
++	rctx->fallback_req.src = req->src;
++	rctx->fallback_req.result = req->result;
++
++	return crypto_ahash_finup(&rctx->fallback_req);
++}
++
++int rk_ahash_import(struct ahash_request *req, const void *in)
++{
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
++	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
++
++	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
++	rctx->fallback_req.base.flags = req->base.flags &
++					CRYPTO_TFM_REQ_MAY_SLEEP;
++
++	return crypto_ahash_import(&rctx->fallback_req, in);
++}
++
++int rk_ahash_export(struct ahash_request *req, void *out)
++{
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
++	struct rk_ahash_ctx *ctx = crypto_ahash_ctx(tfm);
++
++	ahash_request_set_tfm(&rctx->fallback_req, ctx->fallback_tfm);
++	rctx->fallback_req.base.flags = req->base.flags &
++					CRYPTO_TFM_REQ_MAY_SLEEP;
++
++	return crypto_ahash_export(&rctx->fallback_req, out);
++}
++
++int rk_ahash_digest(struct ahash_request *req)
++{
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(req);
++	struct rk_crypto_dev *dev;
++	struct crypto_engine *engine;
++
++	if (rk_ahash_need_fallback(req))
++		return rk_ahash_digest_fb(req);
++
++	if (!req->nbytes)
++		return zero_message_process(req);
++
++	dev = get_rk_crypto();
++
++	rctx->dev = dev;
++	engine = dev->engine;
++
++	return crypto_transfer_hash_request_to_engine(engine, req);
++}
++
++static int rk_hash_prepare(struct crypto_engine *engine, void *breq)
++{
++	struct ahash_request *areq = container_of(breq, struct ahash_request, base);
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
++	struct rk_crypto_dev *rkc = rctx->dev;
++	int ret;
++
++	ret = dma_map_sg(rkc->dev, areq->src, sg_nents(areq->src), DMA_TO_DEVICE);
++	if (ret <= 0)
++		return -EINVAL;
++
++	rctx->nrsgs = ret;
++
++	return 0;
++}
++
++static int rk_hash_unprepare(struct crypto_engine *engine, void *breq)
++{
++	struct ahash_request *areq = container_of(breq, struct ahash_request, base);
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
++	struct rk_crypto_dev *rkc = rctx->dev;
++
++	dma_unmap_sg(rkc->dev, areq->src, rctx->nrsgs, DMA_TO_DEVICE);
++	return 0;
++}
++
++static int rk_hash_run(struct crypto_engine *engine, void *breq)
++{
++	struct ahash_request *areq = container_of(breq, struct ahash_request, base);
++	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
++	struct rk_ahash_rctx *rctx = ahash_request_ctx(areq);
++	struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg);
++	struct rk_crypto_template *algt = container_of(alg, struct rk_crypto_template, alg.hash);
++	struct scatterlist *sgs = areq->src;
++	struct rk_crypto_dev *rkc = rctx->dev;
++	struct rk_crypto_lli *dd = &rkc->tl[0];
++	int ddi = 0;
++	int err = 0;
++	unsigned int len = areq->nbytes;
++	unsigned int todo;
++	u32 v;
++	int i;
++
++	err = pm_runtime_resume_and_get(rkc->dev);
++	if (err)
++		return err;
++
++	dev_dbg(rkc->dev, "%s %s len=%d\n", __func__,
++		crypto_tfm_alg_name(areq->base.tfm), areq->nbytes);
++
++	algt->stat_req++;
++	rkc->nreq++;
++
++	rctx->mode = algt->rk_mode;
++	rctx->mode |= 0xffff0000;
++	rctx->mode |= RK_CRYPTO_ENABLE | RK_CRYPTO_HW_PAD;
++	writel(rctx->mode, rkc->reg + RK_CRYPTO_HASH_CTL);
++
++	while (sgs && len > 0) {
++		dd = &rkc->tl[ddi];
++
++		todo = min(sg_dma_len(sgs), len);
++		dd->src_addr = sg_dma_address(sgs);
++		dd->src_len = todo;
++		dd->dst_addr = 0;
++		dd->dst_len = 0;
++		dd->dma_ctrl = ddi << 24;
++		dd->iv = 0;
++		dd->next = rkc->t_phy + sizeof(struct rk_crypto_lli) * (ddi + 1);
++
++		if (ddi == 0)
++			dd->user = RK_LLI_CIPHER_START | RK_LLI_STRING_FIRST;
++		else
++			dd->user = 0;
++
++		len -= todo;
++		dd->dma_ctrl |= RK_LLI_DMA_CTRL_SRC_INT;
++		if (len == 0) {
++			dd->user |= RK_LLI_STRING_LAST;
++			dd->dma_ctrl |= RK_LLI_DMA_CTRL_LAST;
++		}
++		dev_dbg(rkc->dev, "HASH SG %d sglen=%d user=%x dma=%x mode=%x len=%d todo=%d phy=%llx\n",
++			ddi, sgs->length, dd->user, dd->dma_ctrl, rctx->mode, len, todo, rkc->t_phy);
++
++		sgs = sg_next(sgs);
++		ddi++;
++	}
++	dd->next = 1;
++	writel(RK_CRYPTO_DMA_INT_LISTDONE | 0x7F, rkc->reg + RK_CRYPTO_DMA_INT_EN);
++
++	writel(rkc->t_phy, rkc->reg + RK_CRYPTO_DMA_LLI_ADDR);
++
++	reinit_completion(&rkc->complete);
++	rkc->status = 0;
++
++	writel(RK_CRYPTO_DMA_CTL_START | 1 << 16, rkc->reg + RK_CRYPTO_DMA_CTL);
++
++	wait_for_completion_interruptible_timeout(&rkc->complete,
++						  msecs_to_jiffies(2000));
++	if (!rkc->status) {
++		dev_err(rkc->dev, "DMA timeout\n");
++		err = -EFAULT;
++		goto theend;
++	}
++
++	readl_poll_timeout_atomic(rkc->reg + RK_CRYPTO_HASH_VALID, v, v == 1,
++				  10, 1000);
++
++	for (i = 0; i < crypto_ahash_digestsize(tfm) / 4; i++) {
++		v = readl(rkc->reg + RK_CRYPTO_HASH_DOUT_0 + i * 4);
++		put_unaligned_le32(be32_to_cpu(v), areq->result + i * 4);
++	}
++
++theend:
++	pm_runtime_put_autosuspend(rkc->dev);
++
++	local_bh_disable();
++	crypto_finalize_hash_request(engine, breq, err);
++	local_bh_enable();
++
++	return 0;
++}
++
++int rk_cra_hash_init(struct crypto_tfm *tfm)
++{
++	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm);
++	const char *alg_name = crypto_tfm_alg_name(tfm);
++	struct ahash_alg *alg = __crypto_ahash_alg(tfm->__crt_alg);
++	struct rk_crypto_template *algt = container_of(alg, struct rk_crypto_template, alg.hash);
++
++	/* for fallback */
++	tctx->fallback_tfm = crypto_alloc_ahash(alg_name, 0,
++						CRYPTO_ALG_NEED_FALLBACK);
++	if (IS_ERR(tctx->fallback_tfm)) {
++		dev_err(algt->dev->dev, "Could not load fallback driver.\n");
++		return PTR_ERR(tctx->fallback_tfm);
++	}
++
++	crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
++				 sizeof(struct rk_ahash_rctx) +
++				 crypto_ahash_reqsize(tctx->fallback_tfm));
++
++	tctx->enginectx.op.do_one_request = rk_hash_run;
++	tctx->enginectx.op.prepare_request = rk_hash_prepare;
++	tctx->enginectx.op.unprepare_request = rk_hash_unprepare;
++
++	return 0;
++}
++
++void rk_cra_hash_exit(struct crypto_tfm *tfm)
++{
++	struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm);
++
++	crypto_free_ahash(tctx->fallback_tfm);
++}
+--- /dev/null
++++ b/drivers/crypto/rockchip/rk3588_crypto_skcipher.c
+@@ -0,0 +1,340 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * hardware cryptographic offloader for rk3568/rk3588 SoC
++ *
++ * Copyright (c) 2022 Corentin Labbe <clabbe@baylibre.com>
++ */
++#include <crypto/scatterwalk.h>
++#include "rk3588_crypto.h"
++
++static int rk_cipher_need_fallback(struct skcipher_request *req)
++{
++	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
++	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
++	struct rk_crypto_template *algt = container_of(alg, struct rk_crypto_template, alg.skcipher);
++	struct scatterlist *sgs, *sgd;
++	unsigned int stodo, dtodo, len;
++	unsigned int bs = crypto_skcipher_blocksize(tfm);
++
++	if (!req->cryptlen)
++		return true;
++
++	len = req->cryptlen;
++	sgs = req->src;
++	sgd = req->dst;
++	while (sgs && sgd) {
++		if (!IS_ALIGNED(sgs->offset, sizeof(u32))) {
++			algt->stat_fb_align++;
++			return true;
++		}
++		if (!IS_ALIGNED(sgd->offset, sizeof(u32))) {
++			algt->stat_fb_align++;
++			return true;
++		}
++		stodo = min(len, sgs->length);
++		if (stodo % bs) {
++			algt->stat_fb_len++;
++			return true;
++		}
++		dtodo = min(len, sgd->length);
++		if (dtodo % bs) {
++			algt->stat_fb_len++;
++			return true;
++		}
++		if (stodo != dtodo) {
++			algt->stat_fb_sgdiff++;
++			return true;
++		}
++		len -= stodo;
++		sgs = sg_next(sgs);
++		sgd = sg_next(sgd);
++	}
++	return false;
++}
++
++static int rk_cipher_fallback(struct skcipher_request *areq)
++{
++	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
++	struct rk_cipher_ctx *op = crypto_skcipher_ctx(tfm);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(areq);
++	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
++	struct rk_crypto_template *algt = container_of(alg, struct rk_crypto_template, alg.skcipher);
++	int err;
++
++	algt->stat_fb++;
++
++	skcipher_request_set_tfm(&rctx->fallback_req, op->fallback_tfm);
++	skcipher_request_set_callback(&rctx->fallback_req, areq->base.flags,
++				      areq->base.complete, areq->base.data);
++	skcipher_request_set_crypt(&rctx->fallback_req, areq->src, areq->dst,
++				   areq->cryptlen, areq->iv);
++	if (rctx->mode & RK_CRYPTO_DEC)
++		err = crypto_skcipher_decrypt(&rctx->fallback_req);
++	else
++		err = crypto_skcipher_encrypt(&rctx->fallback_req);
++	return err;
++}
++
++static int rk_cipher_handle_req(struct skcipher_request *req)
++{
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
++	struct rk_crypto_dev *rkc;
++	struct crypto_engine *engine;
++
++	if (rk_cipher_need_fallback(req))
++		return rk_cipher_fallback(req);
++
++	rkc = get_rk_crypto();
++
++	engine = rkc->engine;
++	rctx->dev = rkc;
++
++	return crypto_transfer_skcipher_request_to_engine(engine, req);
++}
++
++int rk_aes_setkey(struct crypto_skcipher *cipher, const u8 *key,
++		  unsigned int keylen)
++{
++	struct crypto_tfm *tfm = crypto_skcipher_tfm(cipher);
++	struct rk_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
++
++	if (keylen != AES_KEYSIZE_128 && keylen != AES_KEYSIZE_192 &&
++	    keylen != AES_KEYSIZE_256)
++		return -EINVAL;
++	ctx->keylen = keylen;
++	memcpy(ctx->key, key, keylen);
++
++	return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
++}
++
++int rk_aes_ecb_encrypt(struct skcipher_request *req)
++{
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
++
++	rctx->mode = RK_CRYPTO_AES_ECB_MODE;
++	return rk_cipher_handle_req(req);
++}
++
++int rk_aes_ecb_decrypt(struct skcipher_request *req)
++{
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
++
++	rctx->mode = RK_CRYPTO_AES_ECB_MODE | RK_CRYPTO_DEC;
++	return rk_cipher_handle_req(req);
++}
++
++int rk_aes_cbc_encrypt(struct skcipher_request *req)
++{
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
++
++	rctx->mode = RK_CRYPTO_AES_CBC_MODE;
++	return rk_cipher_handle_req(req);
++}
++
++int rk_aes_cbc_decrypt(struct skcipher_request *req)
++{
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
++
++	rctx->mode = RK_CRYPTO_AES_CBC_MODE | RK_CRYPTO_DEC;
++	return rk_cipher_handle_req(req);
++}
++
++static int rk_cipher_run(struct crypto_engine *engine, void *async_req)
++{
++	struct skcipher_request *areq = container_of(async_req, struct skcipher_request, base);
++	struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
++	struct rk_cipher_rctx *rctx = skcipher_request_ctx(areq);
++	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	struct scatterlist *sgs, *sgd;
++	int err = 0;
++	int ivsize = crypto_skcipher_ivsize(tfm);
++	unsigned int len = areq->cryptlen;
++	unsigned int todo;
++	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
++	struct rk_crypto_template *algt = container_of(alg, struct rk_crypto_template, alg.skcipher);
++	struct rk_crypto_dev *rkc = rctx->dev;
++	struct rk_crypto_lli *dd = &rkc->tl[0];
++	u32 m, v;
++	u32 *rkey = (u32 *)ctx->key;
++	u32 *riv = (u32 *)areq->iv;
++	int i;
++	unsigned int offset;
++
++	err = pm_runtime_resume_and_get(rkc->dev);
++	if (err)
++		return err;
++
++	algt->stat_req++;
++	rkc->nreq++;
++
++	m = rctx->mode | RK_CRYPTO_ENABLE;
++	switch (ctx->keylen) {
++	case AES_KEYSIZE_128:
++		m |= RK_CRYPTO_AES_128BIT_key;
++		break;
++	case AES_KEYSIZE_192:
++		m |= RK_CRYPTO_AES_192BIT_key;
++		break;
++	case AES_KEYSIZE_256:
++		m |= RK_CRYPTO_AES_256BIT_key;
++		break;
++	}
++	/* the upper bits are a write enable mask, so we need to write 1 to all
++	 * upper 16 bits to allow write to the 16 lower bits
++	 */
++	m |= 0xffff0000;
++
++	dev_dbg(rkc->dev, "%s %s len=%u keylen=%u mode=%x\n", __func__,
++		crypto_tfm_alg_name(areq->base.tfm),
++		areq->cryptlen, ctx->keylen, m);
++	sgs = areq->src;
++	sgd = areq->dst;
++
++	while (sgs && sgd && len) {
++		ivsize = crypto_skcipher_ivsize(tfm);
++		if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) {
++			if (rctx->mode & RK_CRYPTO_DEC) {
++				offset = sgs->length - ivsize;
++				scatterwalk_map_and_copy(rctx->backup_iv, sgs,
++							 offset, ivsize, 0);
++			}
++		}
++
++		if (sgs == sgd) {
++			err = dma_map_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
++			if (err != 1) {
++				dev_err(rkc->dev, "Invalid sg number %d\n", err);
++				err = -EINVAL;
++				goto theend;
++			}
++		} else {
++			err = dma_map_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
++			if (err != 1) {
++				dev_err(rkc->dev, "Invalid sg number %d\n", err);
++				err = -EINVAL;
++				goto theend;
++			}
++			err = dma_map_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
++			if (err != 1) {
++				dev_err(rkc->dev, "Invalid sg number %d\n", err);
++				err = -EINVAL;
++				dma_unmap_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
++				goto theend;
++			}
++		}
++		err = 0;
++		writel(m, rkc->reg + RK_CRYPTO_BC_CTL);
++
++		for (i = 0; i < ctx->keylen / 4; i++) {
++			v = cpu_to_be32(rkey[i]);
++			writel(v, rkc->reg + RK_CRYPTO_KEY0 + i * 4);
++		}
++
++		if (ivsize) {
++			for (i = 0; i < ivsize / 4; i++)
++				writel(cpu_to_be32(riv[i]),
++				       rkc->reg + RK_CRYPTO_CH0_IV_0 + i * 4);
++			writel(ivsize, rkc->reg + RK_CRYPTO_CH0_IV_LEN);
++		}
++		if (!sgs->length) {
++			sgs = sg_next(sgs);
++			sgd = sg_next(sgd);
++			continue;
++		}
++
++		/* The hw support multiple descriptor, so why this driver use
++		 * only one descritor ?
++		 * Using one descriptor per SG seems the way to do and it works
++		 * but only when doing encryption.
++		 * With decryption it always fail on second descriptor.
++		 * Probably the HW dont know how to use IV.
++		 */
++		todo = min(sg_dma_len(sgs), len);
++		len -= todo;
++		dd->src_addr = sg_dma_address(sgs);
++		dd->src_len = todo;
++		dd->dst_addr = sg_dma_address(sgd);
++		dd->dst_len = todo;
++		dd->iv = 0;
++		dd->next = 1;
++
++		dd->user = RK_LLI_CIPHER_START | RK_LLI_STRING_FIRST | RK_LLI_STRING_LAST;
++		dd->dma_ctrl |= RK_LLI_DMA_CTRL_DST_INT | RK_LLI_DMA_CTRL_LAST;
++
++		writel(RK_CRYPTO_DMA_INT_LISTDONE | 0x7F, rkc->reg + RK_CRYPTO_DMA_INT_EN);
++
++		writel(rkc->t_phy, rkc->reg + RK_CRYPTO_DMA_LLI_ADDR);
++
++		reinit_completion(&rkc->complete);
++		rkc->status = 0;
++
++		writel(RK_CRYPTO_DMA_CTL_START | 1 << 16, rkc->reg + RK_CRYPTO_DMA_CTL);
++
++		wait_for_completion_interruptible_timeout(&rkc->complete,
++							  msecs_to_jiffies(10000));
++		if (sgs == sgd) {
++			dma_unmap_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
++		} else {
++			dma_unmap_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
++			dma_unmap_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
++		}
++
++		if (!rkc->status) {
++			dev_err(rkc->dev, "DMA timeout\n");
++			err = -EFAULT;
++			goto theend;
++		}
++		if (areq->iv && ivsize > 0) {
++			offset = sgd->length - ivsize;
++			if (rctx->mode & RK_CRYPTO_DEC) {
++				memcpy(areq->iv, rctx->backup_iv, ivsize);
++				memzero_explicit(rctx->backup_iv, ivsize);
++			} else {
++				scatterwalk_map_and_copy(areq->iv, sgd, offset,
++							 ivsize, 0);
++			}
++		}
++		sgs = sg_next(sgs);
++		sgd = sg_next(sgd);
++	}
++theend:
++	writel(0xffff0000, rkc->reg + RK_CRYPTO_BC_CTL);
++	pm_runtime_put_autosuspend(rkc->dev);
++
++	local_bh_disable();
++	crypto_finalize_skcipher_request(engine, areq, err);
++	local_bh_enable();
++	return 0;
++}
++
++int rk_cipher_tfm_init(struct crypto_skcipher *tfm)
++{
++	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++	const char *name = crypto_tfm_alg_name(&tfm->base);
++	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
++	struct rk_crypto_template *algt = container_of(alg, struct rk_crypto_template, alg.skcipher);
++
++	ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
++	if (IS_ERR(ctx->fallback_tfm)) {
++		dev_err(algt->dev->dev, "ERROR: Cannot allocate fallback for %s %ld\n",
++			name, PTR_ERR(ctx->fallback_tfm));
++		return PTR_ERR(ctx->fallback_tfm);
++	}
++
++	tfm->reqsize = sizeof(struct rk_cipher_rctx) +
++		crypto_skcipher_reqsize(ctx->fallback_tfm);
++
++	ctx->enginectx.op.do_one_request = rk_cipher_run;
++	ctx->enginectx.op.prepare_request = NULL;
++	ctx->enginectx.op.unprepare_request = NULL;
++
++	return 0;
++}
++
++void rk_cipher_tfm_exit(struct crypto_skcipher *tfm)
++{
++	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
++
++	memzero_explicit(ctx->key, ctx->keylen);
++	crypto_free_skcipher(ctx->fallback_tfm);
++}
diff --git a/target/linux/rockchip/patches-6.0/205-ARM64-dts-rk3568-add-crypto-node.patch b/target/linux/rockchip/patches-6.0/205-ARM64-dts-rk3568-add-crypto-node.patch
new file mode 100644
index 000000000..ca2cfbf87
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/205-ARM64-dts-rk3568-add-crypto-node.patch
@@ -0,0 +1,36 @@
+From 5055f9e39713f9e5303bbcdc3712909a462dd3c2 Mon Sep 17 00:00:00 2001
+From: Corentin Labbe <clabbe@baylibre.com>
+Date: Tue, 27 Sep 2022 08:00:48 +0000
+Subject: [PATCH 5/5] ARM64: dts: rk3568: add crypto node
+
+The rk3568 has a crypto IP handled by the rk3588 crypto driver so adds a
+node for it.
+
+Signed-off-by: Corentin Labbe <clabbe@baylibre.com>
+---
+ arch/arm64/boot/dts/rockchip/rk3568.dtsi | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+@@ -211,6 +211,20 @@
+ 		};
+ 	};
+ 
++	crypto: crypto@fe380000 {
++		compatible = "rockchip,rk3568-crypto";
++		reg = <0x0 0xfe380000 0x0 0x2000>;
++		interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
++		clocks = <&cru ACLK_CRYPTO_NS>, <&cru HCLK_CRYPTO_NS>,
++			 <&cru CLK_CRYPTO_NS_CORE>, <&cru CLK_CRYPTO_NS_PKA>;
++		clock-names = "aclk", "hclk", "sclk", "pka";
++		resets = <&cru SRST_CRYPTO_NS_CORE>, <&cru SRST_A_CRYPTO_NS>,
++			<&cru SRST_H_CRYPTO_NS>, <&cru SRST_CRYPTO_NS_RNG>,
++			<&cru SRST_CRYPTO_NS_PKA>;
++		reset-names = "core", "a", "h", "rng,", "pka";
++		status = "okay";
++	};
++
+ 	combphy0: phy@fe820000 {
+ 		compatible = "rockchip,rk3568-naneng-combphy";
+ 		reg = <0x0 0xfe820000 0x0 0x100>;
diff --git a/target/linux/rockchip/patches-6.0/206-fix-build-crypto.patch b/target/linux/rockchip/patches-6.0/206-fix-build-crypto.patch
new file mode 100644
index 000000000..234e69b56
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/206-fix-build-crypto.patch
@@ -0,0 +1,21 @@
+--- a/drivers/crypto/rockchip/rk3288_crypto.c
++++ b/drivers/crypto/rockchip/rk3288_crypto.c
+@@ -24,18 +24,6 @@ static struct rockchip_ip rocklist = {
+ 	.lock = __SPIN_LOCK_UNLOCKED(rocklist.lock),
+ };
+ 
+-struct rk_crypto_info *get_rk_crypto(void)
+-{
+-	struct rk_crypto_info *first;
+-
+-	spin_lock(&rocklist.lock);
+-	first = list_first_entry_or_null(&rocklist.dev_list,
+-					 struct rk_crypto_info, list);
+-	list_rotate_left(&rocklist.dev_list);
+-	spin_unlock(&rocklist.lock);
+-	return first;
+-}
+-
+ static const struct rk_variant rk3288_variant = {
+ 	.num_clks = 4,
+ 	.rkclks = {
diff --git a/target/linux/rockchip/patches-6.0/211-rockchip-rk3399-Add-support-for-EmbedFire-DoorNet2.patch b/target/linux/rockchip/patches-6.0/211-rockchip-rk3399-Add-support-for-EmbedFire-DoorNet2.patch
new file mode 100644
index 000000000..f32614004
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/211-rockchip-rk3399-Add-support-for-EmbedFire-DoorNet2.patch
@@ -0,0 +1,793 @@
+--- a/arch/arm64/boot/dts/rockchip/Makefile
++++ b/arch/arm64/boot/dts/rockchip/Makefile
+@@ -55,6 +55,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-ro
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4b.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4b-plus.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4c.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-doornet2.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock960.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rockpro64-v2.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rockpro64.dtb
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dts
+@@ -0,0 +1,115 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++
++/dts-v1/;
++#include "rk3399-doornet2.dtsi"
++
++/ {
++	model = "EmbedFire DoorNet2";
++	compatible = "embedfire,doornet2", "rockchip,rk3399";
++
++	aliases {
++		led-boot = &sys_led;
++		led-failsafe = &sys_led;
++		led-running = &sys_led;
++		led-upgrade = &sys_led;
++	};
++
++	/delete-node/ display-subsystem;
++
++	gpio-leds {
++		pinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>;
++
++		/delete-node/ status;
++
++		lan_led: led-lan {
++			gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;
++			label = "green:lan";
++		};
++
++		sys_led: led-sys {
++			gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;
++			label = "red:sys";
++			default-state = "on";
++		};
++
++		wan_led: led-wan {
++			gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;
++			label = "green:wan";
++		};
++	};
++
++	gpio-keys {
++		pinctrl-0 = <&reset_button_pin>;
++
++		/delete-node/ power;
++
++		reset {
++			debounce-interval = <50>;
++			gpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;
++			label = "reset";
++			linux,code = <KEY_RESTART>;
++		};
++	};
++
++	vdd_5v: vdd-5v {
++		compatible = "regulator-fixed";
++		regulator-name = "vdd_5v";
++		regulator-always-on;
++		regulator-boot-on;
++	};
++};
++
++&pcie0 {
++	max-link-speed = <1>;
++	num-lanes = <1>;
++	vpcie3v3-supply = <&vcc3v3_sys>;
++
++	pcie@0 {
++		reg = <0x00000000 0 0 0 0>;
++		#address-cells = <3>;
++		#size-cells = <2>;
++
++		pcie-eth@0,0 {
++			compatible = "realtek,r8168";
++			reg = <0x000000 0 0 0 0>;
++
++			realtek,led-data = <0x870>;
++		};
++	};
++};
++
++&pinctrl {
++	gpio-leds {
++		/delete-node/ leds-gpio;
++
++		lan_led_pin: lan-led-pin {
++			rockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++
++		sys_led_pin: sys-led-pin {
++			rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++
++		wan_led_pin: wan-led-pin {
++			rockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++	};
++
++	rockchip-key {
++		/delete-node/ power-key;
++
++		reset_button_pin: reset-button-pin {
++			rockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;
++		};
++	};
++};
++
++&u2phy0_host {
++	phy-supply = <&vdd_5v>;
++};
++
++&vcc3v3_sys {
++	vin-supply = <&vcc5v0_sys>;
++};
++
++
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dtsi
+@@ -0,0 +1,637 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++
++/dts-v1/;
++#include <dt-bindings/input/linux-event-codes.h>
++#include "rk3399.dtsi"
++#include "rk3399-opp.dtsi"
++
++/ {
++	chosen {
++		stdout-path = "serial2:1500000n8";
++	};
++
++	clkin_gmac: external-gmac-clock {
++		compatible = "fixed-clock";
++		clock-frequency = <125000000>;
++		clock-output-names = "clkin_gmac";
++		#clock-cells = <0>;
++	};
++
++	vcc3v3_sys: vcc3v3-sys {
++		compatible = "regulator-fixed";
++		regulator-always-on;
++		regulator-boot-on;
++		regulator-min-microvolt = <3300000>;
++		regulator-max-microvolt = <3300000>;
++		regulator-name = "vcc3v3_sys";
++	};
++
++	vcc5v0_sys: vcc5v0-sys {
++		compatible = "regulator-fixed";
++		regulator-always-on;
++		regulator-boot-on;
++		regulator-min-microvolt = <5000000>;
++		regulator-max-microvolt = <5000000>;
++		regulator-name = "vcc5v0_sys";
++		vin-supply = <&vdd_5v>;
++	};
++
++	/* switched by pmic_sleep */
++	vcc1v8_s3: vcca1v8_s3: vcc1v8-s3 {
++		compatible = "regulator-fixed";
++		regulator-always-on;
++		regulator-boot-on;
++		regulator-min-microvolt = <1800000>;
++		regulator-max-microvolt = <1800000>;
++		regulator-name = "vcc1v8_s3";
++		vin-supply = <&vcc_1v8>;
++	};
++
++	vcc3v0_sd: vcc3v0-sd {
++		compatible = "regulator-fixed";
++		enable-active-high;
++		gpio = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>;
++		pinctrl-names = "default";
++		pinctrl-0 = <&sdmmc0_pwr_h>;
++		regulator-always-on;
++		regulator-min-microvolt = <3000000>;
++		regulator-max-microvolt = <3000000>;
++		regulator-name = "vcc3v0_sd";
++		vin-supply = <&vcc3v3_sys>;
++	};
++
++	vbus_typec: vbus-typec {
++		compatible = "regulator-fixed";
++		regulator-min-microvolt = <5000000>;
++		regulator-max-microvolt = <5000000>;
++		regulator-name = "vbus_typec";
++	};
++
++	gpio-keys {
++		compatible = "gpio-keys";
++		autorepeat;
++		pinctrl-names = "default";
++		pinctrl-0 = <&power_key>;
++
++		power {
++			debounce-interval = <100>;
++			gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>;
++			label = "GPIO Key Power";
++			linux,code = <KEY_POWER>;
++			wakeup-source;
++		};
++	};
++
++	leds: gpio-leds {
++		compatible = "gpio-leds";
++		pinctrl-names = "default";
++		pinctrl-0 = <&leds_gpio>;
++
++		status {
++			gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;
++			label = "status_led";
++			linux,default-trigger = "heartbeat";
++		};
++	};
++
++	sdio_pwrseq: sdio-pwrseq {
++		compatible = "mmc-pwrseq-simple";
++		clocks = <&rk808 1>;
++		clock-names = "ext_clock";
++		pinctrl-names = "default";
++		pinctrl-0 = <&wifi_reg_on_h>;
++		reset-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>;
++	};
++};
++
++&cpu_b0 {
++	cpu-supply = <&vdd_cpu_b>;
++};
++
++&cpu_b1 {
++	cpu-supply = <&vdd_cpu_b>;
++};
++
++&cpu_l0 {
++	cpu-supply = <&vdd_cpu_l>;
++};
++
++&cpu_l1 {
++	cpu-supply = <&vdd_cpu_l>;
++};
++
++&cpu_l2 {
++	cpu-supply = <&vdd_cpu_l>;
++};
++
++&cpu_l3 {
++	cpu-supply = <&vdd_cpu_l>;
++};
++
++&emmc_phy {
++	status = "okay";
++};
++
++&gmac {
++	assigned-clocks = <&cru SCLK_RMII_SRC>;
++	assigned-clock-parents = <&clkin_gmac>;
++	clock_in_out = "input";
++	phy-supply = <&vcc3v3_s3>;
++	phy-mode = "rgmii";
++	pinctrl-names = "default";
++	pinctrl-0 = <&rgmii_pins>;
++	snps,reset-gpio = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>;
++	snps,reset-active-low;
++	snps,reset-delays-us = <0 100000 50000>;
++	tx_delay = <0x28>;
++	rx_delay = <0x11>;
++	status = "okay";
++};
++
++&gpu {
++	mali-supply = <&vdd_gpu>;
++	status = "okay";
++};
++
++&hdmi {
++	ddc-i2c-bus = <&i2c7>;
++	pinctrl-names = "default";
++	pinctrl-0 = <&hdmi_cec>;
++	status = "okay";
++};
++
++&i2c0 {
++	clock-frequency = <400000>;
++	i2c-scl-rising-time-ns = <160>;
++	i2c-scl-falling-time-ns = <30>;
++	status = "okay";
++
++	vdd_cpu_b: regulator@40 {
++		compatible = "silergy,syr827";
++		reg = <0x40>;
++		fcs,suspend-voltage-selector = <1>;
++		pinctrl-names = "default";
++		pinctrl-0 = <&cpu_b_sleep>;
++		regulator-always-on;
++		regulator-boot-on;
++		regulator-min-microvolt = <712500>;
++		regulator-max-microvolt = <1500000>;
++		regulator-name = "vdd_cpu_b";
++		regulator-ramp-delay = <1000>;
++		vin-supply = <&vcc3v3_sys>;
++
++		regulator-state-mem {
++			regulator-off-in-suspend;
++		};
++	};
++
++	vdd_gpu: regulator@41 {
++		compatible = "silergy,syr828";
++		reg = <0x41>;
++		fcs,suspend-voltage-selector = <1>;
++		pinctrl-names = "default";
++		pinctrl-0 = <&gpu_sleep>;
++		regulator-always-on;
++		regulator-boot-on;
++		regulator-min-microvolt = <712500>;
++		regulator-max-microvolt = <1500000>;
++		regulator-name = "vdd_gpu";
++		regulator-ramp-delay = <1000>;
++		vin-supply = <&vcc3v3_sys>;
++
++		regulator-state-mem {
++			regulator-off-in-suspend;
++		};
++	};
++
++	rk808: pmic@1b {
++		compatible = "rockchip,rk808";
++		reg = <0x1b>;
++		clock-output-names = "xin32k", "rtc_clko_wifi";
++		#clock-cells = <1>;
++		interrupt-parent = <&gpio1>;
++		interrupts = <21 IRQ_TYPE_LEVEL_LOW>;
++		pinctrl-names = "default";
++		pinctrl-0 = <&pmic_int_l>;
++		rockchip,system-power-controller;
++		wakeup-source;
++
++		vcc1-supply = <&vcc3v3_sys>;
++		vcc2-supply = <&vcc3v3_sys>;
++		vcc3-supply = <&vcc3v3_sys>;
++		vcc4-supply = <&vcc3v3_sys>;
++		vcc6-supply = <&vcc3v3_sys>;
++		vcc7-supply = <&vcc3v3_sys>;
++		vcc8-supply = <&vcc3v3_sys>;
++		vcc9-supply = <&vcc3v3_sys>;
++		vcc10-supply = <&vcc3v3_sys>;
++		vcc11-supply = <&vcc3v3_sys>;
++		vcc12-supply = <&vcc3v3_sys>;
++		vddio-supply = <&vcc_3v0>;
++
++		regulators {
++			vdd_center: DCDC_REG1 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <750000>;
++				regulator-max-microvolt = <1350000>;
++				regulator-name = "vdd_center";
++				regulator-ramp-delay = <6001>;
++
++				regulator-state-mem {
++					regulator-off-in-suspend;
++				};
++			};
++
++			vdd_cpu_l: DCDC_REG2 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <750000>;
++				regulator-max-microvolt = <1350000>;
++				regulator-name = "vdd_cpu_l";
++				regulator-ramp-delay = <6001>;
++
++				regulator-state-mem {
++					regulator-off-in-suspend;
++				};
++			};
++
++			vcc_ddr: DCDC_REG3 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-name = "vcc_ddr";
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++				};
++			};
++
++			vcc_1v8: DCDC_REG4 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1800000>;
++				regulator-max-microvolt = <1800000>;
++				regulator-name = "vcc_1v8";
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1800000>;
++				};
++			};
++
++			vcc1v8_cam: LDO_REG1 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1800000>;
++				regulator-max-microvolt = <1800000>;
++				regulator-name = "vcc1v8_cam";
++
++				regulator-state-mem {
++					regulator-off-in-suspend;
++				};
++			};
++
++			vcc3v0_touch: LDO_REG2 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <3000000>;
++				regulator-max-microvolt = <3000000>;
++				regulator-name = "vcc3v0_touch";
++
++				regulator-state-mem {
++					regulator-off-in-suspend;
++				};
++			};
++
++			vcc1v8_pmupll: LDO_REG3 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1800000>;
++				regulator-max-microvolt = <1800000>;
++				regulator-name = "vcc1v8_pmupll";
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1800000>;
++				};
++			};
++
++			vcc_sdio: LDO_REG4 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-init-microvolt = <3000000>;
++				regulator-min-microvolt = <1800000>;
++				regulator-max-microvolt = <3300000>;
++				regulator-name = "vcc_sdio";
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <3000000>;
++				};
++			};
++
++			vcca3v0_codec: LDO_REG5 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <3000000>;
++				regulator-max-microvolt = <3000000>;
++				regulator-name = "vcca3v0_codec";
++
++				regulator-state-mem {
++					regulator-off-in-suspend;
++				};
++			};
++
++			vcc_1v5: LDO_REG6 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1500000>;
++				regulator-max-microvolt = <1500000>;
++				regulator-name = "vcc_1v5";
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1500000>;
++				};
++			};
++
++			vcca1v8_codec: LDO_REG7 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1800000>;
++				regulator-max-microvolt = <1800000>;
++				regulator-name = "vcca1v8_codec";
++
++				regulator-state-mem {
++					regulator-off-in-suspend;
++				};
++			};
++
++			vcc_3v0: LDO_REG8 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <3000000>;
++				regulator-max-microvolt = <3000000>;
++				regulator-name = "vcc_3v0";
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <3000000>;
++				};
++			};
++
++			vcc3v3_s3: SWITCH_REG1 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-name = "vcc3v3_s3";
++
++				regulator-state-mem {
++					regulator-off-in-suspend;
++				};
++			};
++
++			vcc3v3_s0: SWITCH_REG2 {
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-name = "vcc3v3_s0";
++
++				regulator-state-mem {
++					regulator-off-in-suspend;
++				};
++			};
++		};
++	};
++};
++
++&i2c1 {
++	clock-frequency = <200000>;
++	i2c-scl-rising-time-ns = <150>;
++	i2c-scl-falling-time-ns = <30>;
++	status = "okay";
++};
++
++&i2c2 {
++	status = "okay";
++};
++
++&i2c7 {
++	status = "okay";
++};
++
++&io_domains {
++	bt656-supply = <&vcc_1v8>;
++	audio-supply = <&vcca1v8_codec>;
++	sdmmc-supply = <&vcc_sdio>;
++	gpio1830-supply = <&vcc_3v0>;
++	status = "okay";
++};
++
++&pcie_phy {
++	assigned-clock-parents = <&cru SCLK_PCIEPHY_REF100M>;
++	assigned-clock-rates = <100000000>;
++	assigned-clocks = <&cru SCLK_PCIEPHY_REF>;
++	status = "okay";
++};
++
++&pcie0 {
++	ep-gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_HIGH>;
++	max-link-speed = <2>;
++	num-lanes = <4>;
++	status = "okay";
++};
++
++&pinctrl {
++	fusb30x {
++		fusb0_int: fusb0-int {
++			rockchip,pins = <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>;
++		};
++	};
++
++	gpio-leds {
++		leds_gpio: leds-gpio {
++			rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++	};
++
++	ethernet-phy {
++		eth_phy_reset_pin: eth-phy-reset-pin {
++			rockchip,pins = <3 RK_PB7 RK_FUNC_GPIO &pcfg_pull_down>;
++		};
++	};
++
++	pmic {
++		cpu_b_sleep: cpu-b-sleep {
++			rockchip,pins = <1 RK_PC1 RK_FUNC_GPIO &pcfg_pull_down>;
++		};
++
++		gpu_sleep: gpu-sleep {
++			rockchip,pins = <1 RK_PB6 RK_FUNC_GPIO &pcfg_pull_down>;
++		};
++
++		pmic_int_l: pmic-int-l {
++			rockchip,pins = <1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>;
++		};
++	};
++
++	rockchip-key {
++		power_key: power-key {
++			rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>;
++		};
++	};
++
++	sdio {
++		bt_host_wake_l: bt-host-wake-l {
++			rockchip,pins = <0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++
++		bt_reg_on_h: bt-reg-on-h {
++			/* external pullup to VCC1V8_PMUPLL */
++			rockchip,pins = <0 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++
++		bt_wake_l: bt-wake-l {
++			rockchip,pins = <2 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++
++		wifi_reg_on_h: wifi-reg_on-h {
++			rockchip,pins = <0 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++	};
++
++	sdmmc {
++		sdmmc0_det_l: sdmmc0-det-l {
++			rockchip,pins = <0 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>;
++		};
++
++		sdmmc0_pwr_h: sdmmc0-pwr-h {
++			rockchip,pins = <0 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++	};
++};
++
++&pmu_io_domains {
++	pmu1830-supply = <&vcc_3v0>;
++	status = "okay";
++};
++
++&pwm1 {
++	status = "okay";
++};
++
++&saradc {
++	vref-supply = <&vcca1v8_s3>;
++	status = "okay";
++};
++
++&sdhci {
++	bus-width = <8>;
++	mmc-ddr-1_8v;
++	mmc-hs200-1_8v;
++	non-removable;
++	status = "okay";
++};
++
++&sdmmc {
++	bus-width = <4>;
++	cap-sd-highspeed;
++	cap-mmc-highspeed;
++	cd-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
++	disable-wp;
++	pinctrl-names = "default";
++	pinctrl-0 = <&sdmmc_bus4 &sdmmc_clk &sdmmc_cmd &sdmmc0_det_l>;
++	sd-uhs-sdr104;
++	vmmc-supply = <&vcc3v0_sd>;
++	vqmmc-supply = <&vcc_sdio>;
++	status = "okay";
++};
++
++&tcphy0 {
++	status = "okay";
++};
++
++&tcphy1 {
++	status = "okay";
++};
++
++&tsadc {
++	/* tshut mode 0:CRU 1:GPIO */
++	rockchip,hw-tshut-mode = <1>;
++	/* tshut polarity 0:LOW 1:HIGH */
++	rockchip,hw-tshut-polarity = <1>;
++	status = "okay";
++};
++
++&u2phy0 {
++	status = "okay";
++};
++
++&u2phy0_host {
++	status = "okay";
++};
++
++&u2phy0_otg {
++	status = "okay";
++};
++
++&u2phy1 {
++	status = "okay";
++};
++
++&u2phy1_otg {
++	status = "okay";
++};
++
++&uart2 {
++	status = "okay";
++};
++
++&usbdrd3_0 {
++	status = "okay";
++};
++
++&usbdrd3_1 {
++	status = "okay";
++};
++
++&usbdrd_dwc3_0 {
++	dr_mode = "host";
++	status = "okay";
++};
++
++&usbdrd_dwc3_1 {
++	dr_mode = "host";
++	status = "okay";
++};
++
++&usb_host0_ehci {
++	status = "okay";
++};
++
++&usb_host0_ohci {
++	status = "okay";
++};
++
++&usb_host1_ehci {
++	status = "okay";
++};
++
++&usb_host1_ohci {
++	status = "okay";
++};
++
++&vopb {
++	status = "okay";
++};
++
++&vopb_mmu {
++	status = "okay";
++};
++
++&vopl {
++	status = "okay";
++};
++
++&vopl_mmu {
++	status = "okay";
++};
++
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
+@@ -504,6 +504,11 @@ int stmmac_mdio_register(struct net_devi
+ 		}
+ 	}
+ 
++		stmmac_mdio_write(new_bus,0,31,2627);
++		stmmac_mdio_write(new_bus,0,25,0x1801);
++		stmmac_mdio_write(new_bus,0,31,0);
++		stmmac_mdio_write(new_bus,0,0,0x8000);
++
+ 	if (priv->plat->phy_node || mdio_node)
+ 		goto bus_register_done;
+ 
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+@@ -2900,6 +2900,8 @@ static int stmmac_init_dma_engine(struct
+ 	if (priv->extend_desc && (priv->mode == STMMAC_RING_MODE))
+ 		atds = 1;
+ 
++	msleep(1500);
++
+ 	ret = stmmac_reset(priv, priv->ioaddr);
+ 	if (ret) {
+ 		dev_err(priv->device, "Failed to reset the dma\n");
diff --git a/target/linux/rockchip/patches-6.0/300-rockchip-rk356x-add-support-for-new-boards.patch b/target/linux/rockchip/patches-6.0/300-rockchip-rk356x-add-support-for-new-boards.patch
new file mode 100644
index 000000000..19c0c28de
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/300-rockchip-rk356x-add-support-for-new-boards.patch
@@ -0,0 +1,8 @@
+--- a/arch/arm64/boot/dts/rockchip/Makefile
++++ b/arch/arm64/boot/dts/rockchip/Makefile
+@@ -71,3 +71,5 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-so
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-bpi-r2-pro.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-evb1-v10.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-rock-3a.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-nanopi-r5s.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-doornet1.dtb
diff --git a/target/linux/rockchip/patches-6.0/303-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus-LTS.patch b/target/linux/rockchip/patches-6.0/303-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus-LTS.patch
new file mode 100644
index 000000000..f6547ceef
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/303-rockchip-rk3328-Add-support-for-OrangePi-R1-Plus-LTS.patch
@@ -0,0 +1,79 @@
+--- a/arch/arm64/boot/dts/rockchip/Makefile
++++ b/arch/arm64/boot/dts/rockchip/Makefile
+@@ -12,6 +12,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus-lts.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts
+@@ -0,0 +1,66 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * Copyright (c) 2016 Xunlong Software. Co., Ltd.
++ * (http://www.orangepi.org)
++ *
++ * Copyright (c) 2021 Tianling Shen <cnsztl@immortalwrt.org>
++ */
++
++#include "rk3328-orangepi-r1-plus.dts"
++
++/ {
++	model = "Xunlong Orange Pi R1 Plus LTS";
++	compatible = "xunlong,orangepi-r1-plus-lts", "rockchip,rk3328";
++};
++
++&dmc_opp_table {
++	opp-798000000 {
++		status = "disabled";
++	};
++	opp-840000000 {
++		status = "disabled";
++	};
++	opp-924000000 {
++		status = "disabled";
++	};
++	opp-1056000000 {
++		status = "disabled";
++	};
++};
++
++&gmac2io {
++	phy-handle = <&yt8531c>;
++	tx_delay = <0x19>;
++	rx_delay = <0x05>;
++
++	mdio {
++		/delete-node/ ethernet-phy@1;
++
++		yt8531c: ethernet-phy@0 {
++			compatible = "ethernet-phy-id4f51.e91b",
++				     "ethernet-phy-ieee802.3-c22";
++			reg = <0>;
++			pinctrl-0 = <&eth_phy_reset_pin>;
++			pinctrl-names = "default";
++			reset-assert-us = <15000>;
++			reset-deassert-us = <50000>;
++			reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>;
++		};
++	};
++};
++
++&lan_led {
++	label = "orangepi-r1-plus-lts:green:lan";
++};
++
++&rtl8153 {
++	realtek,led-data = <0x78>;
++};
++
++&sys_led {
++	label = "orangepi-r1-plus-lts:red:sys";
++};
++
++&wan_led {
++	label = "orangepi-r1-plus-lts:green:wan";
++};
diff --git a/target/linux/rockchip/patches-6.0/304-rockchip-rk3328-Add-support-for-FriendlyARM-NanoPi-R.patch b/target/linux/rockchip/patches-6.0/304-rockchip-rk3328-Add-support-for-FriendlyARM-NanoPi-R.patch
new file mode 100644
index 000000000..3cfe4d708
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/304-rockchip-rk3328-Add-support-for-FriendlyARM-NanoPi-R.patch
@@ -0,0 +1,64 @@
+--- a/arch/arm64/boot/dts/rockchip/Makefile
++++ b/arch/arm64/boot/dts/rockchip/Makefile
+@@ -10,6 +10,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3318-a9
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-odroid-go2.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2c.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus-lts.dtb
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2c.dts
+@@ -0,0 +1,51 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * Copyright (c) 2021 FriendlyElec Computer Tech. Co., Ltd.
++ * (http://www.friendlyarm.com)
++ *
++ * Copyright (c) 2021 Tianling Shen <cnsztl@immortalwrt.org>
++ */
++
++/dts-v1/;
++
++#include "rk3328-nanopi-r2s.dts"
++
++/ {
++	model = "FriendlyElec NanoPi R2C";
++	compatible = "friendlyarm,nanopi-r2c", "rockchip,rk3328";
++};
++
++&gmac2io {
++	phy-handle = <&yt8521s>;
++
++	mdio {
++		/delete-node/ ethernet-phy@1;
++
++		yt8521s: ethernet-phy@3 {
++			compatible = "ethernet-phy-id0000.011a",
++				     "ethernet-phy-ieee802.3-c22";
++			reg = <3>;
++			pinctrl-0 = <&eth_phy_reset_pin>;
++			pinctrl-names = "default";
++			reset-assert-us = <10000>;
++			reset-deassert-us = <50000>;
++			reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>;
++		};
++	};
++};
++
++&lan_led {
++	label = "nanopi-r2c:green:lan";
++};
++
++&rtl8153 {
++	realtek,led-data = <0x78>;
++};
++
++&sys_led {
++	label = "nanopi-r2c:red:sys";
++};
++
++&wan_led {
++	label = "nanopi-r2c:green:wan";
++};
diff --git a/target/linux/rockchip/patches-6.0/305-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-Neo3.patch b/target/linux/rockchip/patches-6.0/305-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-Neo3.patch
new file mode 100644
index 000000000..620e28a41
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/305-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-Neo3.patch
@@ -0,0 +1,442 @@
+From 0f989817a4c1d2c3d196d550ff05cda98bc91324 Mon Sep 17 00:00:00 2001
+From: Julian Pidancet <julian@pidancet.net>
+Date: Sun, 23 Jan 2022 16:34:08 +0100
+Subject: [PATCH v2] rockchip: rk3328: add support for FriendlyARM NanoPi NEO3
+
+This patch adds support for FriendlyARM NanoPi NEO3
+
+Soc:      RockChip RK3328
+RAM:      1GB/2GB DDR4
+LAN:      10/100/1000M Ethernet with unique MAC
+USB Host: 1x USB3.0 Type A and 2x USB2.0 on 2.54mm pin header
+MicroSD:  x 1 for system boot and storage
+LED:      Power LED x 1, System LED x 1
+Key:      User Button x 1
+Fan:      2 Pin JST ZH 1.5mm Connector for 5V Fan
+GPIO:     26 pin-header, include I2C, UART, SPI, I2S, GPIO
+Power:    5V/1A, via Type-C or GPIO
+
+Signed-off-by: Julian Pidancet <julian@pidancet.net>
+---
+
+This is another shot at previous work submitted by Marty Jones
+<mj8263788@gmail.com> (https://lore.kernel.org/linux-arm-kernel/20201228152836.02795e09.mj8263788@gmail.com/),
+which is now a year old.
+
+v2: Following up on Robin Murphy's comments, the NEO3 DTS is now
+standalone and no longer includes the nanopi R2S one. The lan_led and
+wan_len nodes have been removed, and the sys_led node has been renamed
+to status_led in accordance with the board schematics.
+
+ arch/arm64/boot/dts/rockchip/Makefile         |   1 +
+ .../boot/dts/rockchip/rk3328-nanopi-neo3.dts  | 396 ++++++++++++++++++
+ 2 files changed, 397 insertions(+)
+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-nanopi-neo3.dts
+
+--- a/arch/arm64/boot/dts/rockchip/Makefile
++++ b/arch/arm64/boot/dts/rockchip/Makefile
+@@ -12,6 +12,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2c.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-neo3.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus-lts.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-neo3.dts
+@@ -0,0 +1,394 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * Copyright (c) 2020 David Bauer <mail@david-bauer.net>
++ * Copyright (c) 2022 Julian Pidancet <julian@pidancet.net>
++ */
++
++/dts-v1/;
++
++#include <dt-bindings/input/input.h>
++#include <dt-bindings/gpio/gpio.h>
++#include "rk3328.dtsi"
++
++/ {
++	model = "FriendlyElec NanoPi NEO3";
++	compatible = "friendlyarm,nanopi-neo3", "rockchip,rk3328";
++
++	aliases {
++		led-boot = &status_led;
++		led-failsafe = &status_led;
++		led-running = &status_led;
++		led-upgrade = &status_led;
++	};
++
++	chosen {
++		stdout-path = "serial2:1500000n8";
++	};
++
++	gmac_clk: gmac-clock {
++		compatible = "fixed-clock";
++		clock-frequency = <125000000>;
++		clock-output-names = "gmac_clkin";
++		#clock-cells = <0>;
++	};
++
++	keys {
++		compatible = "gpio-keys";
++		pinctrl-0 = <&reset_button_pin>;
++		pinctrl-names = "default";
++
++		reset {
++			label = "reset";
++			gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>;
++			linux,code = <KEY_RESTART>;
++			debounce-interval = <50>;
++		};
++	};
++
++	leds {
++		compatible = "gpio-leds";
++		pinctrl-0 = <&status_led_pin>;
++		pinctrl-names = "default";
++
++		status_led: led-0 {
++			gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>;
++			label = "nanopi-neo3:green:status";
++		};
++	};
++
++	vcc_io_sdio: sdmmcio-regulator {
++		compatible = "regulator-gpio";
++		enable-active-high;
++		gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
++		pinctrl-0 = <&sdio_vcc_pin>;
++		pinctrl-names = "default";
++		regulator-name = "vcc_io_sdio";
++		regulator-always-on;
++		regulator-min-microvolt = <1800000>;
++		regulator-max-microvolt = <3300000>;
++		regulator-settling-time-us = <5000>;
++		regulator-type = "voltage";
++		startup-delay-us = <2000>;
++		states = <1800000 0x1>,
++			 <3300000 0x0>;
++		vin-supply = <&vcc_io_33>;
++	};
++
++	vcc_sd: sdmmc-regulator {
++		compatible = "regulator-fixed";
++		gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;
++		pinctrl-0 = <&sdmmc0m1_pin>;
++		pinctrl-names = "default";
++		regulator-name = "vcc_sd";
++		regulator-boot-on;
++		regulator-min-microvolt = <3300000>;
++		regulator-max-microvolt = <3300000>;
++		vin-supply = <&vcc_io_33>;
++	};
++
++	vdd_5v: vdd-5v {
++		compatible = "regulator-fixed";
++		regulator-name = "vdd_5v";
++		regulator-always-on;
++		regulator-boot-on;
++		regulator-min-microvolt = <5000000>;
++		regulator-max-microvolt = <5000000>;
++	};
++
++	vcc_rtl8153: vcc-rtl8153-regulator {
++		compatible = "regulator-fixed";
++		gpio = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>;
++		pinctrl-names = "default";
++		pinctrl-0 = <&rtl8153_en_drv>;
++		regulator-always-on;
++		regulator-name = "vcc_rtl8153";
++		regulator-min-microvolt = <5000000>;
++		regulator-max-microvolt = <5000000>;
++		enable-active-high;
++	};
++};
++
++&cpu0 {
++	cpu-supply = <&vdd_arm>;
++};
++
++&cpu1 {
++	cpu-supply = <&vdd_arm>;
++};
++
++&cpu2 {
++	cpu-supply = <&vdd_arm>;
++};
++
++&cpu3 {
++	cpu-supply = <&vdd_arm>;
++};
++
++&display_subsystem {
++	status = "disabled";
++};
++
++&gmac2io {
++	assigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>;
++	assigned-clock-parents = <&gmac_clk>, <&gmac_clk>;
++	clock_in_out = "input";
++	phy-handle = <&rtl8211e>;
++	phy-mode = "rgmii";
++	phy-supply = <&vcc_io_33>;
++	pinctrl-0 = <&rgmiim1_pins>;
++	pinctrl-names = "default";
++	rx_delay = <0x18>;
++	snps,aal;
++	tx_delay = <0x24>;
++	status = "okay";
++
++	mdio {
++		compatible = "snps,dwmac-mdio";
++		#address-cells = <1>;
++		#size-cells = <0>;
++
++		rtl8211e: ethernet-phy@1 {
++			reg = <1>;
++			pinctrl-0 = <&eth_phy_reset_pin>;
++			pinctrl-names = "default";
++			reset-assert-us = <10000>;
++			reset-deassert-us = <50000>;
++			reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>;
++		};
++	};
++};
++
++&i2c1 {
++	status = "okay";
++
++	rk805: pmic@18 {
++		compatible = "rockchip,rk805";
++		reg = <0x18>;
++		interrupt-parent = <&gpio1>;
++		interrupts = <24 IRQ_TYPE_LEVEL_LOW>;
++		#clock-cells = <1>;
++		clock-output-names = "xin32k", "rk805-clkout2";
++		gpio-controller;
++		#gpio-cells = <2>;
++		pinctrl-0 = <&pmic_int_l>;
++		pinctrl-names = "default";
++		rockchip,system-power-controller;
++		wakeup-source;
++
++		vcc1-supply = <&vdd_5v>;
++		vcc2-supply = <&vdd_5v>;
++		vcc3-supply = <&vdd_5v>;
++		vcc4-supply = <&vdd_5v>;
++		vcc5-supply = <&vcc_io_33>;
++		vcc6-supply = <&vdd_5v>;
++
++		regulators {
++			vdd_log: DCDC_REG1 {
++				regulator-name = "vdd_log";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <712500>;
++				regulator-max-microvolt = <1450000>;
++				regulator-ramp-delay = <12500>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1000000>;
++				};
++			};
++
++			vdd_arm: DCDC_REG2 {
++				regulator-name = "vdd_arm";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <712500>;
++				regulator-max-microvolt = <1450000>;
++				regulator-ramp-delay = <12500>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <950000>;
++				};
++			};
++
++			vcc_ddr: DCDC_REG3 {
++				regulator-name = "vcc_ddr";
++				regulator-always-on;
++				regulator-boot-on;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++				};
++			};
++
++			vcc_io_33: DCDC_REG4 {
++				regulator-name = "vcc_io_33";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <3300000>;
++				regulator-max-microvolt = <3300000>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <3300000>;
++				};
++			};
++
++			vcc_18: LDO_REG1 {
++				regulator-name = "vcc_18";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1800000>;
++				regulator-max-microvolt = <1800000>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1800000>;
++				};
++			};
++
++			vcc18_emmc: LDO_REG2 {
++				regulator-name = "vcc18_emmc";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1800000>;
++				regulator-max-microvolt = <1800000>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1800000>;
++				};
++			};
++
++			vdd_10: LDO_REG3 {
++				regulator-name = "vdd_10";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1000000>;
++				regulator-max-microvolt = <1000000>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1000000>;
++				};
++			};
++		};
++	};
++};
++
++&io_domains {
++	pmuio-supply = <&vcc_io_33>;
++	vccio1-supply = <&vcc_io_33>;
++	vccio2-supply = <&vcc18_emmc>;
++	vccio3-supply = <&vcc_io_sdio>;
++	vccio4-supply = <&vcc_18>;
++	vccio5-supply = <&vcc_io_33>;
++	vccio6-supply = <&vcc_io_33>;
++	status = "okay";
++};
++
++&pinctrl {
++	button {
++		reset_button_pin: reset-button-pin {
++			rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++	};
++
++	ethernet-phy {
++		eth_phy_reset_pin: eth-phy-reset-pin {
++			rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>;
++		};
++	};
++
++	leds {
++		status_led_pin: status-led-pin {
++			rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++	};
++
++	pmic {
++		pmic_int_l: pmic-int-l {
++			rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>;
++		};
++	};
++
++	sd {
++		sdio_vcc_pin: sdio-vcc-pin {
++			rockchip,pins = <1 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>;
++		};
++	};
++
++	usb {
++		rtl8153_en_drv: rtl8153-en-drv {
++			rockchip,pins = <2 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++	};
++};
++
++&pwm2 {
++	status = "okay";
++};
++
++&sdmmc {
++	bus-width = <4>;
++	cap-sd-highspeed;
++	disable-wp;
++	pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>;
++	pinctrl-names = "default";
++	sd-uhs-sdr12;
++	sd-uhs-sdr25;
++	sd-uhs-sdr50;
++	sd-uhs-sdr104;
++	vmmc-supply = <&vcc_sd>;
++	vqmmc-supply = <&vcc_io_sdio>;
++	status = "okay";
++};
++
++&tsadc {
++	rockchip,hw-tshut-mode = <0>;
++	rockchip,hw-tshut-polarity = <0>;
++	status = "okay";
++};
++
++&u2phy {
++	status = "okay";
++};
++
++&u2phy_host {
++	status = "okay";
++};
++
++&u2phy_otg {
++	status = "okay";
++};
++
++&uart2 {
++	status = "okay";
++};
++
++&usb20_otg {
++	status = "okay";
++	dr_mode = "host";
++};
++
++&usb_host0_ehci {
++	status = "okay";
++};
++
++&usb_host0_ohci {
++	status = "okay";
++};
++
++&usbdrd3 {
++	dr_mode = "host";
++	status = "okay";
++	#address-cells = <1>;
++	#size-cells = <0>;
++
++	usb-eth@2 {
++		compatible = "realtek,rtl8153";
++		reg = <2>;
++
++		realtek,led-data = <0x87>;
++	};
++};
diff --git a/target/linux/rockchip/patches-6.0/306-rockchip-rk3328-Add-support-for-EmbedFire-DoorNet1.patch b/target/linux/rockchip/patches-6.0/306-rockchip-rk3328-Add-support-for-EmbedFire-DoorNet1.patch
new file mode 100644
index 000000000..82cb118f1
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/306-rockchip-rk3328-Add-support-for-EmbedFire-DoorNet1.patch
@@ -0,0 +1,499 @@
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3328-doornet1.dts
+@@ -0,0 +1,495 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * Copyright (c) 2021 EmbedFire <embedfire@embedfire.com>
++ */
++
++/dts-v1/;
++
++#include <dt-bindings/input/input.h>
++#include <dt-bindings/gpio/gpio.h>
++#include "rk3328-dram-default-timing.dtsi"
++#include "rk3328.dtsi"
++
++/ {
++	model = "EmbedFire DoorNet1";
++	compatible = "embedfire,doornet1", "rockchip,rk3328";
++	
++	aliases {
++		led-boot = &sys_led;
++		led-failsafe = &sys_led;
++		led-running = &sys_led;
++		led-upgrade = &sys_led;
++		// mmc1 = &sdmmc;
++		// mmc0 = &emmc;
++	};
++
++	chosen {
++		stdout-path = "serial2:1500000n8";
++	};
++
++	gmac_clk: gmac-clock {
++		compatible = "fixed-clock";
++		clock-frequency = <125000000>;
++		clock-output-names = "gmac_clkin";
++		#clock-cells = <0>;
++	};
++
++	keys {
++		compatible = "gpio-keys";
++		pinctrl-0 = <&reset_button_pin>;
++		pinctrl-names = "default";
++
++		reset {
++			label = "reset";
++			gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>;
++			linux,code = <KEY_RESTART>;
++			debounce-interval = <50>;
++		};
++	};
++
++	vcc_rtl8153: vcc-rtl8153-regulator {
++		compatible = "regulator-fixed";
++		gpio = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>;
++		pinctrl-names = "default";
++		pinctrl-0 = <&rtl8153_en_drv>;
++		regulator-always-on;
++		regulator-name = "vcc_rtl8153";
++		regulator-min-microvolt = <5000000>;
++		regulator-max-microvolt = <5000000>;
++		enable-active-high;
++	};
++
++	dmc: dmc {
++		  	compatible = "rockchip,rk3328-dmc";
++		   	devfreq-events = <&dfi>;
++			center-supply = <&vdd_log>;
++			clocks = <&cru SCLK_DDRCLK>;
++			clock-names = "dmc_clk";
++			operating-points-v2 = <&dmc_opp_table>;
++	    	ddr_timing = <&ddr_timing>;
++			upthreshold = <40>;
++			downdifferential = <20>;
++			auto-min-freq = <786000>;
++			auto-freq-en = <1>;
++			#cooling-cells = <2>;
++			status = "okay";
++
++		ddr_power_model: ddr_power_model {
++			compatible = "ddr_power_model";
++			dynamic-power-coefficient = <120>;
++			static-power-coefficient = <200>;
++			ts = <32000 4700 (-80) 2>;
++			thermal-zone = "soc-thermal";
++		};
++	};
++
++	dmc_opp_table: dmc-opp-table {
++		compatible = "operating-points-v2";
++
++		rockchip,leakage-voltage-sel = <
++			1   10    0
++			11  254   1
++		>;
++		nvmem-cells = <&logic_leakage>;
++		nvmem-cell-names = "ddr_leakage";
++
++		opp-786000000 {
++			opp-hz = /bits/ 64 <786000000>;
++			opp-microvolt = <1075000>;
++			opp-microvolt-L0 = <1075000>;
++			opp-microvolt-L1 = <1050000>;
++		};
++		opp-798000000 {
++			opp-hz = /bits/ 64 <798000000>;
++			opp-microvolt = <1075000>;
++			opp-microvolt-L0 = <1075000>;
++			opp-microvolt-L1 = <1050000>;
++		};
++		opp-840000000 {
++			opp-hz = /bits/ 64 <840000000>;
++			opp-microvolt = <1075000>;
++			opp-microvolt-L0 = <1075000>;
++			opp-microvolt-L1 = <1050000>;
++		};
++		opp-924000000 {
++			opp-hz = /bits/ 64 <924000000>;
++			opp-microvolt = <1100000>;
++			opp-microvolt-L0 = <1100000>;
++			opp-microvolt-L1 = <1075000>;
++		};
++		opp-1056000000 {
++			opp-hz = /bits/ 64 <1056000000>;
++			opp-microvolt = <1175000>;
++			opp-microvolt-L0 = <1175000>;
++			opp-microvolt-L1 = <1150000>;
++		};
++	};
++
++	leds {
++		compatible = "gpio-leds";
++		pinctrl-0 = <&lan_led_pin>,  <&sys_led_pin>, <&wan_led_pin>;
++		pinctrl-names = "default";
++
++		lan_led: led-0 {
++			gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>;
++			label = "doornet1:green:lan";
++		};
++
++		sys_led: led-1 {
++			gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>;
++			label = "doornet1:red:sys";
++		};
++
++		wan_led: led-2 {
++			gpios = <&gpio2 RK_PC2 GPIO_ACTIVE_HIGH>;
++			label = "doornet1:green:wan";
++		};
++		
++		wifi_enable: wifi_enable {
++			gpios = <&gpio2 RK_PC5 GPIO_ACTIVE_HIGH>;
++			label = "wifi-enable";
++		};	
++	};
++
++	vcc_io_sdio: sdmmcio-regulator {
++		compatible = "regulator-gpio";
++		enable-active-high;
++		gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;
++		pinctrl-0 = <&sdio_vcc_pin>;
++		pinctrl-names = "default";
++		regulator-name = "vcc_io_sdio";
++		regulator-always-on;
++		regulator-min-microvolt = <1800000>;
++		regulator-max-microvolt = <3300000>;
++		regulator-settling-time-us = <5000>;
++		regulator-type = "voltage";
++		startup-delay-us = <2000>;
++		states = <1800000 0x1
++			  3300000 0x0>;
++		vin-supply = <&vcc_io_33>;
++	};
++
++	vcc_sd: sdmmc-regulator {
++		compatible = "regulator-fixed";
++		gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;
++		pinctrl-0 = <&sdmmc0m1_pin>;
++		pinctrl-names = "default";
++		regulator-name = "vcc_sd";
++		regulator-boot-on;
++		regulator-min-microvolt = <3300000>;
++		regulator-max-microvolt = <3300000>;
++		vin-supply = <&vcc_io_33>;
++	};
++
++	vdd_5v: vdd-5v {
++		compatible = "regulator-fixed";
++		regulator-name = "vdd_5v";
++		regulator-always-on;
++		regulator-boot-on;
++		regulator-min-microvolt = <5000000>;
++		regulator-max-microvolt = <5000000>;
++	};
++};
++
++&cpu0 {
++	cpu-supply = <&vdd_arm>;
++};
++
++&cpu1 {
++	cpu-supply = <&vdd_arm>;
++};
++
++&cpu2 {
++	cpu-supply = <&vdd_arm>;
++};
++
++&cpu3 {
++	cpu-supply = <&vdd_arm>;
++};
++
++&dfi {
++	status = "okay";
++};
++
++&gmac2io {
++	assigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>;
++	assigned-clock-parents = <&gmac_clk>, <&gmac_clk>;
++	clock_in_out = "input";
++	phy-mode = "rgmii";
++	phy-supply = <&vcc_io_33>;
++	pinctrl-0 = <&rgmiim1_pins>;
++	pinctrl-names = "default";
++	snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>;
++	snps,reset-delays-us = <0 1000000 50000>;
++	snps,reset-active-low;
++	tx_delay = <0x18>;
++	rx_delay = <0x24>;
++	status = "okay";
++};
++
++&i2c1 {
++	status = "okay";
++
++	rk805: pmic@18 {
++		compatible = "rockchip,rk805";
++		reg = <0x18>;
++		interrupt-parent = <&gpio1>;
++		interrupts = <24 IRQ_TYPE_LEVEL_LOW>;
++		#clock-cells = <1>;
++		clock-output-names = "xin32k", "rk805-clkout2";
++		gpio-controller;
++		#gpio-cells = <2>;
++		pinctrl-0 = <&pmic_int_l>;
++		pinctrl-names = "default";
++		rockchip,system-power-controller;
++		wakeup-source;
++
++		vcc1-supply = <&vdd_5v>;
++		vcc2-supply = <&vdd_5v>;
++		vcc3-supply = <&vdd_5v>;
++		vcc4-supply = <&vdd_5v>;
++		vcc5-supply = <&vcc_io_33>;
++		vcc6-supply = <&vdd_5v>;
++
++		regulators {
++			vdd_log: DCDC_REG1 {
++				regulator-name = "vdd_log";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-init-microvolt = <1075000>;
++				regulator-min-microvolt = <712500>;
++				regulator-max-microvolt = <1450000>;
++				regulator-ramp-delay = <12500>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1000000>;
++				};
++			};
++
++			vdd_arm: DCDC_REG2 {
++				regulator-name = "vdd_arm";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-init-microvolt = <1225000>;				
++				regulator-min-microvolt = <712500>;
++				regulator-max-microvolt = <1450000>;
++				regulator-ramp-delay = <12500>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <950000>;
++				};
++			};
++
++			vcc_ddr: DCDC_REG3 {
++				regulator-name = "vcc_ddr";
++				regulator-always-on;
++				regulator-boot-on;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++				};
++			};
++
++			vcc_io_33: DCDC_REG4 {
++				regulator-name = "vcc_io_33";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <3300000>;
++				regulator-max-microvolt = <3300000>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <3300000>;
++				};
++			};
++
++			vcc_18: LDO_REG1 {
++				regulator-name = "vcc_18";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1800000>;
++				regulator-max-microvolt = <1800000>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1800000>;
++				};
++			};
++
++			vcc18_emmc: LDO_REG2 {
++				regulator-name = "vcc18_emmc";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1800000>;
++				regulator-max-microvolt = <1800000>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1800000>;
++				};
++			};
++
++			vdd_10: LDO_REG3 {
++				regulator-name = "vdd_10";
++				regulator-always-on;
++				regulator-boot-on;
++				regulator-min-microvolt = <1000000>;
++				regulator-max-microvolt = <1000000>;
++
++				regulator-state-mem {
++					regulator-on-in-suspend;
++					regulator-suspend-microvolt = <1000000>;
++				};
++			};
++		};
++	};
++        usb {
++                rtl8153_en_drv: rtl8153-en-drv {
++                        rockchip,pins = <2 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>;
++                };
++        };
++};
++
++&io_domains {
++	pmuio-supply = <&vcc_io_33>;
++	vccio1-supply = <&vcc_io_33>;
++	vccio2-supply = <&vcc18_emmc>;
++	vccio3-supply = <&vcc_io_sdio>;
++	vccio4-supply = <&vcc_18>;
++	vccio5-supply = <&vcc_io_33>;
++	vccio6-supply = <&vcc_io_33>;
++	status = "okay";
++};
++
++&pinctrl {
++	button {
++		reset_button_pin: reset-button-pin {
++			rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++	};
++
++	ethernet-phy {
++		eth_phy_reset_pin: eth-phy-reset-pin {
++			rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>;
++		};
++	};
++
++	leds {
++		lan_led_pin: lan-led-pin {
++			rockchip,pins = <2 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++
++		sys_led_pin: sys-led-pin {
++			rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++
++		wan_led_pin: wan-led-pin {
++			rockchip,pins = <2 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>;
++		};
++
++		wifi_pin: wifi_pin{
++			rockchip,pins = <2 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>;
++		};
++	};
++
++	pmic {
++		pmic_int_l: pmic-int-l {
++			rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>;
++		};
++	};
++
++	sd {
++		sdio_vcc_pin: sdio-vcc-pin {
++			rockchip,pins = <1 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>;
++		};
++	};
++};
++
++&pwm2 {
++	status = "okay";
++};
++
++&sdmmc {
++	bus-width = <4>;
++	cap-sd-highspeed;
++	disable-wp;
++	pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>;
++	pinctrl-names = "default";
++	sd-uhs-sdr12;
++	sd-uhs-sdr25;
++	sd-uhs-sdr50;
++	sd-uhs-sdr104;
++	vmmc-supply = <&vcc_sd>;
++	vqmmc-supply = <&vcc_io_sdio>;
++	status = "okay";
++};
++
++&emmc {
++	bus-width = <8>;
++	cap-mmc-highspeed;
++	max-frequency = <150000000>;
++	mmc-ddr-1_8v;
++	mmc-hs200-1_8v;
++	non-removable;
++	pinctrl-names = "default";
++	pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>;
++	vmmc-supply = <&vcc_io_33>;
++	vqmmc-supply = <&vcc18_emmc>;
++	status = "okay";
++};
++
++&tsadc {
++	rockchip,hw-tshut-mode = <0>;
++	rockchip,hw-tshut-polarity = <0>;
++	status = "okay";
++};
++
++&u2phy {
++	status = "okay";
++};
++
++&u2phy_host {
++	status = "okay";
++};
++
++&u2phy_otg {
++	status = "okay";
++};
++
++&uart2 {
++	status = "okay";
++};
++
++&usb20_otg {
++	status = "okay";
++	dr_mode = "host";
++};
++
++&usb_host0_ehci {
++	status = "okay";
++};
++
++&usb_host0_ohci {
++	status = "okay";
++};
++
++&usbdrd3 {
++	status = "okay";
++};
++
++&usbdrd3 {
++	dr_mode = "host";
++	status = "okay";
++	#address-cells = <1>;
++	#size-cells = <0>;
++
++	/* Second port is for USB 3.0 */
++	rtl8153: device@2 {
++		compatible = "usbbda,8153";
++		reg = <2>;
++
++		realtek,led-data = <0x87>;
++	};
++};
+\ No newline at end of file
diff --git a/target/linux/rockchip/patches-6.0/801-char-add-support-for-rockchip-hardware-random-number.patch b/target/linux/rockchip/patches-6.0/801-char-add-support-for-rockchip-hardware-random-number.patch
new file mode 100644
index 000000000..bf479e5f6
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/801-char-add-support-for-rockchip-hardware-random-number.patch
@@ -0,0 +1,45 @@
+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001
+From: wevsty <ty@wevs.org>
+Date: Mon, 24 Aug 2020 02:27:11 +0800
+Subject: [PATCH] char: add support for rockchip hardware random number
+ generator
+
+This patch provides hardware random number generator support for all rockchip SOC.
+
+rockchip-rng.c from  https://github.com/rockchip-linux/kernel/blob/develop-4.4/drivers/char/hw_random/rockchip-rng.c
+
+Signed-off-by: wevsty <ty@wevs.org>
+---
+
+--- a/drivers/char/hw_random/Kconfig
++++ b/drivers/char/hw_random/Kconfig
+@@ -372,6 +372,19 @@ config HW_RANDOM_STM32
+ 
+ 	  If unsure, say N.
+ 
++config HW_RANDOM_ROCKCHIP
++	tristate "Rockchip Random Number Generator support"
++	depends on ARCH_ROCKCHIP
++	default HW_RANDOM
++	help
++	  This driver provides kernel-side support for the Random Number
++	  Generator hardware found on Rockchip cpus.
++
++	  To compile this driver as a module, choose M here: the
++	  module will be called rockchip-rng.
++
++	  If unsure, say Y.
++
+ config HW_RANDOM_PIC32
+ 	tristate "Microchip PIC32 Random Number Generator support"
+ 	depends on HW_RANDOM && MACH_PIC32
+--- a/drivers/char/hw_random/Makefile
++++ b/drivers/char/hw_random/Makefile
+@@ -34,6 +34,7 @@ obj-$(CONFIG_HW_RANDOM_IPROC_RNG200) +=
+ obj-$(CONFIG_HW_RANDOM_ST) += st-rng.o
+ obj-$(CONFIG_HW_RANDOM_XGENE) += xgene-rng.o
+ obj-$(CONFIG_HW_RANDOM_STM32) += stm32-rng.o
++obj-$(CONFIG_HW_RANDOM_ROCKCHIP) += rockchip-rng.o
+ obj-$(CONFIG_HW_RANDOM_PIC32) += pic32-rng.o
+ obj-$(CONFIG_HW_RANDOM_MESON) += meson-rng.o
+ obj-$(CONFIG_HW_RANDOM_CAVIUM) += cavium-rng.o cavium-rng-vf.o
diff --git a/target/linux/rockchip/patches-6.0/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch b/target/linux/rockchip/patches-6.0/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch
new file mode 100644
index 000000000..0b2b93c7d
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/802-arm64-dts-rockchip-add-hardware-random-number-genera.patch
@@ -0,0 +1,69 @@
+From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001
+From: wevsty <ty@wevs.org>
+Date: Mon, 24 Aug 2020 02:27:11 +0800
+Subject: [PATCH] arm64: dts: rockchip: add hardware random number generator
+ for RK3328 and RK3399
+
+Adding Hardware Random Number Generator Resources to the RK3328 and RK3399.
+
+Signed-off-by: wevsty <ty@wevs.org>
+---
+
+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+@@ -279,6 +279,17 @@
+ 		status = "disabled";
+ 	};
+ 
++	rng: rng@ff060000 {
++		compatible = "rockchip,cryptov1-rng";
++		reg = <0x0 0xff060000 0x0 0x4000>;
++
++		clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;
++		clock-names = "clk_crypto", "hclk_crypto";
++		assigned-clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>;
++		assigned-clock-rates = <150000000>, <100000000>;
++		status = "disabled";
++	};
++
+ 	grf: syscon@ff100000 {
+ 		compatible = "rockchip,rk3328-grf", "syscon", "simple-mfd";
+ 		reg = <0x0 0xff100000 0x0 0x1000>;
+--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+@@ -2062,6 +2062,16 @@
+ 		};
+ 	};
+ 
++	rng: rng@ff8b8000 {
++		compatible = "rockchip,cryptov1-rng";
++		reg = <0x0 0xff8b8000 0x0 0x1000>;
++		clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;
++		clock-names = "clk_crypto", "hclk_crypto";
++		assigned-clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>;
++		assigned-clock-rates = <150000000>, <100000000>;
++		status = "okay";
++	};
++
+ 	gpu: gpu@ff9a0000 {
+ 		compatible = "rockchip,rk3399-mali", "arm,mali-t860";
+ 		reg = <0x0 0xff9a0000 0x0 0x10000>;
+--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi
+@@ -225,6 +225,16 @@
+ 		status = "okay";
+ 	};
+ 
++	rng: rng@fe388000 {
++		compatible = "rockchip,cryptov2-rng";
++		reg = <0x0 0xfe388000 0x0 0x2000>;
++		clocks = <&cru CLK_TRNG_NS>, <&cru HCLK_TRNG_NS>;
++		clock-names = "clk_trng", "hclk_trng";
++		resets = <&cru SRST_TRNG_NS>;
++		reset-names = "reset";
++		status = "disabled";
++	};
++
+ 	combphy0: phy@fe820000 {
+ 		compatible = "rockchip,rk3568-naneng-combphy";
+ 		reg = <0x0 0xfe820000 0x0 0x100>;
diff --git a/target/linux/rockchip/patches-6.0/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch b/target/linux/rockchip/patches-6.0/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch
new file mode 100644
index 000000000..d85cd1ce3
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/803-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch
@@ -0,0 +1,44 @@
+From fcd9629c05f373771e85920e1c1d0ab252617878 Mon Sep 17 00:00:00 2001
+From: hmz007 <hmz007@gmail.com>
+Date: Tue, 19 Nov 2019 13:53:25 +0800
+Subject: [PATCH] PM / devfreq: rockchip: add devfreq driver for rk3328 dmc
+
+Signed-off-by: hmz007 <hmz007@gmail.com>
+---
+ drivers/devfreq/Kconfig      |  18 +-
+ drivers/devfreq/Makefile     |   1 +
+ drivers/devfreq/rk3328_dmc.c | 846 +++++++++++++++++++++++++++++++++++
+ 3 files changed, 862 insertions(+), 3 deletions(-)
+ create mode 100644 drivers/devfreq/rk3328_dmc.c
+
+--- a/drivers/devfreq/Kconfig
++++ b/drivers/devfreq/Kconfig
+@@ -130,6 +130,18 @@ config ARM_MEDIATEK_CCI_DEVFREQ
+ 	  buck voltages and update a proper CCI frequency. Use the notification
+ 	  to get the regulator status.
+ 
++config ARM_RK3328_DMC_DEVFREQ
++	tristate "ARM RK3328 DMC DEVFREQ Driver"
++	depends on ARCH_ROCKCHIP
++	select DEVFREQ_EVENT_ROCKCHIP_DFI
++	select DEVFREQ_GOV_SIMPLE_ONDEMAND
++	select PM_DEVFREQ_EVENT
++	select PM_OPP
++	help
++	  This adds the DEVFREQ driver for the RK3328 DMC(Dynamic Memory Controller).
++	  It sets the frequency for the memory controller and reads the usage counts
++	  from hardware.
++
+ config ARM_RK3399_DMC_DEVFREQ
+ 	tristate "ARM RK3399 DMC DEVFREQ Driver"
+ 	depends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \
+--- a/drivers/devfreq/Makefile
++++ b/drivers/devfreq/Makefile
+@@ -12,6 +12,7 @@ obj-$(CONFIG_ARM_EXYNOS_BUS_DEVFREQ)	+=
+ obj-$(CONFIG_ARM_IMX_BUS_DEVFREQ)	+= imx-bus.o
+ obj-$(CONFIG_ARM_IMX8M_DDRC_DEVFREQ)	+= imx8m-ddrc.o
+ obj-$(CONFIG_ARM_MEDIATEK_CCI_DEVFREQ)	+= mtk-cci-devfreq.o
++obj-$(CONFIG_ARM_RK3328_DMC_DEVFREQ)	+= rk3328_dmc.o
+ obj-$(CONFIG_ARM_RK3399_DMC_DEVFREQ)	+= rk3399_dmc.o
+ obj-$(CONFIG_ARM_SUN8I_A33_MBUS_DEVFREQ)	+= sun8i-a33-mbus.o
+ obj-$(CONFIG_ARM_TEGRA_DEVFREQ)		+= tegra30-devfreq.o
diff --git a/target/linux/rockchip/patches-6.0/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch b/target/linux/rockchip/patches-6.0/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch
new file mode 100644
index 000000000..0408a0a73
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/804-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch
@@ -0,0 +1,210 @@
+From ce6d3614888e6358466f0e84e248177a6bca5258 Mon Sep 17 00:00:00 2001
+From: Tang Yun ping <typ@rock-chips.com>
+Date: Thu, 4 May 2017 20:49:58 +0800
+Subject: [PATCH] clk: rockchip: support setting ddr clock via SIP Version 2
+ APIs
+
+commit 764e893ee82321938fc6f4349e9e7caf06a04410 rockchip.
+
+Signed-off-by: Tang Yun ping <typ@rock-chips.com>
+Signed-off-by: hmz007 <hmz007@gmail.com>
+---
+ drivers/clk/rockchip/clk-ddr.c      | 130 ++++++++++++++++++++++++++++
+ drivers/clk/rockchip/clk-rk3328.c   |   7 +-
+ drivers/clk/rockchip/clk.h          |   3 +-
+ include/soc/rockchip/rockchip_sip.h |  11 +++
+ 4 files changed, 147 insertions(+), 4 deletions(-)
+
+--- a/drivers/clk/rockchip/clk-ddr.c
++++ b/drivers/clk/rockchip/clk-ddr.c
+@@ -87,6 +87,133 @@ static const struct clk_ops rockchip_ddr
+ 	.get_parent = rockchip_ddrclk_get_parent,
+ };
+ 
++/* See v4.4/include/dt-bindings/display/rk_fb.h */
++#define SCREEN_NULL			0
++#define SCREEN_HDMI			6
++
++static inline int rk_drm_get_lcdc_type(void)
++{
++	return SCREEN_NULL;
++}
++
++struct share_params {
++	u32 hz;
++	u32 lcdc_type;
++	u32 vop;
++	u32 vop_dclk_mode;
++	u32 sr_idle_en;
++	u32 addr_mcu_el3;
++	/*
++	 * 1: need to wait flag1
++	 * 0: never wait flag1
++	 */
++	u32 wait_flag1;
++	/*
++	 * 1: need to wait flag1
++	 * 0: never wait flag1
++	 */
++	u32 wait_flag0;
++	u32 complt_hwirq;
++	 /* if need, add parameter after */
++};
++
++struct rockchip_ddrclk_data {
++	u32 inited_flag;
++	void __iomem *share_memory;
++};
++
++static struct rockchip_ddrclk_data ddr_data;
++
++static void rockchip_ddrclk_data_init(void)
++{
++	struct arm_smccc_res res;
++
++	arm_smccc_smc(ROCKCHIP_SIP_SHARE_MEM,
++		      1, SHARE_PAGE_TYPE_DDR, 0,
++		      0, 0, 0, 0, &res);
++
++	if (!res.a0) {
++		ddr_data.share_memory = (void __iomem *)ioremap(res.a1, 1<<12);
++		ddr_data.inited_flag = 1;
++	}
++}
++
++static int rockchip_ddrclk_sip_set_rate_v2(struct clk_hw *hw,
++					   unsigned long drate,
++					   unsigned long prate)
++{
++	struct share_params *p;
++	struct arm_smccc_res res;
++
++	if (!ddr_data.inited_flag)
++		rockchip_ddrclk_data_init();
++
++	p = (struct share_params *)ddr_data.share_memory;
++
++	p->hz = drate;
++	p->lcdc_type = rk_drm_get_lcdc_type();
++	p->wait_flag1 = 1;
++	p->wait_flag0 = 1;
++
++	arm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,
++		      SHARE_PAGE_TYPE_DDR, 0,
++		      ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE,
++		      0, 0, 0, 0, &res);
++
++	if ((int)res.a1 == -6) {
++		pr_err("%s: timeout, drate = %lumhz\n", __func__, drate/1000000);
++		/* TODO: rockchip_dmcfreq_wait_complete(); */
++	}
++
++	return res.a0;
++}
++
++static unsigned long rockchip_ddrclk_sip_recalc_rate_v2
++			(struct clk_hw *hw, unsigned long parent_rate)
++{
++	struct arm_smccc_res res;
++
++	arm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,
++		      SHARE_PAGE_TYPE_DDR, 0,
++		      ROCKCHIP_SIP_CONFIG_DRAM_GET_RATE,
++		      0, 0, 0, 0, &res);
++	if (!res.a0)
++		return res.a1;
++	else
++		return 0;
++}
++
++static long rockchip_ddrclk_sip_round_rate_v2(struct clk_hw *hw,
++					      unsigned long rate,
++					      unsigned long *prate)
++{
++	struct share_params *p;
++	struct arm_smccc_res res;
++
++	if (!ddr_data.inited_flag)
++		rockchip_ddrclk_data_init();
++
++	p = (struct share_params *)ddr_data.share_memory;
++
++	p->hz = rate;
++
++	arm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ,
++		      SHARE_PAGE_TYPE_DDR, 0,
++		      ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE,
++		      0, 0, 0, 0, &res);
++	if (!res.a0)
++		return res.a1;
++	else
++		return 0;
++}
++
++static const struct clk_ops rockchip_ddrclk_sip_ops_v2 = {
++	.recalc_rate = rockchip_ddrclk_sip_recalc_rate_v2,
++	.set_rate = rockchip_ddrclk_sip_set_rate_v2,
++	.round_rate = rockchip_ddrclk_sip_round_rate_v2,
++	.get_parent = rockchip_ddrclk_get_parent,
++};
++
+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,
+ 					 const char *const *parent_names,
+ 					 u8 num_parents, int mux_offset,
+@@ -114,6 +241,9 @@ struct clk *rockchip_clk_register_ddrclk
+ 	case ROCKCHIP_DDRCLK_SIP:
+ 		init.ops = &rockchip_ddrclk_sip_ops;
+ 		break;
++	case ROCKCHIP_DDRCLK_SIP_V2:
++		init.ops = &rockchip_ddrclk_sip_ops_v2;
++		break;
+ 	default:
+ 		pr_err("%s: unsupported ddrclk type %d\n", __func__, ddr_flag);
+ 		kfree(ddrclk);
+--- a/drivers/clk/rockchip/clk-rk3328.c
++++ b/drivers/clk/rockchip/clk-rk3328.c
+@@ -315,9 +315,10 @@ static struct rockchip_clk_branch rk3328
+ 			RK3328_CLKGATE_CON(14), 1, GFLAGS),
+ 
+ 	/* PD_DDR */
+-	COMPOSITE(0, "clk_ddr", mux_ddrphy_p, CLK_IGNORE_UNUSED,
+-			RK3328_CLKSEL_CON(3), 8, 2, MFLAGS, 0, 3, DFLAGS | CLK_DIVIDER_POWER_OF_TWO,
+-			RK3328_CLKGATE_CON(0), 4, GFLAGS),
++	COMPOSITE_DDRCLK(SCLK_DDRCLK, "sclk_ddrc", mux_ddrphy_p, 0,
++			RK3328_CLKSEL_CON(3), 8, 2, 0, 3,
++			ROCKCHIP_DDRCLK_SIP_V2),
++
+ 	GATE(0, "clk_ddrmsch", "clk_ddr", CLK_IGNORE_UNUSED,
+ 			RK3328_CLKGATE_CON(18), 6, GFLAGS),
+ 	GATE(0, "clk_ddrupctl", "clk_ddr", CLK_IGNORE_UNUSED,
+--- a/drivers/clk/rockchip/clk.h
++++ b/drivers/clk/rockchip/clk.h
+@@ -399,7 +399,8 @@ struct clk *rockchip_clk_register_mmc(co
+  * DDRCLK flags, including method of setting the rate
+  * ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate.
+  */
+-#define ROCKCHIP_DDRCLK_SIP		BIT(0)
++#define ROCKCHIP_DDRCLK_SIP		0x01
++#define ROCKCHIP_DDRCLK_SIP_V2		0x03
+ 
+ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,
+ 					 const char *const *parent_names,
+--- a/include/soc/rockchip/rockchip_sip.h
++++ b/include/soc/rockchip/rockchip_sip.h
+@@ -16,5 +16,16 @@
+ #define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ	0x06
+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM	0x07
+ #define ROCKCHIP_SIP_CONFIG_DRAM_SET_ODT_PD	0x08
++#define ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION	0x08
++
++#define ROCKCHIP_SIP_SHARE_MEM			0x82000009
++
++/* Share mem page types */
++typedef enum {
++    SHARE_PAGE_TYPE_INVALID = 0,
++    SHARE_PAGE_TYPE_UARTDBG,
++    SHARE_PAGE_TYPE_DDR,
++    SHARE_PAGE_TYPE_MAX,
++} share_page_type_t;
+ 
+ #endif
diff --git a/target/linux/rockchip/patches-6.0/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch b/target/linux/rockchip/patches-6.0/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch
new file mode 100644
index 000000000..283e4abd2
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch
@@ -0,0 +1,662 @@
+From 4db93c6dad0c71750b86163df2fdb21c35f00d9a Mon Sep 17 00:00:00 2001
+From: hmz007 <hmz007@gmail.com>
+Date: Tue, 19 Nov 2019 12:49:48 +0800
+Subject: [PATCH] PM / devfreq: rockchip-dfi: add more soc support
+
+Signed-off-by: hmz007 <hmz007@gmail.com>
+---
+ drivers/devfreq/event/rockchip-dfi.c | 554 ++++++++++++++++++++++++---
+ 1 file changed, 505 insertions(+), 49 deletions(-)
+
+--- a/drivers/devfreq/event/rockchip-dfi.c
++++ b/drivers/devfreq/event/rockchip-dfi.c
+@@ -18,25 +18,66 @@
+ #include <linux/list.h>
+ #include <linux/of.h>
+ 
+-#include <soc/rockchip/rk3399_grf.h>
+-
+-#define RK3399_DMC_NUM_CH	2
++#define PX30_PMUGRF_OS_REG2		0x208
+ 
++#define RK3128_GRF_SOC_CON0		0x140
++#define RK3128_GRF_OS_REG1		0x1cc
++#define RK3128_GRF_DFI_WRNUM		0x220
++#define RK3128_GRF_DFI_RDNUM		0x224
++#define RK3128_GRF_DFI_TIMERVAL		0x22c
++#define RK3128_DDR_MONITOR_EN		((1 << (16 + 6)) + (1 << 6))
++#define RK3128_DDR_MONITOR_DISB		((1 << (16 + 6)) + (0 << 6))
++
++#define RK3288_PMU_SYS_REG2		0x9c
++#define RK3288_GRF_SOC_CON4		0x254
++#define RK3288_GRF_SOC_STATUS(n)	(0x280 + (n) * 4)
++#define RK3288_DFI_EN			(0x30003 << 14)
++#define RK3288_DFI_DIS			(0x30000 << 14)
++#define RK3288_LPDDR_SEL		(0x10001 << 13)
++#define RK3288_DDR3_SEL			(0x10000 << 13)
++
++#define RK3328_GRF_OS_REG2		0x5d0
++
++#define RK3368_GRF_DDRC0_CON0		0x600
++#define RK3368_GRF_SOC_STATUS5		0x494
++#define RK3368_GRF_SOC_STATUS6		0x498
++#define RK3368_GRF_SOC_STATUS8		0x4a0
++#define RK3368_GRF_SOC_STATUS9		0x4a4
++#define RK3368_GRF_SOC_STATUS10		0x4a8
++#define RK3368_DFI_EN			(0x30003 << 5)
++#define RK3368_DFI_DIS			(0x30000 << 5)
++
++#define MAX_DMC_NUM_CH			2
++#define READ_DRAMTYPE_INFO(n)		(((n) >> 13) & 0x7)
++#define READ_CH_INFO(n)			(((n) >> 28) & 0x3)
+ /* DDRMON_CTRL */
+-#define DDRMON_CTRL	0x04
+-#define CLR_DDRMON_CTRL	(0x1f0000 << 0)
+-#define LPDDR4_EN	(0x10001 << 4)
+-#define HARDWARE_EN	(0x10001 << 3)
+-#define LPDDR3_EN	(0x10001 << 2)
+-#define SOFTWARE_EN	(0x10001 << 1)
+-#define SOFTWARE_DIS	(0x10000 << 1)
+-#define TIME_CNT_EN	(0x10001 << 0)
++#define DDRMON_CTRL			0x04
++#define CLR_DDRMON_CTRL			(0x3f0000 << 0)
++#define DDR4_EN				(0x10001 << 5)
++#define LPDDR4_EN			(0x10001 << 4)
++#define HARDWARE_EN			(0x10001 << 3)
++#define LPDDR2_3_EN			(0x10001 << 2)
++#define SOFTWARE_EN			(0x10001 << 1)
++#define SOFTWARE_DIS			(0x10000 << 1)
++#define TIME_CNT_EN			(0x10001 << 0)
+ 
+ #define DDRMON_CH0_COUNT_NUM		0x28
+ #define DDRMON_CH0_DFI_ACCESS_NUM	0x2c
+ #define DDRMON_CH1_COUNT_NUM		0x3c
+ #define DDRMON_CH1_DFI_ACCESS_NUM	0x40
+ 
++/* pmu grf */
++#define PMUGRF_OS_REG2			0x308
++
++enum {
++	DDR4 = 0,
++	DDR3 = 3,
++	LPDDR2 = 5,
++	LPDDR3 = 6,
++	LPDDR4 = 7,
++	UNUSED = 0xFF
++};
++
+ struct dmc_usage {
+ 	u32 access;
+ 	u32 total;
+@@ -50,33 +91,261 @@ struct dmc_usage {
+ struct rockchip_dfi {
+ 	struct devfreq_event_dev *edev;
+ 	struct devfreq_event_desc *desc;
+-	struct dmc_usage ch_usage[RK3399_DMC_NUM_CH];
++	struct dmc_usage ch_usage[MAX_DMC_NUM_CH];
+ 	struct device *dev;
+ 	void __iomem *regs;
+ 	struct regmap *regmap_pmu;
++	struct regmap *regmap_grf;
++	struct regmap *regmap_pmugrf;
+ 	struct clk *clk;
++	u32 dram_type;
++	/*
++	 * available mask, 1: available, 0: not available
++	 * each bit represent a channel
++	 */
++	u32 ch_msk;
++};
++
++static void rk3128_dfi_start_hardware_counter(struct devfreq_event_dev *edev)
++{
++	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
++
++	regmap_write(info->regmap_grf,
++		     RK3128_GRF_SOC_CON0,
++		     RK3128_DDR_MONITOR_EN);
++}
++
++static void rk3128_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)
++{
++	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
++
++	regmap_write(info->regmap_grf,
++		     RK3128_GRF_SOC_CON0,
++		     RK3128_DDR_MONITOR_DISB);
++}
++
++static int rk3128_dfi_disable(struct devfreq_event_dev *edev)
++{
++	rk3128_dfi_stop_hardware_counter(edev);
++
++	return 0;
++}
++
++static int rk3128_dfi_enable(struct devfreq_event_dev *edev)
++{
++	rk3128_dfi_start_hardware_counter(edev);
++
++	return 0;
++}
++
++static int rk3128_dfi_set_event(struct devfreq_event_dev *edev)
++{
++	return 0;
++}
++
++static int rk3128_dfi_get_event(struct devfreq_event_dev *edev,
++				struct devfreq_event_data *edata)
++{
++	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
++	unsigned long flags;
++	u32 dfi_wr, dfi_rd, dfi_timer;
++
++	local_irq_save(flags);
++
++	rk3128_dfi_stop_hardware_counter(edev);
++
++	regmap_read(info->regmap_grf, RK3128_GRF_DFI_WRNUM, &dfi_wr);
++	regmap_read(info->regmap_grf, RK3128_GRF_DFI_RDNUM, &dfi_rd);
++	regmap_read(info->regmap_grf, RK3128_GRF_DFI_TIMERVAL, &dfi_timer);
++
++	edata->load_count = (dfi_wr + dfi_rd) * 4;
++	edata->total_count = dfi_timer;
++
++	rk3128_dfi_start_hardware_counter(edev);
++
++	local_irq_restore(flags);
++
++	return 0;
++}
++
++static const struct devfreq_event_ops rk3128_dfi_ops = {
++	.disable = rk3128_dfi_disable,
++	.enable = rk3128_dfi_enable,
++	.get_event = rk3128_dfi_get_event,
++	.set_event = rk3128_dfi_set_event,
++};
++
++static void rk3288_dfi_start_hardware_counter(struct devfreq_event_dev *edev)
++{
++	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
++
++	regmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_EN);
++}
++
++static void rk3288_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)
++{
++	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
++
++	regmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_DIS);
++}
++
++static int rk3288_dfi_disable(struct devfreq_event_dev *edev)
++{
++	rk3288_dfi_stop_hardware_counter(edev);
++
++	return 0;
++}
++
++static int rk3288_dfi_enable(struct devfreq_event_dev *edev)
++{
++	rk3288_dfi_start_hardware_counter(edev);
++
++	return 0;
++}
++
++static int rk3288_dfi_set_event(struct devfreq_event_dev *edev)
++{
++	return 0;
++}
++
++static int rk3288_dfi_get_busier_ch(struct devfreq_event_dev *edev)
++{
++	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
++	u32 tmp, max = 0;
++	u32 i, busier_ch = 0;
++	u32 rd_count, wr_count, total_count;
++
++	rk3288_dfi_stop_hardware_counter(edev);
++
++	/* Find out which channel is busier */
++	for (i = 0; i < MAX_DMC_NUM_CH; i++) {
++		if (!(info->ch_msk & BIT(i)))
++			continue;
++		regmap_read(info->regmap_grf,
++			    RK3288_GRF_SOC_STATUS(11 + i * 4), &wr_count);
++		regmap_read(info->regmap_grf,
++			    RK3288_GRF_SOC_STATUS(12 + i * 4), &rd_count);
++		regmap_read(info->regmap_grf,
++			    RK3288_GRF_SOC_STATUS(14 + i * 4), &total_count);
++		info->ch_usage[i].access = (wr_count + rd_count) * 4;
++		info->ch_usage[i].total = total_count;
++		tmp = info->ch_usage[i].access;
++		if (tmp > max) {
++			busier_ch = i;
++			max = tmp;
++		}
++	}
++	rk3288_dfi_start_hardware_counter(edev);
++
++	return busier_ch;
++}
++
++static int rk3288_dfi_get_event(struct devfreq_event_dev *edev,
++				struct devfreq_event_data *edata)
++{
++	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
++	int busier_ch;
++	unsigned long flags;
++
++	local_irq_save(flags);
++	busier_ch = rk3288_dfi_get_busier_ch(edev);
++	local_irq_restore(flags);
++
++	edata->load_count = info->ch_usage[busier_ch].access;
++	edata->total_count = info->ch_usage[busier_ch].total;
++
++	return 0;
++}
++
++static const struct devfreq_event_ops rk3288_dfi_ops = {
++	.disable = rk3288_dfi_disable,
++	.enable = rk3288_dfi_enable,
++	.get_event = rk3288_dfi_get_event,
++	.set_event = rk3288_dfi_set_event,
++};
++
++static void rk3368_dfi_start_hardware_counter(struct devfreq_event_dev *edev)
++{
++	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
++
++	regmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_EN);
++}
++
++static void rk3368_dfi_stop_hardware_counter(struct devfreq_event_dev *edev)
++{
++	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
++
++	regmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_DIS);
++}
++
++static int rk3368_dfi_disable(struct devfreq_event_dev *edev)
++{
++	rk3368_dfi_stop_hardware_counter(edev);
++
++	return 0;
++}
++
++static int rk3368_dfi_enable(struct devfreq_event_dev *edev)
++{
++	rk3368_dfi_start_hardware_counter(edev);
++
++	return 0;
++}
++
++static int rk3368_dfi_set_event(struct devfreq_event_dev *edev)
++{
++	return 0;
++}
++
++static int rk3368_dfi_get_event(struct devfreq_event_dev *edev,
++				struct devfreq_event_data *edata)
++{
++	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
++	unsigned long flags;
++	u32 dfi0_wr, dfi0_rd, dfi1_wr, dfi1_rd, dfi_timer;
++
++	local_irq_save(flags);
++
++	rk3368_dfi_stop_hardware_counter(edev);
++
++	regmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS5, &dfi0_wr);
++	regmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS6, &dfi0_rd);
++	regmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS9, &dfi1_wr);
++	regmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS10, &dfi1_rd);
++	regmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS8, &dfi_timer);
++
++	edata->load_count = (dfi0_wr + dfi0_rd + dfi1_wr + dfi1_rd) * 2;
++	edata->total_count = dfi_timer;
++
++	rk3368_dfi_start_hardware_counter(edev);
++
++	local_irq_restore(flags);
++
++	return 0;
++}
++
++static const struct devfreq_event_ops rk3368_dfi_ops = {
++	.disable = rk3368_dfi_disable,
++	.enable = rk3368_dfi_enable,
++	.get_event = rk3368_dfi_get_event,
++	.set_event = rk3368_dfi_set_event,
+ };
+ 
+ static void rockchip_dfi_start_hardware_counter(struct devfreq_event_dev *edev)
+ {
+ 	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
+ 	void __iomem *dfi_regs = info->regs;
+-	u32 val;
+-	u32 ddr_type;
+-
+-	/* get ddr type */
+-	regmap_read(info->regmap_pmu, RK3399_PMUGRF_OS_REG2, &val);
+-	ddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) &
+-		    RK3399_PMUGRF_DDRTYPE_MASK;
+ 
+ 	/* clear DDRMON_CTRL setting */
+ 	writel_relaxed(CLR_DDRMON_CTRL, dfi_regs + DDRMON_CTRL);
+ 
+ 	/* set ddr type to dfi */
+-	if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3)
+-		writel_relaxed(LPDDR3_EN, dfi_regs + DDRMON_CTRL);
+-	else if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4)
++	if (info->dram_type == LPDDR3 || info->dram_type == LPDDR2)
++		writel_relaxed(LPDDR2_3_EN, dfi_regs + DDRMON_CTRL);
++	else if (info->dram_type == LPDDR4)
+ 		writel_relaxed(LPDDR4_EN, dfi_regs + DDRMON_CTRL);
++	else if (info->dram_type == DDR4)
++		writel_relaxed(DDR4_EN, dfi_regs + DDRMON_CTRL);
+ 
+ 	/* enable count, use software mode */
+ 	writel_relaxed(SOFTWARE_EN, dfi_regs + DDRMON_CTRL);
+@@ -100,12 +369,22 @@ static int rockchip_dfi_get_busier_ch(st
+ 	rockchip_dfi_stop_hardware_counter(edev);
+ 
+ 	/* Find out which channel is busier */
+-	for (i = 0; i < RK3399_DMC_NUM_CH; i++) {
+-		info->ch_usage[i].access = readl_relaxed(dfi_regs +
+-				DDRMON_CH0_DFI_ACCESS_NUM + i * 20) * 4;
++	for (i = 0; i < MAX_DMC_NUM_CH; i++) {
++		if (!(info->ch_msk & BIT(i)))
++			continue;
++
+ 		info->ch_usage[i].total = readl_relaxed(dfi_regs +
+ 				DDRMON_CH0_COUNT_NUM + i * 20);
+-		tmp = info->ch_usage[i].access;
++
++		/* LPDDR4 BL = 16,other DDR type BL = 8 */
++		tmp = readl_relaxed(dfi_regs +
++				DDRMON_CH0_DFI_ACCESS_NUM + i * 20);
++		if (info->dram_type == LPDDR4)
++			tmp *= 8;
++		else
++			tmp *= 4;
++		info->ch_usage[i].access = tmp;
++
+ 		if (tmp > max) {
+ 			busier_ch = i;
+ 			max = tmp;
+@@ -121,7 +400,8 @@ static int rockchip_dfi_disable(struct d
+ 	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
+ 
+ 	rockchip_dfi_stop_hardware_counter(edev);
+-	clk_disable_unprepare(info->clk);
++	if (info->clk)
++		clk_disable_unprepare(info->clk);
+ 
+ 	return 0;
+ }
+@@ -131,10 +411,13 @@ static int rockchip_dfi_enable(struct de
+ 	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
+ 	int ret;
+ 
+-	ret = clk_prepare_enable(info->clk);
+-	if (ret) {
+-		dev_err(&edev->dev, "failed to enable dfi clk: %d\n", ret);
+-		return ret;
++	if (info->clk) {
++		ret = clk_prepare_enable(info->clk);
++		if (ret) {
++			dev_err(&edev->dev, "failed to enable dfi clk: %d\n",
++				ret);
++			return ret;
++		}
+ 	}
+ 
+ 	rockchip_dfi_start_hardware_counter(edev);
+@@ -151,8 +434,11 @@ static int rockchip_dfi_get_event(struct
+ {
+ 	struct rockchip_dfi *info = devfreq_event_get_drvdata(edev);
+ 	int busier_ch;
++	unsigned long flags;
+ 
++	local_irq_save(flags);
+ 	busier_ch = rockchip_dfi_get_busier_ch(edev);
++	local_irq_restore(flags);
+ 
+ 	edata->load_count = info->ch_usage[busier_ch].access;
+ 	edata->total_count = info->ch_usage[busier_ch].total;
+@@ -167,22 +453,116 @@ static const struct devfreq_event_ops ro
+ 	.set_event = rockchip_dfi_set_event,
+ };
+ 
+-static const struct of_device_id rockchip_dfi_id_match[] = {
+-	{ .compatible = "rockchip,rk3399-dfi" },
+-	{ },
+-};
+-MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);
++static __init int px30_dfi_init(struct platform_device *pdev,
++				  struct rockchip_dfi *data,
++				  struct devfreq_event_desc *desc)
++{
++	struct device_node *np = pdev->dev.of_node, *node;
++	struct resource *res;
++	u32 val;
+ 
+-static int rockchip_dfi_probe(struct platform_device *pdev)
++	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++	data->regs = devm_ioremap_resource(&pdev->dev, res);
++	if (IS_ERR(data->regs))
++		return PTR_ERR(data->regs);
++
++	node = of_parse_phandle(np, "rockchip,pmugrf", 0);
++	if (node) {
++		data->regmap_pmugrf = syscon_node_to_regmap(node);
++		if (IS_ERR(data->regmap_pmugrf))
++			return PTR_ERR(data->regmap_pmugrf);
++	}
++
++	regmap_read(data->regmap_pmugrf, PX30_PMUGRF_OS_REG2, &val);
++	data->dram_type = READ_DRAMTYPE_INFO(val);
++	data->ch_msk = 1;
++	data->clk = NULL;
++
++	desc->ops = &rockchip_dfi_ops;
++
++	return 0;
++}
++
++static __init int rk3128_dfi_init(struct platform_device *pdev,
++				  struct rockchip_dfi *data,
++				  struct devfreq_event_desc *desc)
+ {
+-	struct device *dev = &pdev->dev;
+-	struct rockchip_dfi *data;
+-	struct devfreq_event_desc *desc;
+ 	struct device_node *np = pdev->dev.of_node, *node;
+ 
+-	data = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);
+-	if (!data)
+-		return -ENOMEM;
++	node = of_parse_phandle(np, "rockchip,grf", 0);
++	if (node) {
++		data->regmap_grf = syscon_node_to_regmap(node);
++		if (IS_ERR(data->regmap_grf))
++			return PTR_ERR(data->regmap_grf);
++	}
++
++	desc->ops = &rk3128_dfi_ops;
++
++	return 0;
++}
++
++static __init int rk3288_dfi_init(struct platform_device *pdev,
++				  struct rockchip_dfi *data,
++				  struct devfreq_event_desc *desc)
++{
++	struct device_node *np = pdev->dev.of_node, *node;
++	u32 val;
++
++	node = of_parse_phandle(np, "rockchip,pmu", 0);
++	if (node) {
++		data->regmap_pmu = syscon_node_to_regmap(node);
++		if (IS_ERR(data->regmap_pmu))
++			return PTR_ERR(data->regmap_pmu);
++	}
++
++	node = of_parse_phandle(np, "rockchip,grf", 0);
++	if (node) {
++		data->regmap_grf = syscon_node_to_regmap(node);
++		if (IS_ERR(data->regmap_grf))
++			return PTR_ERR(data->regmap_grf);
++	}
++
++	regmap_read(data->regmap_pmu, RK3288_PMU_SYS_REG2, &val);
++	data->dram_type = READ_DRAMTYPE_INFO(val);
++	data->ch_msk = READ_CH_INFO(val);
++
++	if (data->dram_type == DDR3)
++		regmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,
++			     RK3288_DDR3_SEL);
++	else
++		regmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4,
++			     RK3288_LPDDR_SEL);
++
++	desc->ops = &rk3288_dfi_ops;
++
++	return 0;
++}
++
++static __init int rk3368_dfi_init(struct platform_device *pdev,
++				  struct rockchip_dfi *data,
++				  struct devfreq_event_desc *desc)
++{
++	struct device *dev = &pdev->dev;
++
++	if (!dev->parent || !dev->parent->of_node)
++		return -EINVAL;
++
++	data->regmap_grf = syscon_node_to_regmap(dev->parent->of_node);
++	if (IS_ERR(data->regmap_grf))
++		return PTR_ERR(data->regmap_grf);
++
++	desc->ops = &rk3368_dfi_ops;
++
++	return 0;
++}
++
++static __init int rockchip_dfi_init(struct platform_device *pdev,
++				    struct rockchip_dfi *data,
++				    struct devfreq_event_desc *desc)
++{
++	struct device *dev = &pdev->dev;
++	struct device_node *np = pdev->dev.of_node, *node;
++	u32 val;
+ 
+ 	data->regs = devm_platform_ioremap_resource(pdev, 0);
+ 	if (IS_ERR(data->regs))
+@@ -202,21 +582,97 @@ static int rockchip_dfi_probe(struct pla
+ 		if (IS_ERR(data->regmap_pmu))
+ 			return PTR_ERR(data->regmap_pmu);
+ 	}
+-	data->dev = dev;
++
++	regmap_read(data->regmap_pmu, PMUGRF_OS_REG2, &val);
++	data->dram_type = READ_DRAMTYPE_INFO(val);
++	data->ch_msk = READ_CH_INFO(val);
++
++	desc->ops = &rockchip_dfi_ops;
++
++	return 0;
++}
++
++static __init int rk3328_dfi_init(struct platform_device *pdev,
++				  struct rockchip_dfi *data,
++				  struct devfreq_event_desc *desc)
++{
++	struct device_node *np = pdev->dev.of_node, *node;
++	struct resource *res;
++	u32 val;
++
++	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++	data->regs = devm_ioremap_resource(&pdev->dev, res);
++	if (IS_ERR(data->regs))
++		return PTR_ERR(data->regs);
++
++	node = of_parse_phandle(np, "rockchip,grf", 0);
++	if (node) {
++		data->regmap_grf = syscon_node_to_regmap(node);
++		if (IS_ERR(data->regmap_grf))
++			return PTR_ERR(data->regmap_grf);
++	}
++
++	regmap_read(data->regmap_grf, RK3328_GRF_OS_REG2, &val);
++	data->dram_type = READ_DRAMTYPE_INFO(val);
++	data->ch_msk = 1;
++	data->clk = NULL;
++
++	desc->ops = &rockchip_dfi_ops;
++
++	return 0;
++}
++
++static const struct of_device_id rockchip_dfi_id_match[] = {
++	{ .compatible = "rockchip,px30-dfi", .data = px30_dfi_init },
++	{ .compatible = "rockchip,rk1808-dfi", .data = px30_dfi_init },
++	{ .compatible = "rockchip,rk3128-dfi", .data = rk3128_dfi_init },
++	{ .compatible = "rockchip,rk3288-dfi", .data = rk3288_dfi_init },
++	{ .compatible = "rockchip,rk3328-dfi", .data = rk3328_dfi_init },
++	{ .compatible = "rockchip,rk3368-dfi", .data = rk3368_dfi_init },
++	{ .compatible = "rockchip,rk3399-dfi", .data = rockchip_dfi_init },
++	{ },
++};
++MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match);
++
++static int rockchip_dfi_probe(struct platform_device *pdev)
++{
++	struct device *dev = &pdev->dev;
++	struct rockchip_dfi *data;
++	struct devfreq_event_desc *desc;
++	struct device_node *np = pdev->dev.of_node;
++	const struct of_device_id *match;
++	int (*init)(struct platform_device *pdev, struct rockchip_dfi *data,
++		    struct devfreq_event_desc *desc);
++
++	data = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL);
++	if (!data)
++		return -ENOMEM;
+ 
+ 	desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
+ 	if (!desc)
+ 		return -ENOMEM;
+ 
+-	desc->ops = &rockchip_dfi_ops;
++	match = of_match_node(rockchip_dfi_id_match, pdev->dev.of_node);
++	if (match) {
++		init = match->data;
++		if (init) {
++			if (init(pdev, data, desc))
++				return -EINVAL;
++		} else {
++			return 0;
++		}
++	} else {
++		return 0;
++	}
++
+ 	desc->driver_data = data;
+ 	desc->name = np->name;
+ 	data->desc = desc;
++	data->dev = dev;
+ 
+-	data->edev = devm_devfreq_event_add_edev(&pdev->dev, desc);
++	data->edev = devm_devfreq_event_add_edev(dev, desc);
+ 	if (IS_ERR(data->edev)) {
+-		dev_err(&pdev->dev,
+-			"failed to add devfreq-event device\n");
++		dev_err(dev, "failed to add devfreq-event device\n");
+ 		return PTR_ERR(data->edev);
+ 	}
+ 
diff --git a/target/linux/rockchip/patches-6.0/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch b/target/linux/rockchip/patches-6.0/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch
new file mode 100644
index 000000000..6d8ce8da4
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/806-arm64-dts-rockchip-rk3328-add-dfi-node.patch
@@ -0,0 +1,27 @@
+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001
+From: hmz007 <hmz007@gmail.com>
+Date: Tue, 19 Nov 2019 14:21:51 +0800
+Subject: [PATCH] arm64: dts: rockchip: rk3328: add dfi node
+
+Signed-off-by: hmz007 <hmz007@gmail.com>
+[adjusted commit title]
+Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
+---
+ arch/arm64/boot/dts/rockchip/rk3328.dtsi   |   7 +++++++
+
+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+@@ -1023,6 +1023,13 @@
+ 		status = "disabled";
+ 	};
+ 
++	dfi: dfi@ff790000 {
++		reg = <0x00 0xff790000 0x00 0x400>;
++		compatible = "rockchip,rk3328-dfi";
++		rockchip,grf = <&grf>;
++		status = "disabled";
++	};
++
+ 	gic: interrupt-controller@ff811000 {
+ 		compatible = "arm,gic-400";
+ 		#interrupt-cells = <3>;
diff --git a/target/linux/rockchip/patches-6.0/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-6.0/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch
new file mode 100644
index 000000000..981bc70fb
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/807-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch
@@ -0,0 +1,126 @@
+From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001
+From: hmz007 <hmz007@gmail.com>
+Date: Tue, 19 Nov 2019 14:21:51 +0800
+Subject: [PATCH] arm64: dts: nanopi-r2: add rk3328-dmc relate node
+
+Signed-off-by: hmz007 <hmz007@gmail.com>
+---
+ .../rockchip/rk3328-dram-default-timing.dtsi  | 311 ++++++++++++++++++
+ .../dts/rockchip/rk3328-nanopi-r2-common.dtsi |  85 ++++-
+ include/dt-bindings/clock/rockchip-ddr.h      |  63 ++++
+ include/dt-bindings/memory/rk3328-dram.h      | 159 +++++++++
+ 4 files changed, 617 insertions(+), 1 deletion(-)
+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-dram-default-timing.dtsi
+ create mode 100644 include/dt-bindings/clock/rockchip-ddr.h
+ create mode 100644 include/dt-bindings/memory/rk3328-dram.h
+
+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
+@@ -7,6 +7,7 @@
+ 
+ #include <dt-bindings/input/input.h>
+ #include <dt-bindings/gpio/gpio.h>
++#include "rk3328-dram-default-timing.dtsi"
+ #include "rk3328.dtsi"
+ 
+ / {
+@@ -121,6 +122,72 @@
+ 		regulator-boot-on;
+ 		vin-supply = <&vdd_5v>;
+ 	};
++
++	dmc: dmc {
++		compatible = "rockchip,rk3328-dmc";
++		devfreq-events = <&dfi>;
++		center-supply = <&vdd_log>;
++		clocks = <&cru SCLK_DDRCLK>;
++		clock-names = "dmc_clk";
++		operating-points-v2 = <&dmc_opp_table>;
++		ddr_timing = <&ddr_timing>;
++		upthreshold = <40>;
++		downdifferential = <20>;
++		auto-min-freq = <786000>;
++		auto-freq-en = <0>;
++		#cooling-cells = <2>;
++		status = "okay";
++
++		ddr_power_model: ddr_power_model {
++			compatible = "ddr_power_model";
++			dynamic-power-coefficient = <120>;
++			static-power-coefficient = <200>;
++			ts = <32000 4700 (-80) 2>;
++			thermal-zone = "soc-thermal";
++		};
++	};
++
++	dmc_opp_table: dmc-opp-table {
++		compatible = "operating-points-v2";
++
++		rockchip,leakage-voltage-sel = <
++			1   10    0
++			11  254   1
++		>;
++		nvmem-cells = <&logic_leakage>;
++		nvmem-cell-names = "ddr_leakage";
++
++		opp-786000000 {
++			opp-hz = /bits/ 64 <786000000>;
++			opp-microvolt = <1075000>;
++			opp-microvolt-L0 = <1075000>;
++			opp-microvolt-L1 = <1050000>;
++		};
++		opp-798000000 {
++			opp-hz = /bits/ 64 <798000000>;
++			opp-microvolt = <1075000>;
++			opp-microvolt-L0 = <1075000>;
++			opp-microvolt-L1 = <1050000>;
++		};
++		opp-840000000 {
++			opp-hz = /bits/ 64 <840000000>;
++			opp-microvolt = <1075000>;
++			opp-microvolt-L0 = <1075000>;
++			opp-microvolt-L1 = <1050000>;
++		};
++		opp-924000000 {
++			opp-hz = /bits/ 64 <924000000>;
++			opp-microvolt = <1100000>;
++			opp-microvolt-L0 = <1100000>;
++			opp-microvolt-L1 = <1075000>;
++		};
++		opp-1056000000 {
++			opp-hz = /bits/ 64 <1056000000>;
++			opp-microvolt = <1175000>;
++			opp-microvolt-L0 = <1175000>;
++			opp-microvolt-L1 = <1150000>;
++		};
++	};
+ };
+ 
+ &cpu0 {
+@@ -139,6 +206,10 @@
+ 	cpu-supply = <&vdd_arm>;
+ };
+ 
++&dfi {
++	status = "okay";
++};
++
+ &display_subsystem {
+ 	status = "disabled";
+ };
+@@ -206,6 +277,7 @@
+ 				regulator-name = "vdd_log";
+ 				regulator-always-on;
+ 				regulator-boot-on;
++				regulator-init-microvolt = <1075000>;
+ 				regulator-min-microvolt = <712500>;
+ 				regulator-max-microvolt = <1450000>;
+ 				regulator-ramp-delay = <12500>;
+@@ -220,6 +292,7 @@
+ 				regulator-name = "vdd_arm";
+ 				regulator-always-on;
+ 				regulator-boot-on;
++				regulator-init-microvolt = <1225000>;
+ 				regulator-min-microvolt = <712500>;
+ 				regulator-max-microvolt = <1450000>;
+ 				regulator-ramp-delay = <12500>;
diff --git a/target/linux/rockchip/patches-6.0/808-drv-net-phy-add-JLSemi-jl2xxx-driver.patch b/target/linux/rockchip/patches-6.0/808-drv-net-phy-add-JLSemi-jl2xxx-driver.patch
new file mode 100644
index 000000000..b791c55b5
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/808-drv-net-phy-add-JLSemi-jl2xxx-driver.patch
@@ -0,0 +1,702 @@
+--- a/drivers/net/phy/Kconfig
++++ b/drivers/net/phy/Kconfig
+@@ -272,6 +272,11 @@ config INTEL_XWAY_PHY
+ 	  PEF 7061, PEF 7071 and PEF 7072 or integrated into the Intel
+ 	  SoCs xRX200, xRX300, xRX330, xRX350 and xRX550.
+ 
++config JLSEMI_JL2XX1_PHY
++	tristate "JLSemi JL2XX1 PHYs"
++	help
++	  Currently supports the JLSemi jl2xx1 PHYs.
++
+ config LSI_ET1011C_PHY
+ 	tristate "LSI ET1011C PHY"
+ 	help
+--- a/drivers/net/phy/Makefile
++++ b/drivers/net/phy/Makefile
+@@ -75,6 +75,8 @@ obj-$(CONFIG_DP83TD510_PHY)	+= dp83td510
+ obj-$(CONFIG_FIXED_PHY)		+= fixed_phy.o
+ obj-$(CONFIG_ICPLUS_PHY)	+= icplus.o
+ obj-$(CONFIG_INTEL_XWAY_PHY)	+= intel-xway.o
++obj-$(CONFIG_JLSEMI_JL2XX1_PHY)	+= jl2xx1.o
++jl2xx1-objs                     := jl2xxx.o jl2xxx-core.o
+ obj-$(CONFIG_LSI_ET1011C_PHY)	+= et1011c.o
+ obj-$(CONFIG_LXT_PHY)		+= lxt.o
+ obj-$(CONFIG_MARVELL_10G_PHY)	+= marvell10g.o
+--- /dev/null
++++ b/drivers/net/phy/jl2xxx-core.c
+@@ -0,0 +1,438 @@
++/*
++ * Copyright (C) 2021 JLSemi Corporation
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation version 2.
++ *
++ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
++ * kind, whether express or implied; without even the implied warranty
++ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++#include "jl2xxx-core.h"
++#include <linux/phy.h>
++#include <linux/module.h>
++#include <linux/version.h>
++#include <linux/netdevice.h>
++
++#define RGMII_CTRL_PAGE		171
++#define RGMII_CTRL_REG		17
++#define RGMII_TX_SW_RSTN	BIT(14)
++#define RGMII_ERR_STAS		BIT(3)
++#define RGMII_TX_CTR_EN		BIT(1)
++
++#define RGMII_STATUS_PAGE	166
++#define RGMII_STATUS_REG	18
++
++#define BASIC_PAGE		0
++#define BMCR_REG		0
++#define SOFT_RESET		BIT(15)
++#define SPEED_LSB		BIT(13)
++#define AUTONEG_EN		BIT(12)
++#define SPEED_MSB		BIT(6)
++
++#define DIG_PAGE		201
++#define DIG_REG			17
++#define CLK_10M_EN		BIT(15)
++#define DAC_OUT_SEL_MSB		BIT(1)
++#define DAC_OUT_SEL_LSB		BIT(0)
++
++/************************* Configuration section *************************/
++
++
++/************************* JLSemi iteration code *************************/
++
++/* Patch for version: def2 */
++uint32_t init_data[] = {
++	0x1f00a0, 0x1903f3, 0x1f0012, 0x150100, 0x1f00ad, 0x100000, 0x11e0c6, 0x1f00a0, 0x1903fb, 0x1903fb, 
++    0x1903fb, 0x1903fb, 0x1903fb, 0x1903fb, 0x1903fb, 0x1903fb, 0x1f00ad, 0x110000, 0x120400, 0x130093, 
++    0x140000, 0x150193, 0x160000, 0x170213, 0x180000, 0x12040c, 0x130293, 0x140000, 0x150313, 0x160000, 
++    0x170393, 0x180000, 0x120418, 0x130413, 0x140000, 0x150493, 0x160000, 0x170513, 0x180000, 0x120424, 
++    0x130593, 0x140000, 0x150613, 0x160000, 0x170693, 0x180000, 0x120430, 0x130713, 0x140000, 0x150793, 
++    0x160000, 0x171137, 0x180000, 0x12043c, 0x13006f, 0x140060, 0x15a001, 0x160113, 0x17fd41, 0x18d026, 
++    0x120448, 0x13d406, 0x14d222, 0x1517b7, 0x160800, 0x17aa23, 0x189407, 0x120454, 0x130713, 0x1430f0, 
++    0x1567b7, 0x160800, 0x17a423, 0x1846e7, 0x120460, 0x13a703, 0x14a587, 0x156685, 0x168f55, 0x17ac23, 
++    0x18a4e7, 0x12046c, 0x1367b9, 0x145737, 0x150800, 0x168793, 0x17ef27, 0x182023, 0x120478, 0x1374f7, 
++    0x1407b7, 0x150800, 0x165bfc, 0x17d493, 0x180037, 0x120484, 0x13f493, 0x141f04, 0x15f793, 0x1607f7, 
++    0x178fc5, 0x18c03e, 0x120490, 0x134702, 0x140793, 0x150210, 0x160763, 0x1700f7, 0x180793, 0x12049c, 
++    0x130270, 0x140c63, 0x1530f7, 0x16a001, 0x1707b7, 0x180002, 0x1204a8, 0x138793, 0x146967, 0x15c83e, 
++    0x1617b7, 0x170002, 0x188793, 0x1204b4, 0x13e567, 0x14c43e, 0x1537b7, 0x160002, 0x178793, 0x186867, 
++    0x1204c0, 0x13c23e, 0x1447b7, 0x150002, 0x168793, 0x17e9a7, 0x1866b7, 0x1204cc, 0x130800, 0x14ca3e, 
++    0x15a783, 0x166d86, 0x1775c1, 0x188713, 0x1204d8, 0x130ff5, 0x148ff9, 0x156735, 0x160713, 0x178007, 
++    0x188fd9, 0x1204e4, 0x13ac23, 0x146cf6, 0x15a783, 0x1665c6, 0x175737, 0x180800, 0x1204f0, 0x136611, 
++    0x14f793, 0x15f0f7, 0x16e793, 0x170807, 0x18ae23, 0x1204fc, 0x1364f6, 0x142783, 0x155c47, 0x169bf5, 
++    0x172223, 0x185cf7, 0x120508, 0x13a703, 0x14f5c6, 0x158f51, 0x16ae23, 0x17f4e6, 0x180737, 0x120514, 
++    0x130809, 0x14433c, 0x158fd1, 0x16c33c, 0x170637, 0x180800, 0x120520, 0x134a74, 0x14679d, 0x158793, 
++    0x160e07, 0x179ae1, 0x18e693, 0x12052c, 0x130036, 0x14ca74, 0x154678, 0x1676e1, 0x178693, 0x185006, 
++    0x120538, 0x138ff9, 0x148fd5, 0x1507c2, 0x168f6d, 0x1783c1, 0x188fd9, 0x120544, 0x13c67c, 0x140713, 
++    0x151000, 0x160793, 0x170000, 0x189c23, 0x120550, 0x1324e7, 0x140713, 0x151010, 0x169123, 0x1726e7, 
++    0x18470d, 0x12055c, 0x13c63a, 0x144702, 0x158d23, 0x162407, 0x17a223, 0x182607, 0x120568, 0x130793, 
++    0x140270, 0x150413, 0x160000, 0x171463, 0x1800f7, 0x120574, 0x134789, 0x14c63e, 0x154709, 0x16cc3a, 
++    0x174702, 0x180793, 0x120580, 0x130270, 0x141463, 0x1500f7, 0x16478d, 0x17cc3e, 0x180513, 0x12058c, 
++    0x130000, 0x144792, 0x154581, 0x164485, 0x179782, 0x184018, 0x120598, 0x131775, 0x14e563, 0x1502e4, 
++    0x162703, 0x170a04, 0x181163, 0x1205a4, 0x130297, 0x144818, 0x150563, 0x160097, 0x1747a2, 0x18c804, 
++    0x1205b0, 0x139782, 0x1466b7, 0x150800, 0x16a703, 0x174c46, 0x189b71, 0x1205bc, 0x136713, 0x140027, 
++    0x15a223, 0x164ce6, 0x174783, 0x180fd4, 0x1205c8, 0x13c7b9, 0x142683, 0x151004, 0x164745, 0x179763, 
++    0x1820e6, 0x1205d4, 0x133737, 0x140822, 0x152683, 0x163007, 0x177645, 0x18167d, 0x1205e0, 0x138ef1, 
++    0x142023, 0x1530d7, 0x162683, 0x172807, 0x18e693, 0x1205ec, 0x131006, 0x142023, 0x1528d7, 0x162683, 
++    0x173807, 0x18e693, 0x1205f8, 0x131006, 0x142023, 0x1538d7, 0x162683, 0x174007, 0x18e693, 0x120604, 
++    0x131006, 0x142023, 0x1540d7, 0x162683, 0x174807, 0x18e693, 0x120610, 0x131006, 0x142023, 0x1548d7, 
++    0x1656b7, 0x170800, 0x18a703, 0x12061c, 0x133486, 0x14830d, 0x158b05, 0x16cf01, 0x17a703, 0x185c46, 
++    0x120628, 0x137671, 0x14167d, 0x158f71, 0x166611, 0x17a223, 0x185ce6, 0x120634, 0x138f51, 0x14a223, 
++    0x155ce6, 0x162703, 0x171084, 0x1846b2, 0x120640, 0x131c63, 0x1402d7, 0x153737, 0x160822, 0x172683, 
++    0x182807, 0x12064c, 0x13e693, 0x140016, 0x152023, 0x1628d7, 0x172683, 0x183807, 0x120658, 0x13e693, 
++    0x140016, 0x152023, 0x1638d7, 0x172683, 0x184007, 0x120664, 0x13e693, 0x140016, 0x152023, 0x1640d7, 
++    0x172683, 0x184807, 0x120670, 0x13e693, 0x140016, 0x152023, 0x1648d7, 0x172703, 0x181004, 0x12067c, 
++    0x1346b2, 0x149c63, 0x151ae6, 0x160737, 0x170800, 0x184b78, 0x120688, 0x130693, 0x140ff0, 0x15463d, 
++    0x168b1d, 0x17ce3a, 0x1852b7, 0x120694, 0x130800, 0x144701, 0x154389, 0x16408d, 0x174311, 0x180537, 
++    0x1206a0, 0x130820, 0x141593, 0x150077, 0x1695aa, 0x17418c, 0x184572, 0x1206ac, 0x1305c2, 0x1481c1, 
++    0x1581a9, 0x167763, 0x1700b5, 0x189533, 0x1206b8, 0x1300e4, 0x144513, 0x15fff5, 0x168e69, 0x170537, 
++    0x180800, 0x1206c4, 0x134568, 0x148121, 0x15893d, 0x167463, 0x1702b5, 0x18a583, 0x1206d0, 0x1306c2, 
++    0x140763, 0x151277, 0x160a63, 0x171217, 0x1805c2, 0x1206dc, 0x1381c1, 0x14818d, 0x150d63, 0x161097, 
++    0x178985, 0x180586, 0x1206e8, 0x1395b3, 0x1400b4, 0x15c593, 0x16fff5, 0x178eed, 0x180705, 0x1206f4, 
++    0x1315e3, 0x14fa67, 0x1535b7, 0x160822, 0x17a703, 0x183005, 0x120700, 0x13757d, 0x148a3d, 0x150513, 
++    0x160ff5, 0x178f69, 0x180622, 0x12070c, 0x138e59, 0x14a023, 0x1530c5, 0x168637, 0x170800, 0x185a38, 
++    0x120718, 0x1375c1, 0x14f693, 0x150ff6, 0x168593, 0x170ff5, 0x188f6d, 0x120724, 0x1306a2, 0x148ed9, 
++    0x15da34, 0x164682, 0x170713, 0x180210, 0x120730, 0x139163, 0x140ee6, 0x154711, 0x16e391, 0x17471d, 
++    0x182023, 0x12073c, 0x1310e4, 0x142683, 0x150a04, 0x16471d, 0x179e63, 0x1800e6, 0x120748, 0x136737, 
++    0x140800, 0x152703, 0x164cc7, 0x170693, 0x184000, 0x120754, 0x137713, 0x144807, 0x151463, 0x1600d7, 
++    0x172223, 0x180e04, 0x120760, 0x134018, 0x141163, 0x150497, 0x165703, 0x1700c4, 0x181793, 0x12076c, 
++    0x130117, 0x14db63, 0x150207, 0x168737, 0x170800, 0x184778, 0x120778, 0x137713, 0x140807, 0x15e705, 
++    0x160513, 0x170000, 0x184792, 0x120784, 0x134581, 0x149782, 0x1547a2, 0x164711, 0x17c818, 0x18c004, 
++    0x120790, 0x130d23, 0x140094, 0x150ca3, 0x160004, 0x179782, 0x1856b7, 0x12079c, 0x130800, 0x1442b8, 
++    0x159b71, 0x16c2b8, 0x170513, 0x180000, 0x1207a8, 0x1347d2, 0x149782, 0x154703, 0x162684, 0x1703e3, 
++    0x18de07, 0x1207b4, 0x13bbd9, 0x1407b7, 0x150002, 0x168793, 0x1765c7, 0x18c83e, 0x1207c0, 0x1327b7, 
++    0x140002, 0x158793, 0x16dae7, 0x17c43e, 0x1847b7, 0x1207cc, 0x130002, 0x148793, 0x151427, 0x16c23e, 
++    0x1757b7, 0x180002, 0x1207d8, 0x138793, 0x149867, 0x15b1fd, 0x162683, 0x171504, 0x184709, 0x1207e4, 
++    0x1399e3, 0x14e2e6, 0x1536b7, 0x160822, 0x17a703, 0x183006, 0x1207f0, 0x13663d, 0x148f51, 0x15a023, 
++    0x1630e6, 0x17bd39, 0x18c593, 0x1207fc, 0x130015, 0x14b5dd, 0x158991, 0x1635b3, 0x1700b0, 0x180589, 
++    0x120808, 0x13bdf9, 0x148991, 0x15b593, 0x160015, 0x17bfdd, 0x180737, 0x120814, 0x130800, 0x144f28, 
++    0x15cf89, 0x1647c2, 0x17893d, 0x189782, 0x120820, 0x1347e2, 0x140713, 0x151000, 0x162223, 0x1710e4, 
++    0x182423, 0x12082c, 0x1310f4, 0x14474d, 0x15b729, 0x168111, 0x17b7dd, 0x1814e3, 0x120838, 0x13f097, 
++    0x140737, 0x150800, 0x164770, 0x171713, 0x180106, 0x120844, 0x135d63, 0x140607, 0x1585b7, 0x160800, 
++    0x17a683, 0x180d05, 0x120850, 0x1372c5, 0x147313, 0x1500f6, 0x1612fd, 0x17a703, 0x180d45, 0x12085c, 
++    0x131513, 0x1400c3, 0x15f6b3, 0x160056, 0x178ec9, 0x18757d, 0x120868, 0x130393, 0x140ff5, 0x151293, 
++    0x160083, 0x17f6b3, 0x180076, 0x120874, 0x139b41, 0x148211, 0x15e2b3, 0x160056, 0x171093, 0x180043, 
++    0x120880, 0x137693, 0x140016, 0x156333, 0x160067, 0x170613, 0x187ff5, 0x12088c, 0x139713, 0x1400b6, 
++    0x157633, 0x1600c3, 0x178e59, 0x189513, 0x120898, 0x1300a6, 0x147613, 0x159ff6, 0x169713, 0x170096, 
++    0x188e49, 0x1208a4, 0x13f293, 0x14f0f2, 0x158e59, 0x16e2b3, 0x170012, 0x1806a2, 0x1208b0, 0x137613, 
++    0x14eff6, 0x158e55, 0x16a823, 0x170c55, 0x18aa23, 0x1208bc, 0x130cc5, 0x1480e3, 0x15e807, 0x1646b7, 
++    0x170822, 0x18a703, 0x1208c8, 0x13f006, 0x149b61, 0x156713, 0x160027, 0x17a023, 0x18f0e6, 0x1208d4, 
++    0x13b5ad, 0x140000, 0x150000, 0x160000, 0x170000, 0x180000, 0x110000, 0x120400, 0x104000, 0x1f0000,
++};
++
++int jl2xxx_pre_init(struct phy_device *phydev)
++{
++	int i, j;
++	int regaddr, val;
++	int length = sizeof(init_data)/sizeof(init_data[0]);
++
++	for (i = 0; i < length; i++) {
++		regaddr = ((init_data[i] >> 16) & 0xff);
++		val = (init_data[i] & 0xffff);
++		phy_write(phydev, regaddr, val);
++		if (regaddr == 0x18) {
++			phy_write(phydev, 0x10, 0x8006);
++			for (j = 0; j < 8; j++) {
++				if (phy_read(phydev, 0x10) == 0) {
++					break;
++				}
++			}
++		}
++	}
++
++	return 0;
++}
++
++int enable_wol(struct phy_device *phydev)
++{
++	jlsemi_set_bits(phydev, WOL_CTL_PAGE,
++			WOL_CTL_REG, WOL_EN);
++
++	jlsemi_clear_bits(phydev, WOL_CTL_STAS_PAGE,
++			WOL_CTL_STAS_REG, WOL_CTL_EN);
++
++	return 0;
++}
++
++int disable_wol(struct phy_device *phydev)
++{
++	jlsemi_clear_bits(phydev, WOL_CTL_PAGE,
++			  WOL_CTL_REG, WOL_EN);
++
++	jlsemi_set_bits(phydev, BASIC_PAGE, BMCR_REG, SOFT_RESET);
++	/* wait soft reset complete*/
++	msleep(20);
++
++	return 0;
++}
++
++int setup_wol_low_polarity(struct phy_device *phydev)
++{
++	jlsemi_clear_bits(phydev, WOL_CTL_STAS_PAGE,
++			WOL_CTL_STAS_REG, WOL_POLARITY);
++	return 0;
++}
++
++int setup_wol_high_polarity(struct phy_device *phydev)
++{
++	jlsemi_set_bits(phydev, WOL_CTL_STAS_PAGE,
++			WOL_CTL_STAS_REG, WOL_POLARITY);
++	return 0;
++}
++
++int clear_wol_event(struct phy_device *phydev)
++{
++	jlsemi_set_bits(phydev, WOL_CTL_STAS_PAGE,
++			WOL_CTL_STAS_REG, WOL_EVENT);
++
++	jlsemi_clear_bits(phydev, WOL_CTL_STAS_PAGE,
++			WOL_CTL_STAS_REG, WOL_EVENT);
++	return 0;
++}
++
++int store_mac_addr(struct phy_device *phydev)
++{
++	int err;
++
++	jlsemi_write_page(phydev, WOL_CTL_STAS_PAGE);
++
++	/* Store the device address for the magic packet */
++	err = phy_write(phydev, WOL_MAC_ADDR2_REG,
++			((phydev->attached_dev->dev_addr[0] << 8) |
++			  phydev->attached_dev->dev_addr[1]));
++	if (err < 0)
++		return err;
++	err = phy_write(phydev, WOL_MAC_ADDR1_REG,
++			((phydev->attached_dev->dev_addr[2] << 8) |
++			  phydev->attached_dev->dev_addr[3]));
++	if (err < 0)
++		return err;
++	err = phy_write(phydev, WOL_MAC_ADDR0_REG,
++			((phydev->attached_dev->dev_addr[4] << 8) |
++			  phydev->attached_dev->dev_addr[5]));
++	if (err < 0)
++		return err;
++
++	/* change page to 0 */
++	jlsemi_write_page(phydev, BASIC_PAGE);
++
++	return 0;
++}
++
++int config_phy_info(struct phy_device *phydev,
++		    struct jl2xx1_priv *jl2xx1)
++{
++	int val, major, minor;
++
++	val = phy_read(phydev, 29);
++	if (val < 0)
++		return val;
++
++	major = (val >> 7) & 0x1f;
++	minor = (val >> 0) & 0x7f;
++	/* major enlarge 10 */
++	jl2xx1->sw_info = major * 10 + minor;
++
++	return 0;
++}
++
++/********************** Convenience function for phy **********************/
++
++/**
++ * jlsemi_write_page() - write the page register
++ * @phydev: a pointer to a &struct phy_device
++ * @page: page values
++ */
++int jlsemi_write_page(struct phy_device *phydev, int page)
++{
++	return phy_write(phydev, MII_JLSEMI_PHY_PAGE, page);
++}
++
++/**
++ * jlsemi_read_page() - write the page register
++ * @phydev: a pointer to a &struct phy_device
++ *
++ * Return: get page values at present
++ */
++int jlsemi_read_page(struct phy_device *phydev)
++{
++	return phy_read(phydev, MII_JLSEMI_PHY_PAGE);
++}
++
++/**
++ * __jlsemi_save_page() - save the page value
++ *@phydev: a pointer to a &struct phy_device
++ *
++ * Return: save page value
++ */
++static inline int __jlsemi_save_page(struct phy_device *phydev)
++{
++	return jlsemi_read_page(phydev);
++}
++
++/**
++ * __jlsemi_select_page() - restore the page register
++ * @phydev: a pointer to a &struct phy_device
++ * @page: the page
++ *
++ * Return:
++ * @oldpgae: this is last page value
++ * @ret: if page is change it will return new page value
++ */
++static inline int __jlsemi_select_page(struct phy_device *phydev, int page)
++{
++	int ret, oldpage;
++
++	oldpage = ret = __jlsemi_save_page(phydev);
++	if (ret < 0)
++		return ret;
++
++	if (oldpage != page) {
++		ret = jlsemi_write_page(phydev, page);
++		if (ret < 0)
++			return ret;
++	}
++
++	return oldpage;
++}
++
++/**
++ * __jlsemi_restore_page() - restore the page register
++ * @phydev: a pointer to a &struct phy_device
++ * @oldpage: the old page, return value from __jlsemi_save_page() or
++ * __jlsemi_select_page()
++ * @ret: operation's return code
++ *
++ * Returns:
++ *   @oldpage if it was a negative value, otherwise
++ *   @ret if it was a negative errno value, otherwise
++ *   phy_write_page()'s negative value if it were in error, otherwise
++ *   @ret
++ */
++static inline int __jlsemi_restore_page(struct phy_device *phydev,
++					int oldpage, int ret)
++{
++	int r;
++
++	if (oldpage >= 0) {
++		r = jlsemi_write_page(phydev, oldpage);
++
++		/* Propagate the operation return code if the page write
++		 * was successful.
++		 */
++		if (ret >= 0 && r < 0)
++			ret = r;
++	} else {
++		/* Propagate the phy page selection error code */
++		ret = oldpage;
++	}
++
++	return ret;
++}
++
++/**
++ * __jlsemi_modify_reg() - Convenience function for modifying a PHY register
++ * @phydev: a pointer to a &struct phy_device
++ * @regnum: register number
++ * @mask: bit mask of bits to clear
++ * @set: bit mask of bits to set
++ *
++ * Returns negative errno, 0 if there was no change, and 1 in case of change
++ */
++static inline int __jlsemi_modify_reg(struct phy_device *phydev,
++				      u32 regnum, u16 mask, u16 set)
++{
++	int newval, ret;
++
++	ret = phy_read(phydev, regnum);
++	if (ret < 0)
++		return ret;
++
++	newval = (ret & ~mask) | set;
++	if (newval == ret)
++		return 0;
++
++	ret = phy_write(phydev, regnum, newval);
++
++	return ret < 0 ? ret : 1;
++}
++
++/**
++ * jlsemi_modify_paged_reg() - Function for modifying a paged register
++ * @phydev: a pointer to a &struct phy_device
++ * @page: the page for the phy
++ * @regnum: register number
++ * @mask: bit mask of bits to clear
++ * @set: bit mask of bits to set
++ *
++ * Returns negative errno, 0 if there was no change, and 1 in case of change
++ */
++int jlsemi_modify_paged_reg(struct phy_device *phydev,
++			    int page, u32 regnum,
++			    u16 mask, u16 set)
++{
++	int ret = 0, oldpage;
++
++	oldpage = __jlsemi_select_page(phydev, page);
++	if (oldpage >= 0)
++		ret = __jlsemi_modify_reg(phydev, regnum, mask, set);
++
++	return __jlsemi_restore_page(phydev, oldpage, ret);
++}
++
++/**
++ * jlsemi_set_bits() - Convenience function for setting bits in a PHY register
++ * @phydev: a pointer to a &struct phy_device
++ * @page: the page for the phy
++ * @regnum: register number to write
++ * @val: bits to set
++ */
++int jlsemi_set_bits(struct phy_device *phydev,
++		    int page, u32 regnum, u16 val)
++{
++	return jlsemi_modify_paged_reg(phydev, page, regnum, 0, val);
++}
++
++/**
++ * jlsemi_clear_bits - Convenience function for clearing bits in a PHY register
++ * @phydev: the phy_device struct
++ * @page: the page for the phy
++ * @regnum: register number to write
++ * @val: bits to clear
++ */
++int jlsemi_clear_bits(struct phy_device *phydev,
++		      int page, u32 regnum, u16 val)
++{
++	return jlsemi_modify_paged_reg(phydev, page, regnum, val, 0);
++}
++
++/**
++ * jlsemi_get_bit() - Convenience function for setting bits in a PHY register
++ * @phydev: a pointer to a &struct phy_device
++ * @page: the page for the phy
++ * @regnum: register number to write
++ * @val: bit to get
++ *
++ * Note:
++ * you only get one bit at meanwhile
++ *
++ */
++int jlsemi_get_bit(struct phy_device *phydev,
++		   int page, u32 regnum, u16 val)
++{
++	int ret = 0, oldpage;
++
++	oldpage = __jlsemi_select_page(phydev, page);
++	if (oldpage >= 0)
++	{
++		ret = phy_read(phydev, regnum);
++		if (ret < 0)
++			return ret;
++		ret = ((ret & val) == val) ? 1 : 0;
++	}
++
++	return __jlsemi_restore_page(phydev, oldpage, ret);
++}
+--- /dev/null
++++ b/drivers/net/phy/jl2xxx-core.h
+@@ -0,0 +1,104 @@
++/*
++ * Copyright (C) 2021 JLSemi Corporation
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation version 2.
++ *
++ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
++ * kind, whether express or implied; without even the implied warranty
++ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ */
++#ifndef _JLSEMI_CORE_H
++#define _JLSEMI_CORE_H
++
++#include <linux/phy.h>
++#include <linux/version.h>
++#include <linux/kernel.h>
++
++#define JL2XX1_PHY_ID		0x937c4030
++#define JLSEMI_PHY_ID_MASK	0xfffffff0
++
++#define JL2101_PHY_ID		0x937c4032
++
++#define MII_JLSEMI_PHY_PAGE	0x1f
++
++#define WOL_CTL_PAGE		18
++#define WOL_CTL_REG		21
++#define WOL_CTL_STAS_PAGE	4608
++#define WOL_CTL_STAS_REG	16
++#define WOL_MAC_ADDR2_REG	17
++#define WOL_MAC_ADDR1_REG	18
++#define WOL_MAC_ADDR0_REG	19
++#define WOL_EVENT		BIT(1)
++#define WOL_POLARITY		BIT(14)
++#define WOL_EN			BIT(6)
++#define WOL_CTL_EN		BIT(15)
++
++
++/************************* Configuration section *************************/
++
++#define JLSEMI_WOL_EN		0
++
++
++/************************* JLSemi iteration code *************************/
++struct jl2xx1_priv {
++	u16 sw_info;
++};
++
++int jl2xxx_pre_init(struct phy_device *phydev);
++
++int config_phy_info(struct phy_device *phydev,
++		    struct jl2xx1_priv *jl2xx1);
++
++int check_rgmii(struct phy_device *phydev);
++
++int dis_rgmii_tx_ctrl(struct phy_device *phydev);
++
++int config_suspend(struct phy_device *phydev);
++
++int config_resume(struct phy_device *phydev);
++
++int enable_wol(struct phy_device *phydev);
++
++int disable_wol(struct phy_device *phydev);
++
++int setup_wol_low_polarity(struct phy_device *phydev);
++
++int setup_wol_high_polarity(struct phy_device *phydev);
++
++int clear_wol_event(struct phy_device *phydev);
++
++int store_mac_addr(struct phy_device *phydev);
++
++int software_version(struct phy_device *phydev);
++
++
++/********************** Convenience function for phy **********************/
++
++/* Notice: You should change page 0 when you When you call it after*/
++int jlsemi_write_page(struct phy_device *phydev, int page);
++
++int jlsemi_read_page(struct phy_device *phydev);
++
++int jlsemi_modify_paged_reg(struct phy_device *phydev,
++			    int page, u32 regnum,
++			    u16 mask, u16 set);
++
++int jlsemi_set_bits(struct phy_device *phydev,
++		    int page, u32 regnum, u16 val);
++
++int jlsemi_clear_bits(struct phy_device *phydev,
++		      int page, u32 regnum, u16 val);
++
++int jlsemi_get_bit(struct phy_device *phydev,
++		    int page, u32 regnum, u16 val);
++
++int jlsemi_drivers_register(struct phy_driver *phydrvs, int size);
++
++void jlsemi_drivers_unregister(struct phy_driver *phydrvs, int size);
++
++#endif /* _JLSEMI_CORE_H */
++
+--- /dev/null
++++ b/drivers/net/phy/jl2xxx.c
+@@ -0,0 +1,126 @@
++/*
++ * drivers/net/phy/jlsemi.c
++ *
++ * Driver for JLSemi PHYs
++ *
++ * Author: Gangqiao Kuang <gqkuang@jlsemi.com>
++ *
++ * Copyright (c) 2021 JingLue Semiconductor, Inc.
++ *
++ * This program is free software; you can redistribute  it and/or modify it
++ * under  the terms of  the GNU General  Public License as published by the
++ * Free Software Foundation;  either version 2 of the  License, or (at your
++ * option) any later version.
++ *
++ */
++#include "jl2xxx-core.h"
++#include <linux/phy.h>
++#include <linux/module.h>
++#include <linux/netdevice.h>
++
++
++MODULE_DESCRIPTION("JLSemi PHY driver");
++MODULE_AUTHOR("Gangqiao Kuang");
++MODULE_LICENSE("GPL");
++
++static int jlsemi_probe(struct phy_device *phydev)
++{
++	int err;
++
++	err = jl2xxx_pre_init(phydev);
++
++	/* wait load complete*/
++	msleep(20);
++
++	return (err < 0) ? err : 0;
++}
++
++#if JLSEMI_WOL_EN
++static void jlsemi_get_wol(struct phy_device *phydev,
++			   struct ethtool_wolinfo *wol)
++{
++	int wol_en;
++
++	wol->supported = WAKE_MAGIC;
++	wol->wolopts = 0;
++
++	wol_en = jlsemi_get_bit(phydev, WOL_CTL_PAGE,
++				WOL_CTL_REG, WOL_EN);
++
++	if (wol_en)
++		wol->wolopts |= WAKE_MAGIC;
++}
++
++static int jlsemi_set_wol(struct phy_device *phydev,
++			  struct ethtool_wolinfo *wol)
++{
++	int err;
++
++	if (wol->wolopts & WAKE_MAGIC) {
++		err = enable_wol(phydev);
++		if (err < 0)
++			return err;
++
++		err = clear_wol_event(phydev);
++		if (err < 0)
++			return err;
++
++		err = setup_wol_high_polarity(phydev);
++		if (err < 0)
++			return err;
++
++		err = store_mac_addr(phydev);
++		if (err < 0)
++			return err;
++	} else {
++		err = disable_wol(phydev);
++		if (err < 0)
++			return err;
++
++		err = setup_wol_high_polarity(phydev);
++		if (err < 0)
++			return err;
++
++		err = clear_wol_event(phydev);
++		if (err < 0)
++			return err;
++	}
++
++	return 0;
++}
++#endif
++
++static struct phy_driver jlsemi_driver[] = {
++	{
++		PHY_ID_MATCH_EXACT(JL2101_PHY_ID),
++        	.name           = "JL2101 Gigabit Ethernet",
++        	/* PHY_BASIC_FEATURES */
++		.features	= PHY_GBIT_FEATURES,
++		.probe		= jlsemi_probe,
++		#if JLSEMI_WOL_EN
++		.get_wol	= jlsemi_get_wol,
++		.set_wol	= jlsemi_set_wol,
++		#endif
++	},
++	{
++		PHY_ID_MATCH_MODEL(JL2XX1_PHY_ID),
++        	.name           = "JL2xx1 Gigabit Ethernet",
++        	/* PHY_BASIC_FEATURES */
++		.features	= PHY_GBIT_FEATURES,
++		.probe		= jlsemi_probe,
++		#if JLSEMI_WOL_EN
++		.get_wol	= jlsemi_get_wol,
++		.set_wol	= jlsemi_set_wol,
++		#endif
++	},
++};
++
++module_phy_driver(jlsemi_driver);
++
++static struct mdio_device_id __maybe_unused jlsemi_tbl[] = {
++        { PHY_ID_MATCH_EXACT(JL2101_PHY_ID) },
++        { PHY_ID_MATCH_MODEL(JL2XX1_PHY_ID) },
++        { }
++};
++
++MODULE_DEVICE_TABLE(mdio, jlsemi_tbl);
diff --git a/target/linux/rockchip/patches-6.0/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch b/target/linux/rockchip/patches-6.0/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch
new file mode 100644
index 000000000..315ac0e34
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/991-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch
@@ -0,0 +1,44 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Leonidas P. Papadakos <papadakospan@gmail.com>
+Date: Fri, 1 Mar 2019 21:55:53 +0200
+Subject: [PATCH v2] arm64: dts: rockchip: add more cpu operating points for
+ RK3328
+
+This allows for greater max frequency on rk3328 boards,
+increasing performance.
+
+It has been included in Armbian (a linux distibution for ARM boards)
+for a while now without any reported issues
+
+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1392mhz-opp.patch
+https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1512mhz-opp.patch
+
+Signed-off-by: Leonidas P. Papadakos <papadakospan@gmail.com>
+---
+ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 15 +++++++++++++++
+ 1 files changed, 15 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+@@ -140,6 +140,21 @@
+ 			opp-microvolt = <1300000>;
+ 			clock-latency-ns = <40000>;
+ 		};
++		opp-1392000000 {
++			opp-hz = /bits/ 64 <1392000000>;
++			opp-microvolt = <1350000>;
++			clock-latency-ns = <40000>;
++		};
++		opp-1512000000 {
++			opp-hz = /bits/ 64 <1512000000>;
++			opp-microvolt = <1400000>;
++			clock-latency-ns = <40000>;
++		};
++		opp-1608000000 {
++			opp-hz = /bits/ 64 <1608000000>;
++			opp-microvolt = <1450000>;
++			clock-latency-ns = <40000>;
++		};
+ 	};
+ 
+ 	analog_sound: analog-sound {
diff --git a/target/linux/rockchip/patches-6.0/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz.patch b/target/linux/rockchip/patches-6.0/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz.patch
new file mode 100644
index 000000000..ee8527a2f
--- /dev/null
+++ b/target/linux/rockchip/patches-6.0/992-rockchip-rk3399-overclock-to-2.2-1.8-GHz.patch
@@ -0,0 +1,46 @@
+From 04202df5cb497b1934c95211cf43784ef62245a4 Mon Sep 17 00:00:00 2001
+From: Tianling Shen <cnsztl@immortalwrt.org>
+Date: Mon, 18 Oct 2021 12:47:30 +0800
+Subject: [PATCH] rockchip: rk3399: overclock to 2.2/1.8 GHz
+
+It's stable enough to overclock cpu frequency to 2.2/1.8 GHz,
+and for better performance.
+
+Co-development-by: gzelvis <gzelvis@gmail.com>
+Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
+---
+ arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+--- a/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3399-opp.dtsi
+@@ -33,6 +33,14 @@
+ 			opp-hz = /bits/ 64 <1416000000>;
+ 			opp-microvolt = <1125000 1125000 1250000>;
+ 		};
++		opp06 {
++			opp-hz = /bits/ 64 <1608000000>;
++			opp-microvolt = <1225000>;
++		};
++		opp07 {
++			opp-hz = /bits/ 64 <1800000000>;
++			opp-microvolt = <1275000>;
++		};
+ 	};
+ 
+ 	cluster1_opp: opp-table-1 {
+@@ -72,6 +80,14 @@
+ 			opp-hz = /bits/ 64 <1800000000>;
+ 			opp-microvolt = <1200000 1200000 1250000>;
+ 		};
++		opp08 {
++			opp-hz = /bits/ 64 <2016000000>;
++			opp-microvolt = <1250000>;
++		};
++		opp09 {
++			opp-hz = /bits/ 64 <2208000000>;
++			opp-microvolt = <1325000>;
++		};
+ 	};
+ 
+ 	gpu_opp_table: opp-table-2 {