Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
dd4624e1eb
@ -67,6 +67,10 @@ HOST_CONFIGURE_ARGS = \
|
|||||||
--localstatedir=$(HOST_BUILD_PREFIX)/var \
|
--localstatedir=$(HOST_BUILD_PREFIX)/var \
|
||||||
--sbindir=$(HOST_BUILD_PREFIX)/bin
|
--sbindir=$(HOST_BUILD_PREFIX)/bin
|
||||||
|
|
||||||
|
ifneq ($(YEAR_2038),y)
|
||||||
|
HOST_CONFIGURE_ARGS += --disable-year2038
|
||||||
|
endif
|
||||||
|
|
||||||
HOST_MAKE_VARS = \
|
HOST_MAKE_VARS = \
|
||||||
CFLAGS="$(HOST_CFLAGS)" \
|
CFLAGS="$(HOST_CFLAGS)" \
|
||||||
CPPFLAGS="$(HOST_CPPFLAGS)" \
|
CPPFLAGS="$(HOST_CPPFLAGS)" \
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
LINUX_VERSION-5.15 = .158
|
LINUX_VERSION-5.15 = .161
|
||||||
LINUX_KERNEL_HASH-5.15.158 = f9071c83a4fd8b80af026b48cfc1869bfa25883f9148b92b5dc1e1e1e26dd5c6
|
LINUX_KERNEL_HASH-5.15.161 = d629f78680dc4b65e3d78b61406fb7757b960c83c206e63ad8c2606b3e3c474c
|
||||||
|
|||||||
@ -6,9 +6,9 @@ PKG_RELEASE:=1
|
|||||||
|
|
||||||
PKG_SOURCE_URL:=https://github.com/openwrt/bcm63xx-cfe.git
|
PKG_SOURCE_URL:=https://github.com/openwrt/bcm63xx-cfe.git
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
PKG_SOURCE_DATE:=2021-06-22
|
PKG_SOURCE_DATE:=2024-06-25
|
||||||
PKG_SOURCE_VERSION:=e5050f37150b34deb547b50feccd0e7439cb5bd7
|
PKG_SOURCE_VERSION:=6519bd2dde3535cafeea43157755f4dbef2f90c5
|
||||||
PKG_MIRROR_HASH:=3b53abf21790e42707e20c73aff23fc32db9fdaf010da6f459a20a9e8f8feae6
|
PKG_MIRROR_HASH:=db4da580b7a611a2b4ddd4ff812e5f8ddfd9694b6f5fd8246a341e61967c00ef
|
||||||
|
|
||||||
PKG_FLAGS:=nonshared
|
PKG_FLAGS:=nonshared
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=hostapd
|
PKG_NAME:=hostapd
|
||||||
PKG_RELEASE:=1
|
PKG_RELEASE:=2
|
||||||
|
|
||||||
PKG_SOURCE_URL:=https://w1.fi/hostap.git
|
PKG_SOURCE_URL:=https://w1.fi/hostap.git
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
|
|||||||
@ -0,0 +1,44 @@
|
|||||||
|
From a329773522953892d9bb4548482d42fc93fea329 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Bauer <mail@david-bauer.net>
|
||||||
|
Date: Thu, 27 Jun 2024 18:45:19 +0200
|
||||||
|
Subject: [PATCH] AP: don't ignore probe-requests with invalid DSSS params
|
||||||
|
|
||||||
|
Don't ignore probe requests which contain an invalid DS parameter for the
|
||||||
|
current operating channel.
|
||||||
|
|
||||||
|
As the comment outlines, the drop shall only apply if
|
||||||
|
dot11RadioMeasurementActivated is set to 1.
|
||||||
|
|
||||||
|
However, it was observed Linux clients (Debian 12 / NixOS 23.11)
|
||||||
|
with an Intel 8265 NIC may generate a probe request frame with
|
||||||
|
dot11RadioMeasurementActivated set to false and an invalid DSSS
|
||||||
|
parameter.
|
||||||
|
|
||||||
|
These were also dropped even though they should not have been. They
|
||||||
|
however should not have contained this parameter in the first place.
|
||||||
|
|
||||||
|
Don't drop Probe Requests which contain such an invalid field. This may
|
||||||
|
lead to more probe responses being sent, however it does fix very
|
||||||
|
frequent connection issues for these clients on 2.4 GHz.
|
||||||
|
|
||||||
|
Signed-off-by: David Bauer <mail@david-bauer.net>
|
||||||
|
---
|
||||||
|
src/ap/beacon.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/ap/beacon.c b/src/ap/beacon.c
|
||||||
|
index 8cd1c4170..bb9329085 100644
|
||||||
|
--- a/src/ap/beacon.c
|
||||||
|
+++ b/src/ap/beacon.c
|
||||||
|
@@ -905,7 +905,7 @@ void handle_probe_req(struct hostapd_data *hapd,
|
||||||
|
* is less likely to see them (Probe Request frame sent on a
|
||||||
|
* neighboring, but partially overlapping, channel).
|
||||||
|
*/
|
||||||
|
- if (elems.ds_params &&
|
||||||
|
+ if (elems.ds_params && 0 &&
|
||||||
|
hapd->iface->current_mode &&
|
||||||
|
(hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G ||
|
||||||
|
hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211B) &&
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ PKG_LICENSE:=GPL-2.0
|
|||||||
PKG_LICENSE_FILES:=NOTICE
|
PKG_LICENSE_FILES:=NOTICE
|
||||||
PKG_CPE_ID:=cpe:/a:e2fsprogs_project:e2fsprogs
|
PKG_CPE_ID:=cpe:/a:e2fsprogs_project:e2fsprogs
|
||||||
|
|
||||||
PKG_BUILD_DEPENDS:=util-linux e2fsprogs/host
|
PKG_BUILD_DEPENDS:=util-linux
|
||||||
PKG_INSTALL:=1
|
PKG_INSTALL:=1
|
||||||
|
|
||||||
PKG_BUILD_PARALLEL:=1
|
PKG_BUILD_PARALLEL:=1
|
||||||
@ -225,23 +225,6 @@ define Build/InstallDev
|
|||||||
$(CP) $(PKG_BUILD_DIR)/lib/e2p/e2p.h $(1)/usr/include/e2p
|
$(CP) $(PKG_BUILD_DIR)/lib/e2p/e2p.h $(1)/usr/include/e2p
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Host/Compile
|
|
||||||
$(MAKE) $(PKG_JOBS) -C $(HOST_BUILD_DIR)/lib/ss mk_cmds
|
|
||||||
$(MAKE) $(PKG_JOBS) -C $(HOST_BUILD_DIR)/lib/et compile_et
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Host/Install
|
|
||||||
$(INSTALL_DIR) $(1)/share/et
|
|
||||||
$(CP) $(HOST_BUILD_DIR)/lib/et/et_[ch].awk $(1)/share/et/
|
|
||||||
$(INSTALL_DIR) $(1)/share/ss
|
|
||||||
$(CP) $(HOST_BUILD_DIR)/lib/ss/ct_c.{sed,awk} $(1)/share/ss/
|
|
||||||
$(INSTALL_DIR) $(1)/bin
|
|
||||||
$(CP) \
|
|
||||||
$(HOST_BUILD_DIR)/lib/et/compile_et \
|
|
||||||
$(HOST_BUILD_DIR)/lib/ss/mk_cmds \
|
|
||||||
$(1)/bin/
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Package/e2fsprogs/conffiles
|
define Package/e2fsprogs/conffiles
|
||||||
/etc/e2fsck.conf
|
/etc/e2fsck.conf
|
||||||
endef
|
endef
|
||||||
@ -354,4 +337,3 @@ $(eval $(call BuildPackage,filefrag))
|
|||||||
$(eval $(call BuildPackage,debugfs))
|
$(eval $(call BuildPackage,debugfs))
|
||||||
$(eval $(call BuildPackage,chattr))
|
$(eval $(call BuildPackage,chattr))
|
||||||
$(eval $(call BuildPackage,lsattr))
|
$(eval $(call BuildPackage,lsattr))
|
||||||
$(eval $(call HostBuild))
|
|
||||||
|
|||||||
@ -8,15 +8,14 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=mtd-utils
|
PKG_NAME:=mtd-utils
|
||||||
PKG_VERSION:=2.1.6
|
PKG_VERSION:=2.2.0
|
||||||
PKG_RELEASE:=3
|
PKG_RELEASE:=1
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
|
||||||
PKG_SOURCE_URL:=https://infraroot.at/pub/mtd/
|
PKG_SOURCE_URL:=https://infraroot.at/pub/mtd/
|
||||||
PKG_HASH:=c1d853bc4adf83bcabd2792fc95af33bdd8643c97e8f7b3f0180af36af76f0e5
|
PKG_HASH:=250d082f67375ca8451b5fcfc9a23a53ced3ebebd8312c288daf2507bbab1324
|
||||||
|
|
||||||
PKG_INSTALL:=1
|
PKG_INSTALL:=1
|
||||||
PKG_FIXUP:=autoreconf
|
|
||||||
|
|
||||||
PKG_FLAGS:=nonshared
|
PKG_FLAGS:=nonshared
|
||||||
PKG_BUILD_FLAGS:=gc-sections
|
PKG_BUILD_FLAGS:=gc-sections
|
||||||
@ -63,7 +62,8 @@ CONFIGURE_ARGS += \
|
|||||||
--without-crypto \
|
--without-crypto \
|
||||||
--without-xattr \
|
--without-xattr \
|
||||||
--without-zstd \
|
--without-zstd \
|
||||||
--without-lzo
|
--without-lzo \
|
||||||
|
--without-zlib
|
||||||
|
|
||||||
define Package/ubi-utils/install
|
define Package/ubi-utils/install
|
||||||
$(INSTALL_DIR) $(1)/usr/sbin
|
$(INSTALL_DIR) $(1)/usr/sbin
|
||||||
|
|||||||
14
rules.mk
14
rules.mk
@ -26,6 +26,7 @@ qstrip=$(strip $(subst ",,$(1)))
|
|||||||
empty:=
|
empty:=
|
||||||
space:= $(empty) $(empty)
|
space:= $(empty) $(empty)
|
||||||
comma:=,
|
comma:=,
|
||||||
|
pound:=\#
|
||||||
merge=$(subst $(space),,$(1))
|
merge=$(subst $(space),,$(1))
|
||||||
confvar=$(shell echo '$(foreach v,$(1),$(v)=$(subst ','\'',$($(v))))' | $(MKHASH) md5)
|
confvar=$(shell echo '$(foreach v,$(1),$(v)=$(subst ','\'',$($(v))))' | $(MKHASH) md5)
|
||||||
strip_last=$(patsubst %.$(lastword $(subst .,$(space),$(1))),%,$(1))
|
strip_last=$(patsubst %.$(lastword $(subst .,$(space),$(1))),%,$(1))
|
||||||
@ -378,6 +379,19 @@ define shexport
|
|||||||
export $(call shvar,$(1))=$$(call $(1))
|
export $(call shvar,$(1))=$$(call $(1))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
# Test support for 64-bit time with C code from largefile.m4 provided by GNU Gnulib
|
||||||
|
# the value is 'y' when successful and '' otherwise
|
||||||
|
define YEAR_2038
|
||||||
|
$(shell \
|
||||||
|
mkdir -p $(TMP_DIR); \
|
||||||
|
echo '$(pound) include <time.h>' > $(TMP_DIR)/year2038.c; \
|
||||||
|
echo '$(pound) define LARGE_TIME_T ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30)))' >> $(TMP_DIR)/year2038.c; \
|
||||||
|
echo 'int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 && LARGE_TIME_T % 65537 == 0) ? 1 : -1];' >> $(TMP_DIR)/year2038.c; \
|
||||||
|
echo 'int main (void) {return 0;}' >> $(TMP_DIR)/year2038.c; \
|
||||||
|
$(HOSTCC) $(TMP_DIR)/year2038.c -o /dev/null 2>/dev/null && echo y && rm -f $(TMP_DIR)/year2038.c || rm -f $(TMP_DIR)/year2038.c; \
|
||||||
|
)
|
||||||
|
endef
|
||||||
|
|
||||||
# Execute commands under flock
|
# Execute commands under flock
|
||||||
# $(1) => The shell expression.
|
# $(1) => The shell expression.
|
||||||
# $(2) => The lock name. If not given, the global lock will be used.
|
# $(2) => The lock name. If not given, the global lock will be used.
|
||||||
|
|||||||
@ -18,6 +18,7 @@ sercomm,h500-s-vfes)
|
|||||||
uci add_list firewall.@zone[0].network='qtn'
|
uci add_list firewall.@zone[0].network='qtn'
|
||||||
;;
|
;;
|
||||||
comtrend,vg-8050 |\
|
comtrend,vg-8050 |\
|
||||||
|
sagem,fast-3864-op |\
|
||||||
sercomm,shg2500)
|
sercomm,shg2500)
|
||||||
ucidef_set_bridge_device switch
|
ucidef_set_bridge_device switch
|
||||||
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" "wan"
|
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" "wan"
|
||||||
|
|||||||
@ -10,7 +10,8 @@ platform_check_image() {
|
|||||||
platform_do_upgrade() {
|
platform_do_upgrade() {
|
||||||
case "$(board_name)" in
|
case "$(board_name)" in
|
||||||
comtrend,vg-8050 |\
|
comtrend,vg-8050 |\
|
||||||
comtrend,vr-3032u)
|
comtrend,vr-3032u |\
|
||||||
|
sagem,fast-3864-op)
|
||||||
CI_JFFS2_CLEAN_MARKERS=1
|
CI_JFFS2_CLEAN_MARKERS=1
|
||||||
nand_do_upgrade "$1"
|
nand_do_upgrade "$1"
|
||||||
;;
|
;;
|
||||||
|
|||||||
283
target/linux/bmips/dts/bcm63168-sagem-fast-3864-op.dts
Normal file
283
target/linux/bmips/dts/bcm63168-sagem-fast-3864-op.dts
Normal file
@ -0,0 +1,283 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "bcm63268.dtsi"
|
||||||
|
|
||||||
|
/ {
|
||||||
|
model = "Sagemcom F@ST 3864 OP";
|
||||||
|
compatible = "sagem,fast-3864-op", "brcm,bcm63168", "brcm,bcm63268";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
led-boot = &led_power_green;
|
||||||
|
led-failsafe = &led_power_red;
|
||||||
|
led-running = &led_power_green;
|
||||||
|
led-upgrade = &led_power_green;
|
||||||
|
};
|
||||||
|
|
||||||
|
keys {
|
||||||
|
compatible = "gpio-keys-polled";
|
||||||
|
poll-interval = <100>;
|
||||||
|
|
||||||
|
reset {
|
||||||
|
label = "reset";
|
||||||
|
gpios = <&gpio 32 GPIO_ACTIVE_LOW>;
|
||||||
|
linux,code = <KEY_RESTART>;
|
||||||
|
debounce-interval = <60>;
|
||||||
|
};
|
||||||
|
|
||||||
|
wps {
|
||||||
|
label = "wps";
|
||||||
|
gpios = <&gpio 33 GPIO_ACTIVE_LOW>;
|
||||||
|
linux,code = <KEY_WPS_BUTTON>;
|
||||||
|
debounce-interval = <60>;
|
||||||
|
};
|
||||||
|
|
||||||
|
wlan {
|
||||||
|
label = "wlan";
|
||||||
|
gpios = <&gpio 34 GPIO_ACTIVE_LOW>;
|
||||||
|
linux,code = <KEY_WLAN>;
|
||||||
|
debounce-interval = <60>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&ehci {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
ðernet {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
nvmem-cells = <&macaddr_cferom_6a0>;
|
||||||
|
nvmem-cell-names = "mac-address";
|
||||||
|
};
|
||||||
|
|
||||||
|
&leds {
|
||||||
|
status = "okay";
|
||||||
|
brcm,serial-leds;
|
||||||
|
brcm,serial-dat-low;
|
||||||
|
brcm,serial-shift-inv;
|
||||||
|
brcm,serial-mux;
|
||||||
|
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_leds &pinctrl_serial_led>;
|
||||||
|
|
||||||
|
led@0 {
|
||||||
|
reg = <0>;
|
||||||
|
active-low;
|
||||||
|
function = LED_FUNCTION_WPS;
|
||||||
|
color = <LED_COLOR_ID_GREEN>;
|
||||||
|
};
|
||||||
|
|
||||||
|
led@1 {
|
||||||
|
reg = <1>;
|
||||||
|
active-low;
|
||||||
|
function = LED_FUNCTION_WPS;
|
||||||
|
color = <LED_COLOR_ID_RED>;
|
||||||
|
};
|
||||||
|
|
||||||
|
led@2 {
|
||||||
|
reg = <2>;
|
||||||
|
active-low;
|
||||||
|
label = "red:internet";
|
||||||
|
};
|
||||||
|
|
||||||
|
led@3 {
|
||||||
|
reg = <3>;
|
||||||
|
active-low;
|
||||||
|
label = "green:dsl";
|
||||||
|
};
|
||||||
|
|
||||||
|
led@4 {
|
||||||
|
reg = <4>;
|
||||||
|
active-low;
|
||||||
|
label = "green:fxs";
|
||||||
|
};
|
||||||
|
|
||||||
|
led@5 {
|
||||||
|
reg = <5>;
|
||||||
|
active-low;
|
||||||
|
label = "red:fxs";
|
||||||
|
};
|
||||||
|
|
||||||
|
led@8 {
|
||||||
|
reg = <8>;
|
||||||
|
active-low;
|
||||||
|
label = "green:internet";
|
||||||
|
};
|
||||||
|
|
||||||
|
led@9 {
|
||||||
|
reg = <9>;
|
||||||
|
active-low;
|
||||||
|
label = "green:dsl_bonding";
|
||||||
|
};
|
||||||
|
|
||||||
|
led_power_red: led@15 {
|
||||||
|
reg = <15>;
|
||||||
|
active-low;
|
||||||
|
function = LED_FUNCTION_POWER;
|
||||||
|
color = <LED_COLOR_ID_RED>;
|
||||||
|
};
|
||||||
|
|
||||||
|
led_power_green: led@20 {
|
||||||
|
reg = <20>;
|
||||||
|
active-low;
|
||||||
|
function = LED_FUNCTION_POWER;
|
||||||
|
color = <LED_COLOR_ID_GREEN>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&mdio_ext {
|
||||||
|
switch@1e {
|
||||||
|
compatible = "brcm,bcm53125";
|
||||||
|
reg = <0x1e>;
|
||||||
|
|
||||||
|
dsa,member = <1 0>;
|
||||||
|
|
||||||
|
ports {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
port@1 {
|
||||||
|
reg = <1>;
|
||||||
|
label = "lan4";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@2 {
|
||||||
|
reg = <2>;
|
||||||
|
label = "lan3";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@3 {
|
||||||
|
reg = <3>;
|
||||||
|
label = "lan2";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@4 {
|
||||||
|
reg = <4>;
|
||||||
|
label = "lan1";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@8 {
|
||||||
|
reg = <8>;
|
||||||
|
|
||||||
|
phy-mode = "rgmii";
|
||||||
|
ethernet = <&switch0port4>;
|
||||||
|
|
||||||
|
fixed-link {
|
||||||
|
speed = <1000>;
|
||||||
|
full-duplex;
|
||||||
|
asym-pause;
|
||||||
|
pause;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&nflash {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
nandcs@0 {
|
||||||
|
compatible = "brcm,nandcs";
|
||||||
|
reg = <0>;
|
||||||
|
nand-ecc-step-size = <512>;
|
||||||
|
nand-ecc-strength = <15>;
|
||||||
|
nand-on-flash-bbt;
|
||||||
|
brcm,nand-oob-sector-size = <64>;
|
||||||
|
|
||||||
|
partitions {
|
||||||
|
compatible = "fixed-partitions";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
|
||||||
|
partition@0 {
|
||||||
|
label = "cferom_nvram";
|
||||||
|
reg = <0x00000000 0x00020000>;
|
||||||
|
read-only;
|
||||||
|
|
||||||
|
nvmem-layout {
|
||||||
|
compatible = "fixed-layout";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
|
||||||
|
macaddr_cferom_6a0: macaddr@6a0 {
|
||||||
|
reg = <0x6a0 0x6>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@20000 {
|
||||||
|
compatible = "brcm,wfi-split";
|
||||||
|
label = "wfi";
|
||||||
|
reg = <0x00020000 0x7ac0000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@7ae0000 {
|
||||||
|
label = "stock_hidden1";
|
||||||
|
reg = <0x07ae0000 0x0020000>;
|
||||||
|
read-only;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@7b00000 {
|
||||||
|
label = "stock_data";
|
||||||
|
reg = <0x07b00000 0x0400000>;
|
||||||
|
read-only;
|
||||||
|
};
|
||||||
|
|
||||||
|
partition@7f00000 {
|
||||||
|
label = "stock_hidden2";
|
||||||
|
reg = <0x07f00000 0x0100000>;
|
||||||
|
read-only;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&ohci {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&pcie {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&pinctrl {
|
||||||
|
pinctrl_leds: leds {
|
||||||
|
function = "led";
|
||||||
|
pins = "gpio8", "gpio9", "gpio15",
|
||||||
|
"gpio20";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&switch0 {
|
||||||
|
dsa,member = <0 0>;
|
||||||
|
|
||||||
|
ports {
|
||||||
|
port@3 {
|
||||||
|
reg = <3>;
|
||||||
|
label = "wan";
|
||||||
|
|
||||||
|
phy-handle = <&phy4>;
|
||||||
|
};
|
||||||
|
|
||||||
|
switch0port4: port@4 {
|
||||||
|
reg = <4>;
|
||||||
|
label = "extsw";
|
||||||
|
|
||||||
|
phy-mode = "rgmii";
|
||||||
|
|
||||||
|
fixed-link {
|
||||||
|
speed = <1000>;
|
||||||
|
full-duplex;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart0 {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
|
||||||
|
&usbh {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
@ -42,6 +42,7 @@
|
|||||||
cpus {
|
cpus {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
mips-cbr-reg = <0xff400000>;
|
||||||
mips-hpt-frequency = <150000000>;
|
mips-hpt-frequency = <150000000>;
|
||||||
|
|
||||||
cpu@0 {
|
cpu@0 {
|
||||||
|
|||||||
@ -43,6 +43,7 @@
|
|||||||
cpus {
|
cpus {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
mips-cbr-reg = <0xff400000>;
|
||||||
mips-hpt-frequency = <200000000>;
|
mips-hpt-frequency = <200000000>;
|
||||||
|
|
||||||
cpu@0 {
|
cpu@0 {
|
||||||
|
|||||||
@ -25,7 +25,6 @@
|
|||||||
#include <linux/phy.h>
|
#include <linux/phy.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/reset.h>
|
#include <linux/reset.h>
|
||||||
#include <linux/version.h>
|
|
||||||
|
|
||||||
/* DMA channels */
|
/* DMA channels */
|
||||||
#define DMA_CHAN_WIDTH 0x10
|
#define DMA_CHAN_WIDTH 0x10
|
||||||
@ -1647,11 +1646,7 @@ static int bcm6348_emac_probe(struct platform_device *pdev)
|
|||||||
ndev->min_mtu = ETH_ZLEN - ETH_HLEN;
|
ndev->min_mtu = ETH_ZLEN - ETH_HLEN;
|
||||||
ndev->mtu = ETH_DATA_LEN - VLAN_ETH_HLEN;
|
ndev->mtu = ETH_DATA_LEN - VLAN_ETH_HLEN;
|
||||||
ndev->max_mtu = ENET_MAX_MTU - VLAN_ETH_HLEN;
|
ndev->max_mtu = ENET_MAX_MTU - VLAN_ETH_HLEN;
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,1,0)
|
netif_napi_add_weight(ndev, &emac->napi, bcm6348_emac_poll, 16);
|
||||||
netif_napi_add(ndev, &emac->napi, bcm6348_emac_poll);
|
|
||||||
#else
|
|
||||||
netif_napi_add(ndev, &emac->napi, bcm6348_emac_poll, 16);
|
|
||||||
#endif
|
|
||||||
SET_NETDEV_DEV(ndev, dev);
|
SET_NETDEV_DEV(ndev, dev);
|
||||||
|
|
||||||
ret = devm_register_netdev(dev, ndev);
|
ret = devm_register_netdev(dev, ndev);
|
||||||
|
|||||||
@ -20,7 +20,6 @@
|
|||||||
#include <linux/pm_domain.h>
|
#include <linux/pm_domain.h>
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
#include <linux/reset.h>
|
#include <linux/reset.h>
|
||||||
#include <linux/version.h>
|
|
||||||
|
|
||||||
/* TODO: Bigger frames may work but we do not trust that they are safe on all
|
/* TODO: Bigger frames may work but we do not trust that they are safe on all
|
||||||
* platforms so more research is needed, a max frame size of 2048 has been
|
* platforms so more research is needed, a max frame size of 2048 has been
|
||||||
@ -1077,11 +1076,7 @@ static int bcm6368_enetsw_probe(struct platform_device *pdev)
|
|||||||
ndev->min_mtu = ETH_ZLEN;
|
ndev->min_mtu = ETH_ZLEN;
|
||||||
ndev->mtu = ETH_DATA_LEN;
|
ndev->mtu = ETH_DATA_LEN;
|
||||||
ndev->max_mtu = ENETSW_MAX_MTU;
|
ndev->max_mtu = ENETSW_MAX_MTU;
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,1,0)
|
netif_napi_add_weight(ndev, &priv->napi, bcm6368_enetsw_poll, 16);
|
||||||
netif_napi_add(ndev, &priv->napi, bcm6368_enetsw_poll);
|
|
||||||
#else
|
|
||||||
netif_napi_add(ndev, &priv->napi, bcm6368_enetsw_poll, 16);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ret = devm_register_netdev(dev, ndev);
|
ret = devm_register_netdev(dev, ndev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|||||||
@ -38,6 +38,26 @@ define Device/comtrend_vr-3032u
|
|||||||
endef
|
endef
|
||||||
TARGET_DEVICES += comtrend_vr-3032u
|
TARGET_DEVICES += comtrend_vr-3032u
|
||||||
|
|
||||||
|
define Device/sagem_fast-3864-op
|
||||||
|
$(Device/bcm63xx-nand)
|
||||||
|
DEVICE_VENDOR := Sagemcom
|
||||||
|
DEVICE_MODEL := F@ST 3864
|
||||||
|
DEVICE_VARIANT := OP
|
||||||
|
CHIP_ID := 63268
|
||||||
|
SOC := bcm63168
|
||||||
|
CFE_RAM_FILE := sagem,fast-3864-op/cferam.000
|
||||||
|
CFE_RAM_JFFS2_NAME := cferam.000
|
||||||
|
BLOCKSIZE := 128k
|
||||||
|
PAGESIZE := 2048
|
||||||
|
SUBPAGESIZE := 512
|
||||||
|
VID_HDR_OFFSET := 2048
|
||||||
|
DEVICE_PACKAGES += $(USB2_PACKAGES) \
|
||||||
|
kmod-leds-bcm6328
|
||||||
|
CFE_WFI_FLASH_TYPE := 3
|
||||||
|
CFE_WFI_VERSION := 0x5732
|
||||||
|
endef
|
||||||
|
TARGET_DEVICES += sagem_fast-3864-op
|
||||||
|
|
||||||
define Device/sercomm_h500-s-lowi
|
define Device/sercomm_h500-s-lowi
|
||||||
$(Device/sercomm-nand)
|
$(Device/sercomm-nand)
|
||||||
DEVICE_VENDOR := Sercomm
|
DEVICE_VENDOR := Sercomm
|
||||||
|
|||||||
@ -0,0 +1,35 @@
|
|||||||
|
From ce5cdd3b05216b704a704f466fb4c2dff3778caf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
Date: Tue, 11 Jun 2024 13:35:33 +0200
|
||||||
|
Subject: [PATCH] mips: bmips: BCM6358: make sure CBR is correctly set
|
||||||
|
|
||||||
|
It was discovered that some device have CBR address set to 0 causing
|
||||||
|
kernel panic when arch_sync_dma_for_cpu_all is called.
|
||||||
|
|
||||||
|
This was notice in situation where the system is booted from TP1 and
|
||||||
|
BMIPS_GET_CBR() returns 0 instead of a valid address and
|
||||||
|
!!(read_c0_brcm_cmt_local() & (1 << 31)); not failing.
|
||||||
|
|
||||||
|
The current check whether RAC flush should be disabled or not are not
|
||||||
|
enough hence lets check if CBR is a valid address or not.
|
||||||
|
|
||||||
|
Fixes: ab327f8acdf8 ("mips: bmips: BCM6358: disable RAC flush for TP1")
|
||||||
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
Acked-by: Florian Fainelli <florian.fainelli@broadcom.com>
|
||||||
|
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
||||||
|
---
|
||||||
|
arch/mips/bmips/setup.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/arch/mips/bmips/setup.c
|
||||||
|
+++ b/arch/mips/bmips/setup.c
|
||||||
|
@@ -110,7 +110,8 @@ static void bcm6358_quirks(void)
|
||||||
|
* RAC flush causes kernel panics on BCM6358 when booting from TP1
|
||||||
|
* because the bootloader is not initializing it properly.
|
||||||
|
*/
|
||||||
|
- bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31));
|
||||||
|
+ bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31)) ||
|
||||||
|
+ !!BMIPS_GET_CBR();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bcm6368_quirks(void)
|
||||||
@ -0,0 +1,171 @@
|
|||||||
|
From a5c05453a13ab324ad8719e8a23dfb6af01f3652 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
Date: Thu, 20 Jun 2024 17:26:42 +0200
|
||||||
|
Subject: [PATCH 1/4] mips: bmips: rework and cache CBR addr handling
|
||||||
|
|
||||||
|
Rework the handling of the CBR address and cache it. This address
|
||||||
|
doesn't change and can be cached instead of reading the register every
|
||||||
|
time.
|
||||||
|
|
||||||
|
This is in preparation of permitting to tweak the CBR address in DT with
|
||||||
|
broken SoC or bootloader.
|
||||||
|
|
||||||
|
bmips_cbr_addr is defined in setup.c for each arch to keep compatibility
|
||||||
|
with legacy brcm47xx/brcm63xx and generic BMIPS target.
|
||||||
|
|
||||||
|
Acked-by: Florian Fainelli <florian.fainelli@broadcom.com>
|
||||||
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
||||||
|
---
|
||||||
|
arch/mips/bcm47xx/prom.c | 3 +++
|
||||||
|
arch/mips/bcm47xx/setup.c | 4 ++++
|
||||||
|
arch/mips/bcm63xx/prom.c | 3 +++
|
||||||
|
arch/mips/bcm63xx/setup.c | 4 ++++
|
||||||
|
arch/mips/bmips/dma.c | 2 +-
|
||||||
|
arch/mips/bmips/setup.c | 7 ++++++-
|
||||||
|
arch/mips/include/asm/bmips.h | 1 +
|
||||||
|
arch/mips/kernel/smp-bmips.c | 4 ++--
|
||||||
|
8 files changed, 24 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/mips/bcm47xx/prom.c
|
||||||
|
+++ b/arch/mips/bcm47xx/prom.c
|
||||||
|
@@ -32,6 +32,7 @@
|
||||||
|
#include <linux/ssb/ssb_driver_chipcommon.h>
|
||||||
|
#include <linux/ssb/ssb_regs.h>
|
||||||
|
#include <linux/smp.h>
|
||||||
|
+#include <asm/bmips.h>
|
||||||
|
#include <asm/bootinfo.h>
|
||||||
|
#include <bcm47xx.h>
|
||||||
|
#include <bcm47xx_board.h>
|
||||||
|
@@ -109,6 +110,8 @@ static __init void prom_init_mem(void)
|
||||||
|
|
||||||
|
void __init prom_init(void)
|
||||||
|
{
|
||||||
|
+ /* Cache CBR addr before CPU/DMA setup */
|
||||||
|
+ bmips_cbr_addr = BMIPS_GET_CBR();
|
||||||
|
prom_init_mem();
|
||||||
|
setup_8250_early_printk_port(CKSEG1ADDR(BCM47XX_SERIAL_ADDR), 0, 0);
|
||||||
|
}
|
||||||
|
--- a/arch/mips/bcm47xx/setup.c
|
||||||
|
+++ b/arch/mips/bcm47xx/setup.c
|
||||||
|
@@ -37,6 +37,7 @@
|
||||||
|
#include <linux/ssb/ssb.h>
|
||||||
|
#include <linux/ssb/ssb_embedded.h>
|
||||||
|
#include <linux/bcma/bcma_soc.h>
|
||||||
|
+#include <asm/bmips.h>
|
||||||
|
#include <asm/bootinfo.h>
|
||||||
|
#include <asm/idle.h>
|
||||||
|
#include <asm/prom.h>
|
||||||
|
@@ -45,6 +46,9 @@
|
||||||
|
#include <bcm47xx.h>
|
||||||
|
#include <bcm47xx_board.h>
|
||||||
|
|
||||||
|
+/* CBR addr doesn't change and we can cache it */
|
||||||
|
+void __iomem *bmips_cbr_addr __read_mostly;
|
||||||
|
+
|
||||||
|
union bcm47xx_bus bcm47xx_bus;
|
||||||
|
EXPORT_SYMBOL(bcm47xx_bus);
|
||||||
|
|
||||||
|
--- a/arch/mips/bcm63xx/prom.c
|
||||||
|
+++ b/arch/mips/bcm63xx/prom.c
|
||||||
|
@@ -22,6 +22,9 @@ void __init prom_init(void)
|
||||||
|
{
|
||||||
|
u32 reg, mask;
|
||||||
|
|
||||||
|
+ /* Cache CBR addr before CPU/DMA setup */
|
||||||
|
+ bmips_cbr_addr = BMIPS_GET_CBR();
|
||||||
|
+
|
||||||
|
bcm63xx_cpu_init();
|
||||||
|
|
||||||
|
/* stop any running watchdog */
|
||||||
|
--- a/arch/mips/bcm63xx/setup.c
|
||||||
|
+++ b/arch/mips/bcm63xx/setup.c
|
||||||
|
@@ -12,6 +12,7 @@
|
||||||
|
#include <linux/memblock.h>
|
||||||
|
#include <linux/ioport.h>
|
||||||
|
#include <linux/pm.h>
|
||||||
|
+#include <asm/bmips.h>
|
||||||
|
#include <asm/bootinfo.h>
|
||||||
|
#include <asm/time.h>
|
||||||
|
#include <asm/reboot.h>
|
||||||
|
@@ -22,6 +23,9 @@
|
||||||
|
#include <bcm63xx_io.h>
|
||||||
|
#include <bcm63xx_gpio.h>
|
||||||
|
|
||||||
|
+/* CBR addr doesn't change and we can cache it */
|
||||||
|
+void __iomem *bmips_cbr_addr __read_mostly;
|
||||||
|
+
|
||||||
|
void bcm63xx_machine_halt(void)
|
||||||
|
{
|
||||||
|
pr_info("System halted\n");
|
||||||
|
--- a/arch/mips/bmips/dma.c
|
||||||
|
+++ b/arch/mips/bmips/dma.c
|
||||||
|
@@ -9,7 +9,7 @@ bool bmips_rac_flush_disable;
|
||||||
|
|
||||||
|
void arch_sync_dma_for_cpu_all(void)
|
||||||
|
{
|
||||||
|
- void __iomem *cbr = BMIPS_GET_CBR();
|
||||||
|
+ void __iomem *cbr = bmips_cbr_addr;
|
||||||
|
u32 cfg;
|
||||||
|
|
||||||
|
if (boot_cpu_type() != CPU_BMIPS3300 &&
|
||||||
|
--- a/arch/mips/bmips/setup.c
|
||||||
|
+++ b/arch/mips/bmips/setup.c
|
||||||
|
@@ -34,6 +34,9 @@
|
||||||
|
#define REG_BCM6328_OTP ((void __iomem *)CKSEG1ADDR(0x1000062c))
|
||||||
|
#define BCM6328_TP1_DISABLED BIT(9)
|
||||||
|
|
||||||
|
+/* CBR addr doesn't change and we can cache it */
|
||||||
|
+void __iomem *bmips_cbr_addr __read_mostly;
|
||||||
|
+
|
||||||
|
extern bool bmips_rac_flush_disable;
|
||||||
|
|
||||||
|
static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000;
|
||||||
|
@@ -111,7 +114,7 @@ static void bcm6358_quirks(void)
|
||||||
|
* because the bootloader is not initializing it properly.
|
||||||
|
*/
|
||||||
|
bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31)) ||
|
||||||
|
- !!BMIPS_GET_CBR();
|
||||||
|
+ !!bmips_cbr_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bcm6368_quirks(void)
|
||||||
|
@@ -144,6 +147,8 @@ static void __init bmips_init_cfe(void)
|
||||||
|
|
||||||
|
void __init prom_init(void)
|
||||||
|
{
|
||||||
|
+ /* Cache CBR addr before CPU/DMA setup */
|
||||||
|
+ bmips_cbr_addr = BMIPS_GET_CBR();
|
||||||
|
bmips_init_cfe();
|
||||||
|
bmips_cpu_setup();
|
||||||
|
register_bmips_smp_ops();
|
||||||
|
--- a/arch/mips/include/asm/bmips.h
|
||||||
|
+++ b/arch/mips/include/asm/bmips.h
|
||||||
|
@@ -81,6 +81,7 @@ extern char bmips_smp_movevec[];
|
||||||
|
extern char bmips_smp_int_vec[];
|
||||||
|
extern char bmips_smp_int_vec_end[];
|
||||||
|
|
||||||
|
+extern void __iomem *bmips_cbr_addr;
|
||||||
|
extern int bmips_smp_enabled;
|
||||||
|
extern int bmips_cpu_offset;
|
||||||
|
extern cpumask_t bmips_booted_mask;
|
||||||
|
--- a/arch/mips/kernel/smp-bmips.c
|
||||||
|
+++ b/arch/mips/kernel/smp-bmips.c
|
||||||
|
@@ -518,7 +518,7 @@ static void bmips_set_reset_vec(int cpu,
|
||||||
|
info.val = val;
|
||||||
|
bmips_set_reset_vec_remote(&info);
|
||||||
|
} else {
|
||||||
|
- void __iomem *cbr = BMIPS_GET_CBR();
|
||||||
|
+ void __iomem *cbr = bmips_cbr_addr;
|
||||||
|
|
||||||
|
if (cpu == 0)
|
||||||
|
__raw_writel(val, cbr + BMIPS_RELO_VECTOR_CONTROL_0);
|
||||||
|
@@ -591,7 +591,7 @@ asmlinkage void __weak plat_wired_tlb_se
|
||||||
|
|
||||||
|
void bmips_cpu_setup(void)
|
||||||
|
{
|
||||||
|
- void __iomem __maybe_unused *cbr = BMIPS_GET_CBR();
|
||||||
|
+ void __iomem __maybe_unused *cbr = bmips_cbr_addr;
|
||||||
|
u32 __maybe_unused cfg;
|
||||||
|
|
||||||
|
switch (current_cpu_type()) {
|
||||||
@ -0,0 +1,111 @@
|
|||||||
|
From b95b30e50aed225d26e20737873ae2404941901c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
Date: Thu, 20 Jun 2024 17:26:44 +0200
|
||||||
|
Subject: [PATCH 3/4] mips: bmips: setup: make CBR address configurable
|
||||||
|
|
||||||
|
Add support to provide CBR address from DT to handle broken
|
||||||
|
SoC/Bootloader that doesn't correctly init it. This permits to use the
|
||||||
|
RAC flush even in these condition.
|
||||||
|
|
||||||
|
To provide a CBR address from DT, the property "brcm,bmips-cbr-reg"
|
||||||
|
needs to be set in the "cpus" node. On DT init, this property presence
|
||||||
|
will be checked and will set the bmips_cbr_addr value accordingly. Also
|
||||||
|
bmips_rac_flush_disable will be set to false as RAC flush can be
|
||||||
|
correctly supported.
|
||||||
|
|
||||||
|
The CBR address from DT will overwrite the cached one and the
|
||||||
|
one set in the CBR register will be ignored.
|
||||||
|
|
||||||
|
Also the DT CBR address is validated on being outside DRAM window.
|
||||||
|
|
||||||
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
Acked-by: Florian Fainelli <florian.fainelli@broadcom.com>
|
||||||
|
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
||||||
|
---
|
||||||
|
arch/mips/bcm47xx/setup.c | 6 +++++-
|
||||||
|
arch/mips/bcm63xx/setup.c | 6 +++++-
|
||||||
|
arch/mips/bmips/setup.c | 30 ++++++++++++++++++++++++++++--
|
||||||
|
3 files changed, 38 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/mips/bcm47xx/setup.c
|
||||||
|
+++ b/arch/mips/bcm47xx/setup.c
|
||||||
|
@@ -46,7 +46,11 @@
|
||||||
|
#include <bcm47xx.h>
|
||||||
|
#include <bcm47xx_board.h>
|
||||||
|
|
||||||
|
-/* CBR addr doesn't change and we can cache it */
|
||||||
|
+/*
|
||||||
|
+ * CBR addr doesn't change and we can cache it.
|
||||||
|
+ * For broken SoC/Bootloader CBR addr might also be provided via DT
|
||||||
|
+ * with "brcm,bmips-cbr-reg" in the "cpus" node.
|
||||||
|
+ */
|
||||||
|
void __iomem *bmips_cbr_addr __read_mostly;
|
||||||
|
|
||||||
|
union bcm47xx_bus bcm47xx_bus;
|
||||||
|
--- a/arch/mips/bcm63xx/setup.c
|
||||||
|
+++ b/arch/mips/bcm63xx/setup.c
|
||||||
|
@@ -23,7 +23,11 @@
|
||||||
|
#include <bcm63xx_io.h>
|
||||||
|
#include <bcm63xx_gpio.h>
|
||||||
|
|
||||||
|
-/* CBR addr doesn't change and we can cache it */
|
||||||
|
+/*
|
||||||
|
+ * CBR addr doesn't change and we can cache it.
|
||||||
|
+ * For broken SoC/Bootloader CBR addr might also be provided via DT
|
||||||
|
+ * with "brcm,bmips-cbr-reg" in the "cpus" node.
|
||||||
|
+ */
|
||||||
|
void __iomem *bmips_cbr_addr __read_mostly;
|
||||||
|
|
||||||
|
void bcm63xx_machine_halt(void)
|
||||||
|
--- a/arch/mips/bmips/setup.c
|
||||||
|
+++ b/arch/mips/bmips/setup.c
|
||||||
|
@@ -34,7 +34,11 @@
|
||||||
|
#define REG_BCM6328_OTP ((void __iomem *)CKSEG1ADDR(0x1000062c))
|
||||||
|
#define BCM6328_TP1_DISABLED BIT(9)
|
||||||
|
|
||||||
|
-/* CBR addr doesn't change and we can cache it */
|
||||||
|
+/*
|
||||||
|
+ * CBR addr doesn't change and we can cache it.
|
||||||
|
+ * For broken SoC/Bootloader CBR addr might also be provided via DT
|
||||||
|
+ * with "brcm,bmips-cbr-reg" in the "cpus" node.
|
||||||
|
+ */
|
||||||
|
void __iomem *bmips_cbr_addr __read_mostly;
|
||||||
|
|
||||||
|
extern bool bmips_rac_flush_disable;
|
||||||
|
@@ -208,13 +212,35 @@ void __init plat_mem_setup(void)
|
||||||
|
void __init device_tree_init(void)
|
||||||
|
{
|
||||||
|
struct device_node *np;
|
||||||
|
+ u32 addr;
|
||||||
|
|
||||||
|
unflatten_and_copy_device_tree();
|
||||||
|
|
||||||
|
/* Disable SMP boot unless both CPUs are listed in DT and !disabled */
|
||||||
|
np = of_find_node_by_name(NULL, "cpus");
|
||||||
|
- if (np && of_get_available_child_count(np) <= 1)
|
||||||
|
+ if (!np)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (of_get_available_child_count(np) <= 1)
|
||||||
|
bmips_smp_enabled = 0;
|
||||||
|
+
|
||||||
|
+ /* Check if DT provide a CBR address */
|
||||||
|
+ if (of_property_read_u32(np, "brcm,bmips-cbr-reg", &addr))
|
||||||
|
+ goto exit;
|
||||||
|
+
|
||||||
|
+ /* Make sure CBR address is outside DRAM window */
|
||||||
|
+ if (addr >= (u32)memblock_start_of_DRAM() &&
|
||||||
|
+ addr < (u32)memblock_end_of_DRAM()) {
|
||||||
|
+ WARN(1, "DT CBR %x inside DRAM window. Ignoring DT CBR.\n",
|
||||||
|
+ addr);
|
||||||
|
+ goto exit;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ bmips_cbr_addr = (void __iomem *)addr;
|
||||||
|
+ /* Since CBR is provided by DT, enable RAC flush */
|
||||||
|
+ bmips_rac_flush_disable = false;
|
||||||
|
+
|
||||||
|
+exit:
|
||||||
|
of_node_put(np);
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,57 @@
|
|||||||
|
From 04f38d1a4db017f17e82442727b91ce03dd72759 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Daniel=20Gonz=C3=A1lez=20Cabanelas?= <dgcbueu@gmail.com>
|
||||||
|
Date: Thu, 20 Jun 2024 17:26:45 +0200
|
||||||
|
Subject: [PATCH 4/4] mips: bmips: enable RAC on BMIPS4350
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
The data RAC is left disabled by the bootloader in some SoCs, at least in
|
||||||
|
the core it boots from.
|
||||||
|
Enabling this feature increases the performance up to +30% depending on the
|
||||||
|
task.
|
||||||
|
|
||||||
|
Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com>
|
||||||
|
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
||||||
|
[ rework code and reduce code duplication ]
|
||||||
|
Acked-by: Florian Fainelli <florian.fainelli@broadcom.com>
|
||||||
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||||
|
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
||||||
|
---
|
||||||
|
arch/mips/kernel/smp-bmips.c | 18 ++++++++++++++++++
|
||||||
|
1 file changed, 18 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/mips/kernel/smp-bmips.c
|
||||||
|
+++ b/arch/mips/kernel/smp-bmips.c
|
||||||
|
@@ -592,6 +592,7 @@ asmlinkage void __weak plat_wired_tlb_se
|
||||||
|
void bmips_cpu_setup(void)
|
||||||
|
{
|
||||||
|
void __iomem __maybe_unused *cbr = bmips_cbr_addr;
|
||||||
|
+ u32 __maybe_unused rac_addr;
|
||||||
|
u32 __maybe_unused cfg;
|
||||||
|
|
||||||
|
switch (current_cpu_type()) {
|
||||||
|
@@ -620,6 +621,23 @@ void bmips_cpu_setup(void)
|
||||||
|
__raw_readl(cbr + BMIPS_RAC_ADDRESS_RANGE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case CPU_BMIPS4350:
|
||||||
|
+ rac_addr = BMIPS_RAC_CONFIG_1;
|
||||||
|
+
|
||||||
|
+ if (!(read_c0_brcm_cmt_local() & (1 << 31)))
|
||||||
|
+ rac_addr = BMIPS_RAC_CONFIG;
|
||||||
|
+
|
||||||
|
+ /* Enable data RAC */
|
||||||
|
+ cfg = __raw_readl(cbr + rac_addr);
|
||||||
|
+ __raw_writel(cfg | 0xf, cbr + rac_addr);
|
||||||
|
+ __raw_readl(cbr + rac_addr);
|
||||||
|
+
|
||||||
|
+ /* Flush stale data out of the readahead cache */
|
||||||
|
+ cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
||||||
|
+ __raw_writel(cfg | 0x100, cbr + BMIPS_RAC_CONFIG);
|
||||||
|
+ __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
case CPU_BMIPS4380:
|
||||||
|
/* CBG workaround for early BMIPS4380 CPUs */
|
||||||
|
switch (read_c0_prid()) {
|
||||||
@ -15,7 +15,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
|||||||
|
|
||||||
--- a/arch/mips/bmips/setup.c
|
--- a/arch/mips/bmips/setup.c
|
||||||
+++ b/arch/mips/bmips/setup.c
|
+++ b/arch/mips/bmips/setup.c
|
||||||
@@ -31,13 +31,52 @@
|
@@ -31,8 +31,42 @@
|
||||||
|
|
||||||
#define RELO_NORMAL_VEC BIT(18)
|
#define RELO_NORMAL_VEC BIT(18)
|
||||||
|
|
||||||
@ -56,7 +56,9 @@ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
|||||||
+#define BCM63268_FCVO_SHIFT 21
|
+#define BCM63268_FCVO_SHIFT 21
|
||||||
+#define BCM63268_FCVO_MASK (0xf << BCM63268_FCVO_SHIFT)
|
+#define BCM63268_FCVO_MASK (0xf << BCM63268_FCVO_SHIFT)
|
||||||
|
|
||||||
extern bool bmips_rac_flush_disable;
|
/*
|
||||||
|
* CBR addr doesn't change and we can cache it.
|
||||||
|
@@ -45,6 +79,11 @@ extern bool bmips_rac_flush_disable;
|
||||||
|
|
||||||
static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000;
|
static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000;
|
||||||
|
|
||||||
@ -68,7 +70,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
|||||||
struct bmips_quirk {
|
struct bmips_quirk {
|
||||||
const char *compatible;
|
const char *compatible;
|
||||||
void (*quirk_fn)(void);
|
void (*quirk_fn)(void);
|
||||||
@@ -153,17 +192,161 @@ const char *get_system_type(void)
|
@@ -163,17 +202,161 @@ const char *get_system_type(void)
|
||||||
return "Generic BMIPS kernel";
|
return "Generic BMIPS kernel";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -70,9 +70,9 @@ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
|||||||
+
|
+
|
||||||
+#define DDR_CSEND_REG 0x8
|
+#define DDR_CSEND_REG 0x8
|
||||||
|
|
||||||
extern bool bmips_rac_flush_disable;
|
/*
|
||||||
|
* CBR addr doesn't change and we can cache it.
|
||||||
@@ -77,6 +98,11 @@ struct bmips_cpufreq {
|
@@ -84,6 +105,11 @@ struct bmips_cpufreq {
|
||||||
u32 (*cpu_freq)(void);
|
u32 (*cpu_freq)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
|||||||
struct bmips_quirk {
|
struct bmips_quirk {
|
||||||
const char *compatible;
|
const char *compatible;
|
||||||
void (*quirk_fn)(void);
|
void (*quirk_fn)(void);
|
||||||
@@ -351,9 +377,90 @@ void __init plat_time_init(void)
|
@@ -361,9 +387,90 @@ void __init plat_time_init(void)
|
||||||
mips_hpt_frequency = freq;
|
mips_hpt_frequency = freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,7 +175,7 @@ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
|||||||
const struct bmips_quirk *q;
|
const struct bmips_quirk *q;
|
||||||
|
|
||||||
set_io_port_base(0);
|
set_io_port_base(0);
|
||||||
@@ -374,6 +481,18 @@ void __init plat_mem_setup(void)
|
@@ -384,6 +491,18 @@ void __init plat_mem_setup(void)
|
||||||
|
|
||||||
__dt_setup_arch(dtb);
|
__dt_setup_arch(dtb);
|
||||||
|
|
||||||
|
|||||||
@ -1,82 +0,0 @@
|
|||||||
From 3e4c3863e0cfb8c2abdff6bb494ca69d3d2aed9c Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
|
|
||||||
Date: Sat, 10 Jun 2023 17:01:40 +0200
|
|
||||||
Subject: [PATCH] mips: bmips: dma: fix CBR address
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Some BCM63xx SoCs may return CBR address as 0.
|
|
||||||
|
|
||||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
|
||||||
---
|
|
||||||
arch/mips/bmips/dma.c | 12 ++++--------
|
|
||||||
arch/mips/bmips/setup.c | 11 ++++-------
|
|
||||||
2 files changed, 8 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
--- a/arch/mips/bmips/dma.c
|
|
||||||
+++ b/arch/mips/bmips/dma.c
|
|
||||||
@@ -5,11 +5,10 @@
|
|
||||||
#include <asm/bmips.h>
|
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
-bool bmips_rac_flush_disable;
|
|
||||||
+void __iomem *bmips_cbr_addr;
|
|
||||||
|
|
||||||
void arch_sync_dma_for_cpu_all(void)
|
|
||||||
{
|
|
||||||
- void __iomem *cbr = BMIPS_GET_CBR();
|
|
||||||
u32 cfg;
|
|
||||||
|
|
||||||
if (boot_cpu_type() != CPU_BMIPS3300 &&
|
|
||||||
@@ -17,11 +16,8 @@ void arch_sync_dma_for_cpu_all(void)
|
|
||||||
boot_cpu_type() != CPU_BMIPS4380)
|
|
||||||
return;
|
|
||||||
|
|
||||||
- if (unlikely(bmips_rac_flush_disable))
|
|
||||||
- return;
|
|
||||||
-
|
|
||||||
/* Flush stale data out of the readahead cache */
|
|
||||||
- cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
|
||||||
- __raw_writel(cfg | 0x100, cbr + BMIPS_RAC_CONFIG);
|
|
||||||
- __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
|
||||||
+ cfg = __raw_readl(bmips_cbr_addr + BMIPS_RAC_CONFIG);
|
|
||||||
+ __raw_writel(cfg | 0x100, bmips_cbr_addr + BMIPS_RAC_CONFIG);
|
|
||||||
+ __raw_readl(bmips_cbr_addr + BMIPS_RAC_CONFIG);
|
|
||||||
}
|
|
||||||
--- a/arch/mips/bmips/setup.c
|
|
||||||
+++ b/arch/mips/bmips/setup.c
|
|
||||||
@@ -89,7 +89,7 @@
|
|
||||||
|
|
||||||
#define DDR_CSEND_REG 0x8
|
|
||||||
|
|
||||||
-extern bool bmips_rac_flush_disable;
|
|
||||||
+extern void __iomem *bmips_cbr_addr;
|
|
||||||
|
|
||||||
static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000;
|
|
||||||
|
|
||||||
@@ -170,12 +170,6 @@ static void bcm6358_quirks(void)
|
|
||||||
* disable SMP for now
|
|
||||||
*/
|
|
||||||
bmips_smp_enabled = 0;
|
|
||||||
-
|
|
||||||
- /*
|
|
||||||
- * RAC flush causes kernel panics on BCM6358 when booting from TP1
|
|
||||||
- * because the bootloader is not initializing it properly.
|
|
||||||
- */
|
|
||||||
- bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void bcm6368_quirks(void)
|
|
||||||
@@ -208,6 +202,11 @@ static void __init bmips_init_cfe(void)
|
|
||||||
|
|
||||||
void __init prom_init(void)
|
|
||||||
{
|
|
||||||
+ if (!(read_c0_brcm_cbr() >> 18))
|
|
||||||
+ bmips_cbr_addr = (void __iomem *) 0xff400000;
|
|
||||||
+ else
|
|
||||||
+ bmips_cbr_addr = BMIPS_GET_CBR();
|
|
||||||
+
|
|
||||||
bmips_init_cfe();
|
|
||||||
bmips_cpu_setup();
|
|
||||||
register_bmips_smp_ops();
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
From 7f862eaedac56b67972393f0a9affcd2fe53479b Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?Daniel=20Gonz=C3=A1lez=20Cabanelas?= <dgcbueu@gmail.com>
|
|
||||||
Date: Sun, 18 Jun 2023 19:59:25 +0200
|
|
||||||
Subject: [PATCH] mips: bmips: enable RAC on BMIPS4350
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
The data RAC is left disabled by the bootloader in some SoCs, at least in
|
|
||||||
the core it boots from.
|
|
||||||
Enabling this feature increases the performance up to +30% depending on the
|
|
||||||
task.
|
|
||||||
|
|
||||||
Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com>
|
|
||||||
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
|
|
||||||
---
|
|
||||||
arch/mips/kernel/smp-bmips.c | 14 ++++++++++++++
|
|
||||||
1 file changed, 14 insertions(+)
|
|
||||||
|
|
||||||
--- a/arch/mips/kernel/smp-bmips.c
|
|
||||||
+++ b/arch/mips/kernel/smp-bmips.c
|
|
||||||
@@ -620,6 +620,20 @@ void bmips_cpu_setup(void)
|
|
||||||
__raw_readl(cbr + BMIPS_RAC_ADDRESS_RANGE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
+ case CPU_BMIPS4350:
|
|
||||||
+ /* Enable data RAC */
|
|
||||||
+ if (!(read_c0_brcm_cmt_local() & (1 << 31))) {
|
|
||||||
+ cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
|
||||||
+ __raw_writel(cfg | 0xa, cbr + BMIPS_RAC_CONFIG);
|
|
||||||
+ __raw_readl(cbr + BMIPS_RAC_CONFIG);
|
|
||||||
+ } else {
|
|
||||||
+ cbr = (void __iomem *)0xff400000;
|
|
||||||
+ cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG_1);
|
|
||||||
+ __raw_writel(cfg | 0xa, cbr + BMIPS_RAC_CONFIG_1);
|
|
||||||
+ __raw_readl(cbr + BMIPS_RAC_CONFIG_1);
|
|
||||||
+ }
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
case CPU_BMIPS4380:
|
|
||||||
/* CBG workaround for early BMIPS4380 CPUs */
|
|
||||||
switch (read_c0_prid()) {
|
|
||||||
@ -156,7 +156,7 @@ Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
|||||||
if (priv && (priv->quirks & XHCI_SG_TRB_CACHE_SIZE_QUIRK))
|
if (priv && (priv->quirks & XHCI_SG_TRB_CACHE_SIZE_QUIRK))
|
||||||
--- a/drivers/usb/host/xhci-plat.h
|
--- a/drivers/usb/host/xhci-plat.h
|
||||||
+++ b/drivers/usb/host/xhci-plat.h
|
+++ b/drivers/usb/host/xhci-plat.h
|
||||||
@@ -13,7 +13,6 @@
|
@@ -15,7 +15,6 @@ struct usb_hcd;
|
||||||
struct xhci_plat_priv {
|
struct xhci_plat_priv {
|
||||||
const char *firmware_name;
|
const char *firmware_name;
|
||||||
unsigned long long quirks;
|
unsigned long long quirks;
|
||||||
|
|||||||
@ -25,7 +25,7 @@ Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
|||||||
|
|
||||||
--- a/drivers/mtd/mtdcore.c
|
--- a/drivers/mtd/mtdcore.c
|
||||||
+++ b/drivers/mtd/mtdcore.c
|
+++ b/drivers/mtd/mtdcore.c
|
||||||
@@ -1236,6 +1236,34 @@ int __get_mtd_device(struct mtd_info *mt
|
@@ -1238,6 +1238,34 @@ int __get_mtd_device(struct mtd_info *mt
|
||||||
EXPORT_SYMBOL_GPL(__get_mtd_device);
|
EXPORT_SYMBOL_GPL(__get_mtd_device);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -31,7 +31,7 @@ Link: https://lore.kernel.org/linux-mtd/20220629125737.14418-2-kernel@kempniu.pl
|
|||||||
|
|
||||||
--- a/drivers/mtd/mtdcore.c
|
--- a/drivers/mtd/mtdcore.c
|
||||||
+++ b/drivers/mtd/mtdcore.c
|
+++ b/drivers/mtd/mtdcore.c
|
||||||
@@ -1676,6 +1676,9 @@ int mtd_read_oob(struct mtd_info *mtd, l
|
@@ -1678,6 +1678,9 @@ int mtd_read_oob(struct mtd_info *mtd, l
|
||||||
if (!master->_read_oob && (!master->_read || ops->oobbuf))
|
if (!master->_read_oob && (!master->_read || ops->oobbuf))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ Link: https://lore.kernel.org/linux-mtd/20220629125737.14418-2-kernel@kempniu.pl
|
|||||||
if (mtd->flags & MTD_SLC_ON_MLC_EMULATION)
|
if (mtd->flags & MTD_SLC_ON_MLC_EMULATION)
|
||||||
ret_code = mtd_io_emulated_slc(mtd, from, true, ops);
|
ret_code = mtd_io_emulated_slc(mtd, from, true, ops);
|
||||||
else
|
else
|
||||||
@@ -1693,6 +1696,8 @@ int mtd_read_oob(struct mtd_info *mtd, l
|
@@ -1695,6 +1698,8 @@ int mtd_read_oob(struct mtd_info *mtd, l
|
||||||
return ret_code;
|
return ret_code;
|
||||||
if (mtd->ecc_strength == 0)
|
if (mtd->ecc_strength == 0)
|
||||||
return 0; /* device lacks ecc */
|
return 0; /* device lacks ecc */
|
||||||
|
|||||||
@ -17,7 +17,7 @@ Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-4-michael@walle.cc
|
|||||||
|
|
||||||
--- a/drivers/mtd/mtdcore.c
|
--- a/drivers/mtd/mtdcore.c
|
||||||
+++ b/drivers/mtd/mtdcore.c
|
+++ b/drivers/mtd/mtdcore.c
|
||||||
@@ -960,8 +960,8 @@ static int mtd_otp_nvmem_add(struct mtd_
|
@@ -962,8 +962,8 @@ static int mtd_otp_nvmem_add(struct mtd_
|
||||||
nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size,
|
nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size,
|
||||||
mtd_nvmem_user_otp_reg_read);
|
mtd_nvmem_user_otp_reg_read);
|
||||||
if (IS_ERR(nvmem)) {
|
if (IS_ERR(nvmem)) {
|
||||||
@ -28,7 +28,7 @@ Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-4-michael@walle.cc
|
|||||||
}
|
}
|
||||||
mtd->otp_user_nvmem = nvmem;
|
mtd->otp_user_nvmem = nvmem;
|
||||||
}
|
}
|
||||||
@@ -978,7 +978,6 @@ static int mtd_otp_nvmem_add(struct mtd_
|
@@ -980,7 +980,6 @@ static int mtd_otp_nvmem_add(struct mtd_
|
||||||
nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size,
|
nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size,
|
||||||
mtd_nvmem_fact_otp_reg_read);
|
mtd_nvmem_fact_otp_reg_read);
|
||||||
if (IS_ERR(nvmem)) {
|
if (IS_ERR(nvmem)) {
|
||||||
@ -36,7 +36,7 @@ Link: https://lore.kernel.org/linux-mtd/20230308082021.870459-4-michael@walle.cc
|
|||||||
err = PTR_ERR(nvmem);
|
err = PTR_ERR(nvmem);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -991,7 +990,7 @@ static int mtd_otp_nvmem_add(struct mtd_
|
@@ -993,7 +992,7 @@ static int mtd_otp_nvmem_add(struct mtd_
|
||||||
err:
|
err:
|
||||||
if (mtd->otp_user_nvmem)
|
if (mtd->otp_user_nvmem)
|
||||||
nvmem_unregister(mtd->otp_user_nvmem);
|
nvmem_unregister(mtd->otp_user_nvmem);
|
||||||
|
|||||||
@ -148,7 +148,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|||||||
* of_find_node_by_phandle - Find a node given a phandle
|
* of_find_node_by_phandle - Find a node given a phandle
|
||||||
--- a/drivers/spi/spi.c
|
--- a/drivers/spi/spi.c
|
||||||
+++ b/drivers/spi/spi.c
|
+++ b/drivers/spi/spi.c
|
||||||
@@ -2140,8 +2140,8 @@ of_register_spi_device(struct spi_contro
|
@@ -2144,8 +2144,8 @@ of_register_spi_device(struct spi_contro
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Select device driver */
|
/* Select device driver */
|
||||||
|
|||||||
@ -20,7 +20,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
|
|
||||||
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
||||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||||
@@ -5372,7 +5372,8 @@ static const struct mv88e6xxx_info mv88e
|
@@ -5414,7 +5414,8 @@ static const struct mv88e6xxx_info mv88e
|
||||||
.name = "Marvell 88E6191X",
|
.name = "Marvell 88E6191X",
|
||||||
.num_databases = 4096,
|
.num_databases = 4096,
|
||||||
.num_ports = 11, /* 10 + Z80 */
|
.num_ports = 11, /* 10 + Z80 */
|
||||||
@ -30,7 +30,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
.max_vid = 8191,
|
.max_vid = 8191,
|
||||||
.port_base_addr = 0x0,
|
.port_base_addr = 0x0,
|
||||||
.phy_base_addr = 0x0,
|
.phy_base_addr = 0x0,
|
||||||
@@ -5394,7 +5395,8 @@ static const struct mv88e6xxx_info mv88e
|
@@ -5436,7 +5437,8 @@ static const struct mv88e6xxx_info mv88e
|
||||||
.name = "Marvell 88E6193X",
|
.name = "Marvell 88E6193X",
|
||||||
.num_databases = 4096,
|
.num_databases = 4096,
|
||||||
.num_ports = 11, /* 10 + Z80 */
|
.num_ports = 11, /* 10 + Z80 */
|
||||||
@ -40,7 +40,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|||||||
.max_vid = 8191,
|
.max_vid = 8191,
|
||||||
.port_base_addr = 0x0,
|
.port_base_addr = 0x0,
|
||||||
.phy_base_addr = 0x0,
|
.phy_base_addr = 0x0,
|
||||||
@@ -5704,7 +5706,8 @@ static const struct mv88e6xxx_info mv88e
|
@@ -5746,7 +5748,8 @@ static const struct mv88e6xxx_info mv88e
|
||||||
.name = "Marvell 88E6393X",
|
.name = "Marvell 88E6393X",
|
||||||
.num_databases = 4096,
|
.num_databases = 4096,
|
||||||
.num_ports = 11, /* 10 + Z80 */
|
.num_ports = 11, /* 10 + Z80 */
|
||||||
|
|||||||
@ -38,7 +38,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
|||||||
err = chip->info->ops->port_set_pause(chip, port, pause);
|
err = chip->info->ops->port_set_pause(chip, port, pause);
|
||||||
--- a/drivers/net/dsa/mv88e6xxx/chip.h
|
--- a/drivers/net/dsa/mv88e6xxx/chip.h
|
||||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
|
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
|
||||||
@@ -485,7 +485,8 @@ struct mv88e6xxx_ops {
|
@@ -491,7 +491,8 @@ struct mv88e6xxx_ops {
|
||||||
int speed, int duplex);
|
int speed, int duplex);
|
||||||
|
|
||||||
/* What interface mode should be used for maximum speed? */
|
/* What interface mode should be used for maximum speed? */
|
||||||
|
|||||||
@ -71,7 +71,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
|||||||
|
|
||||||
mv88e6065_phylink_validate(chip, port, mask, state);
|
mv88e6065_phylink_validate(chip, port, mask, state);
|
||||||
}
|
}
|
||||||
@@ -5651,6 +5673,31 @@ static const struct mv88e6xxx_info mv88e
|
@@ -5693,6 +5715,31 @@ static const struct mv88e6xxx_info mv88e
|
||||||
.ptp_support = true,
|
.ptp_support = true,
|
||||||
.ops = &mv88e6352_ops,
|
.ops = &mv88e6352_ops,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -0,0 +1,371 @@
|
|||||||
|
From dee4dd10c79aaca192b73520d8fb64628468ae0f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Elad Yifee <eladwf@gmail.com>
|
||||||
|
Date: Fri, 7 Jun 2024 11:21:50 +0300
|
||||||
|
Subject: [PATCH] net: ethernet: mtk_eth_soc: ppe: add support for multiple
|
||||||
|
PPEs
|
||||||
|
|
||||||
|
Add the missing pieces to allow multiple PPEs units, one for each GMAC.
|
||||||
|
mtk_gdm_config has been modified to work on targted mac ID,
|
||||||
|
the inner loop moved outside of the function to allow unrelated
|
||||||
|
operations like setting the MAC's PPE index.
|
||||||
|
Introduce a sanity check in flow_offload_replace to account for
|
||||||
|
non-MTK ingress devices.
|
||||||
|
Additional field 'ppe_idx' was added to struct mtk_mac in order
|
||||||
|
to keep track on the assigned PPE unit.
|
||||||
|
|
||||||
|
Signed-off-by: Elad Yifee <eladwf@gmail.com>
|
||||||
|
Link: https://lore.kernel.org/r/20240607082155.20021-1-eladwf@gmail.com
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 112 +++++++++++-------
|
||||||
|
drivers/net/ethernet/mediatek/mtk_eth_soc.h | 8 +-
|
||||||
|
.../net/ethernet/mediatek/mtk_ppe_offload.c | 17 ++-
|
||||||
|
3 files changed, 92 insertions(+), 45 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||||
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||||
|
@@ -80,7 +80,9 @@ static const struct mtk_reg_map mtk_reg_
|
||||||
|
.fq_blen = 0x1b2c,
|
||||||
|
},
|
||||||
|
.gdm1_cnt = 0x2400,
|
||||||
|
- .gdma_to_ppe = 0x4444,
|
||||||
|
+ .gdma_to_ppe = {
|
||||||
|
+ [0] = 0x4444,
|
||||||
|
+ },
|
||||||
|
.ppe_base = 0x0c00,
|
||||||
|
.wdma_base = {
|
||||||
|
[0] = 0x2800,
|
||||||
|
@@ -144,7 +146,10 @@ static const struct mtk_reg_map mt7986_r
|
||||||
|
.tx_sch_rate = 0x4798,
|
||||||
|
},
|
||||||
|
.gdm1_cnt = 0x1c00,
|
||||||
|
- .gdma_to_ppe = 0x3333,
|
||||||
|
+ .gdma_to_ppe = {
|
||||||
|
+ [0] = 0x3333,
|
||||||
|
+ [1] = 0x4444,
|
||||||
|
+ },
|
||||||
|
.ppe_base = 0x2000,
|
||||||
|
.wdma_base = {
|
||||||
|
[0] = 0x4800,
|
||||||
|
@@ -192,7 +197,11 @@ static const struct mtk_reg_map mt7988_r
|
||||||
|
.tx_sch_rate = 0x4798,
|
||||||
|
},
|
||||||
|
.gdm1_cnt = 0x1c00,
|
||||||
|
- .gdma_to_ppe = 0x3333,
|
||||||
|
+ .gdma_to_ppe = {
|
||||||
|
+ [0] = 0x3333,
|
||||||
|
+ [1] = 0x4444,
|
||||||
|
+ [2] = 0xcccc,
|
||||||
|
+ },
|
||||||
|
.ppe_base = 0x2000,
|
||||||
|
.wdma_base = {
|
||||||
|
[0] = 0x4800,
|
||||||
|
@@ -2015,6 +2024,7 @@ static int mtk_poll_rx(struct napi_struc
|
||||||
|
struct mtk_rx_dma_v2 *rxd, trxd;
|
||||||
|
int done = 0, bytes = 0;
|
||||||
|
dma_addr_t dma_addr = DMA_MAPPING_ERROR;
|
||||||
|
+ int ppe_idx = 0;
|
||||||
|
|
||||||
|
while (done < budget) {
|
||||||
|
unsigned int pktlen, *rxdcsum;
|
||||||
|
@@ -2058,6 +2068,7 @@ static int mtk_poll_rx(struct napi_struc
|
||||||
|
goto release_desc;
|
||||||
|
|
||||||
|
netdev = eth->netdev[mac];
|
||||||
|
+ ppe_idx = eth->mac[mac]->ppe_idx;
|
||||||
|
|
||||||
|
if (unlikely(test_bit(MTK_RESETTING, ð->state)))
|
||||||
|
goto release_desc;
|
||||||
|
@@ -2181,7 +2192,7 @@ static int mtk_poll_rx(struct napi_struc
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED)
|
||||||
|
- mtk_ppe_check_skb(eth->ppe[0], skb, hash);
|
||||||
|
+ mtk_ppe_check_skb(eth->ppe[ppe_idx], skb, hash);
|
||||||
|
|
||||||
|
skb_record_rx_queue(skb, 0);
|
||||||
|
napi_gro_receive(napi, skb);
|
||||||
|
@@ -3276,37 +3287,27 @@ static int mtk_start_dma(struct mtk_eth
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void mtk_gdm_config(struct mtk_eth *eth, u32 config)
|
||||||
|
+static void mtk_gdm_config(struct mtk_eth *eth, u32 id, u32 config)
|
||||||
|
{
|
||||||
|
- int i;
|
||||||
|
+ u32 val;
|
||||||
|
|
||||||
|
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628))
|
||||||
|
return;
|
||||||
|
|
||||||
|
- for (i = 0; i < MTK_MAX_DEVS; i++) {
|
||||||
|
- u32 val;
|
||||||
|
-
|
||||||
|
- if (!eth->netdev[i])
|
||||||
|
- continue;
|
||||||
|
+ val = mtk_r32(eth, MTK_GDMA_FWD_CFG(id));
|
||||||
|
|
||||||
|
- val = mtk_r32(eth, MTK_GDMA_FWD_CFG(i));
|
||||||
|
+ /* default setup the forward port to send frame to PDMA */
|
||||||
|
+ val &= ~0xffff;
|
||||||
|
|
||||||
|
- /* default setup the forward port to send frame to PDMA */
|
||||||
|
- val &= ~0xffff;
|
||||||
|
+ /* Enable RX checksum */
|
||||||
|
+ val |= MTK_GDMA_ICS_EN | MTK_GDMA_TCS_EN | MTK_GDMA_UCS_EN;
|
||||||
|
|
||||||
|
- /* Enable RX checksum */
|
||||||
|
- val |= MTK_GDMA_ICS_EN | MTK_GDMA_TCS_EN | MTK_GDMA_UCS_EN;
|
||||||
|
+ val |= config;
|
||||||
|
|
||||||
|
- val |= config;
|
||||||
|
+ if (eth->netdev[id] && netdev_uses_dsa(eth->netdev[id]))
|
||||||
|
+ val |= MTK_GDMA_SPECIAL_TAG;
|
||||||
|
|
||||||
|
- if (netdev_uses_dsa(eth->netdev[i]))
|
||||||
|
- val |= MTK_GDMA_SPECIAL_TAG;
|
||||||
|
-
|
||||||
|
- mtk_w32(eth, val, MTK_GDMA_FWD_CFG(i));
|
||||||
|
- }
|
||||||
|
- /* Reset and enable PSE */
|
||||||
|
- mtk_w32(eth, RST_GL_PSE, MTK_RST_GL);
|
||||||
|
- mtk_w32(eth, 0, MTK_RST_GL);
|
||||||
|
+ mtk_w32(eth, val, MTK_GDMA_FWD_CFG(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -3366,7 +3367,10 @@ static int mtk_open(struct net_device *d
|
||||||
|
{
|
||||||
|
struct mtk_mac *mac = netdev_priv(dev);
|
||||||
|
struct mtk_eth *eth = mac->hw;
|
||||||
|
- int i, err;
|
||||||
|
+ struct mtk_mac *target_mac;
|
||||||
|
+ int i, err, ppe_num;
|
||||||
|
+
|
||||||
|
+ ppe_num = eth->soc->ppe_num;
|
||||||
|
|
||||||
|
err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0);
|
||||||
|
if (err) {
|
||||||
|
@@ -3390,18 +3394,38 @@ static int mtk_open(struct net_device *d
|
||||||
|
for (i = 0; i < ARRAY_SIZE(eth->ppe); i++)
|
||||||
|
mtk_ppe_start(eth->ppe[i]);
|
||||||
|
|
||||||
|
- gdm_config = soc->offload_version ? soc->reg_map->gdma_to_ppe
|
||||||
|
- : MTK_GDMA_TO_PDMA;
|
||||||
|
- mtk_gdm_config(eth, gdm_config);
|
||||||
|
+ for (i = 0; i < MTK_MAX_DEVS; i++) {
|
||||||
|
+ if (!eth->netdev[i])
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ target_mac = netdev_priv(eth->netdev[i]);
|
||||||
|
+ if (!soc->offload_version) {
|
||||||
|
+ target_mac->ppe_idx = 0;
|
||||||
|
+ gdm_config = MTK_GDMA_TO_PDMA;
|
||||||
|
+ } else if (ppe_num >= 3 && target_mac->id == 2) {
|
||||||
|
+ target_mac->ppe_idx = 2;
|
||||||
|
+ gdm_config = soc->reg_map->gdma_to_ppe[2];
|
||||||
|
+ } else if (ppe_num >= 2 && target_mac->id == 1) {
|
||||||
|
+ target_mac->ppe_idx = 1;
|
||||||
|
+ gdm_config = soc->reg_map->gdma_to_ppe[1];
|
||||||
|
+ } else {
|
||||||
|
+ target_mac->ppe_idx = 0;
|
||||||
|
+ gdm_config = soc->reg_map->gdma_to_ppe[0];
|
||||||
|
+ }
|
||||||
|
+ mtk_gdm_config(eth, target_mac->id, gdm_config);
|
||||||
|
+ }
|
||||||
|
+ /* Reset and enable PSE */
|
||||||
|
+ mtk_w32(eth, RST_GL_PSE, MTK_RST_GL);
|
||||||
|
+ mtk_w32(eth, 0, MTK_RST_GL);
|
||||||
|
|
||||||
|
napi_enable(ð->tx_napi);
|
||||||
|
napi_enable(ð->rx_napi);
|
||||||
|
mtk_tx_irq_enable(eth, MTK_TX_DONE_INT);
|
||||||
|
mtk_rx_irq_enable(eth, soc->rx.irq_done_mask);
|
||||||
|
refcount_set(ð->dma_refcnt, 1);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
+ } else {
|
||||||
|
refcount_inc(ð->dma_refcnt);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
phylink_start(mac->phylink);
|
||||||
|
netif_tx_start_all_queues(dev);
|
||||||
|
@@ -3478,7 +3502,8 @@ static int mtk_stop(struct net_device *d
|
||||||
|
if (!refcount_dec_and_test(ð->dma_refcnt))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- mtk_gdm_config(eth, MTK_GDMA_DROP_ALL);
|
||||||
|
+ for (i = 0; i < MTK_MAX_DEVS; i++)
|
||||||
|
+ mtk_gdm_config(eth, i, MTK_GDMA_DROP_ALL);
|
||||||
|
|
||||||
|
mtk_tx_irq_disable(eth, MTK_TX_DONE_INT);
|
||||||
|
mtk_rx_irq_disable(eth, eth->soc->rx.irq_done_mask);
|
||||||
|
@@ -4957,23 +4982,24 @@ static int mtk_probe(struct platform_dev
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eth->soc->offload_version) {
|
||||||
|
- u32 num_ppe = mtk_is_netsys_v2_or_greater(eth) ? 2 : 1;
|
||||||
|
+ u8 ppe_num = eth->soc->ppe_num;
|
||||||
|
|
||||||
|
- num_ppe = min_t(u32, ARRAY_SIZE(eth->ppe), num_ppe);
|
||||||
|
- for (i = 0; i < num_ppe; i++) {
|
||||||
|
- u32 ppe_addr = eth->soc->reg_map->ppe_base + i * 0x400;
|
||||||
|
+ ppe_num = min_t(u8, ARRAY_SIZE(eth->ppe), ppe_num);
|
||||||
|
+ for (i = 0; i < ppe_num; i++) {
|
||||||
|
+ u32 ppe_addr = eth->soc->reg_map->ppe_base;
|
||||||
|
|
||||||
|
+ ppe_addr += (i == 2 ? 0xc00 : i * 0x400);
|
||||||
|
eth->ppe[i] = mtk_ppe_init(eth, eth->base + ppe_addr, i);
|
||||||
|
|
||||||
|
if (!eth->ppe[i]) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
goto err_deinit_ppe;
|
||||||
|
}
|
||||||
|
- }
|
||||||
|
+ err = mtk_eth_offload_init(eth, i);
|
||||||
|
|
||||||
|
- err = mtk_eth_offload_init(eth);
|
||||||
|
- if (err)
|
||||||
|
- goto err_deinit_ppe;
|
||||||
|
+ if (err)
|
||||||
|
+ goto err_deinit_ppe;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MTK_MAX_DEVS; i++) {
|
||||||
|
@@ -5076,6 +5102,7 @@ static const struct mtk_soc_data mt7621_
|
||||||
|
.required_pctl = false,
|
||||||
|
.version = 1,
|
||||||
|
.offload_version = 1,
|
||||||
|
+ .ppe_num = 1,
|
||||||
|
.hash_offset = 2,
|
||||||
|
.foe_entry_size = MTK_FOE_ENTRY_V1_SIZE,
|
||||||
|
.tx = {
|
||||||
|
@@ -5104,6 +5131,7 @@ static const struct mtk_soc_data mt7622_
|
||||||
|
.required_pctl = false,
|
||||||
|
.version = 1,
|
||||||
|
.offload_version = 2,
|
||||||
|
+ .ppe_num = 1,
|
||||||
|
.hash_offset = 2,
|
||||||
|
.has_accounting = true,
|
||||||
|
.foe_entry_size = MTK_FOE_ENTRY_V1_SIZE,
|
||||||
|
@@ -5132,6 +5160,7 @@ static const struct mtk_soc_data mt7623_
|
||||||
|
.required_pctl = true,
|
||||||
|
.version = 1,
|
||||||
|
.offload_version = 1,
|
||||||
|
+ .ppe_num = 1,
|
||||||
|
.hash_offset = 2,
|
||||||
|
.foe_entry_size = MTK_FOE_ENTRY_V1_SIZE,
|
||||||
|
.disable_pll_modes = true,
|
||||||
|
@@ -5187,6 +5216,7 @@ static const struct mtk_soc_data mt7981_
|
||||||
|
.required_pctl = false,
|
||||||
|
.version = 2,
|
||||||
|
.offload_version = 2,
|
||||||
|
+ .ppe_num = 2,
|
||||||
|
.hash_offset = 4,
|
||||||
|
.has_accounting = true,
|
||||||
|
.foe_entry_size = MTK_FOE_ENTRY_V2_SIZE,
|
||||||
|
@@ -5216,6 +5246,7 @@ static const struct mtk_soc_data mt7986_
|
||||||
|
.required_pctl = false,
|
||||||
|
.version = 2,
|
||||||
|
.offload_version = 2,
|
||||||
|
+ .ppe_num = 2,
|
||||||
|
.hash_offset = 4,
|
||||||
|
.has_accounting = true,
|
||||||
|
.foe_entry_size = MTK_FOE_ENTRY_V2_SIZE,
|
||||||
|
@@ -5245,6 +5276,7 @@ static const struct mtk_soc_data mt7988_
|
||||||
|
.required_pctl = false,
|
||||||
|
.version = 3,
|
||||||
|
.offload_version = 2,
|
||||||
|
+ .ppe_num = 3,
|
||||||
|
.hash_offset = 4,
|
||||||
|
.has_accounting = true,
|
||||||
|
.foe_entry_size = MTK_FOE_ENTRY_V3_SIZE,
|
||||||
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||||
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||||
|
@@ -1132,7 +1132,7 @@ struct mtk_reg_map {
|
||||||
|
u32 tx_sch_rate; /* tx scheduler rate control registers */
|
||||||
|
} qdma;
|
||||||
|
u32 gdm1_cnt;
|
||||||
|
- u32 gdma_to_ppe;
|
||||||
|
+ u32 gdma_to_ppe[3];
|
||||||
|
u32 ppe_base;
|
||||||
|
u32 wdma_base[3];
|
||||||
|
u32 pse_iq_sta;
|
||||||
|
@@ -1170,6 +1170,7 @@ struct mtk_soc_data {
|
||||||
|
u8 offload_version;
|
||||||
|
u8 hash_offset;
|
||||||
|
u8 version;
|
||||||
|
+ u8 ppe_num;
|
||||||
|
u16 foe_entry_size;
|
||||||
|
netdev_features_t hw_features;
|
||||||
|
bool has_accounting;
|
||||||
|
@@ -1294,7 +1295,7 @@ struct mtk_eth {
|
||||||
|
|
||||||
|
struct metadata_dst *dsa_meta[MTK_MAX_DSA_PORTS];
|
||||||
|
|
||||||
|
- struct mtk_ppe *ppe[2];
|
||||||
|
+ struct mtk_ppe *ppe[3];
|
||||||
|
struct rhashtable flow_table;
|
||||||
|
|
||||||
|
struct bpf_prog __rcu *prog;
|
||||||
|
@@ -1319,6 +1320,7 @@ struct mtk_eth {
|
||||||
|
struct mtk_mac {
|
||||||
|
int id;
|
||||||
|
phy_interface_t interface;
|
||||||
|
+ u8 ppe_idx;
|
||||||
|
int speed;
|
||||||
|
struct device_node *of_node;
|
||||||
|
struct phylink *phylink;
|
||||||
|
@@ -1440,7 +1442,7 @@ int mtk_gmac_sgmii_path_setup(struct mtk
|
||||||
|
int mtk_gmac_gephy_path_setup(struct mtk_eth *eth, int mac_id);
|
||||||
|
int mtk_gmac_rgmii_path_setup(struct mtk_eth *eth, int mac_id);
|
||||||
|
|
||||||
|
-int mtk_eth_offload_init(struct mtk_eth *eth);
|
||||||
|
+int mtk_eth_offload_init(struct mtk_eth *eth, u8 id);
|
||||||
|
int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||||
|
void *type_data);
|
||||||
|
int mtk_flow_offload_cmd(struct mtk_eth *eth, struct flow_cls_offload *cls,
|
||||||
|
--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
|
||||||
|
+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
|
||||||
|
@@ -245,10 +245,10 @@ mtk_flow_offload_replace(struct mtk_eth
|
||||||
|
int ppe_index)
|
||||||
|
{
|
||||||
|
struct flow_rule *rule = flow_cls_offload_flow_rule(f);
|
||||||
|
+ struct net_device *idev = NULL, *odev = NULL;
|
||||||
|
struct flow_action_entry *act;
|
||||||
|
struct mtk_flow_data data = {};
|
||||||
|
struct mtk_foe_entry foe;
|
||||||
|
- struct net_device *odev = NULL;
|
||||||
|
struct mtk_flow_entry *entry;
|
||||||
|
int offload_type = 0;
|
||||||
|
int wed_index = -1;
|
||||||
|
@@ -264,6 +264,17 @@ mtk_flow_offload_replace(struct mtk_eth
|
||||||
|
struct flow_match_meta match;
|
||||||
|
|
||||||
|
flow_rule_match_meta(rule, &match);
|
||||||
|
+ if (mtk_is_netsys_v2_or_greater(eth)) {
|
||||||
|
+ idev = __dev_get_by_index(&init_net, match.key->ingress_ifindex);
|
||||||
|
+ if (idev) {
|
||||||
|
+ struct mtk_mac *mac = netdev_priv(idev);
|
||||||
|
+
|
||||||
|
+ if (WARN_ON(mac->ppe_idx >= eth->soc->ppe_num))
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ ppe_index = mac->ppe_idx;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
} else {
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
@@ -630,7 +641,9 @@ int mtk_eth_setup_tc(struct net_device *
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-int mtk_eth_offload_init(struct mtk_eth *eth)
|
||||||
|
+int mtk_eth_offload_init(struct mtk_eth *eth, u8 id)
|
||||||
|
{
|
||||||
|
+ if (!eth->ppe[id] || !eth->ppe[id]->foe_table)
|
||||||
|
+ return 0;
|
||||||
|
return rhashtable_init(ð->flow_table, &mtk_flow_ht_params);
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
From 73cfd947dbdb25ef9863ac49c4596a7d53ad4025 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Elad Yifee <eladwf@gmail.com>
|
||||||
|
Date: Sun, 23 Jun 2024 20:51:09 +0300
|
||||||
|
Subject: [PATCH] net: ethernet: mtk_eth_soc: ppe: prevent ppe update for
|
||||||
|
non-mtk devices
|
||||||
|
|
||||||
|
Introduce an additional validation to ensure that the PPE index
|
||||||
|
is modified exclusively for mtk_eth ingress devices.
|
||||||
|
This primarily addresses the issue related
|
||||||
|
to WED operation with multiple PPEs.
|
||||||
|
|
||||||
|
Fixes: dee4dd10c79a ("net: ethernet: mtk_eth_soc: ppe: add support for multiple PPEs")
|
||||||
|
Signed-off-by: Elad Yifee <eladwf@gmail.com>
|
||||||
|
Link: https://lore.kernel.org/r/20240623175113.24437-1-eladwf@gmail.com
|
||||||
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/mediatek/mtk_ppe_offload.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
|
||||||
|
+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
|
||||||
|
@@ -266,7 +266,7 @@ mtk_flow_offload_replace(struct mtk_eth
|
||||||
|
flow_rule_match_meta(rule, &match);
|
||||||
|
if (mtk_is_netsys_v2_or_greater(eth)) {
|
||||||
|
idev = __dev_get_by_index(&init_net, match.key->ingress_ifindex);
|
||||||
|
- if (idev) {
|
||||||
|
+ if (idev && idev->netdev_ops == eth->netdev[0]->netdev_ops) {
|
||||||
|
struct mtk_mac *mac = netdev_priv(idev);
|
||||||
|
|
||||||
|
if (WARN_ON(mac->ppe_idx >= eth->soc->ppe_num))
|
||||||
@ -77,7 +77,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
|
|
||||||
#include "mtdcore.h"
|
#include "mtdcore.h"
|
||||||
|
|
||||||
@@ -1106,6 +1107,8 @@ int mtd_device_parse_register(struct mtd
|
@@ -1108,6 +1109,8 @@ int mtd_device_parse_register(struct mtd
|
||||||
register_reboot_notifier(&mtd->reboot_notifier);
|
register_reboot_notifier(&mtd->reboot_notifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ Subject: [PATCH] net/dsa/mv88e6xxx: disable ATU violation
|
|||||||
|
|
||||||
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
||||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||||
@@ -3017,6 +3017,9 @@ static int mv88e6xxx_setup_port(struct m
|
@@ -3027,6 +3027,9 @@ static int mv88e6xxx_setup_port(struct m
|
||||||
else
|
else
|
||||||
reg = 1 << port;
|
reg = 1 << port;
|
||||||
|
|
||||||
|
|||||||
@ -71,7 +71,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
*/
|
*/
|
||||||
--- a/include/linux/skbuff.h
|
--- a/include/linux/skbuff.h
|
||||||
+++ b/include/linux/skbuff.h
|
+++ b/include/linux/skbuff.h
|
||||||
@@ -2855,6 +2855,10 @@ static inline int pskb_trim(struct sk_bu
|
@@ -2870,6 +2870,10 @@ static inline int pskb_trim(struct sk_bu
|
||||||
return (len < skb->len) ? __pskb_trim(skb, len) : 0;
|
return (len < skb->len) ? __pskb_trim(skb, len) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
/**
|
/**
|
||||||
* pskb_trim_unique - remove end from a paged unique (not cloned) buffer
|
* pskb_trim_unique - remove end from a paged unique (not cloned) buffer
|
||||||
* @skb: buffer to alter
|
* @skb: buffer to alter
|
||||||
@@ -3005,16 +3009,6 @@ static inline struct sk_buff *dev_alloc_
|
@@ -3020,16 +3024,6 @@ static inline struct sk_buff *dev_alloc_
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -396,7 +396,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
}
|
}
|
||||||
--- a/net/ipv4/route.c
|
--- a/net/ipv4/route.c
|
||||||
+++ b/net/ipv4/route.c
|
+++ b/net/ipv4/route.c
|
||||||
@@ -387,6 +387,9 @@ static struct pernet_operations ip_rt_pr
|
@@ -388,6 +388,9 @@ static struct pernet_operations ip_rt_pr
|
||||||
|
|
||||||
static int __init ip_rt_proc_init(void)
|
static int __init ip_rt_proc_init(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -87,7 +87,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
if (!net_eq(dev_net(dev), sock_net(sk)))
|
if (!net_eq(dev_net(dev), sock_net(sk)))
|
||||||
goto drop;
|
goto drop;
|
||||||
|
|
||||||
@@ -3346,6 +3348,7 @@ static int packet_create(struct net *net
|
@@ -3345,6 +3347,7 @@ static int packet_create(struct net *net
|
||||||
mutex_init(&po->pg_vec_lock);
|
mutex_init(&po->pg_vec_lock);
|
||||||
po->rollover = NULL;
|
po->rollover = NULL;
|
||||||
po->prot_hook.func = packet_rcv;
|
po->prot_hook.func = packet_rcv;
|
||||||
@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
|
|
||||||
if (sock->type == SOCK_PACKET)
|
if (sock->type == SOCK_PACKET)
|
||||||
po->prot_hook.func = packet_rcv_spkt;
|
po->prot_hook.func = packet_rcv_spkt;
|
||||||
@@ -3983,6 +3986,16 @@ packet_setsockopt(struct socket *sock, i
|
@@ -3982,6 +3985,16 @@ packet_setsockopt(struct socket *sock, i
|
||||||
WRITE_ONCE(po->xmit, val ? packet_direct_xmit : dev_queue_xmit);
|
WRITE_ONCE(po->xmit, val ? packet_direct_xmit : dev_queue_xmit);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -112,7 +112,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
default:
|
default:
|
||||||
return -ENOPROTOOPT;
|
return -ENOPROTOOPT;
|
||||||
}
|
}
|
||||||
@@ -4039,6 +4052,13 @@ static int packet_getsockopt(struct sock
|
@@ -4038,6 +4051,13 @@ static int packet_getsockopt(struct sock
|
||||||
case PACKET_VNET_HDR:
|
case PACKET_VNET_HDR:
|
||||||
val = po->has_vnet_hdr;
|
val = po->has_vnet_hdr;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -9,7 +9,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
|
|
||||||
--- a/include/linux/skbuff.h
|
--- a/include/linux/skbuff.h
|
||||||
+++ b/include/linux/skbuff.h
|
+++ b/include/linux/skbuff.h
|
||||||
@@ -2821,7 +2821,7 @@ static inline int pskb_network_may_pull(
|
@@ -2836,7 +2836,7 @@ static inline int pskb_network_may_pull(
|
||||||
* NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
|
* NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
|
||||||
*/
|
*/
|
||||||
#ifndef NET_SKB_PAD
|
#ifndef NET_SKB_PAD
|
||||||
|
|||||||
@ -110,7 +110,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
--- a/net/ipv6/route.c
|
--- a/net/ipv6/route.c
|
||||||
+++ b/net/ipv6/route.c
|
+++ b/net/ipv6/route.c
|
||||||
@@ -97,6 +97,8 @@ static int ip6_pkt_discard(struct sk_bu
|
@@ -98,6 +98,8 @@ static int ip6_pkt_discard(struct sk_bu
|
||||||
static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
|
static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||||
static int ip6_pkt_prohibit(struct sk_buff *skb);
|
static int ip6_pkt_prohibit(struct sk_buff *skb);
|
||||||
static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb);
|
static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||||
@ -119,7 +119,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
static void ip6_link_failure(struct sk_buff *skb);
|
static void ip6_link_failure(struct sk_buff *skb);
|
||||||
static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
|
static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
|
||||||
struct sk_buff *skb, u32 mtu,
|
struct sk_buff *skb, u32 mtu,
|
||||||
@@ -312,6 +314,18 @@ static const struct rt6_info ip6_prohibi
|
@@ -313,6 +315,18 @@ static const struct rt6_info ip6_prohibi
|
||||||
.rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
|
.rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
static const struct rt6_info ip6_blk_hole_entry_template = {
|
static const struct rt6_info ip6_blk_hole_entry_template = {
|
||||||
.dst = {
|
.dst = {
|
||||||
.__refcnt = ATOMIC_INIT(1),
|
.__refcnt = ATOMIC_INIT(1),
|
||||||
@@ -1033,6 +1047,7 @@ static const int fib6_prop[RTN_MAX + 1]
|
@@ -1034,6 +1048,7 @@ static const int fib6_prop[RTN_MAX + 1]
|
||||||
[RTN_BLACKHOLE] = -EINVAL,
|
[RTN_BLACKHOLE] = -EINVAL,
|
||||||
[RTN_UNREACHABLE] = -EHOSTUNREACH,
|
[RTN_UNREACHABLE] = -EHOSTUNREACH,
|
||||||
[RTN_PROHIBIT] = -EACCES,
|
[RTN_PROHIBIT] = -EACCES,
|
||||||
@ -146,7 +146,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
[RTN_THROW] = -EAGAIN,
|
[RTN_THROW] = -EAGAIN,
|
||||||
[RTN_NAT] = -EINVAL,
|
[RTN_NAT] = -EINVAL,
|
||||||
[RTN_XRESOLVE] = -EINVAL,
|
[RTN_XRESOLVE] = -EINVAL,
|
||||||
@@ -1068,6 +1083,10 @@ static void ip6_rt_init_dst_reject(struc
|
@@ -1069,6 +1084,10 @@ static void ip6_rt_init_dst_reject(struc
|
||||||
rt->dst.output = ip6_pkt_prohibit_out;
|
rt->dst.output = ip6_pkt_prohibit_out;
|
||||||
rt->dst.input = ip6_pkt_prohibit;
|
rt->dst.input = ip6_pkt_prohibit;
|
||||||
break;
|
break;
|
||||||
@ -157,7 +157,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
case RTN_THROW:
|
case RTN_THROW:
|
||||||
case RTN_UNREACHABLE:
|
case RTN_UNREACHABLE:
|
||||||
default:
|
default:
|
||||||
@@ -4557,6 +4576,17 @@ static int ip6_pkt_prohibit_out(struct n
|
@@ -4561,6 +4580,17 @@ static int ip6_pkt_prohibit_out(struct n
|
||||||
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
|
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,7 +175,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
/*
|
/*
|
||||||
* Allocate a dst for local (unicast / anycast) address.
|
* Allocate a dst for local (unicast / anycast) address.
|
||||||
*/
|
*/
|
||||||
@@ -5044,7 +5074,8 @@ static int rtm_to_fib6_config(struct sk_
|
@@ -5048,7 +5078,8 @@ static int rtm_to_fib6_config(struct sk_
|
||||||
if (rtm->rtm_type == RTN_UNREACHABLE ||
|
if (rtm->rtm_type == RTN_UNREACHABLE ||
|
||||||
rtm->rtm_type == RTN_BLACKHOLE ||
|
rtm->rtm_type == RTN_BLACKHOLE ||
|
||||||
rtm->rtm_type == RTN_PROHIBIT ||
|
rtm->rtm_type == RTN_PROHIBIT ||
|
||||||
@ -185,7 +185,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
cfg->fc_flags |= RTF_REJECT;
|
cfg->fc_flags |= RTF_REJECT;
|
||||||
|
|
||||||
if (rtm->rtm_type == RTN_LOCAL)
|
if (rtm->rtm_type == RTN_LOCAL)
|
||||||
@@ -6291,6 +6322,8 @@ static int ip6_route_dev_notify(struct n
|
@@ -6295,6 +6326,8 @@ static int ip6_route_dev_notify(struct n
|
||||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||||
net->ipv6.ip6_prohibit_entry->dst.dev = dev;
|
net->ipv6.ip6_prohibit_entry->dst.dev = dev;
|
||||||
net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
|
net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
|
||||||
@ -194,7 +194,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
|
net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
|
||||||
net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
|
net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
|
||||||
#endif
|
#endif
|
||||||
@@ -6302,6 +6335,7 @@ static int ip6_route_dev_notify(struct n
|
@@ -6306,6 +6339,7 @@ static int ip6_route_dev_notify(struct n
|
||||||
in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
|
in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
|
||||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||||
in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
|
in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
|
||||||
@ -202,7 +202,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);
|
in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -6493,6 +6527,8 @@ static int __net_init ip6_route_net_init
|
@@ -6497,6 +6531,8 @@ static int __net_init ip6_route_net_init
|
||||||
|
|
||||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||||
net->ipv6.fib6_has_custom_rules = false;
|
net->ipv6.fib6_has_custom_rules = false;
|
||||||
@ -211,7 +211,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
|
net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
|
||||||
sizeof(*net->ipv6.ip6_prohibit_entry),
|
sizeof(*net->ipv6.ip6_prohibit_entry),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
@@ -6503,11 +6539,21 @@ static int __net_init ip6_route_net_init
|
@@ -6507,11 +6543,21 @@ static int __net_init ip6_route_net_init
|
||||||
ip6_template_metrics, true);
|
ip6_template_metrics, true);
|
||||||
INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->rt6i_uncached);
|
INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->rt6i_uncached);
|
||||||
|
|
||||||
@ -234,7 +234,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
|
net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
|
||||||
dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
|
dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
|
||||||
ip6_template_metrics, true);
|
ip6_template_metrics, true);
|
||||||
@@ -6534,6 +6580,8 @@ out:
|
@@ -6538,6 +6584,8 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||||
@ -243,7 +243,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
out_ip6_prohibit_entry:
|
out_ip6_prohibit_entry:
|
||||||
kfree(net->ipv6.ip6_prohibit_entry);
|
kfree(net->ipv6.ip6_prohibit_entry);
|
||||||
out_ip6_null_entry:
|
out_ip6_null_entry:
|
||||||
@@ -6553,6 +6601,7 @@ static void __net_exit ip6_route_net_exi
|
@@ -6557,6 +6605,7 @@ static void __net_exit ip6_route_net_exi
|
||||||
kfree(net->ipv6.ip6_null_entry);
|
kfree(net->ipv6.ip6_null_entry);
|
||||||
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
||||||
kfree(net->ipv6.ip6_prohibit_entry);
|
kfree(net->ipv6.ip6_prohibit_entry);
|
||||||
@ -251,7 +251,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
|||||||
kfree(net->ipv6.ip6_blk_hole_entry);
|
kfree(net->ipv6.ip6_blk_hole_entry);
|
||||||
#endif
|
#endif
|
||||||
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
|
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
|
||||||
@@ -6636,6 +6685,9 @@ void __init ip6_route_init_special_entri
|
@@ -6640,6 +6689,9 @@ void __init ip6_route_init_special_entri
|
||||||
init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
|
init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
|
||||||
init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
|
init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
|
||||||
init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
|
init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
|
||||||
|
|||||||
@ -17,7 +17,7 @@ Signed-off-by: Alexander Duyck <alexanderduyck@fb.com>
|
|||||||
|
|
||||||
--- a/net/core/skbuff.c
|
--- a/net/core/skbuff.c
|
||||||
+++ b/net/core/skbuff.c
|
+++ b/net/core/skbuff.c
|
||||||
@@ -4360,6 +4360,15 @@ int skb_gro_receive(struct sk_buff *p, s
|
@@ -4371,6 +4371,15 @@ int skb_gro_receive(struct sk_buff *p, s
|
||||||
if (unlikely(p->len + len >= 65536 || NAPI_GRO_CB(skb)->flush))
|
if (unlikely(p->len + len >= 65536 || NAPI_GRO_CB(skb)->flush))
|
||||||
return -E2BIG;
|
return -E2BIG;
|
||||||
|
|
||||||
|
|||||||
@ -162,7 +162,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
|
void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
|
||||||
int (*poll)(struct napi_struct *, int), int weight)
|
int (*poll)(struct napi_struct *, int), int weight)
|
||||||
{
|
{
|
||||||
@@ -11384,6 +11459,9 @@ static int dev_cpu_dead(unsigned int old
|
@@ -11385,6 +11460,9 @@ static int dev_cpu_dead(unsigned int old
|
||||||
raise_softirq_irqoff(NET_TX_SOFTIRQ);
|
raise_softirq_irqoff(NET_TX_SOFTIRQ);
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
@ -172,7 +172,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
#ifdef CONFIG_RPS
|
#ifdef CONFIG_RPS
|
||||||
remsd = oldsd->rps_ipi_list;
|
remsd = oldsd->rps_ipi_list;
|
||||||
oldsd->rps_ipi_list = NULL;
|
oldsd->rps_ipi_list = NULL;
|
||||||
@@ -11723,6 +11801,7 @@ static int __init net_dev_init(void)
|
@@ -11724,6 +11802,7 @@ static int __init net_dev_init(void)
|
||||||
sd->cpu = i;
|
sd->cpu = i;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,7 @@ Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com>
|
|||||||
|
|
||||||
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
||||||
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
||||||
@@ -6393,6 +6393,7 @@ static int mv88e6xxx_register_switch(str
|
@@ -6435,6 +6435,7 @@ static int mv88e6xxx_register_switch(str
|
||||||
ds->ops = &mv88e6xxx_switch_ops;
|
ds->ops = &mv88e6xxx_switch_ops;
|
||||||
ds->ageing_time_min = chip->info->age_time_coeff;
|
ds->ageing_time_min = chip->info->age_time_coeff;
|
||||||
ds->ageing_time_max = chip->info->age_time_coeff * U8_MAX;
|
ds->ageing_time_max = chip->info->age_time_coeff * U8_MAX;
|
||||||
|
|||||||
@ -1,31 +0,0 @@
|
|||||||
From 4a44a52f16ccd3d03e0cb5fb437a5eb31a5f9f05 Mon Sep 17 00:00:00 2001
|
|
||||||
From: David Bauer <mail@david-bauer.net>
|
|
||||||
Date: Mon, 26 Feb 2024 21:39:34 +0100
|
|
||||||
Subject: [PATCH] net l2tp: drop flow hash on forward
|
|
||||||
|
|
||||||
Drop the flow-hash of the skb when forwarding to the L2TP netdev.
|
|
||||||
|
|
||||||
This avoids the L2TP qdisc from using the flow-hash from the outer
|
|
||||||
packet, which is identical for every flow within the tunnel.
|
|
||||||
|
|
||||||
This does not affect every platform but is specific for the ethernet
|
|
||||||
driver. It depends on the platform including L4 information in the
|
|
||||||
flow-hash.
|
|
||||||
|
|
||||||
Signed-off-by: David Bauer <mail@david-bauer.net>
|
|
||||||
---
|
|
||||||
net/l2tp/l2tp_eth.c | 3 +++
|
|
||||||
1 file changed, 3 insertions(+)
|
|
||||||
|
|
||||||
--- a/net/l2tp/l2tp_eth.c
|
|
||||||
+++ b/net/l2tp/l2tp_eth.c
|
|
||||||
@@ -136,6 +136,9 @@ static void l2tp_eth_dev_recv(struct l2t
|
|
||||||
/* checksums verified by L2TP */
|
|
||||||
skb->ip_summed = CHECKSUM_NONE;
|
|
||||||
|
|
||||||
+ /* drop outer flow-hash */
|
|
||||||
+ skb_clear_hash(skb);
|
|
||||||
+
|
|
||||||
skb_dst_drop(skb);
|
|
||||||
nf_reset_ct(skb);
|
|
||||||
|
|
||||||
@ -8,7 +8,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
|
|
||||||
--- a/drivers/mtd/ubi/build.c
|
--- a/drivers/mtd/ubi/build.c
|
||||||
+++ b/drivers/mtd/ubi/build.c
|
+++ b/drivers/mtd/ubi/build.c
|
||||||
@@ -1258,6 +1258,74 @@ static struct mtd_notifier ubi_mtd_notif
|
@@ -1258,6 +1258,80 @@ static struct mtd_notifier ubi_mtd_notif
|
||||||
.remove = ubi_notify_remove,
|
.remove = ubi_notify_remove,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -21,6 +21,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
+{
|
+{
|
||||||
+ int err;
|
+ int err;
|
||||||
+ struct mtd_info *mtd;
|
+ struct mtd_info *mtd;
|
||||||
|
+ struct device_node *np;
|
||||||
+ loff_t offset = 0;
|
+ loff_t offset = 0;
|
||||||
+ size_t len;
|
+ size_t len;
|
||||||
+ char magic[4];
|
+ char magic[4];
|
||||||
@ -33,6 +34,11 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
+ if (IS_ERR(mtd))
|
+ if (IS_ERR(mtd))
|
||||||
+ return;
|
+ return;
|
||||||
+
|
+
|
||||||
|
+ /* skip "linux,ubi" mtd as it has already been attached */
|
||||||
|
+ np = mtd_get_of_node(mtd);
|
||||||
|
+ if (of_device_is_compatible(np, "linux,ubi"))
|
||||||
|
+ goto cleanup;
|
||||||
|
+
|
||||||
+ /* get the first not bad block */
|
+ /* get the first not bad block */
|
||||||
+ if (mtd_can_have_bb(mtd))
|
+ if (mtd_can_have_bb(mtd))
|
||||||
+ while (mtd_block_isbad(mtd, offset)) {
|
+ while (mtd_block_isbad(mtd, offset)) {
|
||||||
@ -83,7 +89,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
static int __init ubi_init_attach(void)
|
static int __init ubi_init_attach(void)
|
||||||
{
|
{
|
||||||
int err, i, k;
|
int err, i, k;
|
||||||
@@ -1308,6 +1376,12 @@ static int __init ubi_init_attach(void)
|
@@ -1308,6 +1382,12 @@ static int __init ubi_init_attach(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -668,7 +668,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
+ (imgmaxsect + MIN_FREE_SECT) < dsectors) {
|
+ (imgmaxsect + MIN_FREE_SECT) < dsectors) {
|
||||||
+ add_fit_subimage_device(bdev, slot++, imgmaxsect,
|
+ add_fit_subimage_device(bdev, slot++, imgmaxsect,
|
||||||
+ dsectors - imgmaxsect, false);
|
+ dsectors - imgmaxsect, false);
|
||||||
+ dev_info(dev, "mapped remaing space as /dev/fitrw\n");
|
+ dev_info(dev, "mapped remaining space as /dev/fitrw\n");
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+out_bootconf:
|
+out_bootconf:
|
||||||
|
|||||||
@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||||
@@ -4994,6 +4994,8 @@ static int mtk_probe(struct platform_dev
|
@@ -5020,6 +5020,8 @@ static int mtk_probe(struct platform_dev
|
||||||
* for NAPI to work
|
* for NAPI to work
|
||||||
*/
|
*/
|
||||||
init_dummy_netdev(ð->dummy_dev);
|
init_dummy_netdev(ð->dummy_dev);
|
||||||
|
|||||||
@ -11,7 +11,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
||||||
@@ -1334,6 +1334,22 @@ struct mtk_mac {
|
@@ -1336,6 +1336,22 @@ struct mtk_mac {
|
||||||
/* the struct describing the SoC. these are declared in the soc_xyz.c files */
|
/* the struct describing the SoC. these are declared in the soc_xyz.c files */
|
||||||
extern const struct of_device_id of_mtk_match[];
|
extern const struct of_device_id of_mtk_match[];
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
static inline bool mtk_is_netsys_v1(struct mtk_eth *eth)
|
static inline bool mtk_is_netsys_v1(struct mtk_eth *eth)
|
||||||
{
|
{
|
||||||
return eth->soc->version == 1;
|
return eth->soc->version == 1;
|
||||||
@@ -1348,6 +1364,7 @@ static inline bool mtk_is_netsys_v3_or_g
|
@@ -1350,6 +1366,7 @@ static inline bool mtk_is_netsys_v3_or_g
|
||||||
{
|
{
|
||||||
return eth->soc->version > 2;
|
return eth->soc->version > 2;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
#include <net/page_pool/helpers.h>
|
#include <net/page_pool/helpers.h>
|
||||||
|
|
||||||
#include "mtk_eth_soc.h"
|
#include "mtk_eth_soc.h"
|
||||||
@@ -1587,12 +1588,28 @@ static void mtk_wake_queue(struct mtk_et
|
@@ -1596,12 +1597,28 @@ static void mtk_wake_queue(struct mtk_et
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
bool gso = false;
|
bool gso = false;
|
||||||
int tx_num;
|
int tx_num;
|
||||||
|
|
||||||
@@ -1614,6 +1631,18 @@ static netdev_tx_t mtk_start_xmit(struct
|
@@ -1623,6 +1640,18 @@ static netdev_tx_t mtk_start_xmit(struct
|
||||||
return NETDEV_TX_BUSY;
|
return NETDEV_TX_BUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
/* TSO: fill MSS info in tcp checksum field */
|
/* TSO: fill MSS info in tcp checksum field */
|
||||||
if (skb_is_gso(skb)) {
|
if (skb_is_gso(skb)) {
|
||||||
if (skb_cow_head(skb, 0)) {
|
if (skb_cow_head(skb, 0)) {
|
||||||
@@ -1629,8 +1658,14 @@ static netdev_tx_t mtk_start_xmit(struct
|
@@ -1638,8 +1667,14 @@ static netdev_tx_t mtk_start_xmit(struct
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||||
@@ -2129,7 +2129,7 @@ static int mtk_poll_rx(struct napi_struc
|
@@ -2140,7 +2140,7 @@ static int mtk_poll_rx(struct napi_struc
|
||||||
if (ret != XDP_PASS)
|
if (ret != XDP_PASS)
|
||||||
goto skip_rx;
|
goto skip_rx;
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
if (unlikely(!skb)) {
|
if (unlikely(!skb)) {
|
||||||
page_pool_put_full_page(ring->page_pool,
|
page_pool_put_full_page(ring->page_pool,
|
||||||
page, true);
|
page, true);
|
||||||
@@ -2167,7 +2167,7 @@ static int mtk_poll_rx(struct napi_struc
|
@@ -2178,7 +2178,7 @@ static int mtk_poll_rx(struct napi_struc
|
||||||
dma_unmap_single(eth->dma_dev, ((u64)trxd.rxd1 | addr64),
|
dma_unmap_single(eth->dma_dev, ((u64)trxd.rxd1 | addr64),
|
||||||
ring->buf_size, DMA_FROM_DEVICE);
|
ring->buf_size, DMA_FROM_DEVICE);
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,33 @@
|
|||||||
|
From 379ae584cea112db60f4ada79c7e5ba4f3364a64 Mon Sep 17 00:00:00 2001
|
||||||
|
X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
|
||||||
|
X-Patchwork-Id: 13718593
|
||||||
|
X-Patchwork-Delegate: kuba@kernel.org
|
||||||
|
List-Id: <netdev.vger.kernel.org>
|
||||||
|
From: Daniel Golle <daniel@makrotopia.org>
|
||||||
|
Date: Mon, 1 Jul 2024 19:26:28 +0100
|
||||||
|
Subject: [PATCH] net: ethernet: mediatek: Allow gaps in MAC allocation
|
||||||
|
|
||||||
|
Some devices with MediaTek SoCs don't use the first but only the second
|
||||||
|
MAC in the chip. Especially with MT7981 which got a built-in 1GE PHY
|
||||||
|
connected to the second MAC this is quite common.
|
||||||
|
Make sure to reset and enable PSE also in those cases by skipping gaps
|
||||||
|
using 'continue' instead of aborting the loop using 'break'.
|
||||||
|
|
||||||
|
Fixes: dee4dd10c79a ("net: ethernet: mtk_eth_soc: ppe: add support for multiple PPEs")
|
||||||
|
Suggested-by: Elad Yifee <eladwf@gmail.com>
|
||||||
|
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||||
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||||
|
@@ -3431,7 +3431,7 @@ static int mtk_open(struct net_device *d
|
||||||
|
|
||||||
|
for (i = 0; i < MTK_MAX_DEVS; i++) {
|
||||||
|
if (!eth->netdev[i])
|
||||||
|
- break;
|
||||||
|
+ continue;
|
||||||
|
|
||||||
|
target_mac = netdev_priv(eth->netdev[i]);
|
||||||
|
if (!soc->offload_version) {
|
||||||
@ -214,7 +214,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
#include <linux/jhash.h>
|
#include <linux/jhash.h>
|
||||||
#include <linux/bitfield.h>
|
#include <linux/bitfield.h>
|
||||||
#include <net/dsa.h>
|
#include <net/dsa.h>
|
||||||
@@ -261,12 +263,8 @@ static const char * const mtk_clks_sourc
|
@@ -270,12 +272,8 @@ static const char * const mtk_clks_sourc
|
||||||
"ethwarp_wocpu2",
|
"ethwarp_wocpu2",
|
||||||
"ethwarp_wocpu1",
|
"ethwarp_wocpu1",
|
||||||
"ethwarp_wocpu0",
|
"ethwarp_wocpu0",
|
||||||
@ -227,7 +227,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
"top_eth_gmii_sel",
|
"top_eth_gmii_sel",
|
||||||
"top_eth_refck_50m_sel",
|
"top_eth_refck_50m_sel",
|
||||||
"top_eth_sys_200m_sel",
|
"top_eth_sys_200m_sel",
|
||||||
@@ -509,6 +507,30 @@ static void mtk_setup_bridge_switch(stru
|
@@ -518,6 +516,30 @@ static void mtk_setup_bridge_switch(stru
|
||||||
MTK_GSW_CFG);
|
MTK_GSW_CFG);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,7 +258,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
static struct phylink_pcs *mtk_mac_select_pcs(struct phylink_config *config,
|
static struct phylink_pcs *mtk_mac_select_pcs(struct phylink_config *config,
|
||||||
phy_interface_t interface)
|
phy_interface_t interface)
|
||||||
{
|
{
|
||||||
@@ -517,6 +539,21 @@ static struct phylink_pcs *mtk_mac_selec
|
@@ -526,6 +548,21 @@ static struct phylink_pcs *mtk_mac_selec
|
||||||
struct mtk_eth *eth = mac->hw;
|
struct mtk_eth *eth = mac->hw;
|
||||||
unsigned int sid;
|
unsigned int sid;
|
||||||
|
|
||||||
@ -280,7 +280,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
if (interface == PHY_INTERFACE_MODE_SGMII ||
|
if (interface == PHY_INTERFACE_MODE_SGMII ||
|
||||||
phy_interface_mode_is_8023z(interface)) {
|
phy_interface_mode_is_8023z(interface)) {
|
||||||
sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ?
|
sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ?
|
||||||
@@ -568,7 +605,22 @@ static void mtk_mac_config(struct phylin
|
@@ -577,7 +614,22 @@ static void mtk_mac_config(struct phylin
|
||||||
goto init_err;
|
goto init_err;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -303,7 +303,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
goto err_phy;
|
goto err_phy;
|
||||||
@@ -615,8 +667,6 @@ static void mtk_mac_config(struct phylin
|
@@ -624,8 +676,6 @@ static void mtk_mac_config(struct phylin
|
||||||
val &= ~SYSCFG0_GE_MODE(SYSCFG0_GE_MASK, mac->id);
|
val &= ~SYSCFG0_GE_MODE(SYSCFG0_GE_MASK, mac->id);
|
||||||
val |= SYSCFG0_GE_MODE(ge_mode, mac->id);
|
val |= SYSCFG0_GE_MODE(ge_mode, mac->id);
|
||||||
regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val);
|
regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val);
|
||||||
@ -312,7 +312,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* SGMII */
|
/* SGMII */
|
||||||
@@ -633,21 +683,40 @@ static void mtk_mac_config(struct phylin
|
@@ -642,21 +692,40 @@ static void mtk_mac_config(struct phylin
|
||||||
|
|
||||||
/* Save the syscfg0 value for mac_finish */
|
/* Save the syscfg0 value for mac_finish */
|
||||||
mac->syscfg0 = val;
|
mac->syscfg0 = val;
|
||||||
@ -360,7 +360,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
err_phy:
|
err_phy:
|
||||||
@@ -660,6 +729,18 @@ init_err:
|
@@ -669,6 +738,18 @@ init_err:
|
||||||
mac->id, phy_modes(state->interface), err);
|
mac->id, phy_modes(state->interface), err);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -379,7 +379,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
static int mtk_mac_finish(struct phylink_config *config, unsigned int mode,
|
static int mtk_mac_finish(struct phylink_config *config, unsigned int mode,
|
||||||
phy_interface_t interface)
|
phy_interface_t interface)
|
||||||
{
|
{
|
||||||
@@ -668,6 +749,10 @@ static int mtk_mac_finish(struct phylink
|
@@ -677,6 +758,10 @@ static int mtk_mac_finish(struct phylink
|
||||||
struct mtk_eth *eth = mac->hw;
|
struct mtk_eth *eth = mac->hw;
|
||||||
u32 mcr_cur, mcr_new;
|
u32 mcr_cur, mcr_new;
|
||||||
|
|
||||||
@ -390,7 +390,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
/* Enable SGMII */
|
/* Enable SGMII */
|
||||||
if (interface == PHY_INTERFACE_MODE_SGMII ||
|
if (interface == PHY_INTERFACE_MODE_SGMII ||
|
||||||
phy_interface_mode_is_8023z(interface))
|
phy_interface_mode_is_8023z(interface))
|
||||||
@@ -692,10 +777,14 @@ static void mtk_mac_link_down(struct phy
|
@@ -701,10 +786,14 @@ static void mtk_mac_link_down(struct phy
|
||||||
{
|
{
|
||||||
struct mtk_mac *mac = container_of(config, struct mtk_mac,
|
struct mtk_mac *mac = container_of(config, struct mtk_mac,
|
||||||
phylink_config);
|
phylink_config);
|
||||||
@ -408,7 +408,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void mtk_set_queue_speed(struct mtk_eth *eth, unsigned int idx,
|
static void mtk_set_queue_speed(struct mtk_eth *eth, unsigned int idx,
|
||||||
@@ -767,13 +856,11 @@ static void mtk_set_queue_speed(struct m
|
@@ -776,13 +865,11 @@ static void mtk_set_queue_speed(struct m
|
||||||
mtk_w32(eth, val, soc->reg_map->qdma.qtx_sch + ofs);
|
mtk_w32(eth, val, soc->reg_map->qdma.qtx_sch + ofs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,7 +426,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
u32 mcr;
|
u32 mcr;
|
||||||
|
|
||||||
mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id));
|
mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id));
|
||||||
@@ -807,9 +894,63 @@ static void mtk_mac_link_up(struct phyli
|
@@ -816,9 +903,63 @@ static void mtk_mac_link_up(struct phyli
|
||||||
mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
|
mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -490,9 +490,9 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
.mac_finish = mtk_mac_finish,
|
.mac_finish = mtk_mac_finish,
|
||||||
.mac_link_down = mtk_mac_link_down,
|
.mac_link_down = mtk_mac_link_down,
|
||||||
.mac_link_up = mtk_mac_link_up,
|
.mac_link_up = mtk_mac_link_up,
|
||||||
@@ -3403,6 +3544,9 @@ static int mtk_open(struct net_device *d
|
@@ -3407,6 +3548,9 @@ static int mtk_open(struct net_device *d
|
||||||
struct mtk_eth *eth = mac->hw;
|
|
||||||
int i, err;
|
ppe_num = eth->soc->ppe_num;
|
||||||
|
|
||||||
+ if (mac->pextp)
|
+ if (mac->pextp)
|
||||||
+ phy_power_on(mac->pextp);
|
+ phy_power_on(mac->pextp);
|
||||||
@ -500,7 +500,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0);
|
err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0);
|
||||||
if (err) {
|
if (err) {
|
||||||
netdev_err(dev, "%s: could not attach PHY: %d\n", __func__,
|
netdev_err(dev, "%s: could not attach PHY: %d\n", __func__,
|
||||||
@@ -3532,6 +3676,9 @@ static int mtk_stop(struct net_device *d
|
@@ -3557,6 +3701,9 @@ static int mtk_stop(struct net_device *d
|
||||||
for (i = 0; i < ARRAY_SIZE(eth->ppe); i++)
|
for (i = 0; i < ARRAY_SIZE(eth->ppe); i++)
|
||||||
mtk_ppe_stop(eth->ppe[i]);
|
mtk_ppe_stop(eth->ppe[i]);
|
||||||
|
|
||||||
@ -510,7 +510,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4529,6 +4676,7 @@ static const struct net_device_ops mtk_n
|
@@ -4554,6 +4701,7 @@ static const struct net_device_ops mtk_n
|
||||||
static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
|
static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
|
||||||
{
|
{
|
||||||
const __be32 *_id = of_get_property(np, "reg", NULL);
|
const __be32 *_id = of_get_property(np, "reg", NULL);
|
||||||
@ -518,7 +518,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
phy_interface_t phy_mode;
|
phy_interface_t phy_mode;
|
||||||
struct phylink *phylink;
|
struct phylink *phylink;
|
||||||
struct mtk_mac *mac;
|
struct mtk_mac *mac;
|
||||||
@@ -4565,16 +4713,41 @@ static int mtk_add_mac(struct mtk_eth *e
|
@@ -4590,16 +4738,41 @@ static int mtk_add_mac(struct mtk_eth *e
|
||||||
mac->id = id;
|
mac->id = id;
|
||||||
mac->hw = eth;
|
mac->hw = eth;
|
||||||
mac->of_node = np;
|
mac->of_node = np;
|
||||||
@ -568,7 +568,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
}
|
}
|
||||||
|
|
||||||
memset(mac->hwlro_ip, 0, sizeof(mac->hwlro_ip));
|
memset(mac->hwlro_ip, 0, sizeof(mac->hwlro_ip));
|
||||||
@@ -4657,8 +4830,21 @@ static int mtk_add_mac(struct mtk_eth *e
|
@@ -4682,8 +4855,21 @@ static int mtk_add_mac(struct mtk_eth *e
|
||||||
phy_interface_zero(mac->phylink_config.supported_interfaces);
|
phy_interface_zero(mac->phylink_config.supported_interfaces);
|
||||||
__set_bit(PHY_INTERFACE_MODE_INTERNAL,
|
__set_bit(PHY_INTERFACE_MODE_INTERNAL,
|
||||||
mac->phylink_config.supported_interfaces);
|
mac->phylink_config.supported_interfaces);
|
||||||
@ -590,7 +590,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
phylink = phylink_create(&mac->phylink_config,
|
phylink = phylink_create(&mac->phylink_config,
|
||||||
of_fwnode_handle(mac->of_node),
|
of_fwnode_handle(mac->of_node),
|
||||||
phy_mode, &mtk_phylink_ops);
|
phy_mode, &mtk_phylink_ops);
|
||||||
@@ -4709,6 +4895,26 @@ free_netdev:
|
@@ -4734,6 +4920,26 @@ free_netdev:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -617,7 +617,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev)
|
void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev)
|
||||||
{
|
{
|
||||||
struct net_device *dev, *tmp;
|
struct net_device *dev, *tmp;
|
||||||
@@ -4855,7 +5061,8 @@ static int mtk_probe(struct platform_dev
|
@@ -4880,7 +5086,8 @@ static int mtk_probe(struct platform_dev
|
||||||
regmap_write(cci, 0, 3);
|
regmap_write(cci, 0, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -627,7 +627,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
err = mtk_sgmii_init(eth);
|
err = mtk_sgmii_init(eth);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
@@ -4966,6 +5173,24 @@ static int mtk_probe(struct platform_dev
|
@@ -4991,6 +5198,24 @@ static int mtk_probe(struct platform_dev
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -652,7 +652,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT)) {
|
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT)) {
|
||||||
err = devm_request_irq(eth->dev, eth->irq[0],
|
err = devm_request_irq(eth->dev, eth->irq[0],
|
||||||
mtk_handle_irq, 0,
|
mtk_handle_irq, 0,
|
||||||
@@ -5068,6 +5293,11 @@ static int mtk_remove(struct platform_de
|
@@ -5094,6 +5319,11 @@ static int mtk_remove(struct platform_de
|
||||||
mtk_stop(eth->netdev[i]);
|
mtk_stop(eth->netdev[i]);
|
||||||
mac = netdev_priv(eth->netdev[i]);
|
mac = netdev_priv(eth->netdev[i]);
|
||||||
phylink_disconnect_phy(mac->phylink);
|
phylink_disconnect_phy(mac->phylink);
|
||||||
@ -893,7 +893,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
|
|
||||||
struct mtk_tx_dma_desc_info {
|
struct mtk_tx_dma_desc_info {
|
||||||
dma_addr_t addr;
|
dma_addr_t addr;
|
||||||
@@ -1322,6 +1379,9 @@ struct mtk_mac {
|
@@ -1324,6 +1381,9 @@ struct mtk_mac {
|
||||||
struct device_node *of_node;
|
struct device_node *of_node;
|
||||||
struct phylink *phylink;
|
struct phylink *phylink;
|
||||||
struct phylink_config phylink_config;
|
struct phylink_config phylink_config;
|
||||||
@ -903,7 +903,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
struct mtk_eth *hw;
|
struct mtk_eth *hw;
|
||||||
struct mtk_hw_stats *hw_stats;
|
struct mtk_hw_stats *hw_stats;
|
||||||
__be32 hwlro_ip[MTK_MAX_LRO_IP_CNT];
|
__be32 hwlro_ip[MTK_MAX_LRO_IP_CNT];
|
||||||
@@ -1445,6 +1505,19 @@ static inline u32 mtk_get_ib2_multicast_
|
@@ -1447,6 +1507,19 @@ static inline u32 mtk_get_ib2_multicast_
|
||||||
return MTK_FOE_IB2_MULTICAST;
|
return MTK_FOE_IB2_MULTICAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -923,7 +923,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
/* read the hardware status register */
|
/* read the hardware status register */
|
||||||
void mtk_stats_update_mac(struct mtk_mac *mac);
|
void mtk_stats_update_mac(struct mtk_mac *mac);
|
||||||
|
|
||||||
@@ -1453,8 +1526,10 @@ u32 mtk_r32(struct mtk_eth *eth, unsigne
|
@@ -1455,8 +1528,10 @@ u32 mtk_r32(struct mtk_eth *eth, unsigne
|
||||||
u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned int reg);
|
u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned int reg);
|
||||||
|
|
||||||
int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id);
|
int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id);
|
||||||
@ -932,5 +932,5 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|||||||
int mtk_gmac_rgmii_path_setup(struct mtk_eth *eth, int mac_id);
|
int mtk_gmac_rgmii_path_setup(struct mtk_eth *eth, int mac_id);
|
||||||
+int mtk_gmac_usxgmii_path_setup(struct mtk_eth *eth, int mac_id);
|
+int mtk_gmac_usxgmii_path_setup(struct mtk_eth *eth, int mac_id);
|
||||||
|
|
||||||
int mtk_eth_offload_init(struct mtk_eth *eth);
|
int mtk_eth_offload_init(struct mtk_eth *eth, u8 id);
|
||||||
int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
int mtk_eth_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||||
|
|||||||
@ -16,7 +16,6 @@
|
|||||||
led-failsafe = &led_status;
|
led-failsafe = &led_status;
|
||||||
led-running = &led_status;
|
led-running = &led_status;
|
||||||
led-upgrade = &led_upgrade;
|
led-upgrade = &led_upgrade;
|
||||||
ethernet1 = &swport5;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
@ -266,6 +265,14 @@
|
|||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
||||||
|
macaddr_lan: macaddr@0 {
|
||||||
|
reg = <0x0 0x6>;
|
||||||
|
};
|
||||||
|
|
||||||
|
macaddr_wan: macaddr@6 {
|
||||||
|
reg = <0x6 0x6>;
|
||||||
|
};
|
||||||
|
|
||||||
precal_art_1000: precal@1000 {
|
precal_art_1000: precal@1000 {
|
||||||
reg = <0x1000 0x2f20>;
|
reg = <0x1000 0x2f20>;
|
||||||
};
|
};
|
||||||
@ -330,6 +337,9 @@
|
|||||||
|
|
||||||
&gmac {
|
&gmac {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
|
nvmem-cell-names = "mac-address";
|
||||||
|
nvmem-cells = <&macaddr_wan>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&switch {
|
&switch {
|
||||||
@ -338,22 +348,37 @@
|
|||||||
|
|
||||||
&swport1 {
|
&swport1 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
|
nvmem-cell-names = "mac-address";
|
||||||
|
nvmem-cells = <&macaddr_lan>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&swport2 {
|
&swport2 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
|
nvmem-cell-names = "mac-address";
|
||||||
|
nvmem-cells = <&macaddr_lan>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&swport3 {
|
&swport3 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
|
nvmem-cell-names = "mac-address";
|
||||||
|
nvmem-cells = <&macaddr_lan>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&swport4 {
|
&swport4 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
|
nvmem-cell-names = "mac-address";
|
||||||
|
nvmem-cells = <&macaddr_lan>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&swport5 {
|
&swport5 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
|
nvmem-cell-names = "mac-address";
|
||||||
|
nvmem-cells = <&macaddr_wan>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&wifi0 {
|
&wifi0 {
|
||||||
|
|||||||
@ -88,7 +88,7 @@ Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
|
|||||||
+ipq_ess-objs := ipqess.o ipqess_ethtool.o
|
+ipq_ess-objs := ipqess.o ipqess_ethtool.o
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/drivers/net/ethernet/qualcomm/ipqess/ipqess.c
|
+++ b/drivers/net/ethernet/qualcomm/ipqess/ipqess.c
|
||||||
@@ -0,0 +1,1246 @@
|
@@ -0,0 +1,1251 @@
|
||||||
+// SPDX-License-Identifier: GPL-2.0 OR ISC
|
+// SPDX-License-Identifier: GPL-2.0 OR ISC
|
||||||
+/* Copyright (c) 2014 - 2017, The Linux Foundation. All rights reserved.
|
+/* Copyright (c) 2014 - 2017, The Linux Foundation. All rights reserved.
|
||||||
+ * Copyright (c) 2017 - 2018, John Crispin <john@phrozen.org>
|
+ * Copyright (c) 2017 - 2018, John Crispin <john@phrozen.org>
|
||||||
@ -655,15 +655,10 @@ Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
|
|||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+static int __init ipqess_init(struct net_device *netdev)
|
+static int ipqess_init(struct net_device *netdev)
|
||||||
+{
|
+{
|
||||||
+ struct ipqess *ess = netdev_priv(netdev);
|
+ struct ipqess *ess = netdev_priv(netdev);
|
||||||
+ struct device_node *of_node = ess->pdev->dev.of_node;
|
+ struct device_node *of_node = ess->pdev->dev.of_node;
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ ret = of_get_ethdev_address(of_node, netdev);
|
|
||||||
+ if (ret)
|
|
||||||
+ eth_hw_addr_random(netdev);
|
|
||||||
+
|
+
|
||||||
+ return phylink_of_phy_connect(ess->phylink, of_node, 0);
|
+ return phylink_of_phy_connect(ess->phylink, of_node, 0);
|
||||||
+}
|
+}
|
||||||
@ -1201,6 +1196,16 @@ Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
|
|||||||
+ SET_NETDEV_DEV(netdev, &pdev->dev);
|
+ SET_NETDEV_DEV(netdev, &pdev->dev);
|
||||||
+ platform_set_drvdata(pdev, netdev);
|
+ platform_set_drvdata(pdev, netdev);
|
||||||
+
|
+
|
||||||
|
+ err = of_get_ethdev_address(np, netdev);
|
||||||
|
+ if (err) {
|
||||||
|
+ dev_dbg(&pdev->dev, "failed to get MAC address from DT: %d\n", err);
|
||||||
|
+ if (err == -EPROBE_DEFER)
|
||||||
|
+ return err;
|
||||||
|
+ eth_hw_addr_random(netdev);
|
||||||
|
+ dev_info(&pdev->dev, "using random MAC address %pM\n",
|
||||||
|
+ netdev->dev_addr);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ ess->hw_addr = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
|
+ ess->hw_addr = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
|
||||||
+ if (IS_ERR(ess->hw_addr))
|
+ if (IS_ERR(ess->hw_addr))
|
||||||
+ return PTR_ERR(ess->hw_addr);
|
+ return PTR_ERR(ess->hw_addr);
|
||||||
|
|||||||
@ -72,7 +72,7 @@ Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
|||||||
napi_gro_receive(&rx_ring->napi_rx, skb);
|
napi_gro_receive(&rx_ring->napi_rx, skb);
|
||||||
|
|
||||||
rx_ring->ess->stats.rx_packets++;
|
rx_ring->ess->stats.rx_packets++;
|
||||||
@@ -706,6 +715,26 @@ static void ipqess_rollback_tx(struct ip
|
@@ -701,6 +710,26 @@ static void ipqess_rollback_tx(struct ip
|
||||||
tx_ring->head = start_index;
|
tx_ring->head = start_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
|||||||
static int ipqess_tx_map_and_fill(struct ipqess_tx_ring *tx_ring,
|
static int ipqess_tx_map_and_fill(struct ipqess_tx_ring *tx_ring,
|
||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
@@ -716,6 +745,8 @@ static int ipqess_tx_map_and_fill(struct
|
@@ -711,6 +740,8 @@ static int ipqess_tx_map_and_fill(struct
|
||||||
u16 len;
|
u16 len;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
|||||||
if (skb_is_gso(skb)) {
|
if (skb_is_gso(skb)) {
|
||||||
if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) {
|
if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) {
|
||||||
lso_word1 |= IPQESS_TPD_IPV4_EN;
|
lso_word1 |= IPQESS_TPD_IPV4_EN;
|
||||||
@@ -917,6 +948,33 @@ static const struct net_device_ops ipqes
|
@@ -912,6 +943,33 @@ static const struct net_device_ops ipqes
|
||||||
.ndo_tx_timeout = ipqess_tx_timeout,
|
.ndo_tx_timeout = ipqess_tx_timeout,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
|
|||||||
static void ipqess_hw_stop(struct ipqess *ess)
|
static void ipqess_hw_stop(struct ipqess *ess)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -1184,12 +1242,19 @@ static int ipqess_axi_probe(struct platf
|
@@ -1189,12 +1247,19 @@ static int ipqess_axi_probe(struct platf
|
||||||
netif_napi_add(netdev, &ess->rx_ring[i].napi_rx, ipqess_rx_napi);
|
netif_napi_add(netdev, &ess->rx_ring[i].napi_rx, ipqess_rx_napi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -50,7 +50,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/qualcomm/ipqess/ipqess.c
|
--- a/drivers/net/ethernet/qualcomm/ipqess/ipqess.c
|
||||||
+++ b/drivers/net/ethernet/qualcomm/ipqess/ipqess.c
|
+++ b/drivers/net/ethernet/qualcomm/ipqess/ipqess.c
|
||||||
@@ -636,9 +636,22 @@ static int ipqess_stop(struct net_device
|
@@ -631,9 +631,22 @@ static int ipqess_stop(struct net_device
|
||||||
netif_tx_stop_all_queues(netdev);
|
netif_tx_stop_all_queues(netdev);
|
||||||
phylink_stop(ess->phylink);
|
phylink_stop(ess->phylink);
|
||||||
ipqess_irq_disable(ess);
|
ipqess_irq_disable(ess);
|
||||||
|
|||||||
@ -38,7 +38,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
|||||||
}
|
}
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
@@ -1264,6 +1264,8 @@ static int ipqess_axi_probe(struct platf
|
@@ -1269,6 +1269,8 @@ static int ipqess_axi_probe(struct platf
|
||||||
if (err)
|
if (err)
|
||||||
goto err_notifier_unregister;
|
goto err_notifier_unregister;
|
||||||
|
|
||||||
|
|||||||
@ -49,6 +49,7 @@ CONFIG_ARM_QCOM_SPM_CPUIDLE=y
|
|||||||
CONFIG_ARM_THUMB=y
|
CONFIG_ARM_THUMB=y
|
||||||
CONFIG_ARM_UNWIND=y
|
CONFIG_ARM_UNWIND=y
|
||||||
CONFIG_ARM_VIRT_EXT=y
|
CONFIG_ARM_VIRT_EXT=y
|
||||||
|
CONFIG_AT803X_PHY=y
|
||||||
CONFIG_AUTO_ZRELADDR=y
|
CONFIG_AUTO_ZRELADDR=y
|
||||||
CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y
|
CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
|
|||||||
@ -18,7 +18,6 @@
|
|||||||
aliases {
|
aliases {
|
||||||
serial0 = &gsbi7_serial;
|
serial0 = &gsbi7_serial;
|
||||||
serial1 = &gsbi2_serial;
|
serial1 = &gsbi2_serial;
|
||||||
mdio-gpio0 = &mdio0;
|
|
||||||
ethernet0 = &gmac0;
|
ethernet0 = &gmac0;
|
||||||
ethernet1 = &gmac2;
|
ethernet1 = &gmac2;
|
||||||
|
|
||||||
@ -140,6 +139,21 @@
|
|||||||
bias-pull-up;
|
bias-pull-up;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
rgmii0_pins: rgmii0_pins {
|
||||||
|
mux {
|
||||||
|
pins = "gpio2", "gpio66";
|
||||||
|
drive-strength = <8>;
|
||||||
|
bias-disable;
|
||||||
|
};
|
||||||
|
|
||||||
|
tx {
|
||||||
|
pins = "gpio53", "gpio64";
|
||||||
|
drive-strength = <2>;
|
||||||
|
bias-pull-down;
|
||||||
|
input-enable;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
&gsbi2 {
|
&gsbi2 {
|
||||||
@ -299,26 +313,15 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
&soc {
|
&mdio0 {
|
||||||
mdio1: mdio {
|
status = "okay";
|
||||||
compatible = "virtual,mdio-gpio";
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
status = "okay";
|
phy1: ethernet-phy@1 {
|
||||||
|
reg = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
pinctrl-0 = <&mdio0_pins>;
|
phy2: ethernet-phy@2 {
|
||||||
pinctrl-names = "default";
|
reg = <2>;
|
||||||
|
|
||||||
gpios = <&qcom_pinmux 1 GPIO_ACTIVE_HIGH &qcom_pinmux 0 GPIO_ACTIVE_HIGH>;
|
|
||||||
|
|
||||||
phy1: ethernet-phy@1 {
|
|
||||||
reg = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
phy2: ethernet-phy@2 {
|
|
||||||
reg = <2>;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -326,25 +329,23 @@
|
|||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
qcom,id = <0>;
|
qcom,id = <0>;
|
||||||
mdiobus = <&mdio1>;
|
mdiobus = <&mdio0>;
|
||||||
|
|
||||||
phy-mode = "rgmii";
|
pinctrl-0 = <&rgmii0_pins>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
|
||||||
|
phy-mode = "rgmii-id";
|
||||||
phy-handle = <&phy1>;
|
phy-handle = <&phy1>;
|
||||||
|
|
||||||
nvmem-cells = <ðaddr 0>;
|
nvmem-cells = <ðaddr 0>;
|
||||||
nvmem-cell-names = "mac-address";
|
nvmem-cell-names = "mac-address";
|
||||||
|
|
||||||
fixed-link {
|
|
||||||
speed = <1000>;
|
|
||||||
full-duplex;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
&gmac2 {
|
&gmac2 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
qcom,id = <2>;
|
qcom,id = <2>;
|
||||||
mdiobus = <&mdio1>;
|
mdiobus = <&mdio0>;
|
||||||
|
|
||||||
phy-mode = "sgmii";
|
phy-mode = "sgmii";
|
||||||
phy-handle = <&phy2>;
|
phy-handle = <&phy2>;
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
ARCH:=mips64
|
ARCH:=mips64
|
||||||
CPU_TYPE:=mips64r2
|
CPU_TYPE:=mips64r2
|
||||||
SUBTARGET:=be64
|
SUBTARGET:=be64
|
||||||
FEATURES+=source-only
|
|
||||||
BOARDNAME:=Big Endian (64-bits)
|
BOARDNAME:=Big Endian (64-bits)
|
||||||
|
|
||||||
define Target/Description
|
define Target/Description
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
ARCH:=mipsel
|
ARCH:=mipsel
|
||||||
CPU_TYPE:=24kc
|
CPU_TYPE:=24kc
|
||||||
SUBTARGET:=le
|
SUBTARGET:=le
|
||||||
FEATURES+=source-only
|
|
||||||
BOARDNAME:=Little Endian
|
BOARDNAME:=Little Endian
|
||||||
|
|
||||||
define Target/Description
|
define Target/Description
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
ARCH:=mips64el
|
ARCH:=mips64el
|
||||||
CPU_TYPE:=mips64r2
|
CPU_TYPE:=mips64r2
|
||||||
SUBTARGET:=le64
|
SUBTARGET:=le64
|
||||||
FEATURES+=source-only
|
|
||||||
BOARDNAME:=Little Endian (64-bits)
|
BOARDNAME:=Little Endian (64-bits)
|
||||||
|
|
||||||
define Target/Description
|
define Target/Description
|
||||||
|
|||||||
@ -12,7 +12,7 @@ CPU_TYPE:=24kc
|
|||||||
CPU_SUBTYPE:=24kf
|
CPU_SUBTYPE:=24kf
|
||||||
SUBTARGETS:=generic
|
SUBTARGETS:=generic
|
||||||
|
|
||||||
KERNEL_PATCHVER:=6.1
|
KERNEL_PATCHVER:=6.6
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/target.mk
|
include $(INCLUDE_DIR)/target.mk
|
||||||
|
|
||||||
|
|||||||
363
target/linux/pistachio/config-6.6
Normal file
363
target/linux/pistachio/config-6.6
Normal file
@ -0,0 +1,363 @@
|
|||||||
|
CONFIG_ARCH_32BIT_OFF_T=y
|
||||||
|
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||||
|
CONFIG_ARCH_KEEP_MEMBLOCK=y
|
||||||
|
CONFIG_ARCH_MMAP_RND_BITS_MAX=15
|
||||||
|
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=15
|
||||||
|
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||||
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
|
CONFIG_BLK_DEV_SD=y
|
||||||
|
# CONFIG_BOARD_INGENIC is not set
|
||||||
|
CONFIG_BOARD_SCACHE=y
|
||||||
|
CONFIG_BUFFER_HEAD=y
|
||||||
|
CONFIG_BUILTIN_DTB=y
|
||||||
|
CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
|
||||||
|
CONFIG_CC_NO_ARRAY_BOUNDS=y
|
||||||
|
CONFIG_CEVT_R4K=y
|
||||||
|
CONFIG_CLKSRC_MIPS_GIC=y
|
||||||
|
CONFIG_CLKSRC_PISTACHIO=y
|
||||||
|
CONFIG_CLOCKSOURCE_WATCHDOG=y
|
||||||
|
CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100
|
||||||
|
CONFIG_CLONE_BACKWARDS=y
|
||||||
|
CONFIG_COMMON_CLK=y
|
||||||
|
CONFIG_COMMON_CLK_PISTACHIO=y
|
||||||
|
CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1
|
||||||
|
CONFIG_COMPAT_32BIT_TIME=y
|
||||||
|
CONFIG_CONNECTOR=y
|
||||||
|
CONFIG_CONTEXT_TRACKING=y
|
||||||
|
CONFIG_CONTEXT_TRACKING_IDLE=y
|
||||||
|
CONFIG_CPU_GENERIC_DUMP_TLB=y
|
||||||
|
CONFIG_CPU_HAS_DIEI=y
|
||||||
|
CONFIG_CPU_HAS_PREFETCH=y
|
||||||
|
CONFIG_CPU_HAS_RIXI=y
|
||||||
|
# CONFIG_CPU_HAS_SMARTMIPS is not set
|
||||||
|
CONFIG_CPU_HAS_SYNC=y
|
||||||
|
CONFIG_CPU_IDLE=y
|
||||||
|
CONFIG_CPU_IDLE_GOV_LADDER=y
|
||||||
|
CONFIG_CPU_IDLE_GOV_MENU=y
|
||||||
|
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||||
|
# CONFIG_CPU_MICROMIPS is not set
|
||||||
|
CONFIG_CPU_MIPS32=y
|
||||||
|
# CONFIG_CPU_MIPS32_R1 is not set
|
||||||
|
CONFIG_CPU_MIPS32_R2=y
|
||||||
|
# CONFIG_CPU_MIPS32_R5 is not set
|
||||||
|
# CONFIG_CPU_MIPS32_R5_FEATURES is not set
|
||||||
|
# CONFIG_CPU_MIPS32_R6 is not set
|
||||||
|
# CONFIG_CPU_MIPS64_R1 is not set
|
||||||
|
# CONFIG_CPU_MIPS64_R2 is not set
|
||||||
|
# CONFIG_CPU_MIPS64_R5 is not set
|
||||||
|
# CONFIG_CPU_MIPS64_R6 is not set
|
||||||
|
CONFIG_CPU_MIPSR2=y
|
||||||
|
CONFIG_CPU_MIPSR2_IRQ_EI=y
|
||||||
|
CONFIG_CPU_MIPSR2_IRQ_VI=y
|
||||||
|
CONFIG_CPU_MITIGATIONS=y
|
||||||
|
CONFIG_CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS=y
|
||||||
|
CONFIG_CPU_PM=y
|
||||||
|
CONFIG_CPU_R4K_CACHE_TLB=y
|
||||||
|
CONFIG_CPU_RMAP=y
|
||||||
|
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
|
||||||
|
CONFIG_CPU_SUPPORTS_HIGHMEM=y
|
||||||
|
CONFIG_CPU_SUPPORTS_MSA=y
|
||||||
|
CONFIG_CRC16=y
|
||||||
|
CONFIG_CRC_CCITT=y
|
||||||
|
CONFIG_CRYPTO_CBC=y
|
||||||
|
CONFIG_CRYPTO_CRC32C=y
|
||||||
|
CONFIG_CRYPTO_DEFLATE=y
|
||||||
|
CONFIG_CRYPTO_HASH_INFO=y
|
||||||
|
CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y
|
||||||
|
CONFIG_CRYPTO_LIB_GF128MUL=y
|
||||||
|
CONFIG_CRYPTO_LIB_POLY1305_RSIZE=2
|
||||||
|
CONFIG_CRYPTO_LIB_SHA1=y
|
||||||
|
CONFIG_CRYPTO_LIB_SHA256=y
|
||||||
|
CONFIG_CRYPTO_LIB_UTILS=y
|
||||||
|
CONFIG_CRYPTO_LZO=y
|
||||||
|
CONFIG_CRYPTO_MD5=y
|
||||||
|
CONFIG_CRYPTO_RNG=y
|
||||||
|
CONFIG_CRYPTO_RNG2=y
|
||||||
|
CONFIG_CRYPTO_SHA1=y
|
||||||
|
CONFIG_CRYPTO_SHA256=y
|
||||||
|
CONFIG_CRYPTO_ZSTD=y
|
||||||
|
CONFIG_CSRC_R4K=y
|
||||||
|
CONFIG_DEBUG_INFO=y
|
||||||
|
CONFIG_DMADEVICES=y
|
||||||
|
CONFIG_DMA_ENGINE=y
|
||||||
|
CONFIG_DMA_NONCOHERENT=y
|
||||||
|
CONFIG_DMA_OF=y
|
||||||
|
CONFIG_DMA_VIRTUAL_CHANNELS=y
|
||||||
|
CONFIG_DTC=y
|
||||||
|
CONFIG_DWMAC_GENERIC=y
|
||||||
|
CONFIG_EXCLUSIVE_SYSTEM_RAM=y
|
||||||
|
CONFIG_EXT4_FS=y
|
||||||
|
# CONFIG_FIT_IMAGE_FDT_BOSTON is not set
|
||||||
|
# CONFIG_FIT_IMAGE_FDT_JAGUAR2 is not set
|
||||||
|
# CONFIG_FIT_IMAGE_FDT_LUTON is not set
|
||||||
|
CONFIG_FIT_IMAGE_FDT_MARDUK=y
|
||||||
|
# CONFIG_FIT_IMAGE_FDT_NI169445 is not set
|
||||||
|
# CONFIG_FIT_IMAGE_FDT_OCELOT is not set
|
||||||
|
# CONFIG_FIT_IMAGE_FDT_SERVAL is not set
|
||||||
|
# CONFIG_FIT_IMAGE_FDT_XILFPGA is not set
|
||||||
|
CONFIG_FIXED_PHY=y
|
||||||
|
CONFIG_FS_IOMAP=y
|
||||||
|
CONFIG_FS_MBCACHE=y
|
||||||
|
CONFIG_FS_POSIX_ACL=y
|
||||||
|
CONFIG_FUNCTION_ALIGNMENT=0
|
||||||
|
CONFIG_FWNODE_MDIO=y
|
||||||
|
CONFIG_FW_LOADER_PAGED_BUF=y
|
||||||
|
CONFIG_FW_LOADER_SYSFS=y
|
||||||
|
CONFIG_GCC10_NO_ARRAY_BOUNDS=y
|
||||||
|
CONFIG_GENERIC_ALLOCATOR=y
|
||||||
|
CONFIG_GENERIC_ATOMIC64=y
|
||||||
|
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||||
|
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||||
|
CONFIG_GENERIC_CPU_AUTOPROBE=y
|
||||||
|
CONFIG_GENERIC_GETTIMEOFDAY=y
|
||||||
|
CONFIG_GENERIC_IDLE_POLL_SETUP=y
|
||||||
|
CONFIG_GENERIC_IOMAP=y
|
||||||
|
CONFIG_GENERIC_IRQ_CHIP=y
|
||||||
|
CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y
|
||||||
|
CONFIG_GENERIC_IRQ_MIGRATION=y
|
||||||
|
CONFIG_GENERIC_IRQ_SHOW=y
|
||||||
|
CONFIG_GENERIC_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_PHY=y
|
||||||
|
CONFIG_GENERIC_PINCONF=y
|
||||||
|
CONFIG_GENERIC_PINCTRL_GROUPS=y
|
||||||
|
CONFIG_GENERIC_PINMUX_FUNCTIONS=y
|
||||||
|
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||||
|
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||||
|
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||||
|
CONFIG_GPIOLIB_IRQCHIP=y
|
||||||
|
CONFIG_GPIO_CDEV=y
|
||||||
|
CONFIG_HARDWARE_WATCHPOINTS=y
|
||||||
|
CONFIG_HAS_DMA=y
|
||||||
|
CONFIG_HAS_IOMEM=y
|
||||||
|
CONFIG_HAS_IOPORT=y
|
||||||
|
CONFIG_HAS_IOPORT_MAP=y
|
||||||
|
CONFIG_HOTPLUG_CORE_SYNC=y
|
||||||
|
CONFIG_HOTPLUG_CORE_SYNC_DEAD=y
|
||||||
|
CONFIG_HOTPLUG_CPU=y
|
||||||
|
CONFIG_HZ_PERIODIC=y
|
||||||
|
CONFIG_I2C=y
|
||||||
|
CONFIG_I2C_BOARDINFO=y
|
||||||
|
CONFIG_I2C_IMG=y
|
||||||
|
CONFIG_IMGPDC_WDT=y
|
||||||
|
CONFIG_IMG_MDC_DMA=y
|
||||||
|
CONFIG_INITRAMFS_SOURCE=""
|
||||||
|
CONFIG_IRQCHIP=y
|
||||||
|
CONFIG_IRQ_DOMAIN=y
|
||||||
|
CONFIG_IRQ_DOMAIN_HIERARCHY=y
|
||||||
|
CONFIG_IRQ_FORCED_THREADING=y
|
||||||
|
CONFIG_IRQ_MIPS_CPU=y
|
||||||
|
CONFIG_IRQ_WORK=y
|
||||||
|
CONFIG_JBD2=y
|
||||||
|
CONFIG_LEDS_GPIO=y
|
||||||
|
CONFIG_LEDS_PWM=y
|
||||||
|
# CONFIG_LEGACY_BOARD_OCELOT is not set
|
||||||
|
# CONFIG_LEGACY_BOARD_SEAD3 is not set
|
||||||
|
CONFIG_LIBFDT=y
|
||||||
|
CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
||||||
|
CONFIG_LOG_BUF_SHIFT=18
|
||||||
|
CONFIG_LZO_COMPRESS=y
|
||||||
|
CONFIG_LZO_DECOMPRESS=y
|
||||||
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
|
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0
|
||||||
|
CONFIG_MDIO_BUS=y
|
||||||
|
CONFIG_MDIO_DEVICE=y
|
||||||
|
CONFIG_MDIO_DEVRES=y
|
||||||
|
CONFIG_MFD_SYSCON=y
|
||||||
|
CONFIG_MICREL_PHY=y
|
||||||
|
CONFIG_MIGRATION=y
|
||||||
|
CONFIG_MIPS=y
|
||||||
|
CONFIG_MIPS_ASID_BITS=8
|
||||||
|
CONFIG_MIPS_ASID_SHIFT=0
|
||||||
|
CONFIG_MIPS_AUTO_PFN_OFFSET=y
|
||||||
|
CONFIG_MIPS_CLOCK_VSYSCALL=y
|
||||||
|
CONFIG_MIPS_CM=y
|
||||||
|
CONFIG_MIPS_CMDLINE_DTB_EXTEND=y
|
||||||
|
# CONFIG_MIPS_CMDLINE_FROM_BOOTLOADER is not set
|
||||||
|
CONFIG_MIPS_CPC=y
|
||||||
|
CONFIG_MIPS_CPS=y
|
||||||
|
# CONFIG_MIPS_CPS_CPUIDLE is not set
|
||||||
|
# CONFIG_MIPS_CPS_NS16550_BOOL is not set
|
||||||
|
CONFIG_MIPS_CPS_PM=y
|
||||||
|
CONFIG_MIPS_CPU_SCACHE=y
|
||||||
|
CONFIG_MIPS_GENERIC=y
|
||||||
|
CONFIG_MIPS_GENERIC_KERNEL=y
|
||||||
|
CONFIG_MIPS_GIC=y
|
||||||
|
CONFIG_MIPS_L1_CACHE_SHIFT=7
|
||||||
|
CONFIG_MIPS_L1_CACHE_SHIFT_7=y
|
||||||
|
CONFIG_MIPS_MT=y
|
||||||
|
CONFIG_MIPS_MT_FPAFF=y
|
||||||
|
CONFIG_MIPS_MT_SMP=y
|
||||||
|
CONFIG_MIPS_NO_APPENDED_DTB=y
|
||||||
|
CONFIG_MIPS_NR_CPU_NR_MAP=4
|
||||||
|
CONFIG_MIPS_PERF_SHARED_TC_COUNTERS=y
|
||||||
|
CONFIG_MIPS_SPRAM=y
|
||||||
|
CONFIG_MMC=y
|
||||||
|
CONFIG_MMC_BLOCK=y
|
||||||
|
CONFIG_MMC_DW=y
|
||||||
|
# CONFIG_MMC_DW_BLUEFIELD is not set
|
||||||
|
# CONFIG_MMC_DW_EXYNOS is not set
|
||||||
|
# CONFIG_MMC_DW_HI3798CV200 is not set
|
||||||
|
# CONFIG_MMC_DW_K3 is not set
|
||||||
|
CONFIG_MMC_DW_PLTFM=y
|
||||||
|
CONFIG_MMU_LAZY_TLB_REFCOUNT=y
|
||||||
|
CONFIG_MODULES_USE_ELF_REL=y
|
||||||
|
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||||
|
CONFIG_MTD_CMDLINE_PARTS=y
|
||||||
|
CONFIG_MTD_NAND_CORE=y
|
||||||
|
CONFIG_MTD_NAND_ECC=y
|
||||||
|
CONFIG_MTD_SPI_NAND=y
|
||||||
|
CONFIG_MTD_SPI_NOR=y
|
||||||
|
CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
|
||||||
|
CONFIG_MTD_UBI=y
|
||||||
|
CONFIG_MTD_UBI_BEB_LIMIT=20
|
||||||
|
CONFIG_MTD_UBI_BLOCK=y
|
||||||
|
CONFIG_MTD_UBI_FASTMAP=y
|
||||||
|
CONFIG_MTD_UBI_WL_THRESHOLD=4096
|
||||||
|
CONFIG_NEED_DMA_MAP_STATE=y
|
||||||
|
CONFIG_NEED_SRCU_NMI_SAFE=y
|
||||||
|
CONFIG_NET_EGRESS=y
|
||||||
|
CONFIG_NET_FLOW_LIMIT=y
|
||||||
|
CONFIG_NET_INGRESS=y
|
||||||
|
CONFIG_NET_PTP_CLASSIFY=y
|
||||||
|
CONFIG_NET_SELFTESTS=y
|
||||||
|
CONFIG_NET_XGRESS=y
|
||||||
|
CONFIG_NLS=y
|
||||||
|
CONFIG_NO_EXCEPT_FILL=y
|
||||||
|
CONFIG_NR_CPUS=4
|
||||||
|
CONFIG_OF=y
|
||||||
|
CONFIG_OF_ADDRESS=y
|
||||||
|
CONFIG_OF_EARLY_FLATTREE=y
|
||||||
|
CONFIG_OF_FLATTREE=y
|
||||||
|
CONFIG_OF_GPIO=y
|
||||||
|
CONFIG_OF_IRQ=y
|
||||||
|
CONFIG_OF_KOBJ=y
|
||||||
|
CONFIG_OF_MDIO=y
|
||||||
|
CONFIG_PADATA=y
|
||||||
|
CONFIG_PAGE_POOL=y
|
||||||
|
CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
|
||||||
|
CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
|
||||||
|
CONFIG_PCI_DRIVERS_GENERIC=y
|
||||||
|
CONFIG_PCS_XPCS=y
|
||||||
|
CONFIG_PERF_USE_VMALLOC=y
|
||||||
|
CONFIG_PGTABLE_LEVELS=2
|
||||||
|
CONFIG_PHYLIB=y
|
||||||
|
CONFIG_PHYLIB_LEDS=y
|
||||||
|
CONFIG_PHYLINK=y
|
||||||
|
CONFIG_PHY_PISTACHIO_USB=y
|
||||||
|
CONFIG_PINCTRL=y
|
||||||
|
CONFIG_PINCTRL_PISTACHIO=y
|
||||||
|
CONFIG_POWER_SUPPLY=y
|
||||||
|
CONFIG_PPS=y
|
||||||
|
CONFIG_PREEMPT_NONE_BUILD=y
|
||||||
|
CONFIG_PRINTK_TIME=y
|
||||||
|
CONFIG_PROC_EVENTS=y
|
||||||
|
CONFIG_PTP_1588_CLOCK=y
|
||||||
|
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||||
|
CONFIG_PWM=y
|
||||||
|
CONFIG_PWM_IMG=y
|
||||||
|
CONFIG_PWM_SYSFS=y
|
||||||
|
CONFIG_QUEUED_RWLOCKS=y
|
||||||
|
CONFIG_QUEUED_SPINLOCKS=y
|
||||||
|
CONFIG_RANDSTRUCT_NONE=y
|
||||||
|
CONFIG_RATIONAL=y
|
||||||
|
CONFIG_REGMAP=y
|
||||||
|
CONFIG_REGMAP_MMIO=y
|
||||||
|
CONFIG_REGMAP_SPI=y
|
||||||
|
CONFIG_REGULATOR=y
|
||||||
|
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||||
|
CONFIG_REGULATOR_GPIO=y
|
||||||
|
CONFIG_RESET_CONTROLLER=y
|
||||||
|
CONFIG_RESET_PISTACHIO=y
|
||||||
|
CONFIG_RFS_ACCEL=y
|
||||||
|
CONFIG_RPS=y
|
||||||
|
CONFIG_SCHEDSTATS=y
|
||||||
|
CONFIG_SCHED_INFO=y
|
||||||
|
CONFIG_SCSI=y
|
||||||
|
CONFIG_SCSI_COMMON=y
|
||||||
|
CONFIG_SCSI_SPI_ATTRS=y
|
||||||
|
CONFIG_SERIAL_8250_DW=y
|
||||||
|
CONFIG_SERIAL_8250_DWLIB=y
|
||||||
|
CONFIG_SERIAL_MCTRL_GPIO=y
|
||||||
|
CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
|
CONFIG_SERIAL_SC16IS7XX=y
|
||||||
|
CONFIG_SERIAL_SC16IS7XX_CORE=y
|
||||||
|
# CONFIG_SERIAL_SC16IS7XX_I2C is not set
|
||||||
|
CONFIG_SERIAL_SC16IS7XX_SPI=y
|
||||||
|
CONFIG_SGL_ALLOC=y
|
||||||
|
CONFIG_SG_POOL=y
|
||||||
|
CONFIG_SMP=y
|
||||||
|
CONFIG_SMP_UP=y
|
||||||
|
CONFIG_SOCK_RX_QUEUE_MAPPING=y
|
||||||
|
CONFIG_SPI=y
|
||||||
|
CONFIG_SPI_IMG_SPFI=y
|
||||||
|
CONFIG_SPI_MASTER=y
|
||||||
|
CONFIG_SPI_MEM=y
|
||||||
|
CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
|
||||||
|
CONFIG_SRAM=y
|
||||||
|
CONFIG_STMMAC_ETH=y
|
||||||
|
CONFIG_STMMAC_PLATFORM=y
|
||||||
|
CONFIG_SWAP_IO_SPACE=y
|
||||||
|
CONFIG_SWPHY=y
|
||||||
|
CONFIG_SYNC_R4K=y
|
||||||
|
CONFIG_SYSCTL_EXCEPTION_TRACE=y
|
||||||
|
CONFIG_SYS_HAS_CPU_MIPS32_R1=y
|
||||||
|
CONFIG_SYS_HAS_CPU_MIPS32_R2=y
|
||||||
|
CONFIG_SYS_HAS_CPU_MIPS32_R5=y
|
||||||
|
CONFIG_SYS_HAS_CPU_MIPS32_R6=y
|
||||||
|
CONFIG_SYS_HAS_CPU_MIPS64_R1=y
|
||||||
|
CONFIG_SYS_HAS_CPU_MIPS64_R2=y
|
||||||
|
CONFIG_SYS_HAS_CPU_MIPS64_R5=y
|
||||||
|
CONFIG_SYS_HAS_CPU_MIPS64_R6=y
|
||||||
|
CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
|
||||||
|
CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
|
||||||
|
CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
|
||||||
|
CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
|
||||||
|
CONFIG_SYS_SUPPORTS_HIGHMEM=y
|
||||||
|
CONFIG_SYS_SUPPORTS_HOTPLUG_CPU=y
|
||||||
|
CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
|
||||||
|
CONFIG_SYS_SUPPORTS_MICROMIPS=y
|
||||||
|
CONFIG_SYS_SUPPORTS_MIPS16=y
|
||||||
|
CONFIG_SYS_SUPPORTS_MIPS_CPS=y
|
||||||
|
CONFIG_SYS_SUPPORTS_MULTITHREADING=y
|
||||||
|
CONFIG_SYS_SUPPORTS_RELOCATABLE=y
|
||||||
|
CONFIG_SYS_SUPPORTS_SCHED_SMT=y
|
||||||
|
CONFIG_SYS_SUPPORTS_SMARTMIPS=y
|
||||||
|
CONFIG_SYS_SUPPORTS_SMP=y
|
||||||
|
CONFIG_SYS_SUPPORTS_ZBOOT=y
|
||||||
|
CONFIG_TARGET_ISA_REV=2
|
||||||
|
CONFIG_TICK_CPU_ACCOUNTING=y
|
||||||
|
CONFIG_TIMER_OF=y
|
||||||
|
CONFIG_TIMER_PROBE=y
|
||||||
|
CONFIG_TMPFS_POSIX_ACL=y
|
||||||
|
CONFIG_TREE_RCU=y
|
||||||
|
CONFIG_TREE_SRCU=y
|
||||||
|
CONFIG_UBIFS_FS=y
|
||||||
|
CONFIG_UHI_BOOT=y
|
||||||
|
CONFIG_USB=y
|
||||||
|
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||||
|
CONFIG_USB_COMMON=y
|
||||||
|
CONFIG_USB_DWC2=y
|
||||||
|
CONFIG_USB_DWC2_DUAL_ROLE=y
|
||||||
|
CONFIG_USB_EHCI_HCD=y
|
||||||
|
# CONFIG_USB_EHCI_HCD_PLATFORM is not set
|
||||||
|
CONFIG_USB_GADGET=y
|
||||||
|
CONFIG_USB_ROLE_SWITCH=y
|
||||||
|
CONFIG_USB_STORAGE=y
|
||||||
|
CONFIG_USB_SUPPORT=y
|
||||||
|
CONFIG_USE_OF=y
|
||||||
|
# CONFIG_VIRT_BOARD_RANCHU is not set
|
||||||
|
CONFIG_WATCHDOG_CORE=y
|
||||||
|
CONFIG_WEAK_ORDERING=y
|
||||||
|
CONFIG_XPS=y
|
||||||
|
CONFIG_XXHASH=y
|
||||||
|
CONFIG_ZBOOT_LOAD_ADDRESS=0x0
|
||||||
|
CONFIG_ZLIB_DEFLATE=y
|
||||||
|
CONFIG_ZLIB_INFLATE=y
|
||||||
|
CONFIG_ZSTD_COMMON=y
|
||||||
|
CONFIG_ZSTD_COMPRESS=y
|
||||||
|
CONFIG_ZSTD_DECOMPRESS=y
|
||||||
@ -0,0 +1,68 @@
|
|||||||
|
From a2dd154377c9aa6ddda00d39b8c7c334e4fa16ff Mon Sep 17 00:00:00 2001
|
||||||
|
From: Damien Horsley <damien.horsley@imgtec.com>
|
||||||
|
Date: Tue, 22 Mar 2016 12:46:09 +0000
|
||||||
|
Subject: dmaengine: img-mdc: Handle early status read
|
||||||
|
|
||||||
|
It is possible that mdc_tx_status may be called before the first
|
||||||
|
node has been read from memory.
|
||||||
|
|
||||||
|
In this case, the residue value stored in the register is undefined.
|
||||||
|
Return the transfer size instead.
|
||||||
|
|
||||||
|
Signed-off-by: Damien Horsley <damien.horsley@imgtec.com>
|
||||||
|
---
|
||||||
|
drivers/dma/img-mdc-dma.c | 40 ++++++++++++++++++++++++----------------
|
||||||
|
1 file changed, 24 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/dma/img-mdc-dma.c
|
||||||
|
+++ b/drivers/dma/img-mdc-dma.c
|
||||||
|
@@ -617,25 +617,33 @@ static enum dma_status mdc_tx_status(str
|
||||||
|
(MDC_CMDS_PROCESSED_CMDS_DONE_MASK + 1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * If the command loaded event hasn't been processed yet, then
|
||||||
|
- * the difference above includes an extra command.
|
||||||
|
+ * If the first node has not yet been read from memory,
|
||||||
|
+ * the residue register value is undefined
|
||||||
|
*/
|
||||||
|
- if (!mdesc->cmd_loaded)
|
||||||
|
- cmds--;
|
||||||
|
- else
|
||||||
|
- cmds += mdesc->list_cmds_done;
|
||||||
|
-
|
||||||
|
- bytes = mdesc->list_xfer_size;
|
||||||
|
- ldesc = mdesc->list;
|
||||||
|
- for (i = 0; i < cmds; i++) {
|
||||||
|
- bytes -= ldesc->xfer_size + 1;
|
||||||
|
- ldesc = ldesc->next_desc;
|
||||||
|
- }
|
||||||
|
- if (ldesc) {
|
||||||
|
- if (residue != MDC_TRANSFER_SIZE_MASK)
|
||||||
|
- bytes -= ldesc->xfer_size - residue;
|
||||||
|
+ if (!mdesc->cmd_loaded && !cmds) {
|
||||||
|
+ bytes = mdesc->list_xfer_size;
|
||||||
|
+ } else {
|
||||||
|
+ /*
|
||||||
|
+ * If the command loaded event hasn't been processed yet, then
|
||||||
|
+ * the difference above includes an extra command.
|
||||||
|
+ */
|
||||||
|
+ if (!mdesc->cmd_loaded)
|
||||||
|
+ cmds--;
|
||||||
|
else
|
||||||
|
+ cmds += mdesc->list_cmds_done;
|
||||||
|
+
|
||||||
|
+ bytes = mdesc->list_xfer_size;
|
||||||
|
+ ldesc = mdesc->list;
|
||||||
|
+ for (i = 0; i < cmds; i++) {
|
||||||
|
bytes -= ldesc->xfer_size + 1;
|
||||||
|
+ ldesc = ldesc->next_desc;
|
||||||
|
+ }
|
||||||
|
+ if (ldesc) {
|
||||||
|
+ if (residue != MDC_TRANSFER_SIZE_MASK)
|
||||||
|
+ bytes -= ldesc->xfer_size - residue;
|
||||||
|
+ else
|
||||||
|
+ bytes -= ldesc->xfer_size + 1;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spin_unlock_irqrestore(&mchan->vc.lock, flags);
|
||||||
@ -0,0 +1,198 @@
|
|||||||
|
From cd2a6af51553d38072cd31699b58d16ca6176ef5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ionela Voinescu <ionela.voinescu@imgtec.com>
|
||||||
|
Date: Thu, 2 Feb 2017 16:46:14 +0000
|
||||||
|
Subject: spi: img-spfi: Implement dual and quad mode
|
||||||
|
|
||||||
|
For dual and quad modes to work the SPFI controller needs
|
||||||
|
to have information about command/address/dummy bytes in the
|
||||||
|
transaction register. This information is not relevant for
|
||||||
|
single mode, and therefore it can have any value in the
|
||||||
|
allowed range. Therefore, for any read or write transfers of less
|
||||||
|
than 8 bytes (cmd = 1 byte, addr up to 7 bytes), SPFI will be
|
||||||
|
configured, but not enabled (unless it is the last transfer in
|
||||||
|
the queue). The transfer will be enabled by the subsequent tranfer.
|
||||||
|
A pending transfer is determined by the content of the transaction
|
||||||
|
register: if command part is set and tsize is not.
|
||||||
|
|
||||||
|
This way we ensure that for dual and quad transactions
|
||||||
|
the command request size will apear in the command/address part
|
||||||
|
of the transaction register, while the data size will be in
|
||||||
|
tsize, all data being sent/received in the same transaction (as
|
||||||
|
set up in the transaction register).
|
||||||
|
|
||||||
|
Signed-off-by: Ionela Voinescu <ionela.voinescu@imgtec.com>
|
||||||
|
Signed-off-by: Ezequiel Garcia <ezequiel.garcia@imgtec.com>
|
||||||
|
---
|
||||||
|
drivers/spi/spi-img-spfi.c | 96 ++++++++++++++++++++++++++++++++++++++++------
|
||||||
|
1 file changed, 85 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/spi/spi-img-spfi.c
|
||||||
|
+++ b/drivers/spi/spi-img-spfi.c
|
||||||
|
@@ -36,7 +36,8 @@
|
||||||
|
#define SPFI_CONTROL_SOFT_RESET BIT(11)
|
||||||
|
#define SPFI_CONTROL_SEND_DMA BIT(10)
|
||||||
|
#define SPFI_CONTROL_GET_DMA BIT(9)
|
||||||
|
-#define SPFI_CONTROL_SE BIT(8)
|
||||||
|
+#define SPFI_CONTROL_SE BIT(8)
|
||||||
|
+#define SPFI_CONTROL_TX_RX BIT(1)
|
||||||
|
#define SPFI_CONTROL_TMODE_SHIFT 5
|
||||||
|
#define SPFI_CONTROL_TMODE_MASK 0x7
|
||||||
|
#define SPFI_CONTROL_TMODE_SINGLE 0
|
||||||
|
@@ -47,6 +48,10 @@
|
||||||
|
#define SPFI_TRANSACTION 0x18
|
||||||
|
#define SPFI_TRANSACTION_TSIZE_SHIFT 16
|
||||||
|
#define SPFI_TRANSACTION_TSIZE_MASK 0xffff
|
||||||
|
+#define SPFI_TRANSACTION_CMD_SHIFT 13
|
||||||
|
+#define SPFI_TRANSACTION_CMD_MASK 0x7
|
||||||
|
+#define SPFI_TRANSACTION_ADDR_SHIFT 10
|
||||||
|
+#define SPFI_TRANSACTION_ADDR_MASK 0x7
|
||||||
|
|
||||||
|
#define SPFI_PORT_STATE 0x1c
|
||||||
|
#define SPFI_PORT_STATE_DEV_SEL_SHIFT 20
|
||||||
|
@@ -83,6 +88,7 @@
|
||||||
|
*/
|
||||||
|
#define SPFI_32BIT_FIFO_SIZE 64
|
||||||
|
#define SPFI_8BIT_FIFO_SIZE 16
|
||||||
|
+#define SPFI_DATA_REQUEST_MAX_SIZE 8
|
||||||
|
|
||||||
|
struct img_spfi {
|
||||||
|
struct device *dev;
|
||||||
|
@@ -99,6 +105,8 @@ struct img_spfi {
|
||||||
|
struct dma_chan *tx_ch;
|
||||||
|
bool tx_dma_busy;
|
||||||
|
bool rx_dma_busy;
|
||||||
|
+
|
||||||
|
+ bool complete;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline u32 spfi_readl(struct img_spfi *spfi, u32 reg)
|
||||||
|
@@ -115,9 +123,11 @@ static inline void spfi_start(struct img
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
- val = spfi_readl(spfi, SPFI_CONTROL);
|
||||||
|
- val |= SPFI_CONTROL_SPFI_EN;
|
||||||
|
- spfi_writel(spfi, val, SPFI_CONTROL);
|
||||||
|
+ if (spfi->complete) {
|
||||||
|
+ val = spfi_readl(spfi, SPFI_CONTROL);
|
||||||
|
+ val |= SPFI_CONTROL_SPFI_EN;
|
||||||
|
+ spfi_writel(spfi, val, SPFI_CONTROL);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void spfi_reset(struct img_spfi *spfi)
|
||||||
|
@@ -130,12 +140,21 @@ static int spfi_wait_all_done(struct img
|
||||||
|
{
|
||||||
|
unsigned long timeout = jiffies + msecs_to_jiffies(50);
|
||||||
|
|
||||||
|
+ if (!(spfi->complete))
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
while (time_before(jiffies, timeout)) {
|
||||||
|
u32 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS);
|
||||||
|
|
||||||
|
if (status & SPFI_INTERRUPT_ALLDONETRIG) {
|
||||||
|
spfi_writel(spfi, SPFI_INTERRUPT_ALLDONETRIG,
|
||||||
|
SPFI_INTERRUPT_CLEAR);
|
||||||
|
+ /*
|
||||||
|
+ * Disable SPFI for it not to interfere with
|
||||||
|
+ * pending transactions
|
||||||
|
+ */
|
||||||
|
+ spfi_writel(spfi, spfi_readl(spfi, SPFI_CONTROL)
|
||||||
|
+ & ~SPFI_CONTROL_SPFI_EN, SPFI_CONTROL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
cpu_relax();
|
||||||
|
@@ -441,9 +460,32 @@ static void img_spfi_config(struct spi_c
|
||||||
|
struct spi_transfer *xfer)
|
||||||
|
{
|
||||||
|
struct img_spfi *spfi = spi_controller_get_devdata(spi->controller);
|
||||||
|
- u32 val, div;
|
||||||
|
+ u32 val, div, transact;
|
||||||
|
+ bool is_pending;
|
||||||
|
|
||||||
|
/*
|
||||||
|
+ * For read or write transfers of less than 8 bytes (cmd = 1 byte,
|
||||||
|
+ * addr up to 7 bytes), SPFI will be configured, but not enabled
|
||||||
|
+ * (unless it is the last transfer in the queue).The transfer will
|
||||||
|
+ * be enabled by the subsequent transfer.
|
||||||
|
+ * A pending transfer is determined by the content of the
|
||||||
|
+ * transaction register: if command part is set and tsize
|
||||||
|
+ * is not
|
||||||
|
+ */
|
||||||
|
+ transact = spfi_readl(spfi, SPFI_TRANSACTION);
|
||||||
|
+ is_pending = ((transact >> SPFI_TRANSACTION_CMD_SHIFT) &
|
||||||
|
+ SPFI_TRANSACTION_CMD_MASK) &&
|
||||||
|
+ (!((transact >> SPFI_TRANSACTION_TSIZE_SHIFT) &
|
||||||
|
+ SPFI_TRANSACTION_TSIZE_MASK));
|
||||||
|
+
|
||||||
|
+ /* If there are no pending transactions it's OK to soft reset */
|
||||||
|
+ if (!is_pending) {
|
||||||
|
+ /* Start the transaction from a known (reset) state */
|
||||||
|
+ spfi_reset(spfi);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Before anything else, set up parameters.
|
||||||
|
* output = spfi_clk * (BITCLK / 512), where BITCLK must be a
|
||||||
|
* power of 2 up to 128
|
||||||
|
*/
|
||||||
|
@@ -456,20 +498,52 @@ static void img_spfi_config(struct spi_c
|
||||||
|
val |= div << SPFI_DEVICE_PARAMETER_BITCLK_SHIFT;
|
||||||
|
spfi_writel(spfi, val, SPFI_DEVICE_PARAMETER(spi_get_chipselect(spi, 0)));
|
||||||
|
|
||||||
|
- spfi_writel(spfi, xfer->len << SPFI_TRANSACTION_TSIZE_SHIFT,
|
||||||
|
- SPFI_TRANSACTION);
|
||||||
|
+ if (!list_is_last(&xfer->transfer_list, &host->cur_msg->transfers) &&
|
||||||
|
+ /*
|
||||||
|
+ * For duplex mode (both the tx and rx buffers are !NULL) the
|
||||||
|
+ * CMD, ADDR, and DUMMY byte parts of the transaction register
|
||||||
|
+ * should always be 0 and therefore the pending transfer
|
||||||
|
+ * technique cannot be used.
|
||||||
|
+ */
|
||||||
|
+ (xfer->tx_buf) && (!xfer->rx_buf) &&
|
||||||
|
+ (xfer->len <= SPFI_DATA_REQUEST_MAX_SIZE) && !is_pending) {
|
||||||
|
+ transact = (1 & SPFI_TRANSACTION_CMD_MASK) <<
|
||||||
|
+ SPFI_TRANSACTION_CMD_SHIFT;
|
||||||
|
+ transact |= ((xfer->len - 1) & SPFI_TRANSACTION_ADDR_MASK) <<
|
||||||
|
+ SPFI_TRANSACTION_ADDR_SHIFT;
|
||||||
|
+ spfi->complete = false;
|
||||||
|
+ } else {
|
||||||
|
+ spfi->complete = true;
|
||||||
|
+ if (is_pending) {
|
||||||
|
+ /* Keep setup from pending transfer */
|
||||||
|
+ transact |= ((xfer->len & SPFI_TRANSACTION_TSIZE_MASK) <<
|
||||||
|
+ SPFI_TRANSACTION_TSIZE_SHIFT);
|
||||||
|
+ } else {
|
||||||
|
+ transact = ((xfer->len & SPFI_TRANSACTION_TSIZE_MASK) <<
|
||||||
|
+ SPFI_TRANSACTION_TSIZE_SHIFT);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ spfi_writel(spfi, transact, SPFI_TRANSACTION);
|
||||||
|
|
||||||
|
val = spfi_readl(spfi, SPFI_CONTROL);
|
||||||
|
val &= ~(SPFI_CONTROL_SEND_DMA | SPFI_CONTROL_GET_DMA);
|
||||||
|
- if (xfer->tx_buf)
|
||||||
|
+ /*
|
||||||
|
+ * We set up send DMA for pending transfers also, as
|
||||||
|
+ * those are always send transfers
|
||||||
|
+ */
|
||||||
|
+ if ((xfer->tx_buf) || is_pending)
|
||||||
|
val |= SPFI_CONTROL_SEND_DMA;
|
||||||
|
- if (xfer->rx_buf)
|
||||||
|
+ if (xfer->tx_buf)
|
||||||
|
+ val |= SPFI_CONTROL_TX_RX;
|
||||||
|
+ if (xfer->rx_buf) {
|
||||||
|
val |= SPFI_CONTROL_GET_DMA;
|
||||||
|
+ val &= ~SPFI_CONTROL_TX_RX;
|
||||||
|
+ }
|
||||||
|
val &= ~(SPFI_CONTROL_TMODE_MASK << SPFI_CONTROL_TMODE_SHIFT);
|
||||||
|
- if (xfer->tx_nbits == SPI_NBITS_DUAL &&
|
||||||
|
+ if (xfer->tx_nbits == SPI_NBITS_DUAL ||
|
||||||
|
xfer->rx_nbits == SPI_NBITS_DUAL)
|
||||||
|
val |= SPFI_CONTROL_TMODE_DUAL << SPFI_CONTROL_TMODE_SHIFT;
|
||||||
|
- else if (xfer->tx_nbits == SPI_NBITS_QUAD &&
|
||||||
|
+ else if (xfer->tx_nbits == SPI_NBITS_QUAD ||
|
||||||
|
xfer->rx_nbits == SPI_NBITS_QUAD)
|
||||||
|
val |= SPFI_CONTROL_TMODE_QUAD << SPFI_CONTROL_TMODE_SHIFT;
|
||||||
|
val |= SPFI_CONTROL_SE;
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
From 905ee06a9966113fe51d6bad1819759cb30fd0bd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ionela Voinescu <ionela.voinescu@imgtec.com>
|
||||||
|
Date: Tue, 9 Feb 2016 10:18:31 +0000
|
||||||
|
Subject: spi: img-spfi: use device 0 configuration for all devices
|
||||||
|
|
||||||
|
Given that we control the chip select line externally
|
||||||
|
we can use only one parameter register (device 0 parameter
|
||||||
|
register) and one set of configuration bits (port configuration
|
||||||
|
bits for device 0) for all devices (all chip select lines).
|
||||||
|
|
||||||
|
Signed-off-by: Ionela Voinescu <ionela.voinescu@imgtec.com>
|
||||||
|
---
|
||||||
|
drivers/spi/spi-img-spfi.c | 23 ++++++++++++++++-------
|
||||||
|
1 file changed, 16 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/spi/spi-img-spfi.c
|
||||||
|
+++ b/drivers/spi/spi-img-spfi.c
|
||||||
|
@@ -429,18 +429,23 @@ static int img_spfi_prepare(struct spi_c
|
||||||
|
struct img_spfi *spfi = spi_controller_get_devdata(host);
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * The chip select line is controlled externally so
|
||||||
|
+ * we can use the CS0 configuration for all devices
|
||||||
|
+ */
|
||||||
|
val = spfi_readl(spfi, SPFI_PORT_STATE);
|
||||||
|
+
|
||||||
|
+ /* 0 for device selection */
|
||||||
|
val &= ~(SPFI_PORT_STATE_DEV_SEL_MASK <<
|
||||||
|
SPFI_PORT_STATE_DEV_SEL_SHIFT);
|
||||||
|
- val |= spi_get_chipselect(msg->spi, 0) << SPFI_PORT_STATE_DEV_SEL_SHIFT;
|
||||||
|
if (msg->spi->mode & SPI_CPHA)
|
||||||
|
- val |= SPFI_PORT_STATE_CK_PHASE(spi_get_chipselect(msg->spi, 0));
|
||||||
|
+ val |= SPFI_PORT_STATE_CK_PHASE(0);
|
||||||
|
else
|
||||||
|
- val &= ~SPFI_PORT_STATE_CK_PHASE(spi_get_chipselect(msg->spi, 0));
|
||||||
|
+ val &= ~SPFI_PORT_STATE_CK_PHASE(0);
|
||||||
|
if (msg->spi->mode & SPI_CPOL)
|
||||||
|
- val |= SPFI_PORT_STATE_CK_POL(spi_get_chipselect(msg->spi, 0));
|
||||||
|
+ val |= SPFI_PORT_STATE_CK_POL(0);
|
||||||
|
else
|
||||||
|
- val &= ~SPFI_PORT_STATE_CK_POL(spi_get_chipselect(msg->spi, 0));
|
||||||
|
+ val &= ~SPFI_PORT_STATE_CK_POL(0);
|
||||||
|
spfi_writel(spfi, val, SPFI_PORT_STATE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -492,11 +497,15 @@ static void img_spfi_config(struct spi_c
|
||||||
|
div = DIV_ROUND_UP(clk_get_rate(spfi->spfi_clk), xfer->speed_hz);
|
||||||
|
div = clamp(512 / (1 << get_count_order(div)), 1, 128);
|
||||||
|
|
||||||
|
- val = spfi_readl(spfi, SPFI_DEVICE_PARAMETER(spi_get_chipselect(spi, 0)));
|
||||||
|
+ /*
|
||||||
|
+ * The chip select line is controlled externally so
|
||||||
|
+ * we can use the CS0 parameters for all devices
|
||||||
|
+ */
|
||||||
|
+ val = spfi_readl(spfi, SPFI_DEVICE_PARAMETER(0));
|
||||||
|
val &= ~(SPFI_DEVICE_PARAMETER_BITCLK_MASK <<
|
||||||
|
SPFI_DEVICE_PARAMETER_BITCLK_SHIFT);
|
||||||
|
val |= div << SPFI_DEVICE_PARAMETER_BITCLK_SHIFT;
|
||||||
|
- spfi_writel(spfi, val, SPFI_DEVICE_PARAMETER(spi_get_chipselect(spi, 0)));
|
||||||
|
+ spfi_writel(spfi, val, SPFI_DEVICE_PARAMETER(0));
|
||||||
|
|
||||||
|
if (!list_is_last(&xfer->transfer_list, &host->cur_msg->transfers) &&
|
||||||
|
/*
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
From 56466f505f58f44b69feb7eaed3b506842800456 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ionela Voinescu <ionela.voinescu@imgtec.com>
|
||||||
|
Date: Tue, 1 Mar 2016 17:49:45 +0000
|
||||||
|
Subject: spi: img-spfi: RX maximum burst size for DMA is 8
|
||||||
|
|
||||||
|
The depth of the FIFOs is 16 bytes. The DMA request line is tied
|
||||||
|
to the half full/empty (depending on the use of the TX or RX FIFO)
|
||||||
|
threshold. For the TX FIFO, if you set a burst size of 8 (equal to
|
||||||
|
half the depth) the first burst goes into FIFO without any issues,
|
||||||
|
but due the latency involved (the time the data leaves the DMA
|
||||||
|
engine to the time it arrives at the FIFO), the DMA might trigger
|
||||||
|
another burst of 8. But given that there is no space for 2 additonal
|
||||||
|
bursts of 8, this would result in a failure. Therefore, we have to
|
||||||
|
keep the burst size for TX to 4 to accomodate for an extra burst.
|
||||||
|
|
||||||
|
For the read (RX) scenario, the DMA request line goes high when
|
||||||
|
there is at least 8 entries in the FIFO (half full), and we can
|
||||||
|
program the burst size to be 8 because the risk of accidental burst
|
||||||
|
does not exist. The DMA engine will not trigger another read until
|
||||||
|
the read data for all the burst it has sent out has been received.
|
||||||
|
|
||||||
|
While here, move the burst size setting outside of the if/else branches
|
||||||
|
as they have the same value for both 8 and 32 bit data widths.
|
||||||
|
|
||||||
|
Signed-off-by: Ionela Voinescu <ionela.voinescu@imgtec.com>
|
||||||
|
---
|
||||||
|
drivers/spi/spi-img-spfi.c | 6 ++----
|
||||||
|
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/spi/spi-img-spfi.c
|
||||||
|
+++ b/drivers/spi/spi-img-spfi.c
|
||||||
|
@@ -338,12 +338,11 @@ static int img_spfi_start_dma(struct spi
|
||||||
|
if (xfer->len % 4 == 0) {
|
||||||
|
rxconf.src_addr = spfi->phys + SPFI_RX_32BIT_VALID_DATA;
|
||||||
|
rxconf.src_addr_width = 4;
|
||||||
|
- rxconf.src_maxburst = 4;
|
||||||
|
} else {
|
||||||
|
rxconf.src_addr = spfi->phys + SPFI_RX_8BIT_VALID_DATA;
|
||||||
|
rxconf.src_addr_width = 1;
|
||||||
|
- rxconf.src_maxburst = 4;
|
||||||
|
}
|
||||||
|
+ rxconf.src_maxburst = 8;
|
||||||
|
dmaengine_slave_config(spfi->rx_ch, &rxconf);
|
||||||
|
|
||||||
|
rxdesc = dmaengine_prep_slave_sg(spfi->rx_ch, xfer->rx_sg.sgl,
|
||||||
|
@@ -362,12 +361,11 @@ static int img_spfi_start_dma(struct spi
|
||||||
|
if (xfer->len % 4 == 0) {
|
||||||
|
txconf.dst_addr = spfi->phys + SPFI_TX_32BIT_VALID_DATA;
|
||||||
|
txconf.dst_addr_width = 4;
|
||||||
|
- txconf.dst_maxburst = 4;
|
||||||
|
} else {
|
||||||
|
txconf.dst_addr = spfi->phys + SPFI_TX_8BIT_VALID_DATA;
|
||||||
|
txconf.dst_addr_width = 1;
|
||||||
|
- txconf.dst_maxburst = 4;
|
||||||
|
}
|
||||||
|
+ txconf.dst_maxburst = 4;
|
||||||
|
dmaengine_slave_config(spfi->tx_ch, &txconf);
|
||||||
|
|
||||||
|
txdesc = dmaengine_prep_slave_sg(spfi->tx_ch, xfer->tx_sg.sgl,
|
||||||
@ -0,0 +1,120 @@
|
|||||||
|
From 5fcca3fd4b621d7b5bdeca18d36dfc6ca6cfe383 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ionela Voinescu <ionela.voinescu@imgtec.com>
|
||||||
|
Date: Wed, 10 Aug 2016 11:42:26 +0100
|
||||||
|
Subject: spi: img-spfi: finish every transfer cleanly
|
||||||
|
|
||||||
|
Before this change, the interrupt status bit that signaled
|
||||||
|
the end of a tranfers was cleared in the wait_all_done
|
||||||
|
function. That functionality triggered issues for DMA
|
||||||
|
duplex transactions where the wait function was called
|
||||||
|
twice, in both the TX and RX callbacks.
|
||||||
|
|
||||||
|
In order to fix the issue, clear all interrupt data bits
|
||||||
|
at the end of a PIO transfer or at the end of both TX and RX
|
||||||
|
duplex transfers, if the transfer is not a pending tranfer
|
||||||
|
(command waiting for data). After that, the status register
|
||||||
|
is checked for new incoming data or new data requests to be
|
||||||
|
signaled. If SPFI finished cleanly, no new interrupt data
|
||||||
|
bits should be set.
|
||||||
|
|
||||||
|
Signed-off-by: Ionela Voinescu <ionela.voinescu@imgtec.com>
|
||||||
|
---
|
||||||
|
drivers/spi/spi-img-spfi.c | 49 +++++++++++++++++++++++++++++++++-------------
|
||||||
|
1 file changed, 35 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/spi/spi-img-spfi.c
|
||||||
|
+++ b/drivers/spi/spi-img-spfi.c
|
||||||
|
@@ -79,6 +79,14 @@
|
||||||
|
#define SPFI_INTERRUPT_SDE BIT(1)
|
||||||
|
#define SPFI_INTERRUPT_SDTRIG BIT(0)
|
||||||
|
|
||||||
|
+#define SPFI_INTERRUPT_DATA_BITS (SPFI_INTERRUPT_SDHF |\
|
||||||
|
+ SPFI_INTERRUPT_SDFUL |\
|
||||||
|
+ SPFI_INTERRUPT_GDEX32BIT |\
|
||||||
|
+ SPFI_INTERRUPT_GDHF |\
|
||||||
|
+ SPFI_INTERRUPT_GDFUL |\
|
||||||
|
+ SPFI_INTERRUPT_ALLDONETRIG |\
|
||||||
|
+ SPFI_INTERRUPT_GDEX8BIT)
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* There are four parallel FIFOs of 16 bytes each. The word buffer
|
||||||
|
* (*_32BIT_VALID_DATA) accesses all four FIFOs at once, resulting in an
|
||||||
|
@@ -136,6 +144,23 @@ static inline void spfi_reset(struct img
|
||||||
|
spfi_writel(spfi, 0, SPFI_CONTROL);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static inline void spfi_finish(struct img_spfi *spfi)
|
||||||
|
+{
|
||||||
|
+ if (!(spfi->complete))
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ /* Clear data bits as all transfers(TX and RX) have finished */
|
||||||
|
+ spfi_writel(spfi, SPFI_INTERRUPT_DATA_BITS, SPFI_INTERRUPT_CLEAR);
|
||||||
|
+ if (spfi_readl(spfi, SPFI_INTERRUPT_STATUS) & SPFI_INTERRUPT_DATA_BITS) {
|
||||||
|
+ dev_err(spfi->dev, "SPFI did not finish transfer cleanly.\n");
|
||||||
|
+ spfi_reset(spfi);
|
||||||
|
+ }
|
||||||
|
+ /* Disable SPFI for it not to interfere with pending transactions */
|
||||||
|
+ spfi_writel(spfi,
|
||||||
|
+ spfi_readl(spfi, SPFI_CONTROL) & ~SPFI_CONTROL_SPFI_EN,
|
||||||
|
+ SPFI_CONTROL);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int spfi_wait_all_done(struct img_spfi *spfi)
|
||||||
|
{
|
||||||
|
unsigned long timeout = jiffies + msecs_to_jiffies(50);
|
||||||
|
@@ -144,19 +169,9 @@ static int spfi_wait_all_done(struct img
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while (time_before(jiffies, timeout)) {
|
||||||
|
- u32 status = spfi_readl(spfi, SPFI_INTERRUPT_STATUS);
|
||||||
|
-
|
||||||
|
- if (status & SPFI_INTERRUPT_ALLDONETRIG) {
|
||||||
|
- spfi_writel(spfi, SPFI_INTERRUPT_ALLDONETRIG,
|
||||||
|
- SPFI_INTERRUPT_CLEAR);
|
||||||
|
- /*
|
||||||
|
- * Disable SPFI for it not to interfere with
|
||||||
|
- * pending transactions
|
||||||
|
- */
|
||||||
|
- spfi_writel(spfi, spfi_readl(spfi, SPFI_CONTROL)
|
||||||
|
- & ~SPFI_CONTROL_SPFI_EN, SPFI_CONTROL);
|
||||||
|
+ if (spfi_readl(spfi, SPFI_INTERRUPT_STATUS) &
|
||||||
|
+ SPFI_INTERRUPT_ALLDONETRIG)
|
||||||
|
return 0;
|
||||||
|
- }
|
||||||
|
cpu_relax();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -288,6 +303,8 @@ static int img_spfi_start_pio(struct spi
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = spfi_wait_all_done(spfi);
|
||||||
|
+ spfi_finish(spfi);
|
||||||
|
+
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
@@ -303,8 +320,10 @@ static void img_spfi_dma_rx_cb(void *dat
|
||||||
|
|
||||||
|
spin_lock_irqsave(&spfi->lock, flags);
|
||||||
|
spfi->rx_dma_busy = false;
|
||||||
|
- if (!spfi->tx_dma_busy)
|
||||||
|
+ if (!spfi->tx_dma_busy) {
|
||||||
|
+ spfi_finish(spfi);
|
||||||
|
spi_finalize_current_transfer(spfi->host);
|
||||||
|
+ }
|
||||||
|
spin_unlock_irqrestore(&spfi->lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -317,8 +336,10 @@ static void img_spfi_dma_tx_cb(void *dat
|
||||||
|
|
||||||
|
spin_lock_irqsave(&spfi->lock, flags);
|
||||||
|
spfi->tx_dma_busy = false;
|
||||||
|
- if (!spfi->rx_dma_busy)
|
||||||
|
+ if (!spfi->rx_dma_busy) {
|
||||||
|
+ spfi_finish(spfi);
|
||||||
|
spi_finalize_current_transfer(spfi->host);
|
||||||
|
+ }
|
||||||
|
spin_unlock_irqrestore(&spfi->lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
From 3642843a06025ec333d7e92580cf52cb8db2a652 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Govindraj Raja <Govindraj.Raja@imgtec.com>
|
||||||
|
Date: Fri, 8 Jan 2016 16:36:07 +0000
|
||||||
|
Subject: clk: pistachio: Fix wrong SDHost card speed
|
||||||
|
|
||||||
|
The SDHost currently clocks the card 4x slower than it
|
||||||
|
should do, because there is fixed divide by 4 in the
|
||||||
|
sdhost wrapper that is not present in the clock tree.
|
||||||
|
To model this add a fixed divide by 4 clock node in
|
||||||
|
the SDHost clock path.
|
||||||
|
|
||||||
|
This will ensure the right clock frequency is selected when
|
||||||
|
the mmc driver tries to configure frequency on card insert.
|
||||||
|
|
||||||
|
Signed-off-by: Govindraj Raja <Govindraj.Raja@imgtec.com>
|
||||||
|
---
|
||||||
|
drivers/clk/pistachio/clk-pistachio.c | 3 ++-
|
||||||
|
include/dt-bindings/clock/pistachio-clk.h | 1 +
|
||||||
|
2 files changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/clk/pistachio/clk-pistachio.c
|
||||||
|
+++ b/drivers/clk/pistachio/clk-pistachio.c
|
||||||
|
@@ -41,7 +41,7 @@ static struct pistachio_gate pistachio_g
|
||||||
|
GATE(CLK_AUX_ADC_INTERNAL, "aux_adc_internal", "sys_internal_div",
|
||||||
|
0x104, 22),
|
||||||
|
GATE(CLK_AUX_ADC, "aux_adc", "aux_adc_div", 0x104, 23),
|
||||||
|
- GATE(CLK_SD_HOST, "sd_host", "sd_host_div", 0x104, 24),
|
||||||
|
+ GATE(CLK_SD_HOST, "sd_host", "sd_host_div4", 0x104, 24),
|
||||||
|
GATE(CLK_BT, "bt", "bt_div", 0x104, 25),
|
||||||
|
GATE(CLK_BT_DIV4, "bt_div4", "bt_div4_div", 0x104, 26),
|
||||||
|
GATE(CLK_BT_DIV8, "bt_div8", "bt_div8_div", 0x104, 27),
|
||||||
|
@@ -51,6 +51,7 @@ static struct pistachio_gate pistachio_g
|
||||||
|
static struct pistachio_fixed_factor pistachio_ffs[] __initdata = {
|
||||||
|
FIXED_FACTOR(CLK_WIFI_DIV4, "wifi_div4", "wifi_pll", 4),
|
||||||
|
FIXED_FACTOR(CLK_WIFI_DIV8, "wifi_div8", "wifi_pll", 8),
|
||||||
|
+ FIXED_FACTOR(CLK_SDHOST_DIV4, "sd_host_div4", "sd_host_div", 4),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct pistachio_div pistachio_divs[] __initdata = {
|
||||||
|
--- a/include/dt-bindings/clock/pistachio-clk.h
|
||||||
|
+++ b/include/dt-bindings/clock/pistachio-clk.h
|
||||||
|
@@ -18,6 +18,7 @@
|
||||||
|
/* Fixed-factor clocks */
|
||||||
|
#define CLK_WIFI_DIV4 16
|
||||||
|
#define CLK_WIFI_DIV8 17
|
||||||
|
+#define CLK_SDHOST_DIV4 18
|
||||||
|
|
||||||
|
/* Gate clocks */
|
||||||
|
#define CLK_MIPS 32
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
From 981c1d416af45eff207227aec106381ac23aac99 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ian Pozella <Ian.Pozella@imgtec.com>
|
||||||
|
Date: Mon, 20 Feb 2017 10:00:52 +0000
|
||||||
|
Subject: MIPS: DTS: img: marduk: switch mmc to 1 bit mode
|
||||||
|
|
||||||
|
The mmc block in Pistachio allows 1 to 8 data bits to be used.
|
||||||
|
Marduk uses 4 bits allowing the upper 4 bits to be allocated
|
||||||
|
to the Mikrobus ports. However these bits are still connected
|
||||||
|
internally meaning the mmc block recieves signals on all data lines
|
||||||
|
and seems the internal HW CRC checks get corrupted by this erroneous
|
||||||
|
data.
|
||||||
|
|
||||||
|
We cannot control what data is sent on these lines because they go
|
||||||
|
to external ports. 1 bit mode does not exhibit the issue hence the
|
||||||
|
safe default is to use this. If a user knows that in their use case
|
||||||
|
they will not use the upper bits then they can set to 4 bit mode in
|
||||||
|
order to improve performance.
|
||||||
|
|
||||||
|
Also make sure that the upper 4 bits don't get allocated to the mmc
|
||||||
|
driver (the default is to assign all 8 pins) so they can be allocated
|
||||||
|
to other drivers. Allocating all 4 despite setting 1 bit mode as this
|
||||||
|
matches what is there in hardware.
|
||||||
|
|
||||||
|
Signed-off-by: Ian Pozella <Ian.Pozella@imgtec.com>
|
||||||
|
---
|
||||||
|
arch/mips/boot/dts/img/pistachio_marduk.dts | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
+++ b/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
@@ -118,7 +118,7 @@
|
||||||
|
|
||||||
|
&sdhost {
|
||||||
|
status = "okay";
|
||||||
|
- bus-width = <4>;
|
||||||
|
+ bus-width = <1>;
|
||||||
|
disable-wp;
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -128,6 +128,7 @@
|
||||||
|
|
||||||
|
&pin_sdhost_data {
|
||||||
|
drive-strength = <2>;
|
||||||
|
+ pins = "mfio17", "mfio18", "mfio19", "mfio20";
|
||||||
|
};
|
||||||
|
|
||||||
|
&pwm {
|
||||||
@ -0,0 +1,61 @@
|
|||||||
|
From f32bc2aa01edcba2f2ed5db151cf183eac9ef919 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma@imgtec.com>
|
||||||
|
Date: Sat, 25 Feb 2017 16:42:50 +0000
|
||||||
|
Subject: mtd: nor: support mtd name from device tree
|
||||||
|
|
||||||
|
Signed-off-by: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma@imgtec.com>
|
||||||
|
---
|
||||||
|
drivers/mtd/spi-nor/spi-nor.c | 8 +++++++-
|
||||||
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/spi/spi-mem.c
|
||||||
|
+++ b/drivers/spi/spi-mem.c
|
||||||
|
@@ -846,7 +846,9 @@ static int spi_mem_probe(struct spi_devi
|
||||||
|
{
|
||||||
|
struct spi_mem_driver *memdrv = to_spi_mem_drv(spi->dev.driver);
|
||||||
|
struct spi_controller *ctlr = spi->controller;
|
||||||
|
+ const char __maybe_unused *of_mtd_name = NULL;
|
||||||
|
struct spi_mem *mem;
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
mem = devm_kzalloc(&spi->dev, sizeof(*mem), GFP_KERNEL);
|
||||||
|
if (!mem)
|
||||||
|
@@ -854,10 +856,15 @@ static int spi_mem_probe(struct spi_devi
|
||||||
|
|
||||||
|
mem->spi = spi;
|
||||||
|
|
||||||
|
- if (ctlr->mem_ops && ctlr->mem_ops->get_name)
|
||||||
|
+ if (ctlr->mem_ops && ctlr->mem_ops->get_name) {
|
||||||
|
mem->name = ctlr->mem_ops->get_name(mem);
|
||||||
|
- else
|
||||||
|
- mem->name = dev_name(&spi->dev);
|
||||||
|
+ } else {
|
||||||
|
+ ret = device_property_read_string(&spi->dev, "linux,mtd-name", &of_mtd_name);
|
||||||
|
+ if (!ret)
|
||||||
|
+ mem->name = of_mtd_name;
|
||||||
|
+ else
|
||||||
|
+ mem->name = dev_name(&spi->dev);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (IS_ERR_OR_NULL(mem->name))
|
||||||
|
return PTR_ERR_OR_ZERO(mem->name);
|
||||||
|
--- a/drivers/mtd/mtdcore.c
|
||||||
|
+++ b/drivers/mtd/mtdcore.c
|
||||||
|
@@ -870,6 +870,17 @@ out_error:
|
||||||
|
*/
|
||||||
|
static void mtd_set_dev_defaults(struct mtd_info *mtd)
|
||||||
|
{
|
||||||
|
+#ifdef CONFIG_MTD_OF_PARTS
|
||||||
|
+ const char __maybe_unused *of_mtd_name = NULL;
|
||||||
|
+ struct device_node *np;
|
||||||
|
+
|
||||||
|
+ np = mtd_get_of_node(mtd);
|
||||||
|
+ if (np && !mtd->name) {
|
||||||
|
+ of_property_read_string(np, "linux,mtd-name", &of_mtd_name);
|
||||||
|
+ if (of_mtd_name)
|
||||||
|
+ mtd->name = of_mtd_name;
|
||||||
|
+ } else
|
||||||
|
+#endif
|
||||||
|
if (mtd->dev.parent) {
|
||||||
|
if (!mtd->owner && mtd->dev.parent->driver)
|
||||||
|
mtd->owner = mtd->dev.parent->driver->owner;
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
From 0023c706f7e0f0f02bd48a63a2f3c04c839532ae Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
Date: Sat, 15 Aug 2020 16:04:53 +0200
|
||||||
|
Subject: [PATCH 901/904] MIPS: DTS: img: marduk: Add SPI NAND flash
|
||||||
|
|
||||||
|
Add Gigadevice GD5F4GQ4UCYIGT SPI NAND flash to the device tree.
|
||||||
|
|
||||||
|
The NAND flash chip is connected with quad SPI, but reading currently
|
||||||
|
fails in quad SPI mode.
|
||||||
|
|
||||||
|
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
---
|
||||||
|
arch/mips/boot/dts/img/pistachio_marduk.dts | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
+++ b/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
@@ -89,6 +89,12 @@
|
||||||
|
reg = <0>;
|
||||||
|
spi-max-frequency = <50000000>;
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ flash@1 {
|
||||||
|
+ compatible = "spi-nand";
|
||||||
|
+ reg = <1>;
|
||||||
|
+ spi-max-frequency = <50000000>;
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
&uart0 {
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
From b7700154d75e8d7c9a2022f09c2d5430137606fa Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
Date: Sat, 15 Aug 2020 16:05:25 +0200
|
||||||
|
Subject: [PATCH 902/904] MIPS: DTS: img: marduk: Add Cascoda CA8210 6LoWPAN
|
||||||
|
|
||||||
|
Add Cascoda CA8210 6LoWPAN controller to device tree.
|
||||||
|
|
||||||
|
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
---
|
||||||
|
arch/mips/boot/dts/img/pistachio_marduk.dts | 22 +++++++++++++++++++++
|
||||||
|
1 file changed, 22 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
+++ b/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
@@ -76,6 +76,28 @@
|
||||||
|
VDD-supply = <&internal_dac_supply>;
|
||||||
|
};
|
||||||
|
|
||||||
|
+&spfi0 {
|
||||||
|
+ status = "okay";
|
||||||
|
+ pinctrl-0 = <&spim0_pins>, <&spim0_cs0_alt_pin>, <&spim0_cs2_alt_pin>, <&spim0_cs3_alt_pin>, <&spim0_cs4_alt_pin>;
|
||||||
|
+ pinctrl-names = "default";
|
||||||
|
+
|
||||||
|
+ cs-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>, <&gpio0 2 GPIO_ACTIVE_HIGH>,
|
||||||
|
+ <&gpio1 12 GPIO_ACTIVE_HIGH>, <&gpio1 13 GPIO_ACTIVE_HIGH>;
|
||||||
|
+
|
||||||
|
+ ca8210: ca8210@0 {
|
||||||
|
+ status = "okay";
|
||||||
|
+ compatible = "cascoda,ca8210";
|
||||||
|
+ reg = <0>;
|
||||||
|
+ spi-max-frequency = <4000000>;
|
||||||
|
+ spi-cpol;
|
||||||
|
+ reset-gpio = <&gpio0 12 GPIO_ACTIVE_HIGH>;
|
||||||
|
+ irq-gpio = <&gpio2 12 GPIO_ACTIVE_HIGH>;
|
||||||
|
+ extclock-enable;
|
||||||
|
+ extclock-freq = <16000000>;
|
||||||
|
+ extclock-gpio = <2>;
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
&spfi1 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
@ -0,0 +1,81 @@
|
|||||||
|
From ad4eba0c36ce8af6ab9ea1bc163e4c1ac7c271c3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
Date: Sat, 15 Aug 2020 16:09:02 +0200
|
||||||
|
Subject: [PATCH 903/904] MIPS: DTS: img: marduk: Add NXP SC16IS752IPW
|
||||||
|
|
||||||
|
Add NXP SC16IS752IPW SPI-UART controller to device tree.
|
||||||
|
|
||||||
|
This controller drives 2 UARTs and 7 LEDs on the board.
|
||||||
|
|
||||||
|
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||||
|
---
|
||||||
|
arch/mips/boot/dts/img/pistachio_marduk.dts | 51 +++++++++++++++++++++
|
||||||
|
1 file changed, 51 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
+++ b/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
@@ -46,6 +46,46 @@
|
||||||
|
regulator-max-microvolt = <1800000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
+ /* EXT clock from ca8210 is fed to sc16is752 */
|
||||||
|
+ ca8210_ext_clk: ca8210-ext-clk {
|
||||||
|
+ compatible = "fixed-clock";
|
||||||
|
+ #clock-cells = <0>;
|
||||||
|
+ clock-frequency = <16000000>;
|
||||||
|
+ clock-output-names = "ca8210_ext_clock";
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ gpioleds {
|
||||||
|
+ compatible = "gpio-leds";
|
||||||
|
+ user1 {
|
||||||
|
+ label = "marduk:red:user1";
|
||||||
|
+ gpios = <&sc16is752 0 GPIO_ACTIVE_LOW>;
|
||||||
|
+ };
|
||||||
|
+ user2 {
|
||||||
|
+ label = "marduk:red:user2";
|
||||||
|
+ gpios = <&sc16is752 1 GPIO_ACTIVE_LOW>;
|
||||||
|
+ };
|
||||||
|
+ user3 {
|
||||||
|
+ label = "marduk:red:user3";
|
||||||
|
+ gpios = <&sc16is752 2 GPIO_ACTIVE_LOW>;
|
||||||
|
+ };
|
||||||
|
+ user4 {
|
||||||
|
+ label = "marduk:red:user4";
|
||||||
|
+ gpios = <&sc16is752 3 GPIO_ACTIVE_LOW>;
|
||||||
|
+ };
|
||||||
|
+ user5 {
|
||||||
|
+ label = "marduk:red:user5";
|
||||||
|
+ gpios = <&sc16is752 4 GPIO_ACTIVE_LOW>;
|
||||||
|
+ };
|
||||||
|
+ user6 {
|
||||||
|
+ label = "marduk:red:user6";
|
||||||
|
+ gpios = <&sc16is752 5 GPIO_ACTIVE_LOW>;
|
||||||
|
+ };
|
||||||
|
+ user7 {
|
||||||
|
+ label = "marduk:red:user7";
|
||||||
|
+ gpios = <&sc16is752 6 GPIO_ACTIVE_LOW>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
led-controller {
|
||||||
|
compatible = "pwm-leds";
|
||||||
|
|
||||||
|
@@ -96,6 +136,17 @@
|
||||||
|
extclock-freq = <16000000>;
|
||||||
|
extclock-gpio = <2>;
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ sc16is752: sc16is752@1 {
|
||||||
|
+ compatible = "nxp,sc16is752";
|
||||||
|
+ reg = <1>;
|
||||||
|
+ clocks = <&ca8210_ext_clk>;
|
||||||
|
+ spi-max-frequency = <4000000>;
|
||||||
|
+ interrupt-parent = <&gpio0>;
|
||||||
|
+ interrupts = <11 IRQ_TYPE_EDGE_FALLING>;
|
||||||
|
+ gpio-controller;
|
||||||
|
+ #gpio-cells = <2>;
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
&spfi1 {
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
From ff0e950b605047bf50d470023e0fb2fc2003a0f0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ian Pozella <Ian.Pozella@imgtec.com>
|
||||||
|
Date: Mon, 20 Feb 2017 10:38:07 +0000
|
||||||
|
Subject: [PATCH 904/904] MIPS: DTS: img: marduk: Add partition name
|
||||||
|
|
||||||
|
Signed-off-by: Ian Pozella <Ian.Pozella@imgtec.com>
|
||||||
|
---
|
||||||
|
arch/mips/boot/dts/img/pistachio_marduk.dts | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
--- a/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
+++ b/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
@@ -161,12 +161,14 @@
|
||||||
|
compatible = "spansion,s25fl016k", "jedec,spi-nor";
|
||||||
|
reg = <0>;
|
||||||
|
spi-max-frequency = <50000000>;
|
||||||
|
+ linux,mtd-name = "spi-nor";
|
||||||
|
};
|
||||||
|
|
||||||
|
flash@1 {
|
||||||
|
compatible = "spi-nand";
|
||||||
|
reg = <1>;
|
||||||
|
spi-max-frequency = <50000000>;
|
||||||
|
+ linux,mtd-name = "spi-nand";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
--- a/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
+++ b/arch/mips/boot/dts/img/pistachio_marduk.dts
|
||||||
|
@@ -19,6 +19,11 @@
|
||||||
|
ethernet0 = &enet;
|
||||||
|
spi0 = &spfi0;
|
||||||
|
spi1 = &spfi1;
|
||||||
|
+
|
||||||
|
+ led-boot = &led_heartbeat;
|
||||||
|
+ led-failsafe = &led_heartbeat;
|
||||||
|
+ led-running = &led_heartbeat;
|
||||||
|
+ led-upgrade = &led_heartbeat;
|
||||||
|
};
|
||||||
|
|
||||||
|
chosen {
|
||||||
|
@@ -89,11 +94,10 @@
|
||||||
|
led-controller {
|
||||||
|
compatible = "pwm-leds";
|
||||||
|
|
||||||
|
- led-1 {
|
||||||
|
+ led_heartbeat: heartbeat {
|
||||||
|
label = "marduk:red:heartbeat";
|
||||||
|
pwms = <&pwm 3 300000>;
|
||||||
|
max-brightness = <255>;
|
||||||
|
- linux,default-trigger = "heartbeat";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
@ -33,9 +33,15 @@
|
|||||||
keys {
|
keys {
|
||||||
compatible = "gpio-keys";
|
compatible = "gpio-keys";
|
||||||
|
|
||||||
|
wps {
|
||||||
|
label = "wps";
|
||||||
|
gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
|
||||||
|
linux,code = <KEY_WPS_BUTTON>;
|
||||||
|
};
|
||||||
|
|
||||||
reset {
|
reset {
|
||||||
label = "reset";
|
label = "reset";
|
||||||
gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
|
gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
|
||||||
linux,code = <KEY_RESTART>;
|
linux,code = <KEY_RESTART>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -97,7 +97,7 @@ $(curdir)/bison/compile := $(curdir)/flex/compile
|
|||||||
$(curdir)/cbootimage/compile += $(curdir)/automake/compile
|
$(curdir)/cbootimage/compile += $(curdir)/automake/compile
|
||||||
$(curdir)/cmake/compile += $(curdir)/libressl/compile $(curdir)/ninja/compile $(curdir)/expat/compile $(curdir)/xz/compile $(curdir)/zlib/compile $(curdir)/zstd/compile
|
$(curdir)/cmake/compile += $(curdir)/libressl/compile $(curdir)/ninja/compile $(curdir)/expat/compile $(curdir)/xz/compile $(curdir)/zlib/compile $(curdir)/zstd/compile
|
||||||
$(curdir)/dosfstools/compile := $(curdir)/automake/compile
|
$(curdir)/dosfstools/compile := $(curdir)/automake/compile
|
||||||
$(curdir)/e2fsprogs/compile := $(curdir)/libtool/compile
|
$(curdir)/e2fsprogs/compile := $(curdir)/libtool/compile $(curdir)/util-linux/compile
|
||||||
$(curdir)/elfutils/compile := $(curdir)/m4/compile $(curdir)/zlib/compile $(curdir)/gnulib/compile $(curdir)/libtool/compile
|
$(curdir)/elfutils/compile := $(curdir)/m4/compile $(curdir)/zlib/compile $(curdir)/gnulib/compile $(curdir)/libtool/compile
|
||||||
$(curdir)/fakeroot/compile := $(curdir)/libtool/compile
|
$(curdir)/fakeroot/compile := $(curdir)/libtool/compile
|
||||||
$(curdir)/findutils/compile := $(curdir)/bison/compile
|
$(curdir)/findutils/compile := $(curdir)/bison/compile
|
||||||
@ -123,7 +123,7 @@ $(curdir)/mklibs/compile := $(curdir)/libtool/compile
|
|||||||
$(curdir)/mold/compile := $(curdir)/cmake/compile $(curdir)/zlib/compile $(curdir)/zstd/compile
|
$(curdir)/mold/compile := $(curdir)/cmake/compile $(curdir)/zlib/compile $(curdir)/zstd/compile
|
||||||
$(curdir)/mpc/compile := $(curdir)/mpfr/compile $(curdir)/gmp/compile
|
$(curdir)/mpc/compile := $(curdir)/mpfr/compile $(curdir)/gmp/compile
|
||||||
$(curdir)/mpfr/compile := $(curdir)/gmp/compile
|
$(curdir)/mpfr/compile := $(curdir)/gmp/compile
|
||||||
$(curdir)/mtd-utils/compile := $(curdir)/libtool/compile $(curdir)/e2fsprogs/compile $(curdir)/zlib/compile
|
$(curdir)/mtd-utils/compile := $(curdir)/libtool/compile $(curdir)/zlib/compile $(curdir)/util-linux/compile
|
||||||
$(curdir)/padjffs2/compile := $(curdir)/findutils/compile
|
$(curdir)/padjffs2/compile := $(curdir)/findutils/compile
|
||||||
$(curdir)/patchelf/compile := $(curdir)/libtool/compile
|
$(curdir)/patchelf/compile := $(curdir)/libtool/compile
|
||||||
$(curdir)/pkgconf/compile := $(curdir)/meson/compile
|
$(curdir)/pkgconf/compile := $(curdir)/meson/compile
|
||||||
@ -131,7 +131,7 @@ $(curdir)/quilt/compile := $(curdir)/autoconf/compile $(curdir)/findutils/compil
|
|||||||
$(curdir)/sdcc/compile := $(curdir)/bison/compile
|
$(curdir)/sdcc/compile := $(curdir)/bison/compile
|
||||||
$(curdir)/squashfs3-lzma/compile := $(curdir)/lzma-old/compile
|
$(curdir)/squashfs3-lzma/compile := $(curdir)/lzma-old/compile
|
||||||
$(curdir)/squashfs4/compile := $(curdir)/xz/compile $(curdir)/zlib/compile
|
$(curdir)/squashfs4/compile := $(curdir)/xz/compile $(curdir)/zlib/compile
|
||||||
$(curdir)/util-linux/compile := $(curdir)/bison/compile
|
$(curdir)/util-linux/compile := $(curdir)/bison/compile $(curdir)/automake/compile
|
||||||
$(curdir)/yafut/compile := $(curdir)/cmake/compile
|
$(curdir)/yafut/compile := $(curdir)/cmake/compile
|
||||||
|
|
||||||
ifneq ($(HOST_OS),Linux)
|
ifneq ($(HOST_OS),Linux)
|
||||||
|
|||||||
@ -29,7 +29,6 @@ HOST_GNULIB_SKIP := \
|
|||||||
lib/locale.in.h
|
lib/locale.in.h
|
||||||
|
|
||||||
HOST_CONFIGURE_ARGS += \
|
HOST_CONFIGURE_ARGS += \
|
||||||
--disable-year2038 \
|
|
||||||
--enable-install-program=$(subst $(space),$(comma),$(strip $(PKG_PROGRAMS)))
|
--enable-install-program=$(subst $(space),$(comma),$(strip $(PKG_PROGRAMS)))
|
||||||
|
|
||||||
HOST_MAKE_FLAGS += \
|
HOST_MAKE_FLAGS += \
|
||||||
|
|||||||
@ -11,7 +11,6 @@ PKG_NAME:=e2fsprogs
|
|||||||
PKG_CPE_ID:=cpe:/a:e2fsprogs_project:e2fsprogs
|
PKG_CPE_ID:=cpe:/a:e2fsprogs_project:e2fsprogs
|
||||||
PKG_VERSION:=1.47.0
|
PKG_VERSION:=1.47.0
|
||||||
PKG_HASH:=0b4fe723d779b0927fb83c9ae709bc7b40f66d7df36433bef143e41c54257084
|
PKG_HASH:=0b4fe723d779b0927fb83c9ae709bc7b40f66d7df36433bef143e41c54257084
|
||||||
PKG_RELEASE:=1
|
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
PKG_SOURCE_URL:=@KERNEL/linux/kernel/people/tytso/e2fsprogs/v$(PKG_VERSION)/
|
PKG_SOURCE_URL:=@KERNEL/linux/kernel/people/tytso/e2fsprogs/v$(PKG_VERSION)/
|
||||||
@ -27,7 +26,7 @@ HOST_CFLAGS += $(HOST_FPIC)
|
|||||||
|
|
||||||
HOST_CONFIGURE_ARGS += \
|
HOST_CONFIGURE_ARGS += \
|
||||||
--disable-elf-shlibs \
|
--disable-elf-shlibs \
|
||||||
--enable-libuuid \
|
--disable-libuuid \
|
||||||
--disable-tls \
|
--disable-tls \
|
||||||
--disable-nls \
|
--disable-nls \
|
||||||
--enable-threads=pth \
|
--enable-threads=pth \
|
||||||
@ -39,17 +38,13 @@ define Host/Prepare
|
|||||||
endef
|
endef
|
||||||
|
|
||||||
define Host/Install
|
define Host/Install
|
||||||
$(Host/Install/Default)
|
$(call Host/Install/Default)
|
||||||
$(MAKE) -C $(HOST_BUILD_DIR)/lib/uuid install
|
$(SED) 's|^DIR=.*|DIR=$$$$(STAGING_DIR_HOST)/share/et|' $(STAGING_DIR_HOST)/bin/compile_et
|
||||||
mkdir -p $(STAGING_DIR_HOST)/include/e2fsprogs
|
$(SED) 's|^DIR=.*|DIR=$$$$(STAGING_DIR_HOST)/share/ss|' $(STAGING_DIR_HOST)/bin/mk_cmds
|
||||||
$(CP) $(STAGING_DIR_HOST)/include/uuid $(STAGING_DIR_HOST)/include/e2fsprogs/
|
|
||||||
rm -rf $(STAGING_DIR_HOST)/include/uuid
|
|
||||||
$(INSTALL_DATA) $(HOST_BUILD_DIR)/lib/uuid/libuuid.a $(STAGING_DIR_HOST)/lib/
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Host/Clean
|
define Host/Uninstall
|
||||||
rm -f $(STAGING_DIR_HOST)/bin/e2fsck
|
-$(call Host/Compile/Default,uninstall)
|
||||||
rm -f $(STAGING_DIR_HOST)/bin/tune2fs
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call HostBuild))
|
$(eval $(call HostBuild))
|
||||||
|
|||||||
@ -29,9 +29,6 @@ ifneq ($(HOST_OS),Linux)
|
|||||||
-include fls.h
|
-include fls.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
HOST_CONFIGURE_VARS+= \
|
|
||||||
UUID_CFLAGS="-I$(STAGING_DIR_HOST)/include/e2fsprogs/uuid"
|
|
||||||
|
|
||||||
HOST_CONFIGURE_ARGS+= \
|
HOST_CONFIGURE_ARGS+= \
|
||||||
--without-tests \
|
--without-tests \
|
||||||
--without-crypto \
|
--without-crypto \
|
||||||
|
|||||||
@ -14,93 +14,17 @@ PKG_SOURCE_URL:=@KERNEL/linux/utils/$(PKG_NAME)/v2.40
|
|||||||
PKG_HASH:=8e396eececae2b3b68db232c33b8810faa7c31f6df19f98f512739293d5829b7
|
PKG_HASH:=8e396eececae2b3b68db232c33b8810faa7c31f6df19f98f512739293d5829b7
|
||||||
PKG_CPE_ID:=cpe:/a:kernel:util-linux
|
PKG_CPE_ID:=cpe:/a:kernel:util-linux
|
||||||
|
|
||||||
|
PKG_FIXUP:=autoreconf
|
||||||
|
|
||||||
HOST_BUILD_PARALLEL:=1
|
HOST_BUILD_PARALLEL:=1
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/host-build.mk
|
include $(INCLUDE_DIR)/host-build.mk
|
||||||
|
|
||||||
HOST_CONFIGURE_ARGS += \
|
HOST_CONFIGURE_ARGS += \
|
||||||
--disable-poman \
|
--disable-shared \
|
||||||
--disable-nls \
|
--disable-all-programs \
|
||||||
--disable-asciidoc \
|
--enable-hexdump \
|
||||||
--disable-poman \
|
--enable-libuuid \
|
||||||
--disable-libuuid \
|
|
||||||
--disable-libblkid \
|
|
||||||
--disable-libmount \
|
|
||||||
--disable-libsmartcols \
|
|
||||||
--disable-libfdisk \
|
|
||||||
--disable-fdisks \
|
|
||||||
--disable-mount \
|
|
||||||
--disable-losetup \
|
|
||||||
--disable-zramctl \
|
|
||||||
--disable-fsck \
|
|
||||||
--disable-partx \
|
|
||||||
--disable-uuidd \
|
|
||||||
--disable-uuidgen \
|
|
||||||
--disable-blkid \
|
|
||||||
--disable-wipefs \
|
|
||||||
--disable-mountpoint \
|
|
||||||
--disable-fallocate \
|
|
||||||
--disable-unshare \
|
|
||||||
--disable-nsenter \
|
|
||||||
--disable-setpriv \
|
|
||||||
--disable-hardlink \
|
|
||||||
--disable-eject \
|
|
||||||
--disable-agetty \
|
|
||||||
--disable-cramfs \
|
|
||||||
--disable-bfs \
|
|
||||||
--disable-minix \
|
|
||||||
--disable-hwclock \
|
|
||||||
--disable-mkfs \
|
|
||||||
--disable-fstrim \
|
|
||||||
--disable-swapon \
|
|
||||||
--disable-lscpu \
|
|
||||||
--disable-lsfd \
|
|
||||||
--disable-lslogins \
|
|
||||||
--disable-wdctl \
|
|
||||||
--disable-cal \
|
|
||||||
--disable-logger \
|
|
||||||
--disable-whereis \
|
|
||||||
--disable-pipesz \
|
|
||||||
--disable-waitpid \
|
|
||||||
--disable-switch_root \
|
|
||||||
--disable-pivot_root \
|
|
||||||
--disable-lsmem \
|
|
||||||
--disable-chmem \
|
|
||||||
--disable-ipcmk \
|
|
||||||
--disable-ipcrm \
|
|
||||||
--disable-ipcs \
|
|
||||||
--disable-irqtop \
|
|
||||||
--disable-lsirq \
|
|
||||||
--disable-lsns \
|
|
||||||
--disable-rfkill \
|
|
||||||
--disable-scriptutils \
|
|
||||||
--disable-tunelp \
|
|
||||||
--disable-kill \
|
|
||||||
--disable-last \
|
|
||||||
--disable-utmpdump \
|
|
||||||
--disable-line \
|
|
||||||
--disable-mesg \
|
|
||||||
--disable-raw \
|
|
||||||
--disable-rename \
|
|
||||||
--disable-vipw \
|
|
||||||
--disable-newgrp \
|
|
||||||
--disable-chfn-chsh \
|
|
||||||
--disable-login \
|
|
||||||
--disable-nologin \
|
|
||||||
--disable-sulogin \
|
|
||||||
--disable-su \
|
|
||||||
--disable-runuser \
|
|
||||||
--disable-ul \
|
|
||||||
--disable-more \
|
|
||||||
--disable-pg \
|
|
||||||
--disable-setterm \
|
|
||||||
--disable-schedutils \
|
|
||||||
--disable-wall \
|
|
||||||
--disable-write \
|
|
||||||
--disable-bash-completion \
|
|
||||||
--disable-pylibmount \
|
|
||||||
--disable-pg-bell \
|
|
||||||
--disable-liblastlog2 \
|
|
||||||
--without-util \
|
--without-util \
|
||||||
--without-selinux \
|
--without-selinux \
|
||||||
--without-audit \
|
--without-audit \
|
||||||
@ -122,12 +46,8 @@ HOST_CONFIGURE_ARGS += \
|
|||||||
--without-python \
|
--without-python \
|
||||||
--without-cryptsetup
|
--without-cryptsetup
|
||||||
|
|
||||||
define Host/Install
|
|
||||||
$(INSTALL_BIN) $(HOST_BUILD_DIR)/hexdump $(STAGING_DIR_HOST)/bin/
|
|
||||||
endef
|
|
||||||
|
|
||||||
define Host/Uninstall
|
define Host/Uninstall
|
||||||
rm -f $(STAGING_DIR_HOST)/bin/hexdump
|
-$(call Host/Compile/Default,uninstall)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call HostBuild))
|
$(eval $(call HostBuild))
|
||||||
|
|||||||
@ -0,0 +1,28 @@
|
|||||||
|
From 37641f246ee9df7289b4e3054b3ded3912773722 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robert Marko <robimarko@gmail.com>
|
||||||
|
Date: Tue, 25 Jun 2024 17:32:08 +0200
|
||||||
|
Subject: [PATCH] hexdump: allow enabling with --disable-all-programs
|
||||||
|
|
||||||
|
Currently, if --disable-all-programs is used hexdump cannot be built
|
||||||
|
as --enable-hexdump is not recognized, so lets add support for it.
|
||||||
|
|
||||||
|
Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||||
|
---
|
||||||
|
configure.ac | 6 +++++-
|
||||||
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -2237,7 +2237,11 @@ UL_BUILD_INIT([column], [check])
|
||||||
|
UL_REQUIRES_BUILD([column], [libsmartcols])
|
||||||
|
AM_CONDITIONAL([BUILD_COLUMN], [test "x$build_column" = xyes])
|
||||||
|
|
||||||
|
-UL_BUILD_INIT([hexdump], [yes])
|
||||||
|
+AC_ARG_ENABLE([hexdump],
|
||||||
|
+ AS_HELP_STRING([--disable-hexdump], [do not build hexdump]),
|
||||||
|
+ [], [UL_DEFAULT_ENABLE([hexdump], [check])]
|
||||||
|
+)
|
||||||
|
+UL_BUILD_INIT([hexdump])
|
||||||
|
AM_CONDITIONAL([BUILD_HEXDUMP], [test "x$build_hexdump" = xyes])
|
||||||
|
|
||||||
|
UL_BUILD_INIT([rev], [yes])
|
||||||
26
tools/util-linux/patches/101-macos-weak-aliases.patch
Normal file
26
tools/util-linux/patches/101-macos-weak-aliases.patch
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
From 9445f477cfcfb3615ffde8f93b1b98c809ee4eca Mon Sep 17 00:00:00 2001
|
||||||
|
From: Eugene Gershnik <gershnik@users.noreply.github.com>
|
||||||
|
Date: Mon, 6 May 2024 09:29:39 -0700
|
||||||
|
Subject: [PATCH] This re-enables build on macOS.
|
||||||
|
|
||||||
|
Weak aliases are not supported by clang on Darwin.
|
||||||
|
Instead this fix uses inline asm to make `_uuid_time` and alias to `___uuid_time`
|
||||||
|
|
||||||
|
Fixes util-linux/util-linux#2873
|
||||||
|
---
|
||||||
|
libuuid/src/uuid_time.c | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
--- a/libuuid/src/uuid_time.c
|
||||||
|
+++ b/libuuid/src/uuid_time.c
|
||||||
|
@@ -85,6 +85,10 @@ time_t __uuid_time(const uuid_t uu, stru
|
||||||
|
}
|
||||||
|
#if defined(__USE_TIME_BITS64) && defined(__GLIBC__)
|
||||||
|
extern time_t uuid_time64(const uuid_t uu, struct timeval *ret_tv) __attribute__((weak, alias("__uuid_time")));
|
||||||
|
+#elif defined(__clang__) && defined(__APPLE__)
|
||||||
|
+__asm__(".globl _uuid_time");
|
||||||
|
+__asm__(".set _uuid_time, ___uuid_time");
|
||||||
|
+extern time_t uuid_time(const uuid_t uu, struct timeval *ret_tv);
|
||||||
|
#else
|
||||||
|
extern time_t uuid_time(const uuid_t uu, struct timeval *ret_tv) __attribute__((weak, alias("__uuid_time")));
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue
Block a user