From 287257d676b1120f388120f1dc259e4eefd3b163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Mon, 18 Oct 2021 15:59:43 +0200 Subject: [PATCH 01/36] bcm53xx: enable Linksys EA6300 & EA9200 builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both should be supported since: 1. Adding NVMEM driver for NVRAM 2. Using NVRAM info for determining active firmware partition Linksys EA9500 uses very similar design and works fine. Signed-off-by: Rafał Miłecki --- target/linux/bcm53xx/image/Makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/target/linux/bcm53xx/image/Makefile b/target/linux/bcm53xx/image/Makefile index 45355e1ec9..a10c6fe240 100644 --- a/target/linux/bcm53xx/image/Makefile +++ b/target/linux/bcm53xx/image/Makefile @@ -242,13 +242,11 @@ define Device/dlink_dir-885l endef TARGET_DEVICES += dlink_dir-885l -# Linksys devices are disabled due to problem with 2 TRX partitions define Device/linksys_ea6300-v1 DEVICE_VENDOR := Linksys DEVICE_MODEL := EA6300 DEVICE_VARIANT := v1 DEVICE_PACKAGES := $(B43) $(USB3_PACKAGES) - BROKEN := y endef TARGET_DEVICES += linksys_ea6300-v1 @@ -265,7 +263,6 @@ define Device/linksys_ea9200 DEVICE_MODEL := EA9200 DEVICE_VARIANT := v1 DEVICE_PACKAGES := $(BRCMFMAC_43602A1) $(USB3_PACKAGES) - BROKEN := y endef TARGET_DEVICES += linksys_ea9200 From 7b8eca902e676658dbf23f1875cacaa00386c691 Mon Sep 17 00:00:00 2001 From: Adrian Schmutzler Date: Mon, 18 Oct 2021 21:27:33 +0200 Subject: [PATCH 02/36] tegra: switch to kernel 5.10 This target has testing support for kernel 5.10 for four months now. Time to switch the default. Signed-off-by: Adrian Schmutzler Acked-by: Tomasz Maciej Nowak --- target/linux/tegra/Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/target/linux/tegra/Makefile b/target/linux/tegra/Makefile index 98c1dece16..76dfeab402 100644 --- a/target/linux/tegra/Makefile +++ b/target/linux/tegra/Makefile @@ -11,8 +11,7 @@ FEATURES := audio boot-part display ext4 fpu gpio pci pcie rootfs-part rtc squas CPU_TYPE := cortex-a9 CPU_SUBTYPE := vfpv3-d16 -KERNEL_PATCHVER := 5.4 -KERNEL_TESTING_PATCHVER := 5.10 +KERNEL_PATCHVER := 5.10 include $(INCLUDE_DIR)/target.mk From dbb0019cbef43c6ce5d02a52bfe662d2217ce603 Mon Sep 17 00:00:00 2001 From: Stijn Tintel Date: Thu, 14 Oct 2021 22:08:44 +0300 Subject: [PATCH 03/36] nftables: bump to 1.0.0 This introduces support for hardware flow offloading, which was added in in nftables 0.9.9. Signed-off-by: Stijn Tintel Acked-by: Jo-Philipp Wich --- package/network/utils/nftables/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/network/utils/nftables/Makefile b/package/network/utils/nftables/Makefile index 7830596e84..8ead30a127 100644 --- a/package/network/utils/nftables/Makefile +++ b/package/network/utils/nftables/Makefile @@ -7,12 +7,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=nftables -PKG_VERSION:=0.9.6 -PKG_RELEASE:=2 +PKG_VERSION:=1.0.0 +PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=https://netfilter.org/projects/$(PKG_NAME)/files -PKG_HASH:=68d6fdfe8ab02303e6b1f13968a4022da5b0120110eaee3233d806857937b66e +PKG_HASH:=58bf547daf967a2b88ecb4f425f126006ebde22711db806b25c1d6cf84fe45f4 PKG_MAINTAINER:= PKG_LICENSE:=GPL-2.0 From c4e994011f56d30e031705c16c6b5c498c530852 Mon Sep 17 00:00:00 2001 From: Stepan Henek Date: Sun, 25 Apr 2021 23:32:29 +0200 Subject: [PATCH 04/36] wireguard-tools: add uci option to disable wireguard peers Right now when I want to temporarily disable wg peer I need to delete the entire peer section. This is not such a good solution because I loose the previous configuration of the peer. This patch adds `disabled` option to peer config which causes that the config section is ignored. Signed-off-by: Stepan Henek [use $(AUTORELEASE)] Signed-off-by: Paul Spooren --- package/network/utils/wireguard-tools/Makefile | 2 +- package/network/utils/wireguard-tools/files/wireguard.sh | 7 +++++++ .../utils/wireguard-tools/files/wireguard_watchdog | 8 ++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/package/network/utils/wireguard-tools/Makefile b/package/network/utils/wireguard-tools/Makefile index 11372f2331..717ec2bbb1 100644 --- a/package/network/utils/wireguard-tools/Makefile +++ b/package/network/utils/wireguard-tools/Makefile @@ -12,7 +12,7 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=wireguard-tools PKG_VERSION:=1.0.20210424 -PKG_RELEASE:=1 +PKG_RELEASE:=$(AUTORELEASE) PKG_SOURCE:=wireguard-tools-$(PKG_VERSION).tar.xz PKG_SOURCE_URL:=https://git.zx2c4.com/wireguard-tools/snapshot/ diff --git a/package/network/utils/wireguard-tools/files/wireguard.sh b/package/network/utils/wireguard-tools/files/wireguard.sh index 63261aea71..2e6d74bc91 100644 --- a/package/network/utils/wireguard-tools/files/wireguard.sh +++ b/package/network/utils/wireguard-tools/files/wireguard.sh @@ -26,6 +26,7 @@ proto_wireguard_init_config() { proto_wireguard_setup_peer() { local peer_config="$1" + local disabled local public_key local preshared_key local allowed_ips @@ -34,6 +35,7 @@ proto_wireguard_setup_peer() { local endpoint_port local persistent_keepalive + config_get_bool disabled "${peer_config}" "disabled" 0 config_get public_key "${peer_config}" "public_key" config_get preshared_key "${peer_config}" "preshared_key" config_get allowed_ips "${peer_config}" "allowed_ips" @@ -42,6 +44,11 @@ proto_wireguard_setup_peer() { config_get endpoint_port "${peer_config}" "endpoint_port" config_get persistent_keepalive "${peer_config}" "persistent_keepalive" + if [ "${disabled}" -eq 1 ]; then + # skip disabled peers + return 0 + fi + if [ -z "$public_key" ]; then echo "Skipping peer config $peer_config because public key is not defined." return 0 diff --git a/package/network/utils/wireguard-tools/files/wireguard_watchdog b/package/network/utils/wireguard-tools/files/wireguard_watchdog index c0a5a0aa33..0126f699bb 100644 --- a/package/network/utils/wireguard-tools/files/wireguard_watchdog +++ b/package/network/utils/wireguard-tools/files/wireguard_watchdog @@ -17,6 +17,7 @@ check_peer_activity() { local cfg=$1 local iface=$2 + local disabled local public_key local endpoint_host local endpoint_port @@ -24,9 +25,16 @@ check_peer_activity() { local last_handshake local idle_seconds + config_get_bool disabled "${cfg}" "disabled" 0 config_get public_key "${cfg}" "public_key" config_get endpoint_host "${cfg}" "endpoint_host" config_get endpoint_port "${cfg}" "endpoint_port" + + if [ "${disabled}" -eq 1 ]; then + # skip disabled peers + return 0 + fi + persistent_keepalive=$(wg show ${iface} persistent-keepalive | grep ${public_key} | awk '{print $2}') # only process peers with endpoints and keepalive set From 43c64ffa74c8e843c695c04f3b20db8e868a0608 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Sun, 17 Oct 2021 23:29:57 +0200 Subject: [PATCH 05/36] hostapd: fix goto loop for ubus assoc handler When a ubus event handler denies a association with a non-zero return value, the code jumps to preceeding code, creating an endless loop until the event handler accepts the assc request. Move the ubus handler further up the code to avoid creating such a loop. Signed-off-by: David Bauer --- .../hostapd/patches/600-ubus_support.patch | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/package/network/services/hostapd/patches/600-ubus_support.patch b/package/network/services/hostapd/patches/600-ubus_support.patch index d77d245243..7bb998dbb8 100644 --- a/package/network/services/hostapd/patches/600-ubus_support.patch +++ b/package/network/services/hostapd/patches/600-ubus_support.patch @@ -147,9 +147,9 @@ /* followed by SSID and Supported rates; and HT capabilities if 802.11n * is used */ -@@ -5831,6 +5848,14 @@ static void handle_assoc(struct hostapd_ - pos, left, rssi, omit_rsnxe); - os_free(tmp); +@@ -5765,6 +5782,13 @@ static void handle_assoc(struct hostapd_ + } + #endif /* CONFIG_FILS */ + ubus_resp = hostapd_ubus_handle_event(hapd, &req); + if (ubus_resp) { @@ -158,11 +158,10 @@ + resp = ubus_resp > 0 ? (u16) ubus_resp : WLAN_STATUS_UNSPECIFIED_FAILURE; + goto fail; + } -+ + fail: + /* - * Remove the station in case transmission of a success response fails - * (the STA was added associated to the driver) or if the station was -@@ -5858,6 +5883,7 @@ static void handle_disassoc(struct hosta +@@ -5858,6 +5882,7 @@ static void handle_disassoc(struct hosta wpa_printf(MSG_DEBUG, "disassocation: STA=" MACSTR " reason_code=%d", MAC2STR(mgmt->sa), le_to_host16(mgmt->u.disassoc.reason_code)); @@ -170,7 +169,7 @@ sta = ap_get_sta(hapd, mgmt->sa); if (sta == NULL) { -@@ -5927,6 +5953,8 @@ static void handle_deauth(struct hostapd +@@ -5927,6 +5952,8 @@ static void handle_deauth(struct hostapd /* Clear the PTKSA cache entries for PASN */ ptksa_cache_flush(hapd->ptksa, mgmt->sa, WPA_CIPHER_NONE); From 917126ff4cfb1ea4795cfc93820ed5d304b084c3 Mon Sep 17 00:00:00 2001 From: Jitao Lu Date: Sun, 17 Oct 2021 14:16:57 +0800 Subject: [PATCH 06/36] ncurses: add tmux terminfo They're preferred terminal descriptions for tmux, with additional support to some special characters and italic fonts. More info can be found at: https://github.com/tmux/tmux/wiki/FAQ Fixes: FS#3404 Signed-off-by: Jitao Lu --- package/libs/ncurses/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package/libs/ncurses/Makefile b/package/libs/ncurses/Makefile index 04a9a38515..a6bc135b2d 100644 --- a/package/libs/ncurses/Makefile +++ b/package/libs/ncurses/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ncurses PKG_VERSION:=6.2 -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@GNU/$(PKG_NAME) @@ -128,6 +128,8 @@ ifneq ($(HOST_OS),FreeBSD) r/rxvt-unicode \ s/screen \ s/screen-256color \ + t/tmux \ + t/tmux-256color \ v/vt100 \ v/vt102 \ x/xterm \ From a424dfd66bd881fc117ede8b737a0f8dd2c6dd37 Mon Sep 17 00:00:00 2001 From: Paul Spooren Date: Thu, 14 Oct 2021 08:33:29 -1000 Subject: [PATCH 07/36] README: mention video feed The video feed just got support for Wayland which allows OpenWrt devices to run as a Kiosk (displaying browser content via a display). The availability of these packages should be mentioned to users. Signed-off-by: Paul Spooren --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index bf17544ed4..2eff292321 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,9 @@ packages to OpenWrt, please find the fitting repository below. * [OpenWrt Routing](https://github.com/openwrt/routing): Packages specifically focused on (mesh) routing. +* [OpenWrt Video](https://github.com/openwrt/video): Packages specifically + focused on display servers and clients (Xorg and Wayland). + ## Support Information For a list of supported devices see the [OpenWrt Hardware Database](https://openwrt.org/supported_devices) From 1c07eab9f81f1ee99cc2ae36596bda81c12d5dbc Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 17 Oct 2021 17:01:23 +0200 Subject: [PATCH 08/36] include/cmake.mk: fix host builds with CMAKE_BINARY_SUBDIR Use it in the same way as for target builds Signed-off-by: Felix Fietkau --- include/cmake.mk | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/cmake.mk b/include/cmake.mk index b38d440039..3318468c90 100644 --- a/include/cmake.mk +++ b/include/cmake.mk @@ -18,6 +18,7 @@ endif CMAKE_BINARY_DIR = $(PKG_BUILD_DIR)$(if $(CMAKE_BINARY_SUBDIR),/$(CMAKE_BINARY_SUBDIR)) CMAKE_SOURCE_DIR = $(PKG_BUILD_DIR)$(if $(CMAKE_SOURCE_SUBDIR),/$(CMAKE_SOURCE_SUBDIR)) HOST_CMAKE_SOURCE_DIR = $(HOST_BUILD_DIR)$(if $(CMAKE_SOURCE_SUBDIR),/$(CMAKE_SOURCE_SUBDIR)) +HOST_CMAKE_BINARY_DIR = $(HOST_BUILD_DIR)$(if $(CMAKE_BINARY_SUBDIR),/$(CMAKE_BINARY_SUBDIR)) MAKE_PATH = $(firstword $(CMAKE_BINARY_SUBDIR) .) ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) @@ -56,15 +57,15 @@ ifeq ($(HOST_USE_NINJA),1) CMAKE_HOST_OPTIONS += -DCMAKE_GENERATOR="Ninja" define Host/Compile/Default - +$(NINJA) -C $(HOST_BUILD_DIR) $(1) + +$(NINJA) -C $(HOST_CMAKE_BINARY_DIR) $(1) endef define Host/Install/Default - +$(NINJA) -C $(HOST_BUILD_DIR) install + +$(NINJA) -C $(HOST_CMAKE_BINARY_DIR) install endef define Host/Uninstall/Default - +$(NINJA) -C $(HOST_BUILD_DIR) uninstall + +$(NINJA) -C $(HOST_CMAKE_BINARY_DIR) uninstall endef endif @@ -133,7 +134,8 @@ endef Build/InstallDev = $(if $(CMAKE_INSTALL),$(Build/InstallDev/cmake)) define Host/Configure/Default - (cd $(HOST_BUILD_DIR); \ + mkdir -p "$(HOST_CMAKE_BINARY_DIR)" + (cd $(HOST_CMAKE_BINARY_DIR); \ CFLAGS="$(HOST_CFLAGS)" \ CXXFLAGS="$(HOST_CFLAGS)" \ LDFLAGS="$(HOST_LDFLAGS)" \ From faa6a9a04beda71da49dd2d96225e892899e84d7 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 17 Oct 2021 17:50:53 +0200 Subject: [PATCH 09/36] tools/llvm-bpf: add llvm+clang build suitable for compiling code to eBPF Preparation for building packages that ship eBPF code Signed-off-by: Felix Fietkau --- toolchain/Config.in | 7 +++++++ tools/Makefile | 2 ++ tools/llvm-bpf/Makefile | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 tools/llvm-bpf/Makefile diff --git a/toolchain/Config.in b/toolchain/Config.in index 8ff5438d79..1d230ca22f 100644 --- a/toolchain/Config.in +++ b/toolchain/Config.in @@ -37,6 +37,13 @@ menuconfig TARGET_OPTIONS Most people will answer N. +config BUILD_LLVM_BPF + bool "Build LLVM toolchain for eBPF" if DEVEL + help + If enabled, a LLVM toolchain for building eBPF binaries will be built. + If this is not enabled, eBPF packages can only be built if the host + has a suitable toolchain + menuconfig EXTERNAL_TOOLCHAIN bool diff --git a/tools/Makefile b/tools/Makefile index f794e57f2e..dc665f6b46 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -35,6 +35,7 @@ tools-$(CONFIG_TARGET_mxs) += elftosb sdimage tools-$(CONFIG_TARGET_tegra) += cbootimage cbootimage-configs tools-$(CONFIG_USES_MINOR) += kernel2minor tools-$(CONFIG_USE_SPARSE) += sparse +tools-$(CONFIG_BUILD_LLVM_BPF) += llvm-bpf # builddir dependencies $(curdir)/autoconf/compile := $(curdir)/m4/compile @@ -56,6 +57,7 @@ $(curdir)/isl/compile := $(curdir)/gmp/compile $(curdir)/libressl/compile := $(curdir)/pkgconf/compile $(curdir)/libtool/compile := $(curdir)/m4/compile $(curdir)/autoconf/compile $(curdir)/automake/compile $(curdir)/missing-macros/compile $(curdir)/lzma-old/compile := $(curdir)/zlib/compile +$(curdir)/llvm-bpf/compile := $(curdir)/cmake/compile $(curdir)/make-ext4fs/compile := $(curdir)/zlib/compile $(curdir)/meson/compile := $(curdir)/ninja/compile $(curdir)/missing-macros/compile := $(curdir)/autoconf/compile diff --git a/tools/llvm-bpf/Makefile b/tools/llvm-bpf/Makefile new file mode 100644 index 0000000000..a5ba2a4cb7 --- /dev/null +++ b/tools/llvm-bpf/Makefile @@ -0,0 +1,36 @@ +# +# Copyright (C) 2006-2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# +include $(TOPDIR)/rules.mk + +PKG_NAME:=llvm-project +PKG_VERSION:=13.0.0 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).src.tar.xz +PKG_SOURCE_URL:=https://github.com/llvm/llvm-project/releases/download/llvmorg-$(PKG_VERSION) +PKG_HASH:=6075ad30f1ac0e15f07c1bf062c1e1268c241d674f11bd32cdf0e040c71f2bf3 + +HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION).src + +HOST_BUILD_PARALLEL:=1 + +CMAKE_BINARY_SUBDIR := build +CMAKE_SOURCE_SUBDIR := llvm + +include $(INCLUDE_DIR)/host-build.mk +include $(INCLUDE_DIR)/cmake.mk + +CMAKE_HOST_OPTIONS += \ + -DLLVM_ENABLE_BINDINGS=OFF \ + -DLLVM_INCLUDE_DOCS=OFF \ + -DLLVM_INCLUDE_EXAMPLES=OFF \ + -DLLVM_INCLUDE_TESTS=OFF \ + -DLLVM_ENABLE_PROJECTS="clang;lld" \ + -DLLVM_TARGETS_TO_BUILD=BPF \ + -DCLANG_BUILD_EXAMPLES=OFF + +$(eval $(call HostBuild)) From e62c5504701c7a665c9cf89ddbcb062f5ade6e37 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 19 Oct 2021 11:19:26 +0200 Subject: [PATCH 10/36] mac80211: backport a few trivial patches No functional changes, just some renames to make it easier to keep mt76 in sync with upstream Signed-off-by: Felix Fietkau --- ...n-some-HE-capabilities-with-the-spec.patch | 196 ++++++++++++++++++ ...pelling-of-A-MSDU-in-HE-capabilities.patch | 75 +++++++ ...E-capabilities-A-MPDU-Length-Exponen.patch | 148 +++++++++++++ ...pelling-of-A-MSDU-in-HE-capabilities.patch | 55 +++++ ...n-some-HE-capabilities-with-the-spec.patch | 70 +++++++ ...E-capabilities-A-MPDU-Length-Exponen.patch | 35 ++++ 6 files changed, 579 insertions(+) create mode 100644 package/kernel/mac80211/patches/subsys/391-wireless-align-some-HE-capabilities-with-the-spec.patch create mode 100644 package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch create mode 100644 package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch create mode 100644 package/kernel/mt76/patches/100-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch create mode 100644 package/kernel/mt76/patches/101-wireless-align-some-HE-capabilities-with-the-spec.patch create mode 100644 package/kernel/mt76/patches/102-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch diff --git a/package/kernel/mac80211/patches/subsys/391-wireless-align-some-HE-capabilities-with-the-spec.patch b/package/kernel/mac80211/patches/subsys/391-wireless-align-some-HE-capabilities-with-the-spec.patch new file mode 100644 index 0000000000..eb32c49890 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/391-wireless-align-some-HE-capabilities-with-the-spec.patch @@ -0,0 +1,196 @@ +From: Johannes Berg +Date: Fri, 9 Apr 2021 12:40:17 +0300 +Subject: [PATCH] wireless: align some HE capabilities with the spec + +Some names were changed, align that with the spec as of +802.11ax-D6.1. + +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210409123755.b1e5fbab0d8c.I3eb6076cb0714ec6aec6b8f9dee613ce4a05d825@changeid +Signed-off-by: Johannes Berg +--- + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -3627,7 +3627,7 @@ ath11k_mac_filter_he_cap_mesh(struct iee + IEEE80211_HE_MAC_CAP4_BQR; + he_cap_elem->mac_cap_info[4] &= ~m; + +- m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECVITE_TRANSMISSION | ++ m = IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION | + IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU | + IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING | + IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX; +@@ -3637,7 +3637,7 @@ ath11k_mac_filter_he_cap_mesh(struct iee + IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO; + he_cap_elem->phy_cap_info[2] &= ~m; + +- m = IEEE80211_HE_PHY_CAP3_RX_HE_MU_PPDU_FROM_NON_AP_STA | ++ m = IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU | + IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK | + IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK; + he_cap_elem->phy_cap_info[3] &= ~m; +@@ -3649,13 +3649,13 @@ ath11k_mac_filter_he_cap_mesh(struct iee + he_cap_elem->phy_cap_info[5] &= ~m; + + m = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU | +- IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB | ++ IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB | + IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB | + IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO; + he_cap_elem->phy_cap_info[6] &= ~m; + +- m = IEEE80211_HE_PHY_CAP7_SRP_BASED_SR | +- IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR | ++ m = IEEE80211_HE_PHY_CAP7_PSR_BASED_SR | ++ IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | + IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ | + IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ; + he_cap_elem->phy_cap_info[7] &= ~m; +--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c ++++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c +@@ -307,8 +307,8 @@ mt7915_set_stream_he_txbf_caps(struct ie + IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK; + elem->phy_cap_info[5] &= ~c; + +- c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB | +- IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB; ++ c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | ++ IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB; + elem->phy_cap_info[6] &= ~c; + + elem->phy_cap_info[7] &= ~IEEE80211_HE_PHY_CAP7_MAX_NC_MASK; +@@ -348,8 +348,8 @@ mt7915_set_stream_he_txbf_caps(struct ie + c = (nss - 1) | (max_t(int, mcs->tx_mcs_160, 1) << 3); + elem->phy_cap_info[5] |= c; + +- c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB | +- IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB; ++ c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | ++ IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB; + elem->phy_cap_info[6] |= c; + } + +@@ -484,7 +484,7 @@ mt7915_init_he_caps(struct mt7915_phy *p + IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE | + IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT; + he_cap_elem->phy_cap_info[7] |= +- IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR | ++ IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | + IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI; + he_cap_elem->phy_cap_info[8] |= + IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | +--- a/include/linux/ieee80211.h ++++ b/include/linux/ieee80211.h +@@ -2065,7 +2065,7 @@ int ieee80211_get_vht_max_nss(struct iee + #define IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG 0x01 + #define IEEE80211_HE_MAC_CAP4_QTP 0x02 + #define IEEE80211_HE_MAC_CAP4_BQR 0x04 +-#define IEEE80211_HE_MAC_CAP4_SRP_RESP 0x08 ++#define IEEE80211_HE_MAC_CAP4_PSR_RESP 0x08 + #define IEEE80211_HE_MAC_CAP4_NDP_FB_REP 0x10 + #define IEEE80211_HE_MAC_CAP4_OPS 0x20 + #define IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU 0x40 +@@ -2076,7 +2076,7 @@ int ieee80211_get_vht_max_nss(struct iee + + #define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 0x01 + #define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41 0x02 +-#define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECVITE_TRANSMISSION 0x04 ++#define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION 0x04 + #define IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU 0x08 + #define IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX 0x10 + #define IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS 0x20 +@@ -2134,7 +2134,7 @@ int ieee80211_get_vht_max_nss(struct iee + #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK 0x18 + #define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1 0x00 + #define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_2 0x20 +-#define IEEE80211_HE_PHY_CAP3_RX_HE_MU_PPDU_FROM_NON_AP_STA 0x40 ++#define IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU 0x40 + #define IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER 0x80 + + #define IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE 0x01 +@@ -2181,15 +2181,15 @@ int ieee80211_get_vht_max_nss(struct iee + + #define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU 0x01 + #define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU 0x02 +-#define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB 0x04 +-#define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB 0x08 ++#define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB 0x04 ++#define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB 0x08 + #define IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB 0x10 + #define IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE 0x20 + #define IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO 0x40 + #define IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT 0x80 + +-#define IEEE80211_HE_PHY_CAP7_SRP_BASED_SR 0x01 +-#define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR 0x02 ++#define IEEE80211_HE_PHY_CAP7_PSR_BASED_SR 0x01 ++#define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP 0x02 + #define IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI 0x04 + #define IEEE80211_HE_PHY_CAP7_MAX_NC_1 0x08 + #define IEEE80211_HE_PHY_CAP7_MAX_NC_2 0x10 +--- a/net/mac80211/debugfs_sta.c ++++ b/net/mac80211/debugfs_sta.c +@@ -732,15 +732,15 @@ static ssize_t sta_he_capa_read(struct f + PFLAG(MAC, 4, BSRP_BQRP_A_MPDU_AGG, "BSRP-BQRP-A-MPDU-AGG"); + PFLAG(MAC, 4, QTP, "QTP"); + PFLAG(MAC, 4, BQR, "BQR"); +- PFLAG(MAC, 4, SRP_RESP, "SRP-RESP"); ++ PFLAG(MAC, 4, PSR_RESP, "PSR-RESP"); + PFLAG(MAC, 4, NDP_FB_REP, "NDP-FB-REP"); + PFLAG(MAC, 4, OPS, "OPS"); + PFLAG(MAC, 4, AMDSU_IN_AMPDU, "AMSDU-IN-AMPDU"); + + PRINT("MULTI-TID-AGG-TX-QOS-%d", ((cap[5] << 1) | (cap[4] >> 7)) & 0x7); + +- PFLAG(MAC, 5, SUBCHAN_SELECVITE_TRANSMISSION, +- "SUBCHAN-SELECVITE-TRANSMISSION"); ++ PFLAG(MAC, 5, SUBCHAN_SELECTIVE_TRANSMISSION, ++ "SUBCHAN-SELECTIVE-TRANSMISSION"); + PFLAG(MAC, 5, UL_2x996_TONE_RU, "UL-2x996-TONE-RU"); + PFLAG(MAC, 5, OM_CTRL_UL_MU_DATA_DIS_RX, "OM-CTRL-UL-MU-DATA-DIS-RX"); + PFLAG(MAC, 5, HE_DYNAMIC_SM_PS, "HE-DYNAMIC-SM-PS"); +@@ -832,8 +832,8 @@ static ssize_t sta_he_capa_read(struct f + + PFLAG(PHY, 3, DCM_MAX_RX_NSS_1, "DCM-MAX-RX-NSS-1"); + PFLAG(PHY, 3, DCM_MAX_RX_NSS_2, "DCM-MAX-RX-NSS-2"); +- PFLAG(PHY, 3, RX_HE_MU_PPDU_FROM_NON_AP_STA, +- "RX-HE-MU-PPDU-FROM-NON-AP-STA"); ++ PFLAG(PHY, 3, RX_PARTIAL_BW_SU_IN_20MHZ_MU, ++ "RX-PARTIAL-BW-SU-IN-20MHZ-MU"); + PFLAG(PHY, 3, SU_BEAMFORMER, "SU-BEAMFORMER"); + + PFLAG(PHY, 4, SU_BEAMFORMEE, "SU-BEAMFORMEE"); +@@ -853,16 +853,17 @@ static ssize_t sta_he_capa_read(struct f + + PFLAG(PHY, 6, CODEBOOK_SIZE_42_SU, "CODEBOOK-SIZE-42-SU"); + PFLAG(PHY, 6, CODEBOOK_SIZE_75_MU, "CODEBOOK-SIZE-75-MU"); +- PFLAG(PHY, 6, TRIG_SU_BEAMFORMER_FB, "TRIG-SU-BEAMFORMER-FB"); +- PFLAG(PHY, 6, TRIG_MU_BEAMFORMER_FB, "TRIG-MU-BEAMFORMER-FB"); ++ PFLAG(PHY, 6, TRIG_SU_BEAMFORMING_FB, "TRIG-SU-BEAMFORMING-FB"); ++ PFLAG(PHY, 6, TRIG_MU_BEAMFORMING_PARTIAL_BW_FB, ++ "MU-BEAMFORMING-PARTIAL-BW-FB"); + PFLAG(PHY, 6, TRIG_CQI_FB, "TRIG-CQI-FB"); + PFLAG(PHY, 6, PARTIAL_BW_EXT_RANGE, "PARTIAL-BW-EXT-RANGE"); + PFLAG(PHY, 6, PARTIAL_BANDWIDTH_DL_MUMIMO, + "PARTIAL-BANDWIDTH-DL-MUMIMO"); + PFLAG(PHY, 6, PPE_THRESHOLD_PRESENT, "PPE-THRESHOLD-PRESENT"); + +- PFLAG(PHY, 7, SRP_BASED_SR, "SRP-BASED-SR"); +- PFLAG(PHY, 7, POWER_BOOST_FACTOR_AR, "POWER-BOOST-FACTOR-AR"); ++ PFLAG(PHY, 7, PSR_BASED_SR, "PSR-BASED-SR"); ++ PFLAG(PHY, 7, POWER_BOOST_FACTOR_SUPP, "POWER-BOOST-FACTOR-SUPP"); + PFLAG(PHY, 7, HE_SU_MU_PPDU_4XLTF_AND_08_US_GI, + "HE-SU-MU-PPDU-4XLTF-AND-08-US-GI"); + PFLAG_RANGE(PHY, 7, MAX_NC, 0, 1, 1, "MAX-NC-%d"); +--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +@@ -631,7 +631,7 @@ static struct ieee80211_sband_iftype_dat + .phy_cap_info[6] = + IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT, + .phy_cap_info[7] = +- IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR | ++ IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | + IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI | + IEEE80211_HE_PHY_CAP7_MAX_NC_1, + .phy_cap_info[8] = diff --git a/package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch b/package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch new file mode 100644 index 0000000000..369c240d35 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch @@ -0,0 +1,75 @@ +From: Johannes Berg +Date: Fri, 9 Apr 2021 12:40:24 +0300 +Subject: [PATCH] wireless: fix spelling of A-MSDU in HE capabilities + +In the HE capabilities, spell A-MSDU correctly, not "A-MDSU". + +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210409123755.9e6ff1af1181.If6868bc6902ccd9a95c74c78f716c4b41473ef14@changeid +Signed-off-by: Johannes Berg +--- + +--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +@@ -598,7 +598,7 @@ static struct ieee80211_sband_iftype_dat + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, + .mac_cap_info[4] = +- IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU | ++ IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU | + IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39, + .mac_cap_info[5] = + IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 | +@@ -682,7 +682,7 @@ static struct ieee80211_sband_iftype_dat + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, + .mac_cap_info[4] = +- IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, ++ IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, + .mac_cap_info[5] = + IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU, + .phy_cap_info[0] = +--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c ++++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c +@@ -427,7 +427,7 @@ mt7915_init_he_caps(struct mt7915_phy *p + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED; + he_cap_elem->mac_cap_info[4] = +- IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU; ++ IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; + + if (band == NL80211_BAND_2GHZ) + he_cap_elem->phy_cap_info[0] = +--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c ++++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +@@ -1353,7 +1353,7 @@ mt7915_mcu_sta_he_tlv(struct sk_buff *sk + if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL) + cap |= STA_REC_HE_CAP_OM; + +- if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU) ++ if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU) + cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU; + + if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR) +--- a/include/linux/ieee80211.h ++++ b/include/linux/ieee80211.h +@@ -2068,7 +2068,7 @@ int ieee80211_get_vht_max_nss(struct iee + #define IEEE80211_HE_MAC_CAP4_PSR_RESP 0x08 + #define IEEE80211_HE_MAC_CAP4_NDP_FB_REP 0x10 + #define IEEE80211_HE_MAC_CAP4_OPS 0x20 +-#define IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU 0x40 ++#define IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU 0x40 + /* Multi TID agg TX is split between byte #4 and #5 + * The value is a combination of B39,B40,B41 + */ +--- a/net/mac80211/debugfs_sta.c ++++ b/net/mac80211/debugfs_sta.c +@@ -735,7 +735,7 @@ static ssize_t sta_he_capa_read(struct f + PFLAG(MAC, 4, PSR_RESP, "PSR-RESP"); + PFLAG(MAC, 4, NDP_FB_REP, "NDP-FB-REP"); + PFLAG(MAC, 4, OPS, "OPS"); +- PFLAG(MAC, 4, AMDSU_IN_AMPDU, "AMSDU-IN-AMPDU"); ++ PFLAG(MAC, 4, AMSDU_IN_AMPDU, "AMSDU-IN-AMPDU"); + + PRINT("MULTI-TID-AGG-TX-QOS-%d", ((cap[5] << 1) | (cap[4] >> 7)) & 0x7); + diff --git a/package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch b/package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch new file mode 100644 index 0000000000..a2c9d597ce --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch @@ -0,0 +1,148 @@ +From: Johannes Berg +Date: Fri, 9 Apr 2021 12:40:20 +0300 +Subject: [PATCH] wireless: align HE capabilities A-MPDU Length Exponent + Extension + +The A-MPDU length exponent extension is defined differently in +802.11ax D6.1, align with that. + +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210409123755.c2a257d3e2df.I3455245d388c52c61dace7e7958dbed7e807cfb6@changeid +Signed-off-by: Johannes Berg +--- + +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -1290,9 +1290,8 @@ static void ath11k_peer_assoc_h_he(struc + * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu + * length. + */ +- ampdu_factor = (he_cap->he_cap_elem.mac_cap_info[3] & +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) >> +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_SHIFT; ++ ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], ++ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK); + + if (ampdu_factor) { + if (sta->vht_cap.vht_supported) +--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +@@ -596,7 +596,7 @@ static struct ieee80211_sband_iftype_dat + IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP, + .mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, ++ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2, + .mac_cap_info[4] = + IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU | + IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39, +@@ -680,7 +680,7 @@ static struct ieee80211_sband_iftype_dat + IEEE80211_HE_MAC_CAP2_BSR, + .mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, ++ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2, + .mac_cap_info[4] = + IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, + .mac_cap_info[5] = +--- a/drivers/net/wireless/mac80211_hwsim.c ++++ b/drivers/net/wireless/mac80211_hwsim.c +@@ -2817,7 +2817,7 @@ static const struct ieee80211_sband_ifty + IEEE80211_HE_MAC_CAP2_ACK_EN, + .mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, ++ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, + .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, + .phy_cap_info[1] = + IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK | +@@ -2861,7 +2861,7 @@ static const struct ieee80211_sband_ifty + IEEE80211_HE_MAC_CAP2_ACK_EN, + .mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, ++ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, + .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, + .phy_cap_info[1] = + IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK | +@@ -2907,7 +2907,7 @@ static const struct ieee80211_sband_ifty + IEEE80211_HE_MAC_CAP2_ACK_EN, + .mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, ++ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, + .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, + .phy_cap_info[0] = + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | +@@ -2955,7 +2955,7 @@ static const struct ieee80211_sband_ifty + IEEE80211_HE_MAC_CAP2_ACK_EN, + .mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, ++ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, + .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, + .phy_cap_info[0] = + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | +--- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c ++++ b/drivers/net/wireless/mediatek/mt76/mt7915/init.c +@@ -425,7 +425,7 @@ mt7915_init_he_caps(struct mt7915_phy *p + IEEE80211_HE_MAC_CAP0_HTC_HE; + he_cap_elem->mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED; ++ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3; + he_cap_elem->mac_cap_info[4] = + IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; + +--- a/include/linux/ieee80211.h ++++ b/include/linux/ieee80211.h +@@ -2051,17 +2051,15 @@ int ieee80211_get_vht_max_nss(struct iee + * A-MDPU Length Exponent field in the HT capabilities, VHT capabilities and the + * same field in the HE capabilities. + */ +-#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_USE_VHT 0x00 +-#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_1 0x08 +-#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2 0x10 +-#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED 0x18 ++#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_0 0x00 ++#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_1 0x08 ++#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2 0x10 ++#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3 0x18 + #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK 0x18 + #define IEEE80211_HE_MAC_CAP3_AMSDU_FRAG 0x20 + #define IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED 0x40 + #define IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS 0x80 + +-#define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_SHIFT 3 +- + #define IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG 0x01 + #define IEEE80211_HE_MAC_CAP4_QTP 0x02 + #define IEEE80211_HE_MAC_CAP4_BQR 0x04 +--- a/net/mac80211/debugfs_sta.c ++++ b/net/mac80211/debugfs_sta.c +@@ -711,17 +711,17 @@ static ssize_t sta_he_capa_read(struct f + PFLAG(MAC, 3, OFDMA_RA, "OFDMA-RA"); + + switch (cap[3] & IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK) { +- case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_USE_VHT: +- PRINT("MAX-AMPDU-LEN-EXP-USE-VHT"); ++ case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_0: ++ PRINT("MAX-AMPDU-LEN-EXP-USE-EXT-0"); + break; +- case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_1: +- PRINT("MAX-AMPDU-LEN-EXP-VHT-1"); ++ case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_1: ++ PRINT("MAX-AMPDU-LEN-EXP-VHT-EXT-1"); + break; +- case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2: +- PRINT("MAX-AMPDU-LEN-EXP-VHT-2"); ++ case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2: ++ PRINT("MAX-AMPDU-LEN-EXP-VHT-EXT-2"); + break; +- case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED: +- PRINT("MAX-AMPDU-LEN-EXP-RESERVED"); ++ case IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3: ++ PRINT("MAX-AMPDU-LEN-EXP-VHT-EXT-3"); + break; + } + diff --git a/package/kernel/mt76/patches/100-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch b/package/kernel/mt76/patches/100-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch new file mode 100644 index 0000000000..b540b77057 --- /dev/null +++ b/package/kernel/mt76/patches/100-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch @@ -0,0 +1,55 @@ +From: Johannes Berg +Date: Fri, 9 Apr 2021 12:40:24 +0300 +Subject: [PATCH] wireless: fix spelling of A-MSDU in HE capabilities + +In the HE capabilities, spell A-MSDU correctly, not "A-MDSU". + +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210409123755.9e6ff1af1181.If6868bc6902ccd9a95c74c78f716c4b41473ef14@changeid +Signed-off-by: Johannes Berg +--- + +--- a/mt76_connac_mcu.c ++++ b/mt76_connac_mcu.c +@@ -567,7 +567,7 @@ mt76_connac_mcu_sta_he_tlv(struct sk_buf + if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL) + cap |= STA_REC_HE_CAP_OM; + +- if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU) ++ if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU) + cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU; + + if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR) +--- a/mt7915/init.c ++++ b/mt7915/init.c +@@ -761,7 +761,7 @@ mt7915_init_he_caps(struct mt7915_phy *p + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED; + he_cap_elem->mac_cap_info[4] = +- IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU; ++ IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; + + if (band == NL80211_BAND_2GHZ) + he_cap_elem->phy_cap_info[0] = +--- a/mt7915/mcu.c ++++ b/mt7915/mcu.c +@@ -1361,7 +1361,7 @@ mt7915_mcu_sta_he_tlv(struct sk_buff *sk + if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL) + cap |= STA_REC_HE_CAP_OM; + +- if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU) ++ if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU) + cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU; + + if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR) +--- a/mt7921/main.c ++++ b/mt7921/main.c +@@ -67,7 +67,7 @@ mt7921_init_he_caps(struct mt7921_phy *p + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED; + he_cap_elem->mac_cap_info[4] = +- IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU; ++ IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; + + if (band == NL80211_BAND_2GHZ) + he_cap_elem->phy_cap_info[0] = diff --git a/package/kernel/mt76/patches/101-wireless-align-some-HE-capabilities-with-the-spec.patch b/package/kernel/mt76/patches/101-wireless-align-some-HE-capabilities-with-the-spec.patch new file mode 100644 index 0000000000..52a5225eaa --- /dev/null +++ b/package/kernel/mt76/patches/101-wireless-align-some-HE-capabilities-with-the-spec.patch @@ -0,0 +1,70 @@ +From: Johannes Berg +Date: Fri, 9 Apr 2021 12:40:17 +0300 +Subject: [PATCH] wireless: align some HE capabilities with the spec + +Some names were changed, align that with the spec as of +802.11ax-D6.1. + +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210409123755.b1e5fbab0d8c.I3eb6076cb0714ec6aec6b8f9dee613ce4a05d825@changeid +Signed-off-by: Johannes Berg +--- + +--- a/mt7915/init.c ++++ b/mt7915/init.c +@@ -646,8 +646,8 @@ mt7915_set_stream_he_txbf_caps(struct ie + IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK; + elem->phy_cap_info[5] &= ~c; + +- c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB | +- IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB; ++ c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | ++ IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB; + elem->phy_cap_info[6] &= ~c; + + elem->phy_cap_info[7] &= ~IEEE80211_HE_PHY_CAP7_MAX_NC_MASK; +@@ -687,8 +687,8 @@ mt7915_set_stream_he_txbf_caps(struct ie + c = (nss - 1) | (max_t(int, le16_to_cpu(mcs->tx_mcs_160), 1) << 3); + elem->phy_cap_info[5] |= c; + +- c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB | +- IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB; ++ c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | ++ IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB; + elem->phy_cap_info[6] |= c; + } + +@@ -816,7 +816,7 @@ mt7915_init_he_caps(struct mt7915_phy *p + IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE | + IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT; + he_cap_elem->phy_cap_info[7] |= +- IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR | ++ IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | + IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI; + he_cap_elem->phy_cap_info[8] |= + IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | +--- a/mt7915/mcu.c ++++ b/mt7915/mcu.c +@@ -1842,9 +1842,9 @@ mt7915_mcu_sta_bfer_he(struct ieee80211_ + + bf->tx_mode = MT_PHY_TYPE_HE_SU; + mt7915_mcu_sta_sounding_rate(bf); +- bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMER_FB, ++ bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMING_FB, + pe->phy_cap_info[6]); +- bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMER_FB, ++ bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB, + pe->phy_cap_info[6]); + bfer_nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK, + ve->phy_cap_info[5]); +--- a/mt7921/main.c ++++ b/mt7921/main.c +@@ -116,7 +116,7 @@ mt7921_init_he_caps(struct mt7921_phy *p + IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE | + IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT; + he_cap_elem->phy_cap_info[7] |= +- IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR | ++ IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | + IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI; + he_cap_elem->phy_cap_info[8] |= + IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | diff --git a/package/kernel/mt76/patches/102-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch b/package/kernel/mt76/patches/102-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch new file mode 100644 index 0000000000..b86f6fbb83 --- /dev/null +++ b/package/kernel/mt76/patches/102-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch @@ -0,0 +1,35 @@ +From: Johannes Berg +Date: Fri, 9 Apr 2021 12:40:20 +0300 +Subject: [PATCH] wireless: align HE capabilities A-MPDU Length Exponent + Extension + +The A-MPDU length exponent extension is defined differently in +802.11ax D6.1, align with that. + +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210409123755.c2a257d3e2df.I3455245d388c52c61dace7e7958dbed7e807cfb6@changeid +Signed-off-by: Johannes Berg +--- + +--- a/mt7915/init.c ++++ b/mt7915/init.c +@@ -759,7 +759,7 @@ mt7915_init_he_caps(struct mt7915_phy *p + IEEE80211_HE_MAC_CAP0_HTC_HE; + he_cap_elem->mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED; ++ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3; + he_cap_elem->mac_cap_info[4] = + IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; + +--- a/mt7921/main.c ++++ b/mt7921/main.c +@@ -65,7 +65,7 @@ mt7921_init_he_caps(struct mt7921_phy *p + IEEE80211_HE_MAC_CAP0_HTC_HE; + he_cap_elem->mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | +- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED; ++ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3; + he_cap_elem->mac_cap_info[4] = + IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; + From 192c41001a46ed2c4545aa82e4271802e3357f04 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 19 Oct 2021 12:43:03 +0200 Subject: [PATCH 11/36] mt76: update to the latest version ebf5b2336591 mt7615/mt7915: fix hwmon device name 8d12f9ed275d mt76: mt7615: mt7622: fix ibss and meshpoint e7883cdc0b4e mt76: mt7915: improve code readability in mt7915_mcu_sta_bfer_ht 831d5967abb9 wireless: fix spelling of A-MSDU in HE capabilities f09cb04be261 wireless: align some HE capabilities with the spec 0eeba8f2952d wireless: align HE capabilities A-MPDU Length Exponent Extension 655a6c65b8a7 mt76: mt7915: introduce mt7915_mcu_beacon_check_caps() 4440025d0ba9 mt76: mt7915: fix txbf starec TLV issues 87d2fb6fbff5 mt76: mt7915: improve starec readability of txbf 53c6a3cb7f6b mt76: mt7915: fix sta_rec_wtbl tag len f517845e4f28 mt76: mt7915: rework starec TLV tags 1df017bc39a3 mt76: mt7915: fix muar_idx in mt7915_mcu_alloc_sta_req() 6724b0a9a748 mt76: mt7915: set VTA bit in tx descriptor f1f505cbbb30 mt76: mt7915: set muru platform type 8c9d4b38d258 mt76: mt7915: remove dead code in mt7915_get_et_stats d0ccc4297935 mt76: rely on phy pointer in mt76_register_debugfs_fops routine signature 0af0af82bb97 mt76: mt7915: introduce mt76 debugfs sub-dir for ext-phy 10e85d62f213 mt76: mt7915: improve code readability for xmit-queue handler b6051f7713d2 mt76: sdio: export mt76s_alloc_rx_queue and mt76s_alloc_tx routines 9a97c38a309d mt76: mt7921: get rid of unused variable in mt7921_tx_complete_skb c02847c05884 mt76: mt7921: get rid of unused variable in mt7921_mac_tx_free 60dd47a0a62e mt76: mt7915: remove dead code in debugfs code ce74fc020d81 mt76: mt7921: add MU EDCA cmd support c062f6920356 mt76: mt7921: refactor mac.c to be bus independent bfa909c833e8 mt76: mt7921: refactor dma.c to be pcie specific 6556bddf26d2 mt76: mt7921: refactor mcu.c to be bus independent 1c8418207c86 mt76: mt7921: refactor init.c to be bus independent 6cf8248c1a44 mt76: mt7921: add MT7921_COMMON module 77600b0c10ac mt76: connac: move mcu reg access utility routines in mt76_connac_lib module 65362a00d07d mt76: mt7663s: rely on mcu reg access utility 956206bb55c3 mt76: mt7921: make all event parser reusable between mt7921s and mt7921e f0dedcf6aaf0 mt76: mt7921: use physical addr to unify register access 5079d5b0b13c mt76: sdio: move common code in mt76_sdio module 26257594398b mt76: sdio: introduce parse_irq callback e353424f1b07 mt76: sdio: extend sdio module to support CONNAC2 ddab3dd25f94 mt76: connac: extend mcu_get_nic_capability b2d9a1748a41 mt76: mt7921: rely on mcu_get_nic_capability e6ce5d9cbda0 mt76: mt7921: refactor mt7921_mcu_send_message ce3706a65ccd mt76: mt7921: introduce mt7921s support 3143118baf53 mt76: mt7921s: add reset support 645eac64bece mt76: mt76x0: correct VHT MCS 8/9 tx power eeprom offset d54796787cb7 mt76: move mt76_sta_stats in mt76.h 094e085abf5a mt76: move mt76_ethtool_worker_info in mt76 module f80ab6dde63d mt76: mt7915: run mt7915_get_et_stats holding mt76 mutex 4a11cb67dc27 mt76: mt7915: move tx amsdu stats in mib_stats 486da6fa2512 mt76: do not reset MIB counters in get_stats callback d8837b7c8dcd mt76: mt7921: add some more MIB counters 5ffe086fcd1b mt76: mt7921: introduce stats reporting through ethtool 69154ae23f6b mt76: mt7921: add sta stats accounting in mt7921_mac_add_txs_skb 4b65fbc4e203 mt76: mt7921: move tx amsdu stats in mib_stats 35b8025f466b mt76: mt7921: add per-vif counters in ethtool cfbbd861eb12 mt76: mt7915: enable HE UL MU-MIMO a0b94987df80 mt76: mt7915: rework mt7915_mcu_sta_muru_tlv() 5fbb686e9c0c mt76: mt7915: fix missing HE phy cap b649678c18ca mt76: mt7915: change max rx len limit of hw modules Signed-off-by: Felix Fietkau --- package/kernel/mt76/Makefile | 47 +++++++++++-- ...pelling-of-A-MSDU-in-HE-capabilities.patch | 55 --------------- ...n-some-HE-capabilities-with-the-spec.patch | 70 ------------------- ...E-capabilities-A-MPDU-Length-Exponen.patch | 35 ---------- 4 files changed, 40 insertions(+), 167 deletions(-) delete mode 100644 package/kernel/mt76/patches/100-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch delete mode 100644 package/kernel/mt76/patches/101-wireless-align-some-HE-capabilities-with-the-spec.patch delete mode 100644 package/kernel/mt76/patches/102-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile index 97cb9e8d59..7bd3b5d3d3 100644 --- a/package/kernel/mt76/Makefile +++ b/package/kernel/mt76/Makefile @@ -8,9 +8,9 @@ PKG_LICENSE_FILES:= PKG_SOURCE_URL:=https://github.com/openwrt/mt76 PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2021-10-12 -PKG_SOURCE_VERSION:=83598c2e872fd8af29976a5f11afe94e620d6f4f -PKG_MIRROR_HASH:=f179375318c44fb058403aed98056c4df8df7541e4c9d093ec5c22a2eda9475e +PKG_SOURCE_DATE:=2021-10-20 +PKG_SOURCE_VERSION:=b649678c18cac4b7c85d7d7d86d17e9e4c9b7641 +PKG_MIRROR_HASH:=83bfe5c5e820bc8f2cbe95fa140a232336ac69c86c6df226738e910b3df525ed PKG_MAINTAINER:=Felix Fietkau PKG_USE_NINJA:=0 @@ -152,6 +152,14 @@ define KernelPackage/mt76-connac FILES:= $(PKG_BUILD_DIR)/mt76-connac-lib.ko endef +define KernelPackage/mt76-sdio + $(KernelPackage/mt76-default) + TITLE:=MediaTek MT7615/MT79xx SDIO driver common code + HIDDEN:=1 + DEPENDS+=+kmod-mt76-core +kmod-mmc + FILES:= $(PKG_BUILD_DIR)/mt76-sdio.ko +endef + define KernelPackage/mt7615-common $(KernelPackage/mt76-default) TITLE:=MediaTek MT7615 wireless driver common code @@ -196,9 +204,8 @@ endef define KernelPackage/mt7663s $(KernelPackage/mt76-default) TITLE:=MediaTek MT7663s wireless driver - DEPENDS+=+kmod-mmc +kmod-mt7615-common +kmod-mt7663-usb-sdio + DEPENDS+=+kmod-mt76-sdio +kmod-mt7615-common +kmod-mt7663-usb-sdio FILES:= \ - $(PKG_BUILD_DIR)/mt76-sdio.ko \ $(PKG_BUILD_DIR)/mt7615/mt7663s.ko AUTOLOAD:=$(call AutoProbe,mt7663s) endef @@ -219,10 +226,25 @@ define KernelPackage/mt7915e AUTOLOAD:=$(call AutoProbe,mt7915e) endef +define KernelPackage/mt7921-common + TITLE:=MediaTek MT7615 wireless driver common code + HIDDEN:=1 + DEPENDS+=@PCI_SUPPORT +kmod-mt76-core +kmod-mt76-connac + FILES:= $(PKG_BUILD_DIR)/mt7921/mt7921-common.ko +endef + +define KernelPackage/mt7921s + $(KernelPackage/mt76-default) + TITLE:=MediaTek MT7921s wireless driver + DEPENDS+=@PCI_SUPPORT +kmod-mt76-connac +kmod-mt76-sdio +kmod-mt7921-common + FILES:= $(PKG_BUILD_DIR)/mt7921/mt7921s.ko + AUTOLOAD:=$(call AutoProbe,mt7921s) +endef + define KernelPackage/mt7921e $(KernelPackage/mt76-default) TITLE:=MediaTek MT7921e wireless driver - DEPENDS+=@PCI_SUPPORT +kmod-mt76-connac + DEPENDS+=@PCI_SUPPORT +kmod-mt76-connac +kmod-mt7921-common FILES:= $(PKG_BUILD_DIR)/mt7921/mt7921e.ko AUTOLOAD:=$(call AutoProbe,mt7921e) endef @@ -288,6 +310,9 @@ endif ifdef CONFIG_PACKAGE_kmod-mt76-connac PKG_MAKE_FLAGS += CONFIG_MT76_CONNAC_LIB=m endif +ifdef CONFIG_PACKAGE_kmod-mt76-sdio + PKG_MAKE_FLAGS += CONFIG_MT76_SDIO=m +endif ifdef CONFIG_PACKAGE_kmod-mt7615-common PKG_MAKE_FLAGS += CONFIG_MT7615_COMMON=m endif @@ -302,7 +327,6 @@ ifdef CONFIG_PACKAGE_kmod-mt7663-usb-sdio PKG_MAKE_FLAGS += CONFIG_MT7663_USB_SDIO_COMMON=m endif ifdef CONFIG_PACKAGE_kmod-mt7663s - PKG_MAKE_FLAGS += CONFIG_MT76_SDIO=m PKG_MAKE_FLAGS += CONFIG_MT7663S=m endif ifdef CONFIG_PACKAGE_kmod-mt7663u @@ -311,6 +335,12 @@ endif ifdef CONFIG_PACKAGE_kmod-mt7915e PKG_MAKE_FLAGS += CONFIG_MT7915E=m endif +ifdef CONFIG_PACKAGE_kmod-mt7921-common + PKG_MAKE_FLAGS += CONFIG_MT7921_COMMON=m +endif +ifdef CONFIG_PACKAGE_kmod-mt7921s + PKG_MAKE_FLAGS += CONFIG_MT7921S=m +endif ifdef CONFIG_PACKAGE_kmod-mt7921e PKG_MAKE_FLAGS += CONFIG_MT7921E=m endif @@ -433,6 +463,7 @@ $(eval $(call KernelPackage,mt76x2u)) $(eval $(call KernelPackage,mt76x2)) $(eval $(call KernelPackage,mt7603)) $(eval $(call KernelPackage,mt76-connac)) +$(eval $(call KernelPackage,mt76-sdio)) $(eval $(call KernelPackage,mt7615-common)) $(eval $(call KernelPackage,mt7615-firmware)) $(eval $(call KernelPackage,mt7615e)) @@ -442,6 +473,8 @@ $(eval $(call KernelPackage,mt7663-usb-sdio)) $(eval $(call KernelPackage,mt7663u)) $(eval $(call KernelPackage,mt7663s)) $(eval $(call KernelPackage,mt7915e)) +$(eval $(call KernelPackage,mt7921-common)) +$(eval $(call KernelPackage,mt7921s)) $(eval $(call KernelPackage,mt7921e)) $(eval $(call KernelPackage,mt76)) $(eval $(call BuildPackage,mt76-test)) diff --git a/package/kernel/mt76/patches/100-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch b/package/kernel/mt76/patches/100-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch deleted file mode 100644 index b540b77057..0000000000 --- a/package/kernel/mt76/patches/100-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch +++ /dev/null @@ -1,55 +0,0 @@ -From: Johannes Berg -Date: Fri, 9 Apr 2021 12:40:24 +0300 -Subject: [PATCH] wireless: fix spelling of A-MSDU in HE capabilities - -In the HE capabilities, spell A-MSDU correctly, not "A-MDSU". - -Signed-off-by: Luca Coelho -Link: https://lore.kernel.org/r/iwlwifi.20210409123755.9e6ff1af1181.If6868bc6902ccd9a95c74c78f716c4b41473ef14@changeid -Signed-off-by: Johannes Berg ---- - ---- a/mt76_connac_mcu.c -+++ b/mt76_connac_mcu.c -@@ -567,7 +567,7 @@ mt76_connac_mcu_sta_he_tlv(struct sk_buf - if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL) - cap |= STA_REC_HE_CAP_OM; - -- if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU) -+ if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU) - cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU; - - if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR) ---- a/mt7915/init.c -+++ b/mt7915/init.c -@@ -761,7 +761,7 @@ mt7915_init_he_caps(struct mt7915_phy *p - IEEE80211_HE_MAC_CAP3_OMI_CONTROL | - IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED; - he_cap_elem->mac_cap_info[4] = -- IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU; -+ IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; - - if (band == NL80211_BAND_2GHZ) - he_cap_elem->phy_cap_info[0] = ---- a/mt7915/mcu.c -+++ b/mt7915/mcu.c -@@ -1361,7 +1361,7 @@ mt7915_mcu_sta_he_tlv(struct sk_buff *sk - if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL) - cap |= STA_REC_HE_CAP_OM; - -- if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU) -+ if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU) - cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU; - - if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR) ---- a/mt7921/main.c -+++ b/mt7921/main.c -@@ -67,7 +67,7 @@ mt7921_init_he_caps(struct mt7921_phy *p - IEEE80211_HE_MAC_CAP3_OMI_CONTROL | - IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED; - he_cap_elem->mac_cap_info[4] = -- IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU; -+ IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; - - if (band == NL80211_BAND_2GHZ) - he_cap_elem->phy_cap_info[0] = diff --git a/package/kernel/mt76/patches/101-wireless-align-some-HE-capabilities-with-the-spec.patch b/package/kernel/mt76/patches/101-wireless-align-some-HE-capabilities-with-the-spec.patch deleted file mode 100644 index 52a5225eaa..0000000000 --- a/package/kernel/mt76/patches/101-wireless-align-some-HE-capabilities-with-the-spec.patch +++ /dev/null @@ -1,70 +0,0 @@ -From: Johannes Berg -Date: Fri, 9 Apr 2021 12:40:17 +0300 -Subject: [PATCH] wireless: align some HE capabilities with the spec - -Some names were changed, align that with the spec as of -802.11ax-D6.1. - -Signed-off-by: Luca Coelho -Link: https://lore.kernel.org/r/iwlwifi.20210409123755.b1e5fbab0d8c.I3eb6076cb0714ec6aec6b8f9dee613ce4a05d825@changeid -Signed-off-by: Johannes Berg ---- - ---- a/mt7915/init.c -+++ b/mt7915/init.c -@@ -646,8 +646,8 @@ mt7915_set_stream_he_txbf_caps(struct ie - IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK; - elem->phy_cap_info[5] &= ~c; - -- c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB | -- IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB; -+ c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | -+ IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB; - elem->phy_cap_info[6] &= ~c; - - elem->phy_cap_info[7] &= ~IEEE80211_HE_PHY_CAP7_MAX_NC_MASK; -@@ -687,8 +687,8 @@ mt7915_set_stream_he_txbf_caps(struct ie - c = (nss - 1) | (max_t(int, le16_to_cpu(mcs->tx_mcs_160), 1) << 3); - elem->phy_cap_info[5] |= c; - -- c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMER_FB | -- IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMER_FB; -+ c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | -+ IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB; - elem->phy_cap_info[6] |= c; - } - -@@ -816,7 +816,7 @@ mt7915_init_he_caps(struct mt7915_phy *p - IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE | - IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT; - he_cap_elem->phy_cap_info[7] |= -- IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR | -+ IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | - IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI; - he_cap_elem->phy_cap_info[8] |= - IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | ---- a/mt7915/mcu.c -+++ b/mt7915/mcu.c -@@ -1842,9 +1842,9 @@ mt7915_mcu_sta_bfer_he(struct ieee80211_ - - bf->tx_mode = MT_PHY_TYPE_HE_SU; - mt7915_mcu_sta_sounding_rate(bf); -- bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMER_FB, -+ bf->trigger_su = HE_PHY(CAP6_TRIG_SU_BEAMFORMING_FB, - pe->phy_cap_info[6]); -- bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMER_FB, -+ bf->trigger_mu = HE_PHY(CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB, - pe->phy_cap_info[6]); - bfer_nr = HE_PHY(CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK, - ve->phy_cap_info[5]); ---- a/mt7921/main.c -+++ b/mt7921/main.c -@@ -116,7 +116,7 @@ mt7921_init_he_caps(struct mt7921_phy *p - IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE | - IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT; - he_cap_elem->phy_cap_info[7] |= -- IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_AR | -+ IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP | - IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI; - he_cap_elem->phy_cap_info[8] |= - IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G | diff --git a/package/kernel/mt76/patches/102-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch b/package/kernel/mt76/patches/102-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch deleted file mode 100644 index b86f6fbb83..0000000000 --- a/package/kernel/mt76/patches/102-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch +++ /dev/null @@ -1,35 +0,0 @@ -From: Johannes Berg -Date: Fri, 9 Apr 2021 12:40:20 +0300 -Subject: [PATCH] wireless: align HE capabilities A-MPDU Length Exponent - Extension - -The A-MPDU length exponent extension is defined differently in -802.11ax D6.1, align with that. - -Signed-off-by: Luca Coelho -Link: https://lore.kernel.org/r/iwlwifi.20210409123755.c2a257d3e2df.I3455245d388c52c61dace7e7958dbed7e807cfb6@changeid -Signed-off-by: Johannes Berg ---- - ---- a/mt7915/init.c -+++ b/mt7915/init.c -@@ -759,7 +759,7 @@ mt7915_init_he_caps(struct mt7915_phy *p - IEEE80211_HE_MAC_CAP0_HTC_HE; - he_cap_elem->mac_cap_info[3] = - IEEE80211_HE_MAC_CAP3_OMI_CONTROL | -- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED; -+ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3; - he_cap_elem->mac_cap_info[4] = - IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; - ---- a/mt7921/main.c -+++ b/mt7921/main.c -@@ -65,7 +65,7 @@ mt7921_init_he_caps(struct mt7921_phy *p - IEEE80211_HE_MAC_CAP0_HTC_HE; - he_cap_elem->mac_cap_info[3] = - IEEE80211_HE_MAC_CAP3_OMI_CONTROL | -- IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_RESERVED; -+ IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3; - he_cap_elem->mac_cap_info[4] = - IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; - From a889dcd3f21e50dc3e7f827ff0e486020562a6f8 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 20 Oct 2021 14:04:24 +0200 Subject: [PATCH 12/36] mac80211: add missing patch chunk for mac80211_hwsim Fixes build error Signed-off-by: Felix Fietkau --- ...pelling-of-A-MSDU-in-HE-capabilities.patch | 38 +++++++++++++++++++ ...E-capabilities-A-MPDU-Length-Exponen.patch | 8 ++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch b/package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch index 369c240d35..75aecf06c7 100644 --- a/package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch +++ b/package/kernel/mac80211/patches/subsys/392-wireless-fix-spelling-of-A-MSDU-in-HE-capabilities.patch @@ -73,3 +73,41 @@ Signed-off-by: Johannes Berg PRINT("MULTI-TID-AGG-TX-QOS-%d", ((cap[5] << 1) | (cap[4] >> 7)) & 0x7); +--- a/drivers/net/wireless/mac80211_hwsim.c ++++ b/drivers/net/wireless/mac80211_hwsim.c +@@ -2818,7 +2818,7 @@ static const struct ieee80211_sband_ifty + .mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, +- .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, ++ .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, + .phy_cap_info[1] = + IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK | + IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A | +@@ -2862,7 +2862,7 @@ static const struct ieee80211_sband_ifty + .mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, +- .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, ++ .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, + .phy_cap_info[1] = + IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK | + IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A | +@@ -2908,7 +2908,7 @@ static const struct ieee80211_sband_ifty + .mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, +- .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, ++ .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, + .phy_cap_info[0] = + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | +@@ -2956,7 +2956,7 @@ static const struct ieee80211_sband_ifty + .mac_cap_info[3] = + IEEE80211_HE_MAC_CAP3_OMI_CONTROL | + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, +- .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, ++ .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, + .phy_cap_info[0] = + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G | diff --git a/package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch b/package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch index a2c9d597ce..adb89f6390 100644 --- a/package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch +++ b/package/kernel/mac80211/patches/subsys/393-wireless-align-HE-capabilities-A-MPDU-Length-Exponen.patch @@ -53,7 +53,7 @@ Signed-off-by: Johannes Berg IEEE80211_HE_MAC_CAP3_OMI_CONTROL | - IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, - .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, + .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, .phy_cap_info[1] = IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK | @@ -2861,7 +2861,7 @@ static const struct ieee80211_sband_ifty @@ -62,7 +62,7 @@ Signed-off-by: Johannes Berg IEEE80211_HE_MAC_CAP3_OMI_CONTROL | - IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, - .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, + .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, .phy_cap_info[1] = IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK | @@ -2907,7 +2907,7 @@ static const struct ieee80211_sband_ifty @@ -71,7 +71,7 @@ Signed-off-by: Johannes Berg IEEE80211_HE_MAC_CAP3_OMI_CONTROL | - IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, - .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, + .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, .phy_cap_info[0] = IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | @@ -2955,7 +2955,7 @@ static const struct ieee80211_sband_ifty @@ -80,7 +80,7 @@ Signed-off-by: Johannes Berg IEEE80211_HE_MAC_CAP3_OMI_CONTROL | - IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_VHT_2, + IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3, - .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU, + .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU, .phy_cap_info[0] = IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G | --- a/drivers/net/wireless/mediatek/mt76/mt7915/init.c From 352427ecec63036b6131515920e9a77f71948880 Mon Sep 17 00:00:00 2001 From: Adrian Schmutzler Date: Tue, 19 Oct 2021 21:08:58 +0200 Subject: [PATCH 13/36] realtek: switch to kernel 5.10 The usual testers did their tests. Now we need testers who use the master builds. Signed-off-by: Adrian Schmutzler --- target/linux/realtek/Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/target/linux/realtek/Makefile b/target/linux/realtek/Makefile index 2eca7015e4..ae0ba718ec 100644 --- a/target/linux/realtek/Makefile +++ b/target/linux/realtek/Makefile @@ -10,8 +10,7 @@ DEVICE_TYPE:=basic FEATURES:=ramdisk squashfs SUBTARGETS:=generic -KERNEL_PATCHVER:=5.4 -KERNEL_TESTING_PATCHVER:=5.10 +KERNEL_PATCHVER:=5.10 define Target/Description Build firmware images for Realtek RTL83xx based boards. From 36019ed5893cd11c86a7dbedca1c6a055654a3c0 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sun, 10 Oct 2021 15:41:43 +0200 Subject: [PATCH 14/36] iw: sync nl80211 with kernel backports The nl80211 was out of sync with the version used in our backports. This broke the configuration of the antenna gain. Fixes: 2bfac61483db ("mac80211: backport support for BSS color changes") Signed-off-by: Hauke Mehrtens --- .../utils/iw/patches/001-nl80211_h_sync.patch | 69 +++++++++++++++---- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/package/network/utils/iw/patches/001-nl80211_h_sync.patch b/package/network/utils/iw/patches/001-nl80211_h_sync.patch index 1d6ea0fae0..2f724b61ff 100644 --- a/package/network/utils/iw/patches/001-nl80211_h_sync.patch +++ b/package/network/utils/iw/patches/001-nl80211_h_sync.patch @@ -20,27 +20,50 @@ * * @NL80211_CMD_SET_MULTICAST_TO_UNICAST: Configure if this AP should perform * multicast to unicast conversion. When enabled, all multicast packets -@@ -1177,6 +1181,10 @@ +@@ -1177,6 +1181,25 @@ * includes the contents of the frame. %NL80211_ATTR_ACK flag is included * if the recipient acknowledged the frame. * + * @NL80211_CMD_SET_SAR_SPECS: SAR power limitation configuration is + * passed using %NL80211_ATTR_SAR_SPEC. %NL80211_ATTR_WIPHY is used to + * specify the wiphy index to be applied to. ++ * ++ * @NL80211_CMD_OBSS_COLOR_COLLISION: This notification is sent out whenever ++ * mac80211/drv detects a bss color collision. ++ * ++ * @NL80211_CMD_COLOR_CHANGE_REQUEST: This command is used to indicate that ++ * userspace wants to change the BSS color. ++ * ++ * @NL80211_CMD_COLOR_CHANGE_STARTED: Notify userland, that a color change has ++ * started ++ * ++ * @NL80211_CMD_COLOR_CHANGE_ABORTED: Notify userland, that the color change has ++ * been aborted ++ * ++ * @NL80211_CMD_COLOR_CHANGE_COMPLETED: Notify userland that the color change ++ * has completed + * * @NL80211_CMD_MAX: highest used command number * @__NL80211_CMD_AFTER_LAST: internal use */ -@@ -1407,6 +1415,8 @@ enum nl80211_commands { +@@ -1407,6 +1430,16 @@ enum nl80211_commands { NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS, + NL80211_CMD_SET_SAR_SPECS, ++ ++ NL80211_CMD_OBSS_COLOR_COLLISION, ++ ++ NL80211_CMD_COLOR_CHANGE_REQUEST, ++ ++ NL80211_CMD_COLOR_CHANGE_STARTED, ++ NL80211_CMD_COLOR_CHANGE_ABORTED, ++ NL80211_CMD_COLOR_CHANGE_COMPLETED, + /* add new commands above here */ /* used to define NL80211_CMD_MAX below */ -@@ -1750,8 +1760,9 @@ enum nl80211_commands { +@@ -1750,8 +1783,9 @@ enum nl80211_commands { * specify just a single bitrate, which is to be used for the beacon. * The driver must also specify support for this with the extended * features NL80211_EXT_FEATURE_BEACON_RATE_LEGACY, @@ -52,7 +75,7 @@ * * @NL80211_ATTR_FRAME_MATCH: A binary attribute which typically must contain * at least one byte, currently used with @NL80211_CMD_REGISTER_FRAME. -@@ -1955,8 +1966,15 @@ enum nl80211_commands { +@@ -1955,8 +1989,15 @@ enum nl80211_commands { * @NL80211_ATTR_PROBE_RESP: Probe Response template data. Contains the entire * probe-response frame. The DA field in the 802.11 header is zero-ed out, * to be filled by the FW. @@ -70,7 +93,7 @@ * @NL80211_ATTR_HT_CAPABILITY_MASK: Specify which bits of the * ATTR_HT_CAPABILITY to which attention should be paid. * Currently, only mac80211 NICs support this feature. -@@ -2077,7 +2095,8 @@ enum nl80211_commands { +@@ -2077,7 +2118,8 @@ enum nl80211_commands { * until the channel switch event. * @NL80211_ATTR_CH_SWITCH_BLOCK_TX: flag attribute specifying that transmission * must be blocked on the current channel (before the channel switch @@ -80,7 +103,7 @@ * @NL80211_ATTR_CSA_IES: Nested set of attributes containing the IE information * for the time while performing a channel switch. * @NL80211_ATTR_CNTDWN_OFFS_BEACON: An array of offsets (u16) to the channel -@@ -2527,6 +2546,23 @@ enum nl80211_commands { +@@ -2527,6 +2569,33 @@ enum nl80211_commands { * override mask. Used with NL80211_ATTR_S1G_CAPABILITY in * NL80211_CMD_ASSOCIATE or NL80211_CMD_CONNECT. * @@ -98,13 +121,23 @@ + * disassoc events to indicate that an immediate reconnect to the AP + * is desired. + * ++ * @NL80211_ATTR_OBSS_COLOR_BITMAP: bitmap of the u64 BSS colors for the ++ * %NL80211_CMD_OBSS_COLOR_COLLISION event. ++ * ++ * @NL80211_ATTR_COLOR_CHANGE_COUNT: u8 attribute specifying the number of TBTT's ++ * until the color switch event. ++ * @NL80211_ATTR_COLOR_CHANGE_COLOR: u8 attribute specifying the color that we are ++ * switching to ++ * @NL80211_ATTR_COLOR_CHANGE_ELEMS: Nested set of attributes containing the IE ++ * information for the time while performing a color switch. ++ * + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce + * transmit power to stay within regulatory limits. u32, dBi. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use -@@ -3016,6 +3052,16 @@ enum nl80211_attrs { +@@ -3016,6 +3085,22 @@ enum nl80211_attrs { NL80211_ATTR_S1G_CAPABILITY, NL80211_ATTR_S1G_CAPABILITY_MASK, @@ -116,12 +149,18 @@ + + NL80211_ATTR_DISABLE_HE, + ++ NL80211_ATTR_OBSS_COLOR_BITMAP, ++ ++ NL80211_ATTR_COLOR_CHANGE_COUNT, ++ NL80211_ATTR_COLOR_CHANGE_COLOR, ++ NL80211_ATTR_COLOR_CHANGE_ELEMS, ++ + NL80211_ATTR_WIPHY_ANTENNA_GAIN, + /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST, -@@ -5896,6 +5942,19 @@ enum nl80211_feature_flags { +@@ -5896,6 +5981,22 @@ enum nl80211_feature_flags { * @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports * unsolicited broadcast probe response transmission * @@ -137,11 +176,14 @@ + * @NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE: Device supports management + * frame protection for all management frames exchanged during the + * negotiation and range measurement procedure. ++ * ++ * @NL80211_EXT_FEATURE_BSS_COLOR: The driver supports BSS color collision ++ * detection and change announcemnts. + * * @NUM_NL80211_EXT_FEATURES: number of extended features. * @MAX_NL80211_EXT_FEATURES: highest extended feature index. */ -@@ -5956,6 +6015,10 @@ enum nl80211_ext_feature_index { +@@ -5956,6 +6057,11 @@ enum nl80211_ext_feature_index { NL80211_EXT_FEATURE_SAE_OFFLOAD_AP, NL80211_EXT_FEATURE_FILS_DISCOVERY, NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP, @@ -149,10 +191,11 @@ + NL80211_EXT_FEATURE_SECURE_LTF, + NL80211_EXT_FEATURE_SECURE_RTT, + NL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE, ++ NL80211_EXT_FEATURE_BSS_COLOR, /* add new features before the definition below */ NUM_NL80211_EXT_FEATURES, -@@ -6253,11 +6316,13 @@ struct nl80211_vendor_cmd_info { +@@ -6253,11 +6359,13 @@ struct nl80211_vendor_cmd_info { * @NL80211_TDLS_PEER_HT: TDLS peer is HT capable. * @NL80211_TDLS_PEER_VHT: TDLS peer is VHT capable. * @NL80211_TDLS_PEER_WMM: TDLS peer is WMM capable. @@ -166,7 +209,7 @@ }; /** -@@ -6849,6 +6914,9 @@ enum nl80211_peer_measurement_ftm_capa { +@@ -6849,6 +6957,9 @@ enum nl80211_peer_measurement_ftm_capa { * if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor * %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based * ranging will be used. @@ -176,7 +219,7 @@ * * @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal * @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number -@@ -6867,6 +6935,7 @@ enum nl80211_peer_measurement_ftm_req { +@@ -6867,6 +6978,7 @@ enum nl80211_peer_measurement_ftm_req { NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC, NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED, NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED, @@ -184,7 +227,7 @@ /* keep last */ NUM_NL80211_PMSR_FTM_REQ_ATTR, -@@ -7124,4 +7193,115 @@ enum nl80211_unsol_bcast_probe_resp_attr +@@ -7124,4 +7236,115 @@ enum nl80211_unsol_bcast_probe_resp_attr NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX = __NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST - 1 }; From be3e260f92643a841f4f83b03cbb07b9a26cff66 Mon Sep 17 00:00:00 2001 From: Ivan Pavlov Date: Fri, 15 Oct 2021 08:11:10 +0300 Subject: [PATCH 15/36] wolfssl: fix compile when enable-devcrypto is set fixing linking error when --enable-devcrypto=yes fixes: 7d92bb050961 wolfssl: update to 4.8.1-stable Signed-off-by: Ivan Pavlov --- ...macro-guard-on-SHA256-transform-call.patch | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 package/libs/wolfssl/patches/002-Update-macro-guard-on-SHA256-transform-call.patch diff --git a/package/libs/wolfssl/patches/002-Update-macro-guard-on-SHA256-transform-call.patch b/package/libs/wolfssl/patches/002-Update-macro-guard-on-SHA256-transform-call.patch new file mode 100644 index 0000000000..f986b72798 --- /dev/null +++ b/package/libs/wolfssl/patches/002-Update-macro-guard-on-SHA256-transform-call.patch @@ -0,0 +1,22 @@ +From f447e4c1fa4c932c0286fa0331966756e243db81 Mon Sep 17 00:00:00 2001 +From: JacobBarthelmeh +Date: Fri, 17 Sep 2021 15:06:13 -0700 +Subject: [PATCH] update macro guard on SHA256 transform call + +--- + src/ssl.c | 3 ++- + tests/api.c | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +--- a/src/ssl.c ++++ b/src/ssl.c +@@ -17639,7 +17639,8 @@ size_t wolfSSL_get_client_random(const W + + #if defined(OPENSSL_EXTRA) + #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ +- (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) ++ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ ++ !defined(WOLFSSL_DEVCRYPTO_HASH) && !defined(WOLFSSL_AFALG_HASH) + /* Apply SHA256 transformation to the data */ + int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256, + const unsigned char* data) From 9ad3ef27b9ce75f1c5265976183375ee9678db99 Mon Sep 17 00:00:00 2001 From: John Audia Date: Wed, 13 Oct 2021 15:14:17 -0400 Subject: [PATCH 16/36] kernel: bump 5.4 to 5.4.153 Removed upstreamed: backport-5.4/070-v5.5-MIPS-BPF-Restore-MIPS32-cBPF-JIT.patch All other patches automatically rebased. Signed-off-by: John Audia --- include/kernel-version.mk | 4 +- ...5.5-MIPS-BPF-Restore-MIPS32-cBPF-JIT.patch | 1650 ----------------- ...ls1028a-Add-PCIe-controller-DT-nodes.patch | 2 +- ...m64-dts-fsl-ls1028a-add-flexcan-node.patch | 22 +- ...-0066-arm64-dts-ls1028a-add-gpu-node.patch | 4 +- ...64-dts-fsl-add-optee-node-for-ls1028.patch | 2 +- ...4-dts-ls1028a-Add-ftm_alarm0-DT-node.patch | 2 +- ...s1028a-Add-Felix-switch-port-DT-node.patch | 4 +- ...28a-support-Felix-PF5-INTB-interrupt.patch | 4 +- ...a-Add-ethernet-property-for-l2switch.patch | 4 +- ...078-arm64-dts-fix-endianness-of-rcpm.patch | 2 +- ...a-Fix-interrupt-map-property-of-PCIe.patch | 4 +- ...64-dts-ls1028a-fix-dwc-pci-over-smmu.patch | 4 +- ...a-Update-the-clock-providers-for-the.patch | 2 +- ...28a-Update-clock-cells-of-dpclk-node.patch | 2 +- ...a-Add-properties-for-HD-Display-cont.patch | 2 +- ...s-fsl-Specify-phy-mode-for-CPU-ports.patch | 4 +- ...op-compatible-string-from-Felix-swit.patch | 2 +- ...1028a-Specify-that-the-Felix-port-4-.patch | 2 +- ...1028a-Disable-eno3-and-make-swp5-the.patch | 8 +- ...-fsl-Add-clock-names-mclk0-for-SAI-n.patch | 6 +- ...cape-apply-dma-coherent-for-dwc3-nod.patch | 4 +- ...a-Update-edma-compatible-to-fit-eDMA.patch | 2 +- ...-dts-ls1028a-Disable-swp5-by-default.patch | 2 +- ...-fsl-ls1028a-prepare-dts-for-overlay.patch | 6 +- ...1028a-add-labels-to-Ethernet-switch-.patch | 2 +- 26 files changed, 51 insertions(+), 1701 deletions(-) delete mode 100644 target/linux/generic/backport-5.4/070-v5.5-MIPS-BPF-Restore-MIPS32-cBPF-JIT.patch diff --git a/include/kernel-version.mk b/include/kernel-version.mk index 734dbeda92..46aa185525 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -6,10 +6,10 @@ ifdef CONFIG_TESTING_KERNEL KERNEL_PATCHVER:=$(KERNEL_TESTING_PATCHVER) endif -LINUX_VERSION-5.4 = .152 +LINUX_VERSION-5.4 = .153 LINUX_VERSION-5.10 = .72 -LINUX_KERNEL_HASH-5.4.152 = 8044c7134c5eed21af9662f1c5399a5d8781b5bc2d8979e9ad06b4435a0a5ed5 +LINUX_KERNEL_HASH-5.4.153 = 6d9f07c9d611e5a7317eb6d5114880bad5c2dc1ac48d89f861b887d2f4295f49 LINUX_KERNEL_HASH-5.10.72 = b4d635afe7646ac6a6617c738e747ba0a6006675cd9735d18f672f8b1fba4c7c remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) diff --git a/target/linux/generic/backport-5.4/070-v5.5-MIPS-BPF-Restore-MIPS32-cBPF-JIT.patch b/target/linux/generic/backport-5.4/070-v5.5-MIPS-BPF-Restore-MIPS32-cBPF-JIT.patch deleted file mode 100644 index 027d0253a3..0000000000 --- a/target/linux/generic/backport-5.4/070-v5.5-MIPS-BPF-Restore-MIPS32-cBPF-JIT.patch +++ /dev/null @@ -1,1650 +0,0 @@ -From 36366e367ee93ced84fddb8fae6675e12985f5a4 Mon Sep 17 00:00:00 2001 -From: Paul Burton -Date: Thu, 5 Dec 2019 10:23:18 -0800 -Subject: [PATCH] MIPS: BPF: Restore MIPS32 cBPF JIT - -Commit 716850ab104d ("MIPS: eBPF: Initial eBPF support for MIPS32 -architecture.") enabled our eBPF JIT for MIPS32 kernels, whereas it has -previously only been availailable for MIPS64. It was my understanding at -the time that the BPF test suite was passing & JITing a comparable -number of tests to our cBPF JIT [1], but it turns out that was not the -case. - -The eBPF JIT has a number of problems on MIPS32: - -- Most notably various code paths still result in emission of MIPS64 - instructions which will cause reserved instruction exceptions & kernel - panics when run on MIPS32 CPUs. - -- The eBPF JIT doesn't account for differences between the O32 ABI used - by MIPS32 kernels versus the N64 ABI used by MIPS64 kernels. Notably - arguments beyond the first 4 are passed on the stack in O32, and this - is entirely unhandled when JITing a BPF_CALL instruction. Stack space - must be reserved for arguments even if they all fit in registers, and - the callee is free to assume that stack space has been reserved for - its use - with the eBPF JIT this is not the case, so calling any - function can result in clobbering values on the stack & unpredictable - behaviour. Function arguments in eBPF are always 64-bit values which - is also entirely unhandled - the JIT still uses a single (32-bit) - register per argument. As a result all function arguments are always - passed incorrectly when JITing a BPF_CALL instruction, leading to - kernel crashes or strange behavior. - -- The JIT attempts to bail our on use of ALU64 instructions or 64-bit - memory access instructions. The code doing this at the start of - build_one_insn() incorrectly checks whether BPF_OP() equals BPF_DW, - when it should really be checking BPF_SIZE() & only doing so when - BPF_CLASS() is one of BPF_{LD,LDX,ST,STX}. This results in false - positives that cause more bailouts than intended, and that in turns - hides some of the problems described above. - -- The kernel's cBPF->eBPF translation makes heavy use of 64-bit eBPF - instructions that the MIPS32 eBPF JIT bails out on, leading to most - cBPF programs not being JITed at all. - -Until these problems are resolved, revert the removal of the cBPF JIT -performed by commit 716850ab104d ("MIPS: eBPF: Initial eBPF support for -MIPS32 architecture."). Together with commit f8fffebdea75 ("MIPS: BPF: -Disable MIPS32 eBPF JIT") this restores MIPS32 BPF JIT behavior back to -the same state it was prior to the introduction of the broken eBPF JIT -support. - -[1] https://lore.kernel.org/linux-mips/MWHPR2201MB13583388481F01A422CE7D66D4410@MWHPR2201MB1358.namprd22.prod.outlook.com/ - -Signed-off-by: Paul Burton -Fixes: 716850ab104d ("MIPS: eBPF: Initial eBPF support for MIPS32 architecture.") -Cc: Daniel Borkmann -Cc: Hassan Naveed -Cc: Tony Ambardar -Cc: bpf@vger.kernel.org -Cc: netdev@vger.kernel.org -Cc: linux-mips@vger.kernel.org -Cc: linux-kernel@vger.kernel.org ---- - arch/mips/Kconfig | 1 + - arch/mips/net/Makefile | 1 + - arch/mips/net/bpf_jit.c | 1270 +++++++++++++++++++++++++++++++++++ - arch/mips/net/bpf_jit_asm.S | 285 ++++++++ - 4 files changed, 1557 insertions(+) - create mode 100644 arch/mips/net/bpf_jit.c - create mode 100644 arch/mips/net/bpf_jit_asm.S - ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -46,6 +46,7 @@ config MIPS - select HAVE_ARCH_TRACEHOOK - select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES - select HAVE_ASM_MODVERSIONS -+ select HAVE_CBPF_JIT if !64BIT && !CPU_MICROMIPS - select HAVE_EBPF_JIT if 64BIT && !CPU_MICROMIPS && TARGET_ISA_REV >= 2 - select HAVE_CONTEXT_TRACKING - select HAVE_COPY_THREAD_TLS ---- a/arch/mips/net/Makefile -+++ b/arch/mips/net/Makefile -@@ -1,4 +1,5 @@ - # SPDX-License-Identifier: GPL-2.0-only - # MIPS networking code - -+obj-$(CONFIG_MIPS_CBPF_JIT) += bpf_jit.o bpf_jit_asm.o - obj-$(CONFIG_MIPS_EBPF_JIT) += ebpf_jit.o ---- /dev/null -+++ b/arch/mips/net/bpf_jit.c -@@ -0,0 +1,1270 @@ -+/* -+ * Just-In-Time compiler for BPF filters on MIPS -+ * -+ * Copyright (c) 2014 Imagination Technologies Ltd. -+ * Author: Markos Chandras -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; version 2 of the License. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "bpf_jit.h" -+ -+/* ABI -+ * r_skb_hl SKB header length -+ * r_data SKB data pointer -+ * r_off Offset -+ * r_A BPF register A -+ * r_X BPF register X -+ * r_skb *skb -+ * r_M *scratch memory -+ * r_skb_len SKB length -+ * -+ * On entry (*bpf_func)(*skb, *filter) -+ * a0 = MIPS_R_A0 = skb; -+ * a1 = MIPS_R_A1 = filter; -+ * -+ * Stack -+ * ... -+ * M[15] -+ * M[14] -+ * M[13] -+ * ... -+ * M[0] <-- r_M -+ * saved reg k-1 -+ * saved reg k-2 -+ * ... -+ * saved reg 0 <-- r_sp -+ * -+ * -+ * Packet layout -+ * -+ * <--------------------- len ------------------------> -+ * <--skb-len(r_skb_hl)-->< ----- skb->data_len ------> -+ * ---------------------------------------------------- -+ * | skb->data | -+ * ---------------------------------------------------- -+ */ -+ -+#define ptr typeof(unsigned long) -+ -+#define SCRATCH_OFF(k) (4 * (k)) -+ -+/* JIT flags */ -+#define SEEN_CALL (1 << BPF_MEMWORDS) -+#define SEEN_SREG_SFT (BPF_MEMWORDS + 1) -+#define SEEN_SREG_BASE (1 << SEEN_SREG_SFT) -+#define SEEN_SREG(x) (SEEN_SREG_BASE << (x)) -+#define SEEN_OFF SEEN_SREG(2) -+#define SEEN_A SEEN_SREG(3) -+#define SEEN_X SEEN_SREG(4) -+#define SEEN_SKB SEEN_SREG(5) -+#define SEEN_MEM SEEN_SREG(6) -+/* SEEN_SK_DATA also implies skb_hl an skb_len */ -+#define SEEN_SKB_DATA (SEEN_SREG(7) | SEEN_SREG(1) | SEEN_SREG(0)) -+ -+/* Arguments used by JIT */ -+#define ARGS_USED_BY_JIT 2 /* only applicable to 64-bit */ -+ -+#define SBIT(x) (1 << (x)) /* Signed version of BIT() */ -+ -+/** -+ * struct jit_ctx - JIT context -+ * @skf: The sk_filter -+ * @prologue_bytes: Number of bytes for prologue -+ * @idx: Instruction index -+ * @flags: JIT flags -+ * @offsets: Instruction offsets -+ * @target: Memory location for the compiled filter -+ */ -+struct jit_ctx { -+ const struct bpf_prog *skf; -+ unsigned int prologue_bytes; -+ u32 idx; -+ u32 flags; -+ u32 *offsets; -+ u32 *target; -+}; -+ -+ -+static inline int optimize_div(u32 *k) -+{ -+ /* power of 2 divides can be implemented with right shift */ -+ if (!(*k & (*k-1))) { -+ *k = ilog2(*k); -+ return 1; -+ } -+ -+ return 0; -+} -+ -+static inline void emit_jit_reg_move(ptr dst, ptr src, struct jit_ctx *ctx); -+ -+/* Simply emit the instruction if the JIT memory space has been allocated */ -+#define emit_instr(ctx, func, ...) \ -+do { \ -+ if ((ctx)->target != NULL) { \ -+ u32 *p = &(ctx)->target[ctx->idx]; \ -+ uasm_i_##func(&p, ##__VA_ARGS__); \ -+ } \ -+ (ctx)->idx++; \ -+} while (0) -+ -+/* -+ * Similar to emit_instr but it must be used when we need to emit -+ * 32-bit or 64-bit instructions -+ */ -+#define emit_long_instr(ctx, func, ...) \ -+do { \ -+ if ((ctx)->target != NULL) { \ -+ u32 *p = &(ctx)->target[ctx->idx]; \ -+ UASM_i_##func(&p, ##__VA_ARGS__); \ -+ } \ -+ (ctx)->idx++; \ -+} while (0) -+ -+/* Determine if immediate is within the 16-bit signed range */ -+static inline bool is_range16(s32 imm) -+{ -+ return !(imm >= SBIT(15) || imm < -SBIT(15)); -+} -+ -+static inline void emit_addu(unsigned int dst, unsigned int src1, -+ unsigned int src2, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, addu, dst, src1, src2); -+} -+ -+static inline void emit_nop(struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, nop); -+} -+ -+/* Load a u32 immediate to a register */ -+static inline void emit_load_imm(unsigned int dst, u32 imm, struct jit_ctx *ctx) -+{ -+ if (ctx->target != NULL) { -+ /* addiu can only handle s16 */ -+ if (!is_range16(imm)) { -+ u32 *p = &ctx->target[ctx->idx]; -+ uasm_i_lui(&p, r_tmp_imm, (s32)imm >> 16); -+ p = &ctx->target[ctx->idx + 1]; -+ uasm_i_ori(&p, dst, r_tmp_imm, imm & 0xffff); -+ } else { -+ u32 *p = &ctx->target[ctx->idx]; -+ uasm_i_addiu(&p, dst, r_zero, imm); -+ } -+ } -+ ctx->idx++; -+ -+ if (!is_range16(imm)) -+ ctx->idx++; -+} -+ -+static inline void emit_or(unsigned int dst, unsigned int src1, -+ unsigned int src2, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, or, dst, src1, src2); -+} -+ -+static inline void emit_ori(unsigned int dst, unsigned src, u32 imm, -+ struct jit_ctx *ctx) -+{ -+ if (imm >= BIT(16)) { -+ emit_load_imm(r_tmp, imm, ctx); -+ emit_or(dst, src, r_tmp, ctx); -+ } else { -+ emit_instr(ctx, ori, dst, src, imm); -+ } -+} -+ -+static inline void emit_daddiu(unsigned int dst, unsigned int src, -+ int imm, struct jit_ctx *ctx) -+{ -+ /* -+ * Only used for stack, so the imm is relatively small -+ * and it fits in 15-bits -+ */ -+ emit_instr(ctx, daddiu, dst, src, imm); -+} -+ -+static inline void emit_addiu(unsigned int dst, unsigned int src, -+ u32 imm, struct jit_ctx *ctx) -+{ -+ if (!is_range16(imm)) { -+ emit_load_imm(r_tmp, imm, ctx); -+ emit_addu(dst, r_tmp, src, ctx); -+ } else { -+ emit_instr(ctx, addiu, dst, src, imm); -+ } -+} -+ -+static inline void emit_and(unsigned int dst, unsigned int src1, -+ unsigned int src2, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, and, dst, src1, src2); -+} -+ -+static inline void emit_andi(unsigned int dst, unsigned int src, -+ u32 imm, struct jit_ctx *ctx) -+{ -+ /* If imm does not fit in u16 then load it to register */ -+ if (imm >= BIT(16)) { -+ emit_load_imm(r_tmp, imm, ctx); -+ emit_and(dst, src, r_tmp, ctx); -+ } else { -+ emit_instr(ctx, andi, dst, src, imm); -+ } -+} -+ -+static inline void emit_xor(unsigned int dst, unsigned int src1, -+ unsigned int src2, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, xor, dst, src1, src2); -+} -+ -+static inline void emit_xori(ptr dst, ptr src, u32 imm, struct jit_ctx *ctx) -+{ -+ /* If imm does not fit in u16 then load it to register */ -+ if (imm >= BIT(16)) { -+ emit_load_imm(r_tmp, imm, ctx); -+ emit_xor(dst, src, r_tmp, ctx); -+ } else { -+ emit_instr(ctx, xori, dst, src, imm); -+ } -+} -+ -+static inline void emit_stack_offset(int offset, struct jit_ctx *ctx) -+{ -+ emit_long_instr(ctx, ADDIU, r_sp, r_sp, offset); -+} -+ -+static inline void emit_subu(unsigned int dst, unsigned int src1, -+ unsigned int src2, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, subu, dst, src1, src2); -+} -+ -+static inline void emit_neg(unsigned int reg, struct jit_ctx *ctx) -+{ -+ emit_subu(reg, r_zero, reg, ctx); -+} -+ -+static inline void emit_sllv(unsigned int dst, unsigned int src, -+ unsigned int sa, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, sllv, dst, src, sa); -+} -+ -+static inline void emit_sll(unsigned int dst, unsigned int src, -+ unsigned int sa, struct jit_ctx *ctx) -+{ -+ /* sa is 5-bits long */ -+ if (sa >= BIT(5)) -+ /* Shifting >= 32 results in zero */ -+ emit_jit_reg_move(dst, r_zero, ctx); -+ else -+ emit_instr(ctx, sll, dst, src, sa); -+} -+ -+static inline void emit_srlv(unsigned int dst, unsigned int src, -+ unsigned int sa, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, srlv, dst, src, sa); -+} -+ -+static inline void emit_srl(unsigned int dst, unsigned int src, -+ unsigned int sa, struct jit_ctx *ctx) -+{ -+ /* sa is 5-bits long */ -+ if (sa >= BIT(5)) -+ /* Shifting >= 32 results in zero */ -+ emit_jit_reg_move(dst, r_zero, ctx); -+ else -+ emit_instr(ctx, srl, dst, src, sa); -+} -+ -+static inline void emit_slt(unsigned int dst, unsigned int src1, -+ unsigned int src2, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, slt, dst, src1, src2); -+} -+ -+static inline void emit_sltu(unsigned int dst, unsigned int src1, -+ unsigned int src2, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, sltu, dst, src1, src2); -+} -+ -+static inline void emit_sltiu(unsigned dst, unsigned int src, -+ unsigned int imm, struct jit_ctx *ctx) -+{ -+ /* 16 bit immediate */ -+ if (!is_range16((s32)imm)) { -+ emit_load_imm(r_tmp, imm, ctx); -+ emit_sltu(dst, src, r_tmp, ctx); -+ } else { -+ emit_instr(ctx, sltiu, dst, src, imm); -+ } -+ -+} -+ -+/* Store register on the stack */ -+static inline void emit_store_stack_reg(ptr reg, ptr base, -+ unsigned int offset, -+ struct jit_ctx *ctx) -+{ -+ emit_long_instr(ctx, SW, reg, offset, base); -+} -+ -+static inline void emit_store(ptr reg, ptr base, unsigned int offset, -+ struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, sw, reg, offset, base); -+} -+ -+static inline void emit_load_stack_reg(ptr reg, ptr base, -+ unsigned int offset, -+ struct jit_ctx *ctx) -+{ -+ emit_long_instr(ctx, LW, reg, offset, base); -+} -+ -+static inline void emit_load(unsigned int reg, unsigned int base, -+ unsigned int offset, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, lw, reg, offset, base); -+} -+ -+static inline void emit_load_byte(unsigned int reg, unsigned int base, -+ unsigned int offset, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, lb, reg, offset, base); -+} -+ -+static inline void emit_half_load(unsigned int reg, unsigned int base, -+ unsigned int offset, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, lh, reg, offset, base); -+} -+ -+static inline void emit_half_load_unsigned(unsigned int reg, unsigned int base, -+ unsigned int offset, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, lhu, reg, offset, base); -+} -+ -+static inline void emit_mul(unsigned int dst, unsigned int src1, -+ unsigned int src2, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, mul, dst, src1, src2); -+} -+ -+static inline void emit_div(unsigned int dst, unsigned int src, -+ struct jit_ctx *ctx) -+{ -+ if (ctx->target != NULL) { -+ u32 *p = &ctx->target[ctx->idx]; -+ uasm_i_divu(&p, dst, src); -+ p = &ctx->target[ctx->idx + 1]; -+ uasm_i_mflo(&p, dst); -+ } -+ ctx->idx += 2; /* 2 insts */ -+} -+ -+static inline void emit_mod(unsigned int dst, unsigned int src, -+ struct jit_ctx *ctx) -+{ -+ if (ctx->target != NULL) { -+ u32 *p = &ctx->target[ctx->idx]; -+ uasm_i_divu(&p, dst, src); -+ p = &ctx->target[ctx->idx + 1]; -+ uasm_i_mfhi(&p, dst); -+ } -+ ctx->idx += 2; /* 2 insts */ -+} -+ -+static inline void emit_dsll(unsigned int dst, unsigned int src, -+ unsigned int sa, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, dsll, dst, src, sa); -+} -+ -+static inline void emit_dsrl32(unsigned int dst, unsigned int src, -+ unsigned int sa, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, dsrl32, dst, src, sa); -+} -+ -+static inline void emit_wsbh(unsigned int dst, unsigned int src, -+ struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, wsbh, dst, src); -+} -+ -+/* load pointer to register */ -+static inline void emit_load_ptr(unsigned int dst, unsigned int src, -+ int imm, struct jit_ctx *ctx) -+{ -+ /* src contains the base addr of the 32/64-pointer */ -+ emit_long_instr(ctx, LW, dst, imm, src); -+} -+ -+/* load a function pointer to register */ -+static inline void emit_load_func(unsigned int reg, ptr imm, -+ struct jit_ctx *ctx) -+{ -+ if (IS_ENABLED(CONFIG_64BIT)) { -+ /* At this point imm is always 64-bit */ -+ emit_load_imm(r_tmp, (u64)imm >> 32, ctx); -+ emit_dsll(r_tmp_imm, r_tmp, 16, ctx); /* left shift by 16 */ -+ emit_ori(r_tmp, r_tmp_imm, (imm >> 16) & 0xffff, ctx); -+ emit_dsll(r_tmp_imm, r_tmp, 16, ctx); /* left shift by 16 */ -+ emit_ori(reg, r_tmp_imm, imm & 0xffff, ctx); -+ } else { -+ emit_load_imm(reg, imm, ctx); -+ } -+} -+ -+/* Move to real MIPS register */ -+static inline void emit_reg_move(ptr dst, ptr src, struct jit_ctx *ctx) -+{ -+ emit_long_instr(ctx, ADDU, dst, src, r_zero); -+} -+ -+/* Move to JIT (32-bit) register */ -+static inline void emit_jit_reg_move(ptr dst, ptr src, struct jit_ctx *ctx) -+{ -+ emit_addu(dst, src, r_zero, ctx); -+} -+ -+/* Compute the immediate value for PC-relative branches. */ -+static inline u32 b_imm(unsigned int tgt, struct jit_ctx *ctx) -+{ -+ if (ctx->target == NULL) -+ return 0; -+ -+ /* -+ * We want a pc-relative branch. We only do forward branches -+ * so tgt is always after pc. tgt is the instruction offset -+ * we want to jump to. -+ -+ * Branch on MIPS: -+ * I: target_offset <- sign_extend(offset) -+ * I+1: PC += target_offset (delay slot) -+ * -+ * ctx->idx currently points to the branch instruction -+ * but the offset is added to the delay slot so we need -+ * to subtract 4. -+ */ -+ return ctx->offsets[tgt] - -+ (ctx->idx * 4 - ctx->prologue_bytes) - 4; -+} -+ -+static inline void emit_bcond(int cond, unsigned int reg1, unsigned int reg2, -+ unsigned int imm, struct jit_ctx *ctx) -+{ -+ if (ctx->target != NULL) { -+ u32 *p = &ctx->target[ctx->idx]; -+ -+ switch (cond) { -+ case MIPS_COND_EQ: -+ uasm_i_beq(&p, reg1, reg2, imm); -+ break; -+ case MIPS_COND_NE: -+ uasm_i_bne(&p, reg1, reg2, imm); -+ break; -+ case MIPS_COND_ALL: -+ uasm_i_b(&p, imm); -+ break; -+ default: -+ pr_warn("%s: Unhandled branch conditional: %d\n", -+ __func__, cond); -+ } -+ } -+ ctx->idx++; -+} -+ -+static inline void emit_b(unsigned int imm, struct jit_ctx *ctx) -+{ -+ emit_bcond(MIPS_COND_ALL, r_zero, r_zero, imm, ctx); -+} -+ -+static inline void emit_jalr(unsigned int link, unsigned int reg, -+ struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, jalr, link, reg); -+} -+ -+static inline void emit_jr(unsigned int reg, struct jit_ctx *ctx) -+{ -+ emit_instr(ctx, jr, reg); -+} -+ -+static inline u16 align_sp(unsigned int num) -+{ -+ /* Double word alignment for 32-bit, quadword for 64-bit */ -+ unsigned int align = IS_ENABLED(CONFIG_64BIT) ? 16 : 8; -+ num = (num + (align - 1)) & -align; -+ return num; -+} -+ -+static void save_bpf_jit_regs(struct jit_ctx *ctx, unsigned offset) -+{ -+ int i = 0, real_off = 0; -+ u32 sflags, tmp_flags; -+ -+ /* Adjust the stack pointer */ -+ if (offset) -+ emit_stack_offset(-align_sp(offset), ctx); -+ -+ tmp_flags = sflags = ctx->flags >> SEEN_SREG_SFT; -+ /* sflags is essentially a bitmap */ -+ while (tmp_flags) { -+ if ((sflags >> i) & 0x1) { -+ emit_store_stack_reg(MIPS_R_S0 + i, r_sp, real_off, -+ ctx); -+ real_off += SZREG; -+ } -+ i++; -+ tmp_flags >>= 1; -+ } -+ -+ /* save return address */ -+ if (ctx->flags & SEEN_CALL) { -+ emit_store_stack_reg(r_ra, r_sp, real_off, ctx); -+ real_off += SZREG; -+ } -+ -+ /* Setup r_M leaving the alignment gap if necessary */ -+ if (ctx->flags & SEEN_MEM) { -+ if (real_off % (SZREG * 2)) -+ real_off += SZREG; -+ emit_long_instr(ctx, ADDIU, r_M, r_sp, real_off); -+ } -+} -+ -+static void restore_bpf_jit_regs(struct jit_ctx *ctx, -+ unsigned int offset) -+{ -+ int i, real_off = 0; -+ u32 sflags, tmp_flags; -+ -+ tmp_flags = sflags = ctx->flags >> SEEN_SREG_SFT; -+ /* sflags is a bitmap */ -+ i = 0; -+ while (tmp_flags) { -+ if ((sflags >> i) & 0x1) { -+ emit_load_stack_reg(MIPS_R_S0 + i, r_sp, real_off, -+ ctx); -+ real_off += SZREG; -+ } -+ i++; -+ tmp_flags >>= 1; -+ } -+ -+ /* restore return address */ -+ if (ctx->flags & SEEN_CALL) -+ emit_load_stack_reg(r_ra, r_sp, real_off, ctx); -+ -+ /* Restore the sp and discard the scrach memory */ -+ if (offset) -+ emit_stack_offset(align_sp(offset), ctx); -+} -+ -+static unsigned int get_stack_depth(struct jit_ctx *ctx) -+{ -+ int sp_off = 0; -+ -+ -+ /* How may s* regs do we need to preserved? */ -+ sp_off += hweight32(ctx->flags >> SEEN_SREG_SFT) * SZREG; -+ -+ if (ctx->flags & SEEN_MEM) -+ sp_off += 4 * BPF_MEMWORDS; /* BPF_MEMWORDS are 32-bit */ -+ -+ if (ctx->flags & SEEN_CALL) -+ sp_off += SZREG; /* Space for our ra register */ -+ -+ return sp_off; -+} -+ -+static void build_prologue(struct jit_ctx *ctx) -+{ -+ int sp_off; -+ -+ /* Calculate the total offset for the stack pointer */ -+ sp_off = get_stack_depth(ctx); -+ save_bpf_jit_regs(ctx, sp_off); -+ -+ if (ctx->flags & SEEN_SKB) -+ emit_reg_move(r_skb, MIPS_R_A0, ctx); -+ -+ if (ctx->flags & SEEN_SKB_DATA) { -+ /* Load packet length */ -+ emit_load(r_skb_len, r_skb, offsetof(struct sk_buff, len), -+ ctx); -+ emit_load(r_tmp, r_skb, offsetof(struct sk_buff, data_len), -+ ctx); -+ /* Load the data pointer */ -+ emit_load_ptr(r_skb_data, r_skb, -+ offsetof(struct sk_buff, data), ctx); -+ /* Load the header length */ -+ emit_subu(r_skb_hl, r_skb_len, r_tmp, ctx); -+ } -+ -+ if (ctx->flags & SEEN_X) -+ emit_jit_reg_move(r_X, r_zero, ctx); -+ -+ /* -+ * Do not leak kernel data to userspace, we only need to clear -+ * r_A if it is ever used. In fact if it is never used, we -+ * will not save/restore it, so clearing it in this case would -+ * corrupt the state of the caller. -+ */ -+ if (bpf_needs_clear_a(&ctx->skf->insns[0]) && -+ (ctx->flags & SEEN_A)) -+ emit_jit_reg_move(r_A, r_zero, ctx); -+} -+ -+static void build_epilogue(struct jit_ctx *ctx) -+{ -+ unsigned int sp_off; -+ -+ /* Calculate the total offset for the stack pointer */ -+ -+ sp_off = get_stack_depth(ctx); -+ restore_bpf_jit_regs(ctx, sp_off); -+ -+ /* Return */ -+ emit_jr(r_ra, ctx); -+ emit_nop(ctx); -+} -+ -+#define CHOOSE_LOAD_FUNC(K, func) \ -+ ((int)K < 0 ? ((int)K >= SKF_LL_OFF ? func##_negative : func) : \ -+ func##_positive) -+ -+static int build_body(struct jit_ctx *ctx) -+{ -+ const struct bpf_prog *prog = ctx->skf; -+ const struct sock_filter *inst; -+ unsigned int i, off, condt; -+ u32 k, b_off __maybe_unused; -+ u8 (*sk_load_func)(unsigned long *skb, int offset); -+ -+ for (i = 0; i < prog->len; i++) { -+ u16 code; -+ -+ inst = &(prog->insns[i]); -+ pr_debug("%s: code->0x%02x, jt->0x%x, jf->0x%x, k->0x%x\n", -+ __func__, inst->code, inst->jt, inst->jf, inst->k); -+ k = inst->k; -+ code = bpf_anc_helper(inst); -+ -+ if (ctx->target == NULL) -+ ctx->offsets[i] = ctx->idx * 4; -+ -+ switch (code) { -+ case BPF_LD | BPF_IMM: -+ /* A <- k ==> li r_A, k */ -+ ctx->flags |= SEEN_A; -+ emit_load_imm(r_A, k, ctx); -+ break; -+ case BPF_LD | BPF_W | BPF_LEN: -+ BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, len) != 4); -+ /* A <- len ==> lw r_A, offset(skb) */ -+ ctx->flags |= SEEN_SKB | SEEN_A; -+ off = offsetof(struct sk_buff, len); -+ emit_load(r_A, r_skb, off, ctx); -+ break; -+ case BPF_LD | BPF_MEM: -+ /* A <- M[k] ==> lw r_A, offset(M) */ -+ ctx->flags |= SEEN_MEM | SEEN_A; -+ emit_load(r_A, r_M, SCRATCH_OFF(k), ctx); -+ break; -+ case BPF_LD | BPF_W | BPF_ABS: -+ /* A <- P[k:4] */ -+ sk_load_func = CHOOSE_LOAD_FUNC(k, sk_load_word); -+ goto load; -+ case BPF_LD | BPF_H | BPF_ABS: -+ /* A <- P[k:2] */ -+ sk_load_func = CHOOSE_LOAD_FUNC(k, sk_load_half); -+ goto load; -+ case BPF_LD | BPF_B | BPF_ABS: -+ /* A <- P[k:1] */ -+ sk_load_func = CHOOSE_LOAD_FUNC(k, sk_load_byte); -+load: -+ emit_load_imm(r_off, k, ctx); -+load_common: -+ ctx->flags |= SEEN_CALL | SEEN_OFF | -+ SEEN_SKB | SEEN_A | SEEN_SKB_DATA; -+ -+ emit_load_func(r_s0, (ptr)sk_load_func, ctx); -+ emit_reg_move(MIPS_R_A0, r_skb, ctx); -+ emit_jalr(MIPS_R_RA, r_s0, ctx); -+ /* Load second argument to delay slot */ -+ emit_reg_move(MIPS_R_A1, r_off, ctx); -+ /* Check the error value */ -+ emit_bcond(MIPS_COND_EQ, r_ret, 0, b_imm(i + 1, ctx), -+ ctx); -+ /* Load return register on DS for failures */ -+ emit_reg_move(r_ret, r_zero, ctx); -+ /* Return with error */ -+ emit_b(b_imm(prog->len, ctx), ctx); -+ emit_nop(ctx); -+ break; -+ case BPF_LD | BPF_W | BPF_IND: -+ /* A <- P[X + k:4] */ -+ sk_load_func = sk_load_word; -+ goto load_ind; -+ case BPF_LD | BPF_H | BPF_IND: -+ /* A <- P[X + k:2] */ -+ sk_load_func = sk_load_half; -+ goto load_ind; -+ case BPF_LD | BPF_B | BPF_IND: -+ /* A <- P[X + k:1] */ -+ sk_load_func = sk_load_byte; -+load_ind: -+ ctx->flags |= SEEN_OFF | SEEN_X; -+ emit_addiu(r_off, r_X, k, ctx); -+ goto load_common; -+ case BPF_LDX | BPF_IMM: -+ /* X <- k */ -+ ctx->flags |= SEEN_X; -+ emit_load_imm(r_X, k, ctx); -+ break; -+ case BPF_LDX | BPF_MEM: -+ /* X <- M[k] */ -+ ctx->flags |= SEEN_X | SEEN_MEM; -+ emit_load(r_X, r_M, SCRATCH_OFF(k), ctx); -+ break; -+ case BPF_LDX | BPF_W | BPF_LEN: -+ /* X <- len */ -+ ctx->flags |= SEEN_X | SEEN_SKB; -+ off = offsetof(struct sk_buff, len); -+ emit_load(r_X, r_skb, off, ctx); -+ break; -+ case BPF_LDX | BPF_B | BPF_MSH: -+ /* X <- 4 * (P[k:1] & 0xf) */ -+ ctx->flags |= SEEN_X | SEEN_CALL | SEEN_SKB; -+ /* Load offset to a1 */ -+ emit_load_func(r_s0, (ptr)sk_load_byte, ctx); -+ /* -+ * This may emit two instructions so it may not fit -+ * in the delay slot. So use a0 in the delay slot. -+ */ -+ emit_load_imm(MIPS_R_A1, k, ctx); -+ emit_jalr(MIPS_R_RA, r_s0, ctx); -+ emit_reg_move(MIPS_R_A0, r_skb, ctx); /* delay slot */ -+ /* Check the error value */ -+ emit_bcond(MIPS_COND_NE, r_ret, 0, -+ b_imm(prog->len, ctx), ctx); -+ emit_reg_move(r_ret, r_zero, ctx); -+ /* We are good */ -+ /* X <- P[1:K] & 0xf */ -+ emit_andi(r_X, r_A, 0xf, ctx); -+ /* X << 2 */ -+ emit_b(b_imm(i + 1, ctx), ctx); -+ emit_sll(r_X, r_X, 2, ctx); /* delay slot */ -+ break; -+ case BPF_ST: -+ /* M[k] <- A */ -+ ctx->flags |= SEEN_MEM | SEEN_A; -+ emit_store(r_A, r_M, SCRATCH_OFF(k), ctx); -+ break; -+ case BPF_STX: -+ /* M[k] <- X */ -+ ctx->flags |= SEEN_MEM | SEEN_X; -+ emit_store(r_X, r_M, SCRATCH_OFF(k), ctx); -+ break; -+ case BPF_ALU | BPF_ADD | BPF_K: -+ /* A += K */ -+ ctx->flags |= SEEN_A; -+ emit_addiu(r_A, r_A, k, ctx); -+ break; -+ case BPF_ALU | BPF_ADD | BPF_X: -+ /* A += X */ -+ ctx->flags |= SEEN_A | SEEN_X; -+ emit_addu(r_A, r_A, r_X, ctx); -+ break; -+ case BPF_ALU | BPF_SUB | BPF_K: -+ /* A -= K */ -+ ctx->flags |= SEEN_A; -+ emit_addiu(r_A, r_A, -k, ctx); -+ break; -+ case BPF_ALU | BPF_SUB | BPF_X: -+ /* A -= X */ -+ ctx->flags |= SEEN_A | SEEN_X; -+ emit_subu(r_A, r_A, r_X, ctx); -+ break; -+ case BPF_ALU | BPF_MUL | BPF_K: -+ /* A *= K */ -+ /* Load K to scratch register before MUL */ -+ ctx->flags |= SEEN_A; -+ emit_load_imm(r_s0, k, ctx); -+ emit_mul(r_A, r_A, r_s0, ctx); -+ break; -+ case BPF_ALU | BPF_MUL | BPF_X: -+ /* A *= X */ -+ ctx->flags |= SEEN_A | SEEN_X; -+ emit_mul(r_A, r_A, r_X, ctx); -+ break; -+ case BPF_ALU | BPF_DIV | BPF_K: -+ /* A /= k */ -+ if (k == 1) -+ break; -+ if (optimize_div(&k)) { -+ ctx->flags |= SEEN_A; -+ emit_srl(r_A, r_A, k, ctx); -+ break; -+ } -+ ctx->flags |= SEEN_A; -+ emit_load_imm(r_s0, k, ctx); -+ emit_div(r_A, r_s0, ctx); -+ break; -+ case BPF_ALU | BPF_MOD | BPF_K: -+ /* A %= k */ -+ if (k == 1) { -+ ctx->flags |= SEEN_A; -+ emit_jit_reg_move(r_A, r_zero, ctx); -+ } else { -+ ctx->flags |= SEEN_A; -+ emit_load_imm(r_s0, k, ctx); -+ emit_mod(r_A, r_s0, ctx); -+ } -+ break; -+ case BPF_ALU | BPF_DIV | BPF_X: -+ /* A /= X */ -+ ctx->flags |= SEEN_X | SEEN_A; -+ /* Check if r_X is zero */ -+ emit_bcond(MIPS_COND_EQ, r_X, r_zero, -+ b_imm(prog->len, ctx), ctx); -+ emit_load_imm(r_ret, 0, ctx); /* delay slot */ -+ emit_div(r_A, r_X, ctx); -+ break; -+ case BPF_ALU | BPF_MOD | BPF_X: -+ /* A %= X */ -+ ctx->flags |= SEEN_X | SEEN_A; -+ /* Check if r_X is zero */ -+ emit_bcond(MIPS_COND_EQ, r_X, r_zero, -+ b_imm(prog->len, ctx), ctx); -+ emit_load_imm(r_ret, 0, ctx); /* delay slot */ -+ emit_mod(r_A, r_X, ctx); -+ break; -+ case BPF_ALU | BPF_OR | BPF_K: -+ /* A |= K */ -+ ctx->flags |= SEEN_A; -+ emit_ori(r_A, r_A, k, ctx); -+ break; -+ case BPF_ALU | BPF_OR | BPF_X: -+ /* A |= X */ -+ ctx->flags |= SEEN_A; -+ emit_ori(r_A, r_A, r_X, ctx); -+ break; -+ case BPF_ALU | BPF_XOR | BPF_K: -+ /* A ^= k */ -+ ctx->flags |= SEEN_A; -+ emit_xori(r_A, r_A, k, ctx); -+ break; -+ case BPF_ANC | SKF_AD_ALU_XOR_X: -+ case BPF_ALU | BPF_XOR | BPF_X: -+ /* A ^= X */ -+ ctx->flags |= SEEN_A; -+ emit_xor(r_A, r_A, r_X, ctx); -+ break; -+ case BPF_ALU | BPF_AND | BPF_K: -+ /* A &= K */ -+ ctx->flags |= SEEN_A; -+ emit_andi(r_A, r_A, k, ctx); -+ break; -+ case BPF_ALU | BPF_AND | BPF_X: -+ /* A &= X */ -+ ctx->flags |= SEEN_A | SEEN_X; -+ emit_and(r_A, r_A, r_X, ctx); -+ break; -+ case BPF_ALU | BPF_LSH | BPF_K: -+ /* A <<= K */ -+ ctx->flags |= SEEN_A; -+ emit_sll(r_A, r_A, k, ctx); -+ break; -+ case BPF_ALU | BPF_LSH | BPF_X: -+ /* A <<= X */ -+ ctx->flags |= SEEN_A | SEEN_X; -+ emit_sllv(r_A, r_A, r_X, ctx); -+ break; -+ case BPF_ALU | BPF_RSH | BPF_K: -+ /* A >>= K */ -+ ctx->flags |= SEEN_A; -+ emit_srl(r_A, r_A, k, ctx); -+ break; -+ case BPF_ALU | BPF_RSH | BPF_X: -+ ctx->flags |= SEEN_A | SEEN_X; -+ emit_srlv(r_A, r_A, r_X, ctx); -+ break; -+ case BPF_ALU | BPF_NEG: -+ /* A = -A */ -+ ctx->flags |= SEEN_A; -+ emit_neg(r_A, ctx); -+ break; -+ case BPF_JMP | BPF_JA: -+ /* pc += K */ -+ emit_b(b_imm(i + k + 1, ctx), ctx); -+ emit_nop(ctx); -+ break; -+ case BPF_JMP | BPF_JEQ | BPF_K: -+ /* pc += ( A == K ) ? pc->jt : pc->jf */ -+ condt = MIPS_COND_EQ | MIPS_COND_K; -+ goto jmp_cmp; -+ case BPF_JMP | BPF_JEQ | BPF_X: -+ ctx->flags |= SEEN_X; -+ /* pc += ( A == X ) ? pc->jt : pc->jf */ -+ condt = MIPS_COND_EQ | MIPS_COND_X; -+ goto jmp_cmp; -+ case BPF_JMP | BPF_JGE | BPF_K: -+ /* pc += ( A >= K ) ? pc->jt : pc->jf */ -+ condt = MIPS_COND_GE | MIPS_COND_K; -+ goto jmp_cmp; -+ case BPF_JMP | BPF_JGE | BPF_X: -+ ctx->flags |= SEEN_X; -+ /* pc += ( A >= X ) ? pc->jt : pc->jf */ -+ condt = MIPS_COND_GE | MIPS_COND_X; -+ goto jmp_cmp; -+ case BPF_JMP | BPF_JGT | BPF_K: -+ /* pc += ( A > K ) ? pc->jt : pc->jf */ -+ condt = MIPS_COND_GT | MIPS_COND_K; -+ goto jmp_cmp; -+ case BPF_JMP | BPF_JGT | BPF_X: -+ ctx->flags |= SEEN_X; -+ /* pc += ( A > X ) ? pc->jt : pc->jf */ -+ condt = MIPS_COND_GT | MIPS_COND_X; -+jmp_cmp: -+ /* Greater or Equal */ -+ if ((condt & MIPS_COND_GE) || -+ (condt & MIPS_COND_GT)) { -+ if (condt & MIPS_COND_K) { /* K */ -+ ctx->flags |= SEEN_A; -+ emit_sltiu(r_s0, r_A, k, ctx); -+ } else { /* X */ -+ ctx->flags |= SEEN_A | -+ SEEN_X; -+ emit_sltu(r_s0, r_A, r_X, ctx); -+ } -+ /* A < (K|X) ? r_scrach = 1 */ -+ b_off = b_imm(i + inst->jf + 1, ctx); -+ emit_bcond(MIPS_COND_NE, r_s0, r_zero, b_off, -+ ctx); -+ emit_nop(ctx); -+ /* A > (K|X) ? scratch = 0 */ -+ if (condt & MIPS_COND_GT) { -+ /* Checking for equality */ -+ ctx->flags |= SEEN_A | SEEN_X; -+ if (condt & MIPS_COND_K) -+ emit_load_imm(r_s0, k, ctx); -+ else -+ emit_jit_reg_move(r_s0, r_X, -+ ctx); -+ b_off = b_imm(i + inst->jf + 1, ctx); -+ emit_bcond(MIPS_COND_EQ, r_A, r_s0, -+ b_off, ctx); -+ emit_nop(ctx); -+ /* Finally, A > K|X */ -+ b_off = b_imm(i + inst->jt + 1, ctx); -+ emit_b(b_off, ctx); -+ emit_nop(ctx); -+ } else { -+ /* A >= (K|X) so jump */ -+ b_off = b_imm(i + inst->jt + 1, ctx); -+ emit_b(b_off, ctx); -+ emit_nop(ctx); -+ } -+ } else { -+ /* A == K|X */ -+ if (condt & MIPS_COND_K) { /* K */ -+ ctx->flags |= SEEN_A; -+ emit_load_imm(r_s0, k, ctx); -+ /* jump true */ -+ b_off = b_imm(i + inst->jt + 1, ctx); -+ emit_bcond(MIPS_COND_EQ, r_A, r_s0, -+ b_off, ctx); -+ emit_nop(ctx); -+ /* jump false */ -+ b_off = b_imm(i + inst->jf + 1, -+ ctx); -+ emit_bcond(MIPS_COND_NE, r_A, r_s0, -+ b_off, ctx); -+ emit_nop(ctx); -+ } else { /* X */ -+ /* jump true */ -+ ctx->flags |= SEEN_A | SEEN_X; -+ b_off = b_imm(i + inst->jt + 1, -+ ctx); -+ emit_bcond(MIPS_COND_EQ, r_A, r_X, -+ b_off, ctx); -+ emit_nop(ctx); -+ /* jump false */ -+ b_off = b_imm(i + inst->jf + 1, ctx); -+ emit_bcond(MIPS_COND_NE, r_A, r_X, -+ b_off, ctx); -+ emit_nop(ctx); -+ } -+ } -+ break; -+ case BPF_JMP | BPF_JSET | BPF_K: -+ ctx->flags |= SEEN_A; -+ /* pc += (A & K) ? pc -> jt : pc -> jf */ -+ emit_load_imm(r_s1, k, ctx); -+ emit_and(r_s0, r_A, r_s1, ctx); -+ /* jump true */ -+ b_off = b_imm(i + inst->jt + 1, ctx); -+ emit_bcond(MIPS_COND_NE, r_s0, r_zero, b_off, ctx); -+ emit_nop(ctx); -+ /* jump false */ -+ b_off = b_imm(i + inst->jf + 1, ctx); -+ emit_b(b_off, ctx); -+ emit_nop(ctx); -+ break; -+ case BPF_JMP | BPF_JSET | BPF_X: -+ ctx->flags |= SEEN_X | SEEN_A; -+ /* pc += (A & X) ? pc -> jt : pc -> jf */ -+ emit_and(r_s0, r_A, r_X, ctx); -+ /* jump true */ -+ b_off = b_imm(i + inst->jt + 1, ctx); -+ emit_bcond(MIPS_COND_NE, r_s0, r_zero, b_off, ctx); -+ emit_nop(ctx); -+ /* jump false */ -+ b_off = b_imm(i + inst->jf + 1, ctx); -+ emit_b(b_off, ctx); -+ emit_nop(ctx); -+ break; -+ case BPF_RET | BPF_A: -+ ctx->flags |= SEEN_A; -+ if (i != prog->len - 1) -+ /* -+ * If this is not the last instruction -+ * then jump to the epilogue -+ */ -+ emit_b(b_imm(prog->len, ctx), ctx); -+ emit_reg_move(r_ret, r_A, ctx); /* delay slot */ -+ break; -+ case BPF_RET | BPF_K: -+ /* -+ * It can emit two instructions so it does not fit on -+ * the delay slot. -+ */ -+ emit_load_imm(r_ret, k, ctx); -+ if (i != prog->len - 1) { -+ /* -+ * If this is not the last instruction -+ * then jump to the epilogue -+ */ -+ emit_b(b_imm(prog->len, ctx), ctx); -+ emit_nop(ctx); -+ } -+ break; -+ case BPF_MISC | BPF_TAX: -+ /* X = A */ -+ ctx->flags |= SEEN_X | SEEN_A; -+ emit_jit_reg_move(r_X, r_A, ctx); -+ break; -+ case BPF_MISC | BPF_TXA: -+ /* A = X */ -+ ctx->flags |= SEEN_A | SEEN_X; -+ emit_jit_reg_move(r_A, r_X, ctx); -+ break; -+ /* AUX */ -+ case BPF_ANC | SKF_AD_PROTOCOL: -+ /* A = ntohs(skb->protocol */ -+ ctx->flags |= SEEN_SKB | SEEN_OFF | SEEN_A; -+ BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, -+ protocol) != 2); -+ off = offsetof(struct sk_buff, protocol); -+ emit_half_load(r_A, r_skb, off, ctx); -+#ifdef CONFIG_CPU_LITTLE_ENDIAN -+ /* This needs little endian fixup */ -+ if (cpu_has_wsbh) { -+ /* R2 and later have the wsbh instruction */ -+ emit_wsbh(r_A, r_A, ctx); -+ } else { -+ /* Get first byte */ -+ emit_andi(r_tmp_imm, r_A, 0xff, ctx); -+ /* Shift it */ -+ emit_sll(r_tmp, r_tmp_imm, 8, ctx); -+ /* Get second byte */ -+ emit_srl(r_tmp_imm, r_A, 8, ctx); -+ emit_andi(r_tmp_imm, r_tmp_imm, 0xff, ctx); -+ /* Put everyting together in r_A */ -+ emit_or(r_A, r_tmp, r_tmp_imm, ctx); -+ } -+#endif -+ break; -+ case BPF_ANC | SKF_AD_CPU: -+ ctx->flags |= SEEN_A | SEEN_OFF; -+ /* A = current_thread_info()->cpu */ -+ BUILD_BUG_ON(FIELD_SIZEOF(struct thread_info, -+ cpu) != 4); -+ off = offsetof(struct thread_info, cpu); -+ /* $28/gp points to the thread_info struct */ -+ emit_load(r_A, 28, off, ctx); -+ break; -+ case BPF_ANC | SKF_AD_IFINDEX: -+ /* A = skb->dev->ifindex */ -+ case BPF_ANC | SKF_AD_HATYPE: -+ /* A = skb->dev->type */ -+ ctx->flags |= SEEN_SKB | SEEN_A; -+ off = offsetof(struct sk_buff, dev); -+ /* Load *dev pointer */ -+ emit_load_ptr(r_s0, r_skb, off, ctx); -+ /* error (0) in the delay slot */ -+ emit_bcond(MIPS_COND_EQ, r_s0, r_zero, -+ b_imm(prog->len, ctx), ctx); -+ emit_reg_move(r_ret, r_zero, ctx); -+ if (code == (BPF_ANC | SKF_AD_IFINDEX)) { -+ BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, ifindex) != 4); -+ off = offsetof(struct net_device, ifindex); -+ emit_load(r_A, r_s0, off, ctx); -+ } else { /* (code == (BPF_ANC | SKF_AD_HATYPE) */ -+ BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, type) != 2); -+ off = offsetof(struct net_device, type); -+ emit_half_load_unsigned(r_A, r_s0, off, ctx); -+ } -+ break; -+ case BPF_ANC | SKF_AD_MARK: -+ ctx->flags |= SEEN_SKB | SEEN_A; -+ BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4); -+ off = offsetof(struct sk_buff, mark); -+ emit_load(r_A, r_skb, off, ctx); -+ break; -+ case BPF_ANC | SKF_AD_RXHASH: -+ ctx->flags |= SEEN_SKB | SEEN_A; -+ BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, hash) != 4); -+ off = offsetof(struct sk_buff, hash); -+ emit_load(r_A, r_skb, off, ctx); -+ break; -+ case BPF_ANC | SKF_AD_VLAN_TAG: -+ ctx->flags |= SEEN_SKB | SEEN_A; -+ BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, -+ vlan_tci) != 2); -+ off = offsetof(struct sk_buff, vlan_tci); -+ emit_half_load_unsigned(r_A, r_skb, off, ctx); -+ break; -+ case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT: -+ ctx->flags |= SEEN_SKB | SEEN_A; -+ emit_load_byte(r_A, r_skb, PKT_VLAN_PRESENT_OFFSET(), ctx); -+ if (PKT_VLAN_PRESENT_BIT) -+ emit_srl(r_A, r_A, PKT_VLAN_PRESENT_BIT, ctx); -+ if (PKT_VLAN_PRESENT_BIT < 7) -+ emit_andi(r_A, r_A, 1, ctx); -+ break; -+ case BPF_ANC | SKF_AD_PKTTYPE: -+ ctx->flags |= SEEN_SKB; -+ -+ emit_load_byte(r_tmp, r_skb, PKT_TYPE_OFFSET(), ctx); -+ /* Keep only the last 3 bits */ -+ emit_andi(r_A, r_tmp, PKT_TYPE_MAX, ctx); -+#ifdef __BIG_ENDIAN_BITFIELD -+ /* Get the actual packet type to the lower 3 bits */ -+ emit_srl(r_A, r_A, 5, ctx); -+#endif -+ break; -+ case BPF_ANC | SKF_AD_QUEUE: -+ ctx->flags |= SEEN_SKB | SEEN_A; -+ BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, -+ queue_mapping) != 2); -+ BUILD_BUG_ON(offsetof(struct sk_buff, -+ queue_mapping) > 0xff); -+ off = offsetof(struct sk_buff, queue_mapping); -+ emit_half_load_unsigned(r_A, r_skb, off, ctx); -+ break; -+ default: -+ pr_debug("%s: Unhandled opcode: 0x%02x\n", __FILE__, -+ inst->code); -+ return -1; -+ } -+ } -+ -+ /* compute offsets only during the first pass */ -+ if (ctx->target == NULL) -+ ctx->offsets[i] = ctx->idx * 4; -+ -+ return 0; -+} -+ -+void bpf_jit_compile(struct bpf_prog *fp) -+{ -+ struct jit_ctx ctx; -+ unsigned int alloc_size, tmp_idx; -+ -+ if (!bpf_jit_enable) -+ return; -+ -+ memset(&ctx, 0, sizeof(ctx)); -+ -+ ctx.offsets = kcalloc(fp->len + 1, sizeof(*ctx.offsets), GFP_KERNEL); -+ if (ctx.offsets == NULL) -+ return; -+ -+ ctx.skf = fp; -+ -+ if (build_body(&ctx)) -+ goto out; -+ -+ tmp_idx = ctx.idx; -+ build_prologue(&ctx); -+ ctx.prologue_bytes = (ctx.idx - tmp_idx) * 4; -+ /* just to complete the ctx.idx count */ -+ build_epilogue(&ctx); -+ -+ alloc_size = 4 * ctx.idx; -+ ctx.target = module_alloc(alloc_size); -+ if (ctx.target == NULL) -+ goto out; -+ -+ /* Clean it */ -+ memset(ctx.target, 0, alloc_size); -+ -+ ctx.idx = 0; -+ -+ /* Generate the actual JIT code */ -+ build_prologue(&ctx); -+ build_body(&ctx); -+ build_epilogue(&ctx); -+ -+ /* Update the icache */ -+ flush_icache_range((ptr)ctx.target, (ptr)(ctx.target + ctx.idx)); -+ -+ if (bpf_jit_enable > 1) -+ /* Dump JIT code */ -+ bpf_jit_dump(fp->len, alloc_size, 2, ctx.target); -+ -+ fp->bpf_func = (void *)ctx.target; -+ fp->jited = 1; -+ -+out: -+ kfree(ctx.offsets); -+} -+ -+void bpf_jit_free(struct bpf_prog *fp) -+{ -+ if (fp->jited) -+ module_memfree(fp->bpf_func); -+ -+ bpf_prog_unlock_free(fp); -+} ---- /dev/null -+++ b/arch/mips/net/bpf_jit_asm.S -@@ -0,0 +1,285 @@ -+/* -+ * bpf_jib_asm.S: Packet/header access helper functions for MIPS/MIPS64 BPF -+ * compiler. -+ * -+ * Copyright (C) 2015 Imagination Technologies Ltd. -+ * Author: Markos Chandras -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; version 2 of the License. -+ */ -+ -+#include -+#include -+#include -+#include "bpf_jit.h" -+ -+/* ABI -+ * -+ * r_skb_hl skb header length -+ * r_skb_data skb data -+ * r_off(a1) offset register -+ * r_A BPF register A -+ * r_X PF register X -+ * r_skb(a0) *skb -+ * r_M *scratch memory -+ * r_skb_le skb length -+ * r_s0 Scratch register 0 -+ * r_s1 Scratch register 1 -+ * -+ * On entry: -+ * a0: *skb -+ * a1: offset (imm or imm + X) -+ * -+ * All non-BPF-ABI registers are free for use. On return, we only -+ * care about r_ret. The BPF-ABI registers are assumed to remain -+ * unmodified during the entire filter operation. -+ */ -+ -+#define skb a0 -+#define offset a1 -+#define SKF_LL_OFF (-0x200000) /* Can't include linux/filter.h in assembly */ -+ -+ /* We know better :) so prevent assembler reordering etc */ -+ .set noreorder -+ -+#define is_offset_negative(TYPE) \ -+ /* If offset is negative we have more work to do */ \ -+ slti t0, offset, 0; \ -+ bgtz t0, bpf_slow_path_##TYPE##_neg; \ -+ /* Be careful what follows in DS. */ -+ -+#define is_offset_in_header(SIZE, TYPE) \ -+ /* Reading from header? */ \ -+ addiu $r_s0, $r_skb_hl, -SIZE; \ -+ slt t0, $r_s0, offset; \ -+ bgtz t0, bpf_slow_path_##TYPE; \ -+ -+LEAF(sk_load_word) -+ is_offset_negative(word) -+FEXPORT(sk_load_word_positive) -+ is_offset_in_header(4, word) -+ /* Offset within header boundaries */ -+ PTR_ADDU t1, $r_skb_data, offset -+ .set reorder -+ lw $r_A, 0(t1) -+ .set noreorder -+#ifdef CONFIG_CPU_LITTLE_ENDIAN -+# if MIPS_ISA_REV >= 2 -+ wsbh t0, $r_A -+ rotr $r_A, t0, 16 -+# else -+ sll t0, $r_A, 24 -+ srl t1, $r_A, 24 -+ srl t2, $r_A, 8 -+ or t0, t0, t1 -+ andi t2, t2, 0xff00 -+ andi t1, $r_A, 0xff00 -+ or t0, t0, t2 -+ sll t1, t1, 8 -+ or $r_A, t0, t1 -+# endif -+#endif -+ jr $r_ra -+ move $r_ret, zero -+ END(sk_load_word) -+ -+LEAF(sk_load_half) -+ is_offset_negative(half) -+FEXPORT(sk_load_half_positive) -+ is_offset_in_header(2, half) -+ /* Offset within header boundaries */ -+ PTR_ADDU t1, $r_skb_data, offset -+ lhu $r_A, 0(t1) -+#ifdef CONFIG_CPU_LITTLE_ENDIAN -+# if MIPS_ISA_REV >= 2 -+ wsbh $r_A, $r_A -+# else -+ sll t0, $r_A, 8 -+ srl t1, $r_A, 8 -+ andi t0, t0, 0xff00 -+ or $r_A, t0, t1 -+# endif -+#endif -+ jr $r_ra -+ move $r_ret, zero -+ END(sk_load_half) -+ -+LEAF(sk_load_byte) -+ is_offset_negative(byte) -+FEXPORT(sk_load_byte_positive) -+ is_offset_in_header(1, byte) -+ /* Offset within header boundaries */ -+ PTR_ADDU t1, $r_skb_data, offset -+ lbu $r_A, 0(t1) -+ jr $r_ra -+ move $r_ret, zero -+ END(sk_load_byte) -+ -+/* -+ * call skb_copy_bits: -+ * (prototype in linux/skbuff.h) -+ * -+ * int skb_copy_bits(sk_buff *skb, int offset, void *to, int len) -+ * -+ * o32 mandates we leave 4 spaces for argument registers in case -+ * the callee needs to use them. Even though we don't care about -+ * the argument registers ourselves, we need to allocate that space -+ * to remain ABI compliant since the callee may want to use that space. -+ * We also allocate 2 more spaces for $r_ra and our return register (*to). -+ * -+ * n64 is a bit different. The *caller* will allocate the space to preserve -+ * the arguments. So in 64-bit kernels, we allocate the 4-arg space for no -+ * good reason but it does not matter that much really. -+ * -+ * (void *to) is returned in r_s0 -+ * -+ */ -+#ifdef CONFIG_CPU_LITTLE_ENDIAN -+#define DS_OFFSET(SIZE) (4 * SZREG) -+#else -+#define DS_OFFSET(SIZE) ((4 * SZREG) + (4 - SIZE)) -+#endif -+#define bpf_slow_path_common(SIZE) \ -+ /* Quick check. Are we within reasonable boundaries? */ \ -+ LONG_ADDIU $r_s1, $r_skb_len, -SIZE; \ -+ sltu $r_s0, offset, $r_s1; \ -+ beqz $r_s0, fault; \ -+ /* Load 4th argument in DS */ \ -+ LONG_ADDIU a3, zero, SIZE; \ -+ PTR_ADDIU $r_sp, $r_sp, -(6 * SZREG); \ -+ PTR_LA t0, skb_copy_bits; \ -+ PTR_S $r_ra, (5 * SZREG)($r_sp); \ -+ /* Assign low slot to a2 */ \ -+ PTR_ADDIU a2, $r_sp, DS_OFFSET(SIZE); \ -+ jalr t0; \ -+ /* Reset our destination slot (DS but it's ok) */ \ -+ INT_S zero, (4 * SZREG)($r_sp); \ -+ /* \ -+ * skb_copy_bits returns 0 on success and -EFAULT \ -+ * on error. Our data live in a2. Do not bother with \ -+ * our data if an error has been returned. \ -+ */ \ -+ /* Restore our frame */ \ -+ PTR_L $r_ra, (5 * SZREG)($r_sp); \ -+ INT_L $r_s0, (4 * SZREG)($r_sp); \ -+ bltz v0, fault; \ -+ PTR_ADDIU $r_sp, $r_sp, 6 * SZREG; \ -+ move $r_ret, zero; \ -+ -+NESTED(bpf_slow_path_word, (6 * SZREG), $r_sp) -+ bpf_slow_path_common(4) -+#ifdef CONFIG_CPU_LITTLE_ENDIAN -+# if MIPS_ISA_REV >= 2 -+ wsbh t0, $r_s0 -+ jr $r_ra -+ rotr $r_A, t0, 16 -+# else -+ sll t0, $r_s0, 24 -+ srl t1, $r_s0, 24 -+ srl t2, $r_s0, 8 -+ or t0, t0, t1 -+ andi t2, t2, 0xff00 -+ andi t1, $r_s0, 0xff00 -+ or t0, t0, t2 -+ sll t1, t1, 8 -+ jr $r_ra -+ or $r_A, t0, t1 -+# endif -+#else -+ jr $r_ra -+ move $r_A, $r_s0 -+#endif -+ -+ END(bpf_slow_path_word) -+ -+NESTED(bpf_slow_path_half, (6 * SZREG), $r_sp) -+ bpf_slow_path_common(2) -+#ifdef CONFIG_CPU_LITTLE_ENDIAN -+# if MIPS_ISA_REV >= 2 -+ jr $r_ra -+ wsbh $r_A, $r_s0 -+# else -+ sll t0, $r_s0, 8 -+ andi t1, $r_s0, 0xff00 -+ andi t0, t0, 0xff00 -+ srl t1, t1, 8 -+ jr $r_ra -+ or $r_A, t0, t1 -+# endif -+#else -+ jr $r_ra -+ move $r_A, $r_s0 -+#endif -+ -+ END(bpf_slow_path_half) -+ -+NESTED(bpf_slow_path_byte, (6 * SZREG), $r_sp) -+ bpf_slow_path_common(1) -+ jr $r_ra -+ move $r_A, $r_s0 -+ -+ END(bpf_slow_path_byte) -+ -+/* -+ * Negative entry points -+ */ -+ .macro bpf_is_end_of_data -+ li t0, SKF_LL_OFF -+ /* Reading link layer data? */ -+ slt t1, offset, t0 -+ bgtz t1, fault -+ /* Be careful what follows in DS. */ -+ .endm -+/* -+ * call skb_copy_bits: -+ * (prototype in linux/filter.h) -+ * -+ * void *bpf_internal_load_pointer_neg_helper(const struct sk_buff *skb, -+ * int k, unsigned int size) -+ * -+ * see above (bpf_slow_path_common) for ABI restrictions -+ */ -+#define bpf_negative_common(SIZE) \ -+ PTR_ADDIU $r_sp, $r_sp, -(6 * SZREG); \ -+ PTR_LA t0, bpf_internal_load_pointer_neg_helper; \ -+ PTR_S $r_ra, (5 * SZREG)($r_sp); \ -+ jalr t0; \ -+ li a2, SIZE; \ -+ PTR_L $r_ra, (5 * SZREG)($r_sp); \ -+ /* Check return pointer */ \ -+ beqz v0, fault; \ -+ PTR_ADDIU $r_sp, $r_sp, 6 * SZREG; \ -+ /* Preserve our pointer */ \ -+ move $r_s0, v0; \ -+ /* Set return value */ \ -+ move $r_ret, zero; \ -+ -+bpf_slow_path_word_neg: -+ bpf_is_end_of_data -+NESTED(sk_load_word_negative, (6 * SZREG), $r_sp) -+ bpf_negative_common(4) -+ jr $r_ra -+ lw $r_A, 0($r_s0) -+ END(sk_load_word_negative) -+ -+bpf_slow_path_half_neg: -+ bpf_is_end_of_data -+NESTED(sk_load_half_negative, (6 * SZREG), $r_sp) -+ bpf_negative_common(2) -+ jr $r_ra -+ lhu $r_A, 0($r_s0) -+ END(sk_load_half_negative) -+ -+bpf_slow_path_byte_neg: -+ bpf_is_end_of_data -+NESTED(sk_load_byte_negative, (6 * SZREG), $r_sp) -+ bpf_negative_common(1) -+ jr $r_ra -+ lbu $r_A, 0($r_s0) -+ END(sk_load_byte_negative) -+ -+fault: -+ jr $r_ra -+ addiu $r_ret, zero, 1 diff --git a/target/linux/layerscape/patches-5.4/302-dts-0055-arm64-dts-ls1028a-Add-PCIe-controller-DT-nodes.patch b/target/linux/layerscape/patches-5.4/302-dts-0055-arm64-dts-ls1028a-Add-PCIe-controller-DT-nodes.patch index 739f00e0ca..2543c879a9 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0055-arm64-dts-ls1028a-Add-PCIe-controller-DT-nodes.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0055-arm64-dts-ls1028a-Add-PCIe-controller-DT-nodes.patch @@ -12,7 +12,7 @@ Signed-off-by: Xiaowei Bao --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -631,6 +631,56 @@ +@@ -649,6 +649,56 @@ }; }; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0058-arm64-dts-fsl-ls1028a-add-flexcan-node.patch b/target/linux/layerscape/patches-5.4/302-dts-0058-arm64-dts-fsl-ls1028a-add-flexcan-node.patch index dbd7ec8578..28dd5675ea 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0058-arm64-dts-fsl-ls1028a-add-flexcan-node.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0058-arm64-dts-fsl-ls1028a-add-flexcan-node.patch @@ -85,10 +85,14 @@ Signed-off-by: Pankaj Bansal * * Harninder Rai * -@@ -287,6 +287,26 @@ - status = "disabled"; - }; - +@@ -301,6 +301,26 @@ + reg = <0x0 0x2190000 0x0 0x10000>; + interrupts = ; + clocks = <&sysclk>, <&clockgen 4 1>; ++ clock-names = "ipg", "per"; ++ status = "disabled"; ++ }; ++ + can0: can@2180000 { + compatible = "fsl,ls1028ar1-flexcan", + "fsl,lx2160ar1-flexcan"; @@ -105,10 +109,6 @@ Signed-off-by: Pankaj Bansal + reg = <0x0 0x2190000 0x0 0x10000>; + interrupts = ; + clocks = <&sysclk>, <&clockgen 4 1>; -+ clock-names = "ipg", "per"; -+ status = "disabled"; -+ }; -+ - duart0: serial@21c0500 { - compatible = "fsl,ns16550", "ns16550a"; - reg = <0x00 0x21c0500 0x0 0x100>; + clock-names = "ipg", "per"; + status = "disabled"; + }; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0066-arm64-dts-ls1028a-add-gpu-node.patch b/target/linux/layerscape/patches-5.4/302-dts-0066-arm64-dts-ls1028a-add-gpu-node.patch index a1b3823b38..24db800a11 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0066-arm64-dts-ls1028a-add-gpu-node.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0066-arm64-dts-ls1028a-add-gpu-node.patch @@ -12,8 +12,8 @@ Signed-off-by: Yuantian Tang --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -538,6 +538,16 @@ - clock-names = "apb_pclk", "wdog_clk"; +@@ -556,6 +556,16 @@ + clock-names = "wdog_clk", "apb_pclk"; }; + gpu@f0c0000 { diff --git a/target/linux/layerscape/patches-5.4/302-dts-0067-arm64-dts-fsl-add-optee-node-for-ls1028.patch b/target/linux/layerscape/patches-5.4/302-dts-0067-arm64-dts-fsl-add-optee-node-for-ls1028.patch index 3b7a67d902..aa7bf3a34c 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0067-arm64-dts-fsl-add-optee-node-for-ls1028.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0067-arm64-dts-fsl-add-optee-node-for-ls1028.patch @@ -13,7 +13,7 @@ Signed-off-by: Sahil Malhotra --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -771,6 +771,13 @@ +@@ -789,6 +789,13 @@ }; }; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0069-arm64-dts-ls1028a-Add-ftm_alarm0-DT-node.patch b/target/linux/layerscape/patches-5.4/302-dts-0069-arm64-dts-ls1028a-Add-ftm_alarm0-DT-node.patch index f79e93213f..38434cc8e7 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0069-arm64-dts-ls1028a-Add-ftm_alarm0-DT-node.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0069-arm64-dts-ls1028a-Add-ftm_alarm0-DT-node.patch @@ -24,7 +24,7 @@ Signed-off-by: Biwen Li cpus { #address-cells = <1>; #size-cells = <0>; -@@ -769,6 +773,19 @@ +@@ -787,6 +791,19 @@ little-endian; }; }; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0074-arm64-dts-fsl-ls1028a-Add-Felix-switch-port-DT-node.patch b/target/linux/layerscape/patches-5.4/302-dts-0074-arm64-dts-fsl-ls1028a-Add-Felix-switch-port-DT-node.patch index 4976a467b4..9d041feb14 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0074-arm64-dts-fsl-ls1028a-Add-Felix-switch-port-DT-node.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0074-arm64-dts-fsl-ls1028a-Add-Felix-switch-port-DT-node.patch @@ -22,7 +22,7 @@ Signed-off-by: Claudiu Manoil --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -750,7 +750,9 @@ +@@ -768,7 +768,9 @@ /* PF1: VF0-1 BAR0 - non-prefetchable memory */ 0x82000000 0x0 0x00000000 0x1 0xf8210000 0x0 0x020000 /* PF1: VF0-1 BAR2 - prefetchable memory */ @@ -33,7 +33,7 @@ Signed-off-by: Claudiu Manoil enetc_port0: ethernet@0,0 { compatible = "fsl,enetc"; -@@ -766,12 +768,66 @@ +@@ -784,12 +786,66 @@ #address-cells = <1>; #size-cells = <0>; }; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0076-arm64-dts-ls1028a-support-Felix-PF5-INTB-interrupt.patch b/target/linux/layerscape/patches-5.4/302-dts-0076-arm64-dts-ls1028a-support-Felix-PF5-INTB-interrupt.patch index 9427662354..338764d486 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0076-arm64-dts-ls1028a-support-Felix-PF5-INTB-interrupt.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0076-arm64-dts-ls1028a-support-Felix-PF5-INTB-interrupt.patch @@ -15,7 +15,7 @@ Signed-off-by: Yangbo Lu --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -732,7 +732,6 @@ +@@ -750,7 +750,6 @@ reg = <0x01 0xf0000000 0x0 0x100000>; #address-cells = <3>; #size-cells = <2>; @@ -23,7 +23,7 @@ Signed-off-by: Yangbo Lu msi-parent = <&its>; device_type = "pci"; bus-range = <0x0 0x0>; -@@ -785,6 +784,8 @@ +@@ -803,6 +802,8 @@ switch@0,5 { compatible = "mscc,felix-switch"; reg = <0x000500 0 0 0 0>; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0077-arm64-dts-ls1028a-Add-ethernet-property-for-l2switch.patch b/target/linux/layerscape/patches-5.4/302-dts-0077-arm64-dts-ls1028a-Add-ethernet-property-for-l2switch.patch index b5bc421da9..0417cd7b61 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0077-arm64-dts-ls1028a-Add-ethernet-property-for-l2switch.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0077-arm64-dts-ls1028a-Add-ethernet-property-for-l2switch.patch @@ -14,7 +14,7 @@ Signed-off-by: Claudiu Manoil --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -814,6 +814,7 @@ +@@ -832,6 +832,7 @@ }; port@5 { reg = <5>; @@ -22,7 +22,7 @@ Signed-off-by: Claudiu Manoil fixed-link { speed = <1000>; full-duplex; -@@ -821,7 +822,7 @@ +@@ -839,7 +840,7 @@ }; }; }; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0078-arm64-dts-fix-endianness-of-rcpm.patch b/target/linux/layerscape/patches-5.4/302-dts-0078-arm64-dts-fix-endianness-of-rcpm.patch index 4aabcebcae..23aabe8c27 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0078-arm64-dts-fix-endianness-of-rcpm.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0078-arm64-dts-fix-endianness-of-rcpm.patch @@ -14,7 +14,7 @@ Signed-off-by: Biwen Li --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -836,6 +836,7 @@ +@@ -854,6 +854,7 @@ compatible = "fsl,ls1028a-rcpm", "fsl,qoriq-rcpm-2.1+"; reg = <0x0 0x1e34040 0x0 0x1c>; #fsl,rcpm-wakeup-cells = <7>; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0079-arm64-dts-ls1028a-Fix-interrupt-map-property-of-PCIe.patch b/target/linux/layerscape/patches-5.4/302-dts-0079-arm64-dts-ls1028a-Fix-interrupt-map-property-of-PCIe.patch index c34862667e..6114b3ecca 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0079-arm64-dts-ls1028a-Fix-interrupt-map-property-of-PCIe.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0079-arm64-dts-ls1028a-Fix-interrupt-map-property-of-PCIe.patch @@ -13,7 +13,7 @@ Signed-off-by: Hou Zhiqiang --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -695,10 +695,10 @@ +@@ -713,10 +713,10 @@ msi-parent = <&its>; #interrupt-cells = <1>; interrupt-map-mask = <0 0 0 7>; @@ -28,7 +28,7 @@ Signed-off-by: Hou Zhiqiang status = "disabled"; }; -@@ -720,10 +720,10 @@ +@@ -738,10 +738,10 @@ msi-parent = <&its>; #interrupt-cells = <1>; interrupt-map-mask = <0 0 0 7>; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0088-arm64-dts-ls1028a-fix-dwc-pci-over-smmu.patch b/target/linux/layerscape/patches-5.4/302-dts-0088-arm64-dts-ls1028a-fix-dwc-pci-over-smmu.patch index 80ab53eef9..205b46f7bd 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0088-arm64-dts-ls1028a-fix-dwc-pci-over-smmu.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0088-arm64-dts-ls1028a-fix-dwc-pci-over-smmu.patch @@ -16,7 +16,7 @@ Signed-off-by: Laurentiu Tudor --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -689,6 +689,7 @@ +@@ -707,6 +707,7 @@ #size-cells = <2>; device_type = "pci"; dma-coherent; @@ -24,7 +24,7 @@ Signed-off-by: Laurentiu Tudor bus-range = <0x0 0xff>; ranges = <0x81000000 0x0 0x00000000 0x80 0x00010000 0x0 0x00010000 /* downstream I/O */ 0x82000000 0x0 0x40000000 0x80 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */ -@@ -714,6 +715,7 @@ +@@ -732,6 +733,7 @@ #size-cells = <2>; device_type = "pci"; dma-coherent; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0089-arm64-dts-ls1028a-Update-the-clock-providers-for-the.patch b/target/linux/layerscape/patches-5.4/302-dts-0089-arm64-dts-ls1028a-Update-the-clock-providers-for-the.patch index 31a896887a..bcb3d7b5f0 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0089-arm64-dts-ls1028a-Update-the-clock-providers-for-the.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0089-arm64-dts-ls1028a-Update-the-clock-providers-for-the.patch @@ -43,7 +43,7 @@ Signed-off-by: Shawn Guo reboot { compatible ="syscon-reboot"; regmap = <&rst>; -@@ -862,7 +848,8 @@ +@@ -880,7 +866,8 @@ interrupts = <0 222 IRQ_TYPE_LEVEL_HIGH>, <0 223 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "DE", "SE"; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0090-arm64-dts-ls1028a-Update-clock-cells-of-dpclk-node.patch b/target/linux/layerscape/patches-5.4/302-dts-0090-arm64-dts-ls1028a-Update-clock-cells-of-dpclk-node.patch index 861429eb07..62a506ae3d 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0090-arm64-dts-ls1028a-Update-clock-cells-of-dpclk-node.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0090-arm64-dts-ls1028a-Update-clock-cells-of-dpclk-node.patch @@ -24,7 +24,7 @@ Signed-off-by: Shawn Guo clocks = <&osc_27m>; }; -@@ -848,7 +848,7 @@ +@@ -866,7 +866,7 @@ interrupts = <0 222 IRQ_TYPE_LEVEL_HIGH>, <0 223 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "DE", "SE"; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0091-arm64-dts-ls1028a-Add-properties-for-HD-Display-cont.patch b/target/linux/layerscape/patches-5.4/302-dts-0091-arm64-dts-ls1028a-Add-properties-for-HD-Display-cont.patch index 96247aed9e..f28eacbcf4 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0091-arm64-dts-ls1028a-Add-properties-for-HD-Display-cont.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0091-arm64-dts-ls1028a-Add-properties-for-HD-Display-cont.patch @@ -17,7 +17,7 @@ Signed-off-by: Wen He --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -856,7 +856,23 @@ +@@ -874,7 +874,23 @@ port { dp0_out: endpoint { diff --git a/target/linux/layerscape/patches-5.4/302-dts-0093-arm64-dts-fsl-Specify-phy-mode-for-CPU-ports.patch b/target/linux/layerscape/patches-5.4/302-dts-0093-arm64-dts-fsl-Specify-phy-mode-for-CPU-ports.patch index 3cbb09074d..119a9b00c2 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0093-arm64-dts-fsl-Specify-phy-mode-for-CPU-ports.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0093-arm64-dts-fsl-Specify-phy-mode-for-CPU-ports.patch @@ -15,7 +15,7 @@ Signed-off-by: Vladimir Oltean --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -795,6 +795,8 @@ +@@ -813,6 +813,8 @@ /* internal to-cpu ports */ port@4 { reg = <4>; @@ -24,7 +24,7 @@ Signed-off-by: Vladimir Oltean fixed-link { speed = <1000>; full-duplex; -@@ -803,6 +805,8 @@ +@@ -821,6 +823,8 @@ port@5 { reg = <5>; ethernet = <&enetc_port3>; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0094-arm64-dts-fsl-Drop-compatible-string-from-Felix-swit.patch b/target/linux/layerscape/patches-5.4/302-dts-0094-arm64-dts-fsl-Drop-compatible-string-from-Felix-swit.patch index 21b133bc9a..5c75c52aed 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0094-arm64-dts-fsl-Drop-compatible-string-from-Felix-swit.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0094-arm64-dts-fsl-Drop-compatible-string-from-Felix-swit.patch @@ -14,7 +14,7 @@ Signed-off-by: Vladimir Oltean --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -770,7 +770,6 @@ +@@ -788,7 +788,6 @@ little-endian; }; switch@0,5 { diff --git a/target/linux/layerscape/patches-5.4/302-dts-0095-arm64-dts-fsl-ls1028a-Specify-that-the-Felix-port-4-.patch b/target/linux/layerscape/patches-5.4/302-dts-0095-arm64-dts-fsl-ls1028a-Specify-that-the-Felix-port-4-.patch index b97e83d4ad..5aa96470ad 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0095-arm64-dts-fsl-ls1028a-Specify-that-the-Felix-port-4-.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0095-arm64-dts-fsl-ls1028a-Specify-that-the-Felix-port-4-.patch @@ -22,7 +22,7 @@ Signed-off-by: Vladimir Oltean --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -797,7 +797,7 @@ +@@ -815,7 +815,7 @@ phy-mode = "gmii"; fixed-link { diff --git a/target/linux/layerscape/patches-5.4/302-dts-0096-arm64-dts-fsl-ls1028a-Disable-eno3-and-make-swp5-the.patch b/target/linux/layerscape/patches-5.4/302-dts-0096-arm64-dts-fsl-ls1028a-Disable-eno3-and-make-swp5-the.patch index 4a3eaaa0aa..af0933aca5 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0096-arm64-dts-fsl-ls1028a-Disable-eno3-and-make-swp5-the.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0096-arm64-dts-fsl-ls1028a-Disable-eno3-and-make-swp5-the.patch @@ -27,7 +27,7 @@ Signed-off-by: Vladimir Oltean --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -755,7 +755,7 @@ +@@ -773,7 +773,7 @@ #address-cells = <1>; #size-cells = <0>; }; @@ -36,7 +36,7 @@ Signed-off-by: Vladimir Oltean compatible = "fsl,enetc"; reg = <0x000200 0 0 0 0>; fixed-link { -@@ -794,6 +794,7 @@ +@@ -812,6 +812,7 @@ /* internal to-cpu ports */ port@4 { reg = <4>; @@ -44,7 +44,7 @@ Signed-off-by: Vladimir Oltean phy-mode = "gmii"; fixed-link { -@@ -803,7 +804,6 @@ +@@ -821,7 +822,6 @@ }; port@5 { reg = <5>; @@ -52,7 +52,7 @@ Signed-off-by: Vladimir Oltean phy-mode = "gmii"; fixed-link { -@@ -816,6 +816,8 @@ +@@ -834,6 +834,8 @@ enetc_port3: ethernet@0,6 { compatible = "fsl,enetc"; reg = <0x000600 0 0 0 0>; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0098-LF-403-ARM64-dts-fsl-Add-clock-names-mclk0-for-SAI-n.patch b/target/linux/layerscape/patches-5.4/302-dts-0098-LF-403-ARM64-dts-fsl-Add-clock-names-mclk0-for-SAI-n.patch index fd2999efab..0133ea009d 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0098-LF-403-ARM64-dts-fsl-Add-clock-names-mclk0-for-SAI-n.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0098-LF-403-ARM64-dts-fsl-Add-clock-names-mclk0-for-SAI-n.patch @@ -67,7 +67,7 @@ Signed-off-by: Alison Wang <&edma0 1 44>; --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -544,8 +544,9 @@ +@@ -562,8 +562,9 @@ reg = <0x0 0xf100000 0x0 0x10000>; interrupts = ; clocks = <&clockgen 4 1>, <&clockgen 4 1>, @@ -79,7 +79,7 @@ Signed-off-by: Alison Wang dma-names = "tx", "rx"; dmas = <&edma0 1 4>, <&edma0 1 3>; -@@ -558,8 +559,9 @@ +@@ -576,8 +577,9 @@ reg = <0x0 0xf110000 0x0 0x10000>; interrupts = ; clocks = <&clockgen 4 1>, <&clockgen 4 1>, @@ -91,7 +91,7 @@ Signed-off-by: Alison Wang dma-names = "tx", "rx"; dmas = <&edma0 1 6>, <&edma0 1 5>; -@@ -572,8 +574,9 @@ +@@ -590,8 +592,9 @@ reg = <0x0 0xf130000 0x0 0x10000>; interrupts = ; clocks = <&clockgen 4 1>, <&clockgen 4 1>, diff --git a/target/linux/layerscape/patches-5.4/302-dts-0099-arm64-dts-layerscape-apply-dma-coherent-for-dwc3-nod.patch b/target/linux/layerscape/patches-5.4/302-dts-0099-arm64-dts-layerscape-apply-dma-coherent-for-dwc3-nod.patch index ef719e393b..96003800f1 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0099-arm64-dts-layerscape-apply-dma-coherent-for-dwc3-nod.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0099-arm64-dts-layerscape-apply-dma-coherent-for-dwc3-nod.patch @@ -34,7 +34,7 @@ Signed-off-by: Ran Wang sata: sata@3200000 { --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -381,6 +381,7 @@ +@@ -399,6 +399,7 @@ snps,dis_rxdet_inp3_quirk; snps,quirk-frame-length-adjustment = <0x20>; snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>; @@ -42,7 +42,7 @@ Signed-off-by: Ran Wang }; usb1: usb@3110000 { -@@ -391,6 +392,7 @@ +@@ -409,6 +410,7 @@ snps,dis_rxdet_inp3_quirk; snps,quirk-frame-length-adjustment = <0x20>; snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0103-arm64-dts-ls1028a-Update-edma-compatible-to-fit-eDMA.patch b/target/linux/layerscape/patches-5.4/302-dts-0103-arm64-dts-ls1028a-Update-edma-compatible-to-fit-eDMA.patch index b7e65c7eab..303b7d42f3 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0103-arm64-dts-ls1028a-Update-edma-compatible-to-fit-eDMA.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0103-arm64-dts-ls1028a-Update-edma-compatible-to-fit-eDMA.patch @@ -14,7 +14,7 @@ Signed-off-by: Peng Ma --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -327,7 +327,7 @@ +@@ -345,7 +345,7 @@ edma0: dma-controller@22c0000 { #dma-cells = <2>; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0110-arm64-dts-ls1028a-Disable-swp5-by-default.patch b/target/linux/layerscape/patches-5.4/302-dts-0110-arm64-dts-ls1028a-Disable-swp5-by-default.patch index b6c63c4c46..098f760dcf 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0110-arm64-dts-ls1028a-Disable-swp5-by-default.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0110-arm64-dts-ls1028a-Disable-swp5-by-default.patch @@ -12,7 +12,7 @@ Signed-off-by: Vladimir Oltean --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -810,6 +810,7 @@ +@@ -828,6 +828,7 @@ port@5 { reg = <5>; phy-mode = "gmii"; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0112-arm64-dts-fsl-ls1028a-prepare-dts-for-overlay.patch b/target/linux/layerscape/patches-5.4/302-dts-0112-arm64-dts-fsl-ls1028a-prepare-dts-for-overlay.patch index 1584a0c402..1db8c542ba 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0112-arm64-dts-fsl-ls1028a-prepare-dts-for-overlay.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0112-arm64-dts-fsl-ls1028a-prepare-dts-for-overlay.patch @@ -385,7 +385,7 @@ Signed-off-by: Alex Marginean &sai4 { --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -774,30 +774,39 @@ +@@ -792,30 +792,39 @@ clocks = <&clockgen 2 3>; little-endian; }; @@ -432,7 +432,7 @@ Signed-off-by: Alex Marginean reg = <4>; ethernet = <&enetc_port2>; phy-mode = "gmii"; -@@ -807,7 +816,8 @@ +@@ -825,7 +834,8 @@ full-duplex; }; }; @@ -442,7 +442,7 @@ Signed-off-by: Alex Marginean reg = <5>; phy-mode = "gmii"; status = "disabled"; -@@ -819,6 +829,7 @@ +@@ -837,6 +847,7 @@ }; }; }; diff --git a/target/linux/layerscape/patches-5.4/302-dts-0114-arm64-dts-fsl-ls1028a-add-labels-to-Ethernet-switch-.patch b/target/linux/layerscape/patches-5.4/302-dts-0114-arm64-dts-fsl-ls1028a-add-labels-to-Ethernet-switch-.patch index 0a1b548b1f..9faacc7228 100644 --- a/target/linux/layerscape/patches-5.4/302-dts-0114-arm64-dts-fsl-ls1028a-add-labels-to-Ethernet-switch-.patch +++ b/target/linux/layerscape/patches-5.4/302-dts-0114-arm64-dts-fsl-ls1028a-add-labels-to-Ethernet-switch-.patch @@ -13,7 +13,7 @@ Signed-off-by: Alex Marginean --- a/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi +++ b/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi -@@ -788,21 +788,25 @@ +@@ -806,21 +806,25 @@ mscc_felix_port0: port@0 { reg = <0>; status = "disabled"; From 3d0499bcdb9869075d1a7470c73c9ea4c7a32e8f Mon Sep 17 00:00:00 2001 From: John Audia Date: Sun, 17 Oct 2021 09:14:42 -0400 Subject: [PATCH 17/36] kernel: bump 5.4 to 5.4.154 All patches automatically rebased. Signed-off-by: John Audia --- include/kernel-version.mk | 4 ++-- target/linux/ath25/patches-5.4/107-ar5312_gpio.patch | 2 +- .../ath79/patches-5.4/0032-MIPS-ath79-sanitize-symbols.patch | 2 +- ...net-broadcom-bcm4908enet-add-BCM4908-controller-driv.patch | 2 +- ...0001-dt-bindings-net-rename-BCM4908-Ethernet-binding.patch | 2 +- ...net-broadcom-rename-BCM4908-driver-update-DT-binding.patch | 2 +- ...-v5.12-0002-soc-bcm-add-PM-driver-for-Broadcom-s-PMB.patch | 2 +- .../patches-5.4/322-MIPS-BCM63XX-switch-to-IRQ_DOMAIN.patch | 2 +- .../linux/generic/hack-5.4/661-use_fq_codel_by_default.patch | 2 +- target/linux/lantiq/patches-5.4/0152-lantiq-VPE.patch | 2 +- ...bus-fsl-mc-move-fsl_mc_command-struct-in-a-uapi-head.patch | 2 +- ...1-net-0132-bus-fsl-mc-add-root-dprc-rescan-attribute.patch | 2 +- ...net-mscc-ocelot-publish-ocelot_sys.h-to-include-soc-.patch | 2 +- ...-net-dsa-ocelot-add-tagger-for-Ocelot-Felix-switches.patch | 2 +- ...63-net-dsa-ocelot-add-driver-for-Felix-switch-family.patch | 2 +- ...staging-fsl_ppfe-eth-add-pfe-support-to-Kconfig-and-.patch | 2 +- ...jailhouse-Add-simple-debug-console-via-the-hyperviso.patch | 2 +- ...security-keys-secure_key-Adds-the-secure-key-support.patch | 2 +- ...encrypted_keys-Adds-support-for-secure-key-type-as-m.patch | 2 +- ...PCI-mobiveil-Refactor-Mobiveil-PCIe-Host-Bridge-IP-d.patch | 2 +- ...812-pcie-0016-PCI-mobiveil-Add-the-EP-driver-support.patch | 2 +- .../814-qe-0006-config-qe-add-irq-qeic-support.patch | 2 +- .../realtek/patches-5.4/300-mips-add-rtl838x-platform.patch | 2 +- 23 files changed, 24 insertions(+), 24 deletions(-) diff --git a/include/kernel-version.mk b/include/kernel-version.mk index 46aa185525..4008511940 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -6,10 +6,10 @@ ifdef CONFIG_TESTING_KERNEL KERNEL_PATCHVER:=$(KERNEL_TESTING_PATCHVER) endif -LINUX_VERSION-5.4 = .153 +LINUX_VERSION-5.4 = .154 LINUX_VERSION-5.10 = .72 -LINUX_KERNEL_HASH-5.4.153 = 6d9f07c9d611e5a7317eb6d5114880bad5c2dc1ac48d89f861b887d2f4295f49 +LINUX_KERNEL_HASH-5.4.154 = 058994f4666b6b0474a4d5228583e394594e406783b7e93d487c2a66c35f3c06 LINUX_KERNEL_HASH-5.10.72 = b4d635afe7646ac6a6617c738e747ba0a6006675cd9735d18f672f8b1fba4c7c remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) diff --git a/target/linux/ath25/patches-5.4/107-ar5312_gpio.patch b/target/linux/ath25/patches-5.4/107-ar5312_gpio.patch index 7b8c9650cc..321ebc7fb8 100644 --- a/target/linux/ath25/patches-5.4/107-ar5312_gpio.patch +++ b/target/linux/ath25/patches-5.4/107-ar5312_gpio.patch @@ -202,7 +202,7 @@ +subsys_initcall(ar5312_gpio_init); --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -190,6 +190,7 @@ config ATH25 +@@ -192,6 +192,7 @@ config ATH25 select CEVT_R4K select CSRC_R4K select DMA_NONCOHERENT diff --git a/target/linux/ath79/patches-5.4/0032-MIPS-ath79-sanitize-symbols.patch b/target/linux/ath79/patches-5.4/0032-MIPS-ath79-sanitize-symbols.patch index 9fa199a204..3d79121e94 100644 --- a/target/linux/ath79/patches-5.4/0032-MIPS-ath79-sanitize-symbols.patch +++ b/target/linux/ath79/patches-5.4/0032-MIPS-ath79-sanitize-symbols.patch @@ -15,7 +15,7 @@ Signed-off-by: John Crispin --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -218,6 +218,8 @@ config ATH79 +@@ -220,6 +220,8 @@ config ATH79 select SYS_SUPPORTS_BIG_ENDIAN select SYS_SUPPORTS_MIPS16 select SYS_SUPPORTS_ZBOOT_UART_PROM diff --git a/target/linux/bcm4908/patches-5.4/072-v5.12-0002-net-broadcom-bcm4908enet-add-BCM4908-controller-driv.patch b/target/linux/bcm4908/patches-5.4/072-v5.12-0002-net-broadcom-bcm4908enet-add-BCM4908-controller-driv.patch index adef3d87ac..3f6444e6b3 100644 --- a/target/linux/bcm4908/patches-5.4/072-v5.12-0002-net-broadcom-bcm4908enet-add-BCM4908-controller-driv.patch +++ b/target/linux/bcm4908/patches-5.4/072-v5.12-0002-net-broadcom-bcm4908enet-add-BCM4908-controller-driv.patch @@ -24,7 +24,7 @@ Signed-off-by: David S. Miller --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -3207,6 +3207,15 @@ F: Documentation/devicetree/bindings/mip +@@ -3208,6 +3208,15 @@ F: Documentation/devicetree/bindings/mip F: arch/mips/bcm47xx/* F: arch/mips/include/asm/mach-bcm47xx/* diff --git a/target/linux/bcm4908/patches-5.4/073-v5.12-0001-dt-bindings-net-rename-BCM4908-Ethernet-binding.patch b/target/linux/bcm4908/patches-5.4/073-v5.12-0001-dt-bindings-net-rename-BCM4908-Ethernet-binding.patch index df3fca624a..563cb3ba91 100644 --- a/target/linux/bcm4908/patches-5.4/073-v5.12-0001-dt-bindings-net-rename-BCM4908-Ethernet-binding.patch +++ b/target/linux/bcm4908/patches-5.4/073-v5.12-0001-dt-bindings-net-rename-BCM4908-Ethernet-binding.patch @@ -117,7 +117,7 @@ Signed-off-by: David S. Miller + }; --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -3212,7 +3212,7 @@ M: Rafał Miłecki +@@ -3213,7 +3213,7 @@ M: Rafał Miłecki M: bcm-kernel-feedback-list@broadcom.com L: netdev@vger.kernel.org S: Maintained diff --git a/target/linux/bcm4908/patches-5.4/073-v5.12-0003-net-broadcom-rename-BCM4908-driver-update-DT-binding.patch b/target/linux/bcm4908/patches-5.4/073-v5.12-0003-net-broadcom-rename-BCM4908-driver-update-DT-binding.patch index 603d4c9c0c..66681963c1 100644 --- a/target/linux/bcm4908/patches-5.4/073-v5.12-0003-net-broadcom-rename-BCM4908-driver-update-DT-binding.patch +++ b/target/linux/bcm4908/patches-5.4/073-v5.12-0003-net-broadcom-rename-BCM4908-driver-update-DT-binding.patch @@ -24,7 +24,7 @@ Signed-off-by: David S. Miller --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -3213,7 +3213,7 @@ M: bcm-kernel-feedback-list@broadcom.com +@@ -3214,7 +3214,7 @@ M: bcm-kernel-feedback-list@broadcom.com L: netdev@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/net/brcm,bcm4908-enet.yaml diff --git a/target/linux/bcm4908/patches-5.4/082-v5.12-0002-soc-bcm-add-PM-driver-for-Broadcom-s-PMB.patch b/target/linux/bcm4908/patches-5.4/082-v5.12-0002-soc-bcm-add-PM-driver-for-Broadcom-s-PMB.patch index 5b8781a339..40126a968b 100644 --- a/target/linux/bcm4908/patches-5.4/082-v5.12-0002-soc-bcm-add-PM-driver-for-Broadcom-s-PMB.patch +++ b/target/linux/bcm4908/patches-5.4/082-v5.12-0002-soc-bcm-add-PM-driver-for-Broadcom-s-PMB.patch @@ -24,7 +24,7 @@ Signed-off-by: Florian Fainelli --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -3414,6 +3414,16 @@ L: linux-mips@vger.kernel.org +@@ -3415,6 +3415,16 @@ L: linux-mips@vger.kernel.org S: Maintained F: drivers/firmware/broadcom/* diff --git a/target/linux/bcm63xx/patches-5.4/322-MIPS-BCM63XX-switch-to-IRQ_DOMAIN.patch b/target/linux/bcm63xx/patches-5.4/322-MIPS-BCM63XX-switch-to-IRQ_DOMAIN.patch index eff4af025e..7fe81ba5b0 100644 --- a/target/linux/bcm63xx/patches-5.4/322-MIPS-BCM63XX-switch-to-IRQ_DOMAIN.patch +++ b/target/linux/bcm63xx/patches-5.4/322-MIPS-BCM63XX-switch-to-IRQ_DOMAIN.patch @@ -14,7 +14,7 @@ Signed-off-by: Jonas Gorski --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -292,6 +292,9 @@ config BCM63XX +@@ -294,6 +294,9 @@ config BCM63XX select SYNC_R4K select DMA_NONCOHERENT select IRQ_MIPS_CPU diff --git a/target/linux/generic/hack-5.4/661-use_fq_codel_by_default.patch b/target/linux/generic/hack-5.4/661-use_fq_codel_by_default.patch index cd86a7ab84..bbe43d24c2 100644 --- a/target/linux/generic/hack-5.4/661-use_fq_codel_by_default.patch +++ b/target/linux/generic/hack-5.4/661-use_fq_codel_by_default.patch @@ -44,7 +44,7 @@ Signed-off-by: Felix Fietkau device, it has to decide which ones to send first, which ones to --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c -@@ -2272,7 +2272,7 @@ static int __init pktsched_init(void) +@@ -2278,7 +2278,7 @@ static int __init pktsched_init(void) return err; } diff --git a/target/linux/lantiq/patches-5.4/0152-lantiq-VPE.patch b/target/linux/lantiq/patches-5.4/0152-lantiq-VPE.patch index 2aff479024..f9c116a330 100644 --- a/target/linux/lantiq/patches-5.4/0152-lantiq-VPE.patch +++ b/target/linux/lantiq/patches-5.4/0152-lantiq-VPE.patch @@ -1,6 +1,6 @@ --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -2379,6 +2379,12 @@ config MIPS_VPE_LOADER +@@ -2381,6 +2381,12 @@ config MIPS_VPE_LOADER Includes a loader for loading an elf relocatable object onto another VPE and running it. diff --git a/target/linux/layerscape/patches-5.4/701-net-0130-bus-fsl-mc-move-fsl_mc_command-struct-in-a-uapi-head.patch b/target/linux/layerscape/patches-5.4/701-net-0130-bus-fsl-mc-move-fsl_mc_command-struct-in-a-uapi-head.patch index 335ec7108c..5aa85bf51c 100644 --- a/target/linux/layerscape/patches-5.4/701-net-0130-bus-fsl-mc-move-fsl_mc_command-struct-in-a-uapi-head.patch +++ b/target/linux/layerscape/patches-5.4/701-net-0130-bus-fsl-mc-move-fsl_mc_command-struct-in-a-uapi-head.patch @@ -16,7 +16,7 @@ Signed-off-by: Ioana Ciornei --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -13437,6 +13437,8 @@ S: Maintained +@@ -13438,6 +13438,8 @@ S: Maintained F: drivers/bus/fsl-mc/ F: Documentation/devicetree/bindings/misc/fsl,qoriq-mc.txt F: Documentation/networking/device_drivers/freescale/dpaa2/overview.rst diff --git a/target/linux/layerscape/patches-5.4/701-net-0132-bus-fsl-mc-add-root-dprc-rescan-attribute.patch b/target/linux/layerscape/patches-5.4/701-net-0132-bus-fsl-mc-add-root-dprc-rescan-attribute.patch index 9062346821..8fd964993e 100644 --- a/target/linux/layerscape/patches-5.4/701-net-0132-bus-fsl-mc-add-root-dprc-rescan-attribute.patch +++ b/target/linux/layerscape/patches-5.4/701-net-0132-bus-fsl-mc-add-root-dprc-rescan-attribute.patch @@ -31,7 +31,7 @@ Signed-off-by: Ioana Ciornei +Users: Userspace drivers and management tools --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -13439,6 +13439,7 @@ F: Documentation/devicetree/bindings/mis +@@ -13440,6 +13440,7 @@ F: Documentation/devicetree/bindings/mis F: Documentation/networking/device_drivers/freescale/dpaa2/overview.rst F: Documentation/networking/dpaa2/overview.rst F: include/uapi/linux/fsl_mc.h diff --git a/target/linux/layerscape/patches-5.4/701-net-0261-net-mscc-ocelot-publish-ocelot_sys.h-to-include-soc-.patch b/target/linux/layerscape/patches-5.4/701-net-0261-net-mscc-ocelot-publish-ocelot_sys.h-to-include-soc-.patch index 98556523e3..f65ae631dc 100644 --- a/target/linux/layerscape/patches-5.4/701-net-0261-net-mscc-ocelot-publish-ocelot_sys.h-to-include-soc-.patch +++ b/target/linux/layerscape/patches-5.4/701-net-0261-net-mscc-ocelot-publish-ocelot_sys.h-to-include-soc-.patch @@ -24,7 +24,7 @@ Signed-off-by: David S. Miller --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -10825,6 +10825,7 @@ M: Microchip Linux Driver Support --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -17355,6 +17355,13 @@ S: Maintained +@@ -17356,6 +17356,13 @@ S: Maintained F: drivers/input/serio/userio.c F: include/uapi/linux/userio.h diff --git a/target/linux/layerscape/patches-5.4/701-net-0263-net-dsa-ocelot-add-driver-for-Felix-switch-family.patch b/target/linux/layerscape/patches-5.4/701-net-0263-net-dsa-ocelot-add-driver-for-Felix-switch-family.patch index 3c729498a9..5dc50c5ee6 100644 --- a/target/linux/layerscape/patches-5.4/701-net-0263-net-dsa-ocelot-add-driver-for-Felix-switch-family.patch +++ b/target/linux/layerscape/patches-5.4/701-net-0263-net-dsa-ocelot-add-driver-for-Felix-switch-family.patch @@ -57,7 +57,7 @@ Signed-off-by: David S. Miller --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -17360,6 +17360,7 @@ M: Vladimir Oltean L: netdev@vger.kernel.org S: Maintained diff --git a/target/linux/layerscape/patches-5.4/701-net-0323-staging-fsl_ppfe-eth-add-pfe-support-to-Kconfig-and-.patch b/target/linux/layerscape/patches-5.4/701-net-0323-staging-fsl_ppfe-eth-add-pfe-support-to-Kconfig-and-.patch index 7d071397f0..d370f728dd 100644 --- a/target/linux/layerscape/patches-5.4/701-net-0323-staging-fsl_ppfe-eth-add-pfe-support-to-Kconfig-and-.patch +++ b/target/linux/layerscape/patches-5.4/701-net-0323-staging-fsl_ppfe-eth-add-pfe-support-to-Kconfig-and-.patch @@ -15,7 +15,7 @@ Signed-off-by: Dong Aisheng --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -6575,6 +6575,14 @@ F: drivers/ptp/ptp_qoriq_debugfs.c +@@ -6576,6 +6576,14 @@ F: drivers/ptp/ptp_qoriq_debugfs.c F: include/linux/fsl/ptp_qoriq.h F: Documentation/devicetree/bindings/ptp/ptp-qoriq.txt diff --git a/target/linux/layerscape/patches-5.4/809-jailhouse-0020-jailhouse-Add-simple-debug-console-via-the-hyperviso.patch b/target/linux/layerscape/patches-5.4/809-jailhouse-0020-jailhouse-Add-simple-debug-console-via-the-hyperviso.patch index 72f3048d8f..d3fb53ec58 100644 --- a/target/linux/layerscape/patches-5.4/809-jailhouse-0020-jailhouse-Add-simple-debug-console-via-the-hyperviso.patch +++ b/target/linux/layerscape/patches-5.4/809-jailhouse-0020-jailhouse-Add-simple-debug-console-via-the-hyperviso.patch @@ -21,7 +21,7 @@ From http://git.kiszka.org/?p=linux.git;a=shortlog;h=refs/heads/queues/jailhouse --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -8773,6 +8773,7 @@ L: jailhouse-dev@googlegroups.com +@@ -8774,6 +8774,7 @@ L: jailhouse-dev@googlegroups.com S: Maintained F: arch/x86/kernel/jailhouse.c F: arch/x86/include/asm/jailhouse_para.h diff --git a/target/linux/layerscape/patches-5.4/810-keys-0001-security-keys-secure_key-Adds-the-secure-key-support.patch b/target/linux/layerscape/patches-5.4/810-keys-0001-security-keys-secure_key-Adds-the-secure-key-support.patch index 65b996d879..2347212a91 100644 --- a/target/linux/layerscape/patches-5.4/810-keys-0001-security-keys-secure_key-Adds-the-secure-key-support.patch +++ b/target/linux/layerscape/patches-5.4/810-keys-0001-security-keys-secure_key-Adds-the-secure-key-support.patch @@ -100,7 +100,7 @@ Reviewed-by: Sahil Malhotra + $ keyctl load secure kmk-master "load 'cat secure_key.blob'" @u --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -9074,6 +9074,17 @@ F: include/keys/trusted-type.h +@@ -9075,6 +9075,17 @@ F: include/keys/trusted-type.h F: security/keys/trusted.c F: include/keys/trusted.h diff --git a/target/linux/layerscape/patches-5.4/810-keys-0002-encrypted_keys-Adds-support-for-secure-key-type-as-m.patch b/target/linux/layerscape/patches-5.4/810-keys-0002-encrypted_keys-Adds-support-for-secure-key-type-as-m.patch index ed2eaa8a61..3a354e1fa8 100644 --- a/target/linux/layerscape/patches-5.4/810-keys-0002-encrypted_keys-Adds-support-for-secure-key-type-as-m.patch +++ b/target/linux/layerscape/patches-5.4/810-keys-0002-encrypted_keys-Adds-support-for-secure-key-type-as-m.patch @@ -23,7 +23,7 @@ Reviewed-by: Sahil Malhotra --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -9084,6 +9084,7 @@ F: include/keys/secure-type.h +@@ -9085,6 +9085,7 @@ F: include/keys/secure-type.h F: security/keys/secure_key.c F: security/keys/securekey_desc.c F: security/keys/securekey_desc.h diff --git a/target/linux/layerscape/patches-5.4/812-pcie-0009-PCI-mobiveil-Refactor-Mobiveil-PCIe-Host-Bridge-IP-d.patch b/target/linux/layerscape/patches-5.4/812-pcie-0009-PCI-mobiveil-Refactor-Mobiveil-PCIe-Host-Bridge-IP-d.patch index acbf2fe35a..08f7a7a0f0 100644 --- a/target/linux/layerscape/patches-5.4/812-pcie-0009-PCI-mobiveil-Refactor-Mobiveil-PCIe-Host-Bridge-IP-d.patch +++ b/target/linux/layerscape/patches-5.4/812-pcie-0009-PCI-mobiveil-Refactor-Mobiveil-PCIe-Host-Bridge-IP-d.patch @@ -34,7 +34,7 @@ Reviewed-by: Subrahmanya Lingappa --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -12503,7 +12503,7 @@ M: Hou Zhiqiang +@@ -12504,7 +12504,7 @@ M: Hou Zhiqiang L: linux-pci@vger.kernel.org S: Supported F: Documentation/devicetree/bindings/pci/mobiveil-pcie.txt diff --git a/target/linux/layerscape/patches-5.4/812-pcie-0016-PCI-mobiveil-Add-the-EP-driver-support.patch b/target/linux/layerscape/patches-5.4/812-pcie-0016-PCI-mobiveil-Add-the-EP-driver-support.patch index 5182eed992..667094355f 100644 --- a/target/linux/layerscape/patches-5.4/812-pcie-0016-PCI-mobiveil-Add-the-EP-driver-support.patch +++ b/target/linux/layerscape/patches-5.4/812-pcie-0016-PCI-mobiveil-Add-the-EP-driver-support.patch @@ -20,7 +20,7 @@ Signed-off-by: Hou Zhiqiang --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -12500,6 +12500,7 @@ F: drivers/ntb/hw/mscc/ +@@ -12501,6 +12501,7 @@ F: drivers/ntb/hw/mscc/ PCI DRIVER FOR MOBIVEIL PCIE IP M: Karthikeyan Mitran M: Hou Zhiqiang diff --git a/target/linux/layerscape/patches-5.4/814-qe-0006-config-qe-add-irq-qeic-support.patch b/target/linux/layerscape/patches-5.4/814-qe-0006-config-qe-add-irq-qeic-support.patch index babf74329b..5d8c35d04f 100644 --- a/target/linux/layerscape/patches-5.4/814-qe-0006-config-qe-add-irq-qeic-support.patch +++ b/target/linux/layerscape/patches-5.4/814-qe-0006-config-qe-add-irq-qeic-support.patch @@ -12,7 +12,7 @@ Signed-off-by: Zhao Qiang --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -6597,6 +6597,12 @@ F: drivers/soc/fsl/qe/ +@@ -6598,6 +6598,12 @@ F: drivers/soc/fsl/qe/ F: include/soc/fsl/*qe*.h F: include/soc/fsl/*ucc*.h diff --git a/target/linux/realtek/patches-5.4/300-mips-add-rtl838x-platform.patch b/target/linux/realtek/patches-5.4/300-mips-add-rtl838x-platform.patch index ecc77b2a73..c680d5f4a5 100644 --- a/target/linux/realtek/patches-5.4/300-mips-add-rtl838x-platform.patch +++ b/target/linux/realtek/patches-5.4/300-mips-add-rtl838x-platform.patch @@ -10,7 +10,7 @@ platforms += sgi-ip27 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -631,6 +631,26 @@ config RALINK +@@ -633,6 +633,26 @@ config RALINK select ARCH_HAS_RESET_CONTROLLER select RESET_CONTROLLER From 0ea33e5363f8a544a4c41c89cc1ca0d6b0d91e2e Mon Sep 17 00:00:00 2001 From: John Audia Date: Wed, 20 Oct 2021 08:32:55 -0400 Subject: [PATCH 18/36] kernel: bump 5.4 to 5.4.155 All patches automatically rebased. Signed-off-by: John Audia --- include/kernel-version.mk | 4 ++-- ...i-add-firmware-loader-for-uPD720201-and-uPD72.patch | 10 +++++----- .../802-usb-xhci-force-msi-renesas-xhci.patch | 2 +- ...80-4-usb-host-xhci-add-EH-SINGLE_STEP_SET_FEA.patch | 4 ++-- ...53-2-usb-host-xhci-do-not-return-error-status.patch | 2 +- ...794-1-usb-host-xhci-add-.bus_suspend-override.patch | 2 +- .../patches-5.4/901-fix_irq_type_of_pca953x.patch | 2 +- .../linux/ramips/patches-5.4/200-add-ralink-eth.patch | 2 +- ...net-ethernet-add-support-for-rtl838x-ethernet.patch | 2 +- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/include/kernel-version.mk b/include/kernel-version.mk index 4008511940..b0fa8263c0 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -6,10 +6,10 @@ ifdef CONFIG_TESTING_KERNEL KERNEL_PATCHVER:=$(KERNEL_TESTING_PATCHVER) endif -LINUX_VERSION-5.4 = .154 +LINUX_VERSION-5.4 = .155 LINUX_VERSION-5.10 = .72 -LINUX_KERNEL_HASH-5.4.154 = 058994f4666b6b0474a4d5228583e394594e406783b7e93d487c2a66c35f3c06 +LINUX_KERNEL_HASH-5.4.155 = cc0c0f902748d251cb22d0e69e3b8d260c447eb0072ef853da15da6cce775038 LINUX_KERNEL_HASH-5.10.72 = b4d635afe7646ac6a6617c738e747ba0a6006675cd9735d18f672f8b1fba4c7c remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) diff --git a/target/linux/apm821xx/patches-5.4/801-usb-xhci-add-firmware-loader-for-uPD720201-and-uPD72.patch b/target/linux/apm821xx/patches-5.4/801-usb-xhci-add-firmware-loader-for-uPD720201-and-uPD72.patch index 980a0407db..220e5da73b 100644 --- a/target/linux/apm821xx/patches-5.4/801-usb-xhci-add-firmware-loader-for-uPD720201-and-uPD72.patch +++ b/target/linux/apm821xx/patches-5.4/801-usb-xhci-add-firmware-loader-for-uPD720201-and-uPD72.patch @@ -48,7 +48,7 @@ Signed-off-by: Vinod Koul #include "xhci.h" #include "xhci-trace.h" -@@ -64,6 +66,44 @@ +@@ -65,6 +67,44 @@ #define PCI_DEVICE_ID_ASMEDIA_2142_XHCI 0x2142 #define PCI_DEVICE_ID_ASMEDIA_3242_XHCI 0x3242 @@ -93,7 +93,7 @@ Signed-off-by: Vinod Koul static const char hcd_name[] = "xhci_hcd"; static struct hc_driver __read_mostly xhci_pci_hc_driver; -@@ -309,6 +349,873 @@ static void xhci_pme_acpi_rtd3_enable(st +@@ -311,6 +351,873 @@ static void xhci_pme_acpi_rtd3_enable(st static void xhci_pme_acpi_rtd3_enable(struct pci_dev *dev) { } #endif /* CONFIG_ACPI */ @@ -967,7 +967,7 @@ Signed-off-by: Vinod Koul /* called during probe() after chip reset completes */ static int xhci_pci_setup(struct usb_hcd *hcd) { -@@ -350,6 +1257,27 @@ static int xhci_pci_probe(struct pci_dev +@@ -352,6 +1259,27 @@ static int xhci_pci_probe(struct pci_dev struct hc_driver *driver; struct usb_hcd *hcd; @@ -995,7 +995,7 @@ Signed-off-by: Vinod Koul driver = (struct hc_driver *)id->driver_data; /* Prevent runtime suspending between USB-2 and USB-3 initialization */ -@@ -411,6 +1339,16 @@ static void xhci_pci_remove(struct pci_d +@@ -413,6 +1341,16 @@ static void xhci_pci_remove(struct pci_d { struct xhci_hcd *xhci; @@ -1012,7 +1012,7 @@ Signed-off-by: Vinod Koul xhci = hcd_to_xhci(pci_get_drvdata(dev)); xhci->xhc_state |= XHCI_STATE_REMOVING; -@@ -550,6 +1488,11 @@ static int xhci_pci_resume(struct usb_hc +@@ -552,6 +1490,11 @@ static int xhci_pci_resume(struct usb_hc if (pdev->vendor == PCI_VENDOR_ID_INTEL) usb_enable_intel_xhci_ports(pdev); diff --git a/target/linux/apm821xx/patches-5.4/802-usb-xhci-force-msi-renesas-xhci.patch b/target/linux/apm821xx/patches-5.4/802-usb-xhci-force-msi-renesas-xhci.patch index 4217a1e949..6980ce80ee 100644 --- a/target/linux/apm821xx/patches-5.4/802-usb-xhci-force-msi-renesas-xhci.patch +++ b/target/linux/apm821xx/patches-5.4/802-usb-xhci-force-msi-renesas-xhci.patch @@ -13,7 +13,7 @@ produce a noisy warning. --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c -@@ -288,6 +288,7 @@ static void xhci_pci_quirks(struct devic +@@ -290,6 +290,7 @@ static void xhci_pci_quirks(struct devic pdev->device == 0x0015) { xhci->quirks |= XHCI_RESET_ON_RESUME; xhci->quirks |= XHCI_ZERO_64B_REGS; diff --git a/target/linux/layerscape/patches-5.4/820-usb-0015-MLK-17380-4-usb-host-xhci-add-EH-SINGLE_STEP_SET_FEA.patch b/target/linux/layerscape/patches-5.4/820-usb-0015-MLK-17380-4-usb-host-xhci-add-EH-SINGLE_STEP_SET_FEA.patch index fcad77c1eb..6af2f4b95e 100644 --- a/target/linux/layerscape/patches-5.4/820-usb-0015-MLK-17380-4-usb-host-xhci-add-EH-SINGLE_STEP_SET_FEA.patch +++ b/target/linux/layerscape/patches-5.4/820-usb-0015-MLK-17380-4-usb-host-xhci-add-EH-SINGLE_STEP_SET_FEA.patch @@ -42,7 +42,7 @@ Signed-off-by: Peter Chen retval = xhci_enter_test_mode(xhci, test_mode, wIndex, --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c -@@ -3624,6 +3624,129 @@ int xhci_queue_ctrl_tx(struct xhci_hcd * +@@ -3630,6 +3630,129 @@ int xhci_queue_ctrl_tx(struct xhci_hcd * return 0; } @@ -174,7 +174,7 @@ Signed-off-by: Peter Chen * bursts that are required to move all packets in this TD. Only SuperSpeed --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c -@@ -5385,6 +5385,7 @@ static const struct hc_driver xhci_hc_dr +@@ -5390,6 +5390,7 @@ static const struct hc_driver xhci_hc_dr .disable_usb3_lpm_timeout = xhci_disable_usb3_lpm_timeout, .find_raw_port_number = xhci_find_raw_port_number, .clear_tt_buffer_complete = xhci_clear_tt_buffer_complete, diff --git a/target/linux/layerscape/patches-5.4/820-usb-0017-MLK-19153-2-usb-host-xhci-do-not-return-error-status.patch b/target/linux/layerscape/patches-5.4/820-usb-0017-MLK-19153-2-usb-host-xhci-do-not-return-error-status.patch index 637d514d76..e5394cc6d8 100644 --- a/target/linux/layerscape/patches-5.4/820-usb-0017-MLK-19153-2-usb-host-xhci-do-not-return-error-status.patch +++ b/target/linux/layerscape/patches-5.4/820-usb-0017-MLK-19153-2-usb-host-xhci-do-not-return-error-status.patch @@ -22,7 +22,7 @@ Signed-off-by: Peter Chen --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c -@@ -2091,12 +2091,9 @@ static int process_ctrl_td(struct xhci_h +@@ -2097,12 +2097,9 @@ static int process_ctrl_td(struct xhci_h switch (trb_comp_code) { case COMP_SUCCESS: diff --git a/target/linux/layerscape/patches-5.4/820-usb-0018-MLK-18794-1-usb-host-xhci-add-.bus_suspend-override.patch b/target/linux/layerscape/patches-5.4/820-usb-0018-MLK-18794-1-usb-host-xhci-add-.bus_suspend-override.patch index 060a809f5b..671397700f 100644 --- a/target/linux/layerscape/patches-5.4/820-usb-0018-MLK-18794-1-usb-host-xhci-add-.bus_suspend-override.patch +++ b/target/linux/layerscape/patches-5.4/820-usb-0018-MLK-18794-1-usb-host-xhci-add-.bus_suspend-override.patch @@ -24,7 +24,7 @@ Signed-off-by: Peter Chen --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c -@@ -5406,6 +5406,8 @@ void xhci_init_driver(struct hc_driver * +@@ -5411,6 +5411,8 @@ void xhci_init_driver(struct hc_driver * drv->check_bandwidth = over->check_bandwidth; if (over->reset_bandwidth) drv->reset_bandwidth = over->reset_bandwidth; diff --git a/target/linux/layerscape/patches-5.4/901-fix_irq_type_of_pca953x.patch b/target/linux/layerscape/patches-5.4/901-fix_irq_type_of_pca953x.patch index a00a240135..5f022ac27f 100644 --- a/target/linux/layerscape/patches-5.4/901-fix_irq_type_of_pca953x.patch +++ b/target/linux/layerscape/patches-5.4/901-fix_irq_type_of_pca953x.patch @@ -11,7 +11,7 @@ Signed-off-by: Pawel Dembicki --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c -@@ -879,10 +879,12 @@ static int pca953x_irq_setup(struct pca9 +@@ -881,10 +881,12 @@ static int pca953x_irq_setup(struct pca9 for (i = 0; i < NBANK(chip); i++) chip->irq_stat[i] &= reg_direction[i]; mutex_init(&chip->irq_lock); diff --git a/target/linux/ramips/patches-5.4/200-add-ralink-eth.patch b/target/linux/ramips/patches-5.4/200-add-ralink-eth.patch index b8fd8e511d..79e7c2309b 100644 --- a/target/linux/ramips/patches-5.4/200-add-ralink-eth.patch +++ b/target/linux/ramips/patches-5.4/200-add-ralink-eth.patch @@ -1,6 +1,6 @@ --- a/drivers/net/ethernet/Kconfig +++ b/drivers/net/ethernet/Kconfig -@@ -159,6 +159,7 @@ source "drivers/net/ethernet/pasemi/Kcon +@@ -160,6 +160,7 @@ source "drivers/net/ethernet/pasemi/Kcon source "drivers/net/ethernet/pensando/Kconfig" source "drivers/net/ethernet/qlogic/Kconfig" source "drivers/net/ethernet/qualcomm/Kconfig" diff --git a/target/linux/realtek/patches-5.4/702-net-ethernet-add-support-for-rtl838x-ethernet.patch b/target/linux/realtek/patches-5.4/702-net-ethernet-add-support-for-rtl838x-ethernet.patch index 11e62450d5..952384ac89 100644 --- a/target/linux/realtek/patches-5.4/702-net-ethernet-add-support-for-rtl838x-ethernet.patch +++ b/target/linux/realtek/patches-5.4/702-net-ethernet-add-support-for-rtl838x-ethernet.patch @@ -1,6 +1,6 @@ --- a/drivers/net/ethernet/Kconfig +++ b/drivers/net/ethernet/Kconfig -@@ -163,6 +163,13 @@ source "drivers/net/ethernet/rdc/Kconfig +@@ -164,6 +164,13 @@ source "drivers/net/ethernet/rdc/Kconfig source "drivers/net/ethernet/realtek/Kconfig" source "drivers/net/ethernet/renesas/Kconfig" source "drivers/net/ethernet/rocker/Kconfig" From 3bd701d47cb76e552a3378900699b76ad4900df0 Mon Sep 17 00:00:00 2001 From: Rui Salvaterra Date: Wed, 13 Oct 2021 11:02:37 +0100 Subject: [PATCH 19/36] kernel: bump 5.10 to 5.10.73 Patches automatically refreshed. Signed-off-by: Rui Salvaterra --- include/kernel-version.mk | 4 ++-- ...pc_ich-Enable-GPIO-driver-for-DH89xxCC.patch | 6 +----- ...m-x86-add-meraki-mx100-platform-driver.patch | 17 ++++------------- 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/include/kernel-version.mk b/include/kernel-version.mk index b0fa8263c0..e6c5e19503 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -7,10 +7,10 @@ ifdef CONFIG_TESTING_KERNEL endif LINUX_VERSION-5.4 = .155 -LINUX_VERSION-5.10 = .72 +LINUX_VERSION-5.10 = .73 LINUX_KERNEL_HASH-5.4.155 = cc0c0f902748d251cb22d0e69e3b8d260c447eb0072ef853da15da6cce775038 -LINUX_KERNEL_HASH-5.10.72 = b4d635afe7646ac6a6617c738e747ba0a6006675cd9735d18f672f8b1fba4c7c +LINUX_KERNEL_HASH-5.10.73 = edb228032b23efa14077a68d968bc5b0d4026c1d1ef8bb958547a87ccb030e76 remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1))))))) diff --git a/target/linux/x86/patches-5.10/101-v5.15-mfd-lpc_ich-Enable-GPIO-driver-for-DH89xxCC.patch b/target/linux/x86/patches-5.10/101-v5.15-mfd-lpc_ich-Enable-GPIO-driver-for-DH89xxCC.patch index 0f0a3958da..b4881bf1d3 100644 --- a/target/linux/x86/patches-5.10/101-v5.15-mfd-lpc_ich-Enable-GPIO-driver-for-DH89xxCC.patch +++ b/target/linux/x86/patches-5.10/101-v5.15-mfd-lpc_ich-Enable-GPIO-driver-for-DH89xxCC.patch @@ -16,11 +16,9 @@ Signed-off-by: Lee Jones drivers/mfd/lpc_ich.c | 1 + 1 file changed, 1 insertion(+) -diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c -index 3bbb29a7e7a57..f10e53187f67a 100644 --- a/drivers/mfd/lpc_ich.c +++ b/drivers/mfd/lpc_ich.c -@@ -489,6 +489,7 @@ static struct lpc_ich_info lpc_chipset_info[] = { +@@ -489,6 +489,7 @@ static struct lpc_ich_info lpc_chipset_i [LPC_DH89XXCC] = { .name = "DH89xxCC", .iTCO_version = 2, @@ -28,5 +26,3 @@ index 3bbb29a7e7a57..f10e53187f67a 100644 }, [LPC_PPT] = { .name = "Panther Point", --- -cgit 1.2.3-1.el7 diff --git a/target/linux/x86/patches-5.10/102-v5.15-platform-x86-add-meraki-mx100-platform-driver.patch b/target/linux/x86/patches-5.10/102-v5.15-platform-x86-add-meraki-mx100-platform-driver.patch index c05b61a994..0babc73b06 100644 --- a/target/linux/x86/patches-5.10/102-v5.15-platform-x86-add-meraki-mx100-platform-driver.patch +++ b/target/linux/x86/patches-5.10/102-v5.15-platform-x86-add-meraki-mx100-platform-driver.patch @@ -22,11 +22,9 @@ Signed-off-by: Hans de Goede 3 files changed, 246 insertions(+) create mode 100644 drivers/platform/x86/meraki-mx100.c -diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig -index 6ad35158ae4ef..432d72170b003 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig -@@ -302,6 +302,19 @@ config ASUS_NB_WMI +@@ -267,6 +267,19 @@ config ASUS_NB_WMI If you have an ACPI-WMI compatible Asus Notebook, say Y or M here. @@ -46,11 +44,9 @@ index 6ad35158ae4ef..432d72170b003 100644 config EEEPC_LAPTOP tristate "Eee PC Hotkey Driver" depends on ACPI -diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile -index 5edfdc2ea7f29..9bb3c3f773864 100644 --- a/drivers/platform/x86/Makefile +++ b/drivers/platform/x86/Makefile -@@ -39,6 +39,9 @@ obj-$(CONFIG_ASUS_NB_WMI) += asus-nb-wmi.o +@@ -33,6 +33,9 @@ obj-$(CONFIG_ASUS_NB_WMI) += asus-nb-wmi obj-$(CONFIG_EEEPC_LAPTOP) += eeepc-laptop.o obj-$(CONFIG_EEEPC_WMI) += eeepc-wmi.o @@ -58,11 +54,8 @@ index 5edfdc2ea7f29..9bb3c3f773864 100644 +obj-$(CONFIG_MERAKI_MX100) += meraki-mx100.o + # Dell - obj-$(CONFIG_X86_PLATFORM_DRIVERS_DELL) += dell/ - -diff --git a/drivers/platform/x86/meraki-mx100.c b/drivers/platform/x86/meraki-mx100.c -new file mode 100644 -index 0000000000000..3751ed36a980a + obj-$(CONFIG_DCDBAS) += dcdbas.o + obj-$(CONFIG_DELL_SMBIOS) += dell-smbios.o --- /dev/null +++ b/drivers/platform/x86/meraki-mx100.c @@ -0,0 +1,230 @@ @@ -296,5 +289,3 @@ index 0000000000000..3751ed36a980a +MODULE_DESCRIPTION("Cisco Meraki MX100 Platform Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:meraki-mx100"); --- -cgit 1.2.3-1.el7 From 72e53eb1330545d927887316f15a630df8bab5cb Mon Sep 17 00:00:00 2001 From: Rui Salvaterra Date: Sun, 17 Oct 2021 18:31:09 +0100 Subject: [PATCH 20/36] kernel: bump 5.10 to 5.10.74 Patches automatically refreshed. Signed-off-by: Rui Salvaterra --- include/kernel-version.mk | 4 ++-- .../ath79/patches-5.10/0032-MIPS-ath79-sanitize-symbols.patch | 2 +- ...0110-MAINTAINERS-Add-entry-for-BCM2835-Unicam-driver.patch | 2 +- ...media-dt-bindings-media-Add-binding-for-the-Raspberr.patch | 2 +- ...media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch | 2 +- ...media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch | 2 +- ...950-0323-media-i2c-Add-driver-for-Sony-IMX477-sensor.patch | 2 +- ...staging-vc04_services-ISP-Add-a-more-complex-ISP-pro.patch | 2 +- ...Documentation-devicetree-Add-documentation-for-imx37.patch | 2 +- .../950-0709-drm-Add-GUD-USB-Display-driver.patch | 2 +- .../patches-5.10/322-MIPS-BCM63XX-switch-to-IRQ_DOMAIN.patch | 2 +- ...01-v5.11-mips-bmips-select-ARCH_HAS_RESET_CONTROLLER.patch | 2 +- ...202-mips-bmips-disable-ARCH_HAS_SYNC_DMA_FOR_CPU_ALL.patch | 2 +- .../bmips/patches-5.10/600-mips-bmips-add-pci-support.patch | 2 +- .../linux/generic/hack-5.10/661-use_fq_codel_by_default.patch | 2 +- target/linux/lantiq/patches-5.10/0152-lantiq-VPE.patch | 2 +- .../patches-5.10/910-dts-mt7622-bpi-r64-wifi-eeprom.patch | 2 +- .../realtek/patches-5.10/300-mips-add-rtl838x-platform.patch | 2 +- 18 files changed, 19 insertions(+), 19 deletions(-) diff --git a/include/kernel-version.mk b/include/kernel-version.mk index e6c5e19503..6374dd67ec 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -7,10 +7,10 @@ ifdef CONFIG_TESTING_KERNEL endif LINUX_VERSION-5.4 = .155 -LINUX_VERSION-5.10 = .73 +LINUX_VERSION-5.10 = .74 LINUX_KERNEL_HASH-5.4.155 = cc0c0f902748d251cb22d0e69e3b8d260c447eb0072ef853da15da6cce775038 -LINUX_KERNEL_HASH-5.10.73 = edb228032b23efa14077a68d968bc5b0d4026c1d1ef8bb958547a87ccb030e76 +LINUX_KERNEL_HASH-5.10.74 = 5755a6487018399812238205aba73a2693b0f9f3cd73d7cf1ce4d5436c3de1b0 remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1))))))) diff --git a/target/linux/ath79/patches-5.10/0032-MIPS-ath79-sanitize-symbols.patch b/target/linux/ath79/patches-5.10/0032-MIPS-ath79-sanitize-symbols.patch index 01cd31ba3a..40cd1689a0 100644 --- a/target/linux/ath79/patches-5.10/0032-MIPS-ath79-sanitize-symbols.patch +++ b/target/linux/ath79/patches-5.10/0032-MIPS-ath79-sanitize-symbols.patch @@ -15,7 +15,7 @@ Signed-off-by: John Crispin --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -243,6 +243,8 @@ config ATH79 +@@ -245,6 +245,8 @@ config ATH79 select SYS_SUPPORTS_BIG_ENDIAN select SYS_SUPPORTS_MIPS16 select SYS_SUPPORTS_ZBOOT_UART_PROM diff --git a/target/linux/bcm27xx/patches-5.10/950-0110-MAINTAINERS-Add-entry-for-BCM2835-Unicam-driver.patch b/target/linux/bcm27xx/patches-5.10/950-0110-MAINTAINERS-Add-entry-for-BCM2835-Unicam-driver.patch index 0a0999cc2f..0f6b4dee0b 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0110-MAINTAINERS-Add-entry-for-BCM2835-Unicam-driver.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0110-MAINTAINERS-Add-entry-for-BCM2835-Unicam-driver.patch @@ -12,7 +12,7 @@ Signed-off-by: Dave Stevenson --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -3417,6 +3417,13 @@ N: bcm113* +@@ -3418,6 +3418,13 @@ N: bcm113* N: bcm216* N: kona diff --git a/target/linux/bcm27xx/patches-5.10/950-0199-media-dt-bindings-media-Add-binding-for-the-Raspberr.patch b/target/linux/bcm27xx/patches-5.10/950-0199-media-dt-bindings-media-Add-binding-for-the-Raspberr.patch index c7bd718cfc..4e59a54f62 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0199-media-dt-bindings-media-Add-binding-for-the-Raspberr.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0199-media-dt-bindings-media-Add-binding-for-the-Raspberr.patch @@ -90,7 +90,7 @@ Signed-off-by: Dave Stevenson +... --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -3417,6 +3417,13 @@ N: bcm113* +@@ -3418,6 +3418,13 @@ N: bcm113* N: bcm216* N: kona diff --git a/target/linux/bcm27xx/patches-5.10/950-0209-media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch b/target/linux/bcm27xx/patches-5.10/950-0209-media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch index 8e573e6e84..82e1aad0b6 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0209-media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0209-media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch @@ -28,7 +28,7 @@ Signed-off-by: Naushir Patuck --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -3425,7 +3425,7 @@ F: Documentation/devicetree/bindings/med +@@ -3426,7 +3426,7 @@ F: Documentation/devicetree/bindings/med F: drivers/staging/media/rpivid BROADCOM BCM2835 CAMERA DRIVER diff --git a/target/linux/bcm27xx/patches-5.10/950-0264-media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch b/target/linux/bcm27xx/patches-5.10/950-0264-media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch index 67e4cdadae..78c7ea33ff 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0264-media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0264-media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch @@ -31,7 +31,7 @@ Reported-by: kbuild test robot --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -3429,7 +3429,7 @@ M: Raspberry Pi Kernel Maintenance --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -16346,6 +16346,14 @@ S: Maintained +@@ -16347,6 +16347,14 @@ S: Maintained T: git git://linuxtv.org/media_tree.git F: drivers/media/i2c/imx355.c diff --git a/target/linux/bcm27xx/patches-5.10/950-0345-staging-vc04_services-ISP-Add-a-more-complex-ISP-pro.patch b/target/linux/bcm27xx/patches-5.10/950-0345-staging-vc04_services-ISP-Add-a-more-complex-ISP-pro.patch index 80a94c4999..8bab7ef0cf 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0345-staging-vc04_services-ISP-Add-a-more-complex-ISP-pro.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0345-staging-vc04_services-ISP-Add-a-more-complex-ISP-pro.patch @@ -35,7 +35,7 @@ Signed-off-by: Naushir Patuck --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -3431,6 +3431,15 @@ S: Maintained +@@ -3432,6 +3432,15 @@ S: Maintained F: drivers/media/platform/bcm2835/ F: Documentation/devicetree/bindings/media/brcm,bcm2835-unicam.yaml diff --git a/target/linux/bcm27xx/patches-5.10/950-0657-Documentation-devicetree-Add-documentation-for-imx37.patch b/target/linux/bcm27xx/patches-5.10/950-0657-Documentation-devicetree-Add-documentation-for-imx37.patch index cd2c028d5e..4116fa11c4 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0657-Documentation-devicetree-Add-documentation-for-imx37.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0657-Documentation-devicetree-Add-documentation-for-imx37.patch @@ -132,7 +132,7 @@ Signed-off-by: David Plowman +... --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -16360,6 +16360,7 @@ M: Raspberry Pi Kernel Maintenance --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -5525,6 +5525,14 @@ S: Maintained +@@ -5526,6 +5526,14 @@ S: Maintained F: Documentation/devicetree/bindings/display/panel/feiyang,fy07024di26a30d.yaml F: drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c diff --git a/target/linux/bcm63xx/patches-5.10/322-MIPS-BCM63XX-switch-to-IRQ_DOMAIN.patch b/target/linux/bcm63xx/patches-5.10/322-MIPS-BCM63XX-switch-to-IRQ_DOMAIN.patch index b76f06d92d..b70f28e5a6 100644 --- a/target/linux/bcm63xx/patches-5.10/322-MIPS-BCM63XX-switch-to-IRQ_DOMAIN.patch +++ b/target/linux/bcm63xx/patches-5.10/322-MIPS-BCM63XX-switch-to-IRQ_DOMAIN.patch @@ -14,7 +14,7 @@ Signed-off-by: Jonas Gorski --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -317,6 +317,9 @@ config BCM63XX +@@ -319,6 +319,9 @@ config BCM63XX select SYNC_R4K select DMA_NONCOHERENT select IRQ_MIPS_CPU diff --git a/target/linux/bmips/patches-5.10/001-v5.11-mips-bmips-select-ARCH_HAS_RESET_CONTROLLER.patch b/target/linux/bmips/patches-5.10/001-v5.11-mips-bmips-select-ARCH_HAS_RESET_CONTROLLER.patch index a2e92bcafd..43ba9ab5b2 100644 --- a/target/linux/bmips/patches-5.10/001-v5.11-mips-bmips-select-ARCH_HAS_RESET_CONTROLLER.patch +++ b/target/linux/bmips/patches-5.10/001-v5.11-mips-bmips-select-ARCH_HAS_RESET_CONTROLLER.patch @@ -17,7 +17,7 @@ Signed-off-by: Thomas Bogendoerfer --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -250,6 +250,7 @@ config ATH79 +@@ -252,6 +252,7 @@ config ATH79 config BMIPS_GENERIC bool "Broadcom Generic BMIPS kernel" diff --git a/target/linux/bmips/patches-5.10/202-mips-bmips-disable-ARCH_HAS_SYNC_DMA_FOR_CPU_ALL.patch b/target/linux/bmips/patches-5.10/202-mips-bmips-disable-ARCH_HAS_SYNC_DMA_FOR_CPU_ALL.patch index 9b4674dbed..ba7cf5c6c4 100644 --- a/target/linux/bmips/patches-5.10/202-mips-bmips-disable-ARCH_HAS_SYNC_DMA_FOR_CPU_ALL.patch +++ b/target/linux/bmips/patches-5.10/202-mips-bmips-disable-ARCH_HAS_SYNC_DMA_FOR_CPU_ALL.patch @@ -52,7 +52,7 @@ Signed-off-by: Álvaro Fernández Rojas --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -251,7 +251,6 @@ config ATH79 +@@ -253,7 +253,6 @@ config ATH79 config BMIPS_GENERIC bool "Broadcom Generic BMIPS kernel" select ARCH_HAS_RESET_CONTROLLER diff --git a/target/linux/bmips/patches-5.10/600-mips-bmips-add-pci-support.patch b/target/linux/bmips/patches-5.10/600-mips-bmips-add-pci-support.patch index 961e95e52a..f74a14f256 100644 --- a/target/linux/bmips/patches-5.10/600-mips-bmips-add-pci-support.patch +++ b/target/linux/bmips/patches-5.10/600-mips-bmips-add-pci-support.patch @@ -1,6 +1,6 @@ --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -263,6 +263,7 @@ config BMIPS_GENERIC +@@ -265,6 +265,7 @@ config BMIPS_GENERIC select BCM7038_L1_IRQ select BCM7120_L2_IRQ select BRCMSTB_L2_IRQ diff --git a/target/linux/generic/hack-5.10/661-use_fq_codel_by_default.patch b/target/linux/generic/hack-5.10/661-use_fq_codel_by_default.patch index 103148d0d6..460fb86542 100644 --- a/target/linux/generic/hack-5.10/661-use_fq_codel_by_default.patch +++ b/target/linux/generic/hack-5.10/661-use_fq_codel_by_default.patch @@ -44,7 +44,7 @@ Signed-off-by: Felix Fietkau device, it has to decide which ones to send first, which ones to --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c -@@ -2282,7 +2282,7 @@ static int __init pktsched_init(void) +@@ -2288,7 +2288,7 @@ static int __init pktsched_init(void) return err; } diff --git a/target/linux/lantiq/patches-5.10/0152-lantiq-VPE.patch b/target/linux/lantiq/patches-5.10/0152-lantiq-VPE.patch index 5f070ffb9b..2444f12df8 100644 --- a/target/linux/lantiq/patches-5.10/0152-lantiq-VPE.patch +++ b/target/linux/lantiq/patches-5.10/0152-lantiq-VPE.patch @@ -1,6 +1,6 @@ --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -2428,6 +2428,12 @@ config MIPS_VPE_LOADER +@@ -2430,6 +2430,12 @@ config MIPS_VPE_LOADER Includes a loader for loading an elf relocatable object onto another VPE and running it. diff --git a/target/linux/mediatek/patches-5.10/910-dts-mt7622-bpi-r64-wifi-eeprom.patch b/target/linux/mediatek/patches-5.10/910-dts-mt7622-bpi-r64-wifi-eeprom.patch index 190096de2f..b2d1538da0 100644 --- a/target/linux/mediatek/patches-5.10/910-dts-mt7622-bpi-r64-wifi-eeprom.patch +++ b/target/linux/mediatek/patches-5.10/910-dts-mt7622-bpi-r64-wifi-eeprom.patch @@ -1,6 +1,6 @@ --- a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts -@@ -636,5 +636,28 @@ +@@ -628,5 +628,28 @@ }; &wmac { diff --git a/target/linux/realtek/patches-5.10/300-mips-add-rtl838x-platform.patch b/target/linux/realtek/patches-5.10/300-mips-add-rtl838x-platform.patch index 6217d80d3f..d37b32a274 100644 --- a/target/linux/realtek/patches-5.10/300-mips-add-rtl838x-platform.patch +++ b/target/linux/realtek/patches-5.10/300-mips-add-rtl838x-platform.patch @@ -10,7 +10,7 @@ platform-$(CONFIG_SGI_IP28) += sgi-ip22/ --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig -@@ -627,6 +627,26 @@ config RALINK +@@ -629,6 +629,26 @@ config RALINK select ARCH_HAS_RESET_CONTROLLER select RESET_CONTROLLER From d4f0e45f90fa6b2bd3421991ba66832d9a64db40 Mon Sep 17 00:00:00 2001 From: Rui Salvaterra Date: Wed, 20 Oct 2021 13:07:59 +0100 Subject: [PATCH 21/36] kernel: bump 5.10 to 5.10.75 Deleted (upstreamed): bcm27xx/patches-5.10/950-0735-xhci-guard-accesses-to-ep_state-in-xhci_endpoint_res.patch [1] [1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.10.y&id=dc3e0a20dbb9dbaa22f4a33dea34230f8c663c40 Signed-off-by: Rui Salvaterra --- include/kernel-version.mk | 4 +- .../802-usb-xhci-force-msi-renesas-xhci.patch | 2 +- ...hci_fixup_endpoint-for-interval-adju.patch | 2 +- ...or-host-controllers-that-don-t-updat.patch | 6 +-- ...-quirks-add-link-TRB-quirk-for-VL805.patch | 4 +- ...7xx-Remove-enable_headphones-setting.patch | 2 +- ...regulator-node-to-all-downstream-Pi-.patch | 4 +- ...2711-Add-aliases-for-additional-SPIs.patch | 2 +- ...ts-bcm2711-Tidy-the-HDMI-I2C-aliases.patch | 4 +- ...und-for-bogus-SET_DEQ_PENDING-endpoi.patch | 2 +- ...ses-to-ep_state-in-xhci_endpoint_res.patch | 43 ------------------- ...36-ARM-dts-Adapt-to-upstream-changes.patch | 2 +- .../710-net-dsa-mv88e6xxx-default-VID-1.patch | 4 +- ...-dsa-mv88e6xxx-disable-ATU-violation.patch | 2 +- ...760-net-dsa-mv88e6xxx-fix-vlan-setup.patch | 2 +- ...equest-assisted-learning-on-CPU-port.patch | 2 +- .../patches-5.10/200-add-ralink-eth.patch | 2 +- ...net-add-support-for-rtl838x-ethernet.patch | 2 +- 18 files changed, 24 insertions(+), 67 deletions(-) delete mode 100644 target/linux/bcm27xx/patches-5.10/950-0735-xhci-guard-accesses-to-ep_state-in-xhci_endpoint_res.patch diff --git a/include/kernel-version.mk b/include/kernel-version.mk index 6374dd67ec..cb4f72716f 100644 --- a/include/kernel-version.mk +++ b/include/kernel-version.mk @@ -7,10 +7,10 @@ ifdef CONFIG_TESTING_KERNEL endif LINUX_VERSION-5.4 = .155 -LINUX_VERSION-5.10 = .74 +LINUX_VERSION-5.10 = .75 LINUX_KERNEL_HASH-5.4.155 = cc0c0f902748d251cb22d0e69e3b8d260c447eb0072ef853da15da6cce775038 -LINUX_KERNEL_HASH-5.10.74 = 5755a6487018399812238205aba73a2693b0f9f3cd73d7cf1ce4d5436c3de1b0 +LINUX_KERNEL_HASH-5.10.75 = 0a2b2f5fefb90773190aaef4726ac363e03992aedc424b0a57eca092d084304b remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1))))))) diff --git a/target/linux/apm821xx/patches-5.10/802-usb-xhci-force-msi-renesas-xhci.patch b/target/linux/apm821xx/patches-5.10/802-usb-xhci-force-msi-renesas-xhci.patch index b9ca1aa92b..52198e41f4 100644 --- a/target/linux/apm821xx/patches-5.10/802-usb-xhci-force-msi-renesas-xhci.patch +++ b/target/linux/apm821xx/patches-5.10/802-usb-xhci-force-msi-renesas-xhci.patch @@ -13,7 +13,7 @@ produce a noisy warning. --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c -@@ -265,6 +265,7 @@ static void xhci_pci_quirks(struct devic +@@ -267,6 +267,7 @@ static void xhci_pci_quirks(struct devic pdev->device == 0x0015) { xhci->quirks |= XHCI_RESET_ON_RESUME; xhci->quirks |= XHCI_ZERO_64B_REGS; diff --git a/target/linux/bcm27xx/patches-5.10/950-0139-xhci-implement-xhci_fixup_endpoint-for-interval-adju.patch b/target/linux/bcm27xx/patches-5.10/950-0139-xhci-implement-xhci_fixup_endpoint-for-interval-adju.patch index 391af473d1..e328860374 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0139-xhci-implement-xhci_fixup_endpoint-for-interval-adju.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0139-xhci-implement-xhci_fixup_endpoint-for-interval-adju.patch @@ -119,7 +119,7 @@ Signed-off-by: Jonathan Bell * non-error returns are a promise to giveback() the urb later * we drop ownership so next owner (or urb unlink) can get it */ -@@ -5362,6 +5459,7 @@ static const struct hc_driver xhci_hc_dr +@@ -5367,6 +5464,7 @@ static const struct hc_driver xhci_hc_dr .endpoint_reset = xhci_endpoint_reset, .check_bandwidth = xhci_check_bandwidth, .reset_bandwidth = xhci_reset_bandwidth, diff --git a/target/linux/bcm27xx/patches-5.10/950-0145-xhci-add-quirk-for-host-controllers-that-don-t-updat.patch b/target/linux/bcm27xx/patches-5.10/950-0145-xhci-add-quirk-for-host-controllers-that-don-t-updat.patch index aa6daa5634..0fcb3f672d 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0145-xhci-add-quirk-for-host-controllers-that-don-t-updat.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0145-xhci-add-quirk-for-host-controllers-that-don-t-updat.patch @@ -23,7 +23,7 @@ Signed-off-by: Jonathan Bell --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c -@@ -274,8 +274,10 @@ static void xhci_pci_quirks(struct devic +@@ -276,8 +276,10 @@ static void xhci_pci_quirks(struct devic pdev->device == 0x3432) xhci->quirks |= XHCI_BROKEN_STREAMS; @@ -37,7 +37,7 @@ Signed-off-by: Jonathan Bell pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI) --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c -@@ -556,7 +556,10 @@ void xhci_find_new_dequeue_state(struct +@@ -562,7 +562,10 @@ void xhci_find_new_dequeue_state(struct struct xhci_virt_ep *ep = &dev->eps[ep_index]; struct xhci_ring *ep_ring; struct xhci_segment *new_seg; @@ -48,7 +48,7 @@ Signed-off-by: Jonathan Bell dma_addr_t addr; u64 hw_dequeue; bool cycle_found = false; -@@ -594,7 +597,28 @@ void xhci_find_new_dequeue_state(struct +@@ -600,7 +603,28 @@ void xhci_find_new_dequeue_state(struct hw_dequeue = xhci_get_hw_deq(xhci, dev, ep_index, stream_id); new_seg = ep_ring->deq_seg; new_deq = ep_ring->dequeue; diff --git a/target/linux/bcm27xx/patches-5.10/950-0355-xhci-quirks-add-link-TRB-quirk-for-VL805.patch b/target/linux/bcm27xx/patches-5.10/950-0355-xhci-quirks-add-link-TRB-quirk-for-VL805.patch index 9da1275676..f63da53b8f 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0355-xhci-quirks-add-link-TRB-quirk-for-VL805.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0355-xhci-quirks-add-link-TRB-quirk-for-VL805.patch @@ -22,7 +22,7 @@ Signed-off-by: Jonathan Bell --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c -@@ -277,6 +277,7 @@ static void xhci_pci_quirks(struct devic +@@ -279,6 +279,7 @@ static void xhci_pci_quirks(struct devic if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483) { xhci->quirks |= XHCI_LPM_SUPPORT; xhci->quirks |= XHCI_EP_CTX_BROKEN_DCS; @@ -32,7 +32,7 @@ Signed-off-by: Jonathan Bell if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c -@@ -653,6 +653,16 @@ void xhci_find_new_dequeue_state(struct +@@ -659,6 +659,16 @@ void xhci_find_new_dequeue_state(struct } while (!cycle_found || !td_last_trb_found); diff --git a/target/linux/bcm27xx/patches-5.10/950-0376-ARM-dts-bcm27xx-Remove-enable_headphones-setting.patch b/target/linux/bcm27xx/patches-5.10/950-0376-ARM-dts-bcm27xx-Remove-enable_headphones-setting.patch index 88dfcb39f8..0098c3227d 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0376-ARM-dts-bcm27xx-Remove-enable_headphones-setting.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0376-ARM-dts-bcm27xx-Remove-enable_headphones-setting.patch @@ -77,7 +77,7 @@ Signed-off-by: Phil Elwell aliases { --- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts -@@ -322,7 +322,7 @@ +@@ -323,7 +323,7 @@ / { chosen { diff --git a/target/linux/bcm27xx/patches-5.10/950-0438-dt-Add-a-camera-regulator-node-to-all-downstream-Pi-.patch b/target/linux/bcm27xx/patches-5.10/950-0438-dt-Add-a-camera-regulator-node-to-all-downstream-Pi-.patch index 1fc25fbea3..ee53d7acaf 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0438-dt-Add-a-camera-regulator-node-to-all-downstream-Pi-.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0438-dt-Add-a-camera-regulator-node-to-all-downstream-Pi-.patch @@ -277,7 +277,7 @@ Signed-off-by: Dave Stevenson &uart0 { --- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts -@@ -319,6 +319,7 @@ +@@ -320,6 +320,7 @@ #include "bcm2711-rpi.dtsi" #include "bcm283x-rpi-csi1-2lane.dtsi" #include "bcm283x-rpi-i2c0mux_0_44.dtsi" @@ -285,7 +285,7 @@ Signed-off-by: Dave Stevenson / { chosen { -@@ -585,6 +586,10 @@ +@@ -586,6 +587,10 @@ pinctrl-0 = <&audio_pins>; }; diff --git a/target/linux/bcm27xx/patches-5.10/950-0509-ARM-dts-bcm2711-Add-aliases-for-additional-SPIs.patch b/target/linux/bcm27xx/patches-5.10/950-0509-ARM-dts-bcm2711-Add-aliases-for-additional-SPIs.patch index cb62ec07dd..9a6ca588c3 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0509-ARM-dts-bcm2711-Add-aliases-for-additional-SPIs.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0509-ARM-dts-bcm2711-Add-aliases-for-additional-SPIs.patch @@ -16,7 +16,7 @@ Signed-off-by: Phil Elwell --- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts -@@ -354,6 +354,10 @@ +@@ -355,6 +355,10 @@ i2c4 = &i2c4; i2c5 = &i2c5; i2c6 = &i2c6; diff --git a/target/linux/bcm27xx/patches-5.10/950-0706-ARM-dts-bcm2711-Tidy-the-HDMI-I2C-aliases.patch b/target/linux/bcm27xx/patches-5.10/950-0706-ARM-dts-bcm2711-Tidy-the-HDMI-I2C-aliases.patch index f6a60f54d1..b931d7533d 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0706-ARM-dts-bcm2711-Tidy-the-HDMI-I2C-aliases.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0706-ARM-dts-bcm2711-Tidy-the-HDMI-I2C-aliases.patch @@ -20,7 +20,7 @@ Signed-off-by: Phil Elwell --- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts -@@ -349,11 +349,12 @@ +@@ -350,11 +350,12 @@ mmc0 = &emmc2; mmc1 = &mmcnr; mmc2 = &sdhost; @@ -34,7 +34,7 @@ Signed-off-by: Phil Elwell spi3 = &spi3; spi4 = &spi4; spi5 = &spi5; -@@ -559,13 +560,6 @@ +@@ -560,13 +561,6 @@ pinctrl-0 = <&i2s_pins>; }; diff --git a/target/linux/bcm27xx/patches-5.10/950-0733-usb-xhci-workaround-for-bogus-SET_DEQ_PENDING-endpoi.patch b/target/linux/bcm27xx/patches-5.10/950-0733-usb-xhci-workaround-for-bogus-SET_DEQ_PENDING-endpoi.patch index 67a7601ac2..8a76dd1b26 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0733-usb-xhci-workaround-for-bogus-SET_DEQ_PENDING-endpoi.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0733-usb-xhci-workaround-for-bogus-SET_DEQ_PENDING-endpoi.patch @@ -26,7 +26,7 @@ Signed-off-by: Jonathan Bell --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c -@@ -4256,9 +4256,9 @@ void xhci_queue_new_dequeue_state(struct +@@ -4262,9 +4262,9 @@ void xhci_queue_new_dequeue_state(struct } ep = &xhci->devs[slot_id]->eps[ep_index]; if ((ep->ep_state & SET_DEQ_PENDING)) { diff --git a/target/linux/bcm27xx/patches-5.10/950-0735-xhci-guard-accesses-to-ep_state-in-xhci_endpoint_res.patch b/target/linux/bcm27xx/patches-5.10/950-0735-xhci-guard-accesses-to-ep_state-in-xhci_endpoint_res.patch deleted file mode 100644 index 9cf5aa2e99..0000000000 --- a/target/linux/bcm27xx/patches-5.10/950-0735-xhci-guard-accesses-to-ep_state-in-xhci_endpoint_res.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 9d51ba9909129465493d56a7134ce4220d2e69e9 Mon Sep 17 00:00:00 2001 -From: Jonathan Bell -Date: Mon, 16 Aug 2021 14:43:06 +0100 -Subject: [PATCH] xhci: guard accesses to ep_state in - xhci_endpoint_reset() - -See https://github.com/raspberrypi/linux/issues/3981 - -Two read-modify-write cycles on ep->ep_state are not guarded by -xhci->lock. Fix these. - -Signed-off-by: Jonathan Bell ---- - drivers/usb/host/xhci.c | 5 +++++ - 1 file changed, 5 insertions(+) - ---- a/drivers/usb/host/xhci.c -+++ b/drivers/usb/host/xhci.c -@@ -3270,10 +3270,13 @@ static void xhci_endpoint_reset(struct u - return; - - /* Bail out if toggle is already being cleared by a endpoint reset */ -+ spin_lock_irqsave(&xhci->lock, flags); - if (ep->ep_state & EP_HARD_CLEAR_TOGGLE) { - ep->ep_state &= ~EP_HARD_CLEAR_TOGGLE; -+ spin_unlock_irqrestore(&xhci->lock, flags); - return; - } -+ spin_unlock_irqrestore(&xhci->lock, flags); - /* Only interrupt and bulk ep's use data toggle, USB2 spec 5.5.4-> */ - if (usb_endpoint_xfer_control(&host_ep->desc) || - usb_endpoint_xfer_isoc(&host_ep->desc)) -@@ -3359,8 +3362,10 @@ static void xhci_endpoint_reset(struct u - xhci_free_command(xhci, cfg_cmd); - cleanup: - xhci_free_command(xhci, stop_cmd); -+ spin_lock_irqsave(&xhci->lock, flags); - if (ep->ep_state & EP_SOFT_CLEAR_TOGGLE) - ep->ep_state &= ~EP_SOFT_CLEAR_TOGGLE; -+ spin_unlock_irqrestore(&xhci->lock, flags); - } - - static int xhci_check_streams_endpoint(struct xhci_hcd *xhci, diff --git a/target/linux/bcm27xx/patches-5.10/950-0736-ARM-dts-Adapt-to-upstream-changes.patch b/target/linux/bcm27xx/patches-5.10/950-0736-ARM-dts-Adapt-to-upstream-changes.patch index 9bb21fda87..6a778880e0 100644 --- a/target/linux/bcm27xx/patches-5.10/950-0736-ARM-dts-Adapt-to-upstream-changes.patch +++ b/target/linux/bcm27xx/patches-5.10/950-0736-ARM-dts-Adapt-to-upstream-changes.patch @@ -191,7 +191,7 @@ Signed-off-by: Phil Elwell gpios = <&virtgpio 0 0>; --- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts -@@ -579,13 +579,13 @@ +@@ -580,13 +580,13 @@ }; &leds { diff --git a/target/linux/generic/hack-5.10/710-net-dsa-mv88e6xxx-default-VID-1.patch b/target/linux/generic/hack-5.10/710-net-dsa-mv88e6xxx-default-VID-1.patch index f301cc1e2d..03725653f9 100644 --- a/target/linux/generic/hack-5.10/710-net-dsa-mv88e6xxx-default-VID-1.patch +++ b/target/linux/generic/hack-5.10/710-net-dsa-mv88e6xxx-default-VID-1.patch @@ -1,6 +1,6 @@ --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -2088,6 +2088,7 @@ static int mv88e6xxx_port_fdb_add(struct +@@ -2097,6 +2097,7 @@ static int mv88e6xxx_port_fdb_add(struct struct mv88e6xxx_chip *chip = ds->priv; int err; @@ -8,7 +8,7 @@ mv88e6xxx_reg_lock(chip); err = mv88e6xxx_port_db_load_purge(chip, port, addr, vid, MV88E6XXX_G1_ATU_DATA_STATE_UC_STATIC); -@@ -2102,6 +2103,7 @@ static int mv88e6xxx_port_fdb_del(struct +@@ -2111,6 +2112,7 @@ static int mv88e6xxx_port_fdb_del(struct struct mv88e6xxx_chip *chip = ds->priv; int err; diff --git a/target/linux/generic/hack-5.10/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch b/target/linux/generic/hack-5.10/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch index 46a1ba1d96..68cac73935 100644 --- a/target/linux/generic/hack-5.10/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch +++ b/target/linux/generic/hack-5.10/711-net-dsa-mv88e6xxx-disable-ATU-violation.patch @@ -1,6 +1,6 @@ --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -2650,6 +2650,9 @@ static int mv88e6xxx_setup_port(struct m +@@ -2659,6 +2659,9 @@ static int mv88e6xxx_setup_port(struct m if (dsa_is_cpu_port(ds, port)) reg = 0; diff --git a/target/linux/generic/pending-5.10/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch b/target/linux/generic/pending-5.10/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch index f961dc9e56..16be95ea38 100644 --- a/target/linux/generic/pending-5.10/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch +++ b/target/linux/generic/pending-5.10/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch @@ -17,7 +17,7 @@ Signed-off-by: DENG Qingfang --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -2860,6 +2860,7 @@ static int mv88e6xxx_setup(struct dsa_sw +@@ -2869,6 +2869,7 @@ static int mv88e6xxx_setup(struct dsa_sw chip->ds = ds; ds->slave_mii_bus = mv88e6xxx_default_mdio_bus(chip); diff --git a/target/linux/generic/pending-5.10/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch b/target/linux/generic/pending-5.10/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch index 493d412249..99f42ff212 100644 --- a/target/linux/generic/pending-5.10/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch +++ b/target/linux/generic/pending-5.10/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch @@ -17,7 +17,7 @@ Signed-off-by: Tobias Waldekranz --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -5422,6 +5422,7 @@ static int mv88e6xxx_register_switch(str +@@ -5431,6 +5431,7 @@ static int mv88e6xxx_register_switch(str ds->ops = &mv88e6xxx_switch_ops; ds->ageing_time_min = chip->info->age_time_coeff; ds->ageing_time_max = chip->info->age_time_coeff * U8_MAX; diff --git a/target/linux/ramips/patches-5.10/200-add-ralink-eth.patch b/target/linux/ramips/patches-5.10/200-add-ralink-eth.patch index 9aa8cb5180..90ba6e6c57 100644 --- a/target/linux/ramips/patches-5.10/200-add-ralink-eth.patch +++ b/target/linux/ramips/patches-5.10/200-add-ralink-eth.patch @@ -1,6 +1,6 @@ --- a/drivers/net/ethernet/Kconfig +++ b/drivers/net/ethernet/Kconfig -@@ -158,6 +158,7 @@ source "drivers/net/ethernet/pasemi/Kcon +@@ -159,6 +159,7 @@ source "drivers/net/ethernet/pasemi/Kcon source "drivers/net/ethernet/pensando/Kconfig" source "drivers/net/ethernet/qlogic/Kconfig" source "drivers/net/ethernet/qualcomm/Kconfig" diff --git a/target/linux/realtek/patches-5.10/702-net-ethernet-add-support-for-rtl838x-ethernet.patch b/target/linux/realtek/patches-5.10/702-net-ethernet-add-support-for-rtl838x-ethernet.patch index 1a6668550d..4c5f397e10 100644 --- a/target/linux/realtek/patches-5.10/702-net-ethernet-add-support-for-rtl838x-ethernet.patch +++ b/target/linux/realtek/patches-5.10/702-net-ethernet-add-support-for-rtl838x-ethernet.patch @@ -1,6 +1,6 @@ --- a/drivers/net/ethernet/Kconfig +++ b/drivers/net/ethernet/Kconfig -@@ -162,6 +162,13 @@ source "drivers/net/ethernet/rdc/Kconfig +@@ -163,6 +163,13 @@ source "drivers/net/ethernet/rdc/Kconfig source "drivers/net/ethernet/realtek/Kconfig" source "drivers/net/ethernet/renesas/Kconfig" source "drivers/net/ethernet/rocker/Kconfig" From 1d2bc94f786434e89bc87003b2a2202e92ad84e7 Mon Sep 17 00:00:00 2001 From: Andrew Robbins Date: Tue, 5 Oct 2021 11:00:16 -0400 Subject: [PATCH 22/36] ath10k-ct: update to version from 2021-09-22 Add in a fix for 160Mhz dfs on 5.10 and higher. Add support for 5.13 and 5.15 kernels. Add of_get_mac_address support for 5.15 driver. Signed-off-by: Andrew Robbins --- package/kernel/ath10k-ct/Makefile | 6 +++--- .../patches/202-ath10k-use-tpt-trigger-by-default.patch | 2 +- .../203-ath10k-Try-to-get-mac-address-from-dts.patch | 7 +------ 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/package/kernel/ath10k-ct/Makefile b/package/kernel/ath10k-ct/Makefile index 5681c5c2cd..25ea3376f0 100644 --- a/package/kernel/ath10k-ct/Makefile +++ b/package/kernel/ath10k-ct/Makefile @@ -8,9 +8,9 @@ PKG_LICENSE_FILES:= PKG_SOURCE_URL:=https://github.com/greearb/ath10k-ct.git PKG_SOURCE_PROTO:=git -PKG_SOURCE_DATE:=2021-06-03 -PKG_SOURCE_VERSION:=b44cd7b2e7b0df5995ece18f358d4dfc40834ba1 -PKG_MIRROR_HASH:=59f961ad425eb1a48fa9c391a325cc0f23845daec9d12673445d3077f9756cf0 +PKG_SOURCE_DATE:=2021-09-22 +PKG_SOURCE_VERSION:=e6a7d5b5b834737cd12e357b5efdc2e42d923bf6 +PKG_MIRROR_HASH:=62a1b97089d3561730656ef73beb3cd77231ec636645115cc1bbb3c6c84a6fe3 # Build the 5.10 ath10k-ct driver version. # Probably this should match as closely as diff --git a/package/kernel/ath10k-ct/patches/202-ath10k-use-tpt-trigger-by-default.patch b/package/kernel/ath10k-ct/patches/202-ath10k-use-tpt-trigger-by-default.patch index 6205c9b661..168c6ab462 100644 --- a/package/kernel/ath10k-ct/patches/202-ath10k-use-tpt-trigger-by-default.patch +++ b/package/kernel/ath10k-ct/patches/202-ath10k-use-tpt-trigger-by-default.patch @@ -42,7 +42,7 @@ Signed-off-by: Mathias Kresin if (ret) --- a/ath10k-5.10/mac.c +++ b/ath10k-5.10/mac.c -@@ -11403,7 +11403,7 @@ int ath10k_mac_register(struct ath10k *a +@@ -11405,7 +11405,7 @@ int ath10k_mac_register(struct ath10k *a ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER; #ifdef CPTCFG_MAC80211_LEDS diff --git a/package/kernel/ath10k-ct/patches/203-ath10k-Try-to-get-mac-address-from-dts.patch b/package/kernel/ath10k-ct/patches/203-ath10k-Try-to-get-mac-address-from-dts.patch index 3b5d9d45ac..8fcdaf8c0f 100644 --- a/package/kernel/ath10k-ct/patches/203-ath10k-Try-to-get-mac-address-from-dts.patch +++ b/package/kernel/ath10k-ct/patches/203-ath10k-Try-to-get-mac-address-from-dts.patch @@ -16,8 +16,6 @@ Signed-off-by: Ansuel Smith ath10k-5.10/core.c | 10 ++++++++++ 1 file changed, 10 insertions(+) -diff --git a/ath10k-5.10/core.c b/ath10k-5.10/core.c -index 5f4e12196..9ed7b9883 100644 --- a/ath10k-5.10/core.c +++ b/ath10k-5.10/core.c @@ -8,6 +8,7 @@ @@ -28,7 +26,7 @@ index 5f4e12196..9ed7b9883 100644 #include #include #include -@@ -3062,6 +3068,8 @@ static int ath10k_core_probe_fw(struct ath10k *ar) +@@ -3881,6 +3882,8 @@ static int ath10k_core_probe_fw(struct a device_get_mac_address(ar->dev, ar->mac_addr, sizeof(ar->mac_addr)); @@ -37,6 +35,3 @@ index 5f4e12196..9ed7b9883 100644 ret = ath10k_core_init_firmware_features(ar); if (ret) { ath10k_err(ar, "fatal problem with firmware features: %d\n", --- -2.27.0 - From 276c80bdc02da59c2cafcfc874c9e7af0317e226 Mon Sep 17 00:00:00 2001 From: Andre Heider Date: Sun, 3 Oct 2021 12:05:51 +0200 Subject: [PATCH 23/36] ltq-vdsl-app: prepare for multiple mei ioctls Refactor so that the outer function opens and closes the mei fd and passes it around, just as with the main fd. That also allows us to use the IOCTL macro in get_vector_status() and clean up accordingly. Switch to AUTORELEASE while at it. Signed-off-by: Andre Heider --- package/network/config/ltq-vdsl-app/Makefile | 2 +- .../ltq-vdsl-app/src/src/dsl_cpe_ubus.c | 40 ++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/package/network/config/ltq-vdsl-app/Makefile b/package/network/config/ltq-vdsl-app/Makefile index 6ea103de8d..0051f39b31 100644 --- a/package/network/config/ltq-vdsl-app/Makefile +++ b/package/network/config/ltq-vdsl-app/Makefile @@ -9,7 +9,7 @@ include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=ltq-vdsl-app PKG_VERSION:=4.17.18.6 -PKG_RELEASE:=9 +PKG_RELEASE:=$(AUTORELEASE) PKG_BASE_NAME:=dsl_cpe_control PKG_SOURCE:=$(PKG_BASE_NAME)_vrx-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=@OPENWRT diff --git a/package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c b/package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c index 9137d797f9..ab18c9d4d6 100644 --- a/package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c +++ b/package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c @@ -477,32 +477,28 @@ static void g997_xtu_system_enabling(int fd, standard_t *standard) { m_str("standard", str); } -static vector_t get_vector_status() { +static void get_vector_status(int fd, vector_t *status) { + *status = VECTOR_UNKNOWN; + #ifdef INCLUDE_DSL_CPE_API_VRX - int fd = open(DSL_CPE_DSL_LOW_DEV "/0", O_RDWR, 0644); if (fd < 0) - return VECTOR_UNKNOWN; + return; - IOCTL_MEI_dsmStatus_t out; - memset(&out, 0, sizeof(IOCTL_MEI_dsmStatus_t)); - int ret = ioctl(fd, FIO_MEI_DSM_STATUS_GET, &out); - close(fd); - - if (ret) - return VECTOR_UNKNOWN; + IOCTL(IOCTL_MEI_dsmStatus_t, FIO_MEI_DSM_STATUS_GET); switch (out.eVectorStatus) { case e_MEI_VECTOR_STAT_OFF: - return VECTOR_OFF; + *status = VECTOR_OFF; + break; case e_MEI_VECTOR_STAT_ON_DS: - return VECTOR_ON_DS; + *status = VECTOR_ON_DS; + break; case e_MEI_VECTOR_STAT_ON_DS_US: - return VECTOR_ON_DS_US; + *status = VECTOR_ON_DS_US; + break; default: - return VECTOR_UNKNOWN; + break; }; -#else - return VECTOR_UNKNOWN; #endif } @@ -720,7 +716,7 @@ static int metrics(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { - int fd; + int fd, fd_mei; void *c, *c2; standard_t standard = STD_UNKNOWN; profile_t profile = PROFILE_UNKNOWN; @@ -734,6 +730,12 @@ static int metrics(struct ubus_context *ctx, struct ubus_object *obj, if (fd < 0) return UBUS_STATUS_UNKNOWN_ERROR; +#ifdef INCLUDE_DSL_CPE_API_VRX + fd_mei = open(DSL_CPE_DSL_LOW_DEV "/0", O_RDWR, 0644); +#else + fd_mei = -1; +#endif + blob_buf_init(&b, 0); version_information(fd); @@ -749,7 +751,7 @@ static int metrics(struct ubus_context *ctx, struct ubus_object *obj, if (standard == STD_G_993_2) { band_plan_status(fd, &profile); - vector = get_vector_status(); + get_vector_status(fd_mei, &vector); } describe_mode(standard, profile, vector); @@ -803,6 +805,8 @@ static int metrics(struct ubus_context *ctx, struct ubus_object *obj, ubus_send_reply(ctx, req, b.head); + if (fd_mei >= 0) + close(fd_mei); close(fd); return 0; From 70729d345414cdf1463dec042811813ff9a94e7a Mon Sep 17 00:00:00 2001 From: Andre Heider Date: Sun, 3 Oct 2021 12:07:41 +0200 Subject: [PATCH 24/36] ltq-vdsl-app: add error vector counters to the ubus metrics These are useful stats to debug vector related line deteriorations, see [0]. Example output: "erb": { "sent": 169925, "discarded": 0 } [0] https://forum.openwrt.org/t/vectoring-on-lantiq-vrx200-vr9-missing-callback-for-sending-error-samples/104046 Signed-off-by: Andre Heider --- .../ltq-vdsl-app/src/src/dsl_cpe_ubus.c | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c b/package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c index ab18c9d4d6..707acdc606 100644 --- a/package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c +++ b/package/network/config/ltq-vdsl-app/src/src/dsl_cpe_ubus.c @@ -502,6 +502,18 @@ static void get_vector_status(int fd, vector_t *status) { #endif } +static void vector_erb(int fd) { +#ifdef INCLUDE_DSL_CPE_API_VRX + if (fd < 0) + return; + + IOCTL(IOCTL_MEI_dsmStatistics_t, FIO_MEI_DSM_STATISTICS_GET); + + m_u32("sent", out.n_processed); + m_u32("discarded", out.n_fw_dropped_size + out.n_mei_dropped_size + out.n_mei_dropped_no_pp_cb + out.n_pp_dropped); +#endif +} + static void band_plan_status(int fd, profile_t *profile) { #if (INCLUDE_DSL_CPE_API_VDSL_SUPPORT == 1) IOCTL(DSL_BandPlanStatus_t, DSL_FIO_BAND_PLAN_STATUS_GET) @@ -803,6 +815,17 @@ static int metrics(struct ubus_context *ctx, struct ubus_object *obj, blobmsg_close_table(&b, c2); blobmsg_close_table(&b, c); + switch (vector) { + case VECTOR_ON_DS: + case VECTOR_ON_DS_US: + c = blobmsg_open_table(&b, "erb"); + vector_erb(fd_mei); + blobmsg_close_table(&b, c); + break; + default: + break; + }; + ubus_send_reply(ctx, req, b.head); if (fd_mei >= 0) From b0f6162d681b605aa971c596612aab38ffd25f32 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 8 Oct 2021 18:49:45 +0200 Subject: [PATCH 25/36] kernel: 5.10: backport 100 BaseX SFP support Backport upstream support for 100Base-FX, 100Base-LX, 100Base-PX and 100Base-BX10 SFP modules. This is a prerequisite for the Globalscale MOCHAbin hybrid 1G SFP/Copper support backporting. Signed-off-by: Robert Marko --- ...40-v5.12-net-phy-Add-100-base-x-mode.patch | 56 +++++++++++++++++++ ...-sfp-add-support-for-100-base-x-SFPs.patch | 40 +++++++++++++ ...detach-callback-to-struct-phy_driver.patch | 2 +- 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 target/linux/generic/backport-5.10/740-v5.12-net-phy-Add-100-base-x-mode.patch create mode 100644 target/linux/generic/backport-5.10/741-v5.12-sfp-add-support-for-100-base-x-SFPs.patch diff --git a/target/linux/generic/backport-5.10/740-v5.12-net-phy-Add-100-base-x-mode.patch b/target/linux/generic/backport-5.10/740-v5.12-net-phy-Add-100-base-x-mode.patch new file mode 100644 index 0000000000..5c7f97ea90 --- /dev/null +++ b/target/linux/generic/backport-5.10/740-v5.12-net-phy-Add-100-base-x-mode.patch @@ -0,0 +1,56 @@ +From b1ae3587d16a8c8fc9453e147c8708d6f006ffbb Mon Sep 17 00:00:00 2001 +From: Bjarni Jonasson +Date: Wed, 13 Jan 2021 12:56:25 +0100 +Subject: [PATCH] net: phy: Add 100 base-x mode + +Sparx-5 supports this mode and it is missing in the PHY core. + +Signed-off-by: Bjarni Jonasson +Reviewed-by: Russell King +Signed-off-by: Jakub Kicinski +--- + Documentation/networking/phy.rst | 5 +++++ + include/linux/phy.h | 4 ++++ + 2 files changed, 9 insertions(+) + +--- a/Documentation/networking/phy.rst ++++ b/Documentation/networking/phy.rst +@@ -286,6 +286,11 @@ Some of the interface modes are describe + Note: due to legacy usage, some 10GBASE-R usage incorrectly makes + use of this definition. + ++``PHY_INTERFACE_MODE_100BASEX`` ++ This defines IEEE 802.3 Clause 24. The link operates at a fixed data ++ rate of 125Mpbs using a 4B/5B encoding scheme, resulting in an underlying ++ data rate of 100Mpbs. ++ + Pause frames / flow control + =========================== + +--- a/include/linux/phy.h ++++ b/include/linux/phy.h +@@ -104,6 +104,7 @@ extern const int phy_10gbit_features_arr + * @PHY_INTERFACE_MODE_MOCA: Multimedia over Coax + * @PHY_INTERFACE_MODE_QSGMII: Quad SGMII + * @PHY_INTERFACE_MODE_TRGMII: Turbo RGMII ++ * @PHY_INTERFACE_MODE_100BASEX: 100 BaseX + * @PHY_INTERFACE_MODE_1000BASEX: 1000 BaseX + * @PHY_INTERFACE_MODE_2500BASEX: 2500 BaseX + * @PHY_INTERFACE_MODE_RXAUI: Reduced XAUI +@@ -135,6 +136,7 @@ typedef enum { + PHY_INTERFACE_MODE_MOCA, + PHY_INTERFACE_MODE_QSGMII, + PHY_INTERFACE_MODE_TRGMII, ++ PHY_INTERFACE_MODE_100BASEX, + PHY_INTERFACE_MODE_1000BASEX, + PHY_INTERFACE_MODE_2500BASEX, + PHY_INTERFACE_MODE_RXAUI, +@@ -217,6 +219,8 @@ static inline const char *phy_modes(phy_ + return "usxgmii"; + case PHY_INTERFACE_MODE_10GKR: + return "10gbase-kr"; ++ case PHY_INTERFACE_MODE_100BASEX: ++ return "100base-x"; + default: + return "unknown"; + } diff --git a/target/linux/generic/backport-5.10/741-v5.12-sfp-add-support-for-100-base-x-SFPs.patch b/target/linux/generic/backport-5.10/741-v5.12-sfp-add-support-for-100-base-x-SFPs.patch new file mode 100644 index 0000000000..7d06c235d9 --- /dev/null +++ b/target/linux/generic/backport-5.10/741-v5.12-sfp-add-support-for-100-base-x-SFPs.patch @@ -0,0 +1,40 @@ +From 6e12f35cef6b8a458d7ecf507ae330e0bffaad8c Mon Sep 17 00:00:00 2001 +From: Bjarni Jonasson +Date: Wed, 13 Jan 2021 12:56:26 +0100 +Subject: [PATCH] sfp: add support for 100 base-x SFPs + +Add support for 100Base-FX, 100Base-LX, 100Base-PX and 100Base-BX10 modules +This is needed for Sparx-5 switch. + +Signed-off-by: Bjarni Jonasson +Reviewed-by: Russell King +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/sfp-bus.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/drivers/net/phy/sfp-bus.c ++++ b/drivers/net/phy/sfp-bus.c +@@ -280,6 +280,12 @@ void sfp_parse_support(struct sfp_bus *b + br_min <= 1300 && br_max >= 1200) + phylink_set(modes, 1000baseX_Full); + ++ /* 100Base-FX, 100Base-LX, 100Base-PX, 100Base-BX10 */ ++ if (id->base.e100_base_fx || id->base.e100_base_lx) ++ phylink_set(modes, 100baseFX_Full); ++ if ((id->base.e_base_px || id->base.e_base_bx10) && br_nom == 100) ++ phylink_set(modes, 100baseFX_Full); ++ + /* For active or passive cables, select the link modes + * based on the bit rates and the cable compliance bytes. + */ +@@ -399,6 +405,9 @@ phy_interface_t sfp_select_interface(str + if (phylink_test(link_modes, 1000baseX_Full)) + return PHY_INTERFACE_MODE_1000BASEX; + ++ if (phylink_test(link_modes, 100baseFX_Full)) ++ return PHY_INTERFACE_MODE_100BASEX; ++ + dev_warn(bus->sfp_dev, "Unable to ascertain link mode\n"); + + return PHY_INTERFACE_MODE_NA; diff --git a/target/linux/generic/pending-5.10/703-phy-add-detach-callback-to-struct-phy_driver.patch b/target/linux/generic/pending-5.10/703-phy-add-detach-callback-to-struct-phy_driver.patch index 9aa54082a5..52350ecccc 100644 --- a/target/linux/generic/pending-5.10/703-phy-add-detach-callback-to-struct-phy_driver.patch +++ b/target/linux/generic/pending-5.10/703-phy-add-detach-callback-to-struct-phy_driver.patch @@ -23,7 +23,7 @@ Signed-off-by: Gabor Juhos sysfs_remove_link(&dev->dev.kobj, "phydev"); --- a/include/linux/phy.h +++ b/include/linux/phy.h -@@ -761,6 +761,12 @@ struct phy_driver { +@@ -765,6 +765,12 @@ struct phy_driver { /** @handle_interrupt: Override default interrupt handling */ irqreturn_t (*handle_interrupt)(struct phy_device *phydev); From b519997ab9053687944376c4462b8e84af5e4e84 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 8 Oct 2021 18:49:46 +0200 Subject: [PATCH 26/36] kernel: 5.10: backport Marvell 88E1510/2 PHY SFP support Backport upstream SFP support for the Marvell 88E1510/2 PHY-s. Globalscale MOCHAbin uses this PHY for the hybrid WAN port that has 1G SFP and 1G RJ45 with PoE PD connected to it. This allows the SFP port to be used on it as well as parsing the SFP module details with ethtool. Signed-off-by: Robert Marko --- ...phy-marvell-refactor-HWMON-OOP-style.patch | 549 ++++++++++++++++++ ...-marvell-add-SFP-support-for-88E1510.patch | 161 +++++ 2 files changed, 710 insertions(+) create mode 100644 target/linux/generic/backport-5.10/742-v5.13-net-phy-marvell-refactor-HWMON-OOP-style.patch create mode 100644 target/linux/generic/backport-5.10/743-v5.15-net-phy-marvell-add-SFP-support-for-88E1510.patch diff --git a/target/linux/generic/backport-5.10/742-v5.13-net-phy-marvell-refactor-HWMON-OOP-style.patch b/target/linux/generic/backport-5.10/742-v5.13-net-phy-marvell-refactor-HWMON-OOP-style.patch new file mode 100644 index 0000000000..7bf59267fa --- /dev/null +++ b/target/linux/generic/backport-5.10/742-v5.13-net-phy-marvell-refactor-HWMON-OOP-style.patch @@ -0,0 +1,549 @@ +From 41d26bf4aba070dfd2ab48866cc27a48ee6228c7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marek=20Beh=C3=BAn?= +Date: Tue, 20 Apr 2021 09:53:59 +0200 +Subject: [PATCH] net: phy: marvell: refactor HWMON OOP style +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Use a structure of Marvell PHY specific HWMON methods to reduce code +duplication. Store a pointer to this structure into the PHY driver's +driver_data member. + +Signed-off-by: Marek Behún +Signed-off-by: David S. Miller +--- + drivers/net/phy/marvell.c | 369 +++++++++++++------------------------- + 1 file changed, 125 insertions(+), 244 deletions(-) + +--- a/drivers/net/phy/marvell.c ++++ b/drivers/net/phy/marvell.c +@@ -2134,6 +2134,19 @@ static int marvell_vct7_cable_test_get_s + } + + #ifdef CONFIG_HWMON ++struct marvell_hwmon_ops { ++ int (*get_temp)(struct phy_device *phydev, long *temp); ++ int (*get_temp_critical)(struct phy_device *phydev, long *temp); ++ int (*set_temp_critical)(struct phy_device *phydev, long temp); ++ int (*get_temp_alarm)(struct phy_device *phydev, long *alarm); ++}; ++ ++static const struct marvell_hwmon_ops * ++to_marvell_hwmon_ops(const struct phy_device *phydev) ++{ ++ return phydev->drv->driver_data; ++} ++ + static int m88e1121_get_temp(struct phy_device *phydev, long *temp) + { + int oldpage; +@@ -2177,75 +2190,6 @@ error: + return phy_restore_page(phydev, oldpage, ret); + } + +-static int m88e1121_hwmon_read(struct device *dev, +- enum hwmon_sensor_types type, +- u32 attr, int channel, long *temp) +-{ +- struct phy_device *phydev = dev_get_drvdata(dev); +- int err; +- +- switch (attr) { +- case hwmon_temp_input: +- err = m88e1121_get_temp(phydev, temp); +- break; +- default: +- return -EOPNOTSUPP; +- } +- +- return err; +-} +- +-static umode_t m88e1121_hwmon_is_visible(const void *data, +- enum hwmon_sensor_types type, +- u32 attr, int channel) +-{ +- if (type != hwmon_temp) +- return 0; +- +- switch (attr) { +- case hwmon_temp_input: +- return 0444; +- default: +- return 0; +- } +-} +- +-static u32 m88e1121_hwmon_chip_config[] = { +- HWMON_C_REGISTER_TZ, +- 0 +-}; +- +-static const struct hwmon_channel_info m88e1121_hwmon_chip = { +- .type = hwmon_chip, +- .config = m88e1121_hwmon_chip_config, +-}; +- +-static u32 m88e1121_hwmon_temp_config[] = { +- HWMON_T_INPUT, +- 0 +-}; +- +-static const struct hwmon_channel_info m88e1121_hwmon_temp = { +- .type = hwmon_temp, +- .config = m88e1121_hwmon_temp_config, +-}; +- +-static const struct hwmon_channel_info *m88e1121_hwmon_info[] = { +- &m88e1121_hwmon_chip, +- &m88e1121_hwmon_temp, +- NULL +-}; +- +-static const struct hwmon_ops m88e1121_hwmon_hwmon_ops = { +- .is_visible = m88e1121_hwmon_is_visible, +- .read = m88e1121_hwmon_read, +-}; +- +-static const struct hwmon_chip_info m88e1121_hwmon_chip_info = { +- .ops = &m88e1121_hwmon_hwmon_ops, +- .info = m88e1121_hwmon_info, +-}; +- + static int m88e1510_get_temp(struct phy_device *phydev, long *temp) + { + int ret; +@@ -2308,92 +2252,6 @@ static int m88e1510_get_temp_alarm(struc + return 0; + } + +-static int m88e1510_hwmon_read(struct device *dev, +- enum hwmon_sensor_types type, +- u32 attr, int channel, long *temp) +-{ +- struct phy_device *phydev = dev_get_drvdata(dev); +- int err; +- +- switch (attr) { +- case hwmon_temp_input: +- err = m88e1510_get_temp(phydev, temp); +- break; +- case hwmon_temp_crit: +- err = m88e1510_get_temp_critical(phydev, temp); +- break; +- case hwmon_temp_max_alarm: +- err = m88e1510_get_temp_alarm(phydev, temp); +- break; +- default: +- return -EOPNOTSUPP; +- } +- +- return err; +-} +- +-static int m88e1510_hwmon_write(struct device *dev, +- enum hwmon_sensor_types type, +- u32 attr, int channel, long temp) +-{ +- struct phy_device *phydev = dev_get_drvdata(dev); +- int err; +- +- switch (attr) { +- case hwmon_temp_crit: +- err = m88e1510_set_temp_critical(phydev, temp); +- break; +- default: +- return -EOPNOTSUPP; +- } +- return err; +-} +- +-static umode_t m88e1510_hwmon_is_visible(const void *data, +- enum hwmon_sensor_types type, +- u32 attr, int channel) +-{ +- if (type != hwmon_temp) +- return 0; +- +- switch (attr) { +- case hwmon_temp_input: +- case hwmon_temp_max_alarm: +- return 0444; +- case hwmon_temp_crit: +- return 0644; +- default: +- return 0; +- } +-} +- +-static u32 m88e1510_hwmon_temp_config[] = { +- HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_MAX_ALARM, +- 0 +-}; +- +-static const struct hwmon_channel_info m88e1510_hwmon_temp = { +- .type = hwmon_temp, +- .config = m88e1510_hwmon_temp_config, +-}; +- +-static const struct hwmon_channel_info *m88e1510_hwmon_info[] = { +- &m88e1121_hwmon_chip, +- &m88e1510_hwmon_temp, +- NULL +-}; +- +-static const struct hwmon_ops m88e1510_hwmon_hwmon_ops = { +- .is_visible = m88e1510_hwmon_is_visible, +- .read = m88e1510_hwmon_read, +- .write = m88e1510_hwmon_write, +-}; +- +-static const struct hwmon_chip_info m88e1510_hwmon_chip_info = { +- .ops = &m88e1510_hwmon_hwmon_ops, +- .info = m88e1510_hwmon_info, +-}; +- + static int m88e6390_get_temp(struct phy_device *phydev, long *temp) + { + int sum = 0; +@@ -2452,63 +2310,112 @@ error: + return ret; + } + +-static int m88e6390_hwmon_read(struct device *dev, +- enum hwmon_sensor_types type, +- u32 attr, int channel, long *temp) ++static int marvell_hwmon_read(struct device *dev, enum hwmon_sensor_types type, ++ u32 attr, int channel, long *temp) + { + struct phy_device *phydev = dev_get_drvdata(dev); +- int err; ++ const struct marvell_hwmon_ops *ops = to_marvell_hwmon_ops(phydev); ++ int err = -EOPNOTSUPP; + + switch (attr) { + case hwmon_temp_input: +- err = m88e6390_get_temp(phydev, temp); ++ if (ops->get_temp) ++ err = ops->get_temp(phydev, temp); ++ break; ++ case hwmon_temp_crit: ++ if (ops->get_temp_critical) ++ err = ops->get_temp_critical(phydev, temp); ++ break; ++ case hwmon_temp_max_alarm: ++ if (ops->get_temp_alarm) ++ err = ops->get_temp_alarm(phydev, temp); ++ break; ++ } ++ ++ return err; ++} ++ ++static int marvell_hwmon_write(struct device *dev, enum hwmon_sensor_types type, ++ u32 attr, int channel, long temp) ++{ ++ struct phy_device *phydev = dev_get_drvdata(dev); ++ const struct marvell_hwmon_ops *ops = to_marvell_hwmon_ops(phydev); ++ int err = -EOPNOTSUPP; ++ ++ switch (attr) { ++ case hwmon_temp_crit: ++ if (ops->set_temp_critical) ++ err = ops->set_temp_critical(phydev, temp); + break; + default: +- return -EOPNOTSUPP; ++ fallthrough; + } + + return err; + } + +-static umode_t m88e6390_hwmon_is_visible(const void *data, +- enum hwmon_sensor_types type, +- u32 attr, int channel) ++static umode_t marvell_hwmon_is_visible(const void *data, ++ enum hwmon_sensor_types type, ++ u32 attr, int channel) + { ++ const struct phy_device *phydev = data; ++ const struct marvell_hwmon_ops *ops = to_marvell_hwmon_ops(phydev); ++ + if (type != hwmon_temp) + return 0; + + switch (attr) { + case hwmon_temp_input: +- return 0444; ++ return ops->get_temp ? 0444 : 0; ++ case hwmon_temp_max_alarm: ++ return ops->get_temp_alarm ? 0444 : 0; ++ case hwmon_temp_crit: ++ return (ops->get_temp_critical ? 0444 : 0) | ++ (ops->set_temp_critical ? 0200 : 0); + default: + return 0; + } + } + +-static u32 m88e6390_hwmon_temp_config[] = { +- HWMON_T_INPUT, ++static u32 marvell_hwmon_chip_config[] = { ++ HWMON_C_REGISTER_TZ, + 0 + }; + +-static const struct hwmon_channel_info m88e6390_hwmon_temp = { ++static const struct hwmon_channel_info marvell_hwmon_chip = { ++ .type = hwmon_chip, ++ .config = marvell_hwmon_chip_config, ++}; ++ ++/* we can define HWMON_T_CRIT and HWMON_T_MAX_ALARM even though these are not ++ * defined for all PHYs, because the hwmon code checks whether the attributes ++ * exists via the .is_visible method ++ */ ++static u32 marvell_hwmon_temp_config[] = { ++ HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_MAX_ALARM, ++ 0 ++}; ++ ++static const struct hwmon_channel_info marvell_hwmon_temp = { + .type = hwmon_temp, +- .config = m88e6390_hwmon_temp_config, ++ .config = marvell_hwmon_temp_config, + }; + +-static const struct hwmon_channel_info *m88e6390_hwmon_info[] = { +- &m88e1121_hwmon_chip, +- &m88e6390_hwmon_temp, ++static const struct hwmon_channel_info *marvell_hwmon_info[] = { ++ &marvell_hwmon_chip, ++ &marvell_hwmon_temp, + NULL + }; + +-static const struct hwmon_ops m88e6390_hwmon_hwmon_ops = { +- .is_visible = m88e6390_hwmon_is_visible, +- .read = m88e6390_hwmon_read, ++static const struct hwmon_ops marvell_hwmon_hwmon_ops = { ++ .is_visible = marvell_hwmon_is_visible, ++ .read = marvell_hwmon_read, ++ .write = marvell_hwmon_write, + }; + +-static const struct hwmon_chip_info m88e6390_hwmon_chip_info = { +- .ops = &m88e6390_hwmon_hwmon_ops, +- .info = m88e6390_hwmon_info, ++static const struct hwmon_chip_info marvell_hwmon_chip_info = { ++ .ops = &marvell_hwmon_hwmon_ops, ++ .info = marvell_hwmon_info, + }; + + static int marvell_hwmon_name(struct phy_device *phydev) +@@ -2531,49 +2438,48 @@ static int marvell_hwmon_name(struct phy + return 0; + } + +-static int marvell_hwmon_probe(struct phy_device *phydev, +- const struct hwmon_chip_info *chip) ++static int marvell_hwmon_probe(struct phy_device *phydev) + { ++ const struct marvell_hwmon_ops *ops = to_marvell_hwmon_ops(phydev); + struct marvell_priv *priv = phydev->priv; + struct device *dev = &phydev->mdio.dev; + int err; + ++ if (!ops) ++ return 0; ++ + err = marvell_hwmon_name(phydev); + if (err) + return err; + + priv->hwmon_dev = devm_hwmon_device_register_with_info( +- dev, priv->hwmon_name, phydev, chip, NULL); ++ dev, priv->hwmon_name, phydev, &marvell_hwmon_chip_info, NULL); + + return PTR_ERR_OR_ZERO(priv->hwmon_dev); + } + +-static int m88e1121_hwmon_probe(struct phy_device *phydev) +-{ +- return marvell_hwmon_probe(phydev, &m88e1121_hwmon_chip_info); +-} ++static const struct marvell_hwmon_ops m88e1121_hwmon_ops = { ++ .get_temp = m88e1121_get_temp, ++}; + +-static int m88e1510_hwmon_probe(struct phy_device *phydev) +-{ +- return marvell_hwmon_probe(phydev, &m88e1510_hwmon_chip_info); +-} ++static const struct marvell_hwmon_ops m88e1510_hwmon_ops = { ++ .get_temp = m88e1510_get_temp, ++ .get_temp_critical = m88e1510_get_temp_critical, ++ .set_temp_critical = m88e1510_set_temp_critical, ++ .get_temp_alarm = m88e1510_get_temp_alarm, ++}; ++ ++static const struct marvell_hwmon_ops m88e6390_hwmon_ops = { ++ .get_temp = m88e6390_get_temp, ++}; ++ ++#define DEF_MARVELL_HWMON_OPS(s) (&(s)) + +-static int m88e6390_hwmon_probe(struct phy_device *phydev) +-{ +- return marvell_hwmon_probe(phydev, &m88e6390_hwmon_chip_info); +-} + #else +-static int m88e1121_hwmon_probe(struct phy_device *phydev) +-{ +- return 0; +-} + +-static int m88e1510_hwmon_probe(struct phy_device *phydev) +-{ +- return 0; +-} ++#define DEF_MARVELL_HWMON_OPS(s) NULL + +-static int m88e6390_hwmon_probe(struct phy_device *phydev) ++static int marvell_hwmon_probe(struct phy_device *phydev) + { + return 0; + } +@@ -2589,40 +2495,7 @@ static int marvell_probe(struct phy_devi + + phydev->priv = priv; + +- return 0; +-} +- +-static int m88e1121_probe(struct phy_device *phydev) +-{ +- int err; +- +- err = marvell_probe(phydev); +- if (err) +- return err; +- +- return m88e1121_hwmon_probe(phydev); +-} +- +-static int m88e1510_probe(struct phy_device *phydev) +-{ +- int err; +- +- err = marvell_probe(phydev); +- if (err) +- return err; +- +- return m88e1510_hwmon_probe(phydev); +-} +- +-static int m88e6390_probe(struct phy_device *phydev) +-{ +- int err; +- +- err = marvell_probe(phydev); +- if (err) +- return err; +- +- return m88e6390_hwmon_probe(phydev); ++ return marvell_hwmon_probe(phydev); + } + + static struct phy_driver marvell_drivers[] = { +@@ -2707,8 +2580,9 @@ static struct phy_driver marvell_drivers + .phy_id = MARVELL_PHY_ID_88E1121R, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .name = "Marvell 88E1121R", ++ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1121_hwmon_ops), + /* PHY_GBIT_FEATURES */ +- .probe = m88e1121_probe, ++ .probe = marvell_probe, + .config_init = marvell_config_init, + .config_aneg = m88e1121_config_aneg, + .read_status = marvell_read_status, +@@ -2827,9 +2701,10 @@ static struct phy_driver marvell_drivers + .phy_id = MARVELL_PHY_ID_88E1510, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .name = "Marvell 88E1510", ++ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), + .features = PHY_GBIT_FIBRE_FEATURES, + .flags = PHY_POLL_CABLE_TEST, +- .probe = m88e1510_probe, ++ .probe = marvell_probe, + .config_init = m88e1510_config_init, + .config_aneg = m88e1510_config_aneg, + .read_status = marvell_read_status, +@@ -2856,9 +2731,10 @@ static struct phy_driver marvell_drivers + .phy_id = MARVELL_PHY_ID_88E1540, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .name = "Marvell 88E1540", ++ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), + /* PHY_GBIT_FEATURES */ + .flags = PHY_POLL_CABLE_TEST, +- .probe = m88e1510_probe, ++ .probe = marvell_probe, + .config_init = marvell_config_init, + .config_aneg = m88e1510_config_aneg, + .read_status = marvell_read_status, +@@ -2882,7 +2758,8 @@ static struct phy_driver marvell_drivers + .phy_id = MARVELL_PHY_ID_88E1545, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .name = "Marvell 88E1545", +- .probe = m88e1510_probe, ++ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), ++ .probe = marvell_probe, + /* PHY_GBIT_FEATURES */ + .flags = PHY_POLL_CABLE_TEST, + .config_init = marvell_config_init, +@@ -2928,9 +2805,10 @@ static struct phy_driver marvell_drivers + .phy_id = MARVELL_PHY_ID_88E6341_FAMILY, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .name = "Marvell 88E6341 Family", ++ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), + /* PHY_GBIT_FEATURES */ + .flags = PHY_POLL_CABLE_TEST, +- .probe = m88e1510_probe, ++ .probe = marvell_probe, + .config_init = marvell_config_init, + .config_aneg = m88e6390_config_aneg, + .read_status = marvell_read_status, +@@ -2954,9 +2832,10 @@ static struct phy_driver marvell_drivers + .phy_id = MARVELL_PHY_ID_88E6390_FAMILY, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .name = "Marvell 88E6390 Family", ++ .driver_data = DEF_MARVELL_HWMON_OPS(m88e6390_hwmon_ops), + /* PHY_GBIT_FEATURES */ + .flags = PHY_POLL_CABLE_TEST, +- .probe = m88e6390_probe, ++ .probe = marvell_probe, + .config_init = marvell_config_init, + .config_aneg = m88e6390_config_aneg, + .read_status = marvell_read_status, +@@ -2980,7 +2859,8 @@ static struct phy_driver marvell_drivers + .phy_id = MARVELL_PHY_ID_88E1340S, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .name = "Marvell 88E1340S", +- .probe = m88e1510_probe, ++ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), ++ .probe = marvell_probe, + /* PHY_GBIT_FEATURES */ + .config_init = marvell_config_init, + .config_aneg = m88e1510_config_aneg, +@@ -3002,7 +2882,8 @@ static struct phy_driver marvell_drivers + .phy_id = MARVELL_PHY_ID_88E1548P, + .phy_id_mask = MARVELL_PHY_ID_MASK, + .name = "Marvell 88E1548P", +- .probe = m88e1510_probe, ++ .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), ++ .probe = marvell_probe, + .features = PHY_GBIT_FIBRE_FEATURES, + .config_init = marvell_config_init, + .config_aneg = m88e1510_config_aneg, diff --git a/target/linux/generic/backport-5.10/743-v5.15-net-phy-marvell-add-SFP-support-for-88E1510.patch b/target/linux/generic/backport-5.10/743-v5.15-net-phy-marvell-add-SFP-support-for-88E1510.patch new file mode 100644 index 0000000000..7fb78089f2 --- /dev/null +++ b/target/linux/generic/backport-5.10/743-v5.15-net-phy-marvell-add-SFP-support-for-88E1510.patch @@ -0,0 +1,161 @@ +From b697d9d38a5a5ab405d7cc4743d39fe2c5d7517c Mon Sep 17 00:00:00 2001 +From: Ivan Bornyakov +Date: Thu, 12 Aug 2021 16:42:56 +0300 +Subject: [PATCH] net: phy: marvell: add SFP support for 88E1510 + +Add support for SFP cages connected to the Marvell 88E1512 transceiver. +88E1512 supports for SGMII/1000Base-X/100Base-FX media type with RGMII +on system interface. Configure PHY to appropriate mode depending on the +type of SFP inserted. On SFP removal configure PHY to the RGMII-copper +mode so RJ-45 port can still work. + +Signed-off-by: Ivan Bornyakov +Link: https://lore.kernel.org/r/20210812134256.2436-1-i.bornyakov@metrotek.ru +Signed-off-by: Jakub Kicinski +--- + drivers/net/phy/marvell.c | 105 +++++++++++++++++++++++++++++++++++++- + 1 file changed, 104 insertions(+), 1 deletion(-) + +--- a/drivers/net/phy/marvell.c ++++ b/drivers/net/phy/marvell.c +@@ -32,6 +32,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -46,6 +47,7 @@ + #define MII_MARVELL_MISC_TEST_PAGE 0x06 + #define MII_MARVELL_VCT7_PAGE 0x07 + #define MII_MARVELL_WOL_PAGE 0x11 ++#define MII_MARVELL_MODE_PAGE 0x12 + + #define MII_M1011_IEVENT 0x13 + #define MII_M1011_IEVENT_CLEAR 0x0000 +@@ -162,7 +164,14 @@ + + #define MII_88E1510_GEN_CTRL_REG_1 0x14 + #define MII_88E1510_GEN_CTRL_REG_1_MODE_MASK 0x7 ++#define MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII 0x0 /* RGMII to copper */ + #define MII_88E1510_GEN_CTRL_REG_1_MODE_SGMII 0x1 /* SGMII to copper */ ++/* RGMII to 1000BASE-X */ ++#define MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_1000X 0x2 ++/* RGMII to 100BASE-FX */ ++#define MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_100FX 0x3 ++/* RGMII to SGMII */ ++#define MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_SGMII 0x4 + #define MII_88E1510_GEN_CTRL_REG_1_RESET 0x8000 /* Soft reset */ + + #define MII_VCT5_TX_RX_MDI0_COUPLING 0x10 +@@ -2498,6 +2507,100 @@ static int marvell_probe(struct phy_devi + return marvell_hwmon_probe(phydev); + } + ++static int m88e1510_sfp_insert(void *upstream, const struct sfp_eeprom_id *id) ++{ ++ struct phy_device *phydev = upstream; ++ phy_interface_t interface; ++ struct device *dev; ++ int oldpage; ++ int ret = 0; ++ u16 mode; ++ ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; ++ ++ dev = &phydev->mdio.dev; ++ ++ sfp_parse_support(phydev->sfp_bus, id, supported); ++ interface = sfp_select_interface(phydev->sfp_bus, supported); ++ ++ dev_info(dev, "%s SFP module inserted\n", phy_modes(interface)); ++ ++ switch (interface) { ++ case PHY_INTERFACE_MODE_1000BASEX: ++ mode = MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_1000X; ++ ++ break; ++ case PHY_INTERFACE_MODE_100BASEX: ++ mode = MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_100FX; ++ ++ break; ++ case PHY_INTERFACE_MODE_SGMII: ++ mode = MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII_SGMII; ++ ++ break; ++ default: ++ dev_err(dev, "Incompatible SFP module inserted\n"); ++ ++ return -EINVAL; ++ } ++ ++ oldpage = phy_select_page(phydev, MII_MARVELL_MODE_PAGE); ++ if (oldpage < 0) ++ goto error; ++ ++ ret = __phy_modify(phydev, MII_88E1510_GEN_CTRL_REG_1, ++ MII_88E1510_GEN_CTRL_REG_1_MODE_MASK, mode); ++ if (ret < 0) ++ goto error; ++ ++ ret = __phy_set_bits(phydev, MII_88E1510_GEN_CTRL_REG_1, ++ MII_88E1510_GEN_CTRL_REG_1_RESET); ++ ++error: ++ return phy_restore_page(phydev, oldpage, ret); ++} ++ ++static void m88e1510_sfp_remove(void *upstream) ++{ ++ struct phy_device *phydev = upstream; ++ int oldpage; ++ int ret = 0; ++ ++ oldpage = phy_select_page(phydev, MII_MARVELL_MODE_PAGE); ++ if (oldpage < 0) ++ goto error; ++ ++ ret = __phy_modify(phydev, MII_88E1510_GEN_CTRL_REG_1, ++ MII_88E1510_GEN_CTRL_REG_1_MODE_MASK, ++ MII_88E1510_GEN_CTRL_REG_1_MODE_RGMII); ++ if (ret < 0) ++ goto error; ++ ++ ret = __phy_set_bits(phydev, MII_88E1510_GEN_CTRL_REG_1, ++ MII_88E1510_GEN_CTRL_REG_1_RESET); ++ ++error: ++ phy_restore_page(phydev, oldpage, ret); ++} ++ ++static const struct sfp_upstream_ops m88e1510_sfp_ops = { ++ .module_insert = m88e1510_sfp_insert, ++ .module_remove = m88e1510_sfp_remove, ++ .attach = phy_sfp_attach, ++ .detach = phy_sfp_detach, ++}; ++ ++static int m88e1510_probe(struct phy_device *phydev) ++{ ++ int err; ++ ++ err = marvell_probe(phydev); ++ if (err) ++ return err; ++ ++ return phy_sfp_probe(phydev, &m88e1510_sfp_ops); ++} ++ + static struct phy_driver marvell_drivers[] = { + { + .phy_id = MARVELL_PHY_ID_88E1101, +@@ -2704,7 +2807,7 @@ static struct phy_driver marvell_drivers + .driver_data = DEF_MARVELL_HWMON_OPS(m88e1510_hwmon_ops), + .features = PHY_GBIT_FIBRE_FEATURES, + .flags = PHY_POLL_CABLE_TEST, +- .probe = marvell_probe, ++ .probe = m88e1510_probe, + .config_init = m88e1510_config_init, + .config_aneg = m88e1510_config_aneg, + .read_status = marvell_read_status, From f448c2692315d379ce98c9ca21641a02c1f558d0 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 20 Oct 2021 21:12:31 +0200 Subject: [PATCH 27/36] netifd: update to the latest version c61a1d432b34 wireless: fix creating AP mode WDS station interfaces f78bdec2ed5f wireless: fix handling vif attributes on reload with mode change Signed-off-by: Felix Fietkau --- package/network/config/netifd/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package/network/config/netifd/Makefile b/package/network/config/netifd/Makefile index 727c3ac690..23d494819e 100644 --- a/package/network/config/netifd/Makefile +++ b/package/network/config/netifd/Makefile @@ -5,9 +5,9 @@ PKG_RELEASE:=1 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git -PKG_SOURCE_DATE:=2021-10-13 -PKG_SOURCE_VERSION:=7a048bd6871df952ff1324bec7175891c9b38f99 -PKG_MIRROR_HASH:=b4fdca3c45713710f4ea69f1ed0fb16d3b07b70002e6b39640ce6e56364817d0 +PKG_SOURCE_DATE:=2021-10-21 +PKG_SOURCE_VERSION:=f78bdec2ed5f4c83d2c93f422c8bd21b68b02517 +PKG_MIRROR_HASH:=579fdf2357bd8ccf528e18ac770d80c0f42eb916fd8442f747e29e7f121b76e7 PKG_MAINTAINER:=Felix Fietkau PKG_LICENSE:=GPL-2.0 From da4be02fcd5d642954b1c9d9855d9e8d1e6205f4 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 20 Oct 2021 21:13:10 +0200 Subject: [PATCH 28/36] hostapd: fix a race condition on adding AP mode wds sta interfaces Both hostapd and netifd attempt to add a VLAN device to a bridge. Depending on which one wins the race, bridge vlan settings might be incomplete, or hostapd might run into an error and refuse to service the client. Fix this by preventing hostapd from adding interfaces to the bridge and instead rely entirely on netifd handling this properly Signed-off-by: Felix Fietkau --- .../network/services/hostapd/files/hostapd.sh | 2 +- .../patches/711-wds_bridge_force.patch | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 package/network/services/hostapd/patches/711-wds_bridge_force.patch diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh index 4f306317c7..443511f75b 100644 --- a/package/network/services/hostapd/files/hostapd.sh +++ b/package/network/services/hostapd/files/hostapd.sh @@ -753,7 +753,7 @@ hostapd_set_bss_options() { } append bss_conf "ssid=$ssid" "$N" - [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge" "$N" + [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge${N}wds_bridge=" "$N" [ -n "$network_ifname" ] && append bss_conf "snoop_iface=$network_ifname" "$N" [ -n "$iapp_interface" ] && { local ifname diff --git a/package/network/services/hostapd/patches/711-wds_bridge_force.patch b/package/network/services/hostapd/patches/711-wds_bridge_force.patch new file mode 100644 index 0000000000..1d4848976b --- /dev/null +++ b/package/network/services/hostapd/patches/711-wds_bridge_force.patch @@ -0,0 +1,22 @@ +--- a/hostapd/config_file.c ++++ b/hostapd/config_file.c +@@ -2357,6 +2357,8 @@ static int hostapd_config_fill(struct ho + sizeof(conf->bss[0]->iface)); + } else if (os_strcmp(buf, "bridge") == 0) { + os_strlcpy(bss->bridge, pos, sizeof(bss->bridge)); ++ if (!bss->wds_bridge[0]) ++ os_strlcpy(bss->wds_bridge, pos, sizeof(bss->wds_bridge)); + } else if (os_strcmp(buf, "snoop_iface") == 0) { + os_strlcpy(bss->snoop_iface, pos, sizeof(bss->snoop_iface)); + } else if (os_strcmp(buf, "vlan_bridge") == 0) { +--- a/src/ap/ap_drv_ops.c ++++ b/src/ap/ap_drv_ops.c +@@ -340,8 +340,6 @@ int hostapd_set_wds_sta(struct hostapd_d + return -1; + if (hapd->conf->wds_bridge[0]) + bridge = hapd->conf->wds_bridge; +- else if (hapd->conf->bridge[0]) +- bridge = hapd->conf->bridge; + return hapd->driver->set_wds_sta(hapd->drv_priv, addr, aid, val, + bridge, ifname_wds); + } From 63c01ad025981eaa841353dc0fc27e5017febe21 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Thu, 21 Oct 2021 12:37:09 +0200 Subject: [PATCH 29/36] hostapd: fix up patches after the last commit Signed-off-by: Felix Fietkau --- .../services/hostapd/patches/711-wds_bridge_force.patch | 4 ++-- .../services/hostapd/patches/720-iface_max_num_sta.patch | 4 ++-- package/network/services/hostapd/patches/730-ft_iface.patch | 2 +- .../network/services/hostapd/patches/740-snoop_iface.patch | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package/network/services/hostapd/patches/711-wds_bridge_force.patch b/package/network/services/hostapd/patches/711-wds_bridge_force.patch index 1d4848976b..d3f8864a74 100644 --- a/package/network/services/hostapd/patches/711-wds_bridge_force.patch +++ b/package/network/services/hostapd/patches/711-wds_bridge_force.patch @@ -6,9 +6,9 @@ os_strlcpy(bss->bridge, pos, sizeof(bss->bridge)); + if (!bss->wds_bridge[0]) + os_strlcpy(bss->wds_bridge, pos, sizeof(bss->wds_bridge)); - } else if (os_strcmp(buf, "snoop_iface") == 0) { - os_strlcpy(bss->snoop_iface, pos, sizeof(bss->snoop_iface)); } else if (os_strcmp(buf, "vlan_bridge") == 0) { + os_strlcpy(bss->vlan_bridge, pos, sizeof(bss->vlan_bridge)); + } else if (os_strcmp(buf, "wds_bridge") == 0) { --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -340,8 +340,6 @@ int hostapd_set_wds_sta(struct hostapd_d diff --git a/package/network/services/hostapd/patches/720-iface_max_num_sta.patch b/package/network/services/hostapd/patches/720-iface_max_num_sta.patch index e46c1f1a2c..72503b1aad 100644 --- a/package/network/services/hostapd/patches/720-iface_max_num_sta.patch +++ b/package/network/services/hostapd/patches/720-iface_max_num_sta.patch @@ -1,6 +1,6 @@ --- a/hostapd/config_file.c +++ b/hostapd/config_file.c -@@ -2873,6 +2873,14 @@ static int hostapd_config_fill(struct ho +@@ -2875,6 +2875,14 @@ static int hostapd_config_fill(struct ho line, bss->max_num_sta, MAX_STA_COUNT); return 1; } @@ -60,7 +60,7 @@ struct hapd_interfaces *interfaces = iface->interfaces; --- a/src/ap/beacon.c +++ b/src/ap/beacon.c -@@ -1042,7 +1042,7 @@ void handle_probe_req(struct hostapd_dat +@@ -1039,7 +1039,7 @@ void handle_probe_req(struct hostapd_dat if (hapd->conf->no_probe_resp_if_max_sta && is_multicast_ether_addr(mgmt->da) && is_multicast_ether_addr(mgmt->bssid) && diff --git a/package/network/services/hostapd/patches/730-ft_iface.patch b/package/network/services/hostapd/patches/730-ft_iface.patch index 793e8e0194..0a1a16d6e3 100644 --- a/package/network/services/hostapd/patches/730-ft_iface.patch +++ b/package/network/services/hostapd/patches/730-ft_iface.patch @@ -1,6 +1,6 @@ --- a/hostapd/config_file.c +++ b/hostapd/config_file.c -@@ -3031,6 +3031,8 @@ static int hostapd_config_fill(struct ho +@@ -3033,6 +3033,8 @@ static int hostapd_config_fill(struct ho wpa_printf(MSG_INFO, "Line %d: Obsolete peerkey parameter ignored", line); #ifdef CONFIG_IEEE80211R_AP diff --git a/package/network/services/hostapd/patches/740-snoop_iface.patch b/package/network/services/hostapd/patches/740-snoop_iface.patch index 8d928f8505..d206ed7322 100644 --- a/package/network/services/hostapd/patches/740-snoop_iface.patch +++ b/package/network/services/hostapd/patches/740-snoop_iface.patch @@ -55,10 +55,10 @@ "x_snoop: Failed to initialize L2 packet processing %s", --- a/hostapd/config_file.c +++ b/hostapd/config_file.c -@@ -2357,6 +2357,8 @@ static int hostapd_config_fill(struct ho - sizeof(conf->bss[0]->iface)); - } else if (os_strcmp(buf, "bridge") == 0) { +@@ -2359,6 +2359,8 @@ static int hostapd_config_fill(struct ho os_strlcpy(bss->bridge, pos, sizeof(bss->bridge)); + if (!bss->wds_bridge[0]) + os_strlcpy(bss->wds_bridge, pos, sizeof(bss->wds_bridge)); + } else if (os_strcmp(buf, "snoop_iface") == 0) { + os_strlcpy(bss->snoop_iface, pos, sizeof(bss->snoop_iface)); } else if (os_strcmp(buf, "vlan_bridge") == 0) { From f85c970c9c91efd74ca11491d28e1f5f24c5bffc Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 21 Oct 2021 15:51:48 +0200 Subject: [PATCH 30/36] ath79: use correct USB package for DIR-505 AR9331 requires kmod-usb2-chipidea to use the USB ports. Include the correct package so they can be used with the base image. Signed-off-by: David Bauer --- target/linux/ath79/image/generic.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/linux/ath79/image/generic.mk b/target/linux/ath79/image/generic.mk index 3d404d1c81..b170323394 100644 --- a/target/linux/ath79/image/generic.mk +++ b/target/linux/ath79/image/generic.mk @@ -906,7 +906,7 @@ define Device/dlink_dir-505 DEVICE_VENDOR := D-Link DEVICE_MODEL := DIR-505 IMAGE_SIZE := 7680k - DEVICE_PACKAGES := kmod-usb2 + DEVICE_PACKAGES := kmod-usb-chipidea2 SUPPORTED_DEVICES += dir-505-a1 endef TARGET_DEVICES += dlink_dir-505 From 9b880f09f394049e0629e3c9d4061f431a6b19a8 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 21 Oct 2021 17:09:28 +0200 Subject: [PATCH 31/36] hostapd: ubus: fix uninitialized pointer This fixes passing a bogus non-null pointer to the ubus handler in case the transition request is rejected. Signed-off-by: David Bauer --- package/network/services/hostapd/patches/600-ubus_support.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/network/services/hostapd/patches/600-ubus_support.patch b/package/network/services/hostapd/patches/600-ubus_support.patch index 7bb998dbb8..ccf66be6b8 100644 --- a/package/network/services/hostapd/patches/600-ubus_support.patch +++ b/package/network/services/hostapd/patches/600-ubus_support.patch @@ -520,7 +520,7 @@ { u8 dialog_token, status_code, bss_termination_delay; - const u8 *pos, *end; -+ const u8 *pos, *end, *target_bssid; ++ const u8 *pos, *end, *target_bssid = NULL; int enabled = hapd->conf->bss_transition; struct sta_info *sta; From d88f3b8a427acd1aef7ec3fc4c8e47c7a665d7d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Thu, 21 Oct 2021 17:26:56 +0200 Subject: [PATCH 32/36] bcm47xx: add kernel 5.10 support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's for *development* only as it doesn't work with lzma-loader due to bigger size. Signed-off-by: Rafał Miłecki --- target/linux/bcm47xx/Makefile | 2 +- target/linux/bcm47xx/config-5.10 | 210 ++++++++ .../bcm47xx/patches-5.10/159-cpu_fixes.patch | 493 ++++++++++++++++++ .../patches-5.10/160-kmap_coherent.patch | 78 +++ .../209-b44-register-adm-switch.patch | 121 +++++ .../patches-5.10/210-b44_phy_fix.patch | 54 ++ .../280-activate_ssb_support_in_usb.patch | 25 + .../patches-5.10/300-fork_cacheflush.patch | 21 + .../patches-5.10/310-no_highpage.patch | 74 +++ ...47XX-Devices-database-update-for-4.x.patch | 185 +++++++ .../400-mtd-bcm47xxpart-get-nvram.patch | 34 ++ .../patches-5.10/610-pci_ide_fix.patch | 41 ++ .../patches-5.10/791-tg3-no-pci-sleep.patch | 17 + ...f-serial-flashes-with-smaller-blocks.patch | 73 +++ .../patches-5.10/820-wgt634u-nvram-fix.patch | 296 +++++++++++ .../830-huawei_e970_support.patch | 101 ++++ .../patches-5.10/831-old_gpio_wdt.patch | 360 +++++++++++++ ...rites-setting-CardBus-bridge-resourc.patch | 30 ++ .../patches-5.10/940-bcm47xx-yenta.patch | 46 ++ .../976-ssb_increase_pci_delay.patch | 11 + .../bcm47xx/patches-5.10/999-wl_exports.patch | 24 + 21 files changed, 2295 insertions(+), 1 deletion(-) create mode 100644 target/linux/bcm47xx/config-5.10 create mode 100644 target/linux/bcm47xx/patches-5.10/159-cpu_fixes.patch create mode 100644 target/linux/bcm47xx/patches-5.10/160-kmap_coherent.patch create mode 100644 target/linux/bcm47xx/patches-5.10/209-b44-register-adm-switch.patch create mode 100644 target/linux/bcm47xx/patches-5.10/210-b44_phy_fix.patch create mode 100644 target/linux/bcm47xx/patches-5.10/280-activate_ssb_support_in_usb.patch create mode 100644 target/linux/bcm47xx/patches-5.10/300-fork_cacheflush.patch create mode 100644 target/linux/bcm47xx/patches-5.10/310-no_highpage.patch create mode 100644 target/linux/bcm47xx/patches-5.10/320-MIPS-BCM47XX-Devices-database-update-for-4.x.patch create mode 100644 target/linux/bcm47xx/patches-5.10/400-mtd-bcm47xxpart-get-nvram.patch create mode 100644 target/linux/bcm47xx/patches-5.10/610-pci_ide_fix.patch create mode 100644 target/linux/bcm47xx/patches-5.10/791-tg3-no-pci-sleep.patch create mode 100644 target/linux/bcm47xx/patches-5.10/800-bcma-add-table-of-serial-flashes-with-smaller-blocks.patch create mode 100644 target/linux/bcm47xx/patches-5.10/820-wgt634u-nvram-fix.patch create mode 100644 target/linux/bcm47xx/patches-5.10/830-huawei_e970_support.patch create mode 100644 target/linux/bcm47xx/patches-5.10/831-old_gpio_wdt.patch create mode 100644 target/linux/bcm47xx/patches-5.10/900-ssb-reject-PCI-writes-setting-CardBus-bridge-resourc.patch create mode 100644 target/linux/bcm47xx/patches-5.10/940-bcm47xx-yenta.patch create mode 100644 target/linux/bcm47xx/patches-5.10/976-ssb_increase_pci_delay.patch create mode 100644 target/linux/bcm47xx/patches-5.10/999-wl_exports.patch diff --git a/target/linux/bcm47xx/Makefile b/target/linux/bcm47xx/Makefile index 9ffd4f3f29..729ca1b573 100644 --- a/target/linux/bcm47xx/Makefile +++ b/target/linux/bcm47xx/Makefile @@ -11,7 +11,7 @@ FEATURES:=squashfs usb SUBTARGETS:=generic mips74k legacy KERNEL_PATCHVER:=5.4 -KERNEL_TESTING_PATCHVER:=5.4 +KERNEL_TESTING_PATCHVER:=5.10 define Target/Description Build firmware images for Broadcom based BCM47xx/53xx routers with MIPS CPU, *not* ARM. diff --git a/target/linux/bcm47xx/config-5.10 b/target/linux/bcm47xx/config-5.10 new file mode 100644 index 0000000000..297d6fce6d --- /dev/null +++ b/target/linux/bcm47xx/config-5.10 @@ -0,0 +1,210 @@ +CONFIG_ADM6996_PHY=y +CONFIG_ARCH_BINFMT_ELF_STATE=y +CONFIG_ARCH_CLOCKSOURCE_DATA=y +CONFIG_ARCH_DISCARD_MEMBLOCK=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_MMAP_RND_BITS_MAX=15 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=15 +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_USE_BUILTIN_BSWAP=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y +CONFIG_BCM47XX=y +CONFIG_BCM47XX_BCMA=y +CONFIG_BCM47XX_NVRAM=y +CONFIG_BCM47XX_SPROM=y +CONFIG_BCM47XX_SSB=y +CONFIG_BCM47XX_WDT=y +CONFIG_BCMA=y +CONFIG_BCMA_BLOCKIO=y +CONFIG_BCMA_DEBUG=y +CONFIG_BCMA_DRIVER_GMAC_CMN=y +CONFIG_BCMA_DRIVER_GPIO=y +CONFIG_BCMA_DRIVER_MIPS=y +CONFIG_BCMA_DRIVER_PCI=y +CONFIG_BCMA_DRIVER_PCI_HOSTMODE=y +CONFIG_BCMA_HOST_PCI=y +CONFIG_BCMA_HOST_PCI_POSSIBLE=y +CONFIG_BCMA_HOST_SOC=y +CONFIG_BCMA_NFLASH=y +CONFIG_BCMA_PFLASH=y +CONFIG_BCMA_SFLASH=y +# CONFIG_BGMAC_BCMA is not set +CONFIG_BLK_MQ_PCI=y +CONFIG_CEVT_R4K=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_CMDLINE="noinitrd console=ttyS0,115200" +CONFIG_CMDLINE_BOOL=y +# CONFIG_CMDLINE_OVERRIDE is not set +# CONFIG_COMMON_CLK is not set +CONFIG_COMPAT_32BIT_TIME=y +# CONFIG_CPU_BMIPS is not set +CONFIG_CPU_GENERIC_DUMP_TLB=y +CONFIG_CPU_HAS_PREFETCH=y +CONFIG_CPU_HAS_SYNC=y +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_CPU_MIPS32=y +CONFIG_CPU_MIPS32_R1=y +# CONFIG_CPU_MIPS32_R2 is not set +CONFIG_CPU_MIPSR1=y +CONFIG_CPU_MIPSR2_IRQ_VI=y +CONFIG_CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS=y +CONFIG_CPU_R4K_CACHE_TLB=y +CONFIG_CPU_R4K_FPU=y +CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y +CONFIG_CPU_SUPPORTS_HIGHMEM=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_WORKQUEUE=y +CONFIG_CSRC_R4K=y +CONFIG_DMA_DIRECT_OPS=y +CONFIG_DMA_NONCOHERENT=y +CONFIG_DMA_NONCOHERENT_CACHE_SYNC=y +CONFIG_DMA_NONCOHERENT_MMAP=y +CONFIG_DMA_NONCOHERENT_OPS=y +# CONFIG_EARLY_PRINTK is not set +CONFIG_FIXED_PHY=y +CONFIG_GENERIC_ATOMIC64=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_LIB_ASHLDI3=y +CONFIG_GENERIC_LIB_ASHRDI3=y +CONFIG_GENERIC_LIB_CMPDI2=y +CONFIG_GENERIC_LIB_LSHRDI3=y +CONFIG_GENERIC_LIB_UCMPDI2=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_GPIO_WDT=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_HARDWARE_WATCHPOINTS=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAVE_ARCH_COMPILER_H=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_ARCH_KGDB=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_CBPF_JIT=y +CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_COPY_THREAD_TLS=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_DEBUG_KMEMLEAK=y +CONFIG_HAVE_DEBUG_STACKOVERFLOW=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_HAVE_IDE=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +CONFIG_HAVE_LD_DEAD_CODE_DATA_ELIMINATION=y +CONFIG_HAVE_MEMBLOCK=y +CONFIG_HAVE_MEMBLOCK_NODE_MAP=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_HAVE_NET_DSA=y +CONFIG_HAVE_OPROFILE=y +CONFIG_HAVE_PERF_EVENTS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HW_HAS_PCI=y +CONFIG_HW_RANDOM=y +CONFIG_HZ_PERIODIC=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_MIPS_CPU=y +CONFIG_IRQ_WORK=y +CONFIG_LEDS_GPIO_REGISTER=y +CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_MDIO_BUS=y +CONFIG_MDIO_DEVICE=y +CONFIG_MEMFD_CREATE=y +CONFIG_MIGRATION=y +CONFIG_MIPS=y +CONFIG_MIPS_ASID_BITS=8 +CONFIG_MIPS_ASID_SHIFT=0 +CONFIG_MIPS_CLOCK_VSYSCALL=y +# CONFIG_MIPS_CMDLINE_BUILTIN_EXTEND is not set +CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER=y +CONFIG_MIPS_L1_CACHE_SHIFT=5 +CONFIG_MODULES_USE_ELF_REL=y +CONFIG_MTD_BCM47XXSFLASH=y +CONFIG_MTD_BCM47XX_PARTS=y +CONFIG_MTD_NAND=y +CONFIG_MTD_NAND_BCM47XXNFLASH=y +CONFIG_MTD_NAND_ECC=y +CONFIG_MTD_PARSER_TRX=y +CONFIG_MTD_PHYSMAP=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEED_PER_CPU_KM=y +CONFIG_NO_EXCEPT_FILL=y +CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y +# CONFIG_OF is not set +CONFIG_PCI=y +CONFIG_PCI_DISABLE_COMMON_QUIRKS=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DRIVERS_LEGACY=y +CONFIG_PERF_USE_VMALLOC=y +CONFIG_PGTABLE_LEVELS=2 +CONFIG_PHYLIB=y +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SRCU=y +CONFIG_SSB=y +CONFIG_SSB_B43_PCI_BRIDGE=y +CONFIG_SSB_BLOCKIO=y +CONFIG_SSB_DRIVER_EXTIF=y +CONFIG_SSB_DRIVER_GIGE=y +CONFIG_SSB_DRIVER_GPIO=y +CONFIG_SSB_DRIVER_MIPS=y +CONFIG_SSB_DRIVER_PCICORE=y +CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y +CONFIG_SSB_EMBEDDED=y +CONFIG_SSB_HOST_SOC=y +CONFIG_SSB_PCICORE_HOSTMODE=y +CONFIG_SSB_PCIHOST=y +CONFIG_SSB_PCIHOST_POSSIBLE=y +CONFIG_SSB_SERIAL=y +CONFIG_SSB_SFLASH=y +CONFIG_SSB_SPROM=y +CONFIG_SWCONFIG=y +CONFIG_SWCONFIG_B53=y +# CONFIG_SWCONFIG_B53_MMAP_DRIVER is not set +CONFIG_SWCONFIG_B53_PHY_DRIVER=y +CONFIG_SWCONFIG_B53_PHY_FIXUP=y +# CONFIG_SWCONFIG_B53_SRAB_DRIVER is not set +CONFIG_SWPHY=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_SYS_HAS_CPU_BMIPS=y +CONFIG_SYS_HAS_CPU_BMIPS32_3300=y +CONFIG_SYS_HAS_CPU_MIPS32_R1=y +CONFIG_SYS_HAS_CPU_MIPS32_R2=y +CONFIG_SYS_HAS_EARLY_PRINTK=y +CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y +CONFIG_SYS_SUPPORTS_ARBIT_HZ=y +CONFIG_SYS_SUPPORTS_HIGHMEM=y +CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y +CONFIG_SYS_SUPPORTS_MIPS16=y +CONFIG_SYS_SUPPORTS_ZBOOT=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TINY_SRCU=y +CONFIG_USB_SUPPORT=y +CONFIG_USE_GENERIC_EARLY_PRINTK_8250=y +CONFIG_WATCHDOG_CORE=y diff --git a/target/linux/bcm47xx/patches-5.10/159-cpu_fixes.patch b/target/linux/bcm47xx/patches-5.10/159-cpu_fixes.patch new file mode 100644 index 0000000000..0c9a9d6490 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/159-cpu_fixes.patch @@ -0,0 +1,493 @@ +--- a/arch/mips/include/asm/r4kcache.h ++++ b/arch/mips/include/asm/r4kcache.h +@@ -28,6 +28,38 @@ + extern void (*r4k_blast_dcache)(void); + extern void (*r4k_blast_icache)(void); + ++#if defined(CONFIG_BCM47XX) && !defined(CONFIG_CPU_MIPS32_R2) ++#include ++#include ++#define BCM4710_DUMMY_RREG() bcm4710_dummy_rreg() ++ ++static inline unsigned long bcm4710_dummy_rreg(void) ++{ ++ return *(volatile unsigned long *)(KSEG1ADDR(SSB_ENUM_BASE)); ++} ++ ++#define BCM4710_FILL_TLB(addr) bcm4710_fill_tlb((void *)(addr)) ++ ++static inline unsigned long bcm4710_fill_tlb(void *addr) ++{ ++ return *(unsigned long *)addr; ++} ++ ++#define BCM4710_PROTECTED_FILL_TLB(addr) bcm4710_protected_fill_tlb((void *)(addr)) ++ ++static inline void bcm4710_protected_fill_tlb(void *addr) ++{ ++ unsigned long x; ++ get_dbe(x, (unsigned long *)addr);; ++} ++ ++#else ++#define BCM4710_DUMMY_RREG() ++ ++#define BCM4710_FILL_TLB(addr) ++#define BCM4710_PROTECTED_FILL_TLB(addr) ++#endif ++ + /* + * This macro return a properly sign-extended address suitable as base address + * for indexed cache operations. Two issues here: +@@ -61,6 +93,7 @@ static inline void flush_icache_line_ind + + static inline void flush_dcache_line_indexed(unsigned long addr) + { ++ BCM4710_DUMMY_RREG(); + cache_op(Index_Writeback_Inv_D, addr); + } + +@@ -84,11 +117,13 @@ static inline void flush_icache_line(uns + + static inline void flush_dcache_line(unsigned long addr) + { ++ BCM4710_DUMMY_RREG(); + cache_op(Hit_Writeback_Inv_D, addr); + } + + static inline void invalidate_dcache_line(unsigned long addr) + { ++ BCM4710_DUMMY_RREG(); + cache_op(Hit_Invalidate_D, addr); + } + +@@ -161,6 +196,7 @@ static inline int protected_flush_icache + #ifdef CONFIG_EVA + return protected_cachee_op(Hit_Invalidate_I, addr); + #else ++ BCM4710_DUMMY_RREG(); + return protected_cache_op(Hit_Invalidate_I, addr); + #endif + } +@@ -174,6 +210,7 @@ static inline int protected_flush_icache + */ + static inline int protected_writeback_dcache_line(unsigned long addr) + { ++ BCM4710_DUMMY_RREG(); + #ifdef CONFIG_EVA + return protected_cachee_op(Hit_Writeback_Inv_D, addr); + #else +@@ -203,8 +240,51 @@ static inline void invalidate_tcache_pag + unroll(times, _cache_op, insn, op, (addr) + (i++ * (lsize))); \ + } while (0) + ++static inline void blast_dcache(void) ++{ ++ unsigned long start = KSEG0; ++ unsigned long dcache_size = current_cpu_data.dcache.waysize * current_cpu_data.dcache.ways; ++ unsigned long end = (start + dcache_size); ++ ++ do { ++ BCM4710_DUMMY_RREG(); ++ cache_op(Index_Writeback_Inv_D, start); ++ start += current_cpu_data.dcache.linesz; ++ } while(start < end); ++} ++ ++static inline void blast_dcache_page(unsigned long page) ++{ ++ unsigned long start = page; ++ unsigned long end = start + PAGE_SIZE; ++ ++ BCM4710_FILL_TLB(start); ++ do { ++ BCM4710_DUMMY_RREG(); ++ cache_op(Hit_Writeback_Inv_D, start); ++ start += current_cpu_data.dcache.linesz; ++ } while(start < end); ++} ++ ++static inline void blast_dcache_page_indexed(unsigned long page) ++{ ++ unsigned long start = page; ++ unsigned long end = start + PAGE_SIZE; ++ unsigned long ws_inc = 1UL << current_cpu_data.dcache.waybit; ++ unsigned long ws_end = current_cpu_data.dcache.ways << ++ current_cpu_data.dcache.waybit; ++ unsigned long ws, addr; ++ for (ws = 0; ws < ws_end; ws += ws_inc) { ++ start = page + ws; ++ for (addr = start; addr < end; addr += current_cpu_data.dcache.linesz) { ++ BCM4710_DUMMY_RREG(); ++ cache_op(Index_Writeback_Inv_D, addr); ++ } ++ } ++} ++ + /* build blast_xxx, blast_xxx_page, blast_xxx_page_indexed */ +-#define __BUILD_BLAST_CACHE(pfx, desc, indexop, hitop, lsize, extra) \ ++#define __BUILD_BLAST_CACHE(pfx, desc, indexop, hitop, lsize, extra, war) \ + static inline void extra##blast_##pfx##cache##lsize(void) \ + { \ + unsigned long start = INDEX_BASE; \ +@@ -214,6 +294,7 @@ static inline void extra##blast_##pfx##c + current_cpu_data.desc.waybit; \ + unsigned long ws, addr; \ + \ ++ war \ + for (ws = 0; ws < ws_end; ws += ws_inc) \ + for (addr = start; addr < end; addr += lsize * 32) \ + cache_unroll(32, kernel_cache, indexop, \ +@@ -225,6 +306,7 @@ static inline void extra##blast_##pfx##c + unsigned long start = page; \ + unsigned long end = page + PAGE_SIZE; \ + \ ++ war \ + do { \ + cache_unroll(32, kernel_cache, hitop, start, lsize); \ + start += lsize * 32; \ +@@ -241,32 +323,33 @@ static inline void extra##blast_##pfx##c + current_cpu_data.desc.waybit; \ + unsigned long ws, addr; \ + \ ++ war \ + for (ws = 0; ws < ws_end; ws += ws_inc) \ + for (addr = start; addr < end; addr += lsize * 32) \ + cache_unroll(32, kernel_cache, indexop, \ + addr | ws, lsize); \ + } + +-__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16, ) +-__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16, ) +-__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16, ) +-__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32, ) +-__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32, ) +-__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I_Loongson2, 32, loongson2_) +-__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32, ) +-__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 64, ) +-__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64, ) +-__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64, ) +-__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 128, ) +-__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 128, ) +-__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128, ) +- +-__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16, ) +-__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32, ) +-__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16, ) +-__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32, ) +-__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64, ) +-__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128, ) ++__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 16, , ) ++__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 16, , BCM4710_FILL_TLB(start);) ++__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 16, , ) ++__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 32, , ) ++__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 32, , BCM4710_FILL_TLB(start);) ++__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I_Loongson2, 32, loongson2_, BCM4710_FILL_TLB(start);) ++__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 32, , ) ++__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 64, , ) ++__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64, , BCM4710_FILL_TLB(start);) ++__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 64, , ) ++__BUILD_BLAST_CACHE(d, dcache, Index_Writeback_Inv_D, Hit_Writeback_Inv_D, 128, , ) ++__BUILD_BLAST_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 128, , ) ++__BUILD_BLAST_CACHE(s, scache, Index_Writeback_Inv_SD, Hit_Writeback_Inv_SD, 128, , ) ++ ++__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 16, , ) ++__BUILD_BLAST_CACHE(inv_d, dcache, Index_Writeback_Inv_D, Hit_Invalidate_D, 32, , ) ++__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 16, , ) ++__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 32, , ) ++__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 64, , ) ++__BUILD_BLAST_CACHE(inv_s, scache, Index_Writeback_Inv_SD, Hit_Invalidate_SD, 128, , ) + + #define __BUILD_BLAST_USER_CACHE(pfx, desc, indexop, hitop, lsize) \ + static inline void blast_##pfx##cache##lsize##_user_page(unsigned long page) \ +@@ -291,58 +374,29 @@ __BUILD_BLAST_USER_CACHE(d, dcache, Inde + __BUILD_BLAST_USER_CACHE(i, icache, Index_Invalidate_I, Hit_Invalidate_I, 64) + + /* build blast_xxx_range, protected_blast_xxx_range */ +-#define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot, extra) \ ++#define __BUILD_BLAST_CACHE_RANGE(pfx, desc, hitop, prot, extra, war, war2) \ + static inline void prot##extra##blast_##pfx##cache##_range(unsigned long start, \ + unsigned long end) \ + { \ + unsigned long lsize = cpu_##desc##_line_size(); \ +- unsigned long lsize_2 = lsize * 2; \ +- unsigned long lsize_3 = lsize * 3; \ +- unsigned long lsize_4 = lsize * 4; \ +- unsigned long lsize_5 = lsize * 5; \ +- unsigned long lsize_6 = lsize * 6; \ +- unsigned long lsize_7 = lsize * 7; \ +- unsigned long lsize_8 = lsize * 8; \ + unsigned long addr = start & ~(lsize - 1); \ +- unsigned long aend = (end + lsize - 1) & ~(lsize - 1); \ +- int lines = (aend - addr) / lsize; \ +- \ +- while (lines >= 8) { \ +- prot##cache_op(hitop, addr); \ +- prot##cache_op(hitop, addr + lsize); \ +- prot##cache_op(hitop, addr + lsize_2); \ +- prot##cache_op(hitop, addr + lsize_3); \ +- prot##cache_op(hitop, addr + lsize_4); \ +- prot##cache_op(hitop, addr + lsize_5); \ +- prot##cache_op(hitop, addr + lsize_6); \ +- prot##cache_op(hitop, addr + lsize_7); \ +- addr += lsize_8; \ +- lines -= 8; \ +- } \ +- \ +- if (lines & 0x4) { \ +- prot##cache_op(hitop, addr); \ +- prot##cache_op(hitop, addr + lsize); \ +- prot##cache_op(hitop, addr + lsize_2); \ +- prot##cache_op(hitop, addr + lsize_3); \ +- addr += lsize_4; \ +- } \ ++ unsigned long aend = (end - 1) & ~(lsize - 1); \ + \ +- if (lines & 0x2) { \ +- prot##cache_op(hitop, addr); \ +- prot##cache_op(hitop, addr + lsize); \ +- addr += lsize_2; \ +- } \ ++ war \ + \ +- if (lines & 0x1) { \ ++ while (1) { \ ++ war2 \ + prot##cache_op(hitop, addr); \ ++ if (addr == aend) \ ++ break; \ ++ addr += lsize; \ + } \ + } + + #ifndef CONFIG_EVA + +-__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_, ) +-__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_, ) ++__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, protected_, , BCM4710_PROTECTED_FILL_TLB(addr); BCM4710_PROTECTED_FILL_TLB(aend);, BCM4710_DUMMY_RREG();) ++__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, protected_, , , ) + + #else + +@@ -376,15 +430,15 @@ __BUILD_PROT_BLAST_CACHE_RANGE(d, dcache + __BUILD_PROT_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I) + + #endif +-__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_, ) ++__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, protected_, , , ) + __BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I_Loongson2, \ +- protected_, loongson2_) +-__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, , ) +-__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, , ) +-__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, , ) ++ protected_, loongson2_, , ) ++__BUILD_BLAST_CACHE_RANGE(d, dcache, Hit_Writeback_Inv_D, , , BCM4710_FILL_TLB(addr); BCM4710_FILL_TLB(aend);, BCM4710_DUMMY_RREG();) ++__BUILD_BLAST_CACHE_RANGE(i, icache, Hit_Invalidate_I, , , , ) ++__BUILD_BLAST_CACHE_RANGE(s, scache, Hit_Writeback_Inv_SD, , , , ) + /* blast_inv_dcache_range */ +-__BUILD_BLAST_CACHE_RANGE(inv_d, dcache, Hit_Invalidate_D, , ) +-__BUILD_BLAST_CACHE_RANGE(inv_s, scache, Hit_Invalidate_SD, , ) ++__BUILD_BLAST_CACHE_RANGE(inv_d, dcache, Hit_Invalidate_D, , , , BCM4710_DUMMY_RREG();) ++__BUILD_BLAST_CACHE_RANGE(inv_s, scache, Hit_Invalidate_SD, , , , ) + + /* Currently, this is very specific to Loongson-3 */ + #define __BUILD_BLAST_CACHE_NODE(pfx, desc, indexop, hitop, lsize) \ +--- a/arch/mips/include/asm/stackframe.h ++++ b/arch/mips/include/asm/stackframe.h +@@ -429,6 +429,10 @@ + #else + .set push + .set arch=r4000 ++#ifdef CONFIG_BCM47XX ++ nop ++ nop ++#endif + eret + .set pop + #endif +--- a/arch/mips/kernel/genex.S ++++ b/arch/mips/kernel/genex.S +@@ -22,6 +22,19 @@ + #include + #include + ++#ifdef CONFIG_BCM47XX ++# ifdef eret ++# undef eret ++# endif ++# define eret \ ++ .set push; \ ++ .set noreorder; \ ++ nop; \ ++ nop; \ ++ eret; \ ++ .set pop; ++#endif ++ + __INIT + + /* +@@ -33,6 +46,9 @@ + NESTED(except_vec3_generic, 0, sp) + .set push + .set noat ++#ifdef CONFIG_BCM47XX ++ nop ++#endif + mfc0 k1, CP0_CAUSE + andi k1, k1, 0x7c + #ifdef CONFIG_64BIT +@@ -53,6 +69,9 @@ NESTED(except_vec3_r4000, 0, sp) + .set push + .set arch=r4000 + .set noat ++#ifdef CONFIG_BCM47XX ++ nop ++#endif + mfc0 k1, CP0_CAUSE + li k0, 31<<2 + andi k1, k1, 0x7c +--- a/arch/mips/mm/c-r4k.c ++++ b/arch/mips/mm/c-r4k.c +@@ -38,6 +38,9 @@ + #include + #include + ++/* For enabling BCM4710 cache workarounds */ ++static int bcm4710 = 0; ++ + /* + * Bits describing what cache ops an SMP callback function may perform. + * +@@ -190,6 +193,9 @@ static void r4k_blast_dcache_user_page_s + { + unsigned long dc_lsize = cpu_dcache_line_size(); + ++ if (bcm4710) ++ r4k_blast_dcache_page = blast_dcache_page; ++ else + if (dc_lsize == 0) + r4k_blast_dcache_user_page = (void *)cache_noop; + else if (dc_lsize == 16) +@@ -208,6 +214,9 @@ static void r4k_blast_dcache_page_indexe + { + unsigned long dc_lsize = cpu_dcache_line_size(); + ++ if (bcm4710) ++ r4k_blast_dcache_page_indexed = blast_dcache_page_indexed; ++ else + if (dc_lsize == 0) + r4k_blast_dcache_page_indexed = (void *)cache_noop; + else if (dc_lsize == 16) +@@ -227,6 +236,9 @@ static void r4k_blast_dcache_setup(void) + { + unsigned long dc_lsize = cpu_dcache_line_size(); + ++ if (bcm4710) ++ r4k_blast_dcache = blast_dcache; ++ else + if (dc_lsize == 0) + r4k_blast_dcache = (void *)cache_noop; + else if (dc_lsize == 16) +@@ -1818,6 +1830,17 @@ static void coherency_setup(void) + * silly idea of putting something else there ... + */ + switch (current_cpu_type()) { ++ case CPU_BMIPS3300: ++ { ++ u32 cm; ++ cm = read_c0_diag(); ++ /* Enable icache */ ++ cm |= (1 << 31); ++ /* Enable dcache */ ++ cm |= (1 << 30); ++ write_c0_diag(cm); ++ } ++ break; + case CPU_R4000PC: + case CPU_R4000SC: + case CPU_R4000MC: +@@ -1864,6 +1887,15 @@ void r4k_cache_init(void) + extern void build_copy_page(void); + struct cpuinfo_mips *c = ¤t_cpu_data; + ++ /* Check if special workarounds are required */ ++#if defined(CONFIG_BCM47XX) && !defined(CONFIG_CPU_MIPS32_R2) ++ if (current_cpu_data.cputype == CPU_BMIPS32 && (current_cpu_data.processor_id & 0xff) == 0) { ++ printk("Enabling BCM4710A0 cache workarounds.\n"); ++ bcm4710 = 1; ++ } else ++#endif ++ bcm4710 = 0; ++ + probe_pcache(); + probe_vcache(); + setup_scache(); +@@ -1940,7 +1972,15 @@ void r4k_cache_init(void) + */ + local_r4k___flush_cache_all(NULL); + ++#ifdef CONFIG_BCM47XX ++ { ++ static void (*_coherency_setup)(void); ++ _coherency_setup = (void (*)(void)) KSEG1ADDR(coherency_setup); ++ _coherency_setup(); ++ } ++#else + coherency_setup(); ++#endif + board_cache_error_setup = r4k_cache_error_setup; + + /* +--- a/arch/mips/mm/tlbex.c ++++ b/arch/mips/mm/tlbex.c +@@ -984,6 +984,9 @@ void build_get_pgde32(u32 **p, unsigned + uasm_i_srl(p, ptr, ptr, SMP_CPUID_PTRSHIFT); + uasm_i_addu(p, ptr, tmp, ptr); + #else ++#ifdef CONFIG_BCM47XX ++ uasm_i_nop(p); ++#endif + UASM_i_LA_mostly(p, ptr, pgdc); + #endif + uasm_i_mfc0(p, tmp, C0_BADVADDR); /* get faulting address */ +@@ -1345,6 +1348,9 @@ static void build_r4000_tlb_refill_handl + #ifdef CONFIG_64BIT + build_get_pmde64(&p, &l, &r, K0, K1); /* get pmd in K1 */ + #else ++# ifdef CONFIG_BCM47XX ++ uasm_i_nop(&p); ++# endif + build_get_pgde32(&p, K0, K1); /* get pgd in K1 */ + #endif + +@@ -1356,6 +1362,9 @@ static void build_r4000_tlb_refill_handl + build_update_entries(&p, K0, K1); + build_tlb_write_entry(&p, &l, &r, tlb_random); + uasm_l_leave(&l, p); ++#ifdef CONFIG_BCM47XX ++ uasm_i_nop(&p); ++#endif + uasm_i_eret(&p); /* return from trap */ + } + #ifdef CONFIG_MIPS_HUGE_TLB_SUPPORT +@@ -2056,6 +2065,9 @@ build_r4000_tlbchange_handler_head(u32 * + #ifdef CONFIG_64BIT + build_get_pmde64(p, l, r, wr.r1, wr.r2); /* get pmd in ptr */ + #else ++# ifdef CONFIG_BCM47XX ++ uasm_i_nop(p); ++# endif + build_get_pgde32(p, wr.r1, wr.r2); /* get pgd in ptr */ + #endif + +@@ -2102,6 +2114,9 @@ build_r4000_tlbchange_handler_tail(u32 * + build_tlb_write_entry(p, l, r, tlb_indexed); + uasm_l_leave(l, *p); + build_restore_work_registers(p); ++#ifdef CONFIG_BCM47XX ++ uasm_i_nop(p); ++#endif + uasm_i_eret(p); /* return from trap */ + + #ifdef CONFIG_64BIT diff --git a/target/linux/bcm47xx/patches-5.10/160-kmap_coherent.patch b/target/linux/bcm47xx/patches-5.10/160-kmap_coherent.patch new file mode 100644 index 0000000000..caa3d9816b --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/160-kmap_coherent.patch @@ -0,0 +1,78 @@ +From: Jeff Hansen +Subject: [PATCH] kmap_coherent + +On ASUS WL-500gP there are some "Data bus error"s when executing simple +commands liks "ps" or "cat /proc/1/cmdline". + +This fixes OpenWrt ticket #1485: https://dev.openwrt.org/ticket/1485 +--- +--- a/arch/mips/include/asm/cpu-features.h ++++ b/arch/mips/include/asm/cpu-features.h +@@ -242,6 +242,9 @@ + #ifndef cpu_has_pindexed_dcache + #define cpu_has_pindexed_dcache (cpu_data[0].dcache.flags & MIPS_CACHE_PINDEX) + #endif ++#ifndef cpu_use_kmap_coherent ++#define cpu_use_kmap_coherent 1 ++#endif + + /* + * I-Cache snoops remote store. This only matters on SMP. Some multiprocessors +--- a/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h ++++ b/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h +@@ -80,4 +80,6 @@ + #define cpu_scache_line_size() 0 + #define cpu_has_vz 0 + ++#define cpu_use_kmap_coherent 0 ++ + #endif /* __ASM_MACH_BCM47XX_CPU_FEATURE_OVERRIDES_H */ +--- a/arch/mips/mm/c-r4k.c ++++ b/arch/mips/mm/c-r4k.c +@@ -699,7 +699,7 @@ static inline void local_r4k_flush_cache + map_coherent = (cpu_has_dc_aliases && + page_mapcount(page) && + !Page_dcache_dirty(page)); +- if (map_coherent) ++ if (map_coherent && cpu_use_kmap_coherent) + vaddr = kmap_coherent(page, addr); + else + vaddr = kmap_atomic(page); +@@ -721,7 +721,7 @@ static inline void local_r4k_flush_cache + } + + if (vaddr) { +- if (map_coherent) ++ if (map_coherent && cpu_use_kmap_coherent) + kunmap_coherent(); + else + kunmap_atomic(vaddr); +--- a/arch/mips/mm/init.c ++++ b/arch/mips/mm/init.c +@@ -173,7 +173,7 @@ void copy_user_highpage(struct page *to, + void *vfrom, *vto; + + vto = kmap_atomic(to); +- if (cpu_has_dc_aliases && ++ if (cpu_has_dc_aliases && cpu_use_kmap_coherent && + page_mapcount(from) && !Page_dcache_dirty(from)) { + vfrom = kmap_coherent(from, vaddr); + copy_page(vto, vfrom); +@@ -195,7 +195,7 @@ void copy_to_user_page(struct vm_area_st + struct page *page, unsigned long vaddr, void *dst, const void *src, + unsigned long len) + { +- if (cpu_has_dc_aliases && ++ if (cpu_has_dc_aliases && cpu_use_kmap_coherent && + page_mapcount(page) && !Page_dcache_dirty(page)) { + void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK); + memcpy(vto, src, len); +@@ -213,7 +213,7 @@ void copy_from_user_page(struct vm_area_ + struct page *page, unsigned long vaddr, void *dst, const void *src, + unsigned long len) + { +- if (cpu_has_dc_aliases && ++ if (cpu_has_dc_aliases && cpu_use_kmap_coherent && + page_mapcount(page) && !Page_dcache_dirty(page)) { + void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK); + memcpy(dst, vfrom, len); diff --git a/target/linux/bcm47xx/patches-5.10/209-b44-register-adm-switch.patch b/target/linux/bcm47xx/patches-5.10/209-b44-register-adm-switch.patch new file mode 100644 index 0000000000..7728ec1094 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/209-b44-register-adm-switch.patch @@ -0,0 +1,121 @@ +From b36f694256f41bc71571f467646d015dda128d14 Mon Sep 17 00:00:00 2001 +From: Hauke Mehrtens +Date: Sat, 9 Nov 2013 17:03:59 +0100 +Subject: [PATCH 210/210] b44: register adm switch + +--- + drivers/net/ethernet/broadcom/b44.c | 57 +++++++++++++++++++++++++++++++++++ + drivers/net/ethernet/broadcom/b44.h | 3 ++ + 2 files changed, 60 insertions(+) + +--- a/drivers/net/ethernet/broadcom/b44.c ++++ b/drivers/net/ethernet/broadcom/b44.c +@@ -31,6 +31,8 @@ + #include + #include + #include ++#include ++#include + + #include + #include +@@ -2243,6 +2245,69 @@ static void b44_adjust_link(struct net_d + } + } + ++#ifdef CONFIG_BCM47XX ++static int b44_register_adm_switch(struct b44 *bp) ++{ ++ int gpio; ++ struct platform_device *pdev; ++ struct adm6996_gpio_platform_data adm_data = {0}; ++ struct platform_device_info info = {0}; ++ ++ adm_data.model = ADM6996L; ++ gpio = bcm47xx_nvram_gpio_pin("adm_eecs"); ++ if (gpio >= 0) ++ adm_data.eecs = gpio; ++ else ++ adm_data.eecs = 2; ++ ++ gpio = bcm47xx_nvram_gpio_pin("adm_eesk"); ++ if (gpio >= 0) ++ adm_data.eesk = gpio; ++ else ++ adm_data.eesk = 3; ++ ++ gpio = bcm47xx_nvram_gpio_pin("adm_eedi"); ++ if (gpio >= 0) ++ adm_data.eedi = gpio; ++ else ++ adm_data.eedi = 4; ++ ++ /* ++ * We ignore the "adm_rc" GPIO here. The driver does not use it, ++ * and it conflicts with the Reset button GPIO on the Linksys WRT54GSv1. ++ */ ++ ++ info.parent = bp->sdev->dev; ++ info.name = "adm6996_gpio"; ++ info.id = -1; ++ info.data = &adm_data; ++ info.size_data = sizeof(adm_data); ++ ++ if (!bp->adm_switch) { ++ pdev = platform_device_register_full(&info); ++ if (IS_ERR(pdev)) ++ return PTR_ERR(pdev); ++ ++ bp->adm_switch = pdev; ++ } ++ return 0; ++} ++static void b44_unregister_adm_switch(struct b44 *bp) ++{ ++ if (bp->adm_switch) ++ platform_device_unregister(bp->adm_switch); ++} ++#else ++static int b44_register_adm_switch(struct b44 *bp) ++{ ++ return 0; ++} ++static void b44_unregister_adm_switch(struct b44 *bp) ++{ ++ ++} ++#endif /* CONFIG_BCM47XX */ ++ + static int b44_register_phy_one(struct b44 *bp) + { + __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; +@@ -2279,6 +2344,9 @@ static int b44_register_phy_one(struct b + if (!mdiobus_is_registered_device(bp->mii_bus, bp->phy_addr) && + (sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) { + ++ if (sprom->boardflags_lo & B44_BOARDFLAG_ADM) ++ b44_register_adm_switch(bp); ++ + dev_info(sdev->dev, + "could not find PHY at %i, use fixed one\n", + bp->phy_addr); +@@ -2473,6 +2541,7 @@ static void b44_remove_one(struct ssb_de + unregister_netdev(dev); + if (bp->flags & B44_FLAG_EXTERNAL_PHY) + b44_unregister_phy_one(bp); ++ b44_unregister_adm_switch(bp); + ssb_device_disable(sdev, 0); + ssb_bus_may_powerdown(sdev->bus); + netif_napi_del(&bp->napi); +--- a/drivers/net/ethernet/broadcom/b44.h ++++ b/drivers/net/ethernet/broadcom/b44.h +@@ -408,6 +408,9 @@ struct b44 { + struct mii_bus *mii_bus; + int old_link; + struct mii_if_info mii_if; ++ ++ /* platform device for associated switch */ ++ struct platform_device *adm_switch; + }; + + #endif /* _B44_H */ diff --git a/target/linux/bcm47xx/patches-5.10/210-b44_phy_fix.patch b/target/linux/bcm47xx/patches-5.10/210-b44_phy_fix.patch new file mode 100644 index 0000000000..bedebc415e --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/210-b44_phy_fix.patch @@ -0,0 +1,54 @@ +--- a/drivers/net/ethernet/broadcom/b44.c ++++ b/drivers/net/ethernet/broadcom/b44.c +@@ -429,10 +429,34 @@ static void b44_wap54g10_workaround(stru + error: + pr_warn("PHY: cannot reset MII transceiver isolate bit\n"); + } ++ ++static void b44_bcm47xx_workarounds(struct b44 *bp) ++{ ++ char buf[20]; ++ struct ssb_device *sdev = bp->sdev; ++ ++ /* Toshiba WRC-1000, Siemens SE505 v1, Askey RT-210W, RT-220W */ ++ if (sdev->bus->sprom.board_num == 100) { ++ bp->phy_addr = B44_PHY_ADDR_NO_LOCAL_PHY; ++ } else { ++ /* WL-HDD */ ++ if (bcm47xx_nvram_getenv("hardware_version", buf, sizeof(buf)) >= 0 && ++ !strncmp(buf, "WL300-", strlen("WL300-"))) { ++ if (sdev->bus->sprom.et0phyaddr == 0 && ++ sdev->bus->sprom.et1phyaddr == 1) ++ bp->phy_addr = B44_PHY_ADDR_NO_LOCAL_PHY; ++ } ++ } ++ return; ++} + #else + static inline void b44_wap54g10_workaround(struct b44 *bp) + { + } ++ ++static inline void b44_bcm47xx_workarounds(struct b44 *bp) ++{ ++} + #endif + + static int b44_setup_phy(struct b44 *bp) +@@ -441,6 +465,7 @@ static int b44_setup_phy(struct b44 *bp) + int err; + + b44_wap54g10_workaround(bp); ++ b44_bcm47xx_workarounds(bp); + + if (bp->flags & B44_FLAG_EXTERNAL_PHY) + return 0; +@@ -2173,6 +2198,8 @@ static int b44_get_invariants(struct b44 + * valid PHY address. */ + bp->phy_addr &= 0x1F; + ++ b44_bcm47xx_workarounds(bp); ++ + memcpy(bp->dev->dev_addr, addr, ETH_ALEN); + + if (!is_valid_ether_addr(&bp->dev->dev_addr[0])){ diff --git a/target/linux/bcm47xx/patches-5.10/280-activate_ssb_support_in_usb.patch b/target/linux/bcm47xx/patches-5.10/280-activate_ssb_support_in_usb.patch new file mode 100644 index 0000000000..de8bb4297d --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/280-activate_ssb_support_in_usb.patch @@ -0,0 +1,25 @@ +This prevents the options from being delete with make kernel_oldconfig. +--- + drivers/ssb/Kconfig | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/bcma/Kconfig ++++ b/drivers/bcma/Kconfig +@@ -32,6 +32,7 @@ config BCMA_HOST_PCI + config BCMA_HOST_SOC + bool "Support for BCMA in a SoC" + depends on HAS_IOMEM ++ select USB_HCD_BCMA if USB_EHCI_HCD || USB_OHCI_HCD + help + Host interface for a Broadcom AIX bus directly mapped into + the memory. This only works with the Broadcom SoCs from the +--- a/drivers/ssb/Kconfig ++++ b/drivers/ssb/Kconfig +@@ -136,6 +136,7 @@ config SSB_SFLASH + config SSB_EMBEDDED + bool + depends on SSB_DRIVER_MIPS && SSB_PCICORE_HOSTMODE ++ select USB_HCD_SSB if USB_EHCI_HCD || USB_OHCI_HCD + default y + + config SSB_DRIVER_EXTIF diff --git a/target/linux/bcm47xx/patches-5.10/300-fork_cacheflush.patch b/target/linux/bcm47xx/patches-5.10/300-fork_cacheflush.patch new file mode 100644 index 0000000000..daa2c1adf0 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/300-fork_cacheflush.patch @@ -0,0 +1,21 @@ +From: Wolfram Joost +Subject: [PATCH] fork_cacheflush + +On ASUS WL-500gP there are many unexpected "Segmentation fault"s that +seem to be caused by a kernel. They can be avoided by: +1) Disabling highpage +2) Using flush_cache_mm in flush_cache_dup_mm + +For details see OpenWrt ticket #2035 https://dev.openwrt.org/ticket/2035 +--- +--- a/arch/mips/include/asm/cacheflush.h ++++ b/arch/mips/include/asm/cacheflush.h +@@ -46,7 +46,7 @@ + extern void (*flush_cache_all)(void); + extern void (*__flush_cache_all)(void); + extern void (*flush_cache_mm)(struct mm_struct *mm); +-#define flush_cache_dup_mm(mm) do { (void) (mm); } while (0) ++#define flush_cache_dup_mm(mm) flush_cache_mm(mm) + extern void (*flush_cache_range)(struct vm_area_struct *vma, + unsigned long start, unsigned long end); + extern void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn); diff --git a/target/linux/bcm47xx/patches-5.10/310-no_highpage.patch b/target/linux/bcm47xx/patches-5.10/310-no_highpage.patch new file mode 100644 index 0000000000..b1dcdf9cb2 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/310-no_highpage.patch @@ -0,0 +1,74 @@ +From: Jeff Hansen +Subject: [PATCH] no highpage + +On ASUS WL-500gP there are many unexpected "Segmentation fault"s that +seem to be caused by a kernel. They can be avoided by: +1) Disabling highpage +2) Using flush_cache_mm in flush_cache_dup_mm + +For details see OpenWrt ticket #2035 https://dev.openwrt.org/ticket/2035 +--- +--- a/arch/mips/include/asm/page.h ++++ b/arch/mips/include/asm/page.h +@@ -71,6 +71,7 @@ static inline unsigned int page_size_ftl + #endif /* CONFIG_MIPS_HUGE_TLB_SUPPORT */ + + #include ++#include + + extern void build_clear_page(void); + extern void build_copy_page(void); +@@ -110,11 +111,16 @@ static inline void clear_user_page(void + flush_data_cache_page((unsigned long)addr); + } + +-struct vm_area_struct; +-extern void copy_user_highpage(struct page *to, struct page *from, +- unsigned long vaddr, struct vm_area_struct *vma); ++static inline void copy_user_page(void *vto, void *vfrom, unsigned long vaddr, ++ struct page *to) ++{ ++ extern void (*flush_data_cache_page)(unsigned long addr); + +-#define __HAVE_ARCH_COPY_USER_HIGHPAGE ++ copy_page(vto, vfrom); ++ if (!cpu_has_ic_fills_f_dc || ++ pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK)) ++ flush_data_cache_page((unsigned long)vto); ++} + + /* + * These are used to make use of C type-checking.. +--- a/arch/mips/mm/init.c ++++ b/arch/mips/mm/init.c +@@ -167,30 +167,6 @@ void kunmap_coherent(void) + preempt_enable(); + } + +-void copy_user_highpage(struct page *to, struct page *from, +- unsigned long vaddr, struct vm_area_struct *vma) +-{ +- void *vfrom, *vto; +- +- vto = kmap_atomic(to); +- if (cpu_has_dc_aliases && cpu_use_kmap_coherent && +- page_mapcount(from) && !Page_dcache_dirty(from)) { +- vfrom = kmap_coherent(from, vaddr); +- copy_page(vto, vfrom); +- kunmap_coherent(); +- } else { +- vfrom = kmap_atomic(from); +- copy_page(vto, vfrom); +- kunmap_atomic(vfrom); +- } +- if ((!cpu_has_ic_fills_f_dc) || +- pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK)) +- flush_data_cache_page((unsigned long)vto); +- kunmap_atomic(vto); +- /* Make sure this page is cleared on other CPU's too before using it */ +- smp_wmb(); +-} +- + void copy_to_user_page(struct vm_area_struct *vma, + struct page *page, unsigned long vaddr, void *dst, const void *src, + unsigned long len) diff --git a/target/linux/bcm47xx/patches-5.10/320-MIPS-BCM47XX-Devices-database-update-for-4.x.patch b/target/linux/bcm47xx/patches-5.10/320-MIPS-BCM47XX-Devices-database-update-for-4.x.patch new file mode 100644 index 0000000000..bde811c195 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/320-MIPS-BCM47XX-Devices-database-update-for-4.x.patch @@ -0,0 +1,185 @@ +--- a/arch/mips/bcm47xx/board.c ++++ b/arch/mips/bcm47xx/board.c +@@ -141,6 +141,7 @@ struct bcm47xx_board_type_list2 bcm47xx_ + {{BCM47XX_BOARD_LINKSYS_WRT300NV11, "Linksys WRT300N V1.1"}, "WRT300N", "1.1"}, + {{BCM47XX_BOARD_LINKSYS_WRT310NV1, "Linksys WRT310N V1"}, "WRT310N", "1.0"}, + {{BCM47XX_BOARD_LINKSYS_WRT310NV2, "Linksys WRT310N V2"}, "WRT310N", "2.0"}, ++ {{BCM47XX_BOARD_LINKSYS_WRT320N_V1, "Linksys WRT320N V1"}, "WRT320N", "1.0"}, + {{BCM47XX_BOARD_LINKSYS_WRT54G3GV2, "Linksys WRT54G3GV2-VF"}, "WRT54G3GV2-VF", "1.0"}, + {{BCM47XX_BOARD_LINKSYS_WRT610NV1, "Linksys WRT610N V1"}, "WRT610N", "1.0"}, + {{BCM47XX_BOARD_LINKSYS_WRT610NV2, "Linksys WRT610N V2"}, "WRT610N", "2.0"}, +@@ -161,9 +162,12 @@ struct bcm47xx_board_type_list1 bcm47xx_ + {{BCM47XX_BOARD_LUXUL_XWR_600_V1, "Luxul XWR-600 V1"}, "luxul_xwr600_v1"}, + {{BCM47XX_BOARD_LUXUL_XWR_1750_V1, "Luxul XWR-1750 V1"}, "luxul_xwr1750_v1"}, + {{BCM47XX_BOARD_NETGEAR_R6200_V1, "Netgear R6200 V1"}, "U12H192T00_NETGEAR"}, ++ {{BCM47XX_BOARD_NETGEAR_R6300_V1, "Netgear R6300 V1"}, "U12H218T00_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WGR614V8, "Netgear WGR614 V8"}, "U12H072T00_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WGR614V9, "Netgear WGR614 V9"}, "U12H094T00_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WGR614_V10, "Netgear WGR614 V10"}, "U12H139T01_NETGEAR"}, ++ {{BCM47XX_BOARD_NETGEAR_WN2500RP_V1, "Netgear WN2500RP V1"}, "U12H197T00_NETGEAR"}, ++ {{BCM47XX_BOARD_NETGEAR_WN2500RP_V2, "Netgear WN2500RP V2"}, "U12H294T00_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WNDR3300, "Netgear WNDR3300"}, "U12H093T00_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WNDR3400V1, "Netgear WNDR3400 V1"}, "U12H155T00_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WNDR3400V2, "Netgear WNDR3400 V2"}, "U12H187T00_NETGEAR"}, +--- a/arch/mips/bcm47xx/buttons.c ++++ b/arch/mips/bcm47xx/buttons.c +@@ -27,6 +27,12 @@ + /* Asus */ + + static const struct gpio_keys_button ++bcm47xx_buttons_asus_rtn10u[] __initconst = { ++ BCM47XX_GPIO_KEY(20, KEY_WPS_BUTTON), ++ BCM47XX_GPIO_KEY(21, KEY_RESTART), ++}; ++ ++static const struct gpio_keys_button + bcm47xx_buttons_asus_rtn12[] __initconst = { + BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), + BCM47XX_GPIO_KEY(1, KEY_RESTART), +@@ -277,6 +283,18 @@ bcm47xx_buttons_linksys_wrt310nv1[] __in + }; + + static const struct gpio_keys_button ++bcm47xx_buttons_linksys_wrt310n_v2[] __initconst = { ++ BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), ++ BCM47XX_GPIO_KEY(6, KEY_RESTART), ++}; ++ ++static const struct gpio_keys_button ++bcm47xx_buttons_linksys_wrt320n_v1[] __initconst = { ++ BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), ++ BCM47XX_GPIO_KEY(8, KEY_RESTART), ++}; ++ ++static const struct gpio_keys_button + bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst = { + BCM47XX_GPIO_KEY(5, KEY_WIMAX), + BCM47XX_GPIO_KEY(6, KEY_RESTART), +@@ -392,6 +410,17 @@ bcm47xx_buttons_netgear_r6200_v1[] __ini + }; + + static const struct gpio_keys_button ++bcm47xx_buttons_netgear_r6300_v1[] __initconst = { ++ BCM47XX_GPIO_KEY(6, KEY_RESTART), ++}; ++ ++static const struct gpio_keys_button ++bcm47xx_buttons_netgear_wn2500rp_v1[] __initconst = { ++ BCM47XX_GPIO_KEY(12, KEY_RESTART), ++ BCM47XX_GPIO_KEY(31, KEY_WPS_BUTTON), ++}; ++ ++static const struct gpio_keys_button + bcm47xx_buttons_netgear_wndr3400v1[] __initconst = { + BCM47XX_GPIO_KEY(4, KEY_RESTART), + BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), +@@ -478,6 +507,9 @@ int __init bcm47xx_buttons_register(void + int err; + + switch (board) { ++ case BCM47XX_BOARD_ASUS_RTN10U: ++ err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn10u); ++ break; + case BCM47XX_BOARD_ASUS_RTN12: + err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn12); + break; +@@ -608,6 +640,12 @@ int __init bcm47xx_buttons_register(void + case BCM47XX_BOARD_LINKSYS_WRT310NV1: + err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1); + break; ++ case BCM47XX_BOARD_LINKSYS_WRT310NV2: ++ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310n_v2); ++ break; ++ case BCM47XX_BOARD_LINKSYS_WRT320N_V1: ++ err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt320n_v1); ++ break; + case BCM47XX_BOARD_LINKSYS_WRT54G3GV2: + err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g3gv2); + break; +@@ -674,6 +712,12 @@ int __init bcm47xx_buttons_register(void + case BCM47XX_BOARD_NETGEAR_R6200_V1: + err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6200_v1); + break; ++ case BCM47XX_BOARD_NETGEAR_R6300_V1: ++ err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6300_v1); ++ break; ++ case BCM47XX_BOARD_NETGEAR_WN2500RP_V1: ++ err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wn2500rp_v1); ++ break; + case BCM47XX_BOARD_NETGEAR_WNDR3400V1: + err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400v1); + break; +--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h ++++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h +@@ -72,6 +72,7 @@ enum bcm47xx_board { + BCM47XX_BOARD_LINKSYS_WRT300NV11, + BCM47XX_BOARD_LINKSYS_WRT310NV1, + BCM47XX_BOARD_LINKSYS_WRT310NV2, ++ BCM47XX_BOARD_LINKSYS_WRT320N_V1, + BCM47XX_BOARD_LINKSYS_WRT54G3GV2, + BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0101, + BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0467, +@@ -99,9 +100,12 @@ enum bcm47xx_board { + BCM47XX_BOARD_MOTOROLA_WR850GV2V3, + + BCM47XX_BOARD_NETGEAR_R6200_V1, ++ BCM47XX_BOARD_NETGEAR_R6300_V1, + BCM47XX_BOARD_NETGEAR_WGR614V8, + BCM47XX_BOARD_NETGEAR_WGR614V9, + BCM47XX_BOARD_NETGEAR_WGR614_V10, ++ BCM47XX_BOARD_NETGEAR_WN2500RP_V1, ++ BCM47XX_BOARD_NETGEAR_WN2500RP_V2, + BCM47XX_BOARD_NETGEAR_WNDR3300, + BCM47XX_BOARD_NETGEAR_WNDR3400V1, + BCM47XX_BOARD_NETGEAR_WNDR3400V2, +--- a/arch/mips/bcm47xx/leds.c ++++ b/arch/mips/bcm47xx/leds.c +@@ -30,6 +30,14 @@ + /* Asus */ + + static const struct gpio_led ++bcm47xx_leds_asus_rtn10u[] __initconst = { ++ BCM47XX_GPIO_LED(5, "green", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF), ++ BCM47XX_GPIO_LED(6, "green", "power", 1, LEDS_GPIO_DEFSTATE_ON), ++ BCM47XX_GPIO_LED(7, "green", "wps", 0, LEDS_GPIO_DEFSTATE_OFF), ++ BCM47XX_GPIO_LED(8, "green", "usb", 0, LEDS_GPIO_DEFSTATE_OFF), ++}; ++ ++static const struct gpio_led + bcm47xx_leds_asus_rtn12[] __initconst = { + BCM47XX_GPIO_LED(2, "unk", "power", 1, LEDS_GPIO_DEFSTATE_ON), + BCM47XX_GPIO_LED(7, "unk", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF), +@@ -314,6 +322,13 @@ bcm47xx_leds_linksys_wrt310nv1[] __initc + }; + + static const struct gpio_led ++bcm47xx_leds_linksys_wrt320n_v1[] __initconst = { ++ BCM47XX_GPIO_LED(1, "blue", "wlan", 1, LEDS_GPIO_DEFSTATE_OFF), ++ BCM47XX_GPIO_LED(2, "blue", "power", 0, LEDS_GPIO_DEFSTATE_ON), ++ BCM47XX_GPIO_LED(4, "amber", "wps", 1, LEDS_GPIO_DEFSTATE_OFF), ++}; ++ ++static const struct gpio_led + bcm47xx_leds_linksys_wrt54g_generic[] __initconst = { + BCM47XX_GPIO_LED(0, "unk", "dmz", 1, LEDS_GPIO_DEFSTATE_OFF), + BCM47XX_GPIO_LED(1, "unk", "power", 0, LEDS_GPIO_DEFSTATE_ON), +@@ -556,6 +571,9 @@ void __init bcm47xx_leds_register(void) + enum bcm47xx_board board = bcm47xx_board_get(); + + switch (board) { ++ case BCM47XX_BOARD_ASUS_RTN10U: ++ bcm47xx_set_pdata(bcm47xx_leds_asus_rtn10u); ++ break; + case BCM47XX_BOARD_ASUS_RTN12: + bcm47xx_set_pdata(bcm47xx_leds_asus_rtn12); + break; +@@ -689,6 +707,9 @@ void __init bcm47xx_leds_register(void) + case BCM47XX_BOARD_LINKSYS_WRT310NV1: + bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt310nv1); + break; ++ case BCM47XX_BOARD_LINKSYS_WRT320N_V1: ++ bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt320n_v1); ++ break; + case BCM47XX_BOARD_LINKSYS_WRT54G3GV2: + bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt54g3gv2); + break; diff --git a/target/linux/bcm47xx/patches-5.10/400-mtd-bcm47xxpart-get-nvram.patch b/target/linux/bcm47xx/patches-5.10/400-mtd-bcm47xxpart-get-nvram.patch new file mode 100644 index 0000000000..17abe89d1d --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/400-mtd-bcm47xxpart-get-nvram.patch @@ -0,0 +1,34 @@ +--- a/drivers/mtd/parsers/bcm47xxpart.c ++++ b/drivers/mtd/parsers/bcm47xxpart.c +@@ -98,6 +98,7 @@ static int bcm47xxpart_parse(struct mtd_ + int trx_num = 0; /* Number of found TRX partitions */ + int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, }; + int err; ++ bool found_nvram = false; + + /* + * Some really old flashes (like AT45DB*) had smaller erasesize-s, but +@@ -279,12 +280,23 @@ static int bcm47xxpart_parse(struct mtd_ + if (buf[0] == NVRAM_HEADER) { + bcm47xxpart_add_part(&parts[curr_part++], "nvram", + master->size - blocksize, 0); ++ found_nvram = true; + break; + } + } + + kfree(buf); + ++ if (!found_nvram) { ++ pr_err("can not find a nvram partition reserve last block\n"); ++ bcm47xxpart_add_part(&parts[curr_part++], "nvram_guess", ++ master->size - blocksize * 2, MTD_WRITEABLE); ++ for (i = 0; i < curr_part; i++) { ++ if (parts[i].size + parts[i].offset == master->size) ++ parts[i].offset -= blocksize * 2; ++ } ++ } ++ + /* + * Assume that partitions end at the beginning of the one they are + * followed by. diff --git a/target/linux/bcm47xx/patches-5.10/610-pci_ide_fix.patch b/target/linux/bcm47xx/patches-5.10/610-pci_ide_fix.patch new file mode 100644 index 0000000000..520828e8e5 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/610-pci_ide_fix.patch @@ -0,0 +1,41 @@ +From: b.sander +Subject: [PATCH] pci: IDE fix + +These are standard probing messages when using pdc202xx_old: +pdc202xx_old 0000:00:01.0: IDE controller (0x105a:0x0d30 rev 0x02) +PCI: Enabling device 0000:00:01.0 (0004 -> 0007) +PCI: Fixing up device 0000:00:01.0 +0000:00:01.0: (U)DMA Burst Bit DISABLED Primary PCI Mode Secondary PCI Mode. +0000:00:01.0: FORCING BURST BIT 0x00->0x01 ACTIVE +pdc202xx_old 0000:00:01.0: 100% native mode on irq 6 + +With the default MAX_HWIFS value after above we get: + ide2: BM-DMA at 0x0400-0x0407 + ide3: BM-DMA at 0x0408-0x040f +Probing IDE interface ide2... +hde: CF500, CFA DISK drive + +As you can see it's ide2 + ide3 and hde. + +With this patch applied we get: + ide0: BM-DMA at 0x0400-0x0407 + ide1: BM-DMA at 0x0408-0x040f +Probing IDE interface ide0... +hda: CF500, CFA DISK drive + +This fixes OpenWrt ticket #7061: https://dev.openwrt.org/ticket/7061 +--- +--- a/include/linux/ide.h ++++ b/include/linux/ide.h +@@ -236,7 +236,11 @@ static inline void ide_std_init_ports(st + hw->io_ports.ctl_addr = ctl_addr; + } + ++#if defined CONFIG_BCM47XX ++# define MAX_HWIFS 2 ++#else + #define MAX_HWIFS 10 ++#endif + + /* + * Now for the data we need to maintain per-drive: ide_drive_t diff --git a/target/linux/bcm47xx/patches-5.10/791-tg3-no-pci-sleep.patch b/target/linux/bcm47xx/patches-5.10/791-tg3-no-pci-sleep.patch new file mode 100644 index 0000000000..50edfc3b41 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/791-tg3-no-pci-sleep.patch @@ -0,0 +1,17 @@ +When the Ethernet controller is powered down and someone wants to +access the mdio bus like the witch driver (b53) the system crashed if +PCI_D3hot was set before. This patch deactivates this power sawing mode +when a switch driver is in use. + +--- a/drivers/net/ethernet/broadcom/tg3.c ++++ b/drivers/net/ethernet/broadcom/tg3.c +@@ -4273,7 +4273,8 @@ static int tg3_power_down_prepare(struct + static void tg3_power_down(struct tg3 *tp) + { + pci_wake_from_d3(tp->pdev, tg3_flag(tp, WOL_ENABLE)); +- pci_set_power_state(tp->pdev, PCI_D3hot); ++ if (!tg3_flag(tp, ROBOSWITCH)) ++ pci_set_power_state(tp->pdev, PCI_D3hot); + } + + static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u32 *speed, u8 *duplex) diff --git a/target/linux/bcm47xx/patches-5.10/800-bcma-add-table-of-serial-flashes-with-smaller-blocks.patch b/target/linux/bcm47xx/patches-5.10/800-bcma-add-table-of-serial-flashes-with-smaller-blocks.patch new file mode 100644 index 0000000000..318dc55810 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/800-bcma-add-table-of-serial-flashes-with-smaller-blocks.patch @@ -0,0 +1,73 @@ +From 597715c61ae75a05ab3310a34ff3857a006f0f63 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 20 Nov 2014 21:32:42 +0100 +Subject: [PATCH] bcma: add table of serial flashes with smaller blocks +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Rafał Miłecki +--- + drivers/bcma/driver_chipcommon_sflash.c | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +--- a/drivers/bcma/driver_chipcommon_sflash.c ++++ b/drivers/bcma/driver_chipcommon_sflash.c +@@ -9,6 +9,7 @@ + + #include + #include ++#include + + static struct resource bcma_sflash_resource = { + .name = "bcma_sflash", +@@ -42,6 +43,13 @@ static const struct bcma_sflash_tbl_e bc + { NULL }, + }; + ++/* Some devices use smaller blocks (and have more of them) */ ++static const struct bcma_sflash_tbl_e bcma_sflash_st_shrink_tbl[] = { ++ { "M25P16", 0x14, 0x1000, 512, }, ++ { "M25P32", 0x15, 0x1000, 1024, }, ++ { NULL }, ++}; ++ + static const struct bcma_sflash_tbl_e bcma_sflash_sst_tbl[] = { + { "SST25WF512", 1, 0x1000, 16, }, + { "SST25VF512", 0x48, 0x1000, 16, }, +@@ -85,6 +93,24 @@ static void bcma_sflash_cmd(struct bcma_ + bcma_err(cc->core->bus, "SFLASH control command failed (timeout)!\n"); + } + ++const struct bcma_sflash_tbl_e *bcma_sflash_shrink_flash(u32 id) ++{ ++ enum bcm47xx_board board = bcm47xx_board_get(); ++ const struct bcma_sflash_tbl_e *e; ++ ++ switch (board) { ++ case BCM47XX_BOARD_NETGEAR_WGR614_V10: ++ case BCM47XX_BOARD_NETGEAR_WNR1000_V3: ++ for (e = bcma_sflash_st_shrink_tbl; e->name; e++) { ++ if (e->id == id) ++ return e; ++ } ++ return NULL; ++ default: ++ return NULL; ++ } ++} ++ + /* Initialize serial flash access */ + int bcma_sflash_init(struct bcma_drv_cc *cc) + { +@@ -115,6 +141,10 @@ int bcma_sflash_init(struct bcma_drv_cc + case 0x13: + return -ENOTSUPP; + default: ++ e = bcma_sflash_shrink_flash(id); ++ if (e) ++ break; ++ + for (e = bcma_sflash_st_tbl; e->name; e++) { + if (e->id == id) + break; diff --git a/target/linux/bcm47xx/patches-5.10/820-wgt634u-nvram-fix.patch b/target/linux/bcm47xx/patches-5.10/820-wgt634u-nvram-fix.patch new file mode 100644 index 0000000000..bfcfae885f --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/820-wgt634u-nvram-fix.patch @@ -0,0 +1,296 @@ +The Netgear wgt634u uses a different format for storing the +configuration. This patch is needed to read out the correct +configuration. The cfe_env.c file uses a different method way to read +out the configuration than the in kernel cfe config reader. + +--- a/drivers/firmware/broadcom/Makefile ++++ b/drivers/firmware/broadcom/Makefile +@@ -1,4 +1,4 @@ + # SPDX-License-Identifier: GPL-2.0-only +-obj-$(CONFIG_BCM47XX_NVRAM) += bcm47xx_nvram.o ++obj-$(CONFIG_BCM47XX_NVRAM) += bcm47xx_nvram.o cfe_env.o + obj-$(CONFIG_BCM47XX_SPROM) += bcm47xx_sprom.o + obj-$(CONFIG_TEE_BNXT_FW) += tee_bnxt_fw.o +--- /dev/null ++++ b/drivers/firmware/broadcom/cfe_env.c +@@ -0,0 +1,228 @@ ++/* ++ * CFE environment variable access ++ * ++ * Copyright 2001-2003, Broadcom Corporation ++ * Copyright 2006, Felix Fietkau ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define NVRAM_SIZE (0x1ff0) ++static char _nvdata[NVRAM_SIZE]; ++static char _valuestr[256]; ++ ++/* ++ * TLV types. These codes are used in the "type-length-value" ++ * encoding of the items stored in the NVRAM device (flash or EEPROM) ++ * ++ * The layout of the flash/nvram is as follows: ++ * ++ * ++ * ++ * The type code of "ENV_TLV_TYPE_END" marks the end of the list. ++ * The "length" field marks the length of the data section, not ++ * including the type and length fields. ++ * ++ * Environment variables are stored as follows: ++ * ++ * = ++ * ++ * If bit 0 (low bit) is set, the length is an 8-bit value. ++ * If bit 0 (low bit) is clear, the length is a 16-bit value ++ * ++ * Bit 7 set indicates "user" TLVs. In this case, bit 0 still ++ * indicates the size of the length field. ++ * ++ * Flags are from the constants below: ++ * ++ */ ++#define ENV_LENGTH_16BITS 0x00 /* for low bit */ ++#define ENV_LENGTH_8BITS 0x01 ++ ++#define ENV_TYPE_USER 0x80 ++ ++#define ENV_CODE_SYS(n,l) (((n)<<1)|(l)) ++#define ENV_CODE_USER(n,l) ((((n)<<1)|(l)) | ENV_TYPE_USER) ++ ++/* ++ * The actual TLV types we support ++ */ ++ ++#define ENV_TLV_TYPE_END 0x00 ++#define ENV_TLV_TYPE_ENV ENV_CODE_SYS(0,ENV_LENGTH_8BITS) ++ ++/* ++ * Environment variable flags ++ */ ++ ++#define ENV_FLG_NORMAL 0x00 /* normal read/write */ ++#define ENV_FLG_BUILTIN 0x01 /* builtin - not stored in flash */ ++#define ENV_FLG_READONLY 0x02 /* read-only - cannot be changed */ ++ ++#define ENV_FLG_MASK 0xFF /* mask of attributes we keep */ ++#define ENV_FLG_ADMIN 0x100 /* lets us internally override permissions */ ++ ++ ++/* ********************************************************************* ++ * _nvram_read(buffer,offset,length) ++ * ++ * Read data from the NVRAM device ++ * ++ * Input parameters: ++ * buffer - destination buffer ++ * offset - offset of data to read ++ * length - number of bytes to read ++ * ++ * Return value: ++ * number of bytes read, or <0 if error occured ++ ********************************************************************* */ ++static int ++_nvram_read(unsigned char *nv_buf, unsigned char *buffer, int offset, int length) ++{ ++ int i; ++ if (offset > NVRAM_SIZE) ++ return -1; ++ ++ for ( i = 0; i < length; i++) { ++ buffer[i] = ((volatile unsigned char*)nv_buf)[offset + i]; ++ } ++ return length; ++} ++ ++ ++static char* ++_strnchr(const char *dest,int c,size_t cnt) ++{ ++ while (*dest && (cnt > 0)) { ++ if (*dest == c) return (char *) dest; ++ dest++; ++ cnt--; ++ } ++ return NULL; ++} ++ ++ ++ ++/* ++ * Core support API: Externally visible. ++ */ ++ ++/* ++ * Get the value of an NVRAM variable ++ * @param name name of variable to get ++ * @return value of variable or NULL if undefined ++ */ ++ ++char *cfe_env_get(unsigned char *nv_buf, const char *name) ++{ ++ int size; ++ unsigned char *buffer; ++ unsigned char *ptr; ++ unsigned char *envval; ++ unsigned int reclen; ++ unsigned int rectype; ++ int offset; ++ int flg; ++ ++ if (!strcmp(name, "nvram_type")) ++ return "cfe"; ++ ++ size = NVRAM_SIZE; ++ buffer = &_nvdata[0]; ++ ++ ptr = buffer; ++ offset = 0; ++ ++ /* Read the record type and length */ ++ if (_nvram_read(nv_buf, ptr,offset,1) != 1) { ++ goto error; ++ } ++ ++ while ((*ptr != ENV_TLV_TYPE_END) && (size > 1)) { ++ ++ /* Adjust pointer for TLV type */ ++ rectype = *(ptr); ++ offset++; ++ size--; ++ ++ /* ++ * Read the length. It can be either 1 or 2 bytes ++ * depending on the code ++ */ ++ if (rectype & ENV_LENGTH_8BITS) { ++ /* Read the record type and length - 8 bits */ ++ if (_nvram_read(nv_buf, ptr,offset,1) != 1) { ++ goto error; ++ } ++ reclen = *(ptr); ++ size--; ++ offset++; ++ } ++ else { ++ /* Read the record type and length - 16 bits, MSB first */ ++ if (_nvram_read(nv_buf, ptr,offset,2) != 2) { ++ goto error; ++ } ++ reclen = (((unsigned int) *(ptr)) << 8) + (unsigned int) *(ptr+1); ++ size -= 2; ++ offset += 2; ++ } ++ ++ if (reclen > size) ++ break; /* should not happen, bad NVRAM */ ++ ++ switch (rectype) { ++ case ENV_TLV_TYPE_ENV: ++ /* Read the TLV data */ ++ if (_nvram_read(nv_buf, ptr,offset,reclen) != reclen) ++ goto error; ++ flg = *ptr++; ++ envval = (unsigned char *) _strnchr(ptr,'=',(reclen-1)); ++ if (envval) { ++ *envval++ = '\0'; ++ memcpy(_valuestr,envval,(reclen-1)-(envval-ptr)); ++ _valuestr[(reclen-1)-(envval-ptr)] = '\0'; ++#if 0 ++ printk(KERN_INFO "NVRAM:%s=%s\n", ptr, _valuestr); ++#endif ++ if(!strcmp(ptr, name)){ ++ return _valuestr; ++ } ++ if((strlen(ptr) > 1) && !strcmp(&ptr[1], name)) ++ return _valuestr; ++ } ++ break; ++ ++ default: ++ /* Unknown TLV type, skip it. */ ++ break; ++ } ++ ++ /* ++ * Advance to next TLV ++ */ ++ ++ size -= (int)reclen; ++ offset += reclen; ++ ++ /* Read the next record type */ ++ ptr = buffer; ++ if (_nvram_read(nv_buf, ptr,offset,1) != 1) ++ goto error; ++ } ++ ++error: ++ return NULL; ++ ++} ++ +--- a/drivers/firmware/broadcom/bcm47xx_nvram.c ++++ b/drivers/firmware/broadcom/bcm47xx_nvram.c +@@ -33,6 +33,8 @@ struct nvram_header { + static char nvram_buf[NVRAM_SPACE]; + static size_t nvram_len; + static const u32 nvram_sizes[] = {0x6000, 0x8000, 0xF000, 0x10000}; ++static int cfe_env; ++extern char *cfe_env_get(char *nv_buf, const char *name); + + /** + * bcm47xx_nvram_is_valid - check for a valid NVRAM at specified memory +@@ -80,6 +82,26 @@ static int bcm47xx_nvram_find_and_copy(v + return -EEXIST; + } + ++ cfe_env = 0; ++ ++ /* XXX: hack for supporting the CFE environment stuff on WGT634U */ ++ if (res_size >= 8 * 1024 * 1024) { ++ u32 *src = (u32 *)(flash_start + 8 * 1024 * 1024 - 0x2000); ++ u32 *dst = (u32 *)nvram_buf; ++ ++ if ((*src & 0xff00ff) == 0x000001) { ++ printk("early_nvram_init: WGT634U NVRAM found.\n"); ++ ++ for (i = 0; i < 0x1ff0; i++) { ++ if (*src == 0xFFFFFFFF) ++ break; ++ *dst++ = *src++; ++ } ++ cfe_env = 1; ++ return 0; ++ } ++ } ++ + /* TODO: when nvram is on nand flash check for bad blocks first. */ + + /* Try every possible flash size and check for NVRAM at its end */ +@@ -172,6 +194,13 @@ int bcm47xx_nvram_getenv(const char *nam + if (!name) + return -EINVAL; + ++ if (cfe_env) { ++ value = cfe_env_get(nvram_buf, name); ++ if (!value) ++ return -ENOENT; ++ return snprintf(val, val_len, "%s", value); ++ } ++ + if (!nvram_len) { + err = nvram_init(); + if (err) diff --git a/target/linux/bcm47xx/patches-5.10/830-huawei_e970_support.patch b/target/linux/bcm47xx/patches-5.10/830-huawei_e970_support.patch new file mode 100644 index 0000000000..1746fee592 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/830-huawei_e970_support.patch @@ -0,0 +1,101 @@ +--- a/arch/mips/bcm47xx/setup.c ++++ b/arch/mips/bcm47xx/setup.c +@@ -37,6 +37,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -254,6 +255,33 @@ static struct fixed_phy_status bcm47xx_f + .duplex = DUPLEX_FULL, + }; + ++static struct gpio_wdt_platform_data gpio_wdt_data; ++ ++static struct platform_device gpio_wdt_device = { ++ .name = "gpio-wdt", ++ .id = 0, ++ .dev = { ++ .platform_data = &gpio_wdt_data, ++ }, ++}; ++ ++static int __init bcm47xx_register_gpio_watchdog(void) ++{ ++ enum bcm47xx_board board = bcm47xx_board_get(); ++ ++ switch (board) { ++ case BCM47XX_BOARD_HUAWEI_E970: ++ pr_info("bcm47xx: detected Huawei E970 or similar, starting early gpio_wdt timer\n"); ++ gpio_wdt_data.gpio = 7; ++ gpio_wdt_data.interval = HZ; ++ gpio_wdt_data.first_interval = HZ / 5; ++ return platform_device_register(&gpio_wdt_device); ++ default: ++ /* Nothing to do */ ++ return 0; ++ } ++} ++ + static int __init bcm47xx_register_bus_complete(void) + { + switch (bcm47xx_bus_type) { +@@ -275,6 +303,7 @@ static int __init bcm47xx_register_bus_c + bcm47xx_workarounds(); + + fixed_phy_add(PHY_POLL, 0, &bcm47xx_fixed_phy_status); ++ bcm47xx_register_gpio_watchdog(); + return 0; + } + device_initcall(bcm47xx_register_bus_complete); +--- a/arch/mips/configs/bcm47xx_defconfig ++++ b/arch/mips/configs/bcm47xx_defconfig +@@ -63,6 +63,7 @@ CONFIG_HW_RANDOM=y + CONFIG_GPIO_SYSFS=y + CONFIG_WATCHDOG=y + CONFIG_BCM47XX_WDT=y ++CONFIG_GPIO_WDT=y + CONFIG_SSB_DRIVER_GIGE=y + CONFIG_BCMA_DRIVER_GMAC_CMN=y + CONFIG_USB=y +--- a/drivers/ssb/embedded.c ++++ b/drivers/ssb/embedded.c +@@ -34,11 +34,36 @@ int ssb_watchdog_timer_set(struct ssb_bu + } + EXPORT_SYMBOL(ssb_watchdog_timer_set); + ++#ifdef CONFIG_BCM47XX ++#include ++ ++static bool ssb_watchdog_supported(void) ++{ ++ enum bcm47xx_board board = bcm47xx_board_get(); ++ ++ /* The Huawei E970 has a hardware watchdog using a GPIO */ ++ switch (board) { ++ case BCM47XX_BOARD_HUAWEI_E970: ++ return false; ++ default: ++ return true; ++ } ++} ++#else ++static bool ssb_watchdog_supported(void) ++{ ++ return true; ++} ++#endif ++ + int ssb_watchdog_register(struct ssb_bus *bus) + { + struct bcm47xx_wdt wdt = {}; + struct platform_device *pdev; + ++ if (!ssb_watchdog_supported()) ++ return 0; ++ + if (ssb_chipco_available(&bus->chipco)) { + wdt.driver_data = &bus->chipco; + wdt.timer_set = ssb_chipco_watchdog_timer_set_wdt; diff --git a/target/linux/bcm47xx/patches-5.10/831-old_gpio_wdt.patch b/target/linux/bcm47xx/patches-5.10/831-old_gpio_wdt.patch new file mode 100644 index 0000000000..f6fb7f1855 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/831-old_gpio_wdt.patch @@ -0,0 +1,360 @@ +This generic GPIO watchdog is used on Huawei E970 (bcm47xx) + +Signed-off-by: Mathias Adam + +--- a/drivers/watchdog/Kconfig ++++ b/drivers/watchdog/Kconfig +@@ -1698,6 +1698,15 @@ config WDT_MTX1 + Hardware driver for the MTX-1 boards. This is a watchdog timer that + will reboot the machine after a 100 seconds timer expired. + ++config GPIO_WDT ++ tristate "GPIO Hardware Watchdog" ++ help ++ Hardware driver for GPIO-controlled watchdogs. GPIO pin and ++ toggle interval settings are platform-specific. The driver ++ will stop toggling the GPIO (i.e. machine reboots) after a ++ 100 second timer expired and no process has written to ++ /dev/watchdog during that time. ++ + config PNX833X_WDT + tristate "PNX833x Hardware Watchdog" + depends on SOC_PNX8335 +--- a/drivers/watchdog/Makefile ++++ b/drivers/watchdog/Makefile +@@ -161,6 +161,7 @@ obj-$(CONFIG_RC32434_WDT) += rc32434_wdt + obj-$(CONFIG_INDYDOG) += indydog.o + obj-$(CONFIG_JZ4740_WDT) += jz4740_wdt.o + obj-$(CONFIG_WDT_MTX1) += mtx-1_wdt.o ++obj-$(CONFIG_GPIO_WDT) += old_gpio_wdt.o + obj-$(CONFIG_PNX833X_WDT) += pnx833x_wdt.o + obj-$(CONFIG_SIBYTE_WDOG) += sb_wdog.o + obj-$(CONFIG_AR7_WDT) += ar7_wdt.o +--- /dev/null ++++ b/drivers/watchdog/old_gpio_wdt.c +@@ -0,0 +1,301 @@ ++/* ++ * Driver for GPIO-controlled Hardware Watchdogs. ++ * ++ * Copyright (C) 2013 Mathias Adam ++ * ++ * Replaces mtx1_wdt (driver for the MTX-1 Watchdog): ++ * ++ * (C) Copyright 2005 4G Systems , ++ * All Rights Reserved. ++ * http://www.4g-systems.biz ++ * ++ * (C) Copyright 2007 OpenWrt.org, Florian Fainelli ++ * ++ * 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. ++ * ++ * Neither Michael Stickel nor 4G Systems admit liability nor provide ++ * warranty for any of this software. This material is provided ++ * "AS-IS" and at no charge. ++ * ++ * (c) Copyright 2005 4G Systems ++ * ++ * Release 0.01. ++ * Author: Michael Stickel michael.stickel@4g-systems.biz ++ * ++ * Release 0.02. ++ * Author: Florian Fainelli florian@openwrt.org ++ * use the Linux watchdog/timer APIs ++ * ++ * Release 0.03. ++ * Author: Mathias Adam ++ * make it a generic gpio watchdog driver ++ * ++ * The Watchdog is configured to reset the MTX-1 ++ * if it is not triggered for 100 seconds. ++ * It should not be triggered more often than 1.6 seconds. ++ * ++ * A timer triggers the watchdog every 5 seconds, until ++ * it is opened for the first time. After the first open ++ * it MUST be triggered every 2..95 seconds. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int ticks = 100 * HZ; ++ ++static struct { ++ struct completion stop; ++ spinlock_t lock; ++ int running; ++ struct timer_list timer; ++ int queue; ++ int default_ticks; ++ unsigned long inuse; ++ unsigned gpio; ++ unsigned int gstate; ++ int interval; ++ int first_interval; ++} gpio_wdt_device; ++ ++static void gpio_wdt_trigger(struct timer_list *unused) ++{ ++ spin_lock(&gpio_wdt_device.lock); ++ if (gpio_wdt_device.running && ticks > 0) ++ ticks -= gpio_wdt_device.interval; ++ ++ /* toggle wdt gpio */ ++ gpio_wdt_device.gstate = !gpio_wdt_device.gstate; ++ gpio_set_value(gpio_wdt_device.gpio, gpio_wdt_device.gstate); ++ ++ if (gpio_wdt_device.queue && ticks > 0) ++ mod_timer(&gpio_wdt_device.timer, jiffies + gpio_wdt_device.interval); ++ else ++ complete(&gpio_wdt_device.stop); ++ spin_unlock(&gpio_wdt_device.lock); ++} ++ ++static void gpio_wdt_reset(void) ++{ ++ ticks = gpio_wdt_device.default_ticks; ++} ++ ++ ++static void gpio_wdt_start(void) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&gpio_wdt_device.lock, flags); ++ if (!gpio_wdt_device.queue) { ++ gpio_wdt_device.queue = 1; ++ gpio_wdt_device.gstate = 1; ++ gpio_set_value(gpio_wdt_device.gpio, 1); ++ mod_timer(&gpio_wdt_device.timer, jiffies + gpio_wdt_device.first_interval); ++ } ++ gpio_wdt_device.running++; ++ spin_unlock_irqrestore(&gpio_wdt_device.lock, flags); ++} ++ ++static int gpio_wdt_stop(void) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&gpio_wdt_device.lock, flags); ++ if (gpio_wdt_device.queue) { ++ gpio_wdt_device.queue = 0; ++ gpio_wdt_device.gstate = 0; ++ gpio_set_value(gpio_wdt_device.gpio, 0); ++ } ++ ticks = gpio_wdt_device.default_ticks; ++ spin_unlock_irqrestore(&gpio_wdt_device.lock, flags); ++ return 0; ++} ++ ++/* Filesystem functions */ ++ ++static int gpio_wdt_open(struct inode *inode, struct file *file) ++{ ++ if (test_and_set_bit(0, &gpio_wdt_device.inuse)) ++ return -EBUSY; ++ return nonseekable_open(inode, file); ++} ++ ++ ++static int gpio_wdt_release(struct inode *inode, struct file *file) ++{ ++ clear_bit(0, &gpio_wdt_device.inuse); ++ return 0; ++} ++ ++static long gpio_wdt_ioctl(struct file *file, unsigned int cmd, ++ unsigned long arg) ++{ ++ void __user *argp = (void __user *)arg; ++ int __user *p = (int __user *)argp; ++ unsigned int value; ++ static const struct watchdog_info ident = { ++ .options = WDIOF_CARDRESET, ++ .identity = "GPIO WDT", ++ }; ++ ++ switch (cmd) { ++ case WDIOC_GETSUPPORT: ++ if (copy_to_user(argp, &ident, sizeof(ident))) ++ return -EFAULT; ++ break; ++ case WDIOC_GETSTATUS: ++ case WDIOC_GETBOOTSTATUS: ++ put_user(0, p); ++ break; ++ case WDIOC_SETOPTIONS: ++ if (get_user(value, p)) ++ return -EFAULT; ++ if (value & WDIOS_ENABLECARD) ++ gpio_wdt_start(); ++ else if (value & WDIOS_DISABLECARD) ++ gpio_wdt_stop(); ++ else ++ return -EINVAL; ++ return 0; ++ case WDIOC_KEEPALIVE: ++ gpio_wdt_reset(); ++ break; ++ default: ++ return -ENOTTY; ++ } ++ return 0; ++} ++ ++ ++static ssize_t gpio_wdt_write(struct file *file, const char *buf, ++ size_t count, loff_t *ppos) ++{ ++ if (!count) ++ return -EIO; ++ gpio_wdt_reset(); ++ return count; ++} ++ ++static const struct file_operations gpio_wdt_fops = { ++ .owner = THIS_MODULE, ++ .llseek = no_llseek, ++ .unlocked_ioctl = gpio_wdt_ioctl, ++ .open = gpio_wdt_open, ++ .write = gpio_wdt_write, ++ .release = gpio_wdt_release, ++}; ++ ++ ++static struct miscdevice gpio_wdt_misc = { ++ .minor = WATCHDOG_MINOR, ++ .name = "watchdog", ++ .fops = &gpio_wdt_fops, ++}; ++ ++ ++static int gpio_wdt_probe(struct platform_device *pdev) ++{ ++ int ret; ++ struct gpio_wdt_platform_data *gpio_wdt_data = pdev->dev.platform_data; ++ ++ gpio_wdt_device.gpio = gpio_wdt_data->gpio; ++ gpio_wdt_device.interval = gpio_wdt_data->interval; ++ gpio_wdt_device.first_interval = gpio_wdt_data->first_interval; ++ if (gpio_wdt_device.first_interval <= 0) { ++ gpio_wdt_device.first_interval = gpio_wdt_device.interval; ++ } ++ ++ ret = gpio_request(gpio_wdt_device.gpio, "gpio-wdt"); ++ if (ret < 0) { ++ dev_err(&pdev->dev, "failed to request gpio"); ++ return ret; ++ } ++ ++ spin_lock_init(&gpio_wdt_device.lock); ++ init_completion(&gpio_wdt_device.stop); ++ gpio_wdt_device.queue = 0; ++ clear_bit(0, &gpio_wdt_device.inuse); ++ timer_setup(&gpio_wdt_device.timer, gpio_wdt_trigger, 0L); ++ gpio_wdt_device.default_ticks = ticks; ++ ++ gpio_wdt_start(); ++ dev_info(&pdev->dev, "GPIO Hardware Watchdog driver (gpio=%i interval=%i/%i)\n", ++ gpio_wdt_data->gpio, gpio_wdt_data->first_interval, gpio_wdt_data->interval); ++ return 0; ++} ++ ++static int gpio_wdt_remove(struct platform_device *pdev) ++{ ++ /* FIXME: do we need to lock this test ? */ ++ if (gpio_wdt_device.queue) { ++ gpio_wdt_device.queue = 0; ++ wait_for_completion(&gpio_wdt_device.stop); ++ } ++ ++ gpio_free(gpio_wdt_device.gpio); ++ misc_deregister(&gpio_wdt_misc); ++ return 0; ++} ++ ++static struct platform_driver gpio_wdt_driver = { ++ .probe = gpio_wdt_probe, ++ .remove = gpio_wdt_remove, ++ .driver.name = "gpio-wdt", ++ .driver.owner = THIS_MODULE, ++}; ++ ++static int __init gpio_wdt_init(void) ++{ ++ return platform_driver_register(&gpio_wdt_driver); ++} ++arch_initcall(gpio_wdt_init); ++ ++/* ++ * We do wdt initialization in two steps: arch_initcall probes the wdt ++ * very early to start pinging the watchdog (misc devices are not yet ++ * available), and later module_init() just registers the misc device. ++ */ ++static int gpio_wdt_init_late(void) ++{ ++ int ret; ++ ++ ret = misc_register(&gpio_wdt_misc); ++ if (ret < 0) { ++ pr_err("GPIO_WDT: failed to register misc device\n"); ++ return ret; ++ } ++ return 0; ++} ++#ifndef MODULE ++module_init(gpio_wdt_init_late); ++#endif ++ ++static void __exit gpio_wdt_exit(void) ++{ ++ platform_driver_unregister(&gpio_wdt_driver); ++} ++module_exit(gpio_wdt_exit); ++ ++MODULE_AUTHOR("Michael Stickel, Florian Fainelli, Mathias Adam"); ++MODULE_DESCRIPTION("Driver for GPIO hardware watchdogs"); ++MODULE_LICENSE("GPL"); ++MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); ++MODULE_ALIAS("platform:gpio-wdt"); +--- /dev/null ++++ b/include/linux/old_gpio_wdt.h +@@ -0,0 +1,21 @@ ++/* ++ * Definitions for the GPIO watchdog driver ++ * ++ * Copyright (C) 2013 Mathias Adam ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#ifndef _GPIO_WDT_H_ ++#define _GPIO_WDT_H_ ++ ++struct gpio_wdt_platform_data { ++ int gpio; /* GPIO line number */ ++ int interval; /* watchdog reset interval in system ticks */ ++ int first_interval; /* first wd reset interval in system ticks */ ++}; ++ ++#endif /* _GPIO_WDT_H_ */ diff --git a/target/linux/bcm47xx/patches-5.10/900-ssb-reject-PCI-writes-setting-CardBus-bridge-resourc.patch b/target/linux/bcm47xx/patches-5.10/900-ssb-reject-PCI-writes-setting-CardBus-bridge-resourc.patch new file mode 100644 index 0000000000..6b7ee06e50 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/900-ssb-reject-PCI-writes-setting-CardBus-bridge-resourc.patch @@ -0,0 +1,30 @@ +From 5c81397a0147ea59c778d1de14ef54e2268221f6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Wed, 8 Apr 2015 06:58:11 +0200 +Subject: [PATCH] ssb: reject PCI writes setting CardBus bridge resources +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +If SoC has a CardBus we can set resources of device at slot 1 only. It's +impossigle to set bridge resources as it simply overwrites device 1 +configuration and usually results in Data bus error-s. + +Signed-off-by: Rafał Miłecki +--- + drivers/ssb/driver_pcicore.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/ssb/driver_pcicore.c ++++ b/drivers/ssb/driver_pcicore.c +@@ -164,6 +164,10 @@ static int ssb_extpci_write_config(struc + WARN_ON(!pc->hostmode); + if (unlikely(len != 1 && len != 2 && len != 4)) + goto out; ++ /* CardBus SoCs allow configuring dev 1 resources only */ ++ if (extpci_core->cardbusmode && dev != 1 && ++ off >= PCI_BASE_ADDRESS_0 && off <= PCI_BASE_ADDRESS_5) ++ goto out; + addr = get_cfgspace_addr(pc, bus, dev, func, off); + if (unlikely(!addr)) + goto out; diff --git a/target/linux/bcm47xx/patches-5.10/940-bcm47xx-yenta.patch b/target/linux/bcm47xx/patches-5.10/940-bcm47xx-yenta.patch new file mode 100644 index 0000000000..8847b0c0c7 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/940-bcm47xx-yenta.patch @@ -0,0 +1,46 @@ +--- a/drivers/pcmcia/yenta_socket.c ++++ b/drivers/pcmcia/yenta_socket.c +@@ -932,6 +932,8 @@ static unsigned int yenta_probe_irq(stru + * Probe for usable interrupts using the force + * register to generate bogus card status events. + */ ++#ifndef CONFIG_BCM47XX ++ /* WRT54G3G does not like this */ + cb_writel(socket, CB_SOCKET_EVENT, -1); + cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); + reg = exca_readb(socket, I365_CSCINT); +@@ -947,6 +949,7 @@ static unsigned int yenta_probe_irq(stru + } + cb_writel(socket, CB_SOCKET_MASK, 0); + exca_writeb(socket, I365_CSCINT, reg); ++#endif + + mask = probe_irq_mask(val) & 0xffff; + +@@ -1031,6 +1034,10 @@ static void yenta_get_socket_capabilitie + else + socket->socket.irq_mask = 0; + ++ /* irq mask probing is broken for the WRT54G3G */ ++ if (socket->socket.irq_mask == 0) ++ socket->socket.irq_mask = 0x6f8; ++ + dev_info(&socket->dev->dev, "ISA IRQ mask 0x%04x, PCI irq %d\n", + socket->socket.irq_mask, socket->cb_irq); + } +@@ -1262,6 +1269,15 @@ static int yenta_probe(struct pci_dev *d + dev_info(&dev->dev, "Socket status: %08x\n", + cb_readl(socket, CB_SOCKET_STATE)); + ++ /* Generate an interrupt on card insert/remove */ ++ config_writew(socket, CB_SOCKET_MASK, CB_CSTSMASK | CB_CDMASK); ++ ++ /* Set up Multifunction Routing Status Register */ ++ config_writew(socket, 0x8C, 0x1000 /* MFUNC3 to GPIO3 */ | 0x2 /* MFUNC0 to INTA */); ++ ++ /* Switch interrupts to parallelized */ ++ config_writeb(socket, 0x92, 0x64); ++ + yenta_fixup_parent_bridge(dev->subordinate); + + /* Register it with the pcmcia layer.. */ diff --git a/target/linux/bcm47xx/patches-5.10/976-ssb_increase_pci_delay.patch b/target/linux/bcm47xx/patches-5.10/976-ssb_increase_pci_delay.patch new file mode 100644 index 0000000000..99aa188374 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/976-ssb_increase_pci_delay.patch @@ -0,0 +1,11 @@ +--- a/drivers/ssb/driver_pcicore.c ++++ b/drivers/ssb/driver_pcicore.c +@@ -390,7 +390,7 @@ static void ssb_pcicore_init_hostmode(st + set_io_port_base(ssb_pcicore_controller.io_map_base); + /* Give some time to the PCI controller to configure itself with the new + * values. Not waiting at this point causes crashes of the machine. */ +- mdelay(10); ++ mdelay(300); + register_pci_controller(&ssb_pcicore_controller); + } + diff --git a/target/linux/bcm47xx/patches-5.10/999-wl_exports.patch b/target/linux/bcm47xx/patches-5.10/999-wl_exports.patch new file mode 100644 index 0000000000..48c6a47871 --- /dev/null +++ b/target/linux/bcm47xx/patches-5.10/999-wl_exports.patch @@ -0,0 +1,24 @@ +--- a/drivers/firmware/broadcom/bcm47xx_nvram.c ++++ b/drivers/firmware/broadcom/bcm47xx_nvram.c +@@ -30,7 +30,8 @@ struct nvram_header { + u32 config_ncdl; /* ncdl values for memc */ + }; + +-static char nvram_buf[NVRAM_SPACE]; ++char nvram_buf[NVRAM_SPACE]; ++EXPORT_SYMBOL(nvram_buf); + static size_t nvram_len; + static const u32 nvram_sizes[] = {0x6000, 0x8000, 0xF000, 0x10000}; + static int cfe_env; +--- a/arch/mips/mm/cache.c ++++ b/arch/mips/mm/cache.c +@@ -61,6 +61,9 @@ void (*_dma_cache_wback_inv)(unsigned lo + void (*_dma_cache_wback)(unsigned long start, unsigned long size); + void (*_dma_cache_inv)(unsigned long start, unsigned long size); + ++EXPORT_SYMBOL(_dma_cache_wback_inv); ++EXPORT_SYMBOL(_dma_cache_inv); ++ + #endif /* CONFIG_DMA_NONCOHERENT */ + + /* From e9672b1a8fa4714cbc35d5964caf704b2e571f35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Mon, 18 Oct 2021 15:04:17 +0200 Subject: [PATCH 33/36] bcm53xx: switch to the upstream DSA-based b53 driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Drop swconfig 2. Simplify network setup 3. Verify network config 4. Disable Buffalo WZR-900DHP for now - it misses ports definition Signed-off-by: Rafał Miłecki Reviewed-By: Christian Lamparter --- target/linux/bcm53xx/Makefile | 2 +- .../bcm53xx/base-files/etc/board.d/02_network | 80 +++---------------- .../etc/uci-defaults/03_dsa_migrate | 23 ++++++ target/linux/bcm53xx/config-5.10 | 20 +++-- target/linux/bcm53xx/image/Makefile | 1 + 5 files changed, 49 insertions(+), 77 deletions(-) create mode 100644 target/linux/bcm53xx/base-files/etc/uci-defaults/03_dsa_migrate diff --git a/target/linux/bcm53xx/Makefile b/target/linux/bcm53xx/Makefile index 083f905096..921058d140 100644 --- a/target/linux/bcm53xx/Makefile +++ b/target/linux/bcm53xx/Makefile @@ -22,7 +22,7 @@ include $(INCLUDE_DIR)/target.mk KERNELNAME:=zImage dtbs -DEFAULT_PACKAGES += swconfig nvram \ +DEFAULT_PACKAGES += nvram \ osafeloader oseama otrx \ kmod-gpio-button-hotplug \ kmod-leds-gpio diff --git a/target/linux/bcm53xx/base-files/etc/board.d/02_network b/target/linux/bcm53xx/base-files/etc/board.d/02_network index e02286027f..9308801b85 100644 --- a/target/linux/bcm53xx/base-files/etc/board.d/02_network +++ b/target/linux/bcm53xx/base-files/etc/board.d/02_network @@ -9,74 +9,24 @@ bcm53xx_setup_interfaces() { local board="$1" - # On BCM4708 / BCM4709(4) there are 3 Ethernet interfaces connected to 3 switch - # ports. It's up to vendor which to use. case "$board" in - tenda,ac9) - ucidef_add_switch "switch0" \ - "1:lan" "2:lan" "3:lan" "4:lan" "8@eth0" "0:wan" "5@eth1" - ;; - buffalo,wxr-1900dhp| \ - buffalo,wzr-1750dhp) - ucidef_add_switch "switch0" \ - "0:lan:1" "1:lan:2" "2:lan:3" "3:lan:4" "4:wan:5" "5@eth0" - ;; - dlink,dir-885l | \ - netgear,r7900 | \ - netgear,r8000 | \ - netgear,r8500) - # NVRAM specifies port 8 (eth2) - unsupported by OpenWrt b53 - # Use port 5 (eth0) as workaround - ucidef_add_switch "switch0" \ - "0:lan" "1:lan" "2:lan" "3:lan" "4:wan" "5t@eth0" + asus,rt-ac87u) + ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" "wan" ;; linksys,panamera) - ucidef_add_switch "switch1" \ - "0:lan" "1:lan:7" "2:lan:4" "3:lan:8" "4:wan" "5t@eth0" - ;; - luxul,abr-4500-v1|\ - luxul,xbr-4500-v1) - ucidef_add_switch "switch0" \ - "0:wan" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "5@eth0" + ucidef_set_interfaces_lan_wan "lan4 lan7 lan8 extsw" "wan" ;; luxul,xap-1610-v1) - ucidef_add_switch "switch0" \ - "0:lan" "1:lan" "5@eth0" - ucidef_set_interface_lan "eth0.1" "dhcp" + ucidef_set_interface_lan "poe lan" "dhcp" ;; - luxul,xwr-3150-v1) - ucidef_add_switch "switch0" \ - "0:lan:4" "1:lan:3" "2:lan:2" "3:lan:1" "4:wan" "5@eth0" + meraki,mr32) + ucidef_set_interface_lan "poe" "dhcp" ;; phicomm,k3) - ucidef_add_switch "switch0" \ - "0:lan" "1:lan" "2:lan" "3:wan" "5@eth0" + ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" "wan" ;; *) - # NVRAM entries may contain unsorted ports, e.g. Netgear R6250 uses - # vlan1ports=3 2 1 0 5* - # vlan2ports=4 5u - # and early Netgear R8000 was using - # vlan1ports=3 2 1 0 5 7 8* - # (the enclosing echo is needed to convert newline back to space) - vlan1ports="$(echo $(nvram get vlan1ports | tr " " "\n" | sort))" - vlan2ports="$(echo $(nvram get vlan2ports | tr " " "\n" | sort))" - if echo "$vlan1ports" | egrep -q "^1 2 3 4 5" && \ - echo "$vlan2ports" | egrep -q "^0 5"; then - ucidef_add_switch "switch0" \ - "1:lan" "2:lan" "3:lan" "4:lan" "0:wan" "5t@eth0" - elif echo "$vlan1ports" | egrep -q "^1 2 3 5 7" && \ - echo "$vlan2ports" | egrep -q "^0 7"; then - ucidef_add_switch "switch0" \ - "1:lan" "2:lan" "3:lan" "5:lan" "0:wan" "7t@eth1" - elif echo "$vlan1ports" | egrep -q "^0 1 2 3 5 7 8" && \ - echo "$vlan2ports" | egrep -q "^4 8"; then - ucidef_add_switch "switch0" \ - "0:lan" "1:lan" "2:lan" "3:lan" "5:lan" "7:lan" "4:wan" "8t@eth2" - else - ucidef_add_switch "switch0" \ - "0:lan" "1:lan" "2:lan" "3:lan" "4:wan" "5t@eth0" - fi + ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" "wan" ;; esac } @@ -85,20 +35,8 @@ bcm53xx_setup_macs() { local board="$1" - case "$board" in - dlink,dir-885l | \ - linksys,panamera | \ - netgear,r7900 | \ - netgear,r8000 | \ - netgear,r8500) - # As vendor doesn't use eth0 its MAC may be missing. Use one from eth2. - et2macaddr="$(nvram get et2macaddr)" - ;; - esac - - [ -n "$et2macaddr" ] && ucidef_set_interface_macaddr "lan" "$et2macaddr" - wan_macaddr="$(nvram get wan_hwaddr)" + case "$board" in asus,rt-ac87u) etXmacaddr=$(nvram get et1macaddr) diff --git a/target/linux/bcm53xx/base-files/etc/uci-defaults/03_dsa_migrate b/target/linux/bcm53xx/base-files/etc/uci-defaults/03_dsa_migrate new file mode 100644 index 0000000000..7350f57e5d --- /dev/null +++ b/target/linux/bcm53xx/base-files/etc/uci-defaults/03_dsa_migrate @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: GPL-2.0-only + +# Exit if network doesn't contain any swconfig section +uci -q get network.@switch[0] > /dev/null || exit 0 + +lan_proto="$(uci -q get network.lan.proto)" +lan_ipaddr="$(uci -q get network.lan.ipaddr)" +lan_netmask="$(uci -q get network.lan.netmask)" +wan_proto="$(uci -q get network.wan.proto)" +wan_ipaddr="$(uci -q get network.wan.ipaddr)" +wan_netmask="$(uci -q get network.wan.netmask)" + +rm /etc/config/network +config_generate + +uci -q batch <<-EOF + set network.lan.proto="$lan_proto" + set network.lan.ipaddr="$lan_ipaddr" + set network.lan.netmask="$lan_netmask" + set network.wan.proto="$wan_proto" + set network.wan.ipaddr="$wan_ipaddr" + set network.wan.netmask="$wan_netmask" +EOF diff --git a/target/linux/bcm53xx/config-5.10 b/target/linux/bcm53xx/config-5.10 index 9d98e812bd..ea5a7b0dc7 100644 --- a/target/linux/bcm53xx/config-5.10 +++ b/target/linux/bcm53xx/config-5.10 @@ -39,6 +39,12 @@ CONFIG_ARM_UNWIND=y CONFIG_ARM_VIRT_EXT=y CONFIG_ATAGS=y CONFIG_AUTO_ZRELADDR=y +CONFIG_B53=y +CONFIG_B53_MDIO_DRIVER=y +# CONFIG_B53_MMAP_DRIVER is not set +# CONFIG_B53_SERDES is not set +# CONFIG_B53_SPI_DRIVER is not set +CONFIG_B53_SRAB_DRIVER=y CONFIG_BCM47XX_NVRAM=y CONFIG_BCM47XX_SPROM=y CONFIG_BCM47XX_WDT=y @@ -149,6 +155,7 @@ CONFIG_GPIOLIB_IRQCHIP=y CONFIG_GPIO_74X164=y CONFIG_GPIO_BCM_XGS_IPROC=y CONFIG_GPIO_GENERIC=y +CONFIG_GRO_CELLS=y CONFIG_HANDLE_DOMAIN_IRQ=y CONFIG_HARDEN_BRANCH_PREDICTOR=y CONFIG_HARDIRQS_SW_RESEND=y @@ -204,7 +211,14 @@ CONFIG_MTD_UBI_BLOCK=y CONFIG_MTD_UBI_WL_THRESHOLD=4096 CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NET_DEVLINK=y +CONFIG_NET_DSA=y +CONFIG_NET_DSA_TAG_BRCM=y +CONFIG_NET_DSA_TAG_BRCM_COMMON=y +CONFIG_NET_DSA_TAG_BRCM_LEGACY=y +CONFIG_NET_DSA_TAG_BRCM_PREPEND=y CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_SWITCHDEV=y CONFIG_NR_CPUS=2 CONFIG_NVMEM=y CONFIG_NVMEM_BRCM_NVRAM=y @@ -233,6 +247,7 @@ CONFIG_PCI_DOMAINS_GENERIC=y CONFIG_PERF_USE_VMALLOC=y CONFIG_PGTABLE_LEVELS=2 CONFIG_PHYLIB=y +CONFIG_PHYLINK=y # CONFIG_PHY_BCM_NS_USB2 is not set # CONFIG_PHY_BCM_NS_USB3 is not set # CONFIG_PHY_BCM_SR_PCIE is not set @@ -266,11 +281,6 @@ CONFIG_SPI_GPIO=y CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y CONFIG_SRCU=y -CONFIG_SWCONFIG=y -CONFIG_SWCONFIG_B53=y -CONFIG_SWCONFIG_B53_PHY_DRIVER=y -CONFIG_SWCONFIG_B53_PHY_FIXUP=y -CONFIG_SWCONFIG_B53_SRAB_DRIVER=y CONFIG_SWPHY=y CONFIG_SWP_EMULATE=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y diff --git a/target/linux/bcm53xx/image/Makefile b/target/linux/bcm53xx/image/Makefile index a10c6fe240..cb2643ca54 100644 --- a/target/linux/bcm53xx/image/Makefile +++ b/target/linux/bcm53xx/image/Makefile @@ -218,6 +218,7 @@ define Device/buffalo_wzr-900dhp buffalo-enc WZR-900DHP2 $$(BUFFALO_TAG_VERSION) | \ buffalo-tag-dhp WZR-900DHP2 JP jp | buffalo-enc-tag | \ buffalo-dhp-image + BROKEN := y endef TARGET_DEVICES += buffalo_wzr-900dhp From f46a70a6882cc71c7c346e5ef0c348c91be876e5 Mon Sep 17 00:00:00 2001 From: Paul Spooren Date: Wed, 20 Oct 2021 15:54:26 -1000 Subject: [PATCH 34/36] toolchain: switch packaged toolchain to tar.xz Currently the tar.bz2 while ImageBuilder and SDK switched to tar.xz. Unify it for faster compression since it will make use of multi-threading. Signed-off-by: Paul Spooren --- target/toolchain/Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/target/toolchain/Makefile b/target/toolchain/Makefile index c3ba70db04..c33bccee69 100644 --- a/target/toolchain/Makefile +++ b/target/toolchain/Makefile @@ -26,7 +26,7 @@ all: compile TOOLCHAIN_PREFIX:=$(TOOLCHAIN_BUILD_DIR)/toolchain-$(ARCH)$(ARCH_SUFFIX)_gcc-$(GCCV)$(DIR_SUFFIX) -$(BIN_DIR)/$(TOOLCHAIN_NAME).tar.bz2: clean +$(BIN_DIR)/$(TOOLCHAIN_NAME).tar.xz: clean mkdir -p $(TOOLCHAIN_BUILD_DIR) $(TAR) -cf - -C $(TOPDIR)/staging_dir/ \ $(foreach exclude,$(EXCLUDE_DIRS),--exclude="$(exclude)") \ @@ -62,13 +62,14 @@ $(BIN_DIR)/$(TOOLCHAIN_NAME).tar.bz2: clean find $(TOOLCHAIN_BUILD_DIR) -name CVS | $(XARGS) rm -rf mkdir -p $(BIN_DIR) (cd $(BUILD_DIR); \ - tar cfj $@ $(TOOLCHAIN_NAME); \ + tar -I '$(STAGING_DIR_HOST)/bin/xz -7e -T$(if $(filter 1,$(NPROC)),2,0)' -cf $@ $(TOOLCHAIN_NAME) \ + --mtime="$(shell date --date=@$(SOURCE_DATE_EPOCH))"; \ ) download: prepare: -compile: $(BIN_DIR)/$(TOOLCHAIN_NAME).tar.bz2 +compile: $(BIN_DIR)/$(TOOLCHAIN_NAME).tar.xz install: compile clean: - rm -rf $(TOOLCHAIN_BUILD_DIR) $(BIN_DIR)/$(TOOLCHAIN_NAME).tar.bz2 + rm -rf $(TOOLCHAIN_BUILD_DIR) $(BIN_DIR)/$(TOOLCHAIN_NAME).tar.xz From dd0ad9b661b604163d1736fcfe18714ff47c3728 Mon Sep 17 00:00:00 2001 From: Rui Salvaterra Date: Thu, 21 Oct 2021 20:09:49 +0100 Subject: [PATCH 35/36] tools/isl: update the download URL isl.gforge.inria.fr has been dead since early this month [1]. Switch to libisl.sourceforge.io for the time being. [1] https://groups.google.com/g/isl-development/c/JGaMo2VUu_8 Signed-off-by: Rui Salvaterra --- tools/isl/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/isl/Makefile b/tools/isl/Makefile index be372fe2a8..32c3cda9a2 100644 --- a/tools/isl/Makefile +++ b/tools/isl/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=isl PKG_VERSION:=0.24 -PKG_SOURCE_URL:=http://isl.gforge.inria.fr +PKG_SOURCE_URL:=https://libisl.sourceforge.io/ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_HASH:=043105cc544f416b48736fff8caf077fb0663a717d06b1113f16e391ac99ebad From b8e682ac748ebf57e55e42adb4488a675deb603f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Fri, 22 Oct 2021 13:46:22 +0200 Subject: [PATCH 36/36] bcm53xx: bridge all LAN ports on Linksys EA9500 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit External switch ports need to be bridged too. Signed-off-by: Rafał Miłecki --- target/linux/bcm53xx/base-files/etc/board.d/02_network | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/linux/bcm53xx/base-files/etc/board.d/02_network b/target/linux/bcm53xx/base-files/etc/board.d/02_network index 9308801b85..6d970e1d0e 100644 --- a/target/linux/bcm53xx/base-files/etc/board.d/02_network +++ b/target/linux/bcm53xx/base-files/etc/board.d/02_network @@ -14,7 +14,7 @@ bcm53xx_setup_interfaces() ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" "wan" ;; linksys,panamera) - ucidef_set_interfaces_lan_wan "lan4 lan7 lan8 extsw" "wan" + ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 lan5 lan6 lan7 lan8 extsw" "wan" ;; luxul,xap-1610-v1) ucidef_set_interface_lan "poe lan" "dhcp"