From 734f9dd8c2b0134c37a716c8f5e9ab4ab90f52be Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Thu, 18 Nov 2021 16:24:16 +0100 Subject: [PATCH 01/63] Update relatek drivers --- r8125/LICENSE | 21 - r8125/Makefile | 56 - r8125/README.md | 8 - r8125/src/Makefile | 184 - r8125/src/Makefile_linux24x | 75 - r8125/src/r8125.h | 2265 --- r8125/src/r8125_dash.h | 261 - r8125/src/r8125_n.c | 14487 ---------------- r8125/src/r8125_ptp.c | 594 - r8125/src/r8125_ptp.h | 81 - r8125/src/r8125_realwow.h | 118 - r8125/src/r8125_rss.c | 484 - r8125/src/r8125_rss.h | 66 - r8125/src/rtl_eeprom.c | 289 - r8125/src/rtl_eeprom.h | 53 - r8125/src/rtltool.c | 359 - r8125/src/rtltool.h | 86 - r8152/Makefile | 55 + ...not_on_list-was-backported-since-ker.patch | 26 + .../100-add-LED-configuration-from-OF.patch | 74 + r8168/Makefile | 54 + ...-r8168-add-LED-configuration-from-OF.patch | 42 + 22 files changed, 251 insertions(+), 19487 deletions(-) delete mode 100644 r8125/LICENSE delete mode 100644 r8125/Makefile delete mode 100644 r8125/README.md delete mode 100644 r8125/src/Makefile delete mode 100644 r8125/src/Makefile_linux24x delete mode 100644 r8125/src/r8125.h delete mode 100644 r8125/src/r8125_dash.h delete mode 100644 r8125/src/r8125_n.c delete mode 100644 r8125/src/r8125_ptp.c delete mode 100644 r8125/src/r8125_ptp.h delete mode 100644 r8125/src/r8125_realwow.h delete mode 100644 r8125/src/r8125_rss.c delete mode 100644 r8125/src/r8125_rss.h delete mode 100644 r8125/src/rtl_eeprom.c delete mode 100644 r8125/src/rtl_eeprom.h delete mode 100644 r8125/src/rtltool.c delete mode 100644 r8125/src/rtltool.h create mode 100644 r8152/Makefile create mode 100644 r8152/patches/010-compat-skb_mark_not_on_list-was-backported-since-ker.patch create mode 100644 r8152/patches/100-add-LED-configuration-from-OF.patch create mode 100644 r8168/Makefile create mode 100644 r8168/patches/001-r8168-add-LED-configuration-from-OF.patch diff --git a/r8125/LICENSE b/r8125/LICENSE deleted file mode 100644 index f3077e149..000000000 --- a/r8125/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 goldkeyber112 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/r8125/Makefile b/r8125/Makefile deleted file mode 100644 index 02d07644d..000000000 --- a/r8125/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# Come from https://github.com/goldkeyber112/openwrt-r8125 -#Download realtek r8125 linux driver from official site -#Unpack source file -#Replace orginal Makefile with this file -#Put this source to 'package' folder of OpenWRT SDK -#Build(make menuconfig, make defconfig, make) - -include $(TOPDIR)/rules.mk -include $(INCLUDE_DIR)/kernel.mk - -PKG_NAME:=r8125 -PKG_VERSION:=9.005.01 -PKG_RELEASE:=1 - -#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 -#PKG_CAT:=bzcat - -PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) - -include $(INCLUDE_DIR)/package.mk - -define KernelPackage/r8125 - SUBMENU:=Network Devices - TITLE:=Driver for Realtek r8125 chipsets - VERSION:=$(LINUX_VERSION)+$(PKG_VERSION)-$(BOARD)-$(PKG_RELEASE) - FILES:= $(PKG_BUILD_DIR)/r8125.ko - AUTOLOAD:=$(call AutoProbe,r8125) - DEFAULT:=y -endef - -define Package/r8125/description - This package contains a driver for Realtek r8125 chipsets. -endef - -R8125_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/Prepare - mkdir -p $(PKG_BUILD_DIR) - $(CP) ./src/* $(PKG_BUILD_DIR) -endef - -define Build/Compile - $(MAKE) $(R8125_MAKEOPTS) modules -endef - -$(eval $(call KernelPackage,r8125)) diff --git a/r8125/README.md b/r8125/README.md deleted file mode 100644 index a472d859e..000000000 --- a/r8125/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Realtek RTL8125 Driver for Openwrt - -Download realtek r8125 linux driver from official site -https://www.realtek.com/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-pci-express-software -Unpack source file -Replace orginal Makefile with this file -Put this source to 'package' folder of OpenWRT SDK -Build(make menuconfig, make defconfig, make) diff --git a/r8125/src/Makefile b/r8125/src/Makefile deleted file mode 100644 index f49c90676..000000000 --- a/r8125/src/Makefile +++ /dev/null @@ -1,184 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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_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 -ENABLE_TX_NO_CLOSE = y -ENABLE_MULTIPLE_TX_QUEUE = n -ENABLE_PTP_SUPPORT = n -ENABLE_PTP_MASTER_MODE = n -ENABLE_RSS_SUPPORT = n -ENABLE_LIB_SUPPORT = n - -ifneq ($(KERNELRELEASE),) - obj-m := r8125.o - r8125-objs := r8125_n.o rtl_eeprom.o rtltool.o - ifeq ($(CONFIG_SOC_LAN), y) - EXTRA_CFLAGS += -DCONFIG_SOC_LAN - endif - ifeq ($(ENABLE_REALWOW_SUPPORT), y) - r8125-objs += r8125_realwow.o - EXTRA_CFLAGS += -DENABLE_REALWOW_SUPPORT - endif - ifeq ($(ENABLE_DASH_SUPPORT), y) - r8125-objs += r8125_dash.o - EXTRA_CFLAGS += -DENABLE_DASH_SUPPORT - endif - ifeq ($(ENABLE_DASH_PRINTER_SUPPORT), y) - r8125-objs += r8125_dash.o - EXTRA_CFLAGS += -DENABLE_DASH_SUPPORT -DENABLE_DASH_PRINTER_SUPPORT - endif - EXTRA_CFLAGS += -DCONFIG_R8125_NAPI - EXTRA_CFLAGS += -DCONFIG_R8125_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 ($(ENABLE_TX_NO_CLOSE), y) - EXTRA_CFLAGS += -DENABLE_TX_NO_CLOSE - endif - ifeq ($(ENABLE_MULTIPLE_TX_QUEUE), y) - EXTRA_CFLAGS += -DENABLE_MULTIPLE_TX_QUEUE - endif - ifeq ($(ENABLE_PTP_SUPPORT), y) - r8125-objs += r8125_ptp.o - EXTRA_CFLAGS += -DENABLE_PTP_SUPPORT - endif - ifeq ($(ENABLE_PTP_MASTER_MODE), y) - EXTRA_CFLAGS += -DENABLE_PTP_MASTER_MODE - endif - ifeq ($(ENABLE_RSS_SUPPORT), y) - r8125-objs += r8125_rss.o - EXTRA_CFLAGS += -DENABLE_RSS_SUPPORT - endif - ifeq ($(ENABLE_LIB_SUPPORT), y) - r8125-objs += r8125_lib.o - EXTRA_CFLAGS += -DENABLE_LIB_SUPPORT - 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/r8125/src/Makefile_linux24x b/r8125/src/Makefile_linux24x deleted file mode 100644 index d043fb00c..000000000 --- a/r8125/src/Makefile_linux24x +++ /dev/null @@ -1,75 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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 := r8125_n.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 r8125.o - strip --strip-debug r8125.o - -%.o: %.c - $(CC) $(MODCFLAGS) -c $< -o $@ - -clean: - rm *.o -f - -install: - install -m 744 -c r8125.o $(KMISC) diff --git a/r8125/src/r8125.h b/r8125/src/r8125.h deleted file mode 100644 index 06893797b..000000000 --- a/r8125/src/r8125.h +++ /dev/null @@ -1,2265 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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 __R8125_H -#define __R8125_H - -//#include -#include -#include -#include -#include "r8125_dash.h" -#include "r8125_realwow.h" -#include "r8125_ptp.h" -#include "r8125_rss.h" -#ifdef ENABLE_LIB_SUPPORT -#include "r8125_lib.h" -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,12,0)&& !defined(ENABLE_LIB_SUPPORT) -#define RTL_USE_NEW_INTR_API -#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(napi, length) dev_alloc_skb(length) -#ifdef CONFIG_R8125_NAPI -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0) -#undef RTL_ALLOC_SKB_INTR -#define RTL_ALLOC_SKB_INTR(napi, length) napi_alloc_skb(napi, length) -#endif -#endif - -#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_R8125_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=rtl8125_netpoll -#else -#define RTL_NET_POLL_CONTROLLER -#endif - -#ifdef CONFIG_R8125_VLAN -#define RTL_SET_VLAN dev->vlan_rx_register=rtl8125_vlan_rx_register -#else -#define RTL_SET_VLAN -#endif - -#define RTL_NET_DEVICE_OPS(ops) dev->open=rtl8125_open; \ - dev->hard_start_xmit=rtl8125_start_xmit; \ - dev->get_stats=rtl8125_get_stats; \ - dev->stop=rtl8125_close; \ - dev->tx_timeout=rtl8125_tx_timeout; \ - dev->set_multicast_list=rtl8125_set_rx_mode; \ - dev->change_mtu=rtl8125_change_mtu; \ - dev->set_mac_address=rtl8125_set_mac_address; \ - dev->do_ioctl=rtl8125_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) - -//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_R8125_NAPI -#define NAPI_SUFFIX "-NAPI" -#else -#define NAPI_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 - -#if defined(ENABLE_REALWOW_SUPPORT) -#define REALWOW_SUFFIX "-REALWOW" -#else -#define REALWOW_SUFFIX "" -#endif - -#if defined(ENABLE_PTP_SUPPORT) -#define PTP_SUFFIX "-PTP" -#else -#define PTP_SUFFIX "" -#endif - -#if defined(ENABLE_RSS_SUPPORT) -#define RSS_SUFFIX "-RSS" -#else -#define RSS_SUFFIX "" -#endif - -#define RTL8125_VERSION "9.005.01" NAPI_SUFFIX DASH_SUFFIX REALWOW_SUFFIX PTP_SUFFIX RSS_SUFFIX -#define MODULENAME "r8125" -#define PFX MODULENAME ": " - -#define GPL_CLAIM "\ -r8125 Copyright (C) 2021 Realtek NIC software team \n \ -This program comes with ABSOLUTELY NO WARRANTY; for details, please see . \n \ -This is free software, and you are welcome to redistribute it under certain conditions; see . \n" - -#ifdef RTL8125_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 /* RTL8125_DEBUG */ - -#define R8125_MSG_DEFAULT \ - (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN) - -#ifdef CONFIG_R8125_NAPI -#define rtl8125_rx_hwaccel_skb vlan_hwaccel_receive_skb -#define rtl8125_rx_quota(count, quota) min(count, quota) -#else -#define rtl8125_rx_hwaccel_skb vlan_hwaccel_rx -#define rtl8125_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 R8125_REGS_SIZE (256) -#define R8125_MAC_REGS_SIZE (256) -#define R8125_PHY_REGS_SIZE (16*2) -#define R8125_EPHY_REGS_SIZE (31*2) -#define R8125_ERI_REGS_SIZE (0x100) -#define R8125_REGS_DUMP_SIZE (0x400) -#define R8125_PCI_REGS_SIZE (0x100) -#define R8125_NAPI_WEIGHT 64 - -#define R8125_MAX_MSIX_VEC_8125B 32 -#define R8125_MIN_MSIX_VEC_8125B 17 -#define R8125_MAX_MSIX_VEC 32 -#define R8125_MAX_RX_QUEUES_VEC_V3 (16) - -#define RTL8125_TX_TIMEOUT (6 * HZ) -#define RTL8125_LINK_TIMEOUT (1 * HZ) -#define RTL8125_ESD_TIMEOUT (2 * HZ) - -#define NUM_TX_DESC 1024 /* Number of Tx descriptor registers */ -#define NUM_RX_DESC 1024 /* Number of Rx descriptor registers */ - -#define RX_BUF_SIZE 0x05F3 /* 0x05F3 = 1522bye + 1 */ -#define R8125_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc)) -#define R8125_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc)) -#define R8125_MAX_TX_QUEUES (2) -#define R8125_MAX_RX_QUEUES (4) -#define R8125_MAX_QUEUES R8125_MAX_RX_QUEUES - -#ifdef ENABLE_LIB_SUPPORT -#define R8125_MULTI_RX_Q(tp) 1 -#else -#define R8125_MULTI_RX_Q(tp) (tp->num_rx_rings > 1) -#endif - -#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 ADVERTISED_2500baseX_Full -#define ADVERTISED_2500baseX_Full 0x8000 -#endif - -#define RTK_ADVERTISE_2500FULL 0x80 - -/* Tx NO CLOSE */ -#define MAX_TX_NO_CLOSE_DESC_PTR_V2 0x10000 -#define TX_NO_CLOSE_SW_PTR_MASK_V2 0x1FFFF - -#ifndef ETH_MIN_MTU -#define ETH_MIN_MTU 68 -#endif - -#define D0_SPEED_UP_SPEED_DISABLE 0 -#define D0_SPEED_UP_SPEED_1000 1 -#define D0_SPEED_UP_SPEED_2500 2 - -#ifndef WRITE_ONCE -#define WRITE_ONCE(var, val) (*((volatile typeof(val) *)(&(var))) = (val)) -#endif -#ifndef READ_ONCE -#define READ_ONCE(var) (*((volatile typeof(var) *)(&(var)))) -#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) - -/*****************************************************************************/ -#ifdef CONFIG_R8125_NAPI -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0) -#define RTL_NAPI_CONSUME_SKB_ANY(skb, budget) napi_consume_skb(skb, budget) -#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) -#define RTL_NAPI_CONSUME_SKB_ANY(skb, budget) dev_consume_skb_any(skb); -#else -#define RTL_NAPI_CONSUME_SKB_ANY(skb, budget) dev_kfree_skb_any(skb); -#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0) -#else //CONFIG_R8125_NAPI -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) -#define RTL_NAPI_CONSUME_SKB_ANY(skb, budget) dev_consume_skb_any(skb); -#else -#define RTL_NAPI_CONSUME_SKB_ANY(skb, budget) dev_kfree_skb_any(skb); -#endif -#endif //CONFIG_R8125_NAPI - -/*****************************************************************************/ -#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 -#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 RTL8125_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, - INT_CFG0_8125 = 0x34, - 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, - INT_CFG1_8125 = 0x7A, - 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, - //8125 - IMR0_8125 = 0x38, - ISR0_8125 = 0x3C, - TPPOLL_8125 = 0x90, - IMR1_8125 = 0x800, - ISR1_8125 = 0x802, - IMR2_8125 = 0x804, - ISR2_8125 = 0x806, - IMR3_8125 = 0x808, - ISR3_8125 = 0x80A, - BACKUP_ADDR0_8125 = 0x19E0, - BACKUP_ADDR1_8125 = 0X19E4, - TCTR0_8125 = 0x0048, - TCTR1_8125 = 0x004C, - TCTR2_8125 = 0x0088, - TCTR3_8125 = 0x001C, - TIMER_INT0_8125 = 0x0058, - TIMER_INT1_8125 = 0x005C, - TIMER_INT2_8125 = 0x008C, - TIMER_INT3_8125 = 0x00F4, - INT_MITI_V2_0_RX = 0x0A00, - INT_MITI_V2_0_TX = 0x0A02, - INT_MITI_V2_1_TX = 0x0A0A, - IMR_V2_CLEAR_REG_8125 = 0x0D00, - ISR_V2_8125 = 0x0D04, - IMR_V2_SET_REG_8125 = 0x0D0C, - TNPDS_Q1_LOW_8125 = 0x2100, - SW_TAIL_PTR0_8125 = 0x2800, - HW_CLO_PTR0_8125 = 0x2802, - RDSAR_Q1_LOW_8125 = 0x4000, - RSS_CTRL_8125 = 0x4500, - Q_NUM_CTRL_8125 = 0x4800, - EEE_TXIDLE_TIMER_8125 = 0x6048, - PTP_CTRL_8125 = 0x6800, - PTP_STATUS_8125 = 0x6802, - PTP_ISR_8125 = 0x6804, - PTP_IMR_8125 = 0x6805, - PTP_TIME_CORRECT_CMD_8125 = 0x6806, - PTP_SOFT_CONFIG_Time_NS_8125 = 0x6808, - PTP_SOFT_CONFIG_Time_S_8125 = 0x680C, - PTP_LOCAL_Time_SUB_NS_8125 = 0x6814, - PTP_LOCAL_Time_NS_8125 = 0x6818, - PTP_LOCAL_Time_S_8125 = 0x681C, - PTP_Time_SHIFTER_S_8125 = 0x6856, - PPS_RISE_TIME_NS_8125 = 0x68A0, - PPS_RISE_TIME_S_8125 = 0x68A4, -}; - -enum RTL8125_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, - RxDU1 = 0x0002, - RxOK1 = 0x0001, - - /* RxStatusDesc */ - RxRWT = (1 << 22), - RxRES = (1 << 21), - RxRUNT = (1 << 20), - RxCRC = (1 << 19), - - RxRWT_V3 = (1 << 18), - RxRES_V3 = (1 << 20), - RxRUNT_V3 = (1 << 19), - RxCRC_V3 = (1 << 17), - - /* 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, - EnableRxDescV3 = (1 << 24), - EnableOuterVlan = (1 << 23), - EnableInnerVlan = (1 << 22), - 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 */ - 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 RTL8125B.*/ - /* Wake up when the cable connection is re-established */ - ECRCEN = (1 << 3), /* This bit is reserved in RTL8125B*/ - Jumbo_En0 = (1 << 2), /* This bit is reserved in RTL8125B*/ - RDY_TO_L23 = (1 << 1), /* This bit is reserved in RTL8125B*/ - Beacon_en = (1 << 0), /* This bit is reserved in RTL8125B*/ - - /* Config4 register */ - Jumbo_En1 = (1 << 1), /* This bit is reserved in RTL8125B*/ - - /* 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# */ - - /* 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 RTL8125B - ASF = (1 << 8),//This bit is reserved in RTL8125C - PktCntrDisable = (1 << 7), - RxVlan = (1 << 6), - RxChkSum = (1 << 5), - Macdbgo_sel = 0x001C, - INTT_0 = 0x0000, - INTT_1 = 0x0001, - INTT_2 = 0x0002, - INTT_3 = 0x0003, - - /* rtl8125_PHYstatus */ - PowerSaveStatus = 0x80, - _2500bpsF = 0x400, - 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_Mask_v2 = 0x7f, - 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), - - /* PTP */ - PTP_ISR_TOK = (1 << 1), - PTP_ISR_TER = (1 << 2), - PTP_EXEC_CMD = (1 << 7), - PTP_ADJUST_TIME_NS_NEGATIVE = (1 << 30), - PTP_ADJUST_TIME_S_NEGATIVE = (1ULL << 48), - - /* New Interrupt Bits */ - INT_CFG0_ENABLE_8125 = (1 << 0), - INT_CFG0_TIMEOUT0_BYPASS_8125 = (1 << 1), - INT_CFG0_MITIGATION_BYPASS_8125 = (1 << 2), - ISRIMR_V2_ROK_Q0 = (1 << 0), - ISRIMR_TOK_Q0 = (1 << 16), - ISRIMR_TOK_Q1 = (1 << 18), - ISRIMR_V2_LINKCHG = (1 << 21), - - /* Magic Number */ - RTL8125_MAGIC_NUMBER = 0x0badbadbadbadbadull, -}; - -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 */ - - DescOwn_V3 = (DescOwn), /* Descriptor is owned by NIC */ - RingEnd_V3 = (RingEnd), /* End of descriptor ring */ - FirstFrag_V3 = (1 << 25), /* First segment of a packet */ - LastFrag_V3 = (1 << 24), /* 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 RTL8125 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 RTL8125 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 RTL8125 only begin @@@@@@*/ - RxUDPT = (1 << 18), - RxTCPT = (1 << 17), - /*@@@@@@ offset 0 of rx descriptor => bits for RTL8125 only end @@@@@@*/ - - /*@@@@@@ offset 4 of rx descriptor => bits for RTL8125 only begin @@@@@@*/ - RxV6F = (1 << 31), - RxV4F = (1 << 30), - /*@@@@@@ offset 4 of rx descriptor => bits for RTL8125 only end @@@@@@*/ - - - PID1_v3 = (1 << 29), /* Protocol ID bit 1/2 */ - PID0_v3 = (1 << 28), /* Protocol ID bit 2/2 */ - -#define RxProtoUDP_v3 (PID1_v3) -#define RxProtoTCP_v3 (PID0_v3) -#define RxProtoIP_v3 (PID1_v3 | PID0_v3) -#define RxProtoMask_v3 RxProtoIP_v3 - - RxIPF_v3 = (1 << 26), /* IP checksum failed */ - RxUDPF_v3 = (1 << 25), /* UDP/IP checksum failed */ - RxTCPF_v3 = (1 << 24), /* TCP/IP checksum failed */ - RxSCTPF_v3 = (1 << 23), /* TCP/IP checksum failed */ - RxVlanTag_v3 = (RxVlanTag), /* VLAN tag available */ - - /*@@@@@@ offset 0 of rx descriptor => bits for RTL8125 only begin @@@@@@*/ - RxUDPT_v3 = (1 << 29), - RxTCPT_v3 = (1 << 28), - RxSCTP_v3 = (1 << 27), - /*@@@@@@ offset 0 of rx descriptor => bits for RTL8125 only end @@@@@@*/ - - /*@@@@@@ offset 4 of rx descriptor => bits for RTL8125 only begin @@@@@@*/ - RxV6F_v3 = (RxV6F), - RxV4F_v3 = (RxV4F), - /*@@@@@@ offset 4 of rx descriptor => bits for RTL8125 only end @@@@@@*/ -}; - -enum features { -// RTL_FEATURE_WOL = (1 << 0), - RTL_FEATURE_MSI = (1 << 1), - RTL_FEATURE_MSIX = (1 << 2), -}; - -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, - EFUSE_SUPPORT_V4, -}; -#define RsvdMask 0x3fffc000 -#define RsvdMaskV3 0x3fff8000 - -struct TxDesc { - u32 opts1; - u32 opts2; - u64 addr; - u32 reserved0; - u32 reserved1; - u32 reserved2; - u32 reserved3; -}; - -struct RxDesc { - u32 opts1; - u32 opts2; - u64 addr; -}; - -struct RxDescV3 { - union { - struct { - u32 rsv1; - u32 rsv2; - } RxDescDDWord1; - }; - - union { - struct { - u32 RSSResult; - u16 HeaderBufferLen; - u16 HeaderInfo; - } RxDescNormalDDWord2; - - struct { - u32 rsv5; - u32 rsv6; - } RxDescDDWord2; - }; - - union { - u64 addr; - - struct { - u32 TimeStampLow; - u32 TimeStampHigh; - } RxDescTimeStamp; - - struct { - u32 rsv8; - u32 rsv9; - } RxDescDDWord3; - }; - - union { - struct { - u32 opts2; - u32 opts1; - } RxDescNormalDDWord4; - - struct { - u16 TimeStampHHigh; - u16 rsv11; - u32 opts1; - } RxDescPTPDDWord4; - }; -}; - -enum rxdesc_type { - RXDESC_TYPE_NORMAL=0, - RXDESC_TYPE_NEXT, - RXDESC_TYPE_PTP, - RXDESC_TYPE_MAX -}; - -//Rx Desc Type -enum rx_desc_ring_type { - RX_DESC_RING_TYPE_UNKNOWN=0, - RX_DESC_RING_TYPE_1, - RX_DESC_RING_TYPE_2, - RX_DESC_RING_TYPE_3, - RX_DESC_RING_TYPE_MAX -}; - -enum rx_desc_len { - RX_DESC_LEN_TYPE_1 = (sizeof(struct RxDesc)), - RX_DESC_LEN_TYPE_3 = (sizeof(struct RxDescV3)) -}; - -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; -}; - -struct rtl8125_tx_ring { - void* priv; - u32 index; - u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */ - u32 dirty_tx; - struct TxDesc *TxDescArray; /* 256-aligned Tx descriptor ring */ - dma_addr_t TxPhyAddr; - struct ring_info tx_skb[NUM_TX_DESC]; /* Tx data buffers */ - - u32 NextHwDesCloPtr; - u32 BeginHwDesCloPtr; - - u16 hw_clo_ptr_reg; - u16 sw_tail_ptr_reg; - - u16 tdsar_reg; /* Transmit Descriptor Start Address */ -}; - -struct rtl8125_rx_ring { - void* priv; - u32 index; - u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */ - u32 dirty_rx; - struct RxDesc *RxDescArray; /* 256-aligned Rx descriptor ring */ - u64 RxDescPhyAddr[NUM_RX_DESC]; /* Rx desc physical address*/ - dma_addr_t RxPhyAddr; - struct sk_buff *Rx_skbuff[NUM_RX_DESC]; /* Rx data buffers */ - - u16 rdsar_reg; /* Receive Descriptor Start Address */ -}; - -struct r8125_napi { -#ifdef CONFIG_R8125_NAPI -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) - struct napi_struct napi; -#endif -#endif - void* priv; - int index; -}; - -struct r8125_irq { - irq_handler_t handler; - unsigned int vector; - u8 requested; - char name[IFNAMSIZ + 10]; -}; - -/* Flow Control Settings */ -enum rtl8125_fc_mode { - rtl8125_fc_none = 0, - rtl8125_fc_rx_pause, - rtl8125_fc_tx_pause, - rtl8125_fc_full, - rtl8125_fc_default -}; - -struct rtl8125_private { - void __iomem *mmio_addr; /* memory map physical address */ - struct pci_dev *pci_dev; /* Index of PCI device */ - struct net_device *dev; - struct r8125_napi r8125napi[R8125_MAX_MSIX_VEC]; - struct r8125_irq irq_tbl[R8125_MAX_MSIX_VEC]; - unsigned int irq_nvecs; - unsigned int max_irq_nvecs; - unsigned int min_irq_nvecs; - //struct msix_entry msix_entries[R8125_MAX_MSIX_VEC]; - 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; - //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[NUM_RX_DESC]; /* Rx data buffers */ - //struct ring_info tx_skb[NUM_TX_DESC]; /* Tx data buffers */ - unsigned rx_buf_sz; - u16 HwSuppNumTxQueues; - u16 HwSuppNumRxQueues; - unsigned int num_tx_rings; - unsigned int num_rx_rings; - struct rtl8125_tx_ring tx_ring[R8125_MAX_TX_QUEUES]; - struct rtl8125_rx_ring rx_ring[R8125_MAX_RX_QUEUES]; -#ifdef ENABLE_LIB_SUPPORT - struct atomic_notifier_head lib_nh; - struct rtl8125_ring lib_tx_ring[R8125_MAX_TX_QUEUES]; - struct rtl8125_ring lib_rx_ring[R8125_MAX_RX_QUEUES]; -#endif - 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 rtl8125_rx_config; - u16 cp_cmd; - u32 intr_mask; - u32 timer_intr_mask; - u16 isr_reg[R8125_MAX_QUEUES]; - u16 imr_reg[R8125_MAX_QUEUES]; - int phy_auto_nego_reg; - int phy_1000_ctrl_reg; - int phy_2500_ctrl_reg; - u8 org_mac_addr[NODE_ADDRESS_SIZE]; - struct rtl8125_counters *tally_vaddr; - dma_addr_t tally_paddr; - -#ifdef CONFIG_R8125_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 rtl8125_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; - - u8 RequirePhyMdiSwapPatch; - - u8 RequireLSOPatch; - - u32 HwFiberModeVer; - u32 HwFiberStat; - u8 HwSwitchMdiToFiber; - - u16 NicCustLedValue; - - u8 HwSuppMagicPktVer; - - u8 HwSuppLinkChgWakeUpVer; - - u8 HwSuppCheckPhyDisableModeVer; - - u8 random_mac; - - u8 HwSuppGigaForceMode; - - u16 phy_reg_anlpar; - - u32 HwPcieSNOffset; - - u8 HwSuppTxNoCloseVer; - u8 EnableTxNoClose; - - u8 HwSuppIsrVer; - u8 HwCurrIsrVer; - - u8 HwSuppIntMitiVer; - - u8 check_keep_link_speed; - u8 resume_not_chg_speed; - - u8 HwSuppD0SpeedUpVer; - u8 D0SpeedUpSpeed; - - //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 *UnalignedSendToFwBufferVa; - void *SendToFwBuffer; - u64 SendToFwBufferPhy; - u8 SendingToFw; - dma_addr_t UnalignedSendToFwBufferPa; - PTX_DASH_SEND_FW_DESC TxDashSendFwDesc; - u64 TxDashSendFwDescPhy; - u8 *UnalignedTxDashSendFwDescVa; - u32 SizeOfTxDashSendFwDescMemAlloc; - u32 SizeOfTxDashSendFwDesc; - u32 NumTxDashSendFwDesc; - u32 CurrNumTxDashSendFwDesc; - u32 LastSendNumTxDashSendFwDesc; - dma_addr_t UnalignedTxDashSendFwDescPa; - - u32 NumRecvFromFwBuffer; - u32 SizeOfRecvFromFwBuffer; - u32 SizeOfRecvFromFwBufferMemAlloc; - void *RecvFromFwBuffer; - u64 RecvFromFwBufferPhy; - - void *UnalignedRecvFromFwBufferVa; - dma_addr_t UnalignedRecvFromFwBufferPa; - PRX_DASH_FROM_FW_DESC RxDashRecvFwDesc; - u64 RxDashRecvFwDescPhy; - u8 *UnalignedRxDashRecvFwDescVa; - u32 SizeOfRxDashRecvFwDescMemAlloc; - u32 SizeOfRxDashRecvFwDesc; - u32 NumRxDashRecvFwDesc; - u32 CurrNumRxDashRecvFwDesc; - dma_addr_t UnalignedRxDashRecvFwDescPa; - 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; - -#ifdef ENABLE_R8125_PROCFS - //Procfs support - struct proc_dir_entry *proc_dir; -#endif - u8 InitRxDescType; - u16 RxDescLength; //V1 16 Byte V2 32 Bytes - u32 RxDescRingLength; - - u8 HwSuppPtpVer; - u8 EnablePtp; - u8 ptp_master_mode; - s64 ptp_adjust; -#ifdef ENABLE_PTP_SUPPORT - u32 tx_hwtstamp_timeouts; - u32 tx_hwtstamp_skipped; - struct work_struct ptp_tx_work; - struct sk_buff *ptp_tx_skb; - struct hwtstamp_config hwtstamp_config; - unsigned long ptp_tx_start; - struct ptp_clock_info ptp_clock_info; - struct ptp_clock *ptp_clock; -#endif - - u8 HwSuppRssVer; - u8 EnableRss; - u16 HwSuppIndirTblEntries; -#ifdef ENABLE_RSS_SUPPORT - u32 rss_flags; - /* Receive Side Scaling settings */ -#define RTL8125_RSS_KEY_SIZE 40 /* size of RSS Hash Key in bytes */ - u8 rss_key[RTL8125_RSS_KEY_SIZE]; -#define RTL8125_MAX_INDIRECTION_TABLE_ENTRIES 128 - u8 rss_indir_tbl[RTL8125_MAX_INDIRECTION_TABLE_ENTRIES]; - u32 rss_options; -#endif -}; - -#ifdef ENABLE_LIB_SUPPORT -static inline unsigned int -rtl8125_num_lib_tx_rings(struct rtl8125_private *tp) -{ - int count, i; - - for (count = 0, i = tp->num_tx_rings; i < tp->HwSuppNumTxQueues; i++) - if(tp->lib_tx_ring[i].enabled) - count++; - - return count; -} - -static inline unsigned int -rtl8125_num_lib_rx_rings(struct rtl8125_private *tp) -{ - int count, i; - - for (count = 0, i = tp->num_rx_rings; i < tp->HwSuppNumRxQueues; i++) - if(tp->lib_rx_ring[i].enabled) - count++; - - return count; -} - -#else -static inline unsigned int -rtl8125_num_lib_tx_rings(struct rtl8125_private *tp) -{ - return 0; -} - -static inline unsigned int -rtl8125_num_lib_rx_rings(struct rtl8125_private *tp) -{ - return 0; -} -#endif - -static inline unsigned int -rtl8125_tot_tx_rings(struct rtl8125_private *tp) -{ - return tp->num_tx_rings + rtl8125_num_lib_tx_rings(tp); -} - -static inline unsigned int -rtl8125_tot_rx_rings(struct rtl8125_private *tp) -{ - return tp->num_rx_rings + rtl8125_num_lib_rx_rings(tp); -} - -enum eetype { - EEPROM_TYPE_NONE=0, - EEPROM_TYPE_93C46, - EEPROM_TYPE_93C56, - EEPROM_TWSI -}; - -enum mcfg { - CFG_METHOD_2=2, - CFG_METHOD_3, - CFG_METHOD_4, - CFG_METHOD_5, - 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 0x7fU -#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) -#define WAKEUP_MAGIC_PACKET_V3 (3) - -//Ram Code Version -#define NIC_RAMCODE_VERSION_CFG_METHOD_2 (0x0b11) -#define NIC_RAMCODE_VERSION_CFG_METHOD_3 (0x0b33) -#define NIC_RAMCODE_VERSION_CFG_METHOD_4 (0x0b17) -#define NIC_RAMCODE_VERSION_CFG_METHOD_5 (0x0b55) - -//hwoptimize -#define HW_PATCH_SOC_LAN (BIT_0) -#define HW_PATCH_SAMSUNG_LAN_DONGLE (BIT_2) - -static const u16 other_q_intr_mask = (RxOK1 | RxDU1); - -void rtl8125_mdio_write(struct rtl8125_private *tp, u32 RegAddr, u32 value); -void rtl8125_mdio_prot_write(struct rtl8125_private *tp, u32 RegAddr, u32 value); -void rtl8125_mdio_prot_direct_write_phy_ocp(struct rtl8125_private *tp, u32 RegAddr, u32 value); -u32 rtl8125_mdio_read(struct rtl8125_private *tp, u32 RegAddr); -u32 rtl8125_mdio_prot_read(struct rtl8125_private *tp, u32 RegAddr); -u32 rtl8125_mdio_prot_direct_read_phy_ocp(struct rtl8125_private *tp, u32 RegAddr); -void rtl8125_ephy_write(struct rtl8125_private *tp, int RegAddr, int value); -void rtl8125_mac_ocp_write(struct rtl8125_private *tp, u16 reg_addr, u16 value); -u16 rtl8125_mac_ocp_read(struct rtl8125_private *tp, u16 reg_addr); -void rtl8125_clear_eth_phy_bit(struct rtl8125_private *tp, u8 addr, u16 mask); -void rtl8125_set_eth_phy_bit(struct rtl8125_private *tp, u8 addr, u16 mask); -void rtl8125_ocp_write(struct rtl8125_private *tp, u16 addr, u8 len, u32 data); -void rtl8125_oob_notify(struct rtl8125_private *tp, u8 cmd); -void rtl8125_init_ring_indexes(struct rtl8125_private *tp); -int rtl8125_eri_write(struct rtl8125_private *tp, int addr, int len, u32 value, int type); -void rtl8125_oob_mutex_lock(struct rtl8125_private *tp); -u32 rtl8125_mdio_read(struct rtl8125_private *tp, u32 RegAddr); -u32 rtl8125_ocp_read(struct rtl8125_private *tp, u16 addr, u8 len); -u32 rtl8125_ocp_read_with_oob_base_address(struct rtl8125_private *tp, u16 addr, u8 len, u32 base_address); -u32 rtl8125_ocp_write_with_oob_base_address(struct rtl8125_private *tp, u16 addr, u8 len, u32 value, u32 base_address); -u32 rtl8125_eri_read(struct rtl8125_private *tp, int addr, int len, int type); -u32 rtl8125_eri_read_with_oob_base_address(struct rtl8125_private *tp, int addr, int len, int type, u32 base_address); -int rtl8125_eri_write(struct rtl8125_private *tp, int addr, int len, u32 value, int type); -int rtl8125_eri_write_with_oob_base_address(struct rtl8125_private *tp, int addr, int len, u32 value, int type, u32 base_address); -u16 rtl8125_ephy_read(struct rtl8125_private *tp, int RegAddr); -void rtl8125_wait_txrx_fifo_empty(struct net_device *dev); -void rtl8125_enable_now_is_oob(struct rtl8125_private *tp); -void rtl8125_disable_now_is_oob(struct rtl8125_private *tp); -void rtl8125_oob_mutex_unlock(struct rtl8125_private *tp); -void rtl8125_dash2_disable_tx(struct rtl8125_private *tp); -void rtl8125_dash2_enable_tx(struct rtl8125_private *tp); -void rtl8125_dash2_disable_rx(struct rtl8125_private *tp); -void rtl8125_dash2_enable_rx(struct rtl8125_private *tp); -void rtl8125_hw_disable_mac_mcu_bps(struct net_device *dev); -void rtl8125_mark_to_asic(struct rtl8125_private *tp, struct RxDesc *desc, u32 rx_buf_sz); - -static inline void -rtl8125_make_unusable_by_asic(struct rtl8125_private *tp, - struct RxDesc *desc) -{ - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) { - ((struct RxDescV3 *)desc)->addr = RTL8125_MAGIC_NUMBER; - ((struct RxDescV3 *)desc)->RxDescNormalDDWord4.opts1 &= ~cpu_to_le32(DescOwn | RsvdMaskV3); - } else { - desc->addr = RTL8125_MAGIC_NUMBER; - desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask); - } -} - -static inline struct RxDesc* -rtl8125_get_rxdesc(struct rtl8125_private *tp, struct RxDesc *RxDescBase, u32 const cur_rx) -{ - return (struct RxDesc*)((u8*)RxDescBase + (cur_rx * tp->RxDescLength)); -} - -static inline void -rtl8125_disable_hw_interrupt_v2(struct rtl8125_private *tp, - u32 message_id) -{ - RTL_W32(tp, IMR_V2_CLEAR_REG_8125, BIT(message_id)); -} - -static inline void -rtl8125_enable_hw_interrupt_v2(struct rtl8125_private *tp, u32 message_id) -{ - RTL_W32(tp, IMR_V2_SET_REG_8125, BIT(message_id)); -} - -void rtl8125_hw_set_timer_int_8125(struct rtl8125_private *tp, u32 message_id, u8 timer_intmiti_val); -void rtl8125_set_rx_q_num(struct rtl8125_private *tp, unsigned int num_rx_queues); -void rtl8125_set_tx_q_num(struct rtl8125_private *tp, unsigned int num_tx_queues); -int rtl8125_set_real_num_queue(struct rtl8125_private *tp); -void rtl8125_hw_start(struct net_device *dev); -void rtl8125_hw_reset(struct net_device *dev); -void rtl8125_tx_clear(struct rtl8125_private *tp); -void rtl8125_rx_clear(struct rtl8125_private *tp); -int rtl8125_init_ring(struct net_device *dev); -void rtl8125_hw_set_rx_packet_filter(struct net_device *dev); - -#ifdef ENABLE_LIB_SUPPORT -void rtl8125_lib_reset_prepare(struct rtl8125_private *tp); -void rtl8125_lib_reset_complete(struct rtl8125_private *tp); -#else -static inline void rtl8125_lib_reset_prepare(struct rtl8125_private *tp) { } -static inline void rtl8125_lib_reset_complete(struct rtl8125_private *tp) { } -#endif - -#define HW_SUPPORT_CHECK_PHY_DISABLE_MODE(_M) ((_M)->HwSuppCheckPhyDisableModeVer > 0 ) -#define HW_HAS_WRITE_PHY_MCU_RAM_CODE(_M) (((_M)->HwHasWrRamCodeToMicroP == TRUE) ? 1 : 0) -#define HW_SUPPORT_D0_SPEED_UP(_M) ((_M)->HwSuppD0SpeedUpVer > 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 - -#endif /* __R8125_H */ diff --git a/r8125/src/r8125_dash.h b/r8125/src/r8125_dash.h deleted file mode 100644 index f86d4255a..000000000 --- a/r8125/src/r8125_dash.h +++ /dev/null @@ -1,261 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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_R8125_DASH_H -#define _LINUX_R8125_DASH_H - -#include - -#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 { - u16 length; - u8 statusLowByte; - u8 statusHighByte; - u32 resv; - u64 BufferAddress; -} -RX_DASH_FROM_FW_DESC, *PRX_DASH_FROM_FW_DESC; - -typedef struct _TX_DASH_SEND_FW_DESC { - u16 length; - u8 statusLowByte; - u8 statusHighByte; - u32 resv; - u64 BufferAddress; -} -TX_DASH_SEND_FW_DESC, *PTX_DASH_SEND_FW_DESC; - -typedef struct _OSOOBHdr { - u32 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 (1520) -#define SEND_TO_FW_BUF_SIZE (1520) - -#define RX_DASH_FROM_FW_OWN BIT_15 -#define TX_DASH_SEND_FW_OWN BIT_15 -#define TX_DASH_SEND_FW_OWN_HIGHBYTE BIT_7 - -#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 rtl8125_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_R8125_DASH_H */ diff --git a/r8125/src/r8125_n.c b/r8125/src/r8125_n.c deleted file mode 100644 index 608d8c2ee..000000000 --- a/r8125/src/r8125_n.c +++ /dev/null @@ -1,14487 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) -#include -#include -#endif -#include -#include -#include -#include - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) -#if LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) -#include -#endif -#endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,37) -#include -#endif - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) -#define dev_printk(A,B,fmt,args...) printk(A fmt,##args) -#else -#include -#include -#endif - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) -#include -#endif - -#include -#include - -#include "r8125.h" -#include "rtl_eeprom.h" -#include "rtltool.h" - -#ifdef ENABLE_R8125_PROCFS -#include -#include -#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; - -#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("RTL8125A", - CFG_METHOD_2, - BIT_30 | EnableInnerVlan | EnableOuterVlan | (RX_DMA_BURST << RxCfgDMAShift), - 0xff7e5880, - Jumbo_Frame_9k), - - _R("RTL8125A", - CFG_METHOD_3, - BIT_30 | EnableInnerVlan | EnableOuterVlan | (RX_DMA_BURST << RxCfgDMAShift), - 0xff7e5880, - Jumbo_Frame_9k), - - _R("RTL8125B", - CFG_METHOD_4, - BIT_30 | EnableInnerVlan | EnableOuterVlan | (RX_DMA_BURST << RxCfgDMAShift), - 0xff7e5880, - Jumbo_Frame_9k), - - _R("RTL8125B", - CFG_METHOD_5, - BIT_30 | EnableInnerVlan | EnableOuterVlan | (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 rtl8125_pci_tbl[] = { - { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8125), }, - { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x3000), }, - {0,}, -}; - -MODULE_DEVICE_TABLE(pci, rtl8125_pci_tbl); - -static int rx_copybreak = 0; -static int use_dac = 1; -static int timer_count = 0x2600; -static int timer_count_v2 = (0x2600 / 0x100); - -static struct { - u32 msg_enable; -} debug = { -1 }; - -static unsigned int speed_mode = SPEED_2500; -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 | - ADVERTISED_2500baseX_Full; -#ifdef CONFIG_ASPM -static int aspm = 1; -#else -static int 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 -#ifdef ENABLE_TX_NO_CLOSE -static int tx_no_close_enable = 1; -#else -static int tx_no_close_enable = 0; -#endif -#ifdef ENABLE_PTP_MASTER_MODE -static int enable_ptp_master_mode = 1; -#else -static int enable_ptp_master_mode = 0; -#endif - -MODULE_AUTHOR("Realtek and the Linux r8125 crew "); -MODULE_DESCRIPTION("Realtek RTL8125 2.5Gigabit 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(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(tx_no_close_enable, int, 0); -MODULE_PARM_DESC(tx_no_close_enable, "Enable TX No Close."); - -module_param(enable_ptp_master_mode, int, 0); -MODULE_PARM_DESC(enable_ptp_master_mode, "Enable PTP Master Mode."); - -#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"); - -MODULE_VERSION(RTL8125_VERSION); - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) -static void rtl8125_esd_timer(unsigned long __opaque); -#else -static void rtl8125_esd_timer(struct timer_list *t); -#endif -/* -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) -static void rtl8125_link_timer(unsigned long __opaque); -#else -static void rtl8125_link_timer(struct timer_list *t); -#endif -*/ - -static int rtl8125_open(struct net_device *dev); -static int rtl8125_start_xmit(struct sk_buff *skb, struct net_device *dev); -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -static irqreturn_t rtl8125_interrupt(int irq, void *dev_instance, struct pt_regs *regs); -#else -static irqreturn_t rtl8125_interrupt(int irq, void *dev_instance); -#endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -static irqreturn_t rtl8125_interrupt_msix(int irq, void *dev_instance, struct pt_regs *regs); -#else -static irqreturn_t rtl8125_interrupt_msix(int irq, void *dev_instance); -#endif -void rtl8125_hw_config(struct net_device *dev); -static int rtl8125_close(struct net_device *dev); -static void rtl8125_set_rx_mode(struct net_device *dev); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) -static void rtl8125_tx_timeout(struct net_device *dev, unsigned int txqueue); -#else -static void rtl8125_tx_timeout(struct net_device *dev); -#endif -static struct net_device_stats *rtl8125_get_stats(struct net_device *dev); -static int rtl8125_rx_interrupt(struct net_device *, struct rtl8125_private *, struct rtl8125_rx_ring *, napi_budget); -static int rtl8125_tx_interrupt(struct rtl8125_tx_ring *ring, int budget); -static int rtl8125_tx_interrupt_with_vector(struct rtl8125_private *tp, const int message_id, int budget); -static int rtl8125_change_mtu(struct net_device *dev, int new_mtu); -static void rtl8125_down(struct net_device *dev); - -static int rtl8125_set_mac_address(struct net_device *dev, void *p); -static void rtl8125_rar_set(struct rtl8125_private *tp, uint8_t *addr); -static void rtl8125_desc_addr_fill(struct rtl8125_private *); -static void rtl8125_tx_desc_init(struct rtl8125_private *tp); -static void rtl8125_rx_desc_init(struct rtl8125_private *tp); - -static void rtl8125_phy_power_up(struct net_device *dev); -static void rtl8125_phy_power_down(struct net_device *dev); -static int rtl8125_set_speed(struct net_device *dev, u8 autoneg, u32 speed, u8 duplex, u32 adv); -static bool rtl8125_set_phy_mcu_patch_request(struct rtl8125_private *tp); -static bool rtl8125_clear_phy_mcu_patch_request(struct rtl8125_private *tp); - -#ifdef CONFIG_R8125_NAPI -static int rtl8125_poll(napi_ptr napi, napi_budget budget); -#endif - -#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 - -#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 rtl8125_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_underun; -}; - -#ifdef ENABLE_R8125_PROCFS -/**************************************************************************** -* -----------------------------PROCFS STUFF------------------------- -***************************************************************************** -*/ - -static struct proc_dir_entry *rtl8125_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 rtl8125_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", RTL8125_VERSION); - seq_printf(m, "mcfg\t%d\n", tp->mcfg); - 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", NUM_RX_DESC); - seq_printf(m, "cur_rx0\t0x%x\n", tp->rx_ring[0].cur_rx); - seq_printf(m, "dirty_rx0\t0x%x\n", tp->rx_ring[0].dirty_rx); - seq_printf(m, "cur_rx1\t0x%x\n", tp->rx_ring[1].cur_rx); - seq_printf(m, "dirty_rx1\t0x%x\n", tp->rx_ring[1].dirty_rx); - seq_printf(m, "cur_rx2\t0x%x\n", tp->rx_ring[2].cur_rx); - seq_printf(m, "dirty_rx2\t0x%x\n", tp->rx_ring[2].dirty_rx); - seq_printf(m, "cur_rx3\t0x%x\n", tp->rx_ring[3].cur_rx); - seq_printf(m, "dirty_rx3\t0x%x\n", tp->rx_ring[3].dirty_rx); - seq_printf(m, "NUM_TX_DESC\t0x%x\n", NUM_TX_DESC); - seq_printf(m, "cur_tx0\t0x%x\n", tp->tx_ring[0].cur_tx); - seq_printf(m, "dirty_tx0\t0x%x\n", tp->tx_ring[0].dirty_tx); - seq_printf(m, "cur_tx1\t0x%x\n", tp->tx_ring[1].cur_tx); - seq_printf(m, "dirty_tx1\t0x%x\n", tp->tx_ring[1].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, "rtl8125_rx_config\t0x%x\n", tp->rtl8125_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, "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, "HwSuppLinkChgWakeUpVer\t0x%x\n", tp->HwSuppLinkChgWakeUpVer); - seq_printf(m, "HwSuppD0SpeedUpVer\t0x%x\n", tp->HwSuppD0SpeedUpVer); - seq_printf(m, "D0SpeedUpSpeed\t0x%x\n", tp->D0SpeedUpSpeed); - seq_printf(m, "HwSuppCheckPhyDisableModeVer\t0x%x\n", tp->HwSuppCheckPhyDisableModeVer); - seq_printf(m, "HwPkgDet\t0x%x\n", tp->HwPkgDet); - seq_printf(m, "HwSuppGigaForceMode\t0x%x\n", tp->HwSuppGigaForceMode); - seq_printf(m, "HwSuppTxNoCloseVer\t0x%x\n", tp->HwSuppTxNoCloseVer); - seq_printf(m, "EnableTxNoClose\t0x%x\n", tp->EnableTxNoClose); - seq_printf(m, "NextHwDesCloPtr0\t0x%x\n", tp->tx_ring[0].NextHwDesCloPtr); - seq_printf(m, "BeginHwDesCloPtr0\t0x%x\n", tp->tx_ring[0].BeginHwDesCloPtr); - seq_printf(m, "NextHwDesCloPtr1\t0x%x\n", tp->tx_ring[1].NextHwDesCloPtr); - seq_printf(m, "BeginHwDesCloPtr1\t0x%x\n", tp->tx_ring[1].BeginHwDesCloPtr); - seq_printf(m, "InitRxDescType\t0x%x\n", tp->InitRxDescType); - seq_printf(m, "RxDescLength\t0x%x\n", tp->RxDescLength); - seq_printf(m, "num_rx_rings\t0x%x\n", tp->num_rx_rings); - seq_printf(m, "num_tx_rings\t0x%x\n", tp->num_tx_rings); - seq_printf(m, "tot_rx_rings\t0x%x\n", rtl8125_tot_rx_rings(tp)); - seq_printf(m, "tot_tx_rings\t0x%x\n", rtl8125_tot_tx_rings(tp)); - seq_printf(m, "EnableRss\t0x%x\n", tp->EnableRss); - seq_printf(m, "EnablePtp\t0x%x\n", tp->EnablePtp); - seq_printf(m, "ptp_master_mode\t0x%x\n", tp->ptp_master_mode); - seq_printf(m, "min_irq_nvecs\t0x%x\n", tp->min_irq_nvecs); - seq_printf(m, "irq_nvecs\t0x%x\n", tp->irq_nvecs); -#ifdef ENABLE_PTP_SUPPORT - seq_printf(m, "tx_hwtstamp_timeouts\t0x%x\n", tp->tx_hwtstamp_timeouts); - seq_printf(m, "tx_hwtstamp_skipped\t0x%x\n", tp->tx_hwtstamp_skipped); -#endif - 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 rtl8125_private *tp = netdev_priv(dev); - struct rtl8125_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_missed\t%lld\n", le64_to_cpu(counters->rx_missed)); - seq_printf(m, "align_errors\t%lld\n", le64_to_cpu(counters->align_errors)); - seq_printf(m, "tx_one_collision\t%lld\n", le64_to_cpu(counters->tx_one_collision)); - seq_printf(m, "tx_multi_collision\t%lld\n", le64_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%lld\n", le64_to_cpu(counters->rx_multicast)); - seq_printf(m, "tx_aborted\t%lld\n", le64_to_cpu(counters->tx_aborted)); - seq_printf(m, "tx_underun\t%lld\n", le64_to_cpu(counters->tx_underun)); - - 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 = R8125_MAC_REGS_SIZE; - u8 byte_rd; - struct rtl8125_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 = R8125_EPHY_REGS_SIZE/2; - u16 word_rd; - struct rtl8125_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 = rtl8125_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 = R8125_PHY_REGS_SIZE/2; - u16 word_rd; - struct rtl8125_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 "); - rtl8125_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 = rtl8125_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 = R8125_ERI_REGS_SIZE; - u32 dword_rd; - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long flags; - - 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 = rtl8125_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 = R8125_PCI_REGS_SIZE; - u32 dword_rd; - struct rtl8125_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 rtl8125_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" - "mcfg\t%d\n" - "chipset\t%d\n" - "chipset_name\t%s\n" - "mtu\t%d\n" - "NUM_RX_DESC\t0x%x\n" - "cur_rx0\t0x%x\n" - "dirty_rx0\t0x%x\n" - "cur_rx1\t0x%x\n" - "dirty_rx1\t0x%x\n" - "cur_rx2\t0x%x\n" - "dirty_rx2\t0x%x\n" - "cur_rx3\t0x%x\n" - "dirty_rx3\t0x%x\n" - "NUM_TX_DESC\t0x%x\n" - "cur_tx0\t0x%x\n" - "dirty_tx0\t0x%x\n" - "cur_tx1\t0x%x\n" - "dirty_tx1\t0x%x\n" - "rx_buf_sz\t0x%x\n" - "esd_flag\t0x%x\n" - "pci_cfg_is_read\t0x%x\n" - "rtl8125_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" - "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" - "HwSuppLinkChgWakeUpVer\t0x%x\n" - "HwSuppD0SpeedUpVer\t0x%x\n" - "D0SpeedUpSpeed\t0x%x\n" - "HwSuppCheckPhyDisableModeVer\t0x%x\n" - "HwPkgDet\t0x%x\n" - "HwSuppGigaForceMode\t0x%x\n" - "HwSuppTxNoCloseVer\t0x%x\n" - "EnableTxNoClose\t0x%x\n" - "NextHwDesCloPtr0\t0x%x\n" - "BeginHwDesCloPtr0\t0x%x\n" - "NextHwDesCloPtr1\t0x%x\n" - "BeginHwDesCloPtr1\t0x%x\n" - "InitRxDescType\t0x%x\n" - "RxDescLength\t0x%x\n" - "num_rx_rings\t0x%x\n" - "num_tx_rings\t0x%x\n" - "tot_rx_rings\t0x%x\n" - "tot_tx_rings\t0x%x\n" - "EnableRss\t0x%x\n" - "EnablePtp\t0x%x\n" - "ptp_master_mode\t0x%x\n" - "min_irq_nvecs\t0x%x\n" - "irq_nvecs\t0x%x\n" -#ifdef ENABLE_PTP_SUPPORT - "tx_hwtstamp_timeouts\t0x%x\n" - "tx_hwtstamp_skipped\t0x%x\n" -#endif - "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, - RTL8125_VERSION, - tp->mcfg, - tp->chipset, - rtl_chip_info[tp->chipset].name, - dev->mtu, - NUM_RX_DESC, - tp->rx_ring[0].cur_rx, - tp->rx_ring[0].dirty_rx, - tp->rx_ring[1].cur_rx, - tp->rx_ring[1].dirty_rx, - tp->rx_ring[2].cur_rx, - tp->rx_ring[2].dirty_rx, - tp->rx_ring[3].cur_rx, - tp->rx_ring[3].dirty_rx, - NUM_TX_DESC, - tp->tx_ring[0].cur_tx, - tp->tx_ring[0].dirty_tx, - tp->tx_ring[1].cur_tx, - tp->tx_ring[1].dirty_tx, - tp->rx_buf_sz, - tp->esd_flag, - tp->pci_cfg_is_read, - tp->rtl8125_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->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->HwSuppLinkChgWakeUpVer, - tp->HwSuppD0SpeedUpVer, - tp->D0SpeedUpSpeed, - tp->HwSuppCheckPhyDisableModeVer, - tp->HwPkgDet, - tp->HwSuppGigaForceMode, - tp->HwSuppTxNoCloseVer, - tp->EnableTxNoClose, - tp->tx_ring[0].NextHwDesCloPtr, - tp->tx_ring[0].BeginHwDesCloPtr, - tp->tx_ring[1].NextHwDesCloPtr, - tp->tx_ring[1].BeginHwDesCloPtr, - tp->InitRxDescType, - tp->RxDescLength, - tp->num_rx_rings, - tp->num_tx_rings, - tp->tot_rx_rings, - tp->tot_tx_rings, - tp->EnableRss, - tp->EnablePtp, - tp->ptp_master_mode, - tp->min_irq_nvecs, - tp->irq_nvecs, -#ifdef ENABLE_PTP_SUPPORT - tp->tx_hwtstamp_timeouts, - tp->tx_hwtstamp_skipped, -#endif - 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 rtl8125_private *tp = netdev_priv(dev); - struct rtl8125_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_missed\t%lld\n" - "align_errors\t%lld\n" - "tx_one_collision\t%lld\n" - "tx_multi_collision\t%lld\n" - "rx_unicast\t%lld\n" - "rx_broadcast\t%lld\n" - "rx_multicast\t%lld\n" - "tx_aborted\t%lld\n" - "tx_underun\t%lld\n", - le64_to_cpu(counters->tx_packets), - le64_to_cpu(counters->rx_packets), - le64_to_cpu(counters->tx_errors), - le64_to_cpu(counters->rx_missed), - le64_to_cpu(counters->align_errors), - le64_to_cpu(counters->tx_one_collision), - le64_to_cpu(counters->tx_multi_collision), - le64_to_cpu(counters->rx_unicast), - le64_to_cpu(counters->rx_broadcast), - le64_to_cpu(counters->rx_multicast), - le64_to_cpu(counters->tx_aborted), - le64_to_cpu(counters->tx_underun) - ); - - 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 = R8125_MAC_REGS_SIZE; - u8 byte_rd; - struct rtl8125_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 = R8125_EPHY_REGS_SIZE/2; - u16 word_rd; - struct rtl8125_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 = rtl8125_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 = R8125_PHY_REGS_SIZE/2; - u16 word_rd; - struct rtl8125_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"); - rtl8125_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 = rtl8125_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 = R8125_ERI_REGS_SIZE; - u32 dword_rd; - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long flags; - int len = 0; - - 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 = rtl8125_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 = R8125_PCI_REGS_SIZE; - u32 dword_rd; - struct rtl8125_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 rtl8125_proc_module_init(void) -{ - //create /proc/net/r8125 -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32) - rtl8125_proc = proc_mkdir(MODULENAME, init_net.proc_net); -#else - rtl8125_proc = proc_mkdir(MODULENAME, proc_net); -#endif - if (!rtl8125_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 rtl8125_proc_open(struct inode *inode, struct file *file) -{ - struct net_device *dev = proc_get_parent_data(inode); - int (*show)(struct seq_file *, void *) = PDE_DATA(inode); - - return single_open(file, show, dev); -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) -static const struct proc_ops rtl8125_proc_fops = { - .proc_open = rtl8125_proc_open, - .proc_read = seq_read, - .proc_lseek = seq_lseek, - .proc_release = single_release, -}; -#else -static const struct file_operations rtl8125_proc_fops = { - .open = rtl8125_proc_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; -#endif - -#endif - -/* - * Table of proc files we need to create. - */ -struct rtl8125_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 rtl8125_proc_file rtl8125_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 }, - { "", NULL } -}; - -static void rtl8125_proc_init(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - const struct rtl8125_proc_file *f; - struct proc_dir_entry *dir; - - if (rtl8125_proc && !tp->proc_dir) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) - dir = proc_mkdir_data(dev->name, 0, rtl8125_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 = rtl8125_proc_files; f->name[0]; f++) { - if (!proc_create_data(f->name, S_IFREG | S_IRUGO, dir, - &rtl8125_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, rtl8125_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 = rtl8125_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 rtl8125_proc_remove(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - if (tp->proc_dir) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) - remove_proc_subtree(dev->name, rtl8125_proc); - proc_init_num--; - -#else - const struct rtl8125_proc_file *f; - struct rtl8125_private *tp = netdev_priv(dev); - - for (f = rtl8125_proc_files; f->name[0]; f++) - remove_proc_entry(f->name, tp->proc_dir); - - remove_proc_entry(dev->name, rtl8125_proc); - proc_init_num--; -#endif - tp->proc_dir = NULL; - } -} - -#endif //ENABLE_R8125_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 rtl8125_private *tp, - u16 RegAddr, - u16 value) -{ - u32 data32; - int i; - -#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; - } -} - -static void mdio_direct_write_phy_ocp(struct rtl8125_private *tp, - u16 RegAddr, - u16 value) -{ - if (tp->rtk_enable_diag) return; - - mdio_real_direct_write_phy_ocp(tp, RegAddr, value); -} - -/* -static void rtl8125_mdio_write_phy_ocp(struct rtl8125_private *tp, - u16 PageNum, - u32 RegAddr, - u32 value) -{ - u16 ocp_addr; - - ocp_addr = map_phy_ocp_addr(PageNum, RegAddr); - - mdio_direct_write_phy_ocp(tp, ocp_addr, value); -} -*/ - -static void rtl8125_mdio_real_write_phy_ocp(struct rtl8125_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 rtl8125_private *tp, - u32 RegAddr, - u32 value) -{ - if (RegAddr == 0x1F) { - tp->cur_page = value; - return; - } - rtl8125_mdio_real_write_phy_ocp(tp, tp->cur_page, RegAddr, value); -} - -void rtl8125_mdio_write(struct rtl8125_private *tp, - u32 RegAddr, - u32 value) -{ - if (tp->rtk_enable_diag) return; - - mdio_real_write(tp, RegAddr, value); -} - -void rtl8125_mdio_prot_write(struct rtl8125_private *tp, - u32 RegAddr, - u32 value) -{ - mdio_real_write(tp, RegAddr, value); -} - -void rtl8125_mdio_prot_direct_write_phy_ocp(struct rtl8125_private *tp, - u32 RegAddr, - u32 value) -{ - mdio_real_direct_write_phy_ocp(tp, RegAddr, value); -} - -static u32 mdio_real_direct_read_phy_ocp(struct rtl8125_private *tp, - u16 RegAddr) -{ - u32 data32; - int i, value = 0; - -#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; - - return value; -} - -static u32 mdio_direct_read_phy_ocp(struct rtl8125_private *tp, - u16 RegAddr) -{ - if (tp->rtk_enable_diag) return 0xffffffff; - - return mdio_real_direct_read_phy_ocp(tp, RegAddr); -} - -/* -static u32 rtl8125_mdio_read_phy_ocp(struct rtl8125_private *tp, - u16 PageNum, - u32 RegAddr) -{ - u16 ocp_addr; - - ocp_addr = map_phy_ocp_addr(PageNum, RegAddr); - - return mdio_direct_read_phy_ocp(tp, ocp_addr); -} -*/ - -static u32 rtl8125_mdio_real_read_phy_ocp(struct rtl8125_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); -} - -static u32 mdio_real_read(struct rtl8125_private *tp, - u32 RegAddr) -{ - return rtl8125_mdio_real_read_phy_ocp(tp, tp->cur_page, RegAddr); -} - -u32 rtl8125_mdio_read(struct rtl8125_private *tp, - u32 RegAddr) -{ - if (tp->rtk_enable_diag) return 0xffffffff; - - return mdio_real_read(tp, RegAddr); -} - -u32 rtl8125_mdio_prot_read(struct rtl8125_private *tp, - u32 RegAddr) -{ - return mdio_real_read(tp, RegAddr); -} - -u32 rtl8125_mdio_prot_direct_read_phy_ocp(struct rtl8125_private *tp, - u32 RegAddr) -{ - return mdio_real_direct_read_phy_ocp(tp, RegAddr); -} - -static void ClearAndSetEthPhyBit(struct rtl8125_private *tp, u8 addr, u16 clearmask, u16 setmask) -{ - u16 PhyRegValue; - - PhyRegValue = rtl8125_mdio_read(tp, addr); - PhyRegValue &= ~clearmask; - PhyRegValue |= setmask; - rtl8125_mdio_write(tp, addr, PhyRegValue); -} - -void rtl8125_clear_eth_phy_bit(struct rtl8125_private *tp, u8 addr, u16 mask) -{ - ClearAndSetEthPhyBit(tp, - addr, - mask, - 0 - ); -} - -void rtl8125_set_eth_phy_bit(struct rtl8125_private *tp, u8 addr, u16 mask) -{ - ClearAndSetEthPhyBit(tp, - addr, - 0, - mask - ); -} - -static void ClearAndSetEthPhyOcpBit(struct rtl8125_private *tp, u16 addr, u16 clearmask, u16 setmask) -{ - u16 PhyRegValue; - - PhyRegValue = mdio_direct_read_phy_ocp(tp, addr); - PhyRegValue &= ~clearmask; - PhyRegValue |= setmask; - mdio_direct_write_phy_ocp(tp, addr, PhyRegValue); -} - -void ClearEthPhyOcpBit(struct rtl8125_private *tp, u16 addr, u16 mask) -{ - ClearAndSetEthPhyOcpBit(tp, - addr, - mask, - 0 - ); -} - -void SetEthPhyOcpBit(struct rtl8125_private *tp, u16 addr, u16 mask) -{ - ClearAndSetEthPhyOcpBit(tp, - addr, - 0, - mask - ); -} - -void rtl8125_mac_ocp_write(struct rtl8125_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 rtl8125_mac_ocp_read(struct rtl8125_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; -} - -static void -ClearAndSetMcuAccessRegBit( - struct rtl8125_private *tp, - u16 addr, - u16 clearmask, - u16 setmask -) -{ - u16 PhyRegValue; - - PhyRegValue = rtl8125_mac_ocp_read(tp, addr); - PhyRegValue &= ~clearmask; - PhyRegValue |= setmask; - rtl8125_mac_ocp_write(tp, addr, PhyRegValue); -} - -static void -ClearMcuAccessRegBit( - struct rtl8125_private *tp, - u16 addr, - u16 mask -) -{ - ClearAndSetMcuAccessRegBit(tp, - addr, - mask, - 0 - ); -} - -static void -SetMcuAccessRegBit( - struct rtl8125_private *tp, - u16 addr, - u16 mask -) -{ - ClearAndSetMcuAccessRegBit(tp, - addr, - 0, - mask - ); -} - -u32 rtl8125_ocp_read_with_oob_base_address(struct rtl8125_private *tp, u16 addr, u8 len, const u32 base_address) -{ - return rtl8125_eri_read_with_oob_base_address(tp, addr, len, ERIAR_OOB, base_address); -} - -u32 rtl8125_ocp_read(struct rtl8125_private *tp, u16 addr, u8 len) -{ - u32 value = 0; - - if (HW_DASH_SUPPORT_TYPE_2(tp)) - value = rtl8125_ocp_read_with_oob_base_address(tp, addr, len, NO_BASE_ADDRESS); - else if (HW_DASH_SUPPORT_TYPE_3(tp)) - value = rtl8125_ocp_read_with_oob_base_address(tp, addr, len, RTL8168FP_OOBMAC_BASE); - - return value; -} - -u32 rtl8125_ocp_write_with_oob_base_address(struct rtl8125_private *tp, u16 addr, u8 len, u32 value, const u32 base_address) -{ - return rtl8125_eri_write_with_oob_base_address(tp, addr, len, value, ERIAR_OOB, base_address); -} - -void rtl8125_ocp_write(struct rtl8125_private *tp, u16 addr, u8 len, u32 value) -{ - if (HW_DASH_SUPPORT_TYPE_2(tp)) - rtl8125_ocp_write_with_oob_base_address(tp, addr, len, value, NO_BASE_ADDRESS); - else if (HW_DASH_SUPPORT_TYPE_3(tp)) - rtl8125_ocp_write_with_oob_base_address(tp, addr, len, value, RTL8168FP_OOBMAC_BASE); -} - -void rtl8125_oob_mutex_lock(struct rtl8125_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_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - default: - ocp_reg_mutex_oob = 0x110; - ocp_reg_mutex_ib = 0x114; - ocp_reg_mutex_prio = 0x11C; - break; - } - - rtl8125_ocp_write(tp, ocp_reg_mutex_ib, 1, BIT_0); - reg_16 = rtl8125_ocp_read(tp, ocp_reg_mutex_oob, 1); - wait_cnt_0 = 0; - while(reg_16) { - reg_a0 = rtl8125_ocp_read(tp, ocp_reg_mutex_prio, 1); - if (reg_a0) { - rtl8125_ocp_write(tp, ocp_reg_mutex_ib, 1, 0x00); - reg_a0 = rtl8125_ocp_read(tp, ocp_reg_mutex_prio, 1); - wait_Cnt_1 = 0; - while(reg_a0) { - reg_a0 = rtl8125_ocp_read(tp, ocp_reg_mutex_prio, 1); - - wait_Cnt_1++; - - if (wait_Cnt_1 > 2000) - break; - }; - rtl8125_ocp_write(tp, ocp_reg_mutex_ib, 1, BIT_0); - - } - reg_16 = rtl8125_ocp_read(tp, ocp_reg_mutex_oob, 1); - - wait_cnt_0++; - - if (wait_cnt_0 > 2000) - break; - }; -} - -void rtl8125_oob_mutex_unlock(struct rtl8125_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_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - default: - ocp_reg_mutex_oob = 0x110; - ocp_reg_mutex_ib = 0x114; - ocp_reg_mutex_prio = 0x11C; - break; - } - - rtl8125_ocp_write(tp, ocp_reg_mutex_prio, 1, BIT_0); - rtl8125_ocp_write(tp, ocp_reg_mutex_ib, 1, 0x00); -} - -void rtl8125_oob_notify(struct rtl8125_private *tp, u8 cmd) -{ - rtl8125_eri_write(tp, 0xE8, 1, cmd, ERIAR_ExGMAC); - - rtl8125_ocp_write(tp, 0x30, 1, 0x01); -} - -static int rtl8125_check_dash(struct rtl8125_private *tp) -{ - if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) { - if (rtl8125_ocp_read(tp, 0x128, 1) & BIT_0) - return 1; - } - - return 0; -} - -void rtl8125_dash2_disable_tx(struct rtl8125_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 rtl8125_dash2_enable_tx(struct rtl8125_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 rtl8125_dash2_disable_rx(struct rtl8125_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 rtl8125_dash2_enable_rx(struct rtl8125_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 rtl8125_dash2_disable_txrx(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) { - rtl8125_dash2_disable_tx( tp ); - rtl8125_dash2_disable_rx( tp ); - } -} - -static void rtl8125_driver_start(struct rtl8125_private *tp) -{ - if (!tp->DASH) - return; - - if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) { - int timeout; - u32 tmp_value; - - rtl8125_ocp_write(tp, 0x180, 1, OOB_CMD_DRIVER_START); - tmp_value = rtl8125_ocp_read(tp, 0x30, 1); - tmp_value |= BIT_0; - rtl8125_ocp_write(tp, 0x30, 1, tmp_value); - - for (timeout = 0; timeout < 10; timeout++) { - mdelay(10); - if (rtl8125_ocp_read(tp, 0x124, 1) & BIT_0) - break; - } - } -} - -static void rtl8125_driver_stop(struct rtl8125_private *tp) -{ - if (!tp->DASH) - return; - - if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) { - struct net_device *dev = tp->dev; - int timeout; - u32 tmp_value; - - rtl8125_dash2_disable_txrx(dev); - - rtl8125_ocp_write(tp, 0x180, 1, OOB_CMD_DRIVER_STOP); - tmp_value = rtl8125_ocp_read(tp, 0x30, 1); - tmp_value |= BIT_0; - rtl8125_ocp_write(tp, 0x30, 1, tmp_value); - - for (timeout = 0; timeout < 10; timeout++) { - mdelay(10); - if (!(rtl8125_ocp_read(tp, 0x124, 1) & BIT_0)) - break; - } - } -} - -void rtl8125_ephy_write(struct rtl8125_private *tp, int RegAddr, int value) -{ - int i; - - RTL_W32(tp, EPHYAR, - EPHYAR_Write | - (RegAddr & EPHYAR_Reg_Mask_v2) << EPHYAR_Reg_shift | - (value & EPHYAR_Data_Mask)); - - for (i = 0; i < 10; i++) { - udelay(100); - - /* Check if the RTL8125 has completed EPHY write */ - if (!(RTL_R32(tp, EPHYAR) & EPHYAR_Flag)) - break; - } - - udelay(20); -} - -u16 rtl8125_ephy_read(struct rtl8125_private *tp, int RegAddr) -{ - int i; - u16 value = 0xffff; - - RTL_W32(tp, EPHYAR, - EPHYAR_Read | (RegAddr & EPHYAR_Reg_Mask_v2) << EPHYAR_Reg_shift); - - for (i = 0; i < 10; i++) { - udelay(100); - - /* Check if the RTL8125 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 rtl8125_private *tp, u8 addr, u16 clearmask, u16 setmask) -{ - u16 EphyValue; - - EphyValue = rtl8125_ephy_read(tp, addr); - EphyValue &= ~clearmask; - EphyValue |= setmask; - rtl8125_ephy_write(tp, addr, EphyValue); -} - -static void ClearPCIePhyBit(struct rtl8125_private *tp, u8 addr, u16 mask) -{ - ClearAndSetPCIePhyBit( tp, - addr, - mask, - 0 - ); -} - -static void SetPCIePhyBit( struct rtl8125_private *tp, u8 addr, u16 mask) -{ - ClearAndSetPCIePhyBit( tp, - addr, - 0, - mask - ); -} - -static u32 -rtl8125_csi_other_fun_read(struct rtl8125_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_DEFAULT) - 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 RTL8125 has completed CSI read */ - if (RTL_R32(tp, CSIAR) & CSIAR_Flag) { - value = (u32)RTL_R32(tp, CSIDR); - break; - } - } - - udelay(20); - - return value; -} - -static void -rtl8125_csi_other_fun_write(struct rtl8125_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_DEFAULT) - 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 RTL8125 has completed CSI write */ - if (!(RTL_R32(tp, CSIAR) & CSIAR_Flag)) - break; - } - - udelay(20); -} - -static u32 -rtl8125_csi_read(struct rtl8125_private *tp, - u32 addr) -{ - u8 multi_fun_sel_bit; - - multi_fun_sel_bit = 0; - - return rtl8125_csi_other_fun_read(tp, multi_fun_sel_bit, addr); -} - -static void -rtl8125_csi_write(struct rtl8125_private *tp, - u32 addr, - u32 value) -{ - u8 multi_fun_sel_bit; - - multi_fun_sel_bit = 0; - - rtl8125_csi_other_fun_write(tp, multi_fun_sel_bit, addr, value); -} - -static u8 -rtl8125_csi_fun0_read_byte(struct rtl8125_private *tp, - u32 addr) -{ - u8 RetVal = 0; - - if (tp->mcfg == CFG_METHOD_DEFAULT) { - struct pci_dev *pdev = tp->pci_dev; - - pci_read_config_byte(pdev, addr, &RetVal); - } else { - u32 TmpUlong; - u16 RegAlignAddr; - u8 ShiftByte; - - RegAlignAddr = addr & ~(0x3); - ShiftByte = addr & (0x3); - TmpUlong = rtl8125_csi_other_fun_read(tp, 0, addr); - TmpUlong >>= (8*ShiftByte); - RetVal = (u8)TmpUlong; - } - - udelay(20); - - return RetVal; -} - -static void -rtl8125_csi_fun0_write_byte(struct rtl8125_private *tp, - u32 addr, - u8 value) -{ - if (tp->mcfg == CFG_METHOD_DEFAULT) { - struct pci_dev *pdev = tp->pci_dev; - - pci_write_config_byte(pdev, addr, value); - } else { - u32 TmpUlong; - u16 RegAlignAddr; - u8 ShiftByte; - - RegAlignAddr = addr & ~(0x3); - ShiftByte = addr & (0x3); - TmpUlong = rtl8125_csi_other_fun_read(tp, 0, RegAlignAddr); - TmpUlong &= ~(0xFF << (8*ShiftByte)); - TmpUlong |= (value << (8*ShiftByte)); - rtl8125_csi_other_fun_write( tp, 0, RegAlignAddr, TmpUlong ); - } - - udelay(20); -} - -u32 rtl8125_eri_read_with_oob_base_address(struct rtl8125_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 RTL8125 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 rtl8125_eri_read(struct rtl8125_private *tp, int addr, int len, int type) -{ - return rtl8125_eri_read_with_oob_base_address(tp, addr, len, type, 0); -} - -int rtl8125_eri_write_with_oob_base_address(struct rtl8125_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 = rtl8125_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 RTL8125 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 rtl8125_eri_write(struct rtl8125_private *tp, int addr, int len, u32 value, int type) -{ - return rtl8125_eri_write_with_oob_base_address(tp, addr, len, value, type, NO_BASE_ADDRESS); -} - -static void -rtl8125_enable_rxdvgate(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_3); - mdelay(2); - break; - } -} - -static void -rtl8125_disable_rxdvgate(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_3); - mdelay(2); - break; - } -} - -static u8 -rtl8125_is_gpio_low(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u8 gpio_low = FALSE; - - switch (tp->HwSuppCheckPhyDisableModeVer) { - case 3: - if (!(rtl8125_mac_ocp_read(tp, 0xDC04) & BIT_13)) - gpio_low = TRUE; - break; - } - - if (gpio_low) - dprintk("gpio is low.\n"); - - return gpio_low; -} - -static u8 -rtl8125_is_phy_disable_mode_enabled(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u8 phy_disable_mode_enabled = FALSE; - - switch (tp->HwSuppCheckPhyDisableModeVer) { - 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 -rtl8125_is_in_phy_disable_mode(struct net_device *dev) -{ - u8 in_phy_disable_mode = FALSE; - - if (rtl8125_is_phy_disable_mode_enabled(dev) && rtl8125_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; -} - -static void -rtl8125_enable_phy_disable_mode(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->HwSuppCheckPhyDisableModeVer) { - case 3: - RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_5); - break; - } - - dprintk("enable phy disable mode.\n"); -} - -static void -rtl8125_disable_phy_disable_mode(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->HwSuppCheckPhyDisableModeVer) { - case 3: - RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_5); - break; - } - - mdelay(1); - - dprintk("disable phy disable mode.\n"); -} - -void -rtl8125_wait_txrx_fifo_empty(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int i; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - for (i = 0; i < 3000; i++) { - udelay(50); - if ((RTL_R8(tp, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) == (Txfifo_empty | Rxfifo_empty)) - break; - - } - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_4: - case CFG_METHOD_5: - for (i = 0; i < 3000; i++) { - udelay(50); - if ((RTL_R16(tp, IntrMitigate) & (BIT_0 | BIT_1 | BIT_8)) == (BIT_0 | BIT_1 | BIT_8)) - break; - - } - break; - } -} - -#ifdef ENABLE_DASH_SUPPORT - -static inline void -rtl8125_enable_dash2_interrupt(struct rtl8125_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 -rtl8125_disable_dash2_interrupt(struct rtl8125_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 -rtl8125_enable_hw_linkchg_interrupt(struct rtl8125_private *tp) -{ - switch (tp->HwCurrIsrVer) { - case 2: - RTL_W32(tp, IMR_V2_SET_REG_8125, ISRIMR_V2_LINKCHG); - break; - case 1: - RTL_W32(tp, tp->imr_reg[0], LinkChg); - break; - } - -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH) - rtl8125_enable_dash2_interrupt(tp); -#endif -} - -static inline void -rtl8125_enable_hw_interrupt(struct rtl8125_private *tp) -{ - switch (tp->HwCurrIsrVer) { - case 2: - RTL_W32(tp, IMR_V2_SET_REG_8125, tp->intr_mask); - break; - case 1: - RTL_W32(tp, tp->imr_reg[0], tp->intr_mask); - - if (R8125_MULTI_RX_Q(tp)) { - int i; - for (i=1; inum_rx_rings; i++) - RTL_W16(tp, tp->imr_reg[i], other_q_intr_mask); - } - break; - } - -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH) - rtl8125_enable_dash2_interrupt(tp); -#endif -} - -static inline void rtl8125_clear_hw_isr_v2(struct rtl8125_private *tp, - u32 message_id) -{ - RTL_W32(tp, ISR_V2_8125, BIT(message_id)); -} - -static inline void -rtl8125_disable_hw_interrupt(struct rtl8125_private *tp) -{ - if (tp->HwCurrIsrVer == 2) { - RTL_W32(tp, IMR_V2_CLEAR_REG_8125, 0xFFFFFFFF); - } else { - RTL_W32(tp, tp->imr_reg[0], 0x0000); - - if (R8125_MULTI_RX_Q(tp)) { - int i; - for (i=1; inum_rx_rings; i++) - RTL_W16(tp, tp->imr_reg[i], 0); - } - -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH) - rtl8125_disable_dash2_interrupt(tp); -#endif - } -} - -static inline void -rtl8125_switch_to_hw_interrupt(struct rtl8125_private *tp) -{ - RTL_W32(tp, TIMER_INT0_8125, 0x0000); - - rtl8125_enable_hw_interrupt(tp); -} - -static inline void -rtl8125_switch_to_timer_interrupt(struct rtl8125_private *tp) -{ - if (tp->use_timer_interrrupt) { - RTL_W32(tp, TIMER_INT0_8125, timer_count); - RTL_W32(tp, TCTR0_8125, timer_count); - RTL_W32(tp, tp->imr_reg[0], tp->timer_intr_mask); - -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH) - rtl8125_enable_dash2_interrupt(tp); -#endif - } else { - rtl8125_switch_to_hw_interrupt(tp); - } -} - -static void -rtl8125_irq_mask_and_ack(struct rtl8125_private *tp) -{ - rtl8125_disable_hw_interrupt(tp); - - if (tp->HwCurrIsrVer == 2) { - RTL_W32(tp, ISR_V2_8125, 0xFFFFFFFF); - } else { -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH) { - if (tp->dash_printer_enabled) { - RTL_W32(tp, tp->isr_reg[0], RTL_R32(tp, tp->isr_reg[0]) & - ~(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_W32(tp, tp->isr_reg[0], RTL_R32(tp, tp->isr_reg[0])); - } -#else - RTL_W32(tp, tp->isr_reg[0], RTL_R32(tp, tp->isr_reg[0])); -#endif - if (R8125_MULTI_RX_Q(tp)) { - int i; - for (i=1; inum_rx_rings; i++) - RTL_W16(tp, tp->isr_reg[i], RTL_R16(tp, tp->isr_reg[i])); - } - } -} - -static void -rtl8125_nic_reset(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int i; - - RTL_W32(tp, RxConfig, (RX_DMA_BURST << RxCfgDMAShift)); - - rtl8125_enable_rxdvgate(dev); - - rtl8125_wait_txrx_fifo_empty(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - default: - mdelay(2); - break; - } - - /* 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; - } -} - -static void -rtl8125_hw_set_interrupt_type(struct rtl8125_private *tp, u8 isr_ver) -{ - u8 tmp; - - switch (tp->HwSuppIsrVer) { - case 2: - tmp = RTL_R8(tp, INT_CFG0_8125); - tmp &= ~(INT_CFG0_ENABLE_8125); - if (isr_ver == 2) - tmp |= INT_CFG0_ENABLE_8125; - RTL_W8(tp, INT_CFG0_8125, tmp); - break; - } -} - -static void -rtl8125_hw_clear_timer_int(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - RTL_W32(tp, TIMER_INT0_8125, 0x0000); - RTL_W32(tp, TIMER_INT1_8125, 0x0000); - RTL_W32(tp, TIMER_INT2_8125, 0x0000); - RTL_W32(tp, TIMER_INT3_8125, 0x0000); - break; - } -} - -static void -rtl8125_hw_clear_int_miti(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int i; - - switch (tp->HwSuppIntMitiVer) { - case 3: - //IntMITI_0-IntMITI_31 - for (i=0xA00; i<0xB00; i+=4) - RTL_W32(tp, i, 0x0000); - break; - case 4: - //IntMITI_0-IntMITI_15 - for (i = 0xA00; i < 0xA80; i += 4) - RTL_W32(tp, i, 0x0000); - - RTL_W8(tp, INT_CFG0_8125, RTL_R8(tp, INT_CFG0_8125) & - ~(INT_CFG0_TIMEOUT0_BYPASS_8125 | INT_CFG0_MITIGATION_BYPASS_8125)); - - RTL_W16(tp, INT_CFG1_8125, 0x0000); - break; - } -} - -void -rtl8125_hw_set_timer_int_8125(struct rtl8125_private *tp, - u32 message_id, - u8 timer_intmiti_val) -{ - switch (tp->HwSuppIntMitiVer) { - case 4: - if (message_id < R8125_MAX_RX_QUEUES_VEC_V3) //ROK - RTL_W8(tp,INT_MITI_V2_0_RX + 8 * message_id, timer_intmiti_val); - else if (message_id == 16) //TOK - RTL_W8(tp,INT_MITI_V2_0_TX, timer_intmiti_val); - else if (message_id == 18) //TOK - RTL_W8(tp,INT_MITI_V2_1_TX, timer_intmiti_val); - break; - } -} - -void -rtl8125_hw_reset(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - rtl8125_lib_reset_prepare(tp); - - /* Disable interrupts */ - rtl8125_irq_mask_and_ack(tp); - - rtl8125_hw_clear_timer_int(dev); - - rtl8125_nic_reset(dev); -} - -static unsigned int -rtl8125_xmii_reset_pending(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned int retval; - - rtl8125_mdio_write(tp, 0x1f, 0x0000); - retval = rtl8125_mdio_read(tp, MII_BMCR) & BMCR_RESET; - - return retval; -} - -static unsigned int -rtl8125_xmii_link_ok(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned int retval; - - retval = (RTL_R16(tp, PHYstatus) & LinkStatus) ? 1 : 0; - - return retval; -} - -static void -rtl8125_xmii_reset_enable(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int i, val = 0; - - if (rtl8125_is_in_phy_disable_mode(dev)) { - return; - } - - rtl8125_mdio_write(tp, 0x1f, 0x0000); - rtl8125_mdio_write(tp, MII_ADVERTISE, rtl8125_mdio_read(tp, MII_ADVERTISE) & - ~(ADVERTISE_10HALF | ADVERTISE_10FULL | - ADVERTISE_100HALF | ADVERTISE_100FULL)); - rtl8125_mdio_write(tp, MII_CTRL1000, rtl8125_mdio_read(tp, MII_CTRL1000) & - ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL)); - mdio_direct_write_phy_ocp(tp, 0xA5D4, mdio_direct_read_phy_ocp(tp, 0xA5D4) & ~(RTK_ADVERTISE_2500FULL)); - rtl8125_mdio_write(tp, MII_BMCR, BMCR_RESET | BMCR_ANENABLE); - - for (i = 0; i < 2500; i++) { - val = rtl8125_mdio_read(tp, MII_BMCR) & BMCR_RESET; - - if (!val) { - return; - } - - mdelay(1); - } - - if (netif_msg_link(tp)) - printk(KERN_ERR "%s: PHY reset failed.\n", dev->name); -} - -void -rtl8125_init_ring_indexes(struct rtl8125_private *tp) -{ - int i; - - for (i = 0; i < tp->num_tx_rings; i++) { - struct rtl8125_tx_ring *ring = &tp->tx_ring[i]; - ring->dirty_tx = ring->cur_tx = 0; - ring->NextHwDesCloPtr = 0; - ring->BeginHwDesCloPtr = 0; - ring->index = i; - ring->priv = tp; - } - - for (i = 0; i < tp->num_rx_rings; i++) { - struct rtl8125_rx_ring *ring = &tp->rx_ring[i]; - ring->dirty_rx = ring->cur_rx = 0; - ring->index = i; - ring->priv = tp; - } - -#ifdef ENABLE_LIB_SUPPORT - for (i = 0; i < tp->HwSuppNumTxQueues; i++) { - struct rtl8125_ring *ring = &tp->lib_tx_ring[i]; - ring->direction = RTL8125_CH_DIR_TX; - ring->queue_num = i; - ring->private = tp; - } - - for (i = 0; i < tp->HwSuppNumRxQueues; i++) { - struct rtl8125_ring *ring = &tp->lib_rx_ring[i]; - ring->direction = RTL8125_CH_DIR_RX; - ring->queue_num = i; - ring->private = tp; - } -#endif -} - -static void -rtl8125_issue_offset_99_event(struct rtl8125_private *tp) -{ - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xE09A, rtl8125_mac_ocp_read(tp, 0xE09A) | BIT_0); - break; - } -} - -#ifdef ENABLE_DASH_SUPPORT -static void -NICChkTypeEnableDashInterrupt(struct rtl8125_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)) { - rtl8125_enable_dash2_interrupt(tp); - RTL_W16(tp, IntrMask, (ISRIMR_DASH_INTR_EN | ISRIMR_DASH_INTR_CMAC_RESET)); - } - } -} -#endif - -static int rtl8125_enable_eee_plus(struct rtl8125_private *tp) -{ - int ret; - - ret = 0; - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xE080, rtl8125_mac_ocp_read(tp, 0xE080)|BIT_1); - break; - - default: -// dev_printk(KERN_DEBUG, &tp->pci_dev->dev, "Not Support EEEPlus\n"); - ret = -EOPNOTSUPP; - break; - } - - return ret; -} - -static int rtl8125_disable_eee_plus(struct rtl8125_private *tp) -{ - int ret; - - ret = 0; - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xE080, rtl8125_mac_ocp_read(tp, 0xE080)&~BIT_1); - break; - - default: -// dev_printk(KERN_DEBUG, &tp->pci_dev->dev, "Not Support EEEPlus\n"); - ret = -EOPNOTSUPP; - break; - } - - return ret; -} - -static void -rtl8125_wakeup_all_tx_queue(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int i; - - for (i=0; inum_tx_rings; i++) - netif_start_subqueue(dev, i); -} - -static void -rtl8125_stop_all_tx_queue(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int i; - - for (i=0; inum_tx_rings; i++) - netif_stop_subqueue(dev, i); -} - -static void -rtl8125_link_on_patch(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - rtl8125_hw_config(dev); - - if ((tp->mcfg == CFG_METHOD_2) && - netif_running(dev)) { - if (RTL_R16(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_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) && - (RTL_R8(tp, PHYstatus) & _10bps)) - rtl8125_enable_eee_plus(tp); - - rtl8125_hw_start(dev); - - netif_carrier_on(dev); - - rtl8125_wakeup_all_tx_queue(dev); - - rtl8125_mdio_write(tp, 0x1F, 0x0000); - tp->phy_reg_anlpar = rtl8125_mdio_read(tp, MII_LPA); -} - -static void -rtl8125_link_down_patch(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - tp->phy_reg_anlpar = 0; - - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) - rtl8125_disable_eee_plus(tp); - - rtl8125_stop_all_tx_queue(dev); - - netif_carrier_off(dev); - - rtl8125_hw_reset(dev); - - rtl8125_tx_clear(tp); - - rtl8125_rx_clear(tp); - - rtl8125_init_ring(dev); - - rtl8125_enable_hw_linkchg_interrupt(tp); - - //rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); - -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH) { - NICChkTypeEnableDashInterrupt(tp); - } -#endif -} - -static void -rtl8125_check_link_status(struct net_device *dev, bool force_set) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int link_status_on; - - link_status_on = tp->link_ok(dev); - - if (force_set || (netif_carrier_ok(dev) != link_status_on)) { - if (link_status_on) { - rtl8125_link_on_patch(dev); - - 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); - - rtl8125_link_down_patch(dev); - } - - if (!force_set) - tp->resume_not_chg_speed = 0; - } -} - -static void -rtl8125_link_option(u8 *aut, - u32 *spd, - u8 *dup, - u32 *adv) -{ - if ((*spd != SPEED_2500) && (*spd != SPEED_1000) && - (*spd != SPEED_100) && (*spd != SPEED_10)) - *spd = SPEED_2500; - - 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 | - ADVERTISED_2500baseX_Full); - if (*adv == 0) - *adv = (ADVERTISED_10baseT_Half | - ADVERTISED_10baseT_Full | - ADVERTISED_100baseT_Half | - ADVERTISED_100baseT_Full | - ADVERTISED_1000baseT_Half | - ADVERTISED_1000baseT_Full | - ADVERTISED_2500baseX_Full); -} - -/* -static void -rtl8125_enable_ocp_phy_power_saving(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u16 val; - - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) { - val = mdio_direct_read_phy_ocp(tp, 0xC416); - if (val != 0x0050) { - rtl8125_set_phy_mcu_patch_request(tp); - mdio_direct_write_phy_ocp(tp, 0xC416, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xC416, 0x0050); - rtl8125_clear_phy_mcu_patch_request(tp); - } - } -} -*/ - -static void -rtl8125_disable_ocp_phy_power_saving(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u16 val; - - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) { - val = mdio_direct_read_phy_ocp(tp, 0xC416); - if (val != 0x0500) { - rtl8125_set_phy_mcu_patch_request(tp); - mdio_direct_write_phy_ocp(tp, 0xC416, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xC416, 0x0500); - rtl8125_clear_phy_mcu_patch_request(tp); - } - } -} - -static void -rtl8125_wait_ll_share_fifo_ready(struct net_device *dev) -{ - struct rtl8125_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 -rtl8125_disable_pci_offset_99(struct rtl8125_private *tp) -{ - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xE032, rtl8125_mac_ocp_read(tp, 0xE032) & ~(BIT_0 | BIT_1)); - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_csi_fun0_write_byte(tp, 0x99, 0x00); - break; - } -} - -static void -rtl8125_enable_pci_offset_99(struct rtl8125_private *tp) -{ - u32 csi_tmp; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_csi_fun0_write_byte(tp, 0x99, tp->org_pci_offset_99); - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - csi_tmp = rtl8125_mac_ocp_read(tp, 0xE032); - 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; - rtl8125_mac_ocp_write(tp, 0xE032, csi_tmp); - break; - } -} - -static void -rtl8125_init_pci_offset_99(struct rtl8125_private *tp) -{ - u32 csi_tmp; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xCDD0, 0x9003); - csi_tmp = rtl8125_mac_ocp_read(tp, 0xE034); - csi_tmp |= (BIT_15 | BIT_14); - rtl8125_mac_ocp_write(tp, 0xE034, csi_tmp); - rtl8125_mac_ocp_write(tp, 0xCDD2, 0x889C); - rtl8125_mac_ocp_write(tp, 0xCDD8, 0x9003); - rtl8125_mac_ocp_write(tp, 0xCDD4, 0x8C30); - rtl8125_mac_ocp_write(tp, 0xCDDA, 0x9003); - rtl8125_mac_ocp_write(tp, 0xCDD6, 0x9003); - rtl8125_mac_ocp_write(tp, 0xCDDC, 0x9003); - rtl8125_mac_ocp_write(tp, 0xCDE8, 0x883E); - rtl8125_mac_ocp_write(tp, 0xCDEA, 0x9003); - rtl8125_mac_ocp_write(tp, 0xCDEC, 0x889C); - rtl8125_mac_ocp_write(tp, 0xCDEE, 0x9003); - rtl8125_mac_ocp_write(tp, 0xCDF0, 0x8C09); - rtl8125_mac_ocp_write(tp, 0xCDF2, 0x9003); - csi_tmp = rtl8125_mac_ocp_read(tp, 0xE032); - csi_tmp |= (BIT_14); - rtl8125_mac_ocp_write(tp, 0xE032, csi_tmp); - csi_tmp = rtl8125_mac_ocp_read(tp, 0xE0A2); - csi_tmp |= (BIT_0); - rtl8125_mac_ocp_write(tp, 0xE0A2, csi_tmp); - break; - } - - rtl8125_enable_pci_offset_99(tp); -} - -static void -rtl8125_disable_pci_offset_180(struct rtl8125_private *tp) -{ - u32 csi_tmp; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - csi_tmp = rtl8125_mac_ocp_read(tp, 0xE092); - csi_tmp &= 0xFF00; - rtl8125_mac_ocp_write(tp, 0xE092, csi_tmp); - break; - } -} - -static void -rtl8125_enable_pci_offset_180(struct rtl8125_private *tp) -{ - u32 csi_tmp; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - csi_tmp = rtl8125_mac_ocp_read(tp, 0xE094); - csi_tmp &= 0x00FF; - rtl8125_mac_ocp_write(tp, 0xE094, csi_tmp); - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - csi_tmp = rtl8125_mac_ocp_read(tp, 0xE092); - csi_tmp &= 0xFF00; - csi_tmp |= BIT_2; - rtl8125_mac_ocp_write(tp, 0xE092, csi_tmp); - break; - } -} - -static void -rtl8125_init_pci_offset_180(struct rtl8125_private *tp) -{ - if (tp->org_pci_offset_180 & (BIT_0|BIT_1)) - rtl8125_enable_pci_offset_180(tp); - else - rtl8125_disable_pci_offset_180(tp); -} - -static void -rtl8125_set_pci_99_180_exit_driver_para(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_issue_offset_99_event(tp); - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_disable_pci_offset_99(tp); - break; - } - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_disable_pci_offset_180(tp); - break; - } -} - -static void -rtl8125_enable_cfg9346_write(struct rtl8125_private *tp) -{ - RTL_W8(tp, Cfg9346, RTL_R8(tp, Cfg9346) | Cfg9346_Unlock); -} - -static void -rtl8125_disable_cfg9346_write(struct rtl8125_private *tp) -{ - RTL_W8(tp, Cfg9346, RTL_R8(tp, Cfg9346) & ~Cfg9346_Unlock); -} - -static void -rtl8125_enable_exit_l1_mask(struct rtl8125_private *tp) -{ - //(1)ERI(0xD4)(OCP 0xC0AC).bit[7:12]=6'b111111, L1 Mask - SetMcuAccessRegBit(tp, 0xC0AC, (BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12)); -} - -static void -rtl8125_disable_exit_l1_mask(struct rtl8125_private *tp) -{ - //(1)ERI(0xD4)(OCP 0xC0AC).bit[7:12]=6'b000000, L1 Mask - ClearMcuAccessRegBit(tp, 0xC0AC, (BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12)); -} - -static void -rtl8125_hw_d3_para(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - RTL_W16(tp, RxMaxSize, RX_BUF_SIZE); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) & ~BIT_7); - rtl8125_enable_cfg9346_write(tp); - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~BIT_7); - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_0); - rtl8125_disable_cfg9346_write(tp); - break; - } - - rtl8125_disable_exit_l1_mask(tp); - -#ifdef ENABLE_REALWOW_SUPPORT - rtl8125_set_realwow_d3_para(dev); -#endif - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xEA18, 0x0064); - break; - } - - rtl8125_set_pci_99_180_exit_driver_para(dev); - - /*disable ocp phy power saving*/ - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) - rtl8125_disable_ocp_phy_power_saving(dev); - - rtl8125_disable_rxdvgate(dev); -} - -static void -rtl8125_enable_magic_packet(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->HwSuppMagicPktVer) { - case WAKEUP_MAGIC_PACKET_V3: - rtl8125_mac_ocp_write(tp, 0xC0B6, rtl8125_mac_ocp_read(tp, 0xC0B6) | BIT_0); - break; - } -} -static void -rtl8125_disable_magic_packet(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->HwSuppMagicPktVer) { - case WAKEUP_MAGIC_PACKET_V3: - rtl8125_mac_ocp_write(tp, 0xC0B6, rtl8125_mac_ocp_read(tp, 0xC0B6) & ~BIT_0); - break; - } -} - -static void -rtl8125_enable_linkchg_wakeup(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->HwSuppLinkChgWakeUpVer) { - case 3: - RTL_W8(tp, Config3, RTL_R8(tp, Config3) | LinkUp); - ClearAndSetMcuAccessRegBit(tp, 0xE0C6, (BIT_3 | BIT_2), (BIT_4 | BIT_1 | BIT_0)); - break; - } -} - -static void -rtl8125_disable_linkchg_wakeup(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->HwSuppLinkChgWakeUpVer) { - case 3: - RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~LinkUp); - ClearMcuAccessRegBit(tp, 0xE0C6, (BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0)); - break; - } -} - -#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST) - -static u32 -rtl8125_get_hw_wol(struct rtl8125_private *tp) -{ - u8 options; - u32 csi_tmp; - u32 wol_opts = 0; - - options = RTL_R8(tp, Config1); - if (!(options & PMEnable)) - goto out; - - options = RTL_R8(tp, Config3); - if (options & LinkUp) - wol_opts |= WAKE_PHY; - - switch (tp->HwSuppMagicPktVer) { - case WAKEUP_MAGIC_PACKET_V3: - csi_tmp = rtl8125_mac_ocp_read(tp, 0xC0B6); - if (csi_tmp & BIT_0) - wol_opts |= WAKE_MAGIC; - break; - } - - options = RTL_R8(tp, Config5); - if (options & UWF) - wol_opts |= WAKE_UCAST; - if (options & BWF) - wol_opts |= WAKE_BCAST; - if (options & MWF) - wol_opts |= WAKE_MCAST; - -out: - return wol_opts; -} - -static void -rtl8125_enable_d0_speedup(struct rtl8125_private *tp) -{ - if (FALSE == HW_SUPPORT_D0_SPEED_UP(tp)) return; - if (tp->D0SpeedUpSpeed == D0_SPEED_UP_SPEED_DISABLE) return; - - if (tp->HwSuppD0SpeedUpVer == 1) { - u16 mac_ocp_data; - - RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_3); - - //speed up speed - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE10A); - mac_ocp_data &= ~(BIT_10 | BIT_9 | BIT_8 | BIT_7); - if (tp->D0SpeedUpSpeed == D0_SPEED_UP_SPEED_2500) { - mac_ocp_data |= BIT_7; - } - rtl8125_mac_ocp_write(tp, 0xE10A, mac_ocp_data); - - //speed up flowcontrol - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE860); - mac_ocp_data |= (BIT_15 | BIT_14); - rtl8125_mac_ocp_write(tp, 0xE860, mac_ocp_data); - } -} - -static void -rtl8125_disable_d0_speedup(struct rtl8125_private *tp) -{ - if (FALSE == HW_SUPPORT_D0_SPEED_UP(tp)) return; - - if (tp->HwSuppD0SpeedUpVer == 1) - RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) & ~BIT_7); -} - -static void -rtl8125_set_hw_wol(struct net_device *dev, u32 wolopts) -{ - struct rtl8125_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_V3: - default: - tmp = ARRAY_SIZE(cfg) - 1; - - if (wolopts & WAKE_MAGIC) - rtl8125_enable_magic_packet(dev); - else - rtl8125_disable_magic_packet(dev); - break; - } - - rtl8125_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); - } - - switch (tp->HwSuppLinkChgWakeUpVer) { - case 3: - if (wolopts & WAKE_PHY) - rtl8125_enable_linkchg_wakeup(dev); - else - rtl8125_disable_linkchg_wakeup(dev); - break; - } - - rtl8125_disable_cfg9346_write(tp); -} - -static void -rtl8125_phy_restart_nway(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - if (rtl8125_is_in_phy_disable_mode(dev)) return; - - rtl8125_mdio_write(tp, 0x1F, 0x0000); - rtl8125_mdio_write(tp, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART); -} - -static void -rtl8125_phy_setup_force_mode(struct net_device *dev, u32 speed, u8 duplex) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u16 bmcr_true_force = 0; - - if (rtl8125_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 if ((speed == SPEED_1000) && (duplex == DUPLEX_FULL) && - tp->HwSuppGigaForceMode) { - bmcr_true_force = BMCR_SPEED1000 | BMCR_FULLDPLX; - } else { - netif_err(tp, drv, dev, "Failed to set phy force mode!\n"); - return; - } - - rtl8125_mdio_write(tp, 0x1F, 0x0000); - rtl8125_mdio_write(tp, MII_BMCR, bmcr_true_force); -} - -static void -rtl8125_set_pci_pme(struct rtl8125_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 -rtl8125_set_wol_link_speed(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int auto_nego; - int giga_ctrl; - u16 anlpar; - - rtl8125_mdio_write(tp, 0x1F, 0x0000); - auto_nego = rtl8125_mdio_read(tp, MII_ADVERTISE); - auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL - | ADVERTISE_100HALF | ADVERTISE_100FULL); - - if (netif_running(dev)) - anlpar = tp->phy_reg_anlpar; - else - anlpar = rtl8125_mdio_read(tp, MII_LPA); - -#ifdef CONFIG_DOWN_SPEED_100 - auto_nego |= (ADVERTISE_100FULL | ADVERTISE_100HALF | ADVERTISE_10HALF | ADVERTISE_10FULL); -#else - if (anlpar & (LPA_10HALF | LPA_10FULL)) - auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL); - else - auto_nego |= (ADVERTISE_100FULL | ADVERTISE_100HALF | ADVERTISE_10HALF | ADVERTISE_10FULL); -#endif - - if (tp->DASH) - auto_nego |= (ADVERTISE_100FULL | ADVERTISE_100HALF | ADVERTISE_10HALF | ADVERTISE_10FULL); - - giga_ctrl = rtl8125_mdio_read(tp, MII_CTRL1000) & ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL); - rtl8125_mdio_write(tp, MII_ADVERTISE, auto_nego); - rtl8125_mdio_write(tp, MII_CTRL1000, giga_ctrl); - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) { - int ctrl_2500; - - ctrl_2500 = mdio_direct_read_phy_ocp(tp, 0xA5D4); - ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL); - mdio_direct_write_phy_ocp(tp, 0xA5D4, ctrl_2500); - } - rtl8125_phy_restart_nway(dev); -} - -static bool -rtl8125_keep_wol_link_speed(struct net_device *dev, u8 from_suspend) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - if ((from_suspend && !tp->link_ok(dev)) || - (!from_suspend && tp->resume_not_chg_speed)) - return 1; - - return 0; -} -static void -rtl8125_powerdown_pll(struct net_device *dev, u8 from_suspend) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - tp->check_keep_link_speed = 0; - if (tp->wol_enabled == WOL_ENABLED || tp->DASH || tp->EnableKCPOffload) { - rtl8125_set_hw_wol(dev, tp->wol_opts); - - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) { - rtl8125_enable_cfg9346_write(tp); - RTL_W8(tp, Config2, RTL_R8(tp, Config2) | PMSTS_En); - rtl8125_disable_cfg9346_write(tp); - } - - /* Enable the PME and clear the status */ - rtl8125_set_pci_pme(tp, 1); - - if (rtl8125_keep_wol_link_speed(dev, from_suspend)) { - if (tp->wol_opts & WAKE_PHY) - tp->check_keep_link_speed = 1; - } else { - if (HW_SUPPORT_D0_SPEED_UP(tp)) { - rtl8125_enable_d0_speedup(tp); - tp->check_keep_link_speed = 1; - } - - rtl8125_set_wol_link_speed(dev); - } - - RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) | AcceptBroadcast | AcceptMulticast | AcceptMyPhys); - - return; - } - - if (tp->DASH) - return; - - rtl8125_phy_power_down(dev); - - if (!tp->HwIcVerUnknown) { - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~BIT_7); - break; - } - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_6); - break; - } -} - -static void rtl8125_powerup_pll(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | BIT_7 | BIT_6); - break; - } - - if (tp->resume_not_chg_speed) return; - - rtl8125_phy_power_up(dev); -} - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) -static void -rtl8125_get_wol(struct net_device *dev, - struct ethtool_wolinfo *wol) -{ - struct rtl8125_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 -rtl8125_set_wol(struct net_device *dev, - struct ethtool_wolinfo *wol) -{ - struct rtl8125_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) ? WOL_ENABLED : WOL_DISABLED; - - spin_unlock_irqrestore(&tp->lock, flags); - - device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts); - - return 0; -} - -static void -rtl8125_get_drvinfo(struct net_device *dev, - struct ethtool_drvinfo *info) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - strcpy(info->driver, MODULENAME); - strcpy(info->version, RTL8125_VERSION); - strcpy(info->bus_info, pci_name(tp->pci_dev)); - info->regdump_len = R8125_REGS_DUMP_SIZE; - info->eedump_len = tp->eeprom_len; -} - -static int -rtl8125_get_regs_len(struct net_device *dev) -{ - return R8125_REGS_DUMP_SIZE; -} -#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) - -static void -rtl8125_set_d0_speedup_speed(struct rtl8125_private *tp) -{ - if (FALSE == HW_SUPPORT_D0_SPEED_UP(tp)) return; - - if (tp->autoneg == AUTONEG_ENABLE || tp->speed == SPEED_2500) - tp->D0SpeedUpSpeed = D0_SPEED_UP_SPEED_2500; - else if(tp->speed == SPEED_1000) - tp->D0SpeedUpSpeed = D0_SPEED_UP_SPEED_1000; - else - tp->D0SpeedUpSpeed = D0_SPEED_UP_SPEED_DISABLE; -} - -static int -rtl8125_set_speed_xmii(struct net_device *dev, - u8 autoneg, - u32 speed, - u8 duplex, - u32 adv) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int auto_nego = 0; - int giga_ctrl = 0; - int ctrl_2500 = 0; - int rc = -EINVAL; - - //Disable Giga Lite - ClearEthPhyOcpBit(tp, 0xA428, BIT_9); - ClearEthPhyOcpBit(tp, 0xA5EA, BIT_0); - - if (speed != SPEED_2500 && - (speed != SPEED_1000) && - (speed != SPEED_100) && - (speed != SPEED_10)) { - speed = SPEED_2500; - duplex = DUPLEX_FULL; - } - - giga_ctrl = rtl8125_mdio_read(tp, MII_CTRL1000); - giga_ctrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL); - ctrl_2500 = mdio_direct_read_phy_ocp(tp, 0xA5D4); - ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL); - - if (autoneg == AUTONEG_ENABLE) { - /*n-way force*/ - auto_nego = rtl8125_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; - if (adv & ADVERTISED_2500baseX_Full) - ctrl_2500 |= RTK_ADVERTISE_2500FULL; - - //flow control - if (dev->mtu <= ETH_DATA_LEN && tp->fcpause == rtl8125_fc_full) - auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; - - tp->phy_auto_nego_reg = auto_nego; - tp->phy_1000_ctrl_reg = giga_ctrl; - - tp->phy_2500_ctrl_reg = ctrl_2500; - - rtl8125_mdio_write(tp, 0x1f, 0x0000); - rtl8125_mdio_write(tp, MII_ADVERTISE, auto_nego); - rtl8125_mdio_write(tp, MII_CTRL1000, giga_ctrl); - mdio_direct_write_phy_ocp(tp, 0xA5D4, ctrl_2500); - rtl8125_phy_restart_nway(dev); - mdelay(20); - } else { - /*true force*/ - if (speed == SPEED_10 || speed == SPEED_100 || - (speed == SPEED_1000 && duplex == DUPLEX_FULL && - tp->HwSuppGigaForceMode)) { - rtl8125_phy_setup_force_mode(dev, speed, duplex); - } else - goto out; - } - - tp->autoneg = autoneg; - tp->speed = speed; - tp->duplex = duplex; - tp->advertising = adv; - - rtl8125_set_d0_speedup_speed(tp); - - rc = 0; -out: - return rc; -} - -static int -rtl8125_set_speed(struct net_device *dev, - u8 autoneg, - u32 speed, - u8 duplex, - u32 adv) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int ret; - - if (tp->resume_not_chg_speed) return 0; - - ret = tp->set_speed(dev, autoneg, speed, duplex, adv); - - return ret; -} - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) -static int -rtl8125_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 rtl8125_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 = rtl8125_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 -rtl8125_get_tx_csum(struct net_device *dev) -{ - struct rtl8125_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 -rtl8125_get_rx_csum(struct net_device *dev) -{ - struct rtl8125_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 -rtl8125_set_tx_csum(struct net_device *dev, - u32 data) -{ - struct rtl8125_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) - 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 -rtl8125_set_rx_csum(struct net_device *dev, - u32 data) -{ - struct rtl8125_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) - -static u32 -rtl8125_rx_desc_opts1(struct rtl8125_private *tp, - struct RxDesc *desc) -{ - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) - return ((struct RxDescV3 *)desc)->RxDescNormalDDWord4.opts1; - else - return desc->opts1; -} - -static u32 -rtl8125_rx_desc_opts2(struct rtl8125_private *tp, - struct RxDesc *desc) -{ - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) - return ((struct RxDescV3 *)desc)->RxDescNormalDDWord4.opts2; - else - return desc->opts2; -} - -static void -rtl8125_clear_rx_desc_opts2(struct rtl8125_private *tp, - struct RxDesc *desc) -{ - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) - ((struct RxDescV3 *)desc)->RxDescNormalDDWord4.opts2 = 0; - else - desc->opts2 = 0; -} - -#ifdef CONFIG_R8125_VLAN - -static inline u32 -rtl8125_tx_vlan_tag(struct rtl8125_private *tp, - struct sk_buff *skb) -{ -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) - return (tp->vlgrp && vlan_tx_tag_present(skb)) ? - TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00; -#elif LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) - return (vlan_tx_tag_present(skb)) ? - TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00; -#else - return (skb_vlan_tag_present(skb)) ? - TxVlanTag | swab16(skb_vlan_tag_get(skb)) : 0x00; -#endif - - return 0; -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) - -static void -rtl8125_vlan_rx_register(struct net_device *dev, - struct vlan_group *grp) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long flags; - - spin_lock_irqsave(&tp->lock, flags); - tp->vlgrp = grp; - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) { - if (tp->vlgrp) { - tp->rtl8125_rx_config |= (EnableInnerVlan | EnableOuterVlan); - RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) | (EnableInnerVlan | EnableOuterVlan)) - } else { - tp->rtl8125_rx_config &= ~(EnableInnerVlan | EnableOuterVlan); - RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) & ~(EnableInnerVlan | EnableOuterVlan)) - } - } - spin_unlock_irqrestore(&tp->lock, flags); -} - -#endif - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) -static void -rtl8125_vlan_rx_kill_vid(struct net_device *dev, - unsigned short vid) -{ - struct rtl8125_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 -rtl8125_rx_vlan_skb(struct rtl8125_private *tp, - struct RxDesc *desc, - struct sk_buff *skb) -{ - u32 opts2 = le32_to_cpu(rtl8125_rx_desc_opts2(tp, desc)); - int ret = -1; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) - if (tp->vlgrp && (opts2 & RxVlanTag)) { - rtl8125_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 - - rtl8125_clear_rx_desc_opts2(tp, desc); - return ret; -} - -#else /* !CONFIG_R8125_VLAN */ - -static inline u32 -rtl8125_tx_vlan_tag(struct rtl8125_private *tp, - struct sk_buff *skb) -{ - return 0; -} - -static int -rtl8125_rx_vlan_skb(struct rtl8125_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 rtl8125_fix_features(struct net_device *dev, - netdev_features_t features) -{ - struct rtl8125_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; - } -#ifndef CONFIG_R8125_VLAN - features &= ~NETIF_F_ALL_CSUM; -#endif - spin_unlock_irqrestore(&tp->lock, flags); - - return features; -} - -static int rtl8125_hw_set_features(struct net_device *dev, - netdev_features_t features) -{ - struct rtl8125_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); - - if (dev->features & NETIF_F_HW_VLAN_RX) - rx_config |= (EnableInnerVlan | EnableOuterVlan); - else - rx_config &= ~(EnableInnerVlan | EnableOuterVlan); - - RTL_W32(tp, RxConfig, rx_config); - - if (features & NETIF_F_RXCSUM) - tp->cp_cmd |= RxChkSum; - else - tp->cp_cmd &= ~RxChkSum; - - RTL_W16(tp, CPlusCmd, tp->cp_cmd); - RTL_R16(tp, CPlusCmd); - - return 0; -} - -static int rtl8125_set_features(struct net_device *dev, - netdev_features_t features) -{ - struct rtl8125_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) - rtl8125_hw_set_features(dev, features); - spin_unlock_irqrestore(&tp->lock, flags); - - return 0; -} - -#endif - -static void rtl8125_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 rtl8125_private *tp = netdev_priv(dev); - u16 status; - u8 autoneg, duplex; - u32 speed = 0; - u16 bmcr; - u32 supported, advertising; - unsigned long flags; - - supported = SUPPORTED_10baseT_Half | - SUPPORTED_10baseT_Full | - SUPPORTED_100baseT_Half | - SUPPORTED_100baseT_Full | - SUPPORTED_1000baseT_Full | - SUPPORTED_2500baseX_Full | - SUPPORTED_Autoneg | - SUPPORTED_TP | - SUPPORTED_Pause | - SUPPORTED_Asym_Pause; - - advertising = ADVERTISED_TP; - - spin_lock_irqsave(&tp->lock, flags); - rtl8125_mdio_write(tp, 0x1F, 0x0000); - bmcr = rtl8125_mdio_read(tp, MII_BMCR); - spin_unlock_irqrestore(&tp->lock, flags); - - if (bmcr & BMCR_ANENABLE) { - advertising |= ADVERTISED_Autoneg; - autoneg = AUTONEG_ENABLE; - - 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; - if (tp->phy_2500_ctrl_reg & RTK_ADVERTISE_2500FULL) - advertising |= ADVERTISED_2500baseX_Full; - } else { - autoneg = AUTONEG_DISABLE; - } - - status = RTL_R16(tp, PHYstatus); - - if (status & LinkStatus) { - /*link on*/ - if (status & _2500bpsF) - speed = SPEED_2500; - else 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 | _2500bpsF)) || (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; - 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); - 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 -rtl8125_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 rtl8125_private *tp = netdev_priv(dev); - - tp->get_settings(dev, cmd); - - return 0; -} - -static void rtl8125_get_regs(struct net_device *dev, struct ethtool_regs *regs, - void *p) -{ - struct rtl8125_private *tp = netdev_priv(dev); - void __iomem *ioaddr = tp->mmio_addr; - unsigned int i; - u8 *data = p; - unsigned long flags; - - if (regs->len < R8125_REGS_DUMP_SIZE) - return /* -EINVAL */; - - memset(p, 0, regs->len); - - spin_lock_irqsave(&tp->lock, flags); - for (i = 0; i < R8125_MAC_REGS_SIZE; i++) - *data++ = readb(ioaddr + i); - data = (u8*)p + 256; - - rtl8125_mdio_write(tp, 0x1F, 0x0000); - for (i = 0; i < R8125_PHY_REGS_SIZE/2; i++) { - *(u16*)data = rtl8125_mdio_read(tp, i); - data += 2; - } - data = (u8*)p + 256 * 2; - - for (i = 0; i < R8125_EPHY_REGS_SIZE/2; i++) { - *(u16*)data = rtl8125_ephy_read(tp, i); - data += 2; - } - data = (u8*)p + 256 * 3; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - default: - for (i = 0; i < R8125_ERI_REGS_SIZE; i+=4) { - *(u32*)data = rtl8125_eri_read(tp, i , 4, ERIAR_ExGMAC); - data += 4; - } - break; - } - spin_unlock_irqrestore(&tp->lock, flags); -} - -static void rtl8125_get_pauseparam(struct net_device *dev, - struct ethtool_pauseparam *pause) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long flags; - - spin_lock_irqsave(&tp->lock, flags); - - pause->autoneg = (tp->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE); - if (tp->fcpause == rtl8125_fc_rx_pause) - pause->rx_pause = 1; - else if (tp->fcpause == rtl8125_fc_tx_pause) - pause->tx_pause = 1; - else if (tp->fcpause == rtl8125_fc_full) { - pause->rx_pause = 1; - pause->tx_pause = 1; - } - - spin_unlock_irqrestore(&tp->lock, flags); -} - -static int rtl8125_set_pauseparam(struct net_device *dev, - struct ethtool_pauseparam *pause) -{ - struct rtl8125_private *tp = netdev_priv(dev); - enum rtl8125_fc_mode newfc; - unsigned long flags; - - if (pause->tx_pause || pause->rx_pause) - newfc = rtl8125_fc_full; - else - newfc = rtl8125_fc_none; - - spin_lock_irqsave(&tp->lock, flags); - - if (tp->fcpause != newfc) { - tp->fcpause = newfc; - - rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); - } - - spin_unlock_irqrestore(&tp->lock, flags); - - return 0; - -} - -static u32 -rtl8125_get_msglevel(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - return tp->msg_enable; -} - -static void -rtl8125_set_msglevel(struct net_device *dev, - u32 value) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - tp->msg_enable = value; -} - -static const char rtl8125_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 rtl8125_get_stats_count(struct net_device *dev) -{ - return ARRAY_SIZE(rtl8125_gstrings); -} -#endif //#LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) -#else -static int rtl8125_get_sset_count(struct net_device *dev, int sset) -{ - switch (sset) { - case ETH_SS_STATS: - return ARRAY_SIZE(rtl8125_gstrings); - default: - return -EOPNOTSUPP; - } -} -#endif - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) -static void -rtl8125_get_ethtool_stats(struct net_device *dev, - struct ethtool_stats *stats, - u64 *data) -{ - struct rtl8125_private *tp = netdev_priv(dev); - struct rtl8125_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_underun); -} - -static void -rtl8125_get_strings(struct net_device *dev, - u32 stringset, - u8 *data) -{ - switch (stringset) { - case ETH_SS_STATS: - memcpy(data, *rtl8125_gstrings, sizeof(rtl8125_gstrings)); - break; - } -} -#endif //#LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) - -static int rtl_get_eeprom_len(struct net_device *dev) -{ - struct rtl8125_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 rtl8125_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->pci_dev->dev, "Detect none EEPROM\n"); - return -EOPNOTSUPP; - } else if (eeprom->len == 0 || (eeprom->offset+eeprom->len) > tp->eeprom_len) { - dev_printk(KERN_DEBUG, &tp->pci_dev->dev, "Invalid parameter\n"); - return -EINVAL; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - 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; - - rtl8125_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]); - } - rtl8125_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 rtl8125_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 rtl8125_enable_eee(struct rtl8125_private *tp) -{ - int ret; - - ret = 0; - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - SetMcuAccessRegBit(tp, 0xE040, (BIT_1|BIT_0)); - SetMcuAccessRegBit(tp, 0xEB62, (BIT_2|BIT_1)); - - SetEthPhyOcpBit(tp, 0xA432, BIT_4); - SetEthPhyOcpBit(tp, 0xA5D0, tp->eee_adv_t); - ClearEthPhyOcpBit(tp, 0xA6D4, BIT_0); - - ClearEthPhyOcpBit(tp, 0xA6D8, BIT_4); - ClearEthPhyOcpBit(tp, 0xA428, BIT_7); - ClearEthPhyOcpBit(tp, 0xA4A2, BIT_9); - break; - case CFG_METHOD_4: - case CFG_METHOD_5: - SetMcuAccessRegBit(tp, 0xE040, (BIT_1|BIT_0)); - - SetEthPhyOcpBit(tp, 0xA5D0, tp->eee_adv_t); - ClearEthPhyOcpBit(tp, 0xA6D4, BIT_0); - - ClearEthPhyOcpBit(tp, 0xA6D8, BIT_4); - ClearEthPhyOcpBit(tp, 0xA428, BIT_7); - ClearEthPhyOcpBit(tp, 0xA4A2, BIT_9); - break; - default: -// dev_printk(KERN_DEBUG, &tp->pci_dev->dev, "Not Support EEE\n"); - ret = -EOPNOTSUPP; - break; - } - - /*Advanced EEE*/ - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_set_phy_mcu_patch_request(tp); - ClearMcuAccessRegBit(tp, 0xE052, BIT_0); - ClearEthPhyOcpBit(tp, 0xA442, BIT_12 | BIT_13); - ClearEthPhyOcpBit(tp, 0xA430, BIT_15); - rtl8125_clear_phy_mcu_patch_request(tp); - break; - } - - return ret; -} - -static int rtl8125_disable_eee(struct rtl8125_private *tp) -{ - int ret; - - ret = 0; - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - ClearMcuAccessRegBit(tp, 0xE040, (BIT_1|BIT_0)); - ClearMcuAccessRegBit(tp, 0xEB62, (BIT_2|BIT_1)); - - ClearEthPhyOcpBit(tp, 0xA432, BIT_4); - ClearEthPhyOcpBit(tp, 0xA5D0, (BIT_2 | BIT_1)); - ClearEthPhyOcpBit(tp, 0xA6D4, BIT_0); - - ClearEthPhyOcpBit(tp, 0xA6D8, BIT_4); - ClearEthPhyOcpBit(tp, 0xA428, BIT_7); - ClearEthPhyOcpBit(tp, 0xA4A2, BIT_9); - break; - case CFG_METHOD_4: - case CFG_METHOD_5: - ClearMcuAccessRegBit(tp, 0xE040, (BIT_1|BIT_0)); - - ClearEthPhyOcpBit(tp, 0xA5D0, (BIT_2 | BIT_1)); - ClearEthPhyOcpBit(tp, 0xA6D4, BIT_0); - - ClearEthPhyOcpBit(tp, 0xA6D8, BIT_4); - ClearEthPhyOcpBit(tp, 0xA428, BIT_7); - ClearEthPhyOcpBit(tp, 0xA4A2, BIT_9); - break; - default: -// dev_printk(KERN_DEBUG, &tp->pci_dev->dev, "Not Support EEE\n"); - ret = -EOPNOTSUPP; - break; - } - - /*Advanced EEE*/ - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_set_phy_mcu_patch_request(tp); - ClearMcuAccessRegBit(tp, 0xE052, BIT_0); - ClearEthPhyOcpBit(tp, 0xA442, BIT_12 | BIT_13); - ClearEthPhyOcpBit(tp, 0xA430, BIT_15); - rtl8125_clear_phy_mcu_patch_request(tp); - break; - } - - return ret; -} - -static int rtl_nway_reset(struct net_device *dev) -{ - struct rtl8125_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 */ - rtl8125_mdio_write(tp, 0x1F, 0x0000); - bmcr = rtl8125_mdio_read(tp, MII_BMCR); - - if (bmcr & BMCR_ANENABLE) { - bmcr |= BMCR_ANRESTART; - rtl8125_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 rtl8125_private *tp = netdev_priv(net); - u32 lp, adv, supported = 0; - unsigned long flags; - u16 val; - - spin_lock_irqsave(&tp->lock, flags); - - if (unlikely(tp->rtk_enable_diag)) { - spin_unlock_irqrestore(&tp->lock, flags); - return -EBUSY; - } - - /* Get Supported EEE */ - val = mdio_direct_read_phy_ocp(tp, 0xA5C4); - supported = mmd_eee_cap_to_ethtool_sup_t(val); - - /* Get advertisement EEE */ - val = mdio_direct_read_phy_ocp(tp, 0xA5D0); - adv = mmd_eee_adv_to_ethtool_adv_t(val); - - /* Get LP advertisement EEE */ - val = mdio_direct_read_phy_ocp(tp, 0xA5D2); - lp = mmd_eee_adv_to_ethtool_adv_t(val); - - val = rtl8125_mac_ocp_read(tp, 0xE040); - val &= BIT_1 | BIT_0; - - 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 rtl8125_private *tp = netdev_priv(net); - unsigned long flags; - - if (!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) { - rtl8125_enable_eee(tp); - } else { - rtl8125_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 rtl8125_ethtool_ops = { - .get_drvinfo = rtl8125_get_drvinfo, - .get_regs_len = rtl8125_get_regs_len, - .get_link = ethtool_op_get_link, -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) - .get_settings = rtl8125_get_settings, - .set_settings = rtl8125_set_settings, -#else - .get_link_ksettings = rtl8125_get_settings, - .set_link_ksettings = rtl8125_set_settings, -#endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) - .get_pauseparam = rtl8125_get_pauseparam, - .set_pauseparam = rtl8125_set_pauseparam, -#endif - .get_msglevel = rtl8125_get_msglevel, - .set_msglevel = rtl8125_set_msglevel, -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0) - .get_rx_csum = rtl8125_get_rx_csum, - .set_rx_csum = rtl8125_set_rx_csum, - .get_tx_csum = rtl8125_get_tx_csum, - .set_tx_csum = rtl8125_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 -#endif - .get_regs = rtl8125_get_regs, - .get_wol = rtl8125_get_wol, - .set_wol = rtl8125_set_wol, - .get_strings = rtl8125_get_strings, -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) - .get_stats_count = rtl8125_get_stats_count, -#else - .get_sset_count = rtl8125_get_sset_count, -#endif - .get_ethtool_stats = rtl8125_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, -#ifdef ENABLE_RSS_SUPPORT - .get_rxnfc = rtl8125_get_rxnfc, - .set_rxnfc = rtl8125_set_rxnfc, - .get_rxfh_indir_size = rtl8125_rss_indir_size, - .get_rxfh_key_size = rtl8125_get_rxfh_key_size, - .get_rxfh = rtl8125_get_rxfh, - .set_rxfh = rtl8125_set_rxfh, -#endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) -#ifdef ENABLE_PTP_SUPPORT - .get_ts_info = rtl8125_get_ts_info, -#else - .get_ts_info = ethtool_op_get_ts_info, -#endif //ENABLE_PTP_SUPPORT -#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 rtl8125_enable_green_feature(struct rtl8125_private *tp) -{ - u16 gphy_val; - unsigned long flags; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8011); - SetEthPhyOcpBit(tp, 0xA438, BIT_15); - rtl8125_mdio_write(tp, 0x00, 0x9200); - break; - default: - dev_printk(KERN_DEBUG, &tp->pci_dev->dev, "Not Support Green Feature\n"); - break; - } - - return 0; -} - -static int rtl8125_disable_green_feature(struct rtl8125_private *tp) -{ - u16 gphy_val; - unsigned long flags; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8011); - ClearEthPhyOcpBit(tp, 0xA438, BIT_15); - rtl8125_mdio_write(tp, 0x00, 0x9200); - break; - default: - dev_printk(KERN_DEBUG, &tp->pci_dev->dev, "Not Support Green Feature\n"); - break; - } - - return 0; -} - -#endif - -static void rtl8125_get_mac_version(struct rtl8125_private *tp) -{ - u32 reg,val32; - u32 ICVerID; - - val32 = RTL_R32(tp, TxConfig); - reg = val32 & 0x7c800000; - ICVerID = val32 & 0x00700000; - - switch (reg) { - case 0x60800000: - if (ICVerID == 0x00000000) { - tp->mcfg = CFG_METHOD_2; - } else if (ICVerID == 0x100000) { - tp->mcfg = CFG_METHOD_3; - } else { - tp->mcfg = CFG_METHOD_3; - tp->HwIcVerUnknown = TRUE; - } - - tp->efuse_ver = EFUSE_SUPPORT_V4; - break; - case 0x64000000: - if (ICVerID == 0x00000000) { - tp->mcfg = CFG_METHOD_4; - } else if (ICVerID == 0x100000) { - tp->mcfg = CFG_METHOD_5; - } else { - tp->mcfg = CFG_METHOD_5; - tp->HwIcVerUnknown = TRUE; - } - - tp->efuse_ver = EFUSE_SUPPORT_V4; - 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 -rtl8125_print_mac_version(struct rtl8125_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 2.5GbE Family Controller mcfg = %04d\n", - rtl_chip_info[i].mcfg); - return; - } - } - - dprintk("mac_version == Unknown\n"); -} - -static void -rtl8125_tally_counter_addr_fill(struct rtl8125_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 -rtl8125_tally_counter_clear(struct rtl8125_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))) | CounterReset); -} - -static void -rtl8125_clear_phy_ups_reg(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_4: - case CFG_METHOD_5: - ClearEthPhyOcpBit(tp, 0xA466, BIT_0); - break; - }; - ClearEthPhyOcpBit(tp, 0xA468, BIT_3 | BIT_1); -} - -static int -rtl8125_is_ups_resume(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) - return (rtl8125_mac_ocp_read(tp, 0xD42C) & BIT_8); - - return 0; -} - -static void -rtl8125_clear_ups_resume_bit(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) - rtl8125_mac_ocp_write(tp, 0xD408, rtl8125_mac_ocp_read(tp, 0xD408) & ~(BIT_8)); -} - -static void -rtl8125_wait_phy_ups_resume(struct net_device *dev, u16 PhyState) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u16 TmpPhyState; - int i=0; - - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) { - do { - TmpPhyState = mdio_direct_read_phy_ocp(tp, 0xA420); - 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 -rtl8125_enable_now_is_oob(struct rtl8125_private *tp) -{ - if ( tp->HwSuppNowIsOobVer == 1 ) { - RTL_W8(tp, MCUCmd_reg, RTL_R8(tp, MCUCmd_reg) | Now_is_oob); - } -} - -void -rtl8125_disable_now_is_oob(struct rtl8125_private *tp) -{ - if ( tp->HwSuppNowIsOobVer == 1 ) { - RTL_W8(tp, MCUCmd_reg, RTL_R8(tp, MCUCmd_reg) & ~Now_is_oob); - } -} - -static void -rtl8125_exit_oob(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u16 data16; - - RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) & ~(AcceptErr | AcceptRunt | AcceptBroadcast | AcceptMulticast | AcceptMyPhys | AcceptAllPhys)); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_dash2_disable_txrx(dev); - break; - } - - if (tp->DASH) { - rtl8125_driver_stop(tp); - rtl8125_driver_start(tp); -#ifdef ENABLE_DASH_SUPPORT - DashHwInit(dev); -#endif - } - -#ifdef ENABLE_REALWOW_SUPPORT - rtl8125_realwow_hw_init(dev); -#else - //Disable realwow function - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xC0BC, 0x00FF); - break; - } -#endif //ENABLE_REALWOW_SUPPORT - - rtl8125_nic_reset(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_disable_now_is_oob(tp); - - data16 = rtl8125_mac_ocp_read(tp, 0xE8DE) & ~BIT_14; - rtl8125_mac_ocp_write(tp, 0xE8DE, data16); - rtl8125_wait_ll_share_fifo_ready(dev); - - rtl8125_mac_ocp_write(tp, 0xC0AA, 0x07D0); - rtl8125_mac_ocp_write(tp, 0xC0A6, 0x01B5); - rtl8125_mac_ocp_write(tp, 0xC01E, 0x5555); - - rtl8125_wait_ll_share_fifo_ready(dev); - break; - } - - //wait ups resume (phy state 2) - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - if (rtl8125_is_ups_resume(dev)) { - rtl8125_wait_phy_ups_resume(dev, 2); - rtl8125_clear_ups_resume_bit(dev); - rtl8125_clear_phy_ups_reg(dev); - } - break; - }; - - tp->phy_reg_anlpar = 0; -} - -void -rtl8125_hw_disable_mac_mcu_bps(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_enable_cfg9346_write(tp); - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_0); - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~BIT_7); - rtl8125_disable_cfg9346_write(tp); - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xFC38, 0x0000); - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xFC28, 0x0000); - rtl8125_mac_ocp_write(tp, 0xFC2A, 0x0000); - rtl8125_mac_ocp_write(tp, 0xFC2C, 0x0000); - rtl8125_mac_ocp_write(tp, 0xFC2E, 0x0000); - rtl8125_mac_ocp_write(tp, 0xFC30, 0x0000); - rtl8125_mac_ocp_write(tp, 0xFC32, 0x0000); - rtl8125_mac_ocp_write(tp, 0xFC34, 0x0000); - rtl8125_mac_ocp_write(tp, 0xFC36, 0x0000); - mdelay(3); - rtl8125_mac_ocp_write(tp, 0xFC26, 0x0000); - break; - } -} - -static void -rtl8125_set_mac_mcu_8125a_1(struct net_device *dev) -{ - rtl8125_hw_disable_mac_mcu_bps(dev); -} - -static void -rtl8125_set_mac_mcu_8125a_2(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u16 i; - static const u16 mcu_patch_code_8125a_2[] = { - 0xE008, 0xE01E, 0xE02E, 0xE054, 0xE057, 0xE059, 0xE0C2, 0xE0CB, 0x9996, - 0x49D1, 0xF005, 0x49D4, 0xF10A, 0x49D8, 0xF108, 0xC00F, 0x7100, 0x209C, - 0x249C, 0xC009, 0x9900, 0xE004, 0xC006, 0x1900, 0x9900, 0xC602, 0xBE00, - 0x5A48, 0xE0C2, 0x0004, 0xE10A, 0xC60F, 0x73C4, 0x49B3, 0xF106, 0x73C2, - 0xC608, 0xB406, 0xC609, 0xFF80, 0xC605, 0xB406, 0xC605, 0xFF80, 0x0544, - 0x0568, 0xE906, 0xCDE8, 0xC724, 0xC624, 0x9EE2, 0x1E01, 0x9EE0, 0x76E0, - 0x49E0, 0xF1FE, 0x76E6, 0x486D, 0x4868, 0x9EE4, 0x1E03, 0x9EE0, 0x76E0, - 0x49E0, 0xF1FE, 0xC615, 0x9EE2, 0x1E01, 0x9EE0, 0x76E0, 0x49E0, 0xF1FE, - 0x76E6, 0x486F, 0x9EE4, 0x1E03, 0x9EE0, 0x76E0, 0x49E0, 0xF1FE, 0x7196, - 0xC702, 0xBF00, 0x5A44, 0xEB0E, 0x0070, 0x00C3, 0x1BC0, 0xC602, 0xBE00, - 0x0E26, 0xC602, 0xBE00, 0x0EBA, 0x1501, 0xF02A, 0x1500, 0xF15D, 0xC661, - 0x75C8, 0x49D5, 0xF00A, 0x49D6, 0xF008, 0x49D7, 0xF006, 0x49D8, 0xF004, - 0x75D2, 0x49D9, 0xF150, 0xC553, 0x77A0, 0x75C8, 0x4855, 0x4856, 0x4857, - 0x4858, 0x48DA, 0x48DB, 0x49FE, 0xF002, 0x485A, 0x49FF, 0xF002, 0x485B, - 0x9DC8, 0x75D2, 0x4859, 0x9DD2, 0xC643, 0x75C0, 0x49D4, 0xF033, 0x49D0, - 0xF137, 0xE030, 0xC63A, 0x75C8, 0x49D5, 0xF00E, 0x49D6, 0xF00C, 0x49D7, - 0xF00A, 0x49D8, 0xF008, 0x75D2, 0x49D9, 0xF005, 0xC62E, 0x75C0, 0x49D7, - 0xF125, 0xC528, 0x77A0, 0xC627, 0x75C8, 0x4855, 0x4856, 0x4857, 0x4858, - 0x48DA, 0x48DB, 0x49FE, 0xF002, 0x485A, 0x49FF, 0xF002, 0x485B, 0x9DC8, - 0x75D2, 0x4859, 0x9DD2, 0xC616, 0x75C0, 0x4857, 0x9DC0, 0xC613, 0x75C0, - 0x49DA, 0xF003, 0x49D0, 0xF107, 0xC60B, 0xC50E, 0x48D9, 0x9DC0, 0x4859, - 0x9DC0, 0xC608, 0xC702, 0xBF00, 0x3AE0, 0xE860, 0xB400, 0xB5D4, 0xE908, - 0xE86C, 0x1200, 0xC409, 0x6780, 0x48F1, 0x8F80, 0xC404, 0xC602, 0xBE00, - 0x10AA, 0xC010, 0xEA7C, 0xC602, 0xBE00, 0x0000 - }; - - rtl8125_hw_disable_mac_mcu_bps(dev); - - for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8125a_2); i++) { - rtl8125_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8125a_2[i]); - } - - rtl8125_mac_ocp_write(tp, 0xFC26, 0x8000); - - rtl8125_mac_ocp_write(tp, 0xFC2A, 0x0540); - rtl8125_mac_ocp_write(tp, 0xFC2E, 0x0E24); - rtl8125_mac_ocp_write(tp, 0xFC30, 0x0EB8); - rtl8125_mac_ocp_write(tp, 0xFC32, 0x3A5C); - rtl8125_mac_ocp_write(tp, 0xFC34, 0x10A8); - - rtl8125_mac_ocp_write(tp, 0xFC48, 0x007A); -} - -static void -rtl8125_set_mac_mcu_8125b_1(struct net_device *dev) -{ - rtl8125_hw_disable_mac_mcu_bps(dev); -} - -static void -rtl8125_set_mac_mcu_8125b_2(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u16 i; - static const u16 mcu_patch_code_8125b_2[] = { - 0xE008, 0xE013, 0xE01E, 0xE02F, 0xE035, 0xE04F, 0xE053, 0xE055, 0x740A, - 0x4846, 0x4847, 0x9C0A, 0xC607, 0x74C0, 0x48C6, 0x9CC0, 0xC602, 0xBE00, - 0x13F0, 0xE054, 0x72CA, 0x4826, 0x4827, 0x9ACA, 0xC607, 0x72C0, 0x48A6, - 0x9AC0, 0xC602, 0xBE00, 0x081C, 0xE054, 0xC60F, 0x74C4, 0x49CC, 0xF109, - 0xC60C, 0x74CA, 0x48C7, 0x9CCA, 0xC609, 0x74C0, 0x4846, 0x9CC0, 0xC602, - 0xBE00, 0x2494, 0xE092, 0xE0C0, 0xE054, 0x7420, 0x48C0, 0x9C20, 0x7444, - 0xC602, 0xBE00, 0x12DC, 0x733A, 0x21B5, 0x25BC, 0x1304, 0xF111, 0x1B12, - 0x1D2A, 0x3168, 0x3ADA, 0x31AB, 0x1A00, 0x9AC0, 0x1300, 0xF1FB, 0x7620, - 0x236E, 0x276F, 0x1A3C, 0x22A1, 0x41B5, 0x9EE2, 0x76E4, 0x486F, 0x9EE4, - 0xC602, 0xBE00, 0x4A26, 0x733A, 0x49BB, 0xC602, 0xBE00, 0x47A2, 0xC602, - 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000 - }; - - rtl8125_hw_disable_mac_mcu_bps(dev); - - for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8125b_2); i++) { - rtl8125_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8125b_2[i]); - } - - rtl8125_mac_ocp_write(tp, 0xFC26, 0x8000); - - rtl8125_mac_ocp_write(tp, 0xFC28, 0x13E6); - rtl8125_mac_ocp_write(tp, 0xFC2A, 0x0812); - rtl8125_mac_ocp_write(tp, 0xFC2C, 0x248C); - rtl8125_mac_ocp_write(tp, 0xFC2E, 0x12DA); - rtl8125_mac_ocp_write(tp, 0xFC30, 0x4A20); - rtl8125_mac_ocp_write(tp, 0xFC32, 0x47A0); - - rtl8125_mac_ocp_write(tp, 0xFC48, 0x003F); -} - -static void -rtl8125_hw_mac_mcu_config(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - if (tp->NotWrMcuPatchCode == TRUE) return; - - switch (tp->mcfg) { - case CFG_METHOD_2: - rtl8125_set_mac_mcu_8125a_1(dev); - break; - case CFG_METHOD_3: - rtl8125_set_mac_mcu_8125a_2(dev); - break; - case CFG_METHOD_4: - rtl8125_set_mac_mcu_8125b_1(dev); - break; - case CFG_METHOD_5: - rtl8125_set_mac_mcu_8125b_2(dev); - break; - } -} - -static void -rtl8125_hw_init(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u32 csi_tmp; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_enable_cfg9346_write(tp); - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_0); - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~BIT_7); - rtl8125_disable_cfg9346_write(tp); - RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) & ~BIT_7); - break; - } - - //Disable UPS - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xD40A, rtl8125_mac_ocp_read( tp, 0xD40A) & ~(BIT_4)); - break; - } - - rtl8125_hw_mac_mcu_config(dev); - - /*disable ocp phy power saving*/ - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) - rtl8125_disable_ocp_phy_power_saving(dev); - - //Set PCIE uncorrectable error status mask pcie 0x108 - csi_tmp = rtl8125_csi_read(tp, 0x108); - csi_tmp |= BIT_20; - rtl8125_csi_write(tp, 0x108, csi_tmp); - - rtl8125_enable_cfg9346_write(tp); - rtl8125_disable_linkchg_wakeup(dev); - rtl8125_disable_cfg9346_write(tp); - rtl8125_disable_magic_packet(dev); - rtl8125_disable_d0_speedup(tp); - rtl8125_set_pci_pme(tp, 0); - if (s0_magic_packet == 1) - rtl8125_enable_magic_packet(dev); -} - -static void -rtl8125_hw_ephy_config(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - rtl8125_ephy_write(tp, 0x01, 0xA812); - rtl8125_ephy_write(tp, 0x09, 0x520C); - rtl8125_ephy_write(tp, 0x04, 0xD000); - rtl8125_ephy_write(tp, 0x0D, 0xF702); - rtl8125_ephy_write(tp, 0x0A, 0x8653); - rtl8125_ephy_write(tp, 0x06, 0x001E); - rtl8125_ephy_write(tp, 0x08, 0x3595); - rtl8125_ephy_write(tp, 0x20, 0x9455); - rtl8125_ephy_write(tp, 0x21, 0x99FF); - rtl8125_ephy_write(tp, 0x02, 0x6046); - rtl8125_ephy_write(tp, 0x29, 0xFE00); - rtl8125_ephy_write(tp, 0x23, 0xAB62); - - rtl8125_ephy_write(tp, 0x41, 0xA80C); - rtl8125_ephy_write(tp, 0x49, 0x520C); - rtl8125_ephy_write(tp, 0x44, 0xD000); - rtl8125_ephy_write(tp, 0x4D, 0xF702); - rtl8125_ephy_write(tp, 0x4A, 0x8653); - rtl8125_ephy_write(tp, 0x46, 0x001E); - rtl8125_ephy_write(tp, 0x48, 0x3595); - rtl8125_ephy_write(tp, 0x60, 0x9455); - rtl8125_ephy_write(tp, 0x61, 0x99FF); - rtl8125_ephy_write(tp, 0x42, 0x6046); - rtl8125_ephy_write(tp, 0x69, 0xFE00); - rtl8125_ephy_write(tp, 0x63, 0xAB62); - break; - case CFG_METHOD_3: - rtl8125_ephy_write(tp, 0x04, 0xD000); - rtl8125_ephy_write(tp, 0x0A, 0x8653); - rtl8125_ephy_write(tp, 0x23, 0xAB66); - rtl8125_ephy_write(tp, 0x20, 0x9455); - rtl8125_ephy_write(tp, 0x21, 0x99FF); - rtl8125_ephy_write(tp, 0x29, 0xFE04); - - rtl8125_ephy_write(tp, 0x44, 0xD000); - rtl8125_ephy_write(tp, 0x4A, 0x8653); - rtl8125_ephy_write(tp, 0x63, 0xAB66); - rtl8125_ephy_write(tp, 0x60, 0x9455); - rtl8125_ephy_write(tp, 0x61, 0x99FF); - rtl8125_ephy_write(tp, 0x69, 0xFE04); - - ClearAndSetPCIePhyBit(tp, - 0x2A, - (BIT_14 | BIT_13 | BIT_12), - (BIT_13 | BIT_12) - ); - ClearPCIePhyBit(tp, 0x19, BIT_6); - SetPCIePhyBit(tp, 0x1B, (BIT_11 | BIT_10 | BIT_9)); - ClearPCIePhyBit(tp, 0x1B, (BIT_14 | BIT_13 | BIT_12)); - rtl8125_ephy_write(tp, 0x02, 0x6042); - rtl8125_ephy_write(tp, 0x06, 0x0014); - - ClearAndSetPCIePhyBit(tp, - 0x6A, - (BIT_14 | BIT_13 | BIT_12), - (BIT_13 | BIT_12) - ); - ClearPCIePhyBit(tp, 0x59, BIT_6); - SetPCIePhyBit(tp, 0x5B, (BIT_11 | BIT_10 | BIT_9)); - ClearPCIePhyBit(tp, 0x5B, (BIT_14 | BIT_13 | BIT_12)); - rtl8125_ephy_write(tp, 0x42, 0x6042); - rtl8125_ephy_write(tp, 0x46, 0x0014); - break; - case CFG_METHOD_4: - rtl8125_ephy_write(tp, 0x06, 0x001F); - rtl8125_ephy_write(tp, 0x0A, 0xB66B); - rtl8125_ephy_write(tp, 0x01, 0xA852); - rtl8125_ephy_write(tp, 0x24, 0x0008); - rtl8125_ephy_write(tp, 0x2F, 0x6052); - rtl8125_ephy_write(tp, 0x0D, 0xF716); - rtl8125_ephy_write(tp, 0x20, 0xD477); - rtl8125_ephy_write(tp, 0x21, 0x4477); - rtl8125_ephy_write(tp, 0x22, 0x0013); - rtl8125_ephy_write(tp, 0x23, 0xBB66); - rtl8125_ephy_write(tp, 0x0B, 0xA909); - rtl8125_ephy_write(tp, 0x29, 0xFF04); - rtl8125_ephy_write(tp, 0x1B, 0x1EA0); - - rtl8125_ephy_write(tp, 0x46, 0x001F); - rtl8125_ephy_write(tp, 0x4A, 0xB66B); - rtl8125_ephy_write(tp, 0x41, 0xA84A); - rtl8125_ephy_write(tp, 0x64, 0x000C); - rtl8125_ephy_write(tp, 0x6F, 0x604A); - rtl8125_ephy_write(tp, 0x4D, 0xF716); - rtl8125_ephy_write(tp, 0x60, 0xD477); - rtl8125_ephy_write(tp, 0x61, 0x4477); - rtl8125_ephy_write(tp, 0x62, 0x0013); - rtl8125_ephy_write(tp, 0x63, 0xBB66); - rtl8125_ephy_write(tp, 0x4B, 0xA909); - rtl8125_ephy_write(tp, 0x69, 0xFF04); - rtl8125_ephy_write(tp, 0x5B, 0x1EA0); - break; - case CFG_METHOD_5: - rtl8125_ephy_write(tp, 0x0B, 0xA908); - rtl8125_ephy_write(tp, 0x22, 0x0023); - rtl8125_ephy_write(tp, 0x1E, 0x28EB); - - rtl8125_ephy_write(tp, 0x4B, 0xA908); - rtl8125_ephy_write(tp, 0x62, 0x0023); - rtl8125_ephy_write(tp, 0x5E, 0x28EB); - break; - } -} - -static int -rtl8125_check_hw_phy_mcu_code_ver(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int ram_code_ver_match = 0; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - mdio_direct_write_phy_ocp(tp, 0xA436, 0x801E); - tp->hw_ram_code_ver = mdio_direct_read_phy_ocp(tp, 0xA438); - break; - default: - tp->hw_ram_code_ver = ~0; - break; - } - - 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 -rtl8125_write_hw_phy_mcu_code_ver(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - mdio_direct_write_phy_ocp(tp, 0xA436, 0x801E); - mdio_direct_write_phy_ocp(tp, 0xA438, tp->sw_ram_code_ver); - tp->hw_ram_code_ver = tp->sw_ram_code_ver; - break; - } -} - -static void -rtl8125_acquire_phy_mcu_patch_key_lock(struct rtl8125_private *tp) -{ - u16 PatchKey; - - switch (tp->mcfg) { - case CFG_METHOD_2: - PatchKey = 0x8600; - break; - case CFG_METHOD_3: - PatchKey = 0x8601; - break; - case CFG_METHOD_4: - PatchKey = 0x3700; - break; - case CFG_METHOD_5: - PatchKey = 0x3701; - break; - default: - return; - } - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8024); - mdio_direct_write_phy_ocp(tp, 0xA438, PatchKey); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xB82E); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0001); -} - -static void -rtl8125_release_phy_mcu_patch_key_lock(struct rtl8125_private *tp) -{ - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - mdio_direct_write_phy_ocp(tp, 0xA436, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - ClearEthPhyOcpBit(tp, 0xB82E, BIT_0); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8024); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - break; - default: - break; - } -} - -static bool -rtl8125_wait_phy_mcu_patch_request_ready(struct rtl8125_private *tp) -{ - u16 gphy_val; - u16 WaitCount; - bool bSuccess = TRUE; - - WaitCount = 0; - do { - gphy_val = mdio_direct_read_phy_ocp(tp, 0xB800); - gphy_val &= BIT_6; - udelay(100); - WaitCount++; - } while(gphy_val != BIT_6 && WaitCount < 1000); - - if (gphy_val != BIT_6 && WaitCount == 1000) bSuccess = FALSE; - - if (!bSuccess) - dprintk("rtl8125_wait_phy_mcu_patch_request_ready fail.\n"); - - return bSuccess; -} - -bool -rtl8125_set_phy_mcu_patch_request(struct rtl8125_private *tp) -{ - SetEthPhyOcpBit(tp, 0xB820, BIT_4); - - return rtl8125_wait_phy_mcu_patch_request_ready(tp); -} - -bool -rtl8125_clear_phy_mcu_patch_request(struct rtl8125_private *tp) -{ - ClearEthPhyOcpBit(tp, 0xB820, BIT_4); - - return rtl8125_wait_phy_mcu_patch_request_ready(tp); -} - -static void -rtl8125_set_phy_mcu_ram_code(struct net_device *dev, const u16 *ramcode, u16 codesize) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u16 i; - u16 addr; - u16 val; - - if (ramcode == NULL || codesize % 2) { - goto out; - } - - for (i = 0; i < codesize; i += 2) { - addr = ramcode[i]; - val = ramcode[i + 1]; - if (addr == 0xFFFF && val == 0xFFFF) { - break; - } - mdio_direct_write_phy_ocp(tp, addr, val); - } - -out: - return; -} - -static void -rtl8125_real_set_phy_mcu_8125a_1(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - rtl8125_acquire_phy_mcu_patch_key_lock(tp); - - - SetEthPhyOcpBit(tp, 0xB820, BIT_7); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8013); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8021); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x802f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x803d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8042); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8051); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8051); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa088); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a50); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8008); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd014); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1a3); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x401a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd707); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x40c2); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60a6); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f8b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a86); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a6c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8080); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd019); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1a2); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x401a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd707); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x40c4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60a6); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f8b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a86); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a84); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd503); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8970); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c07); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0901); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xcf09); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd705); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xceff); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf0a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1213); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8401); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8580); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1253); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd064); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd181); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4018); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xc50f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd706); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2c59); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x804d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xc60f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xc605); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xae02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x10fd); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA026); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA024); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA022); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x10f4); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA020); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1252); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA006); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1206); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA004); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a78); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a60); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a4f); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA008); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x3f00); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0010); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8066); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x807c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8089); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x808e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x80a0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x80b2); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x80c2); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x62db); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x655c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd73e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60e9); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x614a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x61ab); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0505); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0509); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x653c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd73e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60e9); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x614a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x61ab); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0502); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0506); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x050a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd73e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60e9); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x614a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x61ab); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0505); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0506); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x050c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd73e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60e9); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x614a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x61ab); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0509); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x050a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x050c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0508); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd73e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60e9); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x614a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x61ab); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0321); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0502); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0321); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0321); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0508); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0321); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0346); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8208); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x609d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa50f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x001a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x001a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x607d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00ab); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00ab); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60fd); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa50f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaa0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x017b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a05); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x017b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60fd); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa50f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaa0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x01e0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a05); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x01e0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60fd); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa50f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaa0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0231); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a05); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0231); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08E); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08C); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0221); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08A); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x01ce); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA088); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0169); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA086); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00a6); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA084); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x000d); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA082); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0308); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA080); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x029f); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA090); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x007f); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0020); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8017); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x801b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8029); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8054); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x805a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8064); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x80a7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x9430); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x9480); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb408); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd120); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd057); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x064b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb80); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x9906); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0567); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb94); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8190); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x82a0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x800a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8406); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8dff); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa840); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0773); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb91); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4063); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd139); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd140); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07dc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa610); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa110); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa2a0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4045); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa180); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x405d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa720); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0742); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07ec); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f74); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0742); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd702); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7fb6); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8190); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x82a0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8610); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07dc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x064b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07c0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5fa7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0481); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x94bc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x870c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa190); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa00a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa280); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8220); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x078e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb92); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa840); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4063); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd140); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd150); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd703); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60a0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6121); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x61a2); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6223); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf02f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d10); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf00f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d20); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf00a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d30); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf005); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d40); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa610); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa008); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4046); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x405d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa720); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0742); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07f7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f74); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0742); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd702); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7fb5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x800a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x3ad4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0537); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8610); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8840); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x064b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8301); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x800a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8190); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x82a0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa70c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x9402); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x890c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8840); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x064b); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10E); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0642); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10C); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0686); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10A); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0788); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA108); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x047b); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA106); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x065c); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA104); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0769); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA102); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0565); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA100); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x06f9); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA110); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00ff); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb87c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8530); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb87e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf85); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x3caf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8593); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf85); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x9caf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x85a5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd702); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5afb); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xe083); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfb0c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x020d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x021b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x10bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86d7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86da); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbe0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x83fc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1b10); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xda02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xdd02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5afb); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xe083); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfd0c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x020d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x021b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x10bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86dd); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86e0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbe0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x83fe); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1b10); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xe002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf2f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbd02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2cac); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0286); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x65af); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x212b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x022c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86b6); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf21); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cd1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x03bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8710); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x870d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8719); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8716); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x871f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x871c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8728); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8725); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8707); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbad); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x281c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd100); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1302); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2202); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2b02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xae1a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd101); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1302); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2202); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2b02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd101); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x3402); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x3102); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x3d02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x3a02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4302); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4c02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4902); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd100); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2e02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x3702); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4602); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4f02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf35); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7ff8); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfaef); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x69bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86e3); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbbf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86fb); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86e6); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbbf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86fe); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86e9); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbbf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86ec); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbbf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86ef); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0262); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7cbf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86f2); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0262); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7cbf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86f5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0262); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7cbf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x86f8); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0262); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7cef); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x96fe); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfc04); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf8fa); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xef69); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xef02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6273); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf202); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6273); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf502); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6273); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf802); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6273); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xef96); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfefc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0420); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb540); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x53b5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4086); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb540); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb9b5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x40c8); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb03a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xc8b0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbac8); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb13a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xc8b1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xba77); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbd26); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffbd); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2677); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbd28); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffbd); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2840); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbd26); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xc8bd); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2640); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbd28); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xc8bd); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x28bb); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa430); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x98b0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1eba); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb01e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xdcb0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e98); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb09e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbab0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x9edc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb09e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x98b1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1eba); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb11e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xdcb1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e98); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb19e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbab1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x9edc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb19e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x11b0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e22); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb01e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x33b0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e11); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb09e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x22b0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x9e33); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb09e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x11b1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e22); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb11e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x33b1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e11); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb19e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x22b1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x9e33); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb19e); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb85e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2f71); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb860); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x20d9); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb862); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2109); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb864); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x34e7); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb878); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x000f); - - - ClearEthPhyOcpBit(tp, 0xB820, BIT_7); - - - rtl8125_release_phy_mcu_patch_key_lock(tp); -} - -static void -rtl8125_set_phy_mcu_8125a_1(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - rtl8125_set_phy_mcu_patch_request(tp); - - rtl8125_real_set_phy_mcu_8125a_1(dev); - - rtl8125_clear_phy_mcu_patch_request(tp); -} - -static void -rtl8125_real_set_phy_mcu_8125a_2(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - rtl8125_acquire_phy_mcu_patch_key_lock(tp); - - - SetEthPhyOcpBit(tp, 0xB820, BIT_7); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x808b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x808f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8093); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8097); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x809d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x80a1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x80aa); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x607b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x40da); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf00e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x42da); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf01e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x615b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1456); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x14a4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x14bc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f2e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf01c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1456); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x14a4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x14bc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f2e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf024); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1456); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x14a4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x14bc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f2e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf02c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1456); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x14a4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x14bc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f2e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf034); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd719); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4118); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xac11); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa410); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4779); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xac0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xae01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1444); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf034); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd719); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4118); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xac22); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa420); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4559); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xac0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xae01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1444); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf023); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd719); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4118); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xac44); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa440); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4339); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xac0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xae01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1444); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf012); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd719); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4118); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xac88); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa480); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4119); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xac0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xae01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1444); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf001); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1456); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5fac); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xc48f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x141b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x121a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd0b4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1bb); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0898); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd0b4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1bb); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a0e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd064); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd18a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0b7e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x401c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa804); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8804); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x053b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa301); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0648); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xc520); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa201); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x252d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1646); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd708); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4006); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1646); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0308); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA026); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0307); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA024); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1645); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA022); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0647); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA020); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x053a); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA006); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0b7c); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA004); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a0c); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0896); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x11a1); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA008); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xff00); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0010); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8015); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xad02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x02d7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00ed); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0509); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xc100); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x008f); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08E); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08C); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08A); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA088); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA086); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA084); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA082); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x008d); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA080); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00eb); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA090); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0103); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0020); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8014); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8018); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8024); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8051); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8055); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8072); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x80dc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfffd); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfffd); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8301); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x800a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8190); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x82a0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa70c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x9402); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x890c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8840); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa380); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x066e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb91); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4063); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd139); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd140); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa610); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa110); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa2a0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4085); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa180); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8280); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x405d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa720); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0743); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07f0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f74); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0743); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd702); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7fb6); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8190); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x82a0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8610); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x066e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd158); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd04d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x03d4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x94bc); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x870c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8380); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd10d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07c4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5fb4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa190); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa00a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa280); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa404); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa220); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd130); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07c4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5fb4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xbb80); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1c4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd074); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa301); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x604b); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa90c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0556); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb92); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4063); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd116); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd119); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd703); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x60a0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6241); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x63e2); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6583); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf054); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x611e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x40da); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d10); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf02f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d50); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf02a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x611e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x40da); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d20); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf021); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d60); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf01c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x611e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x40da); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d30); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf013); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d70); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf00e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x611e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x40da); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d40); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf005); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d80); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e8); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa610); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x405d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa720); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ff4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa008); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x4046); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0743); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07fb); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd703); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7f6f); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7f4e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7f2d); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7f0c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x800a); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d00); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e8); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0743); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd702); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7fb5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x3ad4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0556); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8610); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x066e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1f5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xd049); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x01ec); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10E); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x01ea); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10C); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x06a9); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10A); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x078a); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA108); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x03d2); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA106); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x067f); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA104); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0665); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA102); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA100); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xA110); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00fc); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb87c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8530); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb87e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf85); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x3caf); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8545); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf85); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x45af); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8545); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xee82); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf900); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0103); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf03); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7f8); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xe0a6); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00e1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa601); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xef01); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x58f0); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa080); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x37a1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8402); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xae16); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa185); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x02ae); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x11a1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8702); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xae0c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xa188); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x02ae); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x07a1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8902); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xae02); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xae1c); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xe0b4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x62e1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb463); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6901); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xe4b4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x62e5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb463); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xe0b4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x62e1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb463); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6901); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xe4b4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x62e5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xb463); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xfc04); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb85e); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x03b3); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb860); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb862); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb864); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); - mdio_direct_write_phy_ocp(tp, 0xA436, 0xb878); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0001); - - - ClearEthPhyOcpBit(tp, 0xB820, BIT_7); - - - rtl8125_release_phy_mcu_patch_key_lock(tp); -} - -static void -rtl8125_set_phy_mcu_8125a_2(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - rtl8125_set_phy_mcu_patch_request(tp); - - rtl8125_real_set_phy_mcu_8125a_2(dev); - - rtl8125_clear_phy_mcu_patch_request(tp); -} - -static const u16 phy_mcu_ram_code_8125b_1[] = { - 0xa436, 0x8024, 0xa438, 0x3700, 0xa436, 0xB82E, 0xa438, 0x0001, - 0xb820, 0x0090, 0xa436, 0xA016, 0xa438, 0x0000, 0xa436, 0xA012, - 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, - 0xa438, 0x1800, 0xa438, 0x8025, 0xa438, 0x1800, 0xa438, 0x803a, - 0xa438, 0x1800, 0xa438, 0x8044, 0xa438, 0x1800, 0xa438, 0x8083, - 0xa438, 0x1800, 0xa438, 0x808d, 0xa438, 0x1800, 0xa438, 0x808d, - 0xa438, 0x1800, 0xa438, 0x808d, 0xa438, 0xd712, 0xa438, 0x4077, - 0xa438, 0xd71e, 0xa438, 0x4159, 0xa438, 0xd71e, 0xa438, 0x6099, - 0xa438, 0x7f44, 0xa438, 0x1800, 0xa438, 0x1a14, 0xa438, 0x9040, - 0xa438, 0x9201, 0xa438, 0x1800, 0xa438, 0x1b1a, 0xa438, 0xd71e, - 0xa438, 0x2425, 0xa438, 0x1a14, 0xa438, 0xd71f, 0xa438, 0x3ce5, - 0xa438, 0x1afb, 0xa438, 0x1800, 0xa438, 0x1b00, 0xa438, 0xd712, - 0xa438, 0x4077, 0xa438, 0xd71e, 0xa438, 0x4159, 0xa438, 0xd71e, - 0xa438, 0x60b9, 0xa438, 0x2421, 0xa438, 0x1c17, 0xa438, 0x1800, - 0xa438, 0x1a14, 0xa438, 0x9040, 0xa438, 0x1800, 0xa438, 0x1c2c, - 0xa438, 0xd71e, 0xa438, 0x2425, 0xa438, 0x1a14, 0xa438, 0xd71f, - 0xa438, 0x3ce5, 0xa438, 0x1c0f, 0xa438, 0x1800, 0xa438, 0x1c13, - 0xa438, 0xd702, 0xa438, 0xd501, 0xa438, 0x6072, 0xa438, 0x8401, - 0xa438, 0xf002, 0xa438, 0xa401, 0xa438, 0x1000, 0xa438, 0x146e, - 0xa438, 0x1800, 0xa438, 0x0b77, 0xa438, 0xd703, 0xa438, 0x665d, - 0xa438, 0x653e, 0xa438, 0x641f, 0xa438, 0xd700, 0xa438, 0x62c4, - 0xa438, 0x6185, 0xa438, 0x6066, 0xa438, 0x1800, 0xa438, 0x165a, - 0xa438, 0xc101, 0xa438, 0xcb00, 0xa438, 0x1000, 0xa438, 0x1945, - 0xa438, 0xd700, 0xa438, 0x7fa6, 0xa438, 0x1800, 0xa438, 0x807d, - 0xa438, 0xc102, 0xa438, 0xcb00, 0xa438, 0x1000, 0xa438, 0x1945, - 0xa438, 0xd700, 0xa438, 0x2569, 0xa438, 0x8058, 0xa438, 0x1800, - 0xa438, 0x807d, 0xa438, 0xc104, 0xa438, 0xcb00, 0xa438, 0x1000, - 0xa438, 0x1945, 0xa438, 0xd700, 0xa438, 0x7fa4, 0xa438, 0x1800, - 0xa438, 0x807d, 0xa438, 0xc120, 0xa438, 0xcb00, 0xa438, 0x1000, - 0xa438, 0x1945, 0xa438, 0xd703, 0xa438, 0x7fbf, 0xa438, 0x1800, - 0xa438, 0x807d, 0xa438, 0xc140, 0xa438, 0xcb00, 0xa438, 0x1000, - 0xa438, 0x1945, 0xa438, 0xd703, 0xa438, 0x7fbe, 0xa438, 0x1800, - 0xa438, 0x807d, 0xa438, 0xc180, 0xa438, 0xcb00, 0xa438, 0x1000, - 0xa438, 0x1945, 0xa438, 0xd703, 0xa438, 0x7fbd, 0xa438, 0xc100, - 0xa438, 0xcb00, 0xa438, 0xd708, 0xa438, 0x6018, 0xa438, 0x1800, - 0xa438, 0x165a, 0xa438, 0x1000, 0xa438, 0x14f6, 0xa438, 0xd014, - 0xa438, 0xd1e3, 0xa438, 0x1000, 0xa438, 0x1356, 0xa438, 0xd705, - 0xa438, 0x5fbe, 0xa438, 0x1800, 0xa438, 0x1559, 0xa436, 0xA026, - 0xa438, 0xffff, 0xa436, 0xA024, 0xa438, 0xffff, 0xa436, 0xA022, - 0xa438, 0xffff, 0xa436, 0xA020, 0xa438, 0x1557, 0xa436, 0xA006, - 0xa438, 0x1677, 0xa436, 0xA004, 0xa438, 0x0b75, 0xa436, 0xA002, - 0xa438, 0x1c17, 0xa436, 0xA000, 0xa438, 0x1b04, 0xa436, 0xA008, - 0xa438, 0x1f00, 0xa436, 0xA016, 0xa438, 0x0020, 0xa436, 0xA012, - 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, - 0xa438, 0x1800, 0xa438, 0x817f, 0xa438, 0x1800, 0xa438, 0x82ab, - 0xa438, 0x1800, 0xa438, 0x83f8, 0xa438, 0x1800, 0xa438, 0x8444, - 0xa438, 0x1800, 0xa438, 0x8454, 0xa438, 0x1800, 0xa438, 0x8459, - 0xa438, 0x1800, 0xa438, 0x8465, 0xa438, 0xcb11, 0xa438, 0xa50c, - 0xa438, 0x8310, 0xa438, 0xd701, 0xa438, 0x4076, 0xa438, 0x0c03, - 0xa438, 0x0903, 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, - 0xa438, 0x0d00, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d00, - 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0x1000, 0xa438, 0x0a4d, - 0xa438, 0xcb12, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x5f84, 0xa438, 0xd102, 0xa438, 0xd040, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xd701, - 0xa438, 0x60f3, 0xa438, 0xd413, 0xa438, 0x1000, 0xa438, 0x0a37, - 0xa438, 0xd410, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xcb13, - 0xa438, 0xa108, 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8108, - 0xa438, 0xa00a, 0xa438, 0xa910, 0xa438, 0xa780, 0xa438, 0xd14a, - 0xa438, 0xd048, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd701, - 0xa438, 0x6255, 0xa438, 0xd700, 0xa438, 0x5f74, 0xa438, 0x6326, - 0xa438, 0xd702, 0xa438, 0x5f07, 0xa438, 0x800a, 0xa438, 0xa004, - 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8004, 0xa438, 0xa001, - 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, 0xa438, 0x0c03, - 0xa438, 0x0902, 0xa438, 0xffe2, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd71f, 0xa438, 0x5fab, 0xa438, 0xba08, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f8b, 0xa438, 0x9a08, - 0xa438, 0x800a, 0xa438, 0xd702, 0xa438, 0x6535, 0xa438, 0xd40d, - 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xcb14, 0xa438, 0xa004, - 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8004, 0xa438, 0xa001, - 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, 0xa438, 0xa00a, - 0xa438, 0xa780, 0xa438, 0xd14a, 0xa438, 0xd048, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x6206, - 0xa438, 0xd702, 0xa438, 0x5f47, 0xa438, 0x800a, 0xa438, 0xa004, - 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8004, 0xa438, 0xa001, - 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, 0xa438, 0x0c03, - 0xa438, 0x0902, 0xa438, 0x1800, 0xa438, 0x8064, 0xa438, 0x800a, - 0xa438, 0xd40e, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xb920, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, - 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x7f8c, 0xa438, 0xd701, 0xa438, 0x6073, 0xa438, 0xd701, - 0xa438, 0x4216, 0xa438, 0xa004, 0xa438, 0x1000, 0xa438, 0x0a42, - 0xa438, 0x8004, 0xa438, 0xa001, 0xa438, 0x1000, 0xa438, 0x0a42, - 0xa438, 0x8001, 0xa438, 0xd120, 0xa438, 0xd040, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x8504, - 0xa438, 0xcb21, 0xa438, 0xa301, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd700, 0xa438, 0x5f9f, 0xa438, 0x8301, 0xa438, 0xd704, - 0xa438, 0x40e0, 0xa438, 0xd196, 0xa438, 0xd04d, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xcb22, - 0xa438, 0x1000, 0xa438, 0x0a6d, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0xa640, 0xa438, 0x9503, 0xa438, 0x8910, 0xa438, 0x8720, - 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d01, - 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d01, 0xa438, 0x1000, - 0xa438, 0x0a7d, 0xa438, 0x0c1f, 0xa438, 0x0f14, 0xa438, 0xcb23, - 0xa438, 0x8fc0, 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0xaf40, - 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0x0cc0, 0xa438, 0x0f80, - 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0xafc0, 0xa438, 0x1000, - 0xa438, 0x0a25, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd701, - 0xa438, 0x5dee, 0xa438, 0xcb24, 0xa438, 0x8f1f, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd701, 0xa438, 0x7f6e, 0xa438, 0xa111, - 0xa438, 0xa215, 0xa438, 0xa401, 0xa438, 0x8404, 0xa438, 0xa720, - 0xa438, 0xcb25, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8640, - 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x0b43, 0xa438, 0x1000, - 0xa438, 0x0b86, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xb920, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, - 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x7f8c, 0xa438, 0xcb26, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd71f, 0xa438, 0x5f82, 0xa438, 0x8111, 0xa438, 0x8205, - 0xa438, 0x8404, 0xa438, 0xcb27, 0xa438, 0xd404, 0xa438, 0x1000, - 0xa438, 0x0a37, 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, - 0xa438, 0x0d02, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d02, - 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0xa710, 0xa438, 0xa104, - 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8104, 0xa438, 0xa001, - 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, 0xa438, 0xa120, - 0xa438, 0xaa0f, 0xa438, 0x8110, 0xa438, 0xa284, 0xa438, 0xa404, - 0xa438, 0xa00a, 0xa438, 0xd193, 0xa438, 0xd046, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xcb28, - 0xa438, 0xa110, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, - 0xa438, 0x5fa8, 0xa438, 0x8110, 0xa438, 0x8284, 0xa438, 0xa404, - 0xa438, 0x800a, 0xa438, 0x8710, 0xa438, 0xb804, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f82, 0xa438, 0x9804, - 0xa438, 0xcb29, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x5f85, 0xa438, 0xa710, 0xa438, 0xb820, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f65, 0xa438, 0x9820, - 0xa438, 0xcb2a, 0xa438, 0xa190, 0xa438, 0xa284, 0xa438, 0xa404, - 0xa438, 0xa00a, 0xa438, 0xd13d, 0xa438, 0xd04a, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x3444, 0xa438, 0x8149, - 0xa438, 0xa220, 0xa438, 0xd1a0, 0xa438, 0xd040, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x3444, 0xa438, 0x8151, - 0xa438, 0xd702, 0xa438, 0x5f51, 0xa438, 0xcb2f, 0xa438, 0xa302, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd708, 0xa438, 0x5f63, - 0xa438, 0xd411, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0x8302, - 0xa438, 0xd409, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xb920, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, - 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x7f8c, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x5fa3, 0xa438, 0x8190, 0xa438, 0x82a4, 0xa438, 0x8404, - 0xa438, 0x800a, 0xa438, 0xb808, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd71f, 0xa438, 0x7fa3, 0xa438, 0x9808, 0xa438, 0x1800, - 0xa438, 0x0433, 0xa438, 0xcb15, 0xa438, 0xa508, 0xa438, 0xd700, - 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d01, 0xa438, 0xf003, - 0xa438, 0x0c1f, 0xa438, 0x0d01, 0xa438, 0x1000, 0xa438, 0x0a7d, - 0xa438, 0x1000, 0xa438, 0x0a4d, 0xa438, 0xa301, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5f9f, 0xa438, 0x8301, - 0xa438, 0xd704, 0xa438, 0x40e0, 0xa438, 0xd115, 0xa438, 0xd04f, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, - 0xa438, 0xd413, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xcb16, - 0xa438, 0x1000, 0xa438, 0x0a6d, 0xa438, 0x0c03, 0xa438, 0x1502, - 0xa438, 0xa640, 0xa438, 0x9503, 0xa438, 0x8720, 0xa438, 0xd17a, - 0xa438, 0xd04c, 0xa438, 0x0c1f, 0xa438, 0x0f14, 0xa438, 0xcb17, - 0xa438, 0x8fc0, 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0xaf40, - 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0x0cc0, 0xa438, 0x0f80, - 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0xafc0, 0xa438, 0x1000, - 0xa438, 0x0a25, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd701, - 0xa438, 0x61ce, 0xa438, 0xd700, 0xa438, 0x5db4, 0xa438, 0xcb18, - 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8640, 0xa438, 0x9503, - 0xa438, 0xa720, 0xa438, 0x1000, 0xa438, 0x0b43, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xffd6, 0xa438, 0x8f1f, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd701, 0xa438, 0x7f8e, 0xa438, 0xa131, - 0xa438, 0xaa0f, 0xa438, 0xa2d5, 0xa438, 0xa407, 0xa438, 0xa720, - 0xa438, 0x8310, 0xa438, 0xa308, 0xa438, 0x8308, 0xa438, 0xcb19, - 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8640, 0xa438, 0x9503, - 0xa438, 0x1000, 0xa438, 0x0b43, 0xa438, 0x1000, 0xa438, 0x0b86, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xb920, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, 0xa438, 0x9920, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f8c, - 0xa438, 0xcb1a, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x5f82, 0xa438, 0x8111, 0xa438, 0x82c5, 0xa438, 0xa404, - 0xa438, 0x8402, 0xa438, 0xb804, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd71f, 0xa438, 0x7f82, 0xa438, 0x9804, 0xa438, 0xcb1b, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5f85, - 0xa438, 0xa710, 0xa438, 0xb820, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd71f, 0xa438, 0x7f65, 0xa438, 0x9820, 0xa438, 0xcb1c, - 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d02, - 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d02, 0xa438, 0x1000, - 0xa438, 0x0a7d, 0xa438, 0xa110, 0xa438, 0xa284, 0xa438, 0xa404, - 0xa438, 0x8402, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, - 0xa438, 0x5fa8, 0xa438, 0xcb1d, 0xa438, 0xa180, 0xa438, 0xa402, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fa8, - 0xa438, 0xa220, 0xa438, 0xd1f5, 0xa438, 0xd049, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x3444, 0xa438, 0x8221, - 0xa438, 0xd702, 0xa438, 0x5f51, 0xa438, 0xb920, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, 0xa438, 0x9920, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f8c, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fa3, - 0xa438, 0xa504, 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, - 0xa438, 0x0d00, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d00, - 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0xa00a, 0xa438, 0x8190, - 0xa438, 0x82a4, 0xa438, 0x8402, 0xa438, 0xa404, 0xa438, 0xb808, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7fa3, - 0xa438, 0x9808, 0xa438, 0xcb2b, 0xa438, 0xcb2c, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5f84, 0xa438, 0xd14a, - 0xa438, 0xd048, 0xa438, 0xa780, 0xa438, 0xcb2d, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5f94, 0xa438, 0x6208, - 0xa438, 0xd702, 0xa438, 0x5f27, 0xa438, 0x800a, 0xa438, 0xa004, - 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8004, 0xa438, 0xa001, - 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, 0xa438, 0x0c03, - 0xa438, 0x0902, 0xa438, 0xa00a, 0xa438, 0xffe9, 0xa438, 0xcb2e, - 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d02, - 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d02, 0xa438, 0x1000, - 0xa438, 0x0a7d, 0xa438, 0xa190, 0xa438, 0xa284, 0xa438, 0xa406, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fa8, - 0xa438, 0xa220, 0xa438, 0xd1a0, 0xa438, 0xd040, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x3444, 0xa438, 0x827d, - 0xa438, 0xd702, 0xa438, 0x5f51, 0xa438, 0xcb2f, 0xa438, 0xa302, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd708, 0xa438, 0x5f63, - 0xa438, 0xd411, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0x8302, - 0xa438, 0xd409, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xb920, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, - 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x7f8c, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x5fa3, 0xa438, 0x8190, 0xa438, 0x82a4, 0xa438, 0x8406, - 0xa438, 0x800a, 0xa438, 0xb808, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd71f, 0xa438, 0x7fa3, 0xa438, 0x9808, 0xa438, 0x1800, - 0xa438, 0x0433, 0xa438, 0xcb30, 0xa438, 0x8380, 0xa438, 0xcb31, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5f86, - 0xa438, 0x9308, 0xa438, 0xb204, 0xa438, 0xb301, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd701, 0xa438, 0x5fa2, 0xa438, 0xb302, - 0xa438, 0x9204, 0xa438, 0xcb32, 0xa438, 0xd408, 0xa438, 0x1000, - 0xa438, 0x0a37, 0xa438, 0xd141, 0xa438, 0xd043, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xd704, - 0xa438, 0x4ccc, 0xa438, 0xd700, 0xa438, 0x4c81, 0xa438, 0xd702, - 0xa438, 0x609e, 0xa438, 0xd1e5, 0xa438, 0xd04d, 0xa438, 0xf003, - 0xa438, 0xd1e5, 0xa438, 0xd04d, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xd700, 0xa438, 0x6083, - 0xa438, 0x0c1f, 0xa438, 0x0d01, 0xa438, 0xf003, 0xa438, 0x0c1f, - 0xa438, 0x0d01, 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0x8710, - 0xa438, 0xa108, 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8108, - 0xa438, 0xa203, 0xa438, 0x8120, 0xa438, 0x8a0f, 0xa438, 0xa111, - 0xa438, 0x8204, 0xa438, 0xa140, 0xa438, 0x1000, 0xa438, 0x0a42, - 0xa438, 0x8140, 0xa438, 0xd17a, 0xa438, 0xd04b, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xa204, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fa7, - 0xa438, 0xb920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x5fac, 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd71f, 0xa438, 0x7f8c, 0xa438, 0xd404, 0xa438, 0x1000, - 0xa438, 0x0a37, 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, - 0xa438, 0x0d02, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d02, - 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0xa710, 0xa438, 0x8101, - 0xa438, 0x8201, 0xa438, 0xa104, 0xa438, 0x1000, 0xa438, 0x0a42, - 0xa438, 0x8104, 0xa438, 0xa120, 0xa438, 0xaa0f, 0xa438, 0x8110, - 0xa438, 0xa284, 0xa438, 0xa404, 0xa438, 0xa00a, 0xa438, 0xd193, - 0xa438, 0xd047, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, - 0xa438, 0x5fb4, 0xa438, 0xa110, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd700, 0xa438, 0x5fa8, 0xa438, 0xa180, 0xa438, 0xd13d, - 0xa438, 0xd04a, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, - 0xa438, 0x5fb4, 0xa438, 0xf024, 0xa438, 0xa710, 0xa438, 0xa00a, - 0xa438, 0x8190, 0xa438, 0x8204, 0xa438, 0xa280, 0xa438, 0xa404, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fa7, - 0xa438, 0x8710, 0xa438, 0xb920, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd71f, 0xa438, 0x5fac, 0xa438, 0x9920, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f8c, 0xa438, 0x800a, - 0xa438, 0x8190, 0xa438, 0x8284, 0xa438, 0x8406, 0xa438, 0xd700, - 0xa438, 0x4121, 0xa438, 0xd701, 0xa438, 0x60f3, 0xa438, 0xd1e5, - 0xa438, 0xd04d, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, - 0xa438, 0x5fb4, 0xa438, 0x8710, 0xa438, 0xa00a, 0xa438, 0x8190, - 0xa438, 0x8204, 0xa438, 0xa280, 0xa438, 0xa404, 0xa438, 0xb920, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, - 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, - 0xa438, 0x7f8c, 0xa438, 0xcb33, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd71f, 0xa438, 0x5f85, 0xa438, 0xa710, 0xa438, 0xb820, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f65, - 0xa438, 0x9820, 0xa438, 0xcb34, 0xa438, 0xa00a, 0xa438, 0xa190, - 0xa438, 0xa284, 0xa438, 0xa404, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd700, 0xa438, 0x5fa9, 0xa438, 0xd701, 0xa438, 0x6853, - 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d00, - 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d00, 0xa438, 0x1000, - 0xa438, 0x0a7d, 0xa438, 0x8190, 0xa438, 0x8284, 0xa438, 0xcb35, - 0xa438, 0xd407, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0x8110, - 0xa438, 0x8204, 0xa438, 0xa280, 0xa438, 0xa00a, 0xa438, 0xd704, - 0xa438, 0x4215, 0xa438, 0xa304, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd700, 0xa438, 0x5fb8, 0xa438, 0xd1c3, 0xa438, 0xd043, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, - 0xa438, 0x8304, 0xa438, 0xd700, 0xa438, 0x4109, 0xa438, 0xf01e, - 0xa438, 0xcb36, 0xa438, 0xd412, 0xa438, 0x1000, 0xa438, 0x0a37, - 0xa438, 0xd700, 0xa438, 0x6309, 0xa438, 0xd702, 0xa438, 0x42c7, - 0xa438, 0x800a, 0xa438, 0x8180, 0xa438, 0x8280, 0xa438, 0x8404, - 0xa438, 0xa004, 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8004, - 0xa438, 0xa001, 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, - 0xa438, 0x0c03, 0xa438, 0x0902, 0xa438, 0xa00a, 0xa438, 0xd14a, - 0xa438, 0xd048, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, - 0xa438, 0x5fb4, 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, - 0xa438, 0x0d02, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d02, - 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0xcc55, 0xa438, 0xcb37, - 0xa438, 0xa00a, 0xa438, 0xa190, 0xa438, 0xa2a4, 0xa438, 0xa404, - 0xa438, 0xd700, 0xa438, 0x6041, 0xa438, 0xa402, 0xa438, 0xd13d, - 0xa438, 0xd04a, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, - 0xa438, 0x5fb4, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, - 0xa438, 0x5fa9, 0xa438, 0xd702, 0xa438, 0x5f71, 0xa438, 0xcb38, - 0xa438, 0x8224, 0xa438, 0xa288, 0xa438, 0x8180, 0xa438, 0xa110, - 0xa438, 0xa404, 0xa438, 0x800a, 0xa438, 0xd700, 0xa438, 0x6041, - 0xa438, 0x8402, 0xa438, 0xd415, 0xa438, 0x1000, 0xa438, 0x0a37, - 0xa438, 0xd13d, 0xa438, 0xd04a, 0xa438, 0x1000, 0xa438, 0x0a5e, - 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xcb39, 0xa438, 0xa00a, - 0xa438, 0xa190, 0xa438, 0xa2a0, 0xa438, 0xa404, 0xa438, 0xd700, - 0xa438, 0x6041, 0xa438, 0xa402, 0xa438, 0xd17a, 0xa438, 0xd047, - 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, - 0xa438, 0x1800, 0xa438, 0x0560, 0xa438, 0xa111, 0xa438, 0x0000, - 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0xd3f5, - 0xa438, 0xd219, 0xa438, 0x1000, 0xa438, 0x0c31, 0xa438, 0xd708, - 0xa438, 0x5fa5, 0xa438, 0xa215, 0xa438, 0xd30e, 0xa438, 0xd21a, - 0xa438, 0x1000, 0xa438, 0x0c31, 0xa438, 0xd708, 0xa438, 0x63e9, - 0xa438, 0xd708, 0xa438, 0x5f65, 0xa438, 0xd708, 0xa438, 0x7f36, - 0xa438, 0xa004, 0xa438, 0x1000, 0xa438, 0x0c35, 0xa438, 0x8004, - 0xa438, 0xa001, 0xa438, 0x1000, 0xa438, 0x0c35, 0xa438, 0x8001, - 0xa438, 0xd708, 0xa438, 0x4098, 0xa438, 0xd102, 0xa438, 0x9401, - 0xa438, 0xf003, 0xa438, 0xd103, 0xa438, 0xb401, 0xa438, 0x1000, - 0xa438, 0x0c27, 0xa438, 0xa108, 0xa438, 0x1000, 0xa438, 0x0c35, - 0xa438, 0x8108, 0xa438, 0x8110, 0xa438, 0x8294, 0xa438, 0xa202, - 0xa438, 0x1800, 0xa438, 0x0bdb, 0xa438, 0xd39c, 0xa438, 0xd210, - 0xa438, 0x1000, 0xa438, 0x0c31, 0xa438, 0xd708, 0xa438, 0x5fa5, - 0xa438, 0xd39c, 0xa438, 0xd210, 0xa438, 0x1000, 0xa438, 0x0c31, - 0xa438, 0xd708, 0xa438, 0x5fa5, 0xa438, 0x1000, 0xa438, 0x0c31, - 0xa438, 0xd708, 0xa438, 0x29b5, 0xa438, 0x840e, 0xa438, 0xd708, - 0xa438, 0x5f4a, 0xa438, 0x0c1f, 0xa438, 0x1014, 0xa438, 0x1000, - 0xa438, 0x0c31, 0xa438, 0xd709, 0xa438, 0x7fa4, 0xa438, 0x901f, - 0xa438, 0x1800, 0xa438, 0x0c23, 0xa438, 0xcb43, 0xa438, 0xa508, - 0xa438, 0xd701, 0xa438, 0x3699, 0xa438, 0x844a, 0xa438, 0xa504, - 0xa438, 0xa190, 0xa438, 0xa2a0, 0xa438, 0xa404, 0xa438, 0xa00a, - 0xa438, 0xd700, 0xa438, 0x2109, 0xa438, 0x05ea, 0xa438, 0xa402, - 0xa438, 0x1800, 0xa438, 0x05ea, 0xa438, 0xcb90, 0xa438, 0x0cf0, - 0xa438, 0x0ca0, 0xa438, 0x1800, 0xa438, 0x06db, 0xa438, 0xd1ff, - 0xa438, 0xd052, 0xa438, 0xa508, 0xa438, 0x8718, 0xa438, 0xa00a, - 0xa438, 0xa190, 0xa438, 0xa2a0, 0xa438, 0xa404, 0xa438, 0x0cf0, - 0xa438, 0x0c50, 0xa438, 0x1800, 0xa438, 0x09ef, 0xa438, 0x1000, - 0xa438, 0x0a5e, 0xa438, 0xd704, 0xa438, 0x2e70, 0xa438, 0x06da, - 0xa438, 0xd700, 0xa438, 0x5f55, 0xa438, 0xa90c, 0xa438, 0x1800, - 0xa438, 0x0645, 0xa436, 0xA10E, 0xa438, 0x0644, 0xa436, 0xA10C, - 0xa438, 0x09e9, 0xa436, 0xA10A, 0xa438, 0x06da, 0xa436, 0xA108, - 0xa438, 0x05e1, 0xa436, 0xA106, 0xa438, 0x0be4, 0xa436, 0xA104, - 0xa438, 0x0435, 0xa436, 0xA102, 0xa438, 0x0141, 0xa436, 0xA100, - 0xa438, 0x026d, 0xa436, 0xA110, 0xa438, 0x00ff, 0xa436, 0xb87c, - 0xa438, 0x85fe, 0xa436, 0xb87e, 0xa438, 0xaf86, 0xa438, 0x16af, - 0xa438, 0x8699, 0xa438, 0xaf86, 0xa438, 0xe5af, 0xa438, 0x86f9, - 0xa438, 0xaf87, 0xa438, 0x7aaf, 0xa438, 0x883a, 0xa438, 0xaf88, - 0xa438, 0x58af, 0xa438, 0x8b6c, 0xa438, 0xd48b, 0xa438, 0x7c02, - 0xa438, 0x8644, 0xa438, 0x2c00, 0xa438, 0x503c, 0xa438, 0xffd6, - 0xa438, 0xac27, 0xa438, 0x18e1, 0xa438, 0x82fe, 0xa438, 0xad28, - 0xa438, 0x0cd4, 0xa438, 0x8b84, 0xa438, 0x0286, 0xa438, 0x442c, - 0xa438, 0x003c, 0xa438, 0xac27, 0xa438, 0x06ee, 0xa438, 0x8299, - 0xa438, 0x01ae, 0xa438, 0x04ee, 0xa438, 0x8299, 0xa438, 0x00af, - 0xa438, 0x23dc, 0xa438, 0xf9fa, 0xa438, 0xcefa, 0xa438, 0xfbef, - 0xa438, 0x79fb, 0xa438, 0xc4bf, 0xa438, 0x8b76, 0xa438, 0x026c, - 0xa438, 0x6dac, 0xa438, 0x2804, 0xa438, 0xd203, 0xa438, 0xae02, - 0xa438, 0xd201, 0xa438, 0xbdd8, 0xa438, 0x19d9, 0xa438, 0xef94, - 0xa438, 0x026c, 0xa438, 0x6d78, 0xa438, 0x03ef, 0xa438, 0x648a, - 0xa438, 0x0002, 0xa438, 0xbdd8, 0xa438, 0x19d9, 0xa438, 0xef94, - 0xa438, 0x026c, 0xa438, 0x6d78, 0xa438, 0x03ef, 0xa438, 0x7402, - 0xa438, 0x72cd, 0xa438, 0xac50, 0xa438, 0x02ef, 0xa438, 0x643a, - 0xa438, 0x019f, 0xa438, 0xe4ef, 0xa438, 0x4678, 0xa438, 0x03ac, - 0xa438, 0x2002, 0xa438, 0xae02, 0xa438, 0xd0ff, 0xa438, 0xffef, - 0xa438, 0x97ff, 0xa438, 0xfec6, 0xa438, 0xfefd, 0xa438, 0x041f, - 0xa438, 0x771f, 0xa438, 0x221c, 0xa438, 0x450d, 0xa438, 0x481f, - 0xa438, 0x00ac, 0xa438, 0x7f04, 0xa438, 0x1a94, 0xa438, 0xae08, - 0xa438, 0x1a94, 0xa438, 0xac7f, 0xa438, 0x03d7, 0xa438, 0x0100, - 0xa438, 0xef46, 0xa438, 0x0d48, 0xa438, 0x1f00, 0xa438, 0x1c45, - 0xa438, 0xef69, 0xa438, 0xef57, 0xa438, 0xef74, 0xa438, 0x0272, - 0xa438, 0xe8a7, 0xa438, 0xffff, 0xa438, 0x0d1a, 0xa438, 0x941b, - 0xa438, 0x979e, 0xa438, 0x072d, 0xa438, 0x0100, 0xa438, 0x1a64, - 0xa438, 0xef76, 0xa438, 0xef97, 0xa438, 0x0d98, 0xa438, 0xd400, - 0xa438, 0xff1d, 0xa438, 0x941a, 0xa438, 0x89cf, 0xa438, 0x1a75, - 0xa438, 0xaf74, 0xa438, 0xf9bf, 0xa438, 0x8b79, 0xa438, 0x026c, - 0xa438, 0x6da1, 0xa438, 0x0005, 0xa438, 0xe180, 0xa438, 0xa0ae, - 0xa438, 0x03e1, 0xa438, 0x80a1, 0xa438, 0xaf26, 0xa438, 0x9aac, - 0xa438, 0x284d, 0xa438, 0xe08f, 0xa438, 0xffef, 0xa438, 0x10c0, - 0xa438, 0xe08f, 0xa438, 0xfe10, 0xa438, 0x1b08, 0xa438, 0xa000, - 0xa438, 0x04c8, 0xa438, 0xaf40, 0xa438, 0x67c8, 0xa438, 0xbf8b, - 0xa438, 0x8c02, 0xa438, 0x6c4e, 0xa438, 0xc4bf, 0xa438, 0x8b8f, - 0xa438, 0x026c, 0xa438, 0x6def, 0xa438, 0x74e0, 0xa438, 0x830c, - 0xa438, 0xad20, 0xa438, 0x0302, 0xa438, 0x74ac, 0xa438, 0xccef, - 0xa438, 0x971b, 0xa438, 0x76ad, 0xa438, 0x5f02, 0xa438, 0xae13, - 0xa438, 0xef69, 0xa438, 0xef30, 0xa438, 0x1b32, 0xa438, 0xc4ef, - 0xa438, 0x46e4, 0xa438, 0x8ffb, 0xa438, 0xe58f, 0xa438, 0xfce7, - 0xa438, 0x8ffd, 0xa438, 0xcc10, 0xa438, 0x11ae, 0xa438, 0xb8d1, - 0xa438, 0x00a1, 0xa438, 0x1f03, 0xa438, 0xaf40, 0xa438, 0x4fbf, - 0xa438, 0x8b8c, 0xa438, 0x026c, 0xa438, 0x4ec4, 0xa438, 0xbf8b, - 0xa438, 0x8f02, 0xa438, 0x6c6d, 0xa438, 0xef74, 0xa438, 0xe083, - 0xa438, 0x0cad, 0xa438, 0x2003, 0xa438, 0x0274, 0xa438, 0xaccc, - 0xa438, 0xef97, 0xa438, 0x1b76, 0xa438, 0xad5f, 0xa438, 0x02ae, - 0xa438, 0x04ef, 0xa438, 0x69ef, 0xa438, 0x3111, 0xa438, 0xaed1, - 0xa438, 0x0287, 0xa438, 0x80af, 0xa438, 0x2293, 0xa438, 0xf8f9, - 0xa438, 0xfafb, 0xa438, 0xef59, 0xa438, 0xe080, 0xa438, 0x13ad, - 0xa438, 0x252f, 0xa438, 0xbf88, 0xa438, 0x2802, 0xa438, 0x6c6d, - 0xa438, 0xef64, 0xa438, 0x1f44, 0xa438, 0xe18f, 0xa438, 0xb91b, - 0xa438, 0x64ad, 0xa438, 0x4f1d, 0xa438, 0xd688, 0xa438, 0x2bd7, - 0xa438, 0x882e, 0xa438, 0x0274, 0xa438, 0x73ad, 0xa438, 0x5008, - 0xa438, 0xbf88, 0xa438, 0x3102, 0xa438, 0x737c, 0xa438, 0xae03, - 0xa438, 0x0287, 0xa438, 0xd0bf, 0xa438, 0x882b, 0xa438, 0x0273, - 0xa438, 0x73e0, 0xa438, 0x824c, 0xa438, 0xf621, 0xa438, 0xe482, - 0xa438, 0x4cbf, 0xa438, 0x8834, 0xa438, 0x0273, 0xa438, 0x7cef, - 0xa438, 0x95ff, 0xa438, 0xfefd, 0xa438, 0xfc04, 0xa438, 0xf8f9, - 0xa438, 0xfafb, 0xa438, 0xef79, 0xa438, 0xbf88, 0xa438, 0x1f02, - 0xa438, 0x737c, 0xa438, 0x1f22, 0xa438, 0xac32, 0xa438, 0x31ef, - 0xa438, 0x12bf, 0xa438, 0x8822, 0xa438, 0x026c, 0xa438, 0x4ed6, - 0xa438, 0x8fba, 0xa438, 0x1f33, 0xa438, 0xac3c, 0xa438, 0x1eef, - 0xa438, 0x13bf, 0xa438, 0x8837, 0xa438, 0x026c, 0xa438, 0x4eef, - 0xa438, 0x96d8, 0xa438, 0x19d9, 0xa438, 0xbf88, 0xa438, 0x2502, - 0xa438, 0x6c4e, 0xa438, 0xbf88, 0xa438, 0x2502, 0xa438, 0x6c4e, - 0xa438, 0x1616, 0xa438, 0x13ae, 0xa438, 0xdf12, 0xa438, 0xaecc, - 0xa438, 0xbf88, 0xa438, 0x1f02, 0xa438, 0x7373, 0xa438, 0xef97, - 0xa438, 0xfffe, 0xa438, 0xfdfc, 0xa438, 0x0466, 0xa438, 0xac88, - 0xa438, 0x54ac, 0xa438, 0x88f0, 0xa438, 0xac8a, 0xa438, 0x92ac, - 0xa438, 0xbadd, 0xa438, 0xac6c, 0xa438, 0xeeac, 0xa438, 0x6cff, - 0xa438, 0xad02, 0xa438, 0x99ac, 0xa438, 0x0030, 0xa438, 0xac88, - 0xa438, 0xd4c3, 0xa438, 0x5000, 0xa438, 0x0000, 0xa438, 0x0000, - 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, - 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x00b4, 0xa438, 0xecee, - 0xa438, 0x8298, 0xa438, 0x00af, 0xa438, 0x1412, 0xa438, 0xf8bf, - 0xa438, 0x8b5d, 0xa438, 0x026c, 0xa438, 0x6d58, 0xa438, 0x03e1, - 0xa438, 0x8fb8, 0xa438, 0x2901, 0xa438, 0xe58f, 0xa438, 0xb8a0, - 0xa438, 0x0049, 0xa438, 0xef47, 0xa438, 0xe483, 0xa438, 0x02e5, - 0xa438, 0x8303, 0xa438, 0xbfc2, 0xa438, 0x5f1a, 0xa438, 0x95f7, - 0xa438, 0x05ee, 0xa438, 0xffd2, 0xa438, 0x00d8, 0xa438, 0xf605, - 0xa438, 0x1f11, 0xa438, 0xef60, 0xa438, 0xbf8b, 0xa438, 0x3002, - 0xa438, 0x6c4e, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c6d, - 0xa438, 0xf728, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c4e, - 0xa438, 0xf628, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c4e, - 0xa438, 0x0c64, 0xa438, 0xef46, 0xa438, 0xbf8b, 0xa438, 0x6002, - 0xa438, 0x6c4e, 0xa438, 0x0289, 0xa438, 0x9902, 0xa438, 0x3920, - 0xa438, 0xaf89, 0xa438, 0x96a0, 0xa438, 0x0149, 0xa438, 0xef47, - 0xa438, 0xe483, 0xa438, 0x04e5, 0xa438, 0x8305, 0xa438, 0xbfc2, - 0xa438, 0x5f1a, 0xa438, 0x95f7, 0xa438, 0x05ee, 0xa438, 0xffd2, - 0xa438, 0x00d8, 0xa438, 0xf605, 0xa438, 0x1f11, 0xa438, 0xef60, - 0xa438, 0xbf8b, 0xa438, 0x3002, 0xa438, 0x6c4e, 0xa438, 0xbf8b, - 0xa438, 0x3302, 0xa438, 0x6c6d, 0xa438, 0xf729, 0xa438, 0xbf8b, - 0xa438, 0x3302, 0xa438, 0x6c4e, 0xa438, 0xf629, 0xa438, 0xbf8b, - 0xa438, 0x3302, 0xa438, 0x6c4e, 0xa438, 0x0c64, 0xa438, 0xef46, - 0xa438, 0xbf8b, 0xa438, 0x6302, 0xa438, 0x6c4e, 0xa438, 0x0289, - 0xa438, 0x9902, 0xa438, 0x3920, 0xa438, 0xaf89, 0xa438, 0x96a0, - 0xa438, 0x0249, 0xa438, 0xef47, 0xa438, 0xe483, 0xa438, 0x06e5, - 0xa438, 0x8307, 0xa438, 0xbfc2, 0xa438, 0x5f1a, 0xa438, 0x95f7, - 0xa438, 0x05ee, 0xa438, 0xffd2, 0xa438, 0x00d8, 0xa438, 0xf605, - 0xa438, 0x1f11, 0xa438, 0xef60, 0xa438, 0xbf8b, 0xa438, 0x3002, - 0xa438, 0x6c4e, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c6d, - 0xa438, 0xf72a, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c4e, - 0xa438, 0xf62a, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c4e, - 0xa438, 0x0c64, 0xa438, 0xef46, 0xa438, 0xbf8b, 0xa438, 0x6602, - 0xa438, 0x6c4e, 0xa438, 0x0289, 0xa438, 0x9902, 0xa438, 0x3920, - 0xa438, 0xaf89, 0xa438, 0x96ef, 0xa438, 0x47e4, 0xa438, 0x8308, - 0xa438, 0xe583, 0xa438, 0x09bf, 0xa438, 0xc25f, 0xa438, 0x1a95, - 0xa438, 0xf705, 0xa438, 0xeeff, 0xa438, 0xd200, 0xa438, 0xd8f6, - 0xa438, 0x051f, 0xa438, 0x11ef, 0xa438, 0x60bf, 0xa438, 0x8b30, - 0xa438, 0x026c, 0xa438, 0x4ebf, 0xa438, 0x8b33, 0xa438, 0x026c, - 0xa438, 0x6df7, 0xa438, 0x2bbf, 0xa438, 0x8b33, 0xa438, 0x026c, - 0xa438, 0x4ef6, 0xa438, 0x2bbf, 0xa438, 0x8b33, 0xa438, 0x026c, - 0xa438, 0x4e0c, 0xa438, 0x64ef, 0xa438, 0x46bf, 0xa438, 0x8b69, - 0xa438, 0x026c, 0xa438, 0x4e02, 0xa438, 0x8999, 0xa438, 0x0239, - 0xa438, 0x20af, 0xa438, 0x8996, 0xa438, 0xaf39, 0xa438, 0x1ef8, - 0xa438, 0xf9fa, 0xa438, 0xe08f, 0xa438, 0xb838, 0xa438, 0x02ad, - 0xa438, 0x2702, 0xa438, 0xae03, 0xa438, 0xaf8b, 0xa438, 0x201f, - 0xa438, 0x66ef, 0xa438, 0x65bf, 0xa438, 0xc21f, 0xa438, 0x1a96, - 0xa438, 0xf705, 0xa438, 0xeeff, 0xa438, 0xd200, 0xa438, 0xdaf6, - 0xa438, 0x05bf, 0xa438, 0xc22f, 0xa438, 0x1a96, 0xa438, 0xf705, - 0xa438, 0xeeff, 0xa438, 0xd200, 0xa438, 0xdbf6, 0xa438, 0x05ef, - 0xa438, 0x021f, 0xa438, 0x110d, 0xa438, 0x42bf, 0xa438, 0x8b3c, - 0xa438, 0x026c, 0xa438, 0x4eef, 0xa438, 0x021b, 0xa438, 0x031f, - 0xa438, 0x110d, 0xa438, 0x42bf, 0xa438, 0x8b36, 0xa438, 0x026c, - 0xa438, 0x4eef, 0xa438, 0x021a, 0xa438, 0x031f, 0xa438, 0x110d, - 0xa438, 0x42bf, 0xa438, 0x8b39, 0xa438, 0x026c, 0xa438, 0x4ebf, - 0xa438, 0xc23f, 0xa438, 0x1a96, 0xa438, 0xf705, 0xa438, 0xeeff, - 0xa438, 0xd200, 0xa438, 0xdaf6, 0xa438, 0x05bf, 0xa438, 0xc24f, - 0xa438, 0x1a96, 0xa438, 0xf705, 0xa438, 0xeeff, 0xa438, 0xd200, - 0xa438, 0xdbf6, 0xa438, 0x05ef, 0xa438, 0x021f, 0xa438, 0x110d, - 0xa438, 0x42bf, 0xa438, 0x8b45, 0xa438, 0x026c, 0xa438, 0x4eef, - 0xa438, 0x021b, 0xa438, 0x031f, 0xa438, 0x110d, 0xa438, 0x42bf, - 0xa438, 0x8b3f, 0xa438, 0x026c, 0xa438, 0x4eef, 0xa438, 0x021a, - 0xa438, 0x031f, 0xa438, 0x110d, 0xa438, 0x42bf, 0xa438, 0x8b42, - 0xa438, 0x026c, 0xa438, 0x4eef, 0xa438, 0x56d0, 0xa438, 0x201f, - 0xa438, 0x11bf, 0xa438, 0x8b4e, 0xa438, 0x026c, 0xa438, 0x4ebf, - 0xa438, 0x8b48, 0xa438, 0x026c, 0xa438, 0x4ebf, 0xa438, 0x8b4b, - 0xa438, 0x026c, 0xa438, 0x4ee1, 0xa438, 0x8578, 0xa438, 0xef03, - 0xa438, 0x480a, 0xa438, 0x2805, 0xa438, 0xef20, 0xa438, 0x1b01, - 0xa438, 0xad27, 0xa438, 0x3f1f, 0xa438, 0x44e0, 0xa438, 0x8560, - 0xa438, 0xe185, 0xa438, 0x61bf, 0xa438, 0x8b51, 0xa438, 0x026c, - 0xa438, 0x4ee0, 0xa438, 0x8566, 0xa438, 0xe185, 0xa438, 0x67bf, - 0xa438, 0x8b54, 0xa438, 0x026c, 0xa438, 0x4ee0, 0xa438, 0x856c, - 0xa438, 0xe185, 0xa438, 0x6dbf, 0xa438, 0x8b57, 0xa438, 0x026c, - 0xa438, 0x4ee0, 0xa438, 0x8572, 0xa438, 0xe185, 0xa438, 0x73bf, - 0xa438, 0x8b5a, 0xa438, 0x026c, 0xa438, 0x4ee1, 0xa438, 0x8fb8, - 0xa438, 0x5900, 0xa438, 0xf728, 0xa438, 0xe58f, 0xa438, 0xb8af, - 0xa438, 0x8b2c, 0xa438, 0xe185, 0xa438, 0x791b, 0xa438, 0x21ad, - 0xa438, 0x373e, 0xa438, 0x1f44, 0xa438, 0xe085, 0xa438, 0x62e1, - 0xa438, 0x8563, 0xa438, 0xbf8b, 0xa438, 0x5102, 0xa438, 0x6c4e, - 0xa438, 0xe085, 0xa438, 0x68e1, 0xa438, 0x8569, 0xa438, 0xbf8b, - 0xa438, 0x5402, 0xa438, 0x6c4e, 0xa438, 0xe085, 0xa438, 0x6ee1, - 0xa438, 0x856f, 0xa438, 0xbf8b, 0xa438, 0x5702, 0xa438, 0x6c4e, - 0xa438, 0xe085, 0xa438, 0x74e1, 0xa438, 0x8575, 0xa438, 0xbf8b, - 0xa438, 0x5a02, 0xa438, 0x6c4e, 0xa438, 0xe18f, 0xa438, 0xb859, - 0xa438, 0x00f7, 0xa438, 0x28e5, 0xa438, 0x8fb8, 0xa438, 0xae4a, - 0xa438, 0x1f44, 0xa438, 0xe085, 0xa438, 0x64e1, 0xa438, 0x8565, - 0xa438, 0xbf8b, 0xa438, 0x5102, 0xa438, 0x6c4e, 0xa438, 0xe085, - 0xa438, 0x6ae1, 0xa438, 0x856b, 0xa438, 0xbf8b, 0xa438, 0x5402, - 0xa438, 0x6c4e, 0xa438, 0xe085, 0xa438, 0x70e1, 0xa438, 0x8571, - 0xa438, 0xbf8b, 0xa438, 0x5702, 0xa438, 0x6c4e, 0xa438, 0xe085, - 0xa438, 0x76e1, 0xa438, 0x8577, 0xa438, 0xbf8b, 0xa438, 0x5a02, - 0xa438, 0x6c4e, 0xa438, 0xe18f, 0xa438, 0xb859, 0xa438, 0x00f7, - 0xa438, 0x28e5, 0xa438, 0x8fb8, 0xa438, 0xae0c, 0xa438, 0xe18f, - 0xa438, 0xb839, 0xa438, 0x04ac, 0xa438, 0x2f04, 0xa438, 0xee8f, - 0xa438, 0xb800, 0xa438, 0xfefd, 0xa438, 0xfc04, 0xa438, 0xf0ac, - 0xa438, 0x8efc, 0xa438, 0xac8c, 0xa438, 0xf0ac, 0xa438, 0xfaf0, - 0xa438, 0xacf8, 0xa438, 0xf0ac, 0xa438, 0xf6f0, 0xa438, 0xad00, - 0xa438, 0xf0ac, 0xa438, 0xfef0, 0xa438, 0xacfc, 0xa438, 0xf0ac, - 0xa438, 0xf4f0, 0xa438, 0xacf2, 0xa438, 0xf0ac, 0xa438, 0xf0f0, - 0xa438, 0xacb0, 0xa438, 0xf0ac, 0xa438, 0xaef0, 0xa438, 0xacac, - 0xa438, 0xf0ac, 0xa438, 0xaaf0, 0xa438, 0xacee, 0xa438, 0xf0b0, - 0xa438, 0x24f0, 0xa438, 0xb0a4, 0xa438, 0xf0b1, 0xa438, 0x24f0, - 0xa438, 0xb1a4, 0xa438, 0xee8f, 0xa438, 0xb800, 0xa438, 0xd400, - 0xa438, 0x00af, 0xa438, 0x3976, 0xa438, 0x66ac, 0xa438, 0xeabb, - 0xa438, 0xa430, 0xa438, 0x6e50, 0xa438, 0x6e53, 0xa438, 0x6e56, - 0xa438, 0x6e59, 0xa438, 0x6e5c, 0xa438, 0x6e5f, 0xa438, 0x6e62, - 0xa438, 0x6e65, 0xa438, 0xd9ac, 0xa438, 0x70f0, 0xa438, 0xac6a, - 0xa436, 0xb85e, 0xa438, 0x23b7, 0xa436, 0xb860, 0xa438, 0x74db, - 0xa436, 0xb862, 0xa438, 0x268c, 0xa436, 0xb864, 0xa438, 0x3FE5, - 0xa436, 0xb886, 0xa438, 0x2250, 0xa436, 0xb888, 0xa438, 0x140e, - 0xa436, 0xb88a, 0xa438, 0x3696, 0xa436, 0xb88c, 0xa438, 0x3973, - 0xa436, 0xb838, 0xa438, 0x00ff, 0xb820, 0x0010, 0xa436, 0x8464, - 0xa438, 0xaf84, 0xa438, 0x7caf, 0xa438, 0x8485, 0xa438, 0xaf85, - 0xa438, 0x13af, 0xa438, 0x851e, 0xa438, 0xaf85, 0xa438, 0xb9af, - 0xa438, 0x8684, 0xa438, 0xaf87, 0xa438, 0x01af, 0xa438, 0x8701, - 0xa438, 0xac38, 0xa438, 0x03af, 0xa438, 0x38bb, 0xa438, 0xaf38, - 0xa438, 0xc302, 0xa438, 0x4618, 0xa438, 0xbf85, 0xa438, 0x0a02, - 0xa438, 0x54b7, 0xa438, 0xbf85, 0xa438, 0x1002, 0xa438, 0x54c0, - 0xa438, 0xd400, 0xa438, 0x0fbf, 0xa438, 0x8507, 0xa438, 0x024f, - 0xa438, 0x48bf, 0xa438, 0x8504, 0xa438, 0x024f, 0xa438, 0x6759, - 0xa438, 0xf0a1, 0xa438, 0x3008, 0xa438, 0xbf85, 0xa438, 0x0d02, - 0xa438, 0x54c0, 0xa438, 0xae06, 0xa438, 0xbf85, 0xa438, 0x0d02, - 0xa438, 0x54b7, 0xa438, 0xbf85, 0xa438, 0x0402, 0xa438, 0x4f67, - 0xa438, 0xa183, 0xa438, 0x02ae, 0xa438, 0x15a1, 0xa438, 0x8502, - 0xa438, 0xae10, 0xa438, 0x59f0, 0xa438, 0xa180, 0xa438, 0x16bf, - 0xa438, 0x8501, 0xa438, 0x024f, 0xa438, 0x67a1, 0xa438, 0x381b, - 0xa438, 0xae0b, 0xa438, 0xe18f, 0xa438, 0xffbf, 0xa438, 0x84fe, - 0xa438, 0x024f, 0xa438, 0x48ae, 0xa438, 0x17bf, 0xa438, 0x84fe, - 0xa438, 0x0254, 0xa438, 0xb7bf, 0xa438, 0x84fb, 0xa438, 0x0254, - 0xa438, 0xb7ae, 0xa438, 0x09a1, 0xa438, 0x5006, 0xa438, 0xbf84, - 0xa438, 0xfb02, 0xa438, 0x54c0, 0xa438, 0xaf04, 0xa438, 0x4700, - 0xa438, 0xad34, 0xa438, 0xfdad, 0xa438, 0x0670, 0xa438, 0xae14, - 0xa438, 0xf0a6, 0xa438, 0x00b8, 0xa438, 0xbd32, 0xa438, 0x30bd, - 0xa438, 0x30aa, 0xa438, 0xbd2c, 0xa438, 0xccbd, 0xa438, 0x2ca1, - 0xa438, 0x0705, 0xa438, 0xec80, 0xa438, 0xaf40, 0xa438, 0xf7af, - 0xa438, 0x40f5, 0xa438, 0xd101, 0xa438, 0xbf85, 0xa438, 0xa402, - 0xa438, 0x4f48, 0xa438, 0xbf85, 0xa438, 0xa702, 0xa438, 0x54c0, - 0xa438, 0xd10f, 0xa438, 0xbf85, 0xa438, 0xaa02, 0xa438, 0x4f48, - 0xa438, 0x024d, 0xa438, 0x6abf, 0xa438, 0x85ad, 0xa438, 0x024f, - 0xa438, 0x67bf, 0xa438, 0x8ff7, 0xa438, 0xddbf, 0xa438, 0x85b0, - 0xa438, 0x024f, 0xa438, 0x67bf, 0xa438, 0x8ff8, 0xa438, 0xddbf, - 0xa438, 0x85b3, 0xa438, 0x024f, 0xa438, 0x67bf, 0xa438, 0x8ff9, - 0xa438, 0xddbf, 0xa438, 0x85b6, 0xa438, 0x024f, 0xa438, 0x67bf, - 0xa438, 0x8ffa, 0xa438, 0xddd1, 0xa438, 0x00bf, 0xa438, 0x85aa, - 0xa438, 0x024f, 0xa438, 0x4802, 0xa438, 0x4d6a, 0xa438, 0xbf85, - 0xa438, 0xad02, 0xa438, 0x4f67, 0xa438, 0xbf8f, 0xa438, 0xfbdd, - 0xa438, 0xbf85, 0xa438, 0xb002, 0xa438, 0x4f67, 0xa438, 0xbf8f, - 0xa438, 0xfcdd, 0xa438, 0xbf85, 0xa438, 0xb302, 0xa438, 0x4f67, - 0xa438, 0xbf8f, 0xa438, 0xfddd, 0xa438, 0xbf85, 0xa438, 0xb602, - 0xa438, 0x4f67, 0xa438, 0xbf8f, 0xa438, 0xfedd, 0xa438, 0xbf85, - 0xa438, 0xa702, 0xa438, 0x54b7, 0xa438, 0xbf85, 0xa438, 0xa102, - 0xa438, 0x54b7, 0xa438, 0xaf3c, 0xa438, 0x2066, 0xa438, 0xb800, - 0xa438, 0xb8bd, 0xa438, 0x30ee, 0xa438, 0xbd2c, 0xa438, 0xb8bd, - 0xa438, 0x7040, 0xa438, 0xbd86, 0xa438, 0xc8bd, 0xa438, 0x8640, - 0xa438, 0xbd88, 0xa438, 0xc8bd, 0xa438, 0x8802, 0xa438, 0x1929, - 0xa438, 0xa202, 0xa438, 0x02ae, 0xa438, 0x03a2, 0xa438, 0x032e, - 0xa438, 0xd10f, 0xa438, 0xbf85, 0xa438, 0xaa02, 0xa438, 0x4f48, - 0xa438, 0xe18f, 0xa438, 0xf7bf, 0xa438, 0x85ad, 0xa438, 0x024f, - 0xa438, 0x48e1, 0xa438, 0x8ff8, 0xa438, 0xbf85, 0xa438, 0xb002, - 0xa438, 0x4f48, 0xa438, 0xe18f, 0xa438, 0xf9bf, 0xa438, 0x85b3, - 0xa438, 0x024f, 0xa438, 0x48e1, 0xa438, 0x8ffa, 0xa438, 0xbf85, - 0xa438, 0xb602, 0xa438, 0x4f48, 0xa438, 0xae2c, 0xa438, 0xd100, - 0xa438, 0xbf85, 0xa438, 0xaa02, 0xa438, 0x4f48, 0xa438, 0xe18f, - 0xa438, 0xfbbf, 0xa438, 0x85ad, 0xa438, 0x024f, 0xa438, 0x48e1, - 0xa438, 0x8ffc, 0xa438, 0xbf85, 0xa438, 0xb002, 0xa438, 0x4f48, - 0xa438, 0xe18f, 0xa438, 0xfdbf, 0xa438, 0x85b3, 0xa438, 0x024f, - 0xa438, 0x48e1, 0xa438, 0x8ffe, 0xa438, 0xbf85, 0xa438, 0xb602, - 0xa438, 0x4f48, 0xa438, 0xbf86, 0xa438, 0x7e02, 0xa438, 0x4f67, - 0xa438, 0xa100, 0xa438, 0x02ae, 0xa438, 0x25a1, 0xa438, 0x041d, - 0xa438, 0xe18f, 0xa438, 0xf1bf, 0xa438, 0x8675, 0xa438, 0x024f, - 0xa438, 0x48e1, 0xa438, 0x8ff2, 0xa438, 0xbf86, 0xa438, 0x7802, - 0xa438, 0x4f48, 0xa438, 0xe18f, 0xa438, 0xf3bf, 0xa438, 0x867b, - 0xa438, 0x024f, 0xa438, 0x48ae, 0xa438, 0x29a1, 0xa438, 0x070b, - 0xa438, 0xae24, 0xa438, 0xbf86, 0xa438, 0x8102, 0xa438, 0x4f67, - 0xa438, 0xad28, 0xa438, 0x1be1, 0xa438, 0x8ff4, 0xa438, 0xbf86, - 0xa438, 0x7502, 0xa438, 0x4f48, 0xa438, 0xe18f, 0xa438, 0xf5bf, - 0xa438, 0x8678, 0xa438, 0x024f, 0xa438, 0x48e1, 0xa438, 0x8ff6, - 0xa438, 0xbf86, 0xa438, 0x7b02, 0xa438, 0x4f48, 0xa438, 0xaf09, - 0xa438, 0x8420, 0xa438, 0xbc32, 0xa438, 0x20bc, 0xa438, 0x3e76, - 0xa438, 0xbc08, 0xa438, 0xfda6, 0xa438, 0x1a00, 0xa438, 0xb64e, - 0xa438, 0xd101, 0xa438, 0xbf85, 0xa438, 0xa402, 0xa438, 0x4f48, - 0xa438, 0xbf85, 0xa438, 0xa702, 0xa438, 0x54c0, 0xa438, 0xd10f, - 0xa438, 0xbf85, 0xa438, 0xaa02, 0xa438, 0x4f48, 0xa438, 0x024d, - 0xa438, 0x6abf, 0xa438, 0x85ad, 0xa438, 0x024f, 0xa438, 0x67bf, - 0xa438, 0x8ff7, 0xa438, 0xddbf, 0xa438, 0x85b0, 0xa438, 0x024f, - 0xa438, 0x67bf, 0xa438, 0x8ff8, 0xa438, 0xddbf, 0xa438, 0x85b3, - 0xa438, 0x024f, 0xa438, 0x67bf, 0xa438, 0x8ff9, 0xa438, 0xddbf, - 0xa438, 0x85b6, 0xa438, 0x024f, 0xa438, 0x67bf, 0xa438, 0x8ffa, - 0xa438, 0xddd1, 0xa438, 0x00bf, 0xa438, 0x85aa, 0xa438, 0x024f, - 0xa438, 0x4802, 0xa438, 0x4d6a, 0xa438, 0xbf85, 0xa438, 0xad02, - 0xa438, 0x4f67, 0xa438, 0xbf8f, 0xa438, 0xfbdd, 0xa438, 0xbf85, - 0xa438, 0xb002, 0xa438, 0x4f67, 0xa438, 0xbf8f, 0xa438, 0xfcdd, - 0xa438, 0xbf85, 0xa438, 0xb302, 0xa438, 0x4f67, 0xa438, 0xbf8f, - 0xa438, 0xfddd, 0xa438, 0xbf85, 0xa438, 0xb602, 0xa438, 0x4f67, - 0xa438, 0xbf8f, 0xa438, 0xfedd, 0xa438, 0xbf85, 0xa438, 0xa702, - 0xa438, 0x54b7, 0xa438, 0xaf00, 0xa438, 0x8800, 0xa436, 0xb818, - 0xa438, 0x38b8, 0xa436, 0xb81a, 0xa438, 0x0444, 0xa436, 0xb81c, - 0xa438, 0x40ee, 0xa436, 0xb81e, 0xa438, 0x3C1A, 0xa436, 0xb850, - 0xa438, 0x0981, 0xa436, 0xb852, 0xa438, 0x0085, 0xa436, 0xb878, - 0xa438, 0xffff, 0xa436, 0xb884, 0xa438, 0xffff, 0xa436, 0xb832, - 0xa438, 0x003f, 0xa436, 0x0000, 0xa438, 0x0000, 0xa436, 0xB82E, - 0xa438, 0x0000, 0xa436, 0x8024, 0xa438, 0x0000, 0xb820, 0x0000, - 0xa436, 0x801E, 0xa438, 0x0021, 0xFFFF, 0xFFFF -}; - -static const u16 phy_mcu_ram_code_8125b_2[] = { - 0xa436, 0x8024, 0xa438, 0x3701, 0xa436, 0xB82E, 0xa438, 0x0001, - 0xb820, 0x0090, 0xa436, 0xA016, 0xa438, 0x0000, 0xa436, 0xA012, - 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, - 0xa438, 0x1800, 0xa438, 0x801a, 0xa438, 0x1800, 0xa438, 0x8024, - 0xa438, 0x1800, 0xa438, 0x802f, 0xa438, 0x1800, 0xa438, 0x8051, - 0xa438, 0x1800, 0xa438, 0x8057, 0xa438, 0x1800, 0xa438, 0x8063, - 0xa438, 0x1800, 0xa438, 0x8068, 0xa438, 0xd093, 0xa438, 0xd1c4, - 0xa438, 0x1000, 0xa438, 0x135c, 0xa438, 0xd704, 0xa438, 0x5fbc, - 0xa438, 0xd504, 0xa438, 0xc9f1, 0xa438, 0x1800, 0xa438, 0x0fc9, - 0xa438, 0xbb50, 0xa438, 0xd505, 0xa438, 0xa202, 0xa438, 0xd504, - 0xa438, 0x8c0f, 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x1519, - 0xa438, 0x1800, 0xa438, 0x1548, 0xa438, 0x2f70, 0xa438, 0x802a, - 0xa438, 0x2f73, 0xa438, 0x156a, 0xa438, 0x1800, 0xa438, 0x155c, - 0xa438, 0xd505, 0xa438, 0xa202, 0xa438, 0xd500, 0xa438, 0x1800, - 0xa438, 0x1551, 0xa438, 0xc0c1, 0xa438, 0xc0c0, 0xa438, 0xd05a, - 0xa438, 0xd1ba, 0xa438, 0xd701, 0xa438, 0x2529, 0xa438, 0x022a, - 0xa438, 0xd0a7, 0xa438, 0xd1b9, 0xa438, 0xa208, 0xa438, 0x1000, - 0xa438, 0x080e, 0xa438, 0xd701, 0xa438, 0x408b, 0xa438, 0x1000, - 0xa438, 0x0a65, 0xa438, 0xf003, 0xa438, 0x1000, 0xa438, 0x0a6b, - 0xa438, 0xd701, 0xa438, 0x1000, 0xa438, 0x0920, 0xa438, 0x1000, - 0xa438, 0x0915, 0xa438, 0x1000, 0xa438, 0x0909, 0xa438, 0x228f, - 0xa438, 0x8038, 0xa438, 0x9801, 0xa438, 0xd71e, 0xa438, 0x5d61, - 0xa438, 0xd701, 0xa438, 0x1800, 0xa438, 0x022a, 0xa438, 0x2005, - 0xa438, 0x091a, 0xa438, 0x3bd9, 0xa438, 0x0919, 0xa438, 0x1800, - 0xa438, 0x0916, 0xa438, 0x1000, 0xa438, 0x14c5, 0xa438, 0xd703, - 0xa438, 0x3181, 0xa438, 0x8061, 0xa438, 0x60ad, 0xa438, 0x1000, - 0xa438, 0x135c, 0xa438, 0xd703, 0xa438, 0x5fba, 0xa438, 0x1800, - 0xa438, 0x0cc7, 0xa438, 0xd096, 0xa438, 0xd1a9, 0xa438, 0xd503, - 0xa438, 0x1800, 0xa438, 0x0c94, 0xa438, 0xa802, 0xa438, 0xa301, - 0xa438, 0xa801, 0xa438, 0xc004, 0xa438, 0xd710, 0xa438, 0x4000, - 0xa438, 0x1800, 0xa438, 0x1e79, 0xa436, 0xA026, 0xa438, 0x1e78, - 0xa436, 0xA024, 0xa438, 0x0c93, 0xa436, 0xA022, 0xa438, 0x0cc5, - 0xa436, 0xA020, 0xa438, 0x0915, 0xa436, 0xA006, 0xa438, 0x020a, - 0xa436, 0xA004, 0xa438, 0x155b, 0xa436, 0xA002, 0xa438, 0x1542, - 0xa436, 0xA000, 0xa438, 0x0fc7, 0xa436, 0xA008, 0xa438, 0xff00, - 0xa436, 0xA016, 0xa438, 0x0010, 0xa436, 0xA012, 0xa438, 0x0000, - 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, 0xa438, 0x1800, - 0xa438, 0x801d, 0xa438, 0x1800, 0xa438, 0x802c, 0xa438, 0x1800, - 0xa438, 0x802c, 0xa438, 0x1800, 0xa438, 0x802c, 0xa438, 0x1800, - 0xa438, 0x802c, 0xa438, 0x1800, 0xa438, 0x802c, 0xa438, 0x1800, - 0xa438, 0x802c, 0xa438, 0xd700, 0xa438, 0x6090, 0xa438, 0x60d1, - 0xa438, 0xc95c, 0xa438, 0xf007, 0xa438, 0x60b1, 0xa438, 0xc95a, - 0xa438, 0xf004, 0xa438, 0xc956, 0xa438, 0xf002, 0xa438, 0xc94e, - 0xa438, 0x1800, 0xa438, 0x00cd, 0xa438, 0xd700, 0xa438, 0x6090, - 0xa438, 0x60d1, 0xa438, 0xc95c, 0xa438, 0xf007, 0xa438, 0x60b1, - 0xa438, 0xc95a, 0xa438, 0xf004, 0xa438, 0xc956, 0xa438, 0xf002, - 0xa438, 0xc94e, 0xa438, 0x1000, 0xa438, 0x022a, 0xa438, 0x1800, - 0xa438, 0x0132, 0xa436, 0xA08E, 0xa438, 0xffff, 0xa436, 0xA08C, - 0xa438, 0xffff, 0xa436, 0xA08A, 0xa438, 0xffff, 0xa436, 0xA088, - 0xa438, 0xffff, 0xa436, 0xA086, 0xa438, 0xffff, 0xa436, 0xA084, - 0xa438, 0xffff, 0xa436, 0xA082, 0xa438, 0x012f, 0xa436, 0xA080, - 0xa438, 0x00cc, 0xa436, 0xA090, 0xa438, 0x0103, 0xa436, 0xA016, - 0xa438, 0x0020, 0xa436, 0xA012, 0xa438, 0x0000, 0xa436, 0xA014, - 0xa438, 0x1800, 0xa438, 0x8010, 0xa438, 0x1800, 0xa438, 0x8020, - 0xa438, 0x1800, 0xa438, 0x802a, 0xa438, 0x1800, 0xa438, 0x8035, - 0xa438, 0x1800, 0xa438, 0x803c, 0xa438, 0x1800, 0xa438, 0x803c, - 0xa438, 0x1800, 0xa438, 0x803c, 0xa438, 0x1800, 0xa438, 0x803c, - 0xa438, 0xd107, 0xa438, 0xd042, 0xa438, 0xa404, 0xa438, 0x1000, - 0xa438, 0x09df, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x8280, - 0xa438, 0xd700, 0xa438, 0x6065, 0xa438, 0xd125, 0xa438, 0xf002, - 0xa438, 0xd12b, 0xa438, 0xd040, 0xa438, 0x1800, 0xa438, 0x077f, - 0xa438, 0x0cf0, 0xa438, 0x0c50, 0xa438, 0xd104, 0xa438, 0xd040, - 0xa438, 0x1000, 0xa438, 0x0aa8, 0xa438, 0xd700, 0xa438, 0x5fb4, - 0xa438, 0x1800, 0xa438, 0x0a2e, 0xa438, 0xcb9b, 0xa438, 0xd110, - 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x0b7b, 0xa438, 0x1000, - 0xa438, 0x09df, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x1800, - 0xa438, 0x081b, 0xa438, 0x1000, 0xa438, 0x09df, 0xa438, 0xd704, - 0xa438, 0x7fb8, 0xa438, 0xa718, 0xa438, 0x1800, 0xa438, 0x074e, - 0xa436, 0xA10E, 0xa438, 0xffff, 0xa436, 0xA10C, 0xa438, 0xffff, - 0xa436, 0xA10A, 0xa438, 0xffff, 0xa436, 0xA108, 0xa438, 0xffff, - 0xa436, 0xA106, 0xa438, 0x074d, 0xa436, 0xA104, 0xa438, 0x0818, - 0xa436, 0xA102, 0xa438, 0x0a2c, 0xa436, 0xA100, 0xa438, 0x077e, - 0xa436, 0xA110, 0xa438, 0x000f, 0xa436, 0xb87c, 0xa438, 0x8625, - 0xa436, 0xb87e, 0xa438, 0xaf86, 0xa438, 0x3daf, 0xa438, 0x8689, - 0xa438, 0xaf88, 0xa438, 0x69af, 0xa438, 0x8887, 0xa438, 0xaf88, - 0xa438, 0x9caf, 0xa438, 0x889c, 0xa438, 0xaf88, 0xa438, 0x9caf, - 0xa438, 0x889c, 0xa438, 0xbf86, 0xa438, 0x49d7, 0xa438, 0x0040, - 0xa438, 0x0277, 0xa438, 0x7daf, 0xa438, 0x2727, 0xa438, 0x0000, - 0xa438, 0x7205, 0xa438, 0x0000, 0xa438, 0x7208, 0xa438, 0x0000, - 0xa438, 0x71f3, 0xa438, 0x0000, 0xa438, 0x71f6, 0xa438, 0x0000, - 0xa438, 0x7229, 0xa438, 0x0000, 0xa438, 0x722c, 0xa438, 0x0000, - 0xa438, 0x7217, 0xa438, 0x0000, 0xa438, 0x721a, 0xa438, 0x0000, - 0xa438, 0x721d, 0xa438, 0x0000, 0xa438, 0x7211, 0xa438, 0x0000, - 0xa438, 0x7220, 0xa438, 0x0000, 0xa438, 0x7214, 0xa438, 0x0000, - 0xa438, 0x722f, 0xa438, 0x0000, 0xa438, 0x7223, 0xa438, 0x0000, - 0xa438, 0x7232, 0xa438, 0x0000, 0xa438, 0x7226, 0xa438, 0xf8f9, - 0xa438, 0xfae0, 0xa438, 0x85b3, 0xa438, 0x3802, 0xa438, 0xad27, - 0xa438, 0x02ae, 0xa438, 0x03af, 0xa438, 0x8830, 0xa438, 0x1f66, - 0xa438, 0xef65, 0xa438, 0xbfc2, 0xa438, 0x1f1a, 0xa438, 0x96f7, - 0xa438, 0x05ee, 0xa438, 0xffd2, 0xa438, 0x00da, 0xa438, 0xf605, - 0xa438, 0xbfc2, 0xa438, 0x2f1a, 0xa438, 0x96f7, 0xa438, 0x05ee, - 0xa438, 0xffd2, 0xa438, 0x00db, 0xa438, 0xf605, 0xa438, 0xef02, - 0xa438, 0x1f11, 0xa438, 0x0d42, 0xa438, 0xbf88, 0xa438, 0x4202, - 0xa438, 0x6e7d, 0xa438, 0xef02, 0xa438, 0x1b03, 0xa438, 0x1f11, - 0xa438, 0x0d42, 0xa438, 0xbf88, 0xa438, 0x4502, 0xa438, 0x6e7d, - 0xa438, 0xef02, 0xa438, 0x1a03, 0xa438, 0x1f11, 0xa438, 0x0d42, - 0xa438, 0xbf88, 0xa438, 0x4802, 0xa438, 0x6e7d, 0xa438, 0xbfc2, - 0xa438, 0x3f1a, 0xa438, 0x96f7, 0xa438, 0x05ee, 0xa438, 0xffd2, - 0xa438, 0x00da, 0xa438, 0xf605, 0xa438, 0xbfc2, 0xa438, 0x4f1a, - 0xa438, 0x96f7, 0xa438, 0x05ee, 0xa438, 0xffd2, 0xa438, 0x00db, - 0xa438, 0xf605, 0xa438, 0xef02, 0xa438, 0x1f11, 0xa438, 0x0d42, - 0xa438, 0xbf88, 0xa438, 0x4b02, 0xa438, 0x6e7d, 0xa438, 0xef02, - 0xa438, 0x1b03, 0xa438, 0x1f11, 0xa438, 0x0d42, 0xa438, 0xbf88, - 0xa438, 0x4e02, 0xa438, 0x6e7d, 0xa438, 0xef02, 0xa438, 0x1a03, - 0xa438, 0x1f11, 0xa438, 0x0d42, 0xa438, 0xbf88, 0xa438, 0x5102, - 0xa438, 0x6e7d, 0xa438, 0xef56, 0xa438, 0xd020, 0xa438, 0x1f11, - 0xa438, 0xbf88, 0xa438, 0x5402, 0xa438, 0x6e7d, 0xa438, 0xbf88, - 0xa438, 0x5702, 0xa438, 0x6e7d, 0xa438, 0xbf88, 0xa438, 0x5a02, - 0xa438, 0x6e7d, 0xa438, 0xe185, 0xa438, 0xa0ef, 0xa438, 0x0348, - 0xa438, 0x0a28, 0xa438, 0x05ef, 0xa438, 0x201b, 0xa438, 0x01ad, - 0xa438, 0x2735, 0xa438, 0x1f44, 0xa438, 0xe085, 0xa438, 0x88e1, - 0xa438, 0x8589, 0xa438, 0xbf88, 0xa438, 0x5d02, 0xa438, 0x6e7d, - 0xa438, 0xe085, 0xa438, 0x8ee1, 0xa438, 0x858f, 0xa438, 0xbf88, - 0xa438, 0x6002, 0xa438, 0x6e7d, 0xa438, 0xe085, 0xa438, 0x94e1, - 0xa438, 0x8595, 0xa438, 0xbf88, 0xa438, 0x6302, 0xa438, 0x6e7d, - 0xa438, 0xe085, 0xa438, 0x9ae1, 0xa438, 0x859b, 0xa438, 0xbf88, - 0xa438, 0x6602, 0xa438, 0x6e7d, 0xa438, 0xaf88, 0xa438, 0x3cbf, - 0xa438, 0x883f, 0xa438, 0x026e, 0xa438, 0x9cad, 0xa438, 0x2835, - 0xa438, 0x1f44, 0xa438, 0xe08f, 0xa438, 0xf8e1, 0xa438, 0x8ff9, - 0xa438, 0xbf88, 0xa438, 0x5d02, 0xa438, 0x6e7d, 0xa438, 0xe08f, - 0xa438, 0xfae1, 0xa438, 0x8ffb, 0xa438, 0xbf88, 0xa438, 0x6002, - 0xa438, 0x6e7d, 0xa438, 0xe08f, 0xa438, 0xfce1, 0xa438, 0x8ffd, - 0xa438, 0xbf88, 0xa438, 0x6302, 0xa438, 0x6e7d, 0xa438, 0xe08f, - 0xa438, 0xfee1, 0xa438, 0x8fff, 0xa438, 0xbf88, 0xa438, 0x6602, - 0xa438, 0x6e7d, 0xa438, 0xaf88, 0xa438, 0x3ce1, 0xa438, 0x85a1, - 0xa438, 0x1b21, 0xa438, 0xad37, 0xa438, 0x341f, 0xa438, 0x44e0, - 0xa438, 0x858a, 0xa438, 0xe185, 0xa438, 0x8bbf, 0xa438, 0x885d, - 0xa438, 0x026e, 0xa438, 0x7de0, 0xa438, 0x8590, 0xa438, 0xe185, - 0xa438, 0x91bf, 0xa438, 0x8860, 0xa438, 0x026e, 0xa438, 0x7de0, - 0xa438, 0x8596, 0xa438, 0xe185, 0xa438, 0x97bf, 0xa438, 0x8863, - 0xa438, 0x026e, 0xa438, 0x7de0, 0xa438, 0x859c, 0xa438, 0xe185, - 0xa438, 0x9dbf, 0xa438, 0x8866, 0xa438, 0x026e, 0xa438, 0x7dae, - 0xa438, 0x401f, 0xa438, 0x44e0, 0xa438, 0x858c, 0xa438, 0xe185, - 0xa438, 0x8dbf, 0xa438, 0x885d, 0xa438, 0x026e, 0xa438, 0x7de0, - 0xa438, 0x8592, 0xa438, 0xe185, 0xa438, 0x93bf, 0xa438, 0x8860, - 0xa438, 0x026e, 0xa438, 0x7de0, 0xa438, 0x8598, 0xa438, 0xe185, - 0xa438, 0x99bf, 0xa438, 0x8863, 0xa438, 0x026e, 0xa438, 0x7de0, - 0xa438, 0x859e, 0xa438, 0xe185, 0xa438, 0x9fbf, 0xa438, 0x8866, - 0xa438, 0x026e, 0xa438, 0x7dae, 0xa438, 0x0ce1, 0xa438, 0x85b3, - 0xa438, 0x3904, 0xa438, 0xac2f, 0xa438, 0x04ee, 0xa438, 0x85b3, - 0xa438, 0x00af, 0xa438, 0x39d9, 0xa438, 0x22ac, 0xa438, 0xeaf0, - 0xa438, 0xacf6, 0xa438, 0xf0ac, 0xa438, 0xfaf0, 0xa438, 0xacf8, - 0xa438, 0xf0ac, 0xa438, 0xfcf0, 0xa438, 0xad00, 0xa438, 0xf0ac, - 0xa438, 0xfef0, 0xa438, 0xacf0, 0xa438, 0xf0ac, 0xa438, 0xf4f0, - 0xa438, 0xacf2, 0xa438, 0xf0ac, 0xa438, 0xb0f0, 0xa438, 0xacae, - 0xa438, 0xf0ac, 0xa438, 0xacf0, 0xa438, 0xacaa, 0xa438, 0xa100, - 0xa438, 0x0ce1, 0xa438, 0x8ff7, 0xa438, 0xbf88, 0xa438, 0x8402, - 0xa438, 0x6e7d, 0xa438, 0xaf26, 0xa438, 0xe9e1, 0xa438, 0x8ff6, - 0xa438, 0xbf88, 0xa438, 0x8402, 0xa438, 0x6e7d, 0xa438, 0xaf26, - 0xa438, 0xf520, 0xa438, 0xac86, 0xa438, 0xbf88, 0xa438, 0x3f02, - 0xa438, 0x6e9c, 0xa438, 0xad28, 0xa438, 0x03af, 0xa438, 0x3324, - 0xa438, 0xad38, 0xa438, 0x03af, 0xa438, 0x32e6, 0xa438, 0xaf32, - 0xa438, 0xfb00, 0xa436, 0xb87c, 0xa438, 0x8ff6, 0xa436, 0xb87e, - 0xa438, 0x0705, 0xa436, 0xb87c, 0xa438, 0x8ff8, 0xa436, 0xb87e, - 0xa438, 0x19cc, 0xa436, 0xb87c, 0xa438, 0x8ffa, 0xa436, 0xb87e, - 0xa438, 0x28e3, 0xa436, 0xb87c, 0xa438, 0x8ffc, 0xa436, 0xb87e, - 0xa438, 0x1047, 0xa436, 0xb87c, 0xa438, 0x8ffe, 0xa436, 0xb87e, - 0xa438, 0x0a45, 0xa436, 0xb85e, 0xa438, 0x271E, 0xa436, 0xb860, - 0xa438, 0x3846, 0xa436, 0xb862, 0xa438, 0x26E6, 0xa436, 0xb864, - 0xa438, 0x32E3, 0xa436, 0xb886, 0xa438, 0xffff, 0xa436, 0xb888, - 0xa438, 0xffff, 0xa436, 0xb88a, 0xa438, 0xffff, 0xa436, 0xb88c, - 0xa438, 0xffff, 0xa436, 0xb838, 0xa438, 0x000f, 0xb820, 0x0010, - 0xa436, 0x846e, 0xa438, 0xaf84, 0xa438, 0x86af, 0xa438, 0x8690, - 0xa438, 0xaf86, 0xa438, 0xa4af, 0xa438, 0x86a4, 0xa438, 0xaf86, - 0xa438, 0xa4af, 0xa438, 0x86a4, 0xa438, 0xaf86, 0xa438, 0xa4af, - 0xa438, 0x86a4, 0xa438, 0xee82, 0xa438, 0x5f00, 0xa438, 0x0284, - 0xa438, 0x90af, 0xa438, 0x0441, 0xa438, 0xf8e0, 0xa438, 0x8ff3, - 0xa438, 0xa000, 0xa438, 0x0502, 0xa438, 0x84a4, 0xa438, 0xae06, - 0xa438, 0xa001, 0xa438, 0x0302, 0xa438, 0x84c8, 0xa438, 0xfc04, - 0xa438, 0xf8f9, 0xa438, 0xef59, 0xa438, 0xe080, 0xa438, 0x15ad, - 0xa438, 0x2702, 0xa438, 0xae03, 0xa438, 0xaf84, 0xa438, 0xc3bf, - 0xa438, 0x53ca, 0xa438, 0x0252, 0xa438, 0xc8ad, 0xa438, 0x2807, - 0xa438, 0x0285, 0xa438, 0x2cee, 0xa438, 0x8ff3, 0xa438, 0x01ef, - 0xa438, 0x95fd, 0xa438, 0xfc04, 0xa438, 0xf8f9, 0xa438, 0xfaef, - 0xa438, 0x69bf, 0xa438, 0x53ca, 0xa438, 0x0252, 0xa438, 0xc8ac, - 0xa438, 0x2822, 0xa438, 0xd480, 0xa438, 0x00bf, 0xa438, 0x8684, - 0xa438, 0x0252, 0xa438, 0xa9bf, 0xa438, 0x8687, 0xa438, 0x0252, - 0xa438, 0xa9bf, 0xa438, 0x868a, 0xa438, 0x0252, 0xa438, 0xa9bf, - 0xa438, 0x868d, 0xa438, 0x0252, 0xa438, 0xa9ee, 0xa438, 0x8ff3, - 0xa438, 0x00af, 0xa438, 0x8526, 0xa438, 0xe08f, 0xa438, 0xf4e1, - 0xa438, 0x8ff5, 0xa438, 0xe28f, 0xa438, 0xf6e3, 0xa438, 0x8ff7, - 0xa438, 0x1b45, 0xa438, 0xac27, 0xa438, 0x0eee, 0xa438, 0x8ff4, - 0xa438, 0x00ee, 0xa438, 0x8ff5, 0xa438, 0x0002, 0xa438, 0x852c, - 0xa438, 0xaf85, 0xa438, 0x26e0, 0xa438, 0x8ff4, 0xa438, 0xe18f, - 0xa438, 0xf52c, 0xa438, 0x0001, 0xa438, 0xe48f, 0xa438, 0xf4e5, - 0xa438, 0x8ff5, 0xa438, 0xef96, 0xa438, 0xfefd, 0xa438, 0xfc04, - 0xa438, 0xf8f9, 0xa438, 0xef59, 0xa438, 0xbf53, 0xa438, 0x2202, - 0xa438, 0x52c8, 0xa438, 0xa18b, 0xa438, 0x02ae, 0xa438, 0x03af, - 0xa438, 0x85da, 0xa438, 0xbf57, 0xa438, 0x7202, 0xa438, 0x52c8, - 0xa438, 0xe48f, 0xa438, 0xf8e5, 0xa438, 0x8ff9, 0xa438, 0xbf57, - 0xa438, 0x7502, 0xa438, 0x52c8, 0xa438, 0xe48f, 0xa438, 0xfae5, - 0xa438, 0x8ffb, 0xa438, 0xbf57, 0xa438, 0x7802, 0xa438, 0x52c8, - 0xa438, 0xe48f, 0xa438, 0xfce5, 0xa438, 0x8ffd, 0xa438, 0xbf57, - 0xa438, 0x7b02, 0xa438, 0x52c8, 0xa438, 0xe48f, 0xa438, 0xfee5, - 0xa438, 0x8fff, 0xa438, 0xbf57, 0xa438, 0x6c02, 0xa438, 0x52c8, - 0xa438, 0xa102, 0xa438, 0x13ee, 0xa438, 0x8ffc, 0xa438, 0x80ee, - 0xa438, 0x8ffd, 0xa438, 0x00ee, 0xa438, 0x8ffe, 0xa438, 0x80ee, - 0xa438, 0x8fff, 0xa438, 0x00af, 0xa438, 0x8599, 0xa438, 0xa101, - 0xa438, 0x0cbf, 0xa438, 0x534c, 0xa438, 0x0252, 0xa438, 0xc8a1, - 0xa438, 0x0303, 0xa438, 0xaf85, 0xa438, 0x77bf, 0xa438, 0x5322, - 0xa438, 0x0252, 0xa438, 0xc8a1, 0xa438, 0x8b02, 0xa438, 0xae03, - 0xa438, 0xaf86, 0xa438, 0x64e0, 0xa438, 0x8ff8, 0xa438, 0xe18f, - 0xa438, 0xf9bf, 0xa438, 0x8684, 0xa438, 0x0252, 0xa438, 0xa9e0, - 0xa438, 0x8ffa, 0xa438, 0xe18f, 0xa438, 0xfbbf, 0xa438, 0x8687, - 0xa438, 0x0252, 0xa438, 0xa9e0, 0xa438, 0x8ffc, 0xa438, 0xe18f, - 0xa438, 0xfdbf, 0xa438, 0x868a, 0xa438, 0x0252, 0xa438, 0xa9e0, - 0xa438, 0x8ffe, 0xa438, 0xe18f, 0xa438, 0xffbf, 0xa438, 0x868d, - 0xa438, 0x0252, 0xa438, 0xa9af, 0xa438, 0x867f, 0xa438, 0xbf53, - 0xa438, 0x2202, 0xa438, 0x52c8, 0xa438, 0xa144, 0xa438, 0x3cbf, - 0xa438, 0x547b, 0xa438, 0x0252, 0xa438, 0xc8e4, 0xa438, 0x8ff8, - 0xa438, 0xe58f, 0xa438, 0xf9bf, 0xa438, 0x547e, 0xa438, 0x0252, - 0xa438, 0xc8e4, 0xa438, 0x8ffa, 0xa438, 0xe58f, 0xa438, 0xfbbf, - 0xa438, 0x5481, 0xa438, 0x0252, 0xa438, 0xc8e4, 0xa438, 0x8ffc, - 0xa438, 0xe58f, 0xa438, 0xfdbf, 0xa438, 0x5484, 0xa438, 0x0252, - 0xa438, 0xc8e4, 0xa438, 0x8ffe, 0xa438, 0xe58f, 0xa438, 0xffbf, - 0xa438, 0x5322, 0xa438, 0x0252, 0xa438, 0xc8a1, 0xa438, 0x4448, - 0xa438, 0xaf85, 0xa438, 0xa7bf, 0xa438, 0x5322, 0xa438, 0x0252, - 0xa438, 0xc8a1, 0xa438, 0x313c, 0xa438, 0xbf54, 0xa438, 0x7b02, - 0xa438, 0x52c8, 0xa438, 0xe48f, 0xa438, 0xf8e5, 0xa438, 0x8ff9, - 0xa438, 0xbf54, 0xa438, 0x7e02, 0xa438, 0x52c8, 0xa438, 0xe48f, - 0xa438, 0xfae5, 0xa438, 0x8ffb, 0xa438, 0xbf54, 0xa438, 0x8102, - 0xa438, 0x52c8, 0xa438, 0xe48f, 0xa438, 0xfce5, 0xa438, 0x8ffd, - 0xa438, 0xbf54, 0xa438, 0x8402, 0xa438, 0x52c8, 0xa438, 0xe48f, - 0xa438, 0xfee5, 0xa438, 0x8fff, 0xa438, 0xbf53, 0xa438, 0x2202, - 0xa438, 0x52c8, 0xa438, 0xa131, 0xa438, 0x03af, 0xa438, 0x85a7, - 0xa438, 0xd480, 0xa438, 0x00bf, 0xa438, 0x8684, 0xa438, 0x0252, - 0xa438, 0xa9bf, 0xa438, 0x8687, 0xa438, 0x0252, 0xa438, 0xa9bf, - 0xa438, 0x868a, 0xa438, 0x0252, 0xa438, 0xa9bf, 0xa438, 0x868d, - 0xa438, 0x0252, 0xa438, 0xa9ef, 0xa438, 0x95fd, 0xa438, 0xfc04, - 0xa438, 0xf0d1, 0xa438, 0x2af0, 0xa438, 0xd12c, 0xa438, 0xf0d1, - 0xa438, 0x44f0, 0xa438, 0xd146, 0xa438, 0xbf86, 0xa438, 0xa102, - 0xa438, 0x52c8, 0xa438, 0xbf86, 0xa438, 0xa102, 0xa438, 0x52c8, - 0xa438, 0xd101, 0xa438, 0xaf06, 0xa438, 0xa570, 0xa438, 0xce42, - 0xa436, 0xb818, 0xa438, 0x043d, 0xa436, 0xb81a, 0xa438, 0x06a3, - 0xa436, 0xb81c, 0xa438, 0xffff, 0xa436, 0xb81e, 0xa438, 0xffff, - 0xa436, 0xb850, 0xa438, 0xffff, 0xa436, 0xb852, 0xa438, 0xffff, - 0xa436, 0xb878, 0xa438, 0xffff, 0xa436, 0xb884, 0xa438, 0xffff, - 0xa436, 0xb832, 0xa438, 0x0003, 0xa436, 0x0000, 0xa438, 0x0000, - 0xa436, 0xB82E, 0xa438, 0x0000, 0xa436, 0x8024, 0xa438, 0x0000, - 0xb820, 0x0000, 0xa436, 0x801E, 0xa438, 0x0019, 0xFFFF, 0xFFFF -}; - -static void -rtl8125_real_set_phy_mcu_8125b_1(struct net_device *dev) -{ - rtl8125_set_phy_mcu_ram_code(dev, - phy_mcu_ram_code_8125b_1, - ARRAY_SIZE(phy_mcu_ram_code_8125b_1) - ); -} - -static void -rtl8125_set_phy_mcu_8125b_1(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - rtl8125_set_phy_mcu_patch_request(tp); - - rtl8125_real_set_phy_mcu_8125b_1(dev); - - rtl8125_clear_phy_mcu_patch_request(tp); -} - -static void -rtl8125_real_set_phy_mcu_8125b_2(struct net_device *dev) -{ - rtl8125_set_phy_mcu_ram_code(dev, - phy_mcu_ram_code_8125b_2, - ARRAY_SIZE(phy_mcu_ram_code_8125b_2) - ); -} - -static void -rtl8125_set_phy_mcu_8125b_2(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - rtl8125_set_phy_mcu_patch_request(tp); - - rtl8125_real_set_phy_mcu_8125b_2(dev); - - rtl8125_clear_phy_mcu_patch_request(tp); -} - -static void -rtl8125_init_hw_phy_mcu(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u8 require_disable_phy_disable_mode = FALSE; - - if (tp->NotWrRamCodeToMicroP == TRUE) return; - if (rtl8125_check_hw_phy_mcu_code_ver(dev)) return; - - if (HW_SUPPORT_CHECK_PHY_DISABLE_MODE(tp) && rtl8125_is_in_phy_disable_mode(dev)) - require_disable_phy_disable_mode = TRUE; - - if (require_disable_phy_disable_mode) - rtl8125_disable_phy_disable_mode(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - rtl8125_set_phy_mcu_8125a_1(dev); - break; - case CFG_METHOD_3: - rtl8125_set_phy_mcu_8125a_2(dev); - break; - case CFG_METHOD_4: - rtl8125_set_phy_mcu_8125b_1(dev); - break; - case CFG_METHOD_5: - rtl8125_set_phy_mcu_8125b_2(dev); - break; - } - - if (require_disable_phy_disable_mode) - rtl8125_enable_phy_disable_mode(dev); - - rtl8125_write_hw_phy_mcu_code_ver(dev); - - rtl8125_mdio_write(tp,0x1F, 0x0000); - - tp->HwHasWrRamCodeToMicroP = TRUE; -} - -static void -rtl8125_enable_phy_aldps(struct rtl8125_private *tp) -{ - //enable aldps - //GPHY OCP 0xA430 bit[2] = 0x1 (en_aldps) - SetEthPhyOcpBit(tp, 0xA430, BIT_2); -} - -static void -rtl8125_hw_phy_config_8125a_1(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - ClearAndSetEthPhyOcpBit(tp, - 0xAD40, - 0x03FF, - 0x84 - ); - - SetEthPhyOcpBit(tp, 0xAD4E, BIT_4); - ClearAndSetEthPhyOcpBit(tp, - 0xAD16, - 0x03FF, - 0x0006 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xAD32, - 0x003F, - 0x0006 - ); - ClearEthPhyOcpBit(tp, 0xAC08, BIT_12); - ClearEthPhyOcpBit(tp, 0xAC08, BIT_8); - ClearAndSetEthPhyOcpBit(tp, - 0xAC8A, - BIT_15|BIT_14|BIT_13|BIT_12, - BIT_14|BIT_13|BIT_12 - ); - SetEthPhyOcpBit(tp, 0xAD18, BIT_10); - SetEthPhyOcpBit(tp, 0xAD1A, 0x3FF); - SetEthPhyOcpBit(tp, 0xAD1C, 0x3FF); - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80EA); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0xC400 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80EB); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0x0700, - 0x0300 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80F8); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x1C00 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80F1); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x3000 - ); - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80FE); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0xA500 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8102); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x5000 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8105); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x3300 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8100); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x7000 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8104); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0xF000 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8106); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x6500 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DC); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0xED00 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DF); - SetEthPhyOcpBit(tp, 0xA438, BIT_8); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80E1); - ClearEthPhyOcpBit(tp, 0xA438, BIT_8); - - ClearAndSetEthPhyOcpBit(tp, - 0xBF06, - 0x003F, - 0x38 - ); - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x819F); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xD0B6); - - mdio_direct_write_phy_ocp(tp, 0xBC34, 0x5555); - ClearAndSetEthPhyOcpBit(tp, - 0xBF0A, - BIT_11|BIT_10|BIT_9, - BIT_11|BIT_9 - ); - - ClearEthPhyOcpBit(tp, 0xA5C0, BIT_10); - - SetEthPhyOcpBit(tp, 0xA442, BIT_11); - - //enable aldps - //GPHY OCP 0xA430 bit[2] = 0x1 (en_aldps) - if (aspm) { - if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { - rtl8125_enable_phy_aldps(tp); - } - } -} - -static void -rtl8125_hw_phy_config_8125a_2(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - SetEthPhyOcpBit(tp, 0xAD4E, BIT_4); - ClearAndSetEthPhyOcpBit(tp, - 0xAD16, - 0x03FF, - 0x03FF - ); - ClearAndSetEthPhyOcpBit(tp, - 0xAD32, - 0x003F, - 0x0006 - ); - ClearEthPhyOcpBit(tp, 0xAC08, BIT_12); - ClearEthPhyOcpBit(tp, 0xAC08, BIT_8); - ClearAndSetEthPhyOcpBit(tp, - 0xACC0, - BIT_1|BIT_0, - BIT_1 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xAD40, - BIT_7|BIT_6|BIT_5, - BIT_6 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xAD40, - BIT_2|BIT_1|BIT_0, - BIT_2 - ); - ClearEthPhyOcpBit(tp, 0xAC14, BIT_7); - ClearEthPhyOcpBit(tp, 0xAC80, BIT_9|BIT_8); - ClearAndSetEthPhyOcpBit(tp, - 0xAC5E, - BIT_2|BIT_1|BIT_0, - BIT_1 - ); - mdio_direct_write_phy_ocp(tp, 0xAD4C, 0x00A8); - mdio_direct_write_phy_ocp(tp, 0xAC5C, 0x01FF); - ClearAndSetEthPhyOcpBit(tp, - 0xAC8A, - BIT_7|BIT_6|BIT_5|BIT_4, - BIT_5|BIT_4 - ); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8157); - ClearAndSetEthPhyOcpBit(tp, - 0xB87E, - 0xFF00, - 0x0500 - ); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8159); - ClearAndSetEthPhyOcpBit(tp, - 0xB87E, - 0xFF00, - 0x0700 - ); - - - RTL_W16(tp, EEE_TXIDLE_TIMER_8125, dev->mtu + ETH_HLEN + 0x20); - - - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80A2); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0153); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x809C); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0153); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x81B3); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0043); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00A7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00D6); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00EC); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00F6); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00FB); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00FD); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00FF); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x00BB); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0058); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0029); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0013); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0009); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0004); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0002); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8257); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x020F); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80EA); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x7843); - - - rtl8125_set_phy_mcu_patch_request(tp); - - ClearEthPhyOcpBit(tp, 0xB896, BIT_0); - ClearEthPhyOcpBit(tp, 0xB892, 0xFF00); - - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC091); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x6E12); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC092); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x1214); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC094); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x1516); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC096); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x171B); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC098); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x1B1C); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC09A); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x1F1F); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC09C); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x2021); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC09E); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x2224); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC0A0); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x2424); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC0A2); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x2424); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC0A4); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x2424); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC018); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x0AF2); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC01A); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x0D4A); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC01C); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x0F26); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC01E); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x118D); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC020); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x14F3); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC022); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x175A); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC024); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x19C0); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC026); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x1C26); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC089); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x6050); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC08A); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x5F6E); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC08C); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x6E6E); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC08E); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x6E6E); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC090); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x6E12); - - SetEthPhyOcpBit(tp, 0xB896, BIT_0); - - rtl8125_clear_phy_mcu_patch_request(tp); - - - SetEthPhyOcpBit(tp, 0xD068, BIT_13); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x81A2); - SetEthPhyOcpBit(tp, 0xA438, BIT_8); - ClearAndSetEthPhyOcpBit(tp, - 0xB54C, - 0xFF00, - 0xDB00); - - - ClearEthPhyOcpBit(tp, 0xA454, BIT_0); - - - SetEthPhyOcpBit(tp, 0xA5D4, BIT_5); - ClearEthPhyOcpBit(tp, 0xAD4E, BIT_4); - ClearEthPhyOcpBit(tp, 0xA86A, BIT_0); - - - SetEthPhyOcpBit(tp, 0xA442, BIT_11); - - - if (tp->RequirePhyMdiSwapPatch) { - u16 adccal_offset_p0; - u16 adccal_offset_p1; - u16 adccal_offset_p2; - u16 adccal_offset_p3; - u16 rg_lpf_cap_xg_p0; - u16 rg_lpf_cap_xg_p1; - u16 rg_lpf_cap_xg_p2; - u16 rg_lpf_cap_xg_p3; - u16 rg_lpf_cap_p0; - u16 rg_lpf_cap_p1; - u16 rg_lpf_cap_p2; - u16 rg_lpf_cap_p3; - - ClearAndSetEthPhyOcpBit(tp, - 0xD068, - 0x0007, - 0x0001 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xD068, - 0x0018, - 0x0000 - ); - adccal_offset_p0 = mdio_direct_read_phy_ocp(tp, 0xD06A); - adccal_offset_p0 &= 0x07FF; - ClearAndSetEthPhyOcpBit(tp, - 0xD068, - 0x0018, - 0x0008 - ); - adccal_offset_p1 = mdio_direct_read_phy_ocp(tp, 0xD06A); - adccal_offset_p1 &= 0x07FF; - ClearAndSetEthPhyOcpBit(tp, - 0xD068, - 0x0018, - 0x0010 - ); - adccal_offset_p2 = mdio_direct_read_phy_ocp(tp, 0xD06A); - adccal_offset_p2 &= 0x07FF; - ClearAndSetEthPhyOcpBit(tp, - 0xD068, - 0x0018, - 0x0018 - ); - adccal_offset_p3 = mdio_direct_read_phy_ocp(tp, 0xD06A); - adccal_offset_p3 &= 0x07FF; - - - ClearAndSetEthPhyOcpBit(tp, - 0xD068, - 0x0018, - 0x0000 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xD06A, - 0x07FF, - adccal_offset_p3 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xD068, - 0x0018, - 0x0008 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xD06A, - 0x07FF, - adccal_offset_p2 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xD068, - 0x0018, - 0x0010 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xD06A, - 0x07FF, - adccal_offset_p1 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xD068, - 0x0018, - 0x0018 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xD06A, - 0x07FF, - adccal_offset_p0 - ); - - - rg_lpf_cap_xg_p0 = mdio_direct_read_phy_ocp(tp, 0xBD5A); - rg_lpf_cap_xg_p0 &= 0x001F; - rg_lpf_cap_xg_p1 = mdio_direct_read_phy_ocp(tp, 0xBD5A); - rg_lpf_cap_xg_p1 &= 0x1F00; - rg_lpf_cap_xg_p2 = mdio_direct_read_phy_ocp(tp, 0xBD5C); - rg_lpf_cap_xg_p2 &= 0x001F; - rg_lpf_cap_xg_p3 = mdio_direct_read_phy_ocp(tp, 0xBD5C); - rg_lpf_cap_xg_p3 &= 0x1F00; - rg_lpf_cap_p0 = mdio_direct_read_phy_ocp(tp, 0xBC18); - rg_lpf_cap_p0 &= 0x001F; - rg_lpf_cap_p1 = mdio_direct_read_phy_ocp(tp, 0xBC18); - rg_lpf_cap_p1 &= 0x1F00; - rg_lpf_cap_p2 = mdio_direct_read_phy_ocp(tp, 0xBC1A); - rg_lpf_cap_p2 &= 0x001F; - rg_lpf_cap_p3 = mdio_direct_read_phy_ocp(tp, 0xBC1A); - rg_lpf_cap_p3 &= 0x1F00; - - - ClearAndSetEthPhyOcpBit(tp, - 0xBD5A, - 0x001F, - rg_lpf_cap_xg_p3 >> 8 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xBD5A, - 0x1F00, - rg_lpf_cap_xg_p2 << 8 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xBD5C, - 0x001F, - rg_lpf_cap_xg_p1 >> 8 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xBD5C, - 0x1F00, - rg_lpf_cap_xg_p0 << 8 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xBC18, - 0x001F, - rg_lpf_cap_p3 >> 8 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xBC18, - 0x1F00, - rg_lpf_cap_p2 << 8 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xBC1A, - 0x001F, - rg_lpf_cap_p1 >> 8 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xBC1A, - 0x1F00, - rg_lpf_cap_p0 << 8 - ); - } - - - if (aspm) { - if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { - rtl8125_enable_phy_aldps(tp); - } - } -} - -static void -rtl8125_hw_phy_config_8125b_1(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - SetEthPhyOcpBit(tp, 0xA442, BIT_11); - - - SetEthPhyOcpBit(tp, 0xBC08, (BIT_3 | BIT_2)); - - - if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8FFF); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x0400 - ); - } - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8560); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x19CC); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8562); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x19CC); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8564); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x19CC); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8566); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x147D); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8568); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x147D); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x856A); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x147D); - if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FFE); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0907); - } - ClearAndSetEthPhyOcpBit(tp, - 0xACDA, - 0xFF00, - 0xFF00 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xACDE, - 0xF000, - 0xF000 - ); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80D6); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x2801); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80F2); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x2801); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80F4); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x6077); - mdio_direct_write_phy_ocp(tp, 0xB506, 0x01E7); - mdio_direct_write_phy_ocp(tp, 0xAC8C, 0x0FFC); - mdio_direct_write_phy_ocp(tp, 0xAC46, 0xB7B4); - mdio_direct_write_phy_ocp(tp, 0xAC50, 0x0FBC); - mdio_direct_write_phy_ocp(tp, 0xAC3C, 0x9240); - mdio_direct_write_phy_ocp(tp, 0xAC4E, 0x0DB4); - mdio_direct_write_phy_ocp(tp, 0xACC6, 0x0707); - mdio_direct_write_phy_ocp(tp, 0xACC8, 0xA0D3); - mdio_direct_write_phy_ocp(tp, 0xAD08, 0x0007); - - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8013); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0700); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FB9); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x2801); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FBA); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0100); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FBC); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x1900); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FBE); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xE100); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FC0); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0800); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FC2); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xE500); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FC4); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0F00); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FC6); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xF100); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FC8); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0400); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FCa); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xF300); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FCc); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xFD00); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FCe); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xFF00); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FD0); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xFB00); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FD2); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0100); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FD4); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xF400); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FD6); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xFF00); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FD8); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xF600); - - - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x813D); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x390E); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x814F); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x790E); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80B0); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0F31); - SetEthPhyOcpBit(tp, 0xBF4C, BIT_1); - SetEthPhyOcpBit(tp, 0xBCCA, (BIT_9 | BIT_8)); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8141); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x320E); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8153); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x720E); - ClearEthPhyOcpBit(tp, 0xA432, BIT_6); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8529); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x050E); - - - RTL_W16(tp, EEE_TXIDLE_TIMER_8125, dev->mtu + ETH_HLEN + 0x20); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x816C); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xC4A0); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8170); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xC4A0); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8174); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x04A0); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8178); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x04A0); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x817C); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0719); - if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8FF4); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0400); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8FF1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0404); - } - mdio_direct_write_phy_ocp(tp, 0xBF4A, 0x001B); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8033); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x7C13); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8037); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x7C13); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x803B); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0xFC32); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x803F); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x7C13); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8043); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x7C13); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8047); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x7C13); - - - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8145); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x370E); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8157); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x770E); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8169); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0D0A); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x817B); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x1D0A); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8217); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x5000 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x821A); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x5000 - ); - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DA); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0403); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DC); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x1000 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80B3); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x0384); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80B7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2007); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80BA); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x6C00 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80B5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xF009); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80BD); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x9F00 - ); - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80C7); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xf083); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DD); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x03f0); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DF); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x1000 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80CB); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x2007); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80CE); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x6C00 - ); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80C9); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x8009); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80D1); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0x8000 - ); - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80A3); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x200A); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80A5); - mdio_direct_write_phy_ocp(tp, 0xA438, 0xF0AD); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x809F); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x6073); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80A1); - mdio_direct_write_phy_ocp(tp, 0xA438, 0x000B); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x80A9); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - 0xFF00, - 0xC000 - ); - - rtl8125_set_phy_mcu_patch_request(tp); - - ClearEthPhyOcpBit(tp, 0xB896, BIT_0); - ClearEthPhyOcpBit(tp, 0xB892, 0xFF00); - - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC23E); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x0000); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC240); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x0103); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC242); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x0507); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC244); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x090B); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC246); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x0C0E); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC248); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x1012); - mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC24A); - mdio_direct_write_phy_ocp(tp, 0xB890, 0x1416); - - SetEthPhyOcpBit(tp, 0xB896, BIT_0); - - rtl8125_clear_phy_mcu_patch_request(tp); - - - SetEthPhyOcpBit(tp, 0xA86A, BIT_0); - SetEthPhyOcpBit(tp, 0xA6F0, BIT_0); - - - mdio_direct_write_phy_ocp(tp, 0xBFA0, 0xD70D); - mdio_direct_write_phy_ocp(tp, 0xBFA2, 0x4100); - mdio_direct_write_phy_ocp(tp, 0xBFA4, 0xE868); - mdio_direct_write_phy_ocp(tp, 0xBFA6, 0xDC59); - mdio_direct_write_phy_ocp(tp, 0xB54C, 0x3C18); - ClearEthPhyOcpBit(tp, 0xBFA4, BIT_5); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x817D); - SetEthPhyOcpBit(tp, 0xA438, BIT_12); - - - if (aspm) { - if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { - rtl8125_enable_phy_aldps(tp); - } - } -} - -static void -rtl8125_hw_phy_config_8125b_2(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - SetEthPhyOcpBit(tp, 0xA442, BIT_11); - - - ClearAndSetEthPhyOcpBit(tp, - 0xAC46, - 0x00F0, - 0x0090 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xAD30, - 0x0003, - 0x0001 - ); - - - RTL_W16(tp, EEE_TXIDLE_TIMER_8125, dev->mtu + ETH_HLEN + 0x20); - - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80F5); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x760E); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8107); - mdio_direct_write_phy_ocp(tp, 0xB87E, 0x360E); - mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8551); - ClearAndSetEthPhyOcpBit(tp, - 0xB87E, - BIT_15 | BIT_14 | BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 | BIT_8, - BIT_11 - ); - - ClearAndSetEthPhyOcpBit(tp, - 0xbf00, - 0xE000, - 0xA000 - ); - ClearAndSetEthPhyOcpBit(tp, - 0xbf46, - 0x0F00, - 0x0300 - ); - mdio_direct_write_phy_ocp(tp, 0xa436, 0x8044); - mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); - mdio_direct_write_phy_ocp(tp, 0xa436, 0x804A); - mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); - mdio_direct_write_phy_ocp(tp, 0xa436, 0x8050); - mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); - mdio_direct_write_phy_ocp(tp, 0xa436, 0x8056); - mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); - mdio_direct_write_phy_ocp(tp, 0xa436, 0x805C); - mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); - mdio_direct_write_phy_ocp(tp, 0xa436, 0x8062); - mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); - mdio_direct_write_phy_ocp(tp, 0xa436, 0x8068); - mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); - mdio_direct_write_phy_ocp(tp, 0xa436, 0x806E); - mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); - mdio_direct_write_phy_ocp(tp, 0xa436, 0x8074); - mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); - mdio_direct_write_phy_ocp(tp, 0xa436, 0x807A); - mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); - - - SetEthPhyOcpBit(tp, 0xA4CA, BIT_6); - - - ClearAndSetEthPhyOcpBit(tp, - 0xBF84, - BIT_15 | BIT_14 | BIT_13, - BIT_15 | BIT_13 - ); - - - mdio_direct_write_phy_ocp(tp, 0xA436, 0x8170); - ClearAndSetEthPhyOcpBit(tp, - 0xA438, - BIT_13 | BIT_10 | BIT_9 | BIT_8, - BIT_15 | BIT_14 | BIT_12 | BIT_11 - ); - - /* - mdio_direct_write_phy_ocp(tp, 0xBFA0, 0xD70D); - mdio_direct_write_phy_ocp(tp, 0xBFA2, 0x4100); - mdio_direct_write_phy_ocp(tp, 0xBFA4, 0xE868); - mdio_direct_write_phy_ocp(tp, 0xBFA6, 0xDC59); - mdio_direct_write_phy_ocp(tp, 0xB54C, 0x3C18); - ClearEthPhyOcpBit(tp, 0xBFA4, BIT_5); - mdio_direct_write_phy_ocp(tp, 0xA436, 0x817D); - SetEthPhyOcpBit(tp, 0xA438, BIT_12); - */ - - - if (aspm) { - if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { - rtl8125_enable_phy_aldps(tp); - } - } -} - -static void -rtl8125_set_hw_phy_before_init_phy_mcu(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - u16 PhyRegValue; - - switch (tp->mcfg) { - case CFG_METHOD_4: - mdio_direct_write_phy_ocp(tp, 0xBF86, 0x9000); - - SetEthPhyOcpBit(tp, 0xC402, BIT_10); - ClearEthPhyOcpBit(tp, 0xC402, BIT_10); - - PhyRegValue = mdio_direct_read_phy_ocp(tp, 0xBF86); - PhyRegValue &= (BIT_1 | BIT_0); - if (PhyRegValue != 0) - dprintk("PHY watch dog not clear, value = 0x%x \n", PhyRegValue); - - mdio_direct_write_phy_ocp(tp, 0xBD86, 0x1010); - mdio_direct_write_phy_ocp(tp, 0xBD88, 0x1010); - - ClearAndSetEthPhyOcpBit(tp, - 0xBD4E, - BIT_11 | BIT_10, - BIT_11); - ClearAndSetEthPhyOcpBit(tp, - 0xBF46, - BIT_11 | BIT_10 | BIT_9 | BIT_8, - BIT_10 | BIT_9 | BIT_8); - break; - } -} - -static void -rtl8125_hw_phy_config(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - if (tp->resume_not_chg_speed) return; - - tp->phy_reset_enable(dev); - - if (HW_DASH_SUPPORT_TYPE_3(tp) && tp->HwPkgDet == 0x06) return; - - rtl8125_set_hw_phy_before_init_phy_mcu(dev); - - rtl8125_init_hw_phy_mcu(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - rtl8125_hw_phy_config_8125a_1(dev); - break; - case CFG_METHOD_3: - rtl8125_hw_phy_config_8125a_2(dev); - break; - case CFG_METHOD_4: - rtl8125_hw_phy_config_8125b_1(dev); - break; - case CFG_METHOD_5: - rtl8125_hw_phy_config_8125b_2(dev); - break; - } - - //legacy force mode(Chap 22) - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - default: - rtl8125_mdio_write(tp, 0x1F, 0x0A5B); - rtl8125_clear_eth_phy_bit(tp, 0x12, BIT_15); - rtl8125_mdio_write(tp, 0x1F, 0x0000); - break; - } - - /*ocp phy power saving*/ - /* - if (aspm) { - if (tp->mcfg == CFG_METHOD_2 || tp->mcfg == CFG_METHOD_3) - rtl8125_enable_ocp_phy_power_saving(dev); - } - */ - - rtl8125_mdio_write(tp, 0x1F, 0x0000); - - if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { - if (tp->eee_enabled == 1) - rtl8125_enable_eee(tp); - else - rtl8125_disable_eee(tp); - } -} - -static inline void rtl8125_delete_esd_timer(struct net_device *dev, struct timer_list *timer) -{ - del_timer_sync(timer); -} - -static inline void rtl8125_request_esd_timer(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - struct timer_list *timer = &tp->esd_timer; -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) - setup_timer(timer, rtl8125_esd_timer, (unsigned long)dev); -#else - timer_setup(timer, rtl8125_esd_timer, 0); -#endif - mod_timer(timer, jiffies + RTL8125_ESD_TIMEOUT); -} - -/* -static inline void rtl8125_delete_link_timer(struct net_device *dev, struct timer_list *timer) -{ - del_timer_sync(timer); -} - -static inline void rtl8125_request_link_timer(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - struct timer_list *timer = &tp->link_timer; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) - setup_timer(timer, rtl8125_link_timer, (unsigned long)dev); -#else - timer_setup(timer, rtl8125_link_timer, 0); -#endif - mod_timer(timer, jiffies + RTL8125_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 -rtl8125_netpoll(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int i; - for (i = 0; i < tp->irq_nvecs; i++) { - struct r8125_irq *irq = &tp->irq_tbl[i]; - struct r8125_napi *r8125napi = &tp->r8125napi[i]; - - disable_irq(irq->vector); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,12,0) - irq->handler(irq->vector, r8125napi); -#elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) - irq->handler(irq->vector, r8125napi, NULL); -#else - irq->handler(irq->vector, r8125napi); -#endif - - enable_irq(irq->vector); - } -} -#endif //CONFIG_NET_POLL_CONTROLLER - -static void -rtl8125_get_bios_setting(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->bios_setting = RTL_R32(tp, TimeInt2); - break; - } -} - -static void -rtl8125_set_bios_setting(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - RTL_W32(tp, TimeInt2, tp->bios_setting); - break; - } -} - -static void -rtl8125_setup_mqs_reg(struct rtl8125_private *tp) -{ - int i; - - //tx - tp->tx_ring[0].tdsar_reg = TxDescStartAddrLow; - for (i = 1; i < R8125_MAX_TX_QUEUES; i++) { - tp->tx_ring[i].tdsar_reg = (u16)(TNPDS_Q1_LOW_8125 + (i - 1) * 8); - } - - for (i = 0; i < R8125_MAX_TX_QUEUES; i++) { - tp->tx_ring[i].hw_clo_ptr_reg = (u16)(HW_CLO_PTR0_8125 + i * 4); - tp->tx_ring[i].sw_tail_ptr_reg = (u16)(SW_TAIL_PTR0_8125 + i * 4); - } - - //rx - tp->rx_ring[0].rdsar_reg = RxDescAddrLow; - for (i = 1; i < R8125_MAX_RX_QUEUES; i++) { - tp->rx_ring[i].rdsar_reg = (u16)(RDSAR_Q1_LOW_8125 + (i - 1) * 8); - } - - tp->isr_reg[0] = ISR0_8125; - for (i = 1; i < R8125_MAX_QUEUES; i++) { - tp->isr_reg[i] = (u16)(ISR1_8125 + (i - 1) * 4); - } - - tp->imr_reg[0] = IMR0_8125; - for (i = 1; i < R8125_MAX_QUEUES; i++) { - tp->imr_reg[i] = (u16)(IMR1_8125 + (i - 1) * 4); - } -} - -static void -rtl8125_init_software_variable(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - struct pci_dev *pdev = tp->pci_dev; - - rtl8125_get_bios_setting(dev); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - //tp->HwSuppDashVer = 3; - break; - default: - tp->HwSuppDashVer = 0; - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwPkgDet = rtl8125_mac_ocp_read(tp, 0xDC00); - tp->HwPkgDet = (tp->HwPkgDet >> 3) & 0x07; - break; - } - - if (HW_DASH_SUPPORT_TYPE_3(tp) && tp->HwPkgDet == 0x06) - eee_enable = 0; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppNowIsOobVer = 1; - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwPcieSNOffset = 0x16C; - break; - } - -#ifdef ENABLE_REALWOW_SUPPORT - rtl8125_get_realwow_hw_version(dev); -#endif //ENABLE_REALWOW_SUPPORT - - if (HW_DASH_SUPPORT_DASH(tp) && rtl8125_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; - - //map CMAC IO space - CmacMemPhysAddress = rtl8125_csi_other_fun_read(tp, 0, 0x18); - if (!(CmacMemPhysAddress & BIT_0)) { - if (CmacMemPhysAddress & BIT_2) - CmacMemPhysAddress |= (u64)rtl8125_csi_other_fun_read(tp, 0, 0x1C) << 32; - - CmacMemPhysAddress &= 0xFFFFFFF0; - /* ioremap MMIO region */ - cmac_ioaddr = ioremap(CmacMemPhysAddress, R8125_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) - } - - if (cmac_ioaddr == NULL) { - tp->DASH = 0; - } else { - tp->mapped_cmac_ioaddr = cmac_ioaddr; - } - } - - eee_enable = 0; - } - - if (HW_DASH_SUPPORT_TYPE_3(tp)) - tp->cmac_ioaddr = tp->mapped_cmac_ioaddr; - - if (aspm) { - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->org_pci_offset_99 = rtl8125_csi_fun0_read_byte(tp, 0x99); - tp->org_pci_offset_99 &= ~(BIT_5|BIT_6); - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - tp->org_pci_offset_180 = rtl8125_csi_fun0_read_byte(tp, 0x264); - break; - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->org_pci_offset_180 = rtl8125_csi_fun0_read_byte(tp, 0x214); - 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_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - 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_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppMagicPktVer = WAKEUP_MAGIC_PACKET_V3; - break; - default: - tp->HwSuppMagicPktVer = WAKEUP_MAGIC_PACKET_NOT_SUPPORT; - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppLinkChgWakeUpVer = 3; - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppD0SpeedUpVer = 1; - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppCheckPhyDisableModeVer = 3; - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppGigaForceMode = TRUE; - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppTxNoCloseVer = 3; - break; - } - - if (tp->HwSuppTxNoCloseVer > 0 && tx_no_close_enable == 1) - tp->EnableTxNoClose = TRUE; - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - tp->RequireLSOPatch = TRUE; - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_2; - break; - case CFG_METHOD_3: - tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_3; - break; - case CFG_METHOD_4: - tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_4; - break; - case CFG_METHOD_5: - tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_5; - break; - } - - if (tp->HwIcVerUnknown) { - tp->NotWrRamCodeToMicroP = TRUE; - tp->NotWrMcuPatchCode = TRUE; - } - - switch (tp->mcfg) { - case CFG_METHOD_3: - if ((rtl8125_mac_ocp_read(tp, 0xD442) & BIT_5) && - (mdio_direct_read_phy_ocp(tp, 0xD068) & BIT_1) - ) { - tp->RequirePhyMdiSwapPatch = TRUE; - } - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppNumTxQueues = 2; - tp->HwSuppNumRxQueues = 4; - break; - default: - tp->HwSuppNumTxQueues = 1; - tp->HwSuppNumRxQueues = 1; - break; - } - - tp->num_tx_rings = 1; -#ifdef ENABLE_MULTIPLE_TX_QUEUE -#ifndef ENABLE_LIB_SUPPORT - tp->num_tx_rings = tp->HwSuppNumTxQueues; -#endif -#endif - - switch (tp->mcfg) { - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppRssVer = 5; - tp->HwSuppIndirTblEntries = 128; - break; - } - - tp->num_rx_rings = 1; -#ifdef ENABLE_RSS_SUPPORT -#ifdef ENABLE_LIB_SUPPORT - if (tp->HwSuppRssVer > 0) - tp->EnableRss = 1; -#else - if (tp->HwSuppRssVer > 0) { - u8 rss_queue_num = netif_get_num_default_rss_queues(); - tp->num_rx_rings = (tp->HwSuppNumRxQueues > rss_queue_num)? - rss_queue_num : tp->HwSuppNumRxQueues; - - if (!(tp->num_rx_rings >= 2 && tp->irq_nvecs >= tp->num_rx_rings)) - tp->num_rx_rings = 1; - - if (tp->num_rx_rings >= 2) - tp->EnableRss = 1; - } -#endif - if (tp->EnableRss) - rtl8125_init_rss(tp); -#endif - - rtl8125_setup_mqs_reg(tp); - - switch (tp->mcfg) { - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppPtpVer = 1; - break; - } -#ifdef ENABLE_PTP_SUPPORT - if (tp->HwSuppPtpVer > 0) - tp->EnablePtp = 1; -#endif - - tp->InitRxDescType = RX_DESC_RING_TYPE_1; - if (tp->EnableRss || tp->EnablePtp) - tp->InitRxDescType = RX_DESC_RING_TYPE_3; - - tp->RxDescLength = RX_DESC_LEN_TYPE_1; - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) - tp->RxDescLength = RX_DESC_LEN_TYPE_3; - tp->RxDescRingLength = NUM_RX_DESC * tp->RxDescLength; - - tp->rtl8125_rx_config = rtl_chip_info[tp->chipset].RCR_Cfg; - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) - tp->rtl8125_rx_config |= EnableRxDescV3; - - //init interrupt - switch (tp->mcfg) { - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppIsrVer = 2; - break; - default: - tp->HwSuppIsrVer = 1; - break; - } - - tp->HwCurrIsrVer = tp->HwSuppIsrVer; - if (tp->HwSuppIsrVer == 2 && !(tp->features & RTL_FEATURE_MSIX)) - tp->HwCurrIsrVer = 1; - - if (tp->HwCurrIsrVer < 2 || tp->irq_nvecs < 19) - tp->num_tx_rings = 1; - - if (tp->HwCurrIsrVer == 2) { - int i; - - tp->intr_mask = ISRIMR_V2_LINKCHG | ISRIMR_TOK_Q0; - if (tp->num_tx_rings > 1) - tp->intr_mask |= ISRIMR_TOK_Q1; - - for (i = 0; i < tp->num_rx_rings; i++) - tp->intr_mask |= ISRIMR_V2_ROK_Q0 << i; - } else { - tp->intr_mask = LinkChg | RxDescUnavail | TxOK | RxOK | SWInt; - tp->timer_intr_mask = LinkChg | PCSTimeout; - -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH) { - if (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); - } - } -#endif - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - tp->HwSuppIntMitiVer = 3; - break; - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->HwSuppIntMitiVer = 4; - break; - } - - timer_count_v2 = (timer_count / 0x100); - - tp->NicCustLedValue = RTL_R16(tp, CustomLED); - - tp->wol_opts = rtl8125_get_hw_wol(tp); - tp->wol_enabled = (tp->wol_opts) ? WOL_ENABLED : WOL_DISABLED; - - rtl8125_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 = rtl8125_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; - - tp->ptp_master_mode = enable_ptp_master_mode; -} - -static void -rtl8125_release_board(struct pci_dev *pdev, - struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - void __iomem *ioaddr = tp->mmio_addr; - - rtl8125_set_bios_setting(dev); - rtl8125_rar_set(tp, tp->org_mac_addr); - tp->wol_enabled = WOL_DISABLED; - - if (!tp->DASH) - rtl8125_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_disable_device(pdev); - free_netdev(dev); -} - -static int -rtl8125_get_mac_address(struct net_device *dev) -{ - struct rtl8125_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_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) { - *(u32*)&mac_addr[0] = RTL_R32(tp, BACKUP_ADDR0_8125); - *(u16*)&mac_addr[4] = RTL_R16(tp, BACKUP_ADDR1_8125); - } - - if (!is_valid_ether_addr(mac_addr)) { - netif_err(tp, probe, dev, "Invalid ether addr %pM\n", - mac_addr); - eth_hw_addr_random(dev); - ether_addr_copy(mac_addr, dev->dev_addr); - netif_info(tp, probe, dev, "Random ether addr %pM\n", - mac_addr); - tp->random_mac = 1; - } - - rtl8125_rar_set(tp, mac_addr); - - for (i = 0; i < MAC_ADDR_LEN; i++) { - dev->dev_addr[i] = RTL_R8(tp, MAC0 + i); - tp->org_mac_addr[i] = dev->dev_addr[i]; /* keep the original MAC address */ - } -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) - memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); -#endif -// memcpy(dev->dev_addr, dev->dev_addr, dev->addr_len); - - return 0; -} - -/** - * rtl8125_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 -rtl8125_set_mac_address(struct net_device *dev, - void *p) -{ - struct rtl8125_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); - - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); - - rtl8125_rar_set(tp, dev->dev_addr); - - spin_unlock_irqrestore(&tp->lock, flags); - - return 0; -} - -/****************************************************************************** - * rtl8125_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 -rtl8125_rar_set(struct rtl8125_private *tp, - uint8_t *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)); - - rtl8125_enable_cfg9346_write(tp); - RTL_W32(tp, MAC0, rar_low); - RTL_W32(tp, MAC4, rar_high); - - rtl8125_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(®s, 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, ®s, regbuf); - - ret = -EFAULT; - if (copy_to_user(useraddr, ®s, 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(ðcmd, 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 - -static int -rtl8125_do_ioctl(struct net_device *dev, - struct ifreq *ifr, - int cmd) -{ - struct rtl8125_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); - rtl8125_mdio_write(tp, 0x1F, 0x0000); - data->val_out = rtl8125_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); - rtl8125_mdio_write(tp, 0x1F, 0x0000); - rtl8125_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 - -#ifdef ENABLE_DASH_SUPPORT - case SIOCDEVPRIVATE_RTLDASH: - if (!netif_running(dev)) { - ret = -ENODEV; - break; - } - if (!capable(CAP_NET_ADMIN)) { - ret = -EPERM; - break; - } - - ret = rtl8125_dash_ioctl(dev, ifr); - break; -#endif - -#ifdef ENABLE_REALWOW_SUPPORT - case SIOCDEVPRIVATE_RTLREALWOW: - if (!netif_running(dev)) { - ret = -ENODEV; - break; - } - - ret = rtl8125_realwow_ioctl(dev, ifr); - break; -#endif - -#ifdef ENABLE_PTP_SUPPORT - case SIOCSHWTSTAMP: - case SIOCGHWTSTAMP: - if (tp->EnablePtp) - ret = rtl8125_ptp_ioctl(dev, ifr, cmd); - else - ret = -EOPNOTSUPP; - break; -#endif - case SIOCRTLTOOL: - ret = rtl8125_tool_ioctl(tp, ifr); - break; - - default: - ret = -EOPNOTSUPP; - break; - } - - return ret; -} - -static void -rtl8125_phy_power_up(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - if (rtl8125_is_in_phy_disable_mode(dev)) { - return; - } - - rtl8125_mdio_write(tp, 0x1F, 0x0000); - rtl8125_mdio_write(tp, MII_BMCR, BMCR_ANENABLE); - - //wait ups resume (phy state 3) - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_wait_phy_ups_resume(dev, 3); - break; - }; -} - -static void -rtl8125_phy_power_down(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - rtl8125_mdio_write(tp, 0x1F, 0x0000); - rtl8125_mdio_write(tp, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN); -} - -static int __devinit -rtl8125_init_board(struct pci_dev *pdev, - struct net_device **dev_out, - void __iomem **ioaddr_out) -{ - void __iomem *ioaddr; - struct net_device *dev; - struct rtl8125_private *tp; - int rc = -ENOMEM, i, pm_cap; - - assert(ioaddr_out != NULL); - - /* dev zeroed in alloc_etherdev */ - dev = alloc_etherdev_mq(sizeof (*tp), R8125_MAX_QUEUES); - 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->pci_dev = pdev; - tp->msg_enable = netif_msg_init(debug.msg_enable, R8125_MSG_DEFAULT); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) - if (!aspm) - 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; - } - - rc = pci_set_mwi(pdev); - if (rc < 0) - goto err_out_disable; - - /* 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) < R8125_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; - } - } - - pci_set_master(pdev); - - /* ioremap MMIO region */ - ioaddr = ioremap(pci_resource_start(pdev, 2), pci_resource_len(pdev, 2)); - 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 */ - rtl8125_get_mac_version(tp); - - rtl8125_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-8125 */ -#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); - -err_out_disable: - 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) -rtl8125_esd_timer(unsigned long __opaque) -#else -rtl8125_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 rtl8125_private *tp = netdev_priv(dev); - struct timer_list *timer = &tp->esd_timer; -#else - struct rtl8125_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 = RTL8125_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_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 = rtl8125_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); - rtl8125_csi_write(tp, tp->HwPcieSNOffset, tp->pci_cfg_space.pci_sn_l); - tp->esd_flag |= BIT_13; - } - - pci_sn_h = rtl8125_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); - rtl8125_csi_write(tp, tp->HwPcieSNOffset + 4, tp->pci_cfg_space.pci_sn_h); - tp->esd_flag |= BIT_14; - } - } - - if (tp->esd_flag != 0) { - printk(KERN_ERR "%s: esd_flag = 0x%04x\n.\n", dev->name, tp->esd_flag); - rtl8125_stop_all_tx_queue(dev); - netif_carrier_off(dev); - rtl8125_hw_reset(dev); - rtl8125_tx_clear(tp); - rtl8125_rx_clear(tp); - rtl8125_init_ring(dev); - rtl8125_hw_init(dev); - rtl8125_powerup_pll(dev); - rtl8125_hw_ephy_config(dev); - rtl8125_hw_phy_config(dev); - rtl8125_hw_config(dev); - rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); - tp->esd_flag = 0; - } - spin_unlock_irqrestore(&tp->lock, flags); - - mod_timer(timer, jiffies + timeout); -} - -/* -static void -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) -rtl8125_link_timer(unsigned long __opaque) -#else -rtl8125_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 rtl8125_private *tp = netdev_priv(dev); - struct timer_list *timer = &tp->link_timer; -#else - struct rtl8125_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); - rtl8125_check_link_status(dev, 0); - spin_unlock_irqrestore(&tp->lock, flags); - - mod_timer(timer, jiffies + RTL8125_LINK_TIMEOUT); -} -*/ - -int -rtl8125_enable_msix(struct rtl8125_private *tp) -{ - int i, nvecs = 0; - struct msix_entry msix_ent[R8125_MAX_MSIX_VEC]; - //struct net_device *dev = tp->dev; - //const int len = sizeof(tp->irq_tbl[0].name); - - for (i = 0; i < R8125_MAX_MSIX_VEC; i++) { - msix_ent[i].entry = i; - msix_ent[i].vector = 0; - } - - nvecs = pci_enable_msix_range(tp->pci_dev, msix_ent, - tp->min_irq_nvecs, tp->max_irq_nvecs); - if (nvecs < 0) - goto out; - - for (i = 0; i < nvecs; i++) { - struct r8125_irq *irq = &tp->irq_tbl[i]; - irq->vector = msix_ent[i].vector; - //snprintf(irq->name, len, "%s-%d", dev->name, i); - //irq->handler = rtl8125_interrupt_msix; - } - -out: - return nvecs; -} - -void rtl8125_dump_msix_tbl(struct rtl8125_private *tp) -{ - void __iomem *ioaddr; - - /* ioremap MMIO region */ - ioaddr = ioremap(pci_resource_start(tp->pci_dev, 4), pci_resource_len(tp->pci_dev, 4)); - if (ioaddr) { - int i = 0; - for (i=0; iirq_nvecs; i++) { - printk("entry 0x%d %08X %08X %08X %08X \n", - i, - readl(ioaddr + 16 * i), - readl(ioaddr + 16 * i + 4), - readl(ioaddr + 16 * i + 8), - readl(ioaddr + 16 * i + 12)); - } - iounmap(ioaddr); - } -} - -/* Cfg9346_Unlock assumed. */ -static int rtl8125_try_msi(struct rtl8125_private *tp) -{ - struct pci_dev *pdev = tp->pci_dev; - unsigned msi = 0; - int nvecs = 1; - - switch (tp->mcfg) { - case CFG_METHOD_4: - case CFG_METHOD_5: - tp->max_irq_nvecs = R8125_MAX_MSIX_VEC_8125B; - tp->min_irq_nvecs = R8125_MIN_MSIX_VEC_8125B; - break; - default: - tp->max_irq_nvecs = 1; - tp->min_irq_nvecs = 1; - break; - } - -#if defined(RTL_USE_NEW_INTR_API) - if ((nvecs = pci_alloc_irq_vectors(pdev, tp->min_irq_nvecs, tp->max_irq_nvecs, PCI_IRQ_MSIX)) > 0) - msi |= RTL_FEATURE_MSIX; - else if ((nvecs = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES)) > 0 && - pci_dev_msi_enabled(pdev)) - msi |= RTL_FEATURE_MSI; -#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) - if ((nvecs = rtl8125_enable_msix(tp)) > 0) - msi |= RTL_FEATURE_MSIX; - else if (!pci_enable_msi(pdev)) - msi |= RTL_FEATURE_MSI; -#endif - if (!(msi & (RTL_FEATURE_MSI | RTL_FEATURE_MSIX))) - dev_info(&pdev->dev, "no MSI/MSI-X. Back to INTx.\n"); - - if (!(msi & RTL_FEATURE_MSIX) || nvecs < 1) - nvecs = 1; - - tp->irq_nvecs = nvecs; - - tp->features |= msi; - - return nvecs; -} - -static void rtl8125_disable_msi(struct pci_dev *pdev, struct rtl8125_private *tp) -{ -#if defined(RTL_USE_NEW_INTR_API) - if (tp->features & (RTL_FEATURE_MSI | RTL_FEATURE_MSIX)) - pci_free_irq_vectors(pdev); -#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) - if (tp->features & (RTL_FEATURE_MSIX)) - pci_disable_msix(pdev); - else if (tp->features & (RTL_FEATURE_MSI)) - pci_disable_msi(pdev); -#endif - tp->features &= ~(RTL_FEATURE_MSI | RTL_FEATURE_MSIX); -} - -static int rtl8125_get_irq(struct pci_dev *pdev) -{ -#if defined(RTL_USE_NEW_INTR_API) - return pci_irq_vector(pdev, 0); -#else - return pdev->irq; -#endif -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) -static const struct net_device_ops rtl8125_netdev_ops = { - .ndo_open = rtl8125_open, - .ndo_stop = rtl8125_close, - .ndo_get_stats = rtl8125_get_stats, - .ndo_start_xmit = rtl8125_start_xmit, - .ndo_tx_timeout = rtl8125_tx_timeout, - .ndo_change_mtu = rtl8125_change_mtu, - .ndo_set_mac_address = rtl8125_set_mac_address, - .ndo_do_ioctl = rtl8125_do_ioctl, -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0) - .ndo_set_multicast_list = rtl8125_set_rx_mode, -#else - .ndo_set_rx_mode = rtl8125_set_rx_mode, -#endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) -#ifdef CONFIG_R8125_VLAN - .ndo_vlan_rx_register = rtl8125_vlan_rx_register, -#endif -#else - .ndo_fix_features = rtl8125_fix_features, - .ndo_set_features = rtl8125_set_features, -#endif -#ifdef CONFIG_NET_POLL_CONTROLLER - .ndo_poll_controller = rtl8125_netpoll, -#endif -}; -#endif - - -#ifdef CONFIG_R8125_NAPI - -static int rtl8125_poll(napi_ptr napi, napi_budget budget) -{ - struct r8125_napi *r8125napi = RTL_GET_PRIV(napi, struct r8125_napi); - struct rtl8125_private *tp = r8125napi->priv; - RTL_GET_NETDEV(tp) - unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); - unsigned int work_done = 0; - //unsigned long flags; - int i; - - for (i = 0; i < tp->num_rx_rings; i++) - work_done += rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[i], budget); - - //spin_lock_irqsave(&tp->lock, flags); - for (i = 0; i < tp->num_tx_rings; i++) - rtl8125_tx_interrupt(&tp->tx_ring[i], budget); - //spin_unlock_irqrestore(&tp->lock, flags); - - 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(); - - rtl8125_switch_to_timer_interrupt(tp); - } - - return RTL_NAPI_RETURN_VALUE; -} - -#if 0 -static int rtl8125_poll_msix_ring(napi_ptr napi, napi_budget budget) -{ - struct r8125_napi *r8125napi = RTL_GET_PRIV(napi, struct r8125_napi); - struct rtl8125_private *tp = r8125napi->priv; - RTL_GET_NETDEV(tp) - unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); - unsigned int work_done = 0; - unsigned long flags; - const int message_id = r8125napi->index; - - work_done += rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[message_id], budget); - - //spin_lock_irqsave(&tp->lock, flags); - rtl8125_tx_interrupt_with_vector(tp, message_id, budget); - //spin_unlock_irqrestore(&tp->lock, flags); - - RTL_NAPI_QUOTA_UPDATE(dev, work_done, budget); - - if (work_done < work_to_do) { -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH && message_id == 0) { - 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(); - - rtl8125_enable_hw_interrupt_v2(tp, message_id); - } - - return RTL_NAPI_RETURN_VALUE; -} -#endif - -static int rtl8125_poll_msix_tx(napi_ptr napi, napi_budget budget) -{ - struct r8125_napi *r8125napi = RTL_GET_PRIV(napi, struct r8125_napi); - struct rtl8125_private *tp = r8125napi->priv; - RTL_GET_NETDEV(tp) - unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); - unsigned int work_done = 0; - //unsigned long flags; - const int message_id = r8125napi->index; - - //suppress unused variable - (void)(dev); - - //spin_lock_irqsave(&tp->lock, flags); - rtl8125_tx_interrupt_with_vector(tp, message_id, budget); - //spin_unlock_irqrestore(&tp->lock, flags); - - RTL_NAPI_QUOTA_UPDATE(dev, work_done, budget); - - if (work_done < work_to_do) { -#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(); - - rtl8125_enable_hw_interrupt_v2(tp, message_id); - } - - return RTL_NAPI_RETURN_VALUE; -} - -static int rtl8125_poll_msix_other(napi_ptr napi, napi_budget budget) -{ - struct r8125_napi *r8125napi = RTL_GET_PRIV(napi, struct r8125_napi); - struct rtl8125_private *tp = r8125napi->priv; - RTL_GET_NETDEV(tp) - unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); - const int message_id = r8125napi->index; - - //suppress unused variable - (void)(dev); - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0) - RTL_NETIF_RX_COMPLETE(dev, napi, work_to_do); -#else - RTL_NETIF_RX_COMPLETE(dev, napi, work_to_do); -#endif - - rtl8125_enable_hw_interrupt_v2(tp, message_id); - - return 1; -} - -static int rtl8125_poll_msix_rx(napi_ptr napi, napi_budget budget) -{ - struct r8125_napi *r8125napi = RTL_GET_PRIV(napi, struct r8125_napi); - struct rtl8125_private *tp = r8125napi->priv; - RTL_GET_NETDEV(tp) - unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); - unsigned int work_done = 0; - const int message_id = r8125napi->index; - - work_done += rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[message_id], budget); - - RTL_NAPI_QUOTA_UPDATE(dev, work_done, budget); - - if (work_done < work_to_do) { -#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(); - - rtl8125_enable_hw_interrupt_v2(tp, message_id); - } - - return RTL_NAPI_RETURN_VALUE; -} - -static void rtl8125_enable_napi(struct rtl8125_private *tp) -{ -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) - int i; - - for (i = 0; i < tp->irq_nvecs; i++) - RTL_NAPI_ENABLE(tp->dev, &tp->r8125napi[i].napi); -#endif -} - -static void rtl8125_disable_napi(struct rtl8125_private *tp) -{ -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) - int i; - - for (i = 0; i < tp->irq_nvecs; i++) - RTL_NAPI_DISABLE(tp->dev, &tp->r8125napi[i].napi); -#endif -} - -static void rtl8125_del_napi(struct rtl8125_private *tp) -{ -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) - int i; - - for (i = 0; i < tp->irq_nvecs; i++) - RTL_NAPI_DEL((&tp->r8125napi[i])); -#endif -} -#endif //CONFIG_R8125_NAPI - -static void rtl8125_init_napi(struct rtl8125_private *tp) -{ - int i; - - for (i=0; iirq_nvecs; i++) { - struct r8125_napi *r8125napi = &tp->r8125napi[i]; -#ifdef CONFIG_R8125_NAPI - int (*poll)(struct napi_struct *, int); - - if (tp->features & RTL_FEATURE_MSIX && - tp->HwCurrIsrVer == 2) { - if (i < R8125_MAX_RX_QUEUES_VEC_V3) - poll = rtl8125_poll_msix_rx; - else if (i == 16 || i == 18) - poll = rtl8125_poll_msix_tx; - else - poll = rtl8125_poll_msix_other; - } else { - poll = rtl8125_poll; - } - - RTL_NAPI_CONFIG(tp->dev, r8125napi, poll, R8125_NAPI_WEIGHT); -#endif - - r8125napi->priv = tp; - r8125napi->index = i; - } -} - -static int __devinit -rtl8125_init_one(struct pci_dev *pdev, - const struct pci_device_id *ent) -{ - struct net_device *dev = NULL; - struct rtl8125_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 2.5Gigabit Ethernet driver %s loaded\n", - MODULENAME, RTL8125_VERSION); - - rc = rtl8125_init_board(pdev, &dev, &ioaddr); - if (rc) - goto out; - - tp = netdev_priv(dev); - assert(ioaddr != NULL); - - tp->set_speed = rtl8125_set_speed_xmii; - tp->get_settings = rtl8125_gset_xmii; - tp->phy_reset_enable = rtl8125_xmii_reset_enable; - tp->phy_reset_pending = rtl8125_xmii_reset_pending; - tp->link_ok = rtl8125_xmii_link_ok; - - rc = rtl8125_try_msi(tp); - if (rc < 0) { - dev_err(&pdev->dev, "Can't allocate interrupt\n"); - goto err_out_1; - } - - spin_lock_init(&tp->lock); - - rtl8125_init_software_variable(dev); - - RTL_NET_DEVICE_OPS(rtl8125_netdev_ops); - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) - SET_ETHTOOL_OPS(dev, &rtl8125_ethtool_ops); -#endif - - dev->watchdog_timeo = RTL8125_TX_TIMEOUT; - dev->irq = rtl8125_get_irq(pdev); - dev->base_addr = (unsigned long) ioaddr; - - rtl8125_init_napi(tp); - -#ifdef CONFIG_R8125_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 = rtl8125_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_TSO | - 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_TSO | - NETIF_F_HIGHDMA; -#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) - dev->hw_features |= NETIF_F_IPV6_CSUM | NETIF_F_TSO6; - dev->features |= NETIF_F_IPV6_CSUM; - 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) - -#ifdef ENABLE_RSS_SUPPORT - if (tp->EnableRss) { - dev->hw_features |= NETIF_F_RXHASH; - dev->features |= NETIF_F_RXHASH; - } -#endif - } - -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH) - AllocateDashShareMemory(dev); -#endif - -#ifdef ENABLE_LIB_SUPPORT - ATOMIC_INIT_NOTIFIER_HEAD(&tp->lib_nh); -#endif - - rtl8125_exit_oob(dev); - - rtl8125_hw_init(dev); - - rtl8125_hw_reset(dev); - - /* Get production from EEPROM */ - rtl8125_eeprom_type(tp); - - if (tp->eeprom_type == EEPROM_TYPE_93C46 || tp->eeprom_type == EEPROM_TYPE_93C56) - rtl8125_set_eeprom_sel_low(tp); - - rtl8125_get_mac_address(dev); - - 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; - } - - rtl8125_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); - - rtl8125_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_R8125_NAPI - rtl8125_del_napi(tp); -#endif - rtl8125_disable_msi(pdev, tp); - -err_out_1: - rtl8125_release_board(pdev, dev); - - goto out; -} - -static void __devexit -rtl8125_remove_one(struct pci_dev *pdev) -{ - struct net_device *dev = pci_get_drvdata(pdev); - struct rtl8125_private *tp = netdev_priv(dev); - - assert(dev != NULL); - assert(tp != NULL); - -#ifdef CONFIG_R8125_NAPI - rtl8125_del_napi(tp); -#endif - if (tp->DASH) - rtl8125_driver_stop(tp); - - unregister_netdev(dev); - rtl8125_disable_msi(pdev, tp); -#ifdef ENABLE_R8125_PROCFS - rtl8125_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; - } - - rtl8125_release_board(pdev, dev); - pci_set_drvdata(pdev, NULL); -} - -static void -rtl8125_set_rxbufsize(struct rtl8125_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; -} - -static void rtl8125_free_irq(struct rtl8125_private *tp) -{ - int i; - - for (i=0; iirq_nvecs; i++) { - struct r8125_irq *irq = &tp->irq_tbl[i]; - struct r8125_napi *r8125napi = &tp->r8125napi[i]; - - if (irq->requested) { -#if defined(RTL_USE_NEW_INTR_API) - pci_free_irq(tp->pci_dev, i, r8125napi); -#else - free_irq(irq->vector, r8125napi); -#endif - irq->requested = 0; - } - } -} - -static int rtl8125_alloc_irq(struct rtl8125_private *tp) -{ - struct net_device *dev = tp->dev; - int rc = 0; - struct r8125_irq *irq; - struct r8125_napi *r8125napi; - int i = 0; - const int len = sizeof(tp->irq_tbl[0].name); - -#if defined(RTL_USE_NEW_INTR_API) - for (i=0; iirq_nvecs; i++) { - irq = &tp->irq_tbl[i]; - if (tp->features & RTL_FEATURE_MSIX && - tp->HwCurrIsrVer == 2) - irq->handler = rtl8125_interrupt_msix; - else - irq->handler = rtl8125_interrupt; - - r8125napi = &tp->r8125napi[i]; - snprintf(irq->name, len, "%s-%d", dev->name, i); - rc = pci_request_irq(tp->pci_dev, i, irq->handler, NULL, r8125napi, - irq->name); - if (rc) - break; - - irq->vector = pci_irq_vector(tp->pci_dev, i); - irq->requested = 1; - } -#else - unsigned long irq_flags = 0; -#ifdef ENABLE_LIB_SUPPORT - irq_flags |= IRQF_NO_SUSPEND; -#endif - if (tp->features & RTL_FEATURE_MSIX && - tp->HwCurrIsrVer == 2) { - for (i=0; iirq_nvecs; i++) { - irq = &tp->irq_tbl[i]; - irq->handler = rtl8125_interrupt_msix; - r8125napi = &tp->r8125napi[i]; - snprintf(irq->name, len, "%s-%d", dev->name, i); - rc = request_irq(irq->vector, irq->handler, irq_flags, irq->name, r8125napi); - - if (rc) - break; - - irq->requested = 1; - } - } else { - irq = &tp->irq_tbl[0]; - irq->handler = rtl8125_interrupt; - r8125napi = &tp->r8125napi[0]; - snprintf(irq->name, len, "%s-0", dev->name); - if (!(tp->features & RTL_FEATURE_MSIX)) - irq->vector = dev->irq; - irq_flags |= (tp->features & (RTL_FEATURE_MSI | RTL_FEATURE_MSIX)) ? 0 : SA_SHIRQ; - rc = request_irq(irq->vector, irq->handler, irq_flags, irq->name, r8125napi); - - if (rc == 0) - irq->requested = 1; - } -#endif - if (rc) - rtl8125_free_irq(tp); - - return rc; -} - -static int rtl8125_alloc_tx_desc(struct rtl8125_private *tp) -{ - struct rtl8125_tx_ring *ring; - struct pci_dev *pdev = tp->pci_dev; - int i; - - for (i = 0; i < tp->num_tx_rings; i++) { - ring = &tp->tx_ring[i]; - ring->TxDescArray = dma_alloc_coherent(&pdev->dev, R8125_TX_RING_BYTES, - &ring->TxPhyAddr, GFP_KERNEL); - - if (!ring->TxDescArray) - return -1; - } - - return 0; -} - -static int rtl8125_alloc_rx_desc(struct rtl8125_private *tp) -{ - struct rtl8125_rx_ring *ring; - struct pci_dev *pdev = tp->pci_dev; - int i; - - for (i = 0; i < tp->num_rx_rings; i++) { - ring = &tp->rx_ring[i]; - ring->RxDescArray = dma_alloc_coherent(&pdev->dev, tp->RxDescRingLength, - &ring->RxPhyAddr, GFP_KERNEL); - - if (!ring->RxDescArray) - return -1; - } - - return 0; -} - -static void rtl8125_free_tx_desc(struct rtl8125_private *tp) -{ - struct rtl8125_tx_ring *ring; - struct pci_dev *pdev = tp->pci_dev; - int i; - - for (i = 0; i < tp->num_tx_rings; i++) { - ring = &tp->tx_ring[i]; - if (ring->TxDescArray) { - dma_free_coherent(&pdev->dev, R8125_TX_RING_BYTES, ring->TxDescArray, - ring->TxPhyAddr); - ring->TxDescArray = NULL; - } - } -} - -static void rtl8125_free_rx_desc(struct rtl8125_private *tp) -{ - struct rtl8125_rx_ring *ring; - struct pci_dev *pdev = tp->pci_dev; - int i; - - for (i = 0; i < tp->num_rx_rings; i++) { - ring = &tp->rx_ring[i]; - if (ring->RxDescArray) { - dma_free_coherent(&pdev->dev, tp->RxDescRingLength, ring->RxDescArray, - ring->RxPhyAddr); - ring->RxDescArray = NULL; - } - } -} - -static void rtl8125_free_alloc_resources(struct rtl8125_private *tp) -{ - rtl8125_free_rx_desc(tp); - - rtl8125_free_tx_desc(tp); -} - -int rtl8125_set_real_num_queue(struct rtl8125_private *tp) -{ - int retval = 0; - - retval = netif_set_real_num_tx_queues(tp->dev, tp->num_tx_rings); - if (retval < 0) - goto exit; - - retval = netif_set_real_num_rx_queues(tp->dev, tp->num_rx_rings); - if (retval < 0) - goto exit; - -exit: - return retval; -} - -static int rtl8125_open(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long flags; - int retval; - - retval = -ENOMEM; - -#ifdef ENABLE_R8125_PROCFS - rtl8125_proc_init(dev); -#endif - rtl8125_set_rxbufsize(tp, dev); - /* - * Rx and Tx descriptors needs 256 bytes alignment. - * pci_alloc_consistent provides more. - */ - if (rtl8125_alloc_tx_desc(tp) < 0 || rtl8125_alloc_rx_desc(tp) < 0) - goto err_free_all_allocated_mem; - - retval = rtl8125_init_ring(dev); - if (retval < 0) - goto err_free_all_allocated_mem; - - retval = rtl8125_set_real_num_queue(tp); - if (retval < 0) - goto err_free_all_allocated_mem; - - retval = rtl8125_alloc_irq(tp); - 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); - } - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) - INIT_WORK(&tp->task, NULL, dev); -#else - INIT_DELAYED_WORK(&tp->task, NULL); -#endif - -#ifdef CONFIG_R8125_NAPI - rtl8125_enable_napi(tp); -#endif - - spin_lock_irqsave(&tp->lock, flags); - - rtl8125_exit_oob(dev); - - rtl8125_hw_init(dev); - - rtl8125_hw_reset(dev); - - rtl8125_powerup_pll(dev); - - rtl8125_hw_ephy_config(dev); - - rtl8125_hw_phy_config(dev); - - rtl8125_hw_config(dev); - -#ifdef ENABLE_PTP_SUPPORT - if (tp->EnablePtp) - rtl8125_ptp_init(tp); -#endif - - rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); - - if (tp->resume_not_chg_speed) { - rtl8125_check_link_status(dev, 1); - tp->resume_not_chg_speed = 0; - } - - spin_unlock_irqrestore(&tp->lock, flags); - - if (tp->esd_flag == 0) - rtl8125_request_esd_timer(dev); - - //rtl8125_request_link_timer(dev); - - rtl8125_enable_hw_linkchg_interrupt(tp); - -out: - - return retval; - -err_free_all_allocated_mem: - rtl8125_free_alloc_resources(tp); - - goto out; -} - -static void -set_offset70F(struct rtl8125_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 = rtl8125_csi_read(tp, 0x70c) & 0x00ffffff; - rtl8125_csi_write(tp, 0x70c, csi_tmp | temp); -} - -static void -set_offset79(struct rtl8125_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); -} - -void -rtl8125_hw_set_rx_packet_filter(struct net_device *dev) -{ - struct rtl8125_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); - - tmp = tp->rtl8125_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 -rtl8125_set_rx_mode(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long flags; - - spin_lock_irqsave(&tp->lock, flags); - - rtl8125_hw_set_rx_packet_filter(dev); - - spin_unlock_irqrestore(&tp->lock, flags); -} - -void -rtl8125_set_rx_q_num(struct rtl8125_private *tp, - unsigned int num_rx_queues) -{ - u16 q_ctrl; - u16 rx_q_num; - - rx_q_num = (u16)ilog2(num_rx_queues); - rx_q_num &= (BIT_0 | BIT_1 | BIT_2); - rx_q_num <<= 2; - q_ctrl = RTL_R16(tp, Q_NUM_CTRL_8125); - q_ctrl &= ~(BIT_2 | BIT_3 | BIT_4); - q_ctrl |= rx_q_num; - RTL_W16(tp, Q_NUM_CTRL_8125, q_ctrl); -} - -void -rtl8125_set_tx_q_num(struct rtl8125_private *tp, - unsigned int num_tx_queues) -{ - u16 mac_ocp_data; - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE63E); - mac_ocp_data &= ~(BIT_11 | BIT_10); - mac_ocp_data |= ((ilog2(num_tx_queues) & 0x03) << 10); - rtl8125_mac_ocp_write(tp, 0xE63E, mac_ocp_data); -} - -void -rtl8125_hw_config(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - struct pci_dev *pdev = tp->pci_dev; - u16 mac_ocp_data; - int i; - - RTL_W32(tp, RxConfig, (RX_DMA_BURST << RxCfgDMAShift)); - - rtl8125_hw_reset(dev); - - rtl8125_enable_cfg9346_write(tp); - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) & ~BIT_7); - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~BIT_7); - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_0); - break; - } - - //clear io_rdy_l23 - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~BIT_1); - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - //IntMITI_0-IntMITI_31 - for (i=0xA00; i<0xB00; i+=4) - RTL_W32(tp, i, 0x00000000); - break; - } - - //keep magic packet only - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xC0B6); - mac_ocp_data &= BIT_0; - rtl8125_mac_ocp_write(tp, 0xC0B6, mac_ocp_data); - break; - } - - rtl8125_tally_counter_addr_fill(tp); - - rtl8125_desc_addr_fill(tp); - - /* Set DMA burst size and Interframe Gap Time */ - RTL_W32(tp, TxConfig, (TX_DMA_BURST_unlimited << TxDMAShift) | - (InterFrameGap << TxInterFrameGapShift)); - - if (tp->EnableTxNoClose) - RTL_W32(tp, TxConfig, (RTL_R32(tp, TxConfig) | BIT_6)); - - if (tp->mcfg == CFG_METHOD_2 || - tp->mcfg == CFG_METHOD_3 || - tp->mcfg == CFG_METHOD_4 || - tp->mcfg == CFG_METHOD_5) { - set_offset70F(tp, 0x27); - set_offset79(tp, 0x50); - - RTL_W16(tp, 0x382, 0x221B); - -#ifdef ENABLE_RSS_SUPPORT - rtl8125_config_rss(tp); -#else - RTL_W32(tp, RSS_CTRL_8125, 0x00); -#endif - rtl8125_set_rx_q_num(tp, rtl8125_tot_rx_rings(tp)); - - RTL_W8(tp, Config1, RTL_R8(tp, Config1) & ~0x10); - - rtl8125_mac_ocp_write(tp, 0xC140, 0xFFFF); - rtl8125_mac_ocp_write(tp, 0xC142, 0xFFFF); - - //new tx desc format - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xEB58); - mac_ocp_data |= (BIT_0); - rtl8125_mac_ocp_write(tp, 0xEB58, mac_ocp_data); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE614); - mac_ocp_data &= ~( BIT_10 | BIT_9 | BIT_8); - if (tp->mcfg == CFG_METHOD_4 || tp->mcfg == CFG_METHOD_5) { - mac_ocp_data |= ((2 & 0x07) << 8); - } else { - if (tp->DASH && !(rtl8125_csi_fun0_read_byte(tp, 0x79) & BIT_0)) - mac_ocp_data |= ((3 & 0x07) << 8); - else - mac_ocp_data |= ((4 & 0x07) << 8); - } - rtl8125_mac_ocp_write(tp, 0xE614, mac_ocp_data); - - rtl8125_set_tx_q_num(tp, rtl8125_tot_tx_rings(tp)); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE63E); - mac_ocp_data &= ~(BIT_5 | BIT_4); - if (tp->mcfg == CFG_METHOD_2 || tp->mcfg == CFG_METHOD_3) - mac_ocp_data |= ((0x02 & 0x03) << 4); - rtl8125_mac_ocp_write(tp, 0xE63E, mac_ocp_data); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xC0B4); - mac_ocp_data &= ~BIT_0; - rtl8125_mac_ocp_write(tp, 0xC0B4, mac_ocp_data); - mac_ocp_data |= BIT_0; - rtl8125_mac_ocp_write(tp, 0xC0B4, mac_ocp_data); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xC0B4); - mac_ocp_data |= (BIT_3|BIT_2); - rtl8125_mac_ocp_write(tp, 0xC0B4, mac_ocp_data); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xEB6A); - mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0); - mac_ocp_data |= (BIT_5 | BIT_4 | BIT_1 | BIT_0); - rtl8125_mac_ocp_write(tp, 0xEB6A, mac_ocp_data); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xEB50); - mac_ocp_data &= ~(BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5); - mac_ocp_data |= (BIT_6); - rtl8125_mac_ocp_write(tp, 0xEB50, mac_ocp_data); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE056); - mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4); - mac_ocp_data |= (BIT_4 | BIT_5); - rtl8125_mac_ocp_write(tp, 0xE056, mac_ocp_data); - - RTL_W8(tp, TDFNR, 0x10); - - RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_7); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE040); - mac_ocp_data &= ~(BIT_12); - rtl8125_mac_ocp_write(tp, 0xE040, mac_ocp_data); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xEA1C); - mac_ocp_data &= ~(BIT_1 | BIT_0); - mac_ocp_data |= (BIT_0); - rtl8125_mac_ocp_write(tp, 0xEA1C, mac_ocp_data); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE0C0); - mac_ocp_data &= ~(BIT_14 | BIT_11 | BIT_10 | BIT_9 | BIT_8 | BIT_3 | BIT_2 | BIT_1 | BIT_0); - mac_ocp_data |= (BIT_14 | BIT_10 | BIT_1 | BIT_0); - rtl8125_mac_ocp_write(tp, 0xE0C0, mac_ocp_data); - - SetMcuAccessRegBit(tp, 0xE052, (BIT_6|BIT_5|BIT_3)); - ClearMcuAccessRegBit(tp, 0xE052, BIT_7); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xD430); - 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 |= 0x47F; - rtl8125_mac_ocp_write(tp, 0xD430, mac_ocp_data); - - //rtl8125_mac_ocp_write(tp, 0xE0C0, 0x4F87); - if (!tp->DASH) - RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_6 | BIT_7); - else - RTL_W8(tp, 0xD0, (RTL_R8(tp, 0xD0) & ~BIT_6) | BIT_7); - - if (tp->mcfg == CFG_METHOD_2 || tp->mcfg == CFG_METHOD_3) - RTL_W8(tp, 0xD3, RTL_R8(tp, 0xD3) | BIT_0); - - rtl8125_disable_eee_plus(tp); - - mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xEA1C); - mac_ocp_data &= ~(BIT_2); - rtl8125_mac_ocp_write(tp, 0xEA1C, mac_ocp_data); - - SetMcuAccessRegBit(tp, 0xEB54, BIT_0); - udelay(1); - ClearMcuAccessRegBit(tp, 0xEB54, BIT_0); - RTL_W16(tp, 0x1880, RTL_R16(tp, 0x1880) & ~(BIT_4 | BIT_5)); - } - - /* csum offload command for RTL8125 */ - 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; - - /* config interrupt type for RTL8125B */ - if (tp->HwSuppIsrVer == 2) - rtl8125_hw_set_interrupt_type(tp, tp->HwCurrIsrVer); - - //other hw parameters - rtl8125_hw_clear_timer_int(dev); - - rtl8125_hw_clear_int_miti(dev); - - if (tp->use_timer_interrrupt && - (tp->HwCurrIsrVer == 2) && - (tp->HwSuppIntMitiVer == 4) && - (tp->features & RTL_FEATURE_MSIX)) { - int i; - for (i = 0; i < tp->irq_nvecs; i++) - rtl8125_hw_set_timer_int_8125(tp, i, timer_count_v2); - } - - rtl8125_enable_exit_l1_mask(tp); - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - rtl8125_mac_ocp_write(tp, 0xE098, 0xC302); - break; - } - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - if (aspm) { - rtl8125_init_pci_offset_99(tp); - } - break; - } - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - if (aspm) { - rtl8125_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 - rtl8125_hw_set_features(dev, dev->features); -#endif - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: { - int timeout; - for (timeout = 0; timeout < 10; timeout++) { - if ((rtl8125_mac_ocp_read(tp, 0xE00E) & BIT_13)==0) - break; - mdelay(1); - } - } - break; - } - - RTL_W16(tp, RxMaxSize, tp->rx_buf_sz); - - rtl8125_disable_rxdvgate(dev); - - 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 = rtl8125_csi_read(tp, tp->HwPcieSNOffset); - tp->pci_cfg_space.pci_sn_h = rtl8125_csi_read(tp, tp->HwPcieSNOffset + 4); - } - - tp->pci_cfg_is_read = 1; - } - - /* Set Rx packet filter */ - rtl8125_hw_set_rx_packet_filter(dev); - -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH && !tp->dash_printer_enabled) - NICChkTypeEnableDashInterrupt(tp); -#endif - - switch (tp->mcfg) { - case CFG_METHOD_2: - case CFG_METHOD_3: - case CFG_METHOD_4: - case CFG_METHOD_5: - if (aspm) { - RTL_W8(tp, Config5, RTL_R8(tp, Config5) | BIT_0); - RTL_W8(tp, Config2, RTL_R8(tp, Config2) | BIT_7); - } else { - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~BIT_7); - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_0); - } - break; - } - - rtl8125_disable_cfg9346_write(tp); - - udelay(10); -} - -void -rtl8125_hw_start(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb); - - rtl8125_enable_hw_interrupt(tp); - - rtl8125_lib_reset_complete(tp); -} - -static int -rtl8125_change_mtu(struct net_device *dev, - int new_mtu) -{ - struct rtl8125_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; - - rtl8125_down(dev); - - spin_lock_irqsave(&tp->lock, flags); - - rtl8125_set_rxbufsize(tp, dev); - - ret = rtl8125_init_ring(dev); - - if (ret < 0) { - spin_unlock_irqrestore(&tp->lock, flags); - goto err_out; - } - -#ifdef CONFIG_R8125_NAPI - rtl8125_enable_napi(tp); -#endif//CONFIG_R8125_NAPI - - rtl8125_stop_all_tx_queue(dev); - netif_carrier_off(dev); - rtl8125_hw_config(dev); - - rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); - - spin_unlock_irqrestore(&tp->lock, flags); - - mod_timer(&tp->esd_timer, jiffies + RTL8125_ESD_TIMEOUT); - //mod_timer(&tp->link_timer, jiffies + RTL8125_LINK_TIMEOUT); -out: -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0) - netdev_update_features(dev); -#endif - -err_out: - return ret; -} - -static void -rtl8125_free_rx_skb(struct rtl8125_private *tp, - struct rtl8125_rx_ring *ring, - struct sk_buff **sk_buff, - struct RxDesc *desc, - const u32 cur_rx) -{ - struct pci_dev *pdev = tp->pci_dev; - - dma_unmap_single(&pdev->dev, ring->RxDescPhyAddr[cur_rx], tp->rx_buf_sz, - DMA_FROM_DEVICE); - dev_kfree_skb(*sk_buff); - *sk_buff = NULL; - rtl8125_make_unusable_by_asic(tp, desc); -} - -static inline void -rtl8125_mark_to_asic_v3(struct RxDescV3 *descv3, - u32 rx_buf_sz) -{ - u32 eor = le32_to_cpu(descv3->RxDescNormalDDWord4.opts1) & RingEnd; - - WRITE_ONCE(descv3->RxDescNormalDDWord4.opts1, cpu_to_le32(DescOwn | eor | rx_buf_sz)); -} - -void -rtl8125_mark_to_asic(struct rtl8125_private *tp, - struct RxDesc *desc, - u32 rx_buf_sz) -{ - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) - rtl8125_mark_to_asic_v3((struct RxDescV3 *)desc, rx_buf_sz); - else { - u32 eor = le32_to_cpu(desc->opts1) & RingEnd; - - WRITE_ONCE(desc->opts1, cpu_to_le32(DescOwn | eor | rx_buf_sz)); - } -} - -static inline void -rtl8125_map_to_asic(struct rtl8125_private *tp, - struct rtl8125_rx_ring *ring, - struct RxDesc *desc, - dma_addr_t mapping, - u32 rx_buf_sz, - const u32 cur_rx) -{ - ring->RxDescPhyAddr[cur_rx] = mapping; - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) - ((struct RxDescV3 *)desc)->addr = cpu_to_le64(mapping); - else - desc->addr = cpu_to_le64(mapping); - wmb(); - rtl8125_mark_to_asic(tp, desc, rx_buf_sz); -} - -static int -rtl8125_alloc_rx_skb(struct rtl8125_private *tp, - struct rtl8125_rx_ring *ring, - struct sk_buff **sk_buff, - struct RxDesc *desc, - int rx_buf_sz, - const u32 cur_rx, - u8 in_intr) -{ - struct sk_buff *skb; - dma_addr_t mapping; - int ret = 0; - - if (in_intr) - skb = RTL_ALLOC_SKB_INTR(&tp->r8125napi[ring->index].napi, 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->pci_dev->dev, skb->data, rx_buf_sz, - DMA_FROM_DEVICE); - if (unlikely(dma_mapping_error(&tp->pci_dev->dev, mapping))) { - if (unlikely(net_ratelimit())) - netif_err(tp, drv, tp->dev, "Failed to map RX DMA!\n"); - goto err_out; - } - - *sk_buff = skb; - rtl8125_map_to_asic(tp, ring, desc, mapping, rx_buf_sz, cur_rx); -out: - return ret; - -err_out: - if (skb) - dev_kfree_skb(skb); - ret = -ENOMEM; - rtl8125_make_unusable_by_asic(tp, desc); - goto out; -} - -static void -_rtl8125_rx_clear(struct rtl8125_private *tp, struct rtl8125_rx_ring *ring) -{ - int i; - - for (i = 0; i < NUM_RX_DESC; i++) { - if (ring->Rx_skbuff[i]) { - rtl8125_free_rx_skb(tp, - ring, - ring->Rx_skbuff + i, - rtl8125_get_rxdesc(tp, ring->RxDescArray, i), - i); - ring->Rx_skbuff[i] = NULL; - } - } -} - -void -rtl8125_rx_clear(struct rtl8125_private *tp) -{ - int i; - - for (i = 0; i < tp->num_rx_rings; i++) - _rtl8125_rx_clear(tp, &tp->rx_ring[i]); -} - -static u32 -rtl8125_rx_fill(struct rtl8125_private *tp, - struct rtl8125_rx_ring *ring, - struct net_device *dev, - u32 start, - u32 end, - u8 in_intr) -{ - u32 cur; - - for (cur = start; end - cur > 0; cur++) { - int ret, i = cur % NUM_RX_DESC; - - if (ring->Rx_skbuff[i]) - continue; - - ret = rtl8125_alloc_rx_skb(tp, - ring, - ring->Rx_skbuff + i, - rtl8125_get_rxdesc(tp, ring->RxDescArray, i), - tp->rx_buf_sz, - i, - in_intr - ); - if (ret < 0) - break; - } - return cur - start; -} - -static inline void -rtl8125_mark_as_last_descriptor_8125(struct RxDescV3 *descv3) -{ - descv3->RxDescNormalDDWord4.opts1 |= cpu_to_le32(RingEnd); -} - -static inline void -rtl8125_mark_as_last_descriptor(struct rtl8125_private *tp, - struct RxDesc *desc) -{ - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) - rtl8125_mark_as_last_descriptor_8125((struct RxDescV3 *)desc); - else - desc->opts1 |= cpu_to_le32(RingEnd); -} - -static void -rtl8125_desc_addr_fill(struct rtl8125_private *tp) -{ - int i; - - for (i = 0; i < tp->num_tx_rings; i++) { - struct rtl8125_tx_ring *ring = &tp->tx_ring[i]; - RTL_W32(tp, ring->tdsar_reg, ((u64)ring->TxPhyAddr & DMA_BIT_MASK(32))); - RTL_W32(tp, ring->tdsar_reg + 4, ((u64)ring->TxPhyAddr >> 32)); - } - - for (i = 0; i < tp->num_rx_rings; i++) { - struct rtl8125_rx_ring *ring = &tp->rx_ring[i]; - RTL_W32(tp, ring->rdsar_reg, ((u64)ring->RxPhyAddr & DMA_BIT_MASK(32))); - RTL_W32(tp, ring->rdsar_reg + 4, ((u64)ring->RxPhyAddr >> 32)); - } -} - -static void -rtl8125_tx_desc_init(struct rtl8125_private *tp) -{ - int i = 0; - - for (i = 0; i < tp->num_tx_rings; i++) { - struct rtl8125_tx_ring *ring = &tp->tx_ring[i]; - memset(ring->TxDescArray, 0x0, R8125_TX_RING_BYTES); - - ring->TxDescArray[NUM_TX_DESC - 1].opts1 = cpu_to_le32(RingEnd); - } -} - -static void -rtl8125_rx_desc_init(struct rtl8125_private *tp) -{ - int i; - - for (i = 0; i < tp->num_rx_rings; i++) { - struct rtl8125_rx_ring *ring = &tp->rx_ring[i]; - memset(ring->RxDescArray, 0x0, tp->RxDescRingLength); - } -} - -int -rtl8125_init_ring(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int i; - - rtl8125_init_ring_indexes(tp); - - rtl8125_tx_desc_init(tp); - rtl8125_rx_desc_init(tp); - - for (i = 0; i < tp->num_tx_rings; i++) { - struct rtl8125_tx_ring *ring = &tp->tx_ring[i]; - memset(ring->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info)); - } - - for (i = 0; i < tp->num_rx_rings; i++) { - struct rtl8125_rx_ring *ring = &tp->rx_ring[i]; - - memset(ring->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *)); - if (rtl8125_rx_fill(tp, ring, dev, 0, NUM_RX_DESC, 0) != NUM_RX_DESC) - goto err_out; - - rtl8125_mark_as_last_descriptor(tp, rtl8125_get_rxdesc(tp, ring->RxDescArray, NUM_RX_DESC - 1)); - } - - return 0; - -err_out: - rtl8125_rx_clear(tp); - return -ENOMEM; -} - -static void -rtl8125_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 = RTL8125_MAGIC_NUMBER; - tx_skb->len = 0; -} - -static void -rtl8125_tx_clear_range(struct rtl8125_private *tp, - struct rtl8125_tx_ring *ring, - 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) % NUM_TX_DESC; - struct ring_info *tx_skb = ring->tx_skb + entry; - unsigned int len = tx_skb->len; - - if (len) { - struct sk_buff *skb = tx_skb->skb; - - rtl8125_unmap_tx_skb(tp->pci_dev, tx_skb, - ring->TxDescArray + entry); - if (skb) { - RTLDEV->stats.tx_dropped++; - dev_kfree_skb_any(skb); - tx_skb->skb = NULL; - } - } - } -} - -void -rtl8125_tx_clear(struct rtl8125_private *tp) -{ - int i; - - for (i = 0; i < tp->num_tx_rings; i++) { - struct rtl8125_tx_ring *ring = &tp->tx_ring[i]; - rtl8125_tx_clear_range(tp, ring, ring->dirty_tx, NUM_TX_DESC); - ring->cur_tx = ring->dirty_tx = 0; - } -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) -static void rtl8125_schedule_work(struct net_device *dev, void (*task)(void *)) -{ -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) - struct rtl8125_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 rtl8125_cancel_schedule_work(a) - -#else -static void rtl8125_schedule_work(struct net_device *dev, work_func_t task) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - INIT_DELAYED_WORK(&tp->task, task); - schedule_delayed_work(&tp->task, 4); -} - -static void rtl8125_cancel_schedule_work(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - struct work_struct *work = &tp->task.work; - - if (!work->func) return; - - cancel_delayed_work_sync(&tp->task); -} -#endif - -static void -rtl8125_wait_for_irq_complete(struct rtl8125_private *tp) -{ - if (tp->features & RTL_FEATURE_MSIX) { - int i; - for (i = 0; i < tp->irq_nvecs; i++) - synchronize_irq(tp->irq_tbl[i].vector); - } else { - synchronize_irq(tp->dev->irq); - } -} - -static void -_rtl8125_wait_for_quiescence(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long flags; - - /* Wait for any pending NAPI task to complete */ -#ifdef CONFIG_R8125_NAPI - rtl8125_disable_napi(tp); -#endif//CONFIG_R8125_NAPI - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,67) - /* Give a racing hard_start_xmit a few cycles to complete. */ - synchronize_net(); -#endif - spin_lock_irqsave(&tp->lock, flags); - - rtl8125_irq_mask_and_ack(tp); - - spin_unlock_irqrestore(&tp->lock, flags); - - rtl8125_wait_for_irq_complete(tp); -} - -static void -rtl8125_wait_for_quiescence(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - //suppress unused variable - (void)(tp); - - _rtl8125_wait_for_quiescence(dev); - -#ifdef CONFIG_R8125_NAPI - rtl8125_enable_napi(tp); -#endif//CONFIG_R8125_NAPI -} - -#if 0 -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) -static void rtl8125_reinit_task(void *_data) -#else -static void rtl8125_reinit_task(struct work_struct *work) -#endif -{ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) - struct net_device *dev = _data; -#else - struct rtl8125_private *tp = - container_of(work, struct rtl8125_private, task.work); - struct net_device *dev = tp->dev; -#endif - int ret; - - if (netif_running(dev)) { - rtl8125_wait_for_quiescence(dev); - rtl8125_close(dev); - } - - ret = rtl8125_open(dev); - if (unlikely(ret < 0)) { - if (unlikely(net_ratelimit())) { - struct rtl8125_private *tp = netdev_priv(dev); - - if (netif_msg_drv(tp)) { - printk(PFX KERN_ERR - "%s: reinit failure (status = %d)." - " Rescheduling.\n", dev->name, ret); - } - } - rtl8125_schedule_work(dev, rtl8125_reinit_task); - } -} -#endif - -static int rtl8125_rx_nostuck(struct rtl8125_private *tp) -{ - int i, ret = 1; - for (i = 0; i < tp->num_rx_rings; i++) - ret &= (tp->rx_ring[i].dirty_rx == tp->rx_ring[i].cur_rx); - return ret; -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) -static void rtl8125_reset_task(void *_data) -{ - struct net_device *dev = _data; - struct rtl8125_private *tp = netdev_priv(dev); -#else -static void rtl8125_reset_task(struct work_struct *work) -{ - struct rtl8125_private *tp = - container_of(work, struct rtl8125_private, task.work); - struct net_device *dev = tp->dev; -#endif - u32 budget = ~(u32)0; - unsigned long flags; - int i; - - if (!netif_running(dev)) - return; - - rtl8125_wait_for_quiescence(dev); - - for (i = 0; i < tp->num_rx_rings; i++) { -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) - rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[i], &budget); -#else - rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[i], budget); -#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) - } - - spin_lock_irqsave(&tp->lock, flags); - - rtl8125_tx_clear(tp); - - if (rtl8125_rx_nostuck(tp)) { - rtl8125_rx_clear(tp); - rtl8125_init_ring(dev); -#ifdef ENABLE_PTP_SUPPORT - rtl8125_ptp_reset(tp); -#endif - rtl8125_enable_hw_linkchg_interrupt(tp); - - rtl8125_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 rtl8125_private *tp = netdev_priv(dev); - - if (netif_msg_intr(tp)) { - printk(PFX KERN_EMERG - "%s: Rx buffers shortage\n", dev->name); - } - } - rtl8125_schedule_work(dev, rtl8125_reset_task); - } -} -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) -static void -rtl8125_tx_timeout(struct net_device *dev, unsigned int txqueue) -#else -static void -rtl8125_tx_timeout(struct net_device *dev) -#endif -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long flags; - - spin_lock_irqsave(&tp->lock, flags); - rtl8125_stop_all_tx_queue(dev); - netif_carrier_off(dev); - rtl8125_hw_reset(dev); - spin_unlock_irqrestore(&tp->lock, flags); - - /* Let's wait a bit while any (async) irq lands on */ - rtl8125_schedule_work(dev, rtl8125_reset_task); -} - -static u32 -rtl8125_get_txd_opts1(u32 opts1, u32 len, unsigned int entry) -{ - u32 status = opts1 | len; - - if (entry == NUM_TX_DESC - 1) - status |= RingEnd; - - return status; -} - -static int -rtl8125_xmit_frags(struct rtl8125_private *tp, - struct rtl8125_tx_ring *ring, - 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; - unsigned long PktLenCnt = 0; - bool LsoPatchEnabled = FALSE; - - entry = ring->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) % NUM_TX_DESC; - - txd = ring->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 - if (tp->RequireLSOPatch && - (cur_frag == nr_frags - 1) && - (opts[0] & (GiantSendv4|GiantSendv6)) && - PktLenCnt < ETH_FRAME_LEN && - len > 1) { - len -= 1; - mapping = dma_map_single(&tp->pci_dev->dev, addr, len, DMA_TO_DEVICE); - - if (unlikely(dma_mapping_error(&tp->pci_dev->dev, 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 = rtl8125_get_txd_opts1(opts[0], len, entry); - - txd->addr = cpu_to_le64(mapping); - - ring->tx_skb[entry].len = len; - - txd->opts2 = cpu_to_le32(opts[1]); - wmb(); - txd->opts1 = cpu_to_le32(status); - - //second txd - addr += len; - len = 1; - entry = (entry + 1) % NUM_TX_DESC; - txd = ring->TxDescArray + entry; - cur_frag += 1; - - LsoPatchEnabled = TRUE; - } - - mapping = dma_map_single(&tp->pci_dev->dev, addr, len, DMA_TO_DEVICE); - - if (unlikely(dma_mapping_error(&tp->pci_dev->dev, 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 = rtl8125_get_txd_opts1(opts[0], len, entry); - if (cur_frag == (nr_frags - 1) || LsoPatchEnabled == TRUE) { - //ring->tx_skb[entry].skb = skb; - status |= LastFrag; - } - - txd->addr = cpu_to_le64(mapping); - - ring->tx_skb[entry].len = len; - - txd->opts2 = cpu_to_le32(opts[1]); - wmb(); - txd->opts1 = cpu_to_le32(status); - - PktLenCnt += len; - } - - return cur_frag; - -err_out: - rtl8125_tx_clear_range(tp, ring, ring->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 inline -u8 rtl8125_get_l4_protocol(struct sk_buff *skb) -{ - u8 ip_protocol = IPPROTO_RAW; - - switch (get_protocol(skb)) { - case __constant_htons(ETH_P_IP): - ip_protocol = ip_hdr(skb)->protocol; - break; - case __constant_htons(ETH_P_IPV6): - ip_protocol = ipv6_hdr(skb)->nexthdr; - break; - } - - return ip_protocol; -} - -static bool rtl8125_skb_pad_with_len(struct sk_buff *skb, unsigned int len) -{ - if (skb_padto(skb, len)) - return false; - skb_put(skb, len - skb->len); - return true; -} - -static bool rtl8125_skb_pad(struct sk_buff *skb) -{ -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) - return rtl8125_skb_pad_with_len(skb, ETH_ZLEN); -#else - return !eth_skb_pad(skb); -#endif -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) -/* 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 - -#define MIN_PATCH_LEN (47) -static u32 -rtl8125_get_patch_pad_len(struct sk_buff *skb) -{ - u32 pad_len = 0; - int trans_data_len; - u32 hdr_len; - u32 pkt_len = skb->len; - u8 ip_protocol; - bool has_trans = skb_transport_header_was_set(skb); - - if (!(has_trans && (pkt_len < 175))) //128 + MIN_PATCH_LEN - goto no_padding; - - ip_protocol = rtl8125_get_l4_protocol(skb); - if (!(ip_protocol == IPPROTO_TCP || ip_protocol == IPPROTO_UDP)) - goto no_padding; - - trans_data_len = pkt_len - - (skb->transport_header - - skb_headroom(skb)); - if (ip_protocol == IPPROTO_UDP) { - if (trans_data_len > 3 && trans_data_len < MIN_PATCH_LEN) { - u16 dest_port = 0; - - skb_copy_bits(skb, skb->transport_header - skb_headroom(skb) + 2, &dest_port, 2); - dest_port = ntohs(dest_port); - - if (dest_port == 0x13f || - dest_port == 0x140) { - pad_len = MIN_PATCH_LEN - trans_data_len; - goto out; - } - } - } - - hdr_len = 0; - if (ip_protocol == IPPROTO_TCP) - hdr_len = 20; - else if (ip_protocol == IPPROTO_UDP) - hdr_len = 8; - if (trans_data_len < hdr_len) - pad_len = hdr_len - trans_data_len; - -out: - if ((pkt_len + pad_len) < ETH_ZLEN) - pad_len = ETH_ZLEN - pkt_len; - - return pad_len; - -no_padding: - - return 0; -} - -static bool -rtl8125_tso_csum(struct sk_buff *skb, - struct net_device *dev, - u32 *opts) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long large_send = 0; - u32 csum_cmd = 0; - u8 sw_calc_csum = false; - u8 check_patch_required = true; - -#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) { - u32 transport_offset = (u32)skb_transport_offset(skb); - assert((transport_offset%2) == 0); - 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)) - return false; -#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) - return false; - - return true; - } - } -#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) - - 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 (ip_protocol == IPPROTO_TCP) - check_patch_required = false; - } - - if (check_patch_required) { - u32 pad_len = rtl8125_get_patch_pad_len(skb); - - if (pad_len > 0) { - if (!rtl8125_skb_pad_with_len(skb, skb->len + pad_len)) - return false; - - if (csum_cmd != 0) - sw_calc_csum = true; - } - } - - if (skb->len < ETH_ZLEN) { - if (tp->UseSwPaddingShortPkt || - (tp->ShortPacketSwChecksum && csum_cmd != 0)) { - if (!rtl8125_skb_pad(skb)) - return false; - - if (csum_cmd != 0) - sw_calc_csum = true; - } - } - - 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 - } else - opts[1] |= csum_cmd; - - return true; -} - -static bool rtl8125_tx_slots_avail(struct rtl8125_private *tp, - struct rtl8125_tx_ring *ring) -{ - unsigned int slots_avail = READ_ONCE(ring->dirty_tx) + NUM_TX_DESC - - READ_ONCE(ring->cur_tx); - - /* A skbuff with nr_frags needs nr_frags+1 entries in the tx queue */ - return slots_avail > MAX_SKB_FRAGS; -} - -static int -rtl8125_start_xmit(struct sk_buff *skb, - struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned int entry; - struct TxDesc *txd; - dma_addr_t mapping; - u32 len; - u32 opts[2]; - int ret = NETDEV_TX_OK; - //unsigned long flags; - int frags; - u8 EnableTxNoClose = tp->EnableTxNoClose; - const u16 queue_mapping = skb_get_queue_mapping(skb); - struct rtl8125_tx_ring *ring; - bool stop_queue; - - assert(queue_mapping < tp->num_tx_queues); - - ring = &tp->tx_ring[queue_mapping]; - - //spin_lock_irqsave(&tp->lock, flags); - - if (unlikely(!rtl8125_tx_slots_avail(tp, ring))) { - if (netif_msg_drv(tp)) { - printk(KERN_ERR - "%s: BUG! Tx Ring[%d] full when queue awake!\n", - dev->name, - queue_mapping); - } - goto err_stop; - } - - entry = ring->cur_tx % NUM_TX_DESC; - txd = ring->TxDescArray + entry; - - if (!EnableTxNoClose) { - 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] = rtl8125_tx_vlan_tag(tp, skb); - - if (unlikely(!rtl8125_tso_csum(skb, dev, opts))) - goto err_dma_0; - - frags = rtl8125_xmit_frags(tp, ring, skb, opts); - if (unlikely(frags < 0)) - goto err_dma_0; - if (frags) { - len = skb_headlen(skb); - opts[0] |= FirstFrag; - } else { - len = skb->len; - - //ring->tx_skb[entry].skb = skb; - - opts[0] |= FirstFrag | LastFrag; - } - - opts[0] = rtl8125_get_txd_opts1(opts[0], len, entry); - mapping = dma_map_single(&tp->pci_dev->dev, skb->data, len, DMA_TO_DEVICE); - if (unlikely(dma_mapping_error(&tp->pci_dev->dev, mapping))) { - if (unlikely(net_ratelimit())) - netif_err(tp, drv, dev, "Failed to map TX DMA!\n"); - goto err_dma_1; - } - ring->tx_skb[entry].len = len; -#ifdef ENABLE_PTP_SUPPORT - if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) { - if (tp->hwtstamp_config.tx_type == HWTSTAMP_TX_ON && - !tp->ptp_tx_skb) { - skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; - - tp->ptp_tx_skb = skb_get(skb); - tp->ptp_tx_start = jiffies; - schedule_work(&tp->ptp_tx_work); - } else { - tp->tx_hwtstamp_skipped++; - } - } -#endif - ring->tx_skb[entry].skb = skb; - 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) - - /* rtl_tx needs to see descriptor changes before updated tp->cur_tx */ - smp_wmb(); - - WRITE_ONCE(ring->cur_tx, ring->cur_tx + frags + 1); - - stop_queue = !rtl8125_tx_slots_avail(tp, ring); - if (unlikely(stop_queue)) { - /* Avoid wrongly optimistic queue wake-up: rtl_tx thread must - * not miss a ring update when it notices a stopped queue. - */ - smp_wmb(); - netif_stop_subqueue(dev, queue_mapping); - } - - if (EnableTxNoClose) - RTL_W16(tp, ring->sw_tail_ptr_reg, ring->cur_tx % MAX_TX_NO_CLOSE_DESC_PTR_V2); - else - RTL_W16(tp, TPPOLL_8125, BIT(ring->index)); /* set polling bit */ - - if (unlikely(stop_queue)) { - /* Sync with rtl_tx: - * - publish queue status and cur_tx ring index (write barrier) - * - refresh dirty_tx ring index (read barrier). - * May the current thread have a pessimistic view of the ring - * status and forget to wake up queue, a racing rtl_tx thread - * can't. - */ - smp_mb(); - if (rtl8125_tx_slots_avail(tp, ring)) - netif_start_subqueue(dev, queue_mapping); - } - - //spin_unlock_irqrestore(&tp->lock, flags); -out: - return ret; -err_dma_1: - ring->tx_skb[entry].skb = NULL; - rtl8125_tx_clear_range(tp, ring, ring->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_subqueue(dev, queue_mapping); - ret = NETDEV_TX_BUSY; - RTLDEV->stats.tx_dropped++; - - //spin_unlock_irqrestore(&tp->lock, flags); - goto out; -} - -static inline u32 -rtl8125_fast_mod(const u32 input, const u32 ceil) -{ - return input >= ceil ? input % ceil : input; -} - -static int -rtl8125_tx_interrupt(struct rtl8125_tx_ring *ring, int budget) -{ - struct rtl8125_private *tp = ring->priv; - struct net_device *dev = tp->dev; - unsigned int dirty_tx, tx_left; - unsigned int count = 0; - u8 EnableTxNoClose = tp->EnableTxNoClose; - - dirty_tx = ring->dirty_tx; - if (EnableTxNoClose) { - u32 NextHwDesCloPtr = RTL_R16(tp, ring->hw_clo_ptr_reg); - ring->NextHwDesCloPtr = NextHwDesCloPtr; - smp_rmb(); - tx_left = rtl8125_fast_mod(NextHwDesCloPtr - ring->BeginHwDesCloPtr, MAX_TX_NO_CLOSE_DESC_PTR_V2); - ring->BeginHwDesCloPtr = NextHwDesCloPtr; - } else { - smp_rmb(); - tx_left = READ_ONCE(ring->cur_tx) - dirty_tx; - } - - while (tx_left > 0) { - unsigned int entry = dirty_tx % NUM_TX_DESC; - struct ring_info *tx_skb = ring->tx_skb + entry; - - if (!EnableTxNoClose && - (le32_to_cpu(ring->TxDescArray[entry].opts1) & DescOwn)) - break; - - RTLDEV->stats.tx_bytes += tx_skb->len; - RTLDEV->stats.tx_packets++; - - rtl8125_unmap_tx_skb(tp->pci_dev, - tx_skb, - ring->TxDescArray + entry); - - if (tx_skb->skb != NULL) { - RTL_NAPI_CONSUME_SKB_ANY(tx_skb->skb, budget); - tx_skb->skb = NULL; - } - dirty_tx++; - tx_left--; - } - - if (ring->dirty_tx != dirty_tx) { - count = dirty_tx - ring->dirty_tx; - WRITE_ONCE(ring->dirty_tx, dirty_tx); - smp_wmb(); - if (__netif_subqueue_stopped(dev, ring->index) && - (rtl8125_tx_slots_avail(tp, ring))) { - netif_start_subqueue(dev, ring->index); - } - smp_rmb(); - if (!EnableTxNoClose && (ring->cur_tx != dirty_tx)) { - RTL_W16(tp, TPPOLL_8125, BIT(ring->index)); - } - } - - return count; -} - -static int -rtl8125_tx_interrupt_with_vector(struct rtl8125_private *tp, - const int message_id, - int budget) -{ - int count = 0; - if (message_id == 16) - count += rtl8125_tx_interrupt(&tp->tx_ring[0], budget); - else if (message_id == 18) - count += rtl8125_tx_interrupt(&tp->tx_ring[1], budget); - - return count; -} - -static inline int -rtl8125_fragmented_frame(struct rtl8125_private *tp, u32 status) -{ - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) - return (status & (FirstFrag_V3 | LastFrag_V3)) != (FirstFrag_V3 | LastFrag_V3); - else - return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag); -} - -static inline int -rtl8125_rx_desc_type(u32 status) -{ - return ((status >> 26) & 0x0F); -} - -static inline void -rtl8125_rx_v3_csum(struct rtl8125_private *tp, - struct sk_buff *skb, - struct RxDescV3 *descv3) -{ - //u32 opts1 = le32_to_cpu(descv3->RxDescNormalDDWord4.opts1); - u32 opts2 = le32_to_cpu(descv3->RxDescNormalDDWord4.opts2); - - /* rx csum offload for RTL8125 */ - if (((opts2 & RxV4F_v3) && !(opts2 & RxIPF_v3)) || (opts2 & RxV6F_v3)) { - if (((opts2 & RxTCPT_v3) && !(opts2 & RxTCPF_v3)) || - ((opts2 & RxUDPT_v3) && !(opts2 & RxUDPF_v3))) - skb->ip_summed = CHECKSUM_UNNECESSARY; - else - skb->ip_summed = CHECKSUM_NONE; - } else - skb->ip_summed = CHECKSUM_NONE; -} - -static inline void -rtl8125_rx_csum(struct rtl8125_private *tp, - struct sk_buff *skb, - struct RxDesc *desc) -{ - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) - rtl8125_rx_v3_csum(tp, skb, (struct RxDescV3 *)desc); - else { - u32 opts1 = le32_to_cpu(rtl8125_rx_desc_opts1(tp, desc)); - u32 opts2 = le32_to_cpu(rtl8125_rx_desc_opts2(tp, desc)); - - /* rx csum offload for RTL8125 */ - 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 -rtl8125_try_rx_copy(struct rtl8125_private *tp, - struct rtl8125_rx_ring *ring, - 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->r8125napi[ring->index].napi, 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; - rtl8125_mark_to_asic(tp, desc, rx_buf_sz); - ret = 0; - } - } - return ret; -} - -static inline void -rtl8125_rx_skb(struct rtl8125_private *tp, - struct sk_buff *skb, - u32 ring_index) -{ -#ifdef CONFIG_R8125_NAPI -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) - netif_receive_skb(skb); -#else - napi_gro_receive(&tp->r8125napi[ring_index].napi, skb); -#endif -#else - netif_rx(skb); -#endif -} - -static int -rtl8125_check_rx_desc_error(struct net_device *dev, - struct rtl8125_private *tp, - u32 status) -{ - int ret = 0; - - if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) { - if (unlikely(status & RxRES_V3)) { - if (status & (RxRWT_V3 | RxRUNT_V3)) - RTLDEV->stats.rx_length_errors++; - if (status & RxCRC_V3) - RTLDEV->stats.rx_crc_errors++; - - ret = -1; - } - } else { - if (unlikely(status & RxRES)) { - if (status & (RxRWT | RxRUNT)) - RTLDEV->stats.rx_length_errors++; - if (status & RxCRC) - RTLDEV->stats.rx_crc_errors++; - - ret = -1; - } - } - - return ret; -} - -static int -rtl8125_rx_interrupt(struct net_device *dev, - struct rtl8125_private *tp, - struct rtl8125_rx_ring *ring, - 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; - u64 rx_buf_phy_addr; - u32 ring_index = ring->index; - - assert(dev != NULL); - assert(tp != NULL); - - if ((ring->RxDescArray == NULL)) - goto rx_out; - - rx_quota = RTL_RX_QUOTA(budget); - cur_rx = ring->cur_rx; - entry = cur_rx % NUM_RX_DESC; - desc = rtl8125_get_rxdesc(tp, ring->RxDescArray, entry); - rx_left = NUM_RX_DESC + ring->dirty_rx - cur_rx; - rx_left = rtl8125_rx_quota(rx_left, (u32)rx_quota); - - for (; rx_left > 0; rx_left--) { - rmb(); - status = le32_to_cpu(rtl8125_rx_desc_opts1(tp, desc)); - if (status & DescOwn) - break; - - if (unlikely(rtl8125_check_rx_desc_error(dev, tp, status) < 0)) { - if (netif_msg_rx_err(tp)) { - printk(KERN_INFO - "%s: Rx ERROR. status = %08x\n", - dev->name, status); - } - - RTLDEV->stats.rx_errors++; - - if (dev->features & NETIF_F_RXALL) - goto process_pkt; - - rtl8125_mark_to_asic(tp, 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(rtl8125_fragmented_frame(tp, status))) { - RTLDEV->stats.rx_dropped++; - RTLDEV->stats.rx_length_errors++; - rtl8125_mark_to_asic(tp, desc, tp->rx_buf_sz); - continue; - } - - skb = ring->Rx_skbuff[entry]; - - if (!skb) - break; - -#ifdef ENABLE_PTP_SUPPORT - if (tp->EnablePtp) { - struct RxDescV3 *desc_next; - u8 desc_type; - u32 status_next; - - desc_type = rtl8125_rx_desc_type(status); - if (desc_type == RXDESC_TYPE_NEXT && rx_left > 0) { - unsigned int entry_next; - struct sk_buff *skb_next; - - cur_rx++; - rx_left--; - entry_next = cur_rx % NUM_RX_DESC; - desc_next = (struct RxDescV3 *)rtl8125_get_rxdesc(tp, ring->RxDescArray, entry_next); - status_next = le32_to_cpu(desc_next->RxDescNormalDDWord4.opts1); - if (status_next & DescOwn) - break; - - desc_type = rtl8125_rx_desc_type(status_next); - if (desc_type == RXDESC_TYPE_PTP) { - rtl8125_rx_ptp_pktstamp(tp, skb, desc_next); - skb_next = ring->Rx_skbuff[entry_next]; - dev_kfree_skb_any(skb_next); - ring->Rx_skbuff[entry_next] = NULL; - } else - WARN_ON(1); - } else - WARN_ON(desc_type != RXDESC_TYPE_NORMAL); - } -#endif - rx_buf_phy_addr = le64_to_cpu(ring->RxDescPhyAddr[entry]); - dma_sync_single_for_cpu(&tp->pci_dev->dev, - rx_buf_phy_addr, tp->rx_buf_sz, - DMA_FROM_DEVICE); - - if (rtl8125_try_rx_copy(tp, ring, &skb, pkt_size, - desc, tp->rx_buf_sz)) { - ring->Rx_skbuff[entry] = NULL; - dma_unmap_single(&tp->pci_dev->dev, rx_buf_phy_addr, - tp->rx_buf_sz, DMA_FROM_DEVICE); - } else { - dma_sync_single_for_device(&tp->pci_dev->dev, rx_buf_phy_addr, - tp->rx_buf_sz, DMA_FROM_DEVICE); - } - -#ifdef ENABLE_RSS_SUPPORT - rtl8125_rx_hash(tp, (struct RxDescV3 *)desc, skb); -#endif - - if (tp->cp_cmd & RxChkSum) - rtl8125_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 (rtl8125_rx_vlan_skb(tp, desc, skb) < 0) - rtl8125_rx_skb(tp, skb, ring_index); - -#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 % NUM_RX_DESC; - desc = rtl8125_get_rxdesc(tp, ring->RxDescArray, entry); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,37) - prefetch(desc); -#endif - } - - count = cur_rx - ring->cur_rx; - ring->cur_rx = cur_rx; - - delta = rtl8125_rx_fill(tp, ring, dev, ring->dirty_rx, ring->cur_rx, 1); - if (!delta && count && netif_msg_intr(tp)) - printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name); - ring->dirty_rx += 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 ((ring->dirty_rx + NUM_RX_DESC == ring->cur_rx) && netif_msg_intr(tp)) - printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name); - -rx_out: - return count; -} - -static bool -rtl8125_linkchg_interrupt(struct rtl8125_private *tp, u32 status) -{ - if (tp->HwCurrIsrVer == 2) - return status & ISRIMR_V2_LINKCHG; - - return status & LinkChg; -} - -/* - *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 rtl8125_interrupt(int irq, void *dev_instance, struct pt_regs *regs) -#else -static irqreturn_t rtl8125_interrupt(int irq, void *dev_instance) -#endif -{ - struct r8125_napi *r8125napi = dev_instance; - struct rtl8125_private *tp = r8125napi->priv; - struct net_device *dev = tp->dev; - u32 status; - int handled = 0; - - do { - status = RTL_R32(tp, tp->isr_reg[0]); - - if (!(tp->features & (RTL_FEATURE_MSI | RTL_FEATURE_MSIX))) { - /* hotplug/major error/no more work/shared irq */ - if (!status) - break; - - if ((status == 0xFFFFFFFF)) - break; - - if (!(status & (tp->intr_mask | tp->timer_intr_mask))) - break; - } - - handled = 1; - - rtl8125_disable_hw_interrupt(tp); - - RTL_W32(tp, tp->isr_reg[0], status&~RxFIFOOver); - - if (rtl8125_linkchg_interrupt(tp, status)) - rtl8125_check_link_status(dev, 0); - -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH) { - if (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); - } - } -#endif - -#ifdef CONFIG_R8125_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->r8125napi[0].napi))) - __RTL_NETIF_RX_SCHEDULE(dev, &tp->r8125napi[0].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; - rtl8125_switch_to_hw_interrupt(tp); - } -#else - if (status & tp->intr_mask || tp->keep_intr_cnt-- > 0) { - u32 budget = ~(u32)0; - int i; - - if (status & tp->intr_mask) - tp->keep_intr_cnt = RTK_KEEP_INTERRUPT_COUNT; - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) - rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[0], &budget); -#else - rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[0], budget); -#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) - - for (i = 0; i < tp->num_tx_rings; i++) - rtl8125_tx_interrupt(&tp->tx_ring[i], ~(u32)0); -#ifdef ENABLE_DASH_SUPPORT - if (tp->DASH) { - struct net_device *dev = tp->dev; - - HandleDashInterrupt(dev); - } -#endif - - rtl8125_switch_to_timer_interrupt(tp); - } else { - tp->keep_intr_cnt = RTK_KEEP_INTERRUPT_COUNT; - rtl8125_switch_to_hw_interrupt(tp); - } -#endif - } while (false); - - return IRQ_RETVAL(handled); -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) -static irqreturn_t rtl8125_interrupt_msix(int irq, void *dev_instance, struct pt_regs *regs) -#else -static irqreturn_t rtl8125_interrupt_msix(int irq, void *dev_instance) -#endif -{ - struct r8125_napi *r8125napi = dev_instance; - struct rtl8125_private *tp = r8125napi->priv; - struct net_device *dev = tp->dev; - int message_id = r8125napi->index; -#ifndef CONFIG_R8125_NAPI - u32 budget = ~(u32)0; -#endif - - do { - rtl8125_disable_hw_interrupt_v2(tp, message_id); - - rtl8125_clear_hw_isr_v2(tp, message_id); - - //link change - if (message_id == 21) { - rtl8125_check_link_status(dev, 0); - return IRQ_HANDLED; - } - -#ifdef CONFIG_R8125_NAPI - if (likely(RTL_NETIF_RX_SCHEDULE_PREP(dev, &r8125napi->napi))) - __RTL_NETIF_RX_SCHEDULE(dev, &r8125napi->napi); - else if (netif_msg_intr(tp)) - printk(KERN_INFO "%s: interrupt message id %d in poll_msix\n", - dev->name, message_id); -#else - if (message_id < tp->num_rx_rings) { -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) - rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[message_id], &budget); -#else - rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[message_id], budget); -#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) - } - - //spin_lock_irqsave(&tp->lock, flags); - rtl8125_tx_interrupt_with_vector(tp, message_id, ~(u32)0); - //spin_unlock_irqrestore(&tp->lock, flags); - - rtl8125_enable_hw_interrupt_v2(tp, message_id); -#endif - - } while (false); - - return IRQ_HANDLED; -} - -static void rtl8125_down(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long flags; - - rtl8125_delete_esd_timer(dev, &tp->esd_timer); - - //rtl8125_delete_link_timer(dev, &tp->link_timer); - - rtl8125_stop_all_tx_queue(dev); - - _rtl8125_wait_for_quiescence(dev); - - spin_lock_irqsave(&tp->lock, flags); - - netif_carrier_off(dev); - - rtl8125_hw_reset(dev); - - rtl8125_tx_clear(tp); - - rtl8125_rx_clear(tp); - - spin_unlock_irqrestore(&tp->lock, flags); -} - -static int rtl8125_resource_freed(struct rtl8125_private *tp) -{ - int i; - - for (i = 0; i < tp->num_tx_rings; i++) - if (tp->tx_ring[i].TxDescArray) return 0; - - for (i = 0; i < tp->num_rx_rings; i++) - if (tp->rx_ring[i].RxDescArray) return 0; - - return 1; -} - -static int rtl8125_close(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - unsigned long flags; - - if (!rtl8125_resource_freed(tp)) { - rtl8125_cancel_schedule_work(dev); - - rtl8125_down(dev); - - spin_lock_irqsave(&tp->lock, flags); -#ifdef ENABLE_PTP_SUPPORT - rtl8125_ptp_stop(tp); -#endif - rtl8125_hw_d3_para(dev); - - rtl8125_powerdown_pll(dev, 0); - - spin_unlock_irqrestore(&tp->lock, flags); - - rtl8125_free_irq(tp); - - rtl8125_free_alloc_resources(tp); - } else { - spin_lock_irqsave(&tp->lock, flags); - - rtl8125_hw_d3_para(dev); - - rtl8125_powerdown_pll(dev, 0); - - spin_unlock_irqrestore(&tp->lock, flags); - } - - return 0; -} - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11) -static void rtl8125_shutdown(struct pci_dev *pdev) -{ - struct net_device *dev = pci_get_drvdata(pdev); - struct rtl8125_private *tp = netdev_priv(dev); - - if (tp->DASH) - rtl8125_driver_stop(tp); - - rtl8125_set_bios_setting(dev); - if (s5_keep_curr_mac == 0 && tp->random_mac == 0) - rtl8125_rar_set(tp, tp->org_mac_addr); - - if (s5wol == 0) - tp->wol_enabled = WOL_DISABLED; - - rtl8125_close(dev); - rtl8125_disable_msi(pdev, tp); -} -#endif - -/** - * rtl8125_get_stats - Get rtl8125 read/write statistics - * @dev: The Ethernet Device to get statistics for - * - * Get TX/RX statistics for rtl8125 - */ -static struct -net_device_stats *rtl8125_get_stats(struct net_device *dev) -{ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) - struct rtl8125_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 -rtl8125_suspend(struct pci_dev *pdev, u32 state) -#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) -static int -rtl8125_suspend(struct device *device) -#else -static int -rtl8125_suspend(struct pci_dev *pdev, pm_message_t state) -#endif -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) - struct pci_dev *pdev = to_pci_dev(device); - struct net_device *dev = pci_get_drvdata(pdev); -#else - struct net_device *dev = pci_get_drvdata(pdev); -#endif - struct rtl8125_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; - - rtl8125_cancel_schedule_work(dev); - - rtl8125_delete_esd_timer(dev, &tp->esd_timer); - - //rtl8125_delete_link_timer(dev, &tp->link_timer); - - rtl8125_stop_all_tx_queue(dev); - - netif_carrier_off(dev); - - netif_device_detach(dev); - - spin_lock_irqsave(&tp->lock, flags); - -#ifdef ENABLE_PTP_SUPPORT - rtl8125_ptp_suspend(tp); -#endif - rtl8125_hw_reset(dev); - - rtl8125_hw_d3_para(dev); - - rtl8125_powerdown_pll(dev, 1); - - spin_unlock_irqrestore(&tp->lock, flags); - - if (tp->DASH) - rtl8125_driver_stop(tp); -out: - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) - pci_save_state(pdev, &pci_pm_state); -#else - pci_save_state(pdev); -#endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) - pci_enable_wake(pdev, pci_choose_state(pdev, state), tp->wol_enabled); -#endif - //pci_set_power_state(pdev, pci_choose_state(pdev, state)); - - return 0; -} - -static int -rtl8125_hw_d3_not_power_off(struct net_device *dev) -{ - return rtl8125_check_hw_phy_mcu_code_ver(dev); -} - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) -static int -rtl8125_resume(struct pci_dev *pdev) -#else -static int -rtl8125_resume(struct device *device) -#endif -{ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) - struct pci_dev *pdev = to_pci_dev(device); - struct net_device *dev = pci_get_drvdata(pdev); -#else - struct net_device *dev = pci_get_drvdata(pdev); -#endif - struct rtl8125_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 */ - rtl8125_rar_set(tp, dev->dev_addr); - - if (tp->check_keep_link_speed && - //tp->link_ok(dev) && - rtl8125_hw_d3_not_power_off(dev)) - tp->resume_not_chg_speed = 1; - else - tp->resume_not_chg_speed = 0; - - spin_unlock_irqrestore(&tp->lock, flags); - - if (!netif_running(dev)) - goto out; - - spin_lock_irqsave(&tp->lock, flags); - - rtl8125_exit_oob(dev); - - rtl8125_hw_init(dev); - - rtl8125_powerup_pll(dev); - - rtl8125_hw_ephy_config(dev); - - rtl8125_hw_phy_config(dev); - - rtl8125_hw_config(dev); - - spin_unlock_irqrestore(&tp->lock, flags); - - if (tp->resume_not_chg_speed) - rtl8125_check_link_status(dev, 1); - else - rtl8125_schedule_work(dev, rtl8125_reset_task); - - netif_device_attach(dev); - - mod_timer(&tp->esd_timer, jiffies + RTL8125_ESD_TIMEOUT); - //mod_timer(&tp->link_timer, jiffies + RTL8125_LINK_TIMEOUT); -out: - return 0; -} - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) - -static struct dev_pm_ops rtl8125_pm_ops = { - .suspend = rtl8125_suspend, - .resume = rtl8125_resume, - .freeze = rtl8125_suspend, - .thaw = rtl8125_resume, - .poweroff = rtl8125_suspend, - .restore = rtl8125_resume, -}; - -#define RTL8125_PM_OPS (&rtl8125_pm_ops) - -#endif - -#else /* !CONFIG_PM */ - -#define RTL8125_PM_OPS NULL - -#endif /* CONFIG_PM */ - -static struct pci_driver rtl8125_pci_driver = { - .name = MODULENAME, - .id_table = rtl8125_pci_tbl, - .probe = rtl8125_init_one, - .remove = __devexit_p(rtl8125_remove_one), -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11) - .shutdown = rtl8125_shutdown, -#endif -#ifdef CONFIG_PM -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) - .suspend = rtl8125_suspend, - .resume = rtl8125_resume, -#else - .driver.pm = RTL8125_PM_OPS, -#endif -#endif -}; - -static int __init -rtl8125_init_module(void) -{ - int ret = 0; -#ifdef ENABLE_R8125_PROCFS - rtl8125_proc_module_init(); -#endif - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) - - ret = pci_register_driver(&rtl8125_pci_driver); -#else - ret = pci_module_init(&rtl8125_pci_driver); -#endif - - return ret; -} - -static void __exit -rtl8125_cleanup_module(void) -{ - pci_unregister_driver(&rtl8125_pci_driver); - -#ifdef ENABLE_R8125_PROCFS - if (rtl8125_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) - rtl8125_proc = NULL; - } -#endif -} - -module_init(rtl8125_init_module); -module_exit(rtl8125_cleanup_module); diff --git a/r8125/src/r8125_ptp.c b/r8125/src/r8125_ptp.c deleted file mode 100644 index e1102b76d..000000000 --- a/r8125/src/r8125_ptp.c +++ /dev/null @@ -1,594 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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 -#include -#include -#include -#include -#include -#include -#include - -#include "r8125.h" -#include "r8125_ptp.h" - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) -static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64) -{ - return *(const struct timespec *)&ts64; -} - -static inline struct timespec64 timespec_to_timespec64(const struct timespec ts) -{ - return *(const struct timespec64 *)&ts; -} -#endif - -static int _rtl8125_phc_gettime(struct rtl8125_private *tp, struct timespec64 *ts64) -{ - //get local time - RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_LATCHED_LOCAL_TIME | PTP_EXEC_CMD)); - - /* nanoseconds */ - //0x6808[29:0] - ts64->tv_nsec = (RTL_R32(tp, PTP_SOFT_CONFIG_Time_NS_8125) & 0x3fffffff) + - tp->ptp_adjust; - - /* seconds */ - //0x680C[47:0] - ts64->tv_sec = RTL_R16(tp, PTP_SOFT_CONFIG_Time_S_8125 + 4); - ts64->tv_sec <<= 32; - ts64->tv_sec |= RTL_R32(tp, PTP_SOFT_CONFIG_Time_S_8125); - - return 0; -} - -static int _rtl8125_phc_settime(struct rtl8125_private *tp, const struct timespec64 *ts64) -{ - /* nanoseconds */ - //0x6808[29:0] - RTL_W32(tp, PTP_SOFT_CONFIG_Time_NS_8125, (ts64->tv_nsec & 0x3fffffff)); - - /* seconds */ - //0x680C[47:0] - RTL_W32(tp, PTP_SOFT_CONFIG_Time_S_8125, ts64->tv_sec); - RTL_W16(tp, PTP_SOFT_CONFIG_Time_S_8125 + 4, (ts64->tv_sec >> 32)); - - //set local time - RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_SET_LOCAL_TIME | PTP_EXEC_CMD)); - - return 0; -} - -#if 0 -static int _rtl8125_phc_adjtime(struct rtl8125_private *tp, s64 delta) -{ - struct timespec64 now, then = ns_to_timespec64(delta); - u32 nsec; - u64 sec; - - _rtl8125_phc_gettime(tp, &now); - now = timespec64_add(now, then); - - nsec = now.tv_nsec & 0x3fffffff; - sec = now.tv_sec & 0x0000ffffffffffff; - - /* nanoseconds */ - //0x6808[29:0] - RTL_W32(tp, PTP_SOFT_CONFIG_Time_NS_8125, nsec); - - /* seconds */ - //0x680C[47:0] - RTL_W32(tp, PTP_SOFT_CONFIG_Time_S_8125, sec); - RTL_W16(tp, PTP_SOFT_CONFIG_Time_S_8125 + 4, (sec >> 32)); - - //adjust local time - //RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_DRIFT_LOCAL_TIME | PTP_EXEC_CMD)); - RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_SET_LOCAL_TIME | PTP_EXEC_CMD)); - - return 0; -} -#endif - -static int rtl8125_phc_adjtime(struct ptp_clock_info *ptp, s64 delta) -{ - struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); - unsigned long flags; - //int ret = 0; - - //netif_info(tp, drv, tp->dev, "phc adjust time\n"); - - spin_lock_irqsave(&tp->lock, flags); - //ret = _rtl8125_phc_adjtime(tp, delta); - tp->ptp_adjust += delta; - spin_unlock_irqrestore(&tp->lock, flags); - - return 0; -} - -/* -1ppm means every 125MHz plus 125Hz. It also means every 8ns minus 8ns*10^(-6) - -1ns=2^30 sub_ns - -8ns*10^(-6) = 8 * 2^30 sub_ns * 10^(-6) = 2^33 sub_ns * 10^(-6) = 8590 = 0x218E sub_ns - -1ppb means every 125MHz plus 0.125Hz. It also means every 8ns minus 8ns*10^(-9) - -1ns=2^30 sub_ns - -8ns*10^(-9) = 8 * 2^30 sub_ns * 10^(-9) = 2^33 sub_ns * 10^(-9) = 8.59 sub_ns = 9 sub_ns -*/ -static int _rtl8125_phc_adjfreq(struct ptp_clock_info *ptp, s32 ppb) -{ - struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); - bool negative = false; - u32 sub_ns; - - if (ppb < 0) { - negative = true; - ppb = -ppb; - } - - sub_ns = ppb * 9; - if (negative) { - sub_ns = -sub_ns; - sub_ns &= 0x3fffffff; - sub_ns |= PTP_ADJUST_TIME_NS_NEGATIVE; - } else - sub_ns &= 0x3fffffff; - - /* nanoseconds */ - //0x6808[29:0] - RTL_W32(tp, PTP_SOFT_CONFIG_Time_NS_8125, sub_ns); - - //adjust local time - RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_DRIFT_LOCAL_TIME | PTP_EXEC_CMD)); - //RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_SET_LOCAL_TIME | PTP_EXEC_CMD)); - - return 0; -} - -static int rtl8125_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta) -{ - //struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); - - //netif_info(tp, drv, tp->dev, "phc adjust freq\n"); - - if (delta > ptp->max_adj || delta < -ptp->max_adj) - return -EINVAL; - - _rtl8125_phc_adjfreq(ptp, delta); - - return 0; -} - -static int rtl8125_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts64) -{ - struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); - unsigned long flags; - int ret; - - //netif_info(tp, drv, tp->dev, "phc get ts\n"); - - spin_lock_irqsave(&tp->lock, flags); - ret = _rtl8125_phc_gettime(tp, ts64); - spin_unlock_irqrestore(&tp->lock, flags); - - return ret; -} - -static int rtl8125_phc_settime(struct ptp_clock_info *ptp, - const struct timespec64 *ts64) -{ - struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); - unsigned long flags; - int ret; - - //netif_info(tp, drv, tp->dev, "phc set ts\n"); - - spin_lock_irqsave(&tp->lock, flags); - ret = _rtl8125_phc_settime(tp, ts64); - tp->ptp_adjust = 0; - spin_unlock_irqrestore(&tp->lock, flags); - - return ret; -} - -static int rtl8125_phc_enable(struct ptp_clock_info *ptp, - struct ptp_clock_request *rq, int on) -{ - struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); - unsigned long flags; - u16 ptp_ctrl; - - //netif_info(tp, drv, tp->dev, "phc enable type %x on %d\n", rq->type, on); - - switch (rq->type) { - case PTP_CLK_REQ_PPS: - spin_lock_irqsave(&tp->lock, flags); - ptp_ctrl = RTL_R16(tp, PTP_CTRL_8125); - ptp_ctrl &= ~BIT_15; - if (on) - ptp_ctrl |= BIT_14; - else - ptp_ctrl &= ~BIT_14; - RTL_W16(tp, PTP_CTRL_8125, ptp_ctrl); - spin_unlock_irqrestore(&tp->lock, flags); - return 0; - default: - return -EOPNOTSUPP; - } -} - -int rtl8125_get_ts_info(struct net_device *netdev, - struct ethtool_ts_info *info) -{ - struct rtl8125_private *tp = netdev_priv(netdev); - - /* we always support timestamping disabled */ - info->rx_filters = BIT(HWTSTAMP_FILTER_NONE); - - if (tp->HwSuppPtpVer == 0) - return ethtool_op_get_ts_info(netdev, info); - - info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE | - SOF_TIMESTAMPING_RX_SOFTWARE | - SOF_TIMESTAMPING_SOFTWARE | - SOF_TIMESTAMPING_TX_HARDWARE | - SOF_TIMESTAMPING_RX_HARDWARE | - SOF_TIMESTAMPING_RAW_HARDWARE; - - if (tp->ptp_clock) - info->phc_index = ptp_clock_index(tp->ptp_clock); - else - info->phc_index = -1; - - info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON); - - info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) | - BIT(HWTSTAMP_FILTER_PTP_V2_EVENT) | - BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT) | - BIT(HWTSTAMP_FILTER_PTP_V2_SYNC) | - BIT(HWTSTAMP_FILTER_PTP_V2_L4_SYNC) | - BIT(HWTSTAMP_FILTER_PTP_V2_DELAY_REQ) | - BIT(HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ); - - return 0; -} - -static const struct ptp_clock_info rtl_ptp_clock_info = { - .owner = THIS_MODULE, - .n_alarm = 0, - .n_ext_ts = 0, - .n_per_out = 0, - .n_pins = 0, - .pps = 1, - .adjfreq = rtl8125_phc_adjfreq, - .adjtime = rtl8125_phc_adjtime, - .gettime64 = rtl8125_phc_gettime, - .settime64 = rtl8125_phc_settime, - .enable = rtl8125_phc_enable, -}; - -static int rtl8125_get_tx_ptp_pkt_tstamp(struct rtl8125_private *tp, struct timespec64 *ts64) -{ - return _rtl8125_phc_gettime(tp, ts64); -} - -static void rtl8125_ptp_tx_hwtstamp(struct rtl8125_private *tp) -{ - struct sk_buff *skb = tp->ptp_tx_skb; - struct skb_shared_hwtstamps shhwtstamps = {0}; - struct timespec64 ts64; - - RTL_W8(tp, PTP_ISR_8125, PTP_ISR_TOK | PTP_ISR_TER); - - rtl8125_get_tx_ptp_pkt_tstamp(tp, &ts64); - - /* Upper 32 bits contain s, lower 32 bits contain ns. */ - shhwtstamps.hwtstamp = ktime_set(ts64.tv_sec, - ts64.tv_nsec); - - /* Clear the lock early before calling skb_tstamp_tx so that - * applications are not woken up before the lock bit is clear. We use - * a copy of the skb pointer to ensure other threads can't change it - * while we're notifying the stack. - */ - tp->ptp_tx_skb = NULL; - - /* Notify the stack and free the skb after we've unlocked */ - skb_tstamp_tx(skb, &shhwtstamps); - dev_kfree_skb_any(skb); -} - -#define RTL8125_PTP_TX_TIMEOUT (HZ * 15) -static void rtl8125_ptp_tx_work(struct work_struct *work) -{ - struct rtl8125_private *tp = container_of(work, struct rtl8125_private, - ptp_tx_work); - unsigned long flags; - - spin_lock_irqsave(&tp->lock, flags); - - if (!tp->ptp_tx_skb) - goto Exit; - - if (time_is_before_jiffies(tp->ptp_tx_start + - RTL8125_PTP_TX_TIMEOUT)) { - dev_kfree_skb_any(tp->ptp_tx_skb); - tp->ptp_tx_skb = NULL; - tp->tx_hwtstamp_timeouts++; - /* Clear the tx valid bit in TSYNCTXCTL register to enable - * interrupt - */ - RTL_W8(tp, PTP_ISR_8125, PTP_ISR_TOK | PTP_ISR_TER); - goto Exit; - } - - if (RTL_R8(tp, PTP_ISR_8125) & (PTP_ISR_TOK)) - rtl8125_ptp_tx_hwtstamp(tp); - else - /* reschedule to check later */ - schedule_work(&tp->ptp_tx_work); - -Exit: - spin_unlock_irqrestore(&tp->lock, flags); -} - -static int rtl8125_hwtstamp_enable(struct rtl8125_private *tp, bool enable) -{ - RTL_W16(tp, PTP_CTRL_8125, 0); - if (enable) { - u16 ptp_ctrl; - struct timespec64 ts64; - - //clear ptp isr - RTL_W8(tp, PTP_ISR_8125, 0xff); - //ptp source 0:gphy 1:mac - rtl8125_mac_ocp_write(tp, 0xDC00, rtl8125_mac_ocp_read(tp, 0xDC00) | BIT_6); - //enable ptp - ptp_ctrl = (BIT_0 | BIT_3 | BIT_4 | BIT_6 | BIT_10 | BIT_12 | BIT_13); - if (tp->ptp_master_mode) { - ptp_ctrl &= ~BIT_13; - ptp_ctrl |= BIT_1; - } - RTL_W16(tp, PTP_CTRL_8125, ptp_ctrl); - - //set system time - /* - if (ktime_to_timespec64_cond(ktime_get_real(), &ts64)) - _rtl8125_phc_settime(tp, timespec64_to_timespec(ts64)); - */ - ktime_get_real_ts64(&ts64); - ts64.tv_nsec += tp->ptp_adjust; - _rtl8125_phc_settime(tp, &ts64); - tp->ptp_adjust = 0; - } - - return 0; -} - -static long rtl8125_ptp_create_clock(struct rtl8125_private *tp) -{ - struct net_device *netdev = tp->dev; - long err; - - if (!IS_ERR_OR_NULL(tp->ptp_clock)) - return 0; - - if (tp->HwSuppPtpVer == 0) { - tp->ptp_clock = NULL; - return -EOPNOTSUPP; - } - - tp->ptp_clock_info = rtl_ptp_clock_info; - snprintf(tp->ptp_clock_info.name, sizeof(tp->ptp_clock_info.name), - "%pm", tp->dev->dev_addr); - tp->ptp_clock_info.max_adj = 119304647; - tp->ptp_clock = ptp_clock_register(&tp->ptp_clock_info, &tp->pci_dev->dev); - if (IS_ERR(tp->ptp_clock)) { - err = PTR_ERR(tp->ptp_clock); - tp->ptp_clock = NULL; - netif_err(tp, drv, tp->dev, "ptp_clock_register failed\n"); - return err; - } else - netif_info(tp, drv, tp->dev, "registered PHC device on %s\n", netdev->name); - - return 0; -} - -void rtl8125_ptp_reset(struct rtl8125_private *tp) -{ - if (!tp->ptp_clock) - return; - - netif_info(tp, drv, tp->dev, "reset PHC clock\n"); - - rtl8125_hwtstamp_enable(tp, false); -} - -void rtl8125_ptp_init(struct rtl8125_private *tp) -{ - /* obtain a PTP device, or re-use an existing device */ - if (rtl8125_ptp_create_clock(tp)) - return; - - /* we have a clock so we can initialize work now */ - INIT_WORK(&tp->ptp_tx_work, rtl8125_ptp_tx_work); - - tp->ptp_adjust = 0; - - /* reset the PTP related hardware bits */ - rtl8125_ptp_reset(tp); - - return; -} - -void rtl8125_ptp_suspend(struct rtl8125_private *tp) -{ - if (!tp->ptp_clock) - return; - - netif_info(tp, drv, tp->dev, "suspend PHC clock\n"); - - rtl8125_hwtstamp_enable(tp, false); - - /* ensure that we cancel any pending PTP Tx work item in progress */ - cancel_work_sync(&tp->ptp_tx_work); -} - -void rtl8125_ptp_stop(struct rtl8125_private *tp) -{ - struct net_device *netdev = tp->dev; - - netif_info(tp, drv, tp->dev, "stop PHC clock\n"); - - /* first, suspend PTP activity */ - rtl8125_ptp_suspend(tp); - - /* disable the PTP clock device */ - if (tp->ptp_clock) { - ptp_clock_unregister(tp->ptp_clock); - tp->ptp_clock = NULL; - netif_info(tp, drv, tp->dev, "removed PHC on %s\n", - netdev->name); - } -} - -static int rtl8125_set_tstamp(struct net_device *netdev, struct ifreq *ifr) -{ - struct rtl8125_private *tp = netdev_priv(netdev); - struct hwtstamp_config config; - bool hwtstamp = 0; - - //netif_info(tp, drv, tp->dev, "ptp set ts\n"); - - if (copy_from_user(&config, ifr->ifr_data, sizeof(config))) - return -EFAULT; - - if (config.flags) - return -EINVAL; - - switch (config.tx_type) { - case HWTSTAMP_TX_ON: - hwtstamp = 1; - case HWTSTAMP_TX_OFF: - break; - case HWTSTAMP_TX_ONESTEP_SYNC: - default: - return -ERANGE; - } - - switch (config.rx_filter) { - case HWTSTAMP_FILTER_PTP_V2_EVENT: - case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: - case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: - case HWTSTAMP_FILTER_PTP_V2_SYNC: - case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: - case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: - case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: - case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: - case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: - config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; - hwtstamp = 1; - case HWTSTAMP_FILTER_NONE: - break; - default: - return -ERANGE; - } - - if (tp->hwtstamp_config.tx_type != config.tx_type || - tp->hwtstamp_config.rx_filter != config.rx_filter) { - tp->hwtstamp_config = config; - rtl8125_hwtstamp_enable(tp, hwtstamp); - } - - return copy_to_user(ifr->ifr_data, &config, - sizeof(config)) ? -EFAULT : 0; -} - -static int rtl8125_get_tstamp(struct net_device *netdev, struct ifreq *ifr) -{ - struct rtl8125_private *tp = netdev_priv(netdev); - - //netif_info(tp, drv, tp->dev, "ptp get ts\n"); - - return copy_to_user(ifr->ifr_data, &tp->hwtstamp_config, - sizeof(tp->hwtstamp_config)) ? -EFAULT : 0; -} - -int rtl8125_ptp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) -{ - struct rtl8125_private *tp = netdev_priv(netdev); - int ret; - unsigned long flags; - - //netif_info(tp, drv, tp->dev, "ptp ioctl\n"); - - ret = 0; - switch (cmd) { -#ifdef ENABLE_PTP_SUPPORT - case SIOCSHWTSTAMP: - spin_lock_irqsave(&tp->lock, flags); - ret = rtl8125_set_tstamp(netdev, ifr); - spin_unlock_irqrestore(&tp->lock, flags); - break; - case SIOCGHWTSTAMP: - spin_lock_irqsave(&tp->lock, flags); - ret = rtl8125_get_tstamp(netdev, ifr); - spin_unlock_irqrestore(&tp->lock, flags); - break; -#endif - default: - ret = -EOPNOTSUPP; - break; - } - - return ret; -} - -void rtl8125_rx_ptp_pktstamp(struct rtl8125_private *tp, struct sk_buff *skb, - struct RxDescV3 *descv3) -{ - time64_t tv_sec; - long tv_nsec; - - tv_sec = le32_to_cpu(descv3->RxDescTimeStamp.TimeStampHigh) + - ((u64)le32_to_cpu(descv3->RxDescPTPDDWord4.TimeStampHHigh) << 32); - tv_nsec = le32_to_cpu(descv3->RxDescTimeStamp.TimeStampLow) + tp->ptp_adjust; - - skb_hwtstamps(skb)->hwtstamp = ktime_set(tv_sec, tv_nsec); -} diff --git a/r8125/src/r8125_ptp.h b/r8125/src/r8125_ptp.h deleted file mode 100644 index a324ff382..000000000 --- a/r8125/src/r8125_ptp.h +++ /dev/null @@ -1,81 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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_rtl8125_PTP_H -#define _LINUX_rtl8125_PTP_H - -#include -#include -#include -#include -#include - -struct rtl8125_ptp_info { - s64 time_sec; - u32 time_ns; - u16 ts_info; -}; - -#ifndef _STRUCT_TIMESPEC -#define _STRUCT_TIMESPEC -struct timespec { - __kernel_old_time_t tv_sec; /* seconds */ - long tv_nsec; /* nanoseconds */ -}; -#endif - -enum PTP_CMD_TYPE { - PTP_CMD_SET_LOCAL_TIME = 0, - PTP_CMD_DRIFT_LOCAL_TIME, - PTP_CMD_LATCHED_LOCAL_TIME, -}; - - -struct rtl8125_private; -struct RxDescV3; - -int rtl8125_get_ts_info(struct net_device *netdev, - struct ethtool_ts_info *info); - -void rtl8125_ptp_reset(struct rtl8125_private *tp); -void rtl8125_ptp_init(struct rtl8125_private *tp); -void rtl8125_ptp_suspend(struct rtl8125_private *tp); -void rtl8125_ptp_stop(struct rtl8125_private *tp); - -int rtl8125_ptp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); - -void rtl8125_rx_ptp_pktstamp(struct rtl8125_private *tp, struct sk_buff *skb, - struct RxDescV3 *descv3); - -#endif /* _LINUX_rtl8125_PTP_H */ diff --git a/r8125/src/r8125_realwow.h b/r8125/src/r8125_realwow.h deleted file mode 100644 index 352e3270f..000000000 --- a/r8125/src/r8125_realwow.h +++ /dev/null @@ -1,118 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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_R8125_REALWOW_H -#define _LINUX_R8125_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 rtl8125_realwow_ioctl(struct net_device *dev, struct ifreq *ifr); -void rtl8125_realwow_hw_init(struct net_device *dev); -void rtl8125_get_realwow_hw_version(struct net_device *dev); -void rtl8125_set_realwow_d3_para(struct net_device *dev); - -#endif /* _LINUX_R8125_REALWOW_H */ diff --git a/r8125/src/r8125_rss.c b/r8125/src/r8125_rss.c deleted file mode 100644 index a77917a93..000000000 --- a/r8125/src/r8125_rss.c +++ /dev/null @@ -1,484 +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) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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 -#include "r8125.h" - -enum rtl8125_rss_register_content { - /* RSS */ - RSS_CTRL_TCP_IPV4_SUPP = (1 << 0), - RSS_CTRL_IPV4_SUPP = (1 << 1), - RSS_CTRL_TCP_IPV6_SUPP = (1 << 2), - RSS_CTRL_IPV6_SUPP = (1 << 3), - RSS_HALF_SUPP = (1 << 7), - RSS_CTRL_UDP_IPV4_SUPP = (1 << 11), - RSS_CTRL_UDP_IPV6_SUPP = (1 << 12), - RSS_QUAD_CPU_EN = (1 << 16), - RSS_HQ_Q_SUP_R = (1 << 31), -}; - -static int rtl8125_get_rss_hash_opts(struct rtl8125_private *tp, - struct ethtool_rxnfc *cmd) -{ - cmd->data = 0; - - /* Report default options for RSS */ - switch (cmd->flow_type) { - case TCP_V4_FLOW: - cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; - /* fallthrough */ - case UDP_V4_FLOW: - if (tp->rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV4) - cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; - /* fallthrough */ - case IPV4_FLOW: - cmd->data |= RXH_IP_SRC | RXH_IP_DST; - break; - case TCP_V6_FLOW: - cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; - /* fallthrough */ - case UDP_V6_FLOW: - if (tp->rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV6) - cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; - /* fallthrough */ - case IPV6_FLOW: - cmd->data |= RXH_IP_SRC | RXH_IP_DST; - break; - default: - return -EINVAL; - } - - return 0; -} - -int rtl8125_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, - u32 *rule_locs) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int ret = -EOPNOTSUPP; - - netif_info(tp, drv, tp->dev, "rss get rxnfc\n"); - - if (!(dev->features & NETIF_F_RXHASH)) - return ret; - - switch (cmd->cmd) { - case ETHTOOL_GRXRINGS: - cmd->data = rtl8125_tot_rx_rings(tp); - ret = 0; - break; - case ETHTOOL_GRXFH: - ret = rtl8125_get_rss_hash_opts(tp, cmd); - break; - default: - break; - } - - return ret; -} - -u32 rtl8125_rss_indir_tbl_entries(struct rtl8125_private *tp) -{ - return tp->HwSuppIndirTblEntries; -} - -#define RSS_MASK_BITS_OFFSET (8) -#define RSS_CPU_NUM_OFFSET (16) -#define RTL8125_UDP_RSS_FLAGS (RTL_8125_RSS_FLAG_HASH_UDP_IPV4 | \ - RTL_8125_RSS_FLAG_HASH_UDP_IPV6) -static int _rtl8125_set_rss_hash_opt(struct rtl8125_private *tp) -{ - u32 rss_flags = tp->rss_flags; - u32 hash_mask_len; - u32 rss_ctrl; - - rss_ctrl = ilog2(rtl8125_tot_rx_rings(tp)); - rss_ctrl &= (BIT_0 | BIT_1 | BIT_2); - rss_ctrl <<= RSS_CPU_NUM_OFFSET; - - /* Perform hash on these packet types */ - rss_ctrl |= RSS_CTRL_TCP_IPV4_SUPP - | RSS_CTRL_IPV4_SUPP - | RSS_CTRL_IPV6_SUPP - | RSS_CTRL_TCP_IPV6_SUPP; - - if (rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV4) - rss_ctrl |= RSS_CTRL_UDP_IPV4_SUPP; - - if (rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV6) - rss_ctrl |= RSS_CTRL_UDP_IPV6_SUPP; - - hash_mask_len = ilog2(rtl8125_rss_indir_tbl_entries(tp)); - hash_mask_len &= (BIT_0 | BIT_1 | BIT_2); - rss_ctrl |= hash_mask_len << RSS_MASK_BITS_OFFSET; - - RTL_W32(tp, RSS_CTRL_8125, rss_ctrl); - - return 0; -} - -static int rtl8125_set_rss_hash_opt(struct rtl8125_private *tp, - struct ethtool_rxnfc *nfc) -{ - u32 rss_flags = tp->rss_flags; - - netif_info(tp, drv, tp->dev, "rss set hash\n"); - - /* - * RSS does not support anything other than hashing - * to queues on src and dst IPs and ports - */ - if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST | - RXH_L4_B_0_1 | RXH_L4_B_2_3)) - return -EINVAL; - - switch (nfc->flow_type) { - case TCP_V4_FLOW: - case TCP_V6_FLOW: - if (!(nfc->data & RXH_IP_SRC) || - !(nfc->data & RXH_IP_DST) || - !(nfc->data & RXH_L4_B_0_1) || - !(nfc->data & RXH_L4_B_2_3)) - return -EINVAL; - break; - case UDP_V4_FLOW: - if (!(nfc->data & RXH_IP_SRC) || - !(nfc->data & RXH_IP_DST)) - return -EINVAL; - switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { - case 0: - rss_flags &= ~RTL_8125_RSS_FLAG_HASH_UDP_IPV4; - break; - case (RXH_L4_B_0_1 | RXH_L4_B_2_3): - rss_flags |= RTL_8125_RSS_FLAG_HASH_UDP_IPV4; - break; - default: - return -EINVAL; - } - break; - case UDP_V6_FLOW: - if (!(nfc->data & RXH_IP_SRC) || - !(nfc->data & RXH_IP_DST)) - return -EINVAL; - switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { - case 0: - rss_flags &= ~RTL_8125_RSS_FLAG_HASH_UDP_IPV6; - break; - case (RXH_L4_B_0_1 | RXH_L4_B_2_3): - rss_flags |= RTL_8125_RSS_FLAG_HASH_UDP_IPV6; - break; - default: - return -EINVAL; - } - break; - case SCTP_V4_FLOW: - case AH_ESP_V4_FLOW: - case AH_V4_FLOW: - case ESP_V4_FLOW: - case SCTP_V6_FLOW: - case AH_ESP_V6_FLOW: - case AH_V6_FLOW: - case ESP_V6_FLOW: - case IP_USER_FLOW: - case ETHER_FLOW: - /* RSS is not supported for these protocols */ - if (nfc->data) { - netif_err(tp, drv, tp->dev, "Command parameters not supported\n"); - return -EINVAL; - } - return 0; - break; - default: - return -EINVAL; - } - - /* if we changed something we need to update flags */ - if (rss_flags != tp->rss_flags) { - u32 rss_ctrl = RTL_R32(tp, RSS_CTRL_8125); - - if ((rss_flags & RTL8125_UDP_RSS_FLAGS) && - !(tp->rss_flags & RTL8125_UDP_RSS_FLAGS)) - netdev_warn(tp->dev, - "enabling UDP RSS: fragmented packets may " - "arrive out of order to the stack above\n"); - - tp->rss_flags = rss_flags; - - /* Perform hash on these packet types */ - rss_ctrl |= RSS_CTRL_TCP_IPV4_SUPP - | RSS_CTRL_IPV4_SUPP - | RSS_CTRL_IPV6_SUPP - | RSS_CTRL_TCP_IPV6_SUPP; - - rss_ctrl &= ~(RSS_CTRL_UDP_IPV4_SUPP | - RSS_CTRL_UDP_IPV6_SUPP); - - if (rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV4) - rss_ctrl |= RSS_CTRL_UDP_IPV4_SUPP; - - if (rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV6) - rss_ctrl |= RSS_CTRL_UDP_IPV6_SUPP; - - RTL_W32(tp, RSS_CTRL_8125, rss_ctrl); - } - - return 0; -} - -int rtl8125_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int ret = -EOPNOTSUPP; - - netif_info(tp, drv, tp->dev, "rss set rxnfc\n"); - - if (!(dev->features & NETIF_F_RXHASH)) - return ret; - - switch (cmd->cmd) { - case ETHTOOL_SRXFH: - ret = rtl8125_set_rss_hash_opt(tp, cmd); - break; - default: - break; - } - - return ret; -} - -static u32 _rtl8125_get_rxfh_key_size(struct rtl8125_private *tp) -{ - return sizeof(tp->rss_key); -} - -u32 rtl8125_get_rxfh_key_size(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - netif_info(tp, drv, tp->dev, "rss get key size\n"); - - if (!(dev->features & NETIF_F_RXHASH)) - return 0; - - return _rtl8125_get_rxfh_key_size(tp); -} - -u32 rtl8125_rss_indir_size(struct net_device *dev) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - netif_info(tp, drv, tp->dev, "rss get indir tbl size\n"); - - if (!(dev->features & NETIF_F_RXHASH)) - return 0; - - return rtl8125_rss_indir_tbl_entries(tp); -} - -static void rtl8125_get_reta(struct rtl8125_private *tp, u32 *indir) -{ - int i, reta_size = rtl8125_rss_indir_tbl_entries(tp); - - for (i = 0; i < reta_size; i++) - indir[i] = tp->rss_indir_tbl[i]; -} - -int rtl8125_get_rxfh(struct net_device *dev, u32 *indir, u8 *key, - u8 *hfunc) -{ - struct rtl8125_private *tp = netdev_priv(dev); - - netif_info(tp, drv, tp->dev, "rss get rxfh\n"); - - if (!(dev->features & NETIF_F_RXHASH)) - return -EOPNOTSUPP; - - if (hfunc) - *hfunc = ETH_RSS_HASH_TOP; - - if (indir) - rtl8125_get_reta(tp, indir); - - if (key) - memcpy(key, tp->rss_key, rtl8125_get_rxfh_key_size(dev)); - - return 0; -} - -#define RSS_KEY_8125 0x4600 -#define RSS_INDIRECTION_TBL_8125_V2 0x4700 - -static u32 rtl8125_rss_key_reg(struct rtl8125_private *tp) -{ - return RSS_KEY_8125; -} - -static u32 rtl8125_rss_indir_tbl_reg(struct rtl8125_private *tp) -{ - return RSS_INDIRECTION_TBL_8125_V2; -} - -static void rtl8125_store_reta(struct rtl8125_private *tp) -{ - u16 indir_tbl_reg = rtl8125_rss_indir_tbl_reg(tp); - u32 i, reta_entries = rtl8125_rss_indir_tbl_entries(tp); - u32 reta = 0; - u8 *indir_tbl = tp->rss_indir_tbl; - - /* Write redirection table to HW */ - for (i = 0; i < reta_entries; i++) { - reta |= indir_tbl[i] << (i & 0x3) * 8; - if ((i & 3) == 3) { - RTL_W32(tp, indir_tbl_reg, reta); - - indir_tbl_reg += 4; - reta = 0; - } - } -} - -static void rtl8125_store_rss_key(struct rtl8125_private *tp) -{ - const u16 rss_key_reg = rtl8125_rss_key_reg(tp); - u32 i, rss_key_size = _rtl8125_get_rxfh_key_size(tp); - u32 *rss_key = (u32*)tp->rss_key; - - /* Write redirection table to HW */ - for (i = 0; i < rss_key_size; i+=4) - RTL_W32(tp, rss_key_reg + i, *rss_key++); -} - -int rtl8125_set_rxfh(struct net_device *dev, const u32 *indir, - const u8 *key, const u8 hfunc) -{ - struct rtl8125_private *tp = netdev_priv(dev); - int i; - u32 reta_entries = rtl8125_rss_indir_tbl_entries(tp); - - netif_info(tp, drv, tp->dev, "rss set rxfh\n"); - - /* We require at least one supported parameter to be changed and no - * change in any of the unsupported parameters - */ - if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP) - return -EOPNOTSUPP; - - /* Fill out the redirection table */ - if (indir) { - int max_queues = tp->num_rx_rings; - - /* Verify user input. */ - for (i = 0; i < reta_entries; i++) - if (indir[i] >= max_queues) - return -EINVAL; - - for (i = 0; i < reta_entries; i++) - tp->rss_indir_tbl[i] = indir[i]; - } - - /* Fill out the rss hash key */ - if (key) - memcpy(tp->rss_key, key, rtl8125_get_rxfh_key_size(dev)); - - rtl8125_store_reta(tp); - - rtl8125_store_rss_key(tp); - - return 0; -} - -static u32 rtl8125_get_rx_desc_hash(struct rtl8125_private *tp, - struct RxDescV3 *descv3) -{ - return le32_to_cpu(descv3->RxDescNormalDDWord2.RSSResult); -} - -#define RXS_8125B_RSS_UDP BIT(9) -#define RXS_8125_RSS_IPV4 BIT(10) -#define RXS_8125_RSS_IPV6 BIT(12) -#define RXS_8125_RSS_TCP BIT(13) -#define RTL8125_RXS_RSS_L3_TYPE_MASK (RXS_8125_RSS_IPV4 | RXS_8125_RSS_IPV6) -#define RTL8125_RXS_RSS_L4_TYPE_MASK (RXS_8125_RSS_TCP | RXS_8125B_RSS_UDP) -void rtl8125_rx_hash(struct rtl8125_private *tp, - struct RxDescV3 *descv3, - struct sk_buff *skb) -{ - u16 rss_header_info; - - if (!(tp->dev->features & NETIF_F_RXHASH)) - return; - - rss_header_info = le16_to_cpu(descv3->RxDescNormalDDWord2.HeaderInfo); - - if (!(rss_header_info & RTL8125_RXS_RSS_L3_TYPE_MASK)) - return; - - skb_set_hash(skb, rtl8125_get_rx_desc_hash(tp, descv3), - (RTL8125_RXS_RSS_L4_TYPE_MASK & rss_header_info) ? - PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3); -} - -void rtl8125_disable_rss(struct rtl8125_private *tp) -{ - RTL_W32(tp, RSS_CTRL_8125, 0x00); -} - -void _rtl8125_config_rss(struct rtl8125_private *tp) -{ - _rtl8125_set_rss_hash_opt(tp); - - rtl8125_store_reta(tp); - - rtl8125_store_rss_key(tp); -} - -void rtl8125_config_rss(struct rtl8125_private *tp) -{ - if (!tp->EnableRss) { - rtl8125_disable_rss(tp); - return; - } - - _rtl8125_config_rss(tp); -} - -void rtl8125_init_rss(struct rtl8125_private *tp) -{ - int i; - - for (i = 0; i < rtl8125_rss_indir_tbl_entries(tp); i++) - tp->rss_indir_tbl[i] = ethtool_rxfh_indir_default(i, tp->num_rx_rings); - - netdev_rss_key_fill(tp->rss_key, RTL8125_RSS_KEY_SIZE); -} diff --git a/r8125/src/r8125_rss.h b/r8125/src/r8125_rss.h deleted file mode 100644 index d77752816..000000000 --- a/r8125/src/r8125_rss.h +++ /dev/null @@ -1,66 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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_rtl8125_RSS_H -#define _LINUX_rtl8125_RSS_H - -#include -#include - -enum rtl8125_rss_flag { - RTL_8125_RSS_FLAG_HASH_UDP_IPV4 = (1 << 0), - RTL_8125_RSS_FLAG_HASH_UDP_IPV6 = (1 << 1), -}; - -struct rtl8125_private; - -int rtl8125_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, - u32 *rule_locs); -int rtl8125_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd); -u32 rtl8125_get_rxfh_key_size(struct net_device *netdev); -u32 rtl8125_rss_indir_size(struct net_device *netdev); -int rtl8125_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, - u8 *hfunc); -int rtl8125_set_rxfh(struct net_device *netdev, const u32 *indir, - const u8 *key, const u8 hfunc); -void rtl8125_rx_hash(struct rtl8125_private *tp, - struct RxDescV3 *descv3, - struct sk_buff *skb); -void _rtl8125_config_rss(struct rtl8125_private *tp); -void rtl8125_config_rss(struct rtl8125_private *tp); -void rtl8125_init_rss(struct rtl8125_private *tp); -u32 rtl8125_rss_indir_tbl_entries(struct rtl8125_private *tp); -void rtl8125_disable_rss(struct rtl8125_private *tp); - -#endif /* _LINUX_rtl8125_RSS_H */ diff --git a/r8125/src/rtl_eeprom.c b/r8125/src/rtl_eeprom.c deleted file mode 100644 index 866ae5f33..000000000 --- a/r8125/src/rtl_eeprom.c +++ /dev/null @@ -1,289 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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 -#include -#include -#include -#include -#include - -#include - -#include "r8125.h" -#include "rtl_eeprom.h" - -//------------------------------------------------------------------- -//rtl8125_eeprom_type(): -// tell the eeprom type -//return value: -// 0: the eeprom type is 93C46 -// 1: the eeprom type is 93C56 or 93C66 -//------------------------------------------------------------------- -void rtl8125_eeprom_type(struct rtl8125_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 = rtl8125_eeprom_read_sc(tp, 0); - -out_no_eeprom: - if ((magic != 0x8129) && (magic != 0x8128)) { - tp->eeprom_type = EEPROM_TYPE_NONE; - tp->eeprom_len = 0; - } -} - -void rtl8125_eeprom_cleanup(struct rtl8125_private *tp) -{ - u8 x; - - x = RTL_R8(tp, Cfg9346); - x &= ~(Cfg9346_EEDI | Cfg9346_EECS); - - RTL_W8(tp, Cfg9346, x); - - rtl8125_raise_clock(tp, &x); - rtl8125_lower_clock(tp, &x); -} - -int rtl8125_eeprom_cmd_done(struct rtl8125_private *tp) -{ - u8 x; - int i; - - rtl8125_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; -} - -//------------------------------------------------------------------- -//rtl8125_eeprom_read_sc(): -// read one word from eeprom -//------------------------------------------------------------------- -u16 rtl8125_eeprom_read_sc(struct rtl8125_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); - - rtl8125_shift_out_bits(tp, RTL_EEPROM_READ_OPCODE, 3); - rtl8125_shift_out_bits(tp, reg, addr_sz); - - data = rtl8125_shift_in_bits(tp); - - rtl8125_eeprom_cleanup(tp); - - RTL_W8(tp, Cfg9346, 0); - - return data; -} - -//------------------------------------------------------------------- -//rtl8125_eeprom_write_sc(): -// write one word to a specific address in the eeprom -//------------------------------------------------------------------- -void rtl8125_eeprom_write_sc(struct rtl8125_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); - - rtl8125_shift_out_bits(tp, RTL_EEPROM_EWEN_OPCODE, 5); - rtl8125_shift_out_bits(tp, reg, w_dummy_addr); - rtl8125_stand_by(tp); - - rtl8125_shift_out_bits(tp, RTL_EEPROM_ERASE_OPCODE, 3); - rtl8125_shift_out_bits(tp, reg, addr_sz); - if (rtl8125_eeprom_cmd_done(tp) < 0) { - return; - } - rtl8125_stand_by(tp); - - rtl8125_shift_out_bits(tp, RTL_EEPROM_WRITE_OPCODE, 3); - rtl8125_shift_out_bits(tp, reg, addr_sz); - rtl8125_shift_out_bits(tp, data, 16); - if (rtl8125_eeprom_cmd_done(tp) < 0) { - return; - } - rtl8125_stand_by(tp); - - rtl8125_shift_out_bits(tp, RTL_EEPROM_EWDS_OPCODE, 5); - rtl8125_shift_out_bits(tp, reg, w_dummy_addr); - - rtl8125_eeprom_cleanup(tp); - RTL_W8(tp, Cfg9346, 0); -} - -void rtl8125_raise_clock(struct rtl8125_private *tp, u8 *x) -{ - *x = *x | Cfg9346_EESK; - RTL_W8(tp, Cfg9346, *x); - udelay(RTL_CLOCK_RATE); -} - -void rtl8125_lower_clock(struct rtl8125_private *tp, u8 *x) -{ - - *x = *x & ~Cfg9346_EESK; - RTL_W8(tp, Cfg9346, *x); - udelay(RTL_CLOCK_RATE); -} - -void rtl8125_shift_out_bits(struct rtl8125_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); - rtl8125_raise_clock(tp, &x); - rtl8125_lower_clock(tp, &x); - mask = mask >> 1; - } while(mask); - - x &= ~Cfg9346_EEDI; - RTL_W8(tp, Cfg9346, x); -} - -u16 rtl8125_shift_in_bits(struct rtl8125_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; - rtl8125_raise_clock(tp, &x); - - x = RTL_R8(tp, Cfg9346); - x &= ~Cfg9346_EEDI; - - if (x & Cfg9346_EEDO) - d |= 1; - - rtl8125_lower_clock(tp, &x); - } - - return d; -} - -void rtl8125_stand_by(struct rtl8125_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 rtl8125_set_eeprom_sel_low(struct rtl8125_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/r8125/src/rtl_eeprom.h b/r8125/src/rtl_eeprom.h deleted file mode 100644 index b0c4a050b..000000000 --- a/r8125/src/rtl_eeprom.h +++ /dev/null @@ -1,53 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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 rtl8125_eeprom_type(struct rtl8125_private *tp); -void rtl8125_eeprom_cleanup(struct rtl8125_private *tp); -u16 rtl8125_eeprom_read_sc(struct rtl8125_private *tp, u16 reg); -void rtl8125_eeprom_write_sc(struct rtl8125_private *tp, u16 reg, u16 data); -void rtl8125_shift_out_bits(struct rtl8125_private *tp, int data, int count); -u16 rtl8125_shift_in_bits(struct rtl8125_private *tp); -void rtl8125_raise_clock(struct rtl8125_private *tp, u8 *x); -void rtl8125_lower_clock(struct rtl8125_private *tp, u8 *x); -void rtl8125_stand_by(struct rtl8125_private *tp); -void rtl8125_set_eeprom_sel_low(struct rtl8125_private *tp); diff --git a/r8125/src/rtltool.c b/r8125/src/rtltool.c deleted file mode 100644 index a9c46ea74..000000000 --- a/r8125/src/rtltool.c +++ /dev/null @@ -1,359 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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 -#include -#include -#include -#include -#include -#include -#include -#include "r8125.h" -#include "rtl_eeprom.h" -#include "rtltool.h" - -int rtl8125_tool_ioctl(struct rtl8125_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 (!capable(CAP_NET_ADMIN)) - return -EPERM; - - 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 (!capable(CAP_NET_ADMIN)) - return -EPERM; - - 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: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - spin_lock_irqsave(&tp->lock, flags); - my_cmd.data = rtl8125_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: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - spin_lock_irqsave(&tp->lock, flags); - rtl8125_mdio_prot_write(tp, my_cmd.offset, my_cmd.data); - spin_unlock_irqrestore(&tp->lock, flags); - break; - - case RTLTOOL_READ_EPHY: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - spin_lock_irqsave(&tp->lock, flags); - my_cmd.data = rtl8125_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: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - spin_lock_irqsave(&tp->lock, flags); - rtl8125_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 = rtl8125_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 (!capable(CAP_NET_ADMIN)) - return -EPERM; - - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - if (my_cmd.len==1 || my_cmd.len==2 || my_cmd.len==4) { - spin_lock_irqsave(&tp->lock, flags); - rtl8125_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: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - 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 (!capable(CAP_NET_ADMIN)) - return -EPERM; - - 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: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - spin_lock_irqsave(&tp->lock, flags); - my_cmd.data = rtl8125_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: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - spin_lock_irqsave(&tp->lock, flags); - rtl8125_eeprom_write_sc(tp, my_cmd.offset, my_cmd.data); - spin_unlock_irqrestore(&tp->lock, flags); - break; - - case RTL_READ_OOB_MAC: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - spin_lock_irqsave(&tp->lock, flags); - rtl8125_oob_mutex_lock(tp); - my_cmd.data = rtl8125_ocp_read(tp, my_cmd.offset, 4); - rtl8125_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 (!capable(CAP_NET_ADMIN)) - return -EPERM; - - if (my_cmd.len == 0 || my_cmd.len > 4) - return -EOPNOTSUPP; - - spin_lock_irqsave(&tp->lock, flags); - rtl8125_oob_mutex_lock(tp); - rtl8125_ocp_write(tp, my_cmd.offset, my_cmd.len, my_cmd.data); - rtl8125_oob_mutex_unlock(tp); - spin_unlock_irqrestore(&tp->lock, flags); - break; - - case RTL_ENABLE_PCI_DIAG: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - 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: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - 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 (!capable(CAP_NET_ADMIN)) - return -EPERM; - - if (my_cmd.offset % 2) - return -EOPNOTSUPP; - - spin_lock_irqsave(&tp->lock, flags); - my_cmd.data = rtl8125_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 (!capable(CAP_NET_ADMIN)) - return -EPERM; - - if ((my_cmd.offset % 2) || (my_cmd.len != 2)) - return -EOPNOTSUPP; - - spin_lock_irqsave(&tp->lock, flags); - rtl8125_mac_ocp_write(tp, my_cmd.offset, (u16)my_cmd.data); - spin_unlock_irqrestore(&tp->lock, flags); - break; - - case RTL_DIRECT_READ_PHY_OCP: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - spin_lock_irqsave(&tp->lock, flags); - my_cmd.data = rtl8125_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: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - spin_lock_irqsave(&tp->lock, flags); - rtl8125_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/r8125/src/rtltool.h b/r8125/src/rtltool.h deleted file mode 100644 index fc8a10ca8..000000000 --- a/r8125/src/rtltool.h +++ /dev/null @@ -1,86 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* -################################################################################ -# -# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet -# controllers with PCI-Express interface. -# -# Copyright(c) 2021 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 . -# -# Author: -# Realtek NIC software team -# 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 rtl8125_tool_ioctl(struct rtl8125_private *tp, struct ifreq *ifr); -#endif - -#endif /* _LINUX_RTLTOOL_H */ diff --git a/r8152/Makefile b/r8152/Makefile new file mode 100644 index 000000000..da66898e8 --- /dev/null +++ b/r8152/Makefile @@ -0,0 +1,55 @@ +# +# Download realtek r8152 linux driver from official site: +# [https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-usb-3-0-software] +# + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=r8152 +PKG_VERSION:=2.15 +PKG_RELEASE:=2 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/1715173329/realtek-r8152-linux/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=dc8a06ed6ff397029c396a7e83476f1bf9541c4f927a4dbac8810c6ce014f8ca + +PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/realtek-$(PKG_NAME)-linux-$(PKG_VERSION) + +PKG_BUILD_PARALLEL:=1 + +PKG_MAINTAINER:=Tianling Shen + +include $(INCLUDE_DIR)/package.mk + +define KernelPackage/usb-net-rtl8152-vendor + TITLE:=Kernel module for USB-to-Ethernet Realtek convertors + SUBMENU:=USB Support + VERSION:=$(LINUX_VERSION)+$(PKG_VERSION)-$(BOARD)-$(PKG_RELEASE) + DEPENDS:=@TARGET_x86 +kmod-usb-net + CONFLICTS:=kmod-usb-net-rtl8152 + FILES:= $(PKG_BUILD_DIR)/r8152.ko + AUTOLOAD:=$(call AutoProbe,r8152) +endef + +define KernelPackage/usb-net-rtl8152-vendor/description + Kernel module for Realtek RTL8152/RTL8153 Based USB Ethernet Adapters +endef + +R8152_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) $(PKG_JOBS) $(R8152_MAKEOPTS) modules +endef + +$(eval $(call KernelPackage,usb-net-rtl8152-vendor)) diff --git a/r8152/patches/010-compat-skb_mark_not_on_list-was-backported-since-ker.patch b/r8152/patches/010-compat-skb_mark_not_on_list-was-backported-since-ker.patch new file mode 100644 index 000000000..fdbf84253 --- /dev/null +++ b/r8152/patches/010-compat-skb_mark_not_on_list-was-backported-since-ker.patch @@ -0,0 +1,26 @@ +From b61b90b9aea30b944fc51b891dab3ab5eb30980c Mon Sep 17 00:00:00 2001 +From: Tianling Shen +Date: Sat, 29 May 2021 00:46:25 +0800 +Subject: [PATCH] compat: skb_mark_not_on_list was backported since kernel + 4.14.217 and 4.19.10 + +Signed-off-by: Tianling Shen +--- + compatibility.h | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/compatibility.h ++++ b/compatibility.h +@@ -548,10 +548,12 @@ + linkmode_clear_bit(nr, addr); + } + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,217) || LINUX_VERSION_CODE < KERNEL_VERSION(4,19,10) + static inline void skb_mark_not_on_list(struct sk_buff *skb) + { + skb->next = NULL; + } ++#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(4,14,217) || LINUX_VERSION_CODE < KERNEL_VERSION(4,19,10) */ + #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0) */ + #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,1,0) */ + #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) */ diff --git a/r8152/patches/100-add-LED-configuration-from-OF.patch b/r8152/patches/100-add-LED-configuration-from-OF.patch new file mode 100644 index 000000000..38d885d72 --- /dev/null +++ b/r8152/patches/100-add-LED-configuration-from-OF.patch @@ -0,0 +1,74 @@ +From 82985725e071f2a5735052f18e109a32aeac3a0b Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Sun, 26 Jul 2020 02:38:31 +0200 +Subject: [PATCH] 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 +--- + r8152.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +--- a/r8152.c ++++ b/r8152.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -9804,6 +9805,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; +@@ -9865,6 +9882,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) +@@ -10008,6 +10027,8 @@ static void r8153_init(struct r8152 *tp) + tp->coalesce = COALESCE_SLOW; + break; + } ++ ++ r8152_led_configuration(tp); + } + + static void r8153b_init(struct r8152 *tp) +@@ -10098,6 +10119,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/r8168/Makefile b/r8168/Makefile new file mode 100644 index 000000000..fd5977a5b --- /dev/null +++ b/r8168/Makefile @@ -0,0 +1,54 @@ +# +# Download realtek r8168 linux driver from official site: +# [https://www.realtek.com/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-pci-express-software] +# + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=r8168 +PKG_VERSION:=8.049.02 +PKG_RELEASE:=$(AUTORELEAE) + +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://github.com/BROBIRD/openwrt-r8168.git +PKG_SOURCE_DATE:=2021-10-08 +PKG_SOURCE_VERSION:=2b969c15afe403a685fc7ee069620782241e3ad6 +PKG_MIRROR_HASH:=e4632c10d460f005eff76da8a183d7ff0c8819b0d099872589b7b06a9b8d9952 + +PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) + +MAKE_PATH:=src + +include $(INCLUDE_DIR)/package.mk + +define KernelPackage/r8168 + TITLE:=Driver for Realtek r8168 chipsets + SUBMENU:=Network Devices + VERSION:=$(LINUX_VERSION)+$(PKG_VERSION)-$(BOARD)-$(PKG_RELEASE) + FILES:= $(PKG_BUILD_DIR)/src/r8168.ko + AUTOLOAD:=$(call AutoProbe,r8168) + CONFLICTS:=kmod-r8169 +endef + +define Package/r8168/description + This package contains a driver for Realtek r8168 chipsets. +endef + +R8168_MAKEOPTS= -C $(PKG_BUILD_DIR)/src \ + 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 +endef + +$(eval $(call KernelPackage,r8168)) diff --git a/r8168/patches/001-r8168-add-LED-configuration-from-OF.patch b/r8168/patches/001-r8168-add-LED-configuration-from-OF.patch new file mode 100644 index 000000000..62a352dd8 --- /dev/null +++ b/r8168/patches/001-r8168-add-LED-configuration-from-OF.patch @@ -0,0 +1,42 @@ +--- a/src/r8168_n.c ++++ b/src/r8168_n.c +@@ -47,6 +47,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -23482,6 +23483,22 @@ rtl8168_set_bios_setting(struct net_devi + } + } + ++static int rtl8168_led_configuration(struct rtl8168_private *tp) ++{ ++ u32 led_data; ++ int ret; ++ ++ ret = of_property_read_u32(tp->pci_dev->dev.of_node, ++ "realtek,led-data", &led_data); ++ ++ if (ret) ++ return ret; ++ ++ RTL_W16(tp, CustomLED, led_data); ++ ++ return 0; ++} ++ + static void + rtl8168_init_software_variable(struct net_device *dev) + { +@@ -24000,6 +24017,8 @@ rtl8168_init_software_variable(struct ne + tp->NotWrMcuPatchCode = TRUE; + } + ++ rtl8168_led_configuration(tp); ++ + tp->NicCustLedValue = RTL_R16(tp, CustomLED); + + rtl8168_get_hw_wol(dev); From 308bbb5b347bd31cc723d7b047ce1a47b18e2f3a Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Fri, 26 Nov 2021 19:36:58 +0100 Subject: [PATCH 02/63] Update v2ray URL --- v2ray-core/Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/v2ray-core/Makefile b/v2ray-core/Makefile index 48f2f8197..f17adbf69 100644 --- a/v2ray-core/Makefile +++ b/v2ray-core/Makefile @@ -12,8 +12,9 @@ PKG_NAME:=v2ray-core PKG_VERSION:=4.43.0 PKG_RELEASE:=1 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://github.com/v2fly/v2ray-core/archive/v$(PKG_VERSION) +#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE:=v$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://github.com/v2fly/v2ray-core/archive/refs/tags/ PKG_HASH:=f27b8fe8e1e102b0297339ee368c8b650fde0f949e0d90e1229ff6744f99ba0f PKG_LICENSE:=MIT From caab49cc2670083689d1380a92053e5b31fdd5af Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Fri, 26 Nov 2021 19:37:56 +0100 Subject: [PATCH 03/63] Remove r8152 driver --- r8152/Makefile | 55 -------------- ...not_on_list-was-backported-since-ker.patch | 26 ------- .../100-add-LED-configuration-from-OF.patch | 74 ------------------- 3 files changed, 155 deletions(-) delete mode 100644 r8152/Makefile delete mode 100644 r8152/patches/010-compat-skb_mark_not_on_list-was-backported-since-ker.patch delete mode 100644 r8152/patches/100-add-LED-configuration-from-OF.patch diff --git a/r8152/Makefile b/r8152/Makefile deleted file mode 100644 index da66898e8..000000000 --- a/r8152/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# -# Download realtek r8152 linux driver from official site: -# [https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-usb-3-0-software] -# - -include $(TOPDIR)/rules.mk -include $(INCLUDE_DIR)/kernel.mk - -PKG_NAME:=r8152 -PKG_VERSION:=2.15 -PKG_RELEASE:=2 - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://codeload.github.com/1715173329/realtek-r8152-linux/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=dc8a06ed6ff397029c396a7e83476f1bf9541c4f927a4dbac8810c6ce014f8ca - -PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/realtek-$(PKG_NAME)-linux-$(PKG_VERSION) - -PKG_BUILD_PARALLEL:=1 - -PKG_MAINTAINER:=Tianling Shen - -include $(INCLUDE_DIR)/package.mk - -define KernelPackage/usb-net-rtl8152-vendor - TITLE:=Kernel module for USB-to-Ethernet Realtek convertors - SUBMENU:=USB Support - VERSION:=$(LINUX_VERSION)+$(PKG_VERSION)-$(BOARD)-$(PKG_RELEASE) - DEPENDS:=@TARGET_x86 +kmod-usb-net - CONFLICTS:=kmod-usb-net-rtl8152 - FILES:= $(PKG_BUILD_DIR)/r8152.ko - AUTOLOAD:=$(call AutoProbe,r8152) -endef - -define KernelPackage/usb-net-rtl8152-vendor/description - Kernel module for Realtek RTL8152/RTL8153 Based USB Ethernet Adapters -endef - -R8152_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) $(PKG_JOBS) $(R8152_MAKEOPTS) modules -endef - -$(eval $(call KernelPackage,usb-net-rtl8152-vendor)) diff --git a/r8152/patches/010-compat-skb_mark_not_on_list-was-backported-since-ker.patch b/r8152/patches/010-compat-skb_mark_not_on_list-was-backported-since-ker.patch deleted file mode 100644 index fdbf84253..000000000 --- a/r8152/patches/010-compat-skb_mark_not_on_list-was-backported-since-ker.patch +++ /dev/null @@ -1,26 +0,0 @@ -From b61b90b9aea30b944fc51b891dab3ab5eb30980c Mon Sep 17 00:00:00 2001 -From: Tianling Shen -Date: Sat, 29 May 2021 00:46:25 +0800 -Subject: [PATCH] compat: skb_mark_not_on_list was backported since kernel - 4.14.217 and 4.19.10 - -Signed-off-by: Tianling Shen ---- - compatibility.h | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/compatibility.h -+++ b/compatibility.h -@@ -548,10 +548,12 @@ - linkmode_clear_bit(nr, addr); - } - -+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,217) || LINUX_VERSION_CODE < KERNEL_VERSION(4,19,10) - static inline void skb_mark_not_on_list(struct sk_buff *skb) - { - skb->next = NULL; - } -+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(4,14,217) || LINUX_VERSION_CODE < KERNEL_VERSION(4,19,10) */ - #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0) */ - #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,1,0) */ - #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) */ diff --git a/r8152/patches/100-add-LED-configuration-from-OF.patch b/r8152/patches/100-add-LED-configuration-from-OF.patch deleted file mode 100644 index 38d885d72..000000000 --- a/r8152/patches/100-add-LED-configuration-from-OF.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 82985725e071f2a5735052f18e109a32aeac3a0b Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Sun, 26 Jul 2020 02:38:31 +0200 -Subject: [PATCH] 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 ---- - r8152.c | 23 +++++++++++++++++++++++ - 1 file changed, 23 insertions(+) - ---- a/r8152.c -+++ b/r8152.c -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -9804,6 +9805,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; -@@ -9865,6 +9882,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) -@@ -10008,6 +10027,8 @@ static void r8153_init(struct r8152 *tp) - tp->coalesce = COALESCE_SLOW; - break; - } -+ -+ r8152_led_configuration(tp); - } - - static void r8153b_init(struct r8152 *tp) -@@ -10098,6 +10119,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) From 20e8dce69f83b50bf994e75147b03ead6f18d4b2 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Tue, 30 Nov 2021 17:43:47 +0100 Subject: [PATCH 04/63] Enable SQM by default on interfaces --- .../luasrc/controller/openmptcprouter.lua | 2 +- openmptcprouter/files/etc/uci-defaults/2040-omr-sqm | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua index 27bae5b7f..58d354013 100644 --- a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua +++ b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua @@ -201,7 +201,7 @@ function wizard_add() ucic:set("sqm","wan" .. i,"script","simple.qos") ucic:set("sqm","wan" .. i,"qdisc_advanced","0") ucic:set("sqm","wan" .. i,"linklayer","none") - ucic:set("sqm","wan" .. i,"enabled","0") + ucic:set("sqm","wan" .. i,"enabled","1") ucic:set("sqm","wan" .. i,"debug_logging","0") ucic:set("sqm","wan" .. i,"verbosity","5") ucic:set("sqm","wan" .. i,"download","0") diff --git a/openmptcprouter/files/etc/uci-defaults/2040-omr-sqm b/openmptcprouter/files/etc/uci-defaults/2040-omr-sqm index 030400bb9..1054b39b9 100755 --- a/openmptcprouter/files/etc/uci-defaults/2040-omr-sqm +++ b/openmptcprouter/files/etc/uci-defaults/2040-omr-sqm @@ -10,7 +10,7 @@ if [ "$(uci -q get openmptcprouter.settings.version)" = "" ]; then set sqm.wan1.script="simple.qos" set sqm.wan1.qdisc_advanced='0' set sqm.wan1.linklayer='none' - set sqm.wan1.enabled='0' + set sqm.wan1.enabled='1' set sqm.wan1.interface="${wan1}" set sqm.wan1.download='0' set sqm.wan1.upload='0' @@ -23,7 +23,7 @@ if [ "$(uci -q get openmptcprouter.settings.version)" = "" ]; then set sqm.wan2.script="simple.qos" set sqm.wan2.qdisc_advanced='0' set sqm.wan2.linklayer='none' - set sqm.wan2.enabled='0' + set sqm.wan2.enabled='1' set sqm.wan2.interface="${wan2}" set sqm.wan2.download='0' set sqm.wan2.upload='0' @@ -41,7 +41,7 @@ if [ "$(uci -q get openmptcprouter.settings.version)" = "" ]; then set sqm.wan3.script="simple.qos" set sqm.wan3.qdisc_advanced='0' set sqm.wan3.linklayer='none' - set sqm.wan3.enabled='0' + set sqm.wan3.enabled='1' set sqm.wan3.interface="${wan3}" set sqm.wan3.download='0' set sqm.wan3.upload='0' @@ -60,7 +60,7 @@ if [ "$(uci -q get openmptcprouter.settings.version)" = "" ]; then set sqm.wan4.script="simple.qos" set sqm.wan4.qdisc_advanced='0' set sqm.wan4.linklayer='none' - set sqm.wan4.enabled='0' + set sqm.wan4.enabled='1' set sqm.wan4.interface="${wan4}" set sqm.wan4.download='0' set sqm.wan4.upload='0' From e9a628fae5fa5b5f3ad37fae60b1f11f089d1cfc Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Tue, 30 Nov 2021 17:44:33 +0100 Subject: [PATCH 05/63] Remove iptables-mod-fullconenat that doesn't compile with 5.15 for now --- iptables-mod-fullconenat/Makefile | 65 ------------------- iptables-mod-fullconenat/README.md | 27 -------- iptables-mod-fullconenat/files/Makefile | 7 -- .../patches/000-printk.patch | 17 ----- 4 files changed, 116 deletions(-) delete mode 100644 iptables-mod-fullconenat/Makefile delete mode 100644 iptables-mod-fullconenat/README.md delete mode 100644 iptables-mod-fullconenat/files/Makefile delete mode 100644 iptables-mod-fullconenat/patches/000-printk.patch diff --git a/iptables-mod-fullconenat/Makefile b/iptables-mod-fullconenat/Makefile deleted file mode 100644 index 279c1eb9a..000000000 --- a/iptables-mod-fullconenat/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -# -# Copyright (C) 2018 Chion Tang -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk -include $(INCLUDE_DIR)/kernel.mk - -PKG_NAME:=fullconenat -PKG_RELEASE:=1 - -PKG_SOURCE_DATE:=2019-10-21 -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL:=https://github.com/Chion82/netfilter-full-cone-nat.git -PKG_SOURCE_VERSION:=0cf3b48fd7d2fa81d0297d1fff12bbd0580fc435 - -PKG_LICENSE:=GPL-2.0 -PKG_LICENSE_FILES:=LICENSE - -include $(INCLUDE_DIR)/package.mk - -define Package/iptables-mod-fullconenat - SUBMENU:=Firewall - SECTION:=net - CATEGORY:=Network - TITLE:=FULLCONENAT iptables extension - DEPENDS:=+iptables +kmod-ipt-fullconenat - MAINTAINER:=Chion Tang -endef - -define Package/iptables-mod-fullconenat/install - $(INSTALL_DIR) $(1)/usr/lib/iptables - $(INSTALL_BIN) $(PKG_BUILD_DIR)/libipt_FULLCONENAT.so $(1)/usr/lib/iptables -endef - -define KernelPackage/ipt-fullconenat - SUBMENU:=Netfilter Extensions - TITLE:=FULLCONENAT netfilter module - DEPENDS:=+kmod-nf-ipt +kmod-nf-nat - MAINTAINER:=Chion Tang - KCONFIG:=CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CONNTRACK_CHAIN_EVENTS=y - FILES:=$(PKG_BUILD_DIR)/xt_FULLCONENAT.ko -endef - -include $(INCLUDE_DIR)/kernel-defaults.mk - -define Build/Prepare - $(call Build/Prepare/Default) - $(CP) ./files/Makefile $(PKG_BUILD_DIR)/ -endef - -define Build/Compile - +$(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" \ - CROSS_COMPILE="$(TARGET_CROSS)" \ - ARCH="$(LINUX_KARCH)" \ - M="$(PKG_BUILD_DIR)" \ - EXTRA_CFLAGS="$(BUILDFLAGS)" \ - modules - $(call Build/Compile/Default) -endef - -$(eval $(call BuildPackage,iptables-mod-fullconenat)) -$(eval $(call KernelPackage,ipt-fullconenat)) diff --git a/iptables-mod-fullconenat/README.md b/iptables-mod-fullconenat/README.md deleted file mode 100644 index 4d4909802..000000000 --- a/iptables-mod-fullconenat/README.md +++ /dev/null @@ -1,27 +0,0 @@ -## Netfilter and iptables extension for [FULLCONENAT](https://github.com/Chion82/netfilter-full-cone-nat) target ported to OpenWrt. - -Compile ---- -``` -# cd to OpenWrt source path -# Clone this repo -git clone -b master --single-branch https://github.com/LGA1150/openwrt-fullconenat package/fullconenat -# Select Network -> Firewall -> iptables-mod-fullconenat -make menuconfig -# Compile -make V=s -``` - -Usage ---- -You can apply [this patch](https://github.com/LGA1150/fullconenat-fw3-patch) to OpenWrt's Firewall3 (Recommended). - -Or manually add the following rules to `/etc/firewall.user` -``` -iptables -t nat -A zone_wan_prerouting -j FULLCONENAT -iptables -t nat -A zone_wan_postrouting -j FULLCONENAT -``` - -Workaround for conflicting with module `nf_conntrack_netlink` ---- -This module uses conntrack events to register a callback function. In the same netns, only one callback method can be registered, that causes conflicts with `nf_conntrack_netlink`, which also uses conntrack events. Qualcomm Shortcut FE has introduced a patch to allow multiple callbacks to be registered. To apply, put [this patch](https://github.com/coolsnowwolf/lede/blob/master/target/linux/generic/hack-4.14/952-net-conntrack-events-support-multiple-registrant.patch) into `target/linux/generic/hack-4.14`. diff --git a/iptables-mod-fullconenat/files/Makefile b/iptables-mod-fullconenat/files/Makefile deleted file mode 100644 index da52a2a4e..000000000 --- a/iptables-mod-fullconenat/files/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -libipt_FULLCONENAT.so: libipt_FULLCONENAT.o - $(CC) -shared -lxtables -o $@ $^; -libipt_FULLCONENAT.o: libipt_FULLCONENAT.c - $(CC) ${CFLAGS} -fPIC -D_INIT=$*_init -c -o $@ $<; - -obj-m += xt_FULLCONENAT.o - diff --git a/iptables-mod-fullconenat/patches/000-printk.patch b/iptables-mod-fullconenat/patches/000-printk.patch deleted file mode 100644 index 4e764c5d6..000000000 --- a/iptables-mod-fullconenat/patches/000-printk.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/xt_FULLCONENAT.c b/xt_FULLCONENAT.c -index 9e52eba..8658c5f 100644 ---- a/xt_FULLCONENAT.c -+++ b/xt_FULLCONENAT.c -@@ -702,9 +702,11 @@ static struct xt_target tg_reg[] __read_mostly = { - - static int __init fullconenat_tg_init(void) - { -+ printk(KERN_INFO "xt_FULLCONENAT: RFC3489 Full Cone NAT module\n" -+ "xt_FULLCONENAT: Copyright (C) 2018 Chion Tang \n"); - wq = create_singlethread_workqueue("xt_FULLCONENAT"); - if (wq == NULL) { -- printk("xt_FULLCONENAT: warning: failed to create workqueue\n"); -+ printk(KERN_WARNING "xt_FULLCONENAT: warning: failed to create workqueue\n"); - } - - return xt_register_targets(tg_reg, ARRAY_SIZE(tg_reg)); From 7b1f07935b4ef1eb9f19a4f6026aaf6ebc37348b Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Tue, 30 Nov 2021 17:45:08 +0100 Subject: [PATCH 06/63] Make sure ip doesn't have subnet --- mptcp/files/etc/init.d/mptcp | 1 + 1 file changed, 1 insertion(+) diff --git a/mptcp/files/etc/init.d/mptcp b/mptcp/files/etc/init.d/mptcp index 7dd629733..383650953 100755 --- a/mptcp/files/etc/init.d/mptcp +++ b/mptcp/files/etc/init.d/mptcp @@ -213,6 +213,7 @@ interface_multipath_settings() { [ -n "$netmask" ] && [ "$(echo $netmask | grep '/')" != "" ] && netmask="" [ -z "$netmask" ] && netmask=$(ip -4 addr show dev $iface | grep peer | awk '{print $4}' | cut -d/ -f2 | tr -d "\n") [ -z "$netmask" ] && netmask=$(ip -4 addr show dev $iface | grep inet | awk '{print $2}' | cut -d/ -f2 | tr -d "\n") + [ -n "$ipaddr" ] && ipaddr=$(echo $ipaddr | cut -d/ -f1 | tr -d "\n") [ -n "$ipaddr" ] && [ -n "$netmask" ] && netmask=`ipcalc.sh $ipaddr $netmask | sed -n '/PREFIX=/{;s/.*=//;s/ .*//;p;}'` [ -n "$ipaddr" ] && [ -n "$netmask" ] && network=`ipcalc.sh $ipaddr $netmask | sed -n '/NETWORK=/{;s/.*=//;s/ .*//;p;}'` fi From a64df3c0745bcd7980e36a2f1b37b49198865641 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Tue, 30 Nov 2021 17:45:26 +0100 Subject: [PATCH 07/63] Increase log in post-tracking --- .../files/usr/share/omr/post-tracking.d/post-tracking | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking index 4e2e52212..964d78ea5 100755 --- a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking +++ b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking @@ -597,7 +597,7 @@ del_server_route() { remove_route() { local serverip="$1" [ -n "$serverip" ] && serverip="$(resolveip -4 -t 5 $serverip | head -n 1 | tr -d '\n')" - [ -n "$serverip" ] && _log "Delete default route via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE" + [ -n "$serverip" ] && _log "Delete default route to $serverip via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE" local metric metric=$(uci -q get network.$OMR_TRACKER_INTERFACE.metric) [ -n "$metric" ] && [ -n "$OMR_TRACKER_DEVICE" ] && [ -n "$serverip" ] && [ -n "$(ip route show $serverip dev $OMR_TRACKER_DEVICE metric $metric)" ] && ip route del $serverip dev $OMR_TRACKER_DEVICE metric $metric >/dev/null 2>&1 @@ -617,11 +617,11 @@ del_server_route6() { remove_route() { local serverip="$1" [ -n "$serverip" ] && serverip="$(resolveip -6 -t 5 $serverip | head -n 1 | tr -d '\n')" - [ -n "$serverip" ] && _log "Delete default route via $OMR_TRACKER_DEVICE_GATEWAY6 dev $OMR_TRACKER_DEVICE" + [ -n "$serverip" ] && _log "Delete default route to $serverip via $OMR_TRACKER_DEVICE_GATEWAY6 dev $OMR_TRACKER_DEVICE" local metric metric=$(uci -q get network.$OMR_TRACKER_INTERFACE.metric) - [ -n "$OMR_TRACKER_DEVICE" ] && [ -n "$metric" ] && [ -n "$(ip -6 route show $serverip dev $OMR_TRACKER_DEVICE metric $metric)" ] && ip -6 route del $serverip dev $OMR_TRACKER_DEVICE metric $metric >/dev/null 2>&1 - [ -n "$OMR_TRACKER_DEVICE" ] && [ -n "$metric" ] && [ -n "$(ip -6 route show $serverip dev $OMR_TRACKER_DEVICE)" ] && ip -6 route del $serverip dev $OMR_TRACKER_DEVICE >/dev/null 2>&1 + [ -n "$OMR_TRACKER_DEVICE" ] && [ -n "$metric" ] && [ -n "$serverip"] && [ -n "$(ip -6 route show $serverip dev $OMR_TRACKER_DEVICE metric $metric)" ] && ip -6 route del $serverip dev $OMR_TRACKER_DEVICE metric $metric >/dev/null 2>&1 + [ -n "$OMR_TRACKER_DEVICE" ] && [ -n "$metric" ] && [ -n "$serverip" ] && [ -n "$(ip -6 route show $serverip dev $OMR_TRACKER_DEVICE)" ] && ip -6 route del $serverip dev $OMR_TRACKER_DEVICE >/dev/null 2>&1 } config_list_foreach $server ip remove_route if [ -n "$OMR_TRACKER_DEVICE_GATEWAY6" ] && [ -n "$OMR_TRACKER_DEVICE" ]; then @@ -836,11 +836,13 @@ if [ "$OMR_TRACKER_INTERFACE" = "glorytun" ] || [ "$OMR_TRACKER_INTERFACE" = "om fi if ([ "$default_gw" != "$OMR_TRACKER_DEVICE_GATEWAY" ] || [ "$default_gw" = "" ]) && [ "$OMR_TRACKER_DEVICE_GATEWAY" != "" ]; then _log "Tunnel up : Replace default route by $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE" + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Current route: $(ip r)" ip route replace default scope global nexthop via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE 2>&1 >/dev/null if [ "$(pgrep openmptcprouter-vps)" = "" ]; then /etc/init.d/openmptcprouter-vps restart >/dev/null 2>&1 fi [ "$(uci -q get shadowsocks-libev.sss0.disabled)" != "1" ] && conntrack -D -p udp 2>&1 >/dev/null + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "New route: $(ip r)" fi # Set VPN MTU From 2e6ddfb810273f8ca8c020e8dbd130a530dc4507 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Tue, 30 Nov 2021 17:45:43 +0100 Subject: [PATCH 08/63] Compile for 5.15 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8345ecf8b..ab824216b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: OMR_TARGET: [bpi-r1, bpi-r2, bpi-r64, rpi2, rpi4, wrt32x, espressobin, r2s, rpi3, wrt3200acm, x86, x86_64, ubnt-erx, r4s, r7800] - OMR_KERNEL: [5.4, 5.14] + OMR_KERNEL: [5.4, 5.15] runs-on: ubuntu-latest continue-on-error: true From eb256970d279faffc900b60f6f9c8fd664d69f4c Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Fri, 3 Dec 2021 14:03:56 +0800 Subject: [PATCH 09/63] add modemmanager --- libqmi/Config.in | 16 + libqmi/Makefile | 109 +++++ modemmanager/Config.in | 21 + modemmanager/Makefile | 141 ++++++ modemmanager/README.md | 40 ++ modemmanager/files/25-modemmanager-net | 31 ++ modemmanager/files/25-modemmanager-tty | 16 + modemmanager/files/25-modemmanager-usb | 13 + modemmanager/files/25-modemmanager-wwan | 15 + modemmanager/files/modemmanager.common | 341 +++++++++++++++ modemmanager/files/modemmanager.init | 36 ++ modemmanager/files/modemmanager.proto | 550 ++++++++++++++++++++++++ 12 files changed, 1329 insertions(+) create mode 100644 libqmi/Config.in create mode 100644 libqmi/Makefile create mode 100644 modemmanager/Config.in create mode 100644 modemmanager/Makefile create mode 100644 modemmanager/README.md create mode 100644 modemmanager/files/25-modemmanager-net create mode 100644 modemmanager/files/25-modemmanager-tty create mode 100644 modemmanager/files/25-modemmanager-usb create mode 100644 modemmanager/files/25-modemmanager-wwan create mode 100644 modemmanager/files/modemmanager.common create mode 100755 modemmanager/files/modemmanager.init create mode 100755 modemmanager/files/modemmanager.proto diff --git a/libqmi/Config.in b/libqmi/Config.in new file mode 100644 index 000000000..6f35b7453 --- /dev/null +++ b/libqmi/Config.in @@ -0,0 +1,16 @@ +menu "Configuration" + depends on PACKAGE_libqmi + +config LIBQMI_WITH_MBIM_QMUX + bool "Include MBIM QMUX service support" + default y + help + Compile libqmi with QMI-over-MBIM support + +config LIBQMI_WITH_QRTR_GLIB + bool "Include QRTR support" + default y + help + Compile libqmi with QRTR support + +endmenu diff --git a/libqmi/Makefile b/libqmi/Makefile new file mode 100644 index 000000000..a17181959 --- /dev/null +++ b/libqmi/Makefile @@ -0,0 +1,109 @@ +# +# Copyright (C) 2016 Velocloud Inc. +# Copyright (C) 2016 Aleksander Morgado +# +# This is free software, licensed under the GNU General Public License v2. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libqmi +PKG_VERSION:=1.30.2 +PKG_RELEASE:=$(AUTORELEASE) + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=https://www.freedesktop.org/software/libqmi +PKG_HASH:=be01ece0ea2c2194cbea5744bf5aaf06c04ba5fb7ec7887a13116c76d114fedd + +PKG_MAINTAINER:=Nicholas Smith + +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/libqmi/config + source "$(SOURCE)/Config.in" +endef + +define Package/libqmi + SECTION:=libs + CATEGORY:=Libraries + DEPENDS:= \ + +glib2 \ + +LIBQMI_WITH_MBIM_QMUX:libmbim \ + +LIBQMI_WITH_QRTR_GLIB:libqrtr-glib + TITLE:=Helper library to talk to QMI enabled modems + URL:=https://www.freedesktop.org/wiki/Software/libqmi + LICENSE:=LGPL-2.0-or-later + LICENSE_FILES:=COPYING.LIB +endef + +define Package/libqmi/description + Helper library talk to QMI enabled modems. + Add qmi-utils for extra utilities. +endef + +define Package/qmi-utils + SECTION:=utils + CATEGORY:=Utilities + DEPENDS:=+libqmi + TITLE:=Utilities to talk to QMI enabled modems + URL:=https://www.freedesktop.org/wiki/Software/libqmi + LICENSE:=GPL-2.0-or-later + LICENSE_FILES:=COPYING +endef + +define Package/libqmi-utils/description + Utils to talk to QMI enabled modems +endef + +CONFIGURE_ARGS += \ + --disable-static \ + --disable-gtk-doc \ + --disable-gtk-doc-html \ + --disable-gtk-doc-pdf \ + --disable-silent-rules \ + --enable-firmware-update \ + --$(if $(LIBQMI_WITH_MBIM_QMUX),en,dis)able-mbim-qmux \ + --$(if $(LIBQMI_WITH_QRTR_GLIB),en,dis)able-qrtr \ + --enable-more-warnings=yes \ + --without-udev \ + --without-udev-base-dir + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(CP) \ + $(PKG_INSTALL_DIR)/usr/include/libqmi-glib \ + $(1)/usr/include/ + + $(INSTALL_DIR) $(1)/usr/lib + $(CP) \ + $(PKG_INSTALL_DIR)/usr/lib/libqmi*.so* \ + $(1)/usr/lib/ + + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) \ + $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/qmi-glib.pc \ + $(1)/usr/lib/pkgconfig +endef + +define Package/libqmi/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) \ + $(PKG_INSTALL_DIR)/usr/lib/libqmi*.so.* \ + $(1)/usr/lib/ + + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/qmi-proxy $(1)/usr/lib/ +endef + +define Package/qmi-utils/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/qmicli $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/qmi-network $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/qmi-firmware-update $(1)/usr/bin/ +endef + +$(eval $(call BuildPackage,libqmi)) +$(eval $(call BuildPackage,qmi-utils)) diff --git a/modemmanager/Config.in b/modemmanager/Config.in new file mode 100644 index 000000000..283a9e10a --- /dev/null +++ b/modemmanager/Config.in @@ -0,0 +1,21 @@ +menu "Configuration" +depends on PACKAGE_modemmanager + + config MODEMMANAGER_WITH_MBIM + bool "Include MBIM support" + default y + help + Compile ModemManager with MBIM support + + config MODEMMANAGER_WITH_QMI + bool "Include QMI support" + default y + help + Compile ModemManager with QMI support + + config MODEMMANAGER_WITH_AT_COMMAND_VIA_DBUS + bool "Allow AT commands via DBus" + default n + help + Compile ModemManager allowing AT commands without debug flag +endmenu diff --git a/modemmanager/Makefile b/modemmanager/Makefile new file mode 100644 index 000000000..285dc475c --- /dev/null +++ b/modemmanager/Makefile @@ -0,0 +1,141 @@ +# +# Copyright (C) 2016 Velocloud Inc. +# Copyright (C) 2016 Aleksander Morgado +# +# This is free software, licensed under the GNU General Public License v2. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=modemmanager +PKG_VERSION:=1.18.4 +PKG_RELEASE:=$(AUTORELEASE) + +PKG_SOURCE:=ModemManager-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=https://www.freedesktop.org/software/ModemManager +PKG_HASH:=11fb970f63e2da88df4b6d8759e4ee649944c515244b979bf50a7a6df1d7f199 +PKG_BUILD_DIR:=$(BUILD_DIR)/ModemManager-$(PKG_VERSION) + +PKG_MAINTAINER:=Nicholas Smith +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=COPYING + +PKG_INSTALL:=1 +PKG_BUILD_PARALLEL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/modemmanager/config + source "$(SOURCE)/Config.in" +endef + +define Package/modemmanager + SECTION:=net + CATEGORY:=Network + TITLE:=Control utility for any kind of mobile broadband modem + URL:=https://www.freedesktop.org/wiki/Software/ModemManager + DEPENDS:= \ + $(INTL_DEPENDS) \ + +glib2 \ + +dbus \ + +ppp \ + +MODEMMANAGER_WITH_MBIM:libmbim \ + +MODEMMANAGER_WITH_QMI:libqmi +endef + +define Package/modemmanager/description + ModemManager is a D-Bus-activated service which allows controlling mobile + broadband modems. Add kernel modules for your modems as needed. + Select Utilities/usb-modeswitch if needed. +endef + +CONFIGURE_ARGS += \ + --without-polkit \ + --without-udev \ + --without-systemdsystemunitdir \ + --disable-rpath \ + --disable-gtk-doc + +ifeq ($(CONFIG_MODEMMANAGER_WITH_AT_COMMAND_VIA_DBUS),y) + CONFIGURE_ARGS += --with-at-command-via-dbus +endif + +ifdef CONFIG_MODEMMANAGER_WITH_MBIM + CONFIGURE_ARGS += --with-mbim +else + CONFIGURE_ARGS += --without-mbim +endif + +ifdef CONFIG_MODEMMANAGER_WITH_QMI + CONFIGURE_ARGS += --with-qmi +else + CONFIGURE_ARGS += --without-qmi +endif + +define Build/Prepare + $(call Build/Prepare/Default) + ( cd "$(PKG_BUILD_DIR)"; \ + printf "all:\ninstall:\n" >po/Makefile.in.in; \ + ) +endef + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include/ModemManager + $(CP) $(PKG_INSTALL_DIR)/usr/include/ModemManager/*.h $(1)/usr/include/ModemManager + $(INSTALL_DIR) $(1)/usr/include/libmm-glib + $(CP) $(PKG_INSTALL_DIR)/usr/include/libmm-glib/*.h $(1)/usr/include/libmm-glib + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmm-glib.so* $(1)/usr/lib + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/ModemManager.pc $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/mm-glib.pc $(1)/usr/lib/pkgconfig +endef + +define Package/modemmanager/install + $(INSTALL_DIR) $(1)/lib/udev/rules.d + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/lib/udev/rules.d/*.rules $(1)/lib/udev/rules.d + + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ModemManager $(1)/usr/sbin + + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mmcli $(1)/usr/bin + + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmm-glib.so.* $(1)/usr/lib + + $(INSTALL_DIR) $(1)/usr/lib/ModemManager + $(CP) $(PKG_INSTALL_DIR)/usr/lib/ModemManager/libmm-shared-*.so* $(1)/usr/lib/ModemManager + $(CP) $(PKG_INSTALL_DIR)/usr/lib/ModemManager/libmm-plugin-*.so* $(1)/usr/lib/ModemManager + + $(INSTALL_DIR) $(1)/etc/dbus-1/system.d + $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/dbus-1/system.d/org.freedesktop.ModemManager1.conf $(1)/etc/dbus-1/system.d + + $(INSTALL_DIR) $(1)/usr/share/dbus-1/system-services + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/dbus-1/system-services/org.freedesktop.ModemManager1.service $(1)/usr/share/dbus-1/system-services + + $(INSTALL_DIR) $(1)/usr/share/ModemManager + $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/ModemManager/*.conf $(1)/usr/share/ModemManager + $(INSTALL_DATA) ./files/modemmanager.common $(1)/usr/share/ModemManager + + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/modemmanager.init $(1)/etc/init.d/modemmanager + + $(INSTALL_DIR) $(1)/etc/hotplug.d/usb + $(INSTALL_DATA) ./files/25-modemmanager-usb $(1)/etc/hotplug.d/usb + + $(INSTALL_DIR) $(1)/etc/hotplug.d/net + $(INSTALL_DATA) ./files/25-modemmanager-net $(1)/etc/hotplug.d/net + + $(INSTALL_DIR) $(1)/etc/hotplug.d/tty + $(INSTALL_DATA) ./files/25-modemmanager-tty $(1)/etc/hotplug.d/tty + + $(INSTALL_DIR) $(1)/etc/hotplug.d/wwan + $(INSTALL_DATA) ./files/25-modemmanager-wwan $(1)/etc/hotplug.d/wwan + + $(INSTALL_DIR) $(1)/lib/netifd/proto + $(INSTALL_BIN) ./files/modemmanager.proto $(1)/lib/netifd/proto/modemmanager.sh +endef + +$(eval $(call BuildPackage,modemmanager)) diff --git a/modemmanager/README.md b/modemmanager/README.md new file mode 100644 index 000000000..c9d880ea4 --- /dev/null +++ b/modemmanager/README.md @@ -0,0 +1,40 @@ +# OpenWrt ModemManager + +## Description + +Cellular modem control and connectivity + +Optional libraries libmbim and libqmi are available. +Your modem may require additional kernel modules and/or the usb-modeswitch +package. + +## Usage + +Once installed, you can configure the 2G/3G/4G modem connections directly in +/etc/config/network as in the following example: + + config interface 'broadband' + option device '/sys/devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2.1' + option proto 'modemmanager' + option apn 'ac.vodafone.es' + option allowedauth 'pap chap' + option username 'vodafone' + option password 'vodafone' + option pincode '7423' + option iptype 'ipv4' + option lowpower '1' + option signalrate '30' + +Only 'device' and 'proto' are mandatory options, the remaining ones are all +optional. + +The 'allowedauth' option allows limiting the list of authentication protocols. +It is given as a space-separated list of values, including any of the +following: 'pap', 'chap', 'mschap', 'mschapv2' or 'eap'. It will default to +allowing all protocols. + +The 'iptype' option supports any of these values: 'ipv4', 'ipv6' or 'ipv4v6'. +It will default to 'ipv4' if not given. + +The 'signalrate' option set's the signal refresh rate (in seconds) for the device. +You can call signal info with command: mmcli -m 0 --signal-get diff --git a/modemmanager/files/25-modemmanager-net b/modemmanager/files/25-modemmanager-net new file mode 100644 index 000000000..e87231e31 --- /dev/null +++ b/modemmanager/files/25-modemmanager-net @@ -0,0 +1,31 @@ +#!/bin/sh +# Copyright (C) 2016 Velocloud Inc +# Copyright (C) 2016 Aleksander Morgado + +# Load common utilities +. /usr/share/ModemManager/modemmanager.common + +# We require a interface name +[ -n "${INTERFACE}" ] || exit + +# Always make sure the rundir exists +mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" + +# Report network interface +mm_log "${ACTION} network interface ${INTERFACE}: event processed" +mm_report_event "${ACTION}" "${INTERFACE}" "net" "/sys${DEVPATH}" + +# Look for an associated cdc-wdm interface + +cdcwdm="" + +case "${ACTION}" in + "add") cdcwdm=$(mm_track_cdcwdm "${INTERFACE}") ;; + "remove") cdcwdm=$(mm_untrack_cdcwdm "${INTERFACE}") ;; +esac + +# Report cdc-wdm device, if any +[ -n "${cdcwdm}" ] && { + mm_log "${ACTION} cdc interface ${cdcwdm}: custom event processed" + mm_report_event "${ACTION}" "${cdcwdm}" "usbmisc" "/sys${DEVPATH}" +} diff --git a/modemmanager/files/25-modemmanager-tty b/modemmanager/files/25-modemmanager-tty new file mode 100644 index 000000000..c13148a33 --- /dev/null +++ b/modemmanager/files/25-modemmanager-tty @@ -0,0 +1,16 @@ +#!/bin/sh +# Copyright (C) 2016 Velocloud Inc +# Copyright (C) 2016 Aleksander Morgado + +# Load hotplug common utilities +. /usr/share/ModemManager/modemmanager.common + +# We require a device name +[ -n "$DEVNAME" ] || exit + +# Always make sure the rundir exists +mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" + +# Report TTY +mm_log "${ACTION} serial interface ${DEVNAME}: event processed" +mm_report_event "${ACTION}" "${DEVNAME}" "tty" "/sys${DEVPATH}" diff --git a/modemmanager/files/25-modemmanager-usb b/modemmanager/files/25-modemmanager-usb new file mode 100644 index 000000000..93d0bf70a --- /dev/null +++ b/modemmanager/files/25-modemmanager-usb @@ -0,0 +1,13 @@ +#!/bin/sh +# Copyright (C) 2019 Aleksander Morgado + +# We need to process only full USB device removal events, we don't +# want to process specific interface removal events. +[ "$ACTION" = remove ] || exit +[ -z "${INTERFACE}" ] || exit + +# Load common utilities +. /usr/share/ModemManager/modemmanager.common + +mm_clear_modem_wait_status "/sys${DEVPATH}" +mm_cleanup_interface_by_sysfspath "/sys${DEVPATH}" diff --git a/modemmanager/files/25-modemmanager-wwan b/modemmanager/files/25-modemmanager-wwan new file mode 100644 index 000000000..c4dc6b897 --- /dev/null +++ b/modemmanager/files/25-modemmanager-wwan @@ -0,0 +1,15 @@ +#!/bin/sh +# Copyright (C) 2021 Aleksander Morgado + +# Load hotplug common utilities +. /usr/share/ModemManager/modemmanager.common + +# We require a device name +[ -n "$DEVNAME" ] || exit + +# Always make sure the rundir exists +mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" + +# Report wwan +mm_log "${ACTION} wwan control port ${DEVNAME}: event processed" +mm_report_event "${ACTION}" "${DEVNAME}" "wwan" "/sys${DEVPATH}" diff --git a/modemmanager/files/modemmanager.common b/modemmanager/files/modemmanager.common new file mode 100644 index 000000000..b4139abad --- /dev/null +++ b/modemmanager/files/modemmanager.common @@ -0,0 +1,341 @@ +#!/bin/sh +# Copyright (C) 2016 Velocloud Inc +# Copyright (C) 2016 Aleksander Morgado + +################################################################################ + +. /lib/functions.sh +. /lib/netifd/netifd-proto.sh + +################################################################################ +# Runtime state + +MODEMMANAGER_RUNDIR="/var/run/modemmanager" +MODEMMANAGER_PID_FILE="${MODEMMANAGER_RUNDIR}/modemmanager.pid" +MODEMMANAGER_CDCWDM_CACHE="${MODEMMANAGER_RUNDIR}/cdcwdm.cache" +MODEMMANAGER_SYSFS_CACHE="${MODEMMANAGER_RUNDIR}/sysfs.cache" +MODEMMANAGER_EVENTS_CACHE="${MODEMMANAGER_RUNDIR}/events.cache" + +################################################################################ +# Common logging + +mm_log() { + logger -t "ModemManager" "hotplug: $*" +} + +################################################################################ +# Receives as input argument the full sysfs path of the device +# Returns the physical device sysfs path +# +# NOTE: this method only works when the device exists, i.e. it cannot be used +# on removal hotplug events + +mm_find_physdev_sysfs_path() { + local tmp_path="$1" + + while true; do + tmp_path=$(dirname "${tmp_path}") + + # avoid infinite loops iterating + [ -z "${tmp_path}" ] || [ "${tmp_path}" = "/" ] && return + + # For USB devices, the physical device will be that with a idVendor + # and idProduct pair of files + [ -f "${tmp_path}"/idVendor ] && [ -f "${tmp_path}"/idProduct ] && { + tmp_path=$(readlink -f "$tmp_path") + echo "${tmp_path}" + return + } + + # For PCI devices, the physical device will be that with a vendor + # and device pair of files + [ -f "${tmp_path}"/vendor ] && [ -f "${tmp_path}"/device ] && { + tmp_path=$(readlink -f "$tmp_path") + echo "${tmp_path}" + return + } + done +} + +################################################################################ + +# Returns the cdc-wdm name retrieved from sysfs +mm_track_cdcwdm() { + local wwan="$1" + local cdcwdm + + cdcwdm=$(ls "/sys/class/net/${wwan}/device/usbmisc/") + [ -n "${cdcwdm}" ] || return + + # We have to cache it for later, as we won't be able to get the + # associated cdc-wdm device on a remove event + echo "${wwan} ${cdcwdm}" >> "${MODEMMANAGER_CDCWDM_CACHE}" + + echo "${cdcwdm}" +} + +# Returns the cdc-wdm name retrieved from the cache +mm_untrack_cdcwdm() { + local wwan="$1" + local cdcwdm + + # Look for the cached associated cdc-wdm device + [ -f "${MODEMMANAGER_CDCWDM_CACHE}" ] || return + + cdcwdm=$(awk -v wwan="${wwan}" '!/^#/ && $0 ~ wwan { print $2 }' "${MODEMMANAGER_CDCWDM_CACHE}") + [ -n "${cdcwdm}" ] || return + + # Remove from cache + sed -i "/${wwan} ${cdcwdm}/d" "${MODEMMANAGER_CDCWDM_CACHE}" + + echo "${cdcwdm}" +} + +################################################################################ +# ModemManager needs some time from the ports being added until a modem object +# is exposed in DBus. With the logic here we do an explicit wait of N seconds +# for ModemManager to expose the new modem object, making sure that the wait is +# unique per device (i.e. per physical device sysfs path). + +# Gets the modem wait status as retrieved from the cache +mm_get_modem_wait_status() { + local sysfspath="$1" + + # If no sysfs cache file, we're done + [ -f "${MODEMMANAGER_SYSFS_CACHE}" ] || return + + # Get status of the sysfs path + awk -v sysfspath="${sysfspath}" '!/^#/ && $0 ~ sysfspath { print $2 }' "${MODEMMANAGER_SYSFS_CACHE}" +} + +# Clear the modem wait status from the cache, if any +mm_clear_modem_wait_status() { + local sysfspath="$1" + + local escaped_sysfspath + + [ -f "${MODEMMANAGER_SYSFS_CACHE}" ] && { + # escape '/', '\' and '&' for sed... + escaped_sysfspath=$(echo "$sysfspath" | sed -e 's/[\/&]/\\&/g') + sed -i "/${escaped_sysfspath}/d" "${MODEMMANAGER_SYSFS_CACHE}" + } +} + +# Sets the modem wait status in the cache +mm_set_modem_wait_status() { + local sysfspath="$1" + local status="$2" + + # Remove sysfs line before adding the new one with the new state + mm_clear_modem_wait_status "${sysfspath}" + + # Add the new status + echo "${sysfspath} ${status}" >> "${MODEMMANAGER_SYSFS_CACHE}" +} + +# Callback for config_foreach() +mm_get_modem_config_foreach_cb() { + local cfg="$1" + local sysfspath="$2" + + local proto + config_get proto "${cfg}" proto + [ "${proto}" = modemmanager ] || return 0 + + local dev + dev=$(uci_get network "${cfg}" device) + [ "${dev}" = "${sysfspath}" ] || return 0 + + echo "${cfg}" +} + +# Returns the name of the interface configured for this device +mm_get_modem_config() { + local sysfspath="$1" + + # Look for configuration for the given sysfs path + config_load network + config_foreach mm_get_modem_config_foreach_cb interface "${sysfspath}" +} + +# Wait for a modem in the specified sysfspath +mm_wait_for_modem() { + local cfg="$1" + local sysfspath="$2" + + # TODO: config max wait + local n=45 + local step=5 + + while [ $n -ge 0 ]; do + [ -d "${sysfspath}" ] || { + mm_log "error: ignoring modem detection request: no device at ${sysfspath}" + proto_set_available "${cfg}" 0 + return 1 + } + + # Check if the modem exists at the given sysfs path + if ! mmcli -m "${sysfspath}" > /dev/null 2>&1 + then + mm_log "error: modem not detected at sysfs path" + else + mm_log "modem exported successfully at ${sysfspath}" + mm_log "setting interface '${cfg}' as available" + proto_set_available "${cfg}" 1 + return 0 + fi + + sleep $step + n=$((n-step)) + done + + mm_log "error: timed out waiting for the modem to get exported at ${sysfspath}" + proto_set_available "${cfg}" 0 + return 2 +} + +mm_report_modem_wait() { + local sysfspath=$1 + + local parent_sysfspath status + + parent_sysfspath=$(mm_find_physdev_sysfs_path "$sysfspath") + [ -n "${parent_sysfspath}" ] || { + mm_log "error: parent device sysfspath not found" + return + } + + status=$(mm_get_modem_wait_status "${parent_sysfspath}") + case "${status}" in + "") + local cfg + + cfg=$(mm_get_modem_config "${parent_sysfspath}") + if [ -n "${cfg}" ]; then + mm_log "interface '${cfg}' is set to configure device '${parent_sysfspath}'" + mm_log "now waiting for modem at sysfs path ${parent_sysfspath}" + mm_set_modem_wait_status "${parent_sysfspath}" "processed" + # Launch subshell for the explicit wait + ( mm_wait_for_modem "${cfg}" "${parent_sysfspath}" ) > /dev/null 2>&1 & + else + mm_log "no need to wait for modem at sysfs path ${parent_sysfspath}" + mm_set_modem_wait_status "${parent_sysfspath}" "ignored" + fi + ;; + "processed") + mm_log "already waiting for modem at sysfs path ${parent_sysfspath}" + ;; + "ignored") + ;; + *) + mm_log "error: unknown status read for device at sysfs path ${parent_sysfspath}" + ;; + esac +} + +################################################################################ +# Cleanup interfaces + +mm_cleanup_interface_cb() { + local cfg="$1" + + local proto + config_get proto "${cfg}" proto + [ "${proto}" = modemmanager ] || return 0 + + proto_set_available "${cfg}" 0 +} + +mm_cleanup_interfaces() { + config_load network + config_foreach mm_cleanup_interface_cb interface +} + +mm_cleanup_interface_by_sysfspath() { + local dev="$1" + + local cfg + cfg=$(mm_get_modem_config "$dev") + [ -n "${cfg}" ] || return + + mm_log "setting interface '$cfg' as unavailable" + proto_set_available "${cfg}" 0 +} + +################################################################################ +# Event reporting + +# Receives as input the action, the device name and the subsystem +mm_report_event() { + local action="$1" + local name="$2" + local subsystem="$3" + local sysfspath="$4" + + # Track/untrack events in cache + case "${action}" in + "add") + # On add events, store event details in cache (if not exists yet) + grep -qs "${name},${subsystem}" "${MODEMMANAGER_EVENTS_CACHE}" || \ + echo "${action},${name},${subsystem},${sysfspath}" >> "${MODEMMANAGER_EVENTS_CACHE}" + ;; + "remove") + # On remove events, remove old events from cache (match by subsystem+name) + sed -i "/${name},${subsystem}/d" "${MODEMMANAGER_EVENTS_CACHE}" + ;; + esac + + # Report the event + mm_log "event reported: action=${action}, name=${name}, subsystem=${subsystem}" + mmcli --report-kernel-event="action=${action},name=${name},subsystem=${subsystem}" 1>/dev/null 2>&1 & + + # Wait for added modem if a sysfspath is given + [ -n "${sysfspath}" ] && [ "$action" = "add" ] && mm_report_modem_wait "${sysfspath}" +} + +mm_report_event_from_cache_line() { + local event_line="$1" + + local action name subsystem sysfspath + action=$(echo "${event_line}" | awk -F ',' '{ print $1 }') + name=$(echo "${event_line}" | awk -F ',' '{ print $2 }') + subsystem=$(echo "${event_line}" | awk -F ',' '{ print $3 }') + sysfspath=$(echo "${event_line}" | awk -F ',' '{ print $4 }') + + mm_log "cached event found: action=${action}, name=${name}, subsystem=${subsystem}, sysfspath=${sysfspath}" + mm_report_event "${action}" "${name}" "${subsystem}" "${sysfspath}" +} + +mm_report_events_from_cache() { + # Remove the sysfs cache + rm -f "${MODEMMANAGER_SYSFS_CACHE}" + + local n=60 + local step=1 + local mmrunning=0 + + # Wait for ModemManager to be available in the bus + while [ $n -ge 0 ]; do + sleep $step + mm_log "checking if ModemManager is available..." + + if ! mmcli -L >/dev/null 2>&1 + then + mm_log "ModemManager not yet available" + else + mmrunning=1 + break + fi + n=$((n-step)) + done + + [ ${mmrunning} -eq 1 ] || { + mm_log "error: couldn't report initial kernel events: ModemManager not running" + return + } + + # Report cached kernel events + while IFS= read -r event_line; do + mm_report_event_from_cache_line "${event_line}" + done < ${MODEMMANAGER_EVENTS_CACHE} +} diff --git a/modemmanager/files/modemmanager.init b/modemmanager/files/modemmanager.init new file mode 100755 index 000000000..b3f9f9290 --- /dev/null +++ b/modemmanager/files/modemmanager.init @@ -0,0 +1,36 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2016 Aleksander Morgado + +USE_PROCD=1 +START=70 + +stop_service() { + # Load common utils + . /usr/share/ModemManager/modemmanager.common + # Set all configured interfaces as unavailable + mm_cleanup_interfaces +} + +start_service() { + # Setup ModemManager service + # + # We will make sure that the rundir always exists, and we initially cleanup + # all interfaces flagging them as unavailable. + # + # The cached events processing will wait for MM to be available in DBus + # and will make sure all ports are re-notified to ModemManager every time + # it starts. + # + # All these commands need to be executed on every MM start, even after + # procd-triggered respawns, which is why they're all included as instance command + # + procd_open_instance + procd_set_param command sh -c ". /usr/share/ModemManager/modemmanager.common; \ + mkdir -m 0755 -p ${MODEMMANAGER_RUNDIR}; \ + mm_cleanup_interfaces; \ + ( mm_report_events_from_cache ) >/dev/null 2>&1 & \ + /usr/sbin/ModemManager" + procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}" + procd_set_param pidfile "${MODEMMANAGER_PID_FILE}" + procd_close_instance +} diff --git a/modemmanager/files/modemmanager.proto b/modemmanager/files/modemmanager.proto new file mode 100755 index 000000000..d24910b98 --- /dev/null +++ b/modemmanager/files/modemmanager.proto @@ -0,0 +1,550 @@ +#!/bin/sh +# Copyright (C) 2016-2019 Aleksander Morgado + +[ -x /usr/bin/mmcli ] || exit 0 +[ -x /usr/sbin/pppd ] || exit 0 + +[ -n "$INCLUDE_ONLY" ] || { + . /lib/functions.sh + . ../netifd-proto.sh + . ./ppp.sh + init_proto "$@" +} + +cdr2mask () +{ + # Number of args to shift, 255..255, first non-255 byte, zeroes + set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0 + if [ "$1" -gt 1 ] + then + shift "$1" + else + shift + fi + echo "${1-0}"."${2-0}"."${3-0}"."${4-0}" +} + +# This method expects as first argument a list of key-value pairs, as returned by mmcli --output-keyvalue +# The second argument must be exactly the name of the field to read +# +# Sample output: +# $ mmcli -m 0 -K +# modem.dbus-path : /org/freedesktop/ModemManager1/Modem/0 +# modem.generic.device-identifier : ed6eff2e3e0f90463da1c2a755b2acacd1335752 +# modem.generic.manufacturer : Dell Inc. +# modem.generic.model : DW5821e Snapdragon X20 LTE +# modem.generic.revision : T77W968.F1.0.0.4.0.GC.009\n026 +# modem.generic.carrier-configuration : GCF +# modem.generic.carrier-configuration-revision : 08E00009 +# modem.generic.hardware-revision : DW5821e Snapdragon X20 LTE +# .... +modemmanager_get_field() { + local list=$1 + local field=$2 + local value="" + + [ -z "${list}" ] || [ -z "${field}" ] && return + + # there is always at least a whitespace after each key, and we use that as part of the + # key matching we do (e.g. to avoid getting 'modem.generic.state-failed-reason' as a result + # when grepping for 'modem.generic.state'. + line=$(echo "${list}" | grep "${field} ") + value=$(echo ${line#*:}) + + # not found? + [ -n "${value}" ] || return 2 + + # only print value if set + [ "${value}" != "--" ] && echo "${value}" + return 0 +} + +# build a comma-separated list of values from the list +modemmanager_get_multivalue_field() { + local list=$1 + local field=$2 + local value="" + local length idx item + + [ -z "${list}" ] || [ -z "${field}" ] && return + + length=$(modemmanager_get_field "${list}" "${field}.length") + [ -n "${length}" ] || return 0 + [ "$length" -ge 1 ] || return 0 + + idx=1 + while [ $idx -le "$length" ]; do + item=$(modemmanager_get_field "${list}" "${field}.value\[$idx\]") + [ -n "${item}" ] && [ "${item}" != "--" ] && { + [ -n "${value}" ] && value="${value}, " + value="${value}${item}" + } + idx=$((idx + 1)) + done + + # nothing built? + [ -n "${value}" ] || return 2 + + # only print value if set + echo "${value}" + return 0 +} + +modemmanager_cleanup_connection() { + local modemstatus="$1" + + local bearercount idx bearerpath + + bearercount=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.length") + + # do nothing if no bearers reported + [ -n "${bearercount}" ] && [ "$bearercount" -ge 1 ] && { + # explicitly disconnect just in case + mmcli --modem="${device}" --simple-disconnect >/dev/null 2>&1 + # and remove all bearer objects, if any found + idx=1 + while [ $idx -le "$bearercount" ]; do + bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[$idx\]") + mmcli --modem "${device}" --delete-bearer="${bearerpath}" >/dev/null 2>&1 + idx=$((idx + 1)) + done + } +} + +modemmanager_connected_method_ppp_ipv4() { + local interface="$1" + local ttyname="$2" + local username="$3" + local password="$4" + local allowedauth="$5" + + # all auth types are allowed unless a user given list is given + local authopts + local pap=1 + local chap=1 + local mschap=1 + local mschapv2=1 + local eap=1 + + [ -n "$allowedauth" ] && { + pap=0 chap=0 mschap=0 mschapv2=0 eap=0 + for auth in $allowedauth; do + case $auth in + "pap") pap=1 ;; + "chap") chap=1 ;; + "mschap") mschap=1 ;; + "mschapv2") mschapv2=1 ;; + "eap") eap=1 ;; + *) ;; + esac + done + } + + [ $pap -eq 1 ] || append authopts "refuse-pap" + [ $chap -eq 1 ] || append authopts "refuse-chap" + [ $mschap -eq 1 ] || append authopts "refuse-mschap" + [ $mschapv2 -eq 1 ] || append authopts "refuse-mschap-v2" + [ $eap -eq 1 ] || append authopts "refuse-eap" + + proto_run_command "${interface}" /usr/sbin/pppd \ + "${ttyname}" \ + 115200 \ + nodetach \ + noaccomp \ + nobsdcomp \ + nopcomp \ + novj \ + noauth \ + $authopts \ + ${username:+ user $username} \ + ${password:+ password $password} \ + lcp-echo-failure 5 \ + lcp-echo-interval 15 \ + lock \ + crtscts \ + nodefaultroute \ + usepeerdns \ + ipparam "${interface}" \ + ip-up-script /lib/netifd/ppp-up \ + ip-down-script /lib/netifd/ppp-down +} + +modemmanager_disconnected_method_ppp_ipv4() { + local interface="$1" + + echo "running disconnection (ppp method)" + + [ -n "${ERROR}" ] && { + local errorstring + errorstring=$(ppp_exitcode_tostring "${ERROR}") + case "$ERROR" in + 0) + ;; + 2) + proto_notify_error "$interface" "$errorstring" + proto_block_restart "$interface" + ;; + *) + proto_notify_error "$interface" "$errorstring" + ;; + esac + } || echo "pppd result code not given" + + proto_kill_command "$interface" +} + +modemmanager_connected_method_dhcp_ipv4() { + local interface="$1" + local wwan="$2" + local metric="$3" + + proto_init_update "${wwan}" 1 + proto_set_keep 1 + proto_send_update "${interface}" + + json_init + json_add_string name "${interface}_4" + json_add_string ifname "@${interface}" + json_add_string proto "dhcp" + proto_add_dynamic_defaults + [ -n "$metric" ] && json_add_int metric "${metric}" + json_close_object + ubus call network add_dynamic "$(json_dump)" +} + +modemmanager_connected_method_static_ipv4() { + local interface="$1" + local wwan="$2" + local address="$3" + local prefix="$4" + local gateway="$5" + local mtu="$6" + local dns1="$7" + local dns2="$8" + local metric="$9" + + local mask="" + + [ -n "${address}" ] || { + proto_notify_error "${interface}" ADDRESS_MISSING + return + } + + [ -n "${prefix}" ] || { + proto_notify_error "${interface}" PREFIX_MISSING + return + } + mask=$(cdr2mask "${prefix}") + + [ -n "${mtu}" ] && /sbin/ip link set dev "${wwan}" mtu "${mtu}" + + proto_init_update "${wwan}" 1 + proto_set_keep 1 + echo "adding IPv4 address ${address}, netmask ${mask}" + proto_add_ipv4_address "${address}" "${mask}" + [ -n "${gateway}" ] && { + echo "adding default IPv4 route via ${gateway}" + proto_add_ipv4_route "0.0.0.0" "0" "${gateway}" "${address}" + } + [ -n "${dns1}" ] && { + echo "adding primary DNS at ${dns1}" + proto_add_dns_server "${dns1}" + } + [ -n "${dns2}" ] && { + echo "adding secondary DNS at ${dns2}" + proto_add_dns_server "${dns2}" + } + [ -n "$metric" ] && json_add_int metric "${metric}" + proto_send_update "${interface}" +} + +modemmanager_connected_method_dhcp_ipv6() { + local interface="$1" + local wwan="$2" + local metric="$3" + + proto_init_update "${wwan}" 1 + proto_set_keep 1 + proto_send_update "${interface}" + + json_init + json_add_string name "${interface}_6" + json_add_string ifname "@${interface}" + json_add_string proto "dhcpv6" + proto_add_dynamic_defaults + json_add_string extendprefix 1 # RFC 7278: Extend an IPv6 /64 Prefix to LAN + [ -n "$metric" ] && json_add_int metric "${metric}" + json_close_object + ubus call network add_dynamic "$(json_dump)" +} + +modemmanager_connected_method_static_ipv6() { + local interface="$1" + local wwan="$2" + local address="$3" + local prefix="$4" + local gateway="$5" + local mtu="$6" + local dns1="$7" + local dns2="$8" + local metric="$9" + + [ -n "${address}" ] || { + proto_notify_error "${interface}" ADDRESS_MISSING + return + } + + [ -n "${prefix}" ] || { + proto_notify_error "${interface}" PREFIX_MISSING + return + } + + [ -n "${mtu}" ] && /sbin/ip link set dev "${wwan}" mtu "${mtu}" + + proto_init_update "${wwan}" 1 + proto_set_keep 1 + echo "adding IPv6 address ${address}, prefix ${prefix}" + proto_add_ipv6_address "${address}" "128" + proto_add_ipv6_prefix "${address}/${prefix}" + [ -n "${gateway}" ] && { + echo "adding default IPv6 route via ${gateway}" + proto_add_ipv6_route "${gateway}" "128" + proto_add_ipv6_route "::0" "0" "${gateway}" "" "" "${address}/${prefix}" + } + [ -n "${dns1}" ] && { + echo "adding primary DNS at ${dns1}" + proto_add_dns_server "${dns1}" + } + [ -n "${dns2}" ] && { + echo "adding secondary DNS at ${dns2}" + proto_add_dns_server "${dns2}" + } + [ -n "$metric" ] && json_add_int metric "${metric}" + proto_send_update "${interface}" +} + +modemmanager_disconnected_method_common() { + local interface="$1" + + echo "running disconnection (common)" + proto_notify_error "${interface}" MM_DISCONNECT_IN_PROGRESS + + proto_init_update "*" 0 + proto_send_update "${interface}" +} + +proto_modemmanager_init_config() { + available=1 + no_device=1 + proto_config_add_string device + proto_config_add_string apn + proto_config_add_string 'allowedauth:list(string)' + proto_config_add_string username + proto_config_add_string password + proto_config_add_string pincode + proto_config_add_string iptype + proto_config_add_int signalrate + proto_config_add_boolean lowpower + proto_config_add_defaults +} + +proto_modemmanager_setup() { + local interface="$1" + + local modempath modemstatus bearercount bearerpath connectargs bearerstatus beareriface + local bearermethod_ipv4 bearermethod_ipv6 auth cliauth + local operatorname operatorid registration accesstech signalquality + + local device apn allowedauth username password pincode iptype metric signalrate + + local address prefix gateway mtu dns1 dns2 + + json_get_vars device apn allowedauth username password pincode iptype metric signalrate + + # validate sysfs path given in config + [ -n "${device}" ] || { + echo "No device specified" + proto_notify_error "${interface}" NO_DEVICE + proto_set_available "${interface}" 0 + return 1 + } + [ -e "${device}" ] || { + echo "Device not found in sysfs" + proto_set_available "${interface}" 0 + return 1 + } + + # validate that ModemManager is handling the modem at the sysfs path + modemstatus=$(mmcli --modem="${device}" --output-keyvalue) + modempath=$(modemmanager_get_field "${modemstatus}" "modem.dbus-path") + [ -n "${modempath}" ] || { + echo "Device not managed by ModemManager" + proto_notify_error "${interface}" DEVICE_NOT_MANAGED + proto_set_available "${interface}" 0 + return 1 + } + echo "modem available at ${modempath}" + + # always cleanup before attempting a new connection, just in case + modemmanager_cleanup_connection "${modemstatus}" + + # if allowedauth list given, build option string + for auth in $allowedauth; do + cliauth="${cliauth}${cliauth:+|}$auth" + done + + # setup connect args; APN mandatory (even if it may be empty) + echo "starting connection with apn '${apn}'..." + proto_notify_error "${interface}" MM_CONNECT_IN_PROGRESS + + connectargs="apn=${apn}${iptype:+,ip-type=${iptype}}${cliauth:+,allowed-auth=${cliauth}}${username:+,user=${username}}${password:+,password=${password}}${pincode:+,pin=${pincode}}" + mmcli --modem="${device}" --timeout 120 --simple-connect="${connectargs}" || { + proto_notify_error "${interface}" MM_CONNECT_FAILED + proto_block_restart "${interface}" + return 1 + } + + # check if Signal refresh rate is set + if [ -n "${signalrate}" ] && [ "${signalrate}" -eq "${signalrate}" ] 2>/dev/null; then + echo "setting signal refresh rate to ${signalrate} seconds" + mmcli --modem="${device}" --signal-setup="${signalrate}" + else + echo "signal refresh rate is not set" + fi + + # log additional useful information + modemstatus=$(mmcli --modem="${device}" --output-keyvalue) + operatorname=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.operator-name") + [ -n "${operatorname}" ] && echo "network operator name: ${operatorname}" + operatorid=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.operator-code") + [ -n "${operatorid}" ] && echo "network operator MCCMNC: ${operatorid}" + registration=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.registration-state") + [ -n "${registration}" ] && echo "registration type: ${registration}" + accesstech=$(modemmanager_get_multivalue_field "${modemstatus}" "modem.generic.access-technologies") + [ -n "${accesstech}" ] && echo "access technology: ${accesstech}" + signalquality=$(modemmanager_get_field "${modemstatus}" "modem.generic.signal-quality.value") + [ -n "${signalquality}" ] && echo "signal quality: ${signalquality}%" + + # we won't like it if there are more than one bearers, as that would mean the + # user manually created them, and that's unsupported by this proto + bearercount=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.length") + [ -n "${bearercount}" ] && [ "$bearercount" -eq 1 ] || { + proto_notify_error "${interface}" INVALID_BEARER_LIST + return 1 + } + + # load connected bearer information + bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[1\]") + bearerstatus=$(mmcli --bearer "${bearerpath}" --output-keyvalue) + + # load network interface and method information + beareriface=$(modemmanager_get_field "${bearerstatus}" "bearer.status.interface") + bearermethod_ipv4=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.method") + bearermethod_ipv6=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.method") + + # setup IPv4 + [ -n "${bearermethod_ipv4}" ] && { + echo "IPv4 connection setup required in interface ${interface}: ${bearermethod_ipv4}" + case "${bearermethod_ipv4}" in + "dhcp") + modemmanager_connected_method_dhcp_ipv4 "${interface}" "${beareriface}" "${metric}" + ;; + "static") + address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.address") + prefix=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.prefix") + gateway=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.gateway") + mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.mtu") + dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[1\]") + dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[2\]") + modemmanager_connected_method_static_ipv4 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}" + ;; + "ppp") + modemmanager_connected_method_ppp_ipv4 "${interface}" "${beareriface}" "${username}" "${password}" "${allowedauth}" + ;; + *) + proto_notify_error "${interface}" UNKNOWN_METHOD + return 1 + ;; + esac + } + + # setup IPv6 + # note: if using ipv4v6, both IPv4 and IPv6 settings will have the same MTU and metric values reported + [ -n "${bearermethod_ipv6}" ] && { + echo "IPv6 connection setup required in interface ${interface}: ${bearermethod_ipv6}" + case "${bearermethod_ipv6}" in + "dhcp") + modemmanager_connected_method_dhcp_ipv6 "${interface}" "${beareriface}" "${metric}" + ;; + "static") + address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.address") + prefix=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.prefix") + gateway=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.gateway") + mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.mtu") + dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[1\]") + dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[2\]") + modemmanager_connected_method_static_ipv6 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}" + ;; + "ppp") + proto_notify_error "${interface}" "unsupported method" + return 1 + ;; + *) + proto_notify_error "${interface}" UNKNOWN_METHOD + return 1 + ;; + esac + } + + return 0 +} + +proto_modemmanager_teardown() { + local interface="$1" + + local modemstatus bearerpath errorstring + local bearermethod_ipv4 bearermethod_ipv6 + + local device lowpower iptype + json_get_vars device lowpower iptype + + echo "stopping network" + proto_notify_error "${interface}" MM_TEARDOWN_IN_PROGRESS + + # load connected bearer information, just the first one should be ok + modemstatus=$(mmcli --modem="${device}" --output-keyvalue) + bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[1\]") + [ -n "${bearerpath}" ] || { + echo "couldn't load bearer path" + return + } + + # load bearer connection methods + bearerstatus=$(mmcli --bearer "${bearerpath}" --output-keyvalue) + bearermethod_ipv4=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.method") + [ -n "${bearermethod_ipv4}" ] && + echo "IPv4 connection teardown required in interface ${interface}: ${bearermethod_ipv4}" + bearermethod_ipv6=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.method") + [ -n "${bearermethod_ipv6}" ] && + echo "IPv6 connection teardown required in interface ${interface}: ${bearermethod_ipv6}" + + # disconnection handling only requires special treatment in IPv4/PPP + [ "${bearermethod_ipv4}" = "ppp" ] && modemmanager_disconnected_method_ppp_ipv4 "${interface}" + modemmanager_disconnected_method_common "${interface}" + + # disconnect + mmcli --modem="${device}" --simple-disconnect || + proto_notify_error "${interface}" DISCONNECT_FAILED + + # disable + mmcli --modem="${device}" --disable + proto_notify_error "${interface}" MM_MODEM_DISABLED + + # low power, only if requested + [ "${lowpower:-0}" -lt 1 ] || + mmcli --modem="${device}" --set-power-state-low +} + +[ -n "$INCLUDE_ONLY" ] || { + add_protocol modemmanager +} From 0121c6c4ce37424647c4934bd4731d009c3198ce Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Mon, 6 Dec 2021 19:36:33 +0100 Subject: [PATCH 10/63] Add more log and small changes --- .../usr/share/omr/post-tracking.d/post-tracking | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking index 964d78ea5..76770b61c 100755 --- a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking +++ b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking @@ -53,7 +53,8 @@ set_route() { interface_gw=$(ubus call network.interface.${INTERFACE}_4 status 2>/dev/null | jsonfilter -q -l 1 -e '@.inactive.route[@.target="0.0.0.0"].nexthop' | tr -d "\n") fi if [ "$interface_gw" != "" ] && [ "$interface_if" != "" ]; then - [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "$PREVINTERFACE down. Replace default route by $interface_gw dev $interface_if" + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && [ "$SETDEFAULT" = "yes" ] && _log "$PREVINTERFACE down. Replace default route by $interface_gw dev $interface_if" + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && [ "$SETDEFAULT" != "yes" ] && _log "$PREVINTERFACE down. Replace default in table 991337 route by $interface_gw dev $interface_if" [ "$SETDEFAULT" = "yes" ] && ip route replace default scope global nexthop via $interface_gw dev $interface_if 2>&1 >/dev/null ip route replace default via $interface_gw dev $interface_if table 991337 2>&1 >/dev/null && SETROUTE=true fi @@ -727,15 +728,19 @@ if [ "$OMR_TRACKER_STATUS" = "ERROR" ] || [ "$interface_up" != "true" ]; then config_foreach del_server_route6 server #if [ "$(uci -q get openmptcprouter.settings.master)" = "balancing" ] && [ "$(uci -q get openmptcprouter.settings.vpn)" != "mlvpn" ]; then if [ "$(uci -q get openmptcprouter.settings.master)" = "balancing" ]; then + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Set balancing route (current: $(ip r) )" config_foreach set_server_all_routes server config_foreach set_server_all_routes6 server + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Set balancing route done (new: $(ip r) )" fi fi if ([ "$default_gw" = "$OMR_TRACKER_DEVICE_GATEWAY" ] || [ "$default_gw" = "" ] || [ "$default_gw6" != "$OMR_TRACKER_DEVICE_GATEWAY6" ]) && [ "$(uci -q get openmptcprouter.settings.defaultgw)" != "0" ]; then + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Default gw: $default_gw - Set routes (current: $(ip r) )" config_load network config_foreach set_route interface $OMR_TRACKER_INTERFACE config_foreach set_route6 interface $OMR_TRACKER_INTERFACE + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "New routes $(ip r)" elif [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.multipath)" = "master" ]; then config_load network config_foreach set_route interface $OMR_TRACKER_INTERFACE "no" @@ -940,7 +945,7 @@ if [ "$multipath_config" = "master" ]; then if ([ "$default_gw" != "$OMR_TRACKER_DEVICE_GATEWAY" ] || [ "$default_gw" = "" ]) && [ "$OMR_TRACKER_DEVICE_GATEWAY" != "" ] && [ "$(uci -q get openmptcprouter.settings.master)" != "balancing" ]; then omrvpn_intf=$(uci -q get "network.omrvpn.device" || echo "tun0") [ -z "$omrvpn_intf" ] && omrvpn_intf=$(uci -q get "network.omrvpn.ifname" || echo "tun0") - if [ -n "$omrvpn_intf" ] && [ "$(ip route show default | awk '/default/ {print $5}' | grep $omrvpn_intf)" = "" ] && [ "$(uci -q get openmptcprouter.settings.defaultgw)" != "0" ]; then + if [ -n "$omrvpn_intf" ] && [ "$(ip route show default | grep -v metric | awk '/default/ {print $5}' | grep $omrvpn_intf)" = "" ] && [ "$(uci -q get openmptcprouter.settings.defaultgw)" != "0" ]; then _log "Master up : Replace default route by $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE" ip route replace default scope global nexthop via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE 2>&1 >/dev/null fi @@ -970,7 +975,7 @@ if [ "$multipath_config" = "master" ]; then if [ "$(uci -q get openmptcprouter.settings.master)" = "balancing" ] && [ "$(ip route show default | grep weight)" = "" ] && [ "$(uci -q get openmptcprouter.settings.defaultgw)" != "0" ]; then omrvpn_intf=$(uci -q get "network.omrvpn.device" || echo "tun0") [ -z "$omrvpn_intf" ] && omrvpn_intf=$(uci -q get "network.omrvpn.ifname" || echo "tun0") - if [ -n "$omrvpn_intf" ] && [ "$(ip route show default | awk '/default/ {print $5}' | grep $omrvpn_intf)" = "" ]; then + if [ -n "$omrvpn_intf" ] && [ "$(ip route show default | grep -v metric | awk '/default/ {print $5}' | grep $omrvpn_intf)" = "" ]; then routesbalancing="" routesbalancingbackup="" nbintf=0 @@ -982,7 +987,7 @@ if [ "$multipath_config" = "master" ]; then config_foreach set_route_balancing6 interface [ -n "$routesbalancing" ] && { ([ "$nbintf" -gt "1" ] && [ "$(ip r show default metric 1 | tr -d '\t' | tr -d '\n')" != "default via $routesbalancing " ]) || ([ "$nbintf" = "1" ] && ([ "$(ip r show default metric 1 | grep $OMR_TRACKER_DEVICE)" = "" ] || [ "$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.vpn)" = "1" ]) && [ -n "$OMR_TRACKER_DEVICE_IP" ]) && { - _log "Set ip route replace default scope global $routesbalancing" + _log "Change in routes, set ip route replace default scope global $routesbalancing (omrvpn_intf: $omrvpn_intf)" ip route replace default scope global metric 1 $routesbalancing 2>&1 >/dev/null } } @@ -994,7 +999,7 @@ if [ "$multipath_config" = "master" ]; then } [ -n "$routesbalancingbackup" ] && { ([ "$nbintfb" -gt "1" ] && [ "$(ip r show default metric 999 | tr -d '\t' | tr -d '\n')" != "default via $routesbalancingbackup " ]) || ([ "$nbintf" = "1" ] && ([ "$(ip r show default metric 999 | grep $OMR_TRACKER_DEVICE)" = "" ] || [ "$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.vpn)" = "1" ]) && [ -n "$OMR_TRACKER_DEVICE_IP" ]) && { - _log "Set backup ip route replace default scope global $routesbalancingbackup" + _log "Set backup ip route replace default scope global metric 999 $routesbalancingbackup" ip route replace default scope global metric 999 $routesbalancingbackup 2>&1 >/dev/null } } @@ -1027,6 +1032,7 @@ if [ -n "$OMR_TRACKER_DEVICE_IP" ] && [ -n "$OMR_TRACKER_DEVICE_GATEWAY" ]; then config_foreach set_server_route server fi if [ -n "$OMR_TRACKER_DEVICE_GATEWAY" ] && [ -n "$OMR_TRACKER_DEVICE" ] && [ "$(ip r show dev $OMR_TRACKER_DEVICE | grep default)" = "" ] && [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.metric)" != "" ]; then + _log "Interface route not yet set, set route ip r replace default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE metric $(uci -q get network.$OMR_TRACKER_INTERFACE.metric)" ip r replace default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE metric $(uci -q get network.$OMR_TRACKER_INTERFACE.metric) >/dev/null 2>&1 fi fi From 0ab2a14842579d142ff2e6255b6c1c51a66bdf26 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Fri, 10 Dec 2021 21:16:48 +0100 Subject: [PATCH 11/63] Fix set route too often --- mptcp/files/usr/share/omr/post-tracking.d/post-tracking | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking index 76770b61c..436dbfc3c 100755 --- a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking +++ b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking @@ -454,7 +454,7 @@ set_server_all_routes() { config_foreach set_routes_intf interface uintf="$(echo $routesintf | awk '{print $5}')" uintfb="$(echo $routesintfbackup | awk '{print $5}')" - if [ -n "$routesintf" ] && ([ "$nbintf" -gt "1" ] && [ "$(ip r show $serverip metric 1 | tr -d '\t' | tr -d '\n')" != "$serverip $routesintf " ]) || ([ "$nbintf" = "1" ] && [ -n "$uintf" ] && [ "$(ip r show $serverip metric 1 | grep $uintf)" = "" ]); then + if [ -n "$routesintf" ] && ([ "$nbintf" -gt "1" ] && [ "$(ip r show $serverip metric 1 | tr -d '\t' | sort | tr -d '\n' | sed 's/ *$//')" != "$(echo $serverip $routesintf | sort | sed 's/ *$//')" ]) || ([ "$nbintf" = "1" ] && [ -n "$uintf" ] && [ "$(ip r show $serverip metric 1 | grep $uintf)" = "" ]); then while [ "$(ip r show $serverip | grep -v nexthop | sed 's/ //g' | tr -d '\n')" != "$serverip" ] && [ "$(ip r show $serverip | grep -v nexthop | sed 's/ //g' | tr -d '\n')" != "" ]; do ip r del $serverip done @@ -500,7 +500,7 @@ set_server_all_routes6() { config_foreach set_routes_intf6 interface uintf="$(echo $routesintf6 | awk '{print $5}')" uintfb="$(echo $routesintfbackup6 | awk '{print $5}')" - if [ -n "$routesintf6" ] && ([ "$nbintf6" -gt "1" ] && [ "$(ip -6 r show $serverip metric 1 | tr -d '\t' | tr -d '\n')" != "$serverip $routesintf6 " ]) || ([ "$nbintf6" = "1" ] && [ -n "$uintf" ] && [ "$(ip -6 r show $serverip metric 1 | grep $uintf)" = "" ]); then + if [ -n "$routesintf6" ] && ([ "$nbintf6" -gt "1" ] && [ "$(ip -6 r show $serverip metric 1 | tr -d '\t' | sort | tr -d '\n' | sed 's/ *$//')" != "$(echo $serverip $routesintf6 | sort | sed 's/ *$//')" ]) || ([ "$nbintf6" = "1" ] && [ -n "$uintf" ] && [ "$(ip -6 r show $serverip metric 1 | grep $uintf)" = "" ]); then while [ "$(ip -6 r show $serverip | grep -v nexthop | sed 's/ //g' | tr -d '\n')" != "$serverip" ] && [ "$(ip -6 r show $serverip | grep -v nexthop | sed 's/ //g' | tr -d '\n')" != "" ]; do ip -6 r del $serverip done @@ -988,7 +988,9 @@ if [ "$multipath_config" = "master" ]; then [ -n "$routesbalancing" ] && { ([ "$nbintf" -gt "1" ] && [ "$(ip r show default metric 1 | tr -d '\t' | tr -d '\n')" != "default via $routesbalancing " ]) || ([ "$nbintf" = "1" ] && ([ "$(ip r show default metric 1 | grep $OMR_TRACKER_DEVICE)" = "" ] || [ "$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.vpn)" = "1" ]) && [ -n "$OMR_TRACKER_DEVICE_IP" ]) && { _log "Change in routes, set ip route replace default scope global $routesbalancing (omrvpn_intf: $omrvpn_intf)" + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Current route: $(ip r)" ip route replace default scope global metric 1 $routesbalancing 2>&1 >/dev/null + [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "New route: $(ip r)" } } [ -n "$routesbalancing6" ] && { From aa159e62e4f6988b07e3023ccfeba0d5f677363a Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Fri, 10 Dec 2021 21:17:13 +0100 Subject: [PATCH 12/63] Fix when host have more than 10 cores --- openmptcprouter/files/etc/uci-defaults/1930-omr-shadowsocks | 1 + 1 file changed, 1 insertion(+) diff --git a/openmptcprouter/files/etc/uci-defaults/1930-omr-shadowsocks b/openmptcprouter/files/etc/uci-defaults/1930-omr-shadowsocks index f47a4200c..7ddcc4e57 100755 --- a/openmptcprouter/files/etc/uci-defaults/1930-omr-shadowsocks +++ b/openmptcprouter/files/etc/uci-defaults/1930-omr-shadowsocks @@ -53,6 +53,7 @@ fi if [ "$(uci -q get shadowsocks-libev.hi3)" != "" ]; then port=1100 + [ "$NBCPU" -gt "10" ] && NBCPU=10 for c in $(seq 1 2 $NBCPU); do uci -q batch <<-EOF >/dev/null set shadowsocks-libev.hi$c.local_port=$port From 38927997e21ac0e8eb22429a150b015541305b42 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Sat, 11 Dec 2021 08:42:35 +0100 Subject: [PATCH 13/63] Update go --- golang/golang/Makefile | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/golang/golang/Makefile b/golang/golang/Makefile index 1c311d571..30979fe7c 100644 --- a/golang/golang/Makefile +++ b/golang/golang/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk GO_VERSION_MAJOR_MINOR:=1.17 -GO_VERSION_PATCH:=2 +GO_VERSION_PATCH:=3 PKG_NAME:=golang PKG_VERSION:=$(GO_VERSION_MAJOR_MINOR)$(if $(GO_VERSION_PATCH),.$(GO_VERSION_PATCH)) @@ -20,7 +20,7 @@ GO_SOURCE_URLS:=https://dl.google.com/go/ \ PKG_SOURCE:=go$(PKG_VERSION).src.tar.gz PKG_SOURCE_URL:=$(GO_SOURCE_URLS) -PKG_HASH:=2255eb3e4e824dd7d5fcdc2e7f84534371c186312e546fb1086a34c17752f431 +PKG_HASH:=705c64251e5b25d5d55ede1039c6aa22bea40a7a931d14c370339853643c3df0 PKG_MAINTAINER:=Jeffery To PKG_LICENSE:=BSD-3-Clause @@ -48,12 +48,13 @@ HOST_GO_VALID_OS_ARCH:= \ freebsd_386 freebsd_amd64 freebsd_arm freebsd_arm64 \ linux_386 linux_amd64 linux_arm linux_arm64 \ openbsd_386 openbsd_amd64 openbsd_arm openbsd_arm64 \ + netbsd_386 netbsd_amd64 netbsd_arm netbsd_arm64 \ + windows_386 windows_amd64 windows_arm windows_arm64 \ \ - netbsd_386 netbsd_amd64 netbsd_arm \ plan9_386 plan9_amd64 plan9_arm \ - windows_386 windows_amd64 windows_arm \ \ darwin_amd64 darwin_arm64 \ + ios_amd64 ios_arm64 \ \ dragonfly_amd64 \ illumos_amd64 \ @@ -64,7 +65,9 @@ HOST_GO_VALID_OS_ARCH:= \ \ linux_ppc64 linux_ppc64le \ linux_mips linux_mipsle linux_mips64 linux_mips64le \ - linux_riscv64 linux_s390x + linux_riscv64 linux_s390x \ + \ + openbsd_mips64 BOOTSTRAP_SOURCE:=go1.4-bootstrap-20171003.tar.gz BOOTSTRAP_SOURCE_URL:=$(GO_SOURCE_URLS) @@ -258,12 +261,14 @@ endif $(eval $(call GoCompiler/AddProfile,Package,$(PKG_BUILD_DIR),$(PKG_GO_PREFIX),$(PKG_GO_VERSION_ID),$(GO_OS_ARCH),$(PKG_GO_INSTALL_SUFFIX))) PKG_GO_ZBOOTSTRAP_MODS:= \ - s/defaultGO386 = `[^`]*`/defaultGO386 = `$(or $(GO_386),387)`/; \ + s/defaultGO386 = `[^`]*`/defaultGO386 = `$(or $(GO_386),sse2)`/; \ s/defaultGOARM = `[^`]*`/defaultGOARM = `$(or $(GO_ARM),5)`/; \ s/defaultGOMIPS = `[^`]*`/defaultGOMIPS = `$(or $(GO_MIPS),hardfloat)`/; \ s/defaultGOMIPS64 = `[^`]*`/defaultGOMIPS64 = `$(or $(GO_MIPS64),hardfloat)`/; \ s/defaultGOPPC64 = `[^`]*`/defaultGOPPC64 = `power8`/; +PKG_GO_ZBOOTSTRAP_PATH:=$(PKG_BUILD_DIR)/src/internal/buildcfg/zbootstrap.go + PKG_GO_VARS= \ GOCACHE="$(GO_BUILD_CACHE_DIR)" \ GOENV=off \ @@ -306,8 +311,17 @@ define Build/Compile $(PKG_GO_VARS) \ ) - $(SED) '$(PKG_GO_ZBOOTSTRAP_MODS)' \ - "$(PKG_BUILD_DIR)/src/cmd/internal/objabi/zbootstrap.go" + $(SED) '$(PKG_GO_ZBOOTSTRAP_MODS)' "$(PKG_GO_ZBOOTSTRAP_PATH)" + + ( \ + if echo 'int main() { return 0; }' | $(TARGET_CC) -o $(PKG_BUILD_DIR)/test-ldso -x c - > /dev/null 2>&1; then \ + LDSO=$$$$( \ + readelf -l $(PKG_BUILD_DIR)/test-ldso | \ + sed -n -e 's/^.*interpreter: \(.*\)[]]/\1/p' \ + ) ; \ + fi ; \ + $(SED) "s,defaultGO_LDSO = \`[^\`]*\`,defaultGO_LDSO = \`$$$$LDSO\`," "$(PKG_GO_ZBOOTSTRAP_PATH)" ; \ + ) @echo "Building target Go second stage" From 4ce4121bfb0c71210f808f15ba487905dc30b63f Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Mon, 13 Dec 2021 13:18:05 +0800 Subject: [PATCH 14/63] fixmodem --- libmbim/Makefile | 95 ---- libqmi/Config.in | 16 - libqmi/Makefile | 109 ----- modemmanager/Config.in | 21 - modemmanager/Makefile | 141 ------ modemmanager/README.md | 40 -- modemmanager/files/25-modemmanager-net | 31 -- modemmanager/files/25-modemmanager-tty | 16 - modemmanager/files/25-modemmanager-usb | 13 - modemmanager/files/25-modemmanager-wwan | 15 - modemmanager/files/modemmanager.common | 341 --------------- modemmanager/files/modemmanager.init | 36 -- modemmanager/files/modemmanager.proto | 550 ------------------------ 13 files changed, 1424 deletions(-) delete mode 100644 libmbim/Makefile delete mode 100644 libqmi/Config.in delete mode 100644 libqmi/Makefile delete mode 100644 modemmanager/Config.in delete mode 100644 modemmanager/Makefile delete mode 100644 modemmanager/README.md delete mode 100644 modemmanager/files/25-modemmanager-net delete mode 100644 modemmanager/files/25-modemmanager-tty delete mode 100644 modemmanager/files/25-modemmanager-usb delete mode 100644 modemmanager/files/25-modemmanager-wwan delete mode 100644 modemmanager/files/modemmanager.common delete mode 100755 modemmanager/files/modemmanager.init delete mode 100755 modemmanager/files/modemmanager.proto diff --git a/libmbim/Makefile b/libmbim/Makefile deleted file mode 100644 index 505ae7bc6..000000000 --- a/libmbim/Makefile +++ /dev/null @@ -1,95 +0,0 @@ -# -# Copyright (C) 2016 Velocloud Inc. -# Copyright (C) 2016 Aleksander Morgado -# -# This is free software, licensed under the GNU General Public License v2. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=libmbim -PKG_VERSION:=1.26.2 -PKG_RELEASE:=$(AUTORELEASE) - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=https://www.freedesktop.org/software/libmbim -PKG_HASH:=10c77bf5b5eb8c92ba80e9b519923ad9b898362bc8e1928e2bc9a17eeba649af - -PKG_MAINTAINER:=Nicholas Smith - -PKG_INSTALL:=1 -PKG_BUILD_PARALLEL:=1 - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/nls.mk - -CONFIGURE_ARGS += \ - --disable-static \ - --disable-gtk-doc \ - --disable-gtk-doc-html \ - --disable-gtk-doc-pdf \ - --disable-silent-rules \ - --enable-more-warnings=yes - -define Package/libmbim - SECTION:=libs - CATEGORY:=Libraries - DEPENDS:=+glib2 - TITLE:=Helper library and utils to talk to MBIM enabled modems - URL:=https://www.freedesktop.org/wiki/Software/libmbim - LICENSE:=LGPL-2.0-or-later - LICENSE_FILES:=COPYING.LIB -endef - -define Package/libmbim/description - Helper library to talk to MBIM enabled modems. - Add mbim-utils for extra utilities. -endef - -define Package/mbim-utils - SECTION:=utils - CATEGORY:=Utilities - DEPENDS:=+libmbim - TITLE:=Utilities to talk to MBIM enabled modems - URL:=https://www.freedesktop.org/wiki/Software/libmbim - LICENSE:=GPL-2.0-or-later - LICENSE_FILES:=COPYING -endef - -CONFIGURE_ARGS += \ - --without-udev \ - --without-udev-base-dir - -define Build/InstallDev - $(INSTALL_DIR) $(1)/usr/include - $(CP) \ - $(PKG_INSTALL_DIR)/usr/include/libmbim-glib \ - $(1)/usr/include/ - - $(INSTALL_DIR) $(1)/usr/lib - $(CP) \ - $(PKG_INSTALL_DIR)/usr/lib/libmbim*.so* \ - $(1)/usr/lib/ - - $(INSTALL_DIR) $(1)/usr/lib/pkgconfig - $(CP) \ - $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/mbim-glib.pc \ - $(1)/usr/lib/pkgconfig -endef - -define Package/libmbim/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) \ - $(PKG_INSTALL_DIR)/usr/lib/libmbim*.so.* \ - $(1)/usr/lib/ - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/mbim-proxy $(1)/usr/lib/ -endef - -define Package/mbim-utils/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mbimcli $(1)/usr/bin/ - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mbim-network $(1)/usr/bin/ -endef - -$(eval $(call BuildPackage,libmbim)) -$(eval $(call BuildPackage,mbim-utils)) diff --git a/libqmi/Config.in b/libqmi/Config.in deleted file mode 100644 index 6f35b7453..000000000 --- a/libqmi/Config.in +++ /dev/null @@ -1,16 +0,0 @@ -menu "Configuration" - depends on PACKAGE_libqmi - -config LIBQMI_WITH_MBIM_QMUX - bool "Include MBIM QMUX service support" - default y - help - Compile libqmi with QMI-over-MBIM support - -config LIBQMI_WITH_QRTR_GLIB - bool "Include QRTR support" - default y - help - Compile libqmi with QRTR support - -endmenu diff --git a/libqmi/Makefile b/libqmi/Makefile deleted file mode 100644 index a17181959..000000000 --- a/libqmi/Makefile +++ /dev/null @@ -1,109 +0,0 @@ -# -# Copyright (C) 2016 Velocloud Inc. -# Copyright (C) 2016 Aleksander Morgado -# -# This is free software, licensed under the GNU General Public License v2. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=libqmi -PKG_VERSION:=1.30.2 -PKG_RELEASE:=$(AUTORELEASE) - -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=https://www.freedesktop.org/software/libqmi -PKG_HASH:=be01ece0ea2c2194cbea5744bf5aaf06c04ba5fb7ec7887a13116c76d114fedd - -PKG_MAINTAINER:=Nicholas Smith - -PKG_INSTALL:=1 -PKG_BUILD_PARALLEL:=1 - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/nls.mk - -define Package/libqmi/config - source "$(SOURCE)/Config.in" -endef - -define Package/libqmi - SECTION:=libs - CATEGORY:=Libraries - DEPENDS:= \ - +glib2 \ - +LIBQMI_WITH_MBIM_QMUX:libmbim \ - +LIBQMI_WITH_QRTR_GLIB:libqrtr-glib - TITLE:=Helper library to talk to QMI enabled modems - URL:=https://www.freedesktop.org/wiki/Software/libqmi - LICENSE:=LGPL-2.0-or-later - LICENSE_FILES:=COPYING.LIB -endef - -define Package/libqmi/description - Helper library talk to QMI enabled modems. - Add qmi-utils for extra utilities. -endef - -define Package/qmi-utils - SECTION:=utils - CATEGORY:=Utilities - DEPENDS:=+libqmi - TITLE:=Utilities to talk to QMI enabled modems - URL:=https://www.freedesktop.org/wiki/Software/libqmi - LICENSE:=GPL-2.0-or-later - LICENSE_FILES:=COPYING -endef - -define Package/libqmi-utils/description - Utils to talk to QMI enabled modems -endef - -CONFIGURE_ARGS += \ - --disable-static \ - --disable-gtk-doc \ - --disable-gtk-doc-html \ - --disable-gtk-doc-pdf \ - --disable-silent-rules \ - --enable-firmware-update \ - --$(if $(LIBQMI_WITH_MBIM_QMUX),en,dis)able-mbim-qmux \ - --$(if $(LIBQMI_WITH_QRTR_GLIB),en,dis)able-qrtr \ - --enable-more-warnings=yes \ - --without-udev \ - --without-udev-base-dir - -define Build/InstallDev - $(INSTALL_DIR) $(1)/usr/include - $(CP) \ - $(PKG_INSTALL_DIR)/usr/include/libqmi-glib \ - $(1)/usr/include/ - - $(INSTALL_DIR) $(1)/usr/lib - $(CP) \ - $(PKG_INSTALL_DIR)/usr/lib/libqmi*.so* \ - $(1)/usr/lib/ - - $(INSTALL_DIR) $(1)/usr/lib/pkgconfig - $(CP) \ - $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/qmi-glib.pc \ - $(1)/usr/lib/pkgconfig -endef - -define Package/libqmi/install - $(INSTALL_DIR) $(1)/usr/lib - $(CP) \ - $(PKG_INSTALL_DIR)/usr/lib/libqmi*.so.* \ - $(1)/usr/lib/ - - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/qmi-proxy $(1)/usr/lib/ -endef - -define Package/qmi-utils/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/qmicli $(1)/usr/bin/ - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/qmi-network $(1)/usr/bin/ - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/qmi-firmware-update $(1)/usr/bin/ -endef - -$(eval $(call BuildPackage,libqmi)) -$(eval $(call BuildPackage,qmi-utils)) diff --git a/modemmanager/Config.in b/modemmanager/Config.in deleted file mode 100644 index 283a9e10a..000000000 --- a/modemmanager/Config.in +++ /dev/null @@ -1,21 +0,0 @@ -menu "Configuration" -depends on PACKAGE_modemmanager - - config MODEMMANAGER_WITH_MBIM - bool "Include MBIM support" - default y - help - Compile ModemManager with MBIM support - - config MODEMMANAGER_WITH_QMI - bool "Include QMI support" - default y - help - Compile ModemManager with QMI support - - config MODEMMANAGER_WITH_AT_COMMAND_VIA_DBUS - bool "Allow AT commands via DBus" - default n - help - Compile ModemManager allowing AT commands without debug flag -endmenu diff --git a/modemmanager/Makefile b/modemmanager/Makefile deleted file mode 100644 index 285dc475c..000000000 --- a/modemmanager/Makefile +++ /dev/null @@ -1,141 +0,0 @@ -# -# Copyright (C) 2016 Velocloud Inc. -# Copyright (C) 2016 Aleksander Morgado -# -# This is free software, licensed under the GNU General Public License v2. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=modemmanager -PKG_VERSION:=1.18.4 -PKG_RELEASE:=$(AUTORELEASE) - -PKG_SOURCE:=ModemManager-$(PKG_VERSION).tar.xz -PKG_SOURCE_URL:=https://www.freedesktop.org/software/ModemManager -PKG_HASH:=11fb970f63e2da88df4b6d8759e4ee649944c515244b979bf50a7a6df1d7f199 -PKG_BUILD_DIR:=$(BUILD_DIR)/ModemManager-$(PKG_VERSION) - -PKG_MAINTAINER:=Nicholas Smith -PKG_LICENSE:=GPL-2.0-or-later -PKG_LICENSE_FILES:=COPYING - -PKG_INSTALL:=1 -PKG_BUILD_PARALLEL:=1 - -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/nls.mk - -define Package/modemmanager/config - source "$(SOURCE)/Config.in" -endef - -define Package/modemmanager - SECTION:=net - CATEGORY:=Network - TITLE:=Control utility for any kind of mobile broadband modem - URL:=https://www.freedesktop.org/wiki/Software/ModemManager - DEPENDS:= \ - $(INTL_DEPENDS) \ - +glib2 \ - +dbus \ - +ppp \ - +MODEMMANAGER_WITH_MBIM:libmbim \ - +MODEMMANAGER_WITH_QMI:libqmi -endef - -define Package/modemmanager/description - ModemManager is a D-Bus-activated service which allows controlling mobile - broadband modems. Add kernel modules for your modems as needed. - Select Utilities/usb-modeswitch if needed. -endef - -CONFIGURE_ARGS += \ - --without-polkit \ - --without-udev \ - --without-systemdsystemunitdir \ - --disable-rpath \ - --disable-gtk-doc - -ifeq ($(CONFIG_MODEMMANAGER_WITH_AT_COMMAND_VIA_DBUS),y) - CONFIGURE_ARGS += --with-at-command-via-dbus -endif - -ifdef CONFIG_MODEMMANAGER_WITH_MBIM - CONFIGURE_ARGS += --with-mbim -else - CONFIGURE_ARGS += --without-mbim -endif - -ifdef CONFIG_MODEMMANAGER_WITH_QMI - CONFIGURE_ARGS += --with-qmi -else - CONFIGURE_ARGS += --without-qmi -endif - -define Build/Prepare - $(call Build/Prepare/Default) - ( cd "$(PKG_BUILD_DIR)"; \ - printf "all:\ninstall:\n" >po/Makefile.in.in; \ - ) -endef - -define Build/InstallDev - $(INSTALL_DIR) $(1)/usr/include/ModemManager - $(CP) $(PKG_INSTALL_DIR)/usr/include/ModemManager/*.h $(1)/usr/include/ModemManager - $(INSTALL_DIR) $(1)/usr/include/libmm-glib - $(CP) $(PKG_INSTALL_DIR)/usr/include/libmm-glib/*.h $(1)/usr/include/libmm-glib - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmm-glib.so* $(1)/usr/lib - $(INSTALL_DIR) $(1)/usr/lib/pkgconfig - $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/ModemManager.pc $(1)/usr/lib/pkgconfig - $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/mm-glib.pc $(1)/usr/lib/pkgconfig -endef - -define Package/modemmanager/install - $(INSTALL_DIR) $(1)/lib/udev/rules.d - $(INSTALL_DATA) $(PKG_INSTALL_DIR)/lib/udev/rules.d/*.rules $(1)/lib/udev/rules.d - - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ModemManager $(1)/usr/sbin - - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mmcli $(1)/usr/bin - - $(INSTALL_DIR) $(1)/usr/lib - $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmm-glib.so.* $(1)/usr/lib - - $(INSTALL_DIR) $(1)/usr/lib/ModemManager - $(CP) $(PKG_INSTALL_DIR)/usr/lib/ModemManager/libmm-shared-*.so* $(1)/usr/lib/ModemManager - $(CP) $(PKG_INSTALL_DIR)/usr/lib/ModemManager/libmm-plugin-*.so* $(1)/usr/lib/ModemManager - - $(INSTALL_DIR) $(1)/etc/dbus-1/system.d - $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/dbus-1/system.d/org.freedesktop.ModemManager1.conf $(1)/etc/dbus-1/system.d - - $(INSTALL_DIR) $(1)/usr/share/dbus-1/system-services - $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/dbus-1/system-services/org.freedesktop.ModemManager1.service $(1)/usr/share/dbus-1/system-services - - $(INSTALL_DIR) $(1)/usr/share/ModemManager - $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/ModemManager/*.conf $(1)/usr/share/ModemManager - $(INSTALL_DATA) ./files/modemmanager.common $(1)/usr/share/ModemManager - - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/modemmanager.init $(1)/etc/init.d/modemmanager - - $(INSTALL_DIR) $(1)/etc/hotplug.d/usb - $(INSTALL_DATA) ./files/25-modemmanager-usb $(1)/etc/hotplug.d/usb - - $(INSTALL_DIR) $(1)/etc/hotplug.d/net - $(INSTALL_DATA) ./files/25-modemmanager-net $(1)/etc/hotplug.d/net - - $(INSTALL_DIR) $(1)/etc/hotplug.d/tty - $(INSTALL_DATA) ./files/25-modemmanager-tty $(1)/etc/hotplug.d/tty - - $(INSTALL_DIR) $(1)/etc/hotplug.d/wwan - $(INSTALL_DATA) ./files/25-modemmanager-wwan $(1)/etc/hotplug.d/wwan - - $(INSTALL_DIR) $(1)/lib/netifd/proto - $(INSTALL_BIN) ./files/modemmanager.proto $(1)/lib/netifd/proto/modemmanager.sh -endef - -$(eval $(call BuildPackage,modemmanager)) diff --git a/modemmanager/README.md b/modemmanager/README.md deleted file mode 100644 index c9d880ea4..000000000 --- a/modemmanager/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# OpenWrt ModemManager - -## Description - -Cellular modem control and connectivity - -Optional libraries libmbim and libqmi are available. -Your modem may require additional kernel modules and/or the usb-modeswitch -package. - -## Usage - -Once installed, you can configure the 2G/3G/4G modem connections directly in -/etc/config/network as in the following example: - - config interface 'broadband' - option device '/sys/devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2.1' - option proto 'modemmanager' - option apn 'ac.vodafone.es' - option allowedauth 'pap chap' - option username 'vodafone' - option password 'vodafone' - option pincode '7423' - option iptype 'ipv4' - option lowpower '1' - option signalrate '30' - -Only 'device' and 'proto' are mandatory options, the remaining ones are all -optional. - -The 'allowedauth' option allows limiting the list of authentication protocols. -It is given as a space-separated list of values, including any of the -following: 'pap', 'chap', 'mschap', 'mschapv2' or 'eap'. It will default to -allowing all protocols. - -The 'iptype' option supports any of these values: 'ipv4', 'ipv6' or 'ipv4v6'. -It will default to 'ipv4' if not given. - -The 'signalrate' option set's the signal refresh rate (in seconds) for the device. -You can call signal info with command: mmcli -m 0 --signal-get diff --git a/modemmanager/files/25-modemmanager-net b/modemmanager/files/25-modemmanager-net deleted file mode 100644 index e87231e31..000000000 --- a/modemmanager/files/25-modemmanager-net +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# Copyright (C) 2016 Velocloud Inc -# Copyright (C) 2016 Aleksander Morgado - -# Load common utilities -. /usr/share/ModemManager/modemmanager.common - -# We require a interface name -[ -n "${INTERFACE}" ] || exit - -# Always make sure the rundir exists -mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" - -# Report network interface -mm_log "${ACTION} network interface ${INTERFACE}: event processed" -mm_report_event "${ACTION}" "${INTERFACE}" "net" "/sys${DEVPATH}" - -# Look for an associated cdc-wdm interface - -cdcwdm="" - -case "${ACTION}" in - "add") cdcwdm=$(mm_track_cdcwdm "${INTERFACE}") ;; - "remove") cdcwdm=$(mm_untrack_cdcwdm "${INTERFACE}") ;; -esac - -# Report cdc-wdm device, if any -[ -n "${cdcwdm}" ] && { - mm_log "${ACTION} cdc interface ${cdcwdm}: custom event processed" - mm_report_event "${ACTION}" "${cdcwdm}" "usbmisc" "/sys${DEVPATH}" -} diff --git a/modemmanager/files/25-modemmanager-tty b/modemmanager/files/25-modemmanager-tty deleted file mode 100644 index c13148a33..000000000 --- a/modemmanager/files/25-modemmanager-tty +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -# Copyright (C) 2016 Velocloud Inc -# Copyright (C) 2016 Aleksander Morgado - -# Load hotplug common utilities -. /usr/share/ModemManager/modemmanager.common - -# We require a device name -[ -n "$DEVNAME" ] || exit - -# Always make sure the rundir exists -mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" - -# Report TTY -mm_log "${ACTION} serial interface ${DEVNAME}: event processed" -mm_report_event "${ACTION}" "${DEVNAME}" "tty" "/sys${DEVPATH}" diff --git a/modemmanager/files/25-modemmanager-usb b/modemmanager/files/25-modemmanager-usb deleted file mode 100644 index 93d0bf70a..000000000 --- a/modemmanager/files/25-modemmanager-usb +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# Copyright (C) 2019 Aleksander Morgado - -# We need to process only full USB device removal events, we don't -# want to process specific interface removal events. -[ "$ACTION" = remove ] || exit -[ -z "${INTERFACE}" ] || exit - -# Load common utilities -. /usr/share/ModemManager/modemmanager.common - -mm_clear_modem_wait_status "/sys${DEVPATH}" -mm_cleanup_interface_by_sysfspath "/sys${DEVPATH}" diff --git a/modemmanager/files/25-modemmanager-wwan b/modemmanager/files/25-modemmanager-wwan deleted file mode 100644 index c4dc6b897..000000000 --- a/modemmanager/files/25-modemmanager-wwan +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -# Copyright (C) 2021 Aleksander Morgado - -# Load hotplug common utilities -. /usr/share/ModemManager/modemmanager.common - -# We require a device name -[ -n "$DEVNAME" ] || exit - -# Always make sure the rundir exists -mkdir -m 0755 -p "${MODEMMANAGER_RUNDIR}" - -# Report wwan -mm_log "${ACTION} wwan control port ${DEVNAME}: event processed" -mm_report_event "${ACTION}" "${DEVNAME}" "wwan" "/sys${DEVPATH}" diff --git a/modemmanager/files/modemmanager.common b/modemmanager/files/modemmanager.common deleted file mode 100644 index b4139abad..000000000 --- a/modemmanager/files/modemmanager.common +++ /dev/null @@ -1,341 +0,0 @@ -#!/bin/sh -# Copyright (C) 2016 Velocloud Inc -# Copyright (C) 2016 Aleksander Morgado - -################################################################################ - -. /lib/functions.sh -. /lib/netifd/netifd-proto.sh - -################################################################################ -# Runtime state - -MODEMMANAGER_RUNDIR="/var/run/modemmanager" -MODEMMANAGER_PID_FILE="${MODEMMANAGER_RUNDIR}/modemmanager.pid" -MODEMMANAGER_CDCWDM_CACHE="${MODEMMANAGER_RUNDIR}/cdcwdm.cache" -MODEMMANAGER_SYSFS_CACHE="${MODEMMANAGER_RUNDIR}/sysfs.cache" -MODEMMANAGER_EVENTS_CACHE="${MODEMMANAGER_RUNDIR}/events.cache" - -################################################################################ -# Common logging - -mm_log() { - logger -t "ModemManager" "hotplug: $*" -} - -################################################################################ -# Receives as input argument the full sysfs path of the device -# Returns the physical device sysfs path -# -# NOTE: this method only works when the device exists, i.e. it cannot be used -# on removal hotplug events - -mm_find_physdev_sysfs_path() { - local tmp_path="$1" - - while true; do - tmp_path=$(dirname "${tmp_path}") - - # avoid infinite loops iterating - [ -z "${tmp_path}" ] || [ "${tmp_path}" = "/" ] && return - - # For USB devices, the physical device will be that with a idVendor - # and idProduct pair of files - [ -f "${tmp_path}"/idVendor ] && [ -f "${tmp_path}"/idProduct ] && { - tmp_path=$(readlink -f "$tmp_path") - echo "${tmp_path}" - return - } - - # For PCI devices, the physical device will be that with a vendor - # and device pair of files - [ -f "${tmp_path}"/vendor ] && [ -f "${tmp_path}"/device ] && { - tmp_path=$(readlink -f "$tmp_path") - echo "${tmp_path}" - return - } - done -} - -################################################################################ - -# Returns the cdc-wdm name retrieved from sysfs -mm_track_cdcwdm() { - local wwan="$1" - local cdcwdm - - cdcwdm=$(ls "/sys/class/net/${wwan}/device/usbmisc/") - [ -n "${cdcwdm}" ] || return - - # We have to cache it for later, as we won't be able to get the - # associated cdc-wdm device on a remove event - echo "${wwan} ${cdcwdm}" >> "${MODEMMANAGER_CDCWDM_CACHE}" - - echo "${cdcwdm}" -} - -# Returns the cdc-wdm name retrieved from the cache -mm_untrack_cdcwdm() { - local wwan="$1" - local cdcwdm - - # Look for the cached associated cdc-wdm device - [ -f "${MODEMMANAGER_CDCWDM_CACHE}" ] || return - - cdcwdm=$(awk -v wwan="${wwan}" '!/^#/ && $0 ~ wwan { print $2 }' "${MODEMMANAGER_CDCWDM_CACHE}") - [ -n "${cdcwdm}" ] || return - - # Remove from cache - sed -i "/${wwan} ${cdcwdm}/d" "${MODEMMANAGER_CDCWDM_CACHE}" - - echo "${cdcwdm}" -} - -################################################################################ -# ModemManager needs some time from the ports being added until a modem object -# is exposed in DBus. With the logic here we do an explicit wait of N seconds -# for ModemManager to expose the new modem object, making sure that the wait is -# unique per device (i.e. per physical device sysfs path). - -# Gets the modem wait status as retrieved from the cache -mm_get_modem_wait_status() { - local sysfspath="$1" - - # If no sysfs cache file, we're done - [ -f "${MODEMMANAGER_SYSFS_CACHE}" ] || return - - # Get status of the sysfs path - awk -v sysfspath="${sysfspath}" '!/^#/ && $0 ~ sysfspath { print $2 }' "${MODEMMANAGER_SYSFS_CACHE}" -} - -# Clear the modem wait status from the cache, if any -mm_clear_modem_wait_status() { - local sysfspath="$1" - - local escaped_sysfspath - - [ -f "${MODEMMANAGER_SYSFS_CACHE}" ] && { - # escape '/', '\' and '&' for sed... - escaped_sysfspath=$(echo "$sysfspath" | sed -e 's/[\/&]/\\&/g') - sed -i "/${escaped_sysfspath}/d" "${MODEMMANAGER_SYSFS_CACHE}" - } -} - -# Sets the modem wait status in the cache -mm_set_modem_wait_status() { - local sysfspath="$1" - local status="$2" - - # Remove sysfs line before adding the new one with the new state - mm_clear_modem_wait_status "${sysfspath}" - - # Add the new status - echo "${sysfspath} ${status}" >> "${MODEMMANAGER_SYSFS_CACHE}" -} - -# Callback for config_foreach() -mm_get_modem_config_foreach_cb() { - local cfg="$1" - local sysfspath="$2" - - local proto - config_get proto "${cfg}" proto - [ "${proto}" = modemmanager ] || return 0 - - local dev - dev=$(uci_get network "${cfg}" device) - [ "${dev}" = "${sysfspath}" ] || return 0 - - echo "${cfg}" -} - -# Returns the name of the interface configured for this device -mm_get_modem_config() { - local sysfspath="$1" - - # Look for configuration for the given sysfs path - config_load network - config_foreach mm_get_modem_config_foreach_cb interface "${sysfspath}" -} - -# Wait for a modem in the specified sysfspath -mm_wait_for_modem() { - local cfg="$1" - local sysfspath="$2" - - # TODO: config max wait - local n=45 - local step=5 - - while [ $n -ge 0 ]; do - [ -d "${sysfspath}" ] || { - mm_log "error: ignoring modem detection request: no device at ${sysfspath}" - proto_set_available "${cfg}" 0 - return 1 - } - - # Check if the modem exists at the given sysfs path - if ! mmcli -m "${sysfspath}" > /dev/null 2>&1 - then - mm_log "error: modem not detected at sysfs path" - else - mm_log "modem exported successfully at ${sysfspath}" - mm_log "setting interface '${cfg}' as available" - proto_set_available "${cfg}" 1 - return 0 - fi - - sleep $step - n=$((n-step)) - done - - mm_log "error: timed out waiting for the modem to get exported at ${sysfspath}" - proto_set_available "${cfg}" 0 - return 2 -} - -mm_report_modem_wait() { - local sysfspath=$1 - - local parent_sysfspath status - - parent_sysfspath=$(mm_find_physdev_sysfs_path "$sysfspath") - [ -n "${parent_sysfspath}" ] || { - mm_log "error: parent device sysfspath not found" - return - } - - status=$(mm_get_modem_wait_status "${parent_sysfspath}") - case "${status}" in - "") - local cfg - - cfg=$(mm_get_modem_config "${parent_sysfspath}") - if [ -n "${cfg}" ]; then - mm_log "interface '${cfg}' is set to configure device '${parent_sysfspath}'" - mm_log "now waiting for modem at sysfs path ${parent_sysfspath}" - mm_set_modem_wait_status "${parent_sysfspath}" "processed" - # Launch subshell for the explicit wait - ( mm_wait_for_modem "${cfg}" "${parent_sysfspath}" ) > /dev/null 2>&1 & - else - mm_log "no need to wait for modem at sysfs path ${parent_sysfspath}" - mm_set_modem_wait_status "${parent_sysfspath}" "ignored" - fi - ;; - "processed") - mm_log "already waiting for modem at sysfs path ${parent_sysfspath}" - ;; - "ignored") - ;; - *) - mm_log "error: unknown status read for device at sysfs path ${parent_sysfspath}" - ;; - esac -} - -################################################################################ -# Cleanup interfaces - -mm_cleanup_interface_cb() { - local cfg="$1" - - local proto - config_get proto "${cfg}" proto - [ "${proto}" = modemmanager ] || return 0 - - proto_set_available "${cfg}" 0 -} - -mm_cleanup_interfaces() { - config_load network - config_foreach mm_cleanup_interface_cb interface -} - -mm_cleanup_interface_by_sysfspath() { - local dev="$1" - - local cfg - cfg=$(mm_get_modem_config "$dev") - [ -n "${cfg}" ] || return - - mm_log "setting interface '$cfg' as unavailable" - proto_set_available "${cfg}" 0 -} - -################################################################################ -# Event reporting - -# Receives as input the action, the device name and the subsystem -mm_report_event() { - local action="$1" - local name="$2" - local subsystem="$3" - local sysfspath="$4" - - # Track/untrack events in cache - case "${action}" in - "add") - # On add events, store event details in cache (if not exists yet) - grep -qs "${name},${subsystem}" "${MODEMMANAGER_EVENTS_CACHE}" || \ - echo "${action},${name},${subsystem},${sysfspath}" >> "${MODEMMANAGER_EVENTS_CACHE}" - ;; - "remove") - # On remove events, remove old events from cache (match by subsystem+name) - sed -i "/${name},${subsystem}/d" "${MODEMMANAGER_EVENTS_CACHE}" - ;; - esac - - # Report the event - mm_log "event reported: action=${action}, name=${name}, subsystem=${subsystem}" - mmcli --report-kernel-event="action=${action},name=${name},subsystem=${subsystem}" 1>/dev/null 2>&1 & - - # Wait for added modem if a sysfspath is given - [ -n "${sysfspath}" ] && [ "$action" = "add" ] && mm_report_modem_wait "${sysfspath}" -} - -mm_report_event_from_cache_line() { - local event_line="$1" - - local action name subsystem sysfspath - action=$(echo "${event_line}" | awk -F ',' '{ print $1 }') - name=$(echo "${event_line}" | awk -F ',' '{ print $2 }') - subsystem=$(echo "${event_line}" | awk -F ',' '{ print $3 }') - sysfspath=$(echo "${event_line}" | awk -F ',' '{ print $4 }') - - mm_log "cached event found: action=${action}, name=${name}, subsystem=${subsystem}, sysfspath=${sysfspath}" - mm_report_event "${action}" "${name}" "${subsystem}" "${sysfspath}" -} - -mm_report_events_from_cache() { - # Remove the sysfs cache - rm -f "${MODEMMANAGER_SYSFS_CACHE}" - - local n=60 - local step=1 - local mmrunning=0 - - # Wait for ModemManager to be available in the bus - while [ $n -ge 0 ]; do - sleep $step - mm_log "checking if ModemManager is available..." - - if ! mmcli -L >/dev/null 2>&1 - then - mm_log "ModemManager not yet available" - else - mmrunning=1 - break - fi - n=$((n-step)) - done - - [ ${mmrunning} -eq 1 ] || { - mm_log "error: couldn't report initial kernel events: ModemManager not running" - return - } - - # Report cached kernel events - while IFS= read -r event_line; do - mm_report_event_from_cache_line "${event_line}" - done < ${MODEMMANAGER_EVENTS_CACHE} -} diff --git a/modemmanager/files/modemmanager.init b/modemmanager/files/modemmanager.init deleted file mode 100755 index b3f9f9290..000000000 --- a/modemmanager/files/modemmanager.init +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh /etc/rc.common -# Copyright (C) 2016 Aleksander Morgado - -USE_PROCD=1 -START=70 - -stop_service() { - # Load common utils - . /usr/share/ModemManager/modemmanager.common - # Set all configured interfaces as unavailable - mm_cleanup_interfaces -} - -start_service() { - # Setup ModemManager service - # - # We will make sure that the rundir always exists, and we initially cleanup - # all interfaces flagging them as unavailable. - # - # The cached events processing will wait for MM to be available in DBus - # and will make sure all ports are re-notified to ModemManager every time - # it starts. - # - # All these commands need to be executed on every MM start, even after - # procd-triggered respawns, which is why they're all included as instance command - # - procd_open_instance - procd_set_param command sh -c ". /usr/share/ModemManager/modemmanager.common; \ - mkdir -m 0755 -p ${MODEMMANAGER_RUNDIR}; \ - mm_cleanup_interfaces; \ - ( mm_report_events_from_cache ) >/dev/null 2>&1 & \ - /usr/sbin/ModemManager" - procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}" - procd_set_param pidfile "${MODEMMANAGER_PID_FILE}" - procd_close_instance -} diff --git a/modemmanager/files/modemmanager.proto b/modemmanager/files/modemmanager.proto deleted file mode 100755 index d24910b98..000000000 --- a/modemmanager/files/modemmanager.proto +++ /dev/null @@ -1,550 +0,0 @@ -#!/bin/sh -# Copyright (C) 2016-2019 Aleksander Morgado - -[ -x /usr/bin/mmcli ] || exit 0 -[ -x /usr/sbin/pppd ] || exit 0 - -[ -n "$INCLUDE_ONLY" ] || { - . /lib/functions.sh - . ../netifd-proto.sh - . ./ppp.sh - init_proto "$@" -} - -cdr2mask () -{ - # Number of args to shift, 255..255, first non-255 byte, zeroes - set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0 - if [ "$1" -gt 1 ] - then - shift "$1" - else - shift - fi - echo "${1-0}"."${2-0}"."${3-0}"."${4-0}" -} - -# This method expects as first argument a list of key-value pairs, as returned by mmcli --output-keyvalue -# The second argument must be exactly the name of the field to read -# -# Sample output: -# $ mmcli -m 0 -K -# modem.dbus-path : /org/freedesktop/ModemManager1/Modem/0 -# modem.generic.device-identifier : ed6eff2e3e0f90463da1c2a755b2acacd1335752 -# modem.generic.manufacturer : Dell Inc. -# modem.generic.model : DW5821e Snapdragon X20 LTE -# modem.generic.revision : T77W968.F1.0.0.4.0.GC.009\n026 -# modem.generic.carrier-configuration : GCF -# modem.generic.carrier-configuration-revision : 08E00009 -# modem.generic.hardware-revision : DW5821e Snapdragon X20 LTE -# .... -modemmanager_get_field() { - local list=$1 - local field=$2 - local value="" - - [ -z "${list}" ] || [ -z "${field}" ] && return - - # there is always at least a whitespace after each key, and we use that as part of the - # key matching we do (e.g. to avoid getting 'modem.generic.state-failed-reason' as a result - # when grepping for 'modem.generic.state'. - line=$(echo "${list}" | grep "${field} ") - value=$(echo ${line#*:}) - - # not found? - [ -n "${value}" ] || return 2 - - # only print value if set - [ "${value}" != "--" ] && echo "${value}" - return 0 -} - -# build a comma-separated list of values from the list -modemmanager_get_multivalue_field() { - local list=$1 - local field=$2 - local value="" - local length idx item - - [ -z "${list}" ] || [ -z "${field}" ] && return - - length=$(modemmanager_get_field "${list}" "${field}.length") - [ -n "${length}" ] || return 0 - [ "$length" -ge 1 ] || return 0 - - idx=1 - while [ $idx -le "$length" ]; do - item=$(modemmanager_get_field "${list}" "${field}.value\[$idx\]") - [ -n "${item}" ] && [ "${item}" != "--" ] && { - [ -n "${value}" ] && value="${value}, " - value="${value}${item}" - } - idx=$((idx + 1)) - done - - # nothing built? - [ -n "${value}" ] || return 2 - - # only print value if set - echo "${value}" - return 0 -} - -modemmanager_cleanup_connection() { - local modemstatus="$1" - - local bearercount idx bearerpath - - bearercount=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.length") - - # do nothing if no bearers reported - [ -n "${bearercount}" ] && [ "$bearercount" -ge 1 ] && { - # explicitly disconnect just in case - mmcli --modem="${device}" --simple-disconnect >/dev/null 2>&1 - # and remove all bearer objects, if any found - idx=1 - while [ $idx -le "$bearercount" ]; do - bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[$idx\]") - mmcli --modem "${device}" --delete-bearer="${bearerpath}" >/dev/null 2>&1 - idx=$((idx + 1)) - done - } -} - -modemmanager_connected_method_ppp_ipv4() { - local interface="$1" - local ttyname="$2" - local username="$3" - local password="$4" - local allowedauth="$5" - - # all auth types are allowed unless a user given list is given - local authopts - local pap=1 - local chap=1 - local mschap=1 - local mschapv2=1 - local eap=1 - - [ -n "$allowedauth" ] && { - pap=0 chap=0 mschap=0 mschapv2=0 eap=0 - for auth in $allowedauth; do - case $auth in - "pap") pap=1 ;; - "chap") chap=1 ;; - "mschap") mschap=1 ;; - "mschapv2") mschapv2=1 ;; - "eap") eap=1 ;; - *) ;; - esac - done - } - - [ $pap -eq 1 ] || append authopts "refuse-pap" - [ $chap -eq 1 ] || append authopts "refuse-chap" - [ $mschap -eq 1 ] || append authopts "refuse-mschap" - [ $mschapv2 -eq 1 ] || append authopts "refuse-mschap-v2" - [ $eap -eq 1 ] || append authopts "refuse-eap" - - proto_run_command "${interface}" /usr/sbin/pppd \ - "${ttyname}" \ - 115200 \ - nodetach \ - noaccomp \ - nobsdcomp \ - nopcomp \ - novj \ - noauth \ - $authopts \ - ${username:+ user $username} \ - ${password:+ password $password} \ - lcp-echo-failure 5 \ - lcp-echo-interval 15 \ - lock \ - crtscts \ - nodefaultroute \ - usepeerdns \ - ipparam "${interface}" \ - ip-up-script /lib/netifd/ppp-up \ - ip-down-script /lib/netifd/ppp-down -} - -modemmanager_disconnected_method_ppp_ipv4() { - local interface="$1" - - echo "running disconnection (ppp method)" - - [ -n "${ERROR}" ] && { - local errorstring - errorstring=$(ppp_exitcode_tostring "${ERROR}") - case "$ERROR" in - 0) - ;; - 2) - proto_notify_error "$interface" "$errorstring" - proto_block_restart "$interface" - ;; - *) - proto_notify_error "$interface" "$errorstring" - ;; - esac - } || echo "pppd result code not given" - - proto_kill_command "$interface" -} - -modemmanager_connected_method_dhcp_ipv4() { - local interface="$1" - local wwan="$2" - local metric="$3" - - proto_init_update "${wwan}" 1 - proto_set_keep 1 - proto_send_update "${interface}" - - json_init - json_add_string name "${interface}_4" - json_add_string ifname "@${interface}" - json_add_string proto "dhcp" - proto_add_dynamic_defaults - [ -n "$metric" ] && json_add_int metric "${metric}" - json_close_object - ubus call network add_dynamic "$(json_dump)" -} - -modemmanager_connected_method_static_ipv4() { - local interface="$1" - local wwan="$2" - local address="$3" - local prefix="$4" - local gateway="$5" - local mtu="$6" - local dns1="$7" - local dns2="$8" - local metric="$9" - - local mask="" - - [ -n "${address}" ] || { - proto_notify_error "${interface}" ADDRESS_MISSING - return - } - - [ -n "${prefix}" ] || { - proto_notify_error "${interface}" PREFIX_MISSING - return - } - mask=$(cdr2mask "${prefix}") - - [ -n "${mtu}" ] && /sbin/ip link set dev "${wwan}" mtu "${mtu}" - - proto_init_update "${wwan}" 1 - proto_set_keep 1 - echo "adding IPv4 address ${address}, netmask ${mask}" - proto_add_ipv4_address "${address}" "${mask}" - [ -n "${gateway}" ] && { - echo "adding default IPv4 route via ${gateway}" - proto_add_ipv4_route "0.0.0.0" "0" "${gateway}" "${address}" - } - [ -n "${dns1}" ] && { - echo "adding primary DNS at ${dns1}" - proto_add_dns_server "${dns1}" - } - [ -n "${dns2}" ] && { - echo "adding secondary DNS at ${dns2}" - proto_add_dns_server "${dns2}" - } - [ -n "$metric" ] && json_add_int metric "${metric}" - proto_send_update "${interface}" -} - -modemmanager_connected_method_dhcp_ipv6() { - local interface="$1" - local wwan="$2" - local metric="$3" - - proto_init_update "${wwan}" 1 - proto_set_keep 1 - proto_send_update "${interface}" - - json_init - json_add_string name "${interface}_6" - json_add_string ifname "@${interface}" - json_add_string proto "dhcpv6" - proto_add_dynamic_defaults - json_add_string extendprefix 1 # RFC 7278: Extend an IPv6 /64 Prefix to LAN - [ -n "$metric" ] && json_add_int metric "${metric}" - json_close_object - ubus call network add_dynamic "$(json_dump)" -} - -modemmanager_connected_method_static_ipv6() { - local interface="$1" - local wwan="$2" - local address="$3" - local prefix="$4" - local gateway="$5" - local mtu="$6" - local dns1="$7" - local dns2="$8" - local metric="$9" - - [ -n "${address}" ] || { - proto_notify_error "${interface}" ADDRESS_MISSING - return - } - - [ -n "${prefix}" ] || { - proto_notify_error "${interface}" PREFIX_MISSING - return - } - - [ -n "${mtu}" ] && /sbin/ip link set dev "${wwan}" mtu "${mtu}" - - proto_init_update "${wwan}" 1 - proto_set_keep 1 - echo "adding IPv6 address ${address}, prefix ${prefix}" - proto_add_ipv6_address "${address}" "128" - proto_add_ipv6_prefix "${address}/${prefix}" - [ -n "${gateway}" ] && { - echo "adding default IPv6 route via ${gateway}" - proto_add_ipv6_route "${gateway}" "128" - proto_add_ipv6_route "::0" "0" "${gateway}" "" "" "${address}/${prefix}" - } - [ -n "${dns1}" ] && { - echo "adding primary DNS at ${dns1}" - proto_add_dns_server "${dns1}" - } - [ -n "${dns2}" ] && { - echo "adding secondary DNS at ${dns2}" - proto_add_dns_server "${dns2}" - } - [ -n "$metric" ] && json_add_int metric "${metric}" - proto_send_update "${interface}" -} - -modemmanager_disconnected_method_common() { - local interface="$1" - - echo "running disconnection (common)" - proto_notify_error "${interface}" MM_DISCONNECT_IN_PROGRESS - - proto_init_update "*" 0 - proto_send_update "${interface}" -} - -proto_modemmanager_init_config() { - available=1 - no_device=1 - proto_config_add_string device - proto_config_add_string apn - proto_config_add_string 'allowedauth:list(string)' - proto_config_add_string username - proto_config_add_string password - proto_config_add_string pincode - proto_config_add_string iptype - proto_config_add_int signalrate - proto_config_add_boolean lowpower - proto_config_add_defaults -} - -proto_modemmanager_setup() { - local interface="$1" - - local modempath modemstatus bearercount bearerpath connectargs bearerstatus beareriface - local bearermethod_ipv4 bearermethod_ipv6 auth cliauth - local operatorname operatorid registration accesstech signalquality - - local device apn allowedauth username password pincode iptype metric signalrate - - local address prefix gateway mtu dns1 dns2 - - json_get_vars device apn allowedauth username password pincode iptype metric signalrate - - # validate sysfs path given in config - [ -n "${device}" ] || { - echo "No device specified" - proto_notify_error "${interface}" NO_DEVICE - proto_set_available "${interface}" 0 - return 1 - } - [ -e "${device}" ] || { - echo "Device not found in sysfs" - proto_set_available "${interface}" 0 - return 1 - } - - # validate that ModemManager is handling the modem at the sysfs path - modemstatus=$(mmcli --modem="${device}" --output-keyvalue) - modempath=$(modemmanager_get_field "${modemstatus}" "modem.dbus-path") - [ -n "${modempath}" ] || { - echo "Device not managed by ModemManager" - proto_notify_error "${interface}" DEVICE_NOT_MANAGED - proto_set_available "${interface}" 0 - return 1 - } - echo "modem available at ${modempath}" - - # always cleanup before attempting a new connection, just in case - modemmanager_cleanup_connection "${modemstatus}" - - # if allowedauth list given, build option string - for auth in $allowedauth; do - cliauth="${cliauth}${cliauth:+|}$auth" - done - - # setup connect args; APN mandatory (even if it may be empty) - echo "starting connection with apn '${apn}'..." - proto_notify_error "${interface}" MM_CONNECT_IN_PROGRESS - - connectargs="apn=${apn}${iptype:+,ip-type=${iptype}}${cliauth:+,allowed-auth=${cliauth}}${username:+,user=${username}}${password:+,password=${password}}${pincode:+,pin=${pincode}}" - mmcli --modem="${device}" --timeout 120 --simple-connect="${connectargs}" || { - proto_notify_error "${interface}" MM_CONNECT_FAILED - proto_block_restart "${interface}" - return 1 - } - - # check if Signal refresh rate is set - if [ -n "${signalrate}" ] && [ "${signalrate}" -eq "${signalrate}" ] 2>/dev/null; then - echo "setting signal refresh rate to ${signalrate} seconds" - mmcli --modem="${device}" --signal-setup="${signalrate}" - else - echo "signal refresh rate is not set" - fi - - # log additional useful information - modemstatus=$(mmcli --modem="${device}" --output-keyvalue) - operatorname=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.operator-name") - [ -n "${operatorname}" ] && echo "network operator name: ${operatorname}" - operatorid=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.operator-code") - [ -n "${operatorid}" ] && echo "network operator MCCMNC: ${operatorid}" - registration=$(modemmanager_get_field "${modemstatus}" "modem.3gpp.registration-state") - [ -n "${registration}" ] && echo "registration type: ${registration}" - accesstech=$(modemmanager_get_multivalue_field "${modemstatus}" "modem.generic.access-technologies") - [ -n "${accesstech}" ] && echo "access technology: ${accesstech}" - signalquality=$(modemmanager_get_field "${modemstatus}" "modem.generic.signal-quality.value") - [ -n "${signalquality}" ] && echo "signal quality: ${signalquality}%" - - # we won't like it if there are more than one bearers, as that would mean the - # user manually created them, and that's unsupported by this proto - bearercount=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.length") - [ -n "${bearercount}" ] && [ "$bearercount" -eq 1 ] || { - proto_notify_error "${interface}" INVALID_BEARER_LIST - return 1 - } - - # load connected bearer information - bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[1\]") - bearerstatus=$(mmcli --bearer "${bearerpath}" --output-keyvalue) - - # load network interface and method information - beareriface=$(modemmanager_get_field "${bearerstatus}" "bearer.status.interface") - bearermethod_ipv4=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.method") - bearermethod_ipv6=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.method") - - # setup IPv4 - [ -n "${bearermethod_ipv4}" ] && { - echo "IPv4 connection setup required in interface ${interface}: ${bearermethod_ipv4}" - case "${bearermethod_ipv4}" in - "dhcp") - modemmanager_connected_method_dhcp_ipv4 "${interface}" "${beareriface}" "${metric}" - ;; - "static") - address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.address") - prefix=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.prefix") - gateway=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.gateway") - mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.mtu") - dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[1\]") - dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.dns.value\[2\]") - modemmanager_connected_method_static_ipv4 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}" - ;; - "ppp") - modemmanager_connected_method_ppp_ipv4 "${interface}" "${beareriface}" "${username}" "${password}" "${allowedauth}" - ;; - *) - proto_notify_error "${interface}" UNKNOWN_METHOD - return 1 - ;; - esac - } - - # setup IPv6 - # note: if using ipv4v6, both IPv4 and IPv6 settings will have the same MTU and metric values reported - [ -n "${bearermethod_ipv6}" ] && { - echo "IPv6 connection setup required in interface ${interface}: ${bearermethod_ipv6}" - case "${bearermethod_ipv6}" in - "dhcp") - modemmanager_connected_method_dhcp_ipv6 "${interface}" "${beareriface}" "${metric}" - ;; - "static") - address=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.address") - prefix=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.prefix") - gateway=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.gateway") - mtu=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.mtu") - dns1=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[1\]") - dns2=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.dns.value\[2\]") - modemmanager_connected_method_static_ipv6 "${interface}" "${beareriface}" "${address}" "${prefix}" "${gateway}" "${mtu}" "${dns1}" "${dns2}" "${metric}" - ;; - "ppp") - proto_notify_error "${interface}" "unsupported method" - return 1 - ;; - *) - proto_notify_error "${interface}" UNKNOWN_METHOD - return 1 - ;; - esac - } - - return 0 -} - -proto_modemmanager_teardown() { - local interface="$1" - - local modemstatus bearerpath errorstring - local bearermethod_ipv4 bearermethod_ipv6 - - local device lowpower iptype - json_get_vars device lowpower iptype - - echo "stopping network" - proto_notify_error "${interface}" MM_TEARDOWN_IN_PROGRESS - - # load connected bearer information, just the first one should be ok - modemstatus=$(mmcli --modem="${device}" --output-keyvalue) - bearerpath=$(modemmanager_get_field "${modemstatus}" "modem.generic.bearers.value\[1\]") - [ -n "${bearerpath}" ] || { - echo "couldn't load bearer path" - return - } - - # load bearer connection methods - bearerstatus=$(mmcli --bearer "${bearerpath}" --output-keyvalue) - bearermethod_ipv4=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv4-config.method") - [ -n "${bearermethod_ipv4}" ] && - echo "IPv4 connection teardown required in interface ${interface}: ${bearermethod_ipv4}" - bearermethod_ipv6=$(modemmanager_get_field "${bearerstatus}" "bearer.ipv6-config.method") - [ -n "${bearermethod_ipv6}" ] && - echo "IPv6 connection teardown required in interface ${interface}: ${bearermethod_ipv6}" - - # disconnection handling only requires special treatment in IPv4/PPP - [ "${bearermethod_ipv4}" = "ppp" ] && modemmanager_disconnected_method_ppp_ipv4 "${interface}" - modemmanager_disconnected_method_common "${interface}" - - # disconnect - mmcli --modem="${device}" --simple-disconnect || - proto_notify_error "${interface}" DISCONNECT_FAILED - - # disable - mmcli --modem="${device}" --disable - proto_notify_error "${interface}" MM_MODEM_DISABLED - - # low power, only if requested - [ "${lowpower:-0}" -lt 1 ] || - mmcli --modem="${device}" --set-power-state-low -} - -[ -n "$INCLUDE_ONLY" ] || { - add_protocol modemmanager -} From 54d696e593c941da20560f40af937fbbba08934b Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Thu, 16 Dec 2021 21:27:49 +0100 Subject: [PATCH 15/63] Fix compilation using GO --- golang/golang-values.mk | 42 +++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/golang/golang-values.mk b/golang/golang-values.mk index 69126a1ed..34c9c1c65 100644 --- a/golang/golang-values.mk +++ b/golang/golang-values.mk @@ -13,10 +13,11 @@ endif # Unset environment variables # There are more magic variables to track down, but ain't nobody got time for that -# From https://golang.org/cmd/go/#hdr-Environment_variables +# From https://pkg.go.dev/cmd/go#hdr-Environment_variables # General-purpose environment variables: unexport \ + GO111MODULE \ GCCGO \ GOARCH \ GOBIN \ @@ -36,6 +37,7 @@ unexport \ # GONOPROXY # GOSUMDB # GONOSUMDB +# GOVCS # Environment variables for use with cgo: unexport \ @@ -63,23 +65,20 @@ unexport \ # Special-purpose environment variables: unexport \ GCCGOTOOLDIR \ + GOEXPERIMENT \ GOROOT_FINAL \ GO_EXTLINK_ENABLED # Unmodified: # GIT_ALLOW_PROTOCOL -# From https://golang.org/cmd/go/#hdr-Module_support -unexport \ - GO111MODULE - -# From https://golang.org/pkg/runtime/#hdr-Environment_Variables +# From https://pkg.go.dev/runtime#hdr-Environment_Variables unexport \ GOGC \ GOMAXPROCS \ GORACE \ GOTRACEBACK -# From https://golang.org/cmd/cgo/#hdr-Using_cgo_with_the_go_command +# From https://pkg.go.dev/cmd/cgo#hdr-Using_cgo_with_the_go_command unexport \ CC_FOR_TARGET \ CXX_FOR_TARGET @@ -111,10 +110,6 @@ unexport \ BOOT_GO_GCFLAGS \ BOOT_GO_LDFLAGS -# From https://golang.org/src/cmd/dist/buildruntime.go -unexport \ - GOEXPERIMENT - # From https://golang.org/src/cmd/dist/buildtool.go unexport \ GOBOOTSTRAP_TOOLEXEC @@ -148,8 +143,11 @@ else endif ifeq ($(GO_ARCH),386) - # ensure binaries can run on older CPUs - GO_386:=387 + ifeq ($(CONFIG_TARGET_x86_geode)$(CONFIG_TARGET_x86_legacy),y) + GO_386:=softfloat + else + GO_386:=sse2 + endif # -fno-plt: causes "unexpected GOT reloc for non-dynamic symbol" errors GO_CFLAGS_TO_REMOVE:=-fno-plt @@ -195,19 +193,23 @@ GO_ARCH_DEPENDS:=@(aarch64||arm||i386||i686||mips||mips64||mips64el||mipsel||pow # ASLR/PIE +# From https://golang.org/src/cmd/internal/sys/supported.go GO_PIE_SUPPORTED_OS_ARCH:= \ - android_386 android_amd64 android_arm android_arm64 \ - linux_386 linux_amd64 linux_arm linux_arm64 \ + android_386 android_amd64 android_arm android_arm64 \ + linux_386 linux_amd64 linux_arm linux_arm64 \ \ - windows_386 windows_amd64 windows_arm \ + windows_386 windows_amd64 windows_arm \ + \ + darwin_amd64 darwin_arm64 \ + ios_amd64 ios_arm64 \ \ - darwin_amd64 \ freebsd_amd64 \ \ aix_ppc64 \ \ - linux_ppc64le linux_s390x + linux_ppc64le linux_riscv64 linux_s390x +# From https://golang.org/src/cmd/go/internal/work/init.go go_pie_install_suffix=$(if $(filter $(1),aix_ppc64 windows_386 windows_amd64 windows_arm),,shared) ifneq ($(filter $(GO_HOST_OS_ARCH),$(GO_PIE_SUPPORTED_OS_ARCH)),) @@ -236,7 +238,7 @@ endif # General build info -GO_BUILD_CACHE_DIR:=$(or $(call qstrip,$(CONFIG_GOLANG_BUILD_CACHE_DIR)),$(TOPDIR)/.go-build) +GO_BUILD_CACHE_DIR:=$(or $(call qstrip,$(CONFIG_GOLANG_BUILD_CACHE_DIR)),$(TMP_DIR)/go-build) GO_MOD_CACHE_DIR:=$(DL_DIR)/go-mod-cache GO_MOD_ARGS= \ @@ -249,6 +251,6 @@ GO_GENERAL_BUILD_CONFIG_VARS= \ GO_MOD_ARGS="$(GO_MOD_ARGS)" define Go/CacheCleanup - $(GENERAL_BUILD_CONFIG_VARS) \ + $(GO_GENERAL_BUILD_CONFIG_VARS) \ $(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh cache_cleanup endef From eab3c23adea0d2a1f84bf7a13130afe891080da9 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Sat, 18 Dec 2021 21:49:20 +0800 Subject: [PATCH 16/63] Update main.yml --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 03a0dd1f9..b84ffed3a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -65,6 +65,7 @@ jobs: OMR_HOST: ${{ secrets.OMR_HOST }} OMR_PORT: ${{ secrets.OMR_PORT }} run: | + sudo rm -rf "openmptcprouter-feeds/openmptcprouter/files/etc/init.d/getserveratboot" >/dev/null 2>&1 || true OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j$(nproc) || OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j1 V=s #echo -e "${{ secrets.OMR_PRIVKEY }}" > $OMR_TARGET/source/key-build #echo -e "${{ secrets.OMR_PUBKEY }}" > $OMR_TARGET/source/key-build.pub From bad83763c8850b6f6de432db41a670b5b2511642 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Sat, 18 Dec 2021 21:53:29 +0800 Subject: [PATCH 17/63] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b84ffed3a..cbf42bd57 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -65,7 +65,7 @@ jobs: OMR_HOST: ${{ secrets.OMR_HOST }} OMR_PORT: ${{ secrets.OMR_PORT }} run: | - sudo rm -rf "openmptcprouter-feeds/openmptcprouter/files/etc/init.d/getserveratboot" >/dev/null 2>&1 || true + sudo rm -rf "feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" >/dev/null 2>&1 || true OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j$(nproc) || OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j1 V=s #echo -e "${{ secrets.OMR_PRIVKEY }}" > $OMR_TARGET/source/key-build #echo -e "${{ secrets.OMR_PUBKEY }}" > $OMR_TARGET/source/key-build.pub From 9f1c18ddc4de8600674fc2c5d902dc1c6f709f03 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Sun, 19 Dec 2021 03:15:08 +0800 Subject: [PATCH 18/63] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cbf42bd57..572b6f63b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,7 +8,7 @@ jobs: build: strategy: matrix: - OMR_TARGET: [bpi-r1, bpi-r2, bpi-r64, rpi2, rpi4, wrt32x, espressobin, r2s, rpi3, wrt3200acm, x86, x86_64, ubnt-erx, r4s, r7800, l1000, zbt4019] + OMR_TARGET: [bpi-r1, bpi-r2, bpi-r64, rpi2, rpi4, wrt32x, espressobin, r2s, rpi3, wrt3200acm, cm520-79f, x86_64, ubnt-erx, r4s, r7800, l1000, zbt4019] OMR_KERNEL: [5.4, 5.15] runs-on: ubuntu-latest continue-on-error: true From f09d89e7e37d8b79271c7360ab7ac73f55ba965f Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Sun, 19 Dec 2021 14:35:55 +0800 Subject: [PATCH 19/63] Update main.yml --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 572b6f63b..dcac2631d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -65,6 +65,7 @@ jobs: OMR_HOST: ${{ secrets.OMR_HOST }} OMR_PORT: ${{ secrets.OMR_PORT }} run: | + cat "feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" sudo rm -rf "feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" >/dev/null 2>&1 || true OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j$(nproc) || OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j1 V=s #echo -e "${{ secrets.OMR_PRIVKEY }}" > $OMR_TARGET/source/key-build From 73760379ef9ccdbd84062ea10150fd4df77d933e Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Sun, 19 Dec 2021 14:40:15 +0800 Subject: [PATCH 20/63] Update main.yml --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dcac2631d..c299effd6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -65,8 +65,8 @@ jobs: OMR_HOST: ${{ secrets.OMR_HOST }} OMR_PORT: ${{ secrets.OMR_PORT }} run: | - cat "feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" - sudo rm -rf "feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" >/dev/null 2>&1 || true + cat "/feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" + sudo rm -rf "/feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" >/dev/null 2>&1 || true OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j$(nproc) || OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j1 V=s #echo -e "${{ secrets.OMR_PRIVKEY }}" > $OMR_TARGET/source/key-build #echo -e "${{ secrets.OMR_PUBKEY }}" > $OMR_TARGET/source/key-build.pub From a5362a53c6d43a4b8ba7d249b466389240fe47b9 Mon Sep 17 00:00:00 2001 From: suyuan <175338101@qq.com> Date: Sun, 19 Dec 2021 14:41:35 +0800 Subject: [PATCH 21/63] Update main.yml --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c299effd6..b0816f403 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -65,8 +65,6 @@ jobs: OMR_HOST: ${{ secrets.OMR_HOST }} OMR_PORT: ${{ secrets.OMR_PORT }} run: | - cat "/feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" - sudo rm -rf "/feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" >/dev/null 2>&1 || true OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j$(nproc) || OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j1 V=s #echo -e "${{ secrets.OMR_PRIVKEY }}" > $OMR_TARGET/source/key-build #echo -e "${{ secrets.OMR_PUBKEY }}" > $OMR_TARGET/source/key-build.pub @@ -75,6 +73,8 @@ jobs: env: OMR_TARGET: ${{ matrix.OMR_TARGET }} run: | + cat "feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" + sudo rm -rf "feeds/openmptcprouter/openmptcprouter/files/etc/init.d/getserveratboot" >/dev/null 2>&1 || true make IGNORE_ERRORS=m -C $OMR_TARGET/source package/{compile,install,index} -j$(nproc) || make IGNORE_ERRORS=m -C $OMR_TARGET/source package/{compile,install,index} -j1 V=s - name: Build image working-directory: ../../omr From 278baea272b79a013649510de01522bbac9d5ec8 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Mon, 20 Dec 2021 19:41:28 +0100 Subject: [PATCH 22/63] Little changes on mptcp v6 routes --- mptcp/files/etc/init.d/mptcp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mptcp/files/etc/init.d/mptcp b/mptcp/files/etc/init.d/mptcp index 383650953..dbaf7f01b 100755 --- a/mptcp/files/etc/init.d/mptcp +++ b/mptcp/files/etc/init.d/mptcp @@ -316,7 +316,7 @@ interface_multipath_settings() { [ -n "$(ip -6 rule list | grep 6$id)" ] && ip -6 rule del table 6$id > /dev/null 2>&1 ip -6 route flush 6$id > /dev/null 2>&1 fi - if [ -n "$ip6addr" ] && [ -n "$gateway6" ] && [ -n "$network6" ]; then + if [ -n "$gateway6" ] && [ -n "$network6" ]; then if [ "$(uci -q get openmptcprouter.settings.uci_route)" = "1" ]; then uci -q batch <<-EOF >/dev/null delete network.${config}_rule6 @@ -341,12 +341,12 @@ interface_multipath_settings() { commit network EOF else - ip -6 rule add from $ip6addr table 6$id pref 0 2>&1 >/dev/null + [ -n "$ip6addr" ] && ip -6 rule add from $ip6addr table 6$id pref 0 2>&1 >/dev/null ip -6 route replace $network6/$netmask6 dev $iface scope link metric 6$id 2>&1 >/dev/null ip -6 route replace $network6/$netmask6 dev $iface scope link table 6$id 2>&1 >/dev/null ip -6 route replace default via $gateway6 dev $iface table 6$id 2>&1 >/dev/null ip -6 route replace default via $gateway6 dev $iface metric 6$id 2>&1 >/dev/null - ip -6 route flush 6$id 2>&1 >/dev/null + #ip -6 route flush 6$id 2>&1 >/dev/null fi #config_get mode "$config" multipath "off" From 63457ef662c625b78bfac3fa39ee70efb02d78f8 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Mon, 20 Dec 2021 20:34:02 +0100 Subject: [PATCH 23/63] Get IPv6 when not static --- mptcp/files/etc/init.d/mptcp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/mptcp/files/etc/init.d/mptcp b/mptcp/files/etc/init.d/mptcp index dbaf7f01b..140db96f9 100755 --- a/mptcp/files/etc/init.d/mptcp +++ b/mptcp/files/etc/init.d/mptcp @@ -290,20 +290,20 @@ interface_multipath_settings() { ip6addr=`echo $ip6addr | cut -d/ -f1` netmask6=`ipcalc $ipaddr6 | sed -n '/PREFIX=/{;s/.*=//;s/ .*//;p;}'` network6=`ipcalc $ip6addr | sed -n '/NETWORK=/{;s/.*=//;s/ .*//;p;}'` - if [ -z "$ip6addr" ] || [ -z "$network6" ]; then - ip6addr=$(ip -6 addr show dev $iface | grep -v 'scope link' | grep inet6 | awk '{print $2}' | cut -d/ -f1 | tr -d "\n") - gateway6=$(ip -6 r list dev $iface | grep -v default | awk '/proto static/ {print $1}' | tr -d "\n") - [ -z "$gateway6" ] && gateway6=$(uci -q get "network.$config.ip6gw") - [ -z "$gateway6" ] && gateway6=$(ubus call network.interface.$config status | jsonfilter -q -l 1 -e '@.inactive.route[@.target="::"].nexthop' | tr -d "\n") - if [ -z "$gateway6" ] || [ "$( valid_subnet6 $gateway6 )" != "ok" ]; then - gateway6=$(ubus call network.interface.$config status | jsonfilter -q -l 1 -e '@.route[@.target="::"].nexthop' | tr -d "\n") - fi - if [ -z "$gateway6" ] || [ "$( valid_subnet6 $gateway6 )" != "ok" ]; then - gateway6=$(ubus call network.interface.${config}_6 status 2>/dev/null | jsonfilter -q -l 1 -e '@.inactive.route[@.target="::"].nexthop' | tr -d "\n") - fi - netmask6=$(ip -6 addr show dev $iface | grep -v 'scope link' | grep inet6 | awk '{print $2}' | cut -d/ -f2 | tr -d "\n") - network6=`ipcalc $ip6addr | sed -n '/NETWORK=/{;s/.*=//;s/ .*//;p;}'` + fi + if [ -z "$ip6addr" ] || [ -z "$network6" ]; then + ip6addr=$(ip -6 addr show dev $iface | grep -v 'scope link' | grep inet6 | awk '{print $2}' | cut -d/ -f1 | tr -d "\n") + gateway6=$(ip -6 r list dev $iface | grep -v default | awk '/proto static/ {print $1}' | tr -d "\n") + [ -z "$gateway6" ] && gateway6=$(uci -q get "network.$config.ip6gw") + [ -z "$gateway6" ] && gateway6=$(ubus call network.interface.$config status | jsonfilter -q -l 1 -e '@.inactive.route[@.target="::"].nexthop' | tr -d "\n") + if [ -z "$gateway6" ] || [ "$( valid_subnet6 $gateway6 )" != "ok" ]; then + gateway6=$(ubus call network.interface.$config status | jsonfilter -q -l 1 -e '@.route[@.target="::"].nexthop' | tr -d "\n") fi + if [ -z "$gateway6" ] || [ "$( valid_subnet6 $gateway6 )" != "ok" ]; then + gateway6=$(ubus call network.interface.${config}_6 status 2>/dev/null | jsonfilter -q -l 1 -e '@.inactive.route[@.target="::"].nexthop' | tr -d "\n") + fi + netmask6=$(ip -6 addr show dev $iface | grep -v 'scope link' | grep inet6 | awk '{print $2}' | cut -d/ -f2 | tr -d "\n") + network6=`ipcalc $ip6addr | sed -n '/NETWORK=/{;s/.*=//;s/ .*//;p;}'` fi if [ "$(uci -q get openmptcprouter.settings.uci_route)" = "1" ]; then uci -q batch <<-EOF >/dev/null From 6725ab4c45237367442bd0ef9d027ce9066f518a Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Sun, 26 Dec 2021 18:41:14 +0100 Subject: [PATCH 24/63] Remove some false errors --- luci-app-omr-bypass/root/etc/init.d/omr-bypass | 2 +- luci-app-omr-dscp/root/etc/init.d/omr-dscp | 4 ++-- openmptcprouter/files/etc/uci-defaults/2090-omr-wwan | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/luci-app-omr-bypass/root/etc/init.d/omr-bypass b/luci-app-omr-bypass/root/etc/init.d/omr-bypass index ed267449d..57d81c923 100755 --- a/luci-app-omr-bypass/root/etc/init.d/omr-bypass +++ b/luci-app-omr-bypass/root/etc/init.d/omr-bypass @@ -539,7 +539,7 @@ _intf_rule() { EOF else ip rule add prio 1 fwmark 0x539$count lookup $count pref 1 > /dev/null 2>&1 - ip -6 rule add prio 1 fwmark 0x6539$count lookup 6$count > /dev/null 2>&1 + ip -6 rule add prio 1 fwmark 0x6539$count lookup 6$count pref 1 > /dev/null 2>&1 fi } if [ "$(iptables-save | grep omr-bypass | grep omr_dst_bypass_$intf)" = "" ]; then diff --git a/luci-app-omr-dscp/root/etc/init.d/omr-dscp b/luci-app-omr-dscp/root/etc/init.d/omr-dscp index 9ea0d661f..4997e1cbc 100755 --- a/luci-app-omr-dscp/root/etc/init.d/omr-dscp +++ b/luci-app-omr-dscp/root/etc/init.d/omr-dscp @@ -19,10 +19,10 @@ config_get lan_device lan ifname config_load dscp _ipt4() { - iptables -w -t mangle "$@" + iptables -w -t mangle "$@" 2>&1 >/dev/null } _ipt6() { - ip6tables -w -t mangle "$@" + ip6tables -w -t mangle "$@" >/dev/null } _add_dscp_rule() { diff --git a/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan b/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan index 42d8f2555..cab4295ea 100755 --- a/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan +++ b/openmptcprouter/files/etc/uci-defaults/2090-omr-wwan @@ -4,9 +4,9 @@ if [ "$(grep usbmode /etc/rc.local)" = "" ]; then sed -i 's:exit 0::g' /etc/rc.local cat <<-EOF >> /etc/rc.local /bin/sleep 5 - /sbin/usbmode -l + /sbin/usbmode -l 2>&1 /dev/null /bin/sleep 3 - /sbin/usbmode -s + /sbin/usbmode -s 2>&1 /dev/null exit 0 EOF fi From 46efae0eabaf38f5dc0de40a94d762be2994769f Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Sun, 26 Dec 2021 18:41:29 +0100 Subject: [PATCH 25/63] Fix for wrt update --- openmptcprouter/files/etc/uci-defaults/2060-omr-system | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openmptcprouter/files/etc/uci-defaults/2060-omr-system b/openmptcprouter/files/etc/uci-defaults/2060-omr-system index 902dae6dc..dd68fb82c 100755 --- a/openmptcprouter/files/etc/uci-defaults/2060-omr-system +++ b/openmptcprouter/files/etc/uci-defaults/2060-omr-system @@ -24,5 +24,11 @@ fi uci -q set openmptcprouter.settings.scaling_governor='performance' uci -q commit openmptcprouter } +[ -n "$(ubus call system board | jsonfilter -e '@.board_name' | grep wrt)" ] && [ "$(uci -q get system.@system[0].compat_version)" == "" ] && { + uci -q batch <<-EOF >/dev/null + set system.@system[-1].compat_version='1.1' + commit system + EOF +} exit 0 \ No newline at end of file From 66c4476369a385e23717a4f30fe022da208f82b9 Mon Sep 17 00:00:00 2001 From: suyuan168 <175338101@qq.com> Date: Wed, 29 Dec 2021 21:20:45 +0800 Subject: [PATCH 26/63] update ndpi --- ndpi-netfilter2/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ndpi-netfilter2/Makefile b/ndpi-netfilter2/Makefile index b74ed75c1..286020c6c 100755 --- a/ndpi-netfilter2/Makefile +++ b/ndpi-netfilter2/Makefile @@ -10,14 +10,14 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=ndpi-netfilter2 -PKG_RELEASE:=3 -PKG_REV:=25a5c2e1d619aa2d819b18bed8276b3bd7eb4c5b -PKG_VERSION:=3.2-$(PKG_REV) +PKG_RELEASE:=4 +PKG_REV:=92a1be258117c6e68c5f5b92ce688e2cea089495 +PKG_VERSION:=4.0-$(PKG_REV) PKG_SOURCE_PROTO:=git PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) -PKG_SOURCE_URL:=https://github.com/vel21ripn/nDPI.git +PKG_SOURCE_URL:=https://github.com/ntop/nDPI.git PKG_SOURCE_VERSION:=$(PKG_REV) PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) From 526e36f691500621a980c532d3d617b343e1ac7a Mon Sep 17 00:00:00 2001 From: suyuan168 <175338101@qq.com> Date: Wed, 29 Dec 2021 23:13:35 +0800 Subject: [PATCH 27/63] Revert "update ndpi" This reverts commit 66c4476369a385e23717a4f30fe022da208f82b9. --- ndpi-netfilter2/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ndpi-netfilter2/Makefile b/ndpi-netfilter2/Makefile index 286020c6c..b74ed75c1 100755 --- a/ndpi-netfilter2/Makefile +++ b/ndpi-netfilter2/Makefile @@ -10,14 +10,14 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=ndpi-netfilter2 -PKG_RELEASE:=4 -PKG_REV:=92a1be258117c6e68c5f5b92ce688e2cea089495 -PKG_VERSION:=4.0-$(PKG_REV) +PKG_RELEASE:=3 +PKG_REV:=25a5c2e1d619aa2d819b18bed8276b3bd7eb4c5b +PKG_VERSION:=3.2-$(PKG_REV) PKG_SOURCE_PROTO:=git PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) -PKG_SOURCE_URL:=https://github.com/ntop/nDPI.git +PKG_SOURCE_URL:=https://github.com/vel21ripn/nDPI.git PKG_SOURCE_VERSION:=$(PKG_REV) PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) From c484f5c98ee5e9d5d8a7b53dd8fad4bd3b65d919 Mon Sep 17 00:00:00 2001 From: suyuan168 <175338101@qq.com> Date: Thu, 30 Dec 2021 00:00:09 +0800 Subject: [PATCH 28/63] update --- 6in4/Makefile | 0 CLA-entity.md | 0 CLA-individual.md | 0 CODE_OF_CONDUCT.md | 0 CONTRIBUTING.md | 0 LICENSE | 0 README.md | 20 +++++++++--------- bcm27xx-eeprom/Makefile | 0 ...1-rpi-eeprom-update-OpenWrt-defaults.patch | 0 ...m-update-change-default-include-path.patch | 0 .../0004-rpi-eeprom-update-remove-chmod.patch | 0 contributors/cr3ative.md | 0 contributors/example.md | 0 dsvpn/Makefile | 0 dsvpn/patches/nofirewall.patch | 0 dsvpn/patches/nostrip.patch | 0 glorytun-udp/Makefile | 0 glorytun-udp/patches/aegis-arm.patch | 0 glorytun/Makefile | 0 glorytun/glorytun.config | 0 golang-protobuf/Makefile | 0 golang/golang-build.sh | 0 golang/golang-compiler.mk | 0 golang/golang-golang-x-crypto/Makefile | 0 golang/golang-golang-x-net/Makefile | 0 golang/golang-golang-x-sys/Makefile | 0 golang/golang-golang-x-text/Makefile | 0 golang/golang-host-build.mk | 0 golang/golang-package.mk | 0 golang/golang-values.mk | 0 golang/golang/Config.in | 0 golang/golang/Makefile | 0 golang/golang/files/go-gcc-helper | 0 https-dns-proxy/Makefile | 0 https-dns-proxy/files/README.md | 0 https-dns-proxy/files/https-dns-proxy.config | 0 ipcalc/Makefile | 0 lcd4linux/Config.in | 0 lcd4linux/Makefile | 0 lcd4linux/files/lcd4linux.init | 0 .../120-remove-as-needed-linker-option.patch | 0 lcd4linux/patches/140-no_repnop_T6963.patch | 0 lcd4linux/patches/150-addlibmpdclient.patch | 0 lcd4linux/patches/160-uinput_defs.patch | 0 .../170-add-generic-spidev-driver.patch | 0 .../patches/173-glcd2usb-bigendian-fix.patch | 0 libell/Makefile | 0 luci-app-dsvpn/Makefile | 0 .../resources/view/services/dsvpn.js | 0 luci-app-dsvpn/po/fr/dsvpn.po | 0 luci-app-dsvpn/po/templates/dsvpn.pot | 0 luci-app-dsvpn/po/zh_Hans/dsvpn.po | 0 .../usr/share/luci/menu.d/luci-app-dsvpn.json | 0 .../usr/share/rpcd/acl.d/luci-app-dsvpn.json | 0 luci-app-firewall/Makefile | 0 .../luci-static/resources/tools/firewall.js | 0 .../resources/view/firewall/custom.js | 0 .../resources/view/firewall/forwards.js | 0 .../resources/view/firewall/rules.js | 0 .../resources/view/firewall/snats.js | 0 .../resources/view/firewall/zones.js | 0 luci-app-firewall/po/bg/firewall.po | 0 luci-app-firewall/po/ca/firewall.po | 0 luci-app-firewall/po/cs/firewall.po | 0 luci-app-firewall/po/de/firewall.po | 0 luci-app-firewall/po/el/firewall.po | 0 luci-app-firewall/po/en/firewall.po | 0 luci-app-firewall/po/es/firewall.po | 0 luci-app-firewall/po/fr/firewall.po | 0 luci-app-firewall/po/he/firewall.po | 0 luci-app-firewall/po/hi/firewall.po | 0 luci-app-firewall/po/hu/firewall.po | 0 luci-app-firewall/po/it/firewall.po | 0 luci-app-firewall/po/ja/firewall.po | 0 luci-app-firewall/po/ko/firewall.po | 0 luci-app-firewall/po/mr/firewall.po | 0 luci-app-firewall/po/ms/firewall.po | 0 luci-app-firewall/po/nb_NO/firewall.po | 0 luci-app-firewall/po/pl/firewall.po | 0 luci-app-firewall/po/pt/firewall.po | 0 luci-app-firewall/po/pt_BR/firewall.po | 0 luci-app-firewall/po/ro/firewall.po | 0 luci-app-firewall/po/ru/firewall.po | 0 luci-app-firewall/po/sk/firewall.po | 0 luci-app-firewall/po/sv/firewall.po | 0 luci-app-firewall/po/templates/firewall.pot | 0 luci-app-firewall/po/tr/firewall.po | 0 luci-app-firewall/po/uk/firewall.po | 0 luci-app-firewall/po/vi/firewall.po | 0 luci-app-firewall/po/zh_Hans/firewall.po | 0 luci-app-firewall/po/zh_Hant/firewall.po | 0 .../share/luci/menu.d/luci-app-firewall.json | 0 .../share/rpcd/acl.d/luci-app-firewall.json | 0 luci-app-glorytun-tcp/Makefile | 0 .../resources/view/services/glorytun-tcp.js | 0 luci-app-glorytun-tcp/po/fr/glorytun-tcp.po | 0 .../po/templates/glorytun-tcp.pot | 0 .../po/zh_Hans/glorytun-tcp.po | 0 .../root/etc/hotplug.d/iface/30-glorytun | 0 .../root/etc/uci-defaults/1200-luci-glorytun | 0 .../luci/menu.d/luci-app-glorytun-tcp.json | 0 .../rpcd/acl.d/luci-app-glorytun-tcp.json | 0 luci-app-glorytun-udp/Makefile | 0 .../resources/view/services/glorytun-udp.js | 0 luci-app-glorytun-udp/po/fr/glorytun-udp.po | 0 .../po/templates/glorytun-udp.pot | 0 .../po/zh_Hans/glorytun-udp.po | 0 .../root/etc/config/glorytun-udp | 0 .../root/etc/hotplug.d/iface/30-glorytun-udp | 0 .../etc/uci-defaults/1201-luci-glorytun-udp | 0 .../luci/menu.d/luci-app-glorytun-udp.json | 0 .../rpcd/acl.d/luci-app-glorytun-udp.json | 0 luci-app-haproxy-tcp/LICENSE | 0 luci-app-haproxy-tcp/Makefile | 0 luci-app-haproxy-tcp/README.md | 0 .../luasrc/controller/haproxy-tcp.lua | 0 .../luasrc/model/cbi/haproxy-tcp.lua | 0 luci-app-haproxy-tcp/po/fr/haproxy-tcp.po | 0 .../po/templates/haproxy-tcp.pot | 0 luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po | 0 .../root/etc/config/haproxy-tcp | 0 .../root/etc/uci-defaults/41_luci-haproxy-tcp | 0 luci-app-https-dns-proxy/Makefile | 0 .../luasrc/controller/https-dns-proxy.lua | 0 .../ch.digitale-gesellschaft.dns.lua | 0 .../providers.disabled/cn.rubyfish.dns.lua | 0 .../providers.disabled/sb.dns.lua | 0 .../providers/com.adguard.dns-family.lua | 0 .../providers/com.adguard.dns.lua | 0 .../providers/com.cloudflare-dns-family.lua | 0 .../providers/com.cloudflare-dns-malware.lua | 0 .../providers/com.cloudflare-dns.lua | 0 .../https-dns-proxy/providers/cz.nic.odvr.lua | 0 .../https-dns-proxy/providers/google.dns.lua | 0 .../providers/gr.libredns.doh-ads.lua | 0 .../providers/gr.libredns.doh.lua | 0 .../providers/net.quad9.dns.lua | 0 .../providers/net.quad9.dns10.lua | 0 .../providers/net.quad9.dns11.lua | 0 .../providers/net.quad9.dns9.lua | 0 .../providers/org.cleanbrowsing.doh-adult.lua | 0 .../org.cleanbrowsing.doh-family.lua | 0 .../org.cleanbrowsing.doh-security.lua | 0 .../luasrc/model/cbi/https-dns-proxy.lua | 0 .../luasrc/view/https-dns-proxy/buttons.htm | 0 .../luasrc/view/https-dns-proxy/css.htm | 0 .../luasrc/view/https-dns-proxy/js.htm | 0 .../view/https-dns-proxy/status-textarea.htm | 0 .../luasrc/view/https-dns-proxy/status.htm | 0 .../po/bg/https-dns-proxy.po | 0 .../po/ca/https-dns-proxy.po | 0 .../po/cs/https-dns-proxy.po | 0 .../po/de/https-dns-proxy.po | 0 .../po/el/https-dns-proxy.po | 0 .../po/en/https-dns-proxy.po | 0 .../po/es/https-dns-proxy.po | 0 .../po/fr/https-dns-proxy.po | 0 .../po/he/https-dns-proxy.po | 0 .../po/hi/https-dns-proxy.po | 0 .../po/hu/https-dns-proxy.po | 0 .../po/it/https-dns-proxy.po | 0 .../po/ja/https-dns-proxy.po | 0 .../po/ko/https-dns-proxy.po | 0 .../po/mr/https-dns-proxy.po | 0 .../po/ms/https-dns-proxy.po | 0 .../po/nb_NO/https-dns-proxy.po | 0 .../po/pl/https-dns-proxy.po | 0 .../po/pt/https-dns-proxy.po | 0 .../po/pt_BR/https-dns-proxy.po | 0 .../po/ro/https-dns-proxy.po | 0 .../po/ru/https-dns-proxy.po | 0 .../po/sk/https-dns-proxy.po | 0 .../po/sv/https-dns-proxy.po | 0 .../po/templates/https-dns-proxy.pot | 0 .../po/tr/https-dns-proxy.po | 0 .../po/uk/https-dns-proxy.po | 0 .../po/vi/https-dns-proxy.po | 0 .../po/zh_Hans/https-dns-proxy.po | 0 .../po/zh_Hant/https-dns-proxy.po | 0 .../etc/uci-defaults/40_luci-https-dns-proxy | 0 .../luci/menu.d/luci-app-https-dns-proxy.json | 0 .../rpcd/acl.d/luci-app-https-dns-proxy.json | 0 luci-app-iperf/Makefile | 0 luci-app-iperf/luasrc/controller/iperf.lua | 0 luci-app-iperf/luasrc/view/iperf/test.htm | 0 luci-app-iperf/po/de/iperf.po | 0 luci-app-iperf/po/fr/iperf.po | 0 luci-app-iperf/po/it/iperf.po | 0 luci-app-iperf/po/oc/iperf.po | 0 luci-app-iperf/po/templates/iperf.pot | 0 luci-app-iperf/po/zh_Hans/iperf.po | 0 luci-app-iperf/root/etc/config/iperf | 0 .../usr/share/luci/menu.d/luci-app-iperf.json | 0 .../usr/share/rpcd/acl.d/luci-app-iperf.json | 0 luci-app-macvlan/po/zh_Hans/macvlan.po | 0 luci-app-mail/Makefile | 0 luci-app-mail/luasrc/controller/mail.lua | 0 luci-app-mail/luasrc/model/cbi/mail.lua | 0 luci-app-mail/po/de/mail.po | 0 luci-app-mail/po/fr/mail.po | 0 luci-app-mail/po/it/mail.po | 0 luci-app-mail/po/oc/mail.po | 0 luci-app-mail/po/templates/mail.pot | 0 luci-app-mail/po/zh_Hans/mail.po | 0 luci-app-mail/root/etc/config/mail | 0 .../usr/share/luci/menu.d/luci-app-mail.json | 0 .../usr/share/rpcd/acl.d/luci-app-mail.json | 0 luci-app-mlvpn/Makefile | 0 .../resources/view/services/mlvpn.js | 0 luci-app-mlvpn/po/fr/mlvpn.po | 0 luci-app-mlvpn/po/templates/mlvpn.pot | 0 luci-app-mlvpn/po/zh_Hans/mlvpn.po | 0 .../usr/share/luci/menu.d/luci-app-mlvpn.json | 0 .../usr/share/rpcd/acl.d/luci-app-mlvpn.json | 0 luci-app-mptcp/Makefile | 0 .../luci-static/resources/seedrandom.js | 0 luci-app-mptcp/luasrc/controller/mptcp.lua | 0 luci-app-mptcp/luasrc/model/cbi/mptcp.lua | 0 .../luasrc/view/mptcp/mptcp_check.htm | 0 .../luasrc/view/mptcp/mptcp_connections.htm | 0 .../luasrc/view/mptcp/mptcp_fullmesh.htm | 0 .../luasrc/view/mptcp/mptcp_monitor.htm | 0 .../luasrc/view/mptcp/multipath.htm | 0 luci-app-mptcp/po/de/mptcp.po | 0 luci-app-mptcp/po/fr/mptcp.po | 0 luci-app-mptcp/po/it/mptcp.po | 0 luci-app-mptcp/po/oc/mptcp.po | 0 luci-app-mptcp/po/templates/mptcp.pot | 0 luci-app-mptcp/po/zh_Hans/mptcp.po | 0 .../usr/share/luci/menu.d/luci-app-mptcp.json | 0 .../usr/share/rpcd/acl.d/luci-app-mptcp.json | 0 luci-app-nginx-ha/LICENSE | 0 luci-app-nginx-ha/Makefile | 0 .../luasrc/controller/nginx-ha.lua | 0 .../luasrc/model/cbi/nginx-ha.lua | 0 luci-app-nginx-ha/po/fr/nginx-ha.po | 0 luci-app-nginx-ha/po/templates/nginx-ha.pot | 0 luci-app-nginx-ha/root/etc/config/nginx-ha | 0 .../root/etc/uci-defaults/42_luci-nginx-ha | 0 .../share/luci/menu.d/luci-app-nginx-ha.json | 0 .../share/rpcd/acl.d/luci-app-nginx-ha.json | 0 luci-app-omr-bypass/Makefile | 0 .../resources/view/services/omr-bypass.js | 0 luci-app-omr-bypass/po/de/omr-bypass.po | 0 luci-app-omr-bypass/po/fr/omr-bypass.po | 0 luci-app-omr-bypass/po/it/omr-bypass.po | 0 luci-app-omr-bypass/po/oc/omr-bypass.po | 0 .../po/templates/omr-bypass.pot | 0 luci-app-omr-bypass/po/zh_Hans/omr-bypass.po | 0 .../root/etc/config/omr-bypass | 0 .../root/etc/firewall.omr-bypass | 0 .../luci/menu.d/luci-app-omr-bypass.json | 0 .../share/rpcd/acl.d/luci-app-omr-bypass.json | 0 luci-app-omr-dscp/Makefile | 0 .../luasrc/controller/omr-dscp.lua | 0 .../luasrc/model/cbi/dscp-domains.lua | 0 luci-app-omr-dscp/luasrc/model/cbi/dscp.lua | 0 luci-app-omr-dscp/po/de/omr-dscp.po | 0 luci-app-omr-dscp/po/fr/omr-dscp.po | 0 luci-app-omr-dscp/po/it/omr-dscp.po | 0 luci-app-omr-dscp/po/oc/omr-dscp.po | 0 luci-app-omr-dscp/po/templates/omr-dscp.pot | 0 luci-app-omr-dscp/po/zh_Hans/omr-dscp.po | 0 luci-app-omr-dscp/root/etc/config/dscp | 0 .../share/luci/menu.d/luci-app-omr-dscp.json | 0 .../share/rpcd/acl.d/luci-app-omr-dscp.json | 0 luci-app-omr-quota/Makefile | 0 .../luasrc/controller/quota.lua | 0 .../luasrc/model/cbi/quota/quota.lua | 0 .../luasrc/view/omr-quota/cbi-select-add.htm | 0 luci-app-omr-quota/po/de/omr-quota.po | 0 luci-app-omr-quota/po/fr/omr-quota.po | 0 luci-app-omr-quota/po/it/omr-quota.po | 0 luci-app-omr-quota/po/oc/omr-quota.po | 0 luci-app-omr-quota/po/templates/omr-quota.pot | 0 luci-app-omr-quota/po/zh_Hans/omr-quota.po | 0 .../share/luci/menu.d/luci-app-omr-quota.json | 0 .../share/rpcd/acl.d/luci-app-omr-quota.json | 0 luci-app-omr-tracker/Makefile | 0 .../luasrc/controller/omr-tracker.lua | 0 .../luasrc/model/cbi/omr-tracker.lua | 0 .../view/omr-tracker/cbi-select-add.htm | 0 luci-app-omr-tracker/po/de/omr-tracker.po | 0 luci-app-omr-tracker/po/fr/omr-tracker.po | 0 luci-app-omr-tracker/po/it/omr-tracker.po | 0 luci-app-omr-tracker/po/oc/omr-tracker.po | 0 .../po/templates/omr-tracker.pot | 0 .../po/zh_Hans/omr-tracker.po | 0 .../root/etc/uci-defaults/42_luci-omr-tracker | 0 .../luci/menu.d/luci-app-omr-tracker.json | 0 .../rpcd/acl.d/luci-app-omr-tracker.json | 0 luci-app-openmptcprouter/Makefile | 0 .../luasrc/controller/openmptcprouter.lua | 0 .../luasrc/view/openmptcprouter/backup.htm | 0 .../luasrc/view/openmptcprouter/debug.htm | 0 .../luasrc/view/openmptcprouter/settings.htm | 0 .../luasrc/view/openmptcprouter/wanstatus.htm | 0 .../luasrc/view/openmptcprouter/wizard.htm | 0 .../po/de/openmptcprouter.po | 0 .../po/fr/openmptcprouter.po | 0 .../po/it/openmptcprouter.po | 0 .../po/oc/openmptcprouter.po | 0 .../po/templates/openmptcprouter.pot | 0 .../po/zh_Hans/openmptcprouter.po | 0 .../root/etc/config/openmptcprouter | 0 .../root/etc/hotplug.d/net/99-omr-rename | 0 .../root/etc/init.d/openmptcprouter | 6 +++--- .../luci/menu.d/luci-app-openmptcprouter.json | 0 .../rpcd/acl.d/luci-app-openmptcprouter.json | 0 luci-app-packet-capture/Makefile | 0 .../resources/view/packet_capture/tcpdump.js | 0 .../po/fr/packet-capture.po | 0 .../po/templates/packet-capture.pot | 0 .../root/etc/config/packet_capture | 0 .../luci/menu.d/luci-app-packet-capture.json | 0 .../rpcd/acl.d/luci-app-packet-capture.json | 0 luci-app-shadowsocks-libev/Makefile | 0 .../resources/shadowsocks-libev.js | 0 .../view/shadowsocks-libev/instances.js | 0 .../resources/view/shadowsocks-libev/rules.js | 0 .../view/shadowsocks-libev/servers.js | 0 .../luasrc/controller/shadowsocks-libev.lua | 0 .../po/bg/shadowsocks-libev.po | 0 .../po/ca/shadowsocks-libev.po | 0 .../po/cs/shadowsocks-libev.po | 0 .../po/de/shadowsocks-libev.po | 0 .../po/el/shadowsocks-libev.po | 0 .../po/en/shadowsocks-libev.po | 0 .../po/es/shadowsocks-libev.po | 0 .../po/fr/shadowsocks-libev.po | 0 .../po/he/shadowsocks-libev.po | 0 .../po/hi/shadowsocks-libev.po | 0 .../po/hu/shadowsocks-libev.po | 0 .../po/it/shadowsocks-libev.po | 0 .../po/ja/shadowsocks-libev.po | 0 .../po/ko/shadowsocks-libev.po | 0 .../po/ms/shadowsocks-libev.po | 0 .../po/nb_NO/shadowsocks-libev.po | 0 .../po/pl/shadowsocks-libev.po | 0 .../po/pt/shadowsocks-libev.po | 0 .../po/pt_BR/shadowsocks-libev.po | 0 .../po/ro/shadowsocks-libev.po | 0 .../po/ru/shadowsocks-libev.po | 0 .../po/sk/shadowsocks-libev.po | 0 .../po/sv/shadowsocks-libev.po | 0 .../po/templates/shadowsocks-libev.pot | 0 .../po/tr/shadowsocks-libev.po | 0 .../po/uk/shadowsocks-libev.po | 0 .../po/vi/shadowsocks-libev.po | 0 .../po/zh-cn/shadowsocks-libev.po | 0 .../po/zh-tw/shadowsocks-libev.po | 0 .../uci-defaults/40_luci-shadowsocks-libev | 0 .../menu.d/luci-app-shadowsocks-libev.json | 0 .../acl.d/luci-app-shadowsocks-libev.json | 0 luci-app-shutdown/Makefile | 0 .../resources/view/system/shutdown.js | 0 luci-app-shutdown/po/de/shutdown.po | 0 luci-app-shutdown/po/it/shutdown.po | 0 luci-app-shutdown/po/oc/shutdown.po | 0 luci-app-shutdown/po/pl/shutdown.po | 0 luci-app-shutdown/po/templates/shutdown.pot | 0 luci-app-shutdown/po/zh_Hans/shutdown.po | 0 .../share/luci/menu.d/luci-app-shutdown.json | 0 .../share/rpcd/acl.d/luci-app-shutdown.json | 0 luci-app-snmpd/Makefile | 0 luci-app-snmpd/luasrc/controller/snmpd.lua | 0 luci-app-snmpd/luasrc/model/cbi/snmpd.lua | 0 luci-app-snmpd/luasrc/view/snmpd.htm | 0 luci-app-snmpd/po/de/snmpd.po | 0 luci-app-snmpd/po/fr/snmpd.po | 0 luci-app-snmpd/po/it/snmpd.po | 0 luci-app-snmpd/po/oc/snmpd.po | 0 luci-app-snmpd/po/templates/snmpd.pot | 0 luci-app-snmpd/po/zh_Hans/snmpd.po | 0 luci-app-snmpd/root/etc/config/snmpd | 0 .../usr/share/luci/menu.d/luci-app-snmpd.json | 0 .../usr/share/rpcd/acl.d/luci-app-snmpd.json | 0 luci-app-sysupgrade/Makefile | 0 .../luasrc/view/sysupgrade.htm | 0 luci-app-sysupgrade/po/fr/sysupgrade.po | 0 .../po/templates/sysupgrade.pot | 0 .../luci/menu.d/luci-app-sysupgrade.json | 0 .../root/usr/share/rpcd/acl.d/sysupgrade.json | 0 .../www/luci-static/resources/sysupgrade.js | 0 luci-base/po/oc/base.po | 0 luci-base/po/templates/base.pot | 0 luci-mod-dashboard/Makefile | 0 .../resources/view/dashboard/css/custom.css | 0 .../view/dashboard/icons/devices.svg | 0 .../view/dashboard/icons/internet.svg | 0 .../view/dashboard/icons/not-internet.svg | 0 .../resources/view/dashboard/icons/router.svg | 0 .../view/dashboard/icons/wireless.svg | 0 .../view/dashboard/include/10_router.js | 0 .../view/dashboard/include/20_lan.js | 0 .../view/dashboard/include/30_wifi.js | 0 .../resources/view/dashboard/index.js | 0 .../share/luci/menu.d/luci-mod-dashboard.json | 0 .../share/rpcd/acl.d/luci-mod-dashboard.json | 0 luci-mod-network/Makefile | 0 .../resources/view/network/dhcp.js | 0 .../resources/view/network/diagnostics.js | 0 .../resources/view/network/hosts.js | 0 .../resources/view/network/interfaces.js | 0 .../resources/view/network/routes.js | 0 .../resources/view/network/switch.js | 0 .../resources/view/network/wireless.js | 0 .../share/luci/menu.d/luci-mod-network.json | 0 .../share/rpcd/acl.d/luci-mod-network.json | 0 luci-proto-mbim/Makefile | 0 .../luci-static/resources/protocol/mbim.js | 0 luci-theme-argon/Makefile | 0 luci-theme-argon/README.md | 0 luci-theme-argon/README_ZH.md | 0 .../Screenshots/screenshot_pc.jpg | Bin .../Screenshots/screenshot_phone.jpg | Bin .../luci-static/argon/background/README.md | 0 .../htdocs/luci-static/argon/css/cascade.css | 0 .../htdocs/luci-static/argon/css/dark.css | 0 .../htdocs/luci-static/argon/css/fonts.css | 0 .../htdocs/luci-static/argon/css/pure-min.css | 0 .../htdocs/luci-static/argon/favicon.ico | Bin .../luci-static/argon/fonts/TypoGraphica.eot | Bin .../luci-static/argon/fonts/TypoGraphica.svg | 0 .../luci-static/argon/fonts/TypoGraphica.ttf | Bin .../luci-static/argon/fonts/TypoGraphica.woff | Bin .../htdocs/luci-static/argon/fonts/argon.eot | Bin .../htdocs/luci-static/argon/fonts/argon.svg | 0 .../htdocs/luci-static/argon/fonts/argon.ttf | Bin .../htdocs/luci-static/argon/fonts/argon.woff | Bin .../argon/icon/android-icon-192x192.png | Bin .../argon/icon/apple-icon-144x144.png | Bin .../argon/icon/apple-icon-60x60.png | Bin .../argon/icon/apple-icon-72x72.png | Bin .../htdocs/luci-static/argon/icon/arrow.svg | 0 .../luci-static/argon/icon/browserconfig.xml | 0 .../luci-static/argon/icon/favicon-16x16.png | Bin .../luci-static/argon/icon/favicon-32x32.png | Bin .../luci-static/argon/icon/favicon-96x96.png | Bin .../luci-static/argon/icon/manifest.json | 0 .../argon/icon/ms-icon-144x144.png | Bin .../htdocs/luci-static/argon/icon/spinner.svg | 0 .../htdocs/luci-static/argon/img/argon.svg | 0 .../htdocs/luci-static/argon/img/bg1.jpg | Bin .../htdocs/luci-static/argon/img/blank.png | Bin .../luci-static/argon/img/volume_high.svg | 0 .../luci-static/argon/img/volume_off.svg | 0 .../htdocs/luci-static/argon/js/jquery.min.js | 0 .../luci-static/argon/js/polyfill.min.js | 0 .../htdocs/luci-static/argon/js/script.js | 0 .../luci-static/argon/less/cascade.less | 0 .../htdocs/luci-static/argon/less/dark.less | 0 .../luasrc/view/themes/argon/footer_login.htm | 0 .../luasrc/view/themes/argon/header.htm | 0 .../luasrc/view/themes/argon/header_login.htm | 0 .../view/themes/argon/out_footer_login.htm | 0 .../view/themes/argon/out_header_login.htm | 0 .../luasrc/view/themes/argon/sysauth.htm | 0 .../root/etc/uci-defaults/30_luci-theme-argon | 0 luci-theme-openmptcprouter/Makefile | 0 .../luci-static/openmptcprouter/html5.js | 0 .../luci-static/openmptcprouter/mobile.css | 0 .../resources/menu-openmptcprouter.js | 0 luci-theme-openwrt-2020/Makefile | 0 .../GalanoGrotesqueW00-Regular.woff2 | Bin .../luci-static/openwrt2020/cascade.css | 0 .../luci-static/openwrt2020/favicon.png | Bin .../luci-static/openwrt2020/omr-logo.png | Bin .../luci-static/openwrt2020/spinner.svg | 0 .../luci-static/resources/menu-openwrt2020.js | 0 .../luasrc/view/themes/openwrt2020/footer.htm | 0 .../luasrc/view/themes/openwrt2020/header.htm | 0 macvlan/Makefile | 0 macvlan/files/etc/config/macvlan | 0 .../etc/uci-defaults/40_luci-app-macvlan | 0 mlvpn/Makefile | 0 mlvpn/files/etc/config/mlvpn | 0 mlvpn/files/etc/uci-defaults/4100-mlvpn | 0 mptcp/Makefile | 0 mptcp/files/etc/hotplug.d/iface/30-mptcp | 0 mptcpd/Makefile | 0 msmtp/Makefile | 0 ndisc6/Makefile | 0 ndpi-netfilter2/Makefile | 0 net-tools/Makefile | 0 net-tools/patches/mptcp-support.patch | 0 nginx/Config.in | 0 nginx/Config_ssl.in | 0 nginx/Makefile | 0 .../files-luci-support/60_nginx-luci-support | 0 .../70_nginx-luci-support-ssl | 0 nginx/files-luci-support/luci_nginx.conf | 0 nginx/files-luci-support/luci_nginx_ssl.conf | 0 nginx/files-luci-support/luci_uwsgi.conf | 0 nginx/files/nginx.init | 0 .../100-no_by_lua_block.patch | 0 nginx/patches/101-feature_test_fix.patch | 0 nginx/patches/102-sizeof_test_fix.patch | 0 nginx/patches/103-sys_nerr.patch | 0 nginx/patches/200-config.patch | 0 .../patches/201-ignore-invalid-options.patch | 0 nginx/patches/300-max-processes.patch | 0 omr-6in4/Makefile | 0 omr-quota/Makefile | 0 omr-quota/files/etc/config/omr-quota | 0 omr-tracker/Makefile | 0 omr-tracker/files/etc/config/omr-tracker | 0 omr-update/Makefile | 0 openmptcprouter-full/Makefile | 0 openmptcprouter-mini/Makefile | 0 openmptcprouter/Makefile | 0 openmptcprouter/files/etc/firewall.gre-tunnel | 0 openmptcprouter/files/etc/firewall.omr-server | 0 openmptcprouter/files/etc/iproute2/rt_dsfield | 0 .../files/etc/sysctl.d/default.conf | 0 .../files/etc/uci-defaults/1940-omr-dns | 1 - openmptcprouter/files/etc/wgetrc4 | 0 protobuf/Makefile | 0 serdisplib/Makefile | 0 shadowsocks-libev/Makefile | 0 shadowsocks-libev/README.md | 0 shadowsocks-libev/files/firewall.ss-rules | 0 .../files/shadowsocks-libev.config | 0 .../files/shadowsocks-libev.init | 0 shadowsocks-libev/files/shadowsocks.conf | 0 .../patches/010-ECONNRESET.patch | 0 shadowsocks-v2ray-plugin/Makefile | 0 simple-obfs/LICENSE | 0 simple-obfs/Makefile | 0 speedtestc/Makefile | 0 tcptraceroute/Makefile | 0 .../patches/001-configure_cross_compile.patch | 0 tracebox/Makefile | 0 .../usr/share/tracebox/omr-mptcp-trace.lua | 0 tracebox/patches/101-build-fixes.patch | 0 tracebox/patches/102-configure.patch | 0 tracebox/patches/103-configure.patch | 0 tracebox/patches/104-ns_name_compress.patch | 0 .../patches/202-fix-lua-include-hpp.patch | 0 .../204-fix-lua-namespace-crafter.patch | 0 v2ray-core/Config.in | 0 v2ray-core/LICENSE | 0 v2ray-core/Makefile | 0 v2ray-core/files/etc/firewall.v2ray-rules | 0 .../files/etc/uci-defaults/3010-omr-v2ray | 0 v2ray-ext/Makefile | 0 546 files changed, 13 insertions(+), 14 deletions(-) mode change 100755 => 100644 6in4/Makefile mode change 100755 => 100644 CLA-entity.md mode change 100755 => 100644 CLA-individual.md mode change 100755 => 100644 CODE_OF_CONDUCT.md mode change 100755 => 100644 CONTRIBUTING.md mode change 100755 => 100644 LICENSE mode change 100755 => 100644 README.md mode change 100755 => 100644 bcm27xx-eeprom/Makefile mode change 100755 => 100644 bcm27xx-eeprom/patches/0001-rpi-eeprom-update-OpenWrt-defaults.patch mode change 100755 => 100644 bcm27xx-eeprom/patches/0003-rpi-eeprom-update-change-default-include-path.patch mode change 100755 => 100644 bcm27xx-eeprom/patches/0004-rpi-eeprom-update-remove-chmod.patch mode change 100755 => 100644 contributors/cr3ative.md mode change 100755 => 100644 contributors/example.md mode change 100755 => 100644 dsvpn/Makefile mode change 100755 => 100644 dsvpn/patches/nofirewall.patch mode change 100755 => 100644 dsvpn/patches/nostrip.patch mode change 100755 => 100644 glorytun-udp/Makefile mode change 100755 => 100644 glorytun-udp/patches/aegis-arm.patch mode change 100755 => 100644 glorytun/Makefile mode change 100755 => 100644 glorytun/glorytun.config mode change 100755 => 100644 golang-protobuf/Makefile mode change 100755 => 100644 golang/golang-build.sh mode change 100755 => 100644 golang/golang-compiler.mk mode change 100755 => 100644 golang/golang-golang-x-crypto/Makefile mode change 100755 => 100644 golang/golang-golang-x-net/Makefile mode change 100755 => 100644 golang/golang-golang-x-sys/Makefile mode change 100755 => 100644 golang/golang-golang-x-text/Makefile mode change 100755 => 100644 golang/golang-host-build.mk mode change 100755 => 100644 golang/golang-package.mk mode change 100755 => 100644 golang/golang-values.mk mode change 100755 => 100644 golang/golang/Config.in mode change 100755 => 100644 golang/golang/Makefile mode change 100755 => 100644 golang/golang/files/go-gcc-helper mode change 100755 => 100644 https-dns-proxy/Makefile mode change 100755 => 100644 https-dns-proxy/files/README.md mode change 100755 => 100644 https-dns-proxy/files/https-dns-proxy.config mode change 100755 => 100644 ipcalc/Makefile mode change 100755 => 100644 lcd4linux/Config.in mode change 100755 => 100644 lcd4linux/Makefile mode change 100755 => 100644 lcd4linux/files/lcd4linux.init mode change 100755 => 100644 lcd4linux/patches/120-remove-as-needed-linker-option.patch mode change 100755 => 100644 lcd4linux/patches/140-no_repnop_T6963.patch mode change 100755 => 100644 lcd4linux/patches/150-addlibmpdclient.patch mode change 100755 => 100644 lcd4linux/patches/160-uinput_defs.patch mode change 100755 => 100644 lcd4linux/patches/170-add-generic-spidev-driver.patch mode change 100755 => 100644 lcd4linux/patches/173-glcd2usb-bigendian-fix.patch mode change 100755 => 100644 libell/Makefile mode change 100755 => 100644 luci-app-dsvpn/Makefile mode change 100755 => 100644 luci-app-dsvpn/htdocs/luci-static/resources/view/services/dsvpn.js mode change 100755 => 100644 luci-app-dsvpn/po/fr/dsvpn.po mode change 100755 => 100644 luci-app-dsvpn/po/templates/dsvpn.pot mode change 100755 => 100644 luci-app-dsvpn/po/zh_Hans/dsvpn.po mode change 100755 => 100644 luci-app-dsvpn/root/usr/share/luci/menu.d/luci-app-dsvpn.json mode change 100755 => 100644 luci-app-dsvpn/root/usr/share/rpcd/acl.d/luci-app-dsvpn.json mode change 100755 => 100644 luci-app-firewall/Makefile mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js mode change 100755 => 100644 luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js mode change 100755 => 100644 luci-app-firewall/po/bg/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ca/firewall.po mode change 100755 => 100644 luci-app-firewall/po/cs/firewall.po mode change 100755 => 100644 luci-app-firewall/po/de/firewall.po mode change 100755 => 100644 luci-app-firewall/po/el/firewall.po mode change 100755 => 100644 luci-app-firewall/po/en/firewall.po mode change 100755 => 100644 luci-app-firewall/po/es/firewall.po mode change 100755 => 100644 luci-app-firewall/po/fr/firewall.po mode change 100755 => 100644 luci-app-firewall/po/he/firewall.po mode change 100755 => 100644 luci-app-firewall/po/hi/firewall.po mode change 100755 => 100644 luci-app-firewall/po/hu/firewall.po mode change 100755 => 100644 luci-app-firewall/po/it/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ja/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ko/firewall.po mode change 100755 => 100644 luci-app-firewall/po/mr/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ms/firewall.po mode change 100755 => 100644 luci-app-firewall/po/nb_NO/firewall.po mode change 100755 => 100644 luci-app-firewall/po/pl/firewall.po mode change 100755 => 100644 luci-app-firewall/po/pt/firewall.po mode change 100755 => 100644 luci-app-firewall/po/pt_BR/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ro/firewall.po mode change 100755 => 100644 luci-app-firewall/po/ru/firewall.po mode change 100755 => 100644 luci-app-firewall/po/sk/firewall.po mode change 100755 => 100644 luci-app-firewall/po/sv/firewall.po mode change 100755 => 100644 luci-app-firewall/po/templates/firewall.pot mode change 100755 => 100644 luci-app-firewall/po/tr/firewall.po mode change 100755 => 100644 luci-app-firewall/po/uk/firewall.po mode change 100755 => 100644 luci-app-firewall/po/vi/firewall.po mode change 100755 => 100644 luci-app-firewall/po/zh_Hans/firewall.po mode change 100755 => 100644 luci-app-firewall/po/zh_Hant/firewall.po mode change 100755 => 100644 luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json mode change 100755 => 100644 luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json mode change 100755 => 100644 luci-app-glorytun-tcp/Makefile mode change 100755 => 100644 luci-app-glorytun-tcp/htdocs/luci-static/resources/view/services/glorytun-tcp.js mode change 100755 => 100644 luci-app-glorytun-tcp/po/fr/glorytun-tcp.po mode change 100755 => 100644 luci-app-glorytun-tcp/po/templates/glorytun-tcp.pot mode change 100755 => 100644 luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po mode change 100755 => 100644 luci-app-glorytun-tcp/root/etc/hotplug.d/iface/30-glorytun mode change 100755 => 100644 luci-app-glorytun-tcp/root/etc/uci-defaults/1200-luci-glorytun mode change 100755 => 100644 luci-app-glorytun-tcp/root/usr/share/luci/menu.d/luci-app-glorytun-tcp.json mode change 100755 => 100644 luci-app-glorytun-tcp/root/usr/share/rpcd/acl.d/luci-app-glorytun-tcp.json mode change 100755 => 100644 luci-app-glorytun-udp/Makefile mode change 100755 => 100644 luci-app-glorytun-udp/htdocs/luci-static/resources/view/services/glorytun-udp.js mode change 100755 => 100644 luci-app-glorytun-udp/po/fr/glorytun-udp.po mode change 100755 => 100644 luci-app-glorytun-udp/po/templates/glorytun-udp.pot mode change 100755 => 100644 luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po mode change 100755 => 100644 luci-app-glorytun-udp/root/etc/config/glorytun-udp mode change 100755 => 100644 luci-app-glorytun-udp/root/etc/hotplug.d/iface/30-glorytun-udp mode change 100755 => 100644 luci-app-glorytun-udp/root/etc/uci-defaults/1201-luci-glorytun-udp mode change 100755 => 100644 luci-app-glorytun-udp/root/usr/share/luci/menu.d/luci-app-glorytun-udp.json mode change 100755 => 100644 luci-app-glorytun-udp/root/usr/share/rpcd/acl.d/luci-app-glorytun-udp.json mode change 100755 => 100644 luci-app-haproxy-tcp/LICENSE mode change 100755 => 100644 luci-app-haproxy-tcp/Makefile mode change 100755 => 100644 luci-app-haproxy-tcp/README.md mode change 100755 => 100644 luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua mode change 100755 => 100644 luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua mode change 100755 => 100644 luci-app-haproxy-tcp/po/fr/haproxy-tcp.po mode change 100755 => 100644 luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot mode change 100755 => 100644 luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po mode change 100755 => 100644 luci-app-haproxy-tcp/root/etc/config/haproxy-tcp mode change 100755 => 100644 luci-app-haproxy-tcp/root/etc/uci-defaults/41_luci-haproxy-tcp mode change 100755 => 100644 luci-app-https-dns-proxy/Makefile mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/controller/https-dns-proxy.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ch.digitale-gesellschaft.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/cn.rubyfish.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/sb.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns-family.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-family.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-malware.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cz.nic.odvr.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/google.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh-ads.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-adult.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-family.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-security.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/css.htm mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/js.htm mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status-textarea.htm mode change 100755 => 100644 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status.htm mode change 100755 => 100644 luci-app-https-dns-proxy/po/bg/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ca/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/cs/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/de/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/el/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/en/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/es/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/fr/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/he/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/hi/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/hu/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/it/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ja/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ko/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/mr/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ms/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/nb_NO/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/pl/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/pt/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/pt_BR/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ro/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/ru/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/sk/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/sv/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/templates/https-dns-proxy.pot mode change 100755 => 100644 luci-app-https-dns-proxy/po/tr/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/uk/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/vi/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/zh_Hans/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/po/zh_Hant/https-dns-proxy.po mode change 100755 => 100644 luci-app-https-dns-proxy/root/etc/uci-defaults/40_luci-https-dns-proxy mode change 100755 => 100644 luci-app-https-dns-proxy/root/usr/share/luci/menu.d/luci-app-https-dns-proxy.json mode change 100755 => 100644 luci-app-https-dns-proxy/root/usr/share/rpcd/acl.d/luci-app-https-dns-proxy.json mode change 100755 => 100644 luci-app-iperf/Makefile mode change 100755 => 100644 luci-app-iperf/luasrc/controller/iperf.lua mode change 100755 => 100644 luci-app-iperf/luasrc/view/iperf/test.htm mode change 100755 => 100644 luci-app-iperf/po/de/iperf.po mode change 100755 => 100644 luci-app-iperf/po/fr/iperf.po mode change 100755 => 100644 luci-app-iperf/po/it/iperf.po mode change 100755 => 100644 luci-app-iperf/po/oc/iperf.po mode change 100755 => 100644 luci-app-iperf/po/templates/iperf.pot mode change 100755 => 100644 luci-app-iperf/po/zh_Hans/iperf.po mode change 100755 => 100644 luci-app-iperf/root/etc/config/iperf mode change 100755 => 100644 luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json mode change 100755 => 100644 luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json mode change 100755 => 100644 luci-app-macvlan/po/zh_Hans/macvlan.po mode change 100755 => 100644 luci-app-mail/Makefile mode change 100755 => 100644 luci-app-mail/luasrc/controller/mail.lua mode change 100755 => 100644 luci-app-mail/luasrc/model/cbi/mail.lua mode change 100755 => 100644 luci-app-mail/po/de/mail.po mode change 100755 => 100644 luci-app-mail/po/fr/mail.po mode change 100755 => 100644 luci-app-mail/po/it/mail.po mode change 100755 => 100644 luci-app-mail/po/oc/mail.po mode change 100755 => 100644 luci-app-mail/po/templates/mail.pot mode change 100755 => 100644 luci-app-mail/po/zh_Hans/mail.po mode change 100755 => 100644 luci-app-mail/root/etc/config/mail mode change 100755 => 100644 luci-app-mail/root/usr/share/luci/menu.d/luci-app-mail.json mode change 100755 => 100644 luci-app-mail/root/usr/share/rpcd/acl.d/luci-app-mail.json mode change 100755 => 100644 luci-app-mlvpn/Makefile mode change 100755 => 100644 luci-app-mlvpn/htdocs/luci-static/resources/view/services/mlvpn.js mode change 100755 => 100644 luci-app-mlvpn/po/fr/mlvpn.po mode change 100755 => 100644 luci-app-mlvpn/po/templates/mlvpn.pot mode change 100755 => 100644 luci-app-mlvpn/po/zh_Hans/mlvpn.po mode change 100755 => 100644 luci-app-mlvpn/root/usr/share/luci/menu.d/luci-app-mlvpn.json mode change 100755 => 100644 luci-app-mlvpn/root/usr/share/rpcd/acl.d/luci-app-mlvpn.json mode change 100755 => 100644 luci-app-mptcp/Makefile mode change 100755 => 100644 luci-app-mptcp/htdocs/luci-static/resources/seedrandom.js mode change 100755 => 100644 luci-app-mptcp/luasrc/controller/mptcp.lua mode change 100755 => 100644 luci-app-mptcp/luasrc/model/cbi/mptcp.lua mode change 100755 => 100644 luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm mode change 100755 => 100644 luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm mode change 100755 => 100644 luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm mode change 100755 => 100644 luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm mode change 100755 => 100644 luci-app-mptcp/luasrc/view/mptcp/multipath.htm mode change 100755 => 100644 luci-app-mptcp/po/de/mptcp.po mode change 100755 => 100644 luci-app-mptcp/po/fr/mptcp.po mode change 100755 => 100644 luci-app-mptcp/po/it/mptcp.po mode change 100755 => 100644 luci-app-mptcp/po/oc/mptcp.po mode change 100755 => 100644 luci-app-mptcp/po/templates/mptcp.pot mode change 100755 => 100644 luci-app-mptcp/po/zh_Hans/mptcp.po mode change 100755 => 100644 luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json mode change 100755 => 100644 luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json mode change 100755 => 100644 luci-app-nginx-ha/LICENSE mode change 100755 => 100644 luci-app-nginx-ha/Makefile mode change 100755 => 100644 luci-app-nginx-ha/luasrc/controller/nginx-ha.lua mode change 100755 => 100644 luci-app-nginx-ha/luasrc/model/cbi/nginx-ha.lua mode change 100755 => 100644 luci-app-nginx-ha/po/fr/nginx-ha.po mode change 100755 => 100644 luci-app-nginx-ha/po/templates/nginx-ha.pot mode change 100755 => 100644 luci-app-nginx-ha/root/etc/config/nginx-ha mode change 100755 => 100644 luci-app-nginx-ha/root/etc/uci-defaults/42_luci-nginx-ha mode change 100755 => 100644 luci-app-nginx-ha/root/usr/share/luci/menu.d/luci-app-nginx-ha.json mode change 100755 => 100644 luci-app-nginx-ha/root/usr/share/rpcd/acl.d/luci-app-nginx-ha.json mode change 100755 => 100644 luci-app-omr-bypass/Makefile mode change 100755 => 100644 luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js mode change 100755 => 100644 luci-app-omr-bypass/po/de/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/po/fr/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/po/it/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/po/oc/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/po/templates/omr-bypass.pot mode change 100755 => 100644 luci-app-omr-bypass/po/zh_Hans/omr-bypass.po mode change 100755 => 100644 luci-app-omr-bypass/root/etc/config/omr-bypass mode change 100755 => 100644 luci-app-omr-bypass/root/etc/firewall.omr-bypass mode change 100755 => 100644 luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json mode change 100755 => 100644 luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json mode change 100755 => 100644 luci-app-omr-dscp/Makefile mode change 100755 => 100644 luci-app-omr-dscp/luasrc/controller/omr-dscp.lua mode change 100755 => 100644 luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua mode change 100755 => 100644 luci-app-omr-dscp/luasrc/model/cbi/dscp.lua mode change 100755 => 100644 luci-app-omr-dscp/po/de/omr-dscp.po mode change 100755 => 100644 luci-app-omr-dscp/po/fr/omr-dscp.po mode change 100755 => 100644 luci-app-omr-dscp/po/it/omr-dscp.po mode change 100755 => 100644 luci-app-omr-dscp/po/oc/omr-dscp.po mode change 100755 => 100644 luci-app-omr-dscp/po/templates/omr-dscp.pot mode change 100755 => 100644 luci-app-omr-dscp/po/zh_Hans/omr-dscp.po mode change 100755 => 100644 luci-app-omr-dscp/root/etc/config/dscp mode change 100755 => 100644 luci-app-omr-dscp/root/usr/share/luci/menu.d/luci-app-omr-dscp.json mode change 100755 => 100644 luci-app-omr-dscp/root/usr/share/rpcd/acl.d/luci-app-omr-dscp.json mode change 100755 => 100644 luci-app-omr-quota/Makefile mode change 100755 => 100644 luci-app-omr-quota/luasrc/controller/quota.lua mode change 100755 => 100644 luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua mode change 100755 => 100644 luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm mode change 100755 => 100644 luci-app-omr-quota/po/de/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/po/fr/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/po/it/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/po/oc/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/po/templates/omr-quota.pot mode change 100755 => 100644 luci-app-omr-quota/po/zh_Hans/omr-quota.po mode change 100755 => 100644 luci-app-omr-quota/root/usr/share/luci/menu.d/luci-app-omr-quota.json mode change 100755 => 100644 luci-app-omr-quota/root/usr/share/rpcd/acl.d/luci-app-omr-quota.json mode change 100755 => 100644 luci-app-omr-tracker/Makefile mode change 100755 => 100644 luci-app-omr-tracker/luasrc/controller/omr-tracker.lua mode change 100755 => 100644 luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua mode change 100755 => 100644 luci-app-omr-tracker/luasrc/view/omr-tracker/cbi-select-add.htm mode change 100755 => 100644 luci-app-omr-tracker/po/de/omr-tracker.po mode change 100755 => 100644 luci-app-omr-tracker/po/fr/omr-tracker.po mode change 100755 => 100644 luci-app-omr-tracker/po/it/omr-tracker.po mode change 100755 => 100644 luci-app-omr-tracker/po/oc/omr-tracker.po mode change 100755 => 100644 luci-app-omr-tracker/po/templates/omr-tracker.pot mode change 100755 => 100644 luci-app-omr-tracker/po/zh_Hans/omr-tracker.po mode change 100755 => 100644 luci-app-omr-tracker/root/etc/uci-defaults/42_luci-omr-tracker mode change 100755 => 100644 luci-app-omr-tracker/root/usr/share/luci/menu.d/luci-app-omr-tracker.json mode change 100755 => 100644 luci-app-omr-tracker/root/usr/share/rpcd/acl.d/luci-app-omr-tracker.json mode change 100755 => 100644 luci-app-openmptcprouter/Makefile mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm mode change 100755 => 100644 luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm mode change 100755 => 100644 luci-app-openmptcprouter/po/de/openmptcprouter.po mode change 100755 => 100644 luci-app-openmptcprouter/po/fr/openmptcprouter.po mode change 100755 => 100644 luci-app-openmptcprouter/po/it/openmptcprouter.po mode change 100755 => 100644 luci-app-openmptcprouter/po/oc/openmptcprouter.po mode change 100755 => 100644 luci-app-openmptcprouter/po/templates/openmptcprouter.pot mode change 100755 => 100644 luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po mode change 100755 => 100644 luci-app-openmptcprouter/root/etc/config/openmptcprouter mode change 100755 => 100644 luci-app-openmptcprouter/root/etc/hotplug.d/net/99-omr-rename mode change 100755 => 100644 luci-app-openmptcprouter/root/usr/share/luci/menu.d/luci-app-openmptcprouter.json mode change 100755 => 100644 luci-app-openmptcprouter/root/usr/share/rpcd/acl.d/luci-app-openmptcprouter.json mode change 100755 => 100644 luci-app-packet-capture/Makefile mode change 100755 => 100644 luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js mode change 100755 => 100644 luci-app-packet-capture/po/fr/packet-capture.po mode change 100755 => 100644 luci-app-packet-capture/po/templates/packet-capture.pot mode change 100755 => 100644 luci-app-packet-capture/root/etc/config/packet_capture mode change 100755 => 100644 luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json mode change 100755 => 100644 luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json mode change 100755 => 100644 luci-app-shadowsocks-libev/Makefile mode change 100755 => 100644 luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js mode change 100755 => 100644 luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js mode change 100755 => 100644 luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js mode change 100755 => 100644 luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js mode change 100755 => 100644 luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua mode change 100755 => 100644 luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/de/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/el/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/en/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/es/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/fr/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/he/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/hi/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/hu/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/it/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ja/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ko/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ms/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/nb_NO/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/pt/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/pt_BR/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ro/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/ru/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/sk/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/sv/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot mode change 100755 => 100644 luci-app-shadowsocks-libev/po/tr/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/uk/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/vi/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/po/zh-tw/shadowsocks-libev.po mode change 100755 => 100644 luci-app-shadowsocks-libev/root/etc/uci-defaults/40_luci-shadowsocks-libev mode change 100755 => 100644 luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json mode change 100755 => 100644 luci-app-shadowsocks-libev/root/usr/share/rpcd/acl.d/luci-app-shadowsocks-libev.json mode change 100755 => 100644 luci-app-shutdown/Makefile mode change 100755 => 100644 luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js mode change 100755 => 100644 luci-app-shutdown/po/de/shutdown.po mode change 100755 => 100644 luci-app-shutdown/po/it/shutdown.po mode change 100755 => 100644 luci-app-shutdown/po/oc/shutdown.po mode change 100755 => 100644 luci-app-shutdown/po/pl/shutdown.po mode change 100755 => 100644 luci-app-shutdown/po/templates/shutdown.pot mode change 100755 => 100644 luci-app-shutdown/po/zh_Hans/shutdown.po mode change 100755 => 100644 luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json mode change 100755 => 100644 luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json mode change 100755 => 100644 luci-app-snmpd/Makefile mode change 100755 => 100644 luci-app-snmpd/luasrc/controller/snmpd.lua mode change 100755 => 100644 luci-app-snmpd/luasrc/model/cbi/snmpd.lua mode change 100755 => 100644 luci-app-snmpd/luasrc/view/snmpd.htm mode change 100755 => 100644 luci-app-snmpd/po/de/snmpd.po mode change 100755 => 100644 luci-app-snmpd/po/fr/snmpd.po mode change 100755 => 100644 luci-app-snmpd/po/it/snmpd.po mode change 100755 => 100644 luci-app-snmpd/po/oc/snmpd.po mode change 100755 => 100644 luci-app-snmpd/po/templates/snmpd.pot mode change 100755 => 100644 luci-app-snmpd/po/zh_Hans/snmpd.po mode change 100755 => 100644 luci-app-snmpd/root/etc/config/snmpd mode change 100755 => 100644 luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json mode change 100755 => 100644 luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json mode change 100755 => 100644 luci-app-sysupgrade/Makefile mode change 100755 => 100644 luci-app-sysupgrade/luasrc/view/sysupgrade.htm mode change 100755 => 100644 luci-app-sysupgrade/po/fr/sysupgrade.po mode change 100755 => 100644 luci-app-sysupgrade/po/templates/sysupgrade.pot mode change 100755 => 100644 luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json mode change 100755 => 100644 luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json mode change 100755 => 100644 luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js mode change 100755 => 100644 luci-base/po/oc/base.po mode change 100755 => 100644 luci-base/po/templates/base.pot mode change 100755 => 100644 luci-mod-dashboard/Makefile mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js mode change 100755 => 100644 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js mode change 100755 => 100644 luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json mode change 100755 => 100644 luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json mode change 100755 => 100644 luci-mod-network/Makefile mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/routes.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/switch.js mode change 100755 => 100644 luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js mode change 100755 => 100644 luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json mode change 100755 => 100644 luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json mode change 100755 => 100644 luci-proto-mbim/Makefile mode change 100755 => 100644 luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js mode change 100755 => 100644 luci-theme-argon/Makefile mode change 100755 => 100644 luci-theme-argon/README.md mode change 100755 => 100644 luci-theme-argon/README_ZH.md mode change 100755 => 100644 luci-theme-argon/Screenshots/screenshot_pc.jpg mode change 100755 => 100644 luci-theme-argon/Screenshots/screenshot_phone.jpg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/background/README.md mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/css/cascade.css mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/css/dark.css mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/css/fonts.css mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/css/pure-min.css mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/favicon.ico mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/img/argon.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/img/blank.png mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/js/polyfill.min.js mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/js/script.js mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/less/cascade.less mode change 100755 => 100644 luci-theme-argon/htdocs/luci-static/argon/less/dark.less mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/footer_login.htm mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/header.htm mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/header_login.htm mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm mode change 100755 => 100644 luci-theme-argon/luasrc/view/themes/argon/sysauth.htm mode change 100755 => 100644 luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon mode change 100755 => 100644 luci-theme-openmptcprouter/Makefile mode change 100755 => 100644 luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/html5.js mode change 100755 => 100644 luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/mobile.css mode change 100755 => 100644 luci-theme-openmptcprouter/htdocs/luci-static/resources/menu-openmptcprouter.js mode change 100755 => 100644 luci-theme-openwrt-2020/Makefile mode change 100755 => 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 mode change 100755 => 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css mode change 100755 => 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png mode change 100755 => 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/omr-logo.png mode change 100755 => 100644 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg mode change 100755 => 100644 luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js mode change 100755 => 100644 luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm mode change 100755 => 100644 luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm mode change 100755 => 100644 macvlan/Makefile mode change 100755 => 100644 macvlan/files/etc/config/macvlan mode change 100755 => 100644 macvlan/files/etc/uci-defaults/40_luci-app-macvlan mode change 100755 => 100644 mlvpn/Makefile mode change 100755 => 100644 mlvpn/files/etc/config/mlvpn mode change 100755 => 100644 mlvpn/files/etc/uci-defaults/4100-mlvpn mode change 100755 => 100644 mptcp/Makefile mode change 100755 => 100644 mptcp/files/etc/hotplug.d/iface/30-mptcp mode change 100755 => 100644 mptcpd/Makefile mode change 100755 => 100644 msmtp/Makefile mode change 100755 => 100644 ndisc6/Makefile mode change 100755 => 100644 ndpi-netfilter2/Makefile mode change 100755 => 100644 net-tools/Makefile mode change 100755 => 100644 net-tools/patches/mptcp-support.patch mode change 100755 => 100644 nginx/Config.in mode change 100755 => 100644 nginx/Config_ssl.in mode change 100755 => 100644 nginx/Makefile mode change 100755 => 100644 nginx/files-luci-support/60_nginx-luci-support mode change 100755 => 100644 nginx/files-luci-support/70_nginx-luci-support-ssl mode change 100755 => 100644 nginx/files-luci-support/luci_nginx.conf mode change 100755 => 100644 nginx/files-luci-support/luci_nginx_ssl.conf mode change 100755 => 100644 nginx/files-luci-support/luci_uwsgi.conf mode change 100755 => 100644 nginx/files/nginx.init mode change 100755 => 100644 nginx/patches-lua-nginx/100-no_by_lua_block.patch mode change 100755 => 100644 nginx/patches/101-feature_test_fix.patch mode change 100755 => 100644 nginx/patches/102-sizeof_test_fix.patch mode change 100755 => 100644 nginx/patches/103-sys_nerr.patch mode change 100755 => 100644 nginx/patches/200-config.patch mode change 100755 => 100644 nginx/patches/201-ignore-invalid-options.patch mode change 100755 => 100644 nginx/patches/300-max-processes.patch mode change 100755 => 100644 omr-6in4/Makefile mode change 100755 => 100644 omr-quota/Makefile mode change 100755 => 100644 omr-quota/files/etc/config/omr-quota mode change 100755 => 100644 omr-tracker/Makefile mode change 100755 => 100644 omr-tracker/files/etc/config/omr-tracker mode change 100755 => 100644 omr-update/Makefile mode change 100755 => 100644 openmptcprouter-full/Makefile mode change 100755 => 100644 openmptcprouter-mini/Makefile mode change 100755 => 100644 openmptcprouter/Makefile mode change 100755 => 100644 openmptcprouter/files/etc/firewall.gre-tunnel mode change 100755 => 100644 openmptcprouter/files/etc/firewall.omr-server mode change 100755 => 100644 openmptcprouter/files/etc/iproute2/rt_dsfield mode change 100755 => 100644 openmptcprouter/files/etc/sysctl.d/default.conf mode change 100755 => 100644 openmptcprouter/files/etc/wgetrc4 mode change 100755 => 100644 protobuf/Makefile mode change 100755 => 100644 serdisplib/Makefile mode change 100755 => 100644 shadowsocks-libev/Makefile mode change 100755 => 100644 shadowsocks-libev/README.md mode change 100755 => 100644 shadowsocks-libev/files/firewall.ss-rules mode change 100755 => 100644 shadowsocks-libev/files/shadowsocks-libev.config mode change 100755 => 100644 shadowsocks-libev/files/shadowsocks-libev.init mode change 100755 => 100644 shadowsocks-libev/files/shadowsocks.conf mode change 100755 => 100644 shadowsocks-libev/patches/010-ECONNRESET.patch mode change 100755 => 100644 shadowsocks-v2ray-plugin/Makefile mode change 100755 => 100644 simple-obfs/LICENSE mode change 100755 => 100644 simple-obfs/Makefile mode change 100755 => 100644 speedtestc/Makefile mode change 100755 => 100644 tcptraceroute/Makefile mode change 100755 => 100644 tcptraceroute/patches/001-configure_cross_compile.patch mode change 100755 => 100644 tracebox/Makefile mode change 100755 => 100644 tracebox/files/usr/share/tracebox/omr-mptcp-trace.lua mode change 100755 => 100644 tracebox/patches/101-build-fixes.patch mode change 100755 => 100644 tracebox/patches/102-configure.patch mode change 100755 => 100644 tracebox/patches/103-configure.patch mode change 100755 => 100644 tracebox/patches/104-ns_name_compress.patch mode change 100755 => 100644 tracebox/patches/202-fix-lua-include-hpp.patch mode change 100755 => 100644 tracebox/patches/204-fix-lua-namespace-crafter.patch mode change 100755 => 100644 v2ray-core/Config.in mode change 100755 => 100644 v2ray-core/LICENSE mode change 100755 => 100644 v2ray-core/Makefile mode change 100755 => 100644 v2ray-core/files/etc/firewall.v2ray-rules mode change 100755 => 100644 v2ray-core/files/etc/uci-defaults/3010-omr-v2ray mode change 100755 => 100644 v2ray-ext/Makefile diff --git a/6in4/Makefile b/6in4/Makefile old mode 100755 new mode 100644 diff --git a/CLA-entity.md b/CLA-entity.md old mode 100755 new mode 100644 diff --git a/CLA-individual.md b/CLA-individual.md old mode 100755 new mode 100644 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md old mode 100755 new mode 100644 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 index e9edfcd2c..e92835abd --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This is the OpenWrt OpenMPTCProuter feed containing all modified and necessary packages to build the OpenMPTCProuter image. -For More information, see [https://github.com/suyuan168/3grouter](https://github.com/suyuan168/3grouter) and [https://www.openmptcprouter.com](https://www.openmptcprouter.com/). +For More information, see [https://github.com/ysurac/openmptcprouter](https://github.com/ysurac/openmptcprouter) and [https://www.openmptcprouter.com](https://www.openmptcprouter.com/). ## Glorytun @@ -66,7 +66,7 @@ Added support to gateway set by user for 6in4. Used for IPv6 over the glorytun I ## luci-omr-bypass -*Source:* [https://github.com/suyuan168/3grouter-feeds/tree/master/luci-app-omr-bypass](https://github.com/suyuan168/3grouter-feeds/tree/master/luci-app-omr-bypass) +*Source:* [https://github.com/Ysurac/openmptcprouter-feeds/tree/master/luci-app-omr-bypass](https://github.com/Ysurac/openmptcprouter-feeds/tree/master/luci-app-omr-bypass) *Description:* Luci interface to bypass domains, IPs and networks with shadowsocks @@ -74,7 +74,7 @@ Domains, IPs, networks and protocol (using DPI) added are bypassed when shadowso ## omr-tracker -*Source:* [https://github.com/suyuan168/3grouter-feeds/tree/master/omr-tracker](https://github.com/suyuan168/3grouter-feeds/tree/master/omr-tracker) +*Source:* [https://github.com/Ysurac/openmptcprouter-feeds/tree/master/omr-tracker](https://github.com/Ysurac/openmptcprouter-feeds/tree/master/omr-tracker) *Description:* Track connection status. This check if gateway is up then check if the connection work. If it's not working this execute scripts. This also detect if ShadowSocks is up or not. @@ -82,7 +82,7 @@ This is used for OpenMPTCProuter failover. ## luci-omr-tracker -*Source:* [https://github.com/suyuan168/3grouter-feeds/tree/master/luci-app-omr-tracker](https://github.com/suyuan168/3grouter-feeds/tree/master/luci-app-omr-tracker) +*Source:* [https://github.com/Ysurac/openmptcprouter-feeds/tree/master/luci-app-omr-tracker](https://github.com/Ysurac/openmptcprouter-feeds/tree/master/luci-app-omr-tracker) *Description:* Luci interface to omr-tracker @@ -90,37 +90,37 @@ Interface to omr-tracker. ## luci-app-iperf -*Source:* [https://github.com/suyuan168/3grouter-feeds/tree/master/luci-app-iperf](https://github.com/suyuan168/3grouter-feeds/tree/master/luci-app-iperf) +*Source:* [https://github.com/Ysurac/openmptcprouter-feeds/tree/master/luci-app-iperf](https://github.com/Ysurac/openmptcprouter-feeds/tree/master/luci-app-iperf) *Description:* Luci interface to iPerf ## omr-6in4 -*Source:* [https://github.com/suyuan168/3grouter-feeds/tree/master/omr-6in4](https://github.com/suyuan168/3grouter-feeds/tree/master/omr-6in4) +*Source:* [https://github.com/Ysurac/openmptcprouter-feeds/tree/master/omr-6in4](https://github.com/Ysurac/openmptcprouter-feeds/tree/master/omr-6in4) *Description:* Set tunnel configuration by tracking tunnel configuration. ## omr-update -*Source:* [https://github.com/suyuan168/3grouter-feeds/tree/master/omr-update](https://github.com/suyuan168/3grouter-feeds/tree/master/omr-update) +*Source:* [https://github.com/Ysurac/openmptcprouter-feeds/tree/master/omr-update](https://github.com/Ysurac/openmptcprouter-feeds/tree/master/omr-update) *Description:* Update old config with new settings. ## luci-app-mptcp -*Source:* [https://github.com/suyuan168/3grouter-feeds/tree/master/luci-app-mptcp](https://github.com/suyuan168/3grouter-feeds/tree/master/luci-app-mptcp) +*Source:* [https://github.com/Ysurac/openmptcprouter-feeds/tree/master/luci-app-mptcp](https://github.com/Ysurac/openmptcprouter-feeds/tree/master/luci-app-mptcp) *Description:* Luci interface for all MPTCP settings ## luci-app-openmptcprouter -*Source:* [https://github.com/suyuan168/3grouter-feeds/tree/master/luci-app-openmptcprouter](https://github.com/suyuan168/3grouter-feeds/tree/master/luci-app-openmptcprouter) +*Source:* [https://github.com/Ysurac/openmptcprouter-feeds/tree/master/luci-app-openmptcprouter](https://github.com/Ysurac/openmptcprouter-feeds/tree/master/luci-app-openmptcprouter) *Description:* Wizard for OpenMPTCProuter settings and status page ## mptcp -*Source:* [https://github.com/suyuan168/3grouter-feeds/tree/master/mptcp](https://github.com/suyuan168/3grouter-feeds/tree/master/mptcp) +*Source:* [https://github.com/Ysurac/openmptcprouter-feeds/tree/master/mptcp](https://github.com/Ysurac/openmptcprouter-feeds/tree/master/mptcp) *Description:* This package set all MPTCP settings diff --git a/bcm27xx-eeprom/Makefile b/bcm27xx-eeprom/Makefile old mode 100755 new mode 100644 diff --git a/bcm27xx-eeprom/patches/0001-rpi-eeprom-update-OpenWrt-defaults.patch b/bcm27xx-eeprom/patches/0001-rpi-eeprom-update-OpenWrt-defaults.patch old mode 100755 new mode 100644 diff --git a/bcm27xx-eeprom/patches/0003-rpi-eeprom-update-change-default-include-path.patch b/bcm27xx-eeprom/patches/0003-rpi-eeprom-update-change-default-include-path.patch old mode 100755 new mode 100644 diff --git a/bcm27xx-eeprom/patches/0004-rpi-eeprom-update-remove-chmod.patch b/bcm27xx-eeprom/patches/0004-rpi-eeprom-update-remove-chmod.patch old mode 100755 new mode 100644 diff --git a/contributors/cr3ative.md b/contributors/cr3ative.md old mode 100755 new mode 100644 diff --git a/contributors/example.md b/contributors/example.md old mode 100755 new mode 100644 diff --git a/dsvpn/Makefile b/dsvpn/Makefile old mode 100755 new mode 100644 diff --git a/dsvpn/patches/nofirewall.patch b/dsvpn/patches/nofirewall.patch old mode 100755 new mode 100644 diff --git a/dsvpn/patches/nostrip.patch b/dsvpn/patches/nostrip.patch old mode 100755 new mode 100644 diff --git a/glorytun-udp/Makefile b/glorytun-udp/Makefile old mode 100755 new mode 100644 diff --git a/glorytun-udp/patches/aegis-arm.patch b/glorytun-udp/patches/aegis-arm.patch old mode 100755 new mode 100644 diff --git a/glorytun/Makefile b/glorytun/Makefile old mode 100755 new mode 100644 diff --git a/glorytun/glorytun.config b/glorytun/glorytun.config old mode 100755 new mode 100644 diff --git a/golang-protobuf/Makefile b/golang-protobuf/Makefile old mode 100755 new mode 100644 diff --git a/golang/golang-build.sh b/golang/golang-build.sh old mode 100755 new mode 100644 diff --git a/golang/golang-compiler.mk b/golang/golang-compiler.mk old mode 100755 new mode 100644 diff --git a/golang/golang-golang-x-crypto/Makefile b/golang/golang-golang-x-crypto/Makefile old mode 100755 new mode 100644 diff --git a/golang/golang-golang-x-net/Makefile b/golang/golang-golang-x-net/Makefile old mode 100755 new mode 100644 diff --git a/golang/golang-golang-x-sys/Makefile b/golang/golang-golang-x-sys/Makefile old mode 100755 new mode 100644 diff --git a/golang/golang-golang-x-text/Makefile b/golang/golang-golang-x-text/Makefile old mode 100755 new mode 100644 diff --git a/golang/golang-host-build.mk b/golang/golang-host-build.mk old mode 100755 new mode 100644 diff --git a/golang/golang-package.mk b/golang/golang-package.mk old mode 100755 new mode 100644 diff --git a/golang/golang-values.mk b/golang/golang-values.mk old mode 100755 new mode 100644 diff --git a/golang/golang/Config.in b/golang/golang/Config.in old mode 100755 new mode 100644 diff --git a/golang/golang/Makefile b/golang/golang/Makefile old mode 100755 new mode 100644 diff --git a/golang/golang/files/go-gcc-helper b/golang/golang/files/go-gcc-helper old mode 100755 new mode 100644 diff --git a/https-dns-proxy/Makefile b/https-dns-proxy/Makefile old mode 100755 new mode 100644 diff --git a/https-dns-proxy/files/README.md b/https-dns-proxy/files/README.md old mode 100755 new mode 100644 diff --git a/https-dns-proxy/files/https-dns-proxy.config b/https-dns-proxy/files/https-dns-proxy.config old mode 100755 new mode 100644 diff --git a/ipcalc/Makefile b/ipcalc/Makefile old mode 100755 new mode 100644 diff --git a/lcd4linux/Config.in b/lcd4linux/Config.in old mode 100755 new mode 100644 diff --git a/lcd4linux/Makefile b/lcd4linux/Makefile old mode 100755 new mode 100644 diff --git a/lcd4linux/files/lcd4linux.init b/lcd4linux/files/lcd4linux.init old mode 100755 new mode 100644 diff --git a/lcd4linux/patches/120-remove-as-needed-linker-option.patch b/lcd4linux/patches/120-remove-as-needed-linker-option.patch old mode 100755 new mode 100644 diff --git a/lcd4linux/patches/140-no_repnop_T6963.patch b/lcd4linux/patches/140-no_repnop_T6963.patch old mode 100755 new mode 100644 diff --git a/lcd4linux/patches/150-addlibmpdclient.patch b/lcd4linux/patches/150-addlibmpdclient.patch old mode 100755 new mode 100644 diff --git a/lcd4linux/patches/160-uinput_defs.patch b/lcd4linux/patches/160-uinput_defs.patch old mode 100755 new mode 100644 diff --git a/lcd4linux/patches/170-add-generic-spidev-driver.patch b/lcd4linux/patches/170-add-generic-spidev-driver.patch old mode 100755 new mode 100644 diff --git a/lcd4linux/patches/173-glcd2usb-bigendian-fix.patch b/lcd4linux/patches/173-glcd2usb-bigendian-fix.patch old mode 100755 new mode 100644 diff --git a/libell/Makefile b/libell/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/Makefile b/luci-app-dsvpn/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/htdocs/luci-static/resources/view/services/dsvpn.js b/luci-app-dsvpn/htdocs/luci-static/resources/view/services/dsvpn.js old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/po/fr/dsvpn.po b/luci-app-dsvpn/po/fr/dsvpn.po old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/po/templates/dsvpn.pot b/luci-app-dsvpn/po/templates/dsvpn.pot old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/po/zh_Hans/dsvpn.po b/luci-app-dsvpn/po/zh_Hans/dsvpn.po old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/root/usr/share/luci/menu.d/luci-app-dsvpn.json b/luci-app-dsvpn/root/usr/share/luci/menu.d/luci-app-dsvpn.json old mode 100755 new mode 100644 diff --git a/luci-app-dsvpn/root/usr/share/rpcd/acl.d/luci-app-dsvpn.json b/luci-app-dsvpn/root/usr/share/rpcd/acl.d/luci-app-dsvpn.json old mode 100755 new mode 100644 diff --git a/luci-app-firewall/Makefile b/luci-app-firewall/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js b/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/bg/firewall.po b/luci-app-firewall/po/bg/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ca/firewall.po b/luci-app-firewall/po/ca/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/cs/firewall.po b/luci-app-firewall/po/cs/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/de/firewall.po b/luci-app-firewall/po/de/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/el/firewall.po b/luci-app-firewall/po/el/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/en/firewall.po b/luci-app-firewall/po/en/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/es/firewall.po b/luci-app-firewall/po/es/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/fr/firewall.po b/luci-app-firewall/po/fr/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/he/firewall.po b/luci-app-firewall/po/he/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/hi/firewall.po b/luci-app-firewall/po/hi/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/hu/firewall.po b/luci-app-firewall/po/hu/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/it/firewall.po b/luci-app-firewall/po/it/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ja/firewall.po b/luci-app-firewall/po/ja/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ko/firewall.po b/luci-app-firewall/po/ko/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/mr/firewall.po b/luci-app-firewall/po/mr/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ms/firewall.po b/luci-app-firewall/po/ms/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/nb_NO/firewall.po b/luci-app-firewall/po/nb_NO/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/pl/firewall.po b/luci-app-firewall/po/pl/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/pt/firewall.po b/luci-app-firewall/po/pt/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/pt_BR/firewall.po b/luci-app-firewall/po/pt_BR/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ro/firewall.po b/luci-app-firewall/po/ro/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/ru/firewall.po b/luci-app-firewall/po/ru/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/sk/firewall.po b/luci-app-firewall/po/sk/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/sv/firewall.po b/luci-app-firewall/po/sv/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/templates/firewall.pot b/luci-app-firewall/po/templates/firewall.pot old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/tr/firewall.po b/luci-app-firewall/po/tr/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/uk/firewall.po b/luci-app-firewall/po/uk/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/vi/firewall.po b/luci-app-firewall/po/vi/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/zh_Hans/firewall.po b/luci-app-firewall/po/zh_Hans/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/po/zh_Hant/firewall.po b/luci-app-firewall/po/zh_Hant/firewall.po old mode 100755 new mode 100644 diff --git a/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json b/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json old mode 100755 new mode 100644 diff --git a/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json b/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/Makefile b/luci-app-glorytun-tcp/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/htdocs/luci-static/resources/view/services/glorytun-tcp.js b/luci-app-glorytun-tcp/htdocs/luci-static/resources/view/services/glorytun-tcp.js old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/po/fr/glorytun-tcp.po b/luci-app-glorytun-tcp/po/fr/glorytun-tcp.po old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/po/templates/glorytun-tcp.pot b/luci-app-glorytun-tcp/po/templates/glorytun-tcp.pot old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po b/luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/root/etc/hotplug.d/iface/30-glorytun b/luci-app-glorytun-tcp/root/etc/hotplug.d/iface/30-glorytun old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/root/etc/uci-defaults/1200-luci-glorytun b/luci-app-glorytun-tcp/root/etc/uci-defaults/1200-luci-glorytun old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/root/usr/share/luci/menu.d/luci-app-glorytun-tcp.json b/luci-app-glorytun-tcp/root/usr/share/luci/menu.d/luci-app-glorytun-tcp.json old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-tcp/root/usr/share/rpcd/acl.d/luci-app-glorytun-tcp.json b/luci-app-glorytun-tcp/root/usr/share/rpcd/acl.d/luci-app-glorytun-tcp.json old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/Makefile b/luci-app-glorytun-udp/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/htdocs/luci-static/resources/view/services/glorytun-udp.js b/luci-app-glorytun-udp/htdocs/luci-static/resources/view/services/glorytun-udp.js old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/po/fr/glorytun-udp.po b/luci-app-glorytun-udp/po/fr/glorytun-udp.po old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/po/templates/glorytun-udp.pot b/luci-app-glorytun-udp/po/templates/glorytun-udp.pot old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po b/luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/root/etc/config/glorytun-udp b/luci-app-glorytun-udp/root/etc/config/glorytun-udp old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/root/etc/hotplug.d/iface/30-glorytun-udp b/luci-app-glorytun-udp/root/etc/hotplug.d/iface/30-glorytun-udp old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/root/etc/uci-defaults/1201-luci-glorytun-udp b/luci-app-glorytun-udp/root/etc/uci-defaults/1201-luci-glorytun-udp old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/root/usr/share/luci/menu.d/luci-app-glorytun-udp.json b/luci-app-glorytun-udp/root/usr/share/luci/menu.d/luci-app-glorytun-udp.json old mode 100755 new mode 100644 diff --git a/luci-app-glorytun-udp/root/usr/share/rpcd/acl.d/luci-app-glorytun-udp.json b/luci-app-glorytun-udp/root/usr/share/rpcd/acl.d/luci-app-glorytun-udp.json old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/LICENSE b/luci-app-haproxy-tcp/LICENSE old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/Makefile b/luci-app-haproxy-tcp/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/README.md b/luci-app-haproxy-tcp/README.md old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua b/luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua b/luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/po/fr/haproxy-tcp.po b/luci-app-haproxy-tcp/po/fr/haproxy-tcp.po old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot b/luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po b/luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/root/etc/config/haproxy-tcp b/luci-app-haproxy-tcp/root/etc/config/haproxy-tcp old mode 100755 new mode 100644 diff --git a/luci-app-haproxy-tcp/root/etc/uci-defaults/41_luci-haproxy-tcp b/luci-app-haproxy-tcp/root/etc/uci-defaults/41_luci-haproxy-tcp old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/Makefile b/luci-app-https-dns-proxy/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/controller/https-dns-proxy.lua b/luci-app-https-dns-proxy/luasrc/controller/https-dns-proxy.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ch.digitale-gesellschaft.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ch.digitale-gesellschaft.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/cn.rubyfish.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/cn.rubyfish.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/sb.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/sb.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns-family.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns-family.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-family.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-family.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-malware.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-malware.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cz.nic.odvr.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cz.nic.odvr.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/google.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/google.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh-ads.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh-ads.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-adult.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-adult.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-family.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-family.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-security.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-security.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua b/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/css.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/css.htm old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/js.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/js.htm old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status-textarea.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status-textarea.htm old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status.htm old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/bg/https-dns-proxy.po b/luci-app-https-dns-proxy/po/bg/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ca/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ca/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/cs/https-dns-proxy.po b/luci-app-https-dns-proxy/po/cs/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/de/https-dns-proxy.po b/luci-app-https-dns-proxy/po/de/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/el/https-dns-proxy.po b/luci-app-https-dns-proxy/po/el/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/en/https-dns-proxy.po b/luci-app-https-dns-proxy/po/en/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/es/https-dns-proxy.po b/luci-app-https-dns-proxy/po/es/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/fr/https-dns-proxy.po b/luci-app-https-dns-proxy/po/fr/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/he/https-dns-proxy.po b/luci-app-https-dns-proxy/po/he/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/hi/https-dns-proxy.po b/luci-app-https-dns-proxy/po/hi/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/hu/https-dns-proxy.po b/luci-app-https-dns-proxy/po/hu/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/it/https-dns-proxy.po b/luci-app-https-dns-proxy/po/it/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ja/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ja/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ko/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ko/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/mr/https-dns-proxy.po b/luci-app-https-dns-proxy/po/mr/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ms/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ms/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/nb_NO/https-dns-proxy.po b/luci-app-https-dns-proxy/po/nb_NO/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/pl/https-dns-proxy.po b/luci-app-https-dns-proxy/po/pl/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/pt/https-dns-proxy.po b/luci-app-https-dns-proxy/po/pt/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/pt_BR/https-dns-proxy.po b/luci-app-https-dns-proxy/po/pt_BR/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ro/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ro/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/ru/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ru/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/sk/https-dns-proxy.po b/luci-app-https-dns-proxy/po/sk/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/sv/https-dns-proxy.po b/luci-app-https-dns-proxy/po/sv/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/templates/https-dns-proxy.pot b/luci-app-https-dns-proxy/po/templates/https-dns-proxy.pot old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/tr/https-dns-proxy.po b/luci-app-https-dns-proxy/po/tr/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/uk/https-dns-proxy.po b/luci-app-https-dns-proxy/po/uk/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/vi/https-dns-proxy.po b/luci-app-https-dns-proxy/po/vi/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/zh_Hans/https-dns-proxy.po b/luci-app-https-dns-proxy/po/zh_Hans/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/po/zh_Hant/https-dns-proxy.po b/luci-app-https-dns-proxy/po/zh_Hant/https-dns-proxy.po old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/root/etc/uci-defaults/40_luci-https-dns-proxy b/luci-app-https-dns-proxy/root/etc/uci-defaults/40_luci-https-dns-proxy old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/root/usr/share/luci/menu.d/luci-app-https-dns-proxy.json b/luci-app-https-dns-proxy/root/usr/share/luci/menu.d/luci-app-https-dns-proxy.json old mode 100755 new mode 100644 diff --git a/luci-app-https-dns-proxy/root/usr/share/rpcd/acl.d/luci-app-https-dns-proxy.json b/luci-app-https-dns-proxy/root/usr/share/rpcd/acl.d/luci-app-https-dns-proxy.json old mode 100755 new mode 100644 diff --git a/luci-app-iperf/Makefile b/luci-app-iperf/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-iperf/luasrc/controller/iperf.lua b/luci-app-iperf/luasrc/controller/iperf.lua old mode 100755 new mode 100644 diff --git a/luci-app-iperf/luasrc/view/iperf/test.htm b/luci-app-iperf/luasrc/view/iperf/test.htm old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/de/iperf.po b/luci-app-iperf/po/de/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/fr/iperf.po b/luci-app-iperf/po/fr/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/it/iperf.po b/luci-app-iperf/po/it/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/oc/iperf.po b/luci-app-iperf/po/oc/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/templates/iperf.pot b/luci-app-iperf/po/templates/iperf.pot old mode 100755 new mode 100644 diff --git a/luci-app-iperf/po/zh_Hans/iperf.po b/luci-app-iperf/po/zh_Hans/iperf.po old mode 100755 new mode 100644 diff --git a/luci-app-iperf/root/etc/config/iperf b/luci-app-iperf/root/etc/config/iperf old mode 100755 new mode 100644 diff --git a/luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json b/luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json old mode 100755 new mode 100644 diff --git a/luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json b/luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json old mode 100755 new mode 100644 diff --git a/luci-app-macvlan/po/zh_Hans/macvlan.po b/luci-app-macvlan/po/zh_Hans/macvlan.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/Makefile b/luci-app-mail/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-mail/luasrc/controller/mail.lua b/luci-app-mail/luasrc/controller/mail.lua old mode 100755 new mode 100644 diff --git a/luci-app-mail/luasrc/model/cbi/mail.lua b/luci-app-mail/luasrc/model/cbi/mail.lua old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/de/mail.po b/luci-app-mail/po/de/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/fr/mail.po b/luci-app-mail/po/fr/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/it/mail.po b/luci-app-mail/po/it/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/oc/mail.po b/luci-app-mail/po/oc/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/templates/mail.pot b/luci-app-mail/po/templates/mail.pot old mode 100755 new mode 100644 diff --git a/luci-app-mail/po/zh_Hans/mail.po b/luci-app-mail/po/zh_Hans/mail.po old mode 100755 new mode 100644 diff --git a/luci-app-mail/root/etc/config/mail b/luci-app-mail/root/etc/config/mail old mode 100755 new mode 100644 diff --git a/luci-app-mail/root/usr/share/luci/menu.d/luci-app-mail.json b/luci-app-mail/root/usr/share/luci/menu.d/luci-app-mail.json old mode 100755 new mode 100644 diff --git a/luci-app-mail/root/usr/share/rpcd/acl.d/luci-app-mail.json b/luci-app-mail/root/usr/share/rpcd/acl.d/luci-app-mail.json old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/Makefile b/luci-app-mlvpn/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/htdocs/luci-static/resources/view/services/mlvpn.js b/luci-app-mlvpn/htdocs/luci-static/resources/view/services/mlvpn.js old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/po/fr/mlvpn.po b/luci-app-mlvpn/po/fr/mlvpn.po old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/po/templates/mlvpn.pot b/luci-app-mlvpn/po/templates/mlvpn.pot old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/po/zh_Hans/mlvpn.po b/luci-app-mlvpn/po/zh_Hans/mlvpn.po old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/root/usr/share/luci/menu.d/luci-app-mlvpn.json b/luci-app-mlvpn/root/usr/share/luci/menu.d/luci-app-mlvpn.json old mode 100755 new mode 100644 diff --git a/luci-app-mlvpn/root/usr/share/rpcd/acl.d/luci-app-mlvpn.json b/luci-app-mlvpn/root/usr/share/rpcd/acl.d/luci-app-mlvpn.json old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/Makefile b/luci-app-mptcp/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/htdocs/luci-static/resources/seedrandom.js b/luci-app-mptcp/htdocs/luci-static/resources/seedrandom.js old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/controller/mptcp.lua b/luci-app-mptcp/luasrc/controller/mptcp.lua old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/model/cbi/mptcp.lua b/luci-app-mptcp/luasrc/model/cbi/mptcp.lua old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/luasrc/view/mptcp/multipath.htm b/luci-app-mptcp/luasrc/view/mptcp/multipath.htm old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/de/mptcp.po b/luci-app-mptcp/po/de/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/fr/mptcp.po b/luci-app-mptcp/po/fr/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/it/mptcp.po b/luci-app-mptcp/po/it/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/oc/mptcp.po b/luci-app-mptcp/po/oc/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/templates/mptcp.pot b/luci-app-mptcp/po/templates/mptcp.pot old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/po/zh_Hans/mptcp.po b/luci-app-mptcp/po/zh_Hans/mptcp.po old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json b/luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json old mode 100755 new mode 100644 diff --git a/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json b/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/LICENSE b/luci-app-nginx-ha/LICENSE old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/Makefile b/luci-app-nginx-ha/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/luasrc/controller/nginx-ha.lua b/luci-app-nginx-ha/luasrc/controller/nginx-ha.lua old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/luasrc/model/cbi/nginx-ha.lua b/luci-app-nginx-ha/luasrc/model/cbi/nginx-ha.lua old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/po/fr/nginx-ha.po b/luci-app-nginx-ha/po/fr/nginx-ha.po old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/po/templates/nginx-ha.pot b/luci-app-nginx-ha/po/templates/nginx-ha.pot old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/root/etc/config/nginx-ha b/luci-app-nginx-ha/root/etc/config/nginx-ha old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/root/etc/uci-defaults/42_luci-nginx-ha b/luci-app-nginx-ha/root/etc/uci-defaults/42_luci-nginx-ha old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/root/usr/share/luci/menu.d/luci-app-nginx-ha.json b/luci-app-nginx-ha/root/usr/share/luci/menu.d/luci-app-nginx-ha.json old mode 100755 new mode 100644 diff --git a/luci-app-nginx-ha/root/usr/share/rpcd/acl.d/luci-app-nginx-ha.json b/luci-app-nginx-ha/root/usr/share/rpcd/acl.d/luci-app-nginx-ha.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/Makefile b/luci-app-omr-bypass/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js b/luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/de/omr-bypass.po b/luci-app-omr-bypass/po/de/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/fr/omr-bypass.po b/luci-app-omr-bypass/po/fr/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/it/omr-bypass.po b/luci-app-omr-bypass/po/it/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/oc/omr-bypass.po b/luci-app-omr-bypass/po/oc/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/templates/omr-bypass.pot b/luci-app-omr-bypass/po/templates/omr-bypass.pot old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/po/zh_Hans/omr-bypass.po b/luci-app-omr-bypass/po/zh_Hans/omr-bypass.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/root/etc/config/omr-bypass b/luci-app-omr-bypass/root/etc/config/omr-bypass old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/root/etc/firewall.omr-bypass b/luci-app-omr-bypass/root/etc/firewall.omr-bypass old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json b/luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json b/luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/Makefile b/luci-app-omr-dscp/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/luasrc/controller/omr-dscp.lua b/luci-app-omr-dscp/luasrc/controller/omr-dscp.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua b/luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/luasrc/model/cbi/dscp.lua b/luci-app-omr-dscp/luasrc/model/cbi/dscp.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/de/omr-dscp.po b/luci-app-omr-dscp/po/de/omr-dscp.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/fr/omr-dscp.po b/luci-app-omr-dscp/po/fr/omr-dscp.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/it/omr-dscp.po b/luci-app-omr-dscp/po/it/omr-dscp.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/oc/omr-dscp.po b/luci-app-omr-dscp/po/oc/omr-dscp.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/templates/omr-dscp.pot b/luci-app-omr-dscp/po/templates/omr-dscp.pot old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/po/zh_Hans/omr-dscp.po b/luci-app-omr-dscp/po/zh_Hans/omr-dscp.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/root/etc/config/dscp b/luci-app-omr-dscp/root/etc/config/dscp old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/root/usr/share/luci/menu.d/luci-app-omr-dscp.json b/luci-app-omr-dscp/root/usr/share/luci/menu.d/luci-app-omr-dscp.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-dscp/root/usr/share/rpcd/acl.d/luci-app-omr-dscp.json b/luci-app-omr-dscp/root/usr/share/rpcd/acl.d/luci-app-omr-dscp.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/Makefile b/luci-app-omr-quota/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/luasrc/controller/quota.lua b/luci-app-omr-quota/luasrc/controller/quota.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua b/luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm b/luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/de/omr-quota.po b/luci-app-omr-quota/po/de/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/fr/omr-quota.po b/luci-app-omr-quota/po/fr/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/it/omr-quota.po b/luci-app-omr-quota/po/it/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/oc/omr-quota.po b/luci-app-omr-quota/po/oc/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/templates/omr-quota.pot b/luci-app-omr-quota/po/templates/omr-quota.pot old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/po/zh_Hans/omr-quota.po b/luci-app-omr-quota/po/zh_Hans/omr-quota.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/root/usr/share/luci/menu.d/luci-app-omr-quota.json b/luci-app-omr-quota/root/usr/share/luci/menu.d/luci-app-omr-quota.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-quota/root/usr/share/rpcd/acl.d/luci-app-omr-quota.json b/luci-app-omr-quota/root/usr/share/rpcd/acl.d/luci-app-omr-quota.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/Makefile b/luci-app-omr-tracker/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/luasrc/controller/omr-tracker.lua b/luci-app-omr-tracker/luasrc/controller/omr-tracker.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua b/luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/luasrc/view/omr-tracker/cbi-select-add.htm b/luci-app-omr-tracker/luasrc/view/omr-tracker/cbi-select-add.htm old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/de/omr-tracker.po b/luci-app-omr-tracker/po/de/omr-tracker.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/fr/omr-tracker.po b/luci-app-omr-tracker/po/fr/omr-tracker.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/it/omr-tracker.po b/luci-app-omr-tracker/po/it/omr-tracker.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/oc/omr-tracker.po b/luci-app-omr-tracker/po/oc/omr-tracker.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/templates/omr-tracker.pot b/luci-app-omr-tracker/po/templates/omr-tracker.pot old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/po/zh_Hans/omr-tracker.po b/luci-app-omr-tracker/po/zh_Hans/omr-tracker.po old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/root/etc/uci-defaults/42_luci-omr-tracker b/luci-app-omr-tracker/root/etc/uci-defaults/42_luci-omr-tracker old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/root/usr/share/luci/menu.d/luci-app-omr-tracker.json b/luci-app-omr-tracker/root/usr/share/luci/menu.d/luci-app-omr-tracker.json old mode 100755 new mode 100644 diff --git a/luci-app-omr-tracker/root/usr/share/rpcd/acl.d/luci-app-omr-tracker.json b/luci-app-omr-tracker/root/usr/share/rpcd/acl.d/luci-app-omr-tracker.json old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/Makefile b/luci-app-openmptcprouter/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/de/openmptcprouter.po b/luci-app-openmptcprouter/po/de/openmptcprouter.po old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/fr/openmptcprouter.po b/luci-app-openmptcprouter/po/fr/openmptcprouter.po old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/it/openmptcprouter.po b/luci-app-openmptcprouter/po/it/openmptcprouter.po old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/oc/openmptcprouter.po b/luci-app-openmptcprouter/po/oc/openmptcprouter.po old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/templates/openmptcprouter.pot b/luci-app-openmptcprouter/po/templates/openmptcprouter.pot old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po b/luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/root/etc/config/openmptcprouter b/luci-app-openmptcprouter/root/etc/config/openmptcprouter old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/root/etc/hotplug.d/net/99-omr-rename b/luci-app-openmptcprouter/root/etc/hotplug.d/net/99-omr-rename old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/root/etc/init.d/openmptcprouter b/luci-app-openmptcprouter/root/etc/init.d/openmptcprouter index b4ded81ab..79dbead91 100755 --- a/luci-app-openmptcprouter/root/etc/init.d/openmptcprouter +++ b/luci-app-openmptcprouter/root/etc/init.d/openmptcprouter @@ -150,15 +150,15 @@ start_service() { if [ "$(uci -q get openmptcprouter.settings.country)" = "china" ] && [ -n "$(uci -q get dhcp.@dnsmasq[0].server | grep '127.0.0.1#5353')" ]; then uci -q batch <<-EOF > /dev/null del_list dhcp.@dnsmasq[0].server='127.0.0.1#5353' - add_list dhcp.@dnsmasq[0].server='223.5.5.5' + add_list dhcp.@dnsmasq[0].server='114.114.114.114' set dhcp.@dnsmasq[0].dnsseccheckunsigned='0' delete dhcp.@dnsmasq[0].dnssec commit dhcp EOF - elif [ "$(uci -q get openmptcprouter.settings.country)" = "world" ] && [ -n "$(uci -q get dhcp.@dnsmasq[0].server | grep '223.5.5.5')" ]; then + elif [ "$(uci -q get openmptcprouter.settings.country)" = "world" ] && [ -n "$(uci -q get dhcp.@dnsmasq[0].server | grep '114.114.114.114')" ]; then uci -q batch <<-EOF > /dev/null add_list dhcp.@dnsmasq[0].server='127.0.0.1#5353' - del_list dhcp.@dnsmasq[0].server='223.5.5.5' + del_list dhcp.@dnsmasq[0].server='114.114.114.114' commit dhcp EOF fi diff --git a/luci-app-openmptcprouter/root/usr/share/luci/menu.d/luci-app-openmptcprouter.json b/luci-app-openmptcprouter/root/usr/share/luci/menu.d/luci-app-openmptcprouter.json old mode 100755 new mode 100644 diff --git a/luci-app-openmptcprouter/root/usr/share/rpcd/acl.d/luci-app-openmptcprouter.json b/luci-app-openmptcprouter/root/usr/share/rpcd/acl.d/luci-app-openmptcprouter.json old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/Makefile b/luci-app-packet-capture/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js b/luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/po/fr/packet-capture.po b/luci-app-packet-capture/po/fr/packet-capture.po old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/po/templates/packet-capture.pot b/luci-app-packet-capture/po/templates/packet-capture.pot old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/root/etc/config/packet_capture b/luci-app-packet-capture/root/etc/config/packet_capture old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json b/luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json old mode 100755 new mode 100644 diff --git a/luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json b/luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/Makefile b/luci-app-shadowsocks-libev/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua b/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/de/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/de/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/el/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/el/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/en/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/en/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/es/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/es/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/fr/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/fr/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/he/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/he/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/hi/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/hi/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/hu/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/hu/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/it/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/it/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ja/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ja/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ko/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ko/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ms/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ms/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/nb_NO/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/nb_NO/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/pt/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/pt/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/pt_BR/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/pt_BR/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ro/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ro/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/ru/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ru/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/sk/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/sk/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/sv/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/sv/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot b/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/tr/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/tr/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/uk/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/uk/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/vi/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/vi/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/po/zh-tw/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/zh-tw/shadowsocks-libev.po old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/root/etc/uci-defaults/40_luci-shadowsocks-libev b/luci-app-shadowsocks-libev/root/etc/uci-defaults/40_luci-shadowsocks-libev old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json b/luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json old mode 100755 new mode 100644 diff --git a/luci-app-shadowsocks-libev/root/usr/share/rpcd/acl.d/luci-app-shadowsocks-libev.json b/luci-app-shadowsocks-libev/root/usr/share/rpcd/acl.d/luci-app-shadowsocks-libev.json old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/Makefile b/luci-app-shutdown/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js b/luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/de/shutdown.po b/luci-app-shutdown/po/de/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/it/shutdown.po b/luci-app-shutdown/po/it/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/oc/shutdown.po b/luci-app-shutdown/po/oc/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/pl/shutdown.po b/luci-app-shutdown/po/pl/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/templates/shutdown.pot b/luci-app-shutdown/po/templates/shutdown.pot old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/po/zh_Hans/shutdown.po b/luci-app-shutdown/po/zh_Hans/shutdown.po old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json b/luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json old mode 100755 new mode 100644 diff --git a/luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json b/luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/Makefile b/luci-app-snmpd/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/luasrc/controller/snmpd.lua b/luci-app-snmpd/luasrc/controller/snmpd.lua old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/luasrc/model/cbi/snmpd.lua b/luci-app-snmpd/luasrc/model/cbi/snmpd.lua old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/luasrc/view/snmpd.htm b/luci-app-snmpd/luasrc/view/snmpd.htm old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/po/de/snmpd.po b/luci-app-snmpd/po/de/snmpd.po old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/po/fr/snmpd.po b/luci-app-snmpd/po/fr/snmpd.po old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/po/it/snmpd.po b/luci-app-snmpd/po/it/snmpd.po old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/po/oc/snmpd.po b/luci-app-snmpd/po/oc/snmpd.po old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/po/templates/snmpd.pot b/luci-app-snmpd/po/templates/snmpd.pot old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/po/zh_Hans/snmpd.po b/luci-app-snmpd/po/zh_Hans/snmpd.po old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/root/etc/config/snmpd b/luci-app-snmpd/root/etc/config/snmpd old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json b/luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json old mode 100755 new mode 100644 diff --git a/luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json b/luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/Makefile b/luci-app-sysupgrade/Makefile old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/luasrc/view/sysupgrade.htm b/luci-app-sysupgrade/luasrc/view/sysupgrade.htm old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/po/fr/sysupgrade.po b/luci-app-sysupgrade/po/fr/sysupgrade.po old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/po/templates/sysupgrade.pot b/luci-app-sysupgrade/po/templates/sysupgrade.pot old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json b/luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json b/luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json old mode 100755 new mode 100644 diff --git a/luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js b/luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js old mode 100755 new mode 100644 diff --git a/luci-base/po/oc/base.po b/luci-base/po/oc/base.po old mode 100755 new mode 100644 diff --git a/luci-base/po/templates/base.pot b/luci-base/po/templates/base.pot old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/Makefile b/luci-mod-dashboard/Makefile old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json b/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json old mode 100755 new mode 100644 diff --git a/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json b/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json old mode 100755 new mode 100644 diff --git a/luci-mod-network/Makefile b/luci-mod-network/Makefile old mode 100755 new mode 100644 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js b/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js old mode 100755 new mode 100644 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js b/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js old mode 100755 new mode 100644 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js b/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js old mode 100755 new mode 100644 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js b/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js old mode 100755 new mode 100644 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js b/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js old mode 100755 new mode 100644 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js b/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js old mode 100755 new mode 100644 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js b/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js old mode 100755 new mode 100644 diff --git a/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json b/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json old mode 100755 new mode 100644 diff --git a/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json b/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json old mode 100755 new mode 100644 diff --git a/luci-proto-mbim/Makefile b/luci-proto-mbim/Makefile old mode 100755 new mode 100644 diff --git a/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js b/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js old mode 100755 new mode 100644 diff --git a/luci-theme-argon/Makefile b/luci-theme-argon/Makefile old mode 100755 new mode 100644 diff --git a/luci-theme-argon/README.md b/luci-theme-argon/README.md old mode 100755 new mode 100644 diff --git a/luci-theme-argon/README_ZH.md b/luci-theme-argon/README_ZH.md old mode 100755 new mode 100644 diff --git a/luci-theme-argon/Screenshots/screenshot_pc.jpg b/luci-theme-argon/Screenshots/screenshot_pc.jpg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/Screenshots/screenshot_phone.jpg b/luci-theme-argon/Screenshots/screenshot_phone.jpg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/background/README.md b/luci-theme-argon/htdocs/luci-static/argon/background/README.md old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css b/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/dark.css b/luci-theme-argon/htdocs/luci-static/argon/css/dark.css old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/fonts.css b/luci-theme-argon/htdocs/luci-static/argon/css/fonts.css old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/pure-min.css b/luci-theme-argon/htdocs/luci-static/argon/css/pure-min.css old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/favicon.ico b/luci-theme-argon/htdocs/luci-static/argon/favicon.ico old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png b/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg b/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml b/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json b/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png b/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg b/luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg b/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg b/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/blank.png b/luci-theme-argon/htdocs/luci-static/argon/img/blank.png old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg b/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg b/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js b/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/polyfill.min.js b/luci-theme-argon/htdocs/luci-static/argon/js/polyfill.min.js old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/script.js b/luci-theme-argon/htdocs/luci-static/argon/js/script.js old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/cascade.less b/luci-theme-argon/htdocs/luci-static/argon/less/cascade.less old mode 100755 new mode 100644 diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/dark.less b/luci-theme-argon/htdocs/luci-static/argon/less/dark.less old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm b/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/header.htm b/luci-theme-argon/luasrc/view/themes/argon/header.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/header_login.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm b/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm old mode 100755 new mode 100644 diff --git a/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon b/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon old mode 100755 new mode 100644 diff --git a/luci-theme-openmptcprouter/Makefile b/luci-theme-openmptcprouter/Makefile old mode 100755 new mode 100644 diff --git a/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/html5.js b/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/html5.js old mode 100755 new mode 100644 diff --git a/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/mobile.css b/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/mobile.css old mode 100755 new mode 100644 diff --git a/luci-theme-openmptcprouter/htdocs/luci-static/resources/menu-openmptcprouter.js b/luci-theme-openmptcprouter/htdocs/luci-static/resources/menu-openmptcprouter.js old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/Makefile b/luci-theme-openwrt-2020/Makefile old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/omr-logo.png b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/omr-logo.png old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js b/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm b/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm old mode 100755 new mode 100644 diff --git a/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm b/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm old mode 100755 new mode 100644 diff --git a/macvlan/Makefile b/macvlan/Makefile old mode 100755 new mode 100644 diff --git a/macvlan/files/etc/config/macvlan b/macvlan/files/etc/config/macvlan old mode 100755 new mode 100644 diff --git a/macvlan/files/etc/uci-defaults/40_luci-app-macvlan b/macvlan/files/etc/uci-defaults/40_luci-app-macvlan old mode 100755 new mode 100644 diff --git a/mlvpn/Makefile b/mlvpn/Makefile old mode 100755 new mode 100644 diff --git a/mlvpn/files/etc/config/mlvpn b/mlvpn/files/etc/config/mlvpn old mode 100755 new mode 100644 diff --git a/mlvpn/files/etc/uci-defaults/4100-mlvpn b/mlvpn/files/etc/uci-defaults/4100-mlvpn old mode 100755 new mode 100644 diff --git a/mptcp/Makefile b/mptcp/Makefile old mode 100755 new mode 100644 diff --git a/mptcp/files/etc/hotplug.d/iface/30-mptcp b/mptcp/files/etc/hotplug.d/iface/30-mptcp old mode 100755 new mode 100644 diff --git a/mptcpd/Makefile b/mptcpd/Makefile old mode 100755 new mode 100644 diff --git a/msmtp/Makefile b/msmtp/Makefile old mode 100755 new mode 100644 diff --git a/ndisc6/Makefile b/ndisc6/Makefile old mode 100755 new mode 100644 diff --git a/ndpi-netfilter2/Makefile b/ndpi-netfilter2/Makefile old mode 100755 new mode 100644 diff --git a/net-tools/Makefile b/net-tools/Makefile old mode 100755 new mode 100644 diff --git a/net-tools/patches/mptcp-support.patch b/net-tools/patches/mptcp-support.patch old mode 100755 new mode 100644 diff --git a/nginx/Config.in b/nginx/Config.in old mode 100755 new mode 100644 diff --git a/nginx/Config_ssl.in b/nginx/Config_ssl.in old mode 100755 new mode 100644 diff --git a/nginx/Makefile b/nginx/Makefile old mode 100755 new mode 100644 diff --git a/nginx/files-luci-support/60_nginx-luci-support b/nginx/files-luci-support/60_nginx-luci-support old mode 100755 new mode 100644 diff --git a/nginx/files-luci-support/70_nginx-luci-support-ssl b/nginx/files-luci-support/70_nginx-luci-support-ssl old mode 100755 new mode 100644 diff --git a/nginx/files-luci-support/luci_nginx.conf b/nginx/files-luci-support/luci_nginx.conf old mode 100755 new mode 100644 diff --git a/nginx/files-luci-support/luci_nginx_ssl.conf b/nginx/files-luci-support/luci_nginx_ssl.conf old mode 100755 new mode 100644 diff --git a/nginx/files-luci-support/luci_uwsgi.conf b/nginx/files-luci-support/luci_uwsgi.conf old mode 100755 new mode 100644 diff --git a/nginx/files/nginx.init b/nginx/files/nginx.init old mode 100755 new mode 100644 diff --git a/nginx/patches-lua-nginx/100-no_by_lua_block.patch b/nginx/patches-lua-nginx/100-no_by_lua_block.patch old mode 100755 new mode 100644 diff --git a/nginx/patches/101-feature_test_fix.patch b/nginx/patches/101-feature_test_fix.patch old mode 100755 new mode 100644 diff --git a/nginx/patches/102-sizeof_test_fix.patch b/nginx/patches/102-sizeof_test_fix.patch old mode 100755 new mode 100644 diff --git a/nginx/patches/103-sys_nerr.patch b/nginx/patches/103-sys_nerr.patch old mode 100755 new mode 100644 diff --git a/nginx/patches/200-config.patch b/nginx/patches/200-config.patch old mode 100755 new mode 100644 diff --git a/nginx/patches/201-ignore-invalid-options.patch b/nginx/patches/201-ignore-invalid-options.patch old mode 100755 new mode 100644 diff --git a/nginx/patches/300-max-processes.patch b/nginx/patches/300-max-processes.patch old mode 100755 new mode 100644 diff --git a/omr-6in4/Makefile b/omr-6in4/Makefile old mode 100755 new mode 100644 diff --git a/omr-quota/Makefile b/omr-quota/Makefile old mode 100755 new mode 100644 diff --git a/omr-quota/files/etc/config/omr-quota b/omr-quota/files/etc/config/omr-quota old mode 100755 new mode 100644 diff --git a/omr-tracker/Makefile b/omr-tracker/Makefile old mode 100755 new mode 100644 diff --git a/omr-tracker/files/etc/config/omr-tracker b/omr-tracker/files/etc/config/omr-tracker old mode 100755 new mode 100644 diff --git a/omr-update/Makefile b/omr-update/Makefile old mode 100755 new mode 100644 diff --git a/openmptcprouter-full/Makefile b/openmptcprouter-full/Makefile old mode 100755 new mode 100644 diff --git a/openmptcprouter-mini/Makefile b/openmptcprouter-mini/Makefile old mode 100755 new mode 100644 diff --git a/openmptcprouter/Makefile b/openmptcprouter/Makefile old mode 100755 new mode 100644 diff --git a/openmptcprouter/files/etc/firewall.gre-tunnel b/openmptcprouter/files/etc/firewall.gre-tunnel old mode 100755 new mode 100644 diff --git a/openmptcprouter/files/etc/firewall.omr-server b/openmptcprouter/files/etc/firewall.omr-server old mode 100755 new mode 100644 diff --git a/openmptcprouter/files/etc/iproute2/rt_dsfield b/openmptcprouter/files/etc/iproute2/rt_dsfield old mode 100755 new mode 100644 diff --git a/openmptcprouter/files/etc/sysctl.d/default.conf b/openmptcprouter/files/etc/sysctl.d/default.conf old mode 100755 new mode 100644 diff --git a/openmptcprouter/files/etc/uci-defaults/1940-omr-dns b/openmptcprouter/files/etc/uci-defaults/1940-omr-dns index 2f33329f9..2d4e3cbd9 100755 --- a/openmptcprouter/files/etc/uci-defaults/1940-omr-dns +++ b/openmptcprouter/files/etc/uci-defaults/1940-omr-dns @@ -14,7 +14,6 @@ if [ "$(uci -q get openmptcprouter.latest_versions)" = "" ]; then if [ "$(uci -q show dhcp | grep 127.0.0.1#5353)" = "" ]; then uci -q batch <<-EOF >/dev/null add_list dhcp.@dnsmasq[-1].server="127.0.0.1#5353" - add_list dhcp.@dnsmasq[-1].server="8.8.8.8" add_list dhcp.@dnsmasq[-1].server="/lan/" commit dhcp EOF diff --git a/openmptcprouter/files/etc/wgetrc4 b/openmptcprouter/files/etc/wgetrc4 old mode 100755 new mode 100644 diff --git a/protobuf/Makefile b/protobuf/Makefile old mode 100755 new mode 100644 diff --git a/serdisplib/Makefile b/serdisplib/Makefile old mode 100755 new mode 100644 diff --git a/shadowsocks-libev/Makefile b/shadowsocks-libev/Makefile old mode 100755 new mode 100644 diff --git a/shadowsocks-libev/README.md b/shadowsocks-libev/README.md old mode 100755 new mode 100644 diff --git a/shadowsocks-libev/files/firewall.ss-rules b/shadowsocks-libev/files/firewall.ss-rules old mode 100755 new mode 100644 diff --git a/shadowsocks-libev/files/shadowsocks-libev.config b/shadowsocks-libev/files/shadowsocks-libev.config old mode 100755 new mode 100644 diff --git a/shadowsocks-libev/files/shadowsocks-libev.init b/shadowsocks-libev/files/shadowsocks-libev.init old mode 100755 new mode 100644 diff --git a/shadowsocks-libev/files/shadowsocks.conf b/shadowsocks-libev/files/shadowsocks.conf old mode 100755 new mode 100644 diff --git a/shadowsocks-libev/patches/010-ECONNRESET.patch b/shadowsocks-libev/patches/010-ECONNRESET.patch old mode 100755 new mode 100644 diff --git a/shadowsocks-v2ray-plugin/Makefile b/shadowsocks-v2ray-plugin/Makefile old mode 100755 new mode 100644 diff --git a/simple-obfs/LICENSE b/simple-obfs/LICENSE old mode 100755 new mode 100644 diff --git a/simple-obfs/Makefile b/simple-obfs/Makefile old mode 100755 new mode 100644 diff --git a/speedtestc/Makefile b/speedtestc/Makefile old mode 100755 new mode 100644 diff --git a/tcptraceroute/Makefile b/tcptraceroute/Makefile old mode 100755 new mode 100644 diff --git a/tcptraceroute/patches/001-configure_cross_compile.patch b/tcptraceroute/patches/001-configure_cross_compile.patch old mode 100755 new mode 100644 diff --git a/tracebox/Makefile b/tracebox/Makefile old mode 100755 new mode 100644 diff --git a/tracebox/files/usr/share/tracebox/omr-mptcp-trace.lua b/tracebox/files/usr/share/tracebox/omr-mptcp-trace.lua old mode 100755 new mode 100644 diff --git a/tracebox/patches/101-build-fixes.patch b/tracebox/patches/101-build-fixes.patch old mode 100755 new mode 100644 diff --git a/tracebox/patches/102-configure.patch b/tracebox/patches/102-configure.patch old mode 100755 new mode 100644 diff --git a/tracebox/patches/103-configure.patch b/tracebox/patches/103-configure.patch old mode 100755 new mode 100644 diff --git a/tracebox/patches/104-ns_name_compress.patch b/tracebox/patches/104-ns_name_compress.patch old mode 100755 new mode 100644 diff --git a/tracebox/patches/202-fix-lua-include-hpp.patch b/tracebox/patches/202-fix-lua-include-hpp.patch old mode 100755 new mode 100644 diff --git a/tracebox/patches/204-fix-lua-namespace-crafter.patch b/tracebox/patches/204-fix-lua-namespace-crafter.patch old mode 100755 new mode 100644 diff --git a/v2ray-core/Config.in b/v2ray-core/Config.in old mode 100755 new mode 100644 diff --git a/v2ray-core/LICENSE b/v2ray-core/LICENSE old mode 100755 new mode 100644 diff --git a/v2ray-core/Makefile b/v2ray-core/Makefile old mode 100755 new mode 100644 diff --git a/v2ray-core/files/etc/firewall.v2ray-rules b/v2ray-core/files/etc/firewall.v2ray-rules old mode 100755 new mode 100644 diff --git a/v2ray-core/files/etc/uci-defaults/3010-omr-v2ray b/v2ray-core/files/etc/uci-defaults/3010-omr-v2ray old mode 100755 new mode 100644 diff --git a/v2ray-ext/Makefile b/v2ray-ext/Makefile old mode 100755 new mode 100644 From d26f7f983e924e94635d8df58c3cf5a0471756ff Mon Sep 17 00:00:00 2001 From: suyuan168 <175338101@qq.com> Date: Thu, 30 Dec 2021 16:24:50 +0800 Subject: [PATCH 29/63] fix --- .circleci/config.yml | 0 .github/workflows/main.yml | 0 .github/workflows/workspace.code-workspace | 0 6in4/Makefile | 0 CLA-entity.md | 0 CLA-individual.md | 0 CODE_OF_CONDUCT.md | 0 CONTRIBUTING.md | 0 LICENSE | 0 README.md | 0 aquantia/Makefile | 0 bcm27xx-eeprom/Makefile | 0 .../0001-rpi-eeprom-update-OpenWrt-defaults.patch | 0 ...-eeprom-update-change-default-include-path.patch | 0 .../0004-rpi-eeprom-update-remove-chmod.patch | 0 contributors/cr3ative.md | 0 contributors/example.md | 0 cryptodev-linux/Makefile | 0 dsvpn/Makefile | 0 dsvpn/patches/nofirewall.patch | 0 dsvpn/patches/nostrip.patch | 0 fast-classifier/Makefile | 0 fast-classifier/src/Makefile | 0 fast-classifier/src/fast-classifier.c | 0 fast-classifier/src/fast-classifier.h | 0 fast-classifier/src/nl_classifier_test.c | 0 fast-classifier/src/sfe.h | 0 fast-classifier/src/sfe_backport.h | 0 fast-classifier/src/sfe_cm.h | 0 fast-classifier/src/userspace_example.c | 0 glorytun-udp/Makefile | 0 glorytun-udp/patches/aegis-arm.patch | 0 glorytun/Makefile | 0 glorytun/glorytun.config | 0 golang-protobuf/Makefile | 0 golang/golang-build.sh | 0 golang/golang-compiler.mk | 0 golang/golang-golang-x-crypto/Makefile | 0 golang/golang-golang-x-net/Makefile | 0 golang/golang-golang-x-sys/Makefile | 0 golang/golang-golang-x-text/Makefile | 0 golang/golang-host-build.mk | 0 golang/golang-package.mk | 0 golang/golang-values.mk | 0 golang/golang/Config.in | 0 golang/golang/Makefile | 0 golang/golang/files/go-gcc-helper | 0 https-dns-proxy/Makefile | 0 https-dns-proxy/files/README.md | 0 https-dns-proxy/files/https-dns-proxy.config | 0 https-dns-proxy/test.sh | 0 ipcalc/Makefile | 0 iperf3/Makefile | 0 iperf3/patches/remove-in6_flowlabel_req.patch | 0 lcd4linux/Config.in | 0 lcd4linux/Makefile | 0 lcd4linux/files/lcd4linux.init | 0 .../120-remove-as-needed-linker-option.patch | 0 lcd4linux/patches/140-no_repnop_T6963.patch | 0 lcd4linux/patches/150-addlibmpdclient.patch | 0 lcd4linux/patches/160-uinput_defs.patch | 0 .../patches/170-add-generic-spidev-driver.patch | 0 lcd4linux/patches/173-glcd2usb-bigendian-fix.patch | 0 libell/Makefile | 0 luci-app-dsvpn/Makefile | 0 .../luci-static/resources/view/services/dsvpn.js | 0 luci-app-dsvpn/po/fr/dsvpn.po | 0 luci-app-dsvpn/po/fr/dsvpn.po~ | 0 luci-app-dsvpn/po/ru/dsvpn.po | 0 luci-app-dsvpn/po/templates/dsvpn.pot | 0 luci-app-dsvpn/po/zh_Hans/dsvpn.po | 0 luci-app-dsvpn/po/zh_Hans/dsvpn.po~ | 0 .../root/usr/share/luci/menu.d/luci-app-dsvpn.json | 0 .../root/usr/share/rpcd/acl.d/luci-app-dsvpn.json | 0 luci-app-firewall/Makefile | 0 .../htdocs/luci-static/resources/tools/firewall.js | 0 .../luci-static/resources/view/firewall/custom.js | 0 .../luci-static/resources/view/firewall/forwards.js | 0 .../luci-static/resources/view/firewall/rules.js | 0 .../luci-static/resources/view/firewall/snats.js | 0 .../luci-static/resources/view/firewall/zones.js | 0 luci-app-firewall/po/bg/firewall.po | 0 luci-app-firewall/po/ca/firewall.po | 0 luci-app-firewall/po/cs/firewall.po | 0 luci-app-firewall/po/de/firewall.po | 0 luci-app-firewall/po/el/firewall.po | 0 luci-app-firewall/po/en/firewall.po | 0 luci-app-firewall/po/es/firewall.po | 0 luci-app-firewall/po/fr/firewall.po | 0 luci-app-firewall/po/he/firewall.po | 0 luci-app-firewall/po/hi/firewall.po | 0 luci-app-firewall/po/hu/firewall.po | 0 luci-app-firewall/po/it/firewall.po | 0 luci-app-firewall/po/ja/firewall.po | 0 luci-app-firewall/po/ko/firewall.po | 0 luci-app-firewall/po/mr/firewall.po | 0 luci-app-firewall/po/ms/firewall.po | 0 luci-app-firewall/po/nb_NO/firewall.po | 0 luci-app-firewall/po/pl/firewall.po | 0 luci-app-firewall/po/pt/firewall.po | 0 luci-app-firewall/po/pt_BR/firewall.po | 0 luci-app-firewall/po/ro/firewall.po | 0 luci-app-firewall/po/ru/firewall.po | 0 luci-app-firewall/po/sk/firewall.po | 0 luci-app-firewall/po/sv/firewall.po | 0 luci-app-firewall/po/templates/firewall.pot | 0 luci-app-firewall/po/tr/firewall.po | 0 luci-app-firewall/po/uk/firewall.po | 0 luci-app-firewall/po/vi/firewall.po | 0 luci-app-firewall/po/zh_Hans/firewall.po | 0 luci-app-firewall/po/zh_Hant/firewall.po | 0 .../usr/share/luci/menu.d/luci-app-firewall.json | 0 .../usr/share/rpcd/acl.d/luci-app-firewall.json | 0 luci-app-glorytun-tcp/Makefile | 0 .../resources/view/services/glorytun-tcp.js | 0 luci-app-glorytun-tcp/po/fr/glorytun-tcp.po | 0 luci-app-glorytun-tcp/po/fr/glorytun-tcp.po~ | 0 luci-app-glorytun-tcp/po/ru/glorytun-tcp.po | 0 luci-app-glorytun-tcp/po/templates/glorytun-tcp.pot | 0 luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po | 0 luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po~ | 0 .../root/etc/hotplug.d/iface/30-glorytun | 0 .../root/etc/uci-defaults/1200-luci-glorytun | 0 .../share/luci/menu.d/luci-app-glorytun-tcp.json | 0 .../usr/share/rpcd/acl.d/luci-app-glorytun-tcp.json | 0 luci-app-glorytun-udp/Makefile | 0 .../resources/view/services/glorytun-udp.js | 0 luci-app-glorytun-udp/po/fr/glorytun-udp.po | 0 luci-app-glorytun-udp/po/fr/glorytun-udp.po~ | 0 luci-app-glorytun-udp/po/ru/glorytun-udp.po | 0 luci-app-glorytun-udp/po/templates/glorytun-udp.pot | 0 luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po | 0 luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po~ | 0 luci-app-glorytun-udp/root/etc/config/glorytun-udp | 0 .../root/etc/hotplug.d/iface/30-glorytun-udp | 0 .../root/etc/uci-defaults/1201-luci-glorytun-udp | 0 .../share/luci/menu.d/luci-app-glorytun-udp.json | 0 .../usr/share/rpcd/acl.d/luci-app-glorytun-udp.json | 0 luci-app-haproxy-tcp/LICENSE | 0 luci-app-haproxy-tcp/Makefile | 0 luci-app-haproxy-tcp/README.md | 0 .../luasrc/controller/haproxy-tcp.lua | 0 .../luasrc/model/cbi/haproxy-tcp.lua | 0 luci-app-haproxy-tcp/po/fr/haproxy-tcp.po | 0 luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot | 0 luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po | 0 luci-app-haproxy-tcp/root/etc/config/haproxy-tcp | 0 .../root/etc/uci-defaults/41_luci-haproxy-tcp | 0 luci-app-https-dns-proxy/Makefile | 0 .../luasrc/controller/https-dns-proxy.lua | 0 .../ch.digitale-gesellschaft.dns.lua | 0 .../providers.disabled/cn.rubyfish.dns.lua | 0 .../https-dns-proxy/providers.disabled/sb.dns.lua | 0 .../providers/com.adguard.dns-family.lua | 0 .../https-dns-proxy/providers/com.adguard.dns.lua | 0 .../providers/com.cloudflare-dns-family.lua | 0 .../providers/com.cloudflare-dns-malware.lua | 0 .../providers/com.cloudflare-dns.lua | 0 .../https-dns-proxy/providers/cz.nic.odvr.lua | 0 .../luasrc/https-dns-proxy/providers/google.dns.lua | 0 .../providers/gr.libredns.doh-ads.lua | 0 .../https-dns-proxy/providers/gr.libredns.doh.lua | 0 .../https-dns-proxy/providers/net.quad9.dns.lua | 0 .../https-dns-proxy/providers/net.quad9.dns10.lua | 0 .../https-dns-proxy/providers/net.quad9.dns11.lua | 0 .../https-dns-proxy/providers/net.quad9.dns9.lua | 0 .../providers/org.cleanbrowsing.doh-adult.lua | 0 .../providers/org.cleanbrowsing.doh-family.lua | 0 .../providers/org.cleanbrowsing.doh-security.lua | 0 .../luasrc/model/cbi/https-dns-proxy.lua | 0 .../luasrc/view/https-dns-proxy/buttons.htm | 0 .../luasrc/view/https-dns-proxy/css.htm | 0 .../luasrc/view/https-dns-proxy/js.htm | 0 .../luasrc/view/https-dns-proxy/status-textarea.htm | 0 .../luasrc/view/https-dns-proxy/status.htm | 0 luci-app-https-dns-proxy/po/bg/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/ca/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/cs/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/de/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/el/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/en/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/es/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/fr/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/he/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/hi/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/hu/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/it/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/ja/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/ko/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/mr/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/ms/https-dns-proxy.po | 0 .../po/nb_NO/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/pl/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/pt/https-dns-proxy.po | 0 .../po/pt_BR/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/ro/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/ru/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/sk/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/sv/https-dns-proxy.po | 0 .../po/templates/https-dns-proxy.pot | 0 luci-app-https-dns-proxy/po/tr/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/uk/https-dns-proxy.po | 0 luci-app-https-dns-proxy/po/vi/https-dns-proxy.po | 0 .../po/zh_Hans/https-dns-proxy.po | 0 .../po/zh_Hant/https-dns-proxy.po | 0 .../root/etc/uci-defaults/40_luci-https-dns-proxy | 0 .../share/luci/menu.d/luci-app-https-dns-proxy.json | 0 .../share/rpcd/acl.d/luci-app-https-dns-proxy.json | 0 luci-app-iperf/Makefile | 0 luci-app-iperf/luasrc/controller/iperf.lua | 0 luci-app-iperf/luasrc/view/iperf/test.htm | 0 luci-app-iperf/po/de/iperf.po | 0 luci-app-iperf/po/de/iperf.po~ | 0 luci-app-iperf/po/fr/iperf.po | 0 luci-app-iperf/po/fr/iperf.po~ | 0 luci-app-iperf/po/it/iperf.po | 0 luci-app-iperf/po/it/iperf.po~ | 0 luci-app-iperf/po/oc/iperf.po | 0 luci-app-iperf/po/oc/iperf.po~ | 0 luci-app-iperf/po/ru/iperf.po | 0 luci-app-iperf/po/templates/iperf.pot | 0 luci-app-iperf/po/zh_Hans/iperf.po | 0 luci-app-iperf/po/zh_Hans/iperf.po~ | 0 luci-app-iperf/root/etc/config/iperf | 0 .../root/usr/share/luci/menu.d/luci-app-iperf.json | 0 .../root/usr/share/rpcd/acl.d/luci-app-iperf.json | 0 luci-app-macvlan/po/zh_Hans/macvlan.po | 0 luci-app-mail/Makefile | 0 luci-app-mail/luasrc/controller/mail.lua | 0 luci-app-mail/luasrc/model/cbi/mail.lua | 0 luci-app-mail/po/de/mail.po | 0 luci-app-mail/po/de/mail.po~ | 0 luci-app-mail/po/fr/mail.po | 0 luci-app-mail/po/fr/mail.po~ | 0 luci-app-mail/po/it/mail.po | 0 luci-app-mail/po/it/mail.po~ | 0 luci-app-mail/po/oc/mail.po | 0 luci-app-mail/po/oc/mail.po~ | 0 luci-app-mail/po/ru/mail.po | 0 luci-app-mail/po/templates/mail.pot | 0 luci-app-mail/po/zh_Hans/mail.po | 0 luci-app-mail/po/zh_Hans/mail.po~ | 0 luci-app-mail/root/etc/config/mail | 0 .../root/usr/share/luci/menu.d/luci-app-mail.json | 0 .../root/usr/share/rpcd/acl.d/luci-app-mail.json | 0 luci-app-mlvpn/Makefile | 0 .../luci-static/resources/view/services/mlvpn.js | 0 luci-app-mlvpn/po/fr/mlvpn.po | 0 luci-app-mlvpn/po/fr/mlvpn.po~ | 0 luci-app-mlvpn/po/ru/mlvpn.po | 0 luci-app-mlvpn/po/templates/mlvpn.pot | 0 luci-app-mlvpn/po/zh_Hans/mlvpn.po | 0 luci-app-mlvpn/po/zh_Hans/mlvpn.po~ | 0 .../root/usr/share/luci/menu.d/luci-app-mlvpn.json | 0 .../root/usr/share/rpcd/acl.d/luci-app-mlvpn.json | 0 luci-app-mptcp/Makefile | 0 .../htdocs/luci-static/resources/seedrandom.js | 0 luci-app-mptcp/luasrc/controller/mptcp.lua | 0 luci-app-mptcp/luasrc/model/cbi/mptcp.lua | 0 luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm | 0 .../luasrc/view/mptcp/mptcp_connections.htm | 0 luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm | 0 luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm | 0 luci-app-mptcp/luasrc/view/mptcp/multipath.htm | 0 luci-app-mptcp/po/de/mptcp.po | 0 luci-app-mptcp/po/de/mptcp.po~ | 0 luci-app-mptcp/po/fr/mptcp.po | 0 luci-app-mptcp/po/it/mptcp.po | 0 luci-app-mptcp/po/it/mptcp.po~ | 0 luci-app-mptcp/po/oc/mptcp.po | 0 luci-app-mptcp/po/oc/mptcp.po~ | 0 luci-app-mptcp/po/ru/mptcp.po | 0 luci-app-mptcp/po/templates/mptcp.pot | 0 luci-app-mptcp/po/zh_Hans/mptcp.po | 0 .../root/usr/share/luci/menu.d/luci-app-mptcp.json | 0 .../root/usr/share/rpcd/acl.d/luci-app-mptcp.json | 0 luci-app-nginx-ha/LICENSE | 0 luci-app-nginx-ha/Makefile | 0 luci-app-nginx-ha/luasrc/controller/nginx-ha.lua | 0 luci-app-nginx-ha/luasrc/model/cbi/nginx-ha.lua | 0 luci-app-nginx-ha/po/fr/nginx-ha.po | 0 luci-app-nginx-ha/po/templates/nginx-ha.pot | 0 luci-app-nginx-ha/root/etc/config/nginx-ha | 0 .../root/etc/uci-defaults/42_luci-nginx-ha | 0 .../usr/share/luci/menu.d/luci-app-nginx-ha.json | 0 .../usr/share/rpcd/acl.d/luci-app-nginx-ha.json | 0 luci-app-omr-bypass/Makefile | 0 .../resources/view/services/omr-bypass.js | 0 luci-app-omr-bypass/po/de/omr-bypass.po | 0 luci-app-omr-bypass/po/de/omr-bypass.po~ | 0 luci-app-omr-bypass/po/fr/omr-bypass.po | 0 luci-app-omr-bypass/po/it/omr-bypass.po | 0 luci-app-omr-bypass/po/it/omr-bypass.po~ | 0 luci-app-omr-bypass/po/oc/omr-bypass.po | 0 luci-app-omr-bypass/po/oc/omr-bypass.po~ | 0 luci-app-omr-bypass/po/ru/omr-bypass.po | 0 luci-app-omr-bypass/po/templates/omr-bypass.pot | 0 luci-app-omr-bypass/po/zh_Hans/omr-bypass.po | 0 luci-app-omr-bypass/root/etc/config/omr-bypass | 0 luci-app-omr-bypass/root/etc/firewall.omr-bypass | 0 .../usr/share/luci/menu.d/luci-app-omr-bypass.json | 0 .../usr/share/rpcd/acl.d/luci-app-omr-bypass.json | 0 luci-app-omr-dscp/Makefile | 0 luci-app-omr-dscp/luasrc/controller/omr-dscp.lua | 0 luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua | 0 luci-app-omr-dscp/luasrc/model/cbi/dscp.lua | 0 luci-app-omr-dscp/po/de/omr-dscp.po | 0 luci-app-omr-dscp/po/de/omr-dscp.po~ | 0 luci-app-omr-dscp/po/fr/omr-dscp.po | 0 luci-app-omr-dscp/po/fr/omr-dscp.po~ | 0 luci-app-omr-dscp/po/it/omr-dscp.po | 0 luci-app-omr-dscp/po/it/omr-dscp.po~ | 0 luci-app-omr-dscp/po/oc/omr-dscp.po | 0 luci-app-omr-dscp/po/oc/omr-dscp.po~ | 0 luci-app-omr-dscp/po/templates/omr-dscp.pot | 0 luci-app-omr-dscp/po/zh_Hans/omr-dscp.po | 0 luci-app-omr-dscp/po/zh_Hans/omr-dscp.po~ | 0 luci-app-omr-dscp/root/etc/config/dscp | 0 .../usr/share/luci/menu.d/luci-app-omr-dscp.json | 0 .../usr/share/rpcd/acl.d/luci-app-omr-dscp.json | 0 luci-app-omr-quota/Makefile | 0 luci-app-omr-quota/luasrc/controller/quota.lua | 0 luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua | 0 .../luasrc/view/omr-quota/cbi-select-add.htm | 0 luci-app-omr-quota/po/de/omr-quota.po | 0 luci-app-omr-quota/po/de/omr-quota.po~ | 0 luci-app-omr-quota/po/fr/omr-quota.po | 0 luci-app-omr-quota/po/fr/omr-quota.po~ | 0 luci-app-omr-quota/po/it/omr-quota.po | 0 luci-app-omr-quota/po/it/omr-quota.po~ | 0 luci-app-omr-quota/po/oc/omr-quota.po | 0 luci-app-omr-quota/po/oc/omr-quota.po~ | 0 luci-app-omr-quota/po/ru/omr-quota.po | 0 luci-app-omr-quota/po/templates/omr-quota.pot | 0 luci-app-omr-quota/po/zh_Hans/omr-quota.po | 0 luci-app-omr-quota/po/zh_Hans/omr-quota.po~ | 0 .../usr/share/luci/menu.d/luci-app-omr-quota.json | 0 .../usr/share/rpcd/acl.d/luci-app-omr-quota.json | 0 luci-app-omr-tracker/Makefile | 0 .../luasrc/controller/omr-tracker.lua | 0 .../luasrc/model/cbi/omr-tracker.lua | 0 .../luasrc/view/omr-tracker/cbi-select-add.htm | 0 luci-app-omr-tracker/po/de/omr-tracker.po | 0 luci-app-omr-tracker/po/de/omr-tracker.po~ | 0 luci-app-omr-tracker/po/fr/omr-tracker.po | 0 luci-app-omr-tracker/po/fr/omr-tracker.po~ | 0 luci-app-omr-tracker/po/it/omr-tracker.po | 0 luci-app-omr-tracker/po/it/omr-tracker.po~ | 0 luci-app-omr-tracker/po/oc/omr-tracker.po | 0 luci-app-omr-tracker/po/oc/omr-tracker.po~ | 0 luci-app-omr-tracker/po/templates/omr-tracker.pot | 0 luci-app-omr-tracker/po/zh_Hans/omr-tracker.po | 0 .../root/etc/uci-defaults/42_luci-omr-tracker | 0 .../usr/share/luci/menu.d/luci-app-omr-tracker.json | 0 .../usr/share/rpcd/acl.d/luci-app-omr-tracker.json | 0 luci-app-openmptcprouter/Makefile | 0 .../luasrc/controller/openmptcprouter.lua | 0 .../luasrc/view/openmptcprouter/backup.htm | 0 .../luasrc/view/openmptcprouter/debug.htm | 0 .../luasrc/view/openmptcprouter/settings.htm | 0 .../luasrc/view/openmptcprouter/wanstatus.htm | 0 .../luasrc/view/openmptcprouter/wizard.htm | 0 luci-app-openmptcprouter/po/de/openmptcprouter.po | 0 luci-app-openmptcprouter/po/de/openmptcprouter.po~ | 0 luci-app-openmptcprouter/po/fr/openmptcprouter.po | 0 luci-app-openmptcprouter/po/fr/openmptcprouter.po~ | 0 luci-app-openmptcprouter/po/it/openmptcprouter.po | 0 luci-app-openmptcprouter/po/it/openmptcprouter.po~ | 0 luci-app-openmptcprouter/po/oc/openmptcprouter.po | 0 luci-app-openmptcprouter/po/oc/openmptcprouter.po~ | 0 .../po/templates/openmptcprouter.pot | 0 .../po/zh_Hans/openmptcprouter.po | 0 .../po/zh_Hans/openmptcprouter.po~ | 0 .../root/etc/config/openmptcprouter | 0 .../root/etc/hotplug.d/net/99-omr-rename | 0 .../share/luci/menu.d/luci-app-openmptcprouter.json | 0 .../share/rpcd/acl.d/luci-app-openmptcprouter.json | 0 luci-app-packet-capture/Makefile | 0 .../resources/view/packet_capture/tcpdump.js | 0 luci-app-packet-capture/po/fr/packet-capture.po | 0 .../po/templates/packet-capture.pot | 0 .../po/zh_Hans/packet-capture.po | 0 .../root/etc/config/packet_capture | 0 .../share/luci/menu.d/luci-app-packet-capture.json | 0 .../share/rpcd/acl.d/luci-app-packet-capture.json | 0 luci-app-shadowsocks-libev/Makefile | 0 .../luci-static/resources/shadowsocks-libev.js | 0 .../resources/view/shadowsocks-libev/instances.js | 0 .../resources/view/shadowsocks-libev/rules.js | 0 .../resources/view/shadowsocks-libev/servers.js | 0 .../luasrc/controller/shadowsocks-libev.lua | 0 .../po/bg/shadowsocks-libev.po | 0 .../po/ca/shadowsocks-libev.po | 0 .../po/cs/shadowsocks-libev.po | 0 .../po/de/shadowsocks-libev.po | 0 .../po/el/shadowsocks-libev.po | 0 .../po/en/shadowsocks-libev.po | 0 .../po/es/shadowsocks-libev.po | 0 .../po/fr/shadowsocks-libev.po | 0 .../po/he/shadowsocks-libev.po | 0 .../po/hi/shadowsocks-libev.po | 0 .../po/hu/shadowsocks-libev.po | 0 .../po/it/shadowsocks-libev.po | 0 .../po/ja/shadowsocks-libev.po | 0 .../po/ko/shadowsocks-libev.po | 0 .../po/ms/shadowsocks-libev.po | 0 .../po/nb_NO/shadowsocks-libev.po | 0 .../po/pl/shadowsocks-libev.po | 0 .../po/pt/shadowsocks-libev.po | 0 .../po/pt_BR/shadowsocks-libev.po | 0 .../po/ro/shadowsocks-libev.po | 0 .../po/ru/shadowsocks-libev.po | 0 .../po/sk/shadowsocks-libev.po | 0 .../po/sv/shadowsocks-libev.po | 0 .../po/templates/shadowsocks-libev.pot | 0 .../po/tr/shadowsocks-libev.po | 0 .../po/uk/shadowsocks-libev.po | 0 .../po/vi/shadowsocks-libev.po | 0 .../po/zh-cn/shadowsocks-libev.po | 0 .../po/zh-tw/shadowsocks-libev.po | 0 .../root/etc/uci-defaults/40_luci-shadowsocks-libev | 0 .../luci/menu.d/luci-app-shadowsocks-libev.json | 0 .../rpcd/acl.d/luci-app-shadowsocks-libev.json | 0 luci-app-shutdown/Makefile | 0 .../luci-static/resources/view/system/shutdown.js | 0 luci-app-shutdown/po/de/shutdown.po | 0 luci-app-shutdown/po/fr/shutdown.po | 0 luci-app-shutdown/po/it/shutdown.po | 0 luci-app-shutdown/po/oc/shutdown.po | 0 luci-app-shutdown/po/pl/shutdown.po | 0 luci-app-shutdown/po/ru/shutdown.po | 0 luci-app-shutdown/po/templates/shutdown.pot | 0 luci-app-shutdown/po/zh_Hans/shutdown.po | 0 .../usr/share/luci/menu.d/luci-app-shutdown.json | 0 .../usr/share/rpcd/acl.d/luci-app-shutdown.json | 0 luci-app-snmpd/Makefile | 0 luci-app-snmpd/luasrc/controller/snmpd.lua | 0 luci-app-snmpd/luasrc/model/cbi/snmpd.lua | 0 luci-app-snmpd/luasrc/view/snmpd.htm | 0 luci-app-snmpd/po/de/snmpd.po | 0 luci-app-snmpd/po/fr/snmpd.po | 0 luci-app-snmpd/po/it/snmpd.po | 0 luci-app-snmpd/po/oc/snmpd.po | 0 luci-app-snmpd/po/templates/snmpd.pot | 0 luci-app-snmpd/po/zh_Hans/snmpd.po | 0 luci-app-snmpd/root/etc/config/snmpd | 0 .../root/usr/share/luci/menu.d/luci-app-snmpd.json | 0 .../root/usr/share/rpcd/acl.d/luci-app-snmpd.json | 0 luci-app-status/Makefile | 0 .../luci-static/resources/status/css/wanstatus.css | 0 .../resources/status/images/status-doing.png | Bin .../resources/status/images/status-done.png | Bin .../resources/status/images/status-error.png | Bin .../resources/status/images/status-todo.png | Bin .../resources/status/images/status-warn.png | Bin .../resources/status/images/statusError.png | Bin .../resources/status/images/statusOK.png | Bin .../resources/status/images/statusWarning.png | Bin luci-app-status/luasrc/controller/status.lua | 0 luci-app-status/luasrc/view/status/server.htm | 0 luci-app-status/luasrc/view/status/wanstatus.htm | 0 luci-app-status/po/templates/status.pot | 0 luci-app-status/po/zh_Hans/status.po | 0 .../root/usr/share/luci/menu.d/luci-app-status.json | 0 .../root/usr/share/rpcd/acl.d/luci-app-status.json | 0 luci-app-sysupgrade/Makefile | 0 luci-app-sysupgrade/luasrc/view/sysupgrade.htm | 0 luci-app-sysupgrade/po/fr/sysupgrade.po | 0 luci-app-sysupgrade/po/fr/sysupgrade.po~ | 0 luci-app-sysupgrade/po/ru/sysupgrade.po | 0 luci-app-sysupgrade/po/templates/sysupgrade.pot | 0 luci-app-sysupgrade/po/zh_Hans/sysupgrade.po | 0 luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ | 0 .../usr/share/luci/menu.d/luci-app-sysupgrade.json | 0 .../root/usr/share/rpcd/acl.d/sysupgrade.json | 0 .../root/www/luci-static/resources/sysupgrade.js | 0 luci-base/po/oc/base.po | 0 luci-base/po/templates/base.pot | 0 luci-mod-dashboard/Makefile | 0 .../resources/view/dashboard/css/custom.css | 0 .../resources/view/dashboard/icons/devices.svg | 0 .../resources/view/dashboard/icons/internet.svg | 0 .../resources/view/dashboard/icons/not-internet.svg | 0 .../resources/view/dashboard/icons/router.svg | 0 .../resources/view/dashboard/icons/wireless.svg | 0 .../resources/view/dashboard/include/10_router.js | 0 .../resources/view/dashboard/include/20_lan.js | 0 .../resources/view/dashboard/include/30_wifi.js | 0 .../luci-static/resources/view/dashboard/index.js | 0 luci-mod-dashboard/po/fr/dashboard.po | 0 luci-mod-dashboard/po/ru/dashboard.po | 0 luci-mod-dashboard/po/templates/dashboard.pot | 0 luci-mod-dashboard/po/zh_Hans/dashboard.po | 0 .../usr/share/luci/menu.d/luci-mod-dashboard.json | 0 .../usr/share/rpcd/acl.d/luci-mod-dashboard.json | 0 luci-mod-network/Makefile | 0 .../htdocs/luci-static/resources/tools/network.js | 0 .../luci-static/resources/view/network/dhcp.js | 0 .../resources/view/network/diagnostics.js | 0 .../luci-static/resources/view/network/hosts.js | 0 .../resources/view/network/interfaces.js | 0 .../luci-static/resources/view/network/routes.js | 0 .../luci-static/resources/view/network/switch.js | 0 .../luci-static/resources/view/network/wireless.js | 0 .../usr/share/luci/menu.d/luci-mod-network.json | 0 .../root/usr/share/rpcd/acl.d/luci-mod-network.json | 0 luci-proto-mbim/Makefile | 0 .../htdocs/luci-static/resources/protocol/mbim.js | 0 luci-theme-argon/Makefile | 0 luci-theme-argon/README.md | 0 luci-theme-argon/README_ZH.md | 0 luci-theme-argon/Screenshots/screenshot_pc.jpg | Bin luci-theme-argon/Screenshots/screenshot_phone.jpg | Bin .../htdocs/luci-static/argon/background/README.md | 0 .../htdocs/luci-static/argon/css/cascade.css | 0 .../htdocs/luci-static/argon/css/dark.css | 0 .../htdocs/luci-static/argon/css/fonts.css | 0 .../htdocs/luci-static/argon/css/pure-min.css | 0 .../htdocs/luci-static/argon/favicon.ico | Bin .../htdocs/luci-static/argon/fonts/TypoGraphica.eot | Bin .../htdocs/luci-static/argon/fonts/TypoGraphica.svg | 0 .../htdocs/luci-static/argon/fonts/TypoGraphica.ttf | Bin .../luci-static/argon/fonts/TypoGraphica.woff | Bin .../htdocs/luci-static/argon/fonts/argon.eot | Bin .../htdocs/luci-static/argon/fonts/argon.svg | 0 .../htdocs/luci-static/argon/fonts/argon.ttf | Bin .../htdocs/luci-static/argon/fonts/argon.woff | Bin .../luci-static/argon/icon/android-icon-192x192.png | Bin .../luci-static/argon/icon/apple-icon-144x144.png | Bin .../luci-static/argon/icon/apple-icon-60x60.png | Bin .../luci-static/argon/icon/apple-icon-72x72.png | Bin .../htdocs/luci-static/argon/icon/arrow.svg | 0 .../htdocs/luci-static/argon/icon/browserconfig.xml | 0 .../htdocs/luci-static/argon/icon/favicon-16x16.png | Bin .../htdocs/luci-static/argon/icon/favicon-32x32.png | Bin .../htdocs/luci-static/argon/icon/favicon-96x96.png | Bin .../htdocs/luci-static/argon/icon/manifest.json | 0 .../luci-static/argon/icon/ms-icon-144x144.png | Bin .../htdocs/luci-static/argon/icon/spinner.svg | 0 .../htdocs/luci-static/argon/img/argon.svg | 0 .../htdocs/luci-static/argon/img/bg1.jpg | Bin .../htdocs/luci-static/argon/img/blank.png | Bin .../htdocs/luci-static/argon/img/volume_high.svg | 0 .../htdocs/luci-static/argon/img/volume_off.svg | 0 .../htdocs/luci-static/argon/js/jquery.min.js | 0 .../htdocs/luci-static/argon/js/polyfill.min.js | 0 .../htdocs/luci-static/argon/js/script.js | 0 .../htdocs/luci-static/argon/less/cascade.less | 0 .../htdocs/luci-static/argon/less/dark.less | 0 .../luasrc/view/themes/argon/footer_login.htm | 0 .../luasrc/view/themes/argon/header.htm | 0 .../luasrc/view/themes/argon/header_login.htm | 0 .../luasrc/view/themes/argon/out_footer_login.htm | 0 .../luasrc/view/themes/argon/out_header_login.htm | 0 .../luasrc/view/themes/argon/sysauth.htm | 0 .../root/etc/uci-defaults/30_luci-theme-argon | 0 luci-theme-openmptcprouter/Makefile | 0 .../htdocs/luci-static/openmptcprouter/html5.js | 0 .../htdocs/luci-static/openmptcprouter/mobile.css | 0 .../luci-static/resources/menu-openmptcprouter.js | 0 .../resources/openmptcprouter/images/omr-logo.png | Bin luci-theme-openwrt-2020/Makefile | 0 .../openwrt2020/GalanoGrotesqueW00-Regular.woff2 | Bin .../htdocs/luci-static/openwrt2020/cascade.css | 0 .../htdocs/luci-static/openwrt2020/favicon.png | Bin .../htdocs/luci-static/openwrt2020/omr-logo.png | Bin .../htdocs/luci-static/openwrt2020/spinner.svg | 0 .../luci-static/resources/menu-openwrt2020.js | 0 .../luasrc/view/themes/openwrt2020/footer.htm | 0 .../luasrc/view/themes/openwrt2020/header.htm | 0 macvlan/Makefile | 0 macvlan/files/etc/config/macvlan | 0 macvlan/files/etc/uci-defaults/40_luci-app-macvlan | 0 mlvpn/Makefile | 0 mlvpn/files/etc/config/mlvpn | 0 mlvpn/files/etc/uci-defaults/4100-mlvpn | 0 mlvpn/patches/020-remove-cdefs.patch | 0 mptcp/Makefile | 0 mptcp/files/etc/hotplug.d/iface/30-mptcp | 0 mptcpd/Makefile | 0 mptcpd/patches/remove_log.patch | 0 msmtp/Makefile | 0 ndisc6/Makefile | 0 ndpi-netfilter2/Makefile | 0 net-tools/Makefile | 0 net-tools/patches/mptcp-support.patch | 0 nginx/Config.in | 0 nginx/Config_ssl.in | 0 nginx/Makefile | 0 nginx/files-luci-support/60_nginx-luci-support | 0 nginx/files-luci-support/70_nginx-luci-support-ssl | 0 nginx/files-luci-support/luci_nginx.conf | 0 nginx/files-luci-support/luci_nginx_ssl.conf | 0 nginx/files-luci-support/luci_uwsgi.conf | 0 nginx/files/nginx.init | 0 nginx/patches-lua-nginx/100-no_by_lua_block.patch | 0 nginx/patches/101-feature_test_fix.patch | 0 nginx/patches/102-sizeof_test_fix.patch | 0 nginx/patches/103-sys_nerr.patch | 0 nginx/patches/200-config.patch | 0 nginx/patches/201-ignore-invalid-options.patch | 0 nginx/patches/300-max-processes.patch | 0 omr-6in4/Makefile | 0 omr-quota/Makefile | 0 omr-quota/files/etc/config/omr-quota | 0 omr-tracker/Makefile | 0 omr-tracker/files/etc/config/omr-tracker | 0 omr-update/Makefile | 0 openmptcprouter-full/Makefile | 0 openmptcprouter-mini/Makefile | 0 openmptcprouter/Makefile | 0 openmptcprouter/files/etc/firewall.gre-tunnel | 0 openmptcprouter/files/etc/firewall.omr-server | 0 openmptcprouter/files/etc/firewall.ttl | 0 openmptcprouter/files/etc/hotplug.d/iface/00-nego | 0 openmptcprouter/files/etc/iproute2/rt_dsfield | 0 openmptcprouter/files/etc/sysctl.d/default.conf | 0 openmptcprouter/files/etc/wgetrc4 | 0 protobuf/Makefile | 0 r8168/Makefile | 0 .../001-r8168-add-LED-configuration-from-OF.patch | 0 serdisplib/Makefile | 0 shadowsocks-libev/Makefile | 0 shadowsocks-libev/README.md | 0 shadowsocks-libev/files/firewall.ss-rules | 0 shadowsocks-libev/files/shadowsocks-libev.config | 0 shadowsocks-libev/files/shadowsocks-libev.init | 0 shadowsocks-libev/files/shadowsocks.conf | 0 shadowsocks-libev/patches/010-ECONNRESET.patch | 0 shadowsocks-v2ray-plugin/Makefile | 0 shortcut-fe/Makefile | 0 shortcut-fe/files/usr/bin/sfe_dump | 0 shortcut-fe/src/Kconfig | 0 shortcut-fe/src/Makefile | 0 shortcut-fe/src/sfe.h | 0 shortcut-fe/src/sfe_backport.h | 0 shortcut-fe/src/sfe_cm.c | 0 shortcut-fe/src/sfe_cm.h | 0 shortcut-fe/src/sfe_ipv4.c | 0 shortcut-fe/src/sfe_ipv6.c | 0 simple-obfs/LICENSE | 0 simple-obfs/Makefile | 0 speedtestc/Makefile | 0 tcptraceroute/Makefile | 0 .../patches/001-configure_cross_compile.patch | 0 tracebox/Makefile | 0 .../files/usr/share/tracebox/omr-mptcp-trace.lua | 0 tracebox/patches/101-build-fixes.patch | 0 tracebox/patches/102-configure.patch | 0 tracebox/patches/103-configure.patch | 0 tracebox/patches/104-ns_name_compress.patch | 0 tracebox/patches/202-fix-lua-include-hpp.patch | 0 .../patches/204-fix-lua-namespace-crafter.patch | 0 v2ray-core/Config.in | 0 v2ray-core/LICENSE | 0 v2ray-core/Makefile | 0 v2ray-core/files/etc/firewall.v2ray-rules | 0 v2ray-core/files/etc/uci-defaults/3010-omr-v2ray | 0 v2ray-ext/Makefile | 0 xtables-addons/Makefile | 0 .../patches/001-fix-kernel-version-detection.patch | 0 xtables-addons/patches/100-add-rtsp-conntrack.patch | 0 .../patches/200-add-lua-packetscript.patch | 0 .../patches/201-fix-lua-packetscript.patch | 0 xtables-addons/patches/210-freebsd-build-fix.patch | 0 665 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 .circleci/config.yml mode change 100644 => 100755 .github/workflows/main.yml mode change 100644 => 100755 .github/workflows/workspace.code-workspace mode change 100644 => 100755 6in4/Makefile mode change 100644 => 100755 CLA-entity.md mode change 100644 => 100755 CLA-individual.md mode change 100644 => 100755 CODE_OF_CONDUCT.md mode change 100644 => 100755 CONTRIBUTING.md mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 aquantia/Makefile mode change 100644 => 100755 bcm27xx-eeprom/Makefile mode change 100644 => 100755 bcm27xx-eeprom/patches/0001-rpi-eeprom-update-OpenWrt-defaults.patch mode change 100644 => 100755 bcm27xx-eeprom/patches/0003-rpi-eeprom-update-change-default-include-path.patch mode change 100644 => 100755 bcm27xx-eeprom/patches/0004-rpi-eeprom-update-remove-chmod.patch mode change 100644 => 100755 contributors/cr3ative.md mode change 100644 => 100755 contributors/example.md mode change 100644 => 100755 cryptodev-linux/Makefile mode change 100644 => 100755 dsvpn/Makefile mode change 100644 => 100755 dsvpn/patches/nofirewall.patch mode change 100644 => 100755 dsvpn/patches/nostrip.patch mode change 100644 => 100755 fast-classifier/Makefile mode change 100644 => 100755 fast-classifier/src/Makefile mode change 100644 => 100755 fast-classifier/src/fast-classifier.c mode change 100644 => 100755 fast-classifier/src/fast-classifier.h mode change 100644 => 100755 fast-classifier/src/nl_classifier_test.c mode change 100644 => 100755 fast-classifier/src/sfe.h mode change 100644 => 100755 fast-classifier/src/sfe_backport.h mode change 100644 => 100755 fast-classifier/src/sfe_cm.h mode change 100644 => 100755 fast-classifier/src/userspace_example.c mode change 100644 => 100755 glorytun-udp/Makefile mode change 100644 => 100755 glorytun-udp/patches/aegis-arm.patch mode change 100644 => 100755 glorytun/Makefile mode change 100644 => 100755 glorytun/glorytun.config mode change 100644 => 100755 golang-protobuf/Makefile mode change 100644 => 100755 golang/golang-build.sh mode change 100644 => 100755 golang/golang-compiler.mk mode change 100644 => 100755 golang/golang-golang-x-crypto/Makefile mode change 100644 => 100755 golang/golang-golang-x-net/Makefile mode change 100644 => 100755 golang/golang-golang-x-sys/Makefile mode change 100644 => 100755 golang/golang-golang-x-text/Makefile mode change 100644 => 100755 golang/golang-host-build.mk mode change 100644 => 100755 golang/golang-package.mk mode change 100644 => 100755 golang/golang-values.mk mode change 100644 => 100755 golang/golang/Config.in mode change 100644 => 100755 golang/golang/Makefile mode change 100644 => 100755 golang/golang/files/go-gcc-helper mode change 100644 => 100755 https-dns-proxy/Makefile mode change 100644 => 100755 https-dns-proxy/files/README.md mode change 100644 => 100755 https-dns-proxy/files/https-dns-proxy.config mode change 100644 => 100755 https-dns-proxy/test.sh mode change 100644 => 100755 ipcalc/Makefile mode change 100644 => 100755 iperf3/Makefile mode change 100644 => 100755 iperf3/patches/remove-in6_flowlabel_req.patch mode change 100644 => 100755 lcd4linux/Config.in mode change 100644 => 100755 lcd4linux/Makefile mode change 100644 => 100755 lcd4linux/files/lcd4linux.init mode change 100644 => 100755 lcd4linux/patches/120-remove-as-needed-linker-option.patch mode change 100644 => 100755 lcd4linux/patches/140-no_repnop_T6963.patch mode change 100644 => 100755 lcd4linux/patches/150-addlibmpdclient.patch mode change 100644 => 100755 lcd4linux/patches/160-uinput_defs.patch mode change 100644 => 100755 lcd4linux/patches/170-add-generic-spidev-driver.patch mode change 100644 => 100755 lcd4linux/patches/173-glcd2usb-bigendian-fix.patch mode change 100644 => 100755 libell/Makefile mode change 100644 => 100755 luci-app-dsvpn/Makefile mode change 100644 => 100755 luci-app-dsvpn/htdocs/luci-static/resources/view/services/dsvpn.js mode change 100644 => 100755 luci-app-dsvpn/po/fr/dsvpn.po mode change 100644 => 100755 luci-app-dsvpn/po/fr/dsvpn.po~ mode change 100644 => 100755 luci-app-dsvpn/po/ru/dsvpn.po mode change 100644 => 100755 luci-app-dsvpn/po/templates/dsvpn.pot mode change 100644 => 100755 luci-app-dsvpn/po/zh_Hans/dsvpn.po mode change 100644 => 100755 luci-app-dsvpn/po/zh_Hans/dsvpn.po~ mode change 100644 => 100755 luci-app-dsvpn/root/usr/share/luci/menu.d/luci-app-dsvpn.json mode change 100644 => 100755 luci-app-dsvpn/root/usr/share/rpcd/acl.d/luci-app-dsvpn.json mode change 100644 => 100755 luci-app-firewall/Makefile mode change 100644 => 100755 luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js mode change 100644 => 100755 luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js mode change 100644 => 100755 luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js mode change 100644 => 100755 luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js mode change 100644 => 100755 luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js mode change 100644 => 100755 luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js mode change 100644 => 100755 luci-app-firewall/po/bg/firewall.po mode change 100644 => 100755 luci-app-firewall/po/ca/firewall.po mode change 100644 => 100755 luci-app-firewall/po/cs/firewall.po mode change 100644 => 100755 luci-app-firewall/po/de/firewall.po mode change 100644 => 100755 luci-app-firewall/po/el/firewall.po mode change 100644 => 100755 luci-app-firewall/po/en/firewall.po mode change 100644 => 100755 luci-app-firewall/po/es/firewall.po mode change 100644 => 100755 luci-app-firewall/po/fr/firewall.po mode change 100644 => 100755 luci-app-firewall/po/he/firewall.po mode change 100644 => 100755 luci-app-firewall/po/hi/firewall.po mode change 100644 => 100755 luci-app-firewall/po/hu/firewall.po mode change 100644 => 100755 luci-app-firewall/po/it/firewall.po mode change 100644 => 100755 luci-app-firewall/po/ja/firewall.po mode change 100644 => 100755 luci-app-firewall/po/ko/firewall.po mode change 100644 => 100755 luci-app-firewall/po/mr/firewall.po mode change 100644 => 100755 luci-app-firewall/po/ms/firewall.po mode change 100644 => 100755 luci-app-firewall/po/nb_NO/firewall.po mode change 100644 => 100755 luci-app-firewall/po/pl/firewall.po mode change 100644 => 100755 luci-app-firewall/po/pt/firewall.po mode change 100644 => 100755 luci-app-firewall/po/pt_BR/firewall.po mode change 100644 => 100755 luci-app-firewall/po/ro/firewall.po mode change 100644 => 100755 luci-app-firewall/po/ru/firewall.po mode change 100644 => 100755 luci-app-firewall/po/sk/firewall.po mode change 100644 => 100755 luci-app-firewall/po/sv/firewall.po mode change 100644 => 100755 luci-app-firewall/po/templates/firewall.pot mode change 100644 => 100755 luci-app-firewall/po/tr/firewall.po mode change 100644 => 100755 luci-app-firewall/po/uk/firewall.po mode change 100644 => 100755 luci-app-firewall/po/vi/firewall.po mode change 100644 => 100755 luci-app-firewall/po/zh_Hans/firewall.po mode change 100644 => 100755 luci-app-firewall/po/zh_Hant/firewall.po mode change 100644 => 100755 luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json mode change 100644 => 100755 luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json mode change 100644 => 100755 luci-app-glorytun-tcp/Makefile mode change 100644 => 100755 luci-app-glorytun-tcp/htdocs/luci-static/resources/view/services/glorytun-tcp.js mode change 100644 => 100755 luci-app-glorytun-tcp/po/fr/glorytun-tcp.po mode change 100644 => 100755 luci-app-glorytun-tcp/po/fr/glorytun-tcp.po~ mode change 100644 => 100755 luci-app-glorytun-tcp/po/ru/glorytun-tcp.po mode change 100644 => 100755 luci-app-glorytun-tcp/po/templates/glorytun-tcp.pot mode change 100644 => 100755 luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po mode change 100644 => 100755 luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po~ mode change 100644 => 100755 luci-app-glorytun-tcp/root/etc/hotplug.d/iface/30-glorytun mode change 100644 => 100755 luci-app-glorytun-tcp/root/etc/uci-defaults/1200-luci-glorytun mode change 100644 => 100755 luci-app-glorytun-tcp/root/usr/share/luci/menu.d/luci-app-glorytun-tcp.json mode change 100644 => 100755 luci-app-glorytun-tcp/root/usr/share/rpcd/acl.d/luci-app-glorytun-tcp.json mode change 100644 => 100755 luci-app-glorytun-udp/Makefile mode change 100644 => 100755 luci-app-glorytun-udp/htdocs/luci-static/resources/view/services/glorytun-udp.js mode change 100644 => 100755 luci-app-glorytun-udp/po/fr/glorytun-udp.po mode change 100644 => 100755 luci-app-glorytun-udp/po/fr/glorytun-udp.po~ mode change 100644 => 100755 luci-app-glorytun-udp/po/ru/glorytun-udp.po mode change 100644 => 100755 luci-app-glorytun-udp/po/templates/glorytun-udp.pot mode change 100644 => 100755 luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po mode change 100644 => 100755 luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po~ mode change 100644 => 100755 luci-app-glorytun-udp/root/etc/config/glorytun-udp mode change 100644 => 100755 luci-app-glorytun-udp/root/etc/hotplug.d/iface/30-glorytun-udp mode change 100644 => 100755 luci-app-glorytun-udp/root/etc/uci-defaults/1201-luci-glorytun-udp mode change 100644 => 100755 luci-app-glorytun-udp/root/usr/share/luci/menu.d/luci-app-glorytun-udp.json mode change 100644 => 100755 luci-app-glorytun-udp/root/usr/share/rpcd/acl.d/luci-app-glorytun-udp.json mode change 100644 => 100755 luci-app-haproxy-tcp/LICENSE mode change 100644 => 100755 luci-app-haproxy-tcp/Makefile mode change 100644 => 100755 luci-app-haproxy-tcp/README.md mode change 100644 => 100755 luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua mode change 100644 => 100755 luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua mode change 100644 => 100755 luci-app-haproxy-tcp/po/fr/haproxy-tcp.po mode change 100644 => 100755 luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot mode change 100644 => 100755 luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po mode change 100644 => 100755 luci-app-haproxy-tcp/root/etc/config/haproxy-tcp mode change 100644 => 100755 luci-app-haproxy-tcp/root/etc/uci-defaults/41_luci-haproxy-tcp mode change 100644 => 100755 luci-app-https-dns-proxy/Makefile mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/controller/https-dns-proxy.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ch.digitale-gesellschaft.dns.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/cn.rubyfish.dns.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/sb.dns.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns-family.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-family.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-malware.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cz.nic.odvr.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/google.dns.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh-ads.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-adult.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-family.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-security.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/css.htm mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/js.htm mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status-textarea.htm mode change 100644 => 100755 luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status.htm mode change 100644 => 100755 luci-app-https-dns-proxy/po/bg/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/ca/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/cs/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/de/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/el/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/en/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/es/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/fr/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/he/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/hi/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/hu/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/it/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/ja/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/ko/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/mr/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/ms/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/nb_NO/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/pl/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/pt/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/pt_BR/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/ro/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/ru/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/sk/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/sv/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/templates/https-dns-proxy.pot mode change 100644 => 100755 luci-app-https-dns-proxy/po/tr/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/uk/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/vi/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/zh_Hans/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/po/zh_Hant/https-dns-proxy.po mode change 100644 => 100755 luci-app-https-dns-proxy/root/etc/uci-defaults/40_luci-https-dns-proxy mode change 100644 => 100755 luci-app-https-dns-proxy/root/usr/share/luci/menu.d/luci-app-https-dns-proxy.json mode change 100644 => 100755 luci-app-https-dns-proxy/root/usr/share/rpcd/acl.d/luci-app-https-dns-proxy.json mode change 100644 => 100755 luci-app-iperf/Makefile mode change 100644 => 100755 luci-app-iperf/luasrc/controller/iperf.lua mode change 100644 => 100755 luci-app-iperf/luasrc/view/iperf/test.htm mode change 100644 => 100755 luci-app-iperf/po/de/iperf.po mode change 100644 => 100755 luci-app-iperf/po/de/iperf.po~ mode change 100644 => 100755 luci-app-iperf/po/fr/iperf.po mode change 100644 => 100755 luci-app-iperf/po/fr/iperf.po~ mode change 100644 => 100755 luci-app-iperf/po/it/iperf.po mode change 100644 => 100755 luci-app-iperf/po/it/iperf.po~ mode change 100644 => 100755 luci-app-iperf/po/oc/iperf.po mode change 100644 => 100755 luci-app-iperf/po/oc/iperf.po~ mode change 100644 => 100755 luci-app-iperf/po/ru/iperf.po mode change 100644 => 100755 luci-app-iperf/po/templates/iperf.pot mode change 100644 => 100755 luci-app-iperf/po/zh_Hans/iperf.po mode change 100644 => 100755 luci-app-iperf/po/zh_Hans/iperf.po~ mode change 100644 => 100755 luci-app-iperf/root/etc/config/iperf mode change 100644 => 100755 luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json mode change 100644 => 100755 luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json mode change 100644 => 100755 luci-app-macvlan/po/zh_Hans/macvlan.po mode change 100644 => 100755 luci-app-mail/Makefile mode change 100644 => 100755 luci-app-mail/luasrc/controller/mail.lua mode change 100644 => 100755 luci-app-mail/luasrc/model/cbi/mail.lua mode change 100644 => 100755 luci-app-mail/po/de/mail.po mode change 100644 => 100755 luci-app-mail/po/de/mail.po~ mode change 100644 => 100755 luci-app-mail/po/fr/mail.po mode change 100644 => 100755 luci-app-mail/po/fr/mail.po~ mode change 100644 => 100755 luci-app-mail/po/it/mail.po mode change 100644 => 100755 luci-app-mail/po/it/mail.po~ mode change 100644 => 100755 luci-app-mail/po/oc/mail.po mode change 100644 => 100755 luci-app-mail/po/oc/mail.po~ mode change 100644 => 100755 luci-app-mail/po/ru/mail.po mode change 100644 => 100755 luci-app-mail/po/templates/mail.pot mode change 100644 => 100755 luci-app-mail/po/zh_Hans/mail.po mode change 100644 => 100755 luci-app-mail/po/zh_Hans/mail.po~ mode change 100644 => 100755 luci-app-mail/root/etc/config/mail mode change 100644 => 100755 luci-app-mail/root/usr/share/luci/menu.d/luci-app-mail.json mode change 100644 => 100755 luci-app-mail/root/usr/share/rpcd/acl.d/luci-app-mail.json mode change 100644 => 100755 luci-app-mlvpn/Makefile mode change 100644 => 100755 luci-app-mlvpn/htdocs/luci-static/resources/view/services/mlvpn.js mode change 100644 => 100755 luci-app-mlvpn/po/fr/mlvpn.po mode change 100644 => 100755 luci-app-mlvpn/po/fr/mlvpn.po~ mode change 100644 => 100755 luci-app-mlvpn/po/ru/mlvpn.po mode change 100644 => 100755 luci-app-mlvpn/po/templates/mlvpn.pot mode change 100644 => 100755 luci-app-mlvpn/po/zh_Hans/mlvpn.po mode change 100644 => 100755 luci-app-mlvpn/po/zh_Hans/mlvpn.po~ mode change 100644 => 100755 luci-app-mlvpn/root/usr/share/luci/menu.d/luci-app-mlvpn.json mode change 100644 => 100755 luci-app-mlvpn/root/usr/share/rpcd/acl.d/luci-app-mlvpn.json mode change 100644 => 100755 luci-app-mptcp/Makefile mode change 100644 => 100755 luci-app-mptcp/htdocs/luci-static/resources/seedrandom.js mode change 100644 => 100755 luci-app-mptcp/luasrc/controller/mptcp.lua mode change 100644 => 100755 luci-app-mptcp/luasrc/model/cbi/mptcp.lua mode change 100644 => 100755 luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm mode change 100644 => 100755 luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm mode change 100644 => 100755 luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm mode change 100644 => 100755 luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm mode change 100644 => 100755 luci-app-mptcp/luasrc/view/mptcp/multipath.htm mode change 100644 => 100755 luci-app-mptcp/po/de/mptcp.po mode change 100644 => 100755 luci-app-mptcp/po/de/mptcp.po~ mode change 100644 => 100755 luci-app-mptcp/po/fr/mptcp.po mode change 100644 => 100755 luci-app-mptcp/po/it/mptcp.po mode change 100644 => 100755 luci-app-mptcp/po/it/mptcp.po~ mode change 100644 => 100755 luci-app-mptcp/po/oc/mptcp.po mode change 100644 => 100755 luci-app-mptcp/po/oc/mptcp.po~ mode change 100644 => 100755 luci-app-mptcp/po/ru/mptcp.po mode change 100644 => 100755 luci-app-mptcp/po/templates/mptcp.pot mode change 100644 => 100755 luci-app-mptcp/po/zh_Hans/mptcp.po mode change 100644 => 100755 luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json mode change 100644 => 100755 luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json mode change 100644 => 100755 luci-app-nginx-ha/LICENSE mode change 100644 => 100755 luci-app-nginx-ha/Makefile mode change 100644 => 100755 luci-app-nginx-ha/luasrc/controller/nginx-ha.lua mode change 100644 => 100755 luci-app-nginx-ha/luasrc/model/cbi/nginx-ha.lua mode change 100644 => 100755 luci-app-nginx-ha/po/fr/nginx-ha.po mode change 100644 => 100755 luci-app-nginx-ha/po/templates/nginx-ha.pot mode change 100644 => 100755 luci-app-nginx-ha/root/etc/config/nginx-ha mode change 100644 => 100755 luci-app-nginx-ha/root/etc/uci-defaults/42_luci-nginx-ha mode change 100644 => 100755 luci-app-nginx-ha/root/usr/share/luci/menu.d/luci-app-nginx-ha.json mode change 100644 => 100755 luci-app-nginx-ha/root/usr/share/rpcd/acl.d/luci-app-nginx-ha.json mode change 100644 => 100755 luci-app-omr-bypass/Makefile mode change 100644 => 100755 luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js mode change 100644 => 100755 luci-app-omr-bypass/po/de/omr-bypass.po mode change 100644 => 100755 luci-app-omr-bypass/po/de/omr-bypass.po~ mode change 100644 => 100755 luci-app-omr-bypass/po/fr/omr-bypass.po mode change 100644 => 100755 luci-app-omr-bypass/po/it/omr-bypass.po mode change 100644 => 100755 luci-app-omr-bypass/po/it/omr-bypass.po~ mode change 100644 => 100755 luci-app-omr-bypass/po/oc/omr-bypass.po mode change 100644 => 100755 luci-app-omr-bypass/po/oc/omr-bypass.po~ mode change 100644 => 100755 luci-app-omr-bypass/po/ru/omr-bypass.po mode change 100644 => 100755 luci-app-omr-bypass/po/templates/omr-bypass.pot mode change 100644 => 100755 luci-app-omr-bypass/po/zh_Hans/omr-bypass.po mode change 100644 => 100755 luci-app-omr-bypass/root/etc/config/omr-bypass mode change 100644 => 100755 luci-app-omr-bypass/root/etc/firewall.omr-bypass mode change 100644 => 100755 luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json mode change 100644 => 100755 luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json mode change 100644 => 100755 luci-app-omr-dscp/Makefile mode change 100644 => 100755 luci-app-omr-dscp/luasrc/controller/omr-dscp.lua mode change 100644 => 100755 luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua mode change 100644 => 100755 luci-app-omr-dscp/luasrc/model/cbi/dscp.lua mode change 100644 => 100755 luci-app-omr-dscp/po/de/omr-dscp.po mode change 100644 => 100755 luci-app-omr-dscp/po/de/omr-dscp.po~ mode change 100644 => 100755 luci-app-omr-dscp/po/fr/omr-dscp.po mode change 100644 => 100755 luci-app-omr-dscp/po/fr/omr-dscp.po~ mode change 100644 => 100755 luci-app-omr-dscp/po/it/omr-dscp.po mode change 100644 => 100755 luci-app-omr-dscp/po/it/omr-dscp.po~ mode change 100644 => 100755 luci-app-omr-dscp/po/oc/omr-dscp.po mode change 100644 => 100755 luci-app-omr-dscp/po/oc/omr-dscp.po~ mode change 100644 => 100755 luci-app-omr-dscp/po/templates/omr-dscp.pot mode change 100644 => 100755 luci-app-omr-dscp/po/zh_Hans/omr-dscp.po mode change 100644 => 100755 luci-app-omr-dscp/po/zh_Hans/omr-dscp.po~ mode change 100644 => 100755 luci-app-omr-dscp/root/etc/config/dscp mode change 100644 => 100755 luci-app-omr-dscp/root/usr/share/luci/menu.d/luci-app-omr-dscp.json mode change 100644 => 100755 luci-app-omr-dscp/root/usr/share/rpcd/acl.d/luci-app-omr-dscp.json mode change 100644 => 100755 luci-app-omr-quota/Makefile mode change 100644 => 100755 luci-app-omr-quota/luasrc/controller/quota.lua mode change 100644 => 100755 luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua mode change 100644 => 100755 luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm mode change 100644 => 100755 luci-app-omr-quota/po/de/omr-quota.po mode change 100644 => 100755 luci-app-omr-quota/po/de/omr-quota.po~ mode change 100644 => 100755 luci-app-omr-quota/po/fr/omr-quota.po mode change 100644 => 100755 luci-app-omr-quota/po/fr/omr-quota.po~ mode change 100644 => 100755 luci-app-omr-quota/po/it/omr-quota.po mode change 100644 => 100755 luci-app-omr-quota/po/it/omr-quota.po~ mode change 100644 => 100755 luci-app-omr-quota/po/oc/omr-quota.po mode change 100644 => 100755 luci-app-omr-quota/po/oc/omr-quota.po~ mode change 100644 => 100755 luci-app-omr-quota/po/ru/omr-quota.po mode change 100644 => 100755 luci-app-omr-quota/po/templates/omr-quota.pot mode change 100644 => 100755 luci-app-omr-quota/po/zh_Hans/omr-quota.po mode change 100644 => 100755 luci-app-omr-quota/po/zh_Hans/omr-quota.po~ mode change 100644 => 100755 luci-app-omr-quota/root/usr/share/luci/menu.d/luci-app-omr-quota.json mode change 100644 => 100755 luci-app-omr-quota/root/usr/share/rpcd/acl.d/luci-app-omr-quota.json mode change 100644 => 100755 luci-app-omr-tracker/Makefile mode change 100644 => 100755 luci-app-omr-tracker/luasrc/controller/omr-tracker.lua mode change 100644 => 100755 luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua mode change 100644 => 100755 luci-app-omr-tracker/luasrc/view/omr-tracker/cbi-select-add.htm mode change 100644 => 100755 luci-app-omr-tracker/po/de/omr-tracker.po mode change 100644 => 100755 luci-app-omr-tracker/po/de/omr-tracker.po~ mode change 100644 => 100755 luci-app-omr-tracker/po/fr/omr-tracker.po mode change 100644 => 100755 luci-app-omr-tracker/po/fr/omr-tracker.po~ mode change 100644 => 100755 luci-app-omr-tracker/po/it/omr-tracker.po mode change 100644 => 100755 luci-app-omr-tracker/po/it/omr-tracker.po~ mode change 100644 => 100755 luci-app-omr-tracker/po/oc/omr-tracker.po mode change 100644 => 100755 luci-app-omr-tracker/po/oc/omr-tracker.po~ mode change 100644 => 100755 luci-app-omr-tracker/po/templates/omr-tracker.pot mode change 100644 => 100755 luci-app-omr-tracker/po/zh_Hans/omr-tracker.po mode change 100644 => 100755 luci-app-omr-tracker/root/etc/uci-defaults/42_luci-omr-tracker mode change 100644 => 100755 luci-app-omr-tracker/root/usr/share/luci/menu.d/luci-app-omr-tracker.json mode change 100644 => 100755 luci-app-omr-tracker/root/usr/share/rpcd/acl.d/luci-app-omr-tracker.json mode change 100644 => 100755 luci-app-openmptcprouter/Makefile mode change 100644 => 100755 luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua mode change 100644 => 100755 luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm mode change 100644 => 100755 luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm mode change 100644 => 100755 luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm mode change 100644 => 100755 luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm mode change 100644 => 100755 luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm mode change 100644 => 100755 luci-app-openmptcprouter/po/de/openmptcprouter.po mode change 100644 => 100755 luci-app-openmptcprouter/po/de/openmptcprouter.po~ mode change 100644 => 100755 luci-app-openmptcprouter/po/fr/openmptcprouter.po mode change 100644 => 100755 luci-app-openmptcprouter/po/fr/openmptcprouter.po~ mode change 100644 => 100755 luci-app-openmptcprouter/po/it/openmptcprouter.po mode change 100644 => 100755 luci-app-openmptcprouter/po/it/openmptcprouter.po~ mode change 100644 => 100755 luci-app-openmptcprouter/po/oc/openmptcprouter.po mode change 100644 => 100755 luci-app-openmptcprouter/po/oc/openmptcprouter.po~ mode change 100644 => 100755 luci-app-openmptcprouter/po/templates/openmptcprouter.pot mode change 100644 => 100755 luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po mode change 100644 => 100755 luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po~ mode change 100644 => 100755 luci-app-openmptcprouter/root/etc/config/openmptcprouter mode change 100644 => 100755 luci-app-openmptcprouter/root/etc/hotplug.d/net/99-omr-rename mode change 100644 => 100755 luci-app-openmptcprouter/root/usr/share/luci/menu.d/luci-app-openmptcprouter.json mode change 100644 => 100755 luci-app-openmptcprouter/root/usr/share/rpcd/acl.d/luci-app-openmptcprouter.json mode change 100644 => 100755 luci-app-packet-capture/Makefile mode change 100644 => 100755 luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js mode change 100644 => 100755 luci-app-packet-capture/po/fr/packet-capture.po mode change 100644 => 100755 luci-app-packet-capture/po/templates/packet-capture.pot mode change 100644 => 100755 luci-app-packet-capture/po/zh_Hans/packet-capture.po mode change 100644 => 100755 luci-app-packet-capture/root/etc/config/packet_capture mode change 100644 => 100755 luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json mode change 100644 => 100755 luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json mode change 100644 => 100755 luci-app-shadowsocks-libev/Makefile mode change 100644 => 100755 luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js mode change 100644 => 100755 luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js mode change 100644 => 100755 luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js mode change 100644 => 100755 luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js mode change 100644 => 100755 luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua mode change 100644 => 100755 luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/de/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/el/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/en/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/es/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/fr/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/he/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/hi/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/hu/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/it/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/ja/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/ko/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/ms/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/nb_NO/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/pt/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/pt_BR/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/ro/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/ru/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/sk/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/sv/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot mode change 100644 => 100755 luci-app-shadowsocks-libev/po/tr/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/uk/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/vi/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/po/zh-tw/shadowsocks-libev.po mode change 100644 => 100755 luci-app-shadowsocks-libev/root/etc/uci-defaults/40_luci-shadowsocks-libev mode change 100644 => 100755 luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json mode change 100644 => 100755 luci-app-shadowsocks-libev/root/usr/share/rpcd/acl.d/luci-app-shadowsocks-libev.json mode change 100644 => 100755 luci-app-shutdown/Makefile mode change 100644 => 100755 luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js mode change 100644 => 100755 luci-app-shutdown/po/de/shutdown.po mode change 100644 => 100755 luci-app-shutdown/po/fr/shutdown.po mode change 100644 => 100755 luci-app-shutdown/po/it/shutdown.po mode change 100644 => 100755 luci-app-shutdown/po/oc/shutdown.po mode change 100644 => 100755 luci-app-shutdown/po/pl/shutdown.po mode change 100644 => 100755 luci-app-shutdown/po/ru/shutdown.po mode change 100644 => 100755 luci-app-shutdown/po/templates/shutdown.pot mode change 100644 => 100755 luci-app-shutdown/po/zh_Hans/shutdown.po mode change 100644 => 100755 luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json mode change 100644 => 100755 luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json mode change 100644 => 100755 luci-app-snmpd/Makefile mode change 100644 => 100755 luci-app-snmpd/luasrc/controller/snmpd.lua mode change 100644 => 100755 luci-app-snmpd/luasrc/model/cbi/snmpd.lua mode change 100644 => 100755 luci-app-snmpd/luasrc/view/snmpd.htm mode change 100644 => 100755 luci-app-snmpd/po/de/snmpd.po mode change 100644 => 100755 luci-app-snmpd/po/fr/snmpd.po mode change 100644 => 100755 luci-app-snmpd/po/it/snmpd.po mode change 100644 => 100755 luci-app-snmpd/po/oc/snmpd.po mode change 100644 => 100755 luci-app-snmpd/po/templates/snmpd.pot mode change 100644 => 100755 luci-app-snmpd/po/zh_Hans/snmpd.po mode change 100644 => 100755 luci-app-snmpd/root/etc/config/snmpd mode change 100644 => 100755 luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json mode change 100644 => 100755 luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json mode change 100644 => 100755 luci-app-status/Makefile mode change 100644 => 100755 luci-app-status/htdocs/luci-static/resources/status/css/wanstatus.css mode change 100644 => 100755 luci-app-status/htdocs/luci-static/resources/status/images/status-doing.png mode change 100644 => 100755 luci-app-status/htdocs/luci-static/resources/status/images/status-done.png mode change 100644 => 100755 luci-app-status/htdocs/luci-static/resources/status/images/status-error.png mode change 100644 => 100755 luci-app-status/htdocs/luci-static/resources/status/images/status-todo.png mode change 100644 => 100755 luci-app-status/htdocs/luci-static/resources/status/images/status-warn.png mode change 100644 => 100755 luci-app-status/htdocs/luci-static/resources/status/images/statusError.png mode change 100644 => 100755 luci-app-status/htdocs/luci-static/resources/status/images/statusOK.png mode change 100644 => 100755 luci-app-status/htdocs/luci-static/resources/status/images/statusWarning.png mode change 100644 => 100755 luci-app-status/luasrc/controller/status.lua mode change 100644 => 100755 luci-app-status/luasrc/view/status/server.htm mode change 100644 => 100755 luci-app-status/luasrc/view/status/wanstatus.htm mode change 100644 => 100755 luci-app-status/po/templates/status.pot mode change 100644 => 100755 luci-app-status/po/zh_Hans/status.po mode change 100644 => 100755 luci-app-status/root/usr/share/luci/menu.d/luci-app-status.json mode change 100644 => 100755 luci-app-status/root/usr/share/rpcd/acl.d/luci-app-status.json mode change 100644 => 100755 luci-app-sysupgrade/Makefile mode change 100644 => 100755 luci-app-sysupgrade/luasrc/view/sysupgrade.htm mode change 100644 => 100755 luci-app-sysupgrade/po/fr/sysupgrade.po mode change 100644 => 100755 luci-app-sysupgrade/po/fr/sysupgrade.po~ mode change 100644 => 100755 luci-app-sysupgrade/po/ru/sysupgrade.po mode change 100644 => 100755 luci-app-sysupgrade/po/templates/sysupgrade.pot mode change 100644 => 100755 luci-app-sysupgrade/po/zh_Hans/sysupgrade.po mode change 100644 => 100755 luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ mode change 100644 => 100755 luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json mode change 100644 => 100755 luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json mode change 100644 => 100755 luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js mode change 100644 => 100755 luci-base/po/oc/base.po mode change 100644 => 100755 luci-base/po/templates/base.pot mode change 100644 => 100755 luci-mod-dashboard/Makefile mode change 100644 => 100755 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css mode change 100644 => 100755 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg mode change 100644 => 100755 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg mode change 100644 => 100755 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg mode change 100644 => 100755 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg mode change 100644 => 100755 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg mode change 100644 => 100755 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js mode change 100644 => 100755 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js mode change 100644 => 100755 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js mode change 100644 => 100755 luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js mode change 100644 => 100755 luci-mod-dashboard/po/fr/dashboard.po mode change 100644 => 100755 luci-mod-dashboard/po/ru/dashboard.po mode change 100644 => 100755 luci-mod-dashboard/po/templates/dashboard.pot mode change 100644 => 100755 luci-mod-dashboard/po/zh_Hans/dashboard.po mode change 100644 => 100755 luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json mode change 100644 => 100755 luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json mode change 100644 => 100755 luci-mod-network/Makefile mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/tools/network.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/routes.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/switch.js mode change 100644 => 100755 luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js mode change 100644 => 100755 luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json mode change 100644 => 100755 luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json mode change 100644 => 100755 luci-proto-mbim/Makefile mode change 100644 => 100755 luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js mode change 100644 => 100755 luci-theme-argon/Makefile mode change 100644 => 100755 luci-theme-argon/README.md mode change 100644 => 100755 luci-theme-argon/README_ZH.md mode change 100644 => 100755 luci-theme-argon/Screenshots/screenshot_pc.jpg mode change 100644 => 100755 luci-theme-argon/Screenshots/screenshot_phone.jpg mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/background/README.md mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/css/cascade.css mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/css/dark.css mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/css/fonts.css mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/css/pure-min.css mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/favicon.ico mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/img/argon.svg mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/img/blank.png mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/js/polyfill.min.js mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/js/script.js mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/less/cascade.less mode change 100644 => 100755 luci-theme-argon/htdocs/luci-static/argon/less/dark.less mode change 100644 => 100755 luci-theme-argon/luasrc/view/themes/argon/footer_login.htm mode change 100644 => 100755 luci-theme-argon/luasrc/view/themes/argon/header.htm mode change 100644 => 100755 luci-theme-argon/luasrc/view/themes/argon/header_login.htm mode change 100644 => 100755 luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm mode change 100644 => 100755 luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm mode change 100644 => 100755 luci-theme-argon/luasrc/view/themes/argon/sysauth.htm mode change 100644 => 100755 luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon mode change 100644 => 100755 luci-theme-openmptcprouter/Makefile mode change 100644 => 100755 luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/html5.js mode change 100644 => 100755 luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/mobile.css mode change 100644 => 100755 luci-theme-openmptcprouter/htdocs/luci-static/resources/menu-openmptcprouter.js mode change 100644 => 100755 luci-theme-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/omr-logo.png mode change 100644 => 100755 luci-theme-openwrt-2020/Makefile mode change 100644 => 100755 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 mode change 100644 => 100755 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css mode change 100644 => 100755 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png mode change 100644 => 100755 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/omr-logo.png mode change 100644 => 100755 luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg mode change 100644 => 100755 luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js mode change 100644 => 100755 luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm mode change 100644 => 100755 luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm mode change 100644 => 100755 macvlan/Makefile mode change 100644 => 100755 macvlan/files/etc/config/macvlan mode change 100644 => 100755 macvlan/files/etc/uci-defaults/40_luci-app-macvlan mode change 100644 => 100755 mlvpn/Makefile mode change 100644 => 100755 mlvpn/files/etc/config/mlvpn mode change 100644 => 100755 mlvpn/files/etc/uci-defaults/4100-mlvpn mode change 100644 => 100755 mlvpn/patches/020-remove-cdefs.patch mode change 100644 => 100755 mptcp/Makefile mode change 100644 => 100755 mptcp/files/etc/hotplug.d/iface/30-mptcp mode change 100644 => 100755 mptcpd/Makefile mode change 100644 => 100755 mptcpd/patches/remove_log.patch mode change 100644 => 100755 msmtp/Makefile mode change 100644 => 100755 ndisc6/Makefile mode change 100644 => 100755 ndpi-netfilter2/Makefile mode change 100644 => 100755 net-tools/Makefile mode change 100644 => 100755 net-tools/patches/mptcp-support.patch mode change 100644 => 100755 nginx/Config.in mode change 100644 => 100755 nginx/Config_ssl.in mode change 100644 => 100755 nginx/Makefile mode change 100644 => 100755 nginx/files-luci-support/60_nginx-luci-support mode change 100644 => 100755 nginx/files-luci-support/70_nginx-luci-support-ssl mode change 100644 => 100755 nginx/files-luci-support/luci_nginx.conf mode change 100644 => 100755 nginx/files-luci-support/luci_nginx_ssl.conf mode change 100644 => 100755 nginx/files-luci-support/luci_uwsgi.conf mode change 100644 => 100755 nginx/files/nginx.init mode change 100644 => 100755 nginx/patches-lua-nginx/100-no_by_lua_block.patch mode change 100644 => 100755 nginx/patches/101-feature_test_fix.patch mode change 100644 => 100755 nginx/patches/102-sizeof_test_fix.patch mode change 100644 => 100755 nginx/patches/103-sys_nerr.patch mode change 100644 => 100755 nginx/patches/200-config.patch mode change 100644 => 100755 nginx/patches/201-ignore-invalid-options.patch mode change 100644 => 100755 nginx/patches/300-max-processes.patch mode change 100644 => 100755 omr-6in4/Makefile mode change 100644 => 100755 omr-quota/Makefile mode change 100644 => 100755 omr-quota/files/etc/config/omr-quota mode change 100644 => 100755 omr-tracker/Makefile mode change 100644 => 100755 omr-tracker/files/etc/config/omr-tracker mode change 100644 => 100755 omr-update/Makefile mode change 100644 => 100755 openmptcprouter-full/Makefile mode change 100644 => 100755 openmptcprouter-mini/Makefile mode change 100644 => 100755 openmptcprouter/Makefile mode change 100644 => 100755 openmptcprouter/files/etc/firewall.gre-tunnel mode change 100644 => 100755 openmptcprouter/files/etc/firewall.omr-server mode change 100644 => 100755 openmptcprouter/files/etc/firewall.ttl mode change 100644 => 100755 openmptcprouter/files/etc/hotplug.d/iface/00-nego mode change 100644 => 100755 openmptcprouter/files/etc/iproute2/rt_dsfield mode change 100644 => 100755 openmptcprouter/files/etc/sysctl.d/default.conf mode change 100644 => 100755 openmptcprouter/files/etc/wgetrc4 mode change 100644 => 100755 protobuf/Makefile mode change 100644 => 100755 r8168/Makefile mode change 100644 => 100755 r8168/patches/001-r8168-add-LED-configuration-from-OF.patch mode change 100644 => 100755 serdisplib/Makefile mode change 100644 => 100755 shadowsocks-libev/Makefile mode change 100644 => 100755 shadowsocks-libev/README.md mode change 100644 => 100755 shadowsocks-libev/files/firewall.ss-rules mode change 100644 => 100755 shadowsocks-libev/files/shadowsocks-libev.config mode change 100644 => 100755 shadowsocks-libev/files/shadowsocks-libev.init mode change 100644 => 100755 shadowsocks-libev/files/shadowsocks.conf mode change 100644 => 100755 shadowsocks-libev/patches/010-ECONNRESET.patch mode change 100644 => 100755 shadowsocks-v2ray-plugin/Makefile mode change 100644 => 100755 shortcut-fe/Makefile mode change 100644 => 100755 shortcut-fe/files/usr/bin/sfe_dump mode change 100644 => 100755 shortcut-fe/src/Kconfig mode change 100644 => 100755 shortcut-fe/src/Makefile mode change 100644 => 100755 shortcut-fe/src/sfe.h mode change 100644 => 100755 shortcut-fe/src/sfe_backport.h mode change 100644 => 100755 shortcut-fe/src/sfe_cm.c mode change 100644 => 100755 shortcut-fe/src/sfe_cm.h mode change 100644 => 100755 shortcut-fe/src/sfe_ipv4.c mode change 100644 => 100755 shortcut-fe/src/sfe_ipv6.c mode change 100644 => 100755 simple-obfs/LICENSE mode change 100644 => 100755 simple-obfs/Makefile mode change 100644 => 100755 speedtestc/Makefile mode change 100644 => 100755 tcptraceroute/Makefile mode change 100644 => 100755 tcptraceroute/patches/001-configure_cross_compile.patch mode change 100644 => 100755 tracebox/Makefile mode change 100644 => 100755 tracebox/files/usr/share/tracebox/omr-mptcp-trace.lua mode change 100644 => 100755 tracebox/patches/101-build-fixes.patch mode change 100644 => 100755 tracebox/patches/102-configure.patch mode change 100644 => 100755 tracebox/patches/103-configure.patch mode change 100644 => 100755 tracebox/patches/104-ns_name_compress.patch mode change 100644 => 100755 tracebox/patches/202-fix-lua-include-hpp.patch mode change 100644 => 100755 tracebox/patches/204-fix-lua-namespace-crafter.patch mode change 100644 => 100755 v2ray-core/Config.in mode change 100644 => 100755 v2ray-core/LICENSE mode change 100644 => 100755 v2ray-core/Makefile mode change 100644 => 100755 v2ray-core/files/etc/firewall.v2ray-rules mode change 100644 => 100755 v2ray-core/files/etc/uci-defaults/3010-omr-v2ray mode change 100644 => 100755 v2ray-ext/Makefile mode change 100644 => 100755 xtables-addons/Makefile mode change 100644 => 100755 xtables-addons/patches/001-fix-kernel-version-detection.patch mode change 100644 => 100755 xtables-addons/patches/100-add-rtsp-conntrack.patch mode change 100644 => 100755 xtables-addons/patches/200-add-lua-packetscript.patch mode change 100644 => 100755 xtables-addons/patches/201-fix-lua-packetscript.patch mode change 100644 => 100755 xtables-addons/patches/210-freebsd-build-fix.patch diff --git a/.circleci/config.yml b/.circleci/config.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml old mode 100644 new mode 100755 diff --git a/.github/workflows/workspace.code-workspace b/.github/workflows/workspace.code-workspace old mode 100644 new mode 100755 diff --git a/6in4/Makefile b/6in4/Makefile old mode 100644 new mode 100755 diff --git a/CLA-entity.md b/CLA-entity.md old mode 100644 new mode 100755 diff --git a/CLA-individual.md b/CLA-individual.md old mode 100644 new mode 100755 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md old mode 100644 new mode 100755 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/aquantia/Makefile b/aquantia/Makefile old mode 100644 new mode 100755 diff --git a/bcm27xx-eeprom/Makefile b/bcm27xx-eeprom/Makefile old mode 100644 new mode 100755 diff --git a/bcm27xx-eeprom/patches/0001-rpi-eeprom-update-OpenWrt-defaults.patch b/bcm27xx-eeprom/patches/0001-rpi-eeprom-update-OpenWrt-defaults.patch old mode 100644 new mode 100755 diff --git a/bcm27xx-eeprom/patches/0003-rpi-eeprom-update-change-default-include-path.patch b/bcm27xx-eeprom/patches/0003-rpi-eeprom-update-change-default-include-path.patch old mode 100644 new mode 100755 diff --git a/bcm27xx-eeprom/patches/0004-rpi-eeprom-update-remove-chmod.patch b/bcm27xx-eeprom/patches/0004-rpi-eeprom-update-remove-chmod.patch old mode 100644 new mode 100755 diff --git a/contributors/cr3ative.md b/contributors/cr3ative.md old mode 100644 new mode 100755 diff --git a/contributors/example.md b/contributors/example.md old mode 100644 new mode 100755 diff --git a/cryptodev-linux/Makefile b/cryptodev-linux/Makefile old mode 100644 new mode 100755 diff --git a/dsvpn/Makefile b/dsvpn/Makefile old mode 100644 new mode 100755 diff --git a/dsvpn/patches/nofirewall.patch b/dsvpn/patches/nofirewall.patch old mode 100644 new mode 100755 diff --git a/dsvpn/patches/nostrip.patch b/dsvpn/patches/nostrip.patch old mode 100644 new mode 100755 diff --git a/fast-classifier/Makefile b/fast-classifier/Makefile old mode 100644 new mode 100755 diff --git a/fast-classifier/src/Makefile b/fast-classifier/src/Makefile old mode 100644 new mode 100755 diff --git a/fast-classifier/src/fast-classifier.c b/fast-classifier/src/fast-classifier.c old mode 100644 new mode 100755 diff --git a/fast-classifier/src/fast-classifier.h b/fast-classifier/src/fast-classifier.h old mode 100644 new mode 100755 diff --git a/fast-classifier/src/nl_classifier_test.c b/fast-classifier/src/nl_classifier_test.c old mode 100644 new mode 100755 diff --git a/fast-classifier/src/sfe.h b/fast-classifier/src/sfe.h old mode 100644 new mode 100755 diff --git a/fast-classifier/src/sfe_backport.h b/fast-classifier/src/sfe_backport.h old mode 100644 new mode 100755 diff --git a/fast-classifier/src/sfe_cm.h b/fast-classifier/src/sfe_cm.h old mode 100644 new mode 100755 diff --git a/fast-classifier/src/userspace_example.c b/fast-classifier/src/userspace_example.c old mode 100644 new mode 100755 diff --git a/glorytun-udp/Makefile b/glorytun-udp/Makefile old mode 100644 new mode 100755 diff --git a/glorytun-udp/patches/aegis-arm.patch b/glorytun-udp/patches/aegis-arm.patch old mode 100644 new mode 100755 diff --git a/glorytun/Makefile b/glorytun/Makefile old mode 100644 new mode 100755 diff --git a/glorytun/glorytun.config b/glorytun/glorytun.config old mode 100644 new mode 100755 diff --git a/golang-protobuf/Makefile b/golang-protobuf/Makefile old mode 100644 new mode 100755 diff --git a/golang/golang-build.sh b/golang/golang-build.sh old mode 100644 new mode 100755 diff --git a/golang/golang-compiler.mk b/golang/golang-compiler.mk old mode 100644 new mode 100755 diff --git a/golang/golang-golang-x-crypto/Makefile b/golang/golang-golang-x-crypto/Makefile old mode 100644 new mode 100755 diff --git a/golang/golang-golang-x-net/Makefile b/golang/golang-golang-x-net/Makefile old mode 100644 new mode 100755 diff --git a/golang/golang-golang-x-sys/Makefile b/golang/golang-golang-x-sys/Makefile old mode 100644 new mode 100755 diff --git a/golang/golang-golang-x-text/Makefile b/golang/golang-golang-x-text/Makefile old mode 100644 new mode 100755 diff --git a/golang/golang-host-build.mk b/golang/golang-host-build.mk old mode 100644 new mode 100755 diff --git a/golang/golang-package.mk b/golang/golang-package.mk old mode 100644 new mode 100755 diff --git a/golang/golang-values.mk b/golang/golang-values.mk old mode 100644 new mode 100755 diff --git a/golang/golang/Config.in b/golang/golang/Config.in old mode 100644 new mode 100755 diff --git a/golang/golang/Makefile b/golang/golang/Makefile old mode 100644 new mode 100755 diff --git a/golang/golang/files/go-gcc-helper b/golang/golang/files/go-gcc-helper old mode 100644 new mode 100755 diff --git a/https-dns-proxy/Makefile b/https-dns-proxy/Makefile old mode 100644 new mode 100755 diff --git a/https-dns-proxy/files/README.md b/https-dns-proxy/files/README.md old mode 100644 new mode 100755 diff --git a/https-dns-proxy/files/https-dns-proxy.config b/https-dns-proxy/files/https-dns-proxy.config old mode 100644 new mode 100755 diff --git a/https-dns-proxy/test.sh b/https-dns-proxy/test.sh old mode 100644 new mode 100755 diff --git a/ipcalc/Makefile b/ipcalc/Makefile old mode 100644 new mode 100755 diff --git a/iperf3/Makefile b/iperf3/Makefile old mode 100644 new mode 100755 diff --git a/iperf3/patches/remove-in6_flowlabel_req.patch b/iperf3/patches/remove-in6_flowlabel_req.patch old mode 100644 new mode 100755 diff --git a/lcd4linux/Config.in b/lcd4linux/Config.in old mode 100644 new mode 100755 diff --git a/lcd4linux/Makefile b/lcd4linux/Makefile old mode 100644 new mode 100755 diff --git a/lcd4linux/files/lcd4linux.init b/lcd4linux/files/lcd4linux.init old mode 100644 new mode 100755 diff --git a/lcd4linux/patches/120-remove-as-needed-linker-option.patch b/lcd4linux/patches/120-remove-as-needed-linker-option.patch old mode 100644 new mode 100755 diff --git a/lcd4linux/patches/140-no_repnop_T6963.patch b/lcd4linux/patches/140-no_repnop_T6963.patch old mode 100644 new mode 100755 diff --git a/lcd4linux/patches/150-addlibmpdclient.patch b/lcd4linux/patches/150-addlibmpdclient.patch old mode 100644 new mode 100755 diff --git a/lcd4linux/patches/160-uinput_defs.patch b/lcd4linux/patches/160-uinput_defs.patch old mode 100644 new mode 100755 diff --git a/lcd4linux/patches/170-add-generic-spidev-driver.patch b/lcd4linux/patches/170-add-generic-spidev-driver.patch old mode 100644 new mode 100755 diff --git a/lcd4linux/patches/173-glcd2usb-bigendian-fix.patch b/lcd4linux/patches/173-glcd2usb-bigendian-fix.patch old mode 100644 new mode 100755 diff --git a/libell/Makefile b/libell/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-dsvpn/Makefile b/luci-app-dsvpn/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-dsvpn/htdocs/luci-static/resources/view/services/dsvpn.js b/luci-app-dsvpn/htdocs/luci-static/resources/view/services/dsvpn.js old mode 100644 new mode 100755 diff --git a/luci-app-dsvpn/po/fr/dsvpn.po b/luci-app-dsvpn/po/fr/dsvpn.po old mode 100644 new mode 100755 diff --git a/luci-app-dsvpn/po/fr/dsvpn.po~ b/luci-app-dsvpn/po/fr/dsvpn.po~ old mode 100644 new mode 100755 diff --git a/luci-app-dsvpn/po/ru/dsvpn.po b/luci-app-dsvpn/po/ru/dsvpn.po old mode 100644 new mode 100755 diff --git a/luci-app-dsvpn/po/templates/dsvpn.pot b/luci-app-dsvpn/po/templates/dsvpn.pot old mode 100644 new mode 100755 diff --git a/luci-app-dsvpn/po/zh_Hans/dsvpn.po b/luci-app-dsvpn/po/zh_Hans/dsvpn.po old mode 100644 new mode 100755 diff --git a/luci-app-dsvpn/po/zh_Hans/dsvpn.po~ b/luci-app-dsvpn/po/zh_Hans/dsvpn.po~ old mode 100644 new mode 100755 diff --git a/luci-app-dsvpn/root/usr/share/luci/menu.d/luci-app-dsvpn.json b/luci-app-dsvpn/root/usr/share/luci/menu.d/luci-app-dsvpn.json old mode 100644 new mode 100755 diff --git a/luci-app-dsvpn/root/usr/share/rpcd/acl.d/luci-app-dsvpn.json b/luci-app-dsvpn/root/usr/share/rpcd/acl.d/luci-app-dsvpn.json old mode 100644 new mode 100755 diff --git a/luci-app-firewall/Makefile b/luci-app-firewall/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js b/luci-app-firewall/htdocs/luci-static/resources/tools/firewall.js old mode 100644 new mode 100755 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/custom.js old mode 100644 new mode 100755 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/forwards.js old mode 100644 new mode 100755 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/rules.js old mode 100644 new mode 100755 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/snats.js old mode 100644 new mode 100755 diff --git a/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js b/luci-app-firewall/htdocs/luci-static/resources/view/firewall/zones.js old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/bg/firewall.po b/luci-app-firewall/po/bg/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/ca/firewall.po b/luci-app-firewall/po/ca/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/cs/firewall.po b/luci-app-firewall/po/cs/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/de/firewall.po b/luci-app-firewall/po/de/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/el/firewall.po b/luci-app-firewall/po/el/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/en/firewall.po b/luci-app-firewall/po/en/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/es/firewall.po b/luci-app-firewall/po/es/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/fr/firewall.po b/luci-app-firewall/po/fr/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/he/firewall.po b/luci-app-firewall/po/he/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/hi/firewall.po b/luci-app-firewall/po/hi/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/hu/firewall.po b/luci-app-firewall/po/hu/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/it/firewall.po b/luci-app-firewall/po/it/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/ja/firewall.po b/luci-app-firewall/po/ja/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/ko/firewall.po b/luci-app-firewall/po/ko/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/mr/firewall.po b/luci-app-firewall/po/mr/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/ms/firewall.po b/luci-app-firewall/po/ms/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/nb_NO/firewall.po b/luci-app-firewall/po/nb_NO/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/pl/firewall.po b/luci-app-firewall/po/pl/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/pt/firewall.po b/luci-app-firewall/po/pt/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/pt_BR/firewall.po b/luci-app-firewall/po/pt_BR/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/ro/firewall.po b/luci-app-firewall/po/ro/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/ru/firewall.po b/luci-app-firewall/po/ru/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/sk/firewall.po b/luci-app-firewall/po/sk/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/sv/firewall.po b/luci-app-firewall/po/sv/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/templates/firewall.pot b/luci-app-firewall/po/templates/firewall.pot old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/tr/firewall.po b/luci-app-firewall/po/tr/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/uk/firewall.po b/luci-app-firewall/po/uk/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/vi/firewall.po b/luci-app-firewall/po/vi/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/zh_Hans/firewall.po b/luci-app-firewall/po/zh_Hans/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/po/zh_Hant/firewall.po b/luci-app-firewall/po/zh_Hant/firewall.po old mode 100644 new mode 100755 diff --git a/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json b/luci-app-firewall/root/usr/share/luci/menu.d/luci-app-firewall.json old mode 100644 new mode 100755 diff --git a/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json b/luci-app-firewall/root/usr/share/rpcd/acl.d/luci-app-firewall.json old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/Makefile b/luci-app-glorytun-tcp/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/htdocs/luci-static/resources/view/services/glorytun-tcp.js b/luci-app-glorytun-tcp/htdocs/luci-static/resources/view/services/glorytun-tcp.js old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/po/fr/glorytun-tcp.po b/luci-app-glorytun-tcp/po/fr/glorytun-tcp.po old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/po/fr/glorytun-tcp.po~ b/luci-app-glorytun-tcp/po/fr/glorytun-tcp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/po/ru/glorytun-tcp.po b/luci-app-glorytun-tcp/po/ru/glorytun-tcp.po old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/po/templates/glorytun-tcp.pot b/luci-app-glorytun-tcp/po/templates/glorytun-tcp.pot old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po b/luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po~ b/luci-app-glorytun-tcp/po/zh_Hans/glorytun-tcp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/root/etc/hotplug.d/iface/30-glorytun b/luci-app-glorytun-tcp/root/etc/hotplug.d/iface/30-glorytun old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/root/etc/uci-defaults/1200-luci-glorytun b/luci-app-glorytun-tcp/root/etc/uci-defaults/1200-luci-glorytun old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/root/usr/share/luci/menu.d/luci-app-glorytun-tcp.json b/luci-app-glorytun-tcp/root/usr/share/luci/menu.d/luci-app-glorytun-tcp.json old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-tcp/root/usr/share/rpcd/acl.d/luci-app-glorytun-tcp.json b/luci-app-glorytun-tcp/root/usr/share/rpcd/acl.d/luci-app-glorytun-tcp.json old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/Makefile b/luci-app-glorytun-udp/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/htdocs/luci-static/resources/view/services/glorytun-udp.js b/luci-app-glorytun-udp/htdocs/luci-static/resources/view/services/glorytun-udp.js old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/po/fr/glorytun-udp.po b/luci-app-glorytun-udp/po/fr/glorytun-udp.po old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/po/fr/glorytun-udp.po~ b/luci-app-glorytun-udp/po/fr/glorytun-udp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/po/ru/glorytun-udp.po b/luci-app-glorytun-udp/po/ru/glorytun-udp.po old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/po/templates/glorytun-udp.pot b/luci-app-glorytun-udp/po/templates/glorytun-udp.pot old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po b/luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po~ b/luci-app-glorytun-udp/po/zh_Hans/glorytun-udp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/root/etc/config/glorytun-udp b/luci-app-glorytun-udp/root/etc/config/glorytun-udp old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/root/etc/hotplug.d/iface/30-glorytun-udp b/luci-app-glorytun-udp/root/etc/hotplug.d/iface/30-glorytun-udp old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/root/etc/uci-defaults/1201-luci-glorytun-udp b/luci-app-glorytun-udp/root/etc/uci-defaults/1201-luci-glorytun-udp old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/root/usr/share/luci/menu.d/luci-app-glorytun-udp.json b/luci-app-glorytun-udp/root/usr/share/luci/menu.d/luci-app-glorytun-udp.json old mode 100644 new mode 100755 diff --git a/luci-app-glorytun-udp/root/usr/share/rpcd/acl.d/luci-app-glorytun-udp.json b/luci-app-glorytun-udp/root/usr/share/rpcd/acl.d/luci-app-glorytun-udp.json old mode 100644 new mode 100755 diff --git a/luci-app-haproxy-tcp/LICENSE b/luci-app-haproxy-tcp/LICENSE old mode 100644 new mode 100755 diff --git a/luci-app-haproxy-tcp/Makefile b/luci-app-haproxy-tcp/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-haproxy-tcp/README.md b/luci-app-haproxy-tcp/README.md old mode 100644 new mode 100755 diff --git a/luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua b/luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua old mode 100644 new mode 100755 diff --git a/luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua b/luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua old mode 100644 new mode 100755 diff --git a/luci-app-haproxy-tcp/po/fr/haproxy-tcp.po b/luci-app-haproxy-tcp/po/fr/haproxy-tcp.po old mode 100644 new mode 100755 diff --git a/luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot b/luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot old mode 100644 new mode 100755 diff --git a/luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po b/luci-app-haproxy-tcp/po/zh-cn/haproxy-tcp.po old mode 100644 new mode 100755 diff --git a/luci-app-haproxy-tcp/root/etc/config/haproxy-tcp b/luci-app-haproxy-tcp/root/etc/config/haproxy-tcp old mode 100644 new mode 100755 diff --git a/luci-app-haproxy-tcp/root/etc/uci-defaults/41_luci-haproxy-tcp b/luci-app-haproxy-tcp/root/etc/uci-defaults/41_luci-haproxy-tcp old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/Makefile b/luci-app-https-dns-proxy/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/controller/https-dns-proxy.lua b/luci-app-https-dns-proxy/luasrc/controller/https-dns-proxy.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ch.digitale-gesellschaft.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/ch.digitale-gesellschaft.dns.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/cn.rubyfish.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/cn.rubyfish.dns.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/sb.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers.disabled/sb.dns.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns-family.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns-family.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.adguard.dns.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-family.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-family.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-malware.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns-malware.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/com.cloudflare-dns.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cz.nic.odvr.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/cz.nic.odvr.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/google.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/google.dns.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh-ads.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh-ads.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/gr.libredns.doh.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns10.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns11.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/net.quad9.dns9.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-adult.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-adult.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-family.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-family.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-security.lua b/luci-app-https-dns-proxy/luasrc/https-dns-proxy/providers/org.cleanbrowsing.doh-security.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua b/luci-app-https-dns-proxy/luasrc/model/cbi/https-dns-proxy.lua old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/buttons.htm old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/css.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/css.htm old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/js.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/js.htm old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status-textarea.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status-textarea.htm old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status.htm b/luci-app-https-dns-proxy/luasrc/view/https-dns-proxy/status.htm old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/bg/https-dns-proxy.po b/luci-app-https-dns-proxy/po/bg/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/ca/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ca/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/cs/https-dns-proxy.po b/luci-app-https-dns-proxy/po/cs/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/de/https-dns-proxy.po b/luci-app-https-dns-proxy/po/de/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/el/https-dns-proxy.po b/luci-app-https-dns-proxy/po/el/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/en/https-dns-proxy.po b/luci-app-https-dns-proxy/po/en/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/es/https-dns-proxy.po b/luci-app-https-dns-proxy/po/es/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/fr/https-dns-proxy.po b/luci-app-https-dns-proxy/po/fr/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/he/https-dns-proxy.po b/luci-app-https-dns-proxy/po/he/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/hi/https-dns-proxy.po b/luci-app-https-dns-proxy/po/hi/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/hu/https-dns-proxy.po b/luci-app-https-dns-proxy/po/hu/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/it/https-dns-proxy.po b/luci-app-https-dns-proxy/po/it/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/ja/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ja/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/ko/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ko/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/mr/https-dns-proxy.po b/luci-app-https-dns-proxy/po/mr/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/ms/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ms/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/nb_NO/https-dns-proxy.po b/luci-app-https-dns-proxy/po/nb_NO/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/pl/https-dns-proxy.po b/luci-app-https-dns-proxy/po/pl/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/pt/https-dns-proxy.po b/luci-app-https-dns-proxy/po/pt/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/pt_BR/https-dns-proxy.po b/luci-app-https-dns-proxy/po/pt_BR/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/ro/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ro/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/ru/https-dns-proxy.po b/luci-app-https-dns-proxy/po/ru/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/sk/https-dns-proxy.po b/luci-app-https-dns-proxy/po/sk/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/sv/https-dns-proxy.po b/luci-app-https-dns-proxy/po/sv/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/templates/https-dns-proxy.pot b/luci-app-https-dns-proxy/po/templates/https-dns-proxy.pot old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/tr/https-dns-proxy.po b/luci-app-https-dns-proxy/po/tr/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/uk/https-dns-proxy.po b/luci-app-https-dns-proxy/po/uk/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/vi/https-dns-proxy.po b/luci-app-https-dns-proxy/po/vi/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/zh_Hans/https-dns-proxy.po b/luci-app-https-dns-proxy/po/zh_Hans/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/po/zh_Hant/https-dns-proxy.po b/luci-app-https-dns-proxy/po/zh_Hant/https-dns-proxy.po old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/root/etc/uci-defaults/40_luci-https-dns-proxy b/luci-app-https-dns-proxy/root/etc/uci-defaults/40_luci-https-dns-proxy old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/root/usr/share/luci/menu.d/luci-app-https-dns-proxy.json b/luci-app-https-dns-proxy/root/usr/share/luci/menu.d/luci-app-https-dns-proxy.json old mode 100644 new mode 100755 diff --git a/luci-app-https-dns-proxy/root/usr/share/rpcd/acl.d/luci-app-https-dns-proxy.json b/luci-app-https-dns-proxy/root/usr/share/rpcd/acl.d/luci-app-https-dns-proxy.json old mode 100644 new mode 100755 diff --git a/luci-app-iperf/Makefile b/luci-app-iperf/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-iperf/luasrc/controller/iperf.lua b/luci-app-iperf/luasrc/controller/iperf.lua old mode 100644 new mode 100755 diff --git a/luci-app-iperf/luasrc/view/iperf/test.htm b/luci-app-iperf/luasrc/view/iperf/test.htm old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/de/iperf.po b/luci-app-iperf/po/de/iperf.po old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/de/iperf.po~ b/luci-app-iperf/po/de/iperf.po~ old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/fr/iperf.po b/luci-app-iperf/po/fr/iperf.po old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/fr/iperf.po~ b/luci-app-iperf/po/fr/iperf.po~ old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/it/iperf.po b/luci-app-iperf/po/it/iperf.po old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/it/iperf.po~ b/luci-app-iperf/po/it/iperf.po~ old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/oc/iperf.po b/luci-app-iperf/po/oc/iperf.po old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/oc/iperf.po~ b/luci-app-iperf/po/oc/iperf.po~ old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/ru/iperf.po b/luci-app-iperf/po/ru/iperf.po old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/templates/iperf.pot b/luci-app-iperf/po/templates/iperf.pot old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/zh_Hans/iperf.po b/luci-app-iperf/po/zh_Hans/iperf.po old mode 100644 new mode 100755 diff --git a/luci-app-iperf/po/zh_Hans/iperf.po~ b/luci-app-iperf/po/zh_Hans/iperf.po~ old mode 100644 new mode 100755 diff --git a/luci-app-iperf/root/etc/config/iperf b/luci-app-iperf/root/etc/config/iperf old mode 100644 new mode 100755 diff --git a/luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json b/luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json old mode 100644 new mode 100755 diff --git a/luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json b/luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json old mode 100644 new mode 100755 diff --git a/luci-app-macvlan/po/zh_Hans/macvlan.po b/luci-app-macvlan/po/zh_Hans/macvlan.po old mode 100644 new mode 100755 diff --git a/luci-app-mail/Makefile b/luci-app-mail/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-mail/luasrc/controller/mail.lua b/luci-app-mail/luasrc/controller/mail.lua old mode 100644 new mode 100755 diff --git a/luci-app-mail/luasrc/model/cbi/mail.lua b/luci-app-mail/luasrc/model/cbi/mail.lua old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/de/mail.po b/luci-app-mail/po/de/mail.po old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/de/mail.po~ b/luci-app-mail/po/de/mail.po~ old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/fr/mail.po b/luci-app-mail/po/fr/mail.po old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/fr/mail.po~ b/luci-app-mail/po/fr/mail.po~ old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/it/mail.po b/luci-app-mail/po/it/mail.po old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/it/mail.po~ b/luci-app-mail/po/it/mail.po~ old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/oc/mail.po b/luci-app-mail/po/oc/mail.po old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/oc/mail.po~ b/luci-app-mail/po/oc/mail.po~ old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/ru/mail.po b/luci-app-mail/po/ru/mail.po old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/templates/mail.pot b/luci-app-mail/po/templates/mail.pot old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/zh_Hans/mail.po b/luci-app-mail/po/zh_Hans/mail.po old mode 100644 new mode 100755 diff --git a/luci-app-mail/po/zh_Hans/mail.po~ b/luci-app-mail/po/zh_Hans/mail.po~ old mode 100644 new mode 100755 diff --git a/luci-app-mail/root/etc/config/mail b/luci-app-mail/root/etc/config/mail old mode 100644 new mode 100755 diff --git a/luci-app-mail/root/usr/share/luci/menu.d/luci-app-mail.json b/luci-app-mail/root/usr/share/luci/menu.d/luci-app-mail.json old mode 100644 new mode 100755 diff --git a/luci-app-mail/root/usr/share/rpcd/acl.d/luci-app-mail.json b/luci-app-mail/root/usr/share/rpcd/acl.d/luci-app-mail.json old mode 100644 new mode 100755 diff --git a/luci-app-mlvpn/Makefile b/luci-app-mlvpn/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-mlvpn/htdocs/luci-static/resources/view/services/mlvpn.js b/luci-app-mlvpn/htdocs/luci-static/resources/view/services/mlvpn.js old mode 100644 new mode 100755 diff --git a/luci-app-mlvpn/po/fr/mlvpn.po b/luci-app-mlvpn/po/fr/mlvpn.po old mode 100644 new mode 100755 diff --git a/luci-app-mlvpn/po/fr/mlvpn.po~ b/luci-app-mlvpn/po/fr/mlvpn.po~ old mode 100644 new mode 100755 diff --git a/luci-app-mlvpn/po/ru/mlvpn.po b/luci-app-mlvpn/po/ru/mlvpn.po old mode 100644 new mode 100755 diff --git a/luci-app-mlvpn/po/templates/mlvpn.pot b/luci-app-mlvpn/po/templates/mlvpn.pot old mode 100644 new mode 100755 diff --git a/luci-app-mlvpn/po/zh_Hans/mlvpn.po b/luci-app-mlvpn/po/zh_Hans/mlvpn.po old mode 100644 new mode 100755 diff --git a/luci-app-mlvpn/po/zh_Hans/mlvpn.po~ b/luci-app-mlvpn/po/zh_Hans/mlvpn.po~ old mode 100644 new mode 100755 diff --git a/luci-app-mlvpn/root/usr/share/luci/menu.d/luci-app-mlvpn.json b/luci-app-mlvpn/root/usr/share/luci/menu.d/luci-app-mlvpn.json old mode 100644 new mode 100755 diff --git a/luci-app-mlvpn/root/usr/share/rpcd/acl.d/luci-app-mlvpn.json b/luci-app-mlvpn/root/usr/share/rpcd/acl.d/luci-app-mlvpn.json old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/Makefile b/luci-app-mptcp/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/htdocs/luci-static/resources/seedrandom.js b/luci-app-mptcp/htdocs/luci-static/resources/seedrandom.js old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/luasrc/controller/mptcp.lua b/luci-app-mptcp/luasrc/controller/mptcp.lua old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/luasrc/model/cbi/mptcp.lua b/luci-app-mptcp/luasrc/model/cbi/mptcp.lua old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm b/luci-app-mptcp/luasrc/view/mptcp/mptcp_monitor.htm old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/luasrc/view/mptcp/multipath.htm b/luci-app-mptcp/luasrc/view/mptcp/multipath.htm old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/po/de/mptcp.po b/luci-app-mptcp/po/de/mptcp.po old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/po/de/mptcp.po~ b/luci-app-mptcp/po/de/mptcp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/po/fr/mptcp.po b/luci-app-mptcp/po/fr/mptcp.po old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/po/it/mptcp.po b/luci-app-mptcp/po/it/mptcp.po old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/po/it/mptcp.po~ b/luci-app-mptcp/po/it/mptcp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/po/oc/mptcp.po b/luci-app-mptcp/po/oc/mptcp.po old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/po/oc/mptcp.po~ b/luci-app-mptcp/po/oc/mptcp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/po/ru/mptcp.po b/luci-app-mptcp/po/ru/mptcp.po old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/po/templates/mptcp.pot b/luci-app-mptcp/po/templates/mptcp.pot old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/po/zh_Hans/mptcp.po b/luci-app-mptcp/po/zh_Hans/mptcp.po old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json b/luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json old mode 100644 new mode 100755 diff --git a/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json b/luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json old mode 100644 new mode 100755 diff --git a/luci-app-nginx-ha/LICENSE b/luci-app-nginx-ha/LICENSE old mode 100644 new mode 100755 diff --git a/luci-app-nginx-ha/Makefile b/luci-app-nginx-ha/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-nginx-ha/luasrc/controller/nginx-ha.lua b/luci-app-nginx-ha/luasrc/controller/nginx-ha.lua old mode 100644 new mode 100755 diff --git a/luci-app-nginx-ha/luasrc/model/cbi/nginx-ha.lua b/luci-app-nginx-ha/luasrc/model/cbi/nginx-ha.lua old mode 100644 new mode 100755 diff --git a/luci-app-nginx-ha/po/fr/nginx-ha.po b/luci-app-nginx-ha/po/fr/nginx-ha.po old mode 100644 new mode 100755 diff --git a/luci-app-nginx-ha/po/templates/nginx-ha.pot b/luci-app-nginx-ha/po/templates/nginx-ha.pot old mode 100644 new mode 100755 diff --git a/luci-app-nginx-ha/root/etc/config/nginx-ha b/luci-app-nginx-ha/root/etc/config/nginx-ha old mode 100644 new mode 100755 diff --git a/luci-app-nginx-ha/root/etc/uci-defaults/42_luci-nginx-ha b/luci-app-nginx-ha/root/etc/uci-defaults/42_luci-nginx-ha old mode 100644 new mode 100755 diff --git a/luci-app-nginx-ha/root/usr/share/luci/menu.d/luci-app-nginx-ha.json b/luci-app-nginx-ha/root/usr/share/luci/menu.d/luci-app-nginx-ha.json old mode 100644 new mode 100755 diff --git a/luci-app-nginx-ha/root/usr/share/rpcd/acl.d/luci-app-nginx-ha.json b/luci-app-nginx-ha/root/usr/share/rpcd/acl.d/luci-app-nginx-ha.json old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/Makefile b/luci-app-omr-bypass/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js b/luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/po/de/omr-bypass.po b/luci-app-omr-bypass/po/de/omr-bypass.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/po/de/omr-bypass.po~ b/luci-app-omr-bypass/po/de/omr-bypass.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/po/fr/omr-bypass.po b/luci-app-omr-bypass/po/fr/omr-bypass.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/po/it/omr-bypass.po b/luci-app-omr-bypass/po/it/omr-bypass.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/po/it/omr-bypass.po~ b/luci-app-omr-bypass/po/it/omr-bypass.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/po/oc/omr-bypass.po b/luci-app-omr-bypass/po/oc/omr-bypass.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/po/oc/omr-bypass.po~ b/luci-app-omr-bypass/po/oc/omr-bypass.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/po/ru/omr-bypass.po b/luci-app-omr-bypass/po/ru/omr-bypass.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/po/templates/omr-bypass.pot b/luci-app-omr-bypass/po/templates/omr-bypass.pot old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/po/zh_Hans/omr-bypass.po b/luci-app-omr-bypass/po/zh_Hans/omr-bypass.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/root/etc/config/omr-bypass b/luci-app-omr-bypass/root/etc/config/omr-bypass old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/root/etc/firewall.omr-bypass b/luci-app-omr-bypass/root/etc/firewall.omr-bypass old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json b/luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json old mode 100644 new mode 100755 diff --git a/luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json b/luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/Makefile b/luci-app-omr-dscp/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/luasrc/controller/omr-dscp.lua b/luci-app-omr-dscp/luasrc/controller/omr-dscp.lua old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua b/luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/luasrc/model/cbi/dscp.lua b/luci-app-omr-dscp/luasrc/model/cbi/dscp.lua old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/de/omr-dscp.po b/luci-app-omr-dscp/po/de/omr-dscp.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/de/omr-dscp.po~ b/luci-app-omr-dscp/po/de/omr-dscp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/fr/omr-dscp.po b/luci-app-omr-dscp/po/fr/omr-dscp.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/fr/omr-dscp.po~ b/luci-app-omr-dscp/po/fr/omr-dscp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/it/omr-dscp.po b/luci-app-omr-dscp/po/it/omr-dscp.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/it/omr-dscp.po~ b/luci-app-omr-dscp/po/it/omr-dscp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/oc/omr-dscp.po b/luci-app-omr-dscp/po/oc/omr-dscp.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/oc/omr-dscp.po~ b/luci-app-omr-dscp/po/oc/omr-dscp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/templates/omr-dscp.pot b/luci-app-omr-dscp/po/templates/omr-dscp.pot old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/zh_Hans/omr-dscp.po b/luci-app-omr-dscp/po/zh_Hans/omr-dscp.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/po/zh_Hans/omr-dscp.po~ b/luci-app-omr-dscp/po/zh_Hans/omr-dscp.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/root/etc/config/dscp b/luci-app-omr-dscp/root/etc/config/dscp old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/root/usr/share/luci/menu.d/luci-app-omr-dscp.json b/luci-app-omr-dscp/root/usr/share/luci/menu.d/luci-app-omr-dscp.json old mode 100644 new mode 100755 diff --git a/luci-app-omr-dscp/root/usr/share/rpcd/acl.d/luci-app-omr-dscp.json b/luci-app-omr-dscp/root/usr/share/rpcd/acl.d/luci-app-omr-dscp.json old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/Makefile b/luci-app-omr-quota/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/luasrc/controller/quota.lua b/luci-app-omr-quota/luasrc/controller/quota.lua old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua b/luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm b/luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/de/omr-quota.po b/luci-app-omr-quota/po/de/omr-quota.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/de/omr-quota.po~ b/luci-app-omr-quota/po/de/omr-quota.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/fr/omr-quota.po b/luci-app-omr-quota/po/fr/omr-quota.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/fr/omr-quota.po~ b/luci-app-omr-quota/po/fr/omr-quota.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/it/omr-quota.po b/luci-app-omr-quota/po/it/omr-quota.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/it/omr-quota.po~ b/luci-app-omr-quota/po/it/omr-quota.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/oc/omr-quota.po b/luci-app-omr-quota/po/oc/omr-quota.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/oc/omr-quota.po~ b/luci-app-omr-quota/po/oc/omr-quota.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/ru/omr-quota.po b/luci-app-omr-quota/po/ru/omr-quota.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/templates/omr-quota.pot b/luci-app-omr-quota/po/templates/omr-quota.pot old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/zh_Hans/omr-quota.po b/luci-app-omr-quota/po/zh_Hans/omr-quota.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/po/zh_Hans/omr-quota.po~ b/luci-app-omr-quota/po/zh_Hans/omr-quota.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/root/usr/share/luci/menu.d/luci-app-omr-quota.json b/luci-app-omr-quota/root/usr/share/luci/menu.d/luci-app-omr-quota.json old mode 100644 new mode 100755 diff --git a/luci-app-omr-quota/root/usr/share/rpcd/acl.d/luci-app-omr-quota.json b/luci-app-omr-quota/root/usr/share/rpcd/acl.d/luci-app-omr-quota.json old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/Makefile b/luci-app-omr-tracker/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/luasrc/controller/omr-tracker.lua b/luci-app-omr-tracker/luasrc/controller/omr-tracker.lua old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua b/luci-app-omr-tracker/luasrc/model/cbi/omr-tracker.lua old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/luasrc/view/omr-tracker/cbi-select-add.htm b/luci-app-omr-tracker/luasrc/view/omr-tracker/cbi-select-add.htm old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/po/de/omr-tracker.po b/luci-app-omr-tracker/po/de/omr-tracker.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/po/de/omr-tracker.po~ b/luci-app-omr-tracker/po/de/omr-tracker.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/po/fr/omr-tracker.po b/luci-app-omr-tracker/po/fr/omr-tracker.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/po/fr/omr-tracker.po~ b/luci-app-omr-tracker/po/fr/omr-tracker.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/po/it/omr-tracker.po b/luci-app-omr-tracker/po/it/omr-tracker.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/po/it/omr-tracker.po~ b/luci-app-omr-tracker/po/it/omr-tracker.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/po/oc/omr-tracker.po b/luci-app-omr-tracker/po/oc/omr-tracker.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/po/oc/omr-tracker.po~ b/luci-app-omr-tracker/po/oc/omr-tracker.po~ old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/po/templates/omr-tracker.pot b/luci-app-omr-tracker/po/templates/omr-tracker.pot old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/po/zh_Hans/omr-tracker.po b/luci-app-omr-tracker/po/zh_Hans/omr-tracker.po old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/root/etc/uci-defaults/42_luci-omr-tracker b/luci-app-omr-tracker/root/etc/uci-defaults/42_luci-omr-tracker old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/root/usr/share/luci/menu.d/luci-app-omr-tracker.json b/luci-app-omr-tracker/root/usr/share/luci/menu.d/luci-app-omr-tracker.json old mode 100644 new mode 100755 diff --git a/luci-app-omr-tracker/root/usr/share/rpcd/acl.d/luci-app-omr-tracker.json b/luci-app-omr-tracker/root/usr/share/rpcd/acl.d/luci-app-omr-tracker.json old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/Makefile b/luci-app-openmptcprouter/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua b/luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/de/openmptcprouter.po b/luci-app-openmptcprouter/po/de/openmptcprouter.po old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/de/openmptcprouter.po~ b/luci-app-openmptcprouter/po/de/openmptcprouter.po~ old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/fr/openmptcprouter.po b/luci-app-openmptcprouter/po/fr/openmptcprouter.po old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/fr/openmptcprouter.po~ b/luci-app-openmptcprouter/po/fr/openmptcprouter.po~ old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/it/openmptcprouter.po b/luci-app-openmptcprouter/po/it/openmptcprouter.po old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/it/openmptcprouter.po~ b/luci-app-openmptcprouter/po/it/openmptcprouter.po~ old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/oc/openmptcprouter.po b/luci-app-openmptcprouter/po/oc/openmptcprouter.po old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/oc/openmptcprouter.po~ b/luci-app-openmptcprouter/po/oc/openmptcprouter.po~ old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/templates/openmptcprouter.pot b/luci-app-openmptcprouter/po/templates/openmptcprouter.pot old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po b/luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po~ b/luci-app-openmptcprouter/po/zh_Hans/openmptcprouter.po~ old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/root/etc/config/openmptcprouter b/luci-app-openmptcprouter/root/etc/config/openmptcprouter old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/root/etc/hotplug.d/net/99-omr-rename b/luci-app-openmptcprouter/root/etc/hotplug.d/net/99-omr-rename old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/root/usr/share/luci/menu.d/luci-app-openmptcprouter.json b/luci-app-openmptcprouter/root/usr/share/luci/menu.d/luci-app-openmptcprouter.json old mode 100644 new mode 100755 diff --git a/luci-app-openmptcprouter/root/usr/share/rpcd/acl.d/luci-app-openmptcprouter.json b/luci-app-openmptcprouter/root/usr/share/rpcd/acl.d/luci-app-openmptcprouter.json old mode 100644 new mode 100755 diff --git a/luci-app-packet-capture/Makefile b/luci-app-packet-capture/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js b/luci-app-packet-capture/htdocs/luci-static/resources/view/packet_capture/tcpdump.js old mode 100644 new mode 100755 diff --git a/luci-app-packet-capture/po/fr/packet-capture.po b/luci-app-packet-capture/po/fr/packet-capture.po old mode 100644 new mode 100755 diff --git a/luci-app-packet-capture/po/templates/packet-capture.pot b/luci-app-packet-capture/po/templates/packet-capture.pot old mode 100644 new mode 100755 diff --git a/luci-app-packet-capture/po/zh_Hans/packet-capture.po b/luci-app-packet-capture/po/zh_Hans/packet-capture.po old mode 100644 new mode 100755 diff --git a/luci-app-packet-capture/root/etc/config/packet_capture b/luci-app-packet-capture/root/etc/config/packet_capture old mode 100644 new mode 100755 diff --git a/luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json b/luci-app-packet-capture/root/usr/share/luci/menu.d/luci-app-packet-capture.json old mode 100644 new mode 100755 diff --git a/luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json b/luci-app-packet-capture/root/usr/share/rpcd/acl.d/luci-app-packet-capture.json old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/Makefile b/luci-app-shadowsocks-libev/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js b/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua b/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/de/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/de/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/el/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/el/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/en/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/en/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/es/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/es/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/fr/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/fr/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/he/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/he/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/hi/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/hi/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/hu/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/hu/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/it/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/it/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/ja/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ja/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/ko/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ko/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/ms/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ms/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/nb_NO/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/nb_NO/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/pl/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/pt/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/pt/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/pt_BR/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/pt_BR/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/ro/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ro/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/ru/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/ru/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/sk/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/sk/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/sv/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/sv/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot b/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/tr/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/tr/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/uk/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/uk/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/vi/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/vi/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/po/zh-tw/shadowsocks-libev.po b/luci-app-shadowsocks-libev/po/zh-tw/shadowsocks-libev.po old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/root/etc/uci-defaults/40_luci-shadowsocks-libev b/luci-app-shadowsocks-libev/root/etc/uci-defaults/40_luci-shadowsocks-libev old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json b/luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json old mode 100644 new mode 100755 diff --git a/luci-app-shadowsocks-libev/root/usr/share/rpcd/acl.d/luci-app-shadowsocks-libev.json b/luci-app-shadowsocks-libev/root/usr/share/rpcd/acl.d/luci-app-shadowsocks-libev.json old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/Makefile b/luci-app-shutdown/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js b/luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/po/de/shutdown.po b/luci-app-shutdown/po/de/shutdown.po old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/po/fr/shutdown.po b/luci-app-shutdown/po/fr/shutdown.po old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/po/it/shutdown.po b/luci-app-shutdown/po/it/shutdown.po old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/po/oc/shutdown.po b/luci-app-shutdown/po/oc/shutdown.po old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/po/pl/shutdown.po b/luci-app-shutdown/po/pl/shutdown.po old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/po/ru/shutdown.po b/luci-app-shutdown/po/ru/shutdown.po old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/po/templates/shutdown.pot b/luci-app-shutdown/po/templates/shutdown.pot old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/po/zh_Hans/shutdown.po b/luci-app-shutdown/po/zh_Hans/shutdown.po old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json b/luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json old mode 100644 new mode 100755 diff --git a/luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json b/luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/Makefile b/luci-app-snmpd/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/luasrc/controller/snmpd.lua b/luci-app-snmpd/luasrc/controller/snmpd.lua old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/luasrc/model/cbi/snmpd.lua b/luci-app-snmpd/luasrc/model/cbi/snmpd.lua old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/luasrc/view/snmpd.htm b/luci-app-snmpd/luasrc/view/snmpd.htm old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/po/de/snmpd.po b/luci-app-snmpd/po/de/snmpd.po old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/po/fr/snmpd.po b/luci-app-snmpd/po/fr/snmpd.po old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/po/it/snmpd.po b/luci-app-snmpd/po/it/snmpd.po old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/po/oc/snmpd.po b/luci-app-snmpd/po/oc/snmpd.po old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/po/templates/snmpd.pot b/luci-app-snmpd/po/templates/snmpd.pot old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/po/zh_Hans/snmpd.po b/luci-app-snmpd/po/zh_Hans/snmpd.po old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/root/etc/config/snmpd b/luci-app-snmpd/root/etc/config/snmpd old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json b/luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json old mode 100644 new mode 100755 diff --git a/luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json b/luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json old mode 100644 new mode 100755 diff --git a/luci-app-status/Makefile b/luci-app-status/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-status/htdocs/luci-static/resources/status/css/wanstatus.css b/luci-app-status/htdocs/luci-static/resources/status/css/wanstatus.css old mode 100644 new mode 100755 diff --git a/luci-app-status/htdocs/luci-static/resources/status/images/status-doing.png b/luci-app-status/htdocs/luci-static/resources/status/images/status-doing.png old mode 100644 new mode 100755 diff --git a/luci-app-status/htdocs/luci-static/resources/status/images/status-done.png b/luci-app-status/htdocs/luci-static/resources/status/images/status-done.png old mode 100644 new mode 100755 diff --git a/luci-app-status/htdocs/luci-static/resources/status/images/status-error.png b/luci-app-status/htdocs/luci-static/resources/status/images/status-error.png old mode 100644 new mode 100755 diff --git a/luci-app-status/htdocs/luci-static/resources/status/images/status-todo.png b/luci-app-status/htdocs/luci-static/resources/status/images/status-todo.png old mode 100644 new mode 100755 diff --git a/luci-app-status/htdocs/luci-static/resources/status/images/status-warn.png b/luci-app-status/htdocs/luci-static/resources/status/images/status-warn.png old mode 100644 new mode 100755 diff --git a/luci-app-status/htdocs/luci-static/resources/status/images/statusError.png b/luci-app-status/htdocs/luci-static/resources/status/images/statusError.png old mode 100644 new mode 100755 diff --git a/luci-app-status/htdocs/luci-static/resources/status/images/statusOK.png b/luci-app-status/htdocs/luci-static/resources/status/images/statusOK.png old mode 100644 new mode 100755 diff --git a/luci-app-status/htdocs/luci-static/resources/status/images/statusWarning.png b/luci-app-status/htdocs/luci-static/resources/status/images/statusWarning.png old mode 100644 new mode 100755 diff --git a/luci-app-status/luasrc/controller/status.lua b/luci-app-status/luasrc/controller/status.lua old mode 100644 new mode 100755 diff --git a/luci-app-status/luasrc/view/status/server.htm b/luci-app-status/luasrc/view/status/server.htm old mode 100644 new mode 100755 diff --git a/luci-app-status/luasrc/view/status/wanstatus.htm b/luci-app-status/luasrc/view/status/wanstatus.htm old mode 100644 new mode 100755 diff --git a/luci-app-status/po/templates/status.pot b/luci-app-status/po/templates/status.pot old mode 100644 new mode 100755 diff --git a/luci-app-status/po/zh_Hans/status.po b/luci-app-status/po/zh_Hans/status.po old mode 100644 new mode 100755 diff --git a/luci-app-status/root/usr/share/luci/menu.d/luci-app-status.json b/luci-app-status/root/usr/share/luci/menu.d/luci-app-status.json old mode 100644 new mode 100755 diff --git a/luci-app-status/root/usr/share/rpcd/acl.d/luci-app-status.json b/luci-app-status/root/usr/share/rpcd/acl.d/luci-app-status.json old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/Makefile b/luci-app-sysupgrade/Makefile old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/luasrc/view/sysupgrade.htm b/luci-app-sysupgrade/luasrc/view/sysupgrade.htm old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/po/fr/sysupgrade.po b/luci-app-sysupgrade/po/fr/sysupgrade.po old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/po/fr/sysupgrade.po~ b/luci-app-sysupgrade/po/fr/sysupgrade.po~ old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/po/ru/sysupgrade.po b/luci-app-sysupgrade/po/ru/sysupgrade.po old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/po/templates/sysupgrade.pot b/luci-app-sysupgrade/po/templates/sysupgrade.pot old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po b/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ b/luci-app-sysupgrade/po/zh_Hans/sysupgrade.po~ old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json b/luci-app-sysupgrade/root/usr/share/luci/menu.d/luci-app-sysupgrade.json old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json b/luci-app-sysupgrade/root/usr/share/rpcd/acl.d/sysupgrade.json old mode 100644 new mode 100755 diff --git a/luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js b/luci-app-sysupgrade/root/www/luci-static/resources/sysupgrade.js old mode 100644 new mode 100755 diff --git a/luci-base/po/oc/base.po b/luci-base/po/oc/base.po old mode 100644 new mode 100755 diff --git a/luci-base/po/templates/base.pot b/luci-base/po/templates/base.pot old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/Makefile b/luci-mod-dashboard/Makefile old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/css/custom.css old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/devices.svg old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/internet.svg old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/not-internet.svg old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/router.svg old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/icons/wireless.svg old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/10_router.js old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/20_lan.js old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/include/30_wifi.js old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js b/luci-mod-dashboard/htdocs/luci-static/resources/view/dashboard/index.js old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/po/fr/dashboard.po b/luci-mod-dashboard/po/fr/dashboard.po old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/po/ru/dashboard.po b/luci-mod-dashboard/po/ru/dashboard.po old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/po/templates/dashboard.pot b/luci-mod-dashboard/po/templates/dashboard.pot old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/po/zh_Hans/dashboard.po b/luci-mod-dashboard/po/zh_Hans/dashboard.po old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json b/luci-mod-dashboard/root/usr/share/luci/menu.d/luci-mod-dashboard.json old mode 100644 new mode 100755 diff --git a/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json b/luci-mod-dashboard/root/usr/share/rpcd/acl.d/luci-mod-dashboard.json old mode 100644 new mode 100755 diff --git a/luci-mod-network/Makefile b/luci-mod-network/Makefile old mode 100644 new mode 100755 diff --git a/luci-mod-network/htdocs/luci-static/resources/tools/network.js b/luci-mod-network/htdocs/luci-static/resources/tools/network.js old mode 100644 new mode 100755 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js b/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js old mode 100644 new mode 100755 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js b/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js old mode 100644 new mode 100755 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js b/luci-mod-network/htdocs/luci-static/resources/view/network/hosts.js old mode 100644 new mode 100755 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js b/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js old mode 100644 new mode 100755 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js b/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js old mode 100644 new mode 100755 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js b/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js old mode 100644 new mode 100755 diff --git a/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js b/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js old mode 100644 new mode 100755 diff --git a/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json b/luci-mod-network/root/usr/share/luci/menu.d/luci-mod-network.json old mode 100644 new mode 100755 diff --git a/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json b/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json old mode 100644 new mode 100755 diff --git a/luci-proto-mbim/Makefile b/luci-proto-mbim/Makefile old mode 100644 new mode 100755 diff --git a/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js b/luci-proto-mbim/htdocs/luci-static/resources/protocol/mbim.js old mode 100644 new mode 100755 diff --git a/luci-theme-argon/Makefile b/luci-theme-argon/Makefile old mode 100644 new mode 100755 diff --git a/luci-theme-argon/README.md b/luci-theme-argon/README.md old mode 100644 new mode 100755 diff --git a/luci-theme-argon/README_ZH.md b/luci-theme-argon/README_ZH.md old mode 100644 new mode 100755 diff --git a/luci-theme-argon/Screenshots/screenshot_pc.jpg b/luci-theme-argon/Screenshots/screenshot_pc.jpg old mode 100644 new mode 100755 diff --git a/luci-theme-argon/Screenshots/screenshot_phone.jpg b/luci-theme-argon/Screenshots/screenshot_phone.jpg old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/background/README.md b/luci-theme-argon/htdocs/luci-static/argon/background/README.md old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css b/luci-theme-argon/htdocs/luci-static/argon/css/cascade.css old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/dark.css b/luci-theme-argon/htdocs/luci-static/argon/css/dark.css old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/fonts.css b/luci-theme-argon/htdocs/luci-static/argon/css/fonts.css old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/css/pure-min.css b/luci-theme-argon/htdocs/luci-static/argon/css/pure-min.css old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/favicon.ico b/luci-theme-argon/htdocs/luci-static/argon/favicon.ico old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.eot old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.svg old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.ttf old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff b/luci-theme-argon/htdocs/luci-static/argon/fonts/TypoGraphica.woff old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.eot old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.svg old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.ttf old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff b/luci-theme-argon/htdocs/luci-static/argon/fonts/argon.woff old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png b/luci-theme-argon/htdocs/luci-static/argon/icon/android-icon-192x192.png old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-144x144.png old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-60x60.png old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png b/luci-theme-argon/htdocs/luci-static/argon/icon/apple-icon-72x72.png old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg b/luci-theme-argon/htdocs/luci-static/argon/icon/arrow.svg old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml b/luci-theme-argon/htdocs/luci-static/argon/icon/browserconfig.xml old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-16x16.png old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-32x32.png old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png b/luci-theme-argon/htdocs/luci-static/argon/icon/favicon-96x96.png old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json b/luci-theme-argon/htdocs/luci-static/argon/icon/manifest.json old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png b/luci-theme-argon/htdocs/luci-static/argon/icon/ms-icon-144x144.png old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg b/luci-theme-argon/htdocs/luci-static/argon/icon/spinner.svg old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg b/luci-theme-argon/htdocs/luci-static/argon/img/argon.svg old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg b/luci-theme-argon/htdocs/luci-static/argon/img/bg1.jpg old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/blank.png b/luci-theme-argon/htdocs/luci-static/argon/img/blank.png old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg b/luci-theme-argon/htdocs/luci-static/argon/img/volume_high.svg old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg b/luci-theme-argon/htdocs/luci-static/argon/img/volume_off.svg old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js b/luci-theme-argon/htdocs/luci-static/argon/js/jquery.min.js old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/polyfill.min.js b/luci-theme-argon/htdocs/luci-static/argon/js/polyfill.min.js old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/js/script.js b/luci-theme-argon/htdocs/luci-static/argon/js/script.js old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/cascade.less b/luci-theme-argon/htdocs/luci-static/argon/less/cascade.less old mode 100644 new mode 100755 diff --git a/luci-theme-argon/htdocs/luci-static/argon/less/dark.less b/luci-theme-argon/htdocs/luci-static/argon/less/dark.less old mode 100644 new mode 100755 diff --git a/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm b/luci-theme-argon/luasrc/view/themes/argon/footer_login.htm old mode 100644 new mode 100755 diff --git a/luci-theme-argon/luasrc/view/themes/argon/header.htm b/luci-theme-argon/luasrc/view/themes/argon/header.htm old mode 100644 new mode 100755 diff --git a/luci-theme-argon/luasrc/view/themes/argon/header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/header_login.htm old mode 100644 new mode 100755 diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_footer_login.htm old mode 100644 new mode 100755 diff --git a/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm b/luci-theme-argon/luasrc/view/themes/argon/out_header_login.htm old mode 100644 new mode 100755 diff --git a/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm b/luci-theme-argon/luasrc/view/themes/argon/sysauth.htm old mode 100644 new mode 100755 diff --git a/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon b/luci-theme-argon/root/etc/uci-defaults/30_luci-theme-argon old mode 100644 new mode 100755 diff --git a/luci-theme-openmptcprouter/Makefile b/luci-theme-openmptcprouter/Makefile old mode 100644 new mode 100755 diff --git a/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/html5.js b/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/html5.js old mode 100644 new mode 100755 diff --git a/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/mobile.css b/luci-theme-openmptcprouter/htdocs/luci-static/openmptcprouter/mobile.css old mode 100644 new mode 100755 diff --git a/luci-theme-openmptcprouter/htdocs/luci-static/resources/menu-openmptcprouter.js b/luci-theme-openmptcprouter/htdocs/luci-static/resources/menu-openmptcprouter.js old mode 100644 new mode 100755 diff --git a/luci-theme-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/omr-logo.png b/luci-theme-openmptcprouter/htdocs/luci-static/resources/openmptcprouter/images/omr-logo.png old mode 100644 new mode 100755 diff --git a/luci-theme-openwrt-2020/Makefile b/luci-theme-openwrt-2020/Makefile old mode 100644 new mode 100755 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/GalanoGrotesqueW00-Regular.woff2 old mode 100644 new mode 100755 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/cascade.css old mode 100644 new mode 100755 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/favicon.png old mode 100644 new mode 100755 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/omr-logo.png b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/omr-logo.png old mode 100644 new mode 100755 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg b/luci-theme-openwrt-2020/htdocs/luci-static/openwrt2020/spinner.svg old mode 100644 new mode 100755 diff --git a/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js b/luci-theme-openwrt-2020/htdocs/luci-static/resources/menu-openwrt2020.js old mode 100644 new mode 100755 diff --git a/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm b/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/footer.htm old mode 100644 new mode 100755 diff --git a/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm b/luci-theme-openwrt-2020/luasrc/view/themes/openwrt2020/header.htm old mode 100644 new mode 100755 diff --git a/macvlan/Makefile b/macvlan/Makefile old mode 100644 new mode 100755 diff --git a/macvlan/files/etc/config/macvlan b/macvlan/files/etc/config/macvlan old mode 100644 new mode 100755 diff --git a/macvlan/files/etc/uci-defaults/40_luci-app-macvlan b/macvlan/files/etc/uci-defaults/40_luci-app-macvlan old mode 100644 new mode 100755 diff --git a/mlvpn/Makefile b/mlvpn/Makefile old mode 100644 new mode 100755 diff --git a/mlvpn/files/etc/config/mlvpn b/mlvpn/files/etc/config/mlvpn old mode 100644 new mode 100755 diff --git a/mlvpn/files/etc/uci-defaults/4100-mlvpn b/mlvpn/files/etc/uci-defaults/4100-mlvpn old mode 100644 new mode 100755 diff --git a/mlvpn/patches/020-remove-cdefs.patch b/mlvpn/patches/020-remove-cdefs.patch old mode 100644 new mode 100755 diff --git a/mptcp/Makefile b/mptcp/Makefile old mode 100644 new mode 100755 diff --git a/mptcp/files/etc/hotplug.d/iface/30-mptcp b/mptcp/files/etc/hotplug.d/iface/30-mptcp old mode 100644 new mode 100755 diff --git a/mptcpd/Makefile b/mptcpd/Makefile old mode 100644 new mode 100755 diff --git a/mptcpd/patches/remove_log.patch b/mptcpd/patches/remove_log.patch old mode 100644 new mode 100755 diff --git a/msmtp/Makefile b/msmtp/Makefile old mode 100644 new mode 100755 diff --git a/ndisc6/Makefile b/ndisc6/Makefile old mode 100644 new mode 100755 diff --git a/ndpi-netfilter2/Makefile b/ndpi-netfilter2/Makefile old mode 100644 new mode 100755 diff --git a/net-tools/Makefile b/net-tools/Makefile old mode 100644 new mode 100755 diff --git a/net-tools/patches/mptcp-support.patch b/net-tools/patches/mptcp-support.patch old mode 100644 new mode 100755 diff --git a/nginx/Config.in b/nginx/Config.in old mode 100644 new mode 100755 diff --git a/nginx/Config_ssl.in b/nginx/Config_ssl.in old mode 100644 new mode 100755 diff --git a/nginx/Makefile b/nginx/Makefile old mode 100644 new mode 100755 diff --git a/nginx/files-luci-support/60_nginx-luci-support b/nginx/files-luci-support/60_nginx-luci-support old mode 100644 new mode 100755 diff --git a/nginx/files-luci-support/70_nginx-luci-support-ssl b/nginx/files-luci-support/70_nginx-luci-support-ssl old mode 100644 new mode 100755 diff --git a/nginx/files-luci-support/luci_nginx.conf b/nginx/files-luci-support/luci_nginx.conf old mode 100644 new mode 100755 diff --git a/nginx/files-luci-support/luci_nginx_ssl.conf b/nginx/files-luci-support/luci_nginx_ssl.conf old mode 100644 new mode 100755 diff --git a/nginx/files-luci-support/luci_uwsgi.conf b/nginx/files-luci-support/luci_uwsgi.conf old mode 100644 new mode 100755 diff --git a/nginx/files/nginx.init b/nginx/files/nginx.init old mode 100644 new mode 100755 diff --git a/nginx/patches-lua-nginx/100-no_by_lua_block.patch b/nginx/patches-lua-nginx/100-no_by_lua_block.patch old mode 100644 new mode 100755 diff --git a/nginx/patches/101-feature_test_fix.patch b/nginx/patches/101-feature_test_fix.patch old mode 100644 new mode 100755 diff --git a/nginx/patches/102-sizeof_test_fix.patch b/nginx/patches/102-sizeof_test_fix.patch old mode 100644 new mode 100755 diff --git a/nginx/patches/103-sys_nerr.patch b/nginx/patches/103-sys_nerr.patch old mode 100644 new mode 100755 diff --git a/nginx/patches/200-config.patch b/nginx/patches/200-config.patch old mode 100644 new mode 100755 diff --git a/nginx/patches/201-ignore-invalid-options.patch b/nginx/patches/201-ignore-invalid-options.patch old mode 100644 new mode 100755 diff --git a/nginx/patches/300-max-processes.patch b/nginx/patches/300-max-processes.patch old mode 100644 new mode 100755 diff --git a/omr-6in4/Makefile b/omr-6in4/Makefile old mode 100644 new mode 100755 diff --git a/omr-quota/Makefile b/omr-quota/Makefile old mode 100644 new mode 100755 diff --git a/omr-quota/files/etc/config/omr-quota b/omr-quota/files/etc/config/omr-quota old mode 100644 new mode 100755 diff --git a/omr-tracker/Makefile b/omr-tracker/Makefile old mode 100644 new mode 100755 diff --git a/omr-tracker/files/etc/config/omr-tracker b/omr-tracker/files/etc/config/omr-tracker old mode 100644 new mode 100755 diff --git a/omr-update/Makefile b/omr-update/Makefile old mode 100644 new mode 100755 diff --git a/openmptcprouter-full/Makefile b/openmptcprouter-full/Makefile old mode 100644 new mode 100755 diff --git a/openmptcprouter-mini/Makefile b/openmptcprouter-mini/Makefile old mode 100644 new mode 100755 diff --git a/openmptcprouter/Makefile b/openmptcprouter/Makefile old mode 100644 new mode 100755 diff --git a/openmptcprouter/files/etc/firewall.gre-tunnel b/openmptcprouter/files/etc/firewall.gre-tunnel old mode 100644 new mode 100755 diff --git a/openmptcprouter/files/etc/firewall.omr-server b/openmptcprouter/files/etc/firewall.omr-server old mode 100644 new mode 100755 diff --git a/openmptcprouter/files/etc/firewall.ttl b/openmptcprouter/files/etc/firewall.ttl old mode 100644 new mode 100755 diff --git a/openmptcprouter/files/etc/hotplug.d/iface/00-nego b/openmptcprouter/files/etc/hotplug.d/iface/00-nego old mode 100644 new mode 100755 diff --git a/openmptcprouter/files/etc/iproute2/rt_dsfield b/openmptcprouter/files/etc/iproute2/rt_dsfield old mode 100644 new mode 100755 diff --git a/openmptcprouter/files/etc/sysctl.d/default.conf b/openmptcprouter/files/etc/sysctl.d/default.conf old mode 100644 new mode 100755 diff --git a/openmptcprouter/files/etc/wgetrc4 b/openmptcprouter/files/etc/wgetrc4 old mode 100644 new mode 100755 diff --git a/protobuf/Makefile b/protobuf/Makefile old mode 100644 new mode 100755 diff --git a/r8168/Makefile b/r8168/Makefile old mode 100644 new mode 100755 diff --git a/r8168/patches/001-r8168-add-LED-configuration-from-OF.patch b/r8168/patches/001-r8168-add-LED-configuration-from-OF.patch old mode 100644 new mode 100755 diff --git a/serdisplib/Makefile b/serdisplib/Makefile old mode 100644 new mode 100755 diff --git a/shadowsocks-libev/Makefile b/shadowsocks-libev/Makefile old mode 100644 new mode 100755 diff --git a/shadowsocks-libev/README.md b/shadowsocks-libev/README.md old mode 100644 new mode 100755 diff --git a/shadowsocks-libev/files/firewall.ss-rules b/shadowsocks-libev/files/firewall.ss-rules old mode 100644 new mode 100755 diff --git a/shadowsocks-libev/files/shadowsocks-libev.config b/shadowsocks-libev/files/shadowsocks-libev.config old mode 100644 new mode 100755 diff --git a/shadowsocks-libev/files/shadowsocks-libev.init b/shadowsocks-libev/files/shadowsocks-libev.init old mode 100644 new mode 100755 diff --git a/shadowsocks-libev/files/shadowsocks.conf b/shadowsocks-libev/files/shadowsocks.conf old mode 100644 new mode 100755 diff --git a/shadowsocks-libev/patches/010-ECONNRESET.patch b/shadowsocks-libev/patches/010-ECONNRESET.patch old mode 100644 new mode 100755 diff --git a/shadowsocks-v2ray-plugin/Makefile b/shadowsocks-v2ray-plugin/Makefile old mode 100644 new mode 100755 diff --git a/shortcut-fe/Makefile b/shortcut-fe/Makefile old mode 100644 new mode 100755 diff --git a/shortcut-fe/files/usr/bin/sfe_dump b/shortcut-fe/files/usr/bin/sfe_dump old mode 100644 new mode 100755 diff --git a/shortcut-fe/src/Kconfig b/shortcut-fe/src/Kconfig old mode 100644 new mode 100755 diff --git a/shortcut-fe/src/Makefile b/shortcut-fe/src/Makefile old mode 100644 new mode 100755 diff --git a/shortcut-fe/src/sfe.h b/shortcut-fe/src/sfe.h old mode 100644 new mode 100755 diff --git a/shortcut-fe/src/sfe_backport.h b/shortcut-fe/src/sfe_backport.h old mode 100644 new mode 100755 diff --git a/shortcut-fe/src/sfe_cm.c b/shortcut-fe/src/sfe_cm.c old mode 100644 new mode 100755 diff --git a/shortcut-fe/src/sfe_cm.h b/shortcut-fe/src/sfe_cm.h old mode 100644 new mode 100755 diff --git a/shortcut-fe/src/sfe_ipv4.c b/shortcut-fe/src/sfe_ipv4.c old mode 100644 new mode 100755 diff --git a/shortcut-fe/src/sfe_ipv6.c b/shortcut-fe/src/sfe_ipv6.c old mode 100644 new mode 100755 diff --git a/simple-obfs/LICENSE b/simple-obfs/LICENSE old mode 100644 new mode 100755 diff --git a/simple-obfs/Makefile b/simple-obfs/Makefile old mode 100644 new mode 100755 diff --git a/speedtestc/Makefile b/speedtestc/Makefile old mode 100644 new mode 100755 diff --git a/tcptraceroute/Makefile b/tcptraceroute/Makefile old mode 100644 new mode 100755 diff --git a/tcptraceroute/patches/001-configure_cross_compile.patch b/tcptraceroute/patches/001-configure_cross_compile.patch old mode 100644 new mode 100755 diff --git a/tracebox/Makefile b/tracebox/Makefile old mode 100644 new mode 100755 diff --git a/tracebox/files/usr/share/tracebox/omr-mptcp-trace.lua b/tracebox/files/usr/share/tracebox/omr-mptcp-trace.lua old mode 100644 new mode 100755 diff --git a/tracebox/patches/101-build-fixes.patch b/tracebox/patches/101-build-fixes.patch old mode 100644 new mode 100755 diff --git a/tracebox/patches/102-configure.patch b/tracebox/patches/102-configure.patch old mode 100644 new mode 100755 diff --git a/tracebox/patches/103-configure.patch b/tracebox/patches/103-configure.patch old mode 100644 new mode 100755 diff --git a/tracebox/patches/104-ns_name_compress.patch b/tracebox/patches/104-ns_name_compress.patch old mode 100644 new mode 100755 diff --git a/tracebox/patches/202-fix-lua-include-hpp.patch b/tracebox/patches/202-fix-lua-include-hpp.patch old mode 100644 new mode 100755 diff --git a/tracebox/patches/204-fix-lua-namespace-crafter.patch b/tracebox/patches/204-fix-lua-namespace-crafter.patch old mode 100644 new mode 100755 diff --git a/v2ray-core/Config.in b/v2ray-core/Config.in old mode 100644 new mode 100755 diff --git a/v2ray-core/LICENSE b/v2ray-core/LICENSE old mode 100644 new mode 100755 diff --git a/v2ray-core/Makefile b/v2ray-core/Makefile old mode 100644 new mode 100755 diff --git a/v2ray-core/files/etc/firewall.v2ray-rules b/v2ray-core/files/etc/firewall.v2ray-rules old mode 100644 new mode 100755 diff --git a/v2ray-core/files/etc/uci-defaults/3010-omr-v2ray b/v2ray-core/files/etc/uci-defaults/3010-omr-v2ray old mode 100644 new mode 100755 diff --git a/v2ray-ext/Makefile b/v2ray-ext/Makefile old mode 100644 new mode 100755 diff --git a/xtables-addons/Makefile b/xtables-addons/Makefile old mode 100644 new mode 100755 diff --git a/xtables-addons/patches/001-fix-kernel-version-detection.patch b/xtables-addons/patches/001-fix-kernel-version-detection.patch old mode 100644 new mode 100755 diff --git a/xtables-addons/patches/100-add-rtsp-conntrack.patch b/xtables-addons/patches/100-add-rtsp-conntrack.patch old mode 100644 new mode 100755 diff --git a/xtables-addons/patches/200-add-lua-packetscript.patch b/xtables-addons/patches/200-add-lua-packetscript.patch old mode 100644 new mode 100755 diff --git a/xtables-addons/patches/201-fix-lua-packetscript.patch b/xtables-addons/patches/201-fix-lua-packetscript.patch old mode 100644 new mode 100755 diff --git a/xtables-addons/patches/210-freebsd-build-fix.patch b/xtables-addons/patches/210-freebsd-build-fix.patch old mode 100644 new mode 100755 From 08dadfdb7cb693b48474a6e6f6e2c43a00362093 Mon Sep 17 00:00:00 2001 From: suyuan168 <175338101@qq.com> Date: Fri, 31 Dec 2021 02:36:01 +0800 Subject: [PATCH 30/63] Update config.yml --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f72307d01..f3334c0d6 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -version: 2 +version: 1 jobs: prepare: machine: From 6a26daf968f7265dd7d44c22ac6ed4e1d8b88062 Mon Sep 17 00:00:00 2001 From: suyuan168 <175338101@qq.com> Date: Fri, 31 Dec 2021 02:36:08 +0800 Subject: [PATCH 31/63] Update config.yml --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f3334c0d6..f72307d01 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -version: 1 +version: 2 jobs: prepare: machine: From d9b5b9991cd4f10656c05c1e57a0a2b95a28ad81 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Mon, 3 Jan 2022 20:25:25 +0100 Subject: [PATCH 32/63] Line break --- glorytun/init | 1 + 1 file changed, 1 insertion(+) diff --git a/glorytun/init b/glorytun/init index 3d549f0aa..1384a0315 100755 --- a/glorytun/init +++ b/glorytun/init @@ -62,6 +62,7 @@ start_instance() { uci -q set network.omrvpn.device=${dev} uci -q commit network fi + _log "starting ${PROG_NAME} ${1} instance $*" procd_open_instance From 4a33826a28c62c9dc8cd372c368888f8df0f2868 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Tue, 4 Jan 2022 09:05:50 +0100 Subject: [PATCH 33/63] Add r8125 driver --- r8125/Makefile | 45 + r8125/src/Makefile | 197 + r8125/src/Makefile_linux24x | 75 + r8125/src/r8125.h | 2508 ++++++ r8125/src/r8125_dash.h | 261 + r8125/src/r8125_firmware.c | 264 + r8125/src/r8125_firmware.h | 68 + r8125/src/r8125_n.c | 15150 ++++++++++++++++++++++++++++++++++ r8125/src/r8125_ptp.c | 594 ++ r8125/src/r8125_ptp.h | 81 + r8125/src/r8125_realwow.h | 118 + r8125/src/r8125_rss.c | 481 ++ r8125/src/r8125_rss.h | 69 + r8125/src/rtl_eeprom.c | 289 + r8125/src/rtl_eeprom.h | 53 + r8125/src/rtltool.c | 320 + r8125/src/rtltool.h | 86 + 17 files changed, 20659 insertions(+) create mode 100644 r8125/Makefile create mode 100755 r8125/src/Makefile create mode 100755 r8125/src/Makefile_linux24x create mode 100755 r8125/src/r8125.h create mode 100755 r8125/src/r8125_dash.h create mode 100755 r8125/src/r8125_firmware.c create mode 100755 r8125/src/r8125_firmware.h create mode 100755 r8125/src/r8125_n.c create mode 100755 r8125/src/r8125_ptp.c create mode 100755 r8125/src/r8125_ptp.h create mode 100755 r8125/src/r8125_realwow.h create mode 100755 r8125/src/r8125_rss.c create mode 100755 r8125/src/r8125_rss.h create mode 100755 r8125/src/rtl_eeprom.c create mode 100755 r8125/src/rtl_eeprom.h create mode 100755 r8125/src/rtltool.c create mode 100755 r8125/src/rtltool.h diff --git a/r8125/Makefile b/r8125/Makefile new file mode 100644 index 000000000..e9b213c6e --- /dev/null +++ b/r8125/Makefile @@ -0,0 +1,45 @@ +# Attribution: https://gist.github.com/lenew/9b41ba901c3393047ede0766760f9d55 + +#Put this source to 'package/lean/r8125' folder of OpenWRT/LEDE SDK +#Build(make menuconfig, make defconfig, make) + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=r8125 +PKG_VERSION:=9.006.04 +PKG_RELEASE:=$(AUTORELEASE) + +PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) + +include $(INCLUDE_DIR)/package.mk + +define KernelPackage/r8125 + TITLE:=Driver for Realtek r8125 chipsets + SUBMENU:=Network Devices + VERSION:=$(LINUX_VERSION)+$(PKG_VERSION)-$(BOARD)-$(PKG_RELEASE) + FILES:= $(PKG_BUILD_DIR)/r8125.ko + AUTOLOAD:=$(call AutoProbe,r8125) +endef + +define Package/r8125/description + This package contains a driver for Realtek r8125 chipsets. +endef + +R8125_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) $(R8125_MAKEOPTS) modules +endef + +$(eval $(call KernelPackage,r8125)) diff --git a/r8125/src/Makefile b/r8125/src/Makefile new file mode 100755 index 000000000..514c0acdd --- /dev/null +++ b/r8125/src/Makefile @@ -0,0 +1,197 @@ +# SPDX-License-Identifier: GPL-2.0-only +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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_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 +ENABLE_TX_NO_CLOSE = y +ENABLE_MULTIPLE_TX_QUEUE = n +ENABLE_PTP_SUPPORT = n +ENABLE_PTP_MASTER_MODE = n +ENABLE_RSS_SUPPORT = y +ENABLE_LIB_SUPPORT = n +ENABLE_USE_FIRMWARE_FILE = n +DISABLE_PM_SUPPORT = n +DISABLE_MULTI_MSIX_VECTOR = n + +ifneq ($(KERNELRELEASE),) + obj-m := r8125.o + r8125-objs := r8125_n.o rtl_eeprom.o rtltool.o + ifeq ($(CONFIG_SOC_LAN), y) + EXTRA_CFLAGS += -DCONFIG_SOC_LAN + endif + ifeq ($(ENABLE_REALWOW_SUPPORT), y) + r8125-objs += r8125_realwow.o + EXTRA_CFLAGS += -DENABLE_REALWOW_SUPPORT + endif + ifeq ($(ENABLE_DASH_SUPPORT), y) + r8125-objs += r8125_dash.o + EXTRA_CFLAGS += -DENABLE_DASH_SUPPORT + endif + ifeq ($(ENABLE_DASH_PRINTER_SUPPORT), y) + r8125-objs += r8125_dash.o + EXTRA_CFLAGS += -DENABLE_DASH_SUPPORT -DENABLE_DASH_PRINTER_SUPPORT + endif + EXTRA_CFLAGS += -DCONFIG_R8125_NAPI + EXTRA_CFLAGS += -DCONFIG_R8125_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 ($(ENABLE_TX_NO_CLOSE), y) + EXTRA_CFLAGS += -DENABLE_TX_NO_CLOSE + endif + ifeq ($(ENABLE_MULTIPLE_TX_QUEUE), y) + EXTRA_CFLAGS += -DENABLE_MULTIPLE_TX_QUEUE + endif + ifeq ($(ENABLE_PTP_SUPPORT), y) + r8125-objs += r8125_ptp.o + EXTRA_CFLAGS += -DENABLE_PTP_SUPPORT + endif + ifeq ($(ENABLE_PTP_MASTER_MODE), y) + EXTRA_CFLAGS += -DENABLE_PTP_MASTER_MODE + endif + ifeq ($(ENABLE_RSS_SUPPORT), y) + r8125-objs += r8125_rss.o + EXTRA_CFLAGS += -DENABLE_RSS_SUPPORT + endif + ifeq ($(ENABLE_LIB_SUPPORT), y) + r8125-objs += r8125_lib.o + EXTRA_CFLAGS += -DENABLE_LIB_SUPPORT + endif + ifeq ($(ENABLE_USE_FIRMWARE_FILE), y) + r8125-objs += r8125_firmware.o + EXTRA_CFLAGS += -DENABLE_USE_FIRMWARE_FILE + endif + ifeq ($(DISABLE_PM_SUPPORT), y) + EXTRA_CFLAGS += -DDISABLE_PM_SUPPORT + endif + ifeq ($(DISABLE_MULTI_MSIX_VECTOR), y) + EXTRA_CFLAGS += -DDISABLE_MULTI_MSIX_VECTOR + 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/r8125/src/Makefile_linux24x b/r8125/src/Makefile_linux24x new file mode 100755 index 000000000..d043fb00c --- /dev/null +++ b/r8125/src/Makefile_linux24x @@ -0,0 +1,75 @@ +# SPDX-License-Identifier: GPL-2.0-only +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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 := r8125_n.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 r8125.o + strip --strip-debug r8125.o + +%.o: %.c + $(CC) $(MODCFLAGS) -c $< -o $@ + +clean: + rm *.o -f + +install: + install -m 744 -c r8125.o $(KMISC) diff --git a/r8125/src/r8125.h b/r8125/src/r8125.h new file mode 100755 index 000000000..4875ccca4 --- /dev/null +++ b/r8125/src/r8125.h @@ -0,0 +1,2508 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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 __R8125_H +#define __R8125_H + +//#include +#include +#include +#include +#include "r8125_dash.h" +#include "r8125_realwow.h" +#include "r8125_ptp.h" +#include "r8125_rss.h" +#ifdef ENABLE_LIB_SUPPORT +#include "r8125_lib.h" +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32) +typedef int netdev_tx_t; +#endif + +/* +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,12,0)&& !defined(ENABLE_LIB_SUPPORT) +#define RTL_USE_NEW_INTR_API +#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(napi, length) dev_alloc_skb(length) +#ifdef CONFIG_R8125_NAPI +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0) +#undef RTL_ALLOC_SKB_INTR +#define RTL_ALLOC_SKB_INTR(napi, length) napi_alloc_skb(napi, length) +#endif +#endif + +#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_R8125_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=rtl8125_netpoll +#else +#define RTL_NET_POLL_CONTROLLER +#endif + +#ifdef CONFIG_R8125_VLAN +#define RTL_SET_VLAN dev->vlan_rx_register=rtl8125_vlan_rx_register +#else +#define RTL_SET_VLAN +#endif + +#define RTL_NET_DEVICE_OPS(ops) dev->open=rtl8125_open; \ + dev->hard_start_xmit=rtl8125_start_xmit; \ + dev->get_stats=rtl8125_get_stats; \ + dev->stop=rtl8125_close; \ + dev->tx_timeout=rtl8125_tx_timeout; \ + dev->set_multicast_list=rtl8125_set_rx_mode; \ + dev->change_mtu=rtl8125_change_mtu; \ + dev->set_mac_address=rtl8125_set_mac_address; \ + dev->do_ioctl=rtl8125_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) + +//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_R8125_NAPI +#define NAPI_SUFFIX "-NAPI" +#else +#define NAPI_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 + +#if defined(ENABLE_REALWOW_SUPPORT) +#define REALWOW_SUFFIX "-REALWOW" +#else +#define REALWOW_SUFFIX "" +#endif + +#if defined(ENABLE_PTP_SUPPORT) +#define PTP_SUFFIX "-PTP" +#else +#define PTP_SUFFIX "" +#endif + +#if defined(ENABLE_RSS_SUPPORT) +#define RSS_SUFFIX "-RSS" +#else +#define RSS_SUFFIX "" +#endif + +#define RTL8125_VERSION "9.006.04" NAPI_SUFFIX DASH_SUFFIX REALWOW_SUFFIX PTP_SUFFIX RSS_SUFFIX +#define MODULENAME "r8125" +#define PFX MODULENAME ": " + +#define GPL_CLAIM "\ +r8125 Copyright (C) 2021 Realtek NIC software team \n \ +This program comes with ABSOLUTELY NO WARRANTY; for details, please see . \n \ +This is free software, and you are welcome to redistribute it under certain conditions; see . \n" + +#ifdef RTL8125_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 /* RTL8125_DEBUG */ + +#define R8125_MSG_DEFAULT \ + (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN) + +#ifdef CONFIG_R8125_NAPI +#define rtl8125_rx_hwaccel_skb vlan_hwaccel_receive_skb +#define rtl8125_rx_quota(count, quota) min(count, quota) +#else +#define rtl8125_rx_hwaccel_skb vlan_hwaccel_rx +#define rtl8125_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 R8125_REGS_SIZE (256) +#define R8125_MAC_REGS_SIZE (256) +#define R8125_PHY_REGS_SIZE (16*2) +#define R8125_EPHY_REGS_SIZE (31*2) +#define R8125_ERI_REGS_SIZE (0x100) +#define R8125_REGS_DUMP_SIZE (0x400) +#define R8125_PCI_REGS_SIZE (0x100) +#define R8125_NAPI_WEIGHT 64 + +#define R8125_MAX_MSIX_VEC_8125B 32 +#define R8125_MIN_MSIX_VEC_8125B 17 +#define R8125_MAX_MSIX_VEC 32 +#define R8125_MAX_RX_QUEUES_VEC_V3 (16) + +#define RTL8125_TX_TIMEOUT (6 * HZ) +#define RTL8125_LINK_TIMEOUT (1 * HZ) +#define RTL8125_ESD_TIMEOUT (2 * HZ) + +#define NUM_TX_DESC 1024 /* Number of Tx descriptor registers */ +#define NUM_RX_DESC 1024 /* Number of Rx descriptor registers */ + +#define RX_BUF_SIZE 0x05F3 /* 0x05F3 = 1522bye + 1 */ +#define R8125_TX_RING_BYTES (NUM_TX_DESC * sizeof(struct TxDesc)) +#define R8125_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc)) +#define R8125_MAX_TX_QUEUES (2) +#define R8125_MAX_RX_QUEUES (4) +#define R8125_MAX_QUEUES R8125_MAX_RX_QUEUES + +#define OCP_STD_PHY_BASE 0xa400 + +#ifdef ENABLE_LIB_SUPPORT +#define R8125_MULTI_RX_Q(tp) 0 +#else +#define R8125_MULTI_RX_Q(tp) (tp->num_rx_rings > 1) +#endif + +#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 -1t /* 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 ADVERTISED_2500baseX_Full +#define ADVERTISED_2500baseX_Full 0x8000 +#endif + +#define RTK_ADVERTISE_2500FULL 0x80 +#define RTK_LPA_ADVERTISE_2500FULL 0x20 +#define RTK_LPA_ADVERTISE_5000FULL 0x40 +#define RTK_LPA_ADVERTISE_10000FULL 0x800 + +/* Tx NO CLOSE */ +#define MAX_TX_NO_CLOSE_DESC_PTR_V2 0x10000 +#define TX_NO_CLOSE_SW_PTR_MASK_V2 0x1FFFF + +#ifndef ETH_MIN_MTU +#define ETH_MIN_MTU 68 +#endif + +#define D0_SPEED_UP_SPEED_DISABLE 0 +#define D0_SPEED_UP_SPEED_1000 1 +#define D0_SPEED_UP_SPEED_2500 2 + +#ifndef WRITE_ONCE +#define WRITE_ONCE(var, val) (*((volatile typeof(val) *)(&(var))) = (val)) +#endif +#ifndef READ_ONCE +#define READ_ONCE(var) (*((volatile typeof(var) *)(&(var)))) +#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) + +/*****************************************************************************/ +#ifdef CONFIG_R8125_NAPI +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0) +#define RTL_NAPI_CONSUME_SKB_ANY(skb, budget) napi_consume_skb(skb, budget) +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) +#define RTL_NAPI_CONSUME_SKB_ANY(skb, budget) dev_consume_skb_any(skb); +#else +#define RTL_NAPI_CONSUME_SKB_ANY(skb, budget) dev_kfree_skb_any(skb); +#endif //LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0) +#else //CONFIG_R8125_NAPI +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) +#define RTL_NAPI_CONSUME_SKB_ANY(skb, budget) dev_consume_skb_any(skb); +#else +#define RTL_NAPI_CONSUME_SKB_ANY(skb, budget) dev_kfree_skb_any(skb); +#endif +#endif //CONFIG_R8125_NAPI + +/*****************************************************************************/ +#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 +#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 RTL8125_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, + INT_CFG0_8125 = 0x34, + 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, + INT_CFG1_8125 = 0x7A, + 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, + //8125 + IMR0_8125 = 0x38, + ISR0_8125 = 0x3C, + TPPOLL_8125 = 0x90, + IMR1_8125 = 0x800, + ISR1_8125 = 0x802, + IMR2_8125 = 0x804, + ISR2_8125 = 0x806, + IMR3_8125 = 0x808, + ISR3_8125 = 0x80A, + BACKUP_ADDR0_8125 = 0x19E0, + BACKUP_ADDR1_8125 = 0X19E4, + TCTR0_8125 = 0x0048, + TCTR1_8125 = 0x004C, + TCTR2_8125 = 0x0088, + TCTR3_8125 = 0x001C, + TIMER_INT0_8125 = 0x0058, + TIMER_INT1_8125 = 0x005C, + TIMER_INT2_8125 = 0x008C, + TIMER_INT3_8125 = 0x00F4, + INT_MITI_V2_0_RX = 0x0A00, + INT_MITI_V2_0_TX = 0x0A02, + INT_MITI_V2_1_RX = 0x0A08, + INT_MITI_V2_1_TX = 0x0A0A, + IMR_V2_CLEAR_REG_8125 = 0x0D00, + ISR_V2_8125 = 0x0D04, + IMR_V2_SET_REG_8125 = 0x0D0C, + TDU_STA_8125 = 0x0D08, + RDU_STA_8125 = 0x0D0A, + TX_NEW_CTRL = 0x203E, + TNPDS_Q1_LOW_8125 = 0x2100, + PLA_TXQ0_IDLE_CREDIT = 0x2500, + PLA_TXQ1_IDLE_CREDIT = 0x2504, + SW_TAIL_PTR0_8125 = 0x2800, + HW_CLO_PTR0_8125 = 0x2802, + RDSAR_Q1_LOW_8125 = 0x4000, + RSS_CTRL_8125 = 0x4500, + Q_NUM_CTRL_8125 = 0x4800, + RSS_KEY_8125 = 0x4600, + RSS_INDIRECTION_TBL_8125_V2 = 0x4700, + EEE_TXIDLE_TIMER_8125 = 0x6048, + PTP_CTRL_8125 = 0x6800, + PTP_STATUS_8125 = 0x6802, + PTP_ISR_8125 = 0x6804, + PTP_IMR_8125 = 0x6805, + PTP_TIME_CORRECT_CMD_8125 = 0x6806, + PTP_SOFT_CONFIG_Time_NS_8125 = 0x6808, + PTP_SOFT_CONFIG_Time_S_8125 = 0x680C, + PTP_LOCAL_Time_SUB_NS_8125 = 0x6814, + PTP_LOCAL_Time_NS_8125 = 0x6818, + PTP_LOCAL_Time_S_8125 = 0x681C, + PTP_Time_SHIFTER_S_8125 = 0x6856, + PPS_RISE_TIME_NS_8125 = 0x68A0, + PPS_RISE_TIME_S_8125 = 0x68A4, +}; + +enum RTL8125_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, + RxDU1 = 0x0002, + RxOK1 = 0x0001, + + /* RxStatusDesc */ + RxRWT = (1 << 22), + RxRES = (1 << 21), + RxRUNT = (1 << 20), + RxCRC = (1 << 19), + + RxRWT_V3 = (1 << 18), + RxRES_V3 = (1 << 20), + RxRUNT_V3 = (1 << 19), + RxCRC_V3 = (1 << 17), + + /* 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, + EnableRxDescV3 = (1 << 24), + EnableOuterVlan = (1 << 23), + EnableInnerVlan = (1 << 22), + RxCfg_128_int_en = (1 << 15), + RxCfg_fet_multi_en = (1 << 14), + RxCfg_half_refetch = (1 << 13), + RxCfg_pause_slot_en = (1 << 11), + 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 */ + 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 RTL8125B.*/ + /* Wake up when the cable connection is re-established */ + ECRCEN = (1 << 3), /* This bit is reserved in RTL8125B*/ + Jumbo_En0 = (1 << 2), /* This bit is reserved in RTL8125B*/ + RDY_TO_L23 = (1 << 1), /* This bit is reserved in RTL8125B*/ + Beacon_en = (1 << 0), /* This bit is reserved in RTL8125B*/ + + /* Config4 register */ + Jumbo_En1 = (1 << 1), /* This bit is reserved in RTL8125B*/ + + /* 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# */ + + /* 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 RTL8125B + ASF = (1 << 8),//This bit is reserved in RTL8125C + PktCntrDisable = (1 << 7), + RxVlan = (1 << 6), + RxChkSum = (1 << 5), + Macdbgo_sel = 0x001C, + INTT_0 = 0x0000, + INTT_1 = 0x0001, + INTT_2 = 0x0002, + INTT_3 = 0x0003, + + /* rtl8125_PHYstatus */ + PowerSaveStatus = 0x80, + _2500bpsF = 0x400, + 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_Mask_v2 = 0x7f, + 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), + + /* PTP */ + PTP_ISR_TOK = (1 << 1), + PTP_ISR_TER = (1 << 2), + PTP_EXEC_CMD = (1 << 7), + PTP_ADJUST_TIME_NS_NEGATIVE = (1 << 30), + PTP_ADJUST_TIME_S_NEGATIVE = (1ULL << 48), + + /* New Interrupt Bits */ + INT_CFG0_ENABLE_8125 = (1 << 0), + INT_CFG0_TIMEOUT0_BYPASS_8125 = (1 << 1), + INT_CFG0_MITIGATION_BYPASS_8125 = (1 << 2), + ISRIMR_V2_ROK_Q0 = (1 << 0), + ISRIMR_TOK_Q0 = (1 << 16), + ISRIMR_TOK_Q1 = (1 << 18), + ISRIMR_V2_LINKCHG = (1 << 21), + + /* Magic Number */ + RTL8125_MAGIC_NUMBER = 0x0badbadbadbadbadull, +}; + +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 */ + + DescOwn_V3 = (DescOwn), /* Descriptor is owned by NIC */ + RingEnd_V3 = (RingEnd), /* End of descriptor ring */ + FirstFrag_V3 = (1 << 25), /* First segment of a packet */ + LastFrag_V3 = (1 << 24), /* 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 RTL8125 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 RTL8125 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 RTL8125 only begin @@@@@@*/ + RxUDPT = (1 << 18), + RxTCPT = (1 << 17), + /*@@@@@@ offset 0 of rx descriptor => bits for RTL8125 only end @@@@@@*/ + + /*@@@@@@ offset 4 of rx descriptor => bits for RTL8125 only begin @@@@@@*/ + RxV6F = (1 << 31), + RxV4F = (1 << 30), + /*@@@@@@ offset 4 of rx descriptor => bits for RTL8125 only end @@@@@@*/ + + + PID1_v3 = (1 << 29), /* Protocol ID bit 1/2 */ + PID0_v3 = (1 << 28), /* Protocol ID bit 2/2 */ + +#define RxProtoUDP_v3 (PID1_v3) +#define RxProtoTCP_v3 (PID0_v3) +#define RxProtoIP_v3 (PID1_v3 | PID0_v3) +#define RxProtoMask_v3 RxProtoIP_v3 + + RxIPF_v3 = (1 << 26), /* IP checksum failed */ + RxUDPF_v3 = (1 << 25), /* UDP/IP checksum failed */ + RxTCPF_v3 = (1 << 24), /* TCP/IP checksum failed */ + RxSCTPF_v3 = (1 << 23), /* TCP/IP checksum failed */ + RxVlanTag_v3 = (RxVlanTag), /* VLAN tag available */ + + /*@@@@@@ offset 0 of rx descriptor => bits for RTL8125 only begin @@@@@@*/ + RxUDPT_v3 = (1 << 29), + RxTCPT_v3 = (1 << 28), + RxSCTP_v3 = (1 << 27), + /*@@@@@@ offset 0 of rx descriptor => bits for RTL8125 only end @@@@@@*/ + + /*@@@@@@ offset 4 of rx descriptor => bits for RTL8125 only begin @@@@@@*/ + RxV6F_v3 = (RxV6F), + RxV4F_v3 = (RxV4F), + /*@@@@@@ offset 4 of rx descriptor => bits for RTL8125 only end @@@@@@*/ +}; + +enum features { +// RTL_FEATURE_WOL = (1 << 0), + RTL_FEATURE_MSI = (1 << 1), + RTL_FEATURE_MSIX = (1 << 2), +}; + +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, + EFUSE_SUPPORT_V4, +}; +#define RsvdMask 0x3fffc000 +#define RsvdMaskV3 0x3fff8000 + +struct TxDesc { + u32 opts1; + u32 opts2; + u64 addr; + u32 reserved0; + u32 reserved1; + u32 reserved2; + u32 reserved3; +}; + +struct RxDesc { + u32 opts1; + u32 opts2; + u64 addr; +}; + +struct RxDescV3 { + union { + struct { + u32 rsv1; + u32 rsv2; + } RxDescDDWord1; + }; + + union { + struct { + u32 RSSResult; + u16 HeaderBufferLen; + u16 HeaderInfo; + } RxDescNormalDDWord2; + + struct { + u32 rsv5; + u32 rsv6; + } RxDescDDWord2; + }; + + union { + u64 addr; + + struct { + u32 TimeStampLow; + u32 TimeStampHigh; + } RxDescTimeStamp; + + struct { + u32 rsv8; + u32 rsv9; + } RxDescDDWord3; + }; + + union { + struct { + u32 opts2; + u32 opts1; + } RxDescNormalDDWord4; + + struct { + u16 TimeStampHHigh; + u16 rsv11; + u32 opts1; + } RxDescPTPDDWord4; + }; +}; + +enum rxdesc_type { + RXDESC_TYPE_NORMAL=0, + RXDESC_TYPE_NEXT, + RXDESC_TYPE_PTP, + RXDESC_TYPE_MAX +}; + +//Rx Desc Type +enum rx_desc_ring_type { + RX_DESC_RING_TYPE_UNKNOWN=0, + RX_DESC_RING_TYPE_1, + RX_DESC_RING_TYPE_2, + RX_DESC_RING_TYPE_3, + RX_DESC_RING_TYPE_MAX +}; + +enum rx_desc_len { + RX_DESC_LEN_TYPE_1 = (sizeof(struct RxDesc)), + RX_DESC_LEN_TYPE_3 = (sizeof(struct RxDescV3)) +}; + +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; +}; + +enum r8125_flag { + R8125_FLAG_DOWN = 0, + R8125_FLAG_TASK_RESET_PENDING, + R8125_FLAG_TASK_ESD_CHECK_PENDING, + R8125_FLAG_TASK_LINKCHG_CHECK_PENDING, + R8125_FLAG_MAX +}; + +struct rtl8125_tx_ring { + void* priv; + u32 index; + u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */ + u32 dirty_tx; + struct TxDesc *TxDescArray; /* 256-aligned Tx descriptor ring */ + dma_addr_t TxPhyAddr; + struct ring_info tx_skb[NUM_TX_DESC]; /* Tx data buffers */ + + u32 NextHwDesCloPtr; + u32 BeginHwDesCloPtr; + + u16 hw_clo_ptr_reg; + u16 sw_tail_ptr_reg; + + u16 tdsar_reg; /* Transmit Descriptor Start Address */ +}; + +struct rtl8125_rx_ring { + void* priv; + u32 index; + u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */ + u32 dirty_rx; + struct RxDesc *RxDescArray; /* 256-aligned Rx descriptor ring */ + u64 RxDescPhyAddr[NUM_RX_DESC]; /* Rx desc physical address*/ + dma_addr_t RxPhyAddr; + struct sk_buff *Rx_skbuff[NUM_RX_DESC]; /* Rx data buffers */ + + u16 rdsar_reg; /* Receive Descriptor Start Address */ +}; + +struct r8125_napi { +#ifdef CONFIG_R8125_NAPI +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) + struct napi_struct napi; +#endif +#endif + void* priv; + int index; +}; + +struct r8125_irq { + irq_handler_t handler; + unsigned int vector; + u8 requested; + char name[IFNAMSIZ + 10]; +}; + +#pragma pack(1) +struct rtl8125_regs { + //00 + u8 mac_id[6]; + u16 reg_06; + u8 mar[8]; + //10 + u64 dtccr; + u16 ledsel0; + u16 legreg; + u32 tctr3; + //20 + u32 txq0_dsc_st_addr_0; + u32 txq0_dsc_st_addr_2; + u64 reg_28; + //30 + u16 rit; + u16 ritc; + u16 reg_34; + u8 reg_36; + u8 command; + u32 imr0; + u32 isr0; + //40 + u32 tcr; + u32 rcr; + u32 tctr0; + u32 tctr1; + //50 + u8 cr93c46; + u8 config0; + u8 config1; + u8 config2; + u8 config3; + u8 config4; + u8 config5; + u8 tdfnr; + u32 timer_int0; + u32 timer_int1; + //60 + u32 gphy_mdcmdio; + u32 csidr; + u32 csiar; + u16 phy_status; + u8 config6; + u8 pmch; + //70 + u32 eridr; + u32 eriar; + u16 config7; + u16 reg_7a; + u32 ephy_rxerr_cnt; + //80 + u32 ephy_mdcmdio; + u16 ledsel2; + u16 ledsel1; + u32 tctr2; + u32 timer_int2; + //90 + u8 tppoll0; + u8 reg_91; + u16 reg_92; + u16 led_feature; + u16 ledsel3; + u16 eee_led_config; + u16 reg_9a; + u32 reg_9c; + //a0 + u32 reg_a0; + u32 reg_a4; + u32 reg_a8; + u32 reg_ac; + //b0 + u32 patch_dbg; + u32 reg_b4; + u32 gphy_ocp; + u32 reg_bc; + //c0 + u32 reg_c0; + u32 reg_c4; + u32 reg_c8; + u16 otp_cmd; + u16 otp_pg_config; + //d0 + u16 phy_pwr; + u8 twsi_ctrl; + u8 oob_ctrl; + u16 mac_dbgo; + u16 mac_dbg; + u16 reg_d8; + u16 rms; + u32 efuse_data; + //e0 + u16 cplus_cmd; + u16 reg_e2; + u32 rxq0_dsc_st_addr_0; + u32 rxq0_dsc_st_addr_2; + u16 reg_ec; + u16 tx10midle_cnt; + //f0 + u16 misc0; + u16 misc1; + u32 timer_int3; + u32 cmac_ib; + u16 reg_fc; + u16 sw_rst; +}; +#pragma pack() + +struct rtl8125_regs_save { + union { + u8 mac_io[R8125_MAC_REGS_SIZE]; + + struct rtl8125_regs mac_reg; + }; + u16 pcie_phy[R8125_EPHY_REGS_SIZE/2]; + u16 eth_phy[R8125_PHY_REGS_SIZE/2]; + u32 eri_reg[R8125_ERI_REGS_SIZE/4]; + u32 pci_reg[R8125_PCI_REGS_SIZE/4]; + u16 sw_tail_ptr_reg[R8125_MAX_TX_QUEUES]; + u16 hw_clo_ptr_reg[R8125_MAX_TX_QUEUES]; + + //ktime_t begin_ktime; + //ktime_t end_ktime; + //u64 duration_ns; + + u16 sw0_tail_ptr; + u16 next_hwq0_clo_ptr; + u16 sw1_tail_ptr; + u16 next_hwq1_clo_ptr; + + u16 int_miti_rxq0; + u16 int_miti_txq0; + u16 int_miti_rxq1; + u16 int_miti_txq1; + u8 int_config; + u32 imr_new; + u32 isr_new; + + u8 tdu_status; + u16 rdu_status; + + u16 tc_mode; + + u32 txq1_dsc_st_addr_0; + u32 txq1_dsc_st_addr_2; + + u32 pla_tx_q0_idle_credit; + u32 pla_tx_q1_idle_credit; + + u32 rxq1_dsc_st_addr_0; + u32 rxq1_dsc_st_addr_2; + + u32 rss_ctrl; + u8 rss_key[RTL8125_RSS_KEY_SIZE]; + u8 rss_i_table[RTL8125_MAX_INDIRECTION_TABLE_ENTRIES]; + u16 rss_queue_num_sel_r; +}; + +struct rtl8125_counters { + /* legacy */ + 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; + + /* extended */ + u64 tx_octets; + u64 rx_octets; + u64 rx_multicast64; + u64 tx_unicast64; + u64 tx_broadcast64; + u64 tx_multicast64; + u32 tx_pause_on; + u32 tx_pause_off; + u32 tx_pause_all; + u32 tx_deferred; + u32 tx_late_collision; + u32 tx_all_collision; + u32 tx_aborted32; + u32 align_errors32; + u32 rx_frame_too_long; + u32 rx_runt; + u32 rx_pause_on; + u32 rx_pause_off; + u32 rx_pause_all; + u32 rx_unknown_opcode; + u32 rx_mac_error; + u32 tx_underrun32; + u32 rx_mac_missed; + u32 rx_tcam_dropped; + u32 tdu; + u32 rdu; +}; + +/* Flow Control Settings */ +enum rtl8125_fc_mode { + rtl8125_fc_none = 0, + rtl8125_fc_rx_pause, + rtl8125_fc_tx_pause, + rtl8125_fc_full, + rtl8125_fc_default +}; + +struct rtl8125_private { + void __iomem *mmio_addr; /* memory map physical address */ + struct pci_dev *pci_dev; /* Index of PCI device */ + struct net_device *dev; + struct r8125_napi r8125napi[R8125_MAX_MSIX_VEC]; + struct r8125_irq irq_tbl[R8125_MAX_MSIX_VEC]; + unsigned int irq_nvecs; + unsigned int max_irq_nvecs; + unsigned int min_irq_nvecs; + //struct msix_entry msix_entries[R8125_MAX_MSIX_VEC]; + 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; + //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[NUM_RX_DESC]; /* Rx data buffers */ + //struct ring_info tx_skb[NUM_TX_DESC]; /* Tx data buffers */ + unsigned rx_buf_sz; + u16 HwSuppNumTxQueues; + u16 HwSuppNumRxQueues; + unsigned int num_tx_rings; + unsigned int num_rx_rings; + struct rtl8125_tx_ring tx_ring[R8125_MAX_TX_QUEUES]; + struct rtl8125_rx_ring rx_ring[R8125_MAX_RX_QUEUES]; +#ifdef ENABLE_LIB_SUPPORT + struct atomic_notifier_head lib_nh; + struct rtl8125_ring lib_tx_ring[R8125_MAX_TX_QUEUES]; + struct rtl8125_ring lib_rx_ring[R8125_MAX_RX_QUEUES]; +#endif + //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 rtl8125_rx_config; + u16 cp_cmd; + u32 intr_mask; + u32 timer_intr_mask; + u16 isr_reg[R8125_MAX_QUEUES]; + u16 imr_reg[R8125_MAX_QUEUES]; + int phy_auto_nego_reg; + int phy_1000_ctrl_reg; + int phy_2500_ctrl_reg; + u8 org_mac_addr[NODE_ADDRESS_SIZE]; + struct rtl8125_counters *tally_vaddr; + dma_addr_t tally_paddr; + +#ifdef CONFIG_R8125_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 rtl8125_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 reset_task; + struct work_struct esd_task; + struct work_struct linkchg_task; +#else + struct delayed_work reset_task; + struct delayed_work esd_task; + struct delayed_work linkchg_task; +#endif + DECLARE_BITMAP(task_flags, R8125_FLAG_MAX); + 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; + + u8 RequirePhyMdiSwapPatch; + + u8 RequireLSOPatch; + + u32 HwFiberModeVer; + u32 HwFiberStat; + u8 HwSwitchMdiToFiber; + + u16 NicCustLedValue; + + u8 HwSuppMagicPktVer; + + u8 HwSuppLinkChgWakeUpVer; + + u8 HwSuppCheckPhyDisableModeVer; + + u8 random_mac; + + u16 phy_reg_aner; + u16 phy_reg_anlpar; + u16 phy_reg_gbsr; + u16 phy_reg_status_2500; + + u32 HwPcieSNOffset; + + u8 HwSuppTxNoCloseVer; + u8 EnableTxNoClose; + + u8 HwSuppIsrVer; + u8 HwCurrIsrVer; + + u8 HwSuppIntMitiVer; + + u8 HwSuppExtendTallyCounterVer; + + u8 check_keep_link_speed; + u8 resume_not_chg_speed; + + u8 HwSuppD0SpeedUpVer; + u8 D0SpeedUpSpeed; + + u8 ring_lib_enabled; + + const char *fw_name; + struct rtl8125_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 *UnalignedSendToFwBufferVa; + void *SendToFwBuffer; + u64 SendToFwBufferPhy; + u8 SendingToFw; + dma_addr_t UnalignedSendToFwBufferPa; + PTX_DASH_SEND_FW_DESC TxDashSendFwDesc; + u64 TxDashSendFwDescPhy; + u8 *UnalignedTxDashSendFwDescVa; + u32 SizeOfTxDashSendFwDescMemAlloc; + u32 SizeOfTxDashSendFwDesc; + u32 NumTxDashSendFwDesc; + u32 CurrNumTxDashSendFwDesc; + u32 LastSendNumTxDashSendFwDesc; + dma_addr_t UnalignedTxDashSendFwDescPa; + + u32 NumRecvFromFwBuffer; + u32 SizeOfRecvFromFwBuffer; + u32 SizeOfRecvFromFwBufferMemAlloc; + void *RecvFromFwBuffer; + u64 RecvFromFwBufferPhy; + + void *UnalignedRecvFromFwBufferVa; + dma_addr_t UnalignedRecvFromFwBufferPa; + PRX_DASH_FROM_FW_DESC RxDashRecvFwDesc; + u64 RxDashRecvFwDescPhy; + u8 *UnalignedRxDashRecvFwDescVa; + u32 SizeOfRxDashRecvFwDescMemAlloc; + u32 SizeOfRxDashRecvFwDesc; + u32 NumRxDashRecvFwDesc; + u32 CurrNumRxDashRecvFwDesc; + dma_addr_t UnalignedRxDashRecvFwDescPa; + 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 + + struct ethtool_eee eee; + +#ifdef ENABLE_R8125_PROCFS + //Procfs support + struct proc_dir_entry *proc_dir; +#endif + u8 InitRxDescType; + u16 RxDescLength; //V1 16 Byte V2 32 Bytes + u32 RxDescRingLength; + + u8 HwSuppPtpVer; + u8 EnablePtp; + u8 ptp_master_mode; + s64 ptp_adjust; +#ifdef ENABLE_PTP_SUPPORT + u32 tx_hwtstamp_timeouts; + u32 tx_hwtstamp_skipped; + struct work_struct ptp_tx_work; + struct sk_buff *ptp_tx_skb; + struct hwtstamp_config hwtstamp_config; + unsigned long ptp_tx_start; + struct ptp_clock_info ptp_clock_info; + struct ptp_clock *ptp_clock; +#endif + + u8 HwSuppRssVer; + u8 EnableRss; + u16 HwSuppIndirTblEntries; +#ifdef ENABLE_RSS_SUPPORT + u32 rss_flags; + /* Receive Side Scaling settings */ + u8 rss_key[RTL8125_RSS_KEY_SIZE]; + u8 rss_indir_tbl[RTL8125_MAX_INDIRECTION_TABLE_ENTRIES]; + u32 rss_options; +#endif +}; + +#ifdef ENABLE_LIB_SUPPORT +static inline unsigned int +rtl8125_num_lib_tx_rings(struct rtl8125_private *tp) +{ + int count, i; + + for (count = 0, i = tp->num_tx_rings; i < tp->HwSuppNumTxQueues; i++) + if(tp->lib_tx_ring[i].enabled) + count++; + + return count; +} + +static inline unsigned int +rtl8125_num_lib_rx_rings(struct rtl8125_private *tp) +{ + int count, i; + + for (count = 0, i = tp->num_rx_rings; i < tp->HwSuppNumRxQueues; i++) + if(tp->lib_rx_ring[i].enabled) + count++; + + return count; +} + +#else +static inline unsigned int +rtl8125_num_lib_tx_rings(struct rtl8125_private *tp) +{ + return 0; +} + +static inline unsigned int +rtl8125_num_lib_rx_rings(struct rtl8125_private *tp) +{ + return 0; +} +#endif + +static inline unsigned int +rtl8125_tot_tx_rings(struct rtl8125_private *tp) +{ + return tp->num_tx_rings + rtl8125_num_lib_tx_rings(tp); +} + +static inline unsigned int +rtl8125_tot_rx_rings(struct rtl8125_private *tp) +{ + return tp->num_rx_rings + rtl8125_num_lib_rx_rings(tp); +} + +enum eetype { + EEPROM_TYPE_NONE=0, + EEPROM_TYPE_93C46, + EEPROM_TYPE_93C56, + EEPROM_TWSI +}; + +enum mcfg { + CFG_METHOD_2=2, + CFG_METHOD_3, + CFG_METHOD_4, + CFG_METHOD_5, + CFG_METHOD_DEFAULT, + CFG_METHOD_MAX +}; + +#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 0x7fU +#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) +#define WAKEUP_MAGIC_PACKET_V3 (3) + +//Ram Code Version +#define NIC_RAMCODE_VERSION_CFG_METHOD_2 (0x0b11) +#define NIC_RAMCODE_VERSION_CFG_METHOD_3 (0x0b33) +#define NIC_RAMCODE_VERSION_CFG_METHOD_4 (0x0b17) +#define NIC_RAMCODE_VERSION_CFG_METHOD_5 (0x0b55) + +//hwoptimize +#define HW_PATCH_SOC_LAN (BIT_0) +#define HW_PATCH_SAMSUNG_LAN_DONGLE (BIT_2) + +static const u16 other_q_intr_mask = (RxOK1 | RxDU1); + +void rtl8125_mdio_write(struct rtl8125_private *tp, u16 RegAddr, u16 value); +void rtl8125_mdio_prot_write(struct rtl8125_private *tp, u32 RegAddr, u32 value); +void rtl8125_mdio_prot_direct_write_phy_ocp(struct rtl8125_private *tp, u32 RegAddr, u32 value); +u32 rtl8125_mdio_read(struct rtl8125_private *tp, u16 RegAddr); +u32 rtl8125_mdio_prot_read(struct rtl8125_private *tp, u32 RegAddr); +u32 rtl8125_mdio_prot_direct_read_phy_ocp(struct rtl8125_private *tp, u32 RegAddr); +void rtl8125_ephy_write(struct rtl8125_private *tp, int RegAddr, int value); +void rtl8125_mac_ocp_write(struct rtl8125_private *tp, u16 reg_addr, u16 value); +u32 rtl8125_mac_ocp_read(struct rtl8125_private *tp, u16 reg_addr); +void rtl8125_clear_eth_phy_bit(struct rtl8125_private *tp, u8 addr, u16 mask); +void rtl8125_set_eth_phy_bit(struct rtl8125_private *tp, u8 addr, u16 mask); +void rtl8125_ocp_write(struct rtl8125_private *tp, u16 addr, u8 len, u32 data); +void rtl8125_oob_notify(struct rtl8125_private *tp, u8 cmd); +void rtl8125_init_ring_indexes(struct rtl8125_private *tp); +int rtl8125_eri_write(struct rtl8125_private *tp, int addr, int len, u32 value, int type); +void rtl8125_oob_mutex_lock(struct rtl8125_private *tp); +u32 rtl8125_ocp_read(struct rtl8125_private *tp, u16 addr, u8 len); +u32 rtl8125_ocp_read_with_oob_base_address(struct rtl8125_private *tp, u16 addr, u8 len, u32 base_address); +u32 rtl8125_ocp_write_with_oob_base_address(struct rtl8125_private *tp, u16 addr, u8 len, u32 value, u32 base_address); +u32 rtl8125_eri_read(struct rtl8125_private *tp, int addr, int len, int type); +u32 rtl8125_eri_read_with_oob_base_address(struct rtl8125_private *tp, int addr, int len, int type, u32 base_address); +int rtl8125_eri_write(struct rtl8125_private *tp, int addr, int len, u32 value, int type); +int rtl8125_eri_write_with_oob_base_address(struct rtl8125_private *tp, int addr, int len, u32 value, int type, u32 base_address); +u16 rtl8125_ephy_read(struct rtl8125_private *tp, int RegAddr); +void rtl8125_wait_txrx_fifo_empty(struct net_device *dev); +void rtl8125_enable_now_is_oob(struct rtl8125_private *tp); +void rtl8125_disable_now_is_oob(struct rtl8125_private *tp); +void rtl8125_oob_mutex_unlock(struct rtl8125_private *tp); +void rtl8125_dash2_disable_tx(struct rtl8125_private *tp); +void rtl8125_dash2_enable_tx(struct rtl8125_private *tp); +void rtl8125_dash2_disable_rx(struct rtl8125_private *tp); +void rtl8125_dash2_enable_rx(struct rtl8125_private *tp); +void rtl8125_hw_disable_mac_mcu_bps(struct net_device *dev); +void rtl8125_mark_to_asic(struct rtl8125_private *tp, struct RxDesc *desc, u32 rx_buf_sz); + +static inline void +rtl8125_make_unusable_by_asic(struct rtl8125_private *tp, + struct RxDesc *desc) +{ + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) { + ((struct RxDescV3 *)desc)->addr = RTL8125_MAGIC_NUMBER; + ((struct RxDescV3 *)desc)->RxDescNormalDDWord4.opts1 &= ~cpu_to_le32(DescOwn | RsvdMaskV3); + } else { + desc->addr = RTL8125_MAGIC_NUMBER; + desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask); + } +} + +static inline struct RxDesc* +rtl8125_get_rxdesc(struct rtl8125_private *tp, struct RxDesc *RxDescBase, u32 const cur_rx) +{ + return (struct RxDesc*)((u8*)RxDescBase + (cur_rx * tp->RxDescLength)); +} + +static inline void +rtl8125_disable_hw_interrupt_v2(struct rtl8125_private *tp, + u32 message_id) +{ + RTL_W32(tp, IMR_V2_CLEAR_REG_8125, BIT(message_id)); +} + +static inline void +rtl8125_enable_hw_interrupt_v2(struct rtl8125_private *tp, u32 message_id) +{ + RTL_W32(tp, IMR_V2_SET_REG_8125, BIT(message_id)); +} + +int rtl8125_open(struct net_device *dev); +int rtl8125_close(struct net_device *dev); +void rtl8125_hw_config(struct net_device *dev); +void rtl8125_hw_set_timer_int_8125(struct rtl8125_private *tp, u32 message_id, u8 timer_intmiti_val); +void rtl8125_set_rx_q_num(struct rtl8125_private *tp, unsigned int num_rx_queues); +void rtl8125_set_tx_q_num(struct rtl8125_private *tp, unsigned int num_tx_queues); +void rtl8125_hw_start(struct net_device *dev); +void rtl8125_hw_reset(struct net_device *dev); +void rtl8125_tx_clear(struct rtl8125_private *tp); +void rtl8125_rx_clear(struct rtl8125_private *tp); +int rtl8125_init_ring(struct net_device *dev); +void rtl8125_hw_set_rx_packet_filter(struct net_device *dev); +void rtl8125_enable_hw_linkchg_interrupt(struct rtl8125_private *tp); +int rtl8125_dump_tally_counter(struct rtl8125_private *tp, dma_addr_t paddr); + +#ifndef ENABLE_LIB_SUPPORT +static inline void rtl8125_lib_reset_prepare(struct rtl8125_private *tp) { } +static inline void rtl8125_lib_reset_complete(struct rtl8125_private *tp) { } +#endif + +#define HW_SUPPORT_CHECK_PHY_DISABLE_MODE(_M) ((_M)->HwSuppCheckPhyDisableModeVer > 0 ) +#define HW_HAS_WRITE_PHY_MCU_RAM_CODE(_M) (((_M)->HwHasWrRamCodeToMicroP == TRUE) ? 1 : 0) +#define HW_SUPPORT_D0_SPEED_UP(_M) ((_M)->HwSuppD0SpeedUpVer > 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 + +#endif /* __R8125_H */ diff --git a/r8125/src/r8125_dash.h b/r8125/src/r8125_dash.h new file mode 100755 index 000000000..f86d4255a --- /dev/null +++ b/r8125/src/r8125_dash.h @@ -0,0 +1,261 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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_R8125_DASH_H +#define _LINUX_R8125_DASH_H + +#include + +#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 { + u16 length; + u8 statusLowByte; + u8 statusHighByte; + u32 resv; + u64 BufferAddress; +} +RX_DASH_FROM_FW_DESC, *PRX_DASH_FROM_FW_DESC; + +typedef struct _TX_DASH_SEND_FW_DESC { + u16 length; + u8 statusLowByte; + u8 statusHighByte; + u32 resv; + u64 BufferAddress; +} +TX_DASH_SEND_FW_DESC, *PTX_DASH_SEND_FW_DESC; + +typedef struct _OSOOBHdr { + u32 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 (1520) +#define SEND_TO_FW_BUF_SIZE (1520) + +#define RX_DASH_FROM_FW_OWN BIT_15 +#define TX_DASH_SEND_FW_OWN BIT_15 +#define TX_DASH_SEND_FW_OWN_HIGHBYTE BIT_7 + +#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 rtl8125_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_R8125_DASH_H */ diff --git a/r8125/src/r8125_firmware.c b/r8125/src/r8125_firmware.c new file mode 100755 index 000000000..ac4ea626b --- /dev/null +++ b/r8125/src/r8125_firmware.c @@ -0,0 +1,264 @@ +// 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) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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 +#include +#include + +#include "r8125_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[RTL8125_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 rtl8125_fw_phy_action, code[0]) + +static bool rtl8125_fw_format_ok(struct rtl8125_fw *rtl_fw) +{ + const struct firmware *fw = rtl_fw->fw; + struct fw_info *fw_info = (struct fw_info *)fw->data; + struct rtl8125_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, RTL8125_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, RTL8125_VER_SIZE); + + pa->code = (__le32 *)fw->data; + pa->size = fw->size / FW_OPCODE_SIZE; + } + + return true; +} + +static bool rtl8125_fw_data_ok(struct rtl8125_fw *rtl_fw) +{ + struct rtl8125_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 rtl8125_fw_write_firmware(struct rtl8125_private *tp, struct rtl8125_fw *rtl_fw) +{ + struct rtl8125_fw_phy_action *pa = &rtl_fw->phy_action; + rtl8125_fw_write_t fw_write = rtl_fw->phy_write; + rtl8125_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 rtl8125_fw_release_firmware(struct rtl8125_fw *rtl_fw) +{ + release_firmware(rtl_fw->fw); +} + +int rtl8125_fw_request_firmware(struct rtl8125_fw *rtl_fw) +{ + int rc; + + rc = request_firmware(&rtl_fw->fw, rtl_fw->fw_name, rtl_fw->dev); + if (rc < 0) + goto out; + + if (!rtl8125_fw_format_ok(rtl_fw) || !rtl8125_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/r8125/src/r8125_firmware.h b/r8125/src/r8125_firmware.h new file mode 100755 index 000000000..1961be5d5 --- /dev/null +++ b/r8125/src/r8125_firmware.h @@ -0,0 +1,68 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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_rtl8125_FIRMWARE_H +#define _LINUX_rtl8125_FIRMWARE_H + +#include +#include + +struct rtl8125_private; +typedef void (*rtl8125_fw_write_t)(struct rtl8125_private *tp, u16 reg, u16 val); +typedef u32 (*rtl8125_fw_read_t)(struct rtl8125_private *tp, u16 reg); + +#define RTL8125_VER_SIZE 32 + +struct rtl8125_fw { + rtl8125_fw_write_t phy_write; + rtl8125_fw_read_t phy_read; + rtl8125_fw_write_t mac_mcu_write; + rtl8125_fw_read_t mac_mcu_read; + const struct firmware *fw; + const char *fw_name; + struct device *dev; + + char version[RTL8125_VER_SIZE]; + + struct rtl8125_fw_phy_action { + __le32 *code; + size_t size; + } phy_action; +}; + +int rtl8125_fw_request_firmware(struct rtl8125_fw *rtl_fw); +void rtl8125_fw_release_firmware(struct rtl8125_fw *rtl_fw); +void rtl8125_fw_write_firmware(struct rtl8125_private *tp, struct rtl8125_fw *rtl_fw); + +#endif /* _LINUX_rtl8125_FIRMWARE_H */ diff --git a/r8125/src/r8125_n.c b/r8125/src/r8125_n.c new file mode 100755 index 000000000..fd96e8f8e --- /dev/null +++ b/r8125/src/r8125_n.c @@ -0,0 +1,15150 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) +#include +#include +#endif +#include +#include +#include +#include + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) +#include +#endif +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,37) +#include +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) +#define dev_printk(A,B,fmt,args...) printk(A fmt,##args) +#else +#include +#include +#endif + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) +#include +#endif + +#include +#include + +#include "r8125.h" +#include "rtl_eeprom.h" +#include "rtltool.h" +#include "r8125_firmware.h" + +#ifdef ENABLE_R8125_PROCFS +#include +#include +#endif + +#define FIRMWARE_8125A_3 "rtl_nic/rtl8125a-3.fw" +#define FIRMWARE_8125B_2 "rtl_nic/rtl8125b-2.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_2] = {"RTL8125A" }, + [CFG_METHOD_3] = {"RTL8125A", FIRMWARE_8125A_3}, + [CFG_METHOD_4] = {"RTL8125B", }, + [CFG_METHOD_5] = {"RTL8125B", FIRMWARE_8125B_2}, + [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("RTL8125A", + CFG_METHOD_2, + BIT_30 | EnableInnerVlan | EnableOuterVlan | (RX_DMA_BURST << RxCfgDMAShift), + 0xff7e5880, + Jumbo_Frame_9k), + + _R("RTL8125A", + CFG_METHOD_3, + BIT_30 | EnableInnerVlan | EnableOuterVlan | (RX_DMA_BURST << RxCfgDMAShift), + 0xff7e5880, + Jumbo_Frame_9k), + + _R("RTL8125B", + CFG_METHOD_4, + BIT_30 | RxCfg_pause_slot_en | EnableInnerVlan | EnableOuterVlan | (RX_DMA_BURST << RxCfgDMAShift), + 0xff7e5880, + Jumbo_Frame_9k), + + _R("RTL8125B", + CFG_METHOD_5, + BIT_30 | RxCfg_pause_slot_en | EnableInnerVlan | EnableOuterVlan | (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 rtl8125_pci_tbl[] = { + { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8125), }, + { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x3000), }, + {0,}, +}; + +MODULE_DEVICE_TABLE(pci, rtl8125_pci_tbl); + +static int rx_copybreak = 0; +static int use_dac = 1; +static int timer_count = 0x2600; +static int timer_count_v2 = (0x2600 / 0x100); + +static struct { + u32 msg_enable; +} debug = { -1 }; + +static unsigned int speed_mode = SPEED_2500; +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 | + ADVERTISED_2500baseX_Full; +#ifdef CONFIG_ASPM +static int aspm = 1; +#else +static int 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 +#ifdef ENABLE_TX_NO_CLOSE +static int tx_no_close_enable = 1; +#else +static int tx_no_close_enable = 0; +#endif +#ifdef ENABLE_PTP_MASTER_MODE +static int enable_ptp_master_mode = 1; +#else +static int enable_ptp_master_mode = 0; +#endif +#ifdef DISABLE_PM_SUPPORT +static int disable_pm_support = 1; +#else +static int disable_pm_support = 0; +#endif + +MODULE_AUTHOR("Realtek and the Linux r8125 crew "); +MODULE_DESCRIPTION("Realtek RTL8125 2.5Gigabit 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(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(tx_no_close_enable, int, 0); +MODULE_PARM_DESC(tx_no_close_enable, "Enable TX No Close."); + +module_param(enable_ptp_master_mode, int, 0); +MODULE_PARM_DESC(enable_ptp_master_mode, "Enable PTP Master Mode."); + +module_param(disable_pm_support, int, 0); +MODULE_PARM_DESC(disable_pm_support, "Disable PM support."); + +#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_8125A_3); +MODULE_FIRMWARE(FIRMWARE_8125B_2); +#endif + +MODULE_VERSION(RTL8125_VERSION); + +/* +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) +static void rtl8125_esd_timer(unsigned long __opaque); +#else +static void rtl8125_esd_timer(struct timer_list *t); +#endif +*/ +/* +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) +static void rtl8125_link_timer(unsigned long __opaque); +#else +static void rtl8125_link_timer(struct timer_list *t); +#endif +*/ + +static netdev_tx_t rtl8125_start_xmit(struct sk_buff *skb, struct net_device *dev); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static irqreturn_t rtl8125_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +#else +static irqreturn_t rtl8125_interrupt(int irq, void *dev_instance); +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static irqreturn_t rtl8125_interrupt_msix(int irq, void *dev_instance, struct pt_regs *regs); +#else +static irqreturn_t rtl8125_interrupt_msix(int irq, void *dev_instance); +#endif +static void rtl8125_set_rx_mode(struct net_device *dev); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) +static void rtl8125_tx_timeout(struct net_device *dev, unsigned int txqueue); +#else +static void rtl8125_tx_timeout(struct net_device *dev); +#endif +static struct net_device_stats *rtl8125_get_stats(struct net_device *dev); +static int rtl8125_rx_interrupt(struct net_device *, struct rtl8125_private *, struct rtl8125_rx_ring *, napi_budget); +static int rtl8125_tx_interrupt(struct rtl8125_tx_ring *ring, int budget); +static int rtl8125_tx_interrupt_with_vector(struct rtl8125_private *tp, const int message_id, int budget); +static int rtl8125_change_mtu(struct net_device *dev, int new_mtu); +static void rtl8125_down(struct net_device *dev); + +static int rtl8125_set_mac_address(struct net_device *dev, void *p); +static void rtl8125_rar_set(struct rtl8125_private *tp, uint8_t *addr); +static void rtl8125_desc_addr_fill(struct rtl8125_private *); +static void rtl8125_tx_desc_init(struct rtl8125_private *tp); +static void rtl8125_rx_desc_init(struct rtl8125_private *tp); + +static u32 mdio_direct_read_phy_ocp(struct rtl8125_private *tp, u16 RegAddr); +static u16 rtl8125_get_hw_phy_mcu_code_ver(struct rtl8125_private *tp); +static void rtl8125_phy_power_up(struct net_device *dev); +static void rtl8125_phy_power_down(struct net_device *dev); +static int rtl8125_set_speed(struct net_device *dev, u8 autoneg, u32 speed, u8 duplex, u32 adv); +static bool rtl8125_set_phy_mcu_patch_request(struct rtl8125_private *tp); +static bool rtl8125_clear_phy_mcu_patch_request(struct rtl8125_private *tp); + +#ifdef CONFIG_R8125_NAPI +static int rtl8125_poll(napi_ptr napi, napi_budget budget); +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) +static void rtl8125_reset_task(void *_data); +static void rtl8125_esd_task(void *_data); +static void rtl8125_linkchg_task(void *_data); +#else +static void rtl8125_reset_task(struct work_struct *work); +static void rtl8125_esd_task(struct work_struct *work); +static void rtl8125_linkchg_task(struct work_struct *work); +#endif +static void rtl8125_schedule_reset_work(struct rtl8125_private *tp); +static void rtl8125_schedule_esd_work(struct rtl8125_private *tp); +static void rtl8125_schedule_linkchg_work(struct rtl8125_private *tp); +static void rtl8125_init_all_schedule_work(struct rtl8125_private *tp); +static void rtl8125_cancel_all_schedule_work(struct rtl8125_private *tp); + +static inline struct device *tp_to_dev(struct rtl8125_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 + +#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) + +static u32 rtl8125_read_thermal_sensor(struct rtl8125_private *tp) +{ + u16 ts_digout; + + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + ts_digout = mdio_direct_read_phy_ocp(tp, 0xBD84); + ts_digout &= 0x3ff; + break; + default: + ts_digout = 0xffff; + break; + } + + return ts_digout; +} + +int rtl8125_dump_tally_counter(struct rtl8125_private *tp, dma_addr_t paddr) +{ + u32 cmd; + u32 WaitCnt; + int retval = -1; + + 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; + } + + if (WaitCnt <= 20) + retval = 0; + + return retval; +} + +#ifdef ENABLE_R8125_PROCFS +/**************************************************************************** +* -----------------------------PROCFS STUFF------------------------- +***************************************************************************** +*/ + +static struct proc_dir_entry *rtl8125_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 rtl8125_private *tp = netdev_priv(dev); + + seq_puts(m, "\nDump Driver Variable\n"); + + rtnl_lock(); + + seq_puts(m, "Variable\tValue\n----------\t-----\n"); + seq_printf(m, "MODULENAME\t%s\n", MODULENAME); + seq_printf(m, "driver version\t%s\n", RTL8125_VERSION); + seq_printf(m, "mcfg\t%d\n", tp->mcfg); + 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", NUM_RX_DESC); + seq_printf(m, "cur_rx0\t0x%x\n", tp->rx_ring[0].cur_rx); + seq_printf(m, "dirty_rx0\t0x%x\n", tp->rx_ring[0].dirty_rx); + seq_printf(m, "cur_rx1\t0x%x\n", tp->rx_ring[1].cur_rx); + seq_printf(m, "dirty_rx1\t0x%x\n", tp->rx_ring[1].dirty_rx); + seq_printf(m, "cur_rx2\t0x%x\n", tp->rx_ring[2].cur_rx); + seq_printf(m, "dirty_rx2\t0x%x\n", tp->rx_ring[2].dirty_rx); + seq_printf(m, "cur_rx3\t0x%x\n", tp->rx_ring[3].cur_rx); + seq_printf(m, "dirty_rx3\t0x%x\n", tp->rx_ring[3].dirty_rx); + seq_printf(m, "NUM_TX_DESC\t0x%x\n", NUM_TX_DESC); + seq_printf(m, "cur_tx0\t0x%x\n", tp->tx_ring[0].cur_tx); + seq_printf(m, "dirty_tx0\t0x%x\n", tp->tx_ring[0].dirty_tx); + seq_printf(m, "cur_tx1\t0x%x\n", tp->tx_ring[1].cur_tx); + seq_printf(m, "dirty_tx1\t0x%x\n", tp->tx_ring[1].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, "rtl8125_rx_config\t0x%x\n", tp->rtl8125_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, "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.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, "HwSuppLinkChgWakeUpVer\t0x%x\n", tp->HwSuppLinkChgWakeUpVer); + seq_printf(m, "HwSuppD0SpeedUpVer\t0x%x\n", tp->HwSuppD0SpeedUpVer); + seq_printf(m, "D0SpeedUpSpeed\t0x%x\n", tp->D0SpeedUpSpeed); + seq_printf(m, "HwSuppCheckPhyDisableModeVer\t0x%x\n", tp->HwSuppCheckPhyDisableModeVer); + seq_printf(m, "HwPkgDet\t0x%x\n", tp->HwPkgDet); + seq_printf(m, "HwSuppTxNoCloseVer\t0x%x\n", tp->HwSuppTxNoCloseVer); + seq_printf(m, "EnableTxNoClose\t0x%x\n", tp->EnableTxNoClose); + seq_printf(m, "NextHwDesCloPtr0\t0x%x\n", tp->tx_ring[0].NextHwDesCloPtr); + seq_printf(m, "BeginHwDesCloPtr0\t0x%x\n", tp->tx_ring[0].BeginHwDesCloPtr); + seq_printf(m, "NextHwDesCloPtr1\t0x%x\n", tp->tx_ring[1].NextHwDesCloPtr); + seq_printf(m, "BeginHwDesCloPtr1\t0x%x\n", tp->tx_ring[1].BeginHwDesCloPtr); + seq_printf(m, "InitRxDescType\t0x%x\n", tp->InitRxDescType); + seq_printf(m, "RxDescLength\t0x%x\n", tp->RxDescLength); + seq_printf(m, "num_rx_rings\t0x%x\n", tp->num_rx_rings); + seq_printf(m, "num_tx_rings\t0x%x\n", tp->num_tx_rings); + seq_printf(m, "tot_rx_rings\t0x%x\n", rtl8125_tot_rx_rings(tp)); + seq_printf(m, "tot_tx_rings\t0x%x\n", rtl8125_tot_tx_rings(tp)); + seq_printf(m, "EnableRss\t0x%x\n", tp->EnableRss); + seq_printf(m, "EnablePtp\t0x%x\n", tp->EnablePtp); + seq_printf(m, "ptp_master_mode\t0x%x\n", tp->ptp_master_mode); + seq_printf(m, "min_irq_nvecs\t0x%x\n", tp->min_irq_nvecs); + seq_printf(m, "irq_nvecs\t0x%x\n", tp->irq_nvecs); + seq_printf(m, "ring_lib_enabled\t0x%x\n", tp->ring_lib_enabled); + seq_printf(m, "HwSuppIsrVer\t0x%x\n", tp->HwSuppIsrVer); + seq_printf(m, "HwCurrIsrVer\t0x%x\n", tp->HwCurrIsrVer); +#ifdef ENABLE_PTP_SUPPORT + seq_printf(m, "tx_hwtstamp_timeouts\t0x%x\n", tp->tx_hwtstamp_timeouts); + seq_printf(m, "tx_hwtstamp_skipped\t0x%x\n", tp->tx_hwtstamp_skipped); +#endif + 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); + + rtnl_unlock(); + + 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 rtl8125_private *tp = netdev_priv(dev); + struct rtl8125_counters *counters; + dma_addr_t paddr; + + seq_puts(m, "\nDump Tally Counter\n"); + + rtnl_lock(); + + counters = tp->tally_vaddr; + paddr = tp->tally_paddr; + if (!counters) { + seq_puts(m, "\nDump Tally Counter Fail\n"); + goto out_unlock; + } + + rtl8125_dump_tally_counter(tp, paddr); + + 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_printf(m, "tx_octets\t%lld\n", le64_to_cpu(counters->tx_octets)); + seq_printf(m, "rx_octets\t%lld\n", le64_to_cpu(counters->rx_octets)); + seq_printf(m, "rx_multicast64\t%lld\n", le64_to_cpu(counters->rx_multicast64)); + seq_printf(m, "tx_unicast64\t%lld\n", le64_to_cpu(counters->tx_unicast64)); + seq_printf(m, "tx_broadcast64\t%lld\n", le64_to_cpu(counters->tx_broadcast64)); + seq_printf(m, "tx_multicast64\t%lld\n", le64_to_cpu(counters->tx_multicast64)); + seq_printf(m, "tx_pause_on\t%d\n", le32_to_cpu(counters->tx_pause_on)); + seq_printf(m, "tx_pause_off\t%d\n", le32_to_cpu(counters->tx_pause_off)); + seq_printf(m, "tx_pause_all\t%d\n", le32_to_cpu(counters->tx_pause_all)); + seq_printf(m, "tx_deferred\t%d\n", le32_to_cpu(counters->tx_deferred)); + seq_printf(m, "tx_late_collision\t%d\n", le32_to_cpu(counters->tx_late_collision)); + seq_printf(m, "tx_all_collision\t%d\n", le32_to_cpu(counters->tx_all_collision)); + seq_printf(m, "tx_aborted32\t%d\n", le32_to_cpu(counters->tx_aborted32)); + seq_printf(m, "align_errors32\t%d\n", le32_to_cpu(counters->align_errors32)); + seq_printf(m, "rx_frame_too_long\t%d\n", le32_to_cpu(counters->rx_frame_too_long)); + seq_printf(m, "rx_runt\t%d\n", le32_to_cpu(counters->rx_runt)); + seq_printf(m, "rx_pause_on\t%d\n", le32_to_cpu(counters->rx_pause_on)); + seq_printf(m, "rx_pause_off\t%d\n", le32_to_cpu(counters->rx_pause_off)); + seq_printf(m, "rx_pause_all\t%d\n", le32_to_cpu(counters->rx_pause_all)); + seq_printf(m, "rx_unknown_opcode\t%d\n", le32_to_cpu(counters->rx_unknown_opcode)); + seq_printf(m, "rx_mac_error\t%d\n", le32_to_cpu(counters->rx_mac_error)); + seq_printf(m, "tx_underrun32\t%d\n", le32_to_cpu(counters->tx_underrun32)); + seq_printf(m, "rx_mac_missed\t%d\n", le32_to_cpu(counters->rx_mac_missed)); + seq_printf(m, "rx_tcam_dropped\t%d\n", le32_to_cpu(counters->rx_tcam_dropped)); + seq_printf(m, "tdu\t%d\n", le32_to_cpu(counters->tdu)); + seq_printf(m, "rdu\t%d\n", le32_to_cpu(counters->rdu)); + + seq_putc(m, '\n'); + +out_unlock: + rtnl_unlock(); + + return 0; +} + +static int proc_get_registers(struct seq_file *m, void *v) +{ + struct net_device *dev = m->private; + int i, n, max = R8125_MAC_REGS_SIZE; + u8 byte_rd; + struct rtl8125_private *tp = netdev_priv(dev); + void __iomem *ioaddr = tp->mmio_addr; + + seq_puts(m, "\nDump MAC Registers\n"); + seq_puts(m, "Offset\tValue\n------\t-----\n"); + + rtnl_lock(); + + 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); + } + } + + rtnl_unlock(); + + 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 = R8125_EPHY_REGS_SIZE/2; + u16 word_rd; + struct rtl8125_private *tp = netdev_priv(dev); + + seq_puts(m, "\nDump PCIE PHY\n"); + seq_puts(m, "\nOffset\tValue\n------\t-----\n "); + + rtnl_lock(); + + for (n = 0; n < max;) { + seq_printf(m, "\n0x%02x:\t", n); + + for (i = 0; i < 8 && n < max; i++, n++) { + word_rd = rtl8125_ephy_read(tp, n); + seq_printf(m, "%04x ", word_rd); + } + } + + rtnl_unlock(); + + 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 = R8125_PHY_REGS_SIZE/2; + u16 word_rd; + struct rtl8125_private *tp = netdev_priv(dev); + + seq_puts(m, "\nDump Ethernet PHY\n"); + seq_puts(m, "\nOffset\tValue\n------\t-----\n "); + + rtnl_lock(); + + seq_puts(m, "\n####################page 0##################\n "); + rtl8125_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 = rtl8125_mdio_read(tp, n); + seq_printf(m, "%04x ", word_rd); + } + } + + rtnl_unlock(); + + 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 = R8125_ERI_REGS_SIZE; + u32 dword_rd; + struct rtl8125_private *tp = netdev_priv(dev); + + seq_puts(m, "\nDump Extended Registers\n"); + seq_puts(m, "\nOffset\tValue\n------\t-----\n "); + + rtnl_lock(); + + for (n = 0; n < max;) { + seq_printf(m, "\n0x%02x:\t", n); + + for (i = 0; i < 4 && n < max; i++, n+=4) { + dword_rd = rtl8125_eri_read(tp, n, 4, ERIAR_ExGMAC); + seq_printf(m, "%08x ", dword_rd); + } + } + + rtnl_unlock(); + + 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 = R8125_PCI_REGS_SIZE; + u32 dword_rd; + struct rtl8125_private *tp = netdev_priv(dev); + + seq_puts(m, "\nDump PCI Registers\n"); + seq_puts(m, "\nOffset\tValue\n------\t-----\n "); + + rtnl_lock(); + + 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); + + rtnl_unlock(); + + seq_putc(m, '\n'); + return 0; +} + +static int proc_get_temperature(struct seq_file *m, void *v) +{ + struct net_device *dev = m->private; + struct rtl8125_private *tp = netdev_priv(dev); + u16 ts_digout, tj, fah; + + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + seq_puts(m, "\nChip Temperature\n"); + break; + default: + seq_puts(m, "\nThis Chip Does Not Support Dump Temperature\n"); + break; + } + + rtnl_lock(); + ts_digout = rtl8125_read_thermal_sensor(tp); + rtnl_unlock(); + + tj = ts_digout / 2; + if (ts_digout <= 512) { + tj = ts_digout / 2; + seq_printf(m, "Cel:%d\n", tj); + fah = tj * (9/5) + 32; + seq_printf(m, "Fah:%d\n", fah); + } else { + tj = (512 - ((ts_digout / 2) - 512)) / 2; + seq_printf(m, "Cel:-%d\n", tj); + fah = tj * (9/5) + 32; + seq_printf(m, "Fah:-%d\n", fah); + } + + 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 rtl8125_private *tp = netdev_priv(dev); + int len = 0; + + len += snprintf(page + len, count - len, + "\nDump Driver Driver\n"); + + rtnl_lock(); + + 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" + "mcfg\t%d\n" + "chipset\t%d\n" + "chipset_name\t%s\n" + "mtu\t%d\n" + "NUM_RX_DESC\t0x%x\n" + "cur_rx0\t0x%x\n" + "dirty_rx0\t0x%x\n" + "cur_rx1\t0x%x\n" + "dirty_rx1\t0x%x\n" + "cur_rx2\t0x%x\n" + "dirty_rx2\t0x%x\n" + "cur_rx3\t0x%x\n" + "dirty_rx3\t0x%x\n" + "NUM_TX_DESC\t0x%x\n" + "cur_tx0\t0x%x\n" + "dirty_tx0\t0x%x\n" + "cur_tx1\t0x%x\n" + "dirty_tx1\t0x%x\n" + "rx_buf_sz\t0x%x\n" + "esd_flag\t0x%x\n" + "pci_cfg_is_read\t0x%x\n" + "rtl8125_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" + "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" + "HwSuppLinkChgWakeUpVer\t0x%x\n" + "HwSuppD0SpeedUpVer\t0x%x\n" + "D0SpeedUpSpeed\t0x%x\n" + "HwSuppCheckPhyDisableModeVer\t0x%x\n" + "HwPkgDet\t0x%x\n" + "HwSuppTxNoCloseVer\t0x%x\n" + "EnableTxNoClose\t0x%x\n" + "NextHwDesCloPtr0\t0x%x\n" + "BeginHwDesCloPtr0\t0x%x\n" + "NextHwDesCloPtr1\t0x%x\n" + "BeginHwDesCloPtr1\t0x%x\n" + "InitRxDescType\t0x%x\n" + "RxDescLength\t0x%x\n" + "num_rx_rings\t0x%x\n" + "num_tx_rings\t0x%x\n" + "tot_rx_rings\t0x%x\n" + "tot_tx_rings\t0x%x\n" + "EnableRss\t0x%x\n" + "EnablePtp\t0x%x\n" + "ptp_master_mode\t0x%x\n" + "min_irq_nvecs\t0x%x\n" + "irq_nvecs\t0x%x\n" + "ring_lib_enabled\t0x%x\n" + "HwSuppIsrVer\t0x%x\n" + "HwCurrIsrVer\t0x%x\n" +#ifdef ENABLE_PTP_SUPPORT + "tx_hwtstamp_timeouts\t0x%x\n" + "tx_hwtstamp_skipped\t0x%x\n" +#endif + "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, + RTL8125_VERSION, + tp->mcfg, + tp->chipset, + rtl_chip_info[tp->chipset].name, + dev->mtu, + NUM_RX_DESC, + tp->rx_ring[0].cur_rx, + tp->rx_ring[0].dirty_rx, + tp->rx_ring[1].cur_rx, + tp->rx_ring[1].dirty_rx, + tp->rx_ring[2].cur_rx, + tp->rx_ring[2].dirty_rx, + tp->rx_ring[3].cur_rx, + tp->rx_ring[3].dirty_rx, + NUM_TX_DESC, + tp->tx_ring[0].cur_tx, + tp->tx_ring[0].dirty_tx, + tp->tx_ring[1].cur_tx, + tp->tx_ring[1].dirty_tx, + tp->rx_buf_sz, + tp->esd_flag, + tp->pci_cfg_is_read, + tp->rtl8125_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->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.eee_enabled, + hwoptimize, + proc_init_num, + s0_magic_packet, + tp->HwSuppMagicPktVer, + tp->HwSuppLinkChgWakeUpVer, + tp->HwSuppD0SpeedUpVer, + tp->D0SpeedUpSpeed, + tp->HwSuppCheckPhyDisableModeVer, + tp->HwPkgDet, + tp->HwSuppTxNoCloseVer, + tp->EnableTxNoClose, + tp->tx_ring[0].NextHwDesCloPtr, + tp->tx_ring[0].BeginHwDesCloPtr, + tp->tx_ring[1].NextHwDesCloPtr, + tp->tx_ring[1].BeginHwDesCloPtr, + tp->InitRxDescType, + tp->RxDescLength, + tp->num_rx_rings, + tp->num_tx_rings, + tp->tot_rx_rings, + tp->tot_tx_rings, + tp->EnableRss, + tp->EnablePtp, + tp->ptp_master_mode, + tp->min_irq_nvecs, + tp->irq_nvecs, + tp->ring_lib_enabled, + tp->HwSuppIsrVer, + tp->HwCurrIsrVer, +#ifdef ENABLE_PTP_SUPPORT + tp->tx_hwtstamp_timeouts, + tp->tx_hwtstamp_skipped, +#endif + tp->random_mac, + tp->org_mac_addr, +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) + dev->perm_addr, +#endif + dev->dev_addr + ); + + rtnl_unlock(); + + 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 rtl8125_private *tp = netdev_priv(dev); + struct rtl8125_counters *counters; + dma_addr_t paddr; + int len = 0; + + len += snprintf(page + len, count - len, + "\nDump Tally Counter\n"); + + rtnl_lock(); + + counters = tp->tally_vaddr; + paddr = tp->tally_paddr; + if (!counters) { + len += snprintf(page + len, count - len, + "\nDump Tally Counter Fail\n"); + goto out_unlock; + } + + rtl8125_dump_tally_counter(tp, paddr); + + 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", + + "tx_octets\t%lld\n", + "rx_octets\t%lld\n", + "rx_multicast64\t%lld\n", + "tx_unicast64\t%lld\n", + "tx_broadcast64\t%lld\n", + "tx_multicast64\t%lld\n", + "tx_pause_on\t%d\n", + "tx_pause_off\t%d\n", + "tx_pause_all\t%d\n", + "tx_deferred\t%d\n", + "tx_late_collision\t%d\n", + "tx_all_collision\t%d\n", + "tx_aborted32\t%d\n", + "align_errors32\t%d\n", + "rx_frame_too_long\t%d\n", + "rx_runt\t%d\n", + "rx_pause_on\t%d\n", + "rx_pause_off\t%d\n", + "rx_pause_all\t%d\n", + "rx_unknown_opcode\t%d\n", + "rx_mac_error\t%d\n", + "tx_underrun32\t%d\n", + "rx_mac_missed\t%d\n", + "rx_tcam_dropped\t%d\n", + "tdu\t%d\n", + "rdu\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), + + le64_to_cpu(counters->tx_octets), + le64_to_cpu(counters->rx_octets), + le64_to_cpu(counters->rx_multicast64), + le64_to_cpu(counters->tx_unicast64), + le64_to_cpu(counters->tx_broadcast64), + le64_to_cpu(counters->tx_multicast64), + le32_to_cpu(counters->tx_pause_on), + le32_to_cpu(counters->tx_pause_off), + le32_to_cpu(counters->tx_pause_all), + le32_to_cpu(counters->tx_deferred), + le32_to_cpu(counters->tx_late_collision), + le32_to_cpu(counters->tx_all_collision), + le32_to_cpu(counters->tx_aborted32), + le32_to_cpu(counters->align_errors32), + le32_to_cpu(counters->rx_frame_too_long), + le32_to_cpu(counters->rx_runt), + le32_to_cpu(counters->rx_pause_on), + le32_to_cpu(counters->rx_pause_off), + le32_to_cpu(counters->rx_pause_all), + le32_to_cpu(counters->rx_unknown_opcode), + le32_to_cpu(counters->rx_mac_error), + le32_to_cpu(counters->tx_underrun32), + le32_to_cpu(counters->rx_mac_missed), + le32_to_cpu(counters->rx_tcam_dropped), + le32_to_cpu(counters->tdu), + le32_to_cpu(counters->rdu), + ); + + len += snprintf(page + len, count - len, "\n"); +out_unlock: + rtnl_unlock(); + + *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 = R8125_MAC_REGS_SIZE; + u8 byte_rd; + struct rtl8125_private *tp = netdev_priv(dev); + void __iomem *ioaddr = tp->mmio_addr; + int len = 0; + + len += snprintf(page + len, count - len, + "\nDump MAC Registers\n" + "Offset\tValue\n------\t-----\n"); + + rtnl_lock(); + + 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); + } + } + + rtnl_unlock(); + + 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 = R8125_EPHY_REGS_SIZE/2; + u16 word_rd; + struct rtl8125_private *tp = netdev_priv(dev); + int len = 0; + + len += snprintf(page + len, count - len, + "\nDump PCIE PHY\n" + "Offset\tValue\n------\t-----\n"); + + rtnl_lock(); + + 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 = rtl8125_ephy_read(tp, n); + len += snprintf(page + len, count - len, + "%04x ", + word_rd); + } + } + + rtnl_unlock(); + + 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 = R8125_PHY_REGS_SIZE/2; + u16 word_rd; + struct rtl8125_private *tp = netdev_priv(dev); + int len = 0; + + len += snprintf(page + len, count - len, + "\nDump Ethernet PHY\n" + "Offset\tValue\n------\t-----\n"); + + rtnl_lock(); + + len += snprintf(page + len, count - len, + "\n####################page 0##################\n"); + rtl8125_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 = rtl8125_mdio_read(tp, n); + len += snprintf(page + len, count - len, + "%04x ", + word_rd); + } + } + + rtnl_unlock(); + + 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 = R8125_ERI_REGS_SIZE; + u32 dword_rd; + struct rtl8125_private *tp = netdev_priv(dev); + int len = 0; + + len += snprintf(page + len, count - len, + "\nDump Extended Registers\n" + "Offset\tValue\n------\t-----\n"); + + rtnl_lock(); + + 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 = rtl8125_eri_read(tp, n, 4, ERIAR_ExGMAC); + len += snprintf(page + len, count - len, + "%08x ", + dword_rd); + } + } + + rtnl_unlock(); + + len += snprintf(page + len, count - len, "\n"); + + *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 = R8125_PCI_REGS_SIZE; + u32 dword_rd; + struct rtl8125_private *tp = netdev_priv(dev); + int len = 0; + + len += snprintf(page + len, count - len, + "\nDump PCI Registers\n" + "Offset\tValue\n------\t-----\n"); + + rtnl_lock(); + + 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); + + rtnl_unlock(); + + len += snprintf(page + len, count - len, "\n"); + + *eof = 1; + return len; +} + +static int proc_get_temperature(char *page, char **start, + off_t offset, int count, + int *eof, void *data) +{ + struct net_device *dev = data; + struct rtl8125_private *tp = netdev_priv(dev); + u16 ts_digout, tj, fah; + int len = 0; + + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + len += snprintf(page + len, count - len, + "\nChip Temperature\n"); + break; + default: + len += snprintf(page + len, count - len, + "\nThis Chip Does Not Support Dump Temperature\n"); + break; + } + + rtnl_lock(); + ts_digout = rtl8125_read_thermal_sensor(tp); + rtnl_unlock(); + + tj = ts_digout / 2; + if (ts_digout <= 512) { + tj = ts_digout / 2; + len += snprintf(page + len, count - len, + "Cel:%d\n", + tj); + fah = tj * (9/5) + 32; + len += snprintf(page + len, count - len, + "Fah:%d\n", + fah); + + } else { + tj = (512 - ((ts_digout / 2) - 512)) / 2; + len += snprintf(page + len, count - len, + "Cel:-%d\n", + tj); + fah = tj * (9/5) + 32; + len += snprintf(page + len, count - len, + "Fah:-%d\n", + fah); + } + + len += snprintf(page + len, count - len, "\n"); + + *eof = 1; + return len; +} +#endif +static void rtl8125_proc_module_init(void) +{ + //create /proc/net/r8125 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32) + rtl8125_proc = proc_mkdir(MODULENAME, init_net.proc_net); +#else + rtl8125_proc = proc_mkdir(MODULENAME, proc_net); +#endif + if (!rtl8125_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 rtl8125_proc_open(struct inode *inode, struct file *file) +{ + struct net_device *dev = proc_get_parent_data(inode); + int (*show)(struct seq_file *, void *) = PDE_DATA(inode); + + return single_open(file, show, dev); +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) +static const struct proc_ops rtl8125_proc_fops = { + .proc_open = rtl8125_proc_open, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else +static const struct file_operations rtl8125_proc_fops = { + .open = rtl8125_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + +#endif + +/* + * Table of proc files we need to create. + */ +struct rtl8125_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 rtl8125_proc_file rtl8125_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 }, + { "temp", &proc_get_temperature }, + { "", NULL } +}; + +static void rtl8125_proc_init(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + const struct rtl8125_proc_file *f; + struct proc_dir_entry *dir; + + if (rtl8125_proc && !tp->proc_dir) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + dir = proc_mkdir_data(dev->name, 0, rtl8125_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 = rtl8125_proc_files; f->name[0]; f++) { + if (!proc_create_data(f->name, S_IFREG | S_IRUGO, dir, + &rtl8125_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, rtl8125_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 = rtl8125_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 rtl8125_proc_remove(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (tp->proc_dir) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + remove_proc_subtree(dev->name, rtl8125_proc); + proc_init_num--; + +#else + const struct rtl8125_proc_file *f; + struct rtl8125_private *tp = netdev_priv(dev); + + for (f = rtl8125_proc_files; f->name[0]; f++) + remove_proc_entry(f->name, tp->proc_dir); + + remove_proc_entry(dev->name, rtl8125_proc); + proc_init_num--; +#endif + tp->proc_dir = NULL; + } +} + +#endif //ENABLE_R8125_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 rtl8125_private *tp, + u16 RegAddr, + u16 value) +{ + u32 data32; + int i; + +#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; + } +} + +static void mdio_direct_write_phy_ocp(struct rtl8125_private *tp, + u16 RegAddr, + u16 value) +{ + if (tp->rtk_enable_diag) return; + + mdio_real_direct_write_phy_ocp(tp, RegAddr, value); +} + +/* +static void rtl8125_mdio_write_phy_ocp(struct rtl8125_private *tp, + u16 PageNum, + u32 RegAddr, + u32 value) +{ + u16 ocp_addr; + + ocp_addr = map_phy_ocp_addr(PageNum, RegAddr); + + mdio_direct_write_phy_ocp(tp, ocp_addr, value); +} +*/ + +static void rtl8125_mdio_real_write_phy_ocp(struct rtl8125_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 rtl8125_private *tp, + u16 RegAddr, + u16 value) +{ + if (RegAddr == 0x1F) { + tp->cur_page = value; + return; + } + rtl8125_mdio_real_write_phy_ocp(tp, tp->cur_page, RegAddr, value); +} + +void rtl8125_mdio_write(struct rtl8125_private *tp, + u16 RegAddr, + u16 value) +{ + if (tp->rtk_enable_diag) return; + + mdio_real_write(tp, RegAddr, value); +} + +void rtl8125_mdio_prot_write(struct rtl8125_private *tp, + u32 RegAddr, + u32 value) +{ + mdio_real_write(tp, RegAddr, value); +} + +void rtl8125_mdio_prot_direct_write_phy_ocp(struct rtl8125_private *tp, + u32 RegAddr, + u32 value) +{ + mdio_real_direct_write_phy_ocp(tp, RegAddr, value); +} + +static u32 mdio_real_direct_read_phy_ocp(struct rtl8125_private *tp, + u16 RegAddr) +{ + u32 data32; + int i, value = 0; + +#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; + + return value; +} + +static u32 mdio_direct_read_phy_ocp(struct rtl8125_private *tp, + u16 RegAddr) +{ + if (tp->rtk_enable_diag) return 0xffffffff; + + return mdio_real_direct_read_phy_ocp(tp, RegAddr); +} + +/* +static u32 rtl8125_mdio_read_phy_ocp(struct rtl8125_private *tp, + u16 PageNum, + u32 RegAddr) +{ + u16 ocp_addr; + + ocp_addr = map_phy_ocp_addr(PageNum, RegAddr); + + return mdio_direct_read_phy_ocp(tp, ocp_addr); +} +*/ + +static u32 rtl8125_mdio_real_read_phy_ocp(struct rtl8125_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); +} + +static u32 mdio_real_read(struct rtl8125_private *tp, + u16 RegAddr) +{ + return rtl8125_mdio_real_read_phy_ocp(tp, tp->cur_page, RegAddr); +} + +u32 rtl8125_mdio_read(struct rtl8125_private *tp, + u16 RegAddr) +{ + if (tp->rtk_enable_diag) return 0xffffffff; + + return mdio_real_read(tp, RegAddr); +} + +u32 rtl8125_mdio_prot_read(struct rtl8125_private *tp, + u32 RegAddr) +{ + return mdio_real_read(tp, RegAddr); +} + +u32 rtl8125_mdio_prot_direct_read_phy_ocp(struct rtl8125_private *tp, + u32 RegAddr) +{ + return mdio_real_direct_read_phy_ocp(tp, RegAddr); +} + +static void ClearAndSetEthPhyBit(struct rtl8125_private *tp, u8 addr, u16 clearmask, u16 setmask) +{ + u16 PhyRegValue; + + PhyRegValue = rtl8125_mdio_read(tp, addr); + PhyRegValue &= ~clearmask; + PhyRegValue |= setmask; + rtl8125_mdio_write(tp, addr, PhyRegValue); +} + +void rtl8125_clear_eth_phy_bit(struct rtl8125_private *tp, u8 addr, u16 mask) +{ + ClearAndSetEthPhyBit(tp, + addr, + mask, + 0 + ); +} + +void rtl8125_set_eth_phy_bit(struct rtl8125_private *tp, u8 addr, u16 mask) +{ + ClearAndSetEthPhyBit(tp, + addr, + 0, + mask + ); +} + +static void ClearAndSetEthPhyOcpBit(struct rtl8125_private *tp, u16 addr, u16 clearmask, u16 setmask) +{ + u16 PhyRegValue; + + PhyRegValue = mdio_direct_read_phy_ocp(tp, addr); + PhyRegValue &= ~clearmask; + PhyRegValue |= setmask; + mdio_direct_write_phy_ocp(tp, addr, PhyRegValue); +} + +void ClearEthPhyOcpBit(struct rtl8125_private *tp, u16 addr, u16 mask) +{ + ClearAndSetEthPhyOcpBit(tp, + addr, + mask, + 0 + ); +} + +void SetEthPhyOcpBit(struct rtl8125_private *tp, u16 addr, u16 mask) +{ + ClearAndSetEthPhyOcpBit(tp, + addr, + 0, + mask + ); +} + +void rtl8125_mac_ocp_write(struct rtl8125_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); +} + +u32 rtl8125_mac_ocp_read(struct rtl8125_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 rtl8125_private *tp, u16 reg, u16 value) +{ + if (reg == 0x1f) { + tp->ocp_base = value << 4; + return; + } + + rtl8125_mac_ocp_write(tp, tp->ocp_base + reg, value); +} + +static u32 mac_mcu_read(struct rtl8125_private *tp, u16 reg) +{ + return rtl8125_mac_ocp_read(tp, tp->ocp_base + reg); +} +#endif + +static void +ClearAndSetMcuAccessRegBit( + struct rtl8125_private *tp, + u16 addr, + u16 clearmask, + u16 setmask +) +{ + u16 PhyRegValue; + + PhyRegValue = rtl8125_mac_ocp_read(tp, addr); + PhyRegValue &= ~clearmask; + PhyRegValue |= setmask; + rtl8125_mac_ocp_write(tp, addr, PhyRegValue); +} + +static void +ClearMcuAccessRegBit( + struct rtl8125_private *tp, + u16 addr, + u16 mask +) +{ + ClearAndSetMcuAccessRegBit(tp, + addr, + mask, + 0 + ); +} + +static void +SetMcuAccessRegBit( + struct rtl8125_private *tp, + u16 addr, + u16 mask +) +{ + ClearAndSetMcuAccessRegBit(tp, + addr, + 0, + mask + ); +} + +u32 rtl8125_ocp_read_with_oob_base_address(struct rtl8125_private *tp, u16 addr, u8 len, const u32 base_address) +{ + return rtl8125_eri_read_with_oob_base_address(tp, addr, len, ERIAR_OOB, base_address); +} + +u32 rtl8125_ocp_read(struct rtl8125_private *tp, u16 addr, u8 len) +{ + u32 value = 0; + + if (HW_DASH_SUPPORT_TYPE_2(tp)) + value = rtl8125_ocp_read_with_oob_base_address(tp, addr, len, NO_BASE_ADDRESS); + else if (HW_DASH_SUPPORT_TYPE_3(tp)) + value = rtl8125_ocp_read_with_oob_base_address(tp, addr, len, RTL8168FP_OOBMAC_BASE); + + return value; +} + +u32 rtl8125_ocp_write_with_oob_base_address(struct rtl8125_private *tp, u16 addr, u8 len, u32 value, const u32 base_address) +{ + return rtl8125_eri_write_with_oob_base_address(tp, addr, len, value, ERIAR_OOB, base_address); +} + +void rtl8125_ocp_write(struct rtl8125_private *tp, u16 addr, u8 len, u32 value) +{ + if (HW_DASH_SUPPORT_TYPE_2(tp)) + rtl8125_ocp_write_with_oob_base_address(tp, addr, len, value, NO_BASE_ADDRESS); + else if (HW_DASH_SUPPORT_TYPE_3(tp)) + rtl8125_ocp_write_with_oob_base_address(tp, addr, len, value, RTL8168FP_OOBMAC_BASE); +} + +void rtl8125_oob_mutex_lock(struct rtl8125_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_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + default: + ocp_reg_mutex_oob = 0x110; + ocp_reg_mutex_ib = 0x114; + ocp_reg_mutex_prio = 0x11C; + break; + } + + rtl8125_ocp_write(tp, ocp_reg_mutex_ib, 1, BIT_0); + reg_16 = rtl8125_ocp_read(tp, ocp_reg_mutex_oob, 1); + wait_cnt_0 = 0; + while(reg_16) { + reg_a0 = rtl8125_ocp_read(tp, ocp_reg_mutex_prio, 1); + if (reg_a0) { + rtl8125_ocp_write(tp, ocp_reg_mutex_ib, 1, 0x00); + reg_a0 = rtl8125_ocp_read(tp, ocp_reg_mutex_prio, 1); + wait_Cnt_1 = 0; + while(reg_a0) { + reg_a0 = rtl8125_ocp_read(tp, ocp_reg_mutex_prio, 1); + + wait_Cnt_1++; + + if (wait_Cnt_1 > 2000) + break; + }; + rtl8125_ocp_write(tp, ocp_reg_mutex_ib, 1, BIT_0); + + } + reg_16 = rtl8125_ocp_read(tp, ocp_reg_mutex_oob, 1); + + wait_cnt_0++; + + if (wait_cnt_0 > 2000) + break; + }; +} + +void rtl8125_oob_mutex_unlock(struct rtl8125_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_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + default: + ocp_reg_mutex_oob = 0x110; + ocp_reg_mutex_ib = 0x114; + ocp_reg_mutex_prio = 0x11C; + break; + } + + rtl8125_ocp_write(tp, ocp_reg_mutex_prio, 1, BIT_0); + rtl8125_ocp_write(tp, ocp_reg_mutex_ib, 1, 0x00); +} + +void rtl8125_oob_notify(struct rtl8125_private *tp, u8 cmd) +{ + rtl8125_eri_write(tp, 0xE8, 1, cmd, ERIAR_ExGMAC); + + rtl8125_ocp_write(tp, 0x30, 1, 0x01); +} + +static int rtl8125_check_dash(struct rtl8125_private *tp) +{ + if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) { + if (rtl8125_ocp_read(tp, 0x128, 1) & BIT_0) + return 1; + } + + return 0; +} + +void rtl8125_dash2_disable_tx(struct rtl8125_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 rtl8125_dash2_enable_tx(struct rtl8125_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 rtl8125_dash2_disable_rx(struct rtl8125_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 rtl8125_dash2_enable_rx(struct rtl8125_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 rtl8125_dash2_disable_txrx(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) { + rtl8125_dash2_disable_tx( tp ); + rtl8125_dash2_disable_rx( tp ); + } +} + +static void rtl8125_driver_start(struct rtl8125_private *tp) +{ + if (!tp->DASH) + return; + + if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) { + int timeout; + u32 tmp_value; + + rtl8125_ocp_write(tp, 0x180, 1, OOB_CMD_DRIVER_START); + tmp_value = rtl8125_ocp_read(tp, 0x30, 1); + tmp_value |= BIT_0; + rtl8125_ocp_write(tp, 0x30, 1, tmp_value); + + for (timeout = 0; timeout < 10; timeout++) { + mdelay(10); + if (rtl8125_ocp_read(tp, 0x124, 1) & BIT_0) + break; + } + } +} + +static void rtl8125_driver_stop(struct rtl8125_private *tp) +{ + if (!tp->DASH) + return; + + if (HW_DASH_SUPPORT_TYPE_2(tp) || HW_DASH_SUPPORT_TYPE_3(tp)) { + struct net_device *dev = tp->dev; + int timeout; + u32 tmp_value; + + rtl8125_dash2_disable_txrx(dev); + + rtl8125_ocp_write(tp, 0x180, 1, OOB_CMD_DRIVER_STOP); + tmp_value = rtl8125_ocp_read(tp, 0x30, 1); + tmp_value |= BIT_0; + rtl8125_ocp_write(tp, 0x30, 1, tmp_value); + + for (timeout = 0; timeout < 10; timeout++) { + mdelay(10); + if (!(rtl8125_ocp_read(tp, 0x124, 1) & BIT_0)) + break; + } + } +} + +void rtl8125_ephy_write(struct rtl8125_private *tp, int RegAddr, int value) +{ + int i; + + RTL_W32(tp, EPHYAR, + EPHYAR_Write | + (RegAddr & EPHYAR_Reg_Mask_v2) << EPHYAR_Reg_shift | + (value & EPHYAR_Data_Mask)); + + for (i = 0; i < 10; i++) { + udelay(100); + + /* Check if the RTL8125 has completed EPHY write */ + if (!(RTL_R32(tp, EPHYAR) & EPHYAR_Flag)) + break; + } + + udelay(20); +} + +u16 rtl8125_ephy_read(struct rtl8125_private *tp, int RegAddr) +{ + int i; + u16 value = 0xffff; + + RTL_W32(tp, EPHYAR, + EPHYAR_Read | (RegAddr & EPHYAR_Reg_Mask_v2) << EPHYAR_Reg_shift); + + for (i = 0; i < 10; i++) { + udelay(100); + + /* Check if the RTL8125 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 rtl8125_private *tp, u8 addr, u16 clearmask, u16 setmask) +{ + u16 EphyValue; + + EphyValue = rtl8125_ephy_read(tp, addr); + EphyValue &= ~clearmask; + EphyValue |= setmask; + rtl8125_ephy_write(tp, addr, EphyValue); +} + +static void ClearPCIePhyBit(struct rtl8125_private *tp, u8 addr, u16 mask) +{ + ClearAndSetPCIePhyBit( tp, + addr, + mask, + 0 + ); +} + +static void SetPCIePhyBit( struct rtl8125_private *tp, u8 addr, u16 mask) +{ + ClearAndSetPCIePhyBit( tp, + addr, + 0, + mask + ); +} + +static u32 +rtl8125_csi_other_fun_read(struct rtl8125_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_DEFAULT) + 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 RTL8125 has completed CSI read */ + if (RTL_R32(tp, CSIAR) & CSIAR_Flag) { + value = (u32)RTL_R32(tp, CSIDR); + break; + } + } + + udelay(20); + + return value; +} + +static void +rtl8125_csi_other_fun_write(struct rtl8125_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_DEFAULT) + 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 RTL8125 has completed CSI write */ + if (!(RTL_R32(tp, CSIAR) & CSIAR_Flag)) + break; + } + + udelay(20); +} + +static u32 +rtl8125_csi_read(struct rtl8125_private *tp, + u32 addr) +{ + u8 multi_fun_sel_bit; + + multi_fun_sel_bit = 0; + + return rtl8125_csi_other_fun_read(tp, multi_fun_sel_bit, addr); +} + +static void +rtl8125_csi_write(struct rtl8125_private *tp, + u32 addr, + u32 value) +{ + u8 multi_fun_sel_bit; + + multi_fun_sel_bit = 0; + + rtl8125_csi_other_fun_write(tp, multi_fun_sel_bit, addr, value); +} + +static u8 +rtl8125_csi_fun0_read_byte(struct rtl8125_private *tp, + u32 addr) +{ + u8 RetVal = 0; + + if (tp->mcfg == CFG_METHOD_DEFAULT) { + struct pci_dev *pdev = tp->pci_dev; + + pci_read_config_byte(pdev, addr, &RetVal); + } else { + u32 TmpUlong; + u16 RegAlignAddr; + u8 ShiftByte; + + RegAlignAddr = addr & ~(0x3); + ShiftByte = addr & (0x3); + TmpUlong = rtl8125_csi_other_fun_read(tp, 0, addr); + TmpUlong >>= (8*ShiftByte); + RetVal = (u8)TmpUlong; + } + + udelay(20); + + return RetVal; +} + +static void +rtl8125_csi_fun0_write_byte(struct rtl8125_private *tp, + u32 addr, + u8 value) +{ + if (tp->mcfg == CFG_METHOD_DEFAULT) { + struct pci_dev *pdev = tp->pci_dev; + + pci_write_config_byte(pdev, addr, value); + } else { + u32 TmpUlong; + u16 RegAlignAddr; + u8 ShiftByte; + + RegAlignAddr = addr & ~(0x3); + ShiftByte = addr & (0x3); + TmpUlong = rtl8125_csi_other_fun_read(tp, 0, RegAlignAddr); + TmpUlong &= ~(0xFF << (8*ShiftByte)); + TmpUlong |= (value << (8*ShiftByte)); + rtl8125_csi_other_fun_write( tp, 0, RegAlignAddr, TmpUlong ); + } + + udelay(20); +} + +u32 rtl8125_eri_read_with_oob_base_address(struct rtl8125_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 RTL8125 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 rtl8125_eri_read(struct rtl8125_private *tp, int addr, int len, int type) +{ + return rtl8125_eri_read_with_oob_base_address(tp, addr, len, type, 0); +} + +int rtl8125_eri_write_with_oob_base_address(struct rtl8125_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 = rtl8125_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 RTL8125 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 rtl8125_eri_write(struct rtl8125_private *tp, int addr, int len, u32 value, int type) +{ + return rtl8125_eri_write_with_oob_base_address(tp, addr, len, value, type, NO_BASE_ADDRESS); +} + +static void +rtl8125_enable_rxdvgate(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_3); + mdelay(2); + break; + } +} + +static void +rtl8125_disable_rxdvgate(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_3); + mdelay(2); + break; + } +} + +static u8 +rtl8125_is_gpio_low(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u8 gpio_low = FALSE; + + switch (tp->HwSuppCheckPhyDisableModeVer) { + case 3: + if (!(rtl8125_mac_ocp_read(tp, 0xDC04) & BIT_13)) + gpio_low = TRUE; + break; + } + + if (gpio_low) + dprintk("gpio is low.\n"); + + return gpio_low; +} + +static u8 +rtl8125_is_phy_disable_mode_enabled(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u8 phy_disable_mode_enabled = FALSE; + + switch (tp->HwSuppCheckPhyDisableModeVer) { + 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 +rtl8125_is_in_phy_disable_mode(struct net_device *dev) +{ + u8 in_phy_disable_mode = FALSE; + + if (rtl8125_is_phy_disable_mode_enabled(dev) && rtl8125_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; +} + +static bool +rtl8125_stop_all_request(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int i; + + RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + for (i = 0; i < 20; i++) { + udelay(10); + if (!(RTL_R8(tp, ChipCmd) & StopReq)) break; + } + + if (i == 20) + return 0; + break; + } + + return 1; +} + +void +rtl8125_wait_txrx_fifo_empty(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int i; + + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_stop_all_request(dev); + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + for (i = 0; i < 3000; i++) { + udelay(50); + if ((RTL_R8(tp, MCUCmd_reg) & (Txfifo_empty | Rxfifo_empty)) == (Txfifo_empty | Rxfifo_empty)) + break; + } + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + for (i = 0; i < 3000; i++) { + udelay(50); + if ((RTL_R16(tp, IntrMitigate) & (BIT_0 | BIT_1 | BIT_8)) == (BIT_0 | BIT_1 | BIT_8)) + break; + } + break; + } +} + +#ifdef ENABLE_DASH_SUPPORT + +static inline void +rtl8125_enable_dash2_interrupt(struct rtl8125_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 +rtl8125_disable_dash2_interrupt(struct rtl8125_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 + +void +rtl8125_enable_hw_linkchg_interrupt(struct rtl8125_private *tp) +{ + switch (tp->HwCurrIsrVer) { + case 2: + RTL_W32(tp, IMR_V2_SET_REG_8125, ISRIMR_V2_LINKCHG); + break; + case 1: + RTL_W32(tp, tp->imr_reg[0], LinkChg | RTL_R32(tp, tp->imr_reg[0])); + break; + } + +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) + rtl8125_enable_dash2_interrupt(tp); +#endif +} + +static inline void +rtl8125_enable_hw_interrupt(struct rtl8125_private *tp) +{ + switch (tp->HwCurrIsrVer) { + case 2: + RTL_W32(tp, IMR_V2_SET_REG_8125, tp->intr_mask); + break; + case 1: + RTL_W32(tp, tp->imr_reg[0], tp->intr_mask); + + if (R8125_MULTI_RX_Q(tp)) { + int i; + for (i=1; inum_rx_rings; i++) + RTL_W16(tp, tp->imr_reg[i], other_q_intr_mask); + } + break; + } + +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) + rtl8125_enable_dash2_interrupt(tp); +#endif +} + +static inline void rtl8125_clear_hw_isr_v2(struct rtl8125_private *tp, + u32 message_id) +{ + RTL_W32(tp, ISR_V2_8125, BIT(message_id)); +} + +static inline void +rtl8125_disable_hw_interrupt(struct rtl8125_private *tp) +{ + if (tp->HwCurrIsrVer == 2) { + RTL_W32(tp, IMR_V2_CLEAR_REG_8125, 0xFFFFFFFF); + } else { + RTL_W32(tp, tp->imr_reg[0], 0x0000); + + if (R8125_MULTI_RX_Q(tp)) { + int i; + for (i=1; inum_rx_rings; i++) + RTL_W16(tp, tp->imr_reg[i], 0); + } + +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) + rtl8125_disable_dash2_interrupt(tp); +#endif + } +} + +static inline void +rtl8125_switch_to_hw_interrupt(struct rtl8125_private *tp) +{ + RTL_W32(tp, TIMER_INT0_8125, 0x0000); + + rtl8125_enable_hw_interrupt(tp); +} + +static inline void +rtl8125_switch_to_timer_interrupt(struct rtl8125_private *tp) +{ + if (tp->use_timer_interrrupt) { + RTL_W32(tp, TIMER_INT0_8125, timer_count); + RTL_W32(tp, TCTR0_8125, timer_count); + RTL_W32(tp, tp->imr_reg[0], tp->timer_intr_mask); + +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) + rtl8125_enable_dash2_interrupt(tp); +#endif + } else { + rtl8125_switch_to_hw_interrupt(tp); + } +} + +static void +rtl8125_irq_mask_and_ack(struct rtl8125_private *tp) +{ + rtl8125_disable_hw_interrupt(tp); + + if (tp->HwCurrIsrVer == 2) { + RTL_W32(tp, ISR_V2_8125, 0xFFFFFFFF); + } else { +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) { + if (tp->dash_printer_enabled) { + RTL_W32(tp, tp->isr_reg[0], RTL_R32(tp, tp->isr_reg[0]) & + ~(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_W32(tp, tp->isr_reg[0], RTL_R32(tp, tp->isr_reg[0])); + } +#else + RTL_W32(tp, tp->isr_reg[0], RTL_R32(tp, tp->isr_reg[0])); +#endif + if (R8125_MULTI_RX_Q(tp)) { + int i; + for (i=1; inum_rx_rings; i++) + RTL_W16(tp, tp->isr_reg[i], RTL_R16(tp, tp->isr_reg[i])); + } + } +} + +static void +rtl8125_nic_reset(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int i; + + RTL_W32(tp, RxConfig, (RX_DMA_BURST << RxCfgDMAShift)); + + rtl8125_enable_rxdvgate(dev); + + rtl8125_stop_all_request(dev); + + rtl8125_wait_txrx_fifo_empty(dev); + + mdelay(2); + + /* 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; + } +} + +static void +rtl8125_hw_set_interrupt_type(struct rtl8125_private *tp, u8 isr_ver) +{ + u8 tmp; + + switch (tp->HwSuppIsrVer) { + case 2: + tmp = RTL_R8(tp, INT_CFG0_8125); + tmp &= ~(INT_CFG0_ENABLE_8125); + if (isr_ver == 2) + tmp |= INT_CFG0_ENABLE_8125; + RTL_W8(tp, INT_CFG0_8125, tmp); + break; + } +} + +static void +rtl8125_hw_clear_timer_int(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W32(tp, TIMER_INT0_8125, 0x0000); + RTL_W32(tp, TIMER_INT1_8125, 0x0000); + RTL_W32(tp, TIMER_INT2_8125, 0x0000); + RTL_W32(tp, TIMER_INT3_8125, 0x0000); + break; + } +} + +static void +rtl8125_hw_clear_int_miti(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int i; + + switch (tp->HwSuppIntMitiVer) { + case 3: + //IntMITI_0-IntMITI_31 + for (i=0xA00; i<0xB00; i+=4) + RTL_W32(tp, i, 0x0000); + break; + case 4: + //IntMITI_0-IntMITI_15 + for (i = 0xA00; i < 0xA80; i += 4) + RTL_W32(tp, i, 0x0000); + + RTL_W8(tp, INT_CFG0_8125, RTL_R8(tp, INT_CFG0_8125) & + ~(INT_CFG0_TIMEOUT0_BYPASS_8125 | INT_CFG0_MITIGATION_BYPASS_8125)); + + RTL_W16(tp, INT_CFG1_8125, 0x0000); + break; + } +} + +void +rtl8125_hw_set_timer_int_8125(struct rtl8125_private *tp, + u32 message_id, + u8 timer_intmiti_val) +{ + switch (tp->HwSuppIntMitiVer) { + case 4: + if (message_id < R8125_MAX_RX_QUEUES_VEC_V3) //ROK + RTL_W8(tp,INT_MITI_V2_0_RX + 8 * message_id, timer_intmiti_val); + else if (message_id == 16) //TOK + RTL_W8(tp,INT_MITI_V2_0_TX, timer_intmiti_val); + else if (message_id == 18) //TOK + RTL_W8(tp,INT_MITI_V2_1_TX, timer_intmiti_val); + break; + } +} + +void +rtl8125_hw_reset(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + rtl8125_lib_reset_prepare(tp); + + /* Disable interrupts */ + rtl8125_irq_mask_and_ack(tp); + + rtl8125_hw_clear_timer_int(dev); + + rtl8125_nic_reset(dev); +} + +static unsigned int +rtl8125_xmii_reset_pending(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + unsigned int retval; + + rtl8125_mdio_write(tp, 0x1f, 0x0000); + retval = rtl8125_mdio_read(tp, MII_BMCR) & BMCR_RESET; + + return retval; +} + +static unsigned int +rtl8125_xmii_link_ok(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + unsigned int retval; + + retval = (RTL_R16(tp, PHYstatus) & LinkStatus) ? 1 : 0; + + return retval; +} + +static int +rtl8125_wait_phy_reset_complete(struct rtl8125_private *tp) +{ + int i, val; + + for (i = 0; i < 2500; i++) { + val = rtl8125_mdio_read(tp, MII_BMCR) & BMCR_RESET; + if (!val) + return 0; + + mdelay(1); + } + + return -1; +} + +static void +rtl8125_xmii_reset_enable(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (rtl8125_is_in_phy_disable_mode(dev)) { + return; + } + + rtl8125_mdio_write(tp, 0x1f, 0x0000); + rtl8125_mdio_write(tp, MII_ADVERTISE, rtl8125_mdio_read(tp, MII_ADVERTISE) & + ~(ADVERTISE_10HALF | ADVERTISE_10FULL | + ADVERTISE_100HALF | ADVERTISE_100FULL)); + rtl8125_mdio_write(tp, MII_CTRL1000, rtl8125_mdio_read(tp, MII_CTRL1000) & + ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL)); + mdio_direct_write_phy_ocp(tp, 0xA5D4, mdio_direct_read_phy_ocp(tp, 0xA5D4) & ~(RTK_ADVERTISE_2500FULL)); + rtl8125_mdio_write(tp, MII_BMCR, BMCR_RESET | BMCR_ANENABLE); + + if (rtl8125_wait_phy_reset_complete(tp) == 0) return; + + if (netif_msg_link(tp)) + printk(KERN_ERR "%s: PHY reset failed.\n", dev->name); +} + +void +rtl8125_init_ring_indexes(struct rtl8125_private *tp) +{ + int i; + + for (i = 0; i < tp->HwSuppNumTxQueues; i++) { + struct rtl8125_tx_ring *ring = &tp->tx_ring[i]; + ring->dirty_tx = ring->cur_tx = 0; + ring->NextHwDesCloPtr = 0; + ring->BeginHwDesCloPtr = 0; + ring->index = i; + ring->priv = tp; + } + + for (i = 0; i < tp->HwSuppNumRxQueues; i++) { + struct rtl8125_rx_ring *ring = &tp->rx_ring[i]; + ring->dirty_rx = ring->cur_rx = 0; + ring->index = i; + ring->priv = tp; + } + +#ifdef ENABLE_LIB_SUPPORT + for (i = 0; i < tp->HwSuppNumTxQueues; i++) { + struct rtl8125_ring *ring = &tp->lib_tx_ring[i]; + ring->direction = RTL8125_CH_DIR_TX; + ring->queue_num = i; + ring->private = tp; + } + + for (i = 0; i < tp->HwSuppNumRxQueues; i++) { + struct rtl8125_ring *ring = &tp->lib_rx_ring[i]; + ring->direction = RTL8125_CH_DIR_RX; + ring->queue_num = i; + ring->private = tp; + } +#endif +} + +static void +rtl8125_issue_offset_99_event(struct rtl8125_private *tp) +{ + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xE09A, rtl8125_mac_ocp_read(tp, 0xE09A) | BIT_0); + break; + } +} + +#ifdef ENABLE_DASH_SUPPORT +static void +NICChkTypeEnableDashInterrupt(struct rtl8125_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)) { + rtl8125_enable_dash2_interrupt(tp); + RTL_W16(tp, IntrMask, (ISRIMR_DASH_INTR_EN | ISRIMR_DASH_INTR_CMAC_RESET)); + } + } +} +#endif + +static int rtl8125_enable_eee_plus(struct rtl8125_private *tp) +{ + int ret; + + ret = 0; + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xE080, rtl8125_mac_ocp_read(tp, 0xE080)|BIT_1); + break; + + default: +// dev_printk(KERN_DEBUG, tp_to_dev(tp), "Not Support EEEPlus\n"); + ret = -EOPNOTSUPP; + break; + } + + return ret; +} + +static int rtl8125_disable_eee_plus(struct rtl8125_private *tp) +{ + int ret; + + ret = 0; + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xE080, rtl8125_mac_ocp_read(tp, 0xE080)&~BIT_1); + break; + + default: +// dev_printk(KERN_DEBUG, tp_to_dev(tp), "Not Support EEEPlus\n"); + ret = -EOPNOTSUPP; + break; + } + + return ret; +} + +static void +rtl8125_link_on_patch(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + rtl8125_hw_config(dev); + + if ((tp->mcfg == CFG_METHOD_2) && + netif_running(dev)) { + if (RTL_R16(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_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) && + (RTL_R8(tp, PHYstatus) & _10bps)) + rtl8125_enable_eee_plus(tp); + + rtl8125_hw_start(dev); + + netif_carrier_on(dev); + + netif_tx_wake_all_queues(dev); + + tp->phy_reg_aner = rtl8125_mdio_read(tp, MII_EXPANSION); + tp->phy_reg_anlpar = rtl8125_mdio_read(tp, MII_LPA); + tp->phy_reg_gbsr = rtl8125_mdio_read(tp, MII_STAT1000); + tp->phy_reg_status_2500 = mdio_direct_read_phy_ocp(tp, 0xA5D6); +} + +static void +rtl8125_link_down_patch(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + tp->phy_reg_aner = 0; + tp->phy_reg_anlpar = 0; + tp->phy_reg_gbsr = 0; + tp->phy_reg_status_2500 = 0; + + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) + rtl8125_disable_eee_plus(tp); + + netif_tx_stop_all_queues(dev); + + netif_carrier_off(dev); + + rtl8125_hw_reset(dev); + + rtl8125_tx_clear(tp); + + rtl8125_rx_clear(tp); + + rtl8125_init_ring(dev); + + rtl8125_enable_hw_linkchg_interrupt(tp); + + //rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); + +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) { + NICChkTypeEnableDashInterrupt(tp); + } +#endif +} + +static void +_rtl8125_check_link_status(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (tp->link_ok(dev)) { + rtl8125_link_on_patch(dev); + + 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); + + rtl8125_link_down_patch(dev); + } +} + +static void +rtl8125_check_link_status(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + _rtl8125_check_link_status(dev); + + tp->resume_not_chg_speed = 0; +} + +static void +rtl8125_link_option(u8 *aut, + u32 *spd, + u8 *dup, + u32 *adv) +{ + if ((*spd != SPEED_2500) && (*spd != SPEED_1000) && + (*spd != SPEED_100) && (*spd != SPEED_10)) + *spd = SPEED_2500; + + 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 | + ADVERTISED_2500baseX_Full); + if (*adv == 0) + *adv = (ADVERTISED_10baseT_Half | + ADVERTISED_10baseT_Full | + ADVERTISED_100baseT_Half | + ADVERTISED_100baseT_Full | + ADVERTISED_1000baseT_Half | + ADVERTISED_1000baseT_Full | + ADVERTISED_2500baseX_Full); +} + +/* +static void +rtl8125_enable_ocp_phy_power_saving(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u16 val; + + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) { + val = mdio_direct_read_phy_ocp(tp, 0xC416); + if (val != 0x0050) { + rtl8125_set_phy_mcu_patch_request(tp); + mdio_direct_write_phy_ocp(tp, 0xC416, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xC416, 0x0050); + rtl8125_clear_phy_mcu_patch_request(tp); + } + } +} +*/ + +static void +rtl8125_disable_ocp_phy_power_saving(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u16 val; + + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) { + val = mdio_direct_read_phy_ocp(tp, 0xC416); + if (val != 0x0500) { + rtl8125_set_phy_mcu_patch_request(tp); + mdio_direct_write_phy_ocp(tp, 0xC416, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xC416, 0x0500); + rtl8125_clear_phy_mcu_patch_request(tp); + } + } +} + +static void +rtl8125_wait_ll_share_fifo_ready(struct net_device *dev) +{ + struct rtl8125_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 +rtl8125_disable_pci_offset_99(struct rtl8125_private *tp) +{ + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xE032, rtl8125_mac_ocp_read(tp, 0xE032) & ~(BIT_0 | BIT_1)); + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_csi_fun0_write_byte(tp, 0x99, 0x00); + break; + } +} + +static void +rtl8125_enable_pci_offset_99(struct rtl8125_private *tp) +{ + u32 csi_tmp; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_csi_fun0_write_byte(tp, 0x99, tp->org_pci_offset_99); + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + csi_tmp = rtl8125_mac_ocp_read(tp, 0xE032); + 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; + rtl8125_mac_ocp_write(tp, 0xE032, csi_tmp); + break; + } +} + +static void +rtl8125_init_pci_offset_99(struct rtl8125_private *tp) +{ + u32 csi_tmp; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xCDD0, 0x9003); + csi_tmp = rtl8125_mac_ocp_read(tp, 0xE034); + csi_tmp |= (BIT_15 | BIT_14); + rtl8125_mac_ocp_write(tp, 0xE034, csi_tmp); + rtl8125_mac_ocp_write(tp, 0xCDD2, 0x889C); + rtl8125_mac_ocp_write(tp, 0xCDD8, 0x9003); + rtl8125_mac_ocp_write(tp, 0xCDD4, 0x8C30); + rtl8125_mac_ocp_write(tp, 0xCDDA, 0x9003); + rtl8125_mac_ocp_write(tp, 0xCDD6, 0x9003); + rtl8125_mac_ocp_write(tp, 0xCDDC, 0x9003); + rtl8125_mac_ocp_write(tp, 0xCDE8, 0x883E); + rtl8125_mac_ocp_write(tp, 0xCDEA, 0x9003); + rtl8125_mac_ocp_write(tp, 0xCDEC, 0x889C); + rtl8125_mac_ocp_write(tp, 0xCDEE, 0x9003); + rtl8125_mac_ocp_write(tp, 0xCDF0, 0x8C09); + rtl8125_mac_ocp_write(tp, 0xCDF2, 0x9003); + csi_tmp = rtl8125_mac_ocp_read(tp, 0xE032); + csi_tmp |= (BIT_14); + rtl8125_mac_ocp_write(tp, 0xE032, csi_tmp); + csi_tmp = rtl8125_mac_ocp_read(tp, 0xE0A2); + csi_tmp |= (BIT_0); + rtl8125_mac_ocp_write(tp, 0xE0A2, csi_tmp); + break; + } + + rtl8125_enable_pci_offset_99(tp); +} + +static void +rtl8125_disable_pci_offset_180(struct rtl8125_private *tp) +{ + u32 csi_tmp; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + csi_tmp = rtl8125_mac_ocp_read(tp, 0xE092); + csi_tmp &= 0xFF00; + rtl8125_mac_ocp_write(tp, 0xE092, csi_tmp); + break; + } +} + +static void +rtl8125_enable_pci_offset_180(struct rtl8125_private *tp) +{ + u32 csi_tmp; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + csi_tmp = rtl8125_mac_ocp_read(tp, 0xE094); + csi_tmp &= 0x00FF; + rtl8125_mac_ocp_write(tp, 0xE094, csi_tmp); + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + csi_tmp = rtl8125_mac_ocp_read(tp, 0xE092); + csi_tmp &= 0xFF00; + csi_tmp |= BIT_2; + rtl8125_mac_ocp_write(tp, 0xE092, csi_tmp); + break; + } +} + +static void +rtl8125_init_pci_offset_180(struct rtl8125_private *tp) +{ + if (tp->org_pci_offset_180 & (BIT_0|BIT_1)) + rtl8125_enable_pci_offset_180(tp); + else + rtl8125_disable_pci_offset_180(tp); +} + +static void +rtl8125_set_pci_99_180_exit_driver_para(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_issue_offset_99_event(tp); + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_disable_pci_offset_99(tp); + break; + } + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_disable_pci_offset_180(tp); + break; + } +} + +static void +rtl8125_enable_cfg9346_write(struct rtl8125_private *tp) +{ + RTL_W8(tp, Cfg9346, RTL_R8(tp, Cfg9346) | Cfg9346_Unlock); +} + +static void +rtl8125_disable_cfg9346_write(struct rtl8125_private *tp) +{ + RTL_W8(tp, Cfg9346, RTL_R8(tp, Cfg9346) & ~Cfg9346_Unlock); +} + +static void +rtl8125_enable_exit_l1_mask(struct rtl8125_private *tp) +{ + //(1)ERI(0xD4)(OCP 0xC0AC).bit[7:12]=6'b111111, L1 Mask + SetMcuAccessRegBit(tp, 0xC0AC, (BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12)); +} + +static void +rtl8125_disable_exit_l1_mask(struct rtl8125_private *tp) +{ + //(1)ERI(0xD4)(OCP 0xC0AC).bit[7:12]=6'b000000, L1 Mask + ClearMcuAccessRegBit(tp, 0xC0AC, (BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12)); +} + +static void +rtl8125_enable_extend_tally_couter(struct rtl8125_private *tp) +{ + switch (tp->HwSuppExtendTallyCounterVer) { + case 1: + SetMcuAccessRegBit(tp, 0xEA84, (BIT_1 | BIT_0)); + break; + } +} + +static void +rtl8125_disable_extend_tally_couter(struct rtl8125_private *tp) +{ + switch (tp->HwSuppExtendTallyCounterVer) { + case 1: + ClearMcuAccessRegBit(tp, 0xEA84, (BIT_1 | BIT_0)); + break; + } +} + +static void +rtl8125_hw_d3_para(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + RTL_W16(tp, RxMaxSize, RX_BUF_SIZE); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) & ~BIT_7); + rtl8125_enable_cfg9346_write(tp); + RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~BIT_7); + RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_0); + rtl8125_disable_cfg9346_write(tp); + break; + } + + rtl8125_disable_exit_l1_mask(tp); + +#ifdef ENABLE_REALWOW_SUPPORT + rtl8125_set_realwow_d3_para(dev); +#endif + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xEA18, 0x0064); + break; + } + + rtl8125_set_pci_99_180_exit_driver_para(dev); + + /*disable ocp phy power saving*/ + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) + rtl8125_disable_ocp_phy_power_saving(dev); + + rtl8125_disable_rxdvgate(dev); + + rtl8125_disable_extend_tally_couter(tp); +} + +static void +rtl8125_enable_magic_packet(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->HwSuppMagicPktVer) { + case WAKEUP_MAGIC_PACKET_V3: + rtl8125_mac_ocp_write(tp, 0xC0B6, rtl8125_mac_ocp_read(tp, 0xC0B6) | BIT_0); + break; + } +} +static void +rtl8125_disable_magic_packet(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->HwSuppMagicPktVer) { + case WAKEUP_MAGIC_PACKET_V3: + rtl8125_mac_ocp_write(tp, 0xC0B6, rtl8125_mac_ocp_read(tp, 0xC0B6) & ~BIT_0); + break; + } +} + +static void +rtl8125_enable_linkchg_wakeup(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->HwSuppLinkChgWakeUpVer) { + case 3: + RTL_W8(tp, Config3, RTL_R8(tp, Config3) | LinkUp); + ClearAndSetMcuAccessRegBit(tp, 0xE0C6, (BIT_5 | BIT_3 | BIT_2), (BIT_4 | BIT_1 | BIT_0)); + break; + } +} + +static void +rtl8125_disable_linkchg_wakeup(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->HwSuppLinkChgWakeUpVer) { + case 3: + RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~LinkUp); + ClearMcuAccessRegBit(tp, 0xE0C6, (BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0)); + break; + } +} + +#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST) + +static u32 +rtl8125_get_hw_wol(struct rtl8125_private *tp) +{ + u8 options; + u32 csi_tmp; + u32 wol_opts = 0; + + if (disable_pm_support) + goto out; + + options = RTL_R8(tp, Config1); + if (!(options & PMEnable)) + goto out; + + options = RTL_R8(tp, Config3); + if (options & LinkUp) + wol_opts |= WAKE_PHY; + + switch (tp->HwSuppMagicPktVer) { + case WAKEUP_MAGIC_PACKET_V3: + csi_tmp = rtl8125_mac_ocp_read(tp, 0xC0B6); + if (csi_tmp & BIT_0) + wol_opts |= WAKE_MAGIC; + break; + } + + options = RTL_R8(tp, Config5); + if (options & UWF) + wol_opts |= WAKE_UCAST; + if (options & BWF) + wol_opts |= WAKE_BCAST; + if (options & MWF) + wol_opts |= WAKE_MCAST; + +out: + return wol_opts; +} + +static void +rtl8125_enable_d0_speedup(struct rtl8125_private *tp) +{ + if (FALSE == HW_SUPPORT_D0_SPEED_UP(tp)) return; + if (tp->D0SpeedUpSpeed == D0_SPEED_UP_SPEED_DISABLE) return; + + if (tp->HwSuppD0SpeedUpVer == 1) { + u16 mac_ocp_data; + + RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_3); + + //speed up speed + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE10A); + mac_ocp_data &= ~(BIT_10 | BIT_9 | BIT_8 | BIT_7); + if (tp->D0SpeedUpSpeed == D0_SPEED_UP_SPEED_2500) { + mac_ocp_data |= BIT_7; + } + rtl8125_mac_ocp_write(tp, 0xE10A, mac_ocp_data); + + //speed up flowcontrol + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE860); + mac_ocp_data |= (BIT_15 | BIT_14); + rtl8125_mac_ocp_write(tp, 0xE860, mac_ocp_data); + } +} + +static void +rtl8125_disable_d0_speedup(struct rtl8125_private *tp) +{ + if (FALSE == HW_SUPPORT_D0_SPEED_UP(tp)) return; + + if (tp->HwSuppD0SpeedUpVer == 1) + RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) & ~BIT_7); +} + +static void +rtl8125_set_hw_wol(struct net_device *dev, u32 wolopts) +{ + struct rtl8125_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_V3: + default: + tmp = ARRAY_SIZE(cfg) - 1; + + if (wolopts & WAKE_MAGIC) + rtl8125_enable_magic_packet(dev); + else + rtl8125_disable_magic_packet(dev); + break; + } + + rtl8125_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); + } + + switch (tp->HwSuppLinkChgWakeUpVer) { + case 3: + if (wolopts & WAKE_PHY) + rtl8125_enable_linkchg_wakeup(dev); + else + rtl8125_disable_linkchg_wakeup(dev); + break; + } + + rtl8125_disable_cfg9346_write(tp); +} + +static void +rtl8125_phy_restart_nway(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (rtl8125_is_in_phy_disable_mode(dev)) return; + + rtl8125_mdio_write(tp, 0x1F, 0x0000); + rtl8125_mdio_write(tp, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART); +} + +static void +rtl8125_phy_setup_force_mode(struct net_device *dev, u32 speed, u8 duplex) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u16 bmcr_true_force = 0; + + if (rtl8125_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; + } + + rtl8125_mdio_write(tp, 0x1F, 0x0000); + rtl8125_mdio_write(tp, MII_BMCR, bmcr_true_force); +} + +static void +rtl8125_set_pci_pme(struct rtl8125_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 +rtl8125_set_wol_link_speed(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int auto_nego; + int giga_ctrl; + int ctrl_2500; + u32 adv; + u16 anlpar; + u16 gbsr; + u16 status_2500; + u16 aner; + + if (tp->autoneg != AUTONEG_ENABLE) + goto exit; + + rtl8125_mdio_write(tp, 0x1F, 0x0000); + + auto_nego = rtl8125_mdio_read(tp, MII_ADVERTISE); + auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL + | ADVERTISE_100HALF | ADVERTISE_100FULL); + + giga_ctrl = rtl8125_mdio_read(tp, MII_CTRL1000); + giga_ctrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL); + + ctrl_2500 = mdio_direct_read_phy_ocp(tp, 0xA5D4); + ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL); + + aner = anlpar = gbsr = status_2500 = 0; + if (tp->link_ok(dev)) { + aner = rtl8125_mdio_read(tp, MII_EXPANSION); + anlpar = rtl8125_mdio_read(tp, MII_LPA); + gbsr = rtl8125_mdio_read(tp, MII_STAT1000); + status_2500 = mdio_direct_read_phy_ocp(tp, 0xA5D6); + } else { + if (netif_running(dev)) { + aner = tp->phy_reg_aner; + anlpar = tp->phy_reg_anlpar; + gbsr = tp->phy_reg_gbsr; + status_2500 = tp->phy_reg_status_2500; + } + } + + if ((aner | anlpar | gbsr | status_2500) == 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 if (adv & ADVERTISED_2500baseX_Full && (status_2500 & RTK_LPA_ADVERTISE_2500FULL)) + ctrl_2500 |= RTK_ADVERTISE_2500FULL; + else + goto exit; + +skip_check_lpa: + if (tp->DASH) + 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 + + rtl8125_mdio_write(tp, MII_ADVERTISE, auto_nego); + rtl8125_mdio_write(tp, MII_CTRL1000, giga_ctrl); + mdio_direct_write_phy_ocp(tp, 0xA5D4, ctrl_2500); + + rtl8125_phy_restart_nway(dev); + +exit: + return; +} + +static bool +rtl8125_keep_wol_link_speed(struct net_device *dev, u8 from_suspend) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if ((from_suspend && !tp->link_ok(dev)) || + (!from_suspend && tp->resume_not_chg_speed)) + return 1; + + return 0; +} +static void +rtl8125_powerdown_pll(struct net_device *dev, u8 from_suspend) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + tp->check_keep_link_speed = 0; + if (tp->wol_enabled == WOL_ENABLED || tp->DASH || tp->EnableKCPOffload) { + rtl8125_set_hw_wol(dev, tp->wol_opts); + + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) { + rtl8125_enable_cfg9346_write(tp); + RTL_W8(tp, Config2, RTL_R8(tp, Config2) | PMSTS_En); + rtl8125_disable_cfg9346_write(tp); + } + + /* Enable the PME and clear the status */ + rtl8125_set_pci_pme(tp, 1); + + if (rtl8125_keep_wol_link_speed(dev, from_suspend)) { + if (tp->wol_opts & WAKE_PHY) + tp->check_keep_link_speed = 1; + } else { + if (HW_SUPPORT_D0_SPEED_UP(tp)) { + rtl8125_enable_d0_speedup(tp); + tp->check_keep_link_speed = 1; + } + + rtl8125_set_wol_link_speed(dev); + } + + RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) | AcceptBroadcast | AcceptMulticast | AcceptMyPhys); + + return; + } + + if (tp->DASH) + return; + + rtl8125_phy_power_down(dev); + + if (!tp->HwIcVerUnknown) { + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~BIT_7); + break; + } + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_6); + break; + } +} + +static void rtl8125_powerup_pll(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | BIT_7 | BIT_6); + break; + } + + if (tp->resume_not_chg_speed) return; + + rtl8125_phy_power_up(dev); +} + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) +static void +rtl8125_get_wol(struct net_device *dev, + struct ethtool_wolinfo *wol) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u8 options; + + wol->wolopts = 0; + + if (tp->mcfg == CFG_METHOD_DEFAULT || disable_pm_support) { + wol->supported = 0; + return; + } else { + wol->supported = WAKE_ANY; + } + + options = RTL_R8(tp, Config1); + if (!(options & PMEnable)) + return; + + wol->wolopts = tp->wol_opts; +} + +static int +rtl8125_set_wol(struct net_device *dev, + struct ethtool_wolinfo *wol) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (tp->mcfg == CFG_METHOD_DEFAULT || disable_pm_support) + return -EOPNOTSUPP; + + tp->wol_opts = wol->wolopts; + + tp->wol_enabled = (tp->wol_opts) ? WOL_ENABLED : WOL_DISABLED; + + device_set_wakeup_enable(tp_to_dev(tp), wol->wolopts); + + return 0; +} + +static void +rtl8125_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) +{ + struct rtl8125_private *tp = netdev_priv(dev); + struct rtl8125_fw *rtl_fw = tp->rtl_fw; + + strcpy(info->driver, MODULENAME); + strcpy(info->version, RTL8125_VERSION); + strcpy(info->bus_info, pci_name(tp->pci_dev)); + info->regdump_len = R8125_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 +rtl8125_get_regs_len(struct net_device *dev) +{ + return R8125_REGS_DUMP_SIZE; +} +#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) + +static void +rtl8125_set_d0_speedup_speed(struct rtl8125_private *tp) +{ + if (FALSE == HW_SUPPORT_D0_SPEED_UP(tp)) return; + + tp->D0SpeedUpSpeed = D0_SPEED_UP_SPEED_DISABLE; + if (tp->autoneg == AUTONEG_ENABLE) { + if (tp->speed == SPEED_2500) + tp->D0SpeedUpSpeed = D0_SPEED_UP_SPEED_2500; + else if(tp->speed == SPEED_1000) + tp->D0SpeedUpSpeed = D0_SPEED_UP_SPEED_1000; + } +} + +static int +rtl8125_set_speed_xmii(struct net_device *dev, + u8 autoneg, + u32 speed, + u8 duplex, + u32 adv) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int auto_nego = 0; + int giga_ctrl = 0; + int ctrl_2500 = 0; + int rc = -EINVAL; + + //Disable Giga Lite + ClearEthPhyOcpBit(tp, 0xA428, BIT_9); + ClearEthPhyOcpBit(tp, 0xA5EA, BIT_0); + + if (speed != SPEED_2500 && + (speed != SPEED_1000) && + (speed != SPEED_100) && + (speed != SPEED_10)) { + speed = SPEED_2500; + duplex = DUPLEX_FULL; + } + + giga_ctrl = rtl8125_mdio_read(tp, MII_CTRL1000); + giga_ctrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL); + ctrl_2500 = mdio_direct_read_phy_ocp(tp, 0xA5D4); + ctrl_2500 &= ~(RTK_ADVERTISE_2500FULL); + + if (autoneg == AUTONEG_ENABLE) { + /*n-way force*/ + auto_nego = rtl8125_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; + if (adv & ADVERTISED_2500baseX_Full) + ctrl_2500 |= RTK_ADVERTISE_2500FULL; + + //flow control + if (dev->mtu <= ETH_DATA_LEN && tp->fcpause == rtl8125_fc_full) + auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; + + tp->phy_auto_nego_reg = auto_nego; + tp->phy_1000_ctrl_reg = giga_ctrl; + + tp->phy_2500_ctrl_reg = ctrl_2500; + + rtl8125_mdio_write(tp, 0x1f, 0x0000); + rtl8125_mdio_write(tp, MII_ADVERTISE, auto_nego); + rtl8125_mdio_write(tp, MII_CTRL1000, giga_ctrl); + mdio_direct_write_phy_ocp(tp, 0xA5D4, ctrl_2500); + rtl8125_phy_restart_nway(dev); + mdelay(20); + } else { + /*true force*/ + if (speed == SPEED_10 || speed == SPEED_100) + rtl8125_phy_setup_force_mode(dev, speed, duplex); + else + goto out; + } + + tp->autoneg = autoneg; + tp->speed = speed; + tp->duplex = duplex; + tp->advertising = adv; + + rtl8125_set_d0_speedup_speed(tp); + + rc = 0; +out: + return rc; +} + +static int +rtl8125_set_speed(struct net_device *dev, + u8 autoneg, + u32 speed, + u8 duplex, + u32 adv) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int ret; + + if (tp->resume_not_chg_speed) return 0; + + ret = tp->set_speed(dev, autoneg, speed, duplex, adv); + + return ret; +} + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) +static int +rtl8125_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 + ) +{ + int ret; + 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); + if (test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + cmd->link_modes.supported)) + supported |= ADVERTISED_2500baseX_Full; + if (test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + cmd->link_modes.advertising)) + advertising |= ADVERTISED_2500baseX_Full; +#endif + if (advertising & ~supported) + return -EINVAL; + + ret = rtl8125_set_speed(dev, autoneg, speed, duplex, advertising); + + return ret; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0) +static u32 +rtl8125_get_tx_csum(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u32 ret; + +#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) + + return ret; +} + +static u32 +rtl8125_get_rx_csum(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u32 ret; + + ret = tp->cp_cmd & RxChkSum; + + return ret; +} + +static int +rtl8125_set_tx_csum(struct net_device *dev, + u32 data) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (tp->mcfg == CFG_METHOD_DEFAULT) + return -EOPNOTSUPP; + +#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) + 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) + + return 0; +} + +static int +rtl8125_set_rx_csum(struct net_device *dev, + u32 data) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (tp->mcfg == CFG_METHOD_DEFAULT) + return -EOPNOTSUPP; + + if (data) + tp->cp_cmd |= RxChkSum; + else + tp->cp_cmd &= ~RxChkSum; + + RTL_W16(tp, CPlusCmd, tp->cp_cmd); + + return 0; +} +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0) +#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) + +static u32 +rtl8125_rx_desc_opts1(struct rtl8125_private *tp, + struct RxDesc *desc) +{ + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) + return ((struct RxDescV3 *)desc)->RxDescNormalDDWord4.opts1; + else + return desc->opts1; +} + +static u32 +rtl8125_rx_desc_opts2(struct rtl8125_private *tp, + struct RxDesc *desc) +{ + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) + return ((struct RxDescV3 *)desc)->RxDescNormalDDWord4.opts2; + else + return desc->opts2; +} + +static void +rtl8125_clear_rx_desc_opts2(struct rtl8125_private *tp, + struct RxDesc *desc) +{ + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) + ((struct RxDescV3 *)desc)->RxDescNormalDDWord4.opts2 = 0; + else + desc->opts2 = 0; +} + +#ifdef CONFIG_R8125_VLAN + +static inline u32 +rtl8125_tx_vlan_tag(struct rtl8125_private *tp, + struct sk_buff *skb) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) + return (tp->vlgrp && vlan_tx_tag_present(skb)) ? + TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00; +#elif LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) + return (vlan_tx_tag_present(skb)) ? + TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00; +#else + return (skb_vlan_tag_present(skb)) ? + TxVlanTag | swab16(skb_vlan_tag_get(skb)) : 0x00; +#endif + + return 0; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) + +static void +rtl8125_vlan_rx_register(struct net_device *dev, + struct vlan_group *grp) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + tp->vlgrp = grp; + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) { + if (tp->vlgrp) { + tp->rtl8125_rx_config |= (EnableInnerVlan | EnableOuterVlan); + RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) | (EnableInnerVlan | EnableOuterVlan)) + } else { + tp->rtl8125_rx_config &= ~(EnableInnerVlan | EnableOuterVlan); + RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) & ~(EnableInnerVlan | EnableOuterVlan)) + } + } +} + +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) +static void +rtl8125_vlan_rx_kill_vid(struct net_device *dev, + unsigned short vid) +{ + struct rtl8125_private *tp = netdev_priv(dev); + +#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) +} +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) + +static int +rtl8125_rx_vlan_skb(struct rtl8125_private *tp, + struct RxDesc *desc, + struct sk_buff *skb) +{ + u32 opts2 = le32_to_cpu(rtl8125_rx_desc_opts2(tp, desc)); + int ret = -1; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) + if (tp->vlgrp && (opts2 & RxVlanTag)) { + rtl8125_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 + + rtl8125_clear_rx_desc_opts2(tp, desc); + return ret; +} + +#else /* !CONFIG_R8125_VLAN */ + +static inline u32 +rtl8125_tx_vlan_tag(struct rtl8125_private *tp, + struct sk_buff *skb) +{ + return 0; +} + +static int +rtl8125_rx_vlan_skb(struct rtl8125_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 rtl8125_fix_features(struct net_device *dev, + netdev_features_t features) +{ + 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; + } +#ifndef CONFIG_R8125_VLAN + features &= ~NETIF_F_ALL_CSUM; +#endif + + return features; +} + +static int rtl8125_hw_set_features(struct net_device *dev, + netdev_features_t features) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u32 rx_config; + + rx_config = RTL_R32(tp, RxConfig); + if (features & NETIF_F_RXALL) { + tp->rtl8125_rx_config |= (AcceptErr | AcceptRunt); + rx_config |= (AcceptErr | AcceptRunt); + } else { + tp->rtl8125_rx_config &= ~(AcceptErr | AcceptRunt); + rx_config &= ~(AcceptErr | AcceptRunt); + } + + if (features & NETIF_F_HW_VLAN_RX) { + tp->rtl8125_rx_config |= (EnableInnerVlan | EnableOuterVlan); + rx_config |= (EnableInnerVlan | EnableOuterVlan); + } else { + tp->rtl8125_rx_config &= ~(EnableInnerVlan | EnableOuterVlan); + rx_config &= ~(EnableInnerVlan | EnableOuterVlan); + } + + RTL_W32(tp, RxConfig, rx_config); + + if (features & NETIF_F_RXCSUM) + tp->cp_cmd |= RxChkSum; + else + tp->cp_cmd &= ~RxChkSum; + + RTL_W16(tp, CPlusCmd, tp->cp_cmd); + RTL_R16(tp, CPlusCmd); + + return 0; +} + +static int rtl8125_set_features(struct net_device *dev, + netdev_features_t features) +{ + features &= NETIF_F_RXALL | NETIF_F_RXCSUM | NETIF_F_HW_VLAN_RX; + + rtl8125_hw_set_features(dev, features); + + return 0; +} + +#endif + +static void rtl8125_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 rtl8125_private *tp = netdev_priv(dev); + u16 aner = tp->phy_reg_aner; + u16 anlpar = tp->phy_reg_anlpar; + u16 gbsr = tp->phy_reg_gbsr; + u16 status_2500 = tp->phy_reg_status_2500; + u32 lpa_adv = 0; + u16 status; + u8 autoneg, duplex; + u32 speed = 0; + u16 bmcr; + u32 supported, advertising; + u8 report_lpa = 0; + + supported = SUPPORTED_10baseT_Half | + SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | + SUPPORTED_100baseT_Full | + SUPPORTED_1000baseT_Full | + SUPPORTED_2500baseX_Full | + SUPPORTED_Autoneg | + SUPPORTED_TP | + SUPPORTED_Pause | + SUPPORTED_Asym_Pause; + + advertising = ADVERTISED_TP; + + rtl8125_mdio_write(tp, 0x1F, 0x0000); + bmcr = rtl8125_mdio_read(tp, MII_BMCR); + + if (bmcr & BMCR_ANENABLE) { + advertising |= ADVERTISED_Autoneg; + autoneg = AUTONEG_ENABLE; + + 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; + if (tp->phy_2500_ctrl_reg & RTK_ADVERTISE_2500FULL) + advertising |= ADVERTISED_2500baseX_Full; + } else { + autoneg = AUTONEG_DISABLE; + } + + status = RTL_R16(tp, PHYstatus); + if (netif_running(dev) && (status & LinkStatus)) + report_lpa = 1; + + if (report_lpa) { + /*link on*/ + if (status & _2500bpsF) + speed = SPEED_2500; + else 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 | _2500bpsF)) || (status & FullDup)) ? + DUPLEX_FULL : DUPLEX_HALF; + + /*link partner*/ + if (aner & EXPANSION_NWAY) + lpa_adv |= ADVERTISED_Autoneg; + if (anlpar & LPA_10HALF) + lpa_adv |= ADVERTISED_10baseT_Half; + if (anlpar & LPA_10FULL) + lpa_adv |= ADVERTISED_10baseT_Full; + if (anlpar & LPA_100HALF) + lpa_adv |= ADVERTISED_100baseT_Half; + if (anlpar & LPA_100FULL) + lpa_adv |= ADVERTISED_100baseT_Full; + if (anlpar & LPA_PAUSE_CAP) + lpa_adv |= ADVERTISED_Pause; + if (anlpar & LPA_PAUSE_ASYM) + lpa_adv |= ADVERTISED_Asym_Pause; + if (gbsr & LPA_1000HALF) + lpa_adv |= ADVERTISED_1000baseT_Half; + if (gbsr & LPA_1000FULL) + lpa_adv |= ADVERTISED_1000baseT_Full; + if (status_2500 & RTK_LPA_ADVERTISE_2500FULL) + lpa_adv |= ADVERTISED_2500baseX_Full; + } else { + /*link down*/ + speed = SPEED_UNKNOWN; + duplex = DUPLEX_UNKNOWN; + lpa_adv = 0; + } + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) + cmd->supported = supported; + cmd->advertising = advertising; + cmd->autoneg = autoneg; + cmd->speed = speed; + cmd->duplex = duplex; + cmd->port = PORT_TP; + cmd->lp_advertising = lpa_adv; +#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, + lpa_adv); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0) + if (supported & SUPPORTED_2500baseX_Full) { + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseX_Full_BIT, + cmd->link_modes.supported, 0); + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + cmd->link_modes.supported, 1); + } + if (advertising & ADVERTISED_2500baseX_Full) { + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseX_Full_BIT, + cmd->link_modes.advertising, 0); + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + cmd->link_modes.advertising, 1); + } + if (report_lpa) { + if (lpa_adv & ADVERTISED_2500baseX_Full) { + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseX_Full_BIT, + cmd->link_modes.lp_advertising, 0); + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + cmd->link_modes.lp_advertising, 1); + } + if (status_2500 & RTK_LPA_ADVERTISE_5000FULL) + linkmode_mod_bit(ETHTOOL_LINK_MODE_5000baseT_Full_BIT, + cmd->link_modes.lp_advertising, 1); + if (status_2500 & RTK_LPA_ADVERTISE_10000FULL) + linkmode_mod_bit(ETHTOOL_LINK_MODE_10000baseT_Full_BIT, + cmd->link_modes.lp_advertising, 1); + } +#endif + 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 +rtl8125_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 rtl8125_private *tp = netdev_priv(dev); + + tp->get_settings(dev, cmd); + + return 0; +} + +static void rtl8125_get_regs(struct net_device *dev, struct ethtool_regs *regs, + void *p) +{ + struct rtl8125_private *tp = netdev_priv(dev); + void __iomem *ioaddr = tp->mmio_addr; + unsigned int i; + u8 *data = p; + + if (regs->len < R8125_REGS_DUMP_SIZE) + return /* -EINVAL */; + + memset(p, 0, regs->len); + + for (i = 0; i < R8125_MAC_REGS_SIZE; i++) + *data++ = readb(ioaddr + i); + data = (u8*)p + 256; + + rtl8125_mdio_write(tp, 0x1F, 0x0000); + for (i = 0; i < R8125_PHY_REGS_SIZE/2; i++) { + *(u16*)data = rtl8125_mdio_read(tp, i); + data += 2; + } + data = (u8*)p + 256 * 2; + + for (i = 0; i < R8125_EPHY_REGS_SIZE/2; i++) { + *(u16*)data = rtl8125_ephy_read(tp, i); + data += 2; + } + data = (u8*)p + 256 * 3; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + default: + for (i = 0; i < R8125_ERI_REGS_SIZE; i+=4) { + *(u32*)data = rtl8125_eri_read(tp, i , 4, ERIAR_ExGMAC); + data += 4; + } + break; + } +} + +static void rtl8125_get_pauseparam(struct net_device *dev, + struct ethtool_pauseparam *pause) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + pause->autoneg = (tp->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE); + if (tp->fcpause == rtl8125_fc_rx_pause) + pause->rx_pause = 1; + else if (tp->fcpause == rtl8125_fc_tx_pause) + pause->tx_pause = 1; + else if (tp->fcpause == rtl8125_fc_full) { + pause->rx_pause = 1; + pause->tx_pause = 1; + } +} + +static int rtl8125_set_pauseparam(struct net_device *dev, + struct ethtool_pauseparam *pause) +{ + struct rtl8125_private *tp = netdev_priv(dev); + enum rtl8125_fc_mode newfc; + + if (pause->tx_pause || pause->rx_pause) + newfc = rtl8125_fc_full; + else + newfc = rtl8125_fc_none; + + if (tp->fcpause != newfc) { + tp->fcpause = newfc; + + rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); + } + + return 0; + +} + +static u32 +rtl8125_get_msglevel(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + return tp->msg_enable; +} + +static void +rtl8125_set_msglevel(struct net_device *dev, + u32 value) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + tp->msg_enable = value; +} + +static const char rtl8125_gstrings[][ETH_GSTRING_LEN] = { + /* legacy */ + "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", + + /* extended */ + "tx_octets", + "rx_octets", + "rx_multicast64", + "tx_unicast64", + "tx_broadcast64", + "tx_multicast64", + "tx_pause_on", + "tx_pause_off", + "tx_pause_all", + "tx_deferred", + "tx_late_collision", + "tx_all_collision", + "tx_aborted32", + "align_errors32", + "rx_frame_too_long", + "rx_runt", + "rx_pause_on", + "rx_pause_off", + "rx_pause_all", + "rx_unknown_opcode", + "rx_mac_error", + "tx_underrun32", + "rx_mac_missed", + "rx_tcam_dropped", + "tdu", + "rdu", +}; +#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 rtl8125_get_stats_count(struct net_device *dev) +{ + return ARRAY_SIZE(rtl8125_gstrings); +} +#endif //#LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) +#else +static int rtl8125_get_sset_count(struct net_device *dev, int sset) +{ + switch (sset) { + case ETH_SS_STATS: + return ARRAY_SIZE(rtl8125_gstrings); + default: + return -EOPNOTSUPP; + } +} +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) +static void +rtl8125_get_ethtool_stats(struct net_device *dev, + struct ethtool_stats *stats, + u64 *data) +{ + struct rtl8125_private *tp = netdev_priv(dev); + struct rtl8125_counters *counters; + dma_addr_t paddr; + + ASSERT_RTNL(); + + counters = tp->tally_vaddr; + paddr = tp->tally_paddr; + if (!counters) + return; + + rtl8125_dump_tally_counter(tp, paddr); + + 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); + + data[13] = le64_to_cpu(counters->tx_octets); + data[14] = le64_to_cpu(counters->rx_octets); + data[15] = le64_to_cpu(counters->rx_multicast64); + data[16] = le64_to_cpu(counters->tx_unicast64); + data[17] = le64_to_cpu(counters->tx_broadcast64); + data[18] = le64_to_cpu(counters->tx_multicast64); + data[19] = le32_to_cpu(counters->tx_pause_on); + data[20] = le32_to_cpu(counters->tx_pause_off); + data[21] = le32_to_cpu(counters->tx_pause_all); + data[22] = le32_to_cpu(counters->tx_deferred); + data[23] = le32_to_cpu(counters->tx_late_collision); + data[24] = le32_to_cpu(counters->tx_all_collision); + data[25] = le32_to_cpu(counters->tx_aborted32); + data[26] = le32_to_cpu(counters->align_errors32); + data[27] = le32_to_cpu(counters->rx_frame_too_long); + data[28] = le32_to_cpu(counters->rx_runt); + data[29] = le32_to_cpu(counters->rx_pause_on); + data[30] = le32_to_cpu(counters->rx_pause_off); + data[31] = le32_to_cpu(counters->rx_pause_all); + data[32] = le32_to_cpu(counters->rx_unknown_opcode); + data[33] = le32_to_cpu(counters->rx_mac_error); + data[34] = le32_to_cpu(counters->tx_underrun32); + data[35] = le32_to_cpu(counters->rx_mac_missed); + data[36] = le32_to_cpu(counters->rx_tcam_dropped); + data[37] = le32_to_cpu(counters->tdu); + data[38] = le32_to_cpu(counters->rdu); +} + +static void +rtl8125_get_strings(struct net_device *dev, + u32 stringset, + u8 *data) +{ + switch (stringset) { + case ETH_SS_STATS: + memcpy(data, *rtl8125_gstrings, sizeof(rtl8125_gstrings)); + break; + } +} +#endif //#LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) + +static int rtl_get_eeprom_len(struct net_device *dev) +{ + struct rtl8125_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 rtl8125_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_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + 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; + + rtl8125_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]); + } + rtl8125_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 rtl8125_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 rtl8125_enable_eee(struct rtl8125_private *tp) +{ + struct ethtool_eee *eee = &tp->eee; + u16 eee_adv_t = ethtool_adv_to_mmd_eee_adv_t(eee->advertised); + int ret; + + ret = 0; + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + RTL_W16(tp, EEE_TXIDLE_TIMER_8125, eee->tx_lpi_timer); + + SetMcuAccessRegBit(tp, 0xE040, (BIT_1|BIT_0)); + SetMcuAccessRegBit(tp, 0xEB62, (BIT_2|BIT_1)); + + SetEthPhyOcpBit(tp, 0xA432, BIT_4); + SetEthPhyOcpBit(tp, 0xA5D0, eee_adv_t); + ClearEthPhyOcpBit(tp, 0xA6D4, BIT_0); + + ClearEthPhyOcpBit(tp, 0xA6D8, BIT_4); + ClearEthPhyOcpBit(tp, 0xA428, BIT_7); + ClearEthPhyOcpBit(tp, 0xA4A2, BIT_9); + break; + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W16(tp, EEE_TXIDLE_TIMER_8125, eee->tx_lpi_timer); + + SetMcuAccessRegBit(tp, 0xE040, (BIT_1|BIT_0)); + + SetEthPhyOcpBit(tp, 0xA5D0, eee_adv_t); + if (eee->advertised & SUPPORTED_2500baseX_Full) + SetEthPhyOcpBit(tp, 0xA6D4, BIT_0); + else + ClearEthPhyOcpBit(tp, 0xA6D4, BIT_0); + + ClearEthPhyOcpBit(tp, 0xA6D8, BIT_4); + ClearEthPhyOcpBit(tp, 0xA428, BIT_7); + ClearEthPhyOcpBit(tp, 0xA4A2, BIT_9); + break; + default: +// dev_printk(KERN_DEBUG, tp_to_dev(tp), "Not Support EEE\n"); + ret = -EOPNOTSUPP; + break; + } + + /*Advanced EEE*/ + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_set_phy_mcu_patch_request(tp); + ClearMcuAccessRegBit(tp, 0xE052, BIT_0); + ClearEthPhyOcpBit(tp, 0xA442, BIT_12 | BIT_13); + ClearEthPhyOcpBit(tp, 0xA430, BIT_15); + rtl8125_clear_phy_mcu_patch_request(tp); + break; + } + + return ret; +} + +static int rtl8125_disable_eee(struct rtl8125_private *tp) +{ + int ret; + + ret = 0; + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + ClearMcuAccessRegBit(tp, 0xE040, (BIT_1|BIT_0)); + ClearMcuAccessRegBit(tp, 0xEB62, (BIT_2|BIT_1)); + + ClearEthPhyOcpBit(tp, 0xA432, BIT_4); + ClearEthPhyOcpBit(tp, 0xA5D0, (BIT_2 | BIT_1)); + ClearEthPhyOcpBit(tp, 0xA6D4, BIT_0); + + ClearEthPhyOcpBit(tp, 0xA6D8, BIT_4); + ClearEthPhyOcpBit(tp, 0xA428, BIT_7); + ClearEthPhyOcpBit(tp, 0xA4A2, BIT_9); + break; + case CFG_METHOD_4: + case CFG_METHOD_5: + ClearMcuAccessRegBit(tp, 0xE040, (BIT_1|BIT_0)); + + ClearEthPhyOcpBit(tp, 0xA5D0, (BIT_2 | BIT_1)); + ClearEthPhyOcpBit(tp, 0xA6D4, BIT_0); + + ClearEthPhyOcpBit(tp, 0xA6D8, BIT_4); + ClearEthPhyOcpBit(tp, 0xA428, BIT_7); + ClearEthPhyOcpBit(tp, 0xA4A2, BIT_9); + break; + default: +// dev_printk(KERN_DEBUG, tp_to_dev(tp), "Not Support EEE\n"); + ret = -EOPNOTSUPP; + break; + } + + /*Advanced EEE*/ + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_set_phy_mcu_patch_request(tp); + ClearMcuAccessRegBit(tp, 0xE052, BIT_0); + ClearEthPhyOcpBit(tp, 0xA442, BIT_12 | BIT_13); + ClearEthPhyOcpBit(tp, 0xA430, BIT_15); + rtl8125_clear_phy_mcu_patch_request(tp); + break; + } + + return ret; +} + +static int rtl_nway_reset(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int ret, bmcr; + + if (unlikely(tp->rtk_enable_diag)) + return -EBUSY; + + /* if autoneg is off, it's an error */ + rtl8125_mdio_write(tp, 0x1F, 0x0000); + bmcr = rtl8125_mdio_read(tp, MII_BMCR); + + if (bmcr & BMCR_ANENABLE) { + bmcr |= BMCR_ANRESTART; + rtl8125_mdio_write(tp, MII_BMCR, bmcr); + ret = 0; + } else { + ret = -EINVAL; + } + + return ret; +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) +static u32 +rtl8125_tx_lpi_timer_to_us(struct rtl8125_private *tp , u32 tx_lpi_timer) +{ + u32 to_us; + u16 status; + + //2.5G : tx_lpi_timer * 3.2ns + //Giga: tx_lpi_timer * 8ns + //100M : tx_lpi_timer * 80ns + to_us = tx_lpi_timer * 80; + status = RTL_R16(tp, PHYstatus); + if (status & LinkStatus) { + /*link on*/ + if (status & _2500bpsF) + to_us = (tx_lpi_timer * 32) / 10; + else if (status & _1000bpsF) + to_us = tx_lpi_timer * 8; + } + + //ns to us + to_us /= 1000; + + return to_us; +} + +static int +rtl_ethtool_get_eee(struct net_device *net, struct ethtool_eee *edata) +{ + struct rtl8125_private *tp = netdev_priv(net); + struct ethtool_eee *eee = &tp->eee; + u32 lp, adv, tx_lpi_timer, supported = 0; + u16 val; + + if (unlikely(tp->rtk_enable_diag)) + return -EBUSY; + + /* Get Supported EEE */ + //val = mdio_direct_read_phy_ocp(tp, 0xA5C4); + //supported = mmd_eee_cap_to_ethtool_sup_t(val); + supported = eee->supported; + + /* Get advertisement EEE */ + val = mdio_direct_read_phy_ocp(tp, 0xA5D0); + adv = mmd_eee_adv_to_ethtool_adv_t(val); + + /* Get LP advertisement EEE */ + val = mdio_direct_read_phy_ocp(tp, 0xA5D2); + lp = mmd_eee_adv_to_ethtool_adv_t(val); + + /* Get EEE Tx LPI timer*/ + tx_lpi_timer = RTL_R16(tp, EEE_TXIDLE_TIMER_8125); + + val = rtl8125_mac_ocp_read(tp, 0xE040); + val &= BIT_1 | BIT_0; + + edata->eee_enabled = !!val; + edata->eee_active = !!(supported & adv & lp); + edata->supported = supported; + edata->advertised = adv; + edata->lp_advertised = lp; + edata->tx_lpi_enabled = edata->eee_enabled; + edata->tx_lpi_timer = rtl8125_tx_lpi_timer_to_us(tp, tx_lpi_timer); + + return 0; +} + +static int +rtl_ethtool_set_eee(struct net_device *net, struct ethtool_eee *edata) +{ + struct rtl8125_private *tp = netdev_priv(net); + struct ethtool_eee *eee = &tp->eee; + u32 advertising; + int rc = 0; + + if (!HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp) || + tp->DASH) + return -EOPNOTSUPP; + + if (unlikely(tp->rtk_enable_diag)) { + dev_printk(KERN_WARNING, tp_to_dev(tp), "Diag Enabled\n"); + rc = -EBUSY; + goto out; + } + + if (tp->autoneg != AUTONEG_ENABLE) { + dev_printk(KERN_WARNING, tp_to_dev(tp), "EEE requires autoneg\n"); + rc = -EINVAL; + goto out; + } + + if (edata->tx_lpi_enabled) { + if (edata->tx_lpi_timer > tp->max_jumbo_frame_size || + edata->tx_lpi_timer < ETH_MIN_MTU) { + dev_printk(KERN_WARNING, tp_to_dev(tp), "Valid LPI timer range is %d to %d. \n", + ETH_MIN_MTU, tp->max_jumbo_frame_size); + rc = -EINVAL; + goto out; + } + } + + advertising = tp->advertising; + if (!edata->advertised) { + edata->advertised = advertising & eee->supported; + } else if (edata->advertised & ~advertising) { + dev_printk(KERN_WARNING, tp_to_dev(tp), "EEE advertised %x must be a subset of autoneg advertised speeds %x\n", + edata->advertised, advertising); + rc = -EINVAL; + goto out; + } + + if (edata->advertised & ~eee->supported) { + dev_printk(KERN_WARNING, tp_to_dev(tp), "EEE advertised %x must be a subset of support %x\n", + edata->advertised, eee->supported); + rc = -EINVAL; + goto out; + } + + //tp->eee.eee_enabled = edata->eee_enabled; + //tp->eee_adv_t = ethtool_adv_to_mmd_eee_adv_t(edata->advertised); + + dev_printk(KERN_WARNING, tp_to_dev(tp), "EEE tx_lpi_timer %x must be a subset of support %x\n", + edata->tx_lpi_timer, eee->tx_lpi_timer); + + eee->advertised = edata->advertised; + eee->tx_lpi_enabled = edata->tx_lpi_enabled; + eee->tx_lpi_timer = edata->tx_lpi_timer; + eee->eee_enabled = edata->eee_enabled; + + if (eee->eee_enabled) + rtl8125_enable_eee(tp); + else + rtl8125_disable_eee(tp); + + rtl_nway_reset(net); + + return rc; + +out: + + return rc; +} +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) */ + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) +static const struct ethtool_ops rtl8125_ethtool_ops = { + .get_drvinfo = rtl8125_get_drvinfo, + .get_regs_len = rtl8125_get_regs_len, + .get_link = ethtool_op_get_link, +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0) + .get_settings = rtl8125_get_settings, + .set_settings = rtl8125_set_settings, +#else + .get_link_ksettings = rtl8125_get_settings, + .set_link_ksettings = rtl8125_set_settings, +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + .get_pauseparam = rtl8125_get_pauseparam, + .set_pauseparam = rtl8125_set_pauseparam, +#endif + .get_msglevel = rtl8125_get_msglevel, + .set_msglevel = rtl8125_set_msglevel, +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0) + .get_rx_csum = rtl8125_get_rx_csum, + .set_rx_csum = rtl8125_set_rx_csum, + .get_tx_csum = rtl8125_get_tx_csum, + .set_tx_csum = rtl8125_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 +#endif + .get_regs = rtl8125_get_regs, + .get_wol = rtl8125_get_wol, + .set_wol = rtl8125_set_wol, + .get_strings = rtl8125_get_strings, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) + .get_stats_count = rtl8125_get_stats_count, +#else + .get_sset_count = rtl8125_get_sset_count, +#endif + .get_ethtool_stats = rtl8125_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, +#ifdef ENABLE_RSS_SUPPORT + .get_rxnfc = rtl8125_get_rxnfc, + .set_rxnfc = rtl8125_set_rxnfc, + .get_rxfh_indir_size = rtl8125_rss_indir_size, + .get_rxfh_key_size = rtl8125_get_rxfh_key_size, + .get_rxfh = rtl8125_get_rxfh, + .set_rxfh = rtl8125_set_rxfh, +#endif +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0) +#ifdef ENABLE_PTP_SUPPORT + .get_ts_info = rtl8125_get_ts_info, +#else + .get_ts_info = ethtool_op_get_ts_info, +#endif //ENABLE_PTP_SUPPORT +#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 rtl8125_enable_green_feature(struct rtl8125_private *tp) +{ + u16 gphy_val; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8011); + SetEthPhyOcpBit(tp, 0xA438, BIT_15); + rtl8125_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 rtl8125_disable_green_feature(struct rtl8125_private *tp) +{ + u16 gphy_val; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8011); + ClearEthPhyOcpBit(tp, 0xA438, BIT_15); + rtl8125_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 rtl8125_get_mac_version(struct rtl8125_private *tp) +{ + u32 reg,val32; + u32 ICVerID; + + val32 = RTL_R32(tp, TxConfig); + reg = val32 & 0x7c800000; + ICVerID = val32 & 0x00700000; + + switch (reg) { + case 0x60800000: + if (ICVerID == 0x00000000) { + tp->mcfg = CFG_METHOD_2; + } else if (ICVerID == 0x100000) { + tp->mcfg = CFG_METHOD_3; + } else { + tp->mcfg = CFG_METHOD_3; + tp->HwIcVerUnknown = TRUE; + } + + tp->efuse_ver = EFUSE_SUPPORT_V4; + break; + case 0x64000000: + if (ICVerID == 0x00000000) { + tp->mcfg = CFG_METHOD_4; + } else if (ICVerID == 0x100000) { + tp->mcfg = CFG_METHOD_5; + } else { + tp->mcfg = CFG_METHOD_5; + tp->HwIcVerUnknown = TRUE; + } + + tp->efuse_ver = EFUSE_SUPPORT_V4; + 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 +rtl8125_print_mac_version(struct rtl8125_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 2.5GbE Family Controller mcfg = %04d\n", + rtl_chip_info[i].mcfg); + return; + } + } + + dprintk("mac_version == Unknown\n"); +} + +static void +rtl8125_tally_counter_addr_fill(struct rtl8125_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 +rtl8125_tally_counter_clear(struct rtl8125_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))) | CounterReset); +} + +static void +rtl8125_clear_phy_ups_reg(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + ClearEthPhyOcpBit(tp, 0xA466, BIT_0); + break; + }; + ClearEthPhyOcpBit(tp, 0xA468, BIT_3 | BIT_1); +} + +static int +rtl8125_is_ups_resume(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) + return (rtl8125_mac_ocp_read(tp, 0xD42C) & BIT_8); + + return 0; +} + +static void +rtl8125_clear_ups_resume_bit(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) + rtl8125_mac_ocp_write(tp, 0xD408, rtl8125_mac_ocp_read(tp, 0xD408) & ~(BIT_8)); +} + +static void +rtl8125_wait_phy_ups_resume(struct net_device *dev, u16 PhyState) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u16 TmpPhyState; + int i=0; + + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) { + do { + TmpPhyState = mdio_direct_read_phy_ocp(tp, 0xA420); + 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 +rtl8125_enable_now_is_oob(struct rtl8125_private *tp) +{ + if ( tp->HwSuppNowIsOobVer == 1 ) { + RTL_W8(tp, MCUCmd_reg, RTL_R8(tp, MCUCmd_reg) | Now_is_oob); + } +} + +void +rtl8125_disable_now_is_oob(struct rtl8125_private *tp) +{ + if ( tp->HwSuppNowIsOobVer == 1 ) { + RTL_W8(tp, MCUCmd_reg, RTL_R8(tp, MCUCmd_reg) & ~Now_is_oob); + } +} + +static void +rtl8125_exit_oob(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u16 data16; + + RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) & ~(AcceptErr | AcceptRunt | AcceptBroadcast | AcceptMulticast | AcceptMyPhys | AcceptAllPhys)); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_dash2_disable_txrx(dev); + break; + } + + if (tp->DASH) { + rtl8125_driver_stop(tp); + rtl8125_driver_start(tp); +#ifdef ENABLE_DASH_SUPPORT + DashHwInit(dev); +#endif + } + +#ifdef ENABLE_REALWOW_SUPPORT + rtl8125_realwow_hw_init(dev); +#else + //Disable realwow function + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xC0BC, 0x00FF); + break; + } +#endif //ENABLE_REALWOW_SUPPORT + + rtl8125_nic_reset(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_disable_now_is_oob(tp); + + data16 = rtl8125_mac_ocp_read(tp, 0xE8DE) & ~BIT_14; + rtl8125_mac_ocp_write(tp, 0xE8DE, data16); + rtl8125_wait_ll_share_fifo_ready(dev); + + rtl8125_mac_ocp_write(tp, 0xC0AA, 0x07D0); + rtl8125_mac_ocp_write(tp, 0xC0A6, 0x01B5); + rtl8125_mac_ocp_write(tp, 0xC01E, 0x5555); + + rtl8125_wait_ll_share_fifo_ready(dev); + break; + } + + //wait ups resume (phy state 2) + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + if (rtl8125_is_ups_resume(dev)) { + rtl8125_wait_phy_ups_resume(dev, 2); + rtl8125_clear_ups_resume_bit(dev); + rtl8125_clear_phy_ups_reg(dev); + } + break; + }; +} + +void +rtl8125_hw_disable_mac_mcu_bps(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_enable_cfg9346_write(tp); + RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_0); + RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~BIT_7); + rtl8125_disable_cfg9346_write(tp); + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xFC38, 0x0000); + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xFC28, 0x0000); + rtl8125_mac_ocp_write(tp, 0xFC2A, 0x0000); + rtl8125_mac_ocp_write(tp, 0xFC2C, 0x0000); + rtl8125_mac_ocp_write(tp, 0xFC2E, 0x0000); + rtl8125_mac_ocp_write(tp, 0xFC30, 0x0000); + rtl8125_mac_ocp_write(tp, 0xFC32, 0x0000); + rtl8125_mac_ocp_write(tp, 0xFC34, 0x0000); + rtl8125_mac_ocp_write(tp, 0xFC36, 0x0000); + mdelay(3); + rtl8125_mac_ocp_write(tp, 0xFC26, 0x0000); + break; + } +} + +#ifndef ENABLE_USE_FIRMWARE_FILE +static void +rtl8125_set_mac_mcu_8125a_1(struct net_device *dev) +{ + rtl8125_hw_disable_mac_mcu_bps(dev); +} + +static void +rtl8125_set_mac_mcu_8125a_2(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u16 i; + static const u16 mcu_patch_code_8125a_2[] = { + 0xE008, 0xE01E, 0xE02E, 0xE054, 0xE057, 0xE059, 0xE0C2, 0xE0CB, 0x9996, + 0x49D1, 0xF005, 0x49D4, 0xF10A, 0x49D8, 0xF108, 0xC00F, 0x7100, 0x209C, + 0x249C, 0xC009, 0x9900, 0xE004, 0xC006, 0x1900, 0x9900, 0xC602, 0xBE00, + 0x5A48, 0xE0C2, 0x0004, 0xE10A, 0xC60F, 0x73C4, 0x49B3, 0xF106, 0x73C2, + 0xC608, 0xB406, 0xC609, 0xFF80, 0xC605, 0xB406, 0xC605, 0xFF80, 0x0544, + 0x0568, 0xE906, 0xCDE8, 0xC724, 0xC624, 0x9EE2, 0x1E01, 0x9EE0, 0x76E0, + 0x49E0, 0xF1FE, 0x76E6, 0x486D, 0x4868, 0x9EE4, 0x1E03, 0x9EE0, 0x76E0, + 0x49E0, 0xF1FE, 0xC615, 0x9EE2, 0x1E01, 0x9EE0, 0x76E0, 0x49E0, 0xF1FE, + 0x76E6, 0x486F, 0x9EE4, 0x1E03, 0x9EE0, 0x76E0, 0x49E0, 0xF1FE, 0x7196, + 0xC702, 0xBF00, 0x5A44, 0xEB0E, 0x0070, 0x00C3, 0x1BC0, 0xC602, 0xBE00, + 0x0E26, 0xC602, 0xBE00, 0x0EBA, 0x1501, 0xF02A, 0x1500, 0xF15D, 0xC661, + 0x75C8, 0x49D5, 0xF00A, 0x49D6, 0xF008, 0x49D7, 0xF006, 0x49D8, 0xF004, + 0x75D2, 0x49D9, 0xF150, 0xC553, 0x77A0, 0x75C8, 0x4855, 0x4856, 0x4857, + 0x4858, 0x48DA, 0x48DB, 0x49FE, 0xF002, 0x485A, 0x49FF, 0xF002, 0x485B, + 0x9DC8, 0x75D2, 0x4859, 0x9DD2, 0xC643, 0x75C0, 0x49D4, 0xF033, 0x49D0, + 0xF137, 0xE030, 0xC63A, 0x75C8, 0x49D5, 0xF00E, 0x49D6, 0xF00C, 0x49D7, + 0xF00A, 0x49D8, 0xF008, 0x75D2, 0x49D9, 0xF005, 0xC62E, 0x75C0, 0x49D7, + 0xF125, 0xC528, 0x77A0, 0xC627, 0x75C8, 0x4855, 0x4856, 0x4857, 0x4858, + 0x48DA, 0x48DB, 0x49FE, 0xF002, 0x485A, 0x49FF, 0xF002, 0x485B, 0x9DC8, + 0x75D2, 0x4859, 0x9DD2, 0xC616, 0x75C0, 0x4857, 0x9DC0, 0xC613, 0x75C0, + 0x49DA, 0xF003, 0x49D0, 0xF107, 0xC60B, 0xC50E, 0x48D9, 0x9DC0, 0x4859, + 0x9DC0, 0xC608, 0xC702, 0xBF00, 0x3AE0, 0xE860, 0xB400, 0xB5D4, 0xE908, + 0xE86C, 0x1200, 0xC409, 0x6780, 0x48F1, 0x8F80, 0xC404, 0xC602, 0xBE00, + 0x10AA, 0xC010, 0xEA7C, 0xC602, 0xBE00, 0x0000 + }; + + rtl8125_hw_disable_mac_mcu_bps(dev); + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8125a_2); i++) { + rtl8125_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8125a_2[i]); + } + + rtl8125_mac_ocp_write(tp, 0xFC26, 0x8000); + + rtl8125_mac_ocp_write(tp, 0xFC2A, 0x0540); + rtl8125_mac_ocp_write(tp, 0xFC2E, 0x0E24); + rtl8125_mac_ocp_write(tp, 0xFC30, 0x0EB8); + rtl8125_mac_ocp_write(tp, 0xFC32, 0x3A5C); + rtl8125_mac_ocp_write(tp, 0xFC34, 0x10A8); + + rtl8125_mac_ocp_write(tp, 0xFC48, 0x007A); +} + +static void +rtl8125_set_mac_mcu_8125b_1(struct net_device *dev) +{ + rtl8125_hw_disable_mac_mcu_bps(dev); +} + +static void +rtl8125_set_mac_mcu_8125b_2(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u16 i; + static const u16 mcu_patch_code_8125b_2[] = { + 0xE010, 0xE01B, 0xE026, 0xE037, 0xE03D, 0xE057, 0xE05B, 0xE05F, 0xE061, + 0xE063, 0xE065, 0xE067, 0xE069, 0xE06B, 0xE06D, 0xE06F, 0x740A, 0x4846, + 0x4847, 0x9C0A, 0xC607, 0x74C0, 0x48C6, 0x9CC0, 0xC602, 0xBE00, 0x13F0, + 0xE054, 0x72CA, 0x4826, 0x4827, 0x9ACA, 0xC607, 0x72C0, 0x48A6, 0x9AC0, + 0xC602, 0xBE00, 0x081C, 0xE054, 0xC60F, 0x74C4, 0x49CC, 0xF109, 0xC60C, + 0x74CA, 0x48C7, 0x9CCA, 0xC609, 0x74C0, 0x4846, 0x9CC0, 0xC602, 0xBE00, + 0x2494, 0xE092, 0xE0C0, 0xE054, 0x7420, 0x48C0, 0x9C20, 0x7444, 0xC602, + 0xBE00, 0x12DC, 0x733A, 0x21B5, 0x25BC, 0x1304, 0xF111, 0x1B12, 0x1D2A, + 0x3168, 0x3ADA, 0x31AB, 0x1A00, 0x9AC0, 0x1300, 0xF1FB, 0x7620, 0x236E, + 0x276F, 0x1A3C, 0x22A1, 0x41B5, 0x9EE2, 0x76E4, 0x486F, 0x9EE4, 0xC602, + 0xBE00, 0x4A26, 0x733A, 0x49BB, 0xC602, 0xBE00, 0x47A2, 0x48C1, 0x48C2, + 0xC5C3, 0xBD00, 0x0A52, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, + 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, + 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, 0xC602, 0xBE00, 0x0000, + 0xC602, 0xBE00, 0x0000 + }; + + rtl8125_hw_disable_mac_mcu_bps(dev); + + for (i = 0; i < ARRAY_SIZE(mcu_patch_code_8125b_2); i++) { + rtl8125_mac_ocp_write(tp, 0xF800 + i * 2, mcu_patch_code_8125b_2[i]); + } + + rtl8125_mac_ocp_write(tp, 0xFC26, 0x8000); + + rtl8125_mac_ocp_write(tp, 0xFC28, 0x13E6); + rtl8125_mac_ocp_write(tp, 0xFC2A, 0x0812); + rtl8125_mac_ocp_write(tp, 0xFC2C, 0x248C); + rtl8125_mac_ocp_write(tp, 0xFC2E, 0x12DA); + rtl8125_mac_ocp_write(tp, 0xFC30, 0x4A20); + rtl8125_mac_ocp_write(tp, 0xFC32, 0x47A0); + rtl8125_mac_ocp_write(tp, 0xFC34, 0x0A46); + + rtl8125_mac_ocp_write(tp, 0xFC48, 0x007F); +} + +static void +rtl8125_hw_mac_mcu_config(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (tp->NotWrMcuPatchCode == TRUE) return; + + switch (tp->mcfg) { + case CFG_METHOD_2: + rtl8125_set_mac_mcu_8125a_1(dev); + break; + case CFG_METHOD_3: + rtl8125_set_mac_mcu_8125a_2(dev); + break; + case CFG_METHOD_4: + rtl8125_set_mac_mcu_8125b_1(dev); + break; + case CFG_METHOD_5: + rtl8125_set_mac_mcu_8125b_2(dev); + break; + } +} +#endif + +#ifdef ENABLE_USE_FIRMWARE_FILE +static void rtl8125_release_firmware(struct rtl8125_private *tp) +{ + if (tp->rtl_fw) { + rtl8125_fw_release_firmware(tp->rtl_fw); + kfree(tp->rtl_fw); + tp->rtl_fw = NULL; + } +} + +void rtl8125_apply_firmware(struct rtl8125_private *tp) +{ + /* TODO: release firmware if rtl_fw_write_firmware signals failure. */ + if (tp->rtl_fw) { + rtl8125_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); + rtl8125_wait_phy_reset_complete(tp); + + tp->hw_ram_code_ver = rtl8125_get_hw_phy_mcu_code_ver(tp); + tp->sw_ram_code_ver = tp->hw_ram_code_ver; + tp->HwHasWrRamCodeToMicroP = TRUE; + } +} +#endif + +static void +rtl8125_hw_init(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u32 csi_tmp; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_enable_cfg9346_write(tp); + RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_0); + RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~BIT_7); + rtl8125_disable_cfg9346_write(tp); + RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) & ~BIT_7); + break; + } + + //Disable UPS + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xD40A, rtl8125_mac_ocp_read( tp, 0xD40A) & ~(BIT_4)); + break; + } + +#ifndef ENABLE_USE_FIRMWARE_FILE + if (!tp->rtl_fw) + rtl8125_hw_mac_mcu_config(dev); +#endif + + /*disable ocp phy power saving*/ + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) + rtl8125_disable_ocp_phy_power_saving(dev); + + //Set PCIE uncorrectable error status mask pcie 0x108 + csi_tmp = rtl8125_csi_read(tp, 0x108); + csi_tmp |= BIT_20; + rtl8125_csi_write(tp, 0x108, csi_tmp); + + rtl8125_enable_cfg9346_write(tp); + rtl8125_disable_linkchg_wakeup(dev); + rtl8125_disable_cfg9346_write(tp); + rtl8125_disable_magic_packet(dev); + rtl8125_disable_d0_speedup(tp); + rtl8125_set_pci_pme(tp, 0); + if (s0_magic_packet == 1) + rtl8125_enable_magic_packet(dev); + +#ifdef ENABLE_USE_FIRMWARE_FILE + if (tp->rtl_fw && + !tp->resume_not_chg_speed && + !(HW_DASH_SUPPORT_TYPE_3(tp) && + tp->HwPkgDet == 0x06)) + rtl8125_apply_firmware(tp); +#endif +} + +static void +rtl8125_hw_ephy_config(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + rtl8125_ephy_write(tp, 0x01, 0xA812); + rtl8125_ephy_write(tp, 0x09, 0x520C); + rtl8125_ephy_write(tp, 0x04, 0xD000); + rtl8125_ephy_write(tp, 0x0D, 0xF702); + rtl8125_ephy_write(tp, 0x0A, 0x8653); + rtl8125_ephy_write(tp, 0x06, 0x001E); + rtl8125_ephy_write(tp, 0x08, 0x3595); + rtl8125_ephy_write(tp, 0x20, 0x9455); + rtl8125_ephy_write(tp, 0x21, 0x99FF); + rtl8125_ephy_write(tp, 0x02, 0x6046); + rtl8125_ephy_write(tp, 0x29, 0xFE00); + rtl8125_ephy_write(tp, 0x23, 0xAB62); + + rtl8125_ephy_write(tp, 0x41, 0xA80C); + rtl8125_ephy_write(tp, 0x49, 0x520C); + rtl8125_ephy_write(tp, 0x44, 0xD000); + rtl8125_ephy_write(tp, 0x4D, 0xF702); + rtl8125_ephy_write(tp, 0x4A, 0x8653); + rtl8125_ephy_write(tp, 0x46, 0x001E); + rtl8125_ephy_write(tp, 0x48, 0x3595); + rtl8125_ephy_write(tp, 0x60, 0x9455); + rtl8125_ephy_write(tp, 0x61, 0x99FF); + rtl8125_ephy_write(tp, 0x42, 0x6046); + rtl8125_ephy_write(tp, 0x69, 0xFE00); + rtl8125_ephy_write(tp, 0x63, 0xAB62); + break; + case CFG_METHOD_3: + rtl8125_ephy_write(tp, 0x04, 0xD000); + rtl8125_ephy_write(tp, 0x0A, 0x8653); + rtl8125_ephy_write(tp, 0x23, 0xAB66); + rtl8125_ephy_write(tp, 0x20, 0x9455); + rtl8125_ephy_write(tp, 0x21, 0x99FF); + rtl8125_ephy_write(tp, 0x29, 0xFE04); + + rtl8125_ephy_write(tp, 0x44, 0xD000); + rtl8125_ephy_write(tp, 0x4A, 0x8653); + rtl8125_ephy_write(tp, 0x63, 0xAB66); + rtl8125_ephy_write(tp, 0x60, 0x9455); + rtl8125_ephy_write(tp, 0x61, 0x99FF); + rtl8125_ephy_write(tp, 0x69, 0xFE04); + + ClearAndSetPCIePhyBit(tp, + 0x2A, + (BIT_14 | BIT_13 | BIT_12), + (BIT_13 | BIT_12) + ); + ClearPCIePhyBit(tp, 0x19, BIT_6); + SetPCIePhyBit(tp, 0x1B, (BIT_11 | BIT_10 | BIT_9)); + ClearPCIePhyBit(tp, 0x1B, (BIT_14 | BIT_13 | BIT_12)); + rtl8125_ephy_write(tp, 0x02, 0x6042); + rtl8125_ephy_write(tp, 0x06, 0x0014); + + ClearAndSetPCIePhyBit(tp, + 0x6A, + (BIT_14 | BIT_13 | BIT_12), + (BIT_13 | BIT_12) + ); + ClearPCIePhyBit(tp, 0x59, BIT_6); + SetPCIePhyBit(tp, 0x5B, (BIT_11 | BIT_10 | BIT_9)); + ClearPCIePhyBit(tp, 0x5B, (BIT_14 | BIT_13 | BIT_12)); + rtl8125_ephy_write(tp, 0x42, 0x6042); + rtl8125_ephy_write(tp, 0x46, 0x0014); + break; + case CFG_METHOD_4: + rtl8125_ephy_write(tp, 0x06, 0x001F); + rtl8125_ephy_write(tp, 0x0A, 0xB66B); + rtl8125_ephy_write(tp, 0x01, 0xA852); + rtl8125_ephy_write(tp, 0x24, 0x0008); + rtl8125_ephy_write(tp, 0x2F, 0x6052); + rtl8125_ephy_write(tp, 0x0D, 0xF716); + rtl8125_ephy_write(tp, 0x20, 0xD477); + rtl8125_ephy_write(tp, 0x21, 0x4477); + rtl8125_ephy_write(tp, 0x22, 0x0013); + rtl8125_ephy_write(tp, 0x23, 0xBB66); + rtl8125_ephy_write(tp, 0x0B, 0xA909); + rtl8125_ephy_write(tp, 0x29, 0xFF04); + rtl8125_ephy_write(tp, 0x1B, 0x1EA0); + + rtl8125_ephy_write(tp, 0x46, 0x001F); + rtl8125_ephy_write(tp, 0x4A, 0xB66B); + rtl8125_ephy_write(tp, 0x41, 0xA84A); + rtl8125_ephy_write(tp, 0x64, 0x000C); + rtl8125_ephy_write(tp, 0x6F, 0x604A); + rtl8125_ephy_write(tp, 0x4D, 0xF716); + rtl8125_ephy_write(tp, 0x60, 0xD477); + rtl8125_ephy_write(tp, 0x61, 0x4477); + rtl8125_ephy_write(tp, 0x62, 0x0013); + rtl8125_ephy_write(tp, 0x63, 0xBB66); + rtl8125_ephy_write(tp, 0x4B, 0xA909); + rtl8125_ephy_write(tp, 0x69, 0xFF04); + rtl8125_ephy_write(tp, 0x5B, 0x1EA0); + break; + case CFG_METHOD_5: + rtl8125_ephy_write(tp, 0x0B, 0xA908); + rtl8125_ephy_write(tp, 0x22, 0x0023); + rtl8125_ephy_write(tp, 0x1E, 0x28EB); + + rtl8125_ephy_write(tp, 0x4B, 0xA908); + rtl8125_ephy_write(tp, 0x62, 0x0023); + rtl8125_ephy_write(tp, 0x5E, 0x28EB); + break; + } +} + +static u16 +rtl8125_get_hw_phy_mcu_code_ver(struct rtl8125_private *tp) +{ + u16 hw_ram_code_ver = ~0; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + mdio_direct_write_phy_ocp(tp, 0xA436, 0x801E); + hw_ram_code_ver = mdio_direct_read_phy_ocp(tp, 0xA438); + break; + } + + return hw_ram_code_ver; +} + +static int +rtl8125_check_hw_phy_mcu_code_ver(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int ram_code_ver_match = 0; + + tp->hw_ram_code_ver = rtl8125_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; +} + +bool +rtl8125_set_phy_mcu_patch_request(struct rtl8125_private *tp) +{ + u16 gphy_val; + u16 WaitCount; + bool bSuccess = TRUE; + + SetEthPhyOcpBit(tp, 0xB820, BIT_4); + + WaitCount = 0; + do { + gphy_val = mdio_direct_read_phy_ocp(tp, 0xB800); + udelay(100); + WaitCount++; + } while (!(gphy_val & BIT_6) && (WaitCount < 1000)); + + if (!(gphy_val & BIT_6) && (WaitCount == 1000)) bSuccess = FALSE; + + if (!bSuccess) + dprintk("rtl8125_set_phy_mcu_patch_request fail.\n"); + + return bSuccess; +} + +bool +rtl8125_clear_phy_mcu_patch_request(struct rtl8125_private *tp) +{ + u16 gphy_val; + u16 WaitCount; + bool bSuccess = TRUE; + + ClearEthPhyOcpBit(tp, 0xB820, BIT_4); + + WaitCount = 0; + do { + gphy_val = mdio_direct_read_phy_ocp(tp, 0xB800); + udelay(100); + WaitCount++; + } while ((gphy_val & BIT_6) && (WaitCount < 1000)); + + if ((gphy_val & BIT_6) && (WaitCount == 1000)) bSuccess = FALSE; + + if (!bSuccess) + dprintk("rtl8125_clear_phy_mcu_patch_request fail.\n"); + + return bSuccess; +} + +#ifndef ENABLE_USE_FIRMWARE_FILE +static void +rtl8125_write_hw_phy_mcu_code_ver(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + mdio_direct_write_phy_ocp(tp, 0xA436, 0x801E); + mdio_direct_write_phy_ocp(tp, 0xA438, tp->sw_ram_code_ver); + tp->hw_ram_code_ver = tp->sw_ram_code_ver; + break; + } +} + +static void +rtl8125_acquire_phy_mcu_patch_key_lock(struct rtl8125_private *tp) +{ + u16 PatchKey; + + switch (tp->mcfg) { + case CFG_METHOD_2: + PatchKey = 0x8600; + break; + case CFG_METHOD_3: + PatchKey = 0x8601; + break; + case CFG_METHOD_4: + PatchKey = 0x3700; + break; + case CFG_METHOD_5: + PatchKey = 0x3701; + break; + default: + return; + } + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8024); + mdio_direct_write_phy_ocp(tp, 0xA438, PatchKey); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xB82E); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0001); +} + +static void +rtl8125_release_phy_mcu_patch_key_lock(struct rtl8125_private *tp) +{ + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + mdio_direct_write_phy_ocp(tp, 0xA436, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + ClearEthPhyOcpBit(tp, 0xB82E, BIT_0); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8024); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + break; + default: + break; + } +} + +static void +rtl8125_set_phy_mcu_ram_code(struct net_device *dev, const u16 *ramcode, u16 codesize) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u16 i; + u16 addr; + u16 val; + + if (ramcode == NULL || codesize % 2) { + goto out; + } + + for (i = 0; i < codesize; i += 2) { + addr = ramcode[i]; + val = ramcode[i + 1]; + if (addr == 0xFFFF && val == 0xFFFF) { + break; + } + mdio_direct_write_phy_ocp(tp, addr, val); + } + +out: + return; +} + +static void +rtl8125_enable_phy_disable_mode(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->HwSuppCheckPhyDisableModeVer) { + case 3: + RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) | BIT_5); + break; + } + + dprintk("enable phy disable mode.\n"); +} + +static void +rtl8125_disable_phy_disable_mode(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->HwSuppCheckPhyDisableModeVer) { + case 3: + RTL_W8(tp, 0xF2, RTL_R8(tp, 0xF2) & ~BIT_5); + break; + } + + mdelay(1); + + dprintk("disable phy disable mode.\n"); +} + +static void +rtl8125_set_hw_phy_before_init_phy_mcu(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u16 PhyRegValue; + + switch (tp->mcfg) { + case CFG_METHOD_4: + mdio_direct_write_phy_ocp(tp, 0xBF86, 0x9000); + + SetEthPhyOcpBit(tp, 0xC402, BIT_10); + ClearEthPhyOcpBit(tp, 0xC402, BIT_10); + + PhyRegValue = mdio_direct_read_phy_ocp(tp, 0xBF86); + PhyRegValue &= (BIT_1 | BIT_0); + if (PhyRegValue != 0) + dprintk("PHY watch dog not clear, value = 0x%x \n", PhyRegValue); + + mdio_direct_write_phy_ocp(tp, 0xBD86, 0x1010); + mdio_direct_write_phy_ocp(tp, 0xBD88, 0x1010); + + ClearAndSetEthPhyOcpBit(tp, + 0xBD4E, + BIT_11 | BIT_10, + BIT_11); + ClearAndSetEthPhyOcpBit(tp, + 0xBF46, + BIT_11 | BIT_10 | BIT_9 | BIT_8, + BIT_10 | BIT_9 | BIT_8); + break; + } +} + +static void +rtl8125_real_set_phy_mcu_8125a_1(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + rtl8125_acquire_phy_mcu_patch_key_lock(tp); + + + SetEthPhyOcpBit(tp, 0xB820, BIT_7); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8013); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8021); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x802f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x803d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8042); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8051); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8051); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa088); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a50); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8008); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd014); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1a3); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x401a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd707); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x40c2); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60a6); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f8b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a86); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a6c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8080); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd019); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1a2); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x401a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd707); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x40c4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60a6); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f8b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a86); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a84); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd503); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8970); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c07); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0901); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xcf09); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd705); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xceff); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf0a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1213); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8401); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8580); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1253); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd064); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd181); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4018); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xc50f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd706); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2c59); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x804d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xc60f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xc605); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xae02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x10fd); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA026); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA024); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA022); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x10f4); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA020); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1252); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA006); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1206); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA004); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a78); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a60); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a4f); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA008); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x3f00); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0010); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8066); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x807c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8089); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x808e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x80a0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x80b2); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x80c2); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x62db); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x655c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd73e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60e9); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x614a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x61ab); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0505); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0509); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x653c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd73e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60e9); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x614a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x61ab); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0502); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0506); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x050a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd73e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60e9); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x614a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x61ab); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0505); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0506); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x050c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd73e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60e9); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x614a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x61ab); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0509); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x050a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x050c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0508); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0304); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd73e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60e9); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x614a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x61ab); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0321); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0502); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0321); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0321); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0508); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0321); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0346); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8208); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x609d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa50f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x001a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x001a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x607d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00ab); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00ab); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60fd); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa50f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaa0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x017b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a05); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x017b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60fd); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa50f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaa0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x01e0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a05); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x01e0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60fd); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa50f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaa0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0231); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0503); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a05); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0231); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08E); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08C); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0221); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08A); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x01ce); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA088); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0169); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA086); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00a6); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA084); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x000d); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA082); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0308); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA080); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x029f); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA090); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x007f); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0020); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8017); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x801b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8029); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8054); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x805a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8064); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x80a7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x9430); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x9480); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb408); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd120); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd057); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x064b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb80); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x9906); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0567); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb94); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8190); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x82a0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x800a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8406); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8dff); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa840); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0773); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb91); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4063); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd139); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd140); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07dc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa610); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa110); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa2a0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4045); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa180); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x405d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa720); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0742); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07ec); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f74); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0742); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd702); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7fb6); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8190); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x82a0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8610); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07dc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x064b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07c0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5fa7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0481); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x94bc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x870c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa190); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa00a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa280); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8220); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x078e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb92); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa840); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4063); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd140); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd150); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd703); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60a0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6121); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x61a2); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6223); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf02f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d10); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf00f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d20); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf00a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d30); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf005); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d40); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa610); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa008); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4046); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x405d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa720); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0742); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07f7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f74); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0742); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd702); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7fb5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x800a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x3ad4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0537); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8610); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8840); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x064b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8301); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x800a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8190); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x82a0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa70c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x9402); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x890c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8840); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x064b); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10E); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0642); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10C); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0686); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10A); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0788); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA108); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x047b); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA106); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x065c); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA104); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0769); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA102); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0565); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA100); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x06f9); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA110); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00ff); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb87c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8530); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb87e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf85); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x3caf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8593); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf85); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x9caf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x85a5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd702); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5afb); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xe083); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfb0c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x020d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x021b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x10bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86d7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86da); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbe0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x83fc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1b10); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xda02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xdd02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5afb); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xe083); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfd0c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x020d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x021b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x10bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86dd); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86e0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbe0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x83fe); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1b10); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xe002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf2f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbd02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2cac); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0286); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x65af); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x212b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x022c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86b6); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf21); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cd1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x03bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8710); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x870d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8719); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8716); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x871f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x871c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8728); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8725); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8707); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbad); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x281c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd100); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1302); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2202); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2b02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xae1a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd101); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1302); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2202); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2b02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd101); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x3402); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x3102); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x3d02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x3a02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4302); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4c02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4902); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd100); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2e02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x3702); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4602); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf87); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4f02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ab7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf35); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7ff8); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfaef); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x69bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86e3); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbbf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86fb); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86e6); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbbf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86fe); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86e9); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbbf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86ec); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfbbf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x025a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7bf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86ef); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0262); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7cbf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86f2); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0262); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7cbf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86f5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0262); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7cbf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x86f8); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0262); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7cef); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x96fe); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfc04); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf8fa); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xef69); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xef02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6273); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf202); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6273); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf502); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6273); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbf86); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf802); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6273); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xef96); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfefc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0420); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb540); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x53b5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4086); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb540); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb9b5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x40c8); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb03a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xc8b0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbac8); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb13a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xc8b1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xba77); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbd26); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffbd); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2677); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbd28); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffbd); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2840); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbd26); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xc8bd); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2640); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbd28); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xc8bd); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x28bb); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa430); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x98b0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1eba); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb01e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xdcb0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e98); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb09e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbab0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x9edc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb09e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x98b1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1eba); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb11e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xdcb1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e98); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb19e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbab1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x9edc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb19e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x11b0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e22); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb01e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x33b0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e11); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb09e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x22b0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x9e33); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb09e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x11b1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e22); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb11e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x33b1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1e11); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb19e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x22b1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x9e33); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb19e); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb85e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2f71); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb860); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x20d9); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb862); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2109); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb864); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x34e7); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb878); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x000f); + + + ClearEthPhyOcpBit(tp, 0xB820, BIT_7); + + + rtl8125_release_phy_mcu_patch_key_lock(tp); +} + +static void +rtl8125_set_phy_mcu_8125a_1(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + rtl8125_set_phy_mcu_patch_request(tp); + + rtl8125_real_set_phy_mcu_8125a_1(dev); + + rtl8125_clear_phy_mcu_patch_request(tp); +} + +static void +rtl8125_real_set_phy_mcu_8125a_2(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + rtl8125_acquire_phy_mcu_patch_key_lock(tp); + + + SetEthPhyOcpBit(tp, 0xB820, BIT_7); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x808b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x808f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8093); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8097); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x809d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x80a1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x80aa); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x607b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x40da); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf00e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x42da); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf01e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x615b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1456); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x14a4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x14bc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f2e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf01c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1456); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x14a4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x14bc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f2e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf024); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1456); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x14a4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x14bc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f2e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf02c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1456); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x14a4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x14bc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f2e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf034); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd719); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4118); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xac11); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa410); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4779); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xac0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xae01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1444); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf034); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd719); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4118); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xac22); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa420); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4559); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xac0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xae01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1444); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf023); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd719); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4118); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xac44); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa440); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4339); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xac0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xae01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1444); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf012); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd719); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4118); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xac88); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa480); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xce00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4119); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xac0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xae01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1444); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf001); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1456); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd718); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5fac); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xc48f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x141b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd504); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x121a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd0b4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1bb); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0898); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd0b4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1bb); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a0e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd064); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd18a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0b7e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x401c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd501); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa804); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8804); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x053b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd500); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa301); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0648); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xc520); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa201); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x252d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1646); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd708); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4006); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1646); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0308); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA026); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0307); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA024); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1645); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA022); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0647); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA020); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x053a); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA006); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0b7c); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA004); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0a0c); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0896); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x11a1); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA008); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xff00); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0010); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8015); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x801a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xad02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x02d7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00ed); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0509); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xc100); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x008f); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08E); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08C); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA08A); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA088); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA086); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA084); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA082); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x008d); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA080); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00eb); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA090); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0103); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA016); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0020); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA012); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA014); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8014); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8018); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8024); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8051); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8055); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8072); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x80dc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfffd); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfffd); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8301); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x800a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8190); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x82a0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa70c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x9402); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x890c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8840); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa380); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x066e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb91); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4063); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd139); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd140); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa610); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa110); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa2a0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4085); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa180); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8280); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x405d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa720); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0743); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07f0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5f74); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0743); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd702); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7fb6); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8190); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x82a0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8610); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0c0f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x066e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd158); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd04d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x03d4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x94bc); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x870c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8380); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd10d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07c4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5fb4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa190); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa00a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa280); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa404); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa220); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd130); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07c4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5fb4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xbb80); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1c4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd074); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa301); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x604b); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa90c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0556); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xcb92); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4063); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd116); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd119); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd040); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd703); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x60a0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6241); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x63e2); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6583); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf054); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x611e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x40da); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d10); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf02f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d50); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf02a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x611e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x40da); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d20); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf021); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d60); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf01c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x611e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x40da); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d30); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf013); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d70); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf00e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x611e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x40da); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d40); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf005); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d80); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e8); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa610); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x405d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa720); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd700); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x5ff4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa008); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd704); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x4046); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0743); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07fb); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd703); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7f6f); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7f4e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7f2d); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7f0c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x800a); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0cf0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0d00); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07e8); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8010); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa740); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0743); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd702); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7fb5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd701); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x3ad4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0556); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8610); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x066e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd1f5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xd049); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x1800); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x01ec); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10E); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x01ea); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10C); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x06a9); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA10A); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x078a); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA108); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x03d2); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA106); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x067f); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA104); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0665); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA102); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA100); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xA110); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00fc); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb87c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8530); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb87e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf85); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x3caf); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8545); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf85); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x45af); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8545); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xee82); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf900); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0103); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xaf03); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb7f8); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xe0a6); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00e1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa601); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xef01); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x58f0); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa080); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x37a1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8402); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xae16); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa185); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x02ae); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x11a1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8702); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xae0c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xa188); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x02ae); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x07a1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8902); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xae02); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xae1c); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xe0b4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x62e1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb463); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6901); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xe4b4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x62e5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb463); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xe0b4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x62e1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb463); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6901); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xe4b4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x62e5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xb463); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xfc04); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb85e); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x03b3); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb860); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb862); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb864); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xffff); + mdio_direct_write_phy_ocp(tp, 0xA436, 0xb878); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0001); + + + ClearEthPhyOcpBit(tp, 0xB820, BIT_7); + + + rtl8125_release_phy_mcu_patch_key_lock(tp); +} + +static void +rtl8125_set_phy_mcu_8125a_2(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + rtl8125_set_phy_mcu_patch_request(tp); + + rtl8125_real_set_phy_mcu_8125a_2(dev); + + rtl8125_clear_phy_mcu_patch_request(tp); +} + +static const u16 phy_mcu_ram_code_8125b_1[] = { + 0xa436, 0x8024, 0xa438, 0x3700, 0xa436, 0xB82E, 0xa438, 0x0001, + 0xb820, 0x0090, 0xa436, 0xA016, 0xa438, 0x0000, 0xa436, 0xA012, + 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, + 0xa438, 0x1800, 0xa438, 0x8025, 0xa438, 0x1800, 0xa438, 0x803a, + 0xa438, 0x1800, 0xa438, 0x8044, 0xa438, 0x1800, 0xa438, 0x8083, + 0xa438, 0x1800, 0xa438, 0x808d, 0xa438, 0x1800, 0xa438, 0x808d, + 0xa438, 0x1800, 0xa438, 0x808d, 0xa438, 0xd712, 0xa438, 0x4077, + 0xa438, 0xd71e, 0xa438, 0x4159, 0xa438, 0xd71e, 0xa438, 0x6099, + 0xa438, 0x7f44, 0xa438, 0x1800, 0xa438, 0x1a14, 0xa438, 0x9040, + 0xa438, 0x9201, 0xa438, 0x1800, 0xa438, 0x1b1a, 0xa438, 0xd71e, + 0xa438, 0x2425, 0xa438, 0x1a14, 0xa438, 0xd71f, 0xa438, 0x3ce5, + 0xa438, 0x1afb, 0xa438, 0x1800, 0xa438, 0x1b00, 0xa438, 0xd712, + 0xa438, 0x4077, 0xa438, 0xd71e, 0xa438, 0x4159, 0xa438, 0xd71e, + 0xa438, 0x60b9, 0xa438, 0x2421, 0xa438, 0x1c17, 0xa438, 0x1800, + 0xa438, 0x1a14, 0xa438, 0x9040, 0xa438, 0x1800, 0xa438, 0x1c2c, + 0xa438, 0xd71e, 0xa438, 0x2425, 0xa438, 0x1a14, 0xa438, 0xd71f, + 0xa438, 0x3ce5, 0xa438, 0x1c0f, 0xa438, 0x1800, 0xa438, 0x1c13, + 0xa438, 0xd702, 0xa438, 0xd501, 0xa438, 0x6072, 0xa438, 0x8401, + 0xa438, 0xf002, 0xa438, 0xa401, 0xa438, 0x1000, 0xa438, 0x146e, + 0xa438, 0x1800, 0xa438, 0x0b77, 0xa438, 0xd703, 0xa438, 0x665d, + 0xa438, 0x653e, 0xa438, 0x641f, 0xa438, 0xd700, 0xa438, 0x62c4, + 0xa438, 0x6185, 0xa438, 0x6066, 0xa438, 0x1800, 0xa438, 0x165a, + 0xa438, 0xc101, 0xa438, 0xcb00, 0xa438, 0x1000, 0xa438, 0x1945, + 0xa438, 0xd700, 0xa438, 0x7fa6, 0xa438, 0x1800, 0xa438, 0x807d, + 0xa438, 0xc102, 0xa438, 0xcb00, 0xa438, 0x1000, 0xa438, 0x1945, + 0xa438, 0xd700, 0xa438, 0x2569, 0xa438, 0x8058, 0xa438, 0x1800, + 0xa438, 0x807d, 0xa438, 0xc104, 0xa438, 0xcb00, 0xa438, 0x1000, + 0xa438, 0x1945, 0xa438, 0xd700, 0xa438, 0x7fa4, 0xa438, 0x1800, + 0xa438, 0x807d, 0xa438, 0xc120, 0xa438, 0xcb00, 0xa438, 0x1000, + 0xa438, 0x1945, 0xa438, 0xd703, 0xa438, 0x7fbf, 0xa438, 0x1800, + 0xa438, 0x807d, 0xa438, 0xc140, 0xa438, 0xcb00, 0xa438, 0x1000, + 0xa438, 0x1945, 0xa438, 0xd703, 0xa438, 0x7fbe, 0xa438, 0x1800, + 0xa438, 0x807d, 0xa438, 0xc180, 0xa438, 0xcb00, 0xa438, 0x1000, + 0xa438, 0x1945, 0xa438, 0xd703, 0xa438, 0x7fbd, 0xa438, 0xc100, + 0xa438, 0xcb00, 0xa438, 0xd708, 0xa438, 0x6018, 0xa438, 0x1800, + 0xa438, 0x165a, 0xa438, 0x1000, 0xa438, 0x14f6, 0xa438, 0xd014, + 0xa438, 0xd1e3, 0xa438, 0x1000, 0xa438, 0x1356, 0xa438, 0xd705, + 0xa438, 0x5fbe, 0xa438, 0x1800, 0xa438, 0x1559, 0xa436, 0xA026, + 0xa438, 0xffff, 0xa436, 0xA024, 0xa438, 0xffff, 0xa436, 0xA022, + 0xa438, 0xffff, 0xa436, 0xA020, 0xa438, 0x1557, 0xa436, 0xA006, + 0xa438, 0x1677, 0xa436, 0xA004, 0xa438, 0x0b75, 0xa436, 0xA002, + 0xa438, 0x1c17, 0xa436, 0xA000, 0xa438, 0x1b04, 0xa436, 0xA008, + 0xa438, 0x1f00, 0xa436, 0xA016, 0xa438, 0x0020, 0xa436, 0xA012, + 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, + 0xa438, 0x1800, 0xa438, 0x817f, 0xa438, 0x1800, 0xa438, 0x82ab, + 0xa438, 0x1800, 0xa438, 0x83f8, 0xa438, 0x1800, 0xa438, 0x8444, + 0xa438, 0x1800, 0xa438, 0x8454, 0xa438, 0x1800, 0xa438, 0x8459, + 0xa438, 0x1800, 0xa438, 0x8465, 0xa438, 0xcb11, 0xa438, 0xa50c, + 0xa438, 0x8310, 0xa438, 0xd701, 0xa438, 0x4076, 0xa438, 0x0c03, + 0xa438, 0x0903, 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, + 0xa438, 0x0d00, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d00, + 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0x1000, 0xa438, 0x0a4d, + 0xa438, 0xcb12, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x5f84, 0xa438, 0xd102, 0xa438, 0xd040, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xd701, + 0xa438, 0x60f3, 0xa438, 0xd413, 0xa438, 0x1000, 0xa438, 0x0a37, + 0xa438, 0xd410, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xcb13, + 0xa438, 0xa108, 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8108, + 0xa438, 0xa00a, 0xa438, 0xa910, 0xa438, 0xa780, 0xa438, 0xd14a, + 0xa438, 0xd048, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd701, + 0xa438, 0x6255, 0xa438, 0xd700, 0xa438, 0x5f74, 0xa438, 0x6326, + 0xa438, 0xd702, 0xa438, 0x5f07, 0xa438, 0x800a, 0xa438, 0xa004, + 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8004, 0xa438, 0xa001, + 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, 0xa438, 0x0c03, + 0xa438, 0x0902, 0xa438, 0xffe2, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd71f, 0xa438, 0x5fab, 0xa438, 0xba08, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f8b, 0xa438, 0x9a08, + 0xa438, 0x800a, 0xa438, 0xd702, 0xa438, 0x6535, 0xa438, 0xd40d, + 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xcb14, 0xa438, 0xa004, + 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8004, 0xa438, 0xa001, + 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, 0xa438, 0xa00a, + 0xa438, 0xa780, 0xa438, 0xd14a, 0xa438, 0xd048, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x6206, + 0xa438, 0xd702, 0xa438, 0x5f47, 0xa438, 0x800a, 0xa438, 0xa004, + 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8004, 0xa438, 0xa001, + 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, 0xa438, 0x0c03, + 0xa438, 0x0902, 0xa438, 0x1800, 0xa438, 0x8064, 0xa438, 0x800a, + 0xa438, 0xd40e, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xb920, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, + 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x7f8c, 0xa438, 0xd701, 0xa438, 0x6073, 0xa438, 0xd701, + 0xa438, 0x4216, 0xa438, 0xa004, 0xa438, 0x1000, 0xa438, 0x0a42, + 0xa438, 0x8004, 0xa438, 0xa001, 0xa438, 0x1000, 0xa438, 0x0a42, + 0xa438, 0x8001, 0xa438, 0xd120, 0xa438, 0xd040, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x8504, + 0xa438, 0xcb21, 0xa438, 0xa301, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd700, 0xa438, 0x5f9f, 0xa438, 0x8301, 0xa438, 0xd704, + 0xa438, 0x40e0, 0xa438, 0xd196, 0xa438, 0xd04d, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xcb22, + 0xa438, 0x1000, 0xa438, 0x0a6d, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xa640, 0xa438, 0x9503, 0xa438, 0x8910, 0xa438, 0x8720, + 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d01, + 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d01, 0xa438, 0x1000, + 0xa438, 0x0a7d, 0xa438, 0x0c1f, 0xa438, 0x0f14, 0xa438, 0xcb23, + 0xa438, 0x8fc0, 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0xaf40, + 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0x0cc0, 0xa438, 0x0f80, + 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0xafc0, 0xa438, 0x1000, + 0xa438, 0x0a25, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd701, + 0xa438, 0x5dee, 0xa438, 0xcb24, 0xa438, 0x8f1f, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd701, 0xa438, 0x7f6e, 0xa438, 0xa111, + 0xa438, 0xa215, 0xa438, 0xa401, 0xa438, 0x8404, 0xa438, 0xa720, + 0xa438, 0xcb25, 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8640, + 0xa438, 0x9503, 0xa438, 0x1000, 0xa438, 0x0b43, 0xa438, 0x1000, + 0xa438, 0x0b86, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xb920, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, + 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x7f8c, 0xa438, 0xcb26, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd71f, 0xa438, 0x5f82, 0xa438, 0x8111, 0xa438, 0x8205, + 0xa438, 0x8404, 0xa438, 0xcb27, 0xa438, 0xd404, 0xa438, 0x1000, + 0xa438, 0x0a37, 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, + 0xa438, 0x0d02, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d02, + 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0xa710, 0xa438, 0xa104, + 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8104, 0xa438, 0xa001, + 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, 0xa438, 0xa120, + 0xa438, 0xaa0f, 0xa438, 0x8110, 0xa438, 0xa284, 0xa438, 0xa404, + 0xa438, 0xa00a, 0xa438, 0xd193, 0xa438, 0xd046, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xcb28, + 0xa438, 0xa110, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, + 0xa438, 0x5fa8, 0xa438, 0x8110, 0xa438, 0x8284, 0xa438, 0xa404, + 0xa438, 0x800a, 0xa438, 0x8710, 0xa438, 0xb804, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f82, 0xa438, 0x9804, + 0xa438, 0xcb29, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x5f85, 0xa438, 0xa710, 0xa438, 0xb820, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f65, 0xa438, 0x9820, + 0xa438, 0xcb2a, 0xa438, 0xa190, 0xa438, 0xa284, 0xa438, 0xa404, + 0xa438, 0xa00a, 0xa438, 0xd13d, 0xa438, 0xd04a, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x3444, 0xa438, 0x8149, + 0xa438, 0xa220, 0xa438, 0xd1a0, 0xa438, 0xd040, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x3444, 0xa438, 0x8151, + 0xa438, 0xd702, 0xa438, 0x5f51, 0xa438, 0xcb2f, 0xa438, 0xa302, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd708, 0xa438, 0x5f63, + 0xa438, 0xd411, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0x8302, + 0xa438, 0xd409, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xb920, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, + 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x7f8c, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x5fa3, 0xa438, 0x8190, 0xa438, 0x82a4, 0xa438, 0x8404, + 0xa438, 0x800a, 0xa438, 0xb808, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd71f, 0xa438, 0x7fa3, 0xa438, 0x9808, 0xa438, 0x1800, + 0xa438, 0x0433, 0xa438, 0xcb15, 0xa438, 0xa508, 0xa438, 0xd700, + 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d01, 0xa438, 0xf003, + 0xa438, 0x0c1f, 0xa438, 0x0d01, 0xa438, 0x1000, 0xa438, 0x0a7d, + 0xa438, 0x1000, 0xa438, 0x0a4d, 0xa438, 0xa301, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5f9f, 0xa438, 0x8301, + 0xa438, 0xd704, 0xa438, 0x40e0, 0xa438, 0xd115, 0xa438, 0xd04f, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, + 0xa438, 0xd413, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xcb16, + 0xa438, 0x1000, 0xa438, 0x0a6d, 0xa438, 0x0c03, 0xa438, 0x1502, + 0xa438, 0xa640, 0xa438, 0x9503, 0xa438, 0x8720, 0xa438, 0xd17a, + 0xa438, 0xd04c, 0xa438, 0x0c1f, 0xa438, 0x0f14, 0xa438, 0xcb17, + 0xa438, 0x8fc0, 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0xaf40, + 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0x0cc0, 0xa438, 0x0f80, + 0xa438, 0x1000, 0xa438, 0x0a25, 0xa438, 0xafc0, 0xa438, 0x1000, + 0xa438, 0x0a25, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd701, + 0xa438, 0x61ce, 0xa438, 0xd700, 0xa438, 0x5db4, 0xa438, 0xcb18, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8640, 0xa438, 0x9503, + 0xa438, 0xa720, 0xa438, 0x1000, 0xa438, 0x0b43, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xffd6, 0xa438, 0x8f1f, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd701, 0xa438, 0x7f8e, 0xa438, 0xa131, + 0xa438, 0xaa0f, 0xa438, 0xa2d5, 0xa438, 0xa407, 0xa438, 0xa720, + 0xa438, 0x8310, 0xa438, 0xa308, 0xa438, 0x8308, 0xa438, 0xcb19, + 0xa438, 0x0c03, 0xa438, 0x1502, 0xa438, 0x8640, 0xa438, 0x9503, + 0xa438, 0x1000, 0xa438, 0x0b43, 0xa438, 0x1000, 0xa438, 0x0b86, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xb920, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, 0xa438, 0x9920, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f8c, + 0xa438, 0xcb1a, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x5f82, 0xa438, 0x8111, 0xa438, 0x82c5, 0xa438, 0xa404, + 0xa438, 0x8402, 0xa438, 0xb804, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd71f, 0xa438, 0x7f82, 0xa438, 0x9804, 0xa438, 0xcb1b, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5f85, + 0xa438, 0xa710, 0xa438, 0xb820, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd71f, 0xa438, 0x7f65, 0xa438, 0x9820, 0xa438, 0xcb1c, + 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d02, + 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d02, 0xa438, 0x1000, + 0xa438, 0x0a7d, 0xa438, 0xa110, 0xa438, 0xa284, 0xa438, 0xa404, + 0xa438, 0x8402, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, + 0xa438, 0x5fa8, 0xa438, 0xcb1d, 0xa438, 0xa180, 0xa438, 0xa402, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fa8, + 0xa438, 0xa220, 0xa438, 0xd1f5, 0xa438, 0xd049, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x3444, 0xa438, 0x8221, + 0xa438, 0xd702, 0xa438, 0x5f51, 0xa438, 0xb920, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, 0xa438, 0x9920, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f8c, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fa3, + 0xa438, 0xa504, 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, + 0xa438, 0x0d00, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d00, + 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0xa00a, 0xa438, 0x8190, + 0xa438, 0x82a4, 0xa438, 0x8402, 0xa438, 0xa404, 0xa438, 0xb808, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7fa3, + 0xa438, 0x9808, 0xa438, 0xcb2b, 0xa438, 0xcb2c, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5f84, 0xa438, 0xd14a, + 0xa438, 0xd048, 0xa438, 0xa780, 0xa438, 0xcb2d, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5f94, 0xa438, 0x6208, + 0xa438, 0xd702, 0xa438, 0x5f27, 0xa438, 0x800a, 0xa438, 0xa004, + 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8004, 0xa438, 0xa001, + 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, 0xa438, 0x0c03, + 0xa438, 0x0902, 0xa438, 0xa00a, 0xa438, 0xffe9, 0xa438, 0xcb2e, + 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d02, + 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d02, 0xa438, 0x1000, + 0xa438, 0x0a7d, 0xa438, 0xa190, 0xa438, 0xa284, 0xa438, 0xa406, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fa8, + 0xa438, 0xa220, 0xa438, 0xd1a0, 0xa438, 0xd040, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x3444, 0xa438, 0x827d, + 0xa438, 0xd702, 0xa438, 0x5f51, 0xa438, 0xcb2f, 0xa438, 0xa302, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd708, 0xa438, 0x5f63, + 0xa438, 0xd411, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0x8302, + 0xa438, 0xd409, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0xb920, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, + 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x7f8c, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x5fa3, 0xa438, 0x8190, 0xa438, 0x82a4, 0xa438, 0x8406, + 0xa438, 0x800a, 0xa438, 0xb808, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd71f, 0xa438, 0x7fa3, 0xa438, 0x9808, 0xa438, 0x1800, + 0xa438, 0x0433, 0xa438, 0xcb30, 0xa438, 0x8380, 0xa438, 0xcb31, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5f86, + 0xa438, 0x9308, 0xa438, 0xb204, 0xa438, 0xb301, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd701, 0xa438, 0x5fa2, 0xa438, 0xb302, + 0xa438, 0x9204, 0xa438, 0xcb32, 0xa438, 0xd408, 0xa438, 0x1000, + 0xa438, 0x0a37, 0xa438, 0xd141, 0xa438, 0xd043, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xd704, + 0xa438, 0x4ccc, 0xa438, 0xd700, 0xa438, 0x4c81, 0xa438, 0xd702, + 0xa438, 0x609e, 0xa438, 0xd1e5, 0xa438, 0xd04d, 0xa438, 0xf003, + 0xa438, 0xd1e5, 0xa438, 0xd04d, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xd700, 0xa438, 0x6083, + 0xa438, 0x0c1f, 0xa438, 0x0d01, 0xa438, 0xf003, 0xa438, 0x0c1f, + 0xa438, 0x0d01, 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0x8710, + 0xa438, 0xa108, 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8108, + 0xa438, 0xa203, 0xa438, 0x8120, 0xa438, 0x8a0f, 0xa438, 0xa111, + 0xa438, 0x8204, 0xa438, 0xa140, 0xa438, 0x1000, 0xa438, 0x0a42, + 0xa438, 0x8140, 0xa438, 0xd17a, 0xa438, 0xd04b, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xa204, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fa7, + 0xa438, 0xb920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x5fac, 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd71f, 0xa438, 0x7f8c, 0xa438, 0xd404, 0xa438, 0x1000, + 0xa438, 0x0a37, 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, + 0xa438, 0x0d02, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d02, + 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0xa710, 0xa438, 0x8101, + 0xa438, 0x8201, 0xa438, 0xa104, 0xa438, 0x1000, 0xa438, 0x0a42, + 0xa438, 0x8104, 0xa438, 0xa120, 0xa438, 0xaa0f, 0xa438, 0x8110, + 0xa438, 0xa284, 0xa438, 0xa404, 0xa438, 0xa00a, 0xa438, 0xd193, + 0xa438, 0xd047, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, + 0xa438, 0x5fb4, 0xa438, 0xa110, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd700, 0xa438, 0x5fa8, 0xa438, 0xa180, 0xa438, 0xd13d, + 0xa438, 0xd04a, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, + 0xa438, 0x5fb4, 0xa438, 0xf024, 0xa438, 0xa710, 0xa438, 0xa00a, + 0xa438, 0x8190, 0xa438, 0x8204, 0xa438, 0xa280, 0xa438, 0xa404, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fa7, + 0xa438, 0x8710, 0xa438, 0xb920, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd71f, 0xa438, 0x5fac, 0xa438, 0x9920, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f8c, 0xa438, 0x800a, + 0xa438, 0x8190, 0xa438, 0x8284, 0xa438, 0x8406, 0xa438, 0xd700, + 0xa438, 0x4121, 0xa438, 0xd701, 0xa438, 0x60f3, 0xa438, 0xd1e5, + 0xa438, 0xd04d, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, + 0xa438, 0x5fb4, 0xa438, 0x8710, 0xa438, 0xa00a, 0xa438, 0x8190, + 0xa438, 0x8204, 0xa438, 0xa280, 0xa438, 0xa404, 0xa438, 0xb920, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x5fac, + 0xa438, 0x9920, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, + 0xa438, 0x7f8c, 0xa438, 0xcb33, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd71f, 0xa438, 0x5f85, 0xa438, 0xa710, 0xa438, 0xb820, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd71f, 0xa438, 0x7f65, + 0xa438, 0x9820, 0xa438, 0xcb34, 0xa438, 0xa00a, 0xa438, 0xa190, + 0xa438, 0xa284, 0xa438, 0xa404, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd700, 0xa438, 0x5fa9, 0xa438, 0xd701, 0xa438, 0x6853, + 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, 0xa438, 0x0d00, + 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d00, 0xa438, 0x1000, + 0xa438, 0x0a7d, 0xa438, 0x8190, 0xa438, 0x8284, 0xa438, 0xcb35, + 0xa438, 0xd407, 0xa438, 0x1000, 0xa438, 0x0a37, 0xa438, 0x8110, + 0xa438, 0x8204, 0xa438, 0xa280, 0xa438, 0xa00a, 0xa438, 0xd704, + 0xa438, 0x4215, 0xa438, 0xa304, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd700, 0xa438, 0x5fb8, 0xa438, 0xd1c3, 0xa438, 0xd043, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, + 0xa438, 0x8304, 0xa438, 0xd700, 0xa438, 0x4109, 0xa438, 0xf01e, + 0xa438, 0xcb36, 0xa438, 0xd412, 0xa438, 0x1000, 0xa438, 0x0a37, + 0xa438, 0xd700, 0xa438, 0x6309, 0xa438, 0xd702, 0xa438, 0x42c7, + 0xa438, 0x800a, 0xa438, 0x8180, 0xa438, 0x8280, 0xa438, 0x8404, + 0xa438, 0xa004, 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8004, + 0xa438, 0xa001, 0xa438, 0x1000, 0xa438, 0x0a42, 0xa438, 0x8001, + 0xa438, 0x0c03, 0xa438, 0x0902, 0xa438, 0xa00a, 0xa438, 0xd14a, + 0xa438, 0xd048, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, + 0xa438, 0x5fb4, 0xa438, 0xd700, 0xa438, 0x6083, 0xa438, 0x0c1f, + 0xa438, 0x0d02, 0xa438, 0xf003, 0xa438, 0x0c1f, 0xa438, 0x0d02, + 0xa438, 0x1000, 0xa438, 0x0a7d, 0xa438, 0xcc55, 0xa438, 0xcb37, + 0xa438, 0xa00a, 0xa438, 0xa190, 0xa438, 0xa2a4, 0xa438, 0xa404, + 0xa438, 0xd700, 0xa438, 0x6041, 0xa438, 0xa402, 0xa438, 0xd13d, + 0xa438, 0xd04a, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, + 0xa438, 0x5fb4, 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, + 0xa438, 0x5fa9, 0xa438, 0xd702, 0xa438, 0x5f71, 0xa438, 0xcb38, + 0xa438, 0x8224, 0xa438, 0xa288, 0xa438, 0x8180, 0xa438, 0xa110, + 0xa438, 0xa404, 0xa438, 0x800a, 0xa438, 0xd700, 0xa438, 0x6041, + 0xa438, 0x8402, 0xa438, 0xd415, 0xa438, 0x1000, 0xa438, 0x0a37, + 0xa438, 0xd13d, 0xa438, 0xd04a, 0xa438, 0x1000, 0xa438, 0x0a5e, + 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0xcb39, 0xa438, 0xa00a, + 0xa438, 0xa190, 0xa438, 0xa2a0, 0xa438, 0xa404, 0xa438, 0xd700, + 0xa438, 0x6041, 0xa438, 0xa402, 0xa438, 0xd17a, 0xa438, 0xd047, + 0xa438, 0x1000, 0xa438, 0x0a5e, 0xa438, 0xd700, 0xa438, 0x5fb4, + 0xa438, 0x1800, 0xa438, 0x0560, 0xa438, 0xa111, 0xa438, 0x0000, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0xd3f5, + 0xa438, 0xd219, 0xa438, 0x1000, 0xa438, 0x0c31, 0xa438, 0xd708, + 0xa438, 0x5fa5, 0xa438, 0xa215, 0xa438, 0xd30e, 0xa438, 0xd21a, + 0xa438, 0x1000, 0xa438, 0x0c31, 0xa438, 0xd708, 0xa438, 0x63e9, + 0xa438, 0xd708, 0xa438, 0x5f65, 0xa438, 0xd708, 0xa438, 0x7f36, + 0xa438, 0xa004, 0xa438, 0x1000, 0xa438, 0x0c35, 0xa438, 0x8004, + 0xa438, 0xa001, 0xa438, 0x1000, 0xa438, 0x0c35, 0xa438, 0x8001, + 0xa438, 0xd708, 0xa438, 0x4098, 0xa438, 0xd102, 0xa438, 0x9401, + 0xa438, 0xf003, 0xa438, 0xd103, 0xa438, 0xb401, 0xa438, 0x1000, + 0xa438, 0x0c27, 0xa438, 0xa108, 0xa438, 0x1000, 0xa438, 0x0c35, + 0xa438, 0x8108, 0xa438, 0x8110, 0xa438, 0x8294, 0xa438, 0xa202, + 0xa438, 0x1800, 0xa438, 0x0bdb, 0xa438, 0xd39c, 0xa438, 0xd210, + 0xa438, 0x1000, 0xa438, 0x0c31, 0xa438, 0xd708, 0xa438, 0x5fa5, + 0xa438, 0xd39c, 0xa438, 0xd210, 0xa438, 0x1000, 0xa438, 0x0c31, + 0xa438, 0xd708, 0xa438, 0x5fa5, 0xa438, 0x1000, 0xa438, 0x0c31, + 0xa438, 0xd708, 0xa438, 0x29b5, 0xa438, 0x840e, 0xa438, 0xd708, + 0xa438, 0x5f4a, 0xa438, 0x0c1f, 0xa438, 0x1014, 0xa438, 0x1000, + 0xa438, 0x0c31, 0xa438, 0xd709, 0xa438, 0x7fa4, 0xa438, 0x901f, + 0xa438, 0x1800, 0xa438, 0x0c23, 0xa438, 0xcb43, 0xa438, 0xa508, + 0xa438, 0xd701, 0xa438, 0x3699, 0xa438, 0x844a, 0xa438, 0xa504, + 0xa438, 0xa190, 0xa438, 0xa2a0, 0xa438, 0xa404, 0xa438, 0xa00a, + 0xa438, 0xd700, 0xa438, 0x2109, 0xa438, 0x05ea, 0xa438, 0xa402, + 0xa438, 0x1800, 0xa438, 0x05ea, 0xa438, 0xcb90, 0xa438, 0x0cf0, + 0xa438, 0x0ca0, 0xa438, 0x1800, 0xa438, 0x06db, 0xa438, 0xd1ff, + 0xa438, 0xd052, 0xa438, 0xa508, 0xa438, 0x8718, 0xa438, 0xa00a, + 0xa438, 0xa190, 0xa438, 0xa2a0, 0xa438, 0xa404, 0xa438, 0x0cf0, + 0xa438, 0x0c50, 0xa438, 0x1800, 0xa438, 0x09ef, 0xa438, 0x1000, + 0xa438, 0x0a5e, 0xa438, 0xd704, 0xa438, 0x2e70, 0xa438, 0x06da, + 0xa438, 0xd700, 0xa438, 0x5f55, 0xa438, 0xa90c, 0xa438, 0x1800, + 0xa438, 0x0645, 0xa436, 0xA10E, 0xa438, 0x0644, 0xa436, 0xA10C, + 0xa438, 0x09e9, 0xa436, 0xA10A, 0xa438, 0x06da, 0xa436, 0xA108, + 0xa438, 0x05e1, 0xa436, 0xA106, 0xa438, 0x0be4, 0xa436, 0xA104, + 0xa438, 0x0435, 0xa436, 0xA102, 0xa438, 0x0141, 0xa436, 0xA100, + 0xa438, 0x026d, 0xa436, 0xA110, 0xa438, 0x00ff, 0xa436, 0xb87c, + 0xa438, 0x85fe, 0xa436, 0xb87e, 0xa438, 0xaf86, 0xa438, 0x16af, + 0xa438, 0x8699, 0xa438, 0xaf86, 0xa438, 0xe5af, 0xa438, 0x86f9, + 0xa438, 0xaf87, 0xa438, 0x7aaf, 0xa438, 0x883a, 0xa438, 0xaf88, + 0xa438, 0x58af, 0xa438, 0x8b6c, 0xa438, 0xd48b, 0xa438, 0x7c02, + 0xa438, 0x8644, 0xa438, 0x2c00, 0xa438, 0x503c, 0xa438, 0xffd6, + 0xa438, 0xac27, 0xa438, 0x18e1, 0xa438, 0x82fe, 0xa438, 0xad28, + 0xa438, 0x0cd4, 0xa438, 0x8b84, 0xa438, 0x0286, 0xa438, 0x442c, + 0xa438, 0x003c, 0xa438, 0xac27, 0xa438, 0x06ee, 0xa438, 0x8299, + 0xa438, 0x01ae, 0xa438, 0x04ee, 0xa438, 0x8299, 0xa438, 0x00af, + 0xa438, 0x23dc, 0xa438, 0xf9fa, 0xa438, 0xcefa, 0xa438, 0xfbef, + 0xa438, 0x79fb, 0xa438, 0xc4bf, 0xa438, 0x8b76, 0xa438, 0x026c, + 0xa438, 0x6dac, 0xa438, 0x2804, 0xa438, 0xd203, 0xa438, 0xae02, + 0xa438, 0xd201, 0xa438, 0xbdd8, 0xa438, 0x19d9, 0xa438, 0xef94, + 0xa438, 0x026c, 0xa438, 0x6d78, 0xa438, 0x03ef, 0xa438, 0x648a, + 0xa438, 0x0002, 0xa438, 0xbdd8, 0xa438, 0x19d9, 0xa438, 0xef94, + 0xa438, 0x026c, 0xa438, 0x6d78, 0xa438, 0x03ef, 0xa438, 0x7402, + 0xa438, 0x72cd, 0xa438, 0xac50, 0xa438, 0x02ef, 0xa438, 0x643a, + 0xa438, 0x019f, 0xa438, 0xe4ef, 0xa438, 0x4678, 0xa438, 0x03ac, + 0xa438, 0x2002, 0xa438, 0xae02, 0xa438, 0xd0ff, 0xa438, 0xffef, + 0xa438, 0x97ff, 0xa438, 0xfec6, 0xa438, 0xfefd, 0xa438, 0x041f, + 0xa438, 0x771f, 0xa438, 0x221c, 0xa438, 0x450d, 0xa438, 0x481f, + 0xa438, 0x00ac, 0xa438, 0x7f04, 0xa438, 0x1a94, 0xa438, 0xae08, + 0xa438, 0x1a94, 0xa438, 0xac7f, 0xa438, 0x03d7, 0xa438, 0x0100, + 0xa438, 0xef46, 0xa438, 0x0d48, 0xa438, 0x1f00, 0xa438, 0x1c45, + 0xa438, 0xef69, 0xa438, 0xef57, 0xa438, 0xef74, 0xa438, 0x0272, + 0xa438, 0xe8a7, 0xa438, 0xffff, 0xa438, 0x0d1a, 0xa438, 0x941b, + 0xa438, 0x979e, 0xa438, 0x072d, 0xa438, 0x0100, 0xa438, 0x1a64, + 0xa438, 0xef76, 0xa438, 0xef97, 0xa438, 0x0d98, 0xa438, 0xd400, + 0xa438, 0xff1d, 0xa438, 0x941a, 0xa438, 0x89cf, 0xa438, 0x1a75, + 0xa438, 0xaf74, 0xa438, 0xf9bf, 0xa438, 0x8b79, 0xa438, 0x026c, + 0xa438, 0x6da1, 0xa438, 0x0005, 0xa438, 0xe180, 0xa438, 0xa0ae, + 0xa438, 0x03e1, 0xa438, 0x80a1, 0xa438, 0xaf26, 0xa438, 0x9aac, + 0xa438, 0x284d, 0xa438, 0xe08f, 0xa438, 0xffef, 0xa438, 0x10c0, + 0xa438, 0xe08f, 0xa438, 0xfe10, 0xa438, 0x1b08, 0xa438, 0xa000, + 0xa438, 0x04c8, 0xa438, 0xaf40, 0xa438, 0x67c8, 0xa438, 0xbf8b, + 0xa438, 0x8c02, 0xa438, 0x6c4e, 0xa438, 0xc4bf, 0xa438, 0x8b8f, + 0xa438, 0x026c, 0xa438, 0x6def, 0xa438, 0x74e0, 0xa438, 0x830c, + 0xa438, 0xad20, 0xa438, 0x0302, 0xa438, 0x74ac, 0xa438, 0xccef, + 0xa438, 0x971b, 0xa438, 0x76ad, 0xa438, 0x5f02, 0xa438, 0xae13, + 0xa438, 0xef69, 0xa438, 0xef30, 0xa438, 0x1b32, 0xa438, 0xc4ef, + 0xa438, 0x46e4, 0xa438, 0x8ffb, 0xa438, 0xe58f, 0xa438, 0xfce7, + 0xa438, 0x8ffd, 0xa438, 0xcc10, 0xa438, 0x11ae, 0xa438, 0xb8d1, + 0xa438, 0x00a1, 0xa438, 0x1f03, 0xa438, 0xaf40, 0xa438, 0x4fbf, + 0xa438, 0x8b8c, 0xa438, 0x026c, 0xa438, 0x4ec4, 0xa438, 0xbf8b, + 0xa438, 0x8f02, 0xa438, 0x6c6d, 0xa438, 0xef74, 0xa438, 0xe083, + 0xa438, 0x0cad, 0xa438, 0x2003, 0xa438, 0x0274, 0xa438, 0xaccc, + 0xa438, 0xef97, 0xa438, 0x1b76, 0xa438, 0xad5f, 0xa438, 0x02ae, + 0xa438, 0x04ef, 0xa438, 0x69ef, 0xa438, 0x3111, 0xa438, 0xaed1, + 0xa438, 0x0287, 0xa438, 0x80af, 0xa438, 0x2293, 0xa438, 0xf8f9, + 0xa438, 0xfafb, 0xa438, 0xef59, 0xa438, 0xe080, 0xa438, 0x13ad, + 0xa438, 0x252f, 0xa438, 0xbf88, 0xa438, 0x2802, 0xa438, 0x6c6d, + 0xa438, 0xef64, 0xa438, 0x1f44, 0xa438, 0xe18f, 0xa438, 0xb91b, + 0xa438, 0x64ad, 0xa438, 0x4f1d, 0xa438, 0xd688, 0xa438, 0x2bd7, + 0xa438, 0x882e, 0xa438, 0x0274, 0xa438, 0x73ad, 0xa438, 0x5008, + 0xa438, 0xbf88, 0xa438, 0x3102, 0xa438, 0x737c, 0xa438, 0xae03, + 0xa438, 0x0287, 0xa438, 0xd0bf, 0xa438, 0x882b, 0xa438, 0x0273, + 0xa438, 0x73e0, 0xa438, 0x824c, 0xa438, 0xf621, 0xa438, 0xe482, + 0xa438, 0x4cbf, 0xa438, 0x8834, 0xa438, 0x0273, 0xa438, 0x7cef, + 0xa438, 0x95ff, 0xa438, 0xfefd, 0xa438, 0xfc04, 0xa438, 0xf8f9, + 0xa438, 0xfafb, 0xa438, 0xef79, 0xa438, 0xbf88, 0xa438, 0x1f02, + 0xa438, 0x737c, 0xa438, 0x1f22, 0xa438, 0xac32, 0xa438, 0x31ef, + 0xa438, 0x12bf, 0xa438, 0x8822, 0xa438, 0x026c, 0xa438, 0x4ed6, + 0xa438, 0x8fba, 0xa438, 0x1f33, 0xa438, 0xac3c, 0xa438, 0x1eef, + 0xa438, 0x13bf, 0xa438, 0x8837, 0xa438, 0x026c, 0xa438, 0x4eef, + 0xa438, 0x96d8, 0xa438, 0x19d9, 0xa438, 0xbf88, 0xa438, 0x2502, + 0xa438, 0x6c4e, 0xa438, 0xbf88, 0xa438, 0x2502, 0xa438, 0x6c4e, + 0xa438, 0x1616, 0xa438, 0x13ae, 0xa438, 0xdf12, 0xa438, 0xaecc, + 0xa438, 0xbf88, 0xa438, 0x1f02, 0xa438, 0x7373, 0xa438, 0xef97, + 0xa438, 0xfffe, 0xa438, 0xfdfc, 0xa438, 0x0466, 0xa438, 0xac88, + 0xa438, 0x54ac, 0xa438, 0x88f0, 0xa438, 0xac8a, 0xa438, 0x92ac, + 0xa438, 0xbadd, 0xa438, 0xac6c, 0xa438, 0xeeac, 0xa438, 0x6cff, + 0xa438, 0xad02, 0xa438, 0x99ac, 0xa438, 0x0030, 0xa438, 0xac88, + 0xa438, 0xd4c3, 0xa438, 0x5000, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x0000, + 0xa438, 0x0000, 0xa438, 0x0000, 0xa438, 0x00b4, 0xa438, 0xecee, + 0xa438, 0x8298, 0xa438, 0x00af, 0xa438, 0x1412, 0xa438, 0xf8bf, + 0xa438, 0x8b5d, 0xa438, 0x026c, 0xa438, 0x6d58, 0xa438, 0x03e1, + 0xa438, 0x8fb8, 0xa438, 0x2901, 0xa438, 0xe58f, 0xa438, 0xb8a0, + 0xa438, 0x0049, 0xa438, 0xef47, 0xa438, 0xe483, 0xa438, 0x02e5, + 0xa438, 0x8303, 0xa438, 0xbfc2, 0xa438, 0x5f1a, 0xa438, 0x95f7, + 0xa438, 0x05ee, 0xa438, 0xffd2, 0xa438, 0x00d8, 0xa438, 0xf605, + 0xa438, 0x1f11, 0xa438, 0xef60, 0xa438, 0xbf8b, 0xa438, 0x3002, + 0xa438, 0x6c4e, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c6d, + 0xa438, 0xf728, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c4e, + 0xa438, 0xf628, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c4e, + 0xa438, 0x0c64, 0xa438, 0xef46, 0xa438, 0xbf8b, 0xa438, 0x6002, + 0xa438, 0x6c4e, 0xa438, 0x0289, 0xa438, 0x9902, 0xa438, 0x3920, + 0xa438, 0xaf89, 0xa438, 0x96a0, 0xa438, 0x0149, 0xa438, 0xef47, + 0xa438, 0xe483, 0xa438, 0x04e5, 0xa438, 0x8305, 0xa438, 0xbfc2, + 0xa438, 0x5f1a, 0xa438, 0x95f7, 0xa438, 0x05ee, 0xa438, 0xffd2, + 0xa438, 0x00d8, 0xa438, 0xf605, 0xa438, 0x1f11, 0xa438, 0xef60, + 0xa438, 0xbf8b, 0xa438, 0x3002, 0xa438, 0x6c4e, 0xa438, 0xbf8b, + 0xa438, 0x3302, 0xa438, 0x6c6d, 0xa438, 0xf729, 0xa438, 0xbf8b, + 0xa438, 0x3302, 0xa438, 0x6c4e, 0xa438, 0xf629, 0xa438, 0xbf8b, + 0xa438, 0x3302, 0xa438, 0x6c4e, 0xa438, 0x0c64, 0xa438, 0xef46, + 0xa438, 0xbf8b, 0xa438, 0x6302, 0xa438, 0x6c4e, 0xa438, 0x0289, + 0xa438, 0x9902, 0xa438, 0x3920, 0xa438, 0xaf89, 0xa438, 0x96a0, + 0xa438, 0x0249, 0xa438, 0xef47, 0xa438, 0xe483, 0xa438, 0x06e5, + 0xa438, 0x8307, 0xa438, 0xbfc2, 0xa438, 0x5f1a, 0xa438, 0x95f7, + 0xa438, 0x05ee, 0xa438, 0xffd2, 0xa438, 0x00d8, 0xa438, 0xf605, + 0xa438, 0x1f11, 0xa438, 0xef60, 0xa438, 0xbf8b, 0xa438, 0x3002, + 0xa438, 0x6c4e, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c6d, + 0xa438, 0xf72a, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c4e, + 0xa438, 0xf62a, 0xa438, 0xbf8b, 0xa438, 0x3302, 0xa438, 0x6c4e, + 0xa438, 0x0c64, 0xa438, 0xef46, 0xa438, 0xbf8b, 0xa438, 0x6602, + 0xa438, 0x6c4e, 0xa438, 0x0289, 0xa438, 0x9902, 0xa438, 0x3920, + 0xa438, 0xaf89, 0xa438, 0x96ef, 0xa438, 0x47e4, 0xa438, 0x8308, + 0xa438, 0xe583, 0xa438, 0x09bf, 0xa438, 0xc25f, 0xa438, 0x1a95, + 0xa438, 0xf705, 0xa438, 0xeeff, 0xa438, 0xd200, 0xa438, 0xd8f6, + 0xa438, 0x051f, 0xa438, 0x11ef, 0xa438, 0x60bf, 0xa438, 0x8b30, + 0xa438, 0x026c, 0xa438, 0x4ebf, 0xa438, 0x8b33, 0xa438, 0x026c, + 0xa438, 0x6df7, 0xa438, 0x2bbf, 0xa438, 0x8b33, 0xa438, 0x026c, + 0xa438, 0x4ef6, 0xa438, 0x2bbf, 0xa438, 0x8b33, 0xa438, 0x026c, + 0xa438, 0x4e0c, 0xa438, 0x64ef, 0xa438, 0x46bf, 0xa438, 0x8b69, + 0xa438, 0x026c, 0xa438, 0x4e02, 0xa438, 0x8999, 0xa438, 0x0239, + 0xa438, 0x20af, 0xa438, 0x8996, 0xa438, 0xaf39, 0xa438, 0x1ef8, + 0xa438, 0xf9fa, 0xa438, 0xe08f, 0xa438, 0xb838, 0xa438, 0x02ad, + 0xa438, 0x2702, 0xa438, 0xae03, 0xa438, 0xaf8b, 0xa438, 0x201f, + 0xa438, 0x66ef, 0xa438, 0x65bf, 0xa438, 0xc21f, 0xa438, 0x1a96, + 0xa438, 0xf705, 0xa438, 0xeeff, 0xa438, 0xd200, 0xa438, 0xdaf6, + 0xa438, 0x05bf, 0xa438, 0xc22f, 0xa438, 0x1a96, 0xa438, 0xf705, + 0xa438, 0xeeff, 0xa438, 0xd200, 0xa438, 0xdbf6, 0xa438, 0x05ef, + 0xa438, 0x021f, 0xa438, 0x110d, 0xa438, 0x42bf, 0xa438, 0x8b3c, + 0xa438, 0x026c, 0xa438, 0x4eef, 0xa438, 0x021b, 0xa438, 0x031f, + 0xa438, 0x110d, 0xa438, 0x42bf, 0xa438, 0x8b36, 0xa438, 0x026c, + 0xa438, 0x4eef, 0xa438, 0x021a, 0xa438, 0x031f, 0xa438, 0x110d, + 0xa438, 0x42bf, 0xa438, 0x8b39, 0xa438, 0x026c, 0xa438, 0x4ebf, + 0xa438, 0xc23f, 0xa438, 0x1a96, 0xa438, 0xf705, 0xa438, 0xeeff, + 0xa438, 0xd200, 0xa438, 0xdaf6, 0xa438, 0x05bf, 0xa438, 0xc24f, + 0xa438, 0x1a96, 0xa438, 0xf705, 0xa438, 0xeeff, 0xa438, 0xd200, + 0xa438, 0xdbf6, 0xa438, 0x05ef, 0xa438, 0x021f, 0xa438, 0x110d, + 0xa438, 0x42bf, 0xa438, 0x8b45, 0xa438, 0x026c, 0xa438, 0x4eef, + 0xa438, 0x021b, 0xa438, 0x031f, 0xa438, 0x110d, 0xa438, 0x42bf, + 0xa438, 0x8b3f, 0xa438, 0x026c, 0xa438, 0x4eef, 0xa438, 0x021a, + 0xa438, 0x031f, 0xa438, 0x110d, 0xa438, 0x42bf, 0xa438, 0x8b42, + 0xa438, 0x026c, 0xa438, 0x4eef, 0xa438, 0x56d0, 0xa438, 0x201f, + 0xa438, 0x11bf, 0xa438, 0x8b4e, 0xa438, 0x026c, 0xa438, 0x4ebf, + 0xa438, 0x8b48, 0xa438, 0x026c, 0xa438, 0x4ebf, 0xa438, 0x8b4b, + 0xa438, 0x026c, 0xa438, 0x4ee1, 0xa438, 0x8578, 0xa438, 0xef03, + 0xa438, 0x480a, 0xa438, 0x2805, 0xa438, 0xef20, 0xa438, 0x1b01, + 0xa438, 0xad27, 0xa438, 0x3f1f, 0xa438, 0x44e0, 0xa438, 0x8560, + 0xa438, 0xe185, 0xa438, 0x61bf, 0xa438, 0x8b51, 0xa438, 0x026c, + 0xa438, 0x4ee0, 0xa438, 0x8566, 0xa438, 0xe185, 0xa438, 0x67bf, + 0xa438, 0x8b54, 0xa438, 0x026c, 0xa438, 0x4ee0, 0xa438, 0x856c, + 0xa438, 0xe185, 0xa438, 0x6dbf, 0xa438, 0x8b57, 0xa438, 0x026c, + 0xa438, 0x4ee0, 0xa438, 0x8572, 0xa438, 0xe185, 0xa438, 0x73bf, + 0xa438, 0x8b5a, 0xa438, 0x026c, 0xa438, 0x4ee1, 0xa438, 0x8fb8, + 0xa438, 0x5900, 0xa438, 0xf728, 0xa438, 0xe58f, 0xa438, 0xb8af, + 0xa438, 0x8b2c, 0xa438, 0xe185, 0xa438, 0x791b, 0xa438, 0x21ad, + 0xa438, 0x373e, 0xa438, 0x1f44, 0xa438, 0xe085, 0xa438, 0x62e1, + 0xa438, 0x8563, 0xa438, 0xbf8b, 0xa438, 0x5102, 0xa438, 0x6c4e, + 0xa438, 0xe085, 0xa438, 0x68e1, 0xa438, 0x8569, 0xa438, 0xbf8b, + 0xa438, 0x5402, 0xa438, 0x6c4e, 0xa438, 0xe085, 0xa438, 0x6ee1, + 0xa438, 0x856f, 0xa438, 0xbf8b, 0xa438, 0x5702, 0xa438, 0x6c4e, + 0xa438, 0xe085, 0xa438, 0x74e1, 0xa438, 0x8575, 0xa438, 0xbf8b, + 0xa438, 0x5a02, 0xa438, 0x6c4e, 0xa438, 0xe18f, 0xa438, 0xb859, + 0xa438, 0x00f7, 0xa438, 0x28e5, 0xa438, 0x8fb8, 0xa438, 0xae4a, + 0xa438, 0x1f44, 0xa438, 0xe085, 0xa438, 0x64e1, 0xa438, 0x8565, + 0xa438, 0xbf8b, 0xa438, 0x5102, 0xa438, 0x6c4e, 0xa438, 0xe085, + 0xa438, 0x6ae1, 0xa438, 0x856b, 0xa438, 0xbf8b, 0xa438, 0x5402, + 0xa438, 0x6c4e, 0xa438, 0xe085, 0xa438, 0x70e1, 0xa438, 0x8571, + 0xa438, 0xbf8b, 0xa438, 0x5702, 0xa438, 0x6c4e, 0xa438, 0xe085, + 0xa438, 0x76e1, 0xa438, 0x8577, 0xa438, 0xbf8b, 0xa438, 0x5a02, + 0xa438, 0x6c4e, 0xa438, 0xe18f, 0xa438, 0xb859, 0xa438, 0x00f7, + 0xa438, 0x28e5, 0xa438, 0x8fb8, 0xa438, 0xae0c, 0xa438, 0xe18f, + 0xa438, 0xb839, 0xa438, 0x04ac, 0xa438, 0x2f04, 0xa438, 0xee8f, + 0xa438, 0xb800, 0xa438, 0xfefd, 0xa438, 0xfc04, 0xa438, 0xf0ac, + 0xa438, 0x8efc, 0xa438, 0xac8c, 0xa438, 0xf0ac, 0xa438, 0xfaf0, + 0xa438, 0xacf8, 0xa438, 0xf0ac, 0xa438, 0xf6f0, 0xa438, 0xad00, + 0xa438, 0xf0ac, 0xa438, 0xfef0, 0xa438, 0xacfc, 0xa438, 0xf0ac, + 0xa438, 0xf4f0, 0xa438, 0xacf2, 0xa438, 0xf0ac, 0xa438, 0xf0f0, + 0xa438, 0xacb0, 0xa438, 0xf0ac, 0xa438, 0xaef0, 0xa438, 0xacac, + 0xa438, 0xf0ac, 0xa438, 0xaaf0, 0xa438, 0xacee, 0xa438, 0xf0b0, + 0xa438, 0x24f0, 0xa438, 0xb0a4, 0xa438, 0xf0b1, 0xa438, 0x24f0, + 0xa438, 0xb1a4, 0xa438, 0xee8f, 0xa438, 0xb800, 0xa438, 0xd400, + 0xa438, 0x00af, 0xa438, 0x3976, 0xa438, 0x66ac, 0xa438, 0xeabb, + 0xa438, 0xa430, 0xa438, 0x6e50, 0xa438, 0x6e53, 0xa438, 0x6e56, + 0xa438, 0x6e59, 0xa438, 0x6e5c, 0xa438, 0x6e5f, 0xa438, 0x6e62, + 0xa438, 0x6e65, 0xa438, 0xd9ac, 0xa438, 0x70f0, 0xa438, 0xac6a, + 0xa436, 0xb85e, 0xa438, 0x23b7, 0xa436, 0xb860, 0xa438, 0x74db, + 0xa436, 0xb862, 0xa438, 0x268c, 0xa436, 0xb864, 0xa438, 0x3FE5, + 0xa436, 0xb886, 0xa438, 0x2250, 0xa436, 0xb888, 0xa438, 0x140e, + 0xa436, 0xb88a, 0xa438, 0x3696, 0xa436, 0xb88c, 0xa438, 0x3973, + 0xa436, 0xb838, 0xa438, 0x00ff, 0xb820, 0x0010, 0xa436, 0x8464, + 0xa438, 0xaf84, 0xa438, 0x7caf, 0xa438, 0x8485, 0xa438, 0xaf85, + 0xa438, 0x13af, 0xa438, 0x851e, 0xa438, 0xaf85, 0xa438, 0xb9af, + 0xa438, 0x8684, 0xa438, 0xaf87, 0xa438, 0x01af, 0xa438, 0x8701, + 0xa438, 0xac38, 0xa438, 0x03af, 0xa438, 0x38bb, 0xa438, 0xaf38, + 0xa438, 0xc302, 0xa438, 0x4618, 0xa438, 0xbf85, 0xa438, 0x0a02, + 0xa438, 0x54b7, 0xa438, 0xbf85, 0xa438, 0x1002, 0xa438, 0x54c0, + 0xa438, 0xd400, 0xa438, 0x0fbf, 0xa438, 0x8507, 0xa438, 0x024f, + 0xa438, 0x48bf, 0xa438, 0x8504, 0xa438, 0x024f, 0xa438, 0x6759, + 0xa438, 0xf0a1, 0xa438, 0x3008, 0xa438, 0xbf85, 0xa438, 0x0d02, + 0xa438, 0x54c0, 0xa438, 0xae06, 0xa438, 0xbf85, 0xa438, 0x0d02, + 0xa438, 0x54b7, 0xa438, 0xbf85, 0xa438, 0x0402, 0xa438, 0x4f67, + 0xa438, 0xa183, 0xa438, 0x02ae, 0xa438, 0x15a1, 0xa438, 0x8502, + 0xa438, 0xae10, 0xa438, 0x59f0, 0xa438, 0xa180, 0xa438, 0x16bf, + 0xa438, 0x8501, 0xa438, 0x024f, 0xa438, 0x67a1, 0xa438, 0x381b, + 0xa438, 0xae0b, 0xa438, 0xe18f, 0xa438, 0xffbf, 0xa438, 0x84fe, + 0xa438, 0x024f, 0xa438, 0x48ae, 0xa438, 0x17bf, 0xa438, 0x84fe, + 0xa438, 0x0254, 0xa438, 0xb7bf, 0xa438, 0x84fb, 0xa438, 0x0254, + 0xa438, 0xb7ae, 0xa438, 0x09a1, 0xa438, 0x5006, 0xa438, 0xbf84, + 0xa438, 0xfb02, 0xa438, 0x54c0, 0xa438, 0xaf04, 0xa438, 0x4700, + 0xa438, 0xad34, 0xa438, 0xfdad, 0xa438, 0x0670, 0xa438, 0xae14, + 0xa438, 0xf0a6, 0xa438, 0x00b8, 0xa438, 0xbd32, 0xa438, 0x30bd, + 0xa438, 0x30aa, 0xa438, 0xbd2c, 0xa438, 0xccbd, 0xa438, 0x2ca1, + 0xa438, 0x0705, 0xa438, 0xec80, 0xa438, 0xaf40, 0xa438, 0xf7af, + 0xa438, 0x40f5, 0xa438, 0xd101, 0xa438, 0xbf85, 0xa438, 0xa402, + 0xa438, 0x4f48, 0xa438, 0xbf85, 0xa438, 0xa702, 0xa438, 0x54c0, + 0xa438, 0xd10f, 0xa438, 0xbf85, 0xa438, 0xaa02, 0xa438, 0x4f48, + 0xa438, 0x024d, 0xa438, 0x6abf, 0xa438, 0x85ad, 0xa438, 0x024f, + 0xa438, 0x67bf, 0xa438, 0x8ff7, 0xa438, 0xddbf, 0xa438, 0x85b0, + 0xa438, 0x024f, 0xa438, 0x67bf, 0xa438, 0x8ff8, 0xa438, 0xddbf, + 0xa438, 0x85b3, 0xa438, 0x024f, 0xa438, 0x67bf, 0xa438, 0x8ff9, + 0xa438, 0xddbf, 0xa438, 0x85b6, 0xa438, 0x024f, 0xa438, 0x67bf, + 0xa438, 0x8ffa, 0xa438, 0xddd1, 0xa438, 0x00bf, 0xa438, 0x85aa, + 0xa438, 0x024f, 0xa438, 0x4802, 0xa438, 0x4d6a, 0xa438, 0xbf85, + 0xa438, 0xad02, 0xa438, 0x4f67, 0xa438, 0xbf8f, 0xa438, 0xfbdd, + 0xa438, 0xbf85, 0xa438, 0xb002, 0xa438, 0x4f67, 0xa438, 0xbf8f, + 0xa438, 0xfcdd, 0xa438, 0xbf85, 0xa438, 0xb302, 0xa438, 0x4f67, + 0xa438, 0xbf8f, 0xa438, 0xfddd, 0xa438, 0xbf85, 0xa438, 0xb602, + 0xa438, 0x4f67, 0xa438, 0xbf8f, 0xa438, 0xfedd, 0xa438, 0xbf85, + 0xa438, 0xa702, 0xa438, 0x54b7, 0xa438, 0xbf85, 0xa438, 0xa102, + 0xa438, 0x54b7, 0xa438, 0xaf3c, 0xa438, 0x2066, 0xa438, 0xb800, + 0xa438, 0xb8bd, 0xa438, 0x30ee, 0xa438, 0xbd2c, 0xa438, 0xb8bd, + 0xa438, 0x7040, 0xa438, 0xbd86, 0xa438, 0xc8bd, 0xa438, 0x8640, + 0xa438, 0xbd88, 0xa438, 0xc8bd, 0xa438, 0x8802, 0xa438, 0x1929, + 0xa438, 0xa202, 0xa438, 0x02ae, 0xa438, 0x03a2, 0xa438, 0x032e, + 0xa438, 0xd10f, 0xa438, 0xbf85, 0xa438, 0xaa02, 0xa438, 0x4f48, + 0xa438, 0xe18f, 0xa438, 0xf7bf, 0xa438, 0x85ad, 0xa438, 0x024f, + 0xa438, 0x48e1, 0xa438, 0x8ff8, 0xa438, 0xbf85, 0xa438, 0xb002, + 0xa438, 0x4f48, 0xa438, 0xe18f, 0xa438, 0xf9bf, 0xa438, 0x85b3, + 0xa438, 0x024f, 0xa438, 0x48e1, 0xa438, 0x8ffa, 0xa438, 0xbf85, + 0xa438, 0xb602, 0xa438, 0x4f48, 0xa438, 0xae2c, 0xa438, 0xd100, + 0xa438, 0xbf85, 0xa438, 0xaa02, 0xa438, 0x4f48, 0xa438, 0xe18f, + 0xa438, 0xfbbf, 0xa438, 0x85ad, 0xa438, 0x024f, 0xa438, 0x48e1, + 0xa438, 0x8ffc, 0xa438, 0xbf85, 0xa438, 0xb002, 0xa438, 0x4f48, + 0xa438, 0xe18f, 0xa438, 0xfdbf, 0xa438, 0x85b3, 0xa438, 0x024f, + 0xa438, 0x48e1, 0xa438, 0x8ffe, 0xa438, 0xbf85, 0xa438, 0xb602, + 0xa438, 0x4f48, 0xa438, 0xbf86, 0xa438, 0x7e02, 0xa438, 0x4f67, + 0xa438, 0xa100, 0xa438, 0x02ae, 0xa438, 0x25a1, 0xa438, 0x041d, + 0xa438, 0xe18f, 0xa438, 0xf1bf, 0xa438, 0x8675, 0xa438, 0x024f, + 0xa438, 0x48e1, 0xa438, 0x8ff2, 0xa438, 0xbf86, 0xa438, 0x7802, + 0xa438, 0x4f48, 0xa438, 0xe18f, 0xa438, 0xf3bf, 0xa438, 0x867b, + 0xa438, 0x024f, 0xa438, 0x48ae, 0xa438, 0x29a1, 0xa438, 0x070b, + 0xa438, 0xae24, 0xa438, 0xbf86, 0xa438, 0x8102, 0xa438, 0x4f67, + 0xa438, 0xad28, 0xa438, 0x1be1, 0xa438, 0x8ff4, 0xa438, 0xbf86, + 0xa438, 0x7502, 0xa438, 0x4f48, 0xa438, 0xe18f, 0xa438, 0xf5bf, + 0xa438, 0x8678, 0xa438, 0x024f, 0xa438, 0x48e1, 0xa438, 0x8ff6, + 0xa438, 0xbf86, 0xa438, 0x7b02, 0xa438, 0x4f48, 0xa438, 0xaf09, + 0xa438, 0x8420, 0xa438, 0xbc32, 0xa438, 0x20bc, 0xa438, 0x3e76, + 0xa438, 0xbc08, 0xa438, 0xfda6, 0xa438, 0x1a00, 0xa438, 0xb64e, + 0xa438, 0xd101, 0xa438, 0xbf85, 0xa438, 0xa402, 0xa438, 0x4f48, + 0xa438, 0xbf85, 0xa438, 0xa702, 0xa438, 0x54c0, 0xa438, 0xd10f, + 0xa438, 0xbf85, 0xa438, 0xaa02, 0xa438, 0x4f48, 0xa438, 0x024d, + 0xa438, 0x6abf, 0xa438, 0x85ad, 0xa438, 0x024f, 0xa438, 0x67bf, + 0xa438, 0x8ff7, 0xa438, 0xddbf, 0xa438, 0x85b0, 0xa438, 0x024f, + 0xa438, 0x67bf, 0xa438, 0x8ff8, 0xa438, 0xddbf, 0xa438, 0x85b3, + 0xa438, 0x024f, 0xa438, 0x67bf, 0xa438, 0x8ff9, 0xa438, 0xddbf, + 0xa438, 0x85b6, 0xa438, 0x024f, 0xa438, 0x67bf, 0xa438, 0x8ffa, + 0xa438, 0xddd1, 0xa438, 0x00bf, 0xa438, 0x85aa, 0xa438, 0x024f, + 0xa438, 0x4802, 0xa438, 0x4d6a, 0xa438, 0xbf85, 0xa438, 0xad02, + 0xa438, 0x4f67, 0xa438, 0xbf8f, 0xa438, 0xfbdd, 0xa438, 0xbf85, + 0xa438, 0xb002, 0xa438, 0x4f67, 0xa438, 0xbf8f, 0xa438, 0xfcdd, + 0xa438, 0xbf85, 0xa438, 0xb302, 0xa438, 0x4f67, 0xa438, 0xbf8f, + 0xa438, 0xfddd, 0xa438, 0xbf85, 0xa438, 0xb602, 0xa438, 0x4f67, + 0xa438, 0xbf8f, 0xa438, 0xfedd, 0xa438, 0xbf85, 0xa438, 0xa702, + 0xa438, 0x54b7, 0xa438, 0xaf00, 0xa438, 0x8800, 0xa436, 0xb818, + 0xa438, 0x38b8, 0xa436, 0xb81a, 0xa438, 0x0444, 0xa436, 0xb81c, + 0xa438, 0x40ee, 0xa436, 0xb81e, 0xa438, 0x3C1A, 0xa436, 0xb850, + 0xa438, 0x0981, 0xa436, 0xb852, 0xa438, 0x0085, 0xa436, 0xb878, + 0xa438, 0xffff, 0xa436, 0xb884, 0xa438, 0xffff, 0xa436, 0xb832, + 0xa438, 0x003f, 0xa436, 0x0000, 0xa438, 0x0000, 0xa436, 0xB82E, + 0xa438, 0x0000, 0xa436, 0x8024, 0xa438, 0x0000, 0xb820, 0x0000, + 0xa436, 0x801E, 0xa438, 0x0021, 0xFFFF, 0xFFFF +}; + +static const u16 phy_mcu_ram_code_8125b_2[] = { + 0xa436, 0x8024, 0xa438, 0x3701, 0xa436, 0xB82E, 0xa438, 0x0001, + 0xb820, 0x0090, 0xa436, 0xA016, 0xa438, 0x0000, 0xa436, 0xA012, + 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, + 0xa438, 0x1800, 0xa438, 0x801a, 0xa438, 0x1800, 0xa438, 0x803f, + 0xa438, 0x1800, 0xa438, 0x8045, 0xa438, 0x1800, 0xa438, 0x8067, + 0xa438, 0x1800, 0xa438, 0x806d, 0xa438, 0x1800, 0xa438, 0x8079, + 0xa438, 0x1800, 0xa438, 0x807e, 0xa438, 0xd093, 0xa438, 0xd1c4, + 0xa438, 0x1000, 0xa438, 0x135c, 0xa438, 0xd704, 0xa438, 0x5fbc, + 0xa438, 0xd504, 0xa438, 0xc9f1, 0xa438, 0x1800, 0xa438, 0x0fc9, + 0xa438, 0xbb50, 0xa438, 0xd505, 0xa438, 0xa202, 0xa438, 0xd504, + 0xa438, 0x8c0f, 0xa438, 0xd500, 0xa438, 0x1000, 0xa438, 0x1519, + 0xa438, 0x1000, 0xa438, 0x135c, 0xa438, 0xd75e, 0xa438, 0x5fae, + 0xa438, 0x9b50, 0xa438, 0x1000, 0xa438, 0x135c, 0xa438, 0xd75e, + 0xa438, 0x7fae, 0xa438, 0x1000, 0xa438, 0x135c, 0xa438, 0xd707, + 0xa438, 0x40a7, 0xa438, 0xd719, 0xa438, 0x4071, 0xa438, 0x1800, + 0xa438, 0x1557, 0xa438, 0xd719, 0xa438, 0x2f70, 0xa438, 0x803b, + 0xa438, 0x2f73, 0xa438, 0x156a, 0xa438, 0x5e70, 0xa438, 0x1800, + 0xa438, 0x155d, 0xa438, 0xd505, 0xa438, 0xa202, 0xa438, 0xd500, + 0xa438, 0xffed, 0xa438, 0xd709, 0xa438, 0x4054, 0xa438, 0xa788, + 0xa438, 0xd70b, 0xa438, 0x1800, 0xa438, 0x172a, 0xa438, 0xc0c1, + 0xa438, 0xc0c0, 0xa438, 0xd05a, 0xa438, 0xd1ba, 0xa438, 0xd701, + 0xa438, 0x2529, 0xa438, 0x022a, 0xa438, 0xd0a7, 0xa438, 0xd1b9, + 0xa438, 0xa208, 0xa438, 0x1000, 0xa438, 0x080e, 0xa438, 0xd701, + 0xa438, 0x408b, 0xa438, 0x1000, 0xa438, 0x0a65, 0xa438, 0xf003, + 0xa438, 0x1000, 0xa438, 0x0a6b, 0xa438, 0xd701, 0xa438, 0x1000, + 0xa438, 0x0920, 0xa438, 0x1000, 0xa438, 0x0915, 0xa438, 0x1000, + 0xa438, 0x0909, 0xa438, 0x228f, 0xa438, 0x804e, 0xa438, 0x9801, + 0xa438, 0xd71e, 0xa438, 0x5d61, 0xa438, 0xd701, 0xa438, 0x1800, + 0xa438, 0x022a, 0xa438, 0x2005, 0xa438, 0x091a, 0xa438, 0x3bd9, + 0xa438, 0x0919, 0xa438, 0x1800, 0xa438, 0x0916, 0xa438, 0x1000, + 0xa438, 0x14c5, 0xa438, 0xd703, 0xa438, 0x3181, 0xa438, 0x8077, + 0xa438, 0x60ad, 0xa438, 0x1000, 0xa438, 0x135c, 0xa438, 0xd703, + 0xa438, 0x5fba, 0xa438, 0x1800, 0xa438, 0x0cc7, 0xa438, 0xd096, + 0xa438, 0xd1a9, 0xa438, 0xd503, 0xa438, 0x1800, 0xa438, 0x0c94, + 0xa438, 0xa802, 0xa438, 0xa301, 0xa438, 0xa801, 0xa438, 0xc004, + 0xa438, 0xd710, 0xa438, 0x4000, 0xa438, 0x1800, 0xa438, 0x1e79, + 0xa436, 0xA026, 0xa438, 0x1e78, 0xa436, 0xA024, 0xa438, 0x0c93, + 0xa436, 0xA022, 0xa438, 0x0cc5, 0xa436, 0xA020, 0xa438, 0x0915, + 0xa436, 0xA006, 0xa438, 0x020a, 0xa436, 0xA004, 0xa438, 0x1726, + 0xa436, 0xA002, 0xa438, 0x1542, 0xa436, 0xA000, 0xa438, 0x0fc7, + 0xa436, 0xA008, 0xa438, 0xff00, 0xa436, 0xA016, 0xa438, 0x0010, + 0xa436, 0xA012, 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, + 0xa438, 0x8010, 0xa438, 0x1800, 0xa438, 0x801d, 0xa438, 0x1800, + 0xa438, 0x802c, 0xa438, 0x1800, 0xa438, 0x802c, 0xa438, 0x1800, + 0xa438, 0x802c, 0xa438, 0x1800, 0xa438, 0x802c, 0xa438, 0x1800, + 0xa438, 0x802c, 0xa438, 0x1800, 0xa438, 0x802c, 0xa438, 0xd700, + 0xa438, 0x6090, 0xa438, 0x60d1, 0xa438, 0xc95c, 0xa438, 0xf007, + 0xa438, 0x60b1, 0xa438, 0xc95a, 0xa438, 0xf004, 0xa438, 0xc956, + 0xa438, 0xf002, 0xa438, 0xc94e, 0xa438, 0x1800, 0xa438, 0x00cd, + 0xa438, 0xd700, 0xa438, 0x6090, 0xa438, 0x60d1, 0xa438, 0xc95c, + 0xa438, 0xf007, 0xa438, 0x60b1, 0xa438, 0xc95a, 0xa438, 0xf004, + 0xa438, 0xc956, 0xa438, 0xf002, 0xa438, 0xc94e, 0xa438, 0x1000, + 0xa438, 0x022a, 0xa438, 0x1800, 0xa438, 0x0132, 0xa436, 0xA08E, + 0xa438, 0xffff, 0xa436, 0xA08C, 0xa438, 0xffff, 0xa436, 0xA08A, + 0xa438, 0xffff, 0xa436, 0xA088, 0xa438, 0xffff, 0xa436, 0xA086, + 0xa438, 0xffff, 0xa436, 0xA084, 0xa438, 0xffff, 0xa436, 0xA082, + 0xa438, 0x012f, 0xa436, 0xA080, 0xa438, 0x00cc, 0xa436, 0xA090, + 0xa438, 0x0103, 0xa436, 0xA016, 0xa438, 0x0020, 0xa436, 0xA012, + 0xa438, 0x0000, 0xa436, 0xA014, 0xa438, 0x1800, 0xa438, 0x8010, + 0xa438, 0x1800, 0xa438, 0x8020, 0xa438, 0x1800, 0xa438, 0x802a, + 0xa438, 0x1800, 0xa438, 0x8035, 0xa438, 0x1800, 0xa438, 0x803c, + 0xa438, 0x1800, 0xa438, 0x803c, 0xa438, 0x1800, 0xa438, 0x803c, + 0xa438, 0x1800, 0xa438, 0x803c, 0xa438, 0xd107, 0xa438, 0xd042, + 0xa438, 0xa404, 0xa438, 0x1000, 0xa438, 0x09df, 0xa438, 0xd700, + 0xa438, 0x5fb4, 0xa438, 0x8280, 0xa438, 0xd700, 0xa438, 0x6065, + 0xa438, 0xd125, 0xa438, 0xf002, 0xa438, 0xd12b, 0xa438, 0xd040, + 0xa438, 0x1800, 0xa438, 0x077f, 0xa438, 0x0cf0, 0xa438, 0x0c50, + 0xa438, 0xd104, 0xa438, 0xd040, 0xa438, 0x1000, 0xa438, 0x0aa8, + 0xa438, 0xd700, 0xa438, 0x5fb4, 0xa438, 0x1800, 0xa438, 0x0a2e, + 0xa438, 0xcb9b, 0xa438, 0xd110, 0xa438, 0xd040, 0xa438, 0x1000, + 0xa438, 0x0b7b, 0xa438, 0x1000, 0xa438, 0x09df, 0xa438, 0xd700, + 0xa438, 0x5fb4, 0xa438, 0x1800, 0xa438, 0x081b, 0xa438, 0x1000, + 0xa438, 0x09df, 0xa438, 0xd704, 0xa438, 0x7fb8, 0xa438, 0xa718, + 0xa438, 0x1800, 0xa438, 0x074e, 0xa436, 0xA10E, 0xa438, 0xffff, + 0xa436, 0xA10C, 0xa438, 0xffff, 0xa436, 0xA10A, 0xa438, 0xffff, + 0xa436, 0xA108, 0xa438, 0xffff, 0xa436, 0xA106, 0xa438, 0x074d, + 0xa436, 0xA104, 0xa438, 0x0818, 0xa436, 0xA102, 0xa438, 0x0a2c, + 0xa436, 0xA100, 0xa438, 0x077e, 0xa436, 0xA110, 0xa438, 0x000f, + 0xa436, 0xb87c, 0xa438, 0x8625, 0xa436, 0xb87e, 0xa438, 0xaf86, + 0xa438, 0x3daf, 0xa438, 0x8689, 0xa438, 0xaf88, 0xa438, 0x69af, + 0xa438, 0x8887, 0xa438, 0xaf88, 0xa438, 0x9caf, 0xa438, 0x889c, + 0xa438, 0xaf88, 0xa438, 0x9caf, 0xa438, 0x889c, 0xa438, 0xbf86, + 0xa438, 0x49d7, 0xa438, 0x0040, 0xa438, 0x0277, 0xa438, 0x7daf, + 0xa438, 0x2727, 0xa438, 0x0000, 0xa438, 0x7205, 0xa438, 0x0000, + 0xa438, 0x7208, 0xa438, 0x0000, 0xa438, 0x71f3, 0xa438, 0x0000, + 0xa438, 0x71f6, 0xa438, 0x0000, 0xa438, 0x7229, 0xa438, 0x0000, + 0xa438, 0x722c, 0xa438, 0x0000, 0xa438, 0x7217, 0xa438, 0x0000, + 0xa438, 0x721a, 0xa438, 0x0000, 0xa438, 0x721d, 0xa438, 0x0000, + 0xa438, 0x7211, 0xa438, 0x0000, 0xa438, 0x7220, 0xa438, 0x0000, + 0xa438, 0x7214, 0xa438, 0x0000, 0xa438, 0x722f, 0xa438, 0x0000, + 0xa438, 0x7223, 0xa438, 0x0000, 0xa438, 0x7232, 0xa438, 0x0000, + 0xa438, 0x7226, 0xa438, 0xf8f9, 0xa438, 0xfae0, 0xa438, 0x85b3, + 0xa438, 0x3802, 0xa438, 0xad27, 0xa438, 0x02ae, 0xa438, 0x03af, + 0xa438, 0x8830, 0xa438, 0x1f66, 0xa438, 0xef65, 0xa438, 0xbfc2, + 0xa438, 0x1f1a, 0xa438, 0x96f7, 0xa438, 0x05ee, 0xa438, 0xffd2, + 0xa438, 0x00da, 0xa438, 0xf605, 0xa438, 0xbfc2, 0xa438, 0x2f1a, + 0xa438, 0x96f7, 0xa438, 0x05ee, 0xa438, 0xffd2, 0xa438, 0x00db, + 0xa438, 0xf605, 0xa438, 0xef02, 0xa438, 0x1f11, 0xa438, 0x0d42, + 0xa438, 0xbf88, 0xa438, 0x4202, 0xa438, 0x6e7d, 0xa438, 0xef02, + 0xa438, 0x1b03, 0xa438, 0x1f11, 0xa438, 0x0d42, 0xa438, 0xbf88, + 0xa438, 0x4502, 0xa438, 0x6e7d, 0xa438, 0xef02, 0xa438, 0x1a03, + 0xa438, 0x1f11, 0xa438, 0x0d42, 0xa438, 0xbf88, 0xa438, 0x4802, + 0xa438, 0x6e7d, 0xa438, 0xbfc2, 0xa438, 0x3f1a, 0xa438, 0x96f7, + 0xa438, 0x05ee, 0xa438, 0xffd2, 0xa438, 0x00da, 0xa438, 0xf605, + 0xa438, 0xbfc2, 0xa438, 0x4f1a, 0xa438, 0x96f7, 0xa438, 0x05ee, + 0xa438, 0xffd2, 0xa438, 0x00db, 0xa438, 0xf605, 0xa438, 0xef02, + 0xa438, 0x1f11, 0xa438, 0x0d42, 0xa438, 0xbf88, 0xa438, 0x4b02, + 0xa438, 0x6e7d, 0xa438, 0xef02, 0xa438, 0x1b03, 0xa438, 0x1f11, + 0xa438, 0x0d42, 0xa438, 0xbf88, 0xa438, 0x4e02, 0xa438, 0x6e7d, + 0xa438, 0xef02, 0xa438, 0x1a03, 0xa438, 0x1f11, 0xa438, 0x0d42, + 0xa438, 0xbf88, 0xa438, 0x5102, 0xa438, 0x6e7d, 0xa438, 0xef56, + 0xa438, 0xd020, 0xa438, 0x1f11, 0xa438, 0xbf88, 0xa438, 0x5402, + 0xa438, 0x6e7d, 0xa438, 0xbf88, 0xa438, 0x5702, 0xa438, 0x6e7d, + 0xa438, 0xbf88, 0xa438, 0x5a02, 0xa438, 0x6e7d, 0xa438, 0xe185, + 0xa438, 0xa0ef, 0xa438, 0x0348, 0xa438, 0x0a28, 0xa438, 0x05ef, + 0xa438, 0x201b, 0xa438, 0x01ad, 0xa438, 0x2735, 0xa438, 0x1f44, + 0xa438, 0xe085, 0xa438, 0x88e1, 0xa438, 0x8589, 0xa438, 0xbf88, + 0xa438, 0x5d02, 0xa438, 0x6e7d, 0xa438, 0xe085, 0xa438, 0x8ee1, + 0xa438, 0x858f, 0xa438, 0xbf88, 0xa438, 0x6002, 0xa438, 0x6e7d, + 0xa438, 0xe085, 0xa438, 0x94e1, 0xa438, 0x8595, 0xa438, 0xbf88, + 0xa438, 0x6302, 0xa438, 0x6e7d, 0xa438, 0xe085, 0xa438, 0x9ae1, + 0xa438, 0x859b, 0xa438, 0xbf88, 0xa438, 0x6602, 0xa438, 0x6e7d, + 0xa438, 0xaf88, 0xa438, 0x3cbf, 0xa438, 0x883f, 0xa438, 0x026e, + 0xa438, 0x9cad, 0xa438, 0x2835, 0xa438, 0x1f44, 0xa438, 0xe08f, + 0xa438, 0xf8e1, 0xa438, 0x8ff9, 0xa438, 0xbf88, 0xa438, 0x5d02, + 0xa438, 0x6e7d, 0xa438, 0xe08f, 0xa438, 0xfae1, 0xa438, 0x8ffb, + 0xa438, 0xbf88, 0xa438, 0x6002, 0xa438, 0x6e7d, 0xa438, 0xe08f, + 0xa438, 0xfce1, 0xa438, 0x8ffd, 0xa438, 0xbf88, 0xa438, 0x6302, + 0xa438, 0x6e7d, 0xa438, 0xe08f, 0xa438, 0xfee1, 0xa438, 0x8fff, + 0xa438, 0xbf88, 0xa438, 0x6602, 0xa438, 0x6e7d, 0xa438, 0xaf88, + 0xa438, 0x3ce1, 0xa438, 0x85a1, 0xa438, 0x1b21, 0xa438, 0xad37, + 0xa438, 0x341f, 0xa438, 0x44e0, 0xa438, 0x858a, 0xa438, 0xe185, + 0xa438, 0x8bbf, 0xa438, 0x885d, 0xa438, 0x026e, 0xa438, 0x7de0, + 0xa438, 0x8590, 0xa438, 0xe185, 0xa438, 0x91bf, 0xa438, 0x8860, + 0xa438, 0x026e, 0xa438, 0x7de0, 0xa438, 0x8596, 0xa438, 0xe185, + 0xa438, 0x97bf, 0xa438, 0x8863, 0xa438, 0x026e, 0xa438, 0x7de0, + 0xa438, 0x859c, 0xa438, 0xe185, 0xa438, 0x9dbf, 0xa438, 0x8866, + 0xa438, 0x026e, 0xa438, 0x7dae, 0xa438, 0x401f, 0xa438, 0x44e0, + 0xa438, 0x858c, 0xa438, 0xe185, 0xa438, 0x8dbf, 0xa438, 0x885d, + 0xa438, 0x026e, 0xa438, 0x7de0, 0xa438, 0x8592, 0xa438, 0xe185, + 0xa438, 0x93bf, 0xa438, 0x8860, 0xa438, 0x026e, 0xa438, 0x7de0, + 0xa438, 0x8598, 0xa438, 0xe185, 0xa438, 0x99bf, 0xa438, 0x8863, + 0xa438, 0x026e, 0xa438, 0x7de0, 0xa438, 0x859e, 0xa438, 0xe185, + 0xa438, 0x9fbf, 0xa438, 0x8866, 0xa438, 0x026e, 0xa438, 0x7dae, + 0xa438, 0x0ce1, 0xa438, 0x85b3, 0xa438, 0x3904, 0xa438, 0xac2f, + 0xa438, 0x04ee, 0xa438, 0x85b3, 0xa438, 0x00af, 0xa438, 0x39d9, + 0xa438, 0x22ac, 0xa438, 0xeaf0, 0xa438, 0xacf6, 0xa438, 0xf0ac, + 0xa438, 0xfaf0, 0xa438, 0xacf8, 0xa438, 0xf0ac, 0xa438, 0xfcf0, + 0xa438, 0xad00, 0xa438, 0xf0ac, 0xa438, 0xfef0, 0xa438, 0xacf0, + 0xa438, 0xf0ac, 0xa438, 0xf4f0, 0xa438, 0xacf2, 0xa438, 0xf0ac, + 0xa438, 0xb0f0, 0xa438, 0xacae, 0xa438, 0xf0ac, 0xa438, 0xacf0, + 0xa438, 0xacaa, 0xa438, 0xa100, 0xa438, 0x0ce1, 0xa438, 0x8ff7, + 0xa438, 0xbf88, 0xa438, 0x8402, 0xa438, 0x6e7d, 0xa438, 0xaf26, + 0xa438, 0xe9e1, 0xa438, 0x8ff6, 0xa438, 0xbf88, 0xa438, 0x8402, + 0xa438, 0x6e7d, 0xa438, 0xaf26, 0xa438, 0xf520, 0xa438, 0xac86, + 0xa438, 0xbf88, 0xa438, 0x3f02, 0xa438, 0x6e9c, 0xa438, 0xad28, + 0xa438, 0x03af, 0xa438, 0x3324, 0xa438, 0xad38, 0xa438, 0x03af, + 0xa438, 0x32e6, 0xa438, 0xaf32, 0xa438, 0xfb00, 0xa436, 0xb87c, + 0xa438, 0x8ff6, 0xa436, 0xb87e, 0xa438, 0x0705, 0xa436, 0xb87c, + 0xa438, 0x8ff8, 0xa436, 0xb87e, 0xa438, 0x19cc, 0xa436, 0xb87c, + 0xa438, 0x8ffa, 0xa436, 0xb87e, 0xa438, 0x28e3, 0xa436, 0xb87c, + 0xa438, 0x8ffc, 0xa436, 0xb87e, 0xa438, 0x1047, 0xa436, 0xb87c, + 0xa438, 0x8ffe, 0xa436, 0xb87e, 0xa438, 0x0a45, 0xa436, 0xb85e, + 0xa438, 0x271E, 0xa436, 0xb860, 0xa438, 0x3846, 0xa436, 0xb862, + 0xa438, 0x26E6, 0xa436, 0xb864, 0xa438, 0x32E3, 0xa436, 0xb886, + 0xa438, 0xffff, 0xa436, 0xb888, 0xa438, 0xffff, 0xa436, 0xb88a, + 0xa438, 0xffff, 0xa436, 0xb88c, 0xa438, 0xffff, 0xa436, 0xb838, + 0xa438, 0x000f, 0xb820, 0x0010, 0xa436, 0x846e, 0xa438, 0xaf84, + 0xa438, 0x86af, 0xa438, 0x8690, 0xa438, 0xaf86, 0xa438, 0xa4af, + 0xa438, 0x86a4, 0xa438, 0xaf86, 0xa438, 0xa4af, 0xa438, 0x86a4, + 0xa438, 0xaf86, 0xa438, 0xa4af, 0xa438, 0x86a4, 0xa438, 0xee82, + 0xa438, 0x5f00, 0xa438, 0x0284, 0xa438, 0x90af, 0xa438, 0x0441, + 0xa438, 0xf8e0, 0xa438, 0x8ff3, 0xa438, 0xa000, 0xa438, 0x0502, + 0xa438, 0x84a4, 0xa438, 0xae06, 0xa438, 0xa001, 0xa438, 0x0302, + 0xa438, 0x84c8, 0xa438, 0xfc04, 0xa438, 0xf8f9, 0xa438, 0xef59, + 0xa438, 0xe080, 0xa438, 0x15ad, 0xa438, 0x2702, 0xa438, 0xae03, + 0xa438, 0xaf84, 0xa438, 0xc3bf, 0xa438, 0x53ca, 0xa438, 0x0252, + 0xa438, 0xc8ad, 0xa438, 0x2807, 0xa438, 0x0285, 0xa438, 0x2cee, + 0xa438, 0x8ff3, 0xa438, 0x01ef, 0xa438, 0x95fd, 0xa438, 0xfc04, + 0xa438, 0xf8f9, 0xa438, 0xfaef, 0xa438, 0x69bf, 0xa438, 0x53ca, + 0xa438, 0x0252, 0xa438, 0xc8ac, 0xa438, 0x2822, 0xa438, 0xd480, + 0xa438, 0x00bf, 0xa438, 0x8684, 0xa438, 0x0252, 0xa438, 0xa9bf, + 0xa438, 0x8687, 0xa438, 0x0252, 0xa438, 0xa9bf, 0xa438, 0x868a, + 0xa438, 0x0252, 0xa438, 0xa9bf, 0xa438, 0x868d, 0xa438, 0x0252, + 0xa438, 0xa9ee, 0xa438, 0x8ff3, 0xa438, 0x00af, 0xa438, 0x8526, + 0xa438, 0xe08f, 0xa438, 0xf4e1, 0xa438, 0x8ff5, 0xa438, 0xe28f, + 0xa438, 0xf6e3, 0xa438, 0x8ff7, 0xa438, 0x1b45, 0xa438, 0xac27, + 0xa438, 0x0eee, 0xa438, 0x8ff4, 0xa438, 0x00ee, 0xa438, 0x8ff5, + 0xa438, 0x0002, 0xa438, 0x852c, 0xa438, 0xaf85, 0xa438, 0x26e0, + 0xa438, 0x8ff4, 0xa438, 0xe18f, 0xa438, 0xf52c, 0xa438, 0x0001, + 0xa438, 0xe48f, 0xa438, 0xf4e5, 0xa438, 0x8ff5, 0xa438, 0xef96, + 0xa438, 0xfefd, 0xa438, 0xfc04, 0xa438, 0xf8f9, 0xa438, 0xef59, + 0xa438, 0xbf53, 0xa438, 0x2202, 0xa438, 0x52c8, 0xa438, 0xa18b, + 0xa438, 0x02ae, 0xa438, 0x03af, 0xa438, 0x85da, 0xa438, 0xbf57, + 0xa438, 0x7202, 0xa438, 0x52c8, 0xa438, 0xe48f, 0xa438, 0xf8e5, + 0xa438, 0x8ff9, 0xa438, 0xbf57, 0xa438, 0x7502, 0xa438, 0x52c8, + 0xa438, 0xe48f, 0xa438, 0xfae5, 0xa438, 0x8ffb, 0xa438, 0xbf57, + 0xa438, 0x7802, 0xa438, 0x52c8, 0xa438, 0xe48f, 0xa438, 0xfce5, + 0xa438, 0x8ffd, 0xa438, 0xbf57, 0xa438, 0x7b02, 0xa438, 0x52c8, + 0xa438, 0xe48f, 0xa438, 0xfee5, 0xa438, 0x8fff, 0xa438, 0xbf57, + 0xa438, 0x6c02, 0xa438, 0x52c8, 0xa438, 0xa102, 0xa438, 0x13ee, + 0xa438, 0x8ffc, 0xa438, 0x80ee, 0xa438, 0x8ffd, 0xa438, 0x00ee, + 0xa438, 0x8ffe, 0xa438, 0x80ee, 0xa438, 0x8fff, 0xa438, 0x00af, + 0xa438, 0x8599, 0xa438, 0xa101, 0xa438, 0x0cbf, 0xa438, 0x534c, + 0xa438, 0x0252, 0xa438, 0xc8a1, 0xa438, 0x0303, 0xa438, 0xaf85, + 0xa438, 0x77bf, 0xa438, 0x5322, 0xa438, 0x0252, 0xa438, 0xc8a1, + 0xa438, 0x8b02, 0xa438, 0xae03, 0xa438, 0xaf86, 0xa438, 0x64e0, + 0xa438, 0x8ff8, 0xa438, 0xe18f, 0xa438, 0xf9bf, 0xa438, 0x8684, + 0xa438, 0x0252, 0xa438, 0xa9e0, 0xa438, 0x8ffa, 0xa438, 0xe18f, + 0xa438, 0xfbbf, 0xa438, 0x8687, 0xa438, 0x0252, 0xa438, 0xa9e0, + 0xa438, 0x8ffc, 0xa438, 0xe18f, 0xa438, 0xfdbf, 0xa438, 0x868a, + 0xa438, 0x0252, 0xa438, 0xa9e0, 0xa438, 0x8ffe, 0xa438, 0xe18f, + 0xa438, 0xffbf, 0xa438, 0x868d, 0xa438, 0x0252, 0xa438, 0xa9af, + 0xa438, 0x867f, 0xa438, 0xbf53, 0xa438, 0x2202, 0xa438, 0x52c8, + 0xa438, 0xa144, 0xa438, 0x3cbf, 0xa438, 0x547b, 0xa438, 0x0252, + 0xa438, 0xc8e4, 0xa438, 0x8ff8, 0xa438, 0xe58f, 0xa438, 0xf9bf, + 0xa438, 0x547e, 0xa438, 0x0252, 0xa438, 0xc8e4, 0xa438, 0x8ffa, + 0xa438, 0xe58f, 0xa438, 0xfbbf, 0xa438, 0x5481, 0xa438, 0x0252, + 0xa438, 0xc8e4, 0xa438, 0x8ffc, 0xa438, 0xe58f, 0xa438, 0xfdbf, + 0xa438, 0x5484, 0xa438, 0x0252, 0xa438, 0xc8e4, 0xa438, 0x8ffe, + 0xa438, 0xe58f, 0xa438, 0xffbf, 0xa438, 0x5322, 0xa438, 0x0252, + 0xa438, 0xc8a1, 0xa438, 0x4448, 0xa438, 0xaf85, 0xa438, 0xa7bf, + 0xa438, 0x5322, 0xa438, 0x0252, 0xa438, 0xc8a1, 0xa438, 0x313c, + 0xa438, 0xbf54, 0xa438, 0x7b02, 0xa438, 0x52c8, 0xa438, 0xe48f, + 0xa438, 0xf8e5, 0xa438, 0x8ff9, 0xa438, 0xbf54, 0xa438, 0x7e02, + 0xa438, 0x52c8, 0xa438, 0xe48f, 0xa438, 0xfae5, 0xa438, 0x8ffb, + 0xa438, 0xbf54, 0xa438, 0x8102, 0xa438, 0x52c8, 0xa438, 0xe48f, + 0xa438, 0xfce5, 0xa438, 0x8ffd, 0xa438, 0xbf54, 0xa438, 0x8402, + 0xa438, 0x52c8, 0xa438, 0xe48f, 0xa438, 0xfee5, 0xa438, 0x8fff, + 0xa438, 0xbf53, 0xa438, 0x2202, 0xa438, 0x52c8, 0xa438, 0xa131, + 0xa438, 0x03af, 0xa438, 0x85a7, 0xa438, 0xd480, 0xa438, 0x00bf, + 0xa438, 0x8684, 0xa438, 0x0252, 0xa438, 0xa9bf, 0xa438, 0x8687, + 0xa438, 0x0252, 0xa438, 0xa9bf, 0xa438, 0x868a, 0xa438, 0x0252, + 0xa438, 0xa9bf, 0xa438, 0x868d, 0xa438, 0x0252, 0xa438, 0xa9ef, + 0xa438, 0x95fd, 0xa438, 0xfc04, 0xa438, 0xf0d1, 0xa438, 0x2af0, + 0xa438, 0xd12c, 0xa438, 0xf0d1, 0xa438, 0x44f0, 0xa438, 0xd146, + 0xa438, 0xbf86, 0xa438, 0xa102, 0xa438, 0x52c8, 0xa438, 0xbf86, + 0xa438, 0xa102, 0xa438, 0x52c8, 0xa438, 0xd101, 0xa438, 0xaf06, + 0xa438, 0xa570, 0xa438, 0xce42, 0xa436, 0xb818, 0xa438, 0x043d, + 0xa436, 0xb81a, 0xa438, 0x06a3, 0xa436, 0xb81c, 0xa438, 0xffff, + 0xa436, 0xb81e, 0xa438, 0xffff, 0xa436, 0xb850, 0xa438, 0xffff, + 0xa436, 0xb852, 0xa438, 0xffff, 0xa436, 0xb878, 0xa438, 0xffff, + 0xa436, 0xb884, 0xa438, 0xffff, 0xa436, 0xb832, 0xa438, 0x0003, + 0xa436, 0x0000, 0xa438, 0x0000, 0xa436, 0xB82E, 0xa438, 0x0000, + 0xa436, 0x8024, 0xa438, 0x0000, 0xb820, 0x0000, 0xa436, 0x801E, + 0xa438, 0x0020, 0xFFFF, 0xFFFF +}; + +static void +rtl8125_real_set_phy_mcu_8125b_1(struct net_device *dev) +{ + rtl8125_set_phy_mcu_ram_code(dev, + phy_mcu_ram_code_8125b_1, + ARRAY_SIZE(phy_mcu_ram_code_8125b_1) + ); +} + +static void +rtl8125_set_phy_mcu_8125b_1(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + rtl8125_set_phy_mcu_patch_request(tp); + + rtl8125_real_set_phy_mcu_8125b_1(dev); + + rtl8125_clear_phy_mcu_patch_request(tp); +} + +static void +rtl8125_real_set_phy_mcu_8125b_2(struct net_device *dev) +{ + rtl8125_set_phy_mcu_ram_code(dev, + phy_mcu_ram_code_8125b_2, + ARRAY_SIZE(phy_mcu_ram_code_8125b_2) + ); +} + +static void +rtl8125_set_phy_mcu_8125b_2(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + rtl8125_set_phy_mcu_patch_request(tp); + + rtl8125_real_set_phy_mcu_8125b_2(dev); + + rtl8125_clear_phy_mcu_patch_request(tp); +} + +static void +rtl8125_init_hw_phy_mcu(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + u8 require_disable_phy_disable_mode = FALSE; + + if (tp->NotWrRamCodeToMicroP == TRUE) return; + if (rtl8125_check_hw_phy_mcu_code_ver(dev)) return; + + if (HW_SUPPORT_CHECK_PHY_DISABLE_MODE(tp) && rtl8125_is_in_phy_disable_mode(dev)) + require_disable_phy_disable_mode = TRUE; + + if (require_disable_phy_disable_mode) + rtl8125_disable_phy_disable_mode(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + rtl8125_set_phy_mcu_8125a_1(dev); + break; + case CFG_METHOD_3: + rtl8125_set_phy_mcu_8125a_2(dev); + break; + case CFG_METHOD_4: + rtl8125_set_phy_mcu_8125b_1(dev); + break; + case CFG_METHOD_5: + rtl8125_set_phy_mcu_8125b_2(dev); + break; + } + + if (require_disable_phy_disable_mode) + rtl8125_enable_phy_disable_mode(dev); + + rtl8125_write_hw_phy_mcu_code_ver(dev); + + rtl8125_mdio_write(tp,0x1F, 0x0000); + + tp->HwHasWrRamCodeToMicroP = TRUE; +} +#endif + +static void +rtl8125_enable_phy_aldps(struct rtl8125_private *tp) +{ + //enable aldps + //GPHY OCP 0xA430 bit[2] = 0x1 (en_aldps) + SetEthPhyOcpBit(tp, 0xA430, BIT_2); +} + +static void +rtl8125_hw_phy_config_8125a_1(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + ClearAndSetEthPhyOcpBit(tp, + 0xAD40, + 0x03FF, + 0x84 + ); + + SetEthPhyOcpBit(tp, 0xAD4E, BIT_4); + ClearAndSetEthPhyOcpBit(tp, + 0xAD16, + 0x03FF, + 0x0006 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xAD32, + 0x003F, + 0x0006 + ); + ClearEthPhyOcpBit(tp, 0xAC08, BIT_12); + ClearEthPhyOcpBit(tp, 0xAC08, BIT_8); + ClearAndSetEthPhyOcpBit(tp, + 0xAC8A, + BIT_15|BIT_14|BIT_13|BIT_12, + BIT_14|BIT_13|BIT_12 + ); + SetEthPhyOcpBit(tp, 0xAD18, BIT_10); + SetEthPhyOcpBit(tp, 0xAD1A, 0x3FF); + SetEthPhyOcpBit(tp, 0xAD1C, 0x3FF); + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80EA); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0xC400 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80EB); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0x0700, + 0x0300 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80F8); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x1C00 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80F1); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x3000 + ); + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80FE); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0xA500 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8102); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x5000 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8105); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x3300 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8100); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x7000 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8104); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0xF000 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8106); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x6500 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DC); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0xED00 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DF); + SetEthPhyOcpBit(tp, 0xA438, BIT_8); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80E1); + ClearEthPhyOcpBit(tp, 0xA438, BIT_8); + + ClearAndSetEthPhyOcpBit(tp, + 0xBF06, + 0x003F, + 0x38 + ); + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x819F); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xD0B6); + + mdio_direct_write_phy_ocp(tp, 0xBC34, 0x5555); + ClearAndSetEthPhyOcpBit(tp, + 0xBF0A, + BIT_11|BIT_10|BIT_9, + BIT_11|BIT_9 + ); + + ClearEthPhyOcpBit(tp, 0xA5C0, BIT_10); + + SetEthPhyOcpBit(tp, 0xA442, BIT_11); + + //enable aldps + //GPHY OCP 0xA430 bit[2] = 0x1 (en_aldps) + if (aspm) { + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { + rtl8125_enable_phy_aldps(tp); + } + } +} + +static void +rtl8125_hw_phy_config_8125a_2(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + SetEthPhyOcpBit(tp, 0xAD4E, BIT_4); + ClearAndSetEthPhyOcpBit(tp, + 0xAD16, + 0x03FF, + 0x03FF + ); + ClearAndSetEthPhyOcpBit(tp, + 0xAD32, + 0x003F, + 0x0006 + ); + ClearEthPhyOcpBit(tp, 0xAC08, BIT_12); + ClearEthPhyOcpBit(tp, 0xAC08, BIT_8); + ClearAndSetEthPhyOcpBit(tp, + 0xACC0, + BIT_1|BIT_0, + BIT_1 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xAD40, + BIT_7|BIT_6|BIT_5, + BIT_6 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xAD40, + BIT_2|BIT_1|BIT_0, + BIT_2 + ); + ClearEthPhyOcpBit(tp, 0xAC14, BIT_7); + ClearEthPhyOcpBit(tp, 0xAC80, BIT_9|BIT_8); + ClearAndSetEthPhyOcpBit(tp, + 0xAC5E, + BIT_2|BIT_1|BIT_0, + BIT_1 + ); + mdio_direct_write_phy_ocp(tp, 0xAD4C, 0x00A8); + mdio_direct_write_phy_ocp(tp, 0xAC5C, 0x01FF); + ClearAndSetEthPhyOcpBit(tp, + 0xAC8A, + BIT_7|BIT_6|BIT_5|BIT_4, + BIT_5|BIT_4 + ); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8157); + ClearAndSetEthPhyOcpBit(tp, + 0xB87E, + 0xFF00, + 0x0500 + ); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8159); + ClearAndSetEthPhyOcpBit(tp, + 0xB87E, + 0xFF00, + 0x0700 + ); + + + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80A2); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0153); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x809C); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0153); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x81B3); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0043); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00A7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00D6); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00EC); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00F6); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00FB); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00FD); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00FF); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x00BB); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0058); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0029); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0013); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0009); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0004); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0002); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0000); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8257); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x020F); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80EA); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x7843); + + + rtl8125_set_phy_mcu_patch_request(tp); + + ClearEthPhyOcpBit(tp, 0xB896, BIT_0); + ClearEthPhyOcpBit(tp, 0xB892, 0xFF00); + + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC091); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x6E12); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC092); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x1214); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC094); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x1516); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC096); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x171B); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC098); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x1B1C); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC09A); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x1F1F); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC09C); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x2021); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC09E); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x2224); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC0A0); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x2424); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC0A2); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x2424); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC0A4); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x2424); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC018); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x0AF2); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC01A); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x0D4A); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC01C); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x0F26); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC01E); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x118D); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC020); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x14F3); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC022); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x175A); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC024); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x19C0); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC026); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x1C26); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC089); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x6050); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC08A); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x5F6E); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC08C); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x6E6E); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC08E); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x6E6E); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC090); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x6E12); + + SetEthPhyOcpBit(tp, 0xB896, BIT_0); + + rtl8125_clear_phy_mcu_patch_request(tp); + + + SetEthPhyOcpBit(tp, 0xD068, BIT_13); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x81A2); + SetEthPhyOcpBit(tp, 0xA438, BIT_8); + ClearAndSetEthPhyOcpBit(tp, + 0xB54C, + 0xFF00, + 0xDB00); + + + ClearEthPhyOcpBit(tp, 0xA454, BIT_0); + + + SetEthPhyOcpBit(tp, 0xA5D4, BIT_5); + ClearEthPhyOcpBit(tp, 0xAD4E, BIT_4); + ClearEthPhyOcpBit(tp, 0xA86A, BIT_0); + + + SetEthPhyOcpBit(tp, 0xA442, BIT_11); + + + if (tp->RequirePhyMdiSwapPatch) { + u16 adccal_offset_p0; + u16 adccal_offset_p1; + u16 adccal_offset_p2; + u16 adccal_offset_p3; + u16 rg_lpf_cap_xg_p0; + u16 rg_lpf_cap_xg_p1; + u16 rg_lpf_cap_xg_p2; + u16 rg_lpf_cap_xg_p3; + u16 rg_lpf_cap_p0; + u16 rg_lpf_cap_p1; + u16 rg_lpf_cap_p2; + u16 rg_lpf_cap_p3; + + ClearAndSetEthPhyOcpBit(tp, + 0xD068, + 0x0007, + 0x0001 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xD068, + 0x0018, + 0x0000 + ); + adccal_offset_p0 = mdio_direct_read_phy_ocp(tp, 0xD06A); + adccal_offset_p0 &= 0x07FF; + ClearAndSetEthPhyOcpBit(tp, + 0xD068, + 0x0018, + 0x0008 + ); + adccal_offset_p1 = mdio_direct_read_phy_ocp(tp, 0xD06A); + adccal_offset_p1 &= 0x07FF; + ClearAndSetEthPhyOcpBit(tp, + 0xD068, + 0x0018, + 0x0010 + ); + adccal_offset_p2 = mdio_direct_read_phy_ocp(tp, 0xD06A); + adccal_offset_p2 &= 0x07FF; + ClearAndSetEthPhyOcpBit(tp, + 0xD068, + 0x0018, + 0x0018 + ); + adccal_offset_p3 = mdio_direct_read_phy_ocp(tp, 0xD06A); + adccal_offset_p3 &= 0x07FF; + + + ClearAndSetEthPhyOcpBit(tp, + 0xD068, + 0x0018, + 0x0000 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xD06A, + 0x07FF, + adccal_offset_p3 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xD068, + 0x0018, + 0x0008 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xD06A, + 0x07FF, + adccal_offset_p2 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xD068, + 0x0018, + 0x0010 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xD06A, + 0x07FF, + adccal_offset_p1 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xD068, + 0x0018, + 0x0018 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xD06A, + 0x07FF, + adccal_offset_p0 + ); + + + rg_lpf_cap_xg_p0 = mdio_direct_read_phy_ocp(tp, 0xBD5A); + rg_lpf_cap_xg_p0 &= 0x001F; + rg_lpf_cap_xg_p1 = mdio_direct_read_phy_ocp(tp, 0xBD5A); + rg_lpf_cap_xg_p1 &= 0x1F00; + rg_lpf_cap_xg_p2 = mdio_direct_read_phy_ocp(tp, 0xBD5C); + rg_lpf_cap_xg_p2 &= 0x001F; + rg_lpf_cap_xg_p3 = mdio_direct_read_phy_ocp(tp, 0xBD5C); + rg_lpf_cap_xg_p3 &= 0x1F00; + rg_lpf_cap_p0 = mdio_direct_read_phy_ocp(tp, 0xBC18); + rg_lpf_cap_p0 &= 0x001F; + rg_lpf_cap_p1 = mdio_direct_read_phy_ocp(tp, 0xBC18); + rg_lpf_cap_p1 &= 0x1F00; + rg_lpf_cap_p2 = mdio_direct_read_phy_ocp(tp, 0xBC1A); + rg_lpf_cap_p2 &= 0x001F; + rg_lpf_cap_p3 = mdio_direct_read_phy_ocp(tp, 0xBC1A); + rg_lpf_cap_p3 &= 0x1F00; + + + ClearAndSetEthPhyOcpBit(tp, + 0xBD5A, + 0x001F, + rg_lpf_cap_xg_p3 >> 8 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xBD5A, + 0x1F00, + rg_lpf_cap_xg_p2 << 8 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xBD5C, + 0x001F, + rg_lpf_cap_xg_p1 >> 8 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xBD5C, + 0x1F00, + rg_lpf_cap_xg_p0 << 8 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xBC18, + 0x001F, + rg_lpf_cap_p3 >> 8 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xBC18, + 0x1F00, + rg_lpf_cap_p2 << 8 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xBC1A, + 0x001F, + rg_lpf_cap_p1 >> 8 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xBC1A, + 0x1F00, + rg_lpf_cap_p0 << 8 + ); + } + + + if (aspm) { + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { + rtl8125_enable_phy_aldps(tp); + } + } +} + +static void +rtl8125_hw_phy_config_8125b_1(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + SetEthPhyOcpBit(tp, 0xA442, BIT_11); + + + SetEthPhyOcpBit(tp, 0xBC08, (BIT_3 | BIT_2)); + + + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8FFF); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x0400 + ); + } + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8560); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x19CC); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8562); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x19CC); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8564); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x19CC); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8566); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x147D); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8568); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x147D); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x856A); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x147D); + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FFE); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0907); + } + ClearAndSetEthPhyOcpBit(tp, + 0xACDA, + 0xFF00, + 0xFF00 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xACDE, + 0xF000, + 0xF000 + ); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80D6); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x2801); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80F2); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x2801); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80F4); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x6077); + mdio_direct_write_phy_ocp(tp, 0xB506, 0x01E7); + mdio_direct_write_phy_ocp(tp, 0xAC8C, 0x0FFC); + mdio_direct_write_phy_ocp(tp, 0xAC46, 0xB7B4); + mdio_direct_write_phy_ocp(tp, 0xAC50, 0x0FBC); + mdio_direct_write_phy_ocp(tp, 0xAC3C, 0x9240); + mdio_direct_write_phy_ocp(tp, 0xAC4E, 0x0DB4); + mdio_direct_write_phy_ocp(tp, 0xACC6, 0x0707); + mdio_direct_write_phy_ocp(tp, 0xACC8, 0xA0D3); + mdio_direct_write_phy_ocp(tp, 0xAD08, 0x0007); + + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8013); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0700); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FB9); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x2801); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FBA); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0100); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FBC); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x1900); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FBE); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xE100); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FC0); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0800); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FC2); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xE500); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FC4); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0F00); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FC6); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xF100); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FC8); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0400); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FCa); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xF300); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FCc); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xFD00); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FCe); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xFF00); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FD0); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xFB00); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FD2); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0100); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FD4); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xF400); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FD6); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xFF00); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8FD8); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xF600); + + + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x813D); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x390E); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x814F); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x790E); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80B0); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0F31); + SetEthPhyOcpBit(tp, 0xBF4C, BIT_1); + SetEthPhyOcpBit(tp, 0xBCCA, (BIT_9 | BIT_8)); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8141); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x320E); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8153); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x720E); + ClearEthPhyOcpBit(tp, 0xA432, BIT_6); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8529); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x050E); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x816C); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xC4A0); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8170); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xC4A0); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8174); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x04A0); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8178); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x04A0); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x817C); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0719); + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8FF4); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0400); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8FF1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0404); + } + mdio_direct_write_phy_ocp(tp, 0xBF4A, 0x001B); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8033); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x7C13); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8037); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x7C13); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x803B); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0xFC32); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x803F); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x7C13); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8043); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x7C13); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8047); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x7C13); + + + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8145); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x370E); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8157); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x770E); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8169); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x0D0A); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x817B); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x1D0A); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8217); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x5000 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x821A); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x5000 + ); + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DA); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0403); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DC); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x1000 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80B3); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x0384); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80B7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2007); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80BA); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x6C00 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80B5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xF009); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80BD); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x9F00 + ); + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80C7); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xf083); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DD); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x03f0); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80DF); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x1000 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80CB); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x2007); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80CE); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x6C00 + ); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80C9); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x8009); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80D1); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0x8000 + ); + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80A3); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x200A); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80A5); + mdio_direct_write_phy_ocp(tp, 0xA438, 0xF0AD); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x809F); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x6073); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80A1); + mdio_direct_write_phy_ocp(tp, 0xA438, 0x000B); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x80A9); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + 0xFF00, + 0xC000 + ); + + rtl8125_set_phy_mcu_patch_request(tp); + + ClearEthPhyOcpBit(tp, 0xB896, BIT_0); + ClearEthPhyOcpBit(tp, 0xB892, 0xFF00); + + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC23E); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x0000); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC240); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x0103); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC242); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x0507); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC244); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x090B); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC246); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x0C0E); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC248); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x1012); + mdio_direct_write_phy_ocp(tp, 0xB88E, 0xC24A); + mdio_direct_write_phy_ocp(tp, 0xB890, 0x1416); + + SetEthPhyOcpBit(tp, 0xB896, BIT_0); + + rtl8125_clear_phy_mcu_patch_request(tp); + + + SetEthPhyOcpBit(tp, 0xA86A, BIT_0); + SetEthPhyOcpBit(tp, 0xA6F0, BIT_0); + + + mdio_direct_write_phy_ocp(tp, 0xBFA0, 0xD70D); + mdio_direct_write_phy_ocp(tp, 0xBFA2, 0x4100); + mdio_direct_write_phy_ocp(tp, 0xBFA4, 0xE868); + mdio_direct_write_phy_ocp(tp, 0xBFA6, 0xDC59); + mdio_direct_write_phy_ocp(tp, 0xB54C, 0x3C18); + ClearEthPhyOcpBit(tp, 0xBFA4, BIT_5); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x817D); + SetEthPhyOcpBit(tp, 0xA438, BIT_12); + + + if (aspm) { + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { + rtl8125_enable_phy_aldps(tp); + } + } +} + +static void +rtl8125_hw_phy_config_8125b_2(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + SetEthPhyOcpBit(tp, 0xA442, BIT_11); + + + ClearAndSetEthPhyOcpBit(tp, + 0xAC46, + 0x00F0, + 0x0090 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xAD30, + 0x0003, + 0x0001 + ); + + + RTL_W16(tp, EEE_TXIDLE_TIMER_8125, tp->eee.tx_lpi_timer); + + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x80F5); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x760E); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8107); + mdio_direct_write_phy_ocp(tp, 0xB87E, 0x360E); + mdio_direct_write_phy_ocp(tp, 0xB87C, 0x8551); + ClearAndSetEthPhyOcpBit(tp, + 0xB87E, + BIT_15 | BIT_14 | BIT_13 | BIT_12 | BIT_11 | BIT_10 | BIT_9 | BIT_8, + BIT_11 + ); + + ClearAndSetEthPhyOcpBit(tp, + 0xbf00, + 0xE000, + 0xA000 + ); + ClearAndSetEthPhyOcpBit(tp, + 0xbf46, + 0x0F00, + 0x0300 + ); + mdio_direct_write_phy_ocp(tp, 0xa436, 0x8044); + mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); + mdio_direct_write_phy_ocp(tp, 0xa436, 0x804A); + mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); + mdio_direct_write_phy_ocp(tp, 0xa436, 0x8050); + mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); + mdio_direct_write_phy_ocp(tp, 0xa436, 0x8056); + mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); + mdio_direct_write_phy_ocp(tp, 0xa436, 0x805C); + mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); + mdio_direct_write_phy_ocp(tp, 0xa436, 0x8062); + mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); + mdio_direct_write_phy_ocp(tp, 0xa436, 0x8068); + mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); + mdio_direct_write_phy_ocp(tp, 0xa436, 0x806E); + mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); + mdio_direct_write_phy_ocp(tp, 0xa436, 0x8074); + mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); + mdio_direct_write_phy_ocp(tp, 0xa436, 0x807A); + mdio_direct_write_phy_ocp(tp, 0xa438, 0x2417); + + + SetEthPhyOcpBit(tp, 0xA4CA, BIT_6); + + + ClearAndSetEthPhyOcpBit(tp, + 0xBF84, + BIT_15 | BIT_14 | BIT_13, + BIT_15 | BIT_13 + ); + + + mdio_direct_write_phy_ocp(tp, 0xA436, 0x8170); + ClearAndSetEthPhyOcpBit(tp, + 0xA438, + BIT_13 | BIT_10 | BIT_9 | BIT_8, + BIT_15 | BIT_14 | BIT_12 | BIT_11 + ); + + /* + mdio_direct_write_phy_ocp(tp, 0xBFA0, 0xD70D); + mdio_direct_write_phy_ocp(tp, 0xBFA2, 0x4100); + mdio_direct_write_phy_ocp(tp, 0xBFA4, 0xE868); + mdio_direct_write_phy_ocp(tp, 0xBFA6, 0xDC59); + mdio_direct_write_phy_ocp(tp, 0xB54C, 0x3C18); + ClearEthPhyOcpBit(tp, 0xBFA4, BIT_5); + mdio_direct_write_phy_ocp(tp, 0xA436, 0x817D); + SetEthPhyOcpBit(tp, 0xA438, BIT_12); + */ + + + if (aspm) { + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { + rtl8125_enable_phy_aldps(tp); + } + } +} + +static void +rtl8125_hw_phy_config(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (tp->resume_not_chg_speed) return; + + 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) { + rtl8125_set_hw_phy_before_init_phy_mcu(dev); + + rtl8125_init_hw_phy_mcu(dev); + } +#endif + + switch (tp->mcfg) { + case CFG_METHOD_2: + rtl8125_hw_phy_config_8125a_1(dev); + break; + case CFG_METHOD_3: + rtl8125_hw_phy_config_8125a_2(dev); + break; + case CFG_METHOD_4: + rtl8125_hw_phy_config_8125b_1(dev); + break; + case CFG_METHOD_5: + rtl8125_hw_phy_config_8125b_2(dev); + break; + } + + //legacy force mode(Chap 22) + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + default: + rtl8125_mdio_write(tp, 0x1F, 0x0A5B); + rtl8125_clear_eth_phy_bit(tp, 0x12, BIT_15); + rtl8125_mdio_write(tp, 0x1F, 0x0000); + break; + } + + /*ocp phy power saving*/ + /* + if (aspm) { + if (tp->mcfg == CFG_METHOD_2 || tp->mcfg == CFG_METHOD_3) + rtl8125_enable_ocp_phy_power_saving(dev); + } + */ + + rtl8125_mdio_write(tp, 0x1F, 0x0000); + + if (HW_HAS_WRITE_PHY_MCU_RAM_CODE(tp)) { + if (tp->eee.eee_enabled) + rtl8125_enable_eee(tp); + else + rtl8125_disable_eee(tp); + } +} + +static void +rtl8125_up(struct net_device *dev) +{ + rtl8125_hw_init(dev); + rtl8125_hw_reset(dev); + rtl8125_powerup_pll(dev); + rtl8125_hw_ephy_config(dev); + rtl8125_hw_phy_config(dev); + rtl8125_hw_config(dev); +} + +/* +static inline void rtl8125_delete_esd_timer(struct net_device *dev, struct timer_list *timer) +{ + del_timer_sync(timer); +} + +static inline void rtl8125_request_esd_timer(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + struct timer_list *timer = &tp->esd_timer; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) + setup_timer(timer, rtl8125_esd_timer, (unsigned long)dev); +#else + timer_setup(timer, rtl8125_esd_timer, 0); +#endif + mod_timer(timer, jiffies + RTL8125_ESD_TIMEOUT); +} +*/ + +/* +static inline void rtl8125_delete_link_timer(struct net_device *dev, struct timer_list *timer) +{ + del_timer_sync(timer); +} + +static inline void rtl8125_request_link_timer(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + struct timer_list *timer = &tp->link_timer; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) + setup_timer(timer, rtl8125_link_timer, (unsigned long)dev); +#else + timer_setup(timer, rtl8125_link_timer, 0); +#endif + mod_timer(timer, jiffies + RTL8125_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 +rtl8125_netpoll(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int i; + for (i = 0; i < tp->irq_nvecs; i++) { + struct r8125_irq *irq = &tp->irq_tbl[i]; + struct r8125_napi *r8125napi = &tp->r8125napi[i]; + + disable_irq(irq->vector); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,12,0) + irq->handler(irq->vector, r8125napi); +#elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) + irq->handler(irq->vector, r8125napi, NULL); +#else + irq->handler(irq->vector, r8125napi); +#endif + + enable_irq(irq->vector); + } +} +#endif //CONFIG_NET_POLL_CONTROLLER + +static void +rtl8125_get_bios_setting(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->bios_setting = RTL_R32(tp, TimeInt2); + break; + } +} + +static void +rtl8125_set_bios_setting(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W32(tp, TimeInt2, tp->bios_setting); + break; + } +} + +static void +rtl8125_setup_mqs_reg(struct rtl8125_private *tp) +{ + int i; + + //tx + tp->tx_ring[0].tdsar_reg = TxDescStartAddrLow; + for (i = 1; i < R8125_MAX_TX_QUEUES; i++) { + tp->tx_ring[i].tdsar_reg = (u16)(TNPDS_Q1_LOW_8125 + (i - 1) * 8); + } + + for (i = 0; i < R8125_MAX_TX_QUEUES; i++) { + tp->tx_ring[i].hw_clo_ptr_reg = (u16)(HW_CLO_PTR0_8125 + i * 4); + tp->tx_ring[i].sw_tail_ptr_reg = (u16)(SW_TAIL_PTR0_8125 + i * 4); + } + + //rx + tp->rx_ring[0].rdsar_reg = RxDescAddrLow; + for (i = 1; i < R8125_MAX_RX_QUEUES; i++) { + tp->rx_ring[i].rdsar_reg = (u16)(RDSAR_Q1_LOW_8125 + (i - 1) * 8); + } + + tp->isr_reg[0] = ISR0_8125; + for (i = 1; i < R8125_MAX_QUEUES; i++) { + tp->isr_reg[i] = (u16)(ISR1_8125 + (i - 1) * 4); + } + + tp->imr_reg[0] = IMR0_8125; + for (i = 1; i < R8125_MAX_QUEUES; i++) { + tp->imr_reg[i] = (u16)(IMR1_8125 + (i - 1) * 4); + } +} + +static void +rtl8125_init_software_variable(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + struct pci_dev *pdev = tp->pci_dev; + + rtl8125_get_bios_setting(dev); + +#ifdef ENABLE_LIB_SUPPORT + tp->ring_lib_enabled = 1; +#endif + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + //tp->HwSuppDashVer = 3; + break; + default: + tp->HwSuppDashVer = 0; + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwPkgDet = rtl8125_mac_ocp_read(tp, 0xDC00); + tp->HwPkgDet = (tp->HwPkgDet >> 3) & 0x07; + break; + } + + if (HW_DASH_SUPPORT_TYPE_3(tp) && tp->HwPkgDet == 0x06) + eee_enable = 0; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppNowIsOobVer = 1; + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwPcieSNOffset = 0x16C; + break; + } + +#ifdef ENABLE_REALWOW_SUPPORT + rtl8125_get_realwow_hw_version(dev); +#endif //ENABLE_REALWOW_SUPPORT + + if (HW_DASH_SUPPORT_DASH(tp) && rtl8125_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; + + //map CMAC IO space + CmacMemPhysAddress = rtl8125_csi_other_fun_read(tp, 0, 0x18); + if (!(CmacMemPhysAddress & BIT_0)) { + if (CmacMemPhysAddress & BIT_2) + CmacMemPhysAddress |= (u64)rtl8125_csi_other_fun_read(tp, 0, 0x1C) << 32; + + CmacMemPhysAddress &= 0xFFFFFFF0; + /* ioremap MMIO region */ + cmac_ioaddr = ioremap(CmacMemPhysAddress, R8125_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) + } + + if (cmac_ioaddr == NULL) { + tp->DASH = 0; + } else { + tp->mapped_cmac_ioaddr = cmac_ioaddr; + } + } + + eee_enable = 0; + } + + if (HW_DASH_SUPPORT_TYPE_3(tp)) + tp->cmac_ioaddr = tp->mapped_cmac_ioaddr; + + if (aspm) { + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->org_pci_offset_99 = rtl8125_csi_fun0_read_byte(tp, 0x99); + tp->org_pci_offset_99 &= ~(BIT_5|BIT_6); + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + tp->org_pci_offset_180 = rtl8125_csi_fun0_read_byte(tp, 0x264); + break; + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->org_pci_offset_180 = rtl8125_csi_fun0_read_byte(tp, 0x214); + 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_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + 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_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppMagicPktVer = WAKEUP_MAGIC_PACKET_V3; + break; + default: + tp->HwSuppMagicPktVer = WAKEUP_MAGIC_PACKET_NOT_SUPPORT; + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppLinkChgWakeUpVer = 3; + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppD0SpeedUpVer = 1; + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppCheckPhyDisableModeVer = 3; + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppTxNoCloseVer = 3; + break; + } + + if (tp->HwSuppTxNoCloseVer > 0 && tx_no_close_enable == 1) + tp->EnableTxNoClose = TRUE; + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + tp->RequireLSOPatch = TRUE; + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_2; + break; + case CFG_METHOD_3: + tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_3; + break; + case CFG_METHOD_4: + tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_4; + break; + case CFG_METHOD_5: + tp->sw_ram_code_ver = NIC_RAMCODE_VERSION_CFG_METHOD_5; + break; + } + + if (tp->HwIcVerUnknown) { + tp->NotWrRamCodeToMicroP = TRUE; + tp->NotWrMcuPatchCode = TRUE; + } + + switch (tp->mcfg) { + case CFG_METHOD_3: + if ((rtl8125_mac_ocp_read(tp, 0xD442) & BIT_5) && + (mdio_direct_read_phy_ocp(tp, 0xD068) & BIT_1) + ) { + tp->RequirePhyMdiSwapPatch = TRUE; + } + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppNumTxQueues = 2; + tp->HwSuppNumRxQueues = 4; + break; + default: + tp->HwSuppNumTxQueues = 1; + tp->HwSuppNumRxQueues = 1; + break; + } + + tp->num_tx_rings = 1; +#ifdef ENABLE_MULTIPLE_TX_QUEUE +#ifndef ENABLE_LIB_SUPPORT + tp->num_tx_rings = tp->HwSuppNumTxQueues; +#endif +#endif + + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppRssVer = 5; + tp->HwSuppIndirTblEntries = 128; + break; + } + + tp->num_rx_rings = 1; +#ifdef ENABLE_RSS_SUPPORT +#ifdef ENABLE_LIB_SUPPORT + if (tp->HwSuppRssVer > 0) + tp->EnableRss = 1; +#else + if (tp->HwSuppRssVer > 0) { + u8 rss_queue_num = netif_get_num_default_rss_queues(); + tp->num_rx_rings = (tp->HwSuppNumRxQueues > rss_queue_num)? + rss_queue_num : tp->HwSuppNumRxQueues; + + if (!(tp->num_rx_rings >= 2 && tp->irq_nvecs >= tp->num_rx_rings)) + tp->num_rx_rings = 1; + + if (tp->num_rx_rings >= 2) + tp->EnableRss = 1; + } +#endif + if (tp->EnableRss) + rtl8125_init_rss(tp); +#endif + + rtl8125_setup_mqs_reg(tp); + + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppPtpVer = 1; + break; + } +#ifdef ENABLE_PTP_SUPPORT + if (tp->HwSuppPtpVer > 0) + tp->EnablePtp = 1; +#endif + + tp->InitRxDescType = RX_DESC_RING_TYPE_1; + if (tp->EnableRss || tp->EnablePtp) + tp->InitRxDescType = RX_DESC_RING_TYPE_3; + + tp->RxDescLength = RX_DESC_LEN_TYPE_1; + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) + tp->RxDescLength = RX_DESC_LEN_TYPE_3; + tp->RxDescRingLength = NUM_RX_DESC * tp->RxDescLength; + + tp->rtl8125_rx_config = rtl_chip_info[tp->chipset].RCR_Cfg; + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) + tp->rtl8125_rx_config |= EnableRxDescV3; + + //init interrupt + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppIsrVer = 2; + break; + default: + tp->HwSuppIsrVer = 1; + break; + } + + tp->HwCurrIsrVer = tp->HwSuppIsrVer; + if (tp->HwSuppIsrVer == 2) { + if (!(tp->features & RTL_FEATURE_MSIX) || + tp->irq_nvecs < R8125_MIN_MSIX_VEC_8125B) + tp->HwCurrIsrVer = 1; + } + + if (tp->HwCurrIsrVer < 2 || tp->irq_nvecs < 19) + tp->num_tx_rings = 1; + + if (tp->HwCurrIsrVer == 2) { + int i; + + tp->intr_mask = ISRIMR_V2_LINKCHG | ISRIMR_TOK_Q0; + if (tp->num_tx_rings > 1) + tp->intr_mask |= ISRIMR_TOK_Q1; + + for (i = 0; i < tp->num_rx_rings; i++) + tp->intr_mask |= ISRIMR_V2_ROK_Q0 << i; + } else { + tp->intr_mask = LinkChg | RxDescUnavail | TxOK | RxOK | SWInt; + tp->timer_intr_mask = LinkChg | PCSTimeout; + +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) { + if (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); + } + } +#endif + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + tp->HwSuppIntMitiVer = 3; + break; + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppIntMitiVer = 4; + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->HwSuppExtendTallyCounterVer = 1; + break; + } + + timer_count_v2 = (timer_count / 0x100); + + tp->NicCustLedValue = RTL_R16(tp, CustomLED); + + tp->wol_opts = rtl8125_get_hw_wol(tp); + tp->wol_enabled = (tp->wol_opts) ? WOL_ENABLED : WOL_DISABLED; + + rtl8125_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 = rtl8125_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) + + if (tp->mcfg != CFG_METHOD_DEFAULT) { + struct ethtool_eee *eee = &tp->eee; + + eee->eee_enabled = eee_enable; + eee->supported = SUPPORTED_100baseT_Full | + SUPPORTED_1000baseT_Full; + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + eee->supported |= SUPPORTED_2500baseX_Full; + break; + } + eee->advertised = mmd_eee_adv_to_ethtool_adv_t(MDIO_EEE_1000T | MDIO_EEE_100TX); + eee->tx_lpi_timer = dev->mtu + ETH_HLEN + 0x20; + } + + tp->ptp_master_mode = enable_ptp_master_mode; +} + +static void +rtl8125_release_board(struct pci_dev *pdev, + struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + void __iomem *ioaddr = tp->mmio_addr; + + rtl8125_set_bios_setting(dev); + rtl8125_rar_set(tp, tp->org_mac_addr); + tp->wol_enabled = WOL_DISABLED; + + if (!tp->DASH) + rtl8125_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 int +rtl8125_get_mac_address(struct net_device *dev) +{ + struct rtl8125_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_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) { + *(u32*)&mac_addr[0] = RTL_R32(tp, BACKUP_ADDR0_8125); + *(u16*)&mac_addr[4] = RTL_R16(tp, BACKUP_ADDR1_8125); + } + + if (!is_valid_ether_addr(mac_addr)) { + netif_err(tp, probe, dev, "Invalid ether addr %pM\n", + mac_addr); + eth_hw_addr_random(dev); + ether_addr_copy(mac_addr, dev->dev_addr); + netif_info(tp, probe, dev, "Random ether addr %pM\n", + mac_addr); + tp->random_mac = 1; + } + + rtl8125_rar_set(tp, mac_addr); + + for (i = 0; i < MAC_ADDR_LEN; i++) { + dev->dev_addr[i] = RTL_R8(tp, MAC0 + i); + tp->org_mac_addr[i] = dev->dev_addr[i]; /* keep the original MAC address */ + } +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) + memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); +#endif +// memcpy(dev->dev_addr, dev->dev_addr, dev->addr_len); + + return 0; +} + +/** + * rtl8125_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 +rtl8125_set_mac_address(struct net_device *dev, + void *p) +{ + struct rtl8125_private *tp = netdev_priv(dev); + struct sockaddr *addr = p; + + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); + + rtl8125_rar_set(tp, dev->dev_addr); + + return 0; +} + +/****************************************************************************** + * rtl8125_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 +rtl8125_rar_set(struct rtl8125_private *tp, + uint8_t *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)); + + rtl8125_enable_cfg9346_write(tp); + RTL_W32(tp, MAC0, rar_low); + RTL_W32(tp, MAC4, rar_high); + + rtl8125_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(®s, 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, ®s, regbuf); + + ret = -EFAULT; + if (copy_to_user(useraddr, ®s, 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(ðcmd, 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 + +static int +rtl8125_do_ioctl(struct net_device *dev, + struct ifreq *ifr, + int cmd) +{ + struct rtl8125_private *tp = netdev_priv(dev); + struct mii_ioctl_data *data = if_mii(ifr); + int ret; + + ret = 0; + switch (cmd) { + case SIOCGMIIPHY: + data->phy_id = 32; /* Internal PHY */ + break; + + case SIOCGMIIREG: + rtl8125_mdio_write(tp, 0x1F, 0x0000); + data->val_out = rtl8125_mdio_read(tp, data->reg_num); + break; + + case SIOCSMIIREG: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + rtl8125_mdio_write(tp, 0x1F, 0x0000); + rtl8125_mdio_write(tp, data->reg_num, data->val_in); + break; + +#ifdef ETHTOOL_OPS_COMPAT + case SIOCETHTOOL: + ret = ethtool_ioctl(ifr); + break; +#endif + +#ifdef ENABLE_DASH_SUPPORT + case SIOCDEVPRIVATE_RTLDASH: + if (!netif_running(dev)) { + ret = -ENODEV; + break; + } + if (!capable(CAP_NET_ADMIN)) { + ret = -EPERM; + break; + } + + ret = rtl8125_dash_ioctl(dev, ifr); + break; +#endif + +#ifdef ENABLE_REALWOW_SUPPORT + case SIOCDEVPRIVATE_RTLREALWOW: + if (!netif_running(dev)) { + ret = -ENODEV; + break; + } + + ret = rtl8125_realwow_ioctl(dev, ifr); + break; +#endif + +#ifdef ENABLE_PTP_SUPPORT + case SIOCSHWTSTAMP: + case SIOCGHWTSTAMP: + if (tp->EnablePtp) + ret = rtl8125_ptp_ioctl(dev, ifr, cmd); + else + ret = -EOPNOTSUPP; + break; +#endif + case SIOCRTLTOOL: + ret = rtl8125_tool_ioctl(tp, ifr); + break; + + default: + ret = -EOPNOTSUPP; + break; + } + + return ret; +} + +static void +rtl8125_phy_power_up(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (rtl8125_is_in_phy_disable_mode(dev)) { + return; + } + + rtl8125_mdio_write(tp, 0x1F, 0x0000); + rtl8125_mdio_write(tp, MII_BMCR, BMCR_ANENABLE); + + //wait ups resume (phy state 3) + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_wait_phy_ups_resume(dev, 3); + break; + }; +} + +static void +rtl8125_phy_power_down(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + rtl8125_mdio_write(tp, 0x1F, 0x0000); + rtl8125_mdio_write(tp, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN); +} + +static int __devinit +rtl8125_init_board(struct pci_dev *pdev, + struct net_device **dev_out, + void __iomem **ioaddr_out) +{ + void __iomem *ioaddr; + struct net_device *dev; + struct rtl8125_private *tp; + int rc = -ENOMEM, i, pm_cap; + + assert(ioaddr_out != NULL); + + /* dev zeroed in alloc_etherdev */ + dev = alloc_etherdev_mq(sizeof (*tp), R8125_MAX_QUEUES); + 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->pci_dev = pdev; + tp->msg_enable = netif_msg_init(debug.msg_enable, R8125_MSG_DEFAULT); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) + if (!aspm) + 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) < R8125_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), pci_resource_len(pdev, 2)); + 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 */ + rtl8125_get_mac_version(tp); + + rtl8125_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-8125 */ +#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 +rtl8125_esd_checker(struct rtl8125_private *tp) +{ + struct net_device *dev = tp->dev; + struct pci_dev *pdev = tp->pci_dev; + 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; + + 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_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 = rtl8125_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); + rtl8125_csi_write(tp, tp->HwPcieSNOffset, tp->pci_cfg_space.pci_sn_l); + tp->esd_flag |= BIT_13; + } + + pci_sn_h = rtl8125_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); + rtl8125_csi_write(tp, tp->HwPcieSNOffset + 4, tp->pci_cfg_space.pci_sn_h); + tp->esd_flag |= BIT_14; + } + } + + if (tp->esd_flag != 0) { + printk(KERN_ERR "%s: esd_flag = 0x%04x\n.\n", dev->name, tp->esd_flag); + netif_tx_stop_all_queues(dev); + netif_carrier_off(dev); + rtl8125_hw_reset(dev); + rtl8125_tx_clear(tp); + rtl8125_rx_clear(tp); + rtl8125_init_ring(dev); + rtl8125_up(dev); + rtl8125_enable_hw_linkchg_interrupt(tp); + rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); + tp->esd_flag = 0; + } +} +/* +static void +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) +rtl8125_esd_timer(unsigned long __opaque) +#else +rtl8125_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 rtl8125_private *tp = netdev_priv(dev); + struct timer_list *timer = &tp->esd_timer; +#else + struct rtl8125_private *tp = from_timer(tp, t, esd_timer); + //struct net_device *dev = tp->dev; + struct timer_list *timer = t; +#endif + rtl8125_esd_checker(tp); + + mod_timer(timer, jiffies + timeout); +} +*/ + +/* +static void +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0) +rtl8125_link_timer(unsigned long __opaque) +#else +rtl8125_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 rtl8125_private *tp = netdev_priv(dev); + struct timer_list *timer = &tp->link_timer; +#else + struct rtl8125_private *tp = from_timer(tp, t, link_timer); + struct net_device *dev = tp->dev; + struct timer_list *timer = t; +#endif + rtl8125_check_link_status(dev); + + mod_timer(timer, jiffies + RTL8125_LINK_TIMEOUT); +} +*/ + +int +rtl8125_enable_msix(struct rtl8125_private *tp) +{ + int i, nvecs = 0; + struct msix_entry msix_ent[R8125_MAX_MSIX_VEC]; + //struct net_device *dev = tp->dev; + //const int len = sizeof(tp->irq_tbl[0].name); + + for (i = 0; i < R8125_MAX_MSIX_VEC; i++) { + msix_ent[i].entry = i; + msix_ent[i].vector = 0; + } + + nvecs = pci_enable_msix_range(tp->pci_dev, msix_ent, + tp->min_irq_nvecs, tp->max_irq_nvecs); + if (nvecs < 0) + goto out; + + for (i = 0; i < nvecs; i++) { + struct r8125_irq *irq = &tp->irq_tbl[i]; + irq->vector = msix_ent[i].vector; + //snprintf(irq->name, len, "%s-%d", dev->name, i); + //irq->handler = rtl8125_interrupt_msix; + } + +out: + return nvecs; +} + +void rtl8125_dump_msix_tbl(struct rtl8125_private *tp) +{ + void __iomem *ioaddr; + + /* ioremap MMIO region */ + ioaddr = ioremap(pci_resource_start(tp->pci_dev, 4), pci_resource_len(tp->pci_dev, 4)); + if (ioaddr) { + int i = 0; + for (i=0; iirq_nvecs; i++) { + printk("entry 0x%d %08X %08X %08X %08X \n", + i, + readl(ioaddr + 16 * i), + readl(ioaddr + 16 * i + 4), + readl(ioaddr + 16 * i + 8), + readl(ioaddr + 16 * i + 12)); + } + iounmap(ioaddr); + } +} + +/* Cfg9346_Unlock assumed. */ +static int rtl8125_try_msi(struct rtl8125_private *tp) +{ + struct pci_dev *pdev = tp->pci_dev; + unsigned msi = 0; + int nvecs = 1; + + tp->max_irq_nvecs = 1; + tp->min_irq_nvecs = 1; +#ifndef DISABLE_MULTI_MSIX_VECTOR + switch (tp->mcfg) { + case CFG_METHOD_4: + case CFG_METHOD_5: + tp->max_irq_nvecs = R8125_MAX_MSIX_VEC_8125B; + tp->min_irq_nvecs = R8125_MIN_MSIX_VEC_8125B; + break; + } +#endif + +#if defined(RTL_USE_NEW_INTR_API) + if ((nvecs = pci_alloc_irq_vectors(pdev, tp->min_irq_nvecs, tp->max_irq_nvecs, PCI_IRQ_MSIX)) > 0) + msi |= RTL_FEATURE_MSIX; + else if ((nvecs = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES)) > 0 && + pci_dev_msi_enabled(pdev)) + msi |= RTL_FEATURE_MSI; +#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) + if ((nvecs = rtl8125_enable_msix(tp)) > 0) + msi |= RTL_FEATURE_MSIX; + else if (!pci_enable_msi(pdev)) + msi |= RTL_FEATURE_MSI; +#endif + if (!(msi & (RTL_FEATURE_MSI | RTL_FEATURE_MSIX))) + dev_info(&pdev->dev, "no MSI/MSI-X. Back to INTx.\n"); + + if (!(msi & RTL_FEATURE_MSIX) || nvecs < 1) + nvecs = 1; + + tp->irq_nvecs = nvecs; + + tp->features |= msi; + + return nvecs; +} + +static void rtl8125_disable_msi(struct pci_dev *pdev, struct rtl8125_private *tp) +{ +#if defined(RTL_USE_NEW_INTR_API) + if (tp->features & (RTL_FEATURE_MSI | RTL_FEATURE_MSIX)) + pci_free_irq_vectors(pdev); +#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13) + if (tp->features & (RTL_FEATURE_MSIX)) + pci_disable_msix(pdev); + else if (tp->features & (RTL_FEATURE_MSI)) + pci_disable_msi(pdev); +#endif + tp->features &= ~(RTL_FEATURE_MSI | RTL_FEATURE_MSIX); +} + +static int rtl8125_get_irq(struct pci_dev *pdev) +{ +#if defined(RTL_USE_NEW_INTR_API) + return pci_irq_vector(pdev, 0); +#else + return pdev->irq; +#endif +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) +static const struct net_device_ops rtl8125_netdev_ops = { + .ndo_open = rtl8125_open, + .ndo_stop = rtl8125_close, + .ndo_get_stats = rtl8125_get_stats, + .ndo_start_xmit = rtl8125_start_xmit, + .ndo_tx_timeout = rtl8125_tx_timeout, + .ndo_change_mtu = rtl8125_change_mtu, + .ndo_set_mac_address = rtl8125_set_mac_address, + .ndo_do_ioctl = rtl8125_do_ioctl, +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,1,0) + .ndo_set_multicast_list = rtl8125_set_rx_mode, +#else + .ndo_set_rx_mode = rtl8125_set_rx_mode, +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) +#ifdef CONFIG_R8125_VLAN + .ndo_vlan_rx_register = rtl8125_vlan_rx_register, +#endif +#else + .ndo_fix_features = rtl8125_fix_features, + .ndo_set_features = rtl8125_set_features, +#endif +#ifdef CONFIG_NET_POLL_CONTROLLER + .ndo_poll_controller = rtl8125_netpoll, +#endif +}; +#endif + + +#ifdef CONFIG_R8125_NAPI + +static int rtl8125_poll(napi_ptr napi, napi_budget budget) +{ + struct r8125_napi *r8125napi = RTL_GET_PRIV(napi, struct r8125_napi); + struct rtl8125_private *tp = r8125napi->priv; + RTL_GET_NETDEV(tp) + unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); + unsigned int work_done = 0; + int i; + + for (i = 0; i < tp->num_rx_rings; i++) + work_done += rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[i], budget); + + for (i = 0; i < tp->num_tx_rings; i++) + rtl8125_tx_interrupt(&tp->tx_ring[i], budget); + + RTL_NAPI_QUOTA_UPDATE(dev, work_done, budget); + + if (work_done < work_to_do) { +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) + HandleDashInterrupt(tp->dev); +#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(); + + rtl8125_switch_to_timer_interrupt(tp); + } + + return RTL_NAPI_RETURN_VALUE; +} + +#if 0 +static int rtl8125_poll_msix_ring(napi_ptr napi, napi_budget budget) +{ + struct r8125_napi *r8125napi = RTL_GET_PRIV(napi, struct r8125_napi); + struct rtl8125_private *tp = r8125napi->priv; + RTL_GET_NETDEV(tp) + unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); + unsigned int work_done = 0; + const int message_id = r8125napi->index; + + work_done += rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[message_id], budget); + + rtl8125_tx_interrupt_with_vector(tp, message_id, budget); + + RTL_NAPI_QUOTA_UPDATE(dev, work_done, budget); + + if (work_done < work_to_do) { +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH && message_id == 0) + HandleDashInterrupt(tp->dev); +#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(); + + rtl8125_enable_hw_interrupt_v2(tp, message_id); + } + + return RTL_NAPI_RETURN_VALUE; +} +#endif + +static int rtl8125_poll_msix_tx(napi_ptr napi, napi_budget budget) +{ + struct r8125_napi *r8125napi = RTL_GET_PRIV(napi, struct r8125_napi); + struct rtl8125_private *tp = r8125napi->priv; + RTL_GET_NETDEV(tp) + unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); + unsigned int work_done = 0; + const int message_id = r8125napi->index; + + //suppress unused variable + (void)(dev); + + rtl8125_tx_interrupt_with_vector(tp, message_id, budget); + + RTL_NAPI_QUOTA_UPDATE(dev, work_done, budget); + + if (work_done < work_to_do) { +#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(); + + rtl8125_enable_hw_interrupt_v2(tp, message_id); + } + + return RTL_NAPI_RETURN_VALUE; +} + +static int rtl8125_poll_msix_other(napi_ptr napi, napi_budget budget) +{ + struct r8125_napi *r8125napi = RTL_GET_PRIV(napi, struct r8125_napi); + struct rtl8125_private *tp = r8125napi->priv; + RTL_GET_NETDEV(tp) + unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); + const int message_id = r8125napi->index; + + //suppress unused variable + (void)(dev); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0) + RTL_NETIF_RX_COMPLETE(dev, napi, work_to_do); +#else + RTL_NETIF_RX_COMPLETE(dev, napi, work_to_do); +#endif + + rtl8125_enable_hw_interrupt_v2(tp, message_id); + + return 1; +} + +static int rtl8125_poll_msix_rx(napi_ptr napi, napi_budget budget) +{ + struct r8125_napi *r8125napi = RTL_GET_PRIV(napi, struct r8125_napi); + struct rtl8125_private *tp = r8125napi->priv; + RTL_GET_NETDEV(tp) + unsigned int work_to_do = RTL_NAPI_QUOTA(budget, dev); + unsigned int work_done = 0; + const int message_id = r8125napi->index; + + work_done += rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[message_id], budget); + + RTL_NAPI_QUOTA_UPDATE(dev, work_done, budget); + + if (work_done < work_to_do) { +#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(); + + rtl8125_enable_hw_interrupt_v2(tp, message_id); + } + + return RTL_NAPI_RETURN_VALUE; +} + +static void rtl8125_enable_napi(struct rtl8125_private *tp) +{ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) + int i; + + for (i = 0; i < tp->irq_nvecs; i++) + RTL_NAPI_ENABLE(tp->dev, &tp->r8125napi[i].napi); +#endif +} + +static void rtl8125_disable_napi(struct rtl8125_private *tp) +{ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) + int i; + + for (i = 0; i < tp->irq_nvecs; i++) + RTL_NAPI_DISABLE(tp->dev, &tp->r8125napi[i].napi); +#endif +} + +static void rtl8125_del_napi(struct rtl8125_private *tp) +{ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) + int i; + + for (i = 0; i < tp->irq_nvecs; i++) + RTL_NAPI_DEL((&tp->r8125napi[i])); +#endif +} +#endif //CONFIG_R8125_NAPI + +static void rtl8125_init_napi(struct rtl8125_private *tp) +{ + int i; + + for (i=0; iirq_nvecs; i++) { + struct r8125_napi *r8125napi = &tp->r8125napi[i]; +#ifdef CONFIG_R8125_NAPI + int (*poll)(struct napi_struct *, int); + + if (tp->features & RTL_FEATURE_MSIX && + tp->HwCurrIsrVer == 2) { + if (i < R8125_MAX_RX_QUEUES_VEC_V3) + poll = rtl8125_poll_msix_rx; + else if (i == 16 || i == 18) + poll = rtl8125_poll_msix_tx; + else + poll = rtl8125_poll_msix_other; + } else { + poll = rtl8125_poll; + } + + RTL_NAPI_CONFIG(tp->dev, r8125napi, poll, R8125_NAPI_WEIGHT); +#endif + + r8125napi->priv = tp; + r8125napi->index = i; + } +} + +static int +rtl8125_set_real_num_queue(struct rtl8125_private *tp) +{ + int retval = 0; + + retval = netif_set_real_num_tx_queues(tp->dev, tp->num_tx_rings); + if (retval < 0) + goto exit; + + retval = netif_set_real_num_rx_queues(tp->dev, tp->num_rx_rings); + if (retval < 0) + goto exit; + +exit: + return retval; +} + +static int __devinit +rtl8125_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + struct net_device *dev = NULL; + struct rtl8125_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 2.5Gigabit Ethernet driver %s loaded\n", + MODULENAME, RTL8125_VERSION); + + rc = rtl8125_init_board(pdev, &dev, &ioaddr); + if (rc) + goto out; + + tp = netdev_priv(dev); + assert(ioaddr != NULL); + + tp->set_speed = rtl8125_set_speed_xmii; + tp->get_settings = rtl8125_gset_xmii; + tp->phy_reset_enable = rtl8125_xmii_reset_enable; + tp->phy_reset_pending = rtl8125_xmii_reset_pending; + tp->link_ok = rtl8125_xmii_link_ok; + + rc = rtl8125_try_msi(tp); + if (rc < 0) { + dev_err(&pdev->dev, "Can't allocate interrupt\n"); + goto err_out_1; + } + + rtl8125_init_software_variable(dev); + + RTL_NET_DEVICE_OPS(rtl8125_netdev_ops); + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) + SET_ETHTOOL_OPS(dev, &rtl8125_ethtool_ops); +#endif + + dev->watchdog_timeo = RTL8125_TX_TIMEOUT; + dev->irq = rtl8125_get_irq(pdev); + dev->base_addr = (unsigned long) ioaddr; + + rtl8125_init_napi(tp); + +#ifdef CONFIG_R8125_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 = rtl8125_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_TSO | + 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_TSO | + NETIF_F_HIGHDMA; +#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) + dev->hw_features |= NETIF_F_IPV6_CSUM | NETIF_F_TSO6; + dev->features |= NETIF_F_IPV6_CSUM; + 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) + +#ifdef ENABLE_RSS_SUPPORT + if (tp->EnableRss) { + dev->hw_features |= NETIF_F_RXHASH; + dev->features |= NETIF_F_RXHASH; + } +#endif + } + +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) + AllocateDashShareMemory(dev); +#endif + +#ifdef ENABLE_LIB_SUPPORT + ATOMIC_INIT_NOTIFIER_HEAD(&tp->lib_nh); +#endif + rtl8125_init_all_schedule_work(tp); + + rc = rtl8125_set_real_num_queue(tp); + if (rc < 0) + goto err_out; + + rtl8125_exit_oob(dev); + + rtl8125_powerup_pll(dev); + + rtl8125_hw_init(dev); + + rtl8125_hw_reset(dev); + + /* Get production from EEPROM */ + rtl8125_eeprom_type(tp); + + if (tp->eeprom_type == EEPROM_TYPE_93C46 || tp->eeprom_type == EEPROM_TYPE_93C56) + rtl8125_set_eeprom_sel_low(tp); + + rtl8125_get_mac_address(dev); + + tp->fw_name = rtl_chip_fw_infos[tp->mcfg].fw_name; + + 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; + } + + rtl8125_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); + + rtl8125_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_R8125_NAPI + rtl8125_del_napi(tp); +#endif + rtl8125_disable_msi(pdev, tp); + +err_out_1: + rtl8125_release_board(pdev, dev); + + goto out; +} + +static void __devexit +rtl8125_remove_one(struct pci_dev *pdev) +{ + struct net_device *dev = pci_get_drvdata(pdev); + struct rtl8125_private *tp = netdev_priv(dev); + + assert(dev != NULL); + assert(tp != NULL); + + set_bit(R8125_FLAG_DOWN, tp->task_flags); + + rtl8125_cancel_all_schedule_work(tp); + +#ifdef CONFIG_R8125_NAPI + rtl8125_del_napi(tp); +#endif + if (tp->DASH) + rtl8125_driver_stop(tp); + + unregister_netdev(dev); + rtl8125_disable_msi(pdev, tp); +#ifdef ENABLE_R8125_PROCFS + rtl8125_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; + } + + rtl8125_release_board(pdev, dev); + +#ifdef ENABLE_USE_FIRMWARE_FILE + rtl8125_release_firmware(tp); +#endif + + pci_set_drvdata(pdev, NULL); +} + +static void +rtl8125_set_rxbufsize(struct rtl8125_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; +} + +static void rtl8125_free_irq(struct rtl8125_private *tp) +{ + int i; + + for (i=0; iirq_nvecs; i++) { + struct r8125_irq *irq = &tp->irq_tbl[i]; + struct r8125_napi *r8125napi = &tp->r8125napi[i]; + + if (irq->requested) { + irq->requested = 0; +#if defined(RTL_USE_NEW_INTR_API) + pci_free_irq(tp->pci_dev, i, r8125napi); +#else + free_irq(irq->vector, r8125napi); +#endif + } + } +} + +static int rtl8125_alloc_irq(struct rtl8125_private *tp) +{ + struct net_device *dev = tp->dev; + int rc = 0; + struct r8125_irq *irq; + struct r8125_napi *r8125napi; + int i = 0; + const int len = sizeof(tp->irq_tbl[0].name); + +#if defined(RTL_USE_NEW_INTR_API) + for (i=0; iirq_nvecs; i++) { + irq = &tp->irq_tbl[i]; + if (tp->features & RTL_FEATURE_MSIX && + tp->HwCurrIsrVer == 2) + irq->handler = rtl8125_interrupt_msix; + else + irq->handler = rtl8125_interrupt; + + r8125napi = &tp->r8125napi[i]; + snprintf(irq->name, len, "%s-%d", dev->name, i); + rc = pci_request_irq(tp->pci_dev, i, irq->handler, NULL, r8125napi, + irq->name); + if (rc) + break; + + irq->vector = pci_irq_vector(tp->pci_dev, i); + irq->requested = 1; + } +#else + unsigned long irq_flags = 0; +#ifdef ENABLE_LIB_SUPPORT + irq_flags |= IRQF_NO_SUSPEND; +#endif + if (tp->features & RTL_FEATURE_MSIX && + tp->HwCurrIsrVer == 2) { + for (i=0; iirq_nvecs; i++) { + irq = &tp->irq_tbl[i]; + irq->handler = rtl8125_interrupt_msix; + r8125napi = &tp->r8125napi[i]; + snprintf(irq->name, len, "%s-%d", dev->name, i); + rc = request_irq(irq->vector, irq->handler, irq_flags, irq->name, r8125napi); + + if (rc) + break; + + irq->requested = 1; + } + } else { + irq = &tp->irq_tbl[0]; + irq->handler = rtl8125_interrupt; + r8125napi = &tp->r8125napi[0]; + snprintf(irq->name, len, "%s-0", dev->name); + if (!(tp->features & RTL_FEATURE_MSIX)) + irq->vector = dev->irq; + irq_flags |= (tp->features & (RTL_FEATURE_MSI | RTL_FEATURE_MSIX)) ? 0 : SA_SHIRQ; + rc = request_irq(irq->vector, irq->handler, irq_flags, irq->name, r8125napi); + + if (rc == 0) + irq->requested = 1; + } +#endif + if (rc) + rtl8125_free_irq(tp); + + return rc; +} + +static int rtl8125_alloc_tx_desc(struct rtl8125_private *tp) +{ + struct rtl8125_tx_ring *ring; + struct pci_dev *pdev = tp->pci_dev; + int i; + + for (i = 0; i < tp->num_tx_rings; i++) { + ring = &tp->tx_ring[i]; + ring->TxDescArray = dma_alloc_coherent(&pdev->dev, R8125_TX_RING_BYTES, + &ring->TxPhyAddr, GFP_KERNEL); + + if (!ring->TxDescArray) + return -1; + } + + return 0; +} + +static int rtl8125_alloc_rx_desc(struct rtl8125_private *tp) +{ + struct rtl8125_rx_ring *ring; + struct pci_dev *pdev = tp->pci_dev; + int i; + + for (i = 0; i < tp->num_rx_rings; i++) { + ring = &tp->rx_ring[i]; + ring->RxDescArray = dma_alloc_coherent(&pdev->dev, tp->RxDescRingLength, + &ring->RxPhyAddr, GFP_KERNEL); + + if (!ring->RxDescArray) + return -1; + } + + return 0; +} + +static void rtl8125_free_tx_desc(struct rtl8125_private *tp) +{ + struct rtl8125_tx_ring *ring; + struct pci_dev *pdev = tp->pci_dev; + int i; + + for (i = 0; i < tp->num_tx_rings; i++) { + ring = &tp->tx_ring[i]; + if (ring->TxDescArray) { + dma_free_coherent(&pdev->dev, R8125_TX_RING_BYTES, ring->TxDescArray, + ring->TxPhyAddr); + ring->TxDescArray = NULL; + } + } +} + +static void rtl8125_free_rx_desc(struct rtl8125_private *tp) +{ + struct rtl8125_rx_ring *ring; + struct pci_dev *pdev = tp->pci_dev; + int i; + + for (i = 0; i < tp->num_rx_rings; i++) { + ring = &tp->rx_ring[i]; + if (ring->RxDescArray) { + dma_free_coherent(&pdev->dev, tp->RxDescRingLength, ring->RxDescArray, + ring->RxPhyAddr); + ring->RxDescArray = NULL; + } + } +} + +static void rtl8125_free_alloc_resources(struct rtl8125_private *tp) +{ + rtl8125_free_rx_desc(tp); + + rtl8125_free_tx_desc(tp); +} + +#ifdef ENABLE_USE_FIRMWARE_FILE +static void rtl8125_request_firmware(struct rtl8125_private *tp) +{ + struct rtl8125_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 = rtl8125_mdio_write; + rtl_fw->phy_read = rtl8125_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 (rtl8125_fw_request_firmware(rtl_fw)) + kfree(rtl_fw); + else + tp->rtl_fw = rtl_fw; +} +#endif + +int rtl8125_open(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int retval; + + retval = -ENOMEM; + +#ifdef ENABLE_R8125_PROCFS + rtl8125_proc_init(dev); +#endif + rtl8125_set_rxbufsize(tp, dev); + /* + * Rx and Tx descriptors needs 256 bytes alignment. + * pci_alloc_consistent provides more. + */ + if (rtl8125_alloc_tx_desc(tp) < 0 || rtl8125_alloc_rx_desc(tp) < 0) + goto err_free_all_allocated_mem; + + retval = rtl8125_init_ring(dev); + if (retval < 0) + goto err_free_all_allocated_mem; + + retval = rtl8125_alloc_irq(tp); + 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 + rtl8125_request_firmware(tp); +#endif + pci_set_master(tp->pci_dev); + +#ifdef CONFIG_R8125_NAPI + rtl8125_enable_napi(tp); +#endif + + rtl8125_exit_oob(dev); + + rtl8125_up(dev); + +#ifdef ENABLE_PTP_SUPPORT + if (tp->EnablePtp) + rtl8125_ptp_init(tp); +#endif + clear_bit(R8125_FLAG_DOWN, tp->task_flags); + + if (tp->resume_not_chg_speed) + rtl8125_check_link_status(dev); + else + rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); + + if (tp->esd_flag == 0) { + //rtl8125_request_esd_timer(dev); + + rtl8125_schedule_esd_work(tp); + } + + //rtl8125_request_link_timer(dev); + + rtl8125_enable_hw_linkchg_interrupt(tp); + +out: + + return retval; + +err_free_all_allocated_mem: + rtl8125_free_alloc_resources(tp); + + goto out; +} + +static void +set_offset70F(struct rtl8125_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 = rtl8125_csi_read(tp, 0x70c) & 0x00ffffff; + rtl8125_csi_write(tp, 0x70c, csi_tmp | temp); +} + +static void +set_offset79(struct rtl8125_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); +} + +void +rtl8125_hw_set_rx_packet_filter(struct net_device *dev) +{ + struct rtl8125_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); + + tmp = tp->rtl8125_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 +rtl8125_set_rx_mode(struct net_device *dev) +{ + rtl8125_hw_set_rx_packet_filter(dev); +} + +void +rtl8125_set_rx_q_num(struct rtl8125_private *tp, + unsigned int num_rx_queues) +{ + u16 q_ctrl; + u16 rx_q_num; + + rx_q_num = (u16)ilog2(num_rx_queues); + rx_q_num &= (BIT_0 | BIT_1 | BIT_2); + rx_q_num <<= 2; + q_ctrl = RTL_R16(tp, Q_NUM_CTRL_8125); + q_ctrl &= ~(BIT_2 | BIT_3 | BIT_4); + q_ctrl |= rx_q_num; + RTL_W16(tp, Q_NUM_CTRL_8125, q_ctrl); +} + +void +rtl8125_set_tx_q_num(struct rtl8125_private *tp, + unsigned int num_tx_queues) +{ + u16 mac_ocp_data; + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE63E); + mac_ocp_data &= ~(BIT_11 | BIT_10); + mac_ocp_data |= ((ilog2(num_tx_queues) & 0x03) << 10); + rtl8125_mac_ocp_write(tp, 0xE63E, mac_ocp_data); +} + +void +rtl8125_hw_config(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + struct pci_dev *pdev = tp->pci_dev; + u16 mac_ocp_data; + int i; + + RTL_W32(tp, RxConfig, (RX_DMA_BURST << RxCfgDMAShift)); + + rtl8125_hw_reset(dev); + + rtl8125_enable_cfg9346_write(tp); + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W8(tp, 0xF1, RTL_R8(tp, 0xF1) & ~BIT_7); + RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~BIT_7); + RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_0); + break; + } + + //clear io_rdy_l23 + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~BIT_1); + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + //IntMITI_0-IntMITI_31 + for (i=0xA00; i<0xB00; i+=4) + RTL_W32(tp, i, 0x00000000); + break; + } + + //keep magic packet only + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xC0B6); + mac_ocp_data &= BIT_0; + rtl8125_mac_ocp_write(tp, 0xC0B6, mac_ocp_data); + break; + } + + rtl8125_tally_counter_addr_fill(tp); + + rtl8125_enable_extend_tally_couter(tp); + + rtl8125_desc_addr_fill(tp); + + /* Set DMA burst size and Interframe Gap Time */ + RTL_W32(tp, TxConfig, (TX_DMA_BURST_unlimited << TxDMAShift) | + (InterFrameGap << TxInterFrameGapShift)); + + if (tp->EnableTxNoClose) + RTL_W32(tp, TxConfig, (RTL_R32(tp, TxConfig) | BIT_6)); + + if (tp->mcfg == CFG_METHOD_2 || + tp->mcfg == CFG_METHOD_3 || + tp->mcfg == CFG_METHOD_4 || + tp->mcfg == CFG_METHOD_5) { + set_offset70F(tp, 0x27); + set_offset79(tp, 0x50); + + RTL_W16(tp, 0x382, 0x221B); + +#ifdef ENABLE_RSS_SUPPORT + rtl8125_config_rss(tp); +#else + RTL_W32(tp, RSS_CTRL_8125, 0x00); +#endif + rtl8125_set_rx_q_num(tp, rtl8125_tot_rx_rings(tp)); + + RTL_W8(tp, Config1, RTL_R8(tp, Config1) & ~0x10); + + rtl8125_mac_ocp_write(tp, 0xC140, 0xFFFF); + rtl8125_mac_ocp_write(tp, 0xC142, 0xFFFF); + + //new tx desc format + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xEB58); + mac_ocp_data |= (BIT_0); + rtl8125_mac_ocp_write(tp, 0xEB58, mac_ocp_data); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE614); + mac_ocp_data &= ~( BIT_10 | BIT_9 | BIT_8); + if (tp->mcfg == CFG_METHOD_4 || tp->mcfg == CFG_METHOD_5) { + mac_ocp_data |= ((2 & 0x07) << 8); + } else { + if (tp->DASH && !(rtl8125_csi_fun0_read_byte(tp, 0x79) & BIT_0)) + mac_ocp_data |= ((3 & 0x07) << 8); + else + mac_ocp_data |= ((4 & 0x07) << 8); + } + rtl8125_mac_ocp_write(tp, 0xE614, mac_ocp_data); + + rtl8125_set_tx_q_num(tp, rtl8125_tot_tx_rings(tp)); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE63E); + mac_ocp_data &= ~(BIT_5 | BIT_4); + if (tp->mcfg == CFG_METHOD_2 || tp->mcfg == CFG_METHOD_3) + mac_ocp_data |= ((0x02 & 0x03) << 4); + rtl8125_mac_ocp_write(tp, 0xE63E, mac_ocp_data); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xC0B4); + mac_ocp_data &= ~BIT_0; + rtl8125_mac_ocp_write(tp, 0xC0B4, mac_ocp_data); + mac_ocp_data |= BIT_0; + rtl8125_mac_ocp_write(tp, 0xC0B4, mac_ocp_data); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xC0B4); + mac_ocp_data |= (BIT_3|BIT_2); + rtl8125_mac_ocp_write(tp, 0xC0B4, mac_ocp_data); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xEB6A); + mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0); + mac_ocp_data |= (BIT_5 | BIT_4 | BIT_1 | BIT_0); + rtl8125_mac_ocp_write(tp, 0xEB6A, mac_ocp_data); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xEB50); + mac_ocp_data &= ~(BIT_9 | BIT_8 | BIT_7 | BIT_6 | BIT_5); + mac_ocp_data |= (BIT_6); + rtl8125_mac_ocp_write(tp, 0xEB50, mac_ocp_data); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE056); + mac_ocp_data &= ~(BIT_7 | BIT_6 | BIT_5 | BIT_4); + //mac_ocp_data |= (BIT_4 | BIT_5); + rtl8125_mac_ocp_write(tp, 0xE056, mac_ocp_data); + + RTL_W8(tp, TDFNR, 0x10); + + RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_7); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xE040); + mac_ocp_data &= ~(BIT_12); + rtl8125_mac_ocp_write(tp, 0xE040, mac_ocp_data); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xEA1C); + mac_ocp_data &= ~(BIT_1 | BIT_0); + mac_ocp_data |= (BIT_0); + rtl8125_mac_ocp_write(tp, 0xEA1C, mac_ocp_data); + + rtl8125_mac_ocp_write(tp, 0xE0C0, 0x4000); + + SetMcuAccessRegBit(tp, 0xE052, (BIT_6 | BIT_5)); + ClearMcuAccessRegBit(tp, 0xE052, BIT_3 | BIT_7); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xD430); + 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; + rtl8125_mac_ocp_write(tp, 0xD430, mac_ocp_data); + + //rtl8125_mac_ocp_write(tp, 0xE0C0, 0x4F87); + if (!tp->DASH) + RTL_W8(tp, 0xD0, RTL_R8(tp, 0xD0) | BIT_6 | BIT_7); + else + RTL_W8(tp, 0xD0, (RTL_R8(tp, 0xD0) & ~BIT_6) | BIT_7); + + if (tp->mcfg == CFG_METHOD_2 || tp->mcfg == CFG_METHOD_3) + RTL_W8(tp, MCUCmd_reg, RTL_R8(tp, MCUCmd_reg) | BIT_0); + + rtl8125_disable_eee_plus(tp); + + mac_ocp_data = rtl8125_mac_ocp_read(tp, 0xEA1C); + mac_ocp_data &= ~(BIT_2); + rtl8125_mac_ocp_write(tp, 0xEA1C, mac_ocp_data); + + SetMcuAccessRegBit(tp, 0xEB54, BIT_0); + udelay(1); + ClearMcuAccessRegBit(tp, 0xEB54, BIT_0); + RTL_W16(tp, 0x1880, RTL_R16(tp, 0x1880) & ~(BIT_4 | BIT_5)); + } + + /* csum offload command for RTL8125 */ + 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; + + /* config interrupt type for RTL8125B */ + if (tp->HwSuppIsrVer == 2) + rtl8125_hw_set_interrupt_type(tp, tp->HwCurrIsrVer); + + //other hw parameters + rtl8125_hw_clear_timer_int(dev); + + rtl8125_hw_clear_int_miti(dev); + + if (tp->use_timer_interrrupt && + (tp->HwCurrIsrVer == 2) && + (tp->HwSuppIntMitiVer == 4) && + (tp->features & RTL_FEATURE_MSIX)) { + int i; + for (i = 0; i < tp->irq_nvecs; i++) + rtl8125_hw_set_timer_int_8125(tp, i, timer_count_v2); + } + + rtl8125_enable_exit_l1_mask(tp); + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + rtl8125_mac_ocp_write(tp, 0xE098, 0xC302); + break; + } + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + if (aspm) { + rtl8125_init_pci_offset_99(tp); + } + break; + } + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + if (aspm) { + rtl8125_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 + rtl8125_hw_set_features(dev, dev->features); +#endif + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: { + int timeout; + for (timeout = 0; timeout < 10; timeout++) { + if ((rtl8125_mac_ocp_read(tp, 0xE00E) & BIT_13)==0) + break; + mdelay(1); + } + } + break; + } + + RTL_W16(tp, RxMaxSize, tp->rx_buf_sz); + + rtl8125_disable_rxdvgate(dev); + + 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 = rtl8125_csi_read(tp, tp->HwPcieSNOffset); + tp->pci_cfg_space.pci_sn_h = rtl8125_csi_read(tp, tp->HwPcieSNOffset + 4); + } + + tp->pci_cfg_is_read = 1; + } + + /* Set Rx packet filter */ + rtl8125_hw_set_rx_packet_filter(dev); + +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH && !tp->dash_printer_enabled) + NICChkTypeEnableDashInterrupt(tp); +#endif + + switch (tp->mcfg) { + case CFG_METHOD_2: + case CFG_METHOD_3: + case CFG_METHOD_4: + case CFG_METHOD_5: + if (aspm) { + RTL_W8(tp, Config5, RTL_R8(tp, Config5) | BIT_0); + RTL_W8(tp, Config2, RTL_R8(tp, Config2) | BIT_7); + } else { + RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~BIT_7); + RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~BIT_0); + } + break; + } + + rtl8125_disable_cfg9346_write(tp); + + udelay(10); +} + +void +rtl8125_hw_start(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb); + + rtl8125_enable_hw_interrupt(tp); + + rtl8125_lib_reset_complete(tp); +} + +static int +rtl8125_change_mtu(struct net_device *dev, + int new_mtu) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int ret = 0; + +#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) + + dev->mtu = new_mtu; + + if (!netif_running(dev)) + goto out; + + rtl8125_down(dev); + + rtl8125_set_rxbufsize(tp, dev); + + ret = rtl8125_init_ring(dev); + + if (ret < 0) + goto err_out; + +#ifdef CONFIG_R8125_NAPI + rtl8125_enable_napi(tp); +#endif//CONFIG_R8125_NAPI + + //netif_tx_stop_all_queues(dev); + //netif_carrier_off(dev); + rtl8125_hw_config(dev); + rtl8125_enable_hw_linkchg_interrupt(tp); + + rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); + + //mod_timer(&tp->esd_timer, jiffies + RTL8125_ESD_TIMEOUT); + //mod_timer(&tp->link_timer, jiffies + RTL8125_LINK_TIMEOUT); +out: +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0) + netdev_update_features(dev); +#endif + +err_out: + return ret; +} + +static void +rtl8125_free_rx_skb(struct rtl8125_private *tp, + struct rtl8125_rx_ring *ring, + struct sk_buff **sk_buff, + struct RxDesc *desc, + const u32 cur_rx) +{ + struct pci_dev *pdev = tp->pci_dev; + + dma_unmap_single(&pdev->dev, ring->RxDescPhyAddr[cur_rx], tp->rx_buf_sz, + DMA_FROM_DEVICE); + dev_kfree_skb(*sk_buff); + *sk_buff = NULL; + rtl8125_make_unusable_by_asic(tp, desc); +} + +static inline void +rtl8125_mark_to_asic_v3(struct RxDescV3 *descv3, + u32 rx_buf_sz) +{ + u32 eor = le32_to_cpu(descv3->RxDescNormalDDWord4.opts1) & RingEnd; + + WRITE_ONCE(descv3->RxDescNormalDDWord4.opts1, cpu_to_le32(DescOwn | eor | rx_buf_sz)); +} + +void +rtl8125_mark_to_asic(struct rtl8125_private *tp, + struct RxDesc *desc, + u32 rx_buf_sz) +{ + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) + rtl8125_mark_to_asic_v3((struct RxDescV3 *)desc, rx_buf_sz); + else { + u32 eor = le32_to_cpu(desc->opts1) & RingEnd; + + WRITE_ONCE(desc->opts1, cpu_to_le32(DescOwn | eor | rx_buf_sz)); + } +} + +static inline void +rtl8125_map_to_asic(struct rtl8125_private *tp, + struct rtl8125_rx_ring *ring, + struct RxDesc *desc, + dma_addr_t mapping, + u32 rx_buf_sz, + const u32 cur_rx) +{ + ring->RxDescPhyAddr[cur_rx] = mapping; + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) + ((struct RxDescV3 *)desc)->addr = cpu_to_le64(mapping); + else + desc->addr = cpu_to_le64(mapping); + wmb(); + rtl8125_mark_to_asic(tp, desc, rx_buf_sz); +} + +static int +rtl8125_alloc_rx_skb(struct rtl8125_private *tp, + struct rtl8125_rx_ring *ring, + struct sk_buff **sk_buff, + struct RxDesc *desc, + int rx_buf_sz, + const u32 cur_rx, + u8 in_intr) +{ + struct sk_buff *skb; + dma_addr_t mapping; + int ret = 0; + + if (in_intr) + skb = RTL_ALLOC_SKB_INTR(&tp->r8125napi[ring->index].napi, 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; + rtl8125_map_to_asic(tp, ring, desc, mapping, rx_buf_sz, cur_rx); +out: + return ret; + +err_out: + if (skb) + dev_kfree_skb(skb); + ret = -ENOMEM; + rtl8125_make_unusable_by_asic(tp, desc); + goto out; +} + +static void +_rtl8125_rx_clear(struct rtl8125_private *tp, struct rtl8125_rx_ring *ring) +{ + int i; + + for (i = 0; i < NUM_RX_DESC; i++) { + if (ring->Rx_skbuff[i]) { + rtl8125_free_rx_skb(tp, + ring, + ring->Rx_skbuff + i, + rtl8125_get_rxdesc(tp, ring->RxDescArray, i), + i); + ring->Rx_skbuff[i] = NULL; + } + } +} + +void +rtl8125_rx_clear(struct rtl8125_private *tp) +{ + int i; + + for (i = 0; i < tp->num_rx_rings; i++) + _rtl8125_rx_clear(tp, &tp->rx_ring[i]); +} + +static u32 +rtl8125_rx_fill(struct rtl8125_private *tp, + struct rtl8125_rx_ring *ring, + struct net_device *dev, + u32 start, + u32 end, + u8 in_intr) +{ + u32 cur; + + for (cur = start; end - cur > 0; cur++) { + int ret, i = cur % NUM_RX_DESC; + + if (ring->Rx_skbuff[i]) + continue; + + ret = rtl8125_alloc_rx_skb(tp, + ring, + ring->Rx_skbuff + i, + rtl8125_get_rxdesc(tp, ring->RxDescArray, i), + tp->rx_buf_sz, + i, + in_intr + ); + if (ret < 0) + break; + } + return cur - start; +} + +static inline void +rtl8125_mark_as_last_descriptor_8125(struct RxDescV3 *descv3) +{ + descv3->RxDescNormalDDWord4.opts1 |= cpu_to_le32(RingEnd); +} + +static inline void +rtl8125_mark_as_last_descriptor(struct rtl8125_private *tp, + struct RxDesc *desc) +{ + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) + rtl8125_mark_as_last_descriptor_8125((struct RxDescV3 *)desc); + else + desc->opts1 |= cpu_to_le32(RingEnd); +} + +static void +rtl8125_desc_addr_fill(struct rtl8125_private *tp) +{ + int i; + + for (i = 0; i < tp->num_tx_rings; i++) { + struct rtl8125_tx_ring *ring = &tp->tx_ring[i]; + RTL_W32(tp, ring->tdsar_reg, ((u64)ring->TxPhyAddr & DMA_BIT_MASK(32))); + RTL_W32(tp, ring->tdsar_reg + 4, ((u64)ring->TxPhyAddr >> 32)); + } + + for (i = 0; i < tp->num_rx_rings; i++) { + struct rtl8125_rx_ring *ring = &tp->rx_ring[i]; + RTL_W32(tp, ring->rdsar_reg, ((u64)ring->RxPhyAddr & DMA_BIT_MASK(32))); + RTL_W32(tp, ring->rdsar_reg + 4, ((u64)ring->RxPhyAddr >> 32)); + } +} + +static void +rtl8125_tx_desc_init(struct rtl8125_private *tp) +{ + int i = 0; + + for (i = 0; i < tp->num_tx_rings; i++) { + struct rtl8125_tx_ring *ring = &tp->tx_ring[i]; + memset(ring->TxDescArray, 0x0, R8125_TX_RING_BYTES); + + ring->TxDescArray[NUM_TX_DESC - 1].opts1 = cpu_to_le32(RingEnd); + } +} + +static void +rtl8125_rx_desc_init(struct rtl8125_private *tp) +{ + int i; + + for (i = 0; i < tp->num_rx_rings; i++) { + struct rtl8125_rx_ring *ring = &tp->rx_ring[i]; + memset(ring->RxDescArray, 0x0, tp->RxDescRingLength); + } +} + +int +rtl8125_init_ring(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int i; + + rtl8125_init_ring_indexes(tp); + + rtl8125_tx_desc_init(tp); + rtl8125_rx_desc_init(tp); + + for (i = 0; i < tp->num_tx_rings; i++) { + struct rtl8125_tx_ring *ring = &tp->tx_ring[i]; + memset(ring->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info)); + } + + for (i = 0; i < tp->num_rx_rings; i++) { + struct rtl8125_rx_ring *ring = &tp->rx_ring[i]; + + memset(ring->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *)); + if (rtl8125_rx_fill(tp, ring, dev, 0, NUM_RX_DESC, 0) != NUM_RX_DESC) + goto err_out; + + rtl8125_mark_as_last_descriptor(tp, rtl8125_get_rxdesc(tp, ring->RxDescArray, NUM_RX_DESC - 1)); + } + + return 0; + +err_out: + rtl8125_rx_clear(tp); + return -ENOMEM; +} + +static void +rtl8125_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 = RTL8125_MAGIC_NUMBER; + tx_skb->len = 0; +} + +static void +rtl8125_tx_clear_range(struct rtl8125_private *tp, + struct rtl8125_tx_ring *ring, + 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) % NUM_TX_DESC; + struct ring_info *tx_skb = ring->tx_skb + entry; + unsigned int len = tx_skb->len; + + if (len) { + struct sk_buff *skb = tx_skb->skb; + + rtl8125_unmap_tx_skb(tp->pci_dev, tx_skb, + ring->TxDescArray + entry); + if (skb) { + RTLDEV->stats.tx_dropped++; + dev_kfree_skb_any(skb); + tx_skb->skb = NULL; + } + } + } +} + +void +rtl8125_tx_clear(struct rtl8125_private *tp) +{ + int i; + + for (i = 0; i < tp->num_tx_rings; i++) { + struct rtl8125_tx_ring *ring = &tp->tx_ring[i]; + rtl8125_tx_clear_range(tp, ring, ring->dirty_tx, NUM_TX_DESC); + ring->cur_tx = ring->dirty_tx = 0; + } +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) +static void rtl8125_schedule_reset_work(struct rtl8125_private *tp) +{ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) + set_bit(R8125_FLAG_TASK_RESET_PENDING, tp->task_flags); + schedule_delayed_work(&tp->reset_task, 4); +#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) +} + +static void rtl8125_schedule_esd_work(struct rtl8125_private *tp) +{ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) + set_bit(R8125_FLAG_TASK_ESD_CHECK_PENDING, tp->task_flags); + schedule_delayed_work(&tp->esd_task, RTL8125_ESD_TIMEOUT); +#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) +} + +static void rtl8125_schedule_linkchg_work(struct rtl8125_private *tp) +{ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) + set_bit(R8125_FLAG_TASK_LINKCHG_CHECK_PENDING, tp->task_flags); + schedule_delayed_work(&tp->linkchg_task, 4); +#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) +} + +#define rtl8125_cancel_schedule_reset_work(a) +#define rtl8125_cancel_schedule_esd_work(a) +#define rtl8125_cancel_schedule_linkchg_work(a) + +#else +static void rtl8125_schedule_reset_work(struct rtl8125_private *tp) +{ + set_bit(R8125_FLAG_TASK_RESET_PENDING, tp->task_flags); + schedule_delayed_work(&tp->reset_task, 4); +} + +static void rtl8125_cancel_schedule_reset_work(struct rtl8125_private *tp) +{ + struct work_struct *work = &tp->reset_task.work; + + if (!work->func) return; + + cancel_delayed_work_sync(&tp->reset_task); +} + +static void rtl8125_schedule_esd_work(struct rtl8125_private *tp) +{ + set_bit(R8125_FLAG_TASK_ESD_CHECK_PENDING, tp->task_flags); + schedule_delayed_work(&tp->esd_task, RTL8125_ESD_TIMEOUT); +} + +static void rtl8125_cancel_schedule_esd_work(struct rtl8125_private *tp) +{ + struct work_struct *work = &tp->esd_task.work; + + if (!work->func) return; + + cancel_delayed_work_sync(&tp->esd_task); +} + +static void rtl8125_schedule_linkchg_work(struct rtl8125_private *tp) +{ + set_bit(R8125_FLAG_TASK_LINKCHG_CHECK_PENDING, tp->task_flags); + schedule_delayed_work(&tp->linkchg_task, RTL8125_ESD_TIMEOUT); +} + +static void rtl8125_cancel_schedule_linkchg_work(struct rtl8125_private *tp) +{ + struct work_struct *work = &tp->linkchg_task.work; + + if (!work->func) return; + + cancel_delayed_work_sync(&tp->linkchg_task); +} +#endif + +static void rtl8125_init_all_schedule_work(struct rtl8125_private *tp) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) + INIT_WORK(&tp->reset_task, rtl8125_reset_task, dev); + INIT_WORK(&tp->esd_task, rtl8125_esd_task, dev); + INIT_WORK(&tp->linkchg_task, rtl8125_linkchg_task, dev); +#else + INIT_DELAYED_WORK(&tp->reset_task, rtl8125_reset_task); + INIT_DELAYED_WORK(&tp->esd_task, rtl8125_esd_task); + INIT_DELAYED_WORK(&tp->linkchg_task, rtl8125_linkchg_task); +#endif +} + +static void rtl8125_cancel_all_schedule_work(struct rtl8125_private *tp) +{ + rtl8125_cancel_schedule_reset_work(tp); + rtl8125_cancel_schedule_esd_work(tp); + rtl8125_cancel_schedule_linkchg_work(tp); +} + +static void +rtl8125_wait_for_irq_complete(struct rtl8125_private *tp) +{ + if (tp->features & RTL_FEATURE_MSIX) { + int i; + for (i = 0; i < tp->irq_nvecs; i++) + synchronize_irq(tp->irq_tbl[i].vector); + } else { + synchronize_irq(tp->dev->irq); + } +} + +static void +_rtl8125_wait_for_quiescence(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + /* Wait for any pending NAPI task to complete */ +#ifdef CONFIG_R8125_NAPI + rtl8125_disable_napi(tp); +#endif//CONFIG_R8125_NAPI + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,67) + /* Give a racing hard_start_xmit a few cycles to complete. */ + synchronize_net(); +#endif + + rtl8125_irq_mask_and_ack(tp); + + rtl8125_wait_for_irq_complete(tp); +} + +static void +rtl8125_wait_for_quiescence(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + //suppress unused variable + (void)(tp); + + _rtl8125_wait_for_quiescence(dev); + +#ifdef CONFIG_R8125_NAPI + rtl8125_enable_napi(tp); +#endif//CONFIG_R8125_NAPI +} + +static int rtl8125_rx_nostuck(struct rtl8125_private *tp) +{ + int i, ret = 1; + for (i = 0; i < tp->num_rx_rings; i++) + ret &= (tp->rx_ring[i].dirty_rx == tp->rx_ring[i].cur_rx); + return ret; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) +static void rtl8125_reset_task(void *_data) +{ + struct net_device *dev = _data; + struct rtl8125_private *tp = netdev_priv(dev); +#else +static void rtl8125_reset_task(struct work_struct *work) +{ + struct rtl8125_private *tp = + container_of(work, struct rtl8125_private, reset_task.work); + struct net_device *dev = tp->dev; +#endif + u32 budget = ~(u32)0; + int i; + + rtnl_lock(); + + if (!netif_running(dev) || + test_bit(R8125_FLAG_DOWN, tp->task_flags) || + !test_and_clear_bit(R8125_FLAG_TASK_RESET_PENDING, tp->task_flags)) + goto out_unlock; + + rtl8125_wait_for_quiescence(dev); + + for (i = 0; i < tp->num_rx_rings; i++) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) + rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[i], &budget); +#else + rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[i], budget); +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) + } + + netif_tx_stop_all_queues(dev); + netif_carrier_off(dev); + rtl8125_hw_reset(dev); + + rtl8125_tx_clear(tp); + + if (rtl8125_rx_nostuck(tp)) { + rtl8125_rx_clear(tp); + rtl8125_init_ring(dev); +#ifdef ENABLE_PTP_SUPPORT + rtl8125_ptp_reset(tp); +#endif + if (tp->resume_not_chg_speed) { + _rtl8125_check_link_status(dev); + + tp->resume_not_chg_speed = 0; + } else { + rtl8125_enable_hw_linkchg_interrupt(tp); + + rtl8125_set_speed(dev, tp->autoneg, tp->speed, tp->duplex, tp->advertising); + } + } else { + if (unlikely(net_ratelimit())) { + struct rtl8125_private *tp = netdev_priv(dev); + + if (netif_msg_intr(tp)) { + printk(PFX KERN_EMERG + "%s: Rx buffers shortage\n", dev->name); + } + } + rtl8125_schedule_reset_work(tp); + } + +out_unlock: + rtnl_unlock(); +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) +static void rtl8125_esd_task(void *_data) +{ + struct net_device *dev = _data; + struct rtl8125_private *tp = netdev_priv(dev); +#else +static void rtl8125_esd_task(struct work_struct *work) +{ + struct rtl8125_private *tp = + container_of(work, struct rtl8125_private, esd_task.work); + struct net_device *dev = tp->dev; +#endif + rtnl_lock(); + + if (!netif_running(dev) || + test_bit(R8125_FLAG_DOWN, tp->task_flags) || + !test_and_clear_bit(R8125_FLAG_TASK_ESD_CHECK_PENDING, tp->task_flags)) + goto out_unlock; + + rtl8125_esd_checker(tp); + + rtl8125_schedule_esd_work(tp); + +out_unlock: + rtnl_unlock(); +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) +static void rtl8125_linkchg_task(void *_data) +{ + struct net_device *dev = _data; + //struct rtl8125_private *tp = netdev_priv(dev); +#else +static void rtl8125_linkchg_task(struct work_struct *work) +{ + struct rtl8125_private *tp = + container_of(work, struct rtl8125_private, linkchg_task.work); + struct net_device *dev = tp->dev; +#endif + rtnl_lock(); + + if (!netif_running(dev) || + test_bit(R8125_FLAG_DOWN, tp->task_flags) || + !test_and_clear_bit(R8125_FLAG_TASK_LINKCHG_CHECK_PENDING, tp->task_flags)) + goto out_unlock; + + rtl8125_check_link_status(dev); + +out_unlock: + rtnl_unlock(); +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) +static void +rtl8125_tx_timeout(struct net_device *dev, unsigned int txqueue) +#else +static void +rtl8125_tx_timeout(struct net_device *dev) +#endif +{ + struct rtl8125_private *tp = netdev_priv(dev); + + /* Let's wait a bit while any (async) irq lands on */ + rtl8125_schedule_reset_work(tp); +} + +static u32 +rtl8125_get_txd_opts1(u32 opts1, u32 len, unsigned int entry) +{ + u32 status = opts1 | len; + + if (entry == NUM_TX_DESC - 1) + status |= RingEnd; + + return status; +} + +static int +rtl8125_xmit_frags(struct rtl8125_private *tp, + struct rtl8125_tx_ring *ring, + 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; + unsigned long PktLenCnt = 0; + bool LsoPatchEnabled = FALSE; + + entry = ring->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) % NUM_TX_DESC; + + txd = ring->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 + if (tp->RequireLSOPatch && + (cur_frag == nr_frags - 1) && + (opts[0] & (GiantSendv4|GiantSendv6)) && + PktLenCnt < ETH_FRAME_LEN && + len > 1) { + len -= 1; + 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 = rtl8125_get_txd_opts1(opts[0], len, entry); + + txd->addr = cpu_to_le64(mapping); + + ring->tx_skb[entry].len = len; + + txd->opts2 = cpu_to_le32(opts[1]); + wmb(); + txd->opts1 = cpu_to_le32(status); + + //second txd + addr += len; + len = 1; + entry = (entry + 1) % NUM_TX_DESC; + txd = ring->TxDescArray + entry; + cur_frag += 1; + + LsoPatchEnabled = TRUE; + } + + 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 = rtl8125_get_txd_opts1(opts[0], len, entry); + if (cur_frag == (nr_frags - 1) || LsoPatchEnabled == TRUE) { + //ring->tx_skb[entry].skb = skb; + status |= LastFrag; + } + + txd->addr = cpu_to_le64(mapping); + + ring->tx_skb[entry].len = len; + + txd->opts2 = cpu_to_le32(opts[1]); + wmb(); + txd->opts1 = cpu_to_le32(status); + + PktLenCnt += len; + } + + return cur_frag; + +err_out: + rtl8125_tx_clear_range(tp, ring, ring->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 inline +u8 rtl8125_get_l4_protocol(struct sk_buff *skb) +{ + int no = skb_network_offset(skb); + struct ipv6hdr *i6h, _i6h; + struct iphdr *ih, _ih; + u8 ip_protocol = IPPROTO_RAW; + + switch (get_protocol(skb)) { + case __constant_htons(ETH_P_IP): + ih = skb_header_pointer(skb, no, sizeof(_ih), &_ih); + if (ih) + ip_protocol = ih->protocol; + break; + case __constant_htons(ETH_P_IPV6): + i6h = skb_header_pointer(skb, no, sizeof(_i6h), &_i6h); + if (i6h) + ip_protocol = i6h->nexthdr; + break; + } + + return ip_protocol; +} + +static bool rtl8125_skb_pad_with_len(struct sk_buff *skb, unsigned int len) +{ + if (skb_padto(skb, len)) + return false; + skb_put(skb, len - skb->len); + return true; +} + +static bool rtl8125_skb_pad(struct sk_buff *skb) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) + return rtl8125_skb_pad_with_len(skb, ETH_ZLEN); +#else + return !eth_skb_pad(skb); +#endif +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0) +/* 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 + +#define MIN_PATCH_LEN (47) +static u32 +rtl8125_get_patch_pad_len(struct sk_buff *skb) +{ + u32 pad_len = 0; + int trans_data_len; + u32 hdr_len; + u32 pkt_len = skb->len; + u8 ip_protocol; + bool has_trans = skb_transport_header_was_set(skb); + + if (!(has_trans && (pkt_len < 175))) //128 + MIN_PATCH_LEN + goto no_padding; + + ip_protocol = rtl8125_get_l4_protocol(skb); + if (!(ip_protocol == IPPROTO_TCP || ip_protocol == IPPROTO_UDP)) + goto no_padding; + + trans_data_len = pkt_len - + (skb->transport_header - + skb_headroom(skb)); + if (ip_protocol == IPPROTO_UDP) { + if (trans_data_len > 3 && trans_data_len < MIN_PATCH_LEN) { + u16 dest_port = 0; + + skb_copy_bits(skb, skb->transport_header - skb_headroom(skb) + 2, &dest_port, 2); + dest_port = ntohs(dest_port); + + if (dest_port == 0x13f || + dest_port == 0x140) { + pad_len = MIN_PATCH_LEN - trans_data_len; + goto out; + } + } + } + + hdr_len = 0; + if (ip_protocol == IPPROTO_TCP) + hdr_len = 20; + else if (ip_protocol == IPPROTO_UDP) + hdr_len = 8; + if (trans_data_len < hdr_len) + pad_len = hdr_len - trans_data_len; + +out: + if ((pkt_len + pad_len) < ETH_ZLEN) + pad_len = ETH_ZLEN - pkt_len; + + return pad_len; + +no_padding: + + return 0; +} + +static bool +rtl8125_tso_csum(struct sk_buff *skb, + struct net_device *dev, + u32 *opts) +{ + struct rtl8125_private *tp = netdev_priv(dev); + unsigned long large_send = 0; + u32 csum_cmd = 0; + u8 sw_calc_csum = false; + u8 check_patch_required = true; + +#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) { + u32 transport_offset = (u32)skb_transport_offset(skb); + assert((transport_offset%2) == 0); + 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)) + return false; +#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) + return false; + + return true; + } + } +#endif //LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) + + 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 (ip_protocol == IPPROTO_TCP) + check_patch_required = false; + } + + if (check_patch_required) { + u32 pad_len = rtl8125_get_patch_pad_len(skb); + + if (pad_len > 0) { + if (!rtl8125_skb_pad_with_len(skb, skb->len + pad_len)) + return false; + + if (csum_cmd != 0) + sw_calc_csum = true; + } + } + + if (skb->len < ETH_ZLEN) { + if (tp->UseSwPaddingShortPkt || + (tp->ShortPacketSwChecksum && csum_cmd != 0)) { + if (!rtl8125_skb_pad(skb)) + return false; + + if (csum_cmd != 0) + sw_calc_csum = true; + } + } + + 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 + } else + opts[1] |= csum_cmd; + + return true; +} + +static bool rtl8125_tx_slots_avail(struct rtl8125_private *tp, + struct rtl8125_tx_ring *ring) +{ + unsigned int slots_avail = READ_ONCE(ring->dirty_tx) + NUM_TX_DESC + - READ_ONCE(ring->cur_tx); + + /* A skbuff with nr_frags needs nr_frags+1 entries in the tx queue */ + return slots_avail > MAX_SKB_FRAGS; +} + +static netdev_tx_t +rtl8125_start_xmit(struct sk_buff *skb, + struct net_device *dev) +{ + struct rtl8125_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; + int frags; + u8 EnableTxNoClose = tp->EnableTxNoClose; + const u16 queue_mapping = skb_get_queue_mapping(skb); + struct rtl8125_tx_ring *ring; + bool stop_queue; + + assert(queue_mapping < tp->num_tx_queues); + + ring = &tp->tx_ring[queue_mapping]; + + if (unlikely(!rtl8125_tx_slots_avail(tp, ring))) { + if (netif_msg_drv(tp)) { + printk(KERN_ERR + "%s: BUG! Tx Ring[%d] full when queue awake!\n", + dev->name, + queue_mapping); + } + goto err_stop; + } + + entry = ring->cur_tx % NUM_TX_DESC; + txd = ring->TxDescArray + entry; + + if (!EnableTxNoClose) { + 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] = rtl8125_tx_vlan_tag(tp, skb); + + if (unlikely(!rtl8125_tso_csum(skb, dev, opts))) + goto err_dma_0; + + frags = rtl8125_xmit_frags(tp, ring, skb, opts); + if (unlikely(frags < 0)) + goto err_dma_0; + if (frags) { + len = skb_headlen(skb); + opts[0] |= FirstFrag; + } else { + len = skb->len; + + //ring->tx_skb[entry].skb = skb; + + opts[0] |= FirstFrag | LastFrag; + } + + opts[0] = rtl8125_get_txd_opts1(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; + } + ring->tx_skb[entry].len = len; +#ifdef ENABLE_PTP_SUPPORT + if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) { + if (tp->hwtstamp_config.tx_type == HWTSTAMP_TX_ON && + !tp->ptp_tx_skb) { + skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; + + tp->ptp_tx_skb = skb_get(skb); + tp->ptp_tx_start = jiffies; + schedule_work(&tp->ptp_tx_work); + } else { + tp->tx_hwtstamp_skipped++; + } + } +#endif + ring->tx_skb[entry].skb = skb; + 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) + + /* rtl_tx needs to see descriptor changes before updated tp->cur_tx */ + smp_wmb(); + + WRITE_ONCE(ring->cur_tx, ring->cur_tx + frags + 1); + + stop_queue = !rtl8125_tx_slots_avail(tp, ring); + if (unlikely(stop_queue)) { + /* Avoid wrongly optimistic queue wake-up: rtl_tx thread must + * not miss a ring update when it notices a stopped queue. + */ + smp_wmb(); + netif_stop_subqueue(dev, queue_mapping); + } + + if (EnableTxNoClose) + RTL_W16(tp, ring->sw_tail_ptr_reg, ring->cur_tx % MAX_TX_NO_CLOSE_DESC_PTR_V2); + else + RTL_W16(tp, TPPOLL_8125, BIT(ring->index)); /* set polling bit */ + + if (unlikely(stop_queue)) { + /* Sync with rtl_tx: + * - publish queue status and cur_tx ring index (write barrier) + * - refresh dirty_tx ring index (read barrier). + * May the current thread have a pessimistic view of the ring + * status and forget to wake up queue, a racing rtl_tx thread + * can't. + */ + smp_mb(); + if (rtl8125_tx_slots_avail(tp, ring)) + netif_start_subqueue(dev, queue_mapping); + } +out: + return ret; +err_dma_1: + ring->tx_skb[entry].skb = NULL; + rtl8125_tx_clear_range(tp, ring, ring->cur_tx + 1, frags); +err_dma_0: + RTLDEV->stats.tx_dropped++; + dev_kfree_skb_any(skb); + ret = NETDEV_TX_OK; + goto out; +err_stop: + netif_stop_subqueue(dev, queue_mapping); + ret = NETDEV_TX_BUSY; + RTLDEV->stats.tx_dropped++; + goto out; +} + +static inline u32 +rtl8125_fast_mod(const u32 input, const u32 ceil) +{ + return input >= ceil ? input % ceil : input; +} + +static int +rtl8125_tx_interrupt(struct rtl8125_tx_ring *ring, int budget) +{ + struct rtl8125_private *tp = ring->priv; + struct net_device *dev = tp->dev; + unsigned int dirty_tx, tx_left; + unsigned int count = 0; + u8 EnableTxNoClose = tp->EnableTxNoClose; + + dirty_tx = ring->dirty_tx; + smp_rmb(); + tx_left = READ_ONCE(ring->cur_tx) - dirty_tx; + if (EnableTxNoClose) { + unsigned int tx_desc_closed; + u32 NextHwDesCloPtr = RTL_R16(tp, ring->hw_clo_ptr_reg); + ring->NextHwDesCloPtr = NextHwDesCloPtr; + smp_rmb(); + tx_desc_closed = rtl8125_fast_mod(NextHwDesCloPtr - ring->BeginHwDesCloPtr, MAX_TX_NO_CLOSE_DESC_PTR_V2); + if(tx_left > tx_desc_closed) tx_left = tx_desc_closed; + ring->BeginHwDesCloPtr = NextHwDesCloPtr; + } + + while (tx_left > 0) { + unsigned int entry = dirty_tx % NUM_TX_DESC; + struct ring_info *tx_skb = ring->tx_skb + entry; + + if (!EnableTxNoClose && + (le32_to_cpu(ring->TxDescArray[entry].opts1) & DescOwn)) + break; + + RTLDEV->stats.tx_bytes += tx_skb->len; + RTLDEV->stats.tx_packets++; + + rtl8125_unmap_tx_skb(tp->pci_dev, + tx_skb, + ring->TxDescArray + entry); + + if (tx_skb->skb != NULL) { + RTL_NAPI_CONSUME_SKB_ANY(tx_skb->skb, budget); + tx_skb->skb = NULL; + } + dirty_tx++; + tx_left--; + } + + if (ring->dirty_tx != dirty_tx) { + count = dirty_tx - ring->dirty_tx; + WRITE_ONCE(ring->dirty_tx, dirty_tx); + smp_wmb(); + if (__netif_subqueue_stopped(dev, ring->index) && + (rtl8125_tx_slots_avail(tp, ring))) { + netif_start_subqueue(dev, ring->index); + } + smp_rmb(); + if (!EnableTxNoClose && (ring->cur_tx != dirty_tx)) { + RTL_W16(tp, TPPOLL_8125, BIT(ring->index)); + } + } + + return count; +} + +static int +rtl8125_tx_interrupt_with_vector(struct rtl8125_private *tp, + const int message_id, + int budget) +{ + int count = 0; + + if (message_id == 16) + count += rtl8125_tx_interrupt(&tp->tx_ring[0], budget); +#ifdef ENABLE_MULTIPLE_TX_QUEUE + else if (message_id == 18) + count += rtl8125_tx_interrupt(&tp->tx_ring[1], budget); +#endif + + return count; +} + +static inline int +rtl8125_fragmented_frame(struct rtl8125_private *tp, u32 status) +{ + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) + return (status & (FirstFrag_V3 | LastFrag_V3)) != (FirstFrag_V3 | LastFrag_V3); + else + return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag); +} + +static inline int +rtl8125_rx_desc_type(u32 status) +{ + return ((status >> 26) & 0x0F); +} + +static inline void +rtl8125_rx_v3_csum(struct rtl8125_private *tp, + struct sk_buff *skb, + struct RxDescV3 *descv3) +{ + //u32 opts1 = le32_to_cpu(descv3->RxDescNormalDDWord4.opts1); + u32 opts2 = le32_to_cpu(descv3->RxDescNormalDDWord4.opts2); + + /* rx csum offload for RTL8125 */ + if (((opts2 & RxV4F_v3) && !(opts2 & RxIPF_v3)) || (opts2 & RxV6F_v3)) { + if (((opts2 & RxTCPT_v3) && !(opts2 & RxTCPF_v3)) || + ((opts2 & RxUDPT_v3) && !(opts2 & RxUDPF_v3))) + skb->ip_summed = CHECKSUM_UNNECESSARY; + else + skb->ip_summed = CHECKSUM_NONE; + } else + skb->ip_summed = CHECKSUM_NONE; +} + +static inline void +rtl8125_rx_csum(struct rtl8125_private *tp, + struct sk_buff *skb, + struct RxDesc *desc) +{ + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) + rtl8125_rx_v3_csum(tp, skb, (struct RxDescV3 *)desc); + else { + u32 opts1 = le32_to_cpu(rtl8125_rx_desc_opts1(tp, desc)); + u32 opts2 = le32_to_cpu(rtl8125_rx_desc_opts2(tp, desc)); + + /* rx csum offload for RTL8125 */ + 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 +rtl8125_try_rx_copy(struct rtl8125_private *tp, + struct rtl8125_rx_ring *ring, + 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->r8125napi[ring->index].napi, 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; + rtl8125_mark_to_asic(tp, desc, rx_buf_sz); + ret = 0; + } + } + return ret; +} + +static inline void +rtl8125_rx_skb(struct rtl8125_private *tp, + struct sk_buff *skb, + u32 ring_index) +{ +#ifdef CONFIG_R8125_NAPI +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) + netif_receive_skb(skb); +#else + napi_gro_receive(&tp->r8125napi[ring_index].napi, skb); +#endif +#else + netif_rx(skb); +#endif +} + +static int +rtl8125_check_rx_desc_error(struct net_device *dev, + struct rtl8125_private *tp, + u32 status) +{ + int ret = 0; + + if (tp->InitRxDescType == RX_DESC_RING_TYPE_3) { + if (unlikely(status & RxRES_V3)) { + if (status & (RxRWT_V3 | RxRUNT_V3)) + RTLDEV->stats.rx_length_errors++; + if (status & RxCRC_V3) + RTLDEV->stats.rx_crc_errors++; + + ret = -1; + } + } else { + if (unlikely(status & RxRES)) { + if (status & (RxRWT | RxRUNT)) + RTLDEV->stats.rx_length_errors++; + if (status & RxCRC) + RTLDEV->stats.rx_crc_errors++; + + ret = -1; + } + } + + return ret; +} + +static int +rtl8125_rx_interrupt(struct net_device *dev, + struct rtl8125_private *tp, + struct rtl8125_rx_ring *ring, + 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; + u64 rx_buf_phy_addr; + u32 ring_index = ring->index; + + assert(dev != NULL); + assert(tp != NULL); + + if ((ring->RxDescArray == NULL)) + goto rx_out; + + rx_quota = RTL_RX_QUOTA(budget); + cur_rx = ring->cur_rx; + entry = cur_rx % NUM_RX_DESC; + desc = rtl8125_get_rxdesc(tp, ring->RxDescArray, entry); + rx_left = NUM_RX_DESC + ring->dirty_rx - cur_rx; + rx_left = rtl8125_rx_quota(rx_left, (u32)rx_quota); + + for (; rx_left > 0; rx_left--) { + rmb(); + status = le32_to_cpu(rtl8125_rx_desc_opts1(tp, desc)); + if (status & DescOwn) + break; + + if (unlikely(rtl8125_check_rx_desc_error(dev, tp, status) < 0)) { + if (netif_msg_rx_err(tp)) { + printk(KERN_INFO + "%s: Rx ERROR. status = %08x\n", + dev->name, status); + } + + RTLDEV->stats.rx_errors++; + + if (dev->features & NETIF_F_RXALL) + goto process_pkt; + + rtl8125_mark_to_asic(tp, 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(rtl8125_fragmented_frame(tp, status))) { + RTLDEV->stats.rx_dropped++; + RTLDEV->stats.rx_length_errors++; + rtl8125_mark_to_asic(tp, desc, tp->rx_buf_sz); + continue; + } + + skb = ring->Rx_skbuff[entry]; + + if (!skb) + break; + +#ifdef ENABLE_PTP_SUPPORT + if (tp->EnablePtp) { + u8 desc_type; + + desc_type = rtl8125_rx_desc_type(status); + if (desc_type == RXDESC_TYPE_NEXT && rx_left > 0) { + u32 status_next; + struct RxDescV3 *desc_next; + unsigned int entry_next; + struct sk_buff *skb_next; + + entry_next = (cur_rx + 1) % NUM_RX_DESC; + desc_next = (struct RxDescV3 *)rtl8125_get_rxdesc(tp, ring->RxDescArray, entry_next); + rmb(); + status_next = le32_to_cpu(desc_next->RxDescNormalDDWord4.opts1); + if (unlikely(status_next & DescOwn)) { + udelay(1); + rmb(); + status_next = le32_to_cpu(desc_next->RxDescNormalDDWord4.opts1); + if (unlikely(status_next & DescOwn)) { + if (netif_msg_rx_err(tp)) { + printk(KERN_ERR + "%s: Rx Next Desc ERROR. status = %08x\n", + dev->name, status_next); + } + break; + } + } + + cur_rx++; + rx_left--; + desc_type = rtl8125_rx_desc_type(status_next); + if (desc_type == RXDESC_TYPE_PTP) + rtl8125_rx_ptp_pktstamp(tp, skb, desc_next); + else + WARN_ON(1); + + rx_buf_phy_addr = ring->RxDescPhyAddr[entry_next]; + dma_unmap_single(tp_to_dev(tp), rx_buf_phy_addr, + tp->rx_buf_sz, DMA_FROM_DEVICE); + skb_next = ring->Rx_skbuff[entry_next]; + dev_kfree_skb_any(skb_next); + ring->Rx_skbuff[entry_next] = NULL; + } else + WARN_ON(desc_type != RXDESC_TYPE_NORMAL); + } +#endif + rx_buf_phy_addr = ring->RxDescPhyAddr[entry]; + dma_sync_single_for_cpu(tp_to_dev(tp), + rx_buf_phy_addr, tp->rx_buf_sz, + DMA_FROM_DEVICE); + + if (rtl8125_try_rx_copy(tp, ring, &skb, pkt_size, + desc, tp->rx_buf_sz)) { + ring->Rx_skbuff[entry] = NULL; + dma_unmap_single(tp_to_dev(tp), rx_buf_phy_addr, + tp->rx_buf_sz, DMA_FROM_DEVICE); + } else { + dma_sync_single_for_device(tp_to_dev(tp), rx_buf_phy_addr, + tp->rx_buf_sz, DMA_FROM_DEVICE); + } + +#ifdef ENABLE_RSS_SUPPORT + rtl8125_rx_hash(tp, (struct RxDescV3 *)desc, skb); +#endif + + if (tp->cp_cmd & RxChkSum) + rtl8125_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 (rtl8125_rx_vlan_skb(tp, desc, skb) < 0) + rtl8125_rx_skb(tp, skb, ring_index); + +#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 % NUM_RX_DESC; + desc = rtl8125_get_rxdesc(tp, ring->RxDescArray, entry); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,37) + prefetch(desc); +#endif + } + + count = cur_rx - ring->cur_rx; + ring->cur_rx = cur_rx; + + delta = rtl8125_rx_fill(tp, ring, dev, ring->dirty_rx, ring->cur_rx, 1); + if (!delta && count && netif_msg_intr(tp)) + printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name); + ring->dirty_rx += 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 ((ring->dirty_rx + NUM_RX_DESC == ring->cur_rx) && netif_msg_intr(tp)) + printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name); + +rx_out: + return count; +} + +static bool +rtl8125_linkchg_interrupt(struct rtl8125_private *tp, u32 status) +{ + if (tp->HwCurrIsrVer == 2) + return status & ISRIMR_V2_LINKCHG; + + return status & LinkChg; +} + +/* + *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 rtl8125_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +#else +static irqreturn_t rtl8125_interrupt(int irq, void *dev_instance) +#endif +{ + struct r8125_napi *r8125napi = dev_instance; + struct rtl8125_private *tp = r8125napi->priv; + struct net_device *dev = tp->dev; + u32 status; + int handled = 0; + + do { + status = RTL_R32(tp, tp->isr_reg[0]); + + if (!(tp->features & (RTL_FEATURE_MSI | RTL_FEATURE_MSIX))) { + /* hotplug/major error/no more work/shared irq */ + if (!status) + break; + + if ((status == 0xFFFFFFFF)) + break; + + if (!(status & (tp->intr_mask | tp->timer_intr_mask))) + break; + } + + handled = 1; + +#if defined(RTL_USE_NEW_INTR_API) + if (!tp->irq_tbl[0].requested) + break; +#endif + rtl8125_disable_hw_interrupt(tp); + + RTL_W32(tp, tp->isr_reg[0], status&~RxFIFOOver); + + if (rtl8125_linkchg_interrupt(tp, status)) + rtl8125_schedule_linkchg_work(tp); + +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) { + if (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); + } + } +#endif + +#ifdef CONFIG_R8125_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->r8125napi[0].napi))) + __RTL_NETIF_RX_SCHEDULE(dev, &tp->r8125napi[0].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; + rtl8125_switch_to_hw_interrupt(tp); + } +#else + if (status & tp->intr_mask || tp->keep_intr_cnt-- > 0) { + u32 budget = ~(u32)0; + int i; + + if (status & tp->intr_mask) + tp->keep_intr_cnt = RTK_KEEP_INTERRUPT_COUNT; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) + rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[0], &budget); +#else + rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[0], budget); +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) + + for (i = 0; i < tp->num_tx_rings; i++) + rtl8125_tx_interrupt(&tp->tx_ring[i], ~(u32)0); +#ifdef ENABLE_DASH_SUPPORT + if (tp->DASH) { + struct net_device *dev = tp->dev; + + HandleDashInterrupt(dev); + } +#endif + + rtl8125_switch_to_timer_interrupt(tp); + } else { + tp->keep_intr_cnt = RTK_KEEP_INTERRUPT_COUNT; + rtl8125_switch_to_hw_interrupt(tp); + } +#endif + } while (false); + + return IRQ_RETVAL(handled); +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) +static irqreturn_t rtl8125_interrupt_msix(int irq, void *dev_instance, struct pt_regs *regs) +#else +static irqreturn_t rtl8125_interrupt_msix(int irq, void *dev_instance) +#endif +{ + struct r8125_napi *r8125napi = dev_instance; + struct rtl8125_private *tp = r8125napi->priv; + struct net_device *dev = tp->dev; + int message_id = r8125napi->index; +#ifndef CONFIG_R8125_NAPI + u32 budget = ~(u32)0; +#endif + + do { +#if defined(RTL_USE_NEW_INTR_API) + if (!tp->irq_tbl[message_id].requested) + break; +#endif + rtl8125_disable_hw_interrupt_v2(tp, message_id); + + rtl8125_clear_hw_isr_v2(tp, message_id); + + //link change + if (message_id == 21) { + rtl8125_schedule_linkchg_work(tp); + break; + } + +#ifdef CONFIG_R8125_NAPI + if (likely(RTL_NETIF_RX_SCHEDULE_PREP(dev, &r8125napi->napi))) + __RTL_NETIF_RX_SCHEDULE(dev, &r8125napi->napi); + else if (netif_msg_intr(tp)) + printk(KERN_INFO "%s: interrupt message id %d in poll_msix\n", + dev->name, message_id); +#else + if (message_id < tp->num_rx_rings) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) + rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[message_id], &budget); +#else + rtl8125_rx_interrupt(dev, tp, &tp->rx_ring[message_id], budget); +#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) + } + + rtl8125_tx_interrupt_with_vector(tp, message_id, ~(u32)0); + + rtl8125_enable_hw_interrupt_v2(tp, message_id); +#endif + + } while (false); + + return IRQ_HANDLED; +} + +static void rtl8125_down(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + //rtl8125_delete_esd_timer(dev, &tp->esd_timer); + + //rtl8125_delete_link_timer(dev, &tp->link_timer); + + netif_tx_disable(dev); + + _rtl8125_wait_for_quiescence(dev); + + netif_carrier_off(dev); + + rtl8125_hw_reset(dev); + + rtl8125_tx_clear(tp); + + rtl8125_rx_clear(tp); +} + +static int rtl8125_resource_freed(struct rtl8125_private *tp) +{ + int i; + + for (i = 0; i < tp->num_tx_rings; i++) + if (tp->tx_ring[i].TxDescArray) return 0; + + for (i = 0; i < tp->num_rx_rings; i++) + if (tp->rx_ring[i].RxDescArray) return 0; + + return 1; +} + +int rtl8125_close(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + if (!rtl8125_resource_freed(tp)) { + set_bit(R8125_FLAG_DOWN, tp->task_flags); + + rtl8125_down(dev); + + pci_clear_master(tp->pci_dev); + +#ifdef ENABLE_PTP_SUPPORT + rtl8125_ptp_stop(tp); +#endif + rtl8125_hw_d3_para(dev); + + rtl8125_powerdown_pll(dev, 0); + + rtl8125_free_irq(tp); + + rtl8125_free_alloc_resources(tp); + } else { + rtl8125_hw_d3_para(dev); + + rtl8125_powerdown_pll(dev, 0); + } + + return 0; +} + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11) +static void rtl8125_shutdown(struct pci_dev *pdev) +{ + struct net_device *dev = pci_get_drvdata(pdev); + struct rtl8125_private *tp = netdev_priv(dev); + + rtnl_lock(); + + if (tp->DASH) + rtl8125_driver_stop(tp); + + rtl8125_set_bios_setting(dev); + if (s5_keep_curr_mac == 0 && tp->random_mac == 0) + rtl8125_rar_set(tp, tp->org_mac_addr); + + if (s5wol == 0) + tp->wol_enabled = WOL_DISABLED; + + rtl8125_close(dev); + rtl8125_disable_msi(pdev, tp); + + rtnl_unlock(); + + if (system_state == SYSTEM_POWER_OFF) { + pci_clear_master(tp->pci_dev); + pci_wake_from_d3(pdev, tp->wol_enabled); + pci_set_power_state(pdev, PCI_D3hot); + } +} +#endif + +/** + * rtl8125_get_stats - Get rtl8125 read/write statistics + * @dev: The Ethernet Device to get statistics for + * + * Get TX/RX statistics for rtl8125 + */ +static struct +net_device_stats *rtl8125_get_stats(struct net_device *dev) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) + struct rtl8125_private *tp = netdev_priv(dev); +#endif + return &RTLDEV->stats; +} + +#ifdef CONFIG_PM + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11) +static int +rtl8125_suspend(struct pci_dev *pdev, u32 state) +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) +static int +rtl8125_suspend(struct device *device) +#else +static int +rtl8125_suspend(struct pci_dev *pdev, pm_message_t state) +#endif +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) + struct pci_dev *pdev = to_pci_dev(device); + struct net_device *dev = pci_get_drvdata(pdev); +#else + struct net_device *dev = pci_get_drvdata(pdev); +#endif + struct rtl8125_private *tp = netdev_priv(dev); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) + u32 pci_pm_state = pci_choose_state(pdev, state); +#endif + if (!netif_running(dev)) + goto out; + + //rtl8125_cancel_all_schedule_work(tp); + + //rtl8125_delete_esd_timer(dev, &tp->esd_timer); + + //rtl8125_delete_link_timer(dev, &tp->link_timer); + + rtnl_lock(); + + set_bit(R8125_FLAG_DOWN, tp->task_flags); + + netif_tx_disable(dev); + + netif_carrier_off(dev); + + netif_device_detach(dev); + +#ifdef ENABLE_PTP_SUPPORT + rtl8125_ptp_suspend(tp); +#endif + rtl8125_hw_reset(dev); + + pci_clear_master(pdev); + + rtl8125_hw_d3_para(dev); + + rtl8125_powerdown_pll(dev, 1); + + if (tp->DASH) + rtl8125_driver_stop(tp); + + rtnl_unlock(); +out: + + pci_disable_device(pdev); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) + pci_save_state(pdev, &pci_pm_state); +#else + pci_save_state(pdev); +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) + pci_enable_wake(pdev, pci_choose_state(pdev, state), tp->wol_enabled); +#endif + + pci_prepare_to_sleep(pdev); + + return 0; +} + +static int +rtl8125_hw_d3_not_power_off(struct net_device *dev) +{ + return rtl8125_check_hw_phy_mcu_code_ver(dev); +} + +static int rtl8125_wait_phy_nway_complete_sleep(struct rtl8125_private *tp) +{ + int i, val; + + for (i = 0; i < 30; i++) { + val = rtl8125_mdio_read(tp, MII_BMSR) & BMSR_ANEGCOMPLETE; + if (val) + return 0; + + msleep(100); + } + + return -1; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) +static int +rtl8125_resume(struct pci_dev *pdev) +#else +static int +rtl8125_resume(struct device *device) +#endif +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) + struct pci_dev *pdev = to_pci_dev(device); + struct net_device *dev = pci_get_drvdata(pdev); +#else + struct net_device *dev = pci_get_drvdata(pdev); +#endif + struct rtl8125_private *tp = netdev_priv(dev); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) + u32 pci_pm_state = PCI_D0; +#endif + u32 err; + + rtnl_lock(); + + err = pci_enable_device(pdev); + if (err) { + dev_err(&pdev->dev, "Cannot enable PCI device from suspend\n"); + goto out_unlock; + } +#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); + + /* restore last modified mac address */ + rtl8125_rar_set(tp, dev->dev_addr); + + tp->resume_not_chg_speed = 0; + if (tp->check_keep_link_speed && + //tp->link_ok(dev) && + rtl8125_hw_d3_not_power_off(dev) && + rtl8125_wait_phy_nway_complete_sleep(tp) == 0) + tp->resume_not_chg_speed = 1; + + if (!netif_running(dev)) + goto out_unlock; + + pci_set_master(pdev); + + rtl8125_exit_oob(dev); + + rtl8125_up(dev); + + clear_bit(R8125_FLAG_DOWN, tp->task_flags); + + rtl8125_schedule_reset_work(tp); + + rtl8125_schedule_esd_work(tp); + + //mod_timer(&tp->esd_timer, jiffies + RTL8125_ESD_TIMEOUT); + //mod_timer(&tp->link_timer, jiffies + RTL8125_LINK_TIMEOUT); +out_unlock: + netif_device_attach(dev); + + rtnl_unlock(); + + return err; +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) + +static struct dev_pm_ops rtl8125_pm_ops = { + .suspend = rtl8125_suspend, + .resume = rtl8125_resume, + .freeze = rtl8125_suspend, + .thaw = rtl8125_resume, + .poweroff = rtl8125_suspend, + .restore = rtl8125_resume, +}; + +#define RTL8125_PM_OPS (&rtl8125_pm_ops) + +#endif + +#else /* !CONFIG_PM */ + +#define RTL8125_PM_OPS NULL + +#endif /* CONFIG_PM */ + +static struct pci_driver rtl8125_pci_driver = { + .name = MODULENAME, + .id_table = rtl8125_pci_tbl, + .probe = rtl8125_init_one, + .remove = __devexit_p(rtl8125_remove_one), +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,11) + .shutdown = rtl8125_shutdown, +#endif +#ifdef CONFIG_PM +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) + .suspend = rtl8125_suspend, + .resume = rtl8125_resume, +#else + .driver.pm = RTL8125_PM_OPS, +#endif +#endif +}; + +static int __init +rtl8125_init_module(void) +{ + int ret = 0; +#ifdef ENABLE_R8125_PROCFS + rtl8125_proc_module_init(); +#endif + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0) + + ret = pci_register_driver(&rtl8125_pci_driver); +#else + ret = pci_module_init(&rtl8125_pci_driver); +#endif + + return ret; +} + +static void __exit +rtl8125_cleanup_module(void) +{ + pci_unregister_driver(&rtl8125_pci_driver); + +#ifdef ENABLE_R8125_PROCFS + if (rtl8125_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) + rtl8125_proc = NULL; + } +#endif +} + +module_init(rtl8125_init_module); +module_exit(rtl8125_cleanup_module); diff --git a/r8125/src/r8125_ptp.c b/r8125/src/r8125_ptp.c new file mode 100755 index 000000000..e1102b76d --- /dev/null +++ b/r8125/src/r8125_ptp.c @@ -0,0 +1,594 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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 +#include +#include +#include +#include +#include +#include +#include + +#include "r8125.h" +#include "r8125_ptp.h" + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0) +static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64) +{ + return *(const struct timespec *)&ts64; +} + +static inline struct timespec64 timespec_to_timespec64(const struct timespec ts) +{ + return *(const struct timespec64 *)&ts; +} +#endif + +static int _rtl8125_phc_gettime(struct rtl8125_private *tp, struct timespec64 *ts64) +{ + //get local time + RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_LATCHED_LOCAL_TIME | PTP_EXEC_CMD)); + + /* nanoseconds */ + //0x6808[29:0] + ts64->tv_nsec = (RTL_R32(tp, PTP_SOFT_CONFIG_Time_NS_8125) & 0x3fffffff) + + tp->ptp_adjust; + + /* seconds */ + //0x680C[47:0] + ts64->tv_sec = RTL_R16(tp, PTP_SOFT_CONFIG_Time_S_8125 + 4); + ts64->tv_sec <<= 32; + ts64->tv_sec |= RTL_R32(tp, PTP_SOFT_CONFIG_Time_S_8125); + + return 0; +} + +static int _rtl8125_phc_settime(struct rtl8125_private *tp, const struct timespec64 *ts64) +{ + /* nanoseconds */ + //0x6808[29:0] + RTL_W32(tp, PTP_SOFT_CONFIG_Time_NS_8125, (ts64->tv_nsec & 0x3fffffff)); + + /* seconds */ + //0x680C[47:0] + RTL_W32(tp, PTP_SOFT_CONFIG_Time_S_8125, ts64->tv_sec); + RTL_W16(tp, PTP_SOFT_CONFIG_Time_S_8125 + 4, (ts64->tv_sec >> 32)); + + //set local time + RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_SET_LOCAL_TIME | PTP_EXEC_CMD)); + + return 0; +} + +#if 0 +static int _rtl8125_phc_adjtime(struct rtl8125_private *tp, s64 delta) +{ + struct timespec64 now, then = ns_to_timespec64(delta); + u32 nsec; + u64 sec; + + _rtl8125_phc_gettime(tp, &now); + now = timespec64_add(now, then); + + nsec = now.tv_nsec & 0x3fffffff; + sec = now.tv_sec & 0x0000ffffffffffff; + + /* nanoseconds */ + //0x6808[29:0] + RTL_W32(tp, PTP_SOFT_CONFIG_Time_NS_8125, nsec); + + /* seconds */ + //0x680C[47:0] + RTL_W32(tp, PTP_SOFT_CONFIG_Time_S_8125, sec); + RTL_W16(tp, PTP_SOFT_CONFIG_Time_S_8125 + 4, (sec >> 32)); + + //adjust local time + //RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_DRIFT_LOCAL_TIME | PTP_EXEC_CMD)); + RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_SET_LOCAL_TIME | PTP_EXEC_CMD)); + + return 0; +} +#endif + +static int rtl8125_phc_adjtime(struct ptp_clock_info *ptp, s64 delta) +{ + struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); + unsigned long flags; + //int ret = 0; + + //netif_info(tp, drv, tp->dev, "phc adjust time\n"); + + spin_lock_irqsave(&tp->lock, flags); + //ret = _rtl8125_phc_adjtime(tp, delta); + tp->ptp_adjust += delta; + spin_unlock_irqrestore(&tp->lock, flags); + + return 0; +} + +/* +1ppm means every 125MHz plus 125Hz. It also means every 8ns minus 8ns*10^(-6) + +1ns=2^30 sub_ns + +8ns*10^(-6) = 8 * 2^30 sub_ns * 10^(-6) = 2^33 sub_ns * 10^(-6) = 8590 = 0x218E sub_ns + +1ppb means every 125MHz plus 0.125Hz. It also means every 8ns minus 8ns*10^(-9) + +1ns=2^30 sub_ns + +8ns*10^(-9) = 8 * 2^30 sub_ns * 10^(-9) = 2^33 sub_ns * 10^(-9) = 8.59 sub_ns = 9 sub_ns +*/ +static int _rtl8125_phc_adjfreq(struct ptp_clock_info *ptp, s32 ppb) +{ + struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); + bool negative = false; + u32 sub_ns; + + if (ppb < 0) { + negative = true; + ppb = -ppb; + } + + sub_ns = ppb * 9; + if (negative) { + sub_ns = -sub_ns; + sub_ns &= 0x3fffffff; + sub_ns |= PTP_ADJUST_TIME_NS_NEGATIVE; + } else + sub_ns &= 0x3fffffff; + + /* nanoseconds */ + //0x6808[29:0] + RTL_W32(tp, PTP_SOFT_CONFIG_Time_NS_8125, sub_ns); + + //adjust local time + RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_DRIFT_LOCAL_TIME | PTP_EXEC_CMD)); + //RTL_W16(tp, PTP_TIME_CORRECT_CMD_8125, (PTP_CMD_SET_LOCAL_TIME | PTP_EXEC_CMD)); + + return 0; +} + +static int rtl8125_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta) +{ + //struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); + + //netif_info(tp, drv, tp->dev, "phc adjust freq\n"); + + if (delta > ptp->max_adj || delta < -ptp->max_adj) + return -EINVAL; + + _rtl8125_phc_adjfreq(ptp, delta); + + return 0; +} + +static int rtl8125_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts64) +{ + struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); + unsigned long flags; + int ret; + + //netif_info(tp, drv, tp->dev, "phc get ts\n"); + + spin_lock_irqsave(&tp->lock, flags); + ret = _rtl8125_phc_gettime(tp, ts64); + spin_unlock_irqrestore(&tp->lock, flags); + + return ret; +} + +static int rtl8125_phc_settime(struct ptp_clock_info *ptp, + const struct timespec64 *ts64) +{ + struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); + unsigned long flags; + int ret; + + //netif_info(tp, drv, tp->dev, "phc set ts\n"); + + spin_lock_irqsave(&tp->lock, flags); + ret = _rtl8125_phc_settime(tp, ts64); + tp->ptp_adjust = 0; + spin_unlock_irqrestore(&tp->lock, flags); + + return ret; +} + +static int rtl8125_phc_enable(struct ptp_clock_info *ptp, + struct ptp_clock_request *rq, int on) +{ + struct rtl8125_private *tp = container_of(ptp, struct rtl8125_private, ptp_clock_info); + unsigned long flags; + u16 ptp_ctrl; + + //netif_info(tp, drv, tp->dev, "phc enable type %x on %d\n", rq->type, on); + + switch (rq->type) { + case PTP_CLK_REQ_PPS: + spin_lock_irqsave(&tp->lock, flags); + ptp_ctrl = RTL_R16(tp, PTP_CTRL_8125); + ptp_ctrl &= ~BIT_15; + if (on) + ptp_ctrl |= BIT_14; + else + ptp_ctrl &= ~BIT_14; + RTL_W16(tp, PTP_CTRL_8125, ptp_ctrl); + spin_unlock_irqrestore(&tp->lock, flags); + return 0; + default: + return -EOPNOTSUPP; + } +} + +int rtl8125_get_ts_info(struct net_device *netdev, + struct ethtool_ts_info *info) +{ + struct rtl8125_private *tp = netdev_priv(netdev); + + /* we always support timestamping disabled */ + info->rx_filters = BIT(HWTSTAMP_FILTER_NONE); + + if (tp->HwSuppPtpVer == 0) + return ethtool_op_get_ts_info(netdev, info); + + info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE | + SOF_TIMESTAMPING_RX_SOFTWARE | + SOF_TIMESTAMPING_SOFTWARE | + SOF_TIMESTAMPING_TX_HARDWARE | + SOF_TIMESTAMPING_RX_HARDWARE | + SOF_TIMESTAMPING_RAW_HARDWARE; + + if (tp->ptp_clock) + info->phc_index = ptp_clock_index(tp->ptp_clock); + else + info->phc_index = -1; + + info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON); + + info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) | + BIT(HWTSTAMP_FILTER_PTP_V2_EVENT) | + BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT) | + BIT(HWTSTAMP_FILTER_PTP_V2_SYNC) | + BIT(HWTSTAMP_FILTER_PTP_V2_L4_SYNC) | + BIT(HWTSTAMP_FILTER_PTP_V2_DELAY_REQ) | + BIT(HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ); + + return 0; +} + +static const struct ptp_clock_info rtl_ptp_clock_info = { + .owner = THIS_MODULE, + .n_alarm = 0, + .n_ext_ts = 0, + .n_per_out = 0, + .n_pins = 0, + .pps = 1, + .adjfreq = rtl8125_phc_adjfreq, + .adjtime = rtl8125_phc_adjtime, + .gettime64 = rtl8125_phc_gettime, + .settime64 = rtl8125_phc_settime, + .enable = rtl8125_phc_enable, +}; + +static int rtl8125_get_tx_ptp_pkt_tstamp(struct rtl8125_private *tp, struct timespec64 *ts64) +{ + return _rtl8125_phc_gettime(tp, ts64); +} + +static void rtl8125_ptp_tx_hwtstamp(struct rtl8125_private *tp) +{ + struct sk_buff *skb = tp->ptp_tx_skb; + struct skb_shared_hwtstamps shhwtstamps = {0}; + struct timespec64 ts64; + + RTL_W8(tp, PTP_ISR_8125, PTP_ISR_TOK | PTP_ISR_TER); + + rtl8125_get_tx_ptp_pkt_tstamp(tp, &ts64); + + /* Upper 32 bits contain s, lower 32 bits contain ns. */ + shhwtstamps.hwtstamp = ktime_set(ts64.tv_sec, + ts64.tv_nsec); + + /* Clear the lock early before calling skb_tstamp_tx so that + * applications are not woken up before the lock bit is clear. We use + * a copy of the skb pointer to ensure other threads can't change it + * while we're notifying the stack. + */ + tp->ptp_tx_skb = NULL; + + /* Notify the stack and free the skb after we've unlocked */ + skb_tstamp_tx(skb, &shhwtstamps); + dev_kfree_skb_any(skb); +} + +#define RTL8125_PTP_TX_TIMEOUT (HZ * 15) +static void rtl8125_ptp_tx_work(struct work_struct *work) +{ + struct rtl8125_private *tp = container_of(work, struct rtl8125_private, + ptp_tx_work); + unsigned long flags; + + spin_lock_irqsave(&tp->lock, flags); + + if (!tp->ptp_tx_skb) + goto Exit; + + if (time_is_before_jiffies(tp->ptp_tx_start + + RTL8125_PTP_TX_TIMEOUT)) { + dev_kfree_skb_any(tp->ptp_tx_skb); + tp->ptp_tx_skb = NULL; + tp->tx_hwtstamp_timeouts++; + /* Clear the tx valid bit in TSYNCTXCTL register to enable + * interrupt + */ + RTL_W8(tp, PTP_ISR_8125, PTP_ISR_TOK | PTP_ISR_TER); + goto Exit; + } + + if (RTL_R8(tp, PTP_ISR_8125) & (PTP_ISR_TOK)) + rtl8125_ptp_tx_hwtstamp(tp); + else + /* reschedule to check later */ + schedule_work(&tp->ptp_tx_work); + +Exit: + spin_unlock_irqrestore(&tp->lock, flags); +} + +static int rtl8125_hwtstamp_enable(struct rtl8125_private *tp, bool enable) +{ + RTL_W16(tp, PTP_CTRL_8125, 0); + if (enable) { + u16 ptp_ctrl; + struct timespec64 ts64; + + //clear ptp isr + RTL_W8(tp, PTP_ISR_8125, 0xff); + //ptp source 0:gphy 1:mac + rtl8125_mac_ocp_write(tp, 0xDC00, rtl8125_mac_ocp_read(tp, 0xDC00) | BIT_6); + //enable ptp + ptp_ctrl = (BIT_0 | BIT_3 | BIT_4 | BIT_6 | BIT_10 | BIT_12 | BIT_13); + if (tp->ptp_master_mode) { + ptp_ctrl &= ~BIT_13; + ptp_ctrl |= BIT_1; + } + RTL_W16(tp, PTP_CTRL_8125, ptp_ctrl); + + //set system time + /* + if (ktime_to_timespec64_cond(ktime_get_real(), &ts64)) + _rtl8125_phc_settime(tp, timespec64_to_timespec(ts64)); + */ + ktime_get_real_ts64(&ts64); + ts64.tv_nsec += tp->ptp_adjust; + _rtl8125_phc_settime(tp, &ts64); + tp->ptp_adjust = 0; + } + + return 0; +} + +static long rtl8125_ptp_create_clock(struct rtl8125_private *tp) +{ + struct net_device *netdev = tp->dev; + long err; + + if (!IS_ERR_OR_NULL(tp->ptp_clock)) + return 0; + + if (tp->HwSuppPtpVer == 0) { + tp->ptp_clock = NULL; + return -EOPNOTSUPP; + } + + tp->ptp_clock_info = rtl_ptp_clock_info; + snprintf(tp->ptp_clock_info.name, sizeof(tp->ptp_clock_info.name), + "%pm", tp->dev->dev_addr); + tp->ptp_clock_info.max_adj = 119304647; + tp->ptp_clock = ptp_clock_register(&tp->ptp_clock_info, &tp->pci_dev->dev); + if (IS_ERR(tp->ptp_clock)) { + err = PTR_ERR(tp->ptp_clock); + tp->ptp_clock = NULL; + netif_err(tp, drv, tp->dev, "ptp_clock_register failed\n"); + return err; + } else + netif_info(tp, drv, tp->dev, "registered PHC device on %s\n", netdev->name); + + return 0; +} + +void rtl8125_ptp_reset(struct rtl8125_private *tp) +{ + if (!tp->ptp_clock) + return; + + netif_info(tp, drv, tp->dev, "reset PHC clock\n"); + + rtl8125_hwtstamp_enable(tp, false); +} + +void rtl8125_ptp_init(struct rtl8125_private *tp) +{ + /* obtain a PTP device, or re-use an existing device */ + if (rtl8125_ptp_create_clock(tp)) + return; + + /* we have a clock so we can initialize work now */ + INIT_WORK(&tp->ptp_tx_work, rtl8125_ptp_tx_work); + + tp->ptp_adjust = 0; + + /* reset the PTP related hardware bits */ + rtl8125_ptp_reset(tp); + + return; +} + +void rtl8125_ptp_suspend(struct rtl8125_private *tp) +{ + if (!tp->ptp_clock) + return; + + netif_info(tp, drv, tp->dev, "suspend PHC clock\n"); + + rtl8125_hwtstamp_enable(tp, false); + + /* ensure that we cancel any pending PTP Tx work item in progress */ + cancel_work_sync(&tp->ptp_tx_work); +} + +void rtl8125_ptp_stop(struct rtl8125_private *tp) +{ + struct net_device *netdev = tp->dev; + + netif_info(tp, drv, tp->dev, "stop PHC clock\n"); + + /* first, suspend PTP activity */ + rtl8125_ptp_suspend(tp); + + /* disable the PTP clock device */ + if (tp->ptp_clock) { + ptp_clock_unregister(tp->ptp_clock); + tp->ptp_clock = NULL; + netif_info(tp, drv, tp->dev, "removed PHC on %s\n", + netdev->name); + } +} + +static int rtl8125_set_tstamp(struct net_device *netdev, struct ifreq *ifr) +{ + struct rtl8125_private *tp = netdev_priv(netdev); + struct hwtstamp_config config; + bool hwtstamp = 0; + + //netif_info(tp, drv, tp->dev, "ptp set ts\n"); + + if (copy_from_user(&config, ifr->ifr_data, sizeof(config))) + return -EFAULT; + + if (config.flags) + return -EINVAL; + + switch (config.tx_type) { + case HWTSTAMP_TX_ON: + hwtstamp = 1; + case HWTSTAMP_TX_OFF: + break; + case HWTSTAMP_TX_ONESTEP_SYNC: + default: + return -ERANGE; + } + + switch (config.rx_filter) { + case HWTSTAMP_FILTER_PTP_V2_EVENT: + case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: + case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: + case HWTSTAMP_FILTER_PTP_V2_SYNC: + case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: + case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: + case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: + case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: + case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: + config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; + hwtstamp = 1; + case HWTSTAMP_FILTER_NONE: + break; + default: + return -ERANGE; + } + + if (tp->hwtstamp_config.tx_type != config.tx_type || + tp->hwtstamp_config.rx_filter != config.rx_filter) { + tp->hwtstamp_config = config; + rtl8125_hwtstamp_enable(tp, hwtstamp); + } + + return copy_to_user(ifr->ifr_data, &config, + sizeof(config)) ? -EFAULT : 0; +} + +static int rtl8125_get_tstamp(struct net_device *netdev, struct ifreq *ifr) +{ + struct rtl8125_private *tp = netdev_priv(netdev); + + //netif_info(tp, drv, tp->dev, "ptp get ts\n"); + + return copy_to_user(ifr->ifr_data, &tp->hwtstamp_config, + sizeof(tp->hwtstamp_config)) ? -EFAULT : 0; +} + +int rtl8125_ptp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) +{ + struct rtl8125_private *tp = netdev_priv(netdev); + int ret; + unsigned long flags; + + //netif_info(tp, drv, tp->dev, "ptp ioctl\n"); + + ret = 0; + switch (cmd) { +#ifdef ENABLE_PTP_SUPPORT + case SIOCSHWTSTAMP: + spin_lock_irqsave(&tp->lock, flags); + ret = rtl8125_set_tstamp(netdev, ifr); + spin_unlock_irqrestore(&tp->lock, flags); + break; + case SIOCGHWTSTAMP: + spin_lock_irqsave(&tp->lock, flags); + ret = rtl8125_get_tstamp(netdev, ifr); + spin_unlock_irqrestore(&tp->lock, flags); + break; +#endif + default: + ret = -EOPNOTSUPP; + break; + } + + return ret; +} + +void rtl8125_rx_ptp_pktstamp(struct rtl8125_private *tp, struct sk_buff *skb, + struct RxDescV3 *descv3) +{ + time64_t tv_sec; + long tv_nsec; + + tv_sec = le32_to_cpu(descv3->RxDescTimeStamp.TimeStampHigh) + + ((u64)le32_to_cpu(descv3->RxDescPTPDDWord4.TimeStampHHigh) << 32); + tv_nsec = le32_to_cpu(descv3->RxDescTimeStamp.TimeStampLow) + tp->ptp_adjust; + + skb_hwtstamps(skb)->hwtstamp = ktime_set(tv_sec, tv_nsec); +} diff --git a/r8125/src/r8125_ptp.h b/r8125/src/r8125_ptp.h new file mode 100755 index 000000000..a324ff382 --- /dev/null +++ b/r8125/src/r8125_ptp.h @@ -0,0 +1,81 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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_rtl8125_PTP_H +#define _LINUX_rtl8125_PTP_H + +#include +#include +#include +#include +#include + +struct rtl8125_ptp_info { + s64 time_sec; + u32 time_ns; + u16 ts_info; +}; + +#ifndef _STRUCT_TIMESPEC +#define _STRUCT_TIMESPEC +struct timespec { + __kernel_old_time_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ +}; +#endif + +enum PTP_CMD_TYPE { + PTP_CMD_SET_LOCAL_TIME = 0, + PTP_CMD_DRIFT_LOCAL_TIME, + PTP_CMD_LATCHED_LOCAL_TIME, +}; + + +struct rtl8125_private; +struct RxDescV3; + +int rtl8125_get_ts_info(struct net_device *netdev, + struct ethtool_ts_info *info); + +void rtl8125_ptp_reset(struct rtl8125_private *tp); +void rtl8125_ptp_init(struct rtl8125_private *tp); +void rtl8125_ptp_suspend(struct rtl8125_private *tp); +void rtl8125_ptp_stop(struct rtl8125_private *tp); + +int rtl8125_ptp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); + +void rtl8125_rx_ptp_pktstamp(struct rtl8125_private *tp, struct sk_buff *skb, + struct RxDescV3 *descv3); + +#endif /* _LINUX_rtl8125_PTP_H */ diff --git a/r8125/src/r8125_realwow.h b/r8125/src/r8125_realwow.h new file mode 100755 index 000000000..352e3270f --- /dev/null +++ b/r8125/src/r8125_realwow.h @@ -0,0 +1,118 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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_R8125_REALWOW_H +#define _LINUX_R8125_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 rtl8125_realwow_ioctl(struct net_device *dev, struct ifreq *ifr); +void rtl8125_realwow_hw_init(struct net_device *dev); +void rtl8125_get_realwow_hw_version(struct net_device *dev); +void rtl8125_set_realwow_d3_para(struct net_device *dev); + +#endif /* _LINUX_R8125_REALWOW_H */ diff --git a/r8125/src/r8125_rss.c b/r8125/src/r8125_rss.c new file mode 100755 index 000000000..78e53f514 --- /dev/null +++ b/r8125/src/r8125_rss.c @@ -0,0 +1,481 @@ +// 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) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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 +#include "r8125.h" + +enum rtl8125_rss_register_content { + /* RSS */ + RSS_CTRL_TCP_IPV4_SUPP = (1 << 0), + RSS_CTRL_IPV4_SUPP = (1 << 1), + RSS_CTRL_TCP_IPV6_SUPP = (1 << 2), + RSS_CTRL_IPV6_SUPP = (1 << 3), + RSS_HALF_SUPP = (1 << 7), + RSS_CTRL_UDP_IPV4_SUPP = (1 << 11), + RSS_CTRL_UDP_IPV6_SUPP = (1 << 12), + RSS_QUAD_CPU_EN = (1 << 16), + RSS_HQ_Q_SUP_R = (1 << 31), +}; + +static int rtl8125_get_rss_hash_opts(struct rtl8125_private *tp, + struct ethtool_rxnfc *cmd) +{ + cmd->data = 0; + + /* Report default options for RSS */ + switch (cmd->flow_type) { + case TCP_V4_FLOW: + cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; + /* fallthrough */ + case UDP_V4_FLOW: + if (tp->rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV4) + cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; + /* fallthrough */ + case IPV4_FLOW: + cmd->data |= RXH_IP_SRC | RXH_IP_DST; + break; + case TCP_V6_FLOW: + cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; + /* fallthrough */ + case UDP_V6_FLOW: + if (tp->rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV6) + cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; + /* fallthrough */ + case IPV6_FLOW: + cmd->data |= RXH_IP_SRC | RXH_IP_DST; + break; + default: + return -EINVAL; + } + + return 0; +} + +int rtl8125_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, + u32 *rule_locs) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int ret = -EOPNOTSUPP; + + netif_info(tp, drv, tp->dev, "rss get rxnfc\n"); + + if (!(dev->features & NETIF_F_RXHASH)) + return ret; + + switch (cmd->cmd) { + case ETHTOOL_GRXRINGS: + cmd->data = rtl8125_tot_rx_rings(tp); + ret = 0; + break; + case ETHTOOL_GRXFH: + ret = rtl8125_get_rss_hash_opts(tp, cmd); + break; + default: + break; + } + + return ret; +} + +u32 rtl8125_rss_indir_tbl_entries(struct rtl8125_private *tp) +{ + return tp->HwSuppIndirTblEntries; +} + +#define RSS_MASK_BITS_OFFSET (8) +#define RSS_CPU_NUM_OFFSET (16) +#define RTL8125_UDP_RSS_FLAGS (RTL_8125_RSS_FLAG_HASH_UDP_IPV4 | \ + RTL_8125_RSS_FLAG_HASH_UDP_IPV6) +static int _rtl8125_set_rss_hash_opt(struct rtl8125_private *tp) +{ + u32 rss_flags = tp->rss_flags; + u32 hash_mask_len; + u32 rss_ctrl; + + rss_ctrl = ilog2(rtl8125_tot_rx_rings(tp)); + rss_ctrl &= (BIT_0 | BIT_1 | BIT_2); + rss_ctrl <<= RSS_CPU_NUM_OFFSET; + + /* Perform hash on these packet types */ + rss_ctrl |= RSS_CTRL_TCP_IPV4_SUPP + | RSS_CTRL_IPV4_SUPP + | RSS_CTRL_IPV6_SUPP + | RSS_CTRL_TCP_IPV6_SUPP; + + if (rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV4) + rss_ctrl |= RSS_CTRL_UDP_IPV4_SUPP; + + if (rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV6) + rss_ctrl |= RSS_CTRL_UDP_IPV6_SUPP; + + hash_mask_len = ilog2(rtl8125_rss_indir_tbl_entries(tp)); + hash_mask_len &= (BIT_0 | BIT_1 | BIT_2); + rss_ctrl |= hash_mask_len << RSS_MASK_BITS_OFFSET; + + RTL_W32(tp, RSS_CTRL_8125, rss_ctrl); + + return 0; +} + +static int rtl8125_set_rss_hash_opt(struct rtl8125_private *tp, + struct ethtool_rxnfc *nfc) +{ + u32 rss_flags = tp->rss_flags; + + netif_info(tp, drv, tp->dev, "rss set hash\n"); + + /* + * RSS does not support anything other than hashing + * to queues on src and dst IPs and ports + */ + if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST | + RXH_L4_B_0_1 | RXH_L4_B_2_3)) + return -EINVAL; + + switch (nfc->flow_type) { + case TCP_V4_FLOW: + case TCP_V6_FLOW: + if (!(nfc->data & RXH_IP_SRC) || + !(nfc->data & RXH_IP_DST) || + !(nfc->data & RXH_L4_B_0_1) || + !(nfc->data & RXH_L4_B_2_3)) + return -EINVAL; + break; + case UDP_V4_FLOW: + if (!(nfc->data & RXH_IP_SRC) || + !(nfc->data & RXH_IP_DST)) + return -EINVAL; + switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { + case 0: + rss_flags &= ~RTL_8125_RSS_FLAG_HASH_UDP_IPV4; + break; + case (RXH_L4_B_0_1 | RXH_L4_B_2_3): + rss_flags |= RTL_8125_RSS_FLAG_HASH_UDP_IPV4; + break; + default: + return -EINVAL; + } + break; + case UDP_V6_FLOW: + if (!(nfc->data & RXH_IP_SRC) || + !(nfc->data & RXH_IP_DST)) + return -EINVAL; + switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) { + case 0: + rss_flags &= ~RTL_8125_RSS_FLAG_HASH_UDP_IPV6; + break; + case (RXH_L4_B_0_1 | RXH_L4_B_2_3): + rss_flags |= RTL_8125_RSS_FLAG_HASH_UDP_IPV6; + break; + default: + return -EINVAL; + } + break; + case SCTP_V4_FLOW: + case AH_ESP_V4_FLOW: + case AH_V4_FLOW: + case ESP_V4_FLOW: + case SCTP_V6_FLOW: + case AH_ESP_V6_FLOW: + case AH_V6_FLOW: + case ESP_V6_FLOW: + case IP_USER_FLOW: + case ETHER_FLOW: + /* RSS is not supported for these protocols */ + if (nfc->data) { + netif_err(tp, drv, tp->dev, "Command parameters not supported\n"); + return -EINVAL; + } + return 0; + break; + default: + return -EINVAL; + } + + /* if we changed something we need to update flags */ + if (rss_flags != tp->rss_flags) { + u32 rss_ctrl = RTL_R32(tp, RSS_CTRL_8125); + + if ((rss_flags & RTL8125_UDP_RSS_FLAGS) && + !(tp->rss_flags & RTL8125_UDP_RSS_FLAGS)) + netdev_warn(tp->dev, + "enabling UDP RSS: fragmented packets may " + "arrive out of order to the stack above\n"); + + tp->rss_flags = rss_flags; + + /* Perform hash on these packet types */ + rss_ctrl |= RSS_CTRL_TCP_IPV4_SUPP + | RSS_CTRL_IPV4_SUPP + | RSS_CTRL_IPV6_SUPP + | RSS_CTRL_TCP_IPV6_SUPP; + + rss_ctrl &= ~(RSS_CTRL_UDP_IPV4_SUPP | + RSS_CTRL_UDP_IPV6_SUPP); + + if (rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV4) + rss_ctrl |= RSS_CTRL_UDP_IPV4_SUPP; + + if (rss_flags & RTL_8125_RSS_FLAG_HASH_UDP_IPV6) + rss_ctrl |= RSS_CTRL_UDP_IPV6_SUPP; + + RTL_W32(tp, RSS_CTRL_8125, rss_ctrl); + } + + return 0; +} + +int rtl8125_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int ret = -EOPNOTSUPP; + + netif_info(tp, drv, tp->dev, "rss set rxnfc\n"); + + if (!(dev->features & NETIF_F_RXHASH)) + return ret; + + switch (cmd->cmd) { + case ETHTOOL_SRXFH: + ret = rtl8125_set_rss_hash_opt(tp, cmd); + break; + default: + break; + } + + return ret; +} + +static u32 _rtl8125_get_rxfh_key_size(struct rtl8125_private *tp) +{ + return sizeof(tp->rss_key); +} + +u32 rtl8125_get_rxfh_key_size(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + netif_info(tp, drv, tp->dev, "rss get key size\n"); + + if (!(dev->features & NETIF_F_RXHASH)) + return 0; + + return _rtl8125_get_rxfh_key_size(tp); +} + +u32 rtl8125_rss_indir_size(struct net_device *dev) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + netif_info(tp, drv, tp->dev, "rss get indir tbl size\n"); + + if (!(dev->features & NETIF_F_RXHASH)) + return 0; + + return rtl8125_rss_indir_tbl_entries(tp); +} + +static void rtl8125_get_reta(struct rtl8125_private *tp, u32 *indir) +{ + int i, reta_size = rtl8125_rss_indir_tbl_entries(tp); + + for (i = 0; i < reta_size; i++) + indir[i] = tp->rss_indir_tbl[i]; +} + +int rtl8125_get_rxfh(struct net_device *dev, u32 *indir, u8 *key, + u8 *hfunc) +{ + struct rtl8125_private *tp = netdev_priv(dev); + + netif_info(tp, drv, tp->dev, "rss get rxfh\n"); + + if (!(dev->features & NETIF_F_RXHASH)) + return -EOPNOTSUPP; + + if (hfunc) + *hfunc = ETH_RSS_HASH_TOP; + + if (indir) + rtl8125_get_reta(tp, indir); + + if (key) + memcpy(key, tp->rss_key, rtl8125_get_rxfh_key_size(dev)); + + return 0; +} + +static u32 rtl8125_rss_key_reg(struct rtl8125_private *tp) +{ + return RSS_KEY_8125; +} + +static u32 rtl8125_rss_indir_tbl_reg(struct rtl8125_private *tp) +{ + return RSS_INDIRECTION_TBL_8125_V2; +} + +static void rtl8125_store_reta(struct rtl8125_private *tp) +{ + u16 indir_tbl_reg = rtl8125_rss_indir_tbl_reg(tp); + u32 i, reta_entries = rtl8125_rss_indir_tbl_entries(tp); + u32 reta = 0; + u8 *indir_tbl = tp->rss_indir_tbl; + + /* Write redirection table to HW */ + for (i = 0; i < reta_entries; i++) { + reta |= indir_tbl[i] << (i & 0x3) * 8; + if ((i & 3) == 3) { + RTL_W32(tp, indir_tbl_reg, reta); + + indir_tbl_reg += 4; + reta = 0; + } + } +} + +static void rtl8125_store_rss_key(struct rtl8125_private *tp) +{ + const u16 rss_key_reg = rtl8125_rss_key_reg(tp); + u32 i, rss_key_size = _rtl8125_get_rxfh_key_size(tp); + u32 *rss_key = (u32*)tp->rss_key; + + /* Write redirection table to HW */ + for (i = 0; i < rss_key_size; i+=4) + RTL_W32(tp, rss_key_reg + i, *rss_key++); +} + +int rtl8125_set_rxfh(struct net_device *dev, const u32 *indir, + const u8 *key, const u8 hfunc) +{ + struct rtl8125_private *tp = netdev_priv(dev); + int i; + u32 reta_entries = rtl8125_rss_indir_tbl_entries(tp); + + netif_info(tp, drv, tp->dev, "rss set rxfh\n"); + + /* We require at least one supported parameter to be changed and no + * change in any of the unsupported parameters + */ + if (hfunc != ETH_RSS_HASH_NO_CHANGE && hfunc != ETH_RSS_HASH_TOP) + return -EOPNOTSUPP; + + /* Fill out the redirection table */ + if (indir) { + int max_queues = tp->num_rx_rings; + + /* Verify user input. */ + for (i = 0; i < reta_entries; i++) + if (indir[i] >= max_queues) + return -EINVAL; + + for (i = 0; i < reta_entries; i++) + tp->rss_indir_tbl[i] = indir[i]; + } + + /* Fill out the rss hash key */ + if (key) + memcpy(tp->rss_key, key, rtl8125_get_rxfh_key_size(dev)); + + rtl8125_store_reta(tp); + + rtl8125_store_rss_key(tp); + + return 0; +} + +static u32 rtl8125_get_rx_desc_hash(struct rtl8125_private *tp, + struct RxDescV3 *descv3) +{ + return le32_to_cpu(descv3->RxDescNormalDDWord2.RSSResult); +} + +#define RXS_8125B_RSS_UDP BIT(9) +#define RXS_8125_RSS_IPV4 BIT(10) +#define RXS_8125_RSS_IPV6 BIT(12) +#define RXS_8125_RSS_TCP BIT(13) +#define RTL8125_RXS_RSS_L3_TYPE_MASK (RXS_8125_RSS_IPV4 | RXS_8125_RSS_IPV6) +#define RTL8125_RXS_RSS_L4_TYPE_MASK (RXS_8125_RSS_TCP | RXS_8125B_RSS_UDP) +void rtl8125_rx_hash(struct rtl8125_private *tp, + struct RxDescV3 *descv3, + struct sk_buff *skb) +{ + u16 rss_header_info; + + if (!(tp->dev->features & NETIF_F_RXHASH)) + return; + + rss_header_info = le16_to_cpu(descv3->RxDescNormalDDWord2.HeaderInfo); + + if (!(rss_header_info & RTL8125_RXS_RSS_L3_TYPE_MASK)) + return; + + skb_set_hash(skb, rtl8125_get_rx_desc_hash(tp, descv3), + (RTL8125_RXS_RSS_L4_TYPE_MASK & rss_header_info) ? + PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3); +} + +void rtl8125_disable_rss(struct rtl8125_private *tp) +{ + RTL_W32(tp, RSS_CTRL_8125, 0x00); +} + +void _rtl8125_config_rss(struct rtl8125_private *tp) +{ + _rtl8125_set_rss_hash_opt(tp); + + rtl8125_store_reta(tp); + + rtl8125_store_rss_key(tp); +} + +void rtl8125_config_rss(struct rtl8125_private *tp) +{ + if (!tp->EnableRss) { + rtl8125_disable_rss(tp); + return; + } + + _rtl8125_config_rss(tp); +} + +void rtl8125_init_rss(struct rtl8125_private *tp) +{ + int i; + + for (i = 0; i < rtl8125_rss_indir_tbl_entries(tp); i++) + tp->rss_indir_tbl[i] = ethtool_rxfh_indir_default(i, tp->num_rx_rings); + + netdev_rss_key_fill(tp->rss_key, RTL8125_RSS_KEY_SIZE); +} diff --git a/r8125/src/r8125_rss.h b/r8125/src/r8125_rss.h new file mode 100755 index 000000000..90e280902 --- /dev/null +++ b/r8125/src/r8125_rss.h @@ -0,0 +1,69 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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_rtl8125_RSS_H +#define _LINUX_rtl8125_RSS_H + +#include +#include + +#define RTL8125_RSS_KEY_SIZE 40 /* size of RSS Hash Key in bytes */ +#define RTL8125_MAX_INDIRECTION_TABLE_ENTRIES 128 + +enum rtl8125_rss_flag { + RTL_8125_RSS_FLAG_HASH_UDP_IPV4 = (1 << 0), + RTL_8125_RSS_FLAG_HASH_UDP_IPV6 = (1 << 1), +}; + +struct rtl8125_private; + +int rtl8125_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, + u32 *rule_locs); +int rtl8125_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd); +u32 rtl8125_get_rxfh_key_size(struct net_device *netdev); +u32 rtl8125_rss_indir_size(struct net_device *netdev); +int rtl8125_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, + u8 *hfunc); +int rtl8125_set_rxfh(struct net_device *netdev, const u32 *indir, + const u8 *key, const u8 hfunc); +void rtl8125_rx_hash(struct rtl8125_private *tp, + struct RxDescV3 *descv3, + struct sk_buff *skb); +void _rtl8125_config_rss(struct rtl8125_private *tp); +void rtl8125_config_rss(struct rtl8125_private *tp); +void rtl8125_init_rss(struct rtl8125_private *tp); +u32 rtl8125_rss_indir_tbl_entries(struct rtl8125_private *tp); +void rtl8125_disable_rss(struct rtl8125_private *tp); + +#endif /* _LINUX_rtl8125_RSS_H */ diff --git a/r8125/src/rtl_eeprom.c b/r8125/src/rtl_eeprom.c new file mode 100755 index 000000000..866ae5f33 --- /dev/null +++ b/r8125/src/rtl_eeprom.c @@ -0,0 +1,289 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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 +#include +#include +#include +#include +#include + +#include + +#include "r8125.h" +#include "rtl_eeprom.h" + +//------------------------------------------------------------------- +//rtl8125_eeprom_type(): +// tell the eeprom type +//return value: +// 0: the eeprom type is 93C46 +// 1: the eeprom type is 93C56 or 93C66 +//------------------------------------------------------------------- +void rtl8125_eeprom_type(struct rtl8125_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 = rtl8125_eeprom_read_sc(tp, 0); + +out_no_eeprom: + if ((magic != 0x8129) && (magic != 0x8128)) { + tp->eeprom_type = EEPROM_TYPE_NONE; + tp->eeprom_len = 0; + } +} + +void rtl8125_eeprom_cleanup(struct rtl8125_private *tp) +{ + u8 x; + + x = RTL_R8(tp, Cfg9346); + x &= ~(Cfg9346_EEDI | Cfg9346_EECS); + + RTL_W8(tp, Cfg9346, x); + + rtl8125_raise_clock(tp, &x); + rtl8125_lower_clock(tp, &x); +} + +int rtl8125_eeprom_cmd_done(struct rtl8125_private *tp) +{ + u8 x; + int i; + + rtl8125_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; +} + +//------------------------------------------------------------------- +//rtl8125_eeprom_read_sc(): +// read one word from eeprom +//------------------------------------------------------------------- +u16 rtl8125_eeprom_read_sc(struct rtl8125_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); + + rtl8125_shift_out_bits(tp, RTL_EEPROM_READ_OPCODE, 3); + rtl8125_shift_out_bits(tp, reg, addr_sz); + + data = rtl8125_shift_in_bits(tp); + + rtl8125_eeprom_cleanup(tp); + + RTL_W8(tp, Cfg9346, 0); + + return data; +} + +//------------------------------------------------------------------- +//rtl8125_eeprom_write_sc(): +// write one word to a specific address in the eeprom +//------------------------------------------------------------------- +void rtl8125_eeprom_write_sc(struct rtl8125_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); + + rtl8125_shift_out_bits(tp, RTL_EEPROM_EWEN_OPCODE, 5); + rtl8125_shift_out_bits(tp, reg, w_dummy_addr); + rtl8125_stand_by(tp); + + rtl8125_shift_out_bits(tp, RTL_EEPROM_ERASE_OPCODE, 3); + rtl8125_shift_out_bits(tp, reg, addr_sz); + if (rtl8125_eeprom_cmd_done(tp) < 0) { + return; + } + rtl8125_stand_by(tp); + + rtl8125_shift_out_bits(tp, RTL_EEPROM_WRITE_OPCODE, 3); + rtl8125_shift_out_bits(tp, reg, addr_sz); + rtl8125_shift_out_bits(tp, data, 16); + if (rtl8125_eeprom_cmd_done(tp) < 0) { + return; + } + rtl8125_stand_by(tp); + + rtl8125_shift_out_bits(tp, RTL_EEPROM_EWDS_OPCODE, 5); + rtl8125_shift_out_bits(tp, reg, w_dummy_addr); + + rtl8125_eeprom_cleanup(tp); + RTL_W8(tp, Cfg9346, 0); +} + +void rtl8125_raise_clock(struct rtl8125_private *tp, u8 *x) +{ + *x = *x | Cfg9346_EESK; + RTL_W8(tp, Cfg9346, *x); + udelay(RTL_CLOCK_RATE); +} + +void rtl8125_lower_clock(struct rtl8125_private *tp, u8 *x) +{ + + *x = *x & ~Cfg9346_EESK; + RTL_W8(tp, Cfg9346, *x); + udelay(RTL_CLOCK_RATE); +} + +void rtl8125_shift_out_bits(struct rtl8125_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); + rtl8125_raise_clock(tp, &x); + rtl8125_lower_clock(tp, &x); + mask = mask >> 1; + } while(mask); + + x &= ~Cfg9346_EEDI; + RTL_W8(tp, Cfg9346, x); +} + +u16 rtl8125_shift_in_bits(struct rtl8125_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; + rtl8125_raise_clock(tp, &x); + + x = RTL_R8(tp, Cfg9346); + x &= ~Cfg9346_EEDI; + + if (x & Cfg9346_EEDO) + d |= 1; + + rtl8125_lower_clock(tp, &x); + } + + return d; +} + +void rtl8125_stand_by(struct rtl8125_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 rtl8125_set_eeprom_sel_low(struct rtl8125_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/r8125/src/rtl_eeprom.h b/r8125/src/rtl_eeprom.h new file mode 100755 index 000000000..b0c4a050b --- /dev/null +++ b/r8125/src/rtl_eeprom.h @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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 rtl8125_eeprom_type(struct rtl8125_private *tp); +void rtl8125_eeprom_cleanup(struct rtl8125_private *tp); +u16 rtl8125_eeprom_read_sc(struct rtl8125_private *tp, u16 reg); +void rtl8125_eeprom_write_sc(struct rtl8125_private *tp, u16 reg, u16 data); +void rtl8125_shift_out_bits(struct rtl8125_private *tp, int data, int count); +u16 rtl8125_shift_in_bits(struct rtl8125_private *tp); +void rtl8125_raise_clock(struct rtl8125_private *tp, u8 *x); +void rtl8125_lower_clock(struct rtl8125_private *tp, u8 *x); +void rtl8125_stand_by(struct rtl8125_private *tp); +void rtl8125_set_eeprom_sel_low(struct rtl8125_private *tp); diff --git a/r8125/src/rtltool.c b/r8125/src/rtltool.c new file mode 100755 index 000000000..ace717bde --- /dev/null +++ b/r8125/src/rtltool.c @@ -0,0 +1,320 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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 +#include +#include +#include +#include +#include +#include +#include +#include "r8125.h" +#include "rtl_eeprom.h" +#include "rtltool.h" + +int rtl8125_tool_ioctl(struct rtl8125_private *tp, struct ifreq *ifr) +{ + struct rtltool_cmd my_cmd; + 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 (!capable(CAP_NET_ADMIN)) + return -EPERM; + + 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 (!capable(CAP_NET_ADMIN)) + return -EPERM; + + 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: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + my_cmd.data = rtl8125_mdio_prot_read(tp, my_cmd.offset); + if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) { + ret = -EFAULT; + break; + } + + break; + + case RTLTOOL_WRITE_PHY: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + rtl8125_mdio_prot_write(tp, my_cmd.offset, my_cmd.data); + break; + + case RTLTOOL_READ_EPHY: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + my_cmd.data = rtl8125_ephy_read(tp, my_cmd.offset); + if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) { + ret = -EFAULT; + break; + } + + break; + + case RTLTOOL_WRITE_EPHY: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + rtl8125_ephy_write(tp, my_cmd.offset, my_cmd.data); + break; + + case RTLTOOL_READ_ERI: + my_cmd.data = 0; + if (my_cmd.len==1 || my_cmd.len==2 || my_cmd.len==4) { + my_cmd.data = rtl8125_eri_read(tp, my_cmd.offset, my_cmd.len, ERIAR_ExGMAC); + } 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 (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (my_cmd.len==1 || my_cmd.len==2 || my_cmd.len==4) { + rtl8125_eri_write(tp, my_cmd.offset, my_cmd.len, my_cmd.data, ERIAR_ExGMAC); + } else { + ret = -EOPNOTSUPP; + break; + } + break; + + case RTLTOOL_READ_PCI: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + 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 (!capable(CAP_NET_ADMIN)) + return -EPERM; + + 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: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + my_cmd.data = rtl8125_eeprom_read_sc(tp, my_cmd.offset); + if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) { + ret = -EFAULT; + break; + } + + break; + + case RTLTOOL_WRITE_EEPROM: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + rtl8125_eeprom_write_sc(tp, my_cmd.offset, my_cmd.data); + break; + + case RTL_READ_OOB_MAC: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + rtl8125_oob_mutex_lock(tp); + my_cmd.data = rtl8125_ocp_read(tp, my_cmd.offset, 4); + rtl8125_oob_mutex_unlock(tp); + if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) { + ret = -EFAULT; + break; + } + break; + + case RTL_WRITE_OOB_MAC: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (my_cmd.len == 0 || my_cmd.len > 4) + return -EOPNOTSUPP; + + rtl8125_oob_mutex_lock(tp); + rtl8125_ocp_write(tp, my_cmd.offset, my_cmd.len, my_cmd.data); + rtl8125_oob_mutex_unlock(tp); + break; + + case RTL_ENABLE_PCI_DIAG: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + tp->rtk_enable_diag = 1; + + dprintk("enable rtk diag\n"); + break; + + case RTL_DISABLE_PCI_DIAG: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + tp->rtk_enable_diag = 0; + + dprintk("disable rtk diag\n"); + break; + + case RTL_READ_MAC_OCP: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (my_cmd.offset % 2) + return -EOPNOTSUPP; + + my_cmd.data = rtl8125_mac_ocp_read(tp, my_cmd.offset); + if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) { + ret = -EFAULT; + break; + } + break; + + case RTL_WRITE_MAC_OCP: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if ((my_cmd.offset % 2) || (my_cmd.len != 2)) + return -EOPNOTSUPP; + + rtl8125_mac_ocp_write(tp, my_cmd.offset, (u16)my_cmd.data); + break; + + case RTL_DIRECT_READ_PHY_OCP: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + my_cmd.data = rtl8125_mdio_prot_direct_read_phy_ocp(tp, my_cmd.offset); + if (copy_to_user(ifr->ifr_data, &my_cmd, sizeof(my_cmd))) { + ret = -EFAULT; + break; + } + + break; + + case RTL_DIRECT_WRITE_PHY_OCP: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + rtl8125_mdio_prot_direct_write_phy_ocp(tp, my_cmd.offset, my_cmd.data); + break; + + default: + ret = -EOPNOTSUPP; + break; + } + + return ret; +} diff --git a/r8125/src/rtltool.h b/r8125/src/rtltool.h new file mode 100755 index 000000000..fc8a10ca8 --- /dev/null +++ b/r8125/src/rtltool.h @@ -0,0 +1,86 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +################################################################################ +# +# r8125 is the Linux device driver released for Realtek 2.5Gigabit Ethernet +# controllers with PCI-Express interface. +# +# Copyright(c) 2021 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 . +# +# Author: +# Realtek NIC software team +# 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 rtl8125_tool_ioctl(struct rtl8125_private *tp, struct ifreq *ifr); +#endif + +#endif /* _LINUX_RTLTOOL_H */ From 791a0643aaba0cf1dc6c4c959fc06fb0fff133fa Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Tue, 4 Jan 2022 09:06:13 +0100 Subject: [PATCH 34/63] Add luci-proto-modemmanager --- luci-proto-modemmanager/Makefile | 14 ++ .../resources/protocol/modemmanager.js | 136 ++++++++++++++++++ .../rpcd/acl.d/luci-proto-modemmanager.json | 12 ++ 3 files changed, 162 insertions(+) create mode 100644 luci-proto-modemmanager/Makefile create mode 100644 luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js create mode 100644 luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json diff --git a/luci-proto-modemmanager/Makefile b/luci-proto-modemmanager/Makefile new file mode 100644 index 000000000..37d96f118 --- /dev/null +++ b/luci-proto-modemmanager/Makefile @@ -0,0 +1,14 @@ +# +# Copyright (C) 2008-2014 The LuCI Team +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=Support for ModemManager +LUCI_DEPENDS:=+modemmanager + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js b/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js new file mode 100644 index 000000000..88e516a8e --- /dev/null +++ b/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js @@ -0,0 +1,136 @@ +'use strict'; +'require fs'; +'require form'; +'require network'; + +function getModemList() { + return fs.exec_direct('/usr/bin/mmcli', [ '-L' ]).then(function(res) { + var lines = (res || '').split(/\n/), + tasks = []; + + for (var i = 0; i < lines.length; i++) { + var m = lines[i].match(/\/Modem\/(\d+)/); + if (m) + tasks.push(fs.exec_direct('/usr/bin/mmcli', [ '-m', m[1] ])); + } + + return Promise.all(tasks).then(function(res) { + var modems = []; + + for (var i = 0; i < res.length; i++) { + var man = res[i].match(/manufacturer: ([^\n]+)/), + mod = res[i].match(/model: ([^\n]+)/), + dev = res[i].match(/device: ([^\n]+)/); + + if (dev) { + modems.push({ + device: dev[1].trim(), + manufacturer: (man ? man[1].trim() : '') || '?', + model: (mod ? mod[1].trim() : '') || dev[1].trim() + }); + } + } + + return modems; + }); + }); +} + +network.registerPatternVirtual(/^mobiledata-.+$/); +network.registerErrorCode('MM_CONNECT_FAILED', _('Connection attempt failed.')); +network.registerErrorCode('MM_DISCONNECT_IN_PROGRESS', _('Modem disconnection in progress. Please wait.')); +network.registerErrorCode('MM_CONNECT_IN_PROGRESS', _('Modem connection in progress. Please wait. This process will timeout after 2 minutes.')); +network.registerErrorCode('MM_TEARDOWN_IN_PROGRESS', _('Modem bearer teardown in progress.')); +network.registerErrorCode('MM_MODEM_DISABLED', _('Modem is disabled.')); +network.registerErrorCode('DEVICE_NOT_MANAGED', _('Device not managed by ModemManager.')); +network.registerErrorCode('INVALID_BEARER_LIST', _('Invalid bearer list. Possibly too many bearers created. This protocol supports one and only one bearer.')); +network.registerErrorCode('UNKNOWN_METHOD', _('Unknown and unsupported connection method.')); +network.registerErrorCode('DISCONNECT_FAILED', _('Disconnection attempt failed.')); + +return network.registerProtocol('modemmanager', { + getI18n: function() { + return _('ModemManager'); + }, + + getIfname: function() { + return this._ubus('l3_device') || 'modemmanager-%s'.format(this.sid); + }, + + getOpkgPackage: function() { + return 'modemmanager'; + }, + + isFloating: function() { + return true; + }, + + isVirtual: function() { + return true; + }, + + getDevices: function() { + return null; + }, + + containsDevice: function(ifname) { + return (network.getIfnameOf(ifname) == this.getIfname()); + }, + + renderFormOptions: function(s) { + var dev = this.getL3Device() || this.getDevice(), o; + + o = s.taboption('general', form.ListValue, '_modem_device', _('Modem device')); + o.ucioption = 'device'; + o.rmempty = false; + o.load = function(section_id) { + return getModemList().then(L.bind(function(devices) { + for (var i = 0; i < devices.length; i++) + this.value(devices[i].device, + '%s - %s'.format(devices[i].manufacturer, devices[i].model)); + return form.Value.prototype.load.apply(this, [section_id]); + }, this)); + }; + + o = s.taboption('general', form.Value, 'apn', _('APN')); + o.validate = function(section_id, value) { + if (!/^[a-zA-Z0-9\-.]*[a-zA-Z0-9]$/.test(value)) + return _('Invalid APN provided'); + + return true; + }; + + o = s.taboption('general', form.Value, 'pincode', _('PIN')); + o.datatype = 'and(uinteger,minlength(4),maxlength(8))'; + + o = s.taboption('general', form.ListValue, 'auth', _('Authentication Type')); + o.value('both', _('PAP/CHAP (both)')); + o.value('pap', 'PAP'); + o.value('chap', 'CHAP'); + o.value('none', _('None')); + o.default = 'none'; + + o = s.taboption('general', form.Value, 'username', _('PAP/CHAP username')); + o.depends('auth', 'pap'); + o.depends('auth', 'chap'); + o.depends('auth', 'both'); + + o = s.taboption('general', form.Value, 'password', _('PAP/CHAP password')); + o.depends('auth', 'pap'); + o.depends('auth', 'chap'); + o.depends('auth', 'both'); + o.password = true; + + o = s.taboption('general', form.ListValue, 'iptype', _('IP Type')); + o.value('ipv4v6', _('IPv4/IPv6 (both - defaults to IPv4)')) + o.value('ipv4', _('IPv4 only')); + o.value('ipv6', _('IPv6 only')); + o.default = 'ipv4v6'; + + o = s.taboption('advanced', form.Value, 'mtu', _('Override MTU')); + o.placeholder = dev ? (dev.getMTU() || '1500') : '1500'; + o.datatype = 'max(9200)'; + + o = s.taboption('general', form.Value, 'signalrate', _('Signal Refresh Rate'), _("In seconds")); + o.datatype = 'uinteger'; + } +}); diff --git a/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json b/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json new file mode 100644 index 000000000..716f4c465 --- /dev/null +++ b/luci-proto-modemmanager/root/usr/share/rpcd/acl.d/luci-proto-modemmanager.json @@ -0,0 +1,12 @@ +{ + "luci-proto-modemmanager": { + "description": "Grant access to mmcli", + "read": { + "cgi-io": [ "exec" ], + "file": { + "/usr/bin/mmcli -L": [ "exec" ], + "/usr/bin/mmcli -m [0-9]": [ "exec" ] + } + } + } +} From 6f086660898b2679e3644bcb08fc438cf1c4417c Mon Sep 17 00:00:00 2001 From: suyuan168 <175338101@qq.com> Date: Tue, 4 Jan 2022 21:47:04 +0800 Subject: [PATCH 35/63] Update post-tracking --- mptcp/files/usr/share/omr/post-tracking.d/post-tracking | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking index db5096eb3..a085e6f41 100755 --- a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking +++ b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking @@ -1034,8 +1034,8 @@ if [ -n "$OMR_TRACKER_DEVICE_IP" ] && [ -n "$OMR_TRACKER_DEVICE_GATEWAY" ]; then config_foreach set_server_route server fi if [ -n "$OMR_TRACKER_DEVICE_GATEWAY" ] && [ -n "$OMR_TRACKER_DEVICE" ] && [ "$(ip r show dev $OMR_TRACKER_DEVICE | grep default)" = "" ] && [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.metric)" != "" ]; then - _log "Interface route not yet set, set route ip r replace default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE metric $(uci -q get network.$OMR_TRACKER_INTERFACE.metric)" - ip r replace default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE metric $(uci -q get network.$OMR_TRACKER_INTERFACE.metric) >/dev/null 2>&1 + _log "Interface route not yet set, set route ip r add default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE metric $(uci -q get network.$OMR_TRACKER_INTERFACE.metric)" + ip r add default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE metric $(uci -q get network.$OMR_TRACKER_INTERFACE.metric) >/dev/null 2>&1 fi fi if [ -n "$OMR_TRACKER_DEVICE_IP6" ] && [ -n "$OMR_TRACKER_DEVICE_GATEWAY6" ]; then From 6e94306e936fbad13d47f6cb4e3df937ce8ff487 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Wed, 5 Jan 2022 08:50:44 +0100 Subject: [PATCH 36/63] Fix on setting some routes --- mptcp/files/usr/share/omr/post-tracking.d/post-tracking | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking index 436dbfc3c..fd04c31bc 100755 --- a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking +++ b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking @@ -454,7 +454,7 @@ set_server_all_routes() { config_foreach set_routes_intf interface uintf="$(echo $routesintf | awk '{print $5}')" uintfb="$(echo $routesintfbackup | awk '{print $5}')" - if [ -n "$routesintf" ] && ([ "$nbintf" -gt "1" ] && [ "$(ip r show $serverip metric 1 | tr -d '\t' | sort | tr -d '\n' | sed 's/ *$//')" != "$(echo $serverip $routesintf | sort | sed 's/ *$//')" ]) || ([ "$nbintf" = "1" ] && [ -n "$uintf" ] && [ "$(ip r show $serverip metric 1 | grep $uintf)" = "" ]); then + if [ -n "$routesintf" ] && ([ "$nbintf" -gt "1" ] && [ "$(ip r show $serverip metric 1 | tr -d '\t' | tr -d '\n' | sed 's/ *$//' | tr ' ' '\n' | sort | tr -d '\n')" != "$(echo $serverip $routesintf | sed 's/ *$//' | tr ' ' '\n' | sort | tr -d '\n')" ]) || ([ "$nbintf" = "1" ] && [ -n "$uintf" ] && [ "$(ip r show $serverip metric 1 | grep $uintf)" = "" ]); then while [ "$(ip r show $serverip | grep -v nexthop | sed 's/ //g' | tr -d '\n')" != "$serverip" ] && [ "$(ip r show $serverip | grep -v nexthop | sed 's/ //g' | tr -d '\n')" != "" ]; do ip r del $serverip done @@ -462,7 +462,7 @@ set_server_all_routes() { ip route replace $serverip scope global metric 1 $routesintf 2>&1 >/dev/null [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "New server route is $(ip r show $serverip metric 1 | tr -d '\t' | tr -d '\n')" fi - if [ -n "$routesintfbackup" ] && ([ "$nbintfb" -gt "1" ] && [ "$(ip r show $serverip metric 999 | tr -d '\t' | tr -d '\n')" != "$serverip $routesintfbackup " ]) || ([ "$nbintfb" = "1" ] && [ -n "$uintfb" ] && [ "$(ip r show $serverip metric 999 | grep $uintfb)" = "" ]); then + if [ -n "$routesintfbackup" ] && ([ "$nbintfb" -gt "1" ] && [ "$(ip r show $serverip metric 999 | tr -d '\t' | tr -d '\n' | sed 's/ *$//' | tr ' ' '\n' | sort | tr -d '\n')" != "$(echo $serverip $routesintfbackup | sed 's/ *$//' | tr ' ' '\n' | sort | tr -d '\n')" ]) || ([ "$nbintfb" = "1" ] && [ -n "$uintfb" ] && [ "$(ip r show $serverip metric 999 | grep $uintfb)" = "" ]); then [ "$(uci -q get openmptcprouter.settings.debug)" = "true" ] && _log "Set server $server ($serverip) backup default route $serverip $routesintfbackup nbintfb $nbintfb $OMR_TRACKER_DEVICE" ip route replace $serverip scope global metric 999 $routesintfbackup 2>&1 >/dev/null fi @@ -1034,8 +1034,8 @@ if [ -n "$OMR_TRACKER_DEVICE_IP" ] && [ -n "$OMR_TRACKER_DEVICE_GATEWAY" ]; then config_foreach set_server_route server fi if [ -n "$OMR_TRACKER_DEVICE_GATEWAY" ] && [ -n "$OMR_TRACKER_DEVICE" ] && [ "$(ip r show dev $OMR_TRACKER_DEVICE | grep default)" = "" ] && [ "$(uci -q get network.$OMR_TRACKER_INTERFACE.metric)" != "" ]; then - _log "Interface route not yet set, set route ip r replace default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE metric $(uci -q get network.$OMR_TRACKER_INTERFACE.metric)" - ip r replace default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE metric $(uci -q get network.$OMR_TRACKER_INTERFACE.metric) >/dev/null 2>&1 + _log "Interface route not yet set, set route ip r add default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE metric $(uci -q get network.$OMR_TRACKER_INTERFACE.metric)" + ip r add default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE metric $(uci -q get network.$OMR_TRACKER_INTERFACE.metric) >/dev/null 2>&1 fi fi if [ -n "$OMR_TRACKER_DEVICE_IP6" ] && [ -n "$OMR_TRACKER_DEVICE_GATEWAY6" ]; then From 4b2ee656b7c8c0823724346dd0adf2902fc4ebc0 Mon Sep 17 00:00:00 2001 From: suyuan168 <175338101@qq.com> Date: Thu, 6 Jan 2022 02:24:26 +0800 Subject: [PATCH 37/63] add docker all feeds soft --- adbyby/Makefile | 76 ++ adbyby/files/adbyby.sh | 16 + adbyby/files/adhook.ini | 14 + adbyby/files/amd64/adbyby | Bin 0 -> 355252 bytes adbyby/files/arm/adbyby | Bin 0 -> 390964 bytes adbyby/files/armv7/adbyby | Bin 0 -> 832928 bytes adbyby/files/data/lazy.bin | Bin 0 -> 61328 bytes adbyby/files/data/lazy.txt | 25 + adbyby/files/data/rules.txt | 15 + adbyby/files/data/user.txt | 0 adbyby/files/data/video.txt | 30 + adbyby/files/doc/hidecss.js | 1 + adbyby/files/mips/adbyby | Bin 0 -> 365288 bytes adbyby/files/mipsle/adbyby | Bin 0 -> 381660 bytes adbyby/files/update.info | 10 + adbyby/files/user.action | 0 adbyby/files/x86/adbyby | Bin 0 -> 353660 bytes luci-app-adbyby-plus/Makefile | 17 + .../luasrc/controller/adbyby.lua | 86 ++ .../luasrc/model/cbi/adbyby/advanced.lua | 57 + .../luasrc/model/cbi/adbyby/base.lua | 66 + .../luasrc/model/cbi/adbyby/black.lua | 23 + .../luasrc/model/cbi/adbyby/block.lua | 23 + .../luasrc/model/cbi/adbyby/esc.lua | 23 + .../luasrc/model/cbi/adbyby/help.lua | 23 + .../luasrc/model/cbi/adbyby/user.lua | 23 + .../luasrc/view/adbyby/adbyby_status.htm | 22 + .../luasrc/view/adbyby/refresh.htm | 35 + luci-app-adbyby-plus/po/zh-cn/adbyby.po | 198 +++ luci-app-adbyby-plus/root/etc/config/adbyby | 11 + luci-app-adbyby-plus/root/etc/init.d/adbyby | 254 ++++ .../root/etc/uci-defaults/luci-adbyby | 30 + .../root/lib/upgrade/keep.d/adbyby | 6 + .../root/usr/share/adbyby/ad-update | 11 + .../root/usr/share/adbyby/adblack.conf | 14 + .../root/usr/share/adbyby/adblock.sh | 10 + .../root/usr/share/adbyby/adbybyfirst.sh | 4 + .../root/usr/share/adbyby/adbybyupdate.sh | 49 + .../root/usr/share/adbyby/adesc.conf | 3 + .../root/usr/share/adbyby/adhost.conf | 68 + .../root/usr/share/adbyby/admem.sh | 46 + .../root/usr/share/adbyby/adupdate.sh | 30 + .../root/usr/share/adbyby/blockip.conf | 1 + .../root/usr/share/adbyby/dnsmasq.adblock | 0 .../root/usr/share/adbyby/dnsmasq.ads | 4 + .../root/usr/share/adbyby/dnsmasq.esc | 3 + .../root/usr/share/adbyby/firewall.include | 16 + .../root/usr/share/adbyby/rule-count | 3 + .../root/usr/share/adbyby/rule-update | 36 + .../root/usr/share/adbyby/rules.txt | 15 + luci-app-docker/Makefile | 17 + luci-app-docker/luasrc/controller/docker.lua | 17 + luci-app-docker/luasrc/model/cbi/docker.lua | 23 + .../luasrc/view/docker/docker_status.htm | 22 + luci-app-docker/po/zh-cn/docker.po | 39 + luci-app-docker/root/etc/config/dockerd | 3 + luci-app-docker/root/etc/docker-init | 26 + luci-app-docker/root/etc/docker-web | 3 + luci-app-docker/root/etc/docker/daemon.json | 4 + luci-app-docker/root/etc/init.d/dockerd | 22 + .../root/etc/uci-defaults/luci-docker | 11 + luci-app-docker/root/www/DockerReadme.pdf | Bin 0 -> 702346 bytes luci-app-dockerman/Makefile | 30 + .../resources/dockerman/containers.svg | 7 + .../resources/dockerman/file-icon.png | Bin 0 -> 1098 bytes .../resources/dockerman/file-manager.css | 91 ++ .../resources/dockerman/folder-icon.png | Bin 0 -> 1292 bytes .../resources/dockerman/images.svg | 9 + .../resources/dockerman/link-icon.png | Bin 0 -> 1622 bytes .../resources/dockerman/networks.svg | 12 + .../resources/dockerman/tar.min.js | 185 +++ .../resources/dockerman/volumes.svg | 6 + .../luasrc/controller/dockerman.lua | 620 ++++++++++ .../model/cbi/dockerman/configuration.lua | 152 +++ .../luasrc/model/cbi/dockerman/container.lua | 802 ++++++++++++ .../luasrc/model/cbi/dockerman/containers.lua | 284 +++++ .../luasrc/model/cbi/dockerman/images.lua | 284 +++++ .../luasrc/model/cbi/dockerman/networks.lua | 159 +++ .../model/cbi/dockerman/newcontainer.lua | 911 ++++++++++++++ .../luasrc/model/cbi/dockerman/newnetwork.lua | 258 ++++ .../luasrc/model/cbi/dockerman/overview.lua | 151 +++ .../luasrc/model/cbi/dockerman/volumes.lua | 143 +++ luci-app-dockerman/luasrc/model/docker.lua | 504 ++++++++ .../luasrc/view/dockerman/apply_widget.htm | 147 +++ .../view/dockerman/cbi/inlinebutton.htm | 7 + .../luasrc/view/dockerman/cbi/inlinevalue.htm | 33 + .../view/dockerman/cbi/namedsection.htm | 9 + .../luasrc/view/dockerman/cbi/xfvalue.htm | 10 + .../luasrc/view/dockerman/container.htm | 28 + .../view/dockerman/container_console.htm | 6 + .../view/dockerman/container_file_manager.htm | 331 +++++ .../luasrc/view/dockerman/container_stats.htm | 81 ++ .../dockerman/containers_running_stats.htm | 91 ++ .../luasrc/view/dockerman/images_import.htm | 104 ++ .../luasrc/view/dockerman/images_load.htm | 40 + .../luasrc/view/dockerman/logs.htm | 13 + .../view/dockerman/newcontainer_resolve.htm | 102 ++ .../luasrc/view/dockerman/overview.htm | 197 +++ .../luasrc/view/dockerman/volume_size.htm | 21 + luci-app-dockerman/po/zh-cn/dockerman.po | 1094 +++++++++++++++++ luci-app-dockerman/root/etc/init.d/dockerman | 131 ++ .../root/etc/uci-defaults/luci-app-dockerman | 36 + luci-app-netdata/Makefile | 16 + .../luasrc/controller/netdata.lua | 6 + .../luasrc/view/netdata/netdata.htm | 9 + luci-app-netdata/po/zh-cn/netdata.po | 5 + luci-app-samba4/Makefile | 10 + luci-app-samba4/luasrc/controller/samba4.lua | 11 + luci-app-samba4/luasrc/model/cbi/samba4.lua | 112 ++ luci-app-samba4/po/ca/samba4.po | 170 +++ luci-app-samba4/po/cs/samba4.po | 158 +++ luci-app-samba4/po/de/samba4.po | 165 +++ luci-app-samba4/po/el/samba4.po | 147 +++ luci-app-samba4/po/en/samba4.po | 157 +++ luci-app-samba4/po/es/samba4.po | 167 +++ luci-app-samba4/po/fr/samba4.po | 159 +++ luci-app-samba4/po/he/samba4.po | 142 +++ luci-app-samba4/po/hu/samba4.po | 159 +++ luci-app-samba4/po/it/samba4.po | 165 +++ luci-app-samba4/po/ja/samba4.po | 158 +++ luci-app-samba4/po/ms/samba4.po | 141 +++ luci-app-samba4/po/no/samba4.po | 147 +++ luci-app-samba4/po/pl/samba4.po | 158 +++ luci-app-samba4/po/pt-br/samba4.po | 172 +++ luci-app-samba4/po/pt/samba4.po | 168 +++ luci-app-samba4/po/ro/samba4.po | 157 +++ luci-app-samba4/po/ru/samba4.po | 166 +++ luci-app-samba4/po/sk/samba4.po | 142 +++ luci-app-samba4/po/sv/samba4.po | 150 +++ luci-app-samba4/po/templates/samba4.pot | 135 ++ luci-app-samba4/po/tr/samba4.po | 142 +++ luci-app-samba4/po/uk/samba4.po | 159 +++ luci-app-samba4/po/vi/samba4.po | 171 +++ luci-app-samba4/po/zh-cn/samba4.po | 164 +++ luci-app-samba4/po/zh-tw/samba4.po | 164 +++ luci-app-usb-printer/Makefile | 17 + luci-app-usb-printer/ipkg/postinst | 6 + .../luasrc/controller/usb_printer.lua | 26 + .../luasrc/model/cbi/usb_printer.lua | 130 ++ luci-app-usb-printer/po/zh-cn/usb-printer.po | 65 + .../root/etc/config/usb_printer | 0 .../root/etc/hotplug.d/usb/10-usb_printer | 7 + .../root/etc/init.d/usb_printer | 22 + .../root/etc/uci-defaults/luci-usb-printer | 12 + luci-app-usb-printer/root/usr/bin/detectlp | 20 + .../root/usr/bin/usb_printer_hotplug | 72 ++ luci-app-xlnetacc/Makefile | 19 + .../luasrc/controller/xlnetacc.lua | 36 + .../luasrc/model/cbi/xlnetacc.lua | 57 + .../luasrc/view/xlnetacc/logview.htm | 49 + .../luasrc/view/xlnetacc/xlnetacc_status.htm | 21 + luci-app-xlnetacc/po/zh-cn/xlnetacc.po | 116 ++ luci-app-xlnetacc/root/etc/config/xlnetacc | 5 + .../root/etc/hotplug.d/iface/95-xlnetacc | 13 + luci-app-xlnetacc/root/etc/init.d/xlnetacc | 49 + .../root/etc/uci-defaults/luci-xlnetacc | 6 + luci-app-xlnetacc/root/usr/bin/xlnetacc.sh | 609 +++++++++ .../share/rpcd/acl.d/luci-app-xlnetacc.json | 11 + luci-app-zerotier/Makefile | 17 + .../luasrc/controller/zerotier.lua | 23 + .../luasrc/model/cbi/zerotier/info.lua | 15 + .../luasrc/model/cbi/zerotier/settings.lua | 27 + .../luasrc/view/zerotier/zerotier_status.htm | 22 + luci-app-zerotier/po/zh-cn/zerotier.po | 25 + luci-app-zerotier/root/etc/init.d/zerotier | 113 ++ .../root/etc/uci-defaults/40_luci-zerotier | 17 + luci-app-zerotier/root/etc/zerotier.start | 28 + luci-app-zerotier/root/etc/zerotier.stop | 15 + .../root/etc/zerotier/zerotier.log | 0 .../share/rpcd/acl.d/luci-app-zerotier.json | 11 + luci-lib-docker/Makefile | 19 + luci-lib-docker/luasrc/docker.lua | 453 +++++++ luci-lib-fs/Makefile | 49 + luci-lib-fs/files/fs.lua | 244 ++++ nps/Makefile | 87 ++ .../100-remove-useless-sdk-in-npc.patch | 4 + openwrt-fullconenat/Makefile | 66 + openwrt-fullconenat/files/Makefile | 6 + 178 files changed, 15534 insertions(+) create mode 100644 adbyby/Makefile create mode 100755 adbyby/files/adbyby.sh create mode 100644 adbyby/files/adhook.ini create mode 100755 adbyby/files/amd64/adbyby create mode 100755 adbyby/files/arm/adbyby create mode 100755 adbyby/files/armv7/adbyby create mode 100644 adbyby/files/data/lazy.bin create mode 100644 adbyby/files/data/lazy.txt create mode 100644 adbyby/files/data/rules.txt create mode 100644 adbyby/files/data/user.txt create mode 100644 adbyby/files/data/video.txt create mode 100644 adbyby/files/doc/hidecss.js create mode 100755 adbyby/files/mips/adbyby create mode 100755 adbyby/files/mipsle/adbyby create mode 100644 adbyby/files/update.info create mode 100644 adbyby/files/user.action create mode 100755 adbyby/files/x86/adbyby create mode 100644 luci-app-adbyby-plus/Makefile create mode 100644 luci-app-adbyby-plus/luasrc/controller/adbyby.lua create mode 100644 luci-app-adbyby-plus/luasrc/model/cbi/adbyby/advanced.lua create mode 100644 luci-app-adbyby-plus/luasrc/model/cbi/adbyby/base.lua create mode 100644 luci-app-adbyby-plus/luasrc/model/cbi/adbyby/black.lua create mode 100644 luci-app-adbyby-plus/luasrc/model/cbi/adbyby/block.lua create mode 100644 luci-app-adbyby-plus/luasrc/model/cbi/adbyby/esc.lua create mode 100644 luci-app-adbyby-plus/luasrc/model/cbi/adbyby/help.lua create mode 100644 luci-app-adbyby-plus/luasrc/model/cbi/adbyby/user.lua create mode 100644 luci-app-adbyby-plus/luasrc/view/adbyby/adbyby_status.htm create mode 100644 luci-app-adbyby-plus/luasrc/view/adbyby/refresh.htm create mode 100644 luci-app-adbyby-plus/po/zh-cn/adbyby.po create mode 100644 luci-app-adbyby-plus/root/etc/config/adbyby create mode 100755 luci-app-adbyby-plus/root/etc/init.d/adbyby create mode 100755 luci-app-adbyby-plus/root/etc/uci-defaults/luci-adbyby create mode 100644 luci-app-adbyby-plus/root/lib/upgrade/keep.d/adbyby create mode 100755 luci-app-adbyby-plus/root/usr/share/adbyby/ad-update create mode 100644 luci-app-adbyby-plus/root/usr/share/adbyby/adblack.conf create mode 100755 luci-app-adbyby-plus/root/usr/share/adbyby/adblock.sh create mode 100755 luci-app-adbyby-plus/root/usr/share/adbyby/adbybyfirst.sh create mode 100755 luci-app-adbyby-plus/root/usr/share/adbyby/adbybyupdate.sh create mode 100644 luci-app-adbyby-plus/root/usr/share/adbyby/adesc.conf create mode 100644 luci-app-adbyby-plus/root/usr/share/adbyby/adhost.conf create mode 100755 luci-app-adbyby-plus/root/usr/share/adbyby/admem.sh create mode 100755 luci-app-adbyby-plus/root/usr/share/adbyby/adupdate.sh create mode 100644 luci-app-adbyby-plus/root/usr/share/adbyby/blockip.conf create mode 100644 luci-app-adbyby-plus/root/usr/share/adbyby/dnsmasq.adblock create mode 100644 luci-app-adbyby-plus/root/usr/share/adbyby/dnsmasq.ads create mode 100644 luci-app-adbyby-plus/root/usr/share/adbyby/dnsmasq.esc create mode 100755 luci-app-adbyby-plus/root/usr/share/adbyby/firewall.include create mode 100755 luci-app-adbyby-plus/root/usr/share/adbyby/rule-count create mode 100755 luci-app-adbyby-plus/root/usr/share/adbyby/rule-update create mode 100644 luci-app-adbyby-plus/root/usr/share/adbyby/rules.txt create mode 100644 luci-app-docker/Makefile create mode 100644 luci-app-docker/luasrc/controller/docker.lua create mode 100644 luci-app-docker/luasrc/model/cbi/docker.lua create mode 100644 luci-app-docker/luasrc/view/docker/docker_status.htm create mode 100644 luci-app-docker/po/zh-cn/docker.po create mode 100644 luci-app-docker/root/etc/config/dockerd create mode 100755 luci-app-docker/root/etc/docker-init create mode 100755 luci-app-docker/root/etc/docker-web create mode 100644 luci-app-docker/root/etc/docker/daemon.json create mode 100755 luci-app-docker/root/etc/init.d/dockerd create mode 100755 luci-app-docker/root/etc/uci-defaults/luci-docker create mode 100644 luci-app-docker/root/www/DockerReadme.pdf create mode 100644 luci-app-dockerman/Makefile create mode 100644 luci-app-dockerman/htdocs/luci-static/resources/dockerman/containers.svg create mode 100644 luci-app-dockerman/htdocs/luci-static/resources/dockerman/file-icon.png create mode 100644 luci-app-dockerman/htdocs/luci-static/resources/dockerman/file-manager.css create mode 100644 luci-app-dockerman/htdocs/luci-static/resources/dockerman/folder-icon.png create mode 100644 luci-app-dockerman/htdocs/luci-static/resources/dockerman/images.svg create mode 100644 luci-app-dockerman/htdocs/luci-static/resources/dockerman/link-icon.png create mode 100644 luci-app-dockerman/htdocs/luci-static/resources/dockerman/networks.svg create mode 100644 luci-app-dockerman/htdocs/luci-static/resources/dockerman/tar.min.js create mode 100644 luci-app-dockerman/htdocs/luci-static/resources/dockerman/volumes.svg create mode 100644 luci-app-dockerman/luasrc/controller/dockerman.lua create mode 100644 luci-app-dockerman/luasrc/model/cbi/dockerman/configuration.lua create mode 100644 luci-app-dockerman/luasrc/model/cbi/dockerman/container.lua create mode 100644 luci-app-dockerman/luasrc/model/cbi/dockerman/containers.lua create mode 100644 luci-app-dockerman/luasrc/model/cbi/dockerman/images.lua create mode 100644 luci-app-dockerman/luasrc/model/cbi/dockerman/networks.lua create mode 100644 luci-app-dockerman/luasrc/model/cbi/dockerman/newcontainer.lua create mode 100644 luci-app-dockerman/luasrc/model/cbi/dockerman/newnetwork.lua create mode 100644 luci-app-dockerman/luasrc/model/cbi/dockerman/overview.lua create mode 100644 luci-app-dockerman/luasrc/model/cbi/dockerman/volumes.lua create mode 100644 luci-app-dockerman/luasrc/model/docker.lua create mode 100644 luci-app-dockerman/luasrc/view/dockerman/apply_widget.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/cbi/inlinebutton.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/cbi/inlinevalue.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/cbi/namedsection.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/cbi/xfvalue.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/container.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/container_console.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/container_file_manager.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/container_stats.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/containers_running_stats.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/images_import.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/images_load.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/logs.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/newcontainer_resolve.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/overview.htm create mode 100644 luci-app-dockerman/luasrc/view/dockerman/volume_size.htm create mode 100644 luci-app-dockerman/po/zh-cn/dockerman.po create mode 100755 luci-app-dockerman/root/etc/init.d/dockerman create mode 100755 luci-app-dockerman/root/etc/uci-defaults/luci-app-dockerman create mode 100644 luci-app-netdata/Makefile create mode 100644 luci-app-netdata/luasrc/controller/netdata.lua create mode 100644 luci-app-netdata/luasrc/view/netdata/netdata.htm create mode 100644 luci-app-netdata/po/zh-cn/netdata.po create mode 100644 luci-app-samba4/Makefile create mode 100644 luci-app-samba4/luasrc/controller/samba4.lua create mode 100644 luci-app-samba4/luasrc/model/cbi/samba4.lua create mode 100644 luci-app-samba4/po/ca/samba4.po create mode 100644 luci-app-samba4/po/cs/samba4.po create mode 100644 luci-app-samba4/po/de/samba4.po create mode 100644 luci-app-samba4/po/el/samba4.po create mode 100644 luci-app-samba4/po/en/samba4.po create mode 100644 luci-app-samba4/po/es/samba4.po create mode 100644 luci-app-samba4/po/fr/samba4.po create mode 100644 luci-app-samba4/po/he/samba4.po create mode 100644 luci-app-samba4/po/hu/samba4.po create mode 100644 luci-app-samba4/po/it/samba4.po create mode 100644 luci-app-samba4/po/ja/samba4.po create mode 100644 luci-app-samba4/po/ms/samba4.po create mode 100644 luci-app-samba4/po/no/samba4.po create mode 100644 luci-app-samba4/po/pl/samba4.po create mode 100644 luci-app-samba4/po/pt-br/samba4.po create mode 100644 luci-app-samba4/po/pt/samba4.po create mode 100644 luci-app-samba4/po/ro/samba4.po create mode 100644 luci-app-samba4/po/ru/samba4.po create mode 100644 luci-app-samba4/po/sk/samba4.po create mode 100644 luci-app-samba4/po/sv/samba4.po create mode 100644 luci-app-samba4/po/templates/samba4.pot create mode 100644 luci-app-samba4/po/tr/samba4.po create mode 100644 luci-app-samba4/po/uk/samba4.po create mode 100644 luci-app-samba4/po/vi/samba4.po create mode 100644 luci-app-samba4/po/zh-cn/samba4.po create mode 100644 luci-app-samba4/po/zh-tw/samba4.po create mode 100644 luci-app-usb-printer/Makefile create mode 100755 luci-app-usb-printer/ipkg/postinst create mode 100644 luci-app-usb-printer/luasrc/controller/usb_printer.lua create mode 100644 luci-app-usb-printer/luasrc/model/cbi/usb_printer.lua create mode 100644 luci-app-usb-printer/po/zh-cn/usb-printer.po create mode 100644 luci-app-usb-printer/root/etc/config/usb_printer create mode 100755 luci-app-usb-printer/root/etc/hotplug.d/usb/10-usb_printer create mode 100755 luci-app-usb-printer/root/etc/init.d/usb_printer create mode 100755 luci-app-usb-printer/root/etc/uci-defaults/luci-usb-printer create mode 100755 luci-app-usb-printer/root/usr/bin/detectlp create mode 100755 luci-app-usb-printer/root/usr/bin/usb_printer_hotplug create mode 100644 luci-app-xlnetacc/Makefile create mode 100644 luci-app-xlnetacc/luasrc/controller/xlnetacc.lua create mode 100644 luci-app-xlnetacc/luasrc/model/cbi/xlnetacc.lua create mode 100644 luci-app-xlnetacc/luasrc/view/xlnetacc/logview.htm create mode 100644 luci-app-xlnetacc/luasrc/view/xlnetacc/xlnetacc_status.htm create mode 100644 luci-app-xlnetacc/po/zh-cn/xlnetacc.po create mode 100644 luci-app-xlnetacc/root/etc/config/xlnetacc create mode 100755 luci-app-xlnetacc/root/etc/hotplug.d/iface/95-xlnetacc create mode 100755 luci-app-xlnetacc/root/etc/init.d/xlnetacc create mode 100755 luci-app-xlnetacc/root/etc/uci-defaults/luci-xlnetacc create mode 100755 luci-app-xlnetacc/root/usr/bin/xlnetacc.sh create mode 100644 luci-app-xlnetacc/root/usr/share/rpcd/acl.d/luci-app-xlnetacc.json create mode 100644 luci-app-zerotier/Makefile create mode 100644 luci-app-zerotier/luasrc/controller/zerotier.lua create mode 100644 luci-app-zerotier/luasrc/model/cbi/zerotier/info.lua create mode 100644 luci-app-zerotier/luasrc/model/cbi/zerotier/settings.lua create mode 100644 luci-app-zerotier/luasrc/view/zerotier/zerotier_status.htm create mode 100644 luci-app-zerotier/po/zh-cn/zerotier.po create mode 100755 luci-app-zerotier/root/etc/init.d/zerotier create mode 100755 luci-app-zerotier/root/etc/uci-defaults/40_luci-zerotier create mode 100755 luci-app-zerotier/root/etc/zerotier.start create mode 100755 luci-app-zerotier/root/etc/zerotier.stop create mode 100644 luci-app-zerotier/root/etc/zerotier/zerotier.log create mode 100644 luci-app-zerotier/root/usr/share/rpcd/acl.d/luci-app-zerotier.json create mode 100644 luci-lib-docker/Makefile create mode 100644 luci-lib-docker/luasrc/docker.lua create mode 100644 luci-lib-fs/Makefile create mode 100644 luci-lib-fs/files/fs.lua create mode 100644 nps/Makefile create mode 100644 nps/patches/100-remove-useless-sdk-in-npc.patch create mode 100644 openwrt-fullconenat/Makefile create mode 100644 openwrt-fullconenat/files/Makefile diff --git a/adbyby/Makefile b/adbyby/Makefile new file mode 100644 index 000000000..831dcb5b6 --- /dev/null +++ b/adbyby/Makefile @@ -0,0 +1,76 @@ +# +# Copyright (C) 2015-2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v3. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=adbyby +PKG_VERSION:=2.7 +PKG_RELEASE:=20200315 + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + SECTION:=net + CATEGORY:=Network + TITLE:=Powerful adblock module to block ad. + DEPENDS:=@(i386||x86_64||arm||mipsel||mips||aarch64) + URL:=http://www.adbyby.com/ +endef + +define Package/$(PKG_NAME)/description +Adbyby is a powerful adblock module to block ad,just like adblock. +endef + +ifeq ($(ARCH),x86_64) + ADBYBY_DIR:=amd64 +endif +ifeq ($(ARCH),mipsel) + ADBYBY_DIR:=mipsle +endif +ifeq ($(ARCH),mips) + ADBYBY_DIR:=mips +endif +ifeq ($(ARCH),i386) + ADBYBY_DIR:=x86 +endif +ifeq ($(ARCH),arm) + ADBYBY_DIR:=armv7 + ifeq ($(BOARD),bcm53xx) + ADBYBY_DIR:=arm + endif + ifeq ($(BOARD),kirkwood) + ADBYBY_DIR:=arm + endif +endif +ifeq ($(ARCH),aarch64) + ADBYBY_DIR:=armv7 +endif + +define Build/Prepare +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/$(PKG_NAME)/install + $(INSTALL_DIR) $(1)/usr/share/adbyby + $(INSTALL_BIN) ./files/adbyby.sh $(1)/usr/share/adbyby/ + $(INSTALL_CONF) ./files/adhook.ini $(1)/usr/share/adbyby/ + $(INSTALL_CONF) ./files/user.action $(1)/usr/share/adbyby/ + + $(INSTALL_DIR) $(1)/usr/share/adbyby/data + $(INSTALL_DATA) ./files/data/* $(1)/usr/share/adbyby/data/ + + $(INSTALL_DIR) $(1)/usr/share/adbyby/doc + $(INSTALL_DATA) ./files/doc/* $(1)/usr/share/adbyby/doc/ + + $(INSTALL_BIN) ./files/$(ADBYBY_DIR)/adbyby $(1)/usr/share/adbyby/adbyby +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/adbyby/files/adbyby.sh b/adbyby/files/adbyby.sh new file mode 100755 index 000000000..146a070d1 --- /dev/null +++ b/adbyby/files/adbyby.sh @@ -0,0 +1,16 @@ +#!/bin/sh +PROG_PATH=/usr/share/adbyby +err=0 +until [ $err -ge 5 ]; do + if [ -n "$(pgrep $PROG_PATH/adbyby)" ]; then + iptables-save | grep ADBYBY >/dev/null || \ + /etc/init.d/adbyby add_rule + sleep 10 + err=0 + else + $PROG_PATH/adbyby --no-daemon &>/dev/null & + sleep 1 + err=$((err+1)) + fi +done +/etc/init.d/adbyby del_rule diff --git a/adbyby/files/adhook.ini b/adbyby/files/adhook.ini new file mode 100644 index 000000000..6a7613ea8 --- /dev/null +++ b/adbyby/files/adhook.ini @@ -0,0 +1,14 @@ +[cfg] +### 2.1 ### +listen-address=0.0.0.0:8118 +buffer-limit=1024 +keep-alive-timeout=30 +socket-timeout=60 +### 2.5 ### +max_client_connections=0 +### 2.6 ### +stack_size=200 +auto_restart=0 +### 2.7 ### +debug=0 +ipset=0 diff --git a/adbyby/files/amd64/adbyby b/adbyby/files/amd64/adbyby new file mode 100755 index 0000000000000000000000000000000000000000..76c8fa08403042bdf588ffff0d96757215546145 GIT binary patch literal 355252 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ÖkI8IOJFs&ETUoX$>%kTL`d~eUT9;CAifg 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%0AxoqIZM z^CFz2?E!2|H18h^oK}f&HOfU~nE106%L3=lP2q{gIAMnTDsjm`c$~i^F<=WoQ{lVR zJTGEBbm?@R&{>0}8VP44amO`eKsWvCLY>(x=DvAsjfB5=7lHG`qClnDaB1dGL#ai4 zD69){c&XI*YRvFnz7SnSVCKT=;`YV#45P)Unm?FZXVx;C4DmM=MGR4DQx>({gUb2? zJ77&B*+uy7C#@~O(NXumBI|qScU42t{4h-R*a)dQR{qEvSM@G3eZA#@$Q{PGif|p0 zG%>?ILF4V_8<(YpNG&|tYb=qIzurVo4&j+6sWi0F+!*WQq|8uz$Lz%bH$ce0bVH2E z%`v}hBxp^3aByI)rs$cLH9d`E#QD$yr2x=o@84D@#jOQqHn20Cg+ZqZ%Y0x!Zd`jlM_!}FBmQSQSsl~K>!eP<& zCSG3A&wSVuN45nUBS%yb zS|`1t(NkefJbYL)V-Pe8IB5P)w0W<+7k9(&A2UkV0!w-SCp~{Z8sOmLl)QnFl6o*#_yY9_ zKJU0T*o~$WH$N0MWGJHtcm%yb*}Rug4>?h1{ zjWf=#rNm6B^}t>n#sG8P2BQy~0JpEo6uE1Hh*1N!$0JM9W1temj=F}+M)dw$(-RW- zb~|59oKWOfj2s7(X^Lw?mFOLM$kTtd5D|=(K%fP+0sViX99-08pQ9wzv)#I`0NK6} zo<6e^3Dsqq#05=Oq2BkO{_x*)eQV&)VTW8%0U99*nNM`1iL5`Ac^me+s@sWAM)+cl zB&{kb*r1@3_*IPou5r``Y@`I%PK_h4jIwif6dt9|r;rCrf2-$(>Fhm-8#b%ah^B$? zU&8#4=Q%qqXV%hYJ6}4(4@^>uO?l#JZb=yH@=`ftd+TD+K47L%l(3xr9J7cT< zVNR)kWnYdN_ElTDiaujsR1LToUoNexU z5#dO&mkPrnr@!yawC1ioc)yI7p5rC+yi543{%}^cW}`7HrL|moM49@muNYMfMrfdI z9s-2k*~z~J0TyzNY7fnR5RB zuI=lnw%73ZTVd1w9SD^Nk8d#{mkL@_KDR?JHTYpO1qeNF>GMKFt7k;h7eFv2aZcG1 zn{Hy(Ouz!3>S$mZ{u`<0%I`kwBEpu=7sYqqEmqcuZ5ezGY&`Tw*oWdWV@|pbq{MLu zeZ5;&JOg+ANCa6985B=CXr!nEPi}?6j$e?jp+G2LHm;-nLW7%^s$vw7q@PkZH66`W zp318`9$N-YGBXrkWu+>c=)fJ0Wl|{E=`KwM%ZnQ#tD$4>Ts~;d@_BC-{!X0snv|OM z1l0v(#z}L$H|}Go8pl0!GZq^QWyqC0G3ULHO*Tx?sM@SW!LgFTJY;NaaAiG&)hrbV z-i5f>_1Hsoh4TMqjQIsugnq_t72t$&5oAS-pd_NA)Hp8>yc+fAujU$!INco5QD@*S z;O)W02n;%V_54(lK8AyQR1TAR42Ow>hSoVplzb#Q^L^CePi8Sl9@-9I;ND(_Y95dD zNit$7l^pt3H*4NxCPa1p(B02X*e`Yt zSI?&e5-@Bww^xfz#h;bPfi^AV}2JVd>(`9a4N&I?0_MDY@>}IZUIgUjxWwc!!1Kp`gy(`Gq+E@Nls{ zN8xvz+9HURT7@?bJwx$7KRvjI)VYNzOg^4Ws_9t47k`W}F zh-<7i^9}z9)Cej5f*+#hZhDVS_0Kn_LBOUJ?xy&1t_61dsAD2FPaIVGc^QQMeoWbU zrRhrsX5!V@?0jcfDEcL(LTkP+ zDrBP_j$^8Y-{3Qu`Kwq@%gPkZ?D}6FCzaa1%j=d!?{j!^EN=Cm) zngMlW1;fvB^c>zbBqdAK{M1OB6fC`8r+$a9jvun{<$YT)q*~~OGzgVALjiFDBNjV* zk#mN{MQwAms2|c+Bsl#h8$nwHvV63uxcp%Q7E8-V4%_2*N_s1no0r;L7Zg&<$%yU^ z7!*>LuK)=Z8_yarDIuMC8=rY}W&uqcLqd5Mpko*BbQgpdkV2xaNhjb{T{{6x1f(dV z_n^;(F9IS+8NnPr7^bD+JF2{h@P>>n+?c@Ec1NnKl+R|&UWISaOBwSiO{XnYl798{ z>M95{>ZH9dzuElOByO_o#qrwaE@s_LM&l_d!hbD5p3~fjUsoFS9xEl$CHlsOK7rf6 z!4Bv!a}}?7464;qGFuWMyv>-Q3)_GVkx4<2DKOA9+cqf3bFWq*`W-1{W6`2z3J*qk zozRDiCDoxf*KTrL>8LMyr6E1bw9SYY$Bi1Wef_(?CG~TVYx9Mdy-Mhp_ygY}hxF!@ zxaJv$Q~Km^I~PXsRr=%2MwLX!d36MR2@jg98!2&!@9ld;lL>~MqNM~08)+rsHpOb8D_^L$H@0 z=`Rk}Ukm~*$X%@&APnVL(luRe*G6Lhq?oO=eYgaT_$zpzj{vvmn~^+`9002xNadPJ zVPFd>HAZe@7-<|v?-3dig9FQdNDJi*jNiLvAUH5{}wIiZxr>%6?_jSl9@$I?MLBMuq%6+cn*&7<($;BA5JzHL`r zunmUshBsjXA?H(0dhJ2*dqT|7Q!!sf{EX3-5_vgykOslIN7if76s~%bW zN(7a#^;jyLkrUV|(Z;}kCS@%lE|-!r4+fZ^ReZTpu)l}8yoB_2vt9lh7}xJ-_K^G| z?jHf!vthwca`zlc{+WXmT3|d%m+8DsOnXI(4(1Ue5u|FW=AR9XvsbuPEcE!K-en{e z=xx%nTC#k4Rk!|K>Vzd00P`f|-Cx>7XdYXqae`T|?d#~myn~TAsDyoca0}(fs63=6 z+Xs$B77^(RU~`P_ielMe#9Pu#}Bl^Lv>b>hweX2Y;@($ptGF zMZ0@oq#m$-moBEdO4;^bA$oIzo6`Z>hKog+G!gNJS=Ro8dVFZ`is9~zLA-&iPe1`Y zomt(gS$*s|Eo9J{4U9LPliU?|u?z!rT(ApLL?C;lK}FWSeL5Sr#d-cW-Yanh+j=V& zXentPG54Srv3ui2UtcIq(AGfP@*Uv9?D|@vD<+-a*ti7}OU4@nhn<&P1RAV?g>7|C zVUn*(Bsx6Wja_0p~Z9+d3P}Cve*l*}Y9y z-~34Oo+BY%9Q}XV@uOb=dca*e&bVM71&5L4T_9?pLlW<>Vu3bBmes$`d7yqmGw2so zmqI0lAAERKY%LJ8)`UDgjWLcf%yu>As>?k`&!uA;|MGf8R}Y7z{p%J?K-fMcL%!FN z38HKLY|p}+juEqPnz8`bge<5>t!HJpMmQw(OM)H7-~);M?SuWBkg3c%3ZA~mf5NN@F7 z7oZ4oiTYW>fyk-&yILdmX+uIMxz*IMdJPF%^h8&B#XxG` z(fP%x=AB2LOyF`=)hDUxPVnBJ{!r7VMW|KY{EjsF;yPOTT)_L8KJ{qTmb(Vs9pP)@ zO+e`tC%IyK9&|#b7fmXU7IJ)@m;fT?=f-1IVYbPTME-imU~9p2k6G!gwNk!9@D6T| zhwHoQ!Y;~=YMTskE2F|VNTStV`Z?zTq-|G(HL|wQ*&oK!+`9w11yq73yIIV2HHp5o zN53mk+eEkhSLC}vYlX*z{dmm|ZRZAor@a~VK9v+ndGe0j^9wZh2~{2%zrb-DV_F==%gK#YDE|q(p$esW0k3z92D*`gbdNT3>DCA;0%I3+!7=-+RV6!gMMDZXqaT zy7<+`;N3yeOiM0&Re$zqa+jBxI?crL^4q#bwsG(3i5_?Rg$;dL%6~9{cy6iIXt_Xj zOXh5C>PaY+SUu=5ex3C^pblcSMP&ptGo@B%kRXRTrumPnUv5!Vo{LetG=E7Zu#oCF z4c<{9X&*ha8TuqiU}T@+wzh2yS)^wd1689~_V11;Y`t%U9T2{`!xs~(a8Y(Z9Y;5v z;AEX{kNBpc+`AdTm>>-}t|^nK0{LJj!*L7~@=mlGCnu^!cNSN_RrzV)8Lcdm+kTcE z36ni}W^l9!e5XZ-F4<4h{x*t31_4rvR5F8wzIsCT^3&y4)BVm5lxA+HCN(tj8iI## z4@N#FG?g6`xQb?1j_Q*8EXTLLJW=o>A`>zhv5n@ji93b%xOrw0XDU$oTSafif64V* zZ4o_=*P(HvuT>nTPa`38bE?-!=Wr-v(nYt|hh?$`?RB|I;qv322j&C?A@qU|Obw`P zDLOH1nkfNadqI@Y9)wP~qO-?zI6kn{#vqN)(BmilCDVzo( zyGG`Mz6XI8%KCSg_bIZpMxE1S}Zfe=5imC7Azne@Q*Vciax8aYA?27JNWv6TmZ&vYw_QH%}r(I(=9XmTb z6r>%KPI03Fh6Oq>DG`Cfdi@PN*DY21}_^=7QYAC3)qqRA6 z4oW%YEcs;x(@QI{z;3;bk;FzcSU$|(@x>X=GRVE*t!Q!CyTn1ZDQwl2CVKtHqlXgQQ? zkR026jGo1E4Gj~SJ6aVgm4%^?=UV+D^@l=oWvuQbp!TI8*94{Qtvqbfs_$c+LcqnY z#89C#&JnnITw{?fCl46U5nXdP{Zu}-_4%hnKAK8O`+C9)QIqxIhXZK_lGQ9w$#;v; z%A3iUbv<9Ph&NKeXWvin1Y3!CR@C+_)5BVCXYnYup{VRp$y0YS zMdt=bJM%|P4zeDCckIxZ%x^E1*5RUF`%@7) zpBjlL1)iRdAOnK9JjAVSs`b%SeXHc~uzCg$$Lqbfyk}h!oNf!|ij?gF0za+?DqY^@ zW;7eg;f*2a8rl&(GZu}kwjq#&F*i1WhjS*iVpU+2AYrv@1Bw_}hG|*Iak%(hGP@D0 zC29*VQR%g;JKva4e0ly_FcPo?Nq9VlwX$_9n!8f4_D5!y5gfWIkiu?xM$DEBEJbT& zU}hjZc|vCLi4p30`(a|ohUe3k!QnwJ6_4`S_16}GTnDLrzgpnCEp!&n9YGE3Q&hCAatD~tJ=wV4i z3Bq%(6`Ay?5-~IWei<~^3c(6il@Kp*H~ypCLmgaIllGXd#-z> z2FzAiTXf}=+|ohP6m&f+wF$u)&u|b%HAX$$R`MV*-~*50aXD%e5hf5PJ?#Z-dj@*A z$%20I^qu>EnFlGbJtdGIdv0iqQVbX~yC|u?4vry`2KvgJI}D5I@j8EGYLWYvv{_%` z&mA9j8WuN|nncoY%@&R290&8hA9*HlZZVa~)RV*nMURrB-Lh+Q#bp{D>)p!gV2ZKKv2KWpv?naI8IrqXsl z5EOOk<_(3oltGXQcN_V*Mf@z&3Odk}>jUW%Y&v$S3$r_gfG^oeNXRU^uA{kgV&=bC zUNn}{Fp0?}9u+ilTCD#}?o3lng~uWcg(iJ?;ISk1`;!CS0N>;t#&O^JHH`GZW|3*P zBPw7c#C~FK^Vi#J)cK(Qk5b;C{WX(&^D&ZR#`h`|qDUaYT#FA&VAno~n2{_Gu^O%01NeFfF> z`(4;8ORQ#PDZ+NEh2|4Zof3q@u2&RvmUtZY8)4YnLU~wfQ9~!m?NruNF_G3&i|k1> zByZ?%7?BjVcMD|so7(UJw8XJ_i_;6UXid$uT75O`G;=DPjZMXZzBy_;B>e%HT7Kn~ zlo_SbiTqf90(=LEe$8_Huk+L**YfKLB=gdF6licQ9!&S3WOT?Nt#S~tJQN4R^w}7aOsG4yA7O5ZgWd{JYgQ17$>bFJR@ZT*`4(^8Ren`Ojc*ofFs zMpR#P2~&Oq+sBX7mm$j>tuOI{I!h9n#pk)P$*(;2CSaRn<~di%&p+>?p$@-ljfn!1 z>JoRQ*J;9m;~YVSw0#&xkVqf0jc!#kpErgKo<1UbRcYPldl%(bO(qNQX2IU=t}(&jfhJ9g6JI+rGdlH?mg1+2@_eOr1LFueGTnFqC$*Lv56nAkizcID z_R!)3{-R~ZnJI$eyb4%34e1@HwLd!XWli=-zo-Bgl3w}>6><0T;{%~N11ZWa1bb3l z(HRR?KAILIGoQunHZ~-5T%v;LN|XTl3Z`E_)Vj8r+Yw5qg>v6xqd$N1K$~(#rRvWZ z3G5i2yub{g2?WnvZe;3F_7y3{Tso-DC5oA4X8@Fw0ta(A{iG*Q3HkGB_KLfKS%(fO z?nlaCa_7t(O-TAg`u{MrWdtGQQfa#lMY|3j?Q@L1VtofD@?^F|&I*0$-mO!}Rk1}I za_gTW8}fWY;VJ|igC)ro8fMM_l~l()m+86a5q@|~@DN#k7>)%o;xfyRDkg9gfGse{ zVe-dt?7m=4yF_|`6=7DJE(7`t>i?vP@7amFnjU^5a+_NO;}83lpA$sPA=26lHAn6KHmd`G1|cbxSpYg%hJ4Z5X&D zyR@GH@pd@hjVjc$uoNY{G-&DaH({K8Gq#IubLl$8%#Y}e-xk^ow-dO9ER2jdYcOo8 zQt~zssz$H~_G0q(oF`Q(r+ABLhTXbLs@=*EBX&jE+K#fB^LYKxVJ)8Ftdrzc&8T6I zj@C75E6UCO+8XL<-qs6n3r$0#6V9Thx%Qq($M zqoK&?EfZnTo^~FmEgXdg070dS(xQik6yjR2^qoL&_9-ki)2 z1V}Vl)i~}~Tlo2l8<+v-P)*gHr=O0R_Y0 zynIJIzv12wrp=k-&cAIh!MK;a`jsUp@fjbF6orug=8 zsehxKfF>$vx;6KkyOaV(5NQ_)U)*pYWej*bVO1`nOs=hqSC(7BtifV4C&v8fP#*DT z-8n@YqSWDl^ihOpL@iW*{J0Hj%D9>o?vuXr+Jt~>(zt24mIrOGpl zWz0unLo*#GP%8i_CH(=kEqs?lF7xio;5#16_gF?ocEoxki{!EowRTwKUm?m6mHE z>(D<=xdO=?dllxO)UTh50*l@<*E~qUP;jTEP;qiEc(K^bydo)h>qC{n8NAC)OgZjJcc6Ck3AS-TCL{)5veDbDK+n7Z*!G)_PPJ zt2h)`qLkbUJ@RZTM~fxDoN~Y!)5X5?kFe9jhWdJDXO`8Md|RU0^r+1m8eT&1C$33PGoik$h2QIWwC! zXVuCaq}{}*s{IQ1(G-jSi$YQyblhfJ^uiR-&sePFCIoKiuS{Q+?biMXkA4z@GXvT~ zT+_KMt>5(y)pUPlP2M=ZdR0JpK;l~-DLpX$)V^I}rKKT(yr@C0})+r@Q~72#I= z#Rf4OC7qn$zJ?A>ez|{g0cK59p6hl@_%u2nI)LPasgO9d0vvy()1s7ad8L0J&DiGL zPB6DC8bkk{R1?GDq(Zg4B7y8l@r0E_xl{v;F|z{Mx1@KX{m0uaP7RSH**vZQE&f4QMBZG4SRTF;CB%e35anY)rc{j<&@N9lU4JrKhd=k` zPl|H`|5`t_{g%IJh4V%y7ywyaIg81z;4x3_I;VT}pMByAQAR}t|1X+R=v(DqRfG$a z#S0loL>}O5;m4G^|ItA-h17~wv=d$MMRP!FW&0dV+hhb%jj-d@wLE2vIdy|$1>r`w zPxNj;habC#dkan7HKM+Yh6QK#yma}e)Qz;imqR#tWfDruo}v)O!SHacu%49`Kr^ON z@gImWbCxxEISIXg5C;UH4)wpou<^aQ@*85-P7D>2X69uaa3xM1xjgy{gisGVwia}l zjZBTVbm!rBDqCODDJ$i3cDD4qaN6KH1}!o%xd}QW;2kAx1c1n8z+7GiCUP<9N=IJM z;}}4&lTmPG?V1$_#2fs*!eQhAF#F$70MWmW5-AtBbkqEJ_WUA~`Hh|Dz?V%ulv``gs>&2+f&_%?+aqKehb(h!X`+T)bF~8;zE> z`}%mMDCgfkY?W|B4Y|558Y6bklxp&`JmRUFasVyd?ePycCWolG*SlVEk^U(&; z-W%Nl{vx8Bt0WJQ@48X%iMN)&tnRha3nSNR8>b1N%u`zu;oP!H z`(!KaUPFUHp$lTcX}f>9!Z>{Xl@ux9e+bGzbSteZl+YZ31T(0(j5fsP%?``f=}!-U z`7^X^NH0N08khKN6P$N8HZq*jqmS-hy|JDC!C;wPGP$XdvlQsMR9B-+VXk2mf=<$U zeh>^)iSkFO9T*c$-0M;=n@$03gY`l_&6KkJ^|muuQ4Qw!iw z!9IejJ7`j*G{o79>OIP@Vqact2YPwR9$89JtPXz6R|z@5cNB_V`o+mL7<(IiWbihE^&dR0y2)t*+ zEN?jNej!7mvm35XzB4##-y1IjT#o-SD}}w`AQUbHSZZCw>9KKZnEXB(?OknGy{64} zQ!>>&Ci_hS6pGk0mnd7b>aGd)8=74t(%ecER6*Afk8Cq#?WKp&0-8d_SypG6bg<^- zv48_s+`{=!=tKWGA4`q|oC4K|;Rk>borX5XVyP_PSGHp^_%d1QS5-;^;JR(9J-&g$# z^K*N(nkfE6_E(n+&8s@>)%D6V^uBq^?yB4TM1&VJlO1@WiyEfp{sUEaS>KO_DRaAl zOTNMH>LIg!(>+X={UX{xMxfM39I1Z$yH{Vn9f(&t>zlBz6?mA9j5&Jf#F2hTni7dE zQzlZQNkjW8!_^aUNs#z3XY>gm%@0JbhkHh;l1}g5USaro!cnwjCfIvV68a<@jnHj7 z5t4y})v;?T_2jrH-XFCDR7=Xg`W2Mi{NZ7_!G8vEdfYe=4jn(?w zaZ1&bFXLwjeiOOZ(WIR)5wi5$g#!AAK5OF=RaXJ!QiCh<9yVD5_%1QuJL=u68?T+cp2$W4nRc^o>d zO1pp)o(szNrt!C^40gqOPx^3uo%0$JpdI?F?}u++*{iq{jnb!r&SCGy1IQ5 zK99J&7~nTbB=GN?BCK>EM~kSmG(p(e{*AO#8?8qxuDik4+3??fxq;0pH{5E^`}VNcxXT)GATfo zz%q5Jfte*;sSjHLM%U2&-e3W7-io#ru#)GAKsWMc*U~Mn&XhHbZ3F(=ZEJO*g0Sk2 zHlZ-WgbYYJh#s*L`yNL?Q9iwac>C?wX&oUnWpM<43U24)pTgSKd?|_NM9nhp?0311 z+d+&ox-BZI^7fT(33%RTIL!hm&fdxre!C6}s@tGEPS^r(slTBWY?qxkvK%PNkfbh> zaS@jV#ZRQRZUsc5KO8q_RCD>km$(IF6pn*yuC57g)Rez?Ov62;scD1v&tgd!zM0n2 zp0nXo5iQi^2CFSJYrgC>ZK7A0i@ua3SX7Z19v|$icE1Rm&r^~z*u#PfwPOdhfVe|! zXSr!8`y_%k7l0kv2icZl%2LMFwLeRp3hN%?v17#wmGjkTP2Mcqc-Qd9V1rG5;1JpM zt6G)ecf7pL5o!{EzJC$q0+axMg7I*lmrOXt2-lPERne8yQErQ>M=VKM4 z1834D!?XB37xSsU2*mse<-RJ3w6`V3GR-@LR}gcCFmbkj^~9#o*3y=UaR<~Y6wm0bb2A)DoMdu;LlBRPQUPdS&F@8B*ofPc8r`| zBqSa1r^T%JvC*u$rKyx661yv4V5*g>#em&wDL$u{**b3mK)U|6>kRtA5&60vQ>`F;O_Dba=fWcbF zeIEo2v8&`ml|M{rDyh?DS(6R!O_~@m>xtax>Ar48guWHa6% zYJott&)B;D&A8Pd*Ovt;4?5>mlZd4%=z(ud{!`91VCcLdhLEQe2>%#Y)dMKN`W|u3 z$z$*D6KP_spkSyjHd&B~Ym^Bz2y!dJtP`9rG&$MK_=;@rk@MNjwSxnDISa>I+a5tO5Tv=7HCkkrs-n9s^fW2 z1`12ETY^9GxsAFP61>w3Y@I5%mRi8&4MiZ7927x8K5 zF&4C)EFZyMZn(kDJn}w+kc5Nt`V={gz-xZq2C#WKLMx=THTxGP>Md^RRC;&zmCV$> zThgogWJ|5jPP@gMOh1}W2P`XJnQxHy-RW3?Vbe^;+5WPeFaHMV3mfXv*ww6s-?bWe zIMs4#w2|B72_jSIQTO&YaX)p4sHY--=)H=bz~Ran=%&OzwuNMXg(~gY$Uv8vE3x&7 zB>K@5B78u0?JrTK<5cK@NBlAl!56NQAZCRPtIu5_a4Ke9wJRh8mV?S43>%dIZoH~w z`=cHD?$R6_j}}aSaQ62XOyk!9z$)?1q%$PQV0&Y9i`4KN?Y0IoRS_>(YB!!$n#85o zC^4WjuZ+`8`8=WG%!*m!G=sEv_*65%u7&5P%f5+~)Guv0syK7xLFAm4M-HTmrYaPg zOx1__e}-NeE6M9l860bX5jYtToP0TN!C&Gl5zFx^mUt~p zzxz|~44W9<9mL%(dFsoPjRv*pw!-ziFF3NSffXF1)~cphD%6FAhhSxd!Ek(aSf-kmbioSe zKobN7e}|u3WL6APX}IE9S%FjYs4L#?U*8$?nRVy&Fw2z7c-*g0C-~217j2Mm?M+Mf z|1wj@cN#;vqHnWSV6dDfFY)Tm3|!@r2s{fz8pC|X?!%^@nUMZ#N4JoVf2ljRAu~LFVS;W8e4{)^7{?(;1(>fk zkZN7i0=m?baUx8^l`q4 zJu*XMauq%kj};>J6}G>L9Lc%=4Gz}GV7)a$#Sx%5K@hn@8=R(V3k5MIHc{6Hj51sl zV;Xv;Pa8xu$zOohq;z2&E8nFIPnI6AQA^hsmi1~XiVWi62+^P!E@`|C=TOd(kvrue zvA>|wOsfFKxy`45Y*e9T+UtYFEtpg5g^;|Vso*kzP9SH)c2zA46^dsX!WL#^OKD28 z^W*6);kQgtdr`Btu07*dk63fRw#ZzJqhfx2RXoN^)MIs_Ge3_=6Zr~--5iy_u3oG) z>0Lo`0n+SHj~vNiVfbLjvfjO}w3tEbaQNGQ#1n0svQ7uEQ&&CRKoP)0NG}&x7B@j? zASb)6QKPc@+{;PyBB-co%^Oi4VY~~97Rn@i!j=Ca0x~c+dsxhXDbXe76hT}2UI-NY z>HqjvVTy-4`UnOSn3rFOFw_8I$-UF=i=8SZ565(J1vZ%!>mZA*rI26vn;LBhx!(yq zwGK;|lGLm3UHm9;bNQsYqAI-0Ds>&oCs}(o-h$pr5o^P|RTb%xt_NNRJsPtx2l^gW zV?ZmW_GNwinXw1O6!pNYfO$>49CkW}daa5>(5EEa`IX=vxPkdQ9!UlQOtA$N_B@D zIOzYEwe1)(J252P!lF7(jhug=83UAdwjjJZH*H<3LE4Y7m|1@rF9}#d> zIi?PCgJOO$NYaYl$_{*D!}>pOqV&af>K^8Dh{X1KrW*TG_+r=z1eN|+F2ygKv2{yB zzU+a6y6m;Gdgk?(Tx@BMDjSU9$s&E)hI13ovra!7BaMY=&M3Hh`YJqF$MD_?Brq(* zQ{;`QKG-lWJU~E~#vX;~_Ro(=?8Rl`(#+-qRcXTlW2MG67IBt^*~jbYY#cSgwHP&t zASU<$^zLqzkRDW<#w*R{sDFu|ve=-%`FnfkFNXfBUlIn&*L6WAXPewzf-=7w2w9dO z9AKK`U)r_aQq(8y4u=|tgrVZ$Gss(>9O}&(Rz4#OPI?^LFB<7LK=HEq-qO zuM88}*_yCaXI39;pZETFohyzizCuv7r}B6&Xj&ql(FmW=$SMfe^jkyCtUo3C|AIwv zuN5RE>$g+11{cGEFtbS}=%=NEb_bb+FI8#;x8`8#~j~tHtJOlVCBn=efaf!!Y(b( zBHyRwsvS|FxwM1eT>GI*GxXRBQbzP4fVOPdmDlH=ksoMRita#K7p7=idG3XB-dS_# zFLCFW@cS9u(dZu9Rg0xF!~Ptj=fO1#0&+VgX~FH#NHqO6q-k5wVA_;;A$Z1e7|3r; zCSjE@fk7H4SDWNszB_K2h7Mkq(T%*s~e;Y?kuxzA$5P5PS^eGfbG<0#C(n4}K zW1w6^9isjUDb)6a0v_7j%#U9069-@YARXv%w|8(Pmdaf58ZoX}-aP>pG&Oaxy7l$I ze=WV|IvJ^nHvgen#?q{GOHeEi7ve zCVqadVLfPe%+eGWYb5K>tNs^&;;M>ryMLdzV(>TYBn}*q!U%KaOy~7caM7Y##~L9*HgAgtEj+VDNuK+XcUtLtX^lw1~Cq;T2H`l4+g~S zj!|wHz8Slx&b@1gAkfs}c)VG}C*MEMKDDZWCS#dmuoV${E`vJ*h&{rtn1!W}@ z$Yv#z;csUep8p*%%pUR;pj!-iw@z~{GBF2&*jElUiNl=D@MW^_aywN|9zb}}QKwQy zD|*k}iDK^m^et8Q|CxBMx*XohE&o~`uOpqA;>D-Sq?I*QNdF%Kay)ir1*f^bW}ry- z>M}{N8SDMT#sVCavXxo@5lhraC8oyCEECx0B{!3RSQFpl=%^>Q>XI`HCNXao;yy(r zb1<0c0_}^jl{Ek~+wGTSL7~ay5GDrGcVtR{$XeCfGGfegM_(knwcxQP9d%6^dH`G; zwiT>{O@)2@|MRD{@RTz36kD=zRLnKp16EjFZLCDQ!L4S}lUPvbWSIYyPE^MAGK%Fz zc31D!EgqAy;v5MVRn?ocb(iEoxL@8avQw(G{k|UB(=}MYWirR)atxSDL&#;8ni-w$ zxxkR?K@FT?re%6#%_6DdQxYlJimO8wD~Xo0RPLaZ2tSt(Twq@t4x)Tbg^1;)sHw-) z-D1W8mxqmG^CR#R^&yhdMgFZD?V&4v-~l(sCsv0>hBWdAzP+!y7MSsGinw103|0rA zE8dVuF%A<{h7VlpGf@f~)km0%JNdl>Unfl0JWcgsj;*yDbh~z=6)mKr3Gk|xQeEH# z2`WMIiJ0V8Q`!)IKZ&(tR zmF(q-(&U9J-=bO57DesIh|zB4t{)T zcbiQ8*)%2DUY~v_0!*ytsa-&JcDz-VA4gjW{mZIprBq*)%OB*cA*!?$T^p}E%dvZN zz!@y&EKtlsHI_h*ZPOk7DFXOTUY|rVtmu;z6*)6HM0eHzt8!4DfL#@3=int4Sttd@ zFs0*V(ct>S?%_{v)pSvaO3ct0CHIIphOpX^5ww(CR&DX@w`d_W=DKbARiNk?J5!fc&$$vPt3B849X2b?uZ1#X+LJF<-cQLb8d+@9$X-4_iv2(Sb!SWH?nf9iM; z-JjY3K|sF0tm^y%vN$Y(C@RdWy$z}9fPdvd>YkN_sIaWak+e+|#?#g&X&0p=w*FJ} z{-+-6sNPt#i*cHA{v*j$1~7e&hz;8IrLtbOr8Z%1|5dY1ApeeL!^vSLOS^!DTa5e< z&&*(g6AT4Voxba_-Arp3Tv9!-M88`ywz4~dS|Gw4T$W`qs!EDX^fcb0T&CksswhkX)O9Vfygxo`P=8ORFt!+nQvSU|Ck-~PgWJ#KA za>aV#PiW;)#i*#BC8JKr+w3Y9L|vk;jw4VR#{61|&>|i5z-G_oH1J85T1hGBFl#A> zCRKvujy@SQhz~v?r~^wMHPbmN$D8d;NEJjPGSIbRn3Yp(iIrR@`RUrT+IayvX?de= zrVIqsCPa|)E6@1&+JJZ#=tKZfdf=qKS{$oi1v2`mBWOZ857xF1i3YiQ38cO$@z?CL zwQvnIr*i?FDrdK>Klf-j*os+DMrH~l zOIXdrSU&`YVNxudp@-MuVRr9asQ%7_30rV|rQ#g5nS&N>f-TvESoMH<)-oa|zWG%% z{U;Nz3$*omq90fIuiYf9?o-Q2kZB?cjAXcBI_~h$6TRa}ha1Avs%p{tOI;!eU@v0S z=djo6+3#i3nFU$*k7@PW5@J;oz}VuvBrI|0il?&<(rd=N5*$HN7K#(J#pt}8L=84Y z2;?kvKU3N>SMWx9antMPArO450-I(3+<#k-2kk~~-oX!43lX~e{>P5Kp18Y+g_6&w zIfzKPjowgz?R^qJp(VyB>b~V-`=t-MR8Z2zT@jkyLY(|Y{Nlw5U?+hDnF$O~-4YMT z3K;K3i}I`RJtb`iF1=R^VY@euA|1bf;?520D`S`Evx|lGFqSs*fN5fPsNf;0S6%a4 zi<}SL)-u;Ku=GrL4FV1Q|K2Q2IP_XDJuwjs%hOmT8I0AR+_z&bfg-O~^3vP+huh z&^BfR6zH57Jws~h{@(3)V%Ba|L@)ofvu)-3ypVipB>#AGk+J<7|n<{oR@@6zf#R zDaGWeG4IYeMbMC=<(Ko~t;H=+A>+JVNlBql1y%oIm<11kqBYu#2}tmo@_Ty)OFl+0 zD^U(t?UM9)om!|LHhLR{intyD#O+R3E5kd0txjvNw`sq zuG9vb{#&h-J+l2Zc881p2JAq~h+o%y=6YhK-jK(5fAK?Yg9B{jFadG&bX0|d`LicH z8|-cCwG+GRg=WP>QMjjg(fNp^NuCCrZi4?urEY2sxUCI6?Vl*;ll~bWHN{UD<$29f z>UplmgoJ$Zr@FoTF&OYbmLi;KXl3K^6I3B2-Lo@4xk3WHrZyl;#>`L2bm4HK=a)f`^WQJ!aU>T`2>Fu!ZY##oHSMGwi<760jM! zGqi@J$xnB1T%5=}us4DqeSaZP9}XDRXP_{N1!3QFm3cDuqDeUI!=>3JRU^S=>88`OUagAK zrm7spegT>%nOIWxawsE~bl9Q<{7u)QY!)w3Gy!*7j|+q$wE1g~pP5<2y;20+^Kr;I z9`~oYzKt~Q(6a#z%wsS~ zywoZ0Y&Yc>zvn6nK3y2XMA-DH-CATuS7;iBTzdIug|jzH0)i;dlY zcY_($f$F!!L2kI{I(50W!|{ik=2tMJ?hCUl#9g(Y0dH|xXPMZMSKRhWR+DyzX*wfh z=IBpEP7mmw4>N@+LrxE?&E{&~%}}jCdTaY|L=p!&#KZe=FaVN&%)Z~3KHOj=m{^({ z&KY6oaD?iZ+FtH6ZYMKzAkYCyGSuc0G9qq|TgONonYH-x7p#huvhd!{>+r2_0nFR$4jWZ`id*(+4QpBCh!YL$ z_Csd}0IvwS+SLsu#myuGqZ!F!sf~6HJ?YB`EPH`N$ROfbbi-qqTI1ku!sxUE0pHr$ zJLx0a&JuBx`IZ?#x>7BBPT_*o@R3!D#_2>gHyr_R|AE>*(>tO~4C}YGXEKFO`Jr0h z=A@lAgO@fNx|*xAgj>tqgkYsjYxQ`YA^5_Jnz_?vjm?mwF|SoVbvodpnzlQ8Ob0I8 zAZK&hC>8=gp0P5RXJtI|hCVcH&=BcN>oF!r{9nzp;_^oous5NhJ;cg?PkFVdeQ=G) zk={i-K?O2*mqr7l9HCBZmnnHU^@+Wu@`yh08;;&PELzXQ2~KX&yBQo}pZ?$qp=_tpdDvYO)BgV8k-BKQvEy)*MtyZAl$S%4Uz+*(Ic z@dw=jpW>%lAwgdSGQSqS=Xkn98lM;kr!P8Mzg>gMu3h@?VeaX#&pCTSr9Yr(>mGTj z5D$Bp!aB6C-g8q-_gZyMWQiUo_7Qs4sg*HlEy8GNI4}lqa;~t*^S`%ve?IWopgR*| zTxg8{Api-}(w?~5(R+Y%^ED?g1M5WnG1C!K1d%DahTuGmtB|1L3(B(Fk#7aM@ z725TE+Url$fxZV$zHXJP_!K$gN#<>>L|;?jU3@lOY|)N>9YD*6vqywWx0<5lTj6`~ z(O0YHDWRtF`4mC3q5=itU897q`~tRTqRTeTMQ?2KW{o%+ya_rTO8c9Kk0HZ3$9@g9 zQoTpkRNVI-Ntd~}t=BR$lo#NX$>ZvYnfWuzgij~p_&9jma1TE|e)UA!R%8(#*b}qt zlLT%GWpm(-U@093qnN*dEZU+6>oVl$*Zmo9naP^r>q3%{UY5_JbJw$txDcROQ8({v zUVfnzrCqx54}*qxMoRE&k0bPhz_yWDydb^~Q{`Fnkl@R4DdSSe^r7xXEgLj_@MVJ@ zTTMIlzrwKzjzl0GD5X32VYz6k5(Cy%!>UWci{2KYS5>-r?DXG9T!s1z_|z61zRPX1 zDcv*scoHSp-AZ+79I=+)%EWHNV+E@@?AFss1MpFuQ>|;W*C;`p;2;g5rIlzyyEwP6 z9+vCw+@ndK@ZH=$~2w+K(&m@{hupq zhDiciHzMql7Y;weUEf@s=CTwVABxB`g~*siyWNSh@(rC-)Da-DpF|-|afF#MqY8_d zH7NHD9N0UBaAOAW5#{UFoa7(V(1i8!yjXQLyRC{_>BfK^+8|B*KY9aP=-aFINz{(q zm_;+b1>dSOcyT?KP3cDbrTCH&NlGPUFPg{3{JHSHvJi?YeQDvx zEJi4}&Ac1hse*WT5a69wSTau$PjZn!PZTCeG7N%Vac&11Y@<^K;m!e-%&~-i;gkncW01~1_Dl= z{~vziNXh%j3eYG7=vO{dWatMK%+;+PJEQA8WEDib0A@y= z>}Id%Ms@?+nKot8C$$Rkn0?g1NB=}bZtQb_w8|HISI`4dv*&h0W&=$Aw-9i#|Br?y z!arLmvOa$U6v)?8A+9qXnSU4u^YDEavSXzf`*V+L1DQ$DB0ldT1o1}Q68O=q0JvVN zm7CJ8Z?%jQO=&=P$+OUwrd`9x*_6y0FA)7v7f$ukn-7YiRttfj)*%HYiA26{KJg-@ zdKIloW4G!X#7MBbDy~x>454^w=3!hK^&roGyyM*6ME(L@@T&YL1C+|#H3XK{6C^3 z5&oPUL_81@wMfBFWQsEAZ0ruLi@DBwonC>}7Xsm8&-S8CR3AHZBxuSP9Cdm9mwH(k zG+^L3u{66T`>l06A9mMc<<~2Gr}^7CQ9wTXKg0oNU#?DqD@;4c5mi8!efiR6L9`Sk z%g`}|>rkeE;0MLMr4qK|))@{@{J}tpg2C0nHp_@iN@ZJ7&lpS;4Nl?;Xax5 zbr3s=1l_Hi{?u+S)JeAEth#BYJD;A*{X7Y9$grNWbQyMqt_oiMkFky!0N}K{V!5^P zw#tww*~UZb!~TiIUl8SF_=3=o74Eke$<6l!B-(p?+eWLZam;oB_?O_0^=U)Fg1rnl z-9!chwYlxQemt2VZz!KP*4FfV4qv!VBJjJrz#Bq{cN$Cv;3(+`-omzE^+Fvcke)}p zaGg7B^viNazVDCaIWZ zAGx_HYzt+VmOITiwj&_y3%L?#+GkWt_wlihsd<#XnxQCl>f=49;)&!N#c%aEcU{;#zGOm za^B8}(fVS0P2b587xR7*nOP|6vFj|7(JJCPy?nG1)E1E*moZ3unp0>LwdH&%T6<-i z=yl`KP%3jJ(bu1vzQ(qrK#bIo6rh4r0Is7FHi?4OELKW`2cl3!)j4Ig0d*{Ewl(j2~~$@2kQP9w}q zLSQkLr%OI5Y^~(A(l-DEo*a*+jt&lVGoHl*1z6C~M1kqvujvBCEu3@2N$zpz0!nqMgY{-jTOzsK|Vlw!YYh(gCfFdB_T zy}hSwwPP2lPpAH0Nv{|$4;fI!NU8kFxrbCS`ITz)S4`cJHIV0tx8Gnt8<&9q4SKcO z0~97kO3yi`pkJ#p34p>Ed0^H!bUddMn@=!K&o$n5$!ElBYU zdpItLmMC4?u;M3ZdL2^PEfTaOzW}zU_a%X}e(r!LDP=*_l>Wr(tkOI@%`2>iwxByI zzat!Cq4kT?`etBsR}$i)kL|m&j$#^$V3v&Elt7#xb|1R~!>Fx*eaAaFjD}we&z&^% z$U=b+R36x&u0f*~Xi7&fP+2ifp+VO`L<{fY(&{{)%8Fo%9&GmTyhXXEd@7Wz_ocaH=!c{7>%+It_}ouuv!W}v;x?Muap|p(|v2bAl-;3@IeuZ7)1cT}dN5 z56q<BaWWn;K9HBpN2&Y9q*i3?JMIpOPMVe+yxuWzpNilJZDok4DL2RMR zQ!Cg81%nX}UF|1JvoipgT|6tj@mXQ*!|Ib zi&lvXJi6)7t36aWUaL-KY&^6B$24*2x`x~3q&e=6*b30KULV6V8h2PRBb>-{-c@_v z{Nz8Ko9;Ycb6kU*zM$l|Ip%@4CKU%znM5P15OQ)aUbs6iPt|x71Z3-WZgEE}9k#Kc zhU-PhPAW<^A(Jex3`2+@{Fr!|igU1UY>K3U&YBgi=>wq z+#f7h%K%|;jYZ(mt)OInwWnCM-E4|b2f~HE_tyt2RdFU?%yjab3RejT%=n{E*>@qK z>NC~F!=bKAIFF@1w0iv1UR$&Y1&MHR`5U_oQl&lc+%3Kv-*QNb0`_d=J+>|}mHP~X z|Au?y_5z+;L2fWnBc3-qZ&+a)?AyVFU3R~=1fhp;lgPLuy9~CpmP&RcbOm<{ZGB$# zE5$0ii=kofI5kaVEdE4|F9)x8L=jTBr6Vu?C zmIEGKrrw!huAZ`SrB0eQba4oDyt4q_z+z(WEMDW51;Uo2W`x&4JS|Tbp?PcCj+iS zoK{bAHVV1?w!({J!qy?QKz5j^vTUVN{!@)nj!^v{O#LQFS=m9jAkJ@T1TK&KhF+2w zFy}CiM#0R6k-=b&WNzdJ7r%x5kcAl$(vh3cj;ucN2tQQU>a(!sFmM|WUjVjvr(_|n zCzjFGG)FgAI5|poRS_Ozd8M-k!MPQ7OkRG9Sae8rNSzb(YXQJFa zcY7`T>BeJP=|Y#Tz-H)Yj2?iAX&eeA(ZKzh*8gXRv+}g1B+t04)3(pTUF0BJmS(9{ z!dn~x_SRHnIWeX5#dpckLFt}J4a12GS;?hG^~TIC{qS_?E--N`IG z4li2Fgt(Y8k*n?Ft?%;xJwt4LUKEhi$KA}}>YgXR{ssp=Yvz{gPj>(x;${W6~qgguS*#eW(Xf?a#(J5x@w2PBB|>j4eFL9 zc0A*J)B-L>Q>)Y9|Mj-?pj4@ZCQTsD*$BS?GN# zQ7xL926Qc1`rK#?VzgMA=2!plsX)+?S@UPmI-c?p703e=i!Qw9u%;BB25}s z+F^f9(WHDXfa{>L5f5OhL*CKjw~@AU4N#-KcA1jBz)sr!iBm+g+K>Gv5h+Uyq5|?Bt(kox54&@o9M)}n_=-#xM<~L=2;06@zV_6V;iGj z^izTS6628#F|v#D6b{m9Ug89o#8u{ZvAqNplAg4H6u)fVajE>rV}My`d=6DZGmDFq zPRE6FI)6FfuAQ&DA7?lW9Vj}1jVEW%R*IMpyiV4&YJjmv)ejbhbM&VuPcqDJ*6IN0 z?;6yNbTCrcU4cTggC`+aZUwn&eQ4)D?e-F((;&v)v&>c(fi9_j@|ubpsDdQ;To2Zq z=<8+T0~ZOp(OS)8nLh+7z4xP3F7^{yAbFratWpoKh1HLXjYjvF)pr`^zeuIeXKXUp zPt5WwTvc~VpHqZlp$Qt#>mU*a-86odP?Or$i$hh!vu8L<^wvd9Cbvn83N!=B7qSV51y;AB@yd~>L=Kpps~=toFZ-xd3yIu{Q21=k;r zE?C}Frx4!}_6dHI)^yaqs@2W|;R20_a7lL>bf-r%b=(1M!>t`DOGy4UhfwR-tolMK zxiv)3YvPi(d_X7{FnX^{4o73Ju#0eGN3^aL+)s}EO9LO^BF?^DIHbkg-&Hf|(^;ETA|QHUz=G zlJ_V#(6_nqyP@AhzhCIvJrlBx0cdFa6LG6(MIW%%|E1{@UJbcF#`KJ{Dy0wR>y(9%t!7 zVza`^iTn?huoOfxuFHGuQdZy4iuQ1B*ih>{)3AR5AID&#@%B)WGAiS(r5 zuJ(NEMtsIryx4QD@DA8NM|viaKcJ&-TK+06u&7M8gocOcX-dhiYR|CL;* z{h6KvB{~`7??~Sp53@k|SM$*03$gEmQMpDh(5QgR_iQu1z%tF^)nG?I65>?Zr)Knp zJ#Kws+mjGNm_5YD#=a_z2uYn(F!@Tz>3SlSHw140#RP}EcQi875GU2|gmw969SVlC zbk>9T^rv=*fHund(%D7NU|~JF3v#Hmo`MgH{v4K(vVSweFkYo?X|=3651{LlZB17C zZEeMEzInoKjWNh6Ec7?X@-y%A6KwXTTHy=*>Z!|`3V>}#8G<8 z^$g>6-Yy`ZRrCZ688K~q8|=1Q1ErHua99ew9A0tkw>QKqpINf{O?-%p)X$UYPsjLC zN%W83Bqgc8!FV*ylAL8BKR`-qLS^KZ0276A^f?%1QOeD5x`iK}m?Sj$Ke^19J0L6s z-I>|~`}^t-T4!yH8-o;&Eq4CRdv-|=dI+15X#$jo9Ck=l8YSVu7)n zbZ4#YN-c&h^BU{3T{X!7WR*~PMJ8B)@!(+OX3yEF`SID^8@#fJo||z`=sWi0E#^{e z8YaHUTb6@QPSMEsCj1Kve;a1y9(#phznmh=-74|7JrH$1u93-uXc2Ebtqcv$4ifD> zzK&=R)T{7;Dw1)>Vm@$H)bK42M63M``*2?}wW~rDK1(M)L=1=l;kQZH`h(My?&$^ zO+Cl4v3O=&1qMi$om4rx1BL#U!_ZQcaIR2`rTT!0cbC4&kAC6NVS3iY3w6Q9${r;R z_(a-C{Wq#55?z;+MBg~2mLN6vJ3}#FfkPD;>(F?mXD652{rY@ev*hi@ob>`TgaJNk zy@5U<_hDP^|ELhJftT{~H=U%?-(F$hSo;r^v>uqy2+`Kb=a<2x?0=%)v?5F?Vx68Y zgwWPqW2ba4S?}ESKK`d0k-I#rYpCdT4BnQ5*%5wG6lHbzQ6NQ(ePE`25}k1L6vCL{ zFvhs(Hf2%mFNm%->LzfL!X@~(2ezvnZSWl8uWSNK2N>%!qCzZp^9`A0>W+(PV1wEc zb!F=Ls7{ zXLIrRWftbhr3j&@{aqxkr9Q+{qGlCfbh10cV!W66-{)uig;{uW(ZzR@`76XSNIQj4AA-3yMHU98Y70o=S1>ac2 zfe!XOnA1V>6N%FF97Rxz6cPlk1u_5|xHQ8uS5q_Vh5HhINM*ea^cJqlXjsUn?dzRT zi&5Hrg_U9<)mgW>jS=!y274?>s9@dUAs(eMObMF!X*Q_kb#X3NV=W^lD~VbPLPR$l zv7ZkJqZ}ahI<|uSXkY|nsbmL1Li+M`>w!1MlZSobFaZ%CRYVTcZ+*rvy#T*t(IyKI zOK%1LEac*&@MYyL8l=Q|f?>cbPS9B!*4_qp#zo#q-(N*~tr*h{WqT0@+>AAjjT$(B zwy$yh42=mfps*#+^+6Xg_KRZt{(3WBa!I-LMvOxo{QC$~pfZ?BQ zO#r`1AS<3{q7^DupdB%nUq4fRrkHTz`U(AZ{5$fUU9cWf15Jq|Li7jL=E|e~{%AVo zWrB|x*;ihIR>q4#whD5lRC{=}iFYoQt|ek*Fr}<81XOL(F=!7Qco}CxS`d6Wc@?es zkdio}pLAtMx8pQ6CFJ3e3#<0J`jqObua|kOYN4gH_-x)-qIy_Ynmho?7E#IB56YpXHIrEx8eD^~JASNPrZPE0k;o`&}~M}+#qvHu4VY?w{L z0{b-F5L3Vk2E-`7BU4vV-P(#rG=O{x?-ilWa_eV{G*QbDk2y)#JjtsCJlA&zOs0Sf}PwTb48i-WJpD zrZu{+c9m3PLo)nG{csX1PRYsOgzg3+qpF$St3cDla)EM2Uv1WjG8J4{io5oO zrkf05QS~){ngu-ba5>u46(S<1-^=ljm>eA%sFU2bUbd5G&d$1U_@=JYqU%;dI)t34 z-+i{V#OeO&@@vJRa&7T?t%od`>D~hB&pi0KF4C7zpF4gK%l!d8*Sb zOGK8FA17=A>VrTYUIZzH`(_#c_io^_@+A&;JkjJxh%57Fs8f+oZzJA#a#cknjQPClkDqCqS?+r(W$c06==|$WQLtX z`yP1fry3#mK%)>X$4NU{cfS#|4{3Xra5mfY8KMSwR2zS;(j9P(cqd37W)j#&C`HIk zph9~u>#)=;)V_@6)p(H+(?|XxLxsO%YTS%+{!cf0l!e|XHgBz5u(<$TlGTg5aBpg$>l*mD#3CsF*@>Cz@s$1XA z5a?Sj8%Iy3E#Jla&gm6PSJ!xmGRz>Y?mI0dbi>@#)-4&5@23+}k#`9Epr?NC;aSeC zaAiy&xXK;B*^?*kJBvo<)BQ&&`7{Z&3TnPwFTwx>+87;T$(j}2c1FL zCZR>jC82&sW!ZYIQc#FnA)j5X_Q8?PvVx&s0!N+OOz|UX@IfO-&pj}CPl9#vc`Eq~gsnEa_#KJahm^ zrO~&6`SE$d04C29EH@<_o0$tP66Ov$DD>EKe%C`mxAp;!z+S1b|0x|vd6;>Ft$X&{ zC7%Lk&&kyhdkXHlC6BB@mOvNjJWLkHOzBk0uZZFl9lO6BN`DtT^=<(gpM6}=j@Eg={5t-^t*{Co8i_z%RB{$|rLhcJO(c z@gjxL9co3yXQEU6B!lZ}T|AnvwsJ%9<`dNSAZPuA_(&Y`;J;wHu%u`zFmQiKnzSQ= z&IaQHH2fWFAt@&g7R4Z7FE-0T(X*Bc5H^Nz79nEInZb`2{VXCDYp1xxJIn6y9E3D; zz-xfjC}*`G79*e)veMI3%f zsP+46Is*2y>O@lzY1?q)gpLb1ld)eiMyu1!KYsyE3*o)Gpf}`{c*>8bA&|!oG?4&r z)P+_0|4nkfqdZCY}cdFo0mXC&3m;x^oEPPxGz;;~22sak>;2(VsGDruyoSXK3O z#ILi!RB`;~=sy`M8g=HkSPxq4;+@(c++H6aNH?>2$NOarab%>iK$1nNIir=6YUvI< zw7b|$@!VgM2bVappPhvTkq_l+hPq}UMwX|edBT`^bPA0~aT_*;auqAio~-2YWf{IZ zTZCM}1h8lCHU6Gok=echy5-r*gICmlfYX2?RB6P}bq%u01rUYc%KSmM`pQ;BSGc*L z040TjI!^#eQ6OuB3~t7kb4;qj%`E! zWXb-~0S;@Ok4rHgdcc}Wok64YBvRU~z3zR%TVj9Dh&`n^6KaC_LXX3I@kP%Gn_EKE ziWW9Z7@A+a@~yGOchEjGG>y^~9wa`?C8u2-8?{6;ed_>BSM>~%Lc%cvC5v7BSA-@m z!wiz93Zx_!~r?XM_XRWlYr$+IurHP zFxDMOdOs_&&=14RkO1`cx9dN*&jw|Q_De#x*%#}Rv3n|>BdS?lT{uNlHcK}d0FB0R zZ2wp`(gqY|^&sA%%B9((&i?W}O&P_u*)#HAnO-=M|`xoK(X!;waRJv%#W_rUIxCe7$}(#8uaedh$wk~1JP zP1cnR7NMGdqKYm3W_sGONFE0lI&zWw3U8QSn!+2GQi=tj&8Z# zS9gQoYSzt$JhQmPYPGrI)gB6CbhRKSI?KtGS*M&`qS2&OMo4t5)LN7DqsDXV1c;^J zj}oI9%N%!}wz}0vv`l~Fw8QaqI^g!cPidkL8=F?>M&l_HJD11HK4}a4ABiA49T|cz z?Z#ZEZe5OHXQtE9Sf3Zg00fCov+uU+|P2s$q)nDwhH z0f%1eF<>n8<(MDQkjK*XoQK&AoHDUBB?tRt9* zbO%0lr7-mYE2aajfJiVebNWEZkvB9i<}Hn3G(&b2FEJoY6=V>*(t+Ia5xAEW4||W! z9Cu`a{9k}xzPbCylV$s@ft7SlfoV@;%wk9AZxbH0`slGP(Wt~>GCc-Skwx13|Mmw9 zD}^vyr`Tq7x%eqV4{FH`rRwMJ@4^3}+`)I4f(n=zXacZ)2=JYr$fnY>$W83Cb}`5Q z$$YG-tF#4TJ)h~pejj7F$wqFtY z#fO_QtWj)c4NibJ4s`KlIL#M0ZRG*MmYF&s@hlfO<{E_fPA~FUJg=pM1dPyRT8W%`ryu(!+G{5IBiXoh=TK_3 zP&D$SeAU5Lyx~cCWyrUB-U!qox)dZ$ADYv0e$~)>Jx!9bHJe||ezuh&o69W2=1IAq z7N~N}LkB1VRZIBWyP)Jzg6%$^fqSEE#e6UL%I1Gf&_X9k;Ng;a|B zd-3-z2|@jf>R>uBC&3M$V42s&AdY-)&(m(@XG%#}kXM`x74Q68Klifc6VUeYY^4i% z6_DLKKskGgB{e|f(U%l4^5D)wE@8&7Zbr4Yxmt&{oD#{JS7SHkU6j}8%vtD3~-8Ji|~_6USi{|_jbGRu=jfZ902`7 z@4W@xMzkb0VKtnb#mpA-m;4{TZSAw$w^>~)Xf{K_VYY9Lj$zTIFaBK*8ye?9j zox&s%g@RgRyhab} zk#~!Pe#jgTF2o)$$yVru(GsUqp~-$V(o?j8;F%|oz7eoc-1u(Tr>2@Sk#^N-3?FOQ z`w4qL7d>gy3>MUb7ouE2K4)(8>Rww}2HMkvnXX+jgl2z>meo9c7U!g7o=cCUc^&<) zxZeMo_Fy2CAtTbD%z>!+bKSXGN??SEe(}*rKyWw~Z9$}#O#6mLEh*al6Z+5gai;`z zrrfUAr&eC5aikp|O@PuSc}m)T%d(Lee;)*|px#786m0whT)nlob}!UM9JDAb?+n&itvN+4)9y8y0(^#vvczyx_hizpa@AAEp(t&a=BPnCCq(^aT$N(PTol~8 z)-Yij42x1*Pz4R4yyD32f6Gesh7x81ep^wzbT(2wf4@!5pf=(7E5LAn=vm9nOgB2{|<+`e-*^;)R|T*#0s)&I1urjuX{rm-eUMFtt}fm!B*SZkO8}c3yLI?|9PBy&05y z7(#pvU$mumgjQ1IyvLUZD`4^Pqd{rOHF5la!p?a=yY#~x;ji-ys zoq9i0+6HlBb)Hzxxx#9j``%VC?UJIyHifE`zX!+&XGGFtr3Wo zroFD&>t)bxA*-|E2!nFgm zcJQWzax#^%;l)^yvXVMa9HYZRbad9%y8w2Iw!NX;qX5eJ{#2m;#UVN2OhUpnH2?ky zkr}h@zp6)|CnZYtc8qlkpZFf>?L#+DCv0x8BiZ-pRPn@W6h1(MnP}ZQiGf#8XF~_@z?^rQM^dfPv7cvdAK{yZGF6Z{PZ6ck<2rK|~u8r;Ilk4|&-^_40 zVoNFGZm5|uB~A#@kDRk-Xc706j8e(Iud-sxw75fod;bMY9k$M86lkgc@uUx9Y1OcX zL6zk)?!dL~M&u4_E+;>nB=29zk){u8JBx3S;D8Ohx(g_>*nZCS)&pwr4-C&tQu=Qn z;$AW9*R&DSjbcxb&~&X~_^+-HfezPJ??yPL^p8ippo!IXO8R)PHvy-Lx2tvieQ8*j-?nCkQITbVv+Hm6Gpn0ZM!XUw zKVQMu?;bA>Av%$pEDuUUT&L2GY1uPQ*8R0T)-l~y1&Mb`Y6xYbp^5p}m{;Gr=d^o1 z;l)opUm93a@QxSX)GM3m3O(cOZsZ=vk?GE6flQw^0Bew$m>ASMf45h9bx0zcVg;jk z<&5+$j^laZj=Sr6d}r|ye$xEc$jQ`CmCAJg&e$Uyxlam3xuU`S;lw(VFCW)@>lM$w_T#) zzMUAe8r#@~#x`53zbuf_;^41QIpl}&?6w9 z7c@$Kk$8dcp^-m>uSQLcZ$L^iC2OhSu0aL@lX09pIw0gQbKrP)V7cJa9ojouE?8cn zp`e#}d1lg4-k4_D^kpL{1B!8I<*uT^X?u>={C;a}=amj!?}#vHd;U|o?xm_p%MJZ$ z7AawStRyn>-A3}_OG;HIarMk6(E8ZV6gKN=;%E^wM(wP&1cKU4{b)({{TQmq;vPC2 z?hQQ2!Et4JAHdq>LE{Y*M;XfklFU+UZ2`n z(h6k8!@5cm;nen9hh}irG#*zEDj6hC=KwoE#J@5Wvh><_3u7_LX0$W$08#}Pt~Uhr zz88pf1T>fzq! zGZ6yPerKChoOZk^S>!fur%vs+T5)2AYY1%#?LtU56{f=$y>Pv>s!%}iNfj>E_U*sv z-LuE_0*c>e9iS|z90zU7T}$bq+Z(}LWeRgwy(peY=C)l~#=y_2cTw9KvClgiMK=?0 z2z)1Cn}+LNawfTVMSu5}{EZlG|BAJ!Z#Qm5!Bq1E#HHos)Y{?6XbW$-uNS4f)cBN$ zf!kvCfO>SWcdCBa#MJDTdKb5Nev*rNDgRR|q+9 z?Mz0c*Ex5PX3H9({&|EO(IH40vC{~uIV9Wr8p)^j7%_#%up99zp(S9(6AbegzuElb zg9S3Kp!9wvBC-!6N5&)uV-i}>w`m`IUar>k`+W7M2f{FB|V=VflQVaw_>y(6~mRbqmRZF6%N@&F0W|sr7Uokr=kd)M<_!}y( zacGHBRyDR2sg9N=nK^yPl4_CIP~W|f zI1rzhXW0->7_-=QpX@yPu`)R8nl;OZC7}^j~)WFmM&3o78kRp%Eq9?OM6Oxp`%!UF1FN^j9$i< zSO1l!U^Ua#Ii>;_K-{I+w;~M$Lal@CofqyjbwhZP8QDfOF}6T(?Hph*t2J?zbt%iZ zAE&n0r!J$~GCF@ArDG*T?oF=H@A7~4&je;*BRhMjxG zos65ze?FvyASgG;pnzI$IIu6B0tl(9M8__T5 zK0*x9QSNZZV0_+@1ndu?=9Mw=P?NU=9FBl2Upv=49*EHKFJLp9TIdH>^-j zb0@+W-l($mYV=dIb*@(3p@YxtDRh-VEGX@LeSJEayFXAq@R2~&UTMy-@2d1*;rxXNH_ra?RPrIzFN_VXKNENRXPeGhu17G^V%;F zPSxefXy{6QN&>`_$(ygp?fFS)sEMIDheYy*_QL7hP&~NWRr;s7u{pFK1{qPfed!dC zcqeY2s{Y75;)l|YVy}x(`Y!!r;{(GA27L(b5(xi;H7*-JuA~h&n5~}+6T-^gocd`^ zSgi&!%^NY%oL6cLqUkB2OHGBMSsQ$&Hg6gp{yKR(zEWMR=)T9C8v{J?k49HlSJ> z27-s=q`ra*!|DB|0gR11tRVqElYGipxA4ajK0~W~L(PNW274uL56SFK0=7kE^iAa_Q+J9SVKIpD0Qbo1~`|bhSb!hN%N0)_{tGK{sJ8 zpMy7me+G~%m^LsC+fcslf|YHAWoJUWd|QrQE;D1l{D(1TPDNcX(oNQYiigtSgXgV$ zEH8xVhUWc23t(#P<`_J6JP#gc!p1wC zD`R&y9E|Qch?7L1d?%JdXW-^SFevdcN%F3#tviP`9l=WTN%xNR3RWor6IFFpW=K{A zOS5XJwd|DQSeW}X`_3+?dCaKS?#*#sv>Dr)uogY@2~ZUk>DS~5L8cj-?xQ}Wp&iba z{BKQ^Fb22{>30I7hyT2s(l*cbo5iOXDBIGQ5{}FtzR+6#VAK_-Omc~fXJ8sk`q@`L zJcM?Tg$mNSh5wT)jKt}DAZ zor5NhuSljI#PzyHBGS{$XC}zGZ|PI3N@Ka|u;r{n{hPpIfj3G<|EY|{r`xMbE8bL& zvCGHu=`|0;znpfZV-Se&U?|iD7tNvPNLvx<<9}93$nQbWH(AWSHV4J&`8**Q0e@jR zo-EB#THBP~hzJk{)}dd>!mYS|D%ZsPb8gM#W0|zbuPp+iybO^NGrY{x^Djg$WP%2n z>3r^08@Cf>N{!j7r0VAlRPiE>C~`MkPoe^-$X1XZ#$ZvL5s!5+j@kCIJq)PGA79|4$g$@z6wP2NGB^;r?xjlV2C40_R(Ya{6e%~Ct{QV!S zOld>3eqfb(aWq=a?Yd3>>P#n6?XykOP%w#kkwPQe%~U+_ns1g~O=d5~({ez!Z|Pih zbCRFkd}e@MUnOU_CIc^EJa>FIH%i$~M&WgzpUoq&vl8u3IL9m~?@O|P=ip~zWp@nu zi3+7kJuI(C09CF@)uzyC!u=eD#1$yok4xve!RSRFOozM^whONGylmW|I4`n6ckDSQ z#qRTGxG*>C`vx)bF%X9bkndco&;Cn|TTaBA86c4aZAH#n1d>xM*GyzT+jA_9`V(vw z^e1M|O!~RNI@`q{x+8E%_oc#g?4I2^h$c&GYt)9IiXT{a)%1FLPVYded*{Z-bo5P1 zut5DpImZ!peB*`uVs&7h_J|qDMPU#i@_N|W(HrbAZKF;4%pv}l=~t;G0b-sKBf~A~ zHdXP}q5RjCdsy#OtPB|Q^8*OqMwbmk9Qflm%@MC2)q9vwZN~gOz#NRBBzb6UzM`G) zzE~QXeD=Tqaj4Dy#c)&1+LCtYP=-N)bP=a(p#x$LZTlQ< z>FCfil&-N%rh?A|Y>EK~N6BQ_J~Sh=ZC~p99`UNVOK#*)&r>^=t2>`3Eaq9tNk~?y z>Qpztq1iJs8c5eBs+trRUAO=Xy0ZhT)@7zRGM*F4q(mFee9F;B}aT{FsO8f7*io7Dic2 zxKh-qUjZwi%d0i<7Z~1jU`gN+5Bza``VEt8Au7t^JYNxWL4F)QyBg&BSC#BI5hp4> z9ABEc9*|!uOsSRe4&^9xCj<}O=}`oeL80~&N)GlX^CMIIvXH43hsbbaCVem>r~9Cd zB$_cgC9c9f)EJ;MX>)40j)xurHPlT#FK$45Yi}47RAnu{P-Ie+jro?e30jR$+(48* z?;q%^V=tHC`*CB}cDj>;z($M`1HRvLpn^eSN4{)6~KDH$%Qj3zj(HRwj4eE?99DSc0C8RsC{xnCHXxN*-U{uB)VHSSS(oeRXpK0V9CHW`TQ@p28)t z-y-n;&PcmQ(f{y3pv+DB`uj3wjbJGOuB8QDhz)<2jAg7)&-<}B5*q;6QaG!=0&-r?~lyIqrEdJsk%!Q_Y}hW~Y4Yku?aUlcC&aMVgr9YM+n{^=t( zY&7T6JM}ceu6H792HSoJNrG{_Rfp#94INGi13Fa4Qd$LUZq~vO6d#-#uEpKcqRmU- z+rF=BK9p01(VI4}zWg1xrA|85&2ul#rV%g1Yzqn0{)dzHbwhuXF>%wd@OQ_1GwhjDNa?qcj2LdbM=5?8)(Yb+W8EN1@q4upBU){@dwm8Uz}QCsF+z1723C{fZLrb zrz?ovpAAX^mhO+)!-NMZ-vFKm2;$V_PQw8Xa1WB4&J~DI$K+&%X1H$+5v?~86#a>A zfpX9@vkd2IX6+y2RCt7VOHo7r2p_~x$eUVX?|-lwW%Nv5KcJ>>eq2Ut1IC>FYC)vV z)e4i<@&GoLrtSlOEjP`QGXaFz?V7{dvvwU>=c6tMybE7&kQvhe_{A}PoHx%`1aZpl zK_8ItW9wS;GHM7?%I27VVhuBHIEmwe@ z3Hk>iKhg{NiAOXLCx#(Ad}=C$L>Dl$I}30;+swQO^d;jcDLH0BdP=pdV0$9%ws={( zy;KEi%)XZ3eRTa{@ed^5#+FpY$}7sH?Phy)gRP`>n?yL*#c1QuPVyj#nm)2}K`t`k zI1PpeT()K_sZHMmJNC?eaVubh=b5JPe!E106DjooivM1|1`ysAZoLTPQerf`0xET7 zvkM$n8=BPASzMgoIoms4us3*kvX(DFI7cD(b{lWq?8P`Z|AloNiFD)_Oz}w^JEu=XK5g5db&K- z7SNORW>1UI%QrOF*@AQ11qQS_rg6u$_S>Z_ByZ%_A!R>~8jDX*<^<0G3W*Yx8hWJN zwVXCuL^afa+X@A3)bxpl8;3iD*dwc#)}G!1nrY@%t>rgLL{K8u59RMl6K#&b`a{X} zN+H0oT=`SPOZ1c{JLBbEtKC?9#h}$9Hx#JNK6e$GqE=qx-h=*eTh%TetrtoS-M(t~ z)7*0|?DnUK}z^8vq6f$i?EE;8S|gYjYR(qgog1ux4$o)%Y=& z*`TNO?_2h6*w3xb?wzE^wop8M7o!UE6`6LBfe6&ma^B5%LXrF$NlAxx^L5wfg0Jf~ zl`DXtxl3pkwWashV_=@PTBrwLiE$i~rodYF(*{9?oy zrxo;@i0cDw^UaP;YyP~=-azr?^1L5T=XM7XwZK(Jr{rR9wJJe+h5k8gEUOD4n$djz zE1x0HFkQ1sbtVZN;zbvzQCmU1%Y#9=NnCt!!1YM{b1pqRK$u)|@n9-tl(0F;g;2_3 z8X7ibnb0Ks6#N%haVHh|Yx%@Q^rOU7XK+kB^)p4DpBmvL%b9%8!s5wt_?Fralo=QE zodNtB1POUjKj_r)3wb@&zDPC~2jEz6kTF&D&c&$ps-00w*B*(+hzaNhW*ykQKklf9 ziHt=Q2rP1q0T?BRnQf)sehLCsCNOfkYHAVsmn_4bjY75$|E3-8$G7@HndDuQUMHrC zv%^zykhn7gZiFNph*$ zWqB@|zgC;w+Q`otBxEAi;*g#={e$1MQrs_yKd%b0kzm_YxwUK4v}p}TMy*5lfT*=| z6?3=Usc*z1_}D>8pLHeK1-(0j=ih-U@WLPu)A^W;hw}g?PqT$WlCzwb@OH~Yk9H2I ziY+-lvzBNOT@d~nK26~F?{ODxZo~-N%*ku*2lkltX_CcOVnAupui@G+@2l2zNGoYU zzP&(6ykir1{u~vZyfi~y&8?cENfsH=1sP!JeX!3eysWE*n(J)HV@*J?|Exr{Edv$u zEgtJMa)jA%Z0u-^^Id{mMKQecr1s!pN$@5ckCSgHBU^o%X&?s`L5)FC^!%J6_L?0F zWL6^GGD1VBgiQCR$;$2mb#%~+N*j3Qp>go8iEA}N6m#IJv!Z0|DOF_18%=2Yf<6rv zfm8tBe#3D&N)5%n+dJM$)YfMH=KHQBzupCG0cE2Pasf3g185fz>R<(JxH=y{o$vBR7O-G6lxj?3ARfkCyWhCkn^ z5HCM(VM}?ZdE>q)hbZ6!%~Bh^9W}9ue^W#D?M-b4L;zg$k+d3wyv#m{Qc%--_5l!c zjSS9tU)l|A1OCy9Fp9 zmL;tR0Jx2eFE{L?hi+JF=c)#Sgo8P|TnV8{5|&17!fNo_Al7uW*jK9_CW~21Fv_J^ zD8ItFKp$*(PSXx_I+)ptJvB>rgb*&N_KEFVt)zBx`Hw>V(J7P-E<8Al~7$ zGWXr;qg$G;C1t~uiF`$K>Fo~k($?I>E9sqzOd}OOGif|O@M~B&0ixJtGlMdJ(W(YR z)Xm*^Rww*^#3jO(+54N~6ev6eMIHNL@BIt?m>0-xb#Q#C?ek!!f)n+rS?lY&3gf5+ z7iyY6v(s3ZXqU0+eulC$SA{}sCXWjm3GJ+EqIl=TYxDsD5|>Lg$D@HGD*RC#E>w>L zEqUSB6oO+^LJ4Lqf_*gXWs1>I@L56l=4i~8()FcBdz2GE&eCENBEfMP&4Z>x7@dnL ztfjZL6PVv1H*DukBZ7H~Un+^XJ0PlAno5Kz*d%N^Q6;>)7N}|r<3;``e9#L6=g#sK z*RrQtu18H&O%QF6#3i|cBdQ#TA7#$?msZ6{S~`ZBBN4G}V?dsZSaQ}L6gV|z4g^#k4kjhxp zVxqwKj%{9RMR-|B{-PIG*VP9=h8)i8(&H>!!i>nlmTWS%#sM^OEXEKJE$@~_S!%E1 zZ*RV6AQeyimT!6E7Rd;ht#Oj2SF1gaY1~6_Cep@`glUI^M_xEr=A^z*ZstU8xTxk& zO5KlCKY30L%9Ec7}nosaMX3b;k!1RqT;xESh@ z$_;{#N$i!quLIKMPs){U7KS3#zkHn721O0{tUt0{vNtB7!U>cv?PANO=cMpM=7%>BALlxCFu`Fu-G34z%K9*@CF6cYMZ$S zdOP3c$T@W(#-+g5P*AS}gB66l$JuDQMSF^8J-zs0HI|@wK2O~>CO>WJ6PhGB^HdX? z5_`j{GjHd(YNWL?H{4<8ALt(jBa+;FL#}&{e3^PAj2agSvP>mK5!sv z^?Yt3(1;So?ayo(#RWFhHQPnbDL{p6a!z`msVXmp#K46#elJ@_sf6jdZ^fssLdxrr z)mGMPAFYpNWCQMH&Uu~O5+RM|dfwt=sHMI^Ju|R8q$2v;W&_{G3j8K}t#Z@|xgXvd z_Sy^%gFyuLV1Mt9iQa67&*4`yK58fE~lp)a}$~3j8asX zbS#{x;8V)fv$CRol{ZXgWTOB9-*K+%OCf+nSXw`6{O=u=dPp0-i~w1g9A4f+-E!U# zCT+QP6h#&o>z6Jk3c}`oW)zsEcVU>Ni=YL5-I@P6^X6jS2t!#;j23>A;N62-m#U(D ztp^I0yp5-Z?rq4R8#}<7S7LL08m(I+w?H5>uY zJ$N|vA48@yrW_@odFC` z<9?es2Y#KM#s`($73Xbtc)>}B=cqs}uD#}G-4&aE#WPTKrwhhVTqvp0bqzd=pfX|C zL<7_A9S)t>ns0UgPAojFMph7FLwY1~Mf?s1aa(>S{>UJU&`>kK^onTs<#O`j;H*{!HMPs8|f^C0+yPew4mG3Z9~jHGtXElM;w}L-&mrr#2@z|VwyQ_ zwg_A+&a%U0O>jTka5`-t%M72r@Nil!*z~f@G@T;|EaeFuoP&=hYOV!A?mIx&PWuD`T-FQa}8F*=)A)*cf^ z61LrhWOxrdg_vj1g_Mo}8nh?lj9>TG2nt$V3EZMQ#qNx7oXDp0K%IN4xEH8A24qUy z4EG#o3a_)RE>`bTJA82%=umUA_ViQf>yHM)s{VWUP&B`x;FD>pzQX=CI zQcgh4jr8>!(D}Glj@vdp1FyB=r6<-wmym8xz2$zfg+&($Vki|sVLHFCU$k0)Ftja5 zOoU+fgBI}$XfnO+D*lFYfHVB=K&Lz1{o-GE-hZjY>rK(~1zrrtK$%bdkK0es6yP8f zdiPM4a*B%8o6rDT?yry)R=cm$DQi}La;PQQFlF=;9){1>pi$B0m^|Bu$UW5UZZv({ z4_H62_JqZDr~>zYWGAAAt(~6Fg_GPR9MalIoK?BNi|^!hQKq zF(Q{^NZChKFeUq=4kIMp2tGgP63Y%4K=jU(a~V#iQ^Nj6j~{yMi+8Wwz^G=2HM)gr zgtZEei=>ZAYV#)UF!SKxKC%utVTt#B?C55#kx<~Z|9O;OBCs=Vq)qqLiB)>qa&<2e z5L&1JSq#qYwGV*A#BCBXlVT~W6;wyTqN-nrCwPSM0y~42R`J8a6W~uz*{J`tv$)uH zG_b=SyOKZ|rmh6m)CCpMH%lo5)jQ3lf26$um5oQ>k}5?i&h4?H(Z`+xMt7+&rnq4f z(@dZ!_!#fYKROv?{p)cOG1P3S&|2ek04Hu_l4Whl3!N(SO>rmL4uxXrOeqy|;{l;* zM#;CZ&G78ikO#b-kq@h^(yCitD^~@y4x`AkC^CBg;L-Eg{tF*;IuJb)uzIG1x2LCO zv!q1ZsZFslYjKbmqm-_>blizNE$_BwXQkbR5^NQ6npaIZ$^e~~eetBVju=LWV`^@q zT}njn+cpj*mcw5=BDff>(WYt_5=FWY)b;%Tibk3#BJ~2a4W3^QqneCQ`A?S=H`VC3 zy=$f9--+W;Luw0nCKgcQIJQFk6gTD;=z6AwUX>YuvAE?jE12(iPM@i$PVk4jHxxJ48!mdKuSN8I7BaqEE;73zWmYs^>fVdG}a&1J$^aNgP@8_KXfXX_bf!Q`K_*qR`w_eOtWEGsjL7oVkYF4Ill zgm1cw%exrI{g3 z{&*iS>#b})PiwepsrD1n!xd02Yg>kh^Vqk4h58MM**jm#uhe0Q+a2>epOv)}S*@0S zFdx~F-r@UWf{H1k)8e1Igkdutmk$5PC3&f`ch7#d z8|KAME}R$VI`NJ-R1T2!eqlMl4LwS5CCCNvLpsN*emaEq6(7L}rHZ5{OkQKA5jk`~DBe-#__Kc>fx0&ByEz>tZz^({cZYAlCwQLt)!X|7 z?Jg(kla$cQ@q#O;-nX^k$cakpc(MVH&;}Ib=b`4bAU?O8Z>Z}hzR?LF{(pZMZ%pSH4-?P!ab1uS-%o3O8(2kF-{02 zug{%?ZQw$T2FdM#x$S`h5Z8veDd2N694xLz6^myYmku|mEi7;+Rh$a14FlfuMt1pO zAA`}o53y-dx4hp-t~Cf{b(S(xojYJ)Xz-Nn=duvF$YIuk9TfBz|13j(EnSovSuF@+ zsG@(Iw~LBy1a0_)(Q|qG#nuUGeM@!43dXXQKABRMydi;c4B*LDZWru`c^k&?`z9i! zXfvuxnWT}nnTy&ii#826z`g0I3v^0!p}F)9o9w06(ISq{}hrbvIQp zWqvK##N9_q_2>mhBdCf%Pa6FXQ{bq7IbI_9U531xtVa+v)!raNzswQ~ zWfKL<=@7=|U=~I<7;(eqF_>0c=~2alxk5z( zeG}H7-+)H%i9c!(_vZ?ziJ#vzgn8HpAQx7VK$pz3w;c>!R+x*@(oThz)juaUjDV^; zJ!D6CxRVu7#zc%`BSi+tlA-V;Ln8vKRs(gI>KjS-lmwL}q4d9qUv2Se@jlFOrZfA# zuZD~kynTEaBKyBgS;LH;urd^8tj8?+g~*!lt$?cz9wVr5s;W+>0Dx!I8rw0^lI68B z(ZWm5*BT#ze&d=S`J0cjMMC6b{e1rd2$7)dStoVNlT*;Bz;e}%RrPo0R?_6ewx|JzD-9Q$yoqT4J*ef+ySi^x7KYs+KrSb z=7$T?}lKfNc(Aq{dJY56BD%J>@t29h9b`!S|qFv&fA+vBA?WcNaE^{~!xg%UB_PP;Z?Y^?;MJ+WrHkptN50)lXUf4~2YZw`h;2I! z&><$~FZm;>!mMijxw3N9OG#0M21@&wD5OllPq`I2sanhP=k5hk4%4`?4v(jGgl3m6 zXYq+{_e#Mb(}2|DJQd*#=(>XbD7AH*=B)eBo`mUWuuG<^Or?>myLWMrAuAq5?#-(P zfMXeDIe74I{_i;oZ2!pj&}dyof=_D42>gitNQ?5Um9ORt#BDlH3@7?fpjapcX+fPn zc=Mfomcz8?>GD_tjZB_sV3vnQ8bv5QXsVUk`bY~xzREP(;8c`@i%R!MrV{x?8|c>ipI$U#g#Dj zy!f%f5d8PdPpVoKNcuQhhZ89zriu(k_M9z|CYIssPj2r=9C()aJkT-)&hgf{;%SYL zQgsH5*hnMZxBZYUtK)2?rO%H=$+`x$Qr1{JEjP9o@Y9*qG*x`m0y@iS;&iqEzo(w5$F z_KFQ!Uh8J+U5HZJX%OH)kd}|xk2Q@OdT%zf)js&tS(}(a7`*!`_#gj=MU55gQ0(Ji zCU4>VH5X>IKB0LmJ;oc8o{M}oMaGL8S|mw&41e&i5~x#`^RL2dsq5q%*H@$BL|IH! zA@M9Kcda9=oeRWNQ_IK{8Vx#;vu`tUU&e>I_krGfO~in$Heyv2CLTJpRf=Z7_U%~` z^bnQ`bvq9@;^=7!*cHk*=4>3W{fc_W`y~hG;OFt73ri_&E=6fCA*O%zwOl520(ydS zJ7Uoz-!hsN-%xAQC_zR?4!_=?dL~SpTAmI9SOuSI)#MMK&|!JAc)6<>|$UrY$^=P%K@^hf7;ZU#z3yUZE<{+|4l%I?dzMcI5L$~}YVBRwY-Pc@f z>J{)%AzD&f;{3azr&$6kJ}XzK88bK@T&g&&qUUsAX1aNd`7F>rBRF)#>v-U-N4QD8q) zBmr9Z-!(ryd$zuI-!hp6Mf?E(hr6Cxt<&MRDsAXyyOxSsuw1}`a=i)}%tpWa!Zf2u zbP(r#l;b4vvUF|d>E7Jn4xtC>npK5ycBzmB`LbDu zGPq@f`yoI>r7x_SpXn&Q_i)N4x47Im*Y#U2Tl(hV;@LK`${sUf)MBlg3i;pd=sDK@ zl7Vep@UCX1yRdQxlk&k)uJ|aQ+JiQ+C~1sbQuARYaEd(Ok;3PC&tigcUPRIg-nqN= z-Zc@Dn7vLySkC}_itdSw$5t9ehayfU++51CSrz6D~*1$_34DqPh;KITcU{2>V+r4$ycDIvLKRk`-V$=*bXj3IdBo=6G;hlrp`8;f_6t!m_oty76m)pxTXx{JetRW1Bx%BoaWmig|Y; zmx9^tLSo)VU)M&!i#KrF5@}-7>9tN@mA>P~pD2j#=H0|x{#jHj>_0R`SeMAVz*Gm? zSchJ!<8@>n{w4KsO{8;BQAk0yTBc0^LH7B(TDBuhb?e50;G~|@(TwL4euT{Qi*r#@ z6n<-L&QH}lmhij!iFT9Vk#8=Gj8=(?*>nluGUP7S&*KGn<+p*KpO2z@Q)06%2_1;5 z3HaE-bq}-e)Cmr>^Kwo@EtDBC-6E29rRBgScBP2hOpZ}M)@V$G`vp6(GGMu4FZ>dP zYPfRW$W^=fYSgJxFUP;JEDffQkgamd{lY_d7 zg=c30(^Qx^i9K7RVH%TY^;pVJK3aq3J4MNy*H3NV-O(+OMq&g_uJe<9OGNdBj4G+L4Ga*rc!2_JF| zjtEF+i(FoB+{ETZgis7pRL|t!ARqJk+Art2ECC^b*{V>^H1BXHNpo-o5V7qjK!qUy zF6(19yBlCW=-4KoaB^r${QbXTt(i|If^lXb)^p?=&~VurWy`+PgD&vE!B>;0k2+L_`2XYhPt_b!eFp%q?mMrC zT8VBTa4@g2Fm{T3^-OwN4BLrxAx#5B<3{wObVFH0*I!Mm*&Y=N#5_=sI>*C8*&0nCzYR`a=ecraq3FgeuXU{v zuQwA7!g%cQ1~B#OROYU3^batf1ctT@MEDOywI2dN>8LeQTS6YBk3@9lWlMwrw8Wh{ zw?c!}`x-AO85!MiHb;J{dS0>ueEt5^&6!m>x|b|)-3gznD&v3V9g!#Htq53XC7A&h z&ttqLF&qrOX;(@_dWCq*-lRav5x^slyG^Q-+3;iH;MmRpA)eWPTkEdN)r? zKo_pL0iuw1F?gzCJh}`JuPXOcMQ$unCg~pnWpXih8>7mv0py$zn^dsqhw@|(|3>=T zc)m|ZIKG}t6&|*R-*~5|dLhqlt_3UHR44l0;MzV=UX!}brCd1%F-|>#L7v&@IO}v4 zj7RBcqfitaN)3rAn_C=ItyC7XQ#27@@V5CR&eu??nAkf~wtzjw{3*rd7ursOZYZ{?Mc}y?XUtQG9Mrxj;~Ahr-Z(r)l&GCpBh1s=VFnUO z)1pR}g<@$wI`WO}o_Lsss5j3;1pCMGc^lu(63#ZdMNjpap#8_m1G^ zac%S>$Xwt?OuQ4Y+T8*0{yv^&Y{S0Jp`d!>VVWCqtyYmrv-XTwhZNi#@akUd$PAty z8|Y-=sin3abF~&4L7SPSYu=WI$Ck>F0f#bpNjX+{J@B0-13KDfqNd!3BRD5B|MAGk zR>;=u;XlOuN5!}5A#W~VfG)r0`ea0fYb+N`=3HZKuium)7|=QM;!xfD!7tDAo$UJK zZEhsu4-~mI=yheP13$M;Au{}wf0rh`4HvDw74W1n1RD)Y(U0eP24*0GX{lcmF|@d0 z>k!ke_sRX(*(#J~p677|*avMMOq)}2e& zap$5glFH?p)aw{M@?(E0K*Mu%*zTxhYJ*6@3pZ&9{SExH-d*<0qBs_2YVg^y!jSi> zu-is&w4o^ZZ>tY{?j^C!smjIY*3dpVI=Mm_!A0HkSkrXF<0R#F1(oXOEhVoef7AMv}jP+E=)d>){ z#CNlMBUs)?=TH0YMX4&tBGTimuv}b!@%~K|bbwsPuL(A@+jO+6@5cLfSIZDy|N_rfLjGX(#pEUxklbofN1 zx-s>3=j{NtH{aSlH!0(rA9OT|nl^=;B+Hkg)`<#iUiyY`k%+b;{K?&=)?2+VA+0R1 zB_$m=ERy8Ef1cLqX~c~V3`+KUVo@?GS($9UK>_E=FrU0pzfj3e;MSs^UxA@+GD9xJ z<1(e)784JELYbzLT4YYU1H%G7TB4BEKpP=Vp`BId@My!ts~|kU-ehlevWYec91F;> z{#R-&eLG^p0h7Pe?3Dh}bet&={s22AnC>(%hu<71ap6IFz=ezR=7BHl;}SH`c{!k) zlvE{BVa``~kBjVP- zSHq<^`?_YafJ24)?)yZ~13_RL<}k?IlAMnTHBDan3X3`^c#;a!p-u~1>HXsqy98gC3k_1ZIOdg1q z=w!wD#9dNG8-4y@`G7P29evWO%Q2hrvQlNrg%fl0s)Qli9mr&zU@SSGHaICoim@dg zsLWSubaXJUp82u+fl3HSw&2r`S3^8*GH>Q;kwmDj96_xO7ji=$Jh?TnRE0i~3Z_lX zxPcHdlj!d`{rI%CAV=+snNh{4(QFL5O|Ge-Xp$=y%uFpq#=214l_p0f^!=o!hTSt? zI`McU9KnUD(aHCLypWh%wj#^VPN>+NG-I7dvk0iK*Cufox5)`#_~NtZ?wJ2;F3WOLNUlwk#hmA2Gu#3n#vB%rId zKDykVXB&Dif$sX01?a=#U3TS4hoi6=t`#b9n+vk_na+VW=0vM>D9VyIZ`7q;sGxnV z>Yv7QMCb0nKM{wW)9hRQ7L>M}{Gqkc$>;a6ia0%TvA(Vh@qWIqTII=m+?S^pSZ#VQ z15F+V6j)p5=q?NOeXE>iO{DAMou6=UY4{tv6^cx<89yJi(HyNdrX!#fMI?7iXf1vq zS!^yyxIoUpf*)KGp;ZrpXUcOc>AWG%Dy>=t01^XmSbx1ocWq}uo|sUbmt&LSX4o5lX#y#)qCRUR9ohko2qwIw-n0e#2)uHs4T)h= z$+(6pK6_~K@qdv95z-GFex!$O#96|jq4GG8gFQ^iC@%b=vF$;ZpSv^y2*zN8dT#jP z(JC&#!TEr23kIVdn2GIZ$T~lu8WL zlZ|!)&&C37uvvb9J5ysr2=wVc4KQ800SLsIx7(89&Aa!xPrY@Moc(l{Kck}^&Sh!j zxCDCp9V*{I1yYPMa|i)(Q*bZ=eL%j7yRtn*c*9O2qajs|#T1c2<%Q(uBkUc#`NH)8 zVDe}&TU4=A+x!!hoK6fQap{MS=FrUz0#U3JAn?ruKuR-L+di9ffeV zAV%OYP|bMw#m!)~Ae4!9g82}g@qgw47@m$y3<3hZervf) zwMVWcqs6OQg_4AJiY@brR-*9lrnGeD?^Q;-#n21a+a6=pT8TYgoRqj+ED8h8R`DzD z!;2f8$y*;CtaNzF_tmHx!WmJ-{@1sY1{3LtT)x72OkuY{~a{=&c8FvvdWBR zZl^(I&frHUF3ckqsKruc#n{LkgxKq|jE^2P?xeUu{o9^*GExMnR4RgCm~gkc0^JT( zNh6Lpy3?9cx|jNAU7DG)%$NN8mIGUFcejyor}D`5gd<1vR9@vKYF2!r(?;8U*njGX zZsbmLFu3Nk;yxrH+50I)7d1aD>|CH*u`t>QufW^*A?Z890)+L8cU{tF>9)R*_nO zj4VYuPXQALm1Br@*|~b9=vT;5&c}bY!$T{A`EoVrjY~YSkmstjy-{Zex()9R%BO%;83&Ta>9XHm3P9|@d1s1qJVKOVCOON7BtW7cImL)alVoE`|Z^)n} z?6I$(-UEkOR?{$#13)P!h2@!zSm(a^kPbQpZo#T4>2KP#Yh}mtCWg92p7lPG8n|Om z3=wU0BKEo0gE2lNy5eSy-1D5!D!ZqsHYiG0G376_h+1m;-IDZmQvf?a#J{o8R5u+S zWC+3`8q1}M$lMFSkw5l74T3RE+K!n3q=PcxyY{I5xM#Eu0fGU?UXXD6y z7a)K@(v7g+N&87$JN3xVtE$h=2Dodh!f&mCi5}S4%ehSCk2uu$JWu`7sS=4?MnKWw z>63M=f=9gs>=%P~(XxO2o)8V$BYqX0J_OsXqf#YC)*j5wP@(IMicihcu4u>!1`-mp zrsydXI)>g|>0>8%&~1adYe0OH(QtZ7_LJ5B%ba_JfsD2NpciA@b0{y?4`bDe>^)*- z5a=&^byq#UM1>BsyNoxM`C)%U9QpoyK_*ltj>ZTol%-+t3NBVJTT4tDkEw!oD3QBv zRIA!3ZrfgUY581NfE&$}1!utDmRDO0rnvPmYW}>7Z#sH!IDSplH3NuZsndL2aIe;JcxObgJpO$+I&z$ zN-#NVVu=oX8*NjU)vOe#H)ljF=k>Ef9!<%C%(!>TRPzgIapT~Vv6Q`BuIY@!P3#)gw89_OM!YfH*=q7$qTdm&#y8b8$i#77 z_rF{#$XW%UY|bln*`9DY$J&O6gXP%Cc29zBq1e*eZYr*Q#MS9{0IoVLF$qY=B>eatWrETbl9qbBVT6{%%ZF zCx(YixKSg!sqPiy5(dk2cl9j&vzW=P6JdLYs+rxtjUvr(Bs*t`z(wePn&YCIQ-Tg_ z3!>u%?_)1H!2S!~kR^eBsZ0ls!~ZD+HaWh#U7Ua7$LW>3S4y%3dNRumx&)KDCK}9T zXZ7@q;A8;uxO&I?-vJq3{5O&NvGz2+k3F~T;g6Y*jxfyz3BdmMZJHB;CMVj<9WSqF zaRc)sDkuFfM8-QdLq{WSId-iLoap~K_P_|reG3nQ{~0rocDde3ib3$D!eRQ44iqZJ zk`?GNv0;{|g#mX&fm@jyup%-xa2SCTw$By*(*q{x)Zj@UIxWgTKktj;u3fiw3nPL9 zS7zDSCZ^q@go)9HSJ?j7{bEp6AIkttUy|BXShWf;yC>u>F3HhrU$cmQxCv;yNm5t}!gEi`U*o)g4ldNJ#Pl{Dy2? zy^c-Tt>?#eJpqR6`IixtpQ86$HE?c1Dx*AlQyT&?**nc*vFDvDmeDI?&x*;~`X8BG zC+v6F9|*HB%3$ub#buW{u(_$&=&4O-ZU87CfR|F)6bxZUtpVd5te(MdC0 zyB{bBp4WMM;;U{=-Sd9G-rt9@jz#dASp%JDscujh&==kM{3yn7~EAOrpG@= zXFm0f>g|Yh!+*klJe#{d0EYrfiq}l72H-%tRb`|GV~;GNt$un?Y7~;{#$-Q=#S;zn zdw1Vd`txY~Xfi2?`aVPR*S+zxz;hsWUdx+bQ#)f@jrDzl_?m=>B_GAq$T?4{euac( zq+gF<0kwtXeuk?_<6k<^JuuYwc|#m-h*miJ~0=jVjSI&k-z1*f^mxFUkWNj zZcx#eKv|R{`*&^t@(DRaCT_Z#OQ?-g7~bmo4EJ{sxyNV+z^N!_4UlQ_oRb0Up5D!s zpZ+?3_4OfTNN5$`QPj)NEy$ewFvFak$=9z4z!o#)$KyBC`j{qvapmWvfw_8@|4FR0xSbL=T)PKfm{ZURWv9EbS{<;JU~t^OI% z)9Qr4SEazZcGgANU}T9CiK?iX|De9WTiF0}g7qMZMo{`(qF14dfNOf>?z>whcW)vp zcyM?AXFyHC5cIjnxM-GJeC)|pYn?1w>>OyZ{64%hVP{km+JC#cRIn|*4N*?_M#pHl z`N;GoOdI=SqMtDi6u`TP#oc&7CiqSNRRD9_S%9RdZHS##AttX0*?|>iEt`npVK{&O znpg+ds16?7+qo%*fgWPBK2B0KMqtJ)wSm*w^}Thlg`Ju4g(KMeLWsX%%mf0-tpgh? zEMNVk+ck6r5!x!1*VN?!5+z58&sla??RpGMcOP;_+S)`?p=3*7`vZo7{=7)uKI`=% zu!&RhY`Ih)m&P6N&-JI)0jyb<$7}0tl-K5;Ygy0V+Sx~z&^xNBzW&~CKr*Dl;{low zV|r8xsZ7)YW}gl#{mdz_oCn`fAb*$Gw8^C4h^~i}(JX(&eG+AeW@OzY1&NA># zgwPq0eHjbkY|_Z+cPJq2XK(^;bs7k)souhK`ymy0dmsIvTr?)7VIwAjixUtnMWiaO z8Wdzw?-UMsbj}A*(|pv3>8eBwZmI3AeuTZ@XakkQwGz^Muq#6U+&gH8Ai@Udl6kc3 zUJuFAfvOTA4#eSnN~f#nztP60xF>7w+X1sr+QY)kfM^g9|7~!afcOo^xOm+I%A$S6 zY-~^|a)fF@xOdo%bJjl9id;qo|B!76C4zmqFzd-hs0C_j;J8-T9#XO` zANeJgT8@mp69jYQahQGP4I-y~%;;L?vIT{oIT+mHz6&{;;R^Fko;~rL!B&#hq-5ZS zl1DF!0KQP?Fd!$nHV=}3QS&%UYw9OD>8#i##VA^%?gXtX7z0>z8qui`&l7Ug!zr)# z73gElaj~9Zil?me%s$hzE|`&Oe{yBGwGTRbcSFY``$Kv@8y;35dUn$8k1>WJ>dtBeXTyRi24mhLaX>6sK82U2pANw;>4UP4;yKLzxK zvNrtKac4JJ)klD{)kL!T^ahQdYDIZqFRnWB3C_d$HEufJ*; zt6UHlVfo14yVqZ^mE43bsKx@Cdh9eh%d}Q!DL4n@SXX3WYK!}dPJcOWBTt|BABjZMjL7}Xt zd#At3qn;l(!}e2plW`t18k@}pZB0?6yvZns48#bx2g|Wfq4@@4zKIy+yX{xi|BmGa zRIV^`F0q{Hf7CeV@J##Yf@C54UQzwuC*ZmPTlL*nhNdASzCN{(ln12tk=+ernM|B; z1?OnNH$MsN8N2CCZBni=XSsDhG7`8_6!^Zc3TDp#nrFy~7^oUJ>gY_UB`db(gadkG`RR4JLYrCq@-iy7adudy1cXz1L69KqiPCnb ziaBaZiDAbf_G!dQniJVA@3k(yPRQ|$3#u_C_!*CK$Ho2eZm zk-M9`aBDka$uI|C>6~(Qou&za?eVp(bbaEA-gQkM*RC`0+`G|HmSImxTY$Qi(@tV{ zAew@gT&7Hes_8BH$Wn_zhv?ygIF_ljF5NL4zVr*&HYd`Sns)AGB6Ep2^$)(*FKTiL zg=d%MsW8_Dv*iZF5<6UR@FC|TX}3iI-}zk#4BDmWVW3W7Y_N&O{Oa_Q>`qsI%(pko z9xbXXEnhdFhPpn!z0wjNedHb%Stax1o8YM)pSuu>WPV^()nh?@1p?$_r;N>L&q}t( z%-Ls86>0eRTsuTUU6pMFnA>Tu$Xumv+^P)Pm9gbjZ!xpUp*uo$ezcud=?+KnQiH;M zgvvi)>O4U0?E`E1N?8DD2e9bjv+Xn>Zohp!GF)fpQkgj8KHc9P0}l zd&GBH5NC0iBAODkcXh_VgfrBAL_?m>E7n&%IryZ&qQqO2v@{&8^)ET$e=u86?5ui$m1X) zUi4H!vE)?utUBg@5*FDT@I8UVEk{+ZW$kr8@^=w5ukGbUk{$~m^2=?Ob(u!3-bgml z@vYh3`!!CQJHO5o@`)>z5GDmPjE2)#We7?c^)d&G(hbxzKyI$Ci7#izx+4ozk?ISa z4;%>7g>9N_AjH$uxTLw0C-|L_0|;39A|gN+ei%&B2f!;|pA4ALdWdx0Ijh4#7R zzIZ8%_IgDC>v%KS(OZ=DCZ?IvX0Yk`Z7hhXp3Jg(eg9cHh7_!(yNF@#e{hnl7FBRi zmD^UCM(5QLLU;nAF0a0N)DBLgR8}2+47<++SbA?sv%H&WjNIm`k#X)Dlj;nP@|>#- z&T2RXYBMj7=7k9YO&Y5n_3C@g*lkYwXXsP4@33|*5Y_$gRC^Z(hPg$oFRJ;t1b>I< z30aLf)x;Guq2{7Pv%bOlV^PJS5Ek(O)Oc0nT1K&s3>BS+!8;96&w+kB>axc^0f!2U zyw%g0)5|H`!I!;M>6ZLK29GNy`U30mvf~Yehi}k8!;+%-FP;CFledNMq0V^-32_pS zRw52rKwK|Y_J>5Hq4MXJZsTD=Su-^$Yy-T(C+Xq#@rpKrEO zw}eGkK>izzKnLUPBkV(PhM7`JxkhPPLqto+8GV8@MNp;14|6ovk?{47i-RH{3`*A1 z2=JZ4urXUrAEt(E^Gy%(-+^7ZHB%V@Iz(rsuy;(TWVVz2^P_{LqdEMQc znbEF?VE6KsT7|_xPKAa;IZ-Y_j7BrC&-V&eThRVZbz+yO7Ag6E^*_ZfsI=6Uwt*{o zqZt~*Y4rjjFe3ZbaDc$ryE(NUQ(*_@|0zD@p3q6;I01-V;#_0Ds4h`2kZ2R|iS=95 zz)KdW<+hMmK$F1zaY`dMB(6;nlG0lh)G>wA@Rom{OKon^d6~*1(s)u@yA)*ekdv#S z?xEa+Eh+%zSo^}kP#xK;;EMsYQXDDqnc$OLa`oq4slCz5ORa)xqBox)^Lq~bC5RK} zHPxa%BU$mIA+EAkf>E+QQbQ;p-AyT6g`#TT-}8(d4rcAp05;A%MSJ(>p2PFUGXJntoVz*i6e^@e+Of9ZpL2E)*PkzApxRXKDnvr>Xa zyI$0$f9{%s(~PU)09v7sVbrijTB~;fR?jRqdl|Qy{Y5={?8SpvQ4XV8@ryMhnTDDc!`&xR&@Cj0@w+b%pH4 z#}%yaVd*RC^+z3c&4+W3^@H(Nd_F}&CGaK?fs zNY&M2dozd4fBsUL1ob-t=iF=p*l-|uPn!ExrjXtFR!7$t`eY} z(gd^?+w-!cm3If}?VIEhEnbY&%5MnU(g{ghZrOY)j$Hdchnr7Inj&}MYHc~ozyC7y z6|_aM`8aUyQ%9hOTk)ni%Ig>`!C*uKK*$jH0%h*09~!pY4M8|$^i^$p`tdHsU1)no zR6<|A9Lg9YzX82Cg9<+xdc`d=(?xxks-ZR^#Ocg>v$^&<|I1^9)W8&zZ|LZKpcM4;+1y@McU|wC4=z^;D*Xn9#S?AF-_vG9#fY5jHmEQ z_UdTdTU|Go<>?Z)uMMz41Gn>m{K@3X2K&87Xq*WU4EC!IS&?$@E8g*nsQw!pJ9$v6 z4IB2fW2Pn7495KD(Jf&x(9{FfCM%=j1KuM}CtNV(q#2VI)s8=91gPQYoMzV$m=Pf3 zAAU#Gfa^enOAsE>T%J9Y=L9AhjuBX?Z|#g+Si9y4z#l?M?RUj&+NK#5=Xg(%e4Pjv zIa6MDRps0onb)|cF9_)ATu<9luq-xr|4NH+7;t%??<(e^e2mtr%s)ddr(cYlMXjjW z4f6%Z3A&69KTXo$6#7rtVYknn=syf>XVYVno51lFCrmxTGL*m*+f&EpgS`Z2^741s zQ6?eq_4cPlq=|W#w8V=0GCPri6QF?eDko@eZXj0c=lJOX1M~;e+8%{12}Nb>Y}(^z zoBNphWk|=}e#!xejZYqzWM}>A|fB9pmURl4AdDp?~=TkH24Bkeo zB!EApp4S?OnuTG;zjLhn#Y2?u%a5{F-Ej?wYnR3F87u_2L7y~7aeEN4v)lA5He0(a zVvW<5YboF1F`R^xK!}vRiX-}7Z*e|~C*G4JK4qI;+%c^o{Vjh50)Yifb#~#N1DD#0 z&x!q&ypst;_hf}GiI}9GKL+5U8DeO4d%3MLa{LNirZTsVvC5i9-C8e>C%{iC$Wqjf zGZ#r@F*t5kfz|kol=dzG{&n2m6D%dvt@+w~zs&<bUL*GF_IL zI3a4gwg!(UNyl0-3yN7nhPKtVmsCp<7RZ&;5w2II9LzdM%u{yRaz4!UpFVM0U>~AxKd=Byj$x-1+c**{A zhETez!~;9p+3^0bV+TK+X7!;v`U^9K#uhAR4)IpbaJ(@?Tg0F{HaGg7>p;4P9{PUd zJEMO|XC9L(E%nF%_EJ{z$Z#3&<6QKRua`>8w`@I0iK|}O#$L^dRtnciP9tM9RokTHNw}k@w{ow1^$vaSrv{&F`)u+w8hErU4(3PcOxt?YxPbcC*~_O zgg+icIR)q0|IG=PDO-NTC&!~1!OwQnTQ(2A2; z(c`%ia`>Ha^<}3rnh5^k-7dOER*hVwOz5w!Jsz^Y6CYr%?Gyi&+)!)!_v>ooi(5yk z;UlXe0jqw%4~pSE-cn-cyveF+4ZzO!rEv}U)$L=%&LzI&0)Bw5V@>;7^RM;jegcN% zSNdp)um+aLXRKhNDfR5COjnVb79pRg9N;gh)nk}fa3X|(@1vK+IhN$ZoA3J;9g-Ci zf-C~93}AZROP&Nh8zUlL{p+fLx-3RTd|g(1s*k|i8J0CVN@3tBw|(XhDpgBo=vwUS z2l2V(A*6B}QEW2i*e05q460Aa_m~GkjsvI0f(vl)0I$DZoxEVrWpvuk2J20&MxTru36b_aOR&IgT|^p&PhrPn&A7Lq*^ksGBegHkg?J*@rh%QmHQ%KK z*qTt}vY$6T3jM&uzq5(!0Dz*H%z4+9O)W>Q`?tu}qK(l0PnvNm7wPf|_JH*Jz>n+U zETkl&BknzRpeP6kc#Dn!B24NvM%IOvGBpOX;`z9GdkHkNZVt7<32I8>#V*n9L#{UMv%(h;lt4hAMmthy_KX&#>0~^hgS}EwgdDK%P{94_leoJ4%#m+I~p8E zAUeh<_gZfoQt(dg~6gY@&7!r@`)W9E(-1U?P&8|Y~M)qY0bg(#U4D&BFlZ%{Y5)> zFFHZ6EhutQO876A+R8nW#%kX$tnKy)#UB4zW8e&n%ihlt)-MPyC+BI@_LLstME zNqzmE=;=OH|7G<&vD1j(R5gC>wbdwyg1oeEuqm(bLWud)2|-33N;p(v8vs=?u3UA) zytj3;^OR1h(LD&OGYZp9zicXzkG&mnt)V=%9ZZclyR?dv;6#-OX3=gyXL$kJof2oO z2xO;zW{Z#m^%duzd*gl*;+UrQ7Y#anOpyU;U2-7BIHp~N4v;otyh0?y29Z&mWljDQDyti z0L@ocv_L1Mm_C7}|MhGTG5naDnbh*Zkg!~+O@|7#=u=d!ebF%j6<=t$D{z8=hM@-L zn@bRqC+xs5jI4`)s<6w`+Y~U8Siuh#-$0H*Hv@YiZPbn16{g@Ca6J%#+9~EK>5)TI zSq#r>DMHx;kqGKa89qMw7bS9FV<<>!=|7hPJvJ7-zVA@N=M81R2=ytPehG~dZ7GxEyT~#~mj$QxK;Mk)JcDfjFe?!$qZ{rUY zj>aTWraXZ#IFpwVqb$^7Fk%-C|aF78@ONSJO0 zXD#V&xtj7ZEDgcDMO;;y)JkVpL>)w2@v*)VXP=s{?p3uS)MiD?dn1F(tj)6~I^45u zpgL73zcLi895FVdvISGQcM^`?kaOolBGNHY-mZzJJ0qI@R9H*yDde+F)+cH2GFC*B zfNhxFX`+)4`m~XnX*v%b%cOx!LJ=(`&_|by^e#%Xh%Ze%@Pkrq)JnU%BW(Z)QWbTx5FyyfiYDJnr z|FH&(oBSo`*k_6vDaMZZbWrFK5;agK?ph@$iy(2tE+p>0(tkmDQMw!2h7(!ouccyx zxN8q*Qt;f~s4O7X`C9#Pe0E<5;fI*Vv7m3!K7JMAT(=FCOGT(Y1{60e5^bdCHnlh& zm5V`3Jdc2!EjKVXl30-MQDsesoXD!*krrg+zJY8(gS~md>-byD-OQ1OJrf99Vj}i3 zJ>VLFYzWHebDTvqNBti+SN2?@A7w4CPU6IV`o zKL3gM&RzL-gxp9cMX=xge%lc>IfYc&r;y?=Oic|^UKpeH5I~K<0P~{5(@)x4N4&E` zs8IV&j~Dn|M!ChUS`gS|POdMbb+c_Qr+xCPzDd&hLP?4YPUwEyZ4h0{_I=>CY02^-75(u6e594hbwg*>lxZcNJw!QzXyze`cHms zZhdBNi+>tnl%eE&p=pzw@vgsLfa|dBwPnf|`=3R>g$!Y38XK^o$^YHoGq=wKYk6I)>viuN z28^HxKtkU1M^}+aGg4u<7pp^7_pO8N<?qA-%=IkC7UsQDk4yb`Q*tlmrjR%} z4}%Un_pXqoia9ljJ>sP7=i;^0zatft?tKPe&;hJJZmv{RR}1NRW<>fN-Ftk+ExXX% z_?DM7sy3ddp@VY|>`6H)0p?s7%xh5CRfp>`s#9Sog>S8y72TN8Xo=~*d%&0G0W2y3 z#J;4=&_R}m1KBA#KK}*Sa{kh~+4Rw-Yh&?O4!K&}PGuaRh#7QQYE&I+j!i20d!^|Uq3oc#D1|G} zT~}2XJup>)BM{rw`@ih`oq{Ypi-OE$TmOgS`=Vk(qSrmDn?-CH4gtzzg1=yr!h?Q? z@sap8uWt2S=PFz(WJCeT>jJrB#FpB189WyRP`&Us$NU)v;Cdp?(GYW$mxsL*o# z#dhT%MC+kI^cfa4iag5b#XDweh2{N*W{o&qE-tS^P9X1|A|Tb3Is*9z3l9kaDFyxN zPSUtsX8xrbF*x^IFVKb5(*iejR>v+es0NM~w5b>$HofjnNM1-3GntbIGF6>NepO9; zo|Fm3O{+i0qX>K^4_yy65?YJf(QZay3vV*V$7$I{`Ty((vnVA{a|rU?P;)XtH`EO3 z@s{6`jW+W%JjPrnGp*-NWCK$>ltP}CAUUbl!CDvTQU~Q#>^VBxRc`Cmxwki4QQdl64hw;+-TZ8&5rL2Vbp!;P8Qq$)WYcYdG;wpHFXEz|ni*_q zf`ln(#BOHY#^l_g6r(L85_DKW;+JKjD!X_AAdRe3lJJS++of(^6nWgV-~X)~>S@tO z5hfBw9Y%=RVFmeve_`z%b{T%a7z*pIqT+4Wh&9iQNV^?`) zWCy?zOTt;1WLHB9L?E&iOb96kR}hX~WU20o8!m*d(ccqd56D_`vChGEL?Q{yG|yTi zXe+=krZj_KQejdP(Cdo8+VCZ2-=Z20@o0eyTHaP>z{jyl1|R$8NSa!m0;Nw`nFAc= zwRuyrhD?F)kpN}HEhM2be8xi|VWWZPbr~G!zPE~e@1LM(5v5WmFv(KWGFhsQqtT!o z@~09cIOZJ8@Mh&Z=^V_C_&y{XZ)J>eyi!k*=nNL%j55Z=EZNwyM*JQuGw&l3lr~+P z`Vbwv0{3Ed1{>2vxoD*|{_eE4P^J8uSoNb3=m$_iOm$#+Dg4wIJZlJ;$ydAY>OEw4 zBY_@(gIcbrlBPLVEe996A%HzeGaNFb4aj8B-Zmo#x41qKwEUnB})F51GFPQFIo)Oba)TqIv zR;VmPTMrxNg;EQwX0KRHo1T7vFhX$oaG1^ZIk2obKVGkhDHiH4`!Zhh$EPpCFEu*r z*hdvW(}2mN=TVKk9-|FRAD+k$3k8`#Ir8H~=mob4rZ=9%NNNM25jMrK2OTz2>Fh$D z76pkALlfHbGrjnn<#OpYq`>byleo{*v1=;wn_@wYS{M(D#Y4NYa&IW`bNU#u!y_~{ zn4CnSkY9NNlDNYBnM<218eu#pG#0)zE8G%|ZKrzLjT2v4Caj|#~I{JP)yX|d45SK0B z!A8R19B452nfGDBpZPITIrWXggH7feE#FM3S%}vsn|&&Oj+=M#W(3XAeYjDv$*br3 zq6NQ`^R%teH#L%I?Xm+g3ZWe`$k{UAf-WL2tOedD=qNI<+okuVUlFh;Fdq1={#!a!}xR|Zn~&4CC8K)+W5aqSQZv0 z?h>x|A7D1Zh_g#!uONLUe@e_(YZZV+7pJsWz+-rjBTMMroGW>F>v>Xib*9{+h;2F? z8_zJ=T*!}CnbI7#YLYKYU0^G!#k1=GuWe_ijPF+@e1 z_@AsQPW6S5YtR4EXKmJPC=J7{OO00Riuji)AktgV|4mhKVCAs zb9(s5P$C=Ji)(WaI+OzQt~rPOnNP2b5SECAb8X0NhV8z9CZUXh;)RY7@-Z}Hv=@eQ zqIzg+uW%4B3J(0N&d5VOtgCPlP3;- z^~-kk#ZAOGerZguHrJK-Gr-VJP4fOE+&#wUQ;)!3#1?nHgPggUayCF?c7#LPM9fe0ZH%Yx4wS1Hr7H z!$*?1+T!&J!ie*gEjS#2CBE#{Xz}WW1_z~44uTOgNa`cJlEfmZ3*5#1mw?n6Y?;Ty zQSHM>-U+uF69qH3cdGgR;EhfnU!Z%hj-@L}kX9A>))ZbG0-WI!UmG=3u zAm?m>mBo9cI(GbKHF0vNrG%0<*1r+qxz@=Sw?p_!J@kXs5*RMzL{;Mh&zkoM81D=m zF{htkZ)_=XF8zDU>-j95E8&W@ubx(2OyhmFJMvJOUrh7pYd=Z!pDLYPh)q(%Q5HD# zG(5M-$WPQKurtW4Rb||yKjoayWCwfg8xk>ALr7QHIm^q5npuJS{q59lOri6PQP-9Y zTT-x6ar_-@Cj``jRcK!2xEAgoJe*Y2B*Zg%OW&_w-gkjJ^Bj%j;;?nY(H|mCvz<5h zab_2-Y^$QoS#q_snvygi}52DMP0eC zAA(;L;aMO6OvHAV^-qWmmCWC=slW!nSygMvklCFI)yNB%7`$?4<1h95p8m zn#wKdE_gedN;~DUa43j}_XyTcocbh-xg;aAh)K1|@%O=v%-+ic9P7yzGV1Y+Dq7qX zs9|S?2d9Uv2MGKjrMXkjnu~}>$woc4eG?@f{8C+(Px@_tC2K44B*`QH$A7+JlM}gm zt$&ShR{XKNk%EbQ)st`?6Xm|B}dgHw%(fvTN2|b~++;jK>TD@kyafTy| z;DDJCWa?OlWrS_y-NG5}K)VhV_I#@%$={Z;>>PI8Ul`7?`j%=j`Mag8Gy1J(hFqml53Y~nfzzJGAHCoEn2{t4;EOp&Er9aSQ z3(3>}EmXjW?EVidt+ql9P>Kt7>q@}y(vH9XdiD)i*i!+arl@JgLqrh+8v-Q~2C1v` z(Q$1J@zt=JR8j`g43TaW_RSh0fM_Ew$Otf}ckcME*sl6=`*Rz23&N;^83{~j(h{y-%-|^j$oM^r0 zGJ$kbkQpKzhQYI@ey1j({tAZ+YtzNY3fxBb3t+YR-~9C}K1nVJ32-L53Zfj~A|XB+ zTvJ{bvRb_iZwH3&+YJW4Lmw^=9Zfbm1HW+sD5-#mKAMWX`9W%F$X*F0um@dgin>^n z0+@V#SP z>|*p`Csf-yFt+@)8O)ZxVlyxoVm}q!TS|_!)KKdD(WJW`y>E$InNAb$p!b!-G93G1 znS`V!rMt-!o2u$lntAcwhSaN+A(tyf&A!zn(1JSJHKdsp#Ndb#r(n$_v1AuMuOIro zfvkPLVJaW&Aqg>HEJQoOJ~_gBVIULYVV^w38cDr1dy&TrId&ji{+KDmnV9`QZwekd%)rgh@}g`CeVx7az0OWMN92WZ z+N)~n_Ch-2a(GVr=Kpj2f!VO2rlUo0pHrDvqpP==toD~qC}n#9BMYAnOcouHR zHXFqphM5QQx4XY5;{Q@nUQNW<%hs+!<(aF`1UqlV`zsa+`CG^&CpD1s0Xo+qzpg-% z6Kg^}nddqP={VxzaOKRHDKoBCbzl_hmgpB0zL!c2Fgj`JDUV)GoGiLO=*um9s8^Mm zS0~2Hjb?6C_34<0P;7}kbLb?bbs2LD;^nSgLzLrq$ zwB^34UH#WHoam_n2#`8kZMFp&2-+%8u?_6sx4REC@8y1pb8;eh%5O+kTgMStz&Jo z^&+7woMWfI7R6NeSFxMz=5@a6=rrMCNEqmVCY%MW}!Jr`=Urz2?q7s&Jwl?-qWdj{lv)86P)AXgw9|Ni1;{lF#g z8ZMs`*y<0X+u9;tkVE5~9%;f@;1?|GpvHbu%x>h1~xLu0&{;jLF+mxKr zw~>0eTcrt3xRpfDq(*6@@e0_@O8z||)6jqx0K4Hr)IMUR?d$I9T^*fE9^b%0``jHY zYkc_}jSu8Kriu8Zr8)X4oJceT#AqXaB!VV?S}vguEz%qC{UY^+&Tr^<B`gh(Xh>gjeNwRNzc4*5nGM+yRRxm z{PlrkrW_4N2|5L!{@-f;30}s8GFKq+_9Z+g!e-|%eNiEN3w;FY<(;$)?mO;mK&`Dx+ z!5?@!0lhDcIOP&bA~-e+B-m9_AUsto{^e&oz8v}med&9CyVbGPIA0DYSS4RH^PeN5X0IN{P zNx;Nehr8s6>6GFVLIrf_g6=8@o$ny*B)~SpwY1a{Gk%l&TM9xvz0rH&wWnXS{W6nh zvwa=yXO=^Pg_+J)NdmR+R%)8h0z8cDQR{hC6qZmm--;h;AxOTBn=fTH8N&-@F$Qs7 zGgQgxH5u=xGmyw#<4u}~)`gg0l*&SH8?JL>QE^+0hE0#ulRqht=vG>$I@9yoT`Q5MCsP~;t=I%NMf&$`J&=nj}I=2Qi}?niv$s)xV3VV#5)4G z`>e4d1Lfz>fWsK&P|0}^Za$ReYtUQ#@p~hTbNHCtN5+=-Rc`cr#T$f7tFmB`O#sE+ zaAEXf#vcmzrI$bLTM-#)H#BIn)JHj8J!np*P(o??9db^=@WF^-j^6bnhS1n60>V6V zH5r%^X!A-a3YjCYK~yi}1O#&LOP^g!gaDdW7FKtEC4|Hk;UABI1Z@hUdd}OAXOmoi z_x+mQ0A4bR&W(LZizBrst3b+el{ePXDC^|SrL_WnYW*0${NzkR9jTnQtcwzpJe>pF zIT1;Id8l6Ho_>Bq=cY4VJs?<24=<9iAp-`GYHnRx5At6(6~+=Z1jy6wD7vciq`M`l za9=N3bBX=@Q1A>U>=7)3rzUy8*ndug8*zHq+R3#fRUkKfOLbCOhm#tLoi(FvBN!2x zI?MGhTqqL3*(7~hc?p0CA!NK4U5~prqndOfotVvWv%gANS?UdH%418e9Zo$5Zn!T( zsxty*%KTOKV=Ipr@QH(vO}a;}MO2Aj0_^#K7@?>V?v7^7Ksh^B{@j+orU6qC0m1g_ ze>)W1=tO9`B0+3kwy8^?yZ1G}B=v*4a#5m16N*RTzY7-)OU0;5lu??SogQZpu9zhw zY<97rqjevy++A48P5(wInSBJ%&WOu<@^^QE)}q3Y3o+R%WTF~$i@9R!*Gh^$=XkL% z*?xi)|K(A!?mmng(IB!6EyI}G9;o`NHk*cmb(9q(q3kPa3BJlCpaV#XV@d8Wr0+v! zK*UIEOxfPnH4Xf~4zC1fGIPh9~2Jhlq8= zS9JNKAwGu>c3s3&PDPw+A^c21s|${$V3}^O^A7y^*Qw;<$w~5IFvC!%^+y;5QwiSL zK1g?6*&t|V0a409g}M~-t{ld02bLLs^g`XVv`$`3p_iY`6(TNuyc%!Ff&(g0j{!GC zGh9M z;KHm!Q!OO0y96EqN{=BemOZtZHxFV zGJl|LMtGlq267O3*1mle(RwHV@qV@VqX#gz{n4#}bnk)NGRc@@7|#-@+Ia>*nm{ko zA&agger}t@vU$Mn8?-R&Gpnk(T0vx}a$0)-+KhFIaop=b|*vA&A0k%xo%MNRXu z-!UeoWdKJ&xWDFl;{l43G6i?Gz&=ujHmppY9g?mczvJ8D4!5fW zvYlT7kZ$}0!hpU@{|gcd4k0_Hkz9niUhBZDldp*OyFB`0J*GBo>x_HMpyV%CWOj%4 zn*#x;FExbj0L4$vjFVmLzT4a9jslu`lW=_+{zqhp6BJ(Dr>iO9Ipl`c|75VWU#e$g z&e16-sbOZTn+!B~mBzyN+G`av77S(V7#;3BOW@t%Fd@H!8pMgcG5zNRDVr^HOuH&f zW8+{SeeOa@9d{m7XBroKI9afJC*OvO@I3LDC4~>Z1$?_-rUT){$wPNOw$z15Aqf(+ zXKotEF9HKD%lJk8&5h;9)(bqfHTg!; zUb;r78Jh7=r-wVvFF76hE^>pHy{Nj|I#RTOMZA|k0T($6`fCG2@{D*$UIVn;5F{tl znWKMT7$_hf=?WvtST#KGnC09Rs<Hm2Pcr|}?S6{mHsBL|3{XTaId#Yt^x$y~tW zIgg4{WX<_l*Uz7!sObLJd_gh|Yv0ON9Xe3XZ1rXdsrWjq7b;G%nZX4v7)*S%v%Y@t zWa{bL!41$Em*7d~X4FiXS)pmC$#hJrPu~hqn&l4u%|*uMOP+SVHxEBGRWSO1&6a-A zAZvI{=e!l@rI|ZIS)s(d7t-79TDea4LrALf_i`DLgC$A}X>BoXgoo%}t_FdVH|;F8=y!x^X5k z$euEdH4iX)=JrUxPPB)GR8UkmWda@O?<6imvs%!25uWZiE4#v@0;k)eT3xSDd!jyGk0l6;^|dzb zoHcFEpr}Whv{fRLc|N98Zw73ussRZ3+lF^_)ZsgSdgMfXEmscN0>`#mv3V9W{ay7R zjx}S@D3aJ3h7N|#SaU)UD0j8s={lB;zdiemT*aupJ*W@+28Ge=9!J|@Qso=YoU}4u zak&UpfM?23VnH_R<>j!Ls zEArSUu)dgsfKw%wm3ICtCVtIvtoe_Mu4eWaYv&lHp+5?;dv}kU1L}jYCE6w+*UK3PJ@JNov2fH z=dpbBbC*>^x+ywLgUv58@`)7zPJ`Z&X)6b6x^^(xfAn2Hz|5m+(M{hp(izTnpN8D? z#qey=RF6u3@pmheeFdP2N74FCkQl9o4T4!yv3n|xt?Jl3$;b1u{AHV{h`eV7wPVYn z%upqy+|@K`enqx-L4KzWsk`=N>s5c9r1O#iVC5aGrHo`{DRhkq_D(nFqWnnOC&2}$ z0N61{kj2b1vEJUdrZM+pa6e^F|I^;@=>Cp&OWVgY*PM~??9SWU89>F_k|n~VicLC9a$ z@nVY<5rK4BnLl47P|oX>tON>(H)~rHF&M?vHV$poTfcDw=;HNs%(^Wh-Zb{ifwFFh z*>TNNA;9n_Zy-?b}#&RE)1(niiUJ=V#~lBwa>zet-OC-Y`D zNV{6#8kBbw%TEe|`K8=loWcSui;Z2T2c@H;Va>^--FZjP-$X>0PrDJ8URW2 z_nuxIJN4v?_s=^dfDG&wt)x6=4J<(tfYtxtHlm>%Dr_SFrsi z|0&SQM#Tdkgi=R#q|68U!KHS#o&3t1V)O0=m_Xi?(|VkLO8;6 zRbu1gM=@-2#_Jgedc}!pkXD?GOmVTz`OCcC^EnIYo0i^zQ~{TUT29_UjX%>7z02^^ zJ?nKfEXJI1zpUmD`!UnGv4#jy(l5ADz@|s9GT9MM_MGr@>2?&&bLI<^T4NBDT{P3y z-J)4igcTHa2S*=G`4v8N^geqT;cJn8rNAJJ|78dQ989hTM#ml;=76FlnZH#2=ArDp zYT19^+8Tuij*b+jdsU%#Zm(gZg&^~CibSJQRVLz(3$UK|c7H~a(@I>Acs_zQ0+65Mn~?n`J@gYeOWf5 z%H;{!*bvq6GMu5#Zu_MLHm6wT6oc{Q{@D_lRD+m7aGfL`{7ZS7>SI9G^?!%a142&3n(TFml zy1-;Zc1=wK7fqWUj&Vi)cp;E?!!`JGS$2m%G}oEwG%JYKW63>* z0na+16jE|xtFRgx+t%9cn3NiIkXE`%K#t^^K(w>~qAuCmKZHpQPae#I7uR>zh(HlxC*K3_U0e+T-BPEBJ+qGhot#t9nr#jn znHdhLTxE4m5g4q`5GV`c-S%~Ta;6~fy-$PEYRrZ-V16L5;7PG62+1PjC9^-f{W3BP+HXBS(ap~j}tP%w%y?kjFT#8lqOV?b@*~s@Yt1`pmP-XEFv+ zb?>s5;{OSx@r!5bbOl#ENh=#?>-LCKdn z&~d=DCBIE7az+T)vROwS#R7Y{;1)m3^{Vi!;rL?xuKxJT*wi^Nz9dkP8G?-T8#Cuc+;K zTm5K}kJRhwG`$%zZGkfbkwd^gT*WTUS;`L!fdAG|d<}eJZ(ioH?20BQ1GI*C)#G9D zT!@x8h_iE=3eM661VW(G=O>?K)ncR#CPcGPK!_1`=-GPaC{{4S1xYWJ$Vf1O3#4gk zyj8@j;Z!*m33efF^nCQExB!jTG#KPY)`a3K6ew)#Lqy?g7nvfawvZ0pKRReSVQ_i$+H z&Y%gAJF&c_gr~K7V`R8eOm>C3l0R%e{M7;YKBl4|62ZVlb&X~5(zx1k!lme~e)%JP zVw9&%kiC|SE-+GveVU%D5C7c@g+pZ}h5{yDc4J!Y@er3gMv~Qt#V7g)-_@pQq>FBs zDr7BWQ!Kfz4CCcLxqb7s(VQ%;kq=0Rns$F5%)c9RqO#(2PK(*GursK!psIS@N3v#tEN@|BNMAr;%={UhaQ9dNIo!r%SgCX> zU6z|Vx#dmXFhf8^1e*RZjlEQvI*ot4Jz3C0H;NgX76?afp>Mf#7i6Tdg2su^r!Q@AIG zgx=qz+5%w@_60DvU@WKe90=9uAkGhYByo7ZSsTnrx2*&IZfgR1wq%#@RYLUJ%ZtO; zbd$5B@!^MtbYE2kd|9fe5+ZPFXs4e*Owei1jyyO7{G&~sd@pzKI5tH?ODKJWLiM;N z4zDi&)-bsNh1uKTY8BA#Y)}t@SmR~`T9 zv(%n-9cZR>Z@6=e*e>wJIB-Q#u*$ zGU-`Q%E#*i5s$*aXHBH*eFkXr9W=KLZ}4mtSV&qQui>N527>6|*j+v)?4>)}#s(z#4yxYx1zbqH8ps;(9?yyUt07rA4uUvWUo$F~@wi*IJOKOSvE zWeE5aK$KRt=BT(@wh=~3J##zco6{_Y0QpgryF5eq1_{WW-DA4+ty$gOt2FXiw9nn@Ng)p7ncgCaiIq{T$b* z`ei4#?B!NXv$K-jNFKbgtSb7!-7)vl|2xJ>(^f}$T!vK%F- ziJ-jKBA9u!;ZKbBE6tk__2o7GZXt3TXQsOo{A}6TxJa$?>60qLvi&=IPFMc|SsgJ| z)?!!0JdUh?XYU_oF&T^jn6tX71#k(`&NX=g2Cwj)Ph+LoD1;`=l@6gCyDB6($A`5`s1UzuP%rjsI{H+V=LP96V|9PKJv<(psRV~1?1$_b_pw^O`qd~Oli z-EeBh3I8Dgp>WpI18-UXdVH3SlgJ^x=NU0Fh^jm~A*xZHq2!+MCT7okW~Zgxb^#1v zP8UMv!IJVf>}dddz=au;YIq=`9Fz^789Jq5oXoXlQ#(j2mOuL@{XB&u$4FHPfb1Ft=s|+5D zuyIpdUfys*?dV!PsiSqwpA)s?UD%h*wdb#EKqV$lDQr=&>f96&G0|XyaF7TVXWi~w z_oJwdu0=B7CAAZ_oJ5m`JR+Kho{y%%sAnGifCuZW0Ln5>O`s94yxynXr#0Zq(FtFE z&B(kVDECNQ6IazpBiI&@?UvKpntM97x*D3tVXz8lV75WxF7>Q^eBx^l?BUn?RXnK5~P%?H=ArXdP%aNRk00RG}S)`c==zVsWzY|_s^@HJDJ|9Ab= zfTV0KJ~huzc_pezqF4gr0%-u~5tOcg;r53{6dCa#HIi)ujZt&O5=bUwGAcnr`?Yyv zXACzS5fHCDxuk8>lg(2dAC)zY(%=>*xX6h~*bGa6H50#b!q$AGbWDQTnv~K|GE%YH z#ovb3{ChjP$UYm5@ky(3rbO~Yx7$@K_q^}ktiTWxf@Vq0p@SP_IfRIg>ekd;AOGOr z=6qz;2T}`pi_+#G<$o9x9JkK^V1)V~)4n3m-y*6h#^b@^nb&8m0+^f$)o3 z&$7Ns*r8NPSUKnqz&+&E?!FGx(kDmUiYO&(LfKWlE?!sH-+vZwNLkGq?IJR#HONT~ zBlI^AK!v}f_XBbw$iOX-RiXQwx@|h!)*&1*mAJsR;GB?aaBQ1!h@gccA!MzwG5D!K z_eDeskXokO^&??mk9G)e^+cR73)Xgf&lG#{i1-da3U_xZh0EZIXa=X|A)Tg&fgx(s z-`?FA>L!$mi_L5ppIorPY8ft3JxwkDp;1I-czO1(LheX9^9TC~Zi58HZl8K!cu_vr zk(g~^K#5>wBWv*a5eF?gnVUr*#2Rr>=1pW7NusRHEAzg@W-;E7=}U9gsTZXdDQ&zt z66Z}J5bFY~&`EdO75>QCk?H|k(^g$$^R_q1<9wa(7qq!EJLCgzFG3iy?|9*+GpBD> zy2Fgh9?cf6Ka7QFJhkUj$NTc#b4L5Y7Ot{5HDl&h}gjoTSispT@(?@ zHsUV?QX(Z@!iO4*j3;l@9WxD}rJh=s8RzXzchx=i2^Y_0<->u! z9(sGsDxE6rZxcpjB06>dGL2-$itm~XW4oWF7JIjy^+e(R`tC@+8vT0+ny0@3A zh+{KlE(37A7~{~|aez5;Y2^E{wn?(3&2MSzPhlLedJRBQaiL`Y0qxyMTvb}bX0(FJ z1DOwI2yAouiS!UYKd5CH`TXhda~^7d7wKDj13%i2CojkMr8&NoXpj{FtzdJ@ zqQ8k75d2dWw_@UurlXWC&76taW#fQidM^@Avs*m<=e=4Co1(sj?5lqVteUr>49fME zZ&HdW?|#OVj?ugwVwTYaURg0089^)SN4$b-uFxmsil#?`f2$KxTkSh@A(6>r`PMEh z^rBR>oCoMM7(3_EV*7Zen2^T8mhzCq)oWN#Q}o5rinQZ?E2Mb8)ts9*K=oKm7zUr` zeYsUsG1WJcU8JZB^#>h@c2hSxB;xh{Kmg6ytMjbg4z*m4vo>kwq}Ic;c6shF-;jY0 z!cZAbQ3p2ozHwqgZDs4KZlxPZOQ~>Ttr=Q`aYnwD!a(ht@oq{iBkaQ%p!896_DwK% zosRElq2&f2&!C0k8s;EM*&!9=H9nNLlOcE1W}^rIi%dPpdjz(h;`cd#@}K#ubgl;?xNy3ms7KdnU&s!2ew?Fy9%joj^C6i284(q^!k|evs0d9uMwaQNVaza`KHo1QeNpvIt19IiI zh^U(HIt^60unwc6pY=lZvy@Fi{rT13$0Dp0t<_kPLMF?-!GG(O@Oxp)@G}Tyo#$Yj zP?O7)aMAf*3+BFCSCA0yZ@nRULwTHP;RH7V0^?fEAC$Q8`gGboIG%ivw|H9Gx3hd1 z{hU)TVm~+^N|2YQCL3HQ;`1z{`G7U~1kfE-2murT+0U%eif%C0aSR|eVe)5sWz7JlIw`s6w3b0GU3x zPhI$l;Fc_-5wyLSA?R}_;0T(7tXMWt!HhQexHYPzi5`j^NJI!-QUenls9UZndj~0> zLJv4krH84-BQW4iBZ`0RPCG|A(iW=^GV1_%en;?^c|}gI_s(mVTU>3xRrignVFi-m z-fYm!QJ?2U2vzSi&j0i_9?%5LNYia7qfvv2MNsawtUmXq;r|u4)w$nS!y;WE`@c#2 zXGKDHlg~pZ5TT`=fFl(()@+A9hzxRs3+*Lx~zeV_cLQ4VTo>69FFrm z4Ia&rB{tZY*DRd6Owz{R$U`lHmYjpVe=56> zfyV8sEoyxNqX?nUfY+=)LKMXhWLMTn*~XaRtO|HCX}ynj$8-@8)wTKQL}8PDl8 zDij!}9xT!zRnIkN&%i#YvEF1{*PgZrCR-H)P;Z;;IDX$cv8{6<4q!#?BFygHd;0K4 z+&G^xjmA|VfW_#A8|Dnbibt}w^Efq&9^u~c(?tS8Ho;5==}=7@9&8m9oF?CU;0jEl z(q&_3;nnPL%N<^y-;Ktc-C%4ZpV#%@*Z>G_XYR8*!7vaJMxR15W~z)gd(kUBpHrPG z-Zk^Qe%6qd0oLrEI;!DqykfAu?@&Y;UI}dUa)$#j7&ELqxrfckKE*b|af%Ht?Z}W* zOt|I$U16%}H|&|zSF}T01sZg`k8+!UUR~_^bGos6MUj^|Nw5oDzZWjRWi=SK(ziQr z{+dC_Enj=TuB6Cz@f9cvVSyiC2hIyGmuu(8P{Ss%3d@}0j8<#$4qzi5jPTdVKt;UuDd zPTPoGsQVbq34b?$j$_lX6?|~bzzld%ipRT?4@@6WLnsJ9=rY9$@E~MnPnodLgX=Rr z0ytCq>0X4Xv<~|m1Ns+KAG=ub!88ALose$jv|JM=v0NQ4bvFh7)$(r%(n7sP)wvcp z&s)g*Sy6nyi8v7BKKEDPHg}9+|NN1hLQBXNdrjGFP(mGU@h~cn?=lQ{uMb1b)laXE zE3tdZ+@nh6O@B^d`|>DmB3>Mz>PE)hToUjNqf0$LuN0b_0qaGb%eVOfR=U$bn3iPD zsEKrBBgXNI0v{>39eZ2J?v-@8&ts;TToiMFc`xiytUN_@ddz+pMHx#J)zA4983>pF;@kj#q5z!Cp?Ut@jip$iA{(9AB zbxRDCjB-69!H6(KB0j182pI+O-(>?(%m#gEojL^;cwoeyfzeagqYC0Itgp23ZPgTp z6Ffy*s7g}FqIEt7-9R41Qm@xN(=m)1Xpw|J{~37%y;Ab2v*0kG_-R(4M@SDaA90pd z30N+1x1Uq8r5teJwMug5k#Is(SYPPFVw~W^{`z)2*=?-A3~# zU`ay0sge_Q(5t%HuPr;vDbdc(VbNq)Y7}gs;nt3>*upVSZsz7JE)^;~6>V9T68$y6 zQr%Um;xr+6n{Uz*4&2BJck=6MCFe=6q$;*y)|OXF z5LmO2w0PsNhXBtfS121xM=o37)e&r1C|D}oMcO$xeW@HbHT*u;*VXtEIklp6b+hSS zuuHK*B!8ZfomyfJIP68jPZJcD< z=4r2w-5Zt8p)Fv;OmlPQsa%6^ynIZ@k}E~&@YiUYu-vkA>%PexYSOoKbzlCPQHK@4 zWVRcck#hf8C(7e){zU@%v95<2p_k^IaIGZTi4xt~`qbZ&C<7s(V(RMsvcMv_2^Ybc z&5^k%_%=4#LFd2@^}QI;qxa6}Y%TRXc)(KbR0XvqW?1Bqn$HyHB=ME-1udljBQA&R7K>@@ zt?>^8@Q%+{m9$=wgs-1S2?s2)kQ$FZ(KK5iGvMtIa&C^Jd8(miwG4<=1@7m0eLrL@Es81d@&CSjl>EojW!3SNUyM*L*qS~0vK8>g`TO`o5+R2W|1H&GPKST17f8@>M2L64=o$H zAa8En!w8bL%=o{IW=7gKD4_Z30fJ;z>=X}{LmRc2PE3uu0g?tP!BdP*XCSwh%Qy=R z-5gU|`OIheXcrkO-dQOZzM@;8u;}XPd43t;)joaePOBKynQ_Ya<*8^JRrpH)w+#W-y&Dj7vW|jgq?>>B z^Qot~#a#DNnMxpPS7@V1p*MDKyaB#*XCD`n@O_+q-x2@8JE>|z+g+AeDhCQkNGYwf zYfS6Q$XrR%SDWS%laM0DAZnj=uAiAG>s}57cNp77bS0L{gGOL}HTNeCt5BQ8jtJhV zQ}Q6yx1}(-QFE#+9OLyh{EhY6Jd$0P4R5bjc}{0CSZZ`uzMy*RgaaywTt_EXb8>LT zB5YfFS97W3zdw&C$>fJ=pM}0`nhS>UrxgOluLy*0@j#Dhw`G4f>68)ji9v|6i%1ox zH+~}D81aT3A>dl=PsV8|AcJz}wje==TaB}Sr4_Mh=aCH%kb`w;%tFEXM92Z0EtgU$ zDt)QD-EYS+TY3{w4gIbTDh-#>{9P0%iybO+?aBMtStoB@vRBXd&kdf9CVmcOeR4Uu zLm=^-kE|-jW=mR>rabX?Hk7mkeVw|Q7o)^=>n=Mk9V|KiGE5DqS$2Ji+h*#try~AM z%V-Rp-UShX_%|{8tOPonqiEU}HZ;(d^GEjFsP64x?X3&7`QOrRr{M>e453iSK-xG| zL%L$5pfe}F#k}`;&KqvP)TZP;?>^jbg;@PR%{}XyVbbI4FJTybkdmHf-3_$Hg;~N& zk?OmfiWx1+AQpTtNfb5?)f+l8%>%PapDrPP&|pMqYg`{YQ`M=7y&!d07O&eF6do*@(Hjqmcp*|AYZ=M}nvMiYS zjfz(cseC+hTfJ|sF}ifB%?&4r3VpPemAR~T|4F+iB^?Ht(l!03$G;=&!sRzE*iqDF z(bu6uemRX(@QpIGh!RBwGYT86Lu5qlFl>-ohk<@G(-(b_sjA$dw||>cdh~A9XAcOr zM@sU9itaQX6s;n)&;C6h2z~}iZJ^GYeY+DB09ip9#m^$(0(Z@Fo(Rvo z?1!YI#e?j!Jbr&T(C4Rb%A;oqRZ3!61_jSwoAU+o$EL?#ti_GMQ=S z0{QZ3*b^Mfu~tQGNOAzqk%9_KieyPCRl4|;RiMe8)@FAqTrqZ)+hI6hz#O~jF0`8{>wfi<~r;`c}Ek=t+hM7wq{HTc4Tfr>4B6NTBXvs>$ zUBJYA$?R%91p$$Lsra_<;5aQ@m8-0Js110o$G?`Br{C3+2C>?8fT@I#pp{((K7Yo| zn)1u7a17|rvO^qt33_>SA!7%;R&XZe=>113F2$U-%uP+{ux>XdF`)=(SL_i85Kjo1 zNuqK=f(v(~+<5q`ceS!XILVPO+?9*JL|SqsM(yo4^$HT5SA7>9nnI{90}S*>1W|lW zAqMWVC6lRkDYowFD1ca5U3?c1-HzUBwE!2#7`*?FIXY_f-6NQgGc)Xbyzj7%@9=Fl zCptuz2@`36vN+f^#W1g-!#LKc7dw~gF;7OFV!u!4S)!b^|wJ!fvmg4upf{R7DA5VM@^{vvZnSLK7TY!FST)D z79NwA1~I?|x+0jEbOB-tkL%F!&RR#NsF|kEh)KMHvQ*R!mIVse(5#VVACB|i`#OtT zTTdmQIIQ9Ei=pKai{;0OF!$|<)}d&{c8EWn`CcB!sWU6ALC~BvfMDYz0(@<+N?y-2 zC$5qmpRYnD4Gdr>?nDN$BCDn^g|2s|Bx=UkLXlG6^?!q_G@D|h5Ue-&B>3n5)V!s) z30%!Al*!dP!WlSaZ}kqXEv5j39l@2MHegRm#q*r}S@u~Y5d!_Fp|xx?zq3)5x%p2` znZm!%l{r2cfj$#aY1+FHU+4&^jc)}Mhs3J`zGH)IWbE-1kBfXWu<=oGAl*|cFpX_S0m`+-reja-1 znALGyqohiM#sTUYabb?|CJGB+VlGYW;iL!jyLZ3qJ*>qc#__m!z`RLU;GE~qcY0bu zQLssyIXJv{S4@s|M=~k`dx#))4$JYCX@L`ieH>RcVbITtHLs9@PEN{fNacJ#K`Bb(asDtas{Vc$D@>-^+y z!7GFE`sWgHk(BRVH7Y7sA-+CvU&(eP$s=+wW%`ArAd5&3LgO>t*GF-qEM28L|J82k zW@9oIp4r>X=%8Cvn$dH(GPNo{E<^ACJ(XLo-;BR~qN!HqLSu&4lnlhPlp@Y8GvuK{ zLJl{PS$URd>t@lVf6(*jxG*$jHZn2-F+DwCHUP z)O2)f_L`tf>_pO{;zP@a(XCb4Z0dvT=gHNj~B8h#q;!i)q z!tu~KuLt@zz-btdLts9$>IB5od`f$xqLx6yOJNNU+BM@5r20V^9N4;7G9xC%JR(<{ zp$+)bjW}W$`@i0J_fo`Vs|Ffv{G=LowY0HwfF zt1CW^G(KtGSs|$d9cyvu{{(_h%Xgxh@ON?cstIjepW9uJxCp5&Empwy& zBQ`z%n`U|*dLvp2t?FqU7fDyxoN zIVAiRo4Nye1V3A!6Ob$Cp2m25LD**O{~SgfWv`Zga>Sx6F9*l7zhCu$lPbn@%X(%U z&~y|AvhVK31Ttu(thg=NE@@6Xd@6F`UW%T2c!0-$*ryArqe!&H5-B_EUZb9%cs2ES z3CXsj$ydE>;Cd&Yp*p)$Fguo{4ODe5gsk9Dx z4Zld6#61*>rhTXg)LJ=AN34Z-aceQiUUXK{u~al?5IO3Z^!X!^!+kaI-d%j`$(Ty% zZXABm>^|=mlT*>n%q3-Hdfk=Ie}Y1kpaoIEo&F&yW+Crx|Ahxod^8 z%#rv2>E?N5KLUX|nf#?>aO8xzN_H});G5W?g)m#b+J-4hiAY8vF5!l`VZ#}W#p@FB z&LCcm&yFE^QDY3pp^tDpuE3EdppmchCT%XhcZc^%gM-2F#{#2P{0>y+7fM|okG<3j z<1*q$NEGTG5hbZZ!c=B*Hq_LKX3Bdmw`uP@rzmF@UNsHZzy91_Ovpzg`Vp#|KC?AZ20n66|bcTm$2{ zNjuu~Gi8MrY3e1ki6kVVRTu8oL%F&|VslLD23wHiSi0^^UA!=Yifj5F2R9(vB|dQL z%>>0@H_R&L*_$-S-nlL8AjrpS^9hj}|{9(R&r3 zm$KC4t`0QCu`|JSbFH2LS7`N0MrFGXq9+geyS3(#92`Q5ScA)k`=dZPi{3l}<=w<` zvqXQw>h7gzP}KAY>*%*q*JpE6==sJCc-`Kb2kLJF8jS+gd#Ggdp(*-v7Y4fitV++% zK(oCq$SeBx0xuWIOarHNAg`2^Br2rTi|>{~(-CYL87R;;2Y<{o_Yz>e;U&B{PjvSYJG8)^_dGom4g)W0Xqw1-_F3upm44$nQuRC2hT9%a`0=swnA zvs?1dVPtQGNgeiHE1q(7SQJEb9+_u-u;c%J&qKb4nqaMSzG!!(eODYczZsshU~{kW zl|Pggtz2`)n$;l3MX3(Y>f+Na`m0!DnB(O~2M5!SP#AY)lw&WWk6cW#LXK4|^;3AR zpp$Y!dv8{+hGJ*ZSdzd7}u-Vhqdj!YjcU&US`cjKZ znf*>vP2O-KNS4TM;~wP&_q)Wbp-sAE+uKPCPBF_{QsY=Wo2&3!=|uI*=CwxOtN04_ zPBMbZzPnfzEQFEr8tzpWnG*!0-W3}pQi{hOo4_?lFgPLLL>MC)P?~wK$dNNP90(Av zT5<|FDg&0}BSY#Gdn#$AcA?>b*e-e+#G~pQI%&PTB5E-3_BPyz0f&~NwvOE(NzNs#*Wm_0{R6ht7!8|@5 zUk$e{5%MrH?O+aN@8rWn3Cu|ZHgqnzdzgTLOC2c|iwMD^4au$z1<*(+@@0N_%I)3Y z0}exM?CcaFGUM4~xFdfuXh_O*8tsXS5h z%TYo`+;Prd7S)lPd&cQyuD#haf-ti`ds1#n_q>oz$jF}jH^?1&UJ=E0E*b3B(fTCK zsRG67B!?R+Bg7mMeb86$)?C5TUF%p=PGrFKD~E`<7Qh$HicsfoTGH0$+uMTPC4E)M zPsaqE8zW3T9uivKI}O1BzJ?0Mc)=Ojve!L^RRzj^Sc5(t4Vh-17}l%Rn|UwuFuh7n zqS)1#IVyHm*?C38WRjkw8LBRPMd};TU}thm-R+X844b_nkGGhDhj09V(>0D^$9>Mt zCn=V6gTh@{=-uOLc0ACL>1RxKJu1fwci}NS*(k}caw8Kucd4#4@$g()&I8ciT*D&{ zf_9CS2QZrQ?Z}r$q0sD~*L+GQFtuNC2C?bo5K37}CA^zi${FfePRln%>ImNkaBGoB z>_>3gRY=pGy7~GeDK#`Rwi@U-E0Axv;q!Xr+*BC0>2iNX?3C}s8acOU=f5m&WusB# z6s(9Rr;H4d3N`sUJ-C%?&?Jpu&UD#l`g;hJ!j(loUDt>QmwY)G zO2`LhBJavWSXUBQ>T2JaY0y+CtS@b$G4aYdqLgWshBy^z7FYR_5H(Uu5;8~hZds} zZMs3HHToGU_3wA>r-lFil@0=GqdPyk78i zoiwbQ?eKRK{V1>$Q4SeieDc!t5i}Po@5(|aIVHMe^nS0+E)&rb6ge>}^Otltrr%k5 z=~ZwhtK?oSp)c*(@t7Tsr}+|vDB9^8-!IdnECJD~FDA|9$!sKl=tHZv;lTmyy`lf* z+2s%Ud8*4Z1whG~PX<^CjZMS~U#BmIH)DjX8z6~ha|rd0k$HB)O^4mPZ{j6Aqv&lq zVN7yXX>fub`&^-T~TTTVUo!ARZ~l5}ldjkpwFdJQ!V z*_I&50$ZQkY~W9_U6rd|KKput-OTvWVi&rrTGpucyJ7$#3g|_?NSxOAV5_;&(^yjA zJnk`C70^+mE1x|`O^{yyh0cE4x*d$&Skj6q8p@n9}kKv(kaX8e!#`)MV}{LL5)MRjw-sKal(cyZTSRfd#r zY=cb=6z+bj2*(c%W3o8F!5974CU&D0`(sh}rlB(PFqUQ}aAuYtaO|#mi=!#~%7JM> zFlBd?&U!V3eYx1Y-6tTyaS-r=HXJQ%rv!q^$vz)rhEPGXH>2C||Qr zys3nBpy}qJ%7YEA5`gXmJ08zFsBeIP)E#G8T~ps~sFif z(Z7&e0{cs+AA)bZ`8X&dG$JN}5ZO0hkyr|#5%F%!N!A~DMpV@dn|s`)iaD;pV=LPw zJc{Eu!O>xjBPqE;!=iP<&C9uEz*)%Y4eop}R(+J?0#PWVLXsfABu0;WbC+SWt8>sIADw@lV3u?KR!|ipUB^{EA%?Kg{TBzkbq@- z3&=dQ%4_wRr#As>(FeGnFX+M;=}xNfsh&T(fI&3;4N8kfjUEk9T@ z91RC+Y^I5EuP@;BKZ% zBqv;jq)6ttY>lRE-jt-}=RWrv`&a~;)a0}CSethGH_Whd@s3%t7e=FVjrzw+tHtuT-e zs(PJA9Fs888LawurRBfrjvApU=csDXKAQCoK5_a!z_}g;%HIMtxr&pWW5aop`$YF6 z=04Gd_i`P;IJr0WiZJBh4m454MfcG!vi_cDR%i!MSCR4|kf_GFeZy@FD!mm~-Xnr4 zqdUrw++J~2ckQZM8Z-m07VZ^P$_MFA-?*V6-Imvrx6!K|?XL2KClCIq z8B?88Tu>8F7z4H8m*2+hw^tY%)KWx|z7p?nLP@YC6oHN<4MnG80+xzrtP)qMms_OA zAmi%YtcW6GrarH>KG&DQATCN??XY4I34DtK_R$kNGiOaBm>9#YliQ4IB^!x&iGNtL zU?`OuYK~R3u530YRkzn%HWQr(ym&1N6Rtc4UzRHn=x?x=8#J4Bd3i+aUaVt08zufT zd`xJeOknPdthkXoF;EV~I-6mo*8Gyt8JFA$oJpS~H}CgGdLLlZ5}D0VOoq*v0|#(* zTwHqujpS!)$~Da;bEHn67FqLqIPY=WjL(s|gBYHvQ{z}qWLEF~lBer!2~YHy-=Srr zxBYLagC(t@dE5r%?m2y^iO-fVxso>GMbeJ{;&|zluJoMA-H8C`D!ptcb zKpkLJ^JGLRL;cVa!gxo~^=c=dgg27n`L;pqSyp@@zJTp=pjs%qfk*uCZBU8|_S}DX zY=6mxit=7(H^&b3ae5X3YPdmGzOI_woditn+W6eNxJ!M9F8`2ApHB@(4046qlF8_j9`XTtLw9j5B)5_ZnDIV#XN+qKeNb2- zoNVeYeYLa?xq|(4_X9`ii4VvY7nK(wt4QHR+FwSxcU$>3aNZXe>d}-oZ7((ce7*V4 zvjS`4L;6>iFtOs#o&O>PL!zj{^1;Ut2Kb%_mpG9=%XujWMvhU!zAp|7eJJx=vmM;~WBUNe8*T5mV$*dfB+BzU*uc66J zlV=XR-|I=avA%FU@w1l!P$xF=C(5I7p#;dr%1^>$-L3_3d3l{1VyF03Qfwt0wIFfS z1ZWitaRoO*bO4=M-VRRWO;OPMA!E1Zm$mX&g}U0ytFGj7ewh0_T%X|0s@pqP{QNy` zR3hG^TSUueTM?(?{6qD-)!ZMXyd7LI^x;xGJj)- zjFW`Wz@E_lwz|V(P;W|g3bqmkdcc`SioDt??22C4f)pbG2zl`y)(>cj^&ZawbMiA6 zkE3jwjzilS+ODbl&CJK)SQ9ArSjC+x!W^Eb;lJG;>yvP=bkM+H;ean!=^voQm`9WF+PwZTAzl$93OgNV;2{h< zsYn^;Avzq7#njg&l}P!D;)_LY11c@Avs0MxXrR~<9+b0{=l%k18!!+Vjzk?16CSL< zOOl&VHeMq&*u+Qz+5|QzWTu3P?h%V(#sG5UCXlE!gV*Qk=I@=iLdl<`@@Ix%-bDx3 z%?-nnYE&8e!!P{Nw|qrc4Y(k|=IyB?KT`2xJ6#p6jvoqp)+mL8=7dOdY}%tbMfkjC z_vX5bgc`?wQWS)}paTh<4m4Mp=UmC-2smUi^$L!n`k%lE08PEnSHeh=v2FU*|L0)h zd}`*o>Gu!GHn_RpwU;Z%*8&QAgQJi%-^vVqL{8J(aC{7au3=L1h6>A}3E<^DbI@&> z?vDA98v-1Zl#>%`*h^qk7JSkXaOi;f?BD7&*qaw;r2S`}n^?lhAsKv@16RJ7f7RGd zVG|>$k4{Na{fvQuSv3agqSYxnL|O%$Vk^s-8gTG*3rdiq{banPjG~2U0$fRq_k6fv z=C(76lg|pLR@6=XIZ|@cg!Ru0!IGh!m$+2Y=0Z(2c6~51m*VXpxjMJfE^+XS$0#Q> zn@R72CT#H3zFqQIG)l*iWkptHru9%p(U@j^bU5{%@}DtdaIE9v-NbH0QPis>W;BfZ z!5C6?#YSYBqvRx3b9Es5a1uI#KQ!(J;VKuWW94Q-5U3ImO&2`TB87`M1=##w*)!(K zrQr9mXBzA5_?}dFaqB#K3U_=nJ^%Y(&lOYN3!WV>;y zd#302ROpE2vW>AlKze{@Br%MUS-!QpvkjyT+YuC#Fkm!$VE?EoY9h;Q+vuQ@YU!VC znHb*6v^~dViD~_NCJd$i(*_tSZ7=oXLpQXtt@u`Tk~#2=8a)mH%jo*;9~z~tdU$O^ z8;7fVXotE+P|V@cfQoENTybUnmS|@QU*l#>Gc8`Fx|zS}jC0#DVWKFW$dOZ}@bh~` zc1u_0F)I`3oirc%ZaFF5-K&~_&?>>F3@e+4NmzyRh5!MTfRZ6W>C zV)_A_1(V!Wcs;W$oV*RkLeri=I143p^s&r-58PtJrFjJVwssSg_a(T8zCiu1Z2CHv z%-1MEfXTug>*QJNi1~e57I{5+Zy%(5wuazH#V1}F?dUZGRdh70Afvmn*QYZ{OF zahWut;8dP^wEe9o6>~dM_Kv6kKV?mhO6x)9%MXq?Xm&)r#`}v-&0I`tA(M?Rd$g{2 zwf~t+<(28{(5n+}tO#P=4FI&=H8hRQt_k6#cGL?_?b2GjeZ9FD9j~eQzK_;n1msIX z1VQ+HN9AXR{b)&)$V%$kO%I}b{R=$C=+6YlxI^UE`iIQL<__zjOPo~Q#gzOys}xBl z;!DC#srNX8$1BmV8_u&sQbFW_)#w1iM1EifeFJY>D`2&qBr_n&e z2bRpgskVSb&?TF@Rk%Q$D4WD-cmPsQnY4C5UE_xCw*men#6bxm0ECC$M~Di2`6M9_ zi3m&hA3t>bgP6?e@~|P9n>()@|Mr(68r8W_ar_{puhm|RE2W1^_3sj_MSJA|i>A0C zA}exig{575l=5o2ljlCBC)Rl-YsbM3n~JLYV3;M%d@W+U=WTHCTX{y0*B6-R$oL@r zFgwb~s06-4Uu6MYNdRuuLacncr{0@p+*p}n3E=9J71#Ye?_#{9JWwwn0T0!bYG2>> zsWYzYM>40n+B!QAnhkBZ^$KK)o-wpEB^>O6The0Pz)(Y6RW!!@6Fu20?X)rFGu##Q=~nXj`{tba`P%G0YgdGrEe4p+^_4Eu$lA7%&A3gjgGY2VY6y5= zFbp8=daqv>MKoOAg&zYmp=Z2#uPcK}W+2ZDgbfgLSyeoGwPrPlc-}w%$wD9(OB)pg0###k~iDk|5!kRT1Qn6p>A8q z#HrHC1HdsBwgH{&`<;2sa9pcRT=Qmu^4j)Z+fmqz@`B&DN^PuRD1?MutOgn98wxWQ z$wnW+g4y7G@viYGqYN)MK_3CT5Pr;Tfth}FwQEY_`mmDboOgld=9W`J7kQKgV>88+ z-dc2pA0KDE{8_#I0!%mWMP?ri!nR)2Ss9FKEcpCH`+LV%tSHIJd&v{-F%hZfOoqgn z1q)2_C7Lkr0CM+{Jk-Eo!`kQxF;rf2Mrs*B0lCrO#8|#zk93h}7i;BmB@YiYe|^m0 z*Ubc2Mq#BkOOEp8kz}HdTUII%ztJ99r!8o0BsEUb*%B`YP!ie5OH-+dP_$Qpjn+eQ zysOhQKey*Ac*gMkj^bxJLFbnZhBI{k^v+S}D5|pGwh}q?e0oHBmYfwv8HI0YVm#-y z!$ngT8aN&LaUt=~A50+A_aMs zqxL48xOqmN4s1(Z=Pv67%WxgCEdQ#AB7Km+xmJL(4>|)IN;j+y;NbFy(iTYm1#Sz= zHyDrIer?8?hFotWZje*oeowL{&ITBs#Ev|@CH~xkttlz+1D*2ssX8aYU>EkUjB(n# zIWbyG#CsRD&ij^Gl~71LiUL@$yl%%}N+0eBeQLo}?pA3Ziu`;p%X$T`WTqkh@ciXi zFg%)lFmje39LEF%UHZdhu=Lczqj$%_4w*wE;GWmZH*2aZhGiuvphG2|BTV=B^G5FR zVLn=`h6Jt_Ss`XG2v?Yb%Kx3BG?e<_E|8HK(eYD&xDyV(nXF&!LPeJ`r|V(S4U}|*kX#vqN}e;tEM%& zkA1QHPuGk?*sRS^R~^OEsx{KsFn%g=3xewZoVUFSb(0>U79950>+T*dOl7uFFZcukrt5#dS+ zndt*1I^}SP`)`wlLbJJ|c&Guju;m`atk1m{OohRxQ6eaV2$ZUD2ONBW!LgVcY^a#_ zs!kh%nb@c^5NA~dV-=D#E@g&#q@HZsWnPfKLbEs#2Msg+bBsv9dM(L6x0BoFgTr&% zNpW>D2%;ctHr8*KE9t)4<(hu9t;Q{%uDGpo9bYVWr%SSzjVA^S;UttX9yZH~(r`|U ziAJ%iioh!zH;5g$ug}44Xp%5}pV=W(5}N<7{h{ldEt>sq`aQF^Uk9=`BKYwG(SdQa zEld1zG)qkh{UD7k4*eUA+srWx!5A|pOsf;B8UvQdSR-tof*OZN!x@VNbfa2QP#(Kr zwk9pwuGS-KGlC&mS2Xs=eBw~(aGE6O3#ncG30`nv@s6LXMXZYsc!Hx_T5wBzLU=I> zU;c53X2B0LCJa6NwVvrK-;4E*x`4Ix-c)JQK&c2QG0~H$B$(KMvZQywMAGi&!EO^A z>%Tu{RERVp#&`y3WoHnBg{U>!s4alooj&p?+%w<0c-4fIw$Z+8f_HX)V<_V&2dQF5 zv1?W&cg$f-xGMn=f{JEBA_^`mP9r3O0Vd* z2f5m}4tV|d>POlR;k)c=c!2(Y7J5}d6s^Af`WiC#bLM#R261Sj25Tshb*^k;nue_a zP0nM8r0eu~M`Ts(4*6cfg^@iP4si*&*y?d=9;$2i7<`CsVN1^6ChC!v!_!Sw)NRf( zhHbLX4M+x+#Dm`vyWPvM`{h>;bkd=G zSmViC>-DXeic;v&6xe-#w|DSbr}U|w006Afb1bZjhbbtbpp)A&1?mdaopXEn4GdoQ z3~%`%vO5)jg^e z?b<9jA+}1kRrkj|Fh4;u^$6{(&2y024XaJY`IAAR|IM{Ut#gDHK$zv{E)x zSZ3qm(%k!oR=tS=^zWH!x&o1KE&s;|waXnOv+z(|SB+HRyO&3kKWK9TYT2M@yX}zo5m&6jV8`RDJmcU$(h~W3|!1IWX}05xp3H9lz12U+EIH?I_Lq= zt*3TviVJ^oiMHZFDKQ&M)drX}HJ^&Mg@IuU{N)J5{!Jo9!x3;x7YrU1?a#CX>@eup z$^UQxL7ZRwC7c#TWQ`!@FYhj`BiA($ABT3|fp8Zkawi4c-hg4Ke0rnwY{G178|;0H zMdBD@A(rbK_ZMmtX!bIj@+fI#+9$zy6~tK(OJpu0XkXC!7ie9`(ptZ6TAUo;Mmzq< zRnILytXd20p*&B+=P9gX9iR+*Mu?%%n%~j9`A?F>E)vZi55wf=@kLNf`BCYKq^8#Z zQIUd(mdJKl5fw+{!JK>pKvPRG#v=nNyp#=M95KXQbI0!E_aDkAp>!XT5*JUHO&Y(w zNsUar_qho4ABLT{II7GR=B^g=Oa@Gf2ovWT7&bqHaokWo(#^5!>69k7Ps`SE4L|1i zsIa-le8cwMgP4EqZ(p7sWmj!c^i`{q(z}v&7`y0F)Jex;eL|z*g!D`Fn7EB&e0+*% z#2AcX=WDbfGYCW$ca!{NQt`C&MeVM`uc1&@Z2X1MN zWw;>|!O))Vls2~pY2HMdw%-0DeY6GVTwxyPbPd3o`@hi*?Zu1WG?N2l)lepNY!bB3 z_oo<}0Z=pT(}Zl;$uzddnU7>(A(xs-YWxqgry#DN^R)YF3jt~+Q0#F|5kP#*>8NK! zVNznR3g#{9RQ1*!rk9)4vxu#T>3H=!>d-WP?bm%BcrDEXlJc6G97B)8ZWmzkQN|rM zG4o6DSNdO-rb^2J+~OkzfisT*=UL*;9W98$aq=ryy?{rP?&X$(Y;~C-I@qb42vZMg zXz?*f2kg9-KdSh&F@lsi_ABMBfjbu6jNZotqw_G_eT)b5JI7+QsD6ajhVsER8=dIMfZ>MN3op>Vf z9=iunrYFh6JM;*wby8~mfgfy5y^lcWtQW^(S3rT_2<@}8|5$?MW7JvXp=E#Fp*W!U zj5C~CPg@Sh%3hjzz+aY_VPb8z#`7qh@}SPdTz}%o3yj>MgWY8q)W`6i11LI1!{h#g za(4+ti~a=S{MQZRF?>J}w78nEUnZ~oM55<5>6*J%%pR~zb6wk;SZCL-ft%=0@%^5D zNSF%C%Wq<*sUepL&5YkRqesm!T4-#KCE3iEnam%-?uODI7<(JNYi|D7q_5}ZGSALU zGMcBsc4P)q*$LkW)^6(N@R~@5T=U29zdvI4+!f3?njnR_&a1;+mhx5(9 z2gOdWkdbtfy)i^Bn6){5Q%rbB;ZtJ#6SI_sHu@h@PG-UfIY;_8VO15@JDT+=rBy|y z=4ybR7N81s-?W&lU=WaA$G&8o;FJgHUTakJ;Be8UWVrTlXEY9OKUSs=(*DPS|Qg;r%8vv`@R@y$V8WlrTQ`yEG&uIA* zqrtEasQ`h%#;2Eo_cnj;7)BZiZ5xD}X(2Q-YVsj;jE(A~oJ!m9n_G`S_!Vs??P~aq zNSDNTDMfbt#PjtIlOLjcP)i6J%d%Wued(oB6w$obK-8X7HJ3qnF@L0_0F9cOh9uvy ztRW{X$5zR&gk8U{2_nRTV@vSG_>*ORD|+5Hb&Y_8Y#|_y@UUA#KNPuTPJI68@xh0| zL&uxqaP@L0F59+^zDvLq^7ACqw*|Zse3w9_pD;*9o1M}og4*WKH`BLaWgyKjnDlmX zp_F@Kc!(f+s5d>_yQ@MzT)_#B&Q-jC2D;o#**YZfH{6DOp!`#Lo&KK@Duk(e5VoV; zUa#xY5bZGx43RM;-S9z_Rg>x%hNUgrY0JP%^8{zpLbmd_AGtZM33vK9?C4$@Bo$}# zc@S&77khhbQ;LM4LXjcCx_{vt$uz1s;ijtyK>5St*8jYf{tBk-Fz>l!^XEW1a6-KP zv+ni(Jf=V5G#Z!DWBFXZ@qe(vGbxh@Nta|agjk+qk0DrRKg{*curKhJNZI4X%brzz zBC?@MG3?i>A$9dWo_UK0VFRa3H3DN6#df-g_sag_RvC{F8KPE}03F^BDQv;Rkr{eG zu|8kg*g`!1jzQoHiA%k<3DI`7+;bg@U9b!&qO6Wcrlqd|G)7~r(LVYdEcT)%*JdDALM!~9B09Ky@*t=YqcSu!r3vZGY z`&A_&Vq2d|)JDKEl5WAZpPfWZZ^YPe?3iq-p!(XViB03I7GYeYv!dBpmaTT&cg8d70 zv_-9_?Mj~XI$oVkxhEAzYOk&n&SD7SHf20?&jbjcp6KpS08U*m;0Wxu6*d;lU80gk zxz{i2aUkv6ZQXW4fZgo}sSE6468Yzt2q3(HIu~9J`@#@&;i~g8rY>@?3Ecma)!8Da zI=lPTtxLI+N+fT}%+J?>FgVGM+VW&IP3wvNH1M*6r{OOWXlw`Y)@x9V<`MWNW>Nco zJ^9t|ee-rj_wSR{=aHVfw%W!P>6Xri;0c6iTefKgI3L5QnKj-iY~KhhF9lD1Jew3R zIHq3qxhGWO8wl#>c0EsMA}kox^u*(3JCQB$<;a(Osl4Dj_S$$Xrgp&$7LbNL)EgC7 zz*OCu=`nGQAp2%)Yd1C)hHuC?q+Tmu-2x0O{v{R$yb8ig{cOl7LCHW)Qo$)6BWh%E zvtDboYT2}-$MK)s)kfJ8(SN77Pj>t&pb&1cORH++6hCYpVn!7FfI)5at!oJN`r#w= zxRDJ`N}_nnZ^Z=|vw>n+rh~@OfLrZ-C`b?*;5pg2+W;-rG^cP}^=UsYKFC;JypM|7 z7+w|cHoOgyw@#KqL3YKoV=p(y;xx35Bf(wkT1FeLxQbDhaq+BbydYce#}N3WNj3Cx-% ztY!4~%^;MbG&HVS{7DyWD#p8(h}f!T7aozgZF&DTj(?LruhtX>MCU~{{+Z-RQDL2x zXaA-tl&nCNv`CP*gsRK_OjS4_C6BV8bty~H|!l(pi?HU*StmUleiVRvPMCJ9c z>O~%_eI2G_sTXs>XuqtfPQ4N7;#i7DXh+OF1FN;qZ+?p(B19My{xUnc6_60(t=vTuB1KG0)&9HK1!@@F5q81kxI)V!h zmAyi0!JGZd|NdJoPT+(L(_55SU%FP^@t4v)B+nhr>%P|52J;NdeP?bXX6~_8Ve0m_4Wzt7d414Pc%?q$om#Cjb?@meWf58FVCx z<2VkkG>ZnMSR^KRx&%x?-6VO;T5$I+lq`i%Q8s!&-P=9cB&8WS_Y{lCkE81NO_4RV zdJs!rU=s)CX-suGpfx@K0-vq)d%bCgWTZ*W)!e{Inb#m$I3whdmP<&I<+g!kVS#K| z^M3^nVn~?a@2KO$!-g5Rju>uv|LO5;&KL+hkOFTlQQ#Y@)OLBj_LsW$8Tqw|HMs*G z)zNdeWu)>0DVB6$S-$J>E6$c;)SvZdYPa7H6RBQl69?@kwHhI*^A zTgf@BiBoyei19kYq8DMJt934Sz5Ds~)|&<;S^>+RXGdAl-Vw-l6Vb<5Bks1J2?tl`fR}G5h{9hvj8H zor|$~u2!fL)>)be2yioHaqAf!ef+BEg886C&P&a+VZaZ^oDU)m{J#D`pNq+i%V26> z2P__;4Guq)`YVE-8(w_SHo-kr4WRM>r;sl6TKL0=P0ew*0v9)|JP4GQsT#b@cBY@0 z7C9qKC{EiMU_J$=#ws0{hIWErhG{Q%gri4mw2;N;e!^Iv6cNB8Xu{w#G>VJ#Qj}3| znjQ;e$KVO{AOr@?n*kZ|%<(X@YlNC^7KDq(9QvsLWqz}pUlZ3(|8gsjl$$_mN za~O~$jd;2tUvB=yby@v{{(36ZdZsYV2UO4ENPvGzT&M=p8?Wk+@twBo0U%;$wxo^`C)GiB&bPO<*7{d>S{_6)!nw51~)U2*G zw&wv1@CXF|RLqT2s&G-6dxr)D?kMkcf?QOvR4F=BT#Mu+q*k75Lu(m`pgHrn(;kAS)@ z* zsBD&ATmsB_w8)0O9}Nr#CkqG4a$j)RR}lBAL_RxguYZRXcYQRy9+>`aVCBt(M*J|l z(bUQ zK97jQ55u=Ch3y8zeOaRbnxvu?2v;y*@k*vqA~aV%|C!)tvv~#ef1=TlJi~N`HDVR) zcJ)SfjP=x|a;%iDt9$Y&lK{Dd+dM}n_WFmcd_uBjs7x$p`w$~-A0Ga=2?OKhIi>3U z0sJq!_(-m!Kg88y2Xpv^D;5oseAs`jck5)8^Q3- z8&Gtwd=r;LW$VA~lu;bM*TNY)Q`rLNZ&zlC5I=7U`a6RGeDNLG@Q%us3GTcJ6EIr2 zOEIvHczZPY-(hB4k~~5Yspbfnpc=j5aCLmu$vX1mYABW^NrOmTVhr)3Qq2mY3+S>O z0|7$rhG3V(bM=RG7GuyAFL}WU6w`%Et^vFTon-K%0nmmK)yA{&r)@RbrA0-71iq19 ztGWWFGRoX=k|6LA);HoE16H8!#IzQV0l`OC0Gvy7Pt-5QZ_gI%=(@gGDpGcK@W4AF>NbK zyie2j!Lbo86~1dxSkb-Da-zk}(;TT6E6ytxdPgp#(ymUh$<~Y1J z|KMVvbTkp61d6kfXxN2A4i+-kIDDkMxc|{>F8y5h1zpehg~8Si@xB~`gnT4PtPHr? z1hr*X(iS|QBI;f^wTE;KBPRJ~uRPv2#8og!6{#EWSWUDu~Nx76^`ohe1Mc<1Pf9BcpkU!jXAPmykPUY2=(+GuT;FUKD zk&6cWciC;YcwJ=QSjhrw-31sIRuU4D}BM7Kj zH^0OK1|8v{7TxjsUh5BmM{9xL>LG%8bkw8L=Ps%Ap1;NahAGYi9uWUNn}P7d1dB$} z=}qu8H0HqJn=`{`aYsF$LX1V|Ce=0v!06B+%9+~H;cEhVH@7d>swCU=iO^{P?B#`( zMO4^AaHZscO3j)jxyi5<7rtuW2_m?-32NY)?9Rmt`f_VwI1)zBokun55LyeCm+(|K zt|Dyt4jZw@RH`sPy7;c}v=u=M`e0jtf**i;6&}D&+9OdcAwNAz9McW*w2k1d63w7j z*dZ+l#!ham+=iKv?TN>ch?yTbfOcXB_2kFi9GDqzn_+)qu3Gqtiu~qK9Oo!)zn-TR z4W0ukt&782=cp?O?)uV>gu8+tdo*c$Yc8A__Fx5#Yo`g6Hja`r>v z@Z-y}3asDvZFLG`x%qksHFz3>?qTqdqAmGFWs~F}a1ouN2lT8MAVSqwZXt4FRys3p z+&weo)^r!2!xg?rIwT-E<^q*UzWJ!%t%V*^hTJ-cLRR_4;GDZsF zRUOj&b>u3eHVCSAQ{!XARl#(7tbnfD(%WPUWigJHn5tx{4z8Eozzs`+kUM{kqEU)Js35 zVe*4nK%8p&%}w?C@|a3}kGbSfZQeI9WeuO`{9$_U)gJwdp=;du8p9XQm-h194V5K3DlQ!K1ng4H%*2?R8y0uw&wFbu80v@=cC8kw}H1w-AZ$c zxwanW6e(sV^4?$4V=h#X(k#6s6!^gfl3*umNDV-JzR?ezcW!T4zpo%&vI}>i>H)o% zCpt$iG!7T@m5n_Z*p(z$yjh+EnRqj!qlB*pQd1wS$LM74RK~)w&jt0jx#<%OeM+}0 z27;6g!(Ms_n^+MR=X?L;NSRBswt|&_uBQUk&07Phr-qr0(-;L{m>8xl^ARrg>^@V}%A{e_0e?j`UYRF4r4$J*_28&! zR}y^H*XFuFU#{UiqQ)h7RVH4!n~WD&re`Jhu``711imq>F2P&@w4?$BQimREGgXwi zv+S_sS0-^KJ?vb{`J)R2%D=O?&h%Q9#T&qMaP*df5DI(bG+a<=G1^P%Jh&>i56;X; zb~mKzd2vJ7MaO@&lv-kBPSFeEGWD9IjwLm<7a;V2oQ|hWt;*MME1QZW?4G<{T;JSz z)8?!P**1Mbw`M|r!bi~B*jz_^9SD_uAfEXl>(Y-P(?TZsGfK-#r($Z}f_-Tey@1xS zL69G1XUGEN0$@E~9gIkC6g4Vj^nd6q6R%jps(5N;4HHBy&;zZ)%R7Ze9pUH(ej^sK zLhPa)Gt59qv$#av!y)AWs>z)^`o>wT>+@V3C+tDXo{72#b*r;HX;Wje`h}&HP}Hxj zO7u^`LIx(d%Qm7=0EY;$2WhJ?|OEUO+O9Z5fmo zE-QlIZA@~jF!%Zt&MO_iXvBtE)?<0Mp$6)Q3qsr znmSiNsK%K|b2798ry|H)TI73NA|x*C&cL8JGDH=|+gyRQgbPf%A+bUW@odEPBd{a+ z#MY55D*((QpAwh@%Ht(7=3OXuEvaB@^;g8-NA?e_i0MXhV;CNpxMYp;LJTw0sauhS zZnuwgR~sy-acghJ$~fnB`gOT}adY$Rqx0l^b=B-zw%fx8^J~z;{t40gcJ%s4>D*ZP zO@^rR(y>{=8eS9{Hj%XCg@aW{b4s8t6svIv;*1m`r6t82`_Ny&3+cq~@{F&@y}jC5 z!6yv)OG9zoAczfI+2*h1{irYi}ZT;Xk&yUjC@{W6&8H0?;5*D6% zf>+5(Da*}-SReMmLjNv1EchO9>|lhP1O+HX`(z=7qEgMG!668o>i@o>2E9HX={_nt zUfJL5)rZw+U9Q!yTRXM86|5eX$x)ihmxH7Hax|$d00})k!ehnyjj<%wo;uxED4rmD z&bIMX09XccABYr1Uik5OJ|_%Oesy#t5Z-)}#L9yo-Ae^)W<`HH1&T#GXEDh0fXDEJ zf#~oIfyT~ma!&nPUcz9D%c02hI4aw9AU$Fo(Rw|TB}yqeZPE4k$`&Nl$+1_0Rme3l z#^3JSia&uha3TP_fwR;O;Q`qP?FXaXK@rC1y6vXuy#EuE_pWfB3VvR(6_32ii0#(S zh?^S;rjPVU3HsZii?{3;M6bfmb5ro3(HB-b>Ixs;q=Qut$o~b9q&M+yO5)SuXUS}z z)Z1YSqrhSr|5H$-6EwX^evX!>J$wPc`-7ytz}`uv;*-6J?00%~xZ!qBZx+z^6J5ge zx|S4H^E8XqCBG&XA3UBVmCumz4>@;NVi58MB37*fYd&f=ky{2$A zrzB)U-`AKJ3*`*J{uLk-_ZBBp2p;WGt%@8_o-t z<-@CR#ri_%GNHNW+jxKSdTqm{P06rf=pxg2Q;II$#VwSHcGa@i1uT;^zz@g}IXlOn z-Jo z@A-hfP4nBRLkbVKOL=x=Z3=(^x&y#2*gZ}u$4XbeCW3CmxKMfA{sncjW&Pd}<=Qxd z5Zd$Q@eE0`Cv#ICY}YJC4YZmbWUyGdohM~1oh)_l6s1wn+6MEx1JfvNVv^vzGXfEDuB$T)yak-(Q=2a26r!PhgW_)N*S~?BghOkKo^kHh)WOplnPAqUgTbKZyz1_Nwk=>{f z0IZ9YNu(zYL(u+apwXPW&j}0-&G!q8f^ggH?^bp(Zj>^6k#!7+K=Ki$injHP5#fYs zAxMI2XJ|pB=cA}1(`h$QA#23H48Z~+TAK@fhae^Wk_*^ANL2O-`X;gDnm|7!6F?|& zZ@l!GlkE7wgG+uTE^}=~JD6ZAcWOK+gl11CJ-D1(zFSoz?~GOM8*};kT4_D!F>%Rv}{oT{#-hDqQp4b<*Peso~vu##p7W`Z?WX4GtzBRG$c= z3r9m6+omdRDORk4zjK954rAbVDG(D7y`6HbFg|C(wKoQYuI1B2hX{Z6l&AEEqAv;^ z)a~QoY$1yR-kkxZAoCF5;F`UtUoJzEVt7hdPCO@3mkdB!GEW=GU3blF6~!?di0yr1 z6kTqe#=Euv+EMVR=q5e>zM3+@fQi1D=8gsM)^Nva2#~1#YV&8|3$VHHyvuqBRY5I6 zq^p(7R}=%%nB(WkS)`P%&l!h%L@~4b;uGKZ7O^X;7?dXC{{Vg@#_^j)?}7JmZ-t z^d_Nvm(J0eJxF4b zUE|3zh6?>ZTe_kEx1GMmfhmW+aEs8&lsu}9dx{JTktE~y2d&qBKSXQG49IJRXYrw6u;@g*1n1w>lX_a78%iumL)Li2e$Yt(GY*W?tYI zY-{t+M5rp~pLWEAH5s)46Lb2)qq;-a*ISJogJw+|kj%yW3*}f+54!&v_pa#aA|=zOn@tw*qk>Ao_H-8~um>kWV0OVroDcpf|MQn6nvy|G!G( z4=O(m2dB8gfMJzbG5$R7^e1a(PcIUjyt8Oc<*hZ-j_$hE^)fn4Cx?ClKg^S@Z#H;C zOIM({{E1^Lg3H$)TZN~%C`)A-*X;liJZRb>!u>N6*sS=m`>U&{G7n3#IdU(SJou4^ ziMro1S2KY)?t)oCoR;}8!$nQR;7kPI9#t9UCEc_NwU`LQ*Q$`jd$Ov|bhMIggW4Zo z#IPGNh|vps!`p#O#J9sXWe7$6=d}4%otM?Z=X*c5%V`)M&z~nswN(}L&kHQ0iBWb2 zWc)9>*RVbJ$U(h&DHH&qFW{Q$6ZTATW8`61>_^ICHXpeV~NBTZrsV;c0>*1KeOxm`oWpR8C*DOk%bk zSCz38z%87<Un^eWfN#S#w|~h> zz=A8Tn)&Kuy$#hS?L{ez8qw2&kaqL6-Ox@2L}-gst6<#h1o*;Jvm&uQ7>-$2qFa8S zxc9jN`-46AqqnY{c0B(XJSLm<-=nA=xo-0~>c5seF~+jX_w0Mwm;uPnB0Nw@QbiVz z&@!HZgsWjf7U;ld-+S89vpbZ4MZd=rOJq?2na~h>HSLx0^+^XV69Mq!^Xx;G>n!=k za_Wosf5())f!|+W=xvRdO=~sQzIb;~Vxc#4?7RbocUS zPrc}+0nXzF#Y#-s=<1jg!XX|4%&q3sZ0wX;+o9F5=Bv)~8E9|?#$NZwu4bxe{j-pxp-=sJvBZSt2B13T7w6Yj zP4;;XHfy$Zd~Eu8|BKz3r-B9(@CEbfq=C_uDef`0X5Lki@E=(DSrc;jVZLeyTL)A5 z?TBYU#F&^?oo)sjK(pX#l+5s*5Qd+%c{h(Ei~u{IM$kAQuL9!PV*IGokv!#%q$q(; z5UC~ofdyzPm4>rJpQNMy0|>MBSsbjo1R7&bEG%;4r_-YjLCV~LVm~t&w&r+w2`02S zvmXBzUfjZBWvTqJv_j7-zcnLWh1qUE$6!7ghZdZ`*NXyvpYrPltK3zhX4|%mwGheN zAzC;|-%QOsY^D2dw?fyygn>|8k967eP%Z;s$8o(EW1U@2gKE}K1Q!Eti3Au7TZlpA zJ|7_XdUVwhG*=7t6M5a%u*>kLbQ4^QzA|MR`vO=udXDnMmF2xBrf>Y{d%LJ}qccSe z66VV%6<+D^GP+nsw(03bV1nA>tbN`%RY~0RwRr<_PuHz{$ewFjVgyTk3sx8A`- zRb#kY%qJ%B6zb%bsw5n0f*G?eFkWnXdA^mTLpHg9dqMk!j~%EpWkRtkcK1#hL=YF{ zb=9|gsTO*GfANo;FO%G!L^q@V$_|ZfQRqdQbG>bFFdxBPg|z~p`7C*=m?LW>vGIw% zU|=|glOXtAW_=m;m1b?MbEU3RLro2Wr6h9dYX5*PgGTtz7wSeJQ7$GE;?Mpn)xoXI zs#7FZr@+ATwxGBl@M*PC^YB$n+c+3mc7NJ6Y(}Ej0@9O=z^U9NJ5{LK$o$k?xu)e( z+CqxvJs9|w70qg!N+`ouitoh8lTr`o^pCV#y1bQ*WE=QN{o}&$zn8l>+$mT2WX@NfpdH*hn-nkjzH#S@=pIgaYt1>{sR^h z0`6(<79@h|C9s`H;md+ocyoFwYn{N=*?GSFhqDLBruArL|+ zxju_QM`fx(dY zZP1-q|9;1~%3dX#8#iRgT~iI{xG)kpgu)WQx`S=Q2Tx8+`j;VmAY0J`(4psy=V0qk z&wTaKMT%_Vj9d}>)uwO`A!%Y>PM`ovId(mz8^J@AXwJry1)G$`v#ntkh9O^mKZnY> z=TFlhotwot?AG1Mk351Z`a972Ad!DNs&cv>RdC-0e^-5vz00=Sb1*us z%YTC)Uhva*X^0VV2o(3J=^uml7yLD&`|2k<E51*hIAqH&P<+bZKHjg8dRKk9UG%X=R5j5z&39#27<`kB21C-$8RbAUsW+-h~66 zvd#AyBCe?{8OH>#?j=OmhGvsPl2z~khfdCnq z^I)6wTF#Kcf?^DsWAbT!qu*gqmA>p@x#i)V6_NmRq}nyLf=M2j>)t^QdKC2pJ9Spd z4MtP7!t9*74T6`g^M#MK7|=fa5SutCiY2Z6`VMyUmBoo-$dZC+^wDqr@517PKc-(c zqXAWSp2g~$4g6|WhJC{Q3{9r=)gre#W-CT&I(BT@m51`1MPdLAam8YP#ht&~Jzr3~ zy#aNqlo<=+bM10jtX!O%*9#ZV|K3&2Q4I0W+}ABQ>b9CZ3TM_w}4v zSf>*Qje1Gz)}sCH6Bb$*Ppar9V72(-$^C!aOtt`{oE6+1H^ev6o%rSSE-uqTV^KPJ!3obo+T5}f(Ky}gq|#uJ%q@+CgE9w8hdGR z%n4Rc3jxA+nk+IC-@;@O24q#&kMo!TMJ@Cy(?ITFpYor)y!tSrjgzgflx|F&Whhn9{N~e z?##Ls2-H=mO&!8o|7$QMb;I0bN$&G~Yr*Sp_Yhi{FXX#oOR>~qn$s&21-qd+{2#4t zj6XkbV=8JybX;aHSpAjg8 z8_i_E2Ur0&K090_XxtYtKP%hp!S)=LG9Rn)l;U78NxaEiYmpPe{owgx=+;pthD(}$ZVae9#Vs6&{``et^wHfG8j|&Xo3GdDWzotJ|vY)jAN%rnA%<|0^ zB>Nu_pJ9Ca zfK{OJoo7gHAUA zW|G^?fu?E@luh&p;)JxtDOC>Jbau&*>0KG(Dji*{2k=e}lH_E#8R_$obT0mdb~n+< z$1#pKeo&t(z#&5o&MK6!psc~g%N?^kM5&-&BH&I;tB0Bz<@;Pfe102)idWPRGRvt01uRW^0xAAVM<9BXXtlb4B2<*9->u(;!N}55?9)aWKQt7HI z)XA|6&OB9*oxfVLBe4pSURz_GdOGmSizD}X!r)AWib@upkN}9Mt@R9=m5;K4899+d zDB0{c@L{v@*q|;cmA<`)RF%UpQ=nm((IUIuL?)s+HGWXnm!+_H7aCDAR1X!gp9-q??1RedAXeEwFP*An07Jyd~_oEE(%~Ed)>r0!j!49xLt^ z{hF`+GrlaILNy^}5z81>Lkoa_S^I)93`|}L@)kB4Kqfs4j%I)$9KiXLkLfeFKnrGC zMP*;t#onnW8ZHfyUCV2%cQFH52s5<^a^y?2O&ImbrnW_)v8(nv3290*)X1>#+(%}_ zWWu_Q-_+M)o=xd?*+MQDn_5^ESaAYp;)HH2f~6a%ubL;>b{9)lZZ`PD=>4_mU-E0- z$|%Qg?KvILud(_QNplbCU6xm>g;1CO^W-2ekKLQ1m5*Q= zOm}e!LwV1A&a?8COTR=EP*;rTyn9R9evN_t9TJO=gUpEaGjHg)W+|)dl|0dVUm$w# zTai^_c$vdX9DkfZ{g-SUxMCi*gL!h0KfTk;6R1llEHt{mltmTTe;2;& zjhBrnLt%=QINQT%tuw)o>?1|FQi6NH+ z9wOEHlr+qonp{|SuZN*ldqIh9u;Qpg39gTNLot+4QevJJBtGH0ak^1D{y)0&B%;ox zET9V3c5^j-^^Z`2kR%&`EAz-^1RX~Ms6u-+V`f_G*TB#&c#)u>X)^ag z(v`I-A822^N8AMpzTky|*UA|0YUi3kv0n#xeH0|@ka3lD)Zpv=fatru`=yLr5es0m zGTYMbu8R(UKJ;YeEN4aZQ>@k;YT!zy0|I5+oWwHocs|Hh2P7i#l7L$)9?Oj6CL!{m zigkPB8fw28^lVYzPsRrsMiRdr7Rn)ban){8%iYrpkhU=KCnC~XbC3Hu{+Sa$X3p8= z`XC)cYyFb!X}Sa}F2Hs1UMbd<7$)_W(+i1ERRFoyj90`OO;enbmRHF&-I_6Fpf=e! z1U|@}e_P0ZGzRpLIY(fffv#?2)57-s^q<^_&5H2))GeO?3UzNAlwMyq$5hybd z2!-kop>+1QwUn0xJT*+2ktQ3hqr!{&d>V0>SozpAbg9s{0+`q1KuN>?Te3x0o;BdU zD!a>TUNnMm3L1cvroE+M>i?&%D*ifuS2E23f&Oj?SXMHJ4dB%mr8CzOTG|{u;cBfZ4r6PH1)F zlZR6)+I88V$voo!hzWE(4=ZQ$Mu`z7JR2`?RS+7M)bief$R-H?%>ZgYFyjb+z)B^= z8*kMg%zX2({n|}UZAMYGQpYI76LCF?b#|GNl+)GLXp@3j3ti9ls13)L$L*f*UGj0k z#rA$F7s z%nzg8zGTrUB}$Dwz%M8G0o}cZdtcLA*tgVKdpiF$FSgT6fS6%DO%5^uu8S@UY@+D4 zK4q4_R-)gM>modsEF-`v;W4wSA^V@f=Kymb6QUuIo_ZW zwg=frswh4hQ$AXIq}R8gkTWVIPu#J>AkWh(?0>h4s<1?R4;~8Kv+8kX-PpOhEe=FD zZw91OJJcuijiE}hT_2Zm2ukD^yr^!8S`CQhli5oPjBYqaq3nO!5nSg48rdX`lOa0d zekqTM7E;5S_%e|H^%~fQq_*YEr(f}5mw6o!tk`;hYh%C-n0#itwr zq<&IQ#uf!)pMD~{FNnNJ@4LyEt%7u7FYB8RCE=P}GT|gpYhdyfepNYBeqyBgpH1t< z!ZGM!`IL79dS*?XrQWum6JyHaRjB!}uUb*6S9G64CcmoTVrwea=kG7n!Oxi{B^3Gb zxwNdwOZ+9XrWFO6VCPiv2?)fzqj8*$JBicg_={Ave1it_ow0fjv}ANsnWu(SvCh{a z_R@04h4!|vgxAsMz#(2Ti3?5!K5?|?tX6u`V-@>%=XxVp=h)tL9Uh33+{VUSFqD4u zj}{E-Bdd|-Z=jpET_v5Vphse)y83Ps$MyS>cK>A^^V_@wei4w2i3x3f3NGShHIr3^ zMGU!Z65D;_kW8(XFz)QY1eCfCD)B-&9%X~#`?_9}z$QSS%8p8qZ%N4yJ(CD&oI(XV zL5SmLO7+|G-~bcUS4AI#z=H3=VTS0TVfoB8&yt@1^eCp4Y|u6Cai)(3NfX+!$y=_} z0CT?dBmwg3Kn^S5QKDtqTE?&OtH6w-beAuD@FcmS)}X=i^#gRd`3d(bNcVySf-?Hdw!`JTK+~+cib$5k)#UmXBgt$w`Gjx;C>=ll z5w3d0bcCeN9W$rK0({fDoW%ks{I5QpJX0dWTjwIB<0lhDq&CaL+q7-O2tS2qRloIi z3k?RvG(z)(WbEWiU$Dn|f668&bY>S31VuXz|6#u!t041k_+WVdZoz9u;DjqORyrAcw9`B&QRtQ$?B6Z&3&cMY zX+qa?)KM%PQoyk03X<+vm^A8B5ugg`jPd!|4 zshFTT7&eU+|2EM!?Irj2A(Xc21LM1x9M&+Q#HaFe{ zS}OeumH@F=dVSWB9wT#91ujGJGKus$z_*74F$F7TfO9#Klx$kD+jA%QqyNcIqJI1__MX^}Gf9Wa| z>&4UBs+`blhhrh)?}nrvaW-mFS~}AZ<0+zKktu>r0l|yGx+9tXaN1ZzTGmy4p@xlct_%-~x4DM%kBsg4mVR=Hjo1JcDi1PZF28!uD;dzIs8|{{bUM-RWY63k|kL$gfhUbjk&8f zvU-@P2JlranT3Os*FO@h?T|333X-4w1#P+Sn{c(cix`jM{Hr#9c5P^A2zab~pWYMl z7ECeVQ$;q?tCAZL8KMdyQW7zvr&4;b(o`ICMc1=?ZiOVN1E`t{k|P;%?_nT+{fTWL zCH1^cm@17-k=coIjkaXEA*8)IJqIO#AKK8FRXkfW@Ix79%b5GLu{wS>8&Sw%50Pu~ zIu$G2L~xiPRVi7~|12nLSw4p>JJ0r&GpIh&O~q+r)kJ9CCETSRW^rQy1GcQq)-~OIWS$*-7%qQ9_~DC7XnBs=i!KypPYAK&E3SYayJ#)4{Bd4pH*pJ& zn`M$=t3Fd~coR#)y`h+B5GXQs5ZE(!s)w)7p5KGeNRo7X@e2m|3BCH>STv-N z^l;mBROFEq6FE+;>lQ>W;*!B${m^fr!6B0OaIgv1(@86V4?FfA@2u7G9=KT~7ayKD zHVS`Lq&A_)=pf7CM%qA&(y?(3ihS5)!Cxw>480km-2*I&pvBQ}oalX3a9 z6>vlT!x~`i%DayYM!#3v!fD#xsZE<)uKK$t`GRD2Zz8n0HwjjTZLBD|bhdb^CO9ck zV1JWfoS^qA!}c0OQAKpJirc@vN_~r|ctIl@tqjK@rvKH;nB+pLYX;p6k6!5-nV3qm!3h$qtOeP85*{b%2_)5)PTdq+`6v@j^)bFV zByc`12YJG~SQ~}YDM~*kdyeHV`JMJ{*wh=i*>*K~YB54TM(@ekUFx#L=h8wRWdZRD zfQ*Q%6eUBHN>6c#qo@%K?~>Wi7GYkXwk30(hc28Olx)mWH{2(9oA=g_Gfkzz;ci8t z1N0vf&zZ^D8FRwa>` zoR!Ykk^=UHfD$Nas|(H<;CRKt?jI&fzf69p|J&*rW~oh6Dk)uqZfz4{ugbrbZq&Bv zK1BL73fHb%8%p#eMm(vYZ0;=*jS>ffL2ieGwrWm?It{jPn~1=x!8o(&Cc^o-j-qwO zfbJpesT?Z+w6xxt*|R z;E;k|&RO_==cxH7O(Ldj$N3VsM%=jj5e$ZvgK2VCK8QZ*yTJC+vIsrlCX!J8v5gcL z$sa5+p-mM2Qt%6_Q*tV2sFcT!qW=iFi;SBS_u}YIcvPniR>iMuIeO2&Y8w~f010yd`__!aF=HZwK-s<@dyGq|yvsXq zmdn!rIU_kUY1+U-{bz{=Gf5Frg9<7P){KahCiF|X2iZz&lw*n3DLAy z6|qR3GM|Smp5T|g?x@bFNu;W(nij`m3xKUqGL%$S(wlc=<@uUQt$$#OJxco=H7;p~>FW)XaPCn_*`l~Um3|V%Dk#_YAd=J$x9=?3 zJvqgvDZq@vKc?uS+UFCoxw6qzS@!a|^oNjM>p6|iZutda=u33T*zQbd>PEZg{l-dQ zJope`Wculybj=7XCrIR-38xq3`Pp`}Q3U!<9Cy}>q-|Gqeirjv z-~&&SItBjZFc%E15}CfJ*pdaq@m)fOdq1V_zRf3;HI9N{8il&qJ@q<)U&MmSM$D~n zjHFnDde7k_T~`W7JvKYA)q+&4Nd9Qoy&1ZhTVf;1BNOA<$!PBzsiFA4b3YzPSPUk4S&{X<+i#ry|L`l4= zdI}y=mzmVR-CB>SXK$yr#RiVeI`TRY4zNO^ppje2@kcl1 z_|D2a((@tlKPNk(Q>iB5*5k&LM54#0sS?`^k9RVb!LyJy(h(Dt+X`kMQi=R; ziQZj09q)^-mwULEHT0-~(=}!h$Z!y`SOL=_K^iBugw(%9cBVi!79-w{6JU9W=X(B%j_C;@BZ+xmia+BruP#+M2+UVC zlJ1@B5Po+Ry5_EMYde&@1l@`jb1`VDw}gJ%np<4TiHPsLAONG}(}fkE>als5v3Uuo zFGwwf6dK7}rds_auFr_FJh^xpk5f=;|E3OzkL*$~5 zS&^O$zB8k$_*RKK$Y16@p6^0?Po>w9VmK|K&l2`DYV-q^D5o1xWe-HhEj4OL);y;@ z)y@IiyBsc$rZs{=UQO6U9I@V%O7BKvBd=VOrG@O0d@i)JChXP6^P;$N@n2c5 z=qDj$I#0>Nx`eCMX%Y5k41xMjTBeX7h!n#?WgiuhWU+IkaxyjibQI8&KhItEb`y26 zaX1#;pD>R|3B>Lg&BnJgyeg|Z$oTd|htyBj<58{9TP*+q|He{o>`o!pLppO`+Of-* z8tk7^Ql}c&4Xm$2Uz(8i%@KMg7vOw<$I;h-GESli! z=b2??@t>8y>J~%h$m{mywOwUeml|G7(rpcb*WGLX@<{+*0v8zPx!=P9Nk}r$WH+pvH?!9GrX}m$+^i}* zZT|H2nf{Ufb#^oCm(s6}rl{Qw}{^RTE)?ZLhT$e2&mw@_sg9>tg_D4X%E`!6mA#e+fML6^^HD1jBu#{`Yx zRm9sH%nbHV6;7}cfbsHUEmlnJXhC~Z8C!6zvKNQKb-oZ3T~&b4w&||31a~rP6S*n| z^)=XxqM(uUY8tdvRay^)W~|+m5ebhB+3|4XGGWll?w5w&1A}|2oWND!=t-ah1Zr;V zj-|H@O8F~89hk3jYoZs~GPXeoUaOCOWnTItCfXRxv>Q*!Gm@)4{Ah+t6$POvP8YzT zzlTP+9H+%Q+2U^yfhEjvj2?5r~CXmJeXWM?CWzQpM5XChUAEA49&M> zK}UZ-tz{ED+>FTnqdZsLnq7bc24=eN2{G8O@Py}3FrCb}@(~28`c9Eg!R3JO|wbCHD^g z{u2BO;F?i|znR0GvALjJRUP093)2G3B(s_)@1z=7GTaQ2Z-;vG3ttQr7XOF!Q-nhtXpqJEP>gW&c9FDU^Ndkn3)uY*q6a3Q?;6|}9_ zGpq)mraR-LjGzgvemG}+w243{^`JxEl^YL&Xd2!A@psYN{Ol;Gx%p-0=GsR6Q3DD~ zOo0Bo7}t?Ns4+i|5k{ElH6j&-hK6|m5WLIVT=}9S7fDGsg>~Sv+X|2QF3yW3h?F^Y zC+_xoe%%^s^KrTx|_YKGgcMH0kTnHD!M0pb@`#nG&?Q6Rb>C$_O={;ASa23@;^ma>VB7;B;1) zvb_fNKGx;pz1q^aBvd%$2!ea8S3999A);yl2 zc&`EM(j_=acMU+Z5btX3a9o1NG&|OwqN#i_jb*AV!I9XT^iO`3I{QOUQ}rLBC$VFV z6H5L4X+$-R`#sdnE&>{7>1N>cL?-Qu$UY~MR6&G6SeBt!R_bKkd*Yo1NbQrX#Ch|r z;^56(3mdEWc*Gk3-ALMF+0a*o+p$cF!grnB#1i2#3Oun7DmH%@;7GZBo*&`gqj-*e z5UGXE1%CbsfdI^Re>^VjxB#A2_grj7ON&XQk0lUVu(_vDKt=}V>vdyFFPmebR=O(Q z>=+|EwqnYoypUvWK`)sQ_WaDM19fZod72DRSHbf&SZ$KMg^t&C@9XAzBQ(#gB__75 z?#pW(94u6&hnQy3n_@sd!d`7us~+jUm;&boE+=fmzrMT0p4;QZ5-N#z!dmoY_L<9D zZXdxpH5(|M6jjt*tdNsp@uG&mQOF_~8y-Qf2>)@~wbKsDB%h4(!!LD{VIW)aO4Ftm zTE>v7d>nc~ySu8O@fx@suslqhWswmW+gJ_Bx+d`ttu1DDwX|kcC>atf=pxVu z+xI@6krxyOVqqT$i`yVfQ0Og=-{BYf0bkwvhb#J*6j+dpvz+ zT0b3}^#GFxc#gt$!~_gV8+Zk71>3tMB_IN}*Yxd(NXc?jJ0rK+8$ zWpa2*1JH^ZbVn{Jj(&b_k2m_=R2?v2EPa+|E=6fj8rK}+pU|Q2oXaP__9RIaW6hgU z8yj7E9)z)Y;oK@RY9}-f1hn7|iA89vu&1HU)gr}j+V3Yt(7tF|8mdz$^YAkwDA*4w z{vjDXGT622+is8^qba)1VvJK z-c3LPYFPgiOjQLmsuPPQJ+cb>X2nz*HKxeP++S3xdJdNvAAh>bUV%kAQlE#xf9(>zLX5QL-Na zJ*bW^48X|&G(7E#+3J&M6!f615>`L)+&FA zhV3mc;}<1uGOXmiu@L3VsvUB!4ec#1aFM@fQO-YMajB7K^V!77VL~>74>WSqB!WWFMVys>%45_>W#K?qkS$;gY=X5n6FQ*LsC)U#q^Cx z$i!PlaJHrM`0-%z@^_9-wb#~lv2bfYO>F1d-s8Laji`e6|Dbyv5^9gyJjgIK zOQ=~Pi!9Rg=}-i9oHh-Ia+=W4s8I$wqyQp5g?X9WvPHuc$8p_~M*e~&2Czek(=4rW zIDi{VtU&#%6Yh{j!IX)PJGSfLUAc;CNG%_ik@ea9ozXYeNv=VG9Fef|g_-$H(FDHE-%oH@#~Wh3$i=UU9V~pS9!m)VARGGP{G}xP(|D20Oy29S?bk zU&N!V_gjZO7XBH-IxZX!lc`PY^ya~T(m+z#dkmSRH`T}0k$$B{ola@=EQfN23cZP9APffukveFsnRg$Kzit|vWP<_pc; z#zm#Q<`y$janTwKyo07=Cj?=Cpl5j7TU6~2vUkd3*$ovk^|R)%-6O81e(NT1guxQ7 zl0w3mymRksNinRMUTzIl35|wA_=CroDeC?{+zd^pi!O|K+Z}aQRbKoI{;T(se}{j}!a=T)h>|`Lk58|HW@WByLtK6!`Ww zgM%?s?;)$*8EGq^=U*OEpsun3rCWF7v8^qjTQAULBWpy3O2TUWH+W1+@&`YBiz}J^ zh|5M+hm0B9<=sFLS)*YrN`J}O9Z&3J4JyVM;MhA}%CRLfHY&Mx0tUpO8AKvnl43F9 zpK#SbUbQlvK1l%OeM*yy8ME;WL<~uwbG9XYYQx2MRA37g`P3k@Z-4Fm$IDQwt|)r} zE5u_4M34(J&W+S8VTj5xP145lTh*gA>)#`vBH}fF2t9|QBeWg-lmc>Kd)OfY_Oq$g zW)O|%5GpJx7k3i9-8sv|j?)a#GWUQ40)fLeWM=opBT~`lQ#>`*^?>C~FBqrw4q#!5 z4r?gtwRMg^lnzTzh(Yln@^qRKe#B3*U*L9>2>vA(ZxpIx6!Ye`MJl%<&!6xKbpB6z z&Eq+`llKJ?m_8pb7m+VWRGRxn@iO2SkF!l*xMq4sYJqw+*KHvAQ401HyPK93ehF6E zEIoOmev;N4uh52&zj}P?|8q4&b`I}LkD?-nbl$Z^|<<7&D1+)S6-(vgB|J? z-fx(R4EHq>M3rkgRW*WU0zipFsT4narb;+GWS&lwHI;S160D$x8ih?I{b|YxxuGGK|fnh+;+43uxNb&GW-Q$5ebU_@LQ5=+7BnklHYh6J#!3@}`Wp|h z*f_o^X%ex}&aBBSbT1p?>>GdVc}GMCY@9!U9dq`&?Ht4SP)Z-_m7c}3J(oL)>z24N%m!nl*9y1T||ikJ9$_iV@kL$NPP6o z(iP8uZ0ze$194q2s?q|gkcc8?@)9STj(T!a&|>qhl@L;^rsSir3xFYph;-oZ)<(3o z6q@UBEWoNUW)iBf)*5OGdV%R@BktxcWvIy=Z;6A7E(V`0q=j^er(N22OQW5Zk1sL70Dp#Gjni)ht>iniANG*L(!P*VX{bLu{vC$>O zrlCYQT|t4hB*hT1$5Q#d&fn>6;@EpRuhRGl!FnI#)K9$Js)`}0%TJKSafql>EY=YQ zvZfogRgzKP&xc|2kh-`3Twi7lox_I*FzTQJY9G0TU~l!*iyA>)=i z#Wd1P|RhbNKpew0;a3NfYdv$Cz?nuE>FFd^go=IvuFVz|99 zAbB?2-VQcqS$?aI;_aK-%Fn4PEe^2d2WNjx6gqP)s(FY0uj5godA+ZsEUm4_S)=K> zAcD?2NjC4jglJaL|C|&#|1p@%$n)g1!p)RO8juBUGab*RoPPd?5TS+SkaMW&7^H<^L z7X%Q9#J~{_uw|4>!t39onKHV<*g`U;yK^!)(4dT1yK_k>s459mr0=SUHyIF!9}M#$Tyj@a$%@yROtoSp(82|mldRnI@&(TIDEVu))AJh z_CUxb|AK0kh~Swg#t{fokk>li`WJr|!(GD7ky!c3Afe|G*?I^c3SWCr)T;WM)PWNk zy~nqBM)E;5tX*hy62w+P^xL2+cPpX@1P4wp86214R=FUZ8g6tc0O{->Yx;!qkwvk;gPReRfquR+>ts^R_|7f5~!^UdOF;I;O3I z$mT}fp^><{kaL4WN0dY2|NqRX-4TF|rETcw+v7J548&?ZB5ImfO~qQh?EV3a zETcLxI+_|@qzvEYobT;4v6aOt)-%o8M8v8wib5gcm=kikpzfNc8qz|9WrLwe5?uaR zD=s+4HPz(oj|S!M&3fZU6@c6bUjBsIEK-edW@{C*z6R!jzxii0LNe~?(^Mz)ve9q9 zjrbC^G$8N&qp+nz^bL_~yJB2R+WU1cvd@lUn)1E`BSR+%3R5P)@F#%_yQaX7{qQ#XEmC z2M}zZ>B&dhH-V;P(K`&Z2spgTFDk}D2U<@mXzg@jDEQk(S@%J%Ls67El5IayWj1QE zYAK9PVXfiu`gOHpZlYv-|H$lW4bAJftP4fKoAZCvK_jITUy$)Jb$l_f8vvsaV1xVXX8Ppq+(95QW9XGg_38uVh zr9ij$v!*r(I-yQE51^A3$lU8Bxv~yN4vWhIjgPiarl57XMEYFQ9ANf~ zK@d%Xcb`(+A(fDsKZyzdf`C5s&JIYyE=J{%EUM}lXq<@Y*yqz~k25n#(ZFBM>3FWq`^^KKpk@2l>5 z4T2=7;$sM9tsyEE2Dp6wmT)W6j-nbTJNsu6+z{il`(I!z!D0hAR6*p0Hi3y^Sq^JP zn(w54c08g{(SF79Z*3uG1xMHWjTDB^TF2{@S#%q)?bN8vV{L<};?>?-Z-nWHjDm}T zkSMW1+fw)$L{Xz4qqO-CUJ2V;dbd@M4?*BXIL-lIi(!am(3IhB#Zum@azhMjw5jU( zo}_X9H)v_u7~r_sl_MNM+sk|T;_{!`t49F zeK%ow`FVoIWoBmwdD?S=QI~S#5mQisEAx3|cAM^*sX1()=tf72>O|u`s@&^ygse2X zC!n1EaO6z-5;ffNKPkjX{uGRQgmN_tyz$zE~+QvF)#Q zGYVQam~;iSM`iu#Cu^4HOr+x?>-nd1vOW1o)4s6ry{$OHX`hs^|Czb+H8zT~jDu88 zb04+w1ZQK=RoUP|AV0o>?B;~xW-t^pg!9Q2Pd`>VF?x~Adx~VN*?{SI%u~}&CO$t% zaovy+(a*KiFq74Iyr(zCd)U?{RI3QtV~c$yLHvpBll$wO<%MBCMdOan1ch}qvcB1Q z_?6Ml;m{sGot6G7I>$tW@CM9WjvD2z+8kT-mb1VyI~+iP()JPDzU({{Q(WV1%D zpjzSSIuF~B30O>VHu46)@Z1sSt9JSPxz8c$DpcXVa3+tLc;$ov+?+C83ryM0d--&z zAwwHD)c_ce5!98u4EYgLBg25Xfjg#EyMXHPY1j$`Ls$YS96HX*)Riv1PJ$@x-4`Ru zM<;%atvDqz*Wival^5;Ar9{6dAExlSiB88o#&CjIJ9wPOCd=Lwr$<9MK9kXegk9BV zd-N=jSZ9&S2kg_&!#M%A56?k58zQDlhTLZ%h|Lp}}~ zoV027#j)m%MJg0alC_YbZO`%8tX3ucNe>FY(PB}S;*zd-o zUa>rLag3r+o>gq*y%~1kqT?P#`yS!uhi>nG3O1~Ioo#e%eS!lbd=EmQ(RKc?>zBZM z7SC)C=jCP?c}}ebiML6TjA9IsKfNC27$1*ue=TVtJ?XPXFv;M6a71tDg%q1hRT}x1 z&ysmNR$4A!f#E6Do`jO&9NPVCmTdoKujoVXIWf|VUpcrWI^$pBI1yE9Y!7er&0Y@p zAHQsBpL<_gf}BLP2@iwhU8E69TN@%M*NacmvjM21#X2ym&~-!_QNDOJ-=!?BS1~k@ z=efS-Sy(kxi$!VzK0Y|huXaz(0Op|N#uL@w<#f)3$U<%i94_dLs7ZSc{J!{c9dwfK z_gP+H10rZ!GY+XiZ|2bzpXfxQd>=uH)Q%Js^m*!JV=FwL8MUA}Z^&@KI@CzQ#A$Yt z#KjGL%ZBA+F@VKNx=oO%1wWyp$)qBZ0&*65XZjaR-66B#PZ#_Di8+3gp1ma3+G&ql zAyNjiPFrQG#u{(%7F3_R+D&&?^_*!+zIstwKpPVd`>PIf7#YBh|o#l&7Kq5Kf z5XRG!n|;DHL(92^Z&;>gfr^?uNBOyDD7u@JjXy_edawri8SBeC2!mqgx}L$6A*Ii6 z2gOY&qnfw^)A3H>gLhFNb0Y3axQlDqJKNsv^NzSHf#TECpbXjF*N6oy#`aH25?5%) z9Fh5C^|oy$8Mv4k0+B+TWaPhvLHM)O#~_&h8CBeAoVl|Azz=AQJn&bh13@MYMStVD zJ+JKw$}>Gu4!I3}ugv=Q;c=X=)vt`p6kz12&yFE_GxV5zbhGaAw0Fy~$9R*=W$QI(QoBECo5!qh=}=BaxKrQ;SV`*yvL(=W0{T<5v3?B zAyrK&&c^?bBxr1*oN@blu(3L=Nl(J3>|tL;F$p5*6H3Kh+xYp=OKKfTD=7w)H;IkapR+|` zP_CyMI_3{yo4^aJu}~{ZG&uq0MG(0maMgdpL8r%W72ykj4onH-qGdJFgs8l(LPffh z{fxl(hKDWQf^_t~)5}=UlaE#)D93s@T1TQ%yFKtdcTWdGyr-9S6!!{$GL~gSt97Ae zOX#ps1bV;*UEK0}`@LDEp8GEOpnZhZlk1V0J~9J6;ImqSEr8*^vjvXsxWjK3(xjCU zqP*P6?-Q^L5PSjD(Zj~YSsjLH6i_61c$U5E=jA>dImW4hSGc$k^+&23%7D`FPq7ae zUUWdm^qs{UWk3O-ru2A8vx@D0suCa?r8*GrU33XlUo^)H;VlgF#Q<8vSxB@@6d2F1 zxH6Z*T)!>E`tlf(s$QU#89$;Lt;IMLGPbD=k1s!YFy~K!KI+9}BBU_{@LpmM?hZGb zlYV6Uh8q?lb;9ebSg#f}Q~8Dfd8h!@C35|WJA^Lp>!+^G3t}@7vTL}DGHgX{+}ck! z5U`1b(vn~}npPf&%1K~tK-IsE(YNS9x!lq`(;U9E&TgEAE`WQ0>$!pz!+6Q)3DTgn zfKRAa#kLr#3rcU?yc>pL!sCs$?_-!6S~l~CGqka0k*xo*Wc4jAV=qKZYG$iv=%>=< z(oCbu2Tz*mU_R5g2~m=Y7D~&UZ`G`_m34}%pyfgSaFV89{zIgHfXQJwc)=jbcwy zDc_LuoB4_}0unhK%Y03dya;fWgVsyJ6C>noi3GE!Cni-gJ5os58ojXO2LcocAFo6C zc7<$S^Y=i8jsTi$Ew4O4dXn|@B$)%wL7QLhGr>()h8KT}ImMmb4%ec9GfylzD@5pb zy-uyHbgXLF=+8j+RJ(F3X$9rkK~FVoocg7U8c|&UdTB~NE>{3mA={XRcWjesOt^j2Zn^zi&UI!tzrBrF>zLFP!l#M_*+=>)WpO-5ieW4N!g1 z+*(*rx-RYL(rM6k7zY^BuX_sxRIfrwITF>xOk^U#;%zA8sf_xgnL|8g7JArE(h6y4 zY)y&jF!Ua`;e7a3T83qj{q4(Jqz93*_S{V~+=H;0iok+%?Akc-Z}7t(FP1AQ1LZvul(_69vJ^;>Xc_}zQXWTZ8!G*L=U&dv|SWDw6VCWAo}r`o;-I?z{X z(;OEehkiADS6qK!Gg{sSM5UhC5&0u%8ik02&2splVof(11`uR_5%fZ zFUt4RV(D`hyF8BFMiEZl_@Q@$&~FfEC{tdBR1e~h&JA#BLy%brf^ zGrFS-*^`cFID}yuy?H08>SL^pYD%T@Lj~-;-QY~5X7^bD-0#G~U2HHMT%REwr?V9V`^+0D+C?3a zu$kg0LsE6jH0qB9luvo-wbz)20&xo|l5EV$!tC3(uSV)`C|C=W^I7@G-Dfu_nW+hhpv>?rxae0x+S0AYjB%Wy*l>XwqHVeTA^^V4IF0+kjbS>Y94A z$BOEt{ZM%Xw3osyadL;wPyE)*CvpiKje1(ijc{x*6xI7IyU_gX=w;0W%DV==P4Xqu zR!Bb|;`bs7*M1oVN^1s}>_KSWWQp+J%h+G1Bj8GpLkbJxQI`4(k8poMDQv|Zh(+Ef zo4|rjW(^9#VXX~J6TVx2){hwSgu1YY=ENDTa1!$sn0O{Klb+a|S(&nVY7>Vxe2H_L zJL*7;p+{c%UdG9rh0@yYh5%55w7fV4C4uE*HP}cfz=ySHX_`s%JA&4c7n4C1-C-r; zGxR#Y@B7xV_Givxs}INdkwzRRoISc~7+xu6Ut|E|%w-7FK4dxqzN>90ltX+JC$hQd zxkitx8rqDFwB-DYnzOxOjtKmA;nB3Oax7PnQzckQF1JygJh<@iPFT*1gKmQ=$zo^`7h5m%gGRZ!;Z+Ax}5@VI4+x^N7+(iy-#P)Ngpx zU7-Hcn0XztbU@6-ha{}dTi;5l@BgjN^X|6&gpTQZ)1UiowXn*g{hx%QnfE7hG_Hg& zNpX^QRA}mKSQzG&!V5#fDi3ugvI>xX47A`Sh)NHT;=Lb=b}0`;zO6REvAw3i)xA=f z6rqcqf||k477!U?GQ_)>>tjtti~g7st~@2q-N}vKRb4%6UQqYMk|Edd1o^B9s}C*> z?4!;^b1UiCUjj}vw@XofsP13ca?l8a!)e1TbJ`?P3|6S_1HSzlH++G0`=XuEQda0jR`0Sa z9589Ug)NArW=A#uBDl88V_Tpk@a1Sw6kbGNd3pP*T+jd|H_Hxa$k+bBU;l1flTUey z+D<=>?Jv1V02}W2Rxf6jA1^ka%TS|QRS>!>)du%%of$%7VQ~YFK=clW*kzZ3IZMsL zAJ3TweE!EtIfp=srj^aCr71j&Y7-`1agI3fj;;ow(_&6ISrIj<)M~-g4sPr2!&JH! zDSalmVLQX$3%$T#jIQTawmJ~gge*tYt% zQwR{lhn2ci3njO^XVZGTsJ(KMR&#LLgjla*=>6aa&{A8whqN zq3v2m_oWya95O6@1QLPZe6e`+W`jDFH_@S_X5fo2kOiZCKW9FoMBEKfWv0mgB>XGcvu#6>{rh+CN) zKuNh3L-TLNBFit~D4?H2@jk`<9Cv^%tkyG)7N#+Iu-Uwq#9u!rEp_CBjT+ZR;oDS! z5twQp)K7UR&bX|uyuoQ4*6wvln;*Z}30_}Bg5E>5qR$avMa4%YPP86^W6mM@17gs} zJz-@NNV0ck2b{-&`LU2S9mTk zhMWo6_^#(|7~nm2q!Wi{wwNKgpXY))oaFo#rk}OilmFGV`B|Ns|J$pcT-dI8e``n~ zBqO<0ClzDS-G}#O84~B;FrF1n5_GJyC!{x$%z~IV9qH%(jKq;R95@=NA!=8jz*M2W zdmjlcXU}ZzP;8!hNA|Wr6n}Vwwd&1KQ_?IH>au{=eyVuD@fG)beaGaXTnyw~kSjV0WnRx+( z)tR6_D?uDM(>HrJ6GWH9LD;<*-*(svCdnt4A*hPe%Dl_Q9@7@7iCUg7$vZ5pcAxVE^!wxOvzJZsTfu; zTf*0SFAo^?Pv-Z1Ai<$!kZ~m!D=VzldMl`UN^~w@?c&vbKoNu>KCS5{+lz|;3|*__ zvD@@@NPOFt$1~Po^uo|-2-o4ssW#`{WROX2D0i|OITKu?6aZG4w)SH|u#TMn(5mCQY&H;c5oC?|gU z;ZVc7jpZe%`xv;7-mD{*@0vK|t_?@)bp<&> z!=pa;MG_--!-Pps4e<&@j;G_dP}$*PCyr~J5XbpUD_00Uxa&yErCcoOfX zAZ5Z1?^ZO=p)4MulzU43X+~c5bNm_zc0I9&Ry>4N111tRYxB9KY5V~>!g!vSY5n@R zT#!3>y6b0hzcycgZRbFwIWiKCi!)MtZtYWo2h$Y6$__)oY?K|`ZUZ^6;~CpO!bOQ> zgnRg1Al}51UPhf;Ks)=M0!|Z!A#49<)!LP@;8T_OvSkFNa(PmNCitqmL>NGw5GjWZ zW2#j2nBnN1c}&KOtx6mdyB?IWw{2`H;QMN<6vsgOSGfzI<2^7!ww42iMqWSeT$8Fb z^9}L4n$W!=ug=4MQ3L%x5;?Ua*hmP<{7yPx@?vxpJy1w^3kPBf^?7>2c!X>#8`TIP zsh!L=`2X&yFk43g_hlT*)!wa_5Fwk&O5QN_eeO$4^q>~FUlYW$Eznw&4S^sBlSe<4@P%AJIk2ZC>NV01 z`V#AIY-^^N)!M5!+-+c01^LE7U#c!wK#{1X4B^EK?HNo5)`qz%t`{9MfEC-}%P2rd z7uC=##ya45&aqkG3JAH;BRKK)u(Qa4k3gW2F)~}!Ej~~Dr0$=lL91b@&OPV?v|&gO zJ-3K16&fPb zoO!&L;*};#X-os-82WcZt(a`qr?9$Q<#~4jN9QU{Y3RXSlD!d^YBRBZPj4TR=>V{3 z(}JX#kV0u^=iY^mX@trqeN76EY3p*DDi}y^U3BOKplxTg^a%`!pv%C+ ziF;}^(00HgfazghM9qcLz~$_R0~%A~gO2Dxt~;9g_%MAWKYBr8h7lc~m!KYgc}9%L zxkMC^hJ}*oVzcD~b|s$?AkQ!vKT035E%H1ItOH$3FT@EZ4bG1p3mLTL-cV!-g03_e z0plzyoQ+J)xi+IgNH>4nxfX2?y$3Qn#~F`}5)eP^>ni>H?UirZxsX~>-O4^vuC^da z184NSL0+B+pAnT4LZin*pkG2*7iU&f;9wo$pegr)uO(tPe1JBj_pP#%`FV{ve?I{k z4vxsqIdW#kHN!YEgl7?AwRqhUo=oKUP_-gX43h^N9)66lZ8h^6G8(UM5 zoC3VszlnHLhfR?UxGiNdUM&@(tw^o0ueTq6{vB?U5~Ao%r}5GzP!;*kBFdwq$9}0& z*4^X|Va3iTV~ZlgLO`ykDXY*Xq&6n3AGDT`v+8Om1;y^sv3gcOXO=BrZgpqc_h&ZL z<{_-bl!LDrXHM}lk-CN!T~R?1fw?rejZz#0%=cVQ^MkmKFxz>_AmH-nAlIxt&TG5xr0>v}kY7BKv`&7I=PxzbB64H6ye^|kR zCcqdc*k6O2KAPV1wOgv>b>h%#f*egOEb)=4m8l%*o*Fc2t2`4W`n%XTy34NsM4$_Ce0*lMBc!?< zGP7SqClk2?s>8+yF#*HCxx=8|o<8gz1^U}5$z=FKm&>goWJv+~Ix@iZUITlz`25!1 z3CyCI<}lWKiv$IEhV$LDh z^NEy@X5oL}M^IH;net@1Qh*aZIJrQ%>aaz{3}v$*$7if6aRNaYY( zuo6Vk2d5>La(Us+lHA9PeY?uFa>2Kz+!rfJXRQ6(jbU2KWi7xylhE&+_TmvUj zVv`G=Iz$YnoxIh<;D2m}DjI z9QiG>hYLnuxX65lYgj5R7Xt=#_(Hgl$DzAi*{R9_X~fC*d5P8<-3XmuK&NQq-vokI z>*eYIkwI>>=>HZ;t3_-QE*T6=_D^n!w$r?0hEFmI*3zWoN1cFKF1loiB}m!@1q}6- zyynb4CxkSs7XUa`IR-nkKVDp)J~^MhFjoi6@nOfXoKt=8e8CFla1lt;_+aSkY$$}d zzWT$ag+<)%i-w3uGdR1&3oIAko?2Bb(O=hZI0n}T6M8L@TFg%gtr{(3o@QPDI4B@l^ za0oG%b!^w1DvLryGD}|5uUNGwrYqkO4_x{QW6pB9u!~8HEC9T1eBN@qHaz zl^hjX7XuCyy*m~FIr5!Cy(Om8zN`lm@z@Ux;>dp3y-m$lVlKy=2JU7u;J?y;=Z`+N z6-IzV3kBGW#$t9*Oh&#rwG0J~>`O+!LU{cnXhar9}vQs;X5(gg(}0| z?-dn{&ZfD)S174l$-jldx>UWNRDc((Fh66#zCxJoLT(g1Xa=F#B5$vn@>1N~Td>WO zDO#1e;t%`v@z%BYakCPX!l?#5$){R;%b_tO=(OrK&G6a(BFkb>;f4$`vjoPPo;_C%)nIw^)y0WqG>*=%ek^nam`F*Yz4rNT3V)L3*gvh|;I_0|WafDC z+5h|J^DG%uEP$+UMIKKB#s)b-D+H@d%ZPG_q(l^dp>1d)VTzJ)kU9nmZ1%*hA@bcD zpZ01dxLIO2yQ;xZhcF9VYrm9?{!Ia%QuV(+NJQ>4CNzzJId4?cJg5x2>4_vXkK zrInqIc@roiQ%wx!gnURw@UClD2|LgCGi#6~*LPJwiBRiS6=*lG*BlMJ#Mm@^(qUSt zG!o$V0x6Ix)>pT?GjHqe7hW6Q>v~WEX@%^pf{tW(Pwm5i>WBgX)U(^wj0pbMHfJfEZCX^G5%f zD+SMrgDBL)7QES9^P2FL)tC%3&$j6Ilc2rvkl?SjF+QR z?BE*n)O%mi2aP!RAMkVH=L+D6aWwk*Rd3XU14%U)&Yw*&!_NznWWxO$sd+0<9q<@v zT4ea|y=M7?i^GCAR*?a*)=HXCPwMoP=~o(!f@l#b7eD z3m@SH75EE5EnnBTv#mm&5d=Q8vDjg}<+y}5r_0zOLzjnb9H}Jk0tyJHrFE)((kZS3 z%6uUBTdhUV2i7j}M9^ac}&WwZF?NdBWKECKDPD>L3jE*sT{{mlC+>v z`{kLMX+jC-@!9$OO6~jIW0^|l!9%!PALS~B_l)&cm~K)+#qs!Ht&ogIOU~12_-#rd zIsLt?wrOUkxB1$KkNx#Eu+dMjdOyM?;j50{K$-x77vQ1@jc>t5!T5QLsp;T<5%^m1 zX`x$6TGsthgR2s%M;!ec0xTKHa9R_kX5DB5kva1wtv#J)9H1?17x@Q`XGQ)UX=DSF z5v*NZcF|$;yhKJLU9amO@+73!pdT(YT!FZ`JzWg_BiKvo)7-pDfnh4xo)6rga5O=I z);{KlSS|EAev^>S)6ADodFJZ`?7#?rOZAjPya27sZd^`me^MDlm$?*g(KjY1ni6#) zA+Z5yesydo{5d_*zNiObGRh#v4$q+7RKP(%5qHXaGu-cHVv#Yzhh^F_;;hmu2rex+ z{JvztZ(NC$<`QDV*?L`5S$NEznzdl-H;adQ7&!l1{34H_R0Y#T?WyR2(}KAO!93BG zes->VuC1v*)4Vo>`e3=KexbM8k5VYQ%N>-kMCA~$T7QcPpoV7kB^$&VFeeUrAyzVi z$eQS1YBc*JZg*w>z-t6KG>sI};LRC!8LCMCQ@6|scc40Gq>UFNQz;WJ+JR2|I2ie_ zYLu#JK4sucYf_G~3AW#+z}GM@O_^G0&Ztb(Di|BJZGb?+d+6+<{L>hDCb|=j%zGb= zt(88>i$sN@?D{c`R&*kP>A!~;yXa!Lztp*X4&anZutCC~E8QY*h(Tj{7_NL(#WGFP zLppSuIW%vimR_)=5$9Sa5G|+b&d|B*Sxj zl$|D*P!1sIeBSO=y2YWY;|M;5IV>0BVSRDU%;XHT1{1HgrBqP5d1V~;v z1tzSk&Fp{%)A_yXa6K-H{8n3GKHA+-;c{atYexd65>`$mBR?@f+Y-F85v4)&iZur95 zw15N^g8^(eIAmBOmpVOJgaKiN^#_ar;mUkx>E;@oR;N7P7F6LP$w=Jb+@p+Fu~&&N z=LVuF6v7Weq=LXD-S5B%KrE}8IZ=rL9JLs&@XW@f&{KcrnXX4gMg0YVzfe``4s_fVy9_atiO zK0fkKBVb~ceI_6Q1N9#I(qa00ZS0>q@GXb~}b z>Cw@1{nV3yOo$zTgOkn6^&-w=2VZTR_ZUz%T}+DfZON{FY6<6W@)FfU($s=P6Cfn* zSsrem=h}4gf7YRLi107w6$JCDV;_@X5qQycW}2P{mIL`IV{^NCCA&>iG?-RaLJf$e zQq8UlWR7?HM}jp)4)frg8J~iQD(Z_&WeH*7#xxb0GqsxBI}7DE6>lUWE~iM`_u(54 zhaV$lntpU?oDF8J$qpFpDo&5XDt%Qje#3*gY=Eq=X#UWqgSzAlt%ABMw!Xz^@;u%% z3^D&(A=^FDYV?DnHZ1jbmN)v3Fv}H_VHz*=37}8L(^N8CjlV8?J?2+vkDNO#<^I}m zQ}`!sA?&3LSZJdEAbth*82&u3VPu8Q*Yxb5DE0sgjI(c~0oPYyX&jlo%&5&s<>}up zuFDe55MUrLopM!X585;8eV`C2^xQw55AWEM$`DP<^^@4q4A4KSY| ze%;4L93XGdn+lbTLZkkv(e2k(n8fW>P#E#|?V|r(aFQD{sRap&j}j6!(!sq02vG83 zAs$3E6+e?WIF6{{$AWb{XYxa@Ys~VE{w-)EWx^WJVXE*JEKLahKF@>Q6Y|2OtEmdGu4fo%-H-w!9+ zDPWA#EW}f6i_-!k3;4PgVf=|L*lksc7y2o0>6nRX%r@cv8@wNqiSjjfJdxp|jYu`b z;KiWIHL-~~;%J>WzJup8Gx>OV)i>OQ4I0S`?Yyd>hzJikSamO@9mLem9KvLPQn4W$ z=nO*K9nIVvErs8w?Whkm&Zha3sbY&5g=(oFrM7ggO;|Wf1*wsSlzWf*(KBle;bWa* zHpX`@rA<{nc~s)}d=?|>)@;j@7Lf2@Sy@)m>~iDHm68Gm!_|HpA@adN&If) zNwBvTO`vnxQAH|=rAzUUa?4Tp!m64}$66GTvm4Cm>QBh_RLV53^W?uw8>c8u^iZiUA&o(pW0+aT3Rg$O4z z@{k<4HDY}gJPq8MY>$#-^V+5qr||+?1PJS` za}%zIR&P{A!=y1<53c2AnWa_|d(@5x<55Er5!9$31tbBY5G*r?#-TyyjsQc+xpb-l z9#!a4S?--Ib1@DSAs}3gF`UTiEkuE2!}qw^PLfd zXVV%tcJ_2+>CY8q9`G+Nv2Z9+GmuJwlj~Ms{5^2uu z9v2fJ8T-YfnR!Q|x2{%lcHQ0daiC?k^bxjt1mJR*ma~@&k6DBCst>(QpMKB$ROcqj z2T?Nj-|{-XYv-J5I@PjUY_xs?*3Uy@mv2hI>MdTMAOe+JF43<+A-86&%aERr2FqeD z@jG6O-*n@(K>o=+i}s7vzpPNWdmY!An)R`_lKa-*?HBC!9??Q{yO<%2cO9(^vpy6L zSZ9VmF^|DNplgL*S*@kT1#qZs;eI@Bx>|7Y>n)0QNK&Rr} zGu!ojyNHQ1?uVB){s1kgRnCoP!w{Cnr#F9d>SxYHA_EW413m%P`&DlLd5nA>r?=^4 z=SV>2%a0NZowNH0g~`jHG~j$i*%rdi1!#8F}ymEt;^nerbpaIl=lAF-95 zY5_9D>~W+VLsK0@=#|SL%XavC@fgqwI&P3962{1x$l63fS)VW7|5heF(o+R_am5}u zb~}Tfh*PqVzI*-#&28Jt7IU zV@H2BHu&O-nt+SujYI{qfhlW7IOu*(Y4Y7C(cLH5n@5;$K{;Q#Z4g7 zn?x6>=s#5B=En4#`MC|Vq~=(Tlmw_wjPH|sz^Odd9U##ul)I>QtIGx1IQV;sisJ^? zUJ@;KD)!}ko{qUesC;7FFP4IA1YJf5uXbbtaXiA&Ds!HFxT%X$-o0s)!%p=n>J&@T zLaJ;;m3(%(6K(li(e8V)N860D1=^`G$k9%+@f!>u5U;u`B@^6?m}ck{SLXn2Im9x?CFT=kAJ z35G4@kh?4=NNPHp}Ti9H$<9y$fn zgmv4HoLg3ad_udc3P@fiL!U@F3qq?b*}?kMei>$bVLU>n5g(rq6~e|hPt(RSwiGavDTQRIvT`a;8QeAM zU^1H1m3p@k#dAHpmGT4cdtPb?d?`%~Wh_UipE3Bst^C}+?i#bV(XC#gb8^(P`E8M& zlW2^bHXC|ARkI^mp}$DH;_ISl45fmJjP#WUA#k~$h)Iv0e1jM9*fr^wtfk`p7L`$; zv~E%p>B0mC=pPP^=WF5(vVdKt=dj0GC&KeKn1|}9Q=73>Vr77O8kmTUI^4=1Kx;)d+n=--hC=auY1o8x zAz>u-7G-s}fHr$gfK^PqFNv+SAQEOhO*plrb^w;2(tFcZ)VSQTn-z2s3MbbXG0==K zXyXVfE5{e>d8rukcQI}m@SE2RxX2{di~?KFy@OPkd(Zg~4I{yHOJwF(jp^=GaB%Su zJT?hhZ5}l(cp`k?wWNvgR}?Qjf<4bTZmJ7Eh#0$s)46qHgW@s%eX2(8AC|N&*nkgU zL@3crNUD0Pe$x7GWiu_vGrQ^6vp}s0^ytH?vN=}O5pG^?QAGz-mdZ|IxWS0CSQJSD zFX>%_OG9){hSIM3#eg|6de>CqMA`k+5w)+1f&2FunMAxYc@jWX@s*M)z|8g^m%p*t zbP7H{wEm4EK2Fs~s}QEC!lRN|iKb#vgScpAxRYgKg?hbGibn)kD%9TY3D=At4sRxy z0-5TkgO<%oVrByS!i4utijNBNfCVG@j4wgFa}3ld%HTq2TIU==UQ|Hws?!FLmGFnp zrm_9T(uRR6w05>}t}82#INT7%X^L7)Wk4PHVGeaD!Dm@Pr7Uw>X>%|5NCt&N4fmjD z`E)9rU)p05nkVz|9hqZl<#d&$mDfZdBuZYr)VXpw+EQL-v=Ekc`lkF_U+p$XrKi1r}y;T`vh-fFR?8P)EHdS=Isf zqT&;qfg;;r=-XdWc5M7}ufM)J(Es@=QRv62Bg?CwwAF}ezy3*0qgwn|4s`qxP!?@{>j%9os_nRVt9U?KWsS**r)NW#fRsDj z87rfotoX2EI&wV^Mq|3`klHzlhlJNK}HZW z-1S>_*Pu~Afsy`Coc*KT=O1LtjtdlP9lx0jYBy_@twB@Zk8V}aXZJwBuE%_Dxd&=0 z^YG4&n{PgCtIamj#fJnbCYvajTvm-iKED$q+gc5)Tg^nuJ8MQe#29V9w#yrdt$2P@ z&rAY*^GqT3;vgL44g~O!yM`Fr*6T~hxL#3=^Vm|<@5-9U%#8{YUt`-`x;4BozC9pO z&Mt?8POa@OU~+I8!FQH?er)XsB1)pqZsM4E9W6>?i28S$%;0?Z*5sdlKZ-h3*ew8t zG(|pt#Yli!5Oy!vz)Yw-#jKDZ5Vex_9J%4qHJR_d?RA%VQ8jpYU|T3Acj9Z)j^3Ht zJ2{6Y@K%LyU;d|#C5)Dk6i+sfa;~b^emOi0swNCy1do#VH>2n~&t$-PN^%9HE+G-{ zd&#P;XjQFK!bpiFXzbm?ld?V}8!B`0RLo044Ffj{NI*Z`(jW9y;OO8Q1J&qMbjm&V zfsp?{FfbrRtWb!@(6{MiL)WEVYUe5X+v{XqJT<9(g6;9Kbs|^p1YJxw@iwiZB~li2 z+s0Rf6h$c71t}6Z?pxXDSNhwv0ZwxF@^;~!No`$VYHd;^!F1mJdn5Tbl#eOWcVd-7 z(jm90tD4#UW@L>ET0q)7NoQ>Z&`LzCFLf`)i#J0GTvgc_;x2e|=7+D8@SRK{1EY`UE>4G1f>0BdVs*moDRHn+QptkeVddWT?>4>pf zLAvf;lZbizXYFc-hPDOjfuyUaqHv+fWv?NHIQC~+ITa4 z_sH|6(=nj^(FAabxR~)#D)M{k$OjxS z%hsQp*rVcR?ve8v4wqSNXKWWT<%}blA?(O>QqBu)*}~$h@bM@gguU*>)Asag6B!2B z+mx$lk(}Q(jR%)>-joPr9Vr=Iz8{VWnvN{*2tb~|mDrP>z9a zT{AIPMj6C!98<7>4(i7Rn+Wv>O`_tSd$K`64f`>GgxpdWH3@t{?OC@(&q_B=GvZGH zo6o>T`LM?N4L6*PNFX6hwomGo`b<2rmx%2cE>Tn`IWZyyEuZTC2NW^flA5I(;D z^cKdWv@d^Wr=l2;W4h8pkWrd+e-XFxbvn}J2bUnI#!KdKbsW}&!x{UDY#hZNm?q|( zL;!0Q`AO>3nUcc=6W1hp>>;GfCL#glIVw1gs~gt3W?`%8eq;OFF^e&^qz1cbDx?g6 zq;x*!jHbah+Q^ubKccw0`WQNmvLM2~^vs3wF0rJjW@A`Bm*Uq;FXc&We*VCA(7#!) z1`8e~uM!U+DU(*@BX`hx{0XH?bN9kQCK8BFd8@Dp!cP$YoMI55oj|^)8sC3~yF~fKtdB|ibY|f^&yb~0hbe^r#5b=?SJ=|zvSn5nJ@t^0cF*-4 zuaWD>lXd_oQRTGnyi2Jz4HvHCqDMvmJwU?0d5nhK3*BU=AtOb9RTh7Q5=KdP&E44( zgU?e~o6!?`f}khWKMPz0qS5g*FQ`~7@6>lmNBX-RJfWy_mYAl}-1bV5Dsy+ z)=WBH)aDX%XB_~kMITZNsIdihewOMRlZ`z;aR#|&Pw?#Ua{|=k27w#|ezB_0$s*Hy zD9B-B-XWu~Z1Li>APA_4i)1QA-5QA(%3tI}`&795zt?Z1iRo;#Zo`1^GwQ-YatPXp zq4V05Q%S965=3Mtgsbux!`{1??8=;+^;%g45Vo_0%;((W;qv{&c^`)yn`s$xVeo*9 zdkH!rxhiy^PWUKic%JMU8$sr(mi61&M#vf}yK2H@g-0iNk9N+>tT*QVuxZ7%(7N-w zs6BD!lr-s6(txe7T5U48MYgjoW@snmnYmFEJk5-(OanWpn0;?Dh+-C8yrj1;NGqQy zB{p{smhKlLKvWJfIY4d_TSNs_&UDCQ<&*--LW78m@_%tSzk(R5)KbC)#FDWBc2S(7HEWF&cqiCXY#2uLR6A z)mz`Z65?fdh(>&;F9vhD@w5P1C$l1PW1&X|{%_%FMpkYng!R@7%Pnkj9fy;K8^r(W zUuF5A-9g-E``lgrwv7 zEKso?08@^)tE8S?mIqQ2g!1 zR97k9Hhr7xMrZ^(tuPOVg#P{6-gAP^mQyy_6ZrQyB}>0Ycj)<4|q)eGaP7vqh6pfD}|K>eg?HDLS+YX8JUr5Iq1ryfy#6&!enb+&3?0_uyK zwnyq}TuodXoNVGC--6`*+3ilpAaUl@CRAorG*tJ159YP)mX_xchv1Bj!*6zYj^v*! z`iysvJxN*KGvKV7i6XW(@!T5Doz*m9F=5SBK=3qSyICF-ro{f5@Alg_IbG}hp9Bl? zlK&>uKtG^&7b_ex%mwawkw3+_%sb~h z<^ih_uG&2Gq0m+2S~)KK*^6bBFX>Vzy{G|=ZcL}_v^l3kBcp*(it?4ABd~?5I1R1> zJu@L2_2nuoo^p)EmMd`+xHY`%?PN9eFHmSwJA(|(?rJJ~IMR}&tOf~JPiG&w8i)nq zJy2H(NCJtb~0fGVb)SH6rUw4tU+?OL?b#UO@oK``J!zN?F}#risBid zuL=LBDId#-gng~I zx`j>_#cp=2ZaDTvj|*`W@L}~QrxEmA3rZ zHxbzmO0_B(4fZaA(Lxe4B0RSYSJ}Lu9Q#1l*AfW(e;XMO>3PmVMue3y7F4+3^fYC0>l6@O- zZ!K_p#L%>)!hdC5>@hJDVwWQ2H}@{aFzpY>n>|_7;a<`iTV=~n9fWE8?v<`6KGsoLoNE$ms9qg~v>!`{PaD96us7Oa~Qb)1y72MB-N1JfU>h&7% zh`yYjG~PE2_;)25LKur*Lzzk}3e?-$MxjL=bq#>)(cI+C9BLG<^#yelVJJpmE`NT3 zs0I3)ObR05>{RDH^4frBkTT7kCOH)KqVS-IRO6se}duZ#J^|DVDG6)r!?VctX5&j&6Annnjry&N5 z36l7AG7HyA9LyM=eMOB|+y zjDaIc1Qm6%o5~ey$DPrEZZFJ zo>dN}5G7wDyaox+{h8c8K*F>XT9AAr$AXnk`3>4Pp*GreLlc<{P+OW7VK(z`U-%K%RJ zr9}-RK>l`-YRrG0wDwE6fpN2^n38{@_25Xb2#4I=<-`F?ZvsMj*ti{$lnhr_8?UQJ zVcTdtmZw-a;`FHdEK-MSIpwi$q$xEpR%xbX_pvso0?{diK#uwB9Di2kFI>s|{yi&^ zzxmKc+%`L^q1NsR!Gw3>HHpm7;Y6q%-Q<$*S*!|LRfrvs&73!5Pwa(83tByT0_X8O zC@pFAhXn&9o-+Kf$*=y(4}TmRBirUPJzm`$>!`iOP|1w-^OHgH0tY$-+PE#=QhaZV z*R3}1^#wf$JMn0y5h2o8Yqyloig`_w63!XL9&!VS`1dptQUQz&S)Ukq?(zyUn;ww@ zS3VT${S_&g3X@s2Mkn8K#x$zQ64-_cZrr$%o5Kn{(rr5dvHxcP+({bfwl!cj>E6D| zKE)0@(BR78O^yK7^12%>M*<9ue|Zs)9Tom3N0$G40#|voH(OYgBpDpk@(3K_qMNRc z8lj@cbv2XMUakji16~xrT`WnUSA*@_Ny4290bcDG^T-_w_H#arhttJe!Huy}RSRw) z0%32X&UxXJo6ZQB`Y_+)_WwX&XFXYTzzI>*hDB*z@(jk-WNS!gSB(I{yy~-rKMuI5 z3hW=JFezYzurXsl5NOicJMePF9rWV)R0vj2ZU&~fb`9wvQ1#1O%rpqY=NuJk_s|64 z`>d4F0lkY;Q4Yv&u$X0_R=a;nT#giR{TdN68-HW!xddT)j(RfYc)3H{*;r{qb0zID+3+RLYot3Z1hn~t{(@PHIzK4;EBH7Kc_F=1zp%nZ)AdHk?prh zY#5$g`;b=MuaCUfdp25CA?GB~&pY&>X(Eo|ye`)Ra!e0!2#Kw=>Wxa<7gyp;Jt^B7HmUOO?w+Q)y zv4^s{50ohTw8BYSE-|nXqPN(}?=%o_g#?LyQNoMmP!Xe|zrj_%n!A% z*<@8Df%&WqEEYvp9Nw?kfVNF zcqyUi|IXf(Vh|cx8<>Z&;}FzqPV#cuZ}~`1am%Sp*>n<3k96mYW|U-kH(31QVJw}a z2+TSzP$ZV3j7Lc-ww_uv?_^C05^y0rbF3T;PoPW4C;NkTwEFjk$1Rq{;kMq^G=A(_Zcb?HkC8v=_1@4QrvEta<&Z#35 zNP4yS?To}y+3+Gnd4D-X`m|#5hc$SgKZ6p1{-r z9#0n}>L2?O4*-px#HllT2ovJLN0l@}#K^DL!@OIo?YX|6DL#gz9#Z%_J^G%lPV8lA z!UdrT2q53X$6NBjb@L}z(&_YaO)O#^F`ee0Bv6A5vVCTu|MTdZ&tJoP7;y)7OX2;J zK&O|x8KGg7H{Ei|uMcfKFKthEqgzCHZOiFlc`Py4B8MO}@rN)*c$R7YNI2+Ao`!!k zJ1GANv$M>eV~T*iI=*1|#VjW|_6T+8O^>>f5l8(Hq#+@g-IGITrF)JXYN$c=~yx@iuVvIX6(02($G19FZVzGY-Ry z^&yG7Q4zDVlwG+()CP8d3`cqJG4RX0;ovxL5Eg}PN&DRAotXI|Q)@;Vg4%Xw)zk1t5pTK9rQ;??VFRwsb*paKn$Ry&N&fbR*6J~gbpI4pqzaE0 zhhpq3Je}~>#GEX}!HaHRq2WNGzT~2W|RazQ>2_vr{h$W@BRz+jbA#(<4pVE7C z!920&*rb??Jf-|WJFXVl&|0hDGO;x3K+n-IK0)O2|MBg9ksxq5g^pJyB8uINGkqL3;7A&uzJt*L@F?St8`b>c-WHq-0Uq3eW zu95Gf@^I)3QNzyvC2nfq<0gDONr?ua#Ab|szYUz+?RBotnkOw!fV$?8k)L}jcXloo}=>F8PP{gLn`U~nLV6FLEd=? zqRP`^5jfDfq@WW8Iyl*%yQ@_hBs^ymRe!)^R#zVqB=|lpi5h6}Hy=kJ=1x-}lyVyo z)6ggWz^(kHqer$|Xj111#AUrRtt%0fn7n`0IMu($@O}3yuK$eXYi&=)Jx0_dcAr~W z?Sa`=533Exy?E`Gl>THEF=xu3!4Wsod|<6H&5Ri;MnGuDTPT3rBiu7hgUuzeCNl6q zFnU&Sw~4s2XG0itmUJk-5`vA);IYgYV|_-j5k@}!L>KjUga~b7Dk4MXVmQSStK(*P zUzxHTaqB?klv3hvzK;`yskuup-(o6I01~aO=49%5uF(xh(MEPr=Ndh90v0$gj$9Y6 zeB_dRSI8_}DX^G50kb4kl1_gP^tjDV$~Zl79ob%-2i8tHr5kj%$=%0@!=(|x^b$#z9u4mh#&;=(2q^`&Dtb3objC*4ktYp?#%}wQh*p+@c@L)WnA4tXx9MZGm*s7^h+o4 zE>oiJSSLD%!(ySMJS!iHS*JjMEe)6W?z*I7f-GJ&m&>se9d3LHMBJk5M3eH^FB7Cn z@VeOm;VD<0N<#d0h<_&TW)C({!@HfNu)~e+e;|$#@u37Y`0a=kMp$J_?Ua<|qt|ZV zTWeybn!6Kb&<-a+zdbKS52Tw3>p)J1u=DBcJU9Ph7ru+fg-WQZKyTrU4aqBv@k=p> z&P>^VtcciVBPd;)qU4L!v(4P<_cc{D-5YHKJUh?X0gGbc+GLIjvw-VkjzuOt^Yl}S zY7-P;fIS#WX(t;YO-oNGpJaYEWmRBQE}RVa4eep@8kUTr2OcTT5m`6biXRL|65G)eGM7uc7Ff_ zmvO4Q{DSrRCBnKJ#pbbQMLT%RUy5ZjN}Uuqcu&2beCLu3nHh@}5B%zj@P;gOwD#IN0KVL9&4*eqM*}~dA;;<5C4goc@4>i*Buf$zBU2}|a>3{^({la_xTb3j=0^tA4GRDZec!2>=^l*^n9 z*{nI6S=UvI^oW&w!l3&!!`=u0{repN`r4-89j~3SF+|J!UOx?1Uh9a6i84F6#bJco z0Axz_Gh4G!hJiT{#Ym-V0MH9&baNel+ZK1u&Q$AvO>R!7$)50Q6aM8j;1(T%{yJfc z&>lfT502xRD+S?M^+L3(u~dzN2M5UqDI(+iUf8;4%gT?B8Ay7wgn7c4$Sp^0-HyA^ zC7n1PemKaKF` zG@_@jOe((TcOdTd^(};Itk1J$!FRf|yvvzUX3wIBgPm+xOb9bczFs@L@8To~Oh(*? zDZxJA4IoAf8w#=&){a19ZSdSS&F{)B&H_&OybtDEZ%3t4V??uN6E<0g96*W}*rN|~ zpW#6M3M|A)a2Y{`pJ!NdZ1=XS^!ebV1J)y~dT=-~q#8GXN&)h`_@o~X#MzNBTh=fi zjCrfG0AeQz$65UZ_gNCqE2jy+HL4949f`;XrNJmN zhip#XERWFaK%u~&+Zw-{{Q#xBROL=1RiMMSG=BTg2!=6SfFRmoH8x%UkDW^1YJ-Jc=o`@9 z4W3_%PbR51Mn{g-hF}h?<}H&24-GmQxXSwYfH9Ex;w<AO%o#v1#8OT$Y()Os zR?$vXBfi*9U4-n9zP^!>?7Yca6QrNddE8fp_2C~Gt=(zos8qgjkhY)oSk8+mn%#zn z5PFDbL{#M~E6OJlLI1#OkRNBI5w)VIiknZWjJaywZt;vNmL3zSBe(sF4vVg!$q)rE zB{KYd?n;&`mz;WrVnfP#{!e;!`z4x?ye58iLWP^m9DOtf1nulm>W+Il+3fSEbs|h# zv~iqEqO7?UGWO}J7uIu~iDHbDfyS;5C(d)2{*f>gJz^^e|| zOjv-9KUQW(B#5NnMG=Ik+Iw2SaajiR5|@a$Zp#8L=oSpC9vY_<mJj!N@( z>Lypr;G1m*(1z4zDmvQF>0bFXAHW)nnVX*IHFg(@eZ#x=vtq(cV_6g&deSaM$lY$g zna5V)r|wYQ_!|s@CXX~U7@bGv6^S|ipeXk^B3J$mM@k`h@T~QLo9m)PVAd95Iiu|# z&{Uw|;9AUjW5bKC@$HW{bbv!p+g71mt{`pvaV_JOdt-W`gnwK^&q~*n{5!%^5NV<% zrovP<{O6E453hhd5u*XfQbf?OZLTrraO8kwP+Y2{xsw(z~vB?u*mgjwfa5 zw%_ND^>MPaL5_TQC2l!qb;xym#wDytd>FQ;*g*RI?X!pph*``%bMz0Mwe1>A-U`SF zGBTK&AZRik`IuO^@*LwL-61#O>3`%lUole*v`0Fx$BC36lkV@pW>`(_&~Qomf-1v% zw$M6Yj4lCY2GnMB#E2mj(fdlV`|e0fknKzQnu=98L{=IP`yx9+S}CIf-hOKeBW4hX z)(ixZ8nxut8;{Z0_;!;LSEE|=QEt-C+%Hhsf}{fp z3oE3UflbZ|EF;ZAopDcL@+{wI>ue|7ynb|hn9j;(4Qep_)kWu4$%ZU3D()#!F`&bw8<> zMvCLf0}RVAZA2APOE7q=tl|>E`UddLDmXecjFe*2^X_q*l&D3r+w&a`_$)_%bzNlp zV*yI~Vp&jE+8u&X%z=sEsv_~xH81WmM?QePFcU7Yiu@=7O`}7XWyhR)-1u$)q}|&GRL{yQ)N~`ZK*Z>+qIhf z6se1io__+-+5DEt_9#uFh49hD0HY!WO)F*%PE8(PYNCn6zOo^K$i?22Aq9!!oH75d zK{TD6G=n0KCu&G?LNUmMz71wRkC$KH9TFOawaAqiGa2=#>XWKgEUZ$Q93~^4lW4iTwYC5f68P~pel#?AQbQ1H(vK9t{ z$^xD_S(@__BOFaz{Rth8x^ZemRlukbCQ+lN6AoW9ip6qzPShIByrrVTnL0Fxed0hbU)0M%DR1c0z+6=h7KH0F7BR=rB>LiS-d{b$E5YZ!npmt zz&!w9DErZ)vCV0;43qat@HXwN$#Y~tePtweS*@D({q1=qTC?@*_7=?Bi%OI0O1Jd9 zj8cZ`@IH7Vb4)IQ)#DYbJ_S;G-5w2fVe%>DgkmylQa0aV1XwS=GP8}l(X{SvO_`D? zmZeN)o|M1hsk1bPBCA_5!g@7XW3s1KF?EYI1@{0Ho`ik-o3VvgH{C!BCp_)bvmmS)oZ>Rz#p;|IS=8n0(VNc0Gg;s|GGRP< zYh1B^QNU7y;e7WaxHnPjx(Y=#pH*E_IEBUVgZELOlwSMZmFcxG605XF{|OQwd6p!j zm)k3luXOE!e6JANuG&GguymP`8K^i8Y(x0KIjyH;Nrq*M)JQftsL$@t4*Fi2NNI~L zU6%F!GF7vLN_)Rb_{cI~0LT9SBg#K9j>0tw<}fe4#hY@2ZUN_(2s~eTvu4Qvy;%!P zx+W69H*5#D9&z0&GV?+SZeybkvNP9mL3D9t=UqtJ>PL#hx_OLE@o11*lU~9|TNwIA zZ7~|W?#_rpbFV*dS#GEB+8U}}?q>k@{13+rkS!_mZINEih+z0EGb47Orw-V?KF&w%*owWkzPXcaa;&+ z6gsrJJ_|GDC2}gl*}~KLmirsd-)^=YEbq2T1ken-F3q7M*k(!AA%(UAkGtM)p=Rbw zV`NQwv;$7``frN0FQT^MuPX<6?#JEYh5h?1JN;bEM$ExD#k+!$KRgMC zYhf)+l&m>85;`aGmx^MVU?=F&{?I}ba?pb(o6D$l&LXYf7kv?BP9L<`Pl`*APX}s# ztU@)?$NnJ9CxUwzt)-Lor$7k!dl0&a`Mn|r;c8BOzrY&oopVw9eeSg2d(8`znY86v1|3N zBy>+bA`fZ@WGC{z<$TBX6}`G0{PF&-6=4(YkR zu@Qu~P$ThqKnA7hmQDZ$NzN0eL7)x5#gTPCo3z!d;g^|OjxZtUCEXaqQw6B$lLGUH?fM-=dgZU;u>j_?V z{)4(utMpn>4`13gc^{f9*>pSRpS&}&f2z*hXA6auH_2NGJ{+*hhMq}7deTe8eZLHM zQyEv(F(M{tspUxA0zr2fizClO?wAPck}Q9oZ$8X`qrpybRkha>nIk+8`tr2{7ICHk z%GG2iK;Ae0^$;CWTnxEgm)(MO$wM7STkM|GCNJ|A!ZOAJM^45`m0D(U!4=#+PjQlz zbtX{v*+onw^F2_yb7+(rSTKU?yRDk0L_aq0n+6#`V>_7~NVgKH9^DYG)p(8t4?iOk&tr-thjI>y;_9(Jbd`NK>nzhffwn}ptjmiiXs4(MjOo%`FwPy zdj5~bHWbDuX6oc#U{kJ(rk7_}dKoc$GfS#^n-)@ z6@_B>pKa+G==d<-pUI}Zjalj1rBV}Ro+$*qPZdz{ z*7)@!3NFZ~F7)AdF5;#urz?|G1D`9+ET_Vc1}4&^zefQ^p+1y3SXiLtTssH90Z}k* zs+}L#|G?uUjJ13p;`92d7wgeCGx=2AKUDNvw}o*Tm#alD)(YPZrxNWq5=xPwroi@YCO21u0jFu; zuGom>>c9XV)S7uqg{=fBpAMBr9F?z|E}@K$8Sq26boYYiaR>Yl&VT}2JIi9oDf)L; zNJd1|hJsu&@T2e#Ga-CdvgLENU|i3wjh$2_K-y`yMAYjuBuhH5ZN}X64B77MRnK^2 zbI3QLy5vO}_d|X(s||g5d8?(V|dvFpa^{-PlGF z3LLbO97^!6)^9C`VZ2Ub{8czLiQsR9cS4UdQMWa51f^|cAXvY^I7|me$U?OvcCmTH z8fL}3xkgZ%!I{F@tx`|~yjzG2eo7E%-u;S@DVWW7xN6i{UCt;r6S5OsP#WaUqI43u zMVIz}qbfZO1w;{ZOei%`zXD>}vX+;-cnqztpu`^2*t%03Dtpb(tW8|a{ z(x;3I>j<`4WoI}0L#@zN*v~U_N;BEU`f^C z=ZlCxjsnX=hC^(@{{8mL4p=?)zC;|Ys)kQIV_Rh-iiv2M!lhBxRB&%t#m<|chBB%k zrGWy>KgX9&K-1-@;gv)?x-8zHuP{uKM@a*YCC2uKuI=8aUvu=nZ`g_#4(%3@%SlGb zXC zo^zVxS`xq2--?LpUB93%wvYq}i#SQjE`BtU=_1da7+Zv`sZxTrJ2BKDG-DO4Q z*|+fj7fg5eTmJcU9As!D-uPeFvO{`(cO^*DCR(p$PuBY?7}aY!fU9>8#dQ5^Gj2;=QY?jXn0gz zgi>KpCu8sa%;CCXLqkL_?rb>k{bd+2Juur!kBaiGXQQ=liIHg1EDx%5=8~5pZ$n#o zt|j%`)HTi0{JHg`>=P>O4UwbZF(V~vuB#zpuBk*Gf2OwEO!^v3aw#XKY0A3aTWR$j zmo{rP5FIK;VHL#E%NL9I>A4M;DegM))JCm%XW2gECO(1y)ndv)x?kh*g~G#6O8}1U zgWOIRQvlw^Q|YPYTugmU1ELnTO$uEt-xxk`kS9Ns&Kj+-s+B)a8m5Q)qgun`U+Ja8 z2gH?Mpdl~BX$+qGk&|rz-%{eTUv%XQHKV=YZL-MQxX`T|1@ZLWy&Rns z95a6B!*?$h0-TD9#7$n{IGE5GL@lSBkqgvFGIpSU@4wyW<5HoRsLfZiuU2af61+RI z%bAP<0Or2gYlZR@LU&Gr5`$e8&NsZLi_ruHx_3DQr5f%PFZNrq9jU=e<{!Kccy>Sw zDwVp^p}>BOrT_(ozE={$kSi5h%{3L66(F{<0)pO%BIizh@9w|PPx*S)ph?|Nf8;}k zF04seh=GPmkffBncXk|8_9Gvs<-~30DR9IP#mcyeKZWQd@3J8wdOxZtj)l>{8_DW| z0i|ZsD0gQ7Ur!ilq9w`V@%9F40xBDPD!Hm|G9Q44x;WLSL3?rgW0nfhB}u5UD$I z2?qfzbfuN z1Y+zMk+6wBjGPrqSnZ}O@C^fmhLe*W@4#L0BkP6(LV4U;J-(XoTl+$E$-#7k&%;cc zB}21k;&>*$iJhl0$#-P)OS4@Qm$t_iWT<o=T zpjct(K&6u+0?^VagpOr)@E>O;vCX|iNEPMK3z#`vV4NZ$A!Xz#eW7^2R*{jFJ+nHOf()uFUh*|4ik;NR>q;B2t$eZpQPB4#*xX(M zv*l7$QHv_kyPMZI|CM6s8^xvWm5c3Eqw}-#k zV;P*1UlyTOK>U`8%|x2lw~$%a@39MOz2BmbOnnru4n)<(ks|r~q9*VN8luvCEOD z;+(qjT`>N_XY!<;eHr;-jE1%=1)Nd-@X_PLGKRz$wrH*L7YRlw9%qrTCD}!6{;$b` z`(t6{x`}B=96sNMsSsM9j~4%45<8|2Sv?Aq0^-1n+|I%)*B&GgZLs2xg(#ItveSnE z0Q2f$ogE1#~h}9o}2`R2Aw6C+g!PLihz18Q3L&n7yo_ z-gk7t;vdF(_$f~j1V`3C^dawZ>Q=s_mzQO$FwS3uwUZ_8t5iVRy!B4;!{?QW-%;15 z5<6YbkCi9+qw9ApRg{yZvVd}j0Xj-n8`?%A#nez_0gm;q{4vzTnjDs2JUhzw;~}tj ztoauEi8XXG+2L1)S`V_7uah1*>_FrDkuL7(HW#u%qnDD;(*#1Z7q!s+?93lP*+3=Q^I+U+Iw$Xj$A+LfbJ);M>%5 zZRN+$wSJ>ZZe#>^?eTC~ukipQJ6Z7N>bBrK*x3^_<>182w}XmUY*yfa!o9$-v&0v} z`%=_)nw>$&=VFpyKfw&Cj5?#)D0rRB70qz;ks9O~=VNu0gtI9TQbd{ITb7bLU-rC8Mmw-BU6mij%stcmEP+OAdcK0N212l63Fy#9enjzk1)K;1`U&NXaQfG78tQ(HI&2W<7IQK= zaX5!8!0q)m;C*!>eg7XMjk=OZsc^R|3w;S2z0hrgG$65_Kb3n%VWTyEQn$3hSCfr% zsW2Jycb<||H$NDE(~UNNFJpWJ;(%Hqf)mj8-tKq{>L~yC+)IXEfvc0Fr_?b69X zY%FK!Cf6m2Kng1`k42#Xi3=_Joh$qG)-~uRJOl|ojz_$DId`uX(a(iM_4@#P$S9r! zkJEL#eg|hk%E-^@r9f5X&xj~XH*%Y79}OK2H>||VhxC(MaLF0M*<%;`7}B&M9h`p(N!FfgXpBGiKo`8JCP2eqG||k>L%h% zlZ^yA`Dm4H)QM1~@Y7-fMHI{~(%eCD*QAtUTBvlQ9!t@e-_>rs9cOp{b_2sD2FY4r z>*V0K-cFBZyO|HYD7lhpg(zj_LJ}?MlDz>Anhiv%rM1RWhu%MhGf zwM`N$q;zU{-7|beJqRGmwpJ9ocrfEpfr__xc_xU6zoO6<{@r2i^B2~2BUruAaa&Uj zW-ksy9^~3p^zY)1g2i(4Vj5}Qv({wX+Cd)$s8h3vdZnz{)wF$icMPqPC21v(@GO+XB0}vaStNGF zl>T7PT8eq^bDmpr4m)s4RsKDN>;%sZi7;R052)n24+I6I6JL?^AIctSQlw_qJb2H@ zPk)?a~RE zEZt8;BbjG>VQJ$GqmMMS_m9~(J3TE~WZL|pk*t&;-bx`q^xXx-urAP=g~#TUKb@l=_dnFTI^ zrsABaVCdeN6w~`5(FOHUD}Zl?9-(GjI2=Xk0tMbb4`fnPk_xumPzqeWENuK3yT2@D z;2@ogKR{&*e?y~fI3|BjUDn}LY+8pDz3P9fC+n;sFVbq_i=t9`Df4fUD-JOJ>l66C z9C%J+l}@5}+n*9>7DVT*BLzB5Oh)RD7%R_czWYd4E3c%~2e+IR7j{o~y2jONLulup ziPH8Q9xlLdgi!v!g{)YnQxhYLba+Xbj}n1Ms-CnANWiD zO^`W+7q>mP&=;GT>-2*v?Jp4CIhaRTk7sp!7yrQc;$4)tms>DQh&Xv9e7(_`8knW7 zQ^B@G28pre=ofw?{q9}{_f)6pwI^%VaDjA($79xCpGD@arZbP?I@WjfC9f}=@Y`^q zsJuWO6i7?>0ywL!p26j1U*PszgZv5)46??^Qt-zB<0N{{#}J`Ch#_{hE2UacGYuF^1z}7 zkTPuuNTRfF*E4)W_}wpV>m&TKsl&ceAQB+|nR4+Y6~(w~W(&4%g4xKahr?DO`o?rOzf+Y2dvv3l3$cBkbdi2v}l|~+#)~TS3YdsWun0h1_KE%dp>=l96 zet_VL()-I}jfX54zCOK#f9`Lo#vT<{2QoIPMmJo?+V1Y{Z)I$5wci~9io|=CaZCq= zI#qt_V!J=zjbH zW8A0>Pdy3}Znp_PX)I6C`3yd--sGV8=z_5;B37R{{v?kBJ*6dpmT6e^rYz(hqf8f< zr!VCXpSf8$Q>H5O*`jyGSI?ALDN|zyMyg(vMOgugivJ#a0v|MbMhl~Z8O=Cfrc=n8Q}Sv%O5sT`a~fs>`WJ1o zETFeYw!l1&>XwdCad&dl?&XXaMg$wW+O>43JFMaxp)$N*VzPWRFu3cIxL^qYk{ve8 zEv|3wZNV$Y`ut5r#YP^SyJT|+xifA_SC_IY8-X~dUHlP&Q0bgtNa|h+o;qwK3-TBj zlA`793!RoWzW3zuPmPY=RI1$$Dx=%8L#geONUwCzZ^Xwk%S^i%yO*}@n~pql@zIe0 z&Wl)ShLXQCh{yUAyv$nQ=*ZTVuIDtYy&Ja_EDAm1B>z4Rr~&V#NKa9E3iu)|Uo6*) z=M*|5KETFjy_8q_fz}#we>&s|=_VC*cmC#pVwEF;kONf*UT!-h0zc!zBa7lYg-sN8 z_xxxWj(qPjQt75GB5!*C^MH3nh_4vxayXVCgvN0>A$GrV^JS`?+`jKABJ7mzVG*KY zk)z681jGsv(IHb@k$dP?p|l!wIq@7_2k>78#xk??DdLCI^ur!kQP{SqedQeuJZNud>%2}%h|i9C^R6j4wP zh+1j}5G?ob5ewmSe14FQ$%m%35frb%ttcBMUUVrD)J)vID+t=M2ozlVK?Ii@oPXr! z^ZqHF8Yg}6z`SIQJkz`J3jeTS+&T>|h4a%Mon<9EcI*D)neQgi5y&D49i#V8+mVeieYF0E#-pf_JOm{0$OpR5LF!pq!Nih!1br$301CKaAj+ z%A~=ijQ$Uf;y7*Um=r>?`F(p?>pZ|P&2;Ou^xgbsT)rwgc~M`@rO@mRGhH38LjDA}C#Jyo_Xpi@v- zeauL?QTEOjK^*l);fke;nKn!c4{_o2=ktv?=!{Y@!PJPuG<IG7$G z$<5&?I_0tRwSaS*pog^{!GFyg)=W(tNb6)`qcP{8qaDo9!2TqXlP+?ppxE0JA&Iwe zW>-vFt^l0y)zQ({V0O&@i(KjrR2g^ae9Iz={Z9YIh>JUdeFCypgvObMuILPP$?z zIzN$b9A{bD><^ASGE?88%TceI_uu8}IHid3P=6D+pLWhZ&Y9iE$V0|KXckh|D}l$A z?LK`3(f1tScw-Nir8VeggD(aN$;F$#ZT5YB6oGCI&qbX-iM-6AzN3l*wpB?ZJ;_HF zXaJqI&6o?Qy74)~c8II2Vm+aH?3_%9cJ+u)%i3|O=DWd0?(MIU_%5ATp+R6n_hbi} zUn%~g`9Bz12o|+`7JEG&_ihi&_&aGGL}hs$e7KiU81y{nA*S_=Rmb|Wsaa*qZSz*T zb!!u9#`a{DW{PqFSbj9(Uu@j~O;_9u3~nTbMR@z78+cq%>$ZVZ_M78?aX6!u(G~v4 zL-8q^)Z2$MYPmgnieh0D1LOF7N8Mj_5S)+a@d*RQ4$>b&{VUhkj^SxQu9i9shIQgP zo@T(&vwoS7pZ%&To=E%#|oDc6F6@y$b_#4GAbK!22cD7YF)oxOF$$H`v%?&Y%8 z@m!a)V@=itNkL1}SE@Yu)3nxk+#ETvY%rCzrYUOWy#&jq(*WXMJ=;g|P>2DyakXKy zr&|Wdb7?!&1_?|L4R+R;RB(Az-}ob3Q8}sDi&r`&dAGpdwzav9rt|j~mGb=Y%#X?TktV*2I{z5j}@ecx`B_mcUPcx*t;g?f5c7 zxGT%y6Je&!aXl1LnRwPN70BF{mnNM+9J0SvS3x1CMygXsGl&tX7j4F_N5bZvX>(h2 z5`Sz3-0i9{b*^quKJWBUPQxGjKPr!@Gfk>bERTC-{A)^q@vsAmdNWAv+uS1UAHm!g z9||E<<40y%t`~NUKY)@@VE+FOGIRXa(|U8C&$L}Z^!$psOenvK*IR`TUY09mJ-2VU zi^|Qs!*g3n^w7L0zdQH5CT06vLS&N#idGM|D`&iTu5QkK02^9ry2fK*f2REzh)T+N zqY=9ZiLzw?fIA{pNoj+Li&}O1T=#>F;){gUB0MUK`tHqh>kPlLx%Jvu0=d$y{jzO$ zb|`_rO8B#?&82wTt?weqWzu)>pUsdNQ=Dw6NY>Z42W7mbfESR0@80xxP~}m!qj%$l zj68kwL6hc!Ia|R_1dNbb)kOJN-e!Zg<4L2e^&Hp^vVI>5!^w0+kdG+b%6&gole8-q z2S9q9qUe9l4Z+vXtx0~WcgpwA%gZJjYQ?2rV-=`^D8?E6?(}LP`4T;ul6xrzcX)y4NWTqGdEfMpLEdKpuly9L#5`!g>GW4 zAa<&#So@DB+SpOZK4jxRYSJS3m*AY>tIuOG10fQzjhVtn$waA{ZW?c!AW&^u5EDOk zrjfT`X!na@kA;ob{y_THiZX1q^=_iO%|xN1?2nHGsiUDi?ctyRq?5MS7nqjW$;|%d9G_6r~ z0IHM7#whVpeHibMwxDDzR^tux5*9uUOLNRdS15-*n=G|~o2wK|V4gb6qrMZJV_jfr z&jtZP$5@WQW&x*Mbjy6c?%tNC)zn4CHI=L^QJcpBTn~A*?f417&<-JaU^sKpg=26; zIvrq#nIn$mp}yGk(IR<9q#y2Df|mR?jiyGRQa@8SHLIu2 z@#Zy$@WvB}206zT(`#B*VyrZV;#^+rzDG&`ASl#i+8F?HHwZLeBC5~A^;H%>5xo#D z?Bk88?C7v!=Szc?Yc5{(S2FH|>)QI|tRAaWp2k%4t4PIwuwY1-_Nf^v^;5?U>5chiG?ZveOIj|q4f)0X zh;WFJhsR4>Dh_TP^1AziryjjAL(D{)m6;-KU<7iRy~HSMD|COI`FIo|s#ICFqsblO z!G-|WT8c41U({cbucO|og| zDE4S<-<~SAdSrFg2}gFt(k%GRTZ+0UM1mDOG>6?cm#De6LKEOn0T+~9yHTal$VlAP_bB`b)2Tiv=MHc8`j1Fu!9@*{z^}?^>c*E z&9>q}IgU03F4$@h@aYrVLgc3^<9|+6w?k^G_1W*iY^(vGSJ?ae~EtcU9 z@=rzK$ucIl+p_{x-s-V4vKDx@ep9tW33i#(>HPvGcr>?JVQbWcYb&T()cx(^`yD4Q zjNsspPO%}>lF5RyD?S~W?&g55H@CUiig5&#%|e4X$lIMHmLrDO+W z4fozmJ~iZ}%d!p^WG>;w(eJOvurQ=Qn?$xtf`e8rSBZ?U@61UDR%D}jW+)TsqpDI85(9+4xEVTnI`jHKZ}&RDO?OfuDJa#kLX{C@~Ny{RjQ z9^C#G*cC{X=&Xo@{~qJA4IWR-jG#7GB{$6hF)vZ(S|%dFU44yaAekED;VdqU$@$Tv zj6H{|N$K%gr?a2Dt0$ZB8ZyFXEWTuw>OK*0xt1h{n?@b+tm$l0f@$BL^fVQTrco35 zuAvP+SDo35VWsX?2KHOuiRb)b?#mJfz8au8W?Xb!=_oxD`C(~G#t>W7F_utPDUae* z$qLFm@hr9vv*o;r3-j{6Rh+LAN<^-}X_VS$M(d%=a3H9_h5##@6%oYq2ApS6e4{tg zgTRx&Z)Tbxx`+9xIPksGJ|DUi_&M3|vaEMroE$Gud zLJA})#Q;>>7%s5=Gd$D{gJ<%CO)<5_pbY(0L3{ONTk7mI656rhBU)v@O(;V>a-y0n zt4a2h`eS8*b@&v~r#z$==5BW{mC9(kSzOJB?AlG*7ED&iD)z~UB#G0bRgOBeV{YBG zXsQ9Dkp}L-J8ai?TZw?atmP@fva&9YC5hjEJa#q7tjbON8VPpAI*cR_zCWOxl4^>! zwIQF&#`9FP1DX$z@wSI)p@@J0A2%BbsFD?^DgsOL`(I{%WJFEPfej={`S`T1K)uve z>Gw$q65|>uv3~J-e@bn^(mfl45&L53;faSg6U#<2V^XeJ#RAo z3+pg0^~|zNcJ6dWIZ?_U<$shA29u*a4!f%T!*Q*c_rb_vqVBhdf%`Vh!2lZpfLGO8(HFeJYup9KE#PXlqn-A6pm<6v3+DBNCxm zQRai8BIgS_AuR29*G8YApXlqgpvV~H;n;?)2+W(am?q7R152|vezQqlmFPeV@t4wbUdlS5(yP;hZ$nctSqF;`Zfrdx7U{CvbCE^Gw&Gl_DEU!+ z6+^ul803Ebs{*#tlej?7eF&=x!K_LqJ?5-I>t*-k*2D~4mdTeLyvvrAq}aI?>t8wX zcw9gJKGLBqit-fG8!>8APm9|8e<+aD`IGf4RyVCNw&hY!c>fB!&MpB9jp5(gC%D06 zm$)GF#+&qDX9r64QDwgA ze3vS+X|Lu?d39Q`sP^b={;7d8OEXQ3D=BE@KS)zpOGB8h2jR2>3q59QJkm*wFxOFo z=#KD50hM$SLEN_q{F5*-^1h|`yBQo>ap;fx&ag~V7yD)iBZVzxeDeaa$K{-qH(HeR zU@%~7sbURifsy`{)#(Z3Yvhnezh3I>DV-4IE4o`S`>zaWwan0tN3RvCm#dj{;bGE= zX3dqR@UF@2L4-0nf|ooujj8R7zv^9heQpV@e{bx28%pQyA)$EVQ1K0fs8SgEAdapv z|K5Hv3Qgp&XD@U3Ko-jYV2gGaY&74r_;3REIo@*@A9n7I9THcS8@jhojJM1)6b|{J!}x)Kl$9b1|8tvU{r)HURg8Cs32Oy z!FRntHIG~G^E;KN0Fb4Uj*5Zn?t+b%47_U+zfQTGtFg0+2*6&_`}B*xk?n|K1>0B# z+MU0iR6#@mIth;R;(U=-EbLOlUZ*oM0C3vulL-N1Z^!5z!?YvoKe{wWcF zt2QZNYv}^(mKb;$tg3nbQs`fNd~J{?c!15bJ}HT~s}>Uu^qR+quS0I4yX7jDHQX2u8*dOWIdqq@h#FE zZj~KZdNa0ms@|~{wDiAe))jQpwtn>7Y8R}@h*Qm`Vju z!2~o21Qf~^R+MHC&u=uoMYXRFDpgg(bR*k&zlnVHf6Dp$L37_#p_7ul!Unv)uRf@c zwpcV)_q4eHp|bfPJ28=aRA5?R1s3~t>Lc2%rO*I-^EZ=5HTYH$xmi_+5Dq6M0@7Nt3S#iyt2M`S<_mWA7&L_F&<%)3y~#>y*WZLbpZ~*}!^Tj#6iK78nI)D5kIaap2dKNZ zL5d0F3c>V{(&96wlQEM$s}D#PH*H|o9{trK!i17p4wMZi zmO+RfxgBZPfL}u@&Y|a*Lr34BuishfjvvqaI?JJI_GW*NM$7B-XsL055FxDC7hha{ zMz3Lw?P=mETJgzxuPo{+dt=To$(^W14e`JbW*MzTeR zn!K`I>NVj=ewH%S&QEN+TAL#((4SV5X9*9>_v(1B2tEf50OX`yU$|0{^v^DhD9{gY zYpM(b-$gsAup9C738MM(ke{vzv;Krr-7vjRO3rGWn}}}uLWd{)RfVsg-~`T!M2UX~FP06Q6k7YjvsH9`9@q>oSKVSD}tpWeP;X!7Run?3d zl;Vm*V#{q&0{N~2Sy%jrsV4`=J+VQpBByp=MZ+u@CU@ z`eF~uZrt6>)JGL5xh~oFRSyK{4x!4ysCTrcI`D@+A;qvg&0jw4)cpu7ORq1{nuJ5u$SNEc$96{!lc~Y3$6N1W31qKE~i` z)@mr*n}H@KZ~OG#zz^NnCKJ;Q#eJge>vrCt*FEnEc8*6pV#;ttlxx>xh-C^2Y$Uw+Cl8tCN8k~STjxrfVf6S_(Qjq&$;Ny{lMXO9fq5w9uv>8@=jfpH8O8<$ zjqiiqAF$Kb#aYjMbxgqHVg(Z&8LRK(PnVm@G_df27vh4+v`>&mFrRPnrS~QUK?B84 zEDCy~3##!|(i;86a>JBud$hCbz;fHGar)ljIwkjI4^|KxJwG z!YJ?Jh^fnQGles=Q2X?&bAyzEZ?3S8AqZ`<@f#SXMG5nfi=)8n$sVU!n06D1P(%4V zNaj*#AfcLaQ5MtQY0Z!2+ zVPR+0Eg&OD;AiY3hZJ&nbl?H~kmpF~$P_DiWm(-s@GUEE!=7SX zKx{Bo-APCkx4poy&(_Ccd*uLmD6;9)F?F7utaaMEI5n-gd&J&>aXN-f*mYGLt6M8% z4Dfr3HcX#Kexv9$s1JT*ZaK>D257u?Xwm%lmNf5V{AqSEQfIEjW^A$woYl*VyZGij zG+py?!-Tl>4ca$N7$OHekHiL`IlwxIT8XBi16ob;kGgT6fm{EX&*TAzGilZIlGy{y1({dM*UGr$Mt-dM`x$Dt-oO?n87Cres>y?vo)hb+A z6-a}zcSDF}P;gZsDPq{U1juU=tNB+MRfw|hcNla|$6~8?O8<-(fz0Fv%(qx>lpC91 z*K+G1q|MOR$_|qQTSh^z!eSXu2)sZ1oJpWtvFC?V25FYO2E16p)fqI3K0=0-TigO! z$O)3TsaC){7sNkx4Kzn$Ej)5!{JN*h=55Buoa#HbC$A-ze4M7Cx1bi?`#xs%U809N zG?ixx*NobKkH}v>k-j+gH{sxFw8&yiuEl=$bG>|ZNXPck4Z8X=wT>lxGxvg_ee8cr zmv3!%*olIK@}uhsAzWO~rHbf;P@zQR>0wP&)Cc}_%+Y^aA~BP4qxNY;bBj4Au?G#ty@62f>!B1K2o#ZE%K}1g^K^F05wi#=X^0#QY0w8Pkgj6pCpi;h}G3y zM74D})GER7|DoZ9fk~0|`gIqKvz5-^%03&B%T6Wl3n=8PtFq~dDV9uGiw45FdHQNB zBxJam@^J-Hk{-%~IK_L-eAS=(0hslWB_&X1YWt~i*&H(<@iEfG&j#%vS>O}SB=fEk zg+kzCR?)=VBAV7t6HnDyiZ_J;=8JI*FRDp>jI#P#a%x5BAA4ktK__p2iICY_SD9)b zAiYAJI2HwB8M#U7v{@(UV9;Z{w6!E&YnuoL9fY3WB&WBcd7JlXmSA79+Im{Q_)i++ zegNtc{!8)J{pvX8i~2SrC2Xia4gJ?Y;4?2zb%#z&*xnQa_9YN~+UI5j$>uFB4MEK~ z3XE+sOuRADMgxeW7(5mTM~ix6mJ%5;MaXRlVuRm+3|!76#IC*+%}ibI!cK0EvT7S2 za&F&5fiU-&s>$_a(mVTSsg{HEi7xSV%JKu?HRsc++Op@#p-9w}u`A4j#>)=8>g}+K zr`ATWmpRjw+wUCh7=tnx5xBc3=frCv-oZ2V`XagJ1$&1Sd&0nFLoEwIbww0~-VrG9 zDUgthao8qC^#~Iup&NE_{QpwrvFNsp;G#t5A`Glo+l*J!zHzEZ{B`DuiCcD({hRCZ z414z4gW$Io5OghID28T(^`;23#3g;c^LVPaJ#g-DQln5E7pv{X!8tQvE!AvOiNT_? z)toNqV528OJ8<TJ|O1ud!sC8lSDwdSPkD z!ukWtO7_^y5`%BFKC>dtkh4Co_M1dhZir^TKgYG~)^R$)S&S_03ZT^i z6D1(24Kh-oAZr3^W&OnHH5B219x@5{`5i)jCJQhyB+{ElE z*-Y*F0E(Nr%)yv}_6l2-&RTo}`B@9ac8iIvcu|n55(p{lWyC{-i2Ho0rjXKIlZ57T1IR_Hx>*UqM~`XAF**~+#H>F5BLTg zPV**jYUsazO+)p#wPZ969<83IQXM8cvkW4NKgmogpJ^!SEeC&2ZFY$JcPT);SH zcdO)_Ho^z1e>|tUA#s3u7}}88l=my7xnbXsR$+Y?bd$k%T-*j^^0{{Ns-MI$`Ry`J zNiiH(vqb@La)9E47@;FN`WnTZ779}3xr5?{ft`hr)@Bvn+qUEUv60LqT$I#Sv z@Pye)!S{}rxT-#S@qD}N9xnAP!4AFay%zVk^uZML2qjCbLJPW%z0e+uW}^Q#%0_ zO5*Zx6IItc0v-4RNk?Uj2f-9~eogJO&Aula-hgM9VGmt*>B(uKN3`m$Z^YsDp*Jxn zZTCUXS8MPZrm9wd6mC9_NFj%-@#XkoKo_4y?0snpZw)2hm?x$ud~crl$)Do&f|D4p zS`^Kg3g~nb68rG0(?v?r8a*74l~oVn`^=oKC3cfo-?{NCnopn~J0d@;gWpT$q^A+X z7`^p0VDMNJr8Ohn9hR|<;d&gHfvO$>*yfFOBs;^)T$YXo zPIubfS*o}qM5r>weT;axwU!9}62rxK7o9!*Y7N{vyXl?LbINx+KlB>c)g9Ods-K=o zgp*vQ+>MnN`Kz+Gp-jt-p60+$z00VqkkZNisKtjYi{JgR0dWhux*|^t*t^Q3FbBz) zYZ%=Hc`GX*P!b8@EaJuKY@&&#D*DefC|fp<5BDSKub#$&<6**;J16J*M6F}x5Lk_) znSNg#K#*K6*`r<)<;EIye^uVWKEW-;W#y+GwxQUlUeeK;jdM!nW^>_gUH)Ae?d3?| zGay|e_a@|4n-QWzp?dT8Uf6#IPqK`l9^a+?DYfeZ6I6d!vo*D!%y4_^xM(vCu@9!+ znUOhgLMRKKGfyVpALtA?oc}$z8kSSrj?RydYU8}E-<@`G=#u<{y+P93hpOhKbiId% z$wjI(jMo%*GQ=!|;IJ5#-o*q9DEG!uYnzvxV-MtLR_{))aoNW3W;US+)Pkb=0m3N2 z;0VlY)`!qkBk|&P%#>e_ee%5%4l|Q3*x0^kxv?1AZxuTj1~zhmhsDc2-KanEl_iV4 zo;yXQ%PudHTKz^=+9BfaqO7;5eU9Ho8R9XTVX?-3huh{Updl3iTOG`jSPx;Vc|lzS zH`%^F^Nu6)KzmrFIY` z=kGKQWG;a`aOO|oHUkw8JXttj%G9~vs*UH3$M?-AgOA{vK^n@M*@qPiWpJwzIx;RX z()6BK)p0UeB{RN%stX#XU!8w*yJCeb;UHG6xI5o7P24=BdqcHGcj}nC%ThfS4wGt5 z@c4?MkRr^MaSk=W8e9l!NH~FKmEaPV;%5!SJ8vn?O=+W^ zLXEPWMMPC_XgLitS01_H-4et+=F*23vTM@T6UAa!i}69+V>+u_VW&}Lb7ujb%6>iB zO_`svE%4DqqNDCj2;l-#B4pdd||bTfo#`!3=p3f>(WDE1)md*HuV24v1@_q1&YSOPP*Ls#YOmN zAb#o%nCfCOe?daL#XIJZNd=8YfQn~K3IbPbmmD|<=otfEJwVljK_V+Eo&R<8GlTTD zOyz?RKbTJGH1NimJz^1GSYsphJ+mFcN_8Cj#eAQ8vw{dCyO8A#$9CdHC78{(!+D0vYgWd#)y(bGoKhNVsIx z&n?RCymAG&d&nq~K8N*kslt;{ z0(p5BQj+OkBMKl%zH{bN&l4N2g*jy$ItbZs-H-RS4K^*dMuJH8)7%J@M!qN``6SIPU6X-9qhF9nWYguthr2feIk-kP zCbzJMw#as*=8)XUZ8najgT)rOc$PUYDr{nmy-Z6)a?9ZVr|geD=0AcwIkw|8M2E9> zOE-UB=DHVY)*^51TG9gO!@yM@7_aZMZTwd&c2)eh9HHqxCnS57XWTkwwqmU3{#U_V zW;IfdO_t4P>m*dYG|QI*R17>&Tb1sHj)1cYcwK*qxL9!H6d)N7J3KZaY#Q&XFzY>} zgbYwq0qkS$j^_5Lz9wtfBZ5qTGw`h<Ce zfz9wY|5vyNc zUQ8V4yr^WNVny97>w~;7+lASdEOwE#eA5*^$_?n8a5Uk1(3Vzd`?bh2U739gJ5A>0 z+EqP>ZN6`s?P<^ak|Q2dh?8Jy9_t=7zEBcv+^Eviq5y$x@-m4I%e~j8HkX3%HSES? zL{=vaP0nVhs+A`@GphIPF&NC%wP%`{VLVaOC#@A5z#0lI^` z)l4leaCt)B#pini8y95&w?zTd?6`xf28DFWwZEcHDkOvY$|Gc!=dNa&R(A>vq!})Q zna0l)!dNdE6xfwZmCN4>qZ7N?r8h~DTPEkqNq>m6Va$%~4~WpA_FP5-S==LV5w8bU z3Oe5sGkDt)Nvy}a@j*NABcu9#l!vcPIQX_2ui2+iQH8qbbd5()ibl+{mXN*9c+kZ# zlMABQDZbKQH(ND&f=e2H}^f=zy5G_53KgFwBxZ zHE>nmQ=jKcEitUT^Z76Iqk)o>EbE?gYwk>%lNR^Kq3LJW@uZYu#sg&+s^jNBQpS|( z?K-QRUpcmgIKJs{Tm%dnZ?piG-pq}QfmIh(a+rx+Cr%$PKbalExiteus#o%9;B6?c z@W%k84oZND^yY!paW(tyxgJx`2cRcLJKu(jlW3^g?&gz9bQ3ACDl~|H=YJ|3*M5uA$BfA!a)QJX;twfVARSWR`n(g_U}?cEUU5!>L!g@V`#N? z5Uh9H|Aw@Myb0ZV(hY%Dxu_eGQK{FIg9zlBc(501iP-LqMpV+f@>Ilr>-MXsj~6el zkQ;pQ*5a885{n;!f02SNqq+HjQE1gi;V`?~p|EF~#%Abhcs~-#gAZJi@FTBJY^QTU zLHsrprsz5(dAIq?rhPq7Lj#%81o(B7x$HhfRaarR3mYj1!eW{sW1wAR|F!e9$*VH^v zgX#2H!-AK)rjr=#Jj)I)1eg%zg{osDQR$xdSpBxExhWe9lItINRv3xhhY>4hmcAvh z+Hk9I1PZvh21<2Z6InaOk%e?D!X)=B39OqqpBB3nEB8s{H0tXX-mmpdhKa%AUsU?V zD#0da)tRvAsR4ph^vEHY?VMF50bc8LYdmWlQe?v&&;TDG+#+(Eo54%3N8~Rr6FrF9 zQz!0B9>i=NIO2_7`u*7H0qU4Ih;Cix^$IT`gR+W9ol4&yQ;Q%^cA*JRKT;LxFQxRe zv-nk6Oc==IbYp0q=?q26X<2Q#Ni%B6rj7t*ajeQcW|QF_U2VXq1x6QdhF4gpt0b!u zY^}lzRJO~T@xAb59EeD9&B0RdCQw;z@Z-w3xHIY21@-Cot6KH&c>&~o*7moCAf=te zqUm=`*zOq6)8*Y53r2*8`%AtMNg-6%s4l_n#%64~YdPp|mj;h3h|NEm#+7@vm0rm` zZ{@$XW``>W5)^^~@DT6m#O|6QHv4~vEnSDCeg#ERDVJ?;bag9|1E$yI)j*S@FpZhfy%&O~Hxhs>*;W#(O4+=F>LZ&;EaY7I<)>2HeQQpa>U(T9E^`9dag}mA9LMl{6#0Usj+(WDd*sKqaMMS z*{hlH;!v{MPUN~{%c4D_H

6CS9`m9G+bNa#I-v15>siN;tf8i+|wgwE? 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

J-bvjw^0HD)+ktk%{FQ&j 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�#3|8M0^8q;Uzw) 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 z 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

FAgOqOtK&aN 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%0Dt(Jd=P$o`0%+JE6FRwz<3E88*6P? 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]`}XLeB(&aiAV8WPOb=?rCp7H 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 literal 0 HcmV?d00001 diff --git a/adbyby/files/data/lazy.bin b/adbyby/files/data/lazy.bin new file mode 100644 index 0000000000000000000000000000000000000000..23e6a8d70a4451d98628b56cd6264d819bd2f181 GIT binary patch literal 61328 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 X3LZUyTB?;D`N2%m?XOQZ$+iCr1?AwD literal 0 HcmV?d00001 diff --git a/adbyby/files/data/lazy.txt b/adbyby/files/data/lazy.txt new file mode 100644 index 000000000..5d383c711 --- /dev/null +++ b/adbyby/files/data/lazy.txt @@ -0,0 +1,25 @@ +! -----ʱ: 2018-10-08 23:07:52 by:xwhyc----- +.php?ad= +/99rejs/js +/agetsou.js^ +/c@*!25.js|$script +/cococ-66/$script +/defaultts.tc.qq.com/*.ts?index=0&start=0& +/defaultts.tc.qq.com/*.ts?index=0&start=0&end=*&ver=4 +/gg_js/ +/imgs.js?t= +/js/adtop.js| +/js/guanggao_gg.js?d= +/js/sss/ad.js +/static/js/aall.js +/unionjs/$script +/variety.tc.qq.com/*.mp4^*fmt=hd +/variety.tc.qq.com/*.mp4^*fmt=shd +/video.dispatch.tc.qq.com/*.mp4^*sdtfrom= +/view/image/QT_HY.jpg?t= +/view/js/slade.js|$script +/vlive.qqvideo.tc.qq.com/*.mp4^*fmt=hd +/vlive.qqvideo.tc.qq.com/*.mp4^*fmt=shd +/vmind.qqvideo.tc.qq.com/*.mp4^*sdtfrom= +/vmindhls.tc.qq.com/*ugc=0&ga=0&gv=0&start= +/zzhzgg.js \ No newline at end of file diff --git a/adbyby/files/data/rules.txt b/adbyby/files/data/rules.txt new file mode 100644 index 000000000..5c44b0e8c --- /dev/null +++ b/adbyby/files/data/rules.txt @@ -0,0 +1,15 @@ +! ------------------------------ ADByby 自定义过滤语法简表--------------------------------- +! -------------- 规则基于abp规则,并进行了字符替换部分的扩展----------------------------- +! ABP规则请参考https://adblockplus.org/zh_CN/filters,下面为大致摘要 +! "!" 为行注释符,注释行以该符号起始作为一行注释语义,用于规则描述 +! "*" 为字符通配符,能够匹配0长度或任意长度的字符串,该通配符不能与正则语法混用。 +! "^" 为分隔符,可以是除了字母、数字或者 _ - . % 之外的任何字符。 +! "|" 为管线符号,来表示地址的最前端或最末端 +! "||" 为子域通配符,方便匹配主域名下的所有子域。 +! "~" 为排除标识符,通配符能过滤大多数广告,但同时存在误杀, 可以通过排除标识符修正误杀链接。 +! "##" 为元素选择器标识符,后面跟需要隐藏元素的CSS样式例如 #ad_id .ad_class +!! 元素隐藏暂不支持全局规则和排除规则 +!! 字符替换扩展 +! 文本替换选择器标识符,后面跟需要替换的文本数据,格式:$s@模式字符串@替换后的文本@ +! 支持通配符*和? +! ------------------------------------------------------------------------------------------- diff --git a/adbyby/files/data/user.txt b/adbyby/files/data/user.txt new file mode 100644 index 000000000..e69de29bb diff --git a/adbyby/files/data/video.txt b/adbyby/files/data/video.txt new file mode 100644 index 000000000..3991c48fc --- /dev/null +++ b/adbyby/files/data/video.txt @@ -0,0 +1,30 @@ +! -----ʱ: 2018-10-08 23:06:11 by:xwhyc----------------------------------------------- +! -----淴:http://www.adbyby.com/help.htm QQȺ: 79547134(), 364066294()470705224()534897434,438394572-------------- + + +!------------------------------------------- +/showadv/ +3199.cn###ad640,[id^="ad0"] +76fengyun.com###down_box{display:block!important;}.gggg,.ggao +9553.com##[class="zm"] +962.net##.show_ad,.g-962-ad +amazon.cn##.adv-float-div +downsx.rocks##.adbox,.Left-ad3_fixed,.google-ad2_fixed +edu-acc.cn###doyoo_monitor +fx678.com##[class^="adv-"] +||76fengyun.com/body22233.js +||76fengyun.com/file/$s@onclick="window.open('*');startWait();"@onclick="window.open(document.getElementById('downpage_link').href);startWait();"@ +||atanx.alicdn.com/t/tanxssp.js?_v= +||biquguan.com/guan/$script +||djv99sxoqpv11.cloudfront.net +||jmxlaser.com +||jump2.bdimg.com/p/$s@