The following patches were removed because they are integrated in the upstream kernel 5.4:
* backport-5.4/047-v4.21-mtd-keep-original-flags-for-every-struct-mtd_info.patch
* backport-5.4/048-v4.21-mtd-improve-calculating-partition-boundaries-when-ch.patch
* backport-5.4/080-v5.1-0001-bcma-keep-a-direct-pointer-to-the-struct-device.patch
* backport-5.4/080-v5.1-0002-bcma-use-dev_-printing-functions.patch
* backport-5.4/095-Allow-class-e-address-assignment-via-ifconfig-ioctl.patch
* backport-5.4/101-arm-cns3xxx-use-actual-size-reads-for-PCIe.patch
* backport-5.4/200-v5.2-usb-dwc2-Set-lpm-mode-parameters-depend-on-HW-configuration.patch
* backport-5.4/210-arm64-sve-Disentangle-uapi-asm-ptrace.h-from-uapi-as.patch
* backport-5.4/380-v5.3-net-sched-Introduce-act_ctinfo-action.patch
* backport-5.4/450-v5.0-mtd-spinand-winbond-Add-support-for-W25N01GV.patch
* backport-5.4/451-v5.0-mtd-spinand-Add-initial-support-for-Toshiba-TC58CVG2.patch
* backport-5.4/452-v5.0-mtd-spinand-add-support-for-GigaDevice-GD5FxGQ4xA.patch
* backport-5.4/455-v5.1-mtd-spinand-Add-support-for-all-Toshiba-Memory-produ.patch
* backport-5.4/456-v5.1-mtd-spinand-Add-support-for-GigaDevice-GD5F1GQ4UExxG.patch
* backport-5.4/460-v5.0-mtd-spi-nor-Add-support-for-mx25u12835f.patch
* backport-5.4/460-v5.3-mtd-spinand-Define-macros-for-page-read-ops-with-thr.patch
* backport-5.4/461-v5.3-mtd-spinand-Add-support-for-two-byte-device-IDs.patch
* backport-5.4/462-v5.3-mtd-spinand-Add-support-for-GigaDevice-GD5F1GQ4UFxxG.patch
* backport-5.4/463-v5.3-mtd-spinand-Add-initial-support-for-Paragon-PN26G0xA.patch
* backport-5.4/700-v5.1-net-phylink-only-call-mac_config-during-resolve-when.patch
* backport-5.4/701-v5.2-net-phylink-ensure-inband-AN-works-correctly.patch
* backport-5.4/702-v4.20-net-ethernet-Add-helper-for-MACs-which-support-asym-.patch
* backport-5.4/703-v4.20-net-ethernet-Add-helper-for-set_pauseparam-for-Asym-.patch
* backport-5.4/704-v4.20-net-phy-Stop-with-excessive-soft-reset.patch
* backport-5.4/705-v5.1-net-phy-provide-full-set-of-accessor-functions-to-MM.patch
* backport-5.4/706-v5.1-net-phy-add-register-modifying-helpers-returning-1-o.patch
* backport-5.4/707-v5.1-net-phy-add-genphy_c45_check_and_restart_aneg.patch
* backport-5.4/708-v5.3-net-phylink-remove-netdev-from-phylink-mii-ioctl-emu.patch
* backport-5.4/709-v5.3-net-phylink-support-for-link-gpio-interrupt.patch
* backport-5.4/710-v5.3-net-phy-allow-Clause-45-access-via-mii-ioctl.patch
* backport-5.4/711-v5.3-net-sfp-add-mandatory-attach-detach-methods-for-sfp-.patch
* backport-5.4/712-v5.3-net-sfp-remove-sfp-bus-use-of-netdevs.patch
* backport-5.4/713-v5.2-net-phylink-avoid-reducing-support-mask.patch
* backport-5.4/714-v5.3-net-sfp-Stop-SFP-polling-and-interrupt-handling-duri.patch
* backport-5.4/715-v5.3-net-phylink-don-t-start-and-stop-SGMII-PHYs-in-SFP-m.patch
* backport-5.4/740-v5.5-net-phy-avoid-matching-all-ones-clause-45-PHY-IDs.patch
* backport-5.4/741-v5.5-net-phylink-fix-link-mode-modification-in-PHY-mode.patch
* pending-5.4/103-MIPS-perf-ath79-Fix-perfcount-IRQ-assignment.patch
* pending-5.4/131-spi-use-gpio_set_value_cansleep-for-setting-chipsele.patch
* pending-5.4/132-spi-spi-gpio-fix-crash-when-num-chipselects-is-0.patch
* pending-5.4/220-optimize_inlining.patch
* pending-5.4/341-MIPS-mm-remove-no-op-dma_map_ops-where-possible.patch
* pending-5.4/475-mtd-spi-nor-Add-Winbond-w25q128jv-support.patch
* pending-5.4/477-mtd-add-spi-nor-add-mx25u3235f.patch
* pending-5.4/479-mtd-spi-nor-add-eon-en25qh64.patch
Some bigger changes were done to this feature and we did not port this patch yet:
* hack-5.4/207-disable-modorder.patch
This depends on BOOTMEM which was removed from the kernel, this needs some bigger changes:
* hack-5.4/930-crashlog.patch
A different version of the FPU disable patch was merged upstream, OpenWrt needs some adaptations.
* pending-5.4/304-mips_disable_fpu.patch
- no crashlog support yet as a required file got deleted upstream
- Removed patch below, which is now seen as a recursive dependency [1]
- Removed patch below due to build error [2]
- fix still required to avoid identical function def [3]
- Fixes included from Blocktrron
- Fixes included from Chunkeey
- Fix included from nbd regarding "dst leak in Flow Offload"
[1] target/linux/generic/hack-5.4/260-crypto_test_dependencies.patch
[2] target/linux/generic/hack-5.4/207-disable-modorder.patch
[3] target/linux/generic/pending-5.4/613-netfilter_optional_tcp_window_check.patch
Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
Signed-off-by: David Bauer <mail@david-bauer.net>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
Signed-off-by: Robert Marko <robimarko@gmail.com>
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
LINUX_VERSION-4.14 = .171
LINUX_VERSION-4.19 = .106
+LINUX_VERSION-5.4 = .22
LINUX_KERNEL_HASH-4.14.171 = 4fe02489e4b4a187eccf0ef87df6100534c9d485e76d876b1fa247c7635332a0
LINUX_KERNEL_HASH-4.19.106 = 63c8bd76a9b282e18112f8ff9e3fd41e3d1df9f9b7248ea1a370b05a827e9cda
+LINUX_KERNEL_HASH-5.4.22 = 661bcb8d7e390dcc28e53795485e648f2bdc9b697b731459cc2bcc9ceb4a7d1a
remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))
sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1)))))))
--- a/Makefile
+++ b/Makefile
-@@ -432,8 +432,8 @@ KBUILD_LDFLAGS :=
+@@ -471,8 +471,9 @@ KBUILD_LDFLAGS :=
GCC_PLUGINS_CFLAGS :=
CLANG_FLAGS :=
--export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
--export CPP AR NM STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
-+export ARCH SRCARCH SUBARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD
-+export CC CPP AR NM STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
- export MAKE LEX YACC AWK GENKSYMS INSTALLKERNEL PERL PYTHON PYTHON2 PYTHON3 UTS_MACHINE
- export HOSTCXX KBUILD_HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
+-export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
+-export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE PAHOLE LEX YACC AWK INSTALLKERNEL
++export ARCH SRCARCH SUBARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD
++export CC CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE PAHOLE LEX YACC AWK INSTALLKERNEL
++
+ export PERL PYTHON PYTHON2 PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX
+ export KBUILD_HOSTCXXFLAGS KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS LDFLAGS_MODULE
+}
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
-@@ -135,6 +135,18 @@ config NF_CONNTRACK_EVENTS
+@@ -136,6 +136,18 @@ config NF_CONNTRACK_EVENTS
If unsure, say `N'.
depends on NETFILTER_ADVANCED
--- a/net/netfilter/Makefile
+++ b/net/netfilter/Makefile
-@@ -25,6 +25,9 @@ obj-$(CONFIG_NETFILTER_NETLINK_OSF) += n
+@@ -26,6 +26,9 @@ obj-$(CONFIG_NETFILTER_NETLINK_OSF) += n
# connection tracking
obj-$(CONFIG_NF_CONNTRACK) += nf_conntrack.o
+# optional conntrack route cache extension
+obj-$(CONFIG_NF_CONNTRACK_RTCACHE) += nf_conntrack_rtcache.o
+
- obj-$(CONFIG_NF_CT_PROTO_GRE) += nf_conntrack_proto_gre.o
-
# netlink interface for nf_conntrack
+ obj-$(CONFIG_NF_CT_NETLINK) += nf_conntrack_netlink.o
+ obj-$(CONFIG_NF_CT_NETLINK_TIMEOUT) += nfnetlink_cttimeout.o
--- /dev/null
+++ b/net/netfilter/nf_conntrack_rtcache.c
@@ -0,0 +1,428 @@
+++ /dev/null
-From 1186af457cc186c5ed01708da71b1ffbdf0a2638 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 20 Nov 2018 09:55:45 +0100
-Subject: [PATCH] mtd: keep original flags for every struct mtd_info
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-When allocating a new partition mtd subsystem runs internal tests in the
-allocate_partition(). They may result in modifying specified flags (e.g.
-dropping some /features/ like write access).
-
-Those constraints don't have to be necessary true for subpartitions. It
-may happen parent partition isn't block aligned (effectively disabling
-write access) while subpartition may fit blocks nicely. In such case all
-checks should be run again (starting with original flags value).
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
----
- drivers/mtd/mtdcore.c | 2 ++
- drivers/mtd/mtdpart.c | 3 ++-
- include/linux/mtd/mtd.h | 1 +
- 3 files changed, 5 insertions(+), 1 deletion(-)
-
---- a/drivers/mtd/mtdcore.c
-+++ b/drivers/mtd/mtdcore.c
-@@ -665,6 +665,8 @@ static void mtd_set_dev_defaults(struct
- } else {
- pr_debug("mtd device won't show a device symlink in sysfs\n");
- }
-+
-+ mtd->orig_flags = mtd->flags;
- }
-
- /**
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -346,7 +346,8 @@ static struct mtd_part *allocate_partiti
-
- /* set up the MTD object for this partition */
- slave->mtd.type = parent->type;
-- slave->mtd.flags = parent->flags & ~part->mask_flags;
-+ slave->mtd.flags = parent->orig_flags & ~part->mask_flags;
-+ slave->mtd.orig_flags = slave->mtd.flags;
- slave->mtd.size = part->size;
- slave->mtd.writesize = parent->writesize;
- slave->mtd.writebufsize = parent->writebufsize;
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -207,6 +207,7 @@ struct mtd_debug_info {
- struct mtd_info {
- u_char type;
- uint32_t flags;
-+ uint32_t orig_flags; /* Flags as before running mtd checks */
- uint64_t size; // Total size of the MTD
-
- /* "Major" erase size for the device. Naïve users may take this
+++ /dev/null
-From 6750f61a13a0197c40e4a40739117493b15f19e8 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 20 Nov 2018 10:24:09 +0100
-Subject: [PATCH] mtd: improve calculating partition boundaries when checking
- for alignment
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-When checking for alignment mtd should check absolute offsets. It's
-important for subpartitions as it doesn't make sense to check their
-relative addresses.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
----
- drivers/mtd/mtdpart.c | 13 +++++++++++--
- 1 file changed, 11 insertions(+), 2 deletions(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -61,6 +61,15 @@ static inline struct mtd_part *mtd_to_pa
- return container_of(mtd, struct mtd_part, mtd);
- }
-
-+static u64 part_absolute_offset(struct mtd_info *mtd)
-+{
-+ struct mtd_part *part = mtd_to_part(mtd);
-+
-+ if (!mtd_is_partition(mtd))
-+ return 0;
-+
-+ return part_absolute_offset(part->parent) + part->offset;
-+}
-
- /*
- * MTD methods which simply translate the effective address and pass through
-@@ -518,7 +527,7 @@ static struct mtd_part *allocate_partiti
- if (!(slave->mtd.flags & MTD_NO_ERASE))
- wr_alignment = slave->mtd.erasesize;
-
-- tmp = slave->offset;
-+ tmp = part_absolute_offset(parent) + slave->offset;
- remainder = do_div(tmp, wr_alignment);
- if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
- /* Doesn't start on a boundary of major erase size */
-@@ -529,7 +538,7 @@ static struct mtd_part *allocate_partiti
- part->name);
- }
-
-- tmp = slave->mtd.size;
-+ tmp = part_absolute_offset(parent) + slave->mtd.size;
- remainder = do_div(tmp, wr_alignment);
- if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
- slave->mtd.flags &= ~MTD_WRITEABLE;
+++ /dev/null
-From 5a1c18b761ddb299a06746948b9ec2814b04fa92 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 2 Jan 2019 00:00:01 +0100
-Subject: [PATCH] bcma: keep a direct pointer to the struct device
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Accessing struct device is pretty useful/common so having a direct
-pointer:
-1) Simplifies some code
-2) Makes bcma_bus_get_host_dev() unneeded
-3) Allows further improvements like using dev_* printing helpers
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/bcma/bcma_private.h | 1 -
- drivers/bcma/driver_gpio.c | 2 +-
- drivers/bcma/host_pci.c | 2 ++
- drivers/bcma/host_soc.c | 4 ++--
- drivers/bcma/main.c | 45 +++++++++----------------------------
- include/linux/bcma/bcma.h | 11 +++------
- 6 files changed, 18 insertions(+), 47 deletions(-)
-
---- a/drivers/bcma/bcma_private.h
-+++ b/drivers/bcma/bcma_private.h
-@@ -33,7 +33,6 @@ int __init bcma_bus_early_register(struc
- int bcma_bus_suspend(struct bcma_bus *bus);
- int bcma_bus_resume(struct bcma_bus *bus);
- #endif
--struct device *bcma_bus_get_host_dev(struct bcma_bus *bus);
-
- /* scan.c */
- void bcma_detect_chip(struct bcma_bus *bus);
---- a/drivers/bcma/driver_gpio.c
-+++ b/drivers/bcma/driver_gpio.c
-@@ -183,7 +183,7 @@ int bcma_gpio_init(struct bcma_drv_cc *c
- chip->direction_input = bcma_gpio_direction_input;
- chip->direction_output = bcma_gpio_direction_output;
- chip->owner = THIS_MODULE;
-- chip->parent = bcma_bus_get_host_dev(bus);
-+ chip->parent = bus->dev;
- #if IS_BUILTIN(CONFIG_OF)
- chip->of_node = cc->core->dev.of_node;
- #endif
---- a/drivers/bcma/host_pci.c
-+++ b/drivers/bcma/host_pci.c
-@@ -196,6 +196,8 @@ static int bcma_host_pci_probe(struct pc
- goto err_pci_release_regions;
- }
-
-+ bus->dev = &dev->dev;
-+
- /* Map MMIO */
- err = -ENOMEM;
- bus->mmio = pci_iomap(dev, 0, ~0UL);
---- a/drivers/bcma/host_soc.c
-+++ b/drivers/bcma/host_soc.c
-@@ -179,7 +179,6 @@ int __init bcma_host_soc_register(struct
- /* Host specific */
- bus->hosttype = BCMA_HOSTTYPE_SOC;
- bus->ops = &bcma_host_soc_ops;
-- bus->host_pdev = NULL;
-
- /* Initialize struct, detect chip */
- bcma_init_bus(bus);
-@@ -213,6 +212,8 @@ static int bcma_host_soc_probe(struct pl
- if (!bus)
- return -ENOMEM;
-
-+ bus->dev = dev;
-+
- /* Map MMIO */
- bus->mmio = of_iomap(np, 0);
- if (!bus->mmio)
-@@ -221,7 +222,6 @@ static int bcma_host_soc_probe(struct pl
- /* Host specific */
- bus->hosttype = BCMA_HOSTTYPE_SOC;
- bus->ops = &bcma_host_soc_ops;
-- bus->host_pdev = pdev;
-
- /* Initialize struct, detect chip */
- bcma_init_bus(bus);
---- a/drivers/bcma/main.c
-+++ b/drivers/bcma/main.c
-@@ -223,8 +223,8 @@ unsigned int bcma_core_irq(struct bcma_d
- mips_irq = bcma_core_mips_irq(core);
- return mips_irq <= 4 ? mips_irq + 2 : 0;
- }
-- if (bus->host_pdev)
-- return bcma_of_get_irq(&bus->host_pdev->dev, core, num);
-+ if (bus->dev)
-+ return bcma_of_get_irq(bus->dev, core, num);
- return 0;
- case BCMA_HOSTTYPE_SDIO:
- return 0;
-@@ -239,18 +239,18 @@ void bcma_prepare_core(struct bcma_bus *
- core->dev.release = bcma_release_core_dev;
- core->dev.bus = &bcma_bus_type;
- dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index);
-- core->dev.parent = bcma_bus_get_host_dev(bus);
-- if (core->dev.parent)
-- bcma_of_fill_device(core->dev.parent, core);
-+ core->dev.parent = bus->dev;
-+ if (bus->dev)
-+ bcma_of_fill_device(bus->dev, core);
-
- switch (bus->hosttype) {
- case BCMA_HOSTTYPE_PCI:
-- core->dma_dev = &bus->host_pci->dev;
-+ core->dma_dev = bus->dev;
- core->irq = bus->host_pci->irq;
- break;
- case BCMA_HOSTTYPE_SOC:
-- if (IS_ENABLED(CONFIG_OF) && bus->host_pdev) {
-- core->dma_dev = &bus->host_pdev->dev;
-+ if (IS_ENABLED(CONFIG_OF) && bus->dev) {
-+ core->dma_dev = bus->dev;
- } else {
- core->dev.dma_mask = &core->dev.coherent_dma_mask;
- core->dma_dev = &core->dev;
-@@ -261,28 +261,6 @@ void bcma_prepare_core(struct bcma_bus *
- }
- }
-
--struct device *bcma_bus_get_host_dev(struct bcma_bus *bus)
--{
-- switch (bus->hosttype) {
-- case BCMA_HOSTTYPE_PCI:
-- if (bus->host_pci)
-- return &bus->host_pci->dev;
-- else
-- return NULL;
-- case BCMA_HOSTTYPE_SOC:
-- if (bus->host_pdev)
-- return &bus->host_pdev->dev;
-- else
-- return NULL;
-- case BCMA_HOSTTYPE_SDIO:
-- if (bus->host_sdio)
-- return &bus->host_sdio->dev;
-- else
-- return NULL;
-- }
-- return NULL;
--}
--
- void bcma_init_bus(struct bcma_bus *bus)
- {
- mutex_lock(&bcma_buses_mutex);
-@@ -402,7 +380,6 @@ int bcma_bus_register(struct bcma_bus *b
- {
- int err;
- struct bcma_device *core;
-- struct device *dev;
-
- /* Scan for devices (cores) */
- err = bcma_bus_scan(bus);
-@@ -425,10 +402,8 @@ int bcma_bus_register(struct bcma_bus *b
- bcma_core_pci_early_init(&bus->drv_pci[0]);
- }
-
-- dev = bcma_bus_get_host_dev(bus);
-- if (dev) {
-- of_platform_default_populate(dev->of_node, NULL, dev);
-- }
-+ if (bus->dev)
-+ of_platform_default_populate(bus->dev->of_node, NULL, bus->dev);
-
- /* Cores providing flash access go before SPROM init */
- list_for_each_entry(core, &bus->cores, list) {
---- a/include/linux/bcma/bcma.h
-+++ b/include/linux/bcma/bcma.h
-@@ -332,6 +332,8 @@ extern int bcma_arch_register_fallback_s
- struct ssb_sprom *out));
-
- struct bcma_bus {
-+ struct device *dev;
-+
- /* The MMIO area. */
- void __iomem *mmio;
-
-@@ -339,14 +341,7 @@ struct bcma_bus {
-
- enum bcma_hosttype hosttype;
- bool host_is_pcie2; /* Used for BCMA_HOSTTYPE_PCI only */
-- union {
-- /* Pointer to the PCI bus (only for BCMA_HOSTTYPE_PCI) */
-- struct pci_dev *host_pci;
-- /* Pointer to the SDIO device (only for BCMA_HOSTTYPE_SDIO) */
-- struct sdio_func *host_sdio;
-- /* Pointer to platform device (only for BCMA_HOSTTYPE_SOC) */
-- struct platform_device *host_pdev;
-- };
-+ struct pci_dev *host_pci; /* PCI bus pointer (BCMA_HOSTTYPE_PCI only) */
-
- struct bcma_chipinfo chipinfo;
-
+++ /dev/null
-From 777bc4801a6868fcbff09ffb6e30f023e7c5ed38 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 2 Jan 2019 00:00:02 +0100
-Subject: [PATCH] bcma: use dev_* printing functions
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-It provides more meaningful messages.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- drivers/bcma/bcma_private.h | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
---- a/drivers/bcma/bcma_private.h
-+++ b/drivers/bcma/bcma_private.h
-@@ -10,13 +10,13 @@
- #include <linux/delay.h>
-
- #define bcma_err(bus, fmt, ...) \
-- pr_err("bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
-+ dev_err((bus)->dev, "bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
- #define bcma_warn(bus, fmt, ...) \
-- pr_warn("bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
-+ dev_warn((bus)->dev, "bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
- #define bcma_info(bus, fmt, ...) \
-- pr_info("bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
-+ dev_info((bus)->dev, "bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
- #define bcma_debug(bus, fmt, ...) \
-- pr_debug("bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
-+ dev_dbg((bus)->dev, "bus%d: " fmt, (bus)->num, ##__VA_ARGS__)
-
- struct bcma_bus;
-
+++ /dev/null
-From 46bf067870156abd61fe24d14c2486d15b8b502c Mon Sep 17 00:00:00 2001
-From: Dave Taht <dave@taht.net>
-Date: Fri, 14 Dec 2018 18:38:40 +0000
-Subject: [PATCH 1/1] Allow class-e address assignment in ifconfig and early
- boot
-
-While the linux kernel became mostly "class-e clean" a decade ago,
-and most distributions long ago switched to the iproute2 suite
-of utilities, which allow class-e (240.0.0.0/4) address assignment,
-distributions relying on busybox, toybox and other forms of
-ifconfig cannot assign class-e addresses without this kernel patch.
-
-With this patch, also, a boot command line on these addresses is feasible:
-(ip=248.0.1.2::248.0.1.1:255.255.255.0).
-
-While CIDR has been obsolete for 2 decades, and a survey of all the
-userspace open source code in the world shows most IN_whatever macros
-are also obsolete... rather than obsolete CIDR from this ioctl entirely,
-this patch merely enables class-e assignment, sanely.
-
-H/T to Vince Fuller and his original patch here:
- https://lkml.org/lkml/2008/1/7/370
-
-Signed-off-by: Dave Taht <dave.taht@gmail.com>
-Reviewed-by: John Gilmore <gnu@toad.com>
----
- include/uapi/linux/in.h | 8 ++++++--
- net/ipv4/devinet.c | 4 +++-
- net/ipv4/ipconfig.c | 2 ++
- 3 files changed, 11 insertions(+), 3 deletions(-)
-
---- a/include/uapi/linux/in.h
-+++ b/include/uapi/linux/in.h
-@@ -268,8 +268,12 @@ struct sockaddr_in {
- #define IN_MULTICAST(a) IN_CLASSD(a)
- #define IN_MULTICAST_NET 0xF0000000
-
--#define IN_EXPERIMENTAL(a) ((((long int) (a)) & 0xf0000000) == 0xf0000000)
--#define IN_BADCLASS(a) IN_EXPERIMENTAL((a))
-+#define IN_BADCLASS(a) (((long int) (a) ) == (long int)0xffffffff)
-+#define IN_EXPERIMENTAL(a) IN_BADCLASS((a))
-+
-+#define IN_CLASSE(a) ((((long int) (a)) & 0xf0000000) == 0xf0000000)
-+#define IN_CLASSE_NET 0xffffffff
-+#define IN_CLASSE_NSHIFT 0
-
- /* Address to accept any incoming messages. */
- #define INADDR_ANY ((unsigned long int) 0x00000000)
---- a/net/ipv4/devinet.c
-+++ b/net/ipv4/devinet.c
-@@ -949,7 +949,7 @@ static int inet_abc_len(__be32 addr)
- {
- int rc = -1; /* Something else, probably a multicast. */
-
-- if (ipv4_is_zeronet(addr))
-+ if (ipv4_is_zeronet(addr) || ipv4_is_lbcast(addr))
- rc = 0;
- else {
- __u32 haddr = ntohl(addr);
-@@ -960,6 +960,8 @@ static int inet_abc_len(__be32 addr)
- rc = 16;
- else if (IN_CLASSC(haddr))
- rc = 24;
-+ else if (IN_CLASSE(haddr))
-+ rc = 32;
- }
-
- return rc;
---- a/net/ipv4/ipconfig.c
-+++ b/net/ipv4/ipconfig.c
-@@ -429,6 +429,8 @@ static int __init ic_defaults(void)
- ic_netmask = htonl(IN_CLASSB_NET);
- else if (IN_CLASSC(ntohl(ic_myaddr)))
- ic_netmask = htonl(IN_CLASSC_NET);
-+ else if (IN_CLASSE(ntohl(ic_myaddr)))
-+ ic_netmask = htonl(IN_CLASSE_NET);
- else {
- pr_err("IP-Config: Unable to guess netmask for address %pI4\n",
- &ic_myaddr);
+++ /dev/null
-From 4cc30de79d293f1e8c5f50ae3a9c005def9564a0 Mon Sep 17 00:00:00 2001
-From: Koen Vandeputte <koen.vandeputte@ncentric.com>
-Date: Mon, 7 Jan 2019 14:14:27 +0100
-Subject: [PATCH 2/2] arm: cns3xxx: use actual size reads for PCIe
-
-commit 802b7c06adc7 ("ARM: cns3xxx: Convert PCI to use generic config accessors")
-reimplemented cns3xxx_pci_read_config() using pci_generic_config_read32(),
-which preserved the property of only doing 32-bit reads.
-
-It also replaced cns3xxx_pci_write_config() with pci_generic_config_write(),
-so it changed writes from always being 32 bits to being the actual size,
-which works just fine.
-
-Due to:
-- The documentation does not mention that only 32 bit access is allowed.
-- Writes are already executed using the actual size
-- Extensive testing shows that 8b, 16b and 32b reads work as intended
-
-It makes perfectly sense to also swap 32 bit reading in favor of actual size.
-
-Fixes: 802b7c06adc7 ("ARM: cns3xxx: Convert PCI to use generic config accessors")
-Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
-Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
-CC: Arnd Bergmann <arnd@arndb.de>
-CC: Krzysztof Halasa <khalasa@piap.pl>
-CC: Olof Johansson <olof@lixom.net>
-CC: Robin Leblon <robin.leblon@ncentric.com>
-CC: Rob Herring <robh@kernel.org>
-CC: Russell King <linux@armlinux.org.uk>
-CC: Tim Harvey <tharvey@gateworks.com>
-CC: stable@vger.kernel.org # v4.0+
----
- arch/arm/mach-cns3xxx/pcie.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/arm/mach-cns3xxx/pcie.c
-+++ b/arch/arm/mach-cns3xxx/pcie.c
-@@ -93,7 +93,7 @@ static int cns3xxx_pci_read_config(struc
- u32 mask = (0x1ull << (size * 8)) - 1;
- int shift = (where % 4) * 8;
-
-- ret = pci_generic_config_read32(bus, devfn, where, size, val);
-+ ret = pci_generic_config_read(bus, devfn, where, size, val);
-
- if (ret == PCIBIOS_SUCCESSFUL && !bus->number && !devfn &&
- (where & 0xffc) == PCI_CLASS_REVISION)
+++ /dev/null
-From 28b5c129ca6e585ec95c160ec4297bc6c6360b6f Mon Sep 17 00:00:00 2001
-From: Minas Harutyunyan <minas.harutyunyan@synopsys.com>
-Date: Mon, 4 Mar 2019 17:08:07 +0400
-Subject: usb: dwc2: Set lpm mode parameters depend on HW configuration
-
-If core not supported lpm, i.e. BCM2835 then confusing warnings seen
-in log.
-
-To avoid these warnings, added function dwc2_set_param_lpm() to set
-lpm and other lpm related parameters based on lpm support by core.
-
-Signed-off-by: Minas Harutyunyan <hminas@synopsys.com>
-Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
----
- drivers/usb/dwc2/params.c | 23 ++++++++++++++++++-----
- 1 file changed, 18 insertions(+), 5 deletions(-)
-
---- a/drivers/usb/dwc2/params.c
-+++ b/drivers/usb/dwc2/params.c
-@@ -273,6 +273,23 @@ static void dwc2_set_param_power_down(st
- hsotg->params.power_down = val;
- }
-
-+static void dwc2_set_param_lpm(struct dwc2_hsotg *hsotg)
-+{
-+ struct dwc2_core_params *p = &hsotg->params;
-+
-+ p->lpm = hsotg->hw_params.lpm_mode;
-+ if (p->lpm) {
-+ p->lpm_clock_gating = true;
-+ p->besl = true;
-+ p->hird_threshold_en = true;
-+ p->hird_threshold = 4;
-+ } else {
-+ p->lpm_clock_gating = false;
-+ p->besl = false;
-+ p->hird_threshold_en = false;
-+ }
-+}
-+
- /**
- * dwc2_set_default_params() - Set all core parameters to their
- * auto-detected default values.
-@@ -291,6 +308,7 @@ static void dwc2_set_default_params(stru
- dwc2_set_param_speed(hsotg);
- dwc2_set_param_phy_utmi_width(hsotg);
- dwc2_set_param_power_down(hsotg);
-+ dwc2_set_param_lpm(hsotg);
- p->phy_ulpi_ddr = false;
- p->phy_ulpi_ext_vbus = false;
-
-@@ -303,11 +321,6 @@ static void dwc2_set_default_params(stru
- p->reload_ctl = (hw->snpsid >= DWC2_CORE_REV_2_92a);
- p->uframe_sched = true;
- p->external_id_pin_ctl = false;
-- p->lpm = true;
-- p->lpm_clock_gating = true;
-- p->besl = true;
-- p->hird_threshold_en = true;
-- p->hird_threshold = 4;
- p->ipg_isoc_en = false;
- p->max_packet_count = hw->max_packet_count;
- p->max_transfer_size = hw->max_transfer_size;
+++ /dev/null
-From 9966a05c7b80f075f2bc7e48dbb108d3f2927234 Mon Sep 17 00:00:00 2001
-From: Dave Martin <Dave.Martin@arm.com>
-Date: Fri, 4 Jan 2019 13:09:51 +0000
-Subject: [PATCH] arm64/sve: Disentangle <uapi/asm/ptrace.h> from
- <uapi/asm/sigcontext.h>
-
-Currently, <uapi/asm/sigcontext.h> provides common definitions for
-describing SVE context structures that are also used by the ptrace
-definitions in <uapi/asm/ptrace.h>.
-
-For this reason, a #include of <asm/sigcontext.h> was added in
-ptrace.h, but it this turns out that this can interact badly with
-userspace code that tries to include ptrace.h on top of the libc
-headers (which may provide their own shadow definitions for
-sigcontext.h).
-
-To make the headers easier for userspace to consume, this patch
-bounces the common definitions into an __SVE_* namespace and moves
-them to a backend header <uapi/asm/sve_context.h> that can be
-included by the other headers as appropriate. This should allow
-ptrace.h to be used alongside libc's sigcontext.h (if any) without
-ill effects.
-
-This should make the situation unambiguous: <asm/sigcontext.h> is
-the header to include for the sigframe-specific definitions, while
-<asm/ptrace.h> is the header to include for ptrace-specific
-definitions.
-
-To avoid conflicting with existing usage, <asm/sigcontext.h>
-remains the canonical way to get the common definitions for
-SVE_VQ_MIN, sve_vq_from_vl() etc., both in userspace and in the
-kernel: relying on these being defined as a side effect of
-including just <asm/ptrace.h> was never intended to be safe.
-
-Signed-off-by: Dave Martin <Dave.Martin@arm.com>
-Signed-off-by: Will Deacon <will.deacon@arm.com>
----
- arch/arm64/include/uapi/asm/ptrace.h | 39 ++++++++--------
- arch/arm64/include/uapi/asm/sigcontext.h | 56 +++++++++++------------
- arch/arm64/include/uapi/asm/sve_context.h | 53 +++++++++++++++++++++
- 3 files changed, 99 insertions(+), 49 deletions(-)
- create mode 100644 arch/arm64/include/uapi/asm/sve_context.h
-
---- a/arch/arm64/include/uapi/asm/ptrace.h
-+++ b/arch/arm64/include/uapi/asm/ptrace.h
-@@ -23,7 +23,7 @@
- #include <linux/types.h>
-
- #include <asm/hwcap.h>
--#include <asm/sigcontext.h>
-+#include <asm/sve_context.h>
-
-
- /*
-@@ -129,9 +129,9 @@ struct user_sve_header {
- */
-
- /* Offset from the start of struct user_sve_header to the register data */
--#define SVE_PT_REGS_OFFSET \
-- ((sizeof(struct user_sve_header) + (SVE_VQ_BYTES - 1)) \
-- / SVE_VQ_BYTES * SVE_VQ_BYTES)
-+#define SVE_PT_REGS_OFFSET \
-+ ((sizeof(struct user_sve_header) + (__SVE_VQ_BYTES - 1)) \
-+ / __SVE_VQ_BYTES * __SVE_VQ_BYTES)
-
- /*
- * The register data content and layout depends on the value of the
-@@ -177,39 +177,36 @@ struct user_sve_header {
- * Additional data might be appended in the future.
- */
-
--#define SVE_PT_SVE_ZREG_SIZE(vq) SVE_SIG_ZREG_SIZE(vq)
--#define SVE_PT_SVE_PREG_SIZE(vq) SVE_SIG_PREG_SIZE(vq)
--#define SVE_PT_SVE_FFR_SIZE(vq) SVE_SIG_FFR_SIZE(vq)
-+#define SVE_PT_SVE_ZREG_SIZE(vq) __SVE_ZREG_SIZE(vq)
-+#define SVE_PT_SVE_PREG_SIZE(vq) __SVE_PREG_SIZE(vq)
-+#define SVE_PT_SVE_FFR_SIZE(vq) __SVE_FFR_SIZE(vq)
- #define SVE_PT_SVE_FPSR_SIZE sizeof(__u32)
- #define SVE_PT_SVE_FPCR_SIZE sizeof(__u32)
-
--#define __SVE_SIG_TO_PT(offset) \
-- ((offset) - SVE_SIG_REGS_OFFSET + SVE_PT_REGS_OFFSET)
--
- #define SVE_PT_SVE_OFFSET SVE_PT_REGS_OFFSET
-
- #define SVE_PT_SVE_ZREGS_OFFSET \
-- __SVE_SIG_TO_PT(SVE_SIG_ZREGS_OFFSET)
-+ (SVE_PT_REGS_OFFSET + __SVE_ZREGS_OFFSET)
- #define SVE_PT_SVE_ZREG_OFFSET(vq, n) \
-- __SVE_SIG_TO_PT(SVE_SIG_ZREG_OFFSET(vq, n))
-+ (SVE_PT_REGS_OFFSET + __SVE_ZREG_OFFSET(vq, n))
- #define SVE_PT_SVE_ZREGS_SIZE(vq) \
-- (SVE_PT_SVE_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_PT_SVE_ZREGS_OFFSET)
-+ (SVE_PT_SVE_ZREG_OFFSET(vq, __SVE_NUM_ZREGS) - SVE_PT_SVE_ZREGS_OFFSET)
-
- #define SVE_PT_SVE_PREGS_OFFSET(vq) \
-- __SVE_SIG_TO_PT(SVE_SIG_PREGS_OFFSET(vq))
-+ (SVE_PT_REGS_OFFSET + __SVE_PREGS_OFFSET(vq))
- #define SVE_PT_SVE_PREG_OFFSET(vq, n) \
-- __SVE_SIG_TO_PT(SVE_SIG_PREG_OFFSET(vq, n))
-+ (SVE_PT_REGS_OFFSET + __SVE_PREG_OFFSET(vq, n))
- #define SVE_PT_SVE_PREGS_SIZE(vq) \
-- (SVE_PT_SVE_PREG_OFFSET(vq, SVE_NUM_PREGS) - \
-+ (SVE_PT_SVE_PREG_OFFSET(vq, __SVE_NUM_PREGS) - \
- SVE_PT_SVE_PREGS_OFFSET(vq))
-
- #define SVE_PT_SVE_FFR_OFFSET(vq) \
-- __SVE_SIG_TO_PT(SVE_SIG_FFR_OFFSET(vq))
-+ (SVE_PT_REGS_OFFSET + __SVE_FFR_OFFSET(vq))
-
- #define SVE_PT_SVE_FPSR_OFFSET(vq) \
- ((SVE_PT_SVE_FFR_OFFSET(vq) + SVE_PT_SVE_FFR_SIZE(vq) + \
-- (SVE_VQ_BYTES - 1)) \
-- / SVE_VQ_BYTES * SVE_VQ_BYTES)
-+ (__SVE_VQ_BYTES - 1)) \
-+ / __SVE_VQ_BYTES * __SVE_VQ_BYTES)
- #define SVE_PT_SVE_FPCR_OFFSET(vq) \
- (SVE_PT_SVE_FPSR_OFFSET(vq) + SVE_PT_SVE_FPSR_SIZE)
-
-@@ -220,8 +217,8 @@ struct user_sve_header {
-
- #define SVE_PT_SVE_SIZE(vq, flags) \
- ((SVE_PT_SVE_FPCR_OFFSET(vq) + SVE_PT_SVE_FPCR_SIZE \
-- - SVE_PT_SVE_OFFSET + (SVE_VQ_BYTES - 1)) \
-- / SVE_VQ_BYTES * SVE_VQ_BYTES)
-+ - SVE_PT_SVE_OFFSET + (__SVE_VQ_BYTES - 1)) \
-+ / __SVE_VQ_BYTES * __SVE_VQ_BYTES)
-
- #define SVE_PT_SIZE(vq, flags) \
- (((flags) & SVE_PT_REGS_MASK) == SVE_PT_REGS_SVE ? \
---- a/arch/arm64/include/uapi/asm/sigcontext.h
-+++ b/arch/arm64/include/uapi/asm/sigcontext.h
-@@ -130,6 +130,8 @@ struct sve_context {
-
- #endif /* !__ASSEMBLY__ */
-
-+#include <asm/sve_context.h>
-+
- /*
- * The SVE architecture leaves space for future expansion of the
- * vector length beyond its initial architectural limit of 2048 bits
-@@ -138,21 +140,20 @@ struct sve_context {
- * See linux/Documentation/arm64/sve.txt for a description of the VL/VQ
- * terminology.
- */
--#define SVE_VQ_BYTES 16 /* number of bytes per quadword */
-+#define SVE_VQ_BYTES __SVE_VQ_BYTES /* bytes per quadword */
-
--#define SVE_VQ_MIN 1
--#define SVE_VQ_MAX 512
-+#define SVE_VQ_MIN __SVE_VQ_MIN
-+#define SVE_VQ_MAX __SVE_VQ_MAX
-
--#define SVE_VL_MIN (SVE_VQ_MIN * SVE_VQ_BYTES)
--#define SVE_VL_MAX (SVE_VQ_MAX * SVE_VQ_BYTES)
-+#define SVE_VL_MIN __SVE_VL_MIN
-+#define SVE_VL_MAX __SVE_VL_MAX
-
--#define SVE_NUM_ZREGS 32
--#define SVE_NUM_PREGS 16
-+#define SVE_NUM_ZREGS __SVE_NUM_ZREGS
-+#define SVE_NUM_PREGS __SVE_NUM_PREGS
-
--#define sve_vl_valid(vl) \
-- ((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX)
--#define sve_vq_from_vl(vl) ((vl) / SVE_VQ_BYTES)
--#define sve_vl_from_vq(vq) ((vq) * SVE_VQ_BYTES)
-+#define sve_vl_valid(vl) __sve_vl_valid(vl)
-+#define sve_vq_from_vl(vl) __sve_vq_from_vl(vl)
-+#define sve_vl_from_vq(vq) __sve_vl_from_vq(vq)
-
- /*
- * If the SVE registers are currently live for the thread at signal delivery,
-@@ -205,34 +206,33 @@ struct sve_context {
- * Additional data might be appended in the future.
- */
-
--#define SVE_SIG_ZREG_SIZE(vq) ((__u32)(vq) * SVE_VQ_BYTES)
--#define SVE_SIG_PREG_SIZE(vq) ((__u32)(vq) * (SVE_VQ_BYTES / 8))
--#define SVE_SIG_FFR_SIZE(vq) SVE_SIG_PREG_SIZE(vq)
-+#define SVE_SIG_ZREG_SIZE(vq) __SVE_ZREG_SIZE(vq)
-+#define SVE_SIG_PREG_SIZE(vq) __SVE_PREG_SIZE(vq)
-+#define SVE_SIG_FFR_SIZE(vq) __SVE_FFR_SIZE(vq)
-
- #define SVE_SIG_REGS_OFFSET \
-- ((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1)) \
-- / SVE_VQ_BYTES * SVE_VQ_BYTES)
-+ ((sizeof(struct sve_context) + (__SVE_VQ_BYTES - 1)) \
-+ / __SVE_VQ_BYTES * __SVE_VQ_BYTES)
-
--#define SVE_SIG_ZREGS_OFFSET SVE_SIG_REGS_OFFSET
-+#define SVE_SIG_ZREGS_OFFSET \
-+ (SVE_SIG_REGS_OFFSET + __SVE_ZREGS_OFFSET)
- #define SVE_SIG_ZREG_OFFSET(vq, n) \
-- (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREG_SIZE(vq) * (n))
--#define SVE_SIG_ZREGS_SIZE(vq) \
-- (SVE_SIG_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_SIG_ZREGS_OFFSET)
-+ (SVE_SIG_REGS_OFFSET + __SVE_ZREG_OFFSET(vq, n))
-+#define SVE_SIG_ZREGS_SIZE(vq) __SVE_ZREGS_SIZE(vq)
-
- #define SVE_SIG_PREGS_OFFSET(vq) \
-- (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREGS_SIZE(vq))
-+ (SVE_SIG_REGS_OFFSET + __SVE_PREGS_OFFSET(vq))
- #define SVE_SIG_PREG_OFFSET(vq, n) \
-- (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREG_SIZE(vq) * (n))
--#define SVE_SIG_PREGS_SIZE(vq) \
-- (SVE_SIG_PREG_OFFSET(vq, SVE_NUM_PREGS) - SVE_SIG_PREGS_OFFSET(vq))
-+ (SVE_SIG_REGS_OFFSET + __SVE_PREG_OFFSET(vq, n))
-+#define SVE_SIG_PREGS_SIZE(vq) __SVE_PREGS_SIZE(vq)
-
- #define SVE_SIG_FFR_OFFSET(vq) \
-- (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREGS_SIZE(vq))
-+ (SVE_SIG_REGS_OFFSET + __SVE_FFR_OFFSET(vq))
-
- #define SVE_SIG_REGS_SIZE(vq) \
-- (SVE_SIG_FFR_OFFSET(vq) + SVE_SIG_FFR_SIZE(vq) - SVE_SIG_REGS_OFFSET)
--
--#define SVE_SIG_CONTEXT_SIZE(vq) (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq))
-+ (__SVE_FFR_OFFSET(vq) + __SVE_FFR_SIZE(vq))
-
-+#define SVE_SIG_CONTEXT_SIZE(vq) \
-+ (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq))
-
- #endif /* _UAPI__ASM_SIGCONTEXT_H */
---- /dev/null
-+++ b/arch/arm64/include/uapi/asm/sve_context.h
-@@ -0,0 +1,53 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-+/* Copyright (C) 2017-2018 ARM Limited */
-+
-+/*
-+ * For use by other UAPI headers only.
-+ * Do not make direct use of header or its definitions.
-+ */
-+
-+#ifndef _UAPI__ASM_SVE_CONTEXT_H
-+#define _UAPI__ASM_SVE_CONTEXT_H
-+
-+#include <linux/types.h>
-+
-+#define __SVE_VQ_BYTES 16 /* number of bytes per quadword */
-+
-+#define __SVE_VQ_MIN 1
-+#define __SVE_VQ_MAX 512
-+
-+#define __SVE_VL_MIN (__SVE_VQ_MIN * __SVE_VQ_BYTES)
-+#define __SVE_VL_MAX (__SVE_VQ_MAX * __SVE_VQ_BYTES)
-+
-+#define __SVE_NUM_ZREGS 32
-+#define __SVE_NUM_PREGS 16
-+
-+#define __sve_vl_valid(vl) \
-+ ((vl) % __SVE_VQ_BYTES == 0 && \
-+ (vl) >= __SVE_VL_MIN && \
-+ (vl) <= __SVE_VL_MAX)
-+
-+#define __sve_vq_from_vl(vl) ((vl) / __SVE_VQ_BYTES)
-+#define __sve_vl_from_vq(vq) ((vq) * __SVE_VQ_BYTES)
-+
-+#define __SVE_ZREG_SIZE(vq) ((__u32)(vq) * __SVE_VQ_BYTES)
-+#define __SVE_PREG_SIZE(vq) ((__u32)(vq) * (__SVE_VQ_BYTES / 8))
-+#define __SVE_FFR_SIZE(vq) __SVE_PREG_SIZE(vq)
-+
-+#define __SVE_ZREGS_OFFSET 0
-+#define __SVE_ZREG_OFFSET(vq, n) \
-+ (__SVE_ZREGS_OFFSET + __SVE_ZREG_SIZE(vq) * (n))
-+#define __SVE_ZREGS_SIZE(vq) \
-+ (__SVE_ZREG_OFFSET(vq, __SVE_NUM_ZREGS) - __SVE_ZREGS_OFFSET)
-+
-+#define __SVE_PREGS_OFFSET(vq) \
-+ (__SVE_ZREGS_OFFSET + __SVE_ZREGS_SIZE(vq))
-+#define __SVE_PREG_OFFSET(vq, n) \
-+ (__SVE_PREGS_OFFSET(vq) + __SVE_PREG_SIZE(vq) * (n))
-+#define __SVE_PREGS_SIZE(vq) \
-+ (__SVE_PREG_OFFSET(vq, __SVE_NUM_PREGS) - __SVE_PREGS_OFFSET(vq))
-+
-+#define __SVE_FFR_OFFSET(vq) \
-+ (__SVE_PREGS_OFFSET(vq) + __SVE_PREGS_SIZE(vq))
-+
-+#endif /* ! _UAPI__ASM_SVE_CONTEXT_H */
--- a/net/netfilter/nf_flow_table_core.c
+++ b/net/netfilter/nf_flow_table_core.c
-@@ -535,5 +535,35 @@ void nf_flow_table_free(struct nf_flowta
+@@ -529,5 +529,35 @@ void nf_flow_table_free(struct nf_flowta
}
EXPORT_SYMBOL_GPL(nf_flow_table_free);
+ if (event != NETDEV_DOWN)
+ return NOTIFY_DONE;
+
-+ nf_flow_table_cleanup(dev_net(dev), dev);
++ nf_flow_table_cleanup(dev);
+
+ return NOTIFY_DONE;
+}
MODULE_AUTHOR("Pablo Neira Ayuso <pablo@netfilter.org>");
--- a/net/netfilter/nft_flow_offload.c
+++ b/net/netfilter/nft_flow_offload.c
-@@ -216,47 +216,14 @@ static struct nft_expr_type nft_flow_off
+@@ -234,47 +234,14 @@ static struct nft_expr_type nft_flow_off
.owner = THIS_MODULE,
};
- if (event != NETDEV_DOWN)
- return NOTIFY_DONE;
-
-- nf_flow_table_cleanup(dev_net(dev), dev);
+- nf_flow_table_cleanup(dev);
-
- return NOTIFY_DONE;
-}
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
-@@ -1178,18 +1178,6 @@ static bool gc_worker_can_early_drop(con
+@@ -1206,18 +1206,6 @@ static bool gc_worker_can_early_drop(con
return false;
}
static void gc_worker(struct work_struct *work)
{
unsigned int min_interval = max(HZ / GC_MAX_BUCKETS_DIV, 1u);
-@@ -1226,10 +1214,8 @@ static void gc_worker(struct work_struct
+@@ -1254,10 +1242,8 @@ static void gc_worker(struct work_struct
tmp = nf_ct_tuplehash_to_ctrack(h);
scanned++;
nf_ct_gc_expired(tmp);
--- a/net/netfilter/nf_flow_table_core.c
+++ b/net/netfilter/nf_flow_table_core.c
-@@ -183,10 +183,29 @@ static const struct rhashtable_params nf
+@@ -198,10 +198,29 @@ static const struct rhashtable_params nf
.automatic_shrinking = true,
};
flow->timeout = (u32)jiffies + NF_FLOW_TIMEOUT;
err = rhashtable_insert_fast(&flow_table->rhashtable,
-@@ -317,6 +336,8 @@ static int nf_flow_offload_gc_step(struc
+@@ -304,6 +323,7 @@ nf_flow_table_iterate(struct nf_flowtabl
rhashtable_walk_start(&hti);
while ((tuplehash = rhashtable_walk_next(&hti))) {
-+ bool teardown;
+
if (IS_ERR(tuplehash)) {
- err = PTR_ERR(tuplehash);
- if (err != -EAGAIN)
-@@ -329,9 +350,13 @@ static int nf_flow_offload_gc_step(struc
-
- flow = container_of(tuplehash, struct flow_offload, tuplehash[0]);
+ if (PTR_ERR(tuplehash) != -EAGAIN) {
+ err = PTR_ERR(tuplehash);
+@@ -328,10 +348,17 @@ static void nf_flow_offload_gc_step(stru
+ {
+ struct nf_flowtable *flow_table = data;
+ struct flow_offload_entry *e;
++ bool teardown;
-- if (nf_flow_has_expired(flow) ||
-- (flow->flags & (FLOW_OFFLOAD_DYING |
-- FLOW_OFFLOAD_TEARDOWN)))
-+ teardown = flow->flags & (FLOW_OFFLOAD_DYING |
-+ FLOW_OFFLOAD_TEARDOWN);
+ e = container_of(flow, struct flow_offload_entry, flow);
+- if (nf_flow_has_expired(flow) || nf_ct_is_dying(e->ct) ||
+- (flow->flags & (FLOW_OFFLOAD_DYING | FLOW_OFFLOAD_TEARDOWN)))
++
++ teardown = flow->flags & (FLOW_OFFLOAD_DYING |
++ FLOW_OFFLOAD_TEARDOWN);
+
-+ if (!teardown)
-+ nf_ct_offload_timeout(flow);
++ if (!teardown)
++ nf_ct_offload_timeout(flow);
+
-+ if (nf_flow_has_expired(flow) || teardown)
- flow_offload_del(flow_table, flow);
- }
- out:
++ if (nf_flow_has_expired(flow) || teardown)
+ flow_offload_del(flow_table, flow);
+ }
+
--- a/net/netfilter/nf_flow_table_core.c
+++ b/net/netfilter/nf_flow_table_core.c
-@@ -243,6 +243,9 @@ static void flow_offload_del(struct nf_f
- e = container_of(flow, struct flow_offload_entry, flow);
- clear_bit(IPS_OFFLOAD_BIT, &e->ct->status);
+@@ -268,6 +268,9 @@ static void flow_offload_del(struct nf_f
+ else if (flow->flags & FLOW_OFFLOAD_TEARDOWN)
+ flow_offload_fixup_ct_timeout(e->ct);
+ if (!(flow->flags & FLOW_OFFLOAD_TEARDOWN))
+ flow_offload_fixup_ct_state(e->ct);
+++ /dev/null
-From d129a72f465dab2d9fc8f1580c38600a8b808327 Mon Sep 17 00:00:00 2001
-From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
-Date: Wed, 13 Mar 2019 20:54:49 +0000
-Subject: [PATCH] net: sched: Backport Introduce act_ctinfo action
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-ctinfo is a new tc filter action module. It is designed to restore
-information contained in firewall conntrack marks to other packet fields
-and is typically used on packet ingress paths. At present it has two
-independent sub-functions or operating modes, DSCP restoration mode &
-skb mark restoration mode.
-
-The DSCP restore mode:
-
-This mode copies DSCP values that have been placed in the firewall
-conntrack mark back into the IPv4/v6 diffserv fields of relevant
-packets.
-
-The DSCP restoration is intended for use and has been found useful for
-restoring ingress classifications based on egress classifications across
-links that bleach or otherwise change DSCP, typically home ISP Internet
-links. Restoring DSCP on ingress on the WAN link allows qdiscs such as
-but by no means limited to CAKE to shape inbound packets according to
-policies that are easier to set & mark on egress.
-
-Ingress classification is traditionally a challenging task since
-iptables rules haven't yet run and tc filter/eBPF programs are pre-NAT
-lookups, hence are unable to see internal IPv4 addresses as used on the
-typical home masquerading gateway. Thus marking the connection in some
-manner on egress for later restoration of classification on ingress is
-easier to implement.
-
-Parameters related to DSCP restore mode:
-
-dscpmask - a 32 bit mask of 6 contiguous bits and indicate bits of the
-conntrack mark field contain the DSCP value to be restored.
-
-statemask - a 32 bit mask of (usually) 1 bit length, outside the area
-specified by dscpmask. This represents a conditional operation flag
-whereby the DSCP is only restored if the flag is set. This is useful to
-implement a 'one shot' iptables based classification where the
-'complicated' iptables rules are only run once to classify the
-connection on initial (egress) packet and subsequent packets are all
-marked/restored with the same DSCP. A mask of zero disables the
-conditional behaviour ie. the conntrack mark DSCP bits are always
-restored to the ip diffserv field (assuming the conntrack entry is found
-& the skb is an ipv4/ipv6 type)
-
-e.g. dscpmask 0xfc000000 statemask 0x01000000
-
-|----0xFC----conntrack mark----000000---|
-| Bits 31-26 | bit 25 | bit24 |~~~ Bit 0|
-| DSCP | unused | flag |unused |
-|-----------------------0x01---000000---|
- | |
- | |
- ---| Conditional flag
- v only restore if set
-|-ip diffserv-|
-| 6 bits |
-|-------------|
-
-The skb mark restore mode (cpmark):
-
-This mode copies the firewall conntrack mark to the skb's mark field.
-It is completely the functional equivalent of the existing act_connmark
-action with the additional feature of being able to apply a mask to the
-restored value.
-
-Parameters related to skb mark restore mode:
-
-mask - a 32 bit mask applied to the firewall conntrack mark to mask out
-bits unwanted for restoration. This can be useful where the conntrack
-mark is being used for different purposes by different applications. If
-not specified and by default the whole mark field is copied (i.e.
-default mask of 0xffffffff)
-
-e.g. mask 0x00ffffff to mask out the top 8 bits being used by the
-aforementioned DSCP restore mode.
-
-|----0x00----conntrack mark----ffffff---|
-| Bits 31-24 | |
-| DSCP & flag| some value here |
-|---------------------------------------|
- |
- |
- v
-|------------skb mark-------------------|
-| | |
-| zeroed | |
-|---------------------------------------|
-
-Overall parameters:
-
-zone - conntrack zone
-
-control - action related control (reclassify | pipe | drop | continue |
-ok | goto chain <CHAIN_INDEX>)
-
-Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
-Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com>
-Acked-by: Cong Wang <xiyou.wangcong@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-
-Backport
-Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
----
- include/net/tc_act/tc_ctinfo.h | 33 ++
- include/uapi/linux/pkt_cls.h | 3 +-
- include/uapi/linux/tc_act/tc_ctinfo.h | 29 ++
- net/sched/Kconfig | 17 +
- net/sched/Makefile | 1 +
- net/sched/act_ctinfo.c | 420 ++++++++++++++++++++++
- tools/testing/selftests/tc-testing/config | 1 +
- 7 files changed, 503 insertions(+), 1 deletion(-)
- create mode 100644 include/net/tc_act/tc_ctinfo.h
- create mode 100644 include/uapi/linux/tc_act/tc_ctinfo.h
- create mode 100644 net/sched/act_ctinfo.c
-
---- /dev/null
-+++ b/include/net/tc_act/tc_ctinfo.h
-@@ -0,0 +1,33 @@
-+/* SPDX-License-Identifier: GPL-2.0 */
-+#ifndef __NET_TC_CTINFO_H
-+#define __NET_TC_CTINFO_H
-+
-+#include <net/act_api.h>
-+
-+struct tcf_ctinfo_params {
-+ struct rcu_head rcu;
-+ struct net *net;
-+ u32 dscpmask;
-+ u32 dscpstatemask;
-+ u32 cpmarkmask;
-+ u16 zone;
-+ u8 mode;
-+ u8 dscpmaskshift;
-+};
-+
-+struct tcf_ctinfo {
-+ struct tc_action common;
-+ struct tcf_ctinfo_params __rcu *params;
-+ u64 stats_dscp_set;
-+ u64 stats_dscp_error;
-+ u64 stats_cpmark_set;
-+};
-+
-+enum {
-+ CTINFO_MODE_DSCP = BIT(0),
-+ CTINFO_MODE_CPMARK = BIT(1)
-+};
-+
-+#define to_ctinfo(a) ((struct tcf_ctinfo *)a)
-+
-+#endif /* __NET_TC_CTINFO_H */
---- a/include/uapi/linux/pkt_cls.h
-+++ b/include/uapi/linux/pkt_cls.h
-@@ -68,7 +68,8 @@ enum {
- TCA_ID_UNSPEC=0,
- TCA_ID_POLICE=1,
- /* other actions go here */
-- __TCA_ID_MAX=255
-+ TCA_ID_CTINFO,
-+ __TCA_ID_MAX = 255
- };
-
- #define TCA_ID_MAX __TCA_ID_MAX
---- /dev/null
-+++ b/include/uapi/linux/tc_act/tc_ctinfo.h
-@@ -0,0 +1,29 @@
-+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-+#ifndef __UAPI_TC_CTINFO_H
-+#define __UAPI_TC_CTINFO_H
-+
-+#include <linux/types.h>
-+#include <linux/pkt_cls.h>
-+
-+struct tc_ctinfo {
-+ tc_gen;
-+};
-+
-+enum {
-+ TCA_CTINFO_UNSPEC,
-+ TCA_CTINFO_PAD,
-+ TCA_CTINFO_TM,
-+ TCA_CTINFO_ACT,
-+ TCA_CTINFO_ZONE,
-+ TCA_CTINFO_PARMS_DSCP_MASK,
-+ TCA_CTINFO_PARMS_DSCP_STATEMASK,
-+ TCA_CTINFO_PARMS_CPMARK_MASK,
-+ TCA_CTINFO_STATS_DSCP_SET,
-+ TCA_CTINFO_STATS_DSCP_ERROR,
-+ TCA_CTINFO_STATS_CPMARK_SET,
-+ __TCA_CTINFO_MAX
-+};
-+
-+#define TCA_CTINFO_MAX (__TCA_CTINFO_MAX - 1)
-+
-+#endif
---- a/net/sched/Kconfig
-+++ b/net/sched/Kconfig
-@@ -866,6 +866,23 @@ config NET_ACT_CONNMARK
- To compile this code as a module, choose M here: the
- module will be called act_connmark.
-
-+config NET_ACT_CTINFO
-+ tristate "Netfilter Connection Mark Actions"
-+ depends on NET_CLS_ACT && NETFILTER && IP_NF_IPTABLES
-+ depends on NF_CONNTRACK && NF_CONNTRACK_MARK
-+ help
-+ Say Y here to allow transfer of a connmark stored information.
-+ Current actions transfer connmark stored DSCP into
-+ ipv4/v6 diffserv and/or to transfer connmark to packet
-+ mark. Both are useful for restoring egress based marks
-+ back onto ingress connections for qdisc priority mapping
-+ purposes.
-+
-+ If unsure, say N.
-+
-+ To compile this code as a module, choose M here: the
-+ module will be called act_ctinfo.
-+
- config NET_ACT_SKBMOD
- tristate "skb data modification action"
- depends on NET_CLS_ACT
---- a/net/sched/Makefile
-+++ b/net/sched/Makefile
-@@ -21,6 +21,7 @@ obj-$(CONFIG_NET_ACT_CSUM) += act_csum.o
- obj-$(CONFIG_NET_ACT_VLAN) += act_vlan.o
- obj-$(CONFIG_NET_ACT_BPF) += act_bpf.o
- obj-$(CONFIG_NET_ACT_CONNMARK) += act_connmark.o
-+obj-$(CONFIG_NET_ACT_CTINFO) += act_ctinfo.o
- obj-$(CONFIG_NET_ACT_SKBMOD) += act_skbmod.o
- obj-$(CONFIG_NET_ACT_IFE) += act_ife.o
- obj-$(CONFIG_NET_IFE_SKBMARK) += act_meta_mark.o
---- /dev/null
-+++ b/net/sched/act_ctinfo.c
-@@ -0,0 +1,420 @@
-+// SPDX-License-Identifier: GPL-2.0+
-+/* net/sched/act_ctinfo.c netfilter ctinfo connmark actions
-+ *
-+ * Copyright (c) 2019 Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/skbuff.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/pkt_cls.h>
-+#include <linux/ip.h>
-+#include <linux/ipv6.h>
-+#include <net/netlink.h>
-+#include <net/pkt_sched.h>
-+#include <net/act_api.h>
-+#include <net/pkt_cls.h>
-+#include <uapi/linux/tc_act/tc_ctinfo.h>
-+#include <net/tc_act/tc_ctinfo.h>
-+
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_core.h>
-+#include <net/netfilter/nf_conntrack_ecache.h>
-+#include <net/netfilter/nf_conntrack_zones.h>
-+
-+static struct tc_action_ops act_ctinfo_ops;
-+static unsigned int ctinfo_net_id;
-+
-+static void tcf_ctinfo_dscp_set(struct nf_conn *ct, struct tcf_ctinfo *ca,
-+ struct tcf_ctinfo_params *cp,
-+ struct sk_buff *skb, int wlen, int proto)
-+{
-+ u8 dscp, newdscp;
-+
-+ newdscp = (((ct->mark & cp->dscpmask) >> cp->dscpmaskshift) << 2) &
-+ ~INET_ECN_MASK;
-+
-+ switch (proto) {
-+ case NFPROTO_IPV4:
-+ dscp = ipv4_get_dsfield(ip_hdr(skb)) & ~INET_ECN_MASK;
-+ if (dscp != newdscp) {
-+ if (likely(!skb_try_make_writable(skb, wlen))) {
-+ ipv4_change_dsfield(ip_hdr(skb),
-+ INET_ECN_MASK,
-+ newdscp);
-+ ca->stats_dscp_set++;
-+ } else {
-+ ca->stats_dscp_error++;
-+ }
-+ }
-+ break;
-+ case NFPROTO_IPV6:
-+ dscp = ipv6_get_dsfield(ipv6_hdr(skb)) & ~INET_ECN_MASK;
-+ if (dscp != newdscp) {
-+ if (likely(!skb_try_make_writable(skb, wlen))) {
-+ ipv6_change_dsfield(ipv6_hdr(skb),
-+ INET_ECN_MASK,
-+ newdscp);
-+ ca->stats_dscp_set++;
-+ } else {
-+ ca->stats_dscp_error++;
-+ }
-+ }
-+ break;
-+ default:
-+ break;
-+ }
-+}
-+
-+static void tcf_ctinfo_cpmark_set(struct nf_conn *ct, struct tcf_ctinfo *ca,
-+ struct tcf_ctinfo_params *cp,
-+ struct sk_buff *skb)
-+{
-+ ca->stats_cpmark_set++;
-+ skb->mark = ct->mark & cp->cpmarkmask;
-+}
-+
-+static int tcf_ctinfo_act(struct sk_buff *skb, const struct tc_action *a,
-+ struct tcf_result *res)
-+{
-+ const struct nf_conntrack_tuple_hash *thash = NULL;
-+ struct tcf_ctinfo *ca = to_ctinfo(a);
-+ struct nf_conntrack_tuple tuple;
-+ struct nf_conntrack_zone zone;
-+ enum ip_conntrack_info ctinfo;
-+ struct tcf_ctinfo_params *cp;
-+ struct nf_conn *ct;
-+ int proto, wlen;
-+ int action;
-+
-+ cp = rcu_dereference_bh(ca->params);
-+
-+ tcf_lastuse_update(&ca->tcf_tm);
-+ bstats_update(&ca->tcf_bstats, skb);
-+ action = READ_ONCE(ca->tcf_action);
-+
-+ wlen = skb_network_offset(skb);
-+ if (tc_skb_protocol(skb) == htons(ETH_P_IP)) {
-+ wlen += sizeof(struct iphdr);
-+ if (!pskb_may_pull(skb, wlen))
-+ goto out;
-+
-+ proto = NFPROTO_IPV4;
-+ } else if (tc_skb_protocol(skb) == htons(ETH_P_IPV6)) {
-+ wlen += sizeof(struct ipv6hdr);
-+ if (!pskb_may_pull(skb, wlen))
-+ goto out;
-+
-+ proto = NFPROTO_IPV6;
-+ } else {
-+ goto out;
-+ }
-+
-+ ct = nf_ct_get(skb, &ctinfo);
-+ if (!ct) { /* look harder, usually ingress */
-+ if (!nf_ct_get_tuplepr(skb, skb_network_offset(skb),
-+ proto, cp->net, &tuple))
-+ goto out;
-+ zone.id = cp->zone;
-+ zone.dir = NF_CT_DEFAULT_ZONE_DIR;
-+
-+ thash = nf_conntrack_find_get(cp->net, &zone, &tuple);
-+ if (!thash)
-+ goto out;
-+
-+ ct = nf_ct_tuplehash_to_ctrack(thash);
-+ }
-+
-+ if (cp->mode & CTINFO_MODE_DSCP)
-+ if (!cp->dscpstatemask || (ct->mark & cp->dscpstatemask))
-+ tcf_ctinfo_dscp_set(ct, ca, cp, skb, wlen, proto);
-+
-+ if (cp->mode & CTINFO_MODE_CPMARK)
-+ tcf_ctinfo_cpmark_set(ct, ca, cp, skb);
-+
-+ if (thash)
-+ nf_ct_put(ct);
-+out:
-+ return action;
-+}
-+
-+static const struct nla_policy ctinfo_policy[TCA_CTINFO_MAX + 1] = {
-+ [TCA_CTINFO_ACT] = { .len = sizeof(struct
-+ tc_ctinfo) },
-+ [TCA_CTINFO_ZONE] = { .type = NLA_U16 },
-+ [TCA_CTINFO_PARMS_DSCP_MASK] = { .type = NLA_U32 },
-+ [TCA_CTINFO_PARMS_DSCP_STATEMASK] = { .type = NLA_U32 },
-+ [TCA_CTINFO_PARMS_CPMARK_MASK] = { .type = NLA_U32 },
-+};
-+
-+static int tcf_ctinfo_init(struct net *net, struct nlattr *nla,
-+ struct nlattr *est, struct tc_action **a,
-+ int ovr, int bind, bool rtnl_held,
-+ struct netlink_ext_ack *extack)
-+{
-+ struct tc_action_net *tn = net_generic(net, ctinfo_net_id);
-+ u32 dscpmask = 0, dscpstatemask, index;
-+ struct nlattr *tb[TCA_CTINFO_MAX + 1];
-+ struct tcf_ctinfo_params *cp_new;
-+/* struct tcf_chain *goto_ch = NULL; */
-+ struct tc_ctinfo *actparm;
-+ struct tcf_ctinfo *ci;
-+ u8 dscpmaskshift;
-+ int ret = 0, err;
-+
-+ if (!nla) {
-+ NL_SET_ERR_MSG_MOD(extack, "ctinfo requires attributes to be passed");
-+ return -EINVAL;
-+ }
-+
-+ err = nla_parse_nested(tb, TCA_CTINFO_MAX, nla, ctinfo_policy, extack);
-+ if (err < 0)
-+ return err;
-+
-+ if (!tb[TCA_CTINFO_ACT]) {
-+ NL_SET_ERR_MSG_MOD(extack,
-+ "Missing required TCA_CTINFO_ACT attribute");
-+ return -EINVAL;
-+ }
-+ actparm = nla_data(tb[TCA_CTINFO_ACT]);
-+
-+ /* do some basic validation here before dynamically allocating things */
-+ /* that we would otherwise have to clean up. */
-+ if (tb[TCA_CTINFO_PARMS_DSCP_MASK]) {
-+ dscpmask = nla_get_u32(tb[TCA_CTINFO_PARMS_DSCP_MASK]);
-+ /* need contiguous 6 bit mask */
-+ dscpmaskshift = dscpmask ? __ffs(dscpmask) : 0;
-+ if ((~0 & (dscpmask >> dscpmaskshift)) != 0x3f) {
-+ NL_SET_ERR_MSG_ATTR(extack,
-+ tb[TCA_CTINFO_PARMS_DSCP_MASK],
-+ "dscp mask must be 6 contiguous bits");
-+ return -EINVAL;
-+ }
-+ dscpstatemask = tb[TCA_CTINFO_PARMS_DSCP_STATEMASK] ?
-+ nla_get_u32(tb[TCA_CTINFO_PARMS_DSCP_STATEMASK]) : 0;
-+ /* mask & statemask must not overlap */
-+ if (dscpmask & dscpstatemask) {
-+ NL_SET_ERR_MSG_ATTR(extack,
-+ tb[TCA_CTINFO_PARMS_DSCP_STATEMASK],
-+ "dscp statemask must not overlap dscp mask");
-+ return -EINVAL;
-+ }
-+ }
-+
-+ /* done the validation:now to the actual action allocation */
-+ index = actparm->index;
-+ err = tcf_idr_check_alloc(tn, &index, a, bind);
-+ if (!err) {
-+ ret = tcf_idr_create(tn, index, est, a,
-+ &act_ctinfo_ops, bind, false);
-+ if (ret) {
-+ tcf_idr_cleanup(tn, index);
-+ return ret;
-+ }
-+ ret = ACT_P_CREATED;
-+ } else if (err > 0) {
-+ if (bind) /* don't override defaults */
-+ return 0;
-+ if (!ovr) {
-+ tcf_idr_release(*a, bind);
-+ return -EEXIST;
-+ }
-+ } else {
-+ return err;
-+ }
-+
-+/* err = tcf_action_check_ctrlact(actparm->action, tp, &goto_ch, extack);
-+ if (err < 0)
-+ goto release_idr;
-+ */
-+
-+ ci = to_ctinfo(*a);
-+
-+ cp_new = kzalloc(sizeof(*cp_new), GFP_KERNEL);
-+ if (unlikely(!cp_new)) {
-+ err = -ENOMEM;
-+ goto put_chain;
-+ }
-+
-+ cp_new->net = net;
-+ cp_new->zone = tb[TCA_CTINFO_ZONE] ?
-+ nla_get_u16(tb[TCA_CTINFO_ZONE]) : 0;
-+ if (dscpmask) {
-+ cp_new->dscpmask = dscpmask;
-+ cp_new->dscpmaskshift = dscpmaskshift;
-+ cp_new->dscpstatemask = dscpstatemask;
-+ cp_new->mode |= CTINFO_MODE_DSCP;
-+ }
-+
-+ if (tb[TCA_CTINFO_PARMS_CPMARK_MASK]) {
-+ cp_new->cpmarkmask =
-+ nla_get_u32(tb[TCA_CTINFO_PARMS_CPMARK_MASK]);
-+ cp_new->mode |= CTINFO_MODE_CPMARK;
-+ }
-+
-+ spin_lock_bh(&ci->tcf_lock);
-+/* goto_ch = tcf_action_set_ctrlact(*a, actparm->action, goto_ch); */
-+ ci->tcf_action = actparm->action;
-+ rcu_swap_protected(ci->params, cp_new,
-+ lockdep_is_held(&ci->tcf_lock));
-+ spin_unlock_bh(&ci->tcf_lock);
-+
-+/* if (goto_ch)
-+ tcf_chain_put_by_act(goto_ch); */
-+ if (cp_new)
-+ kfree_rcu(cp_new, rcu);
-+
-+ if (ret == ACT_P_CREATED)
-+ tcf_idr_insert(tn, *a);
-+
-+ return ret;
-+
-+put_chain:
-+/* if (goto_ch)
-+ tcf_chain_put_by_act(goto_ch);
-+release_idr: */
-+ tcf_idr_release(*a, bind);
-+ return err;
-+}
-+
-+static int tcf_ctinfo_dump(struct sk_buff *skb, struct tc_action *a,
-+ int bind, int ref)
-+{
-+ struct tcf_ctinfo *ci = to_ctinfo(a);
-+ struct tc_ctinfo opt = {
-+ .index = ci->tcf_index,
-+ .refcnt = refcount_read(&ci->tcf_refcnt) - ref,
-+ .bindcnt = atomic_read(&ci->tcf_bindcnt) - bind,
-+ };
-+ unsigned char *b = skb_tail_pointer(skb);
-+ struct tcf_ctinfo_params *cp;
-+ struct tcf_t t;
-+
-+ spin_lock_bh(&ci->tcf_lock);
-+ cp = rcu_dereference_protected(ci->params,
-+ lockdep_is_held(&ci->tcf_lock));
-+
-+ tcf_tm_dump(&t, &ci->tcf_tm);
-+ if (nla_put_64bit(skb, TCA_CTINFO_TM, sizeof(t), &t, TCA_CTINFO_PAD))
-+ goto nla_put_failure;
-+
-+ opt.action = ci->tcf_action;
-+ if (nla_put(skb, TCA_CTINFO_ACT, sizeof(opt), &opt))
-+ goto nla_put_failure;
-+
-+ if (nla_put_u16(skb, TCA_CTINFO_ZONE, cp->zone))
-+ goto nla_put_failure;
-+
-+ if (cp->mode & CTINFO_MODE_DSCP) {
-+ if (nla_put_u32(skb, TCA_CTINFO_PARMS_DSCP_MASK,
-+ cp->dscpmask))
-+ goto nla_put_failure;
-+ if (nla_put_u32(skb, TCA_CTINFO_PARMS_DSCP_STATEMASK,
-+ cp->dscpstatemask))
-+ goto nla_put_failure;
-+ }
-+
-+ if (cp->mode & CTINFO_MODE_CPMARK) {
-+ if (nla_put_u32(skb, TCA_CTINFO_PARMS_CPMARK_MASK,
-+ cp->cpmarkmask))
-+ goto nla_put_failure;
-+ }
-+
-+ if (nla_put_u64_64bit(skb, TCA_CTINFO_STATS_DSCP_SET,
-+ ci->stats_dscp_set, TCA_CTINFO_PAD))
-+ goto nla_put_failure;
-+
-+ if (nla_put_u64_64bit(skb, TCA_CTINFO_STATS_DSCP_ERROR,
-+ ci->stats_dscp_error, TCA_CTINFO_PAD))
-+ goto nla_put_failure;
-+
-+ if (nla_put_u64_64bit(skb, TCA_CTINFO_STATS_CPMARK_SET,
-+ ci->stats_cpmark_set, TCA_CTINFO_PAD))
-+ goto nla_put_failure;
-+
-+ spin_unlock_bh(&ci->tcf_lock);
-+ return skb->len;
-+
-+nla_put_failure:
-+ spin_unlock_bh(&ci->tcf_lock);
-+ nlmsg_trim(skb, b);
-+ return -1;
-+}
-+
-+static int tcf_ctinfo_walker(struct net *net, struct sk_buff *skb,
-+ struct netlink_callback *cb, int type,
-+ const struct tc_action_ops *ops,
-+ struct netlink_ext_ack *extack)
-+{
-+ struct tc_action_net *tn = net_generic(net, ctinfo_net_id);
-+
-+ return tcf_generic_walker(tn, skb, cb, type, ops, extack);
-+}
-+
-+static int tcf_ctinfo_search(struct net *net, struct tc_action **a, u32 index,
-+ struct netlink_ext_ack *extack)
-+{
-+ struct tc_action_net *tn = net_generic(net, ctinfo_net_id);
-+
-+ return tcf_idr_search(tn, a, index);
-+}
-+
-+static void tcf_ctinfo_cleanup(struct tc_action *a)
-+{
-+ struct tcf_ctinfo *ci = to_ctinfo(a);
-+ struct tcf_ctinfo_params *cp;
-+
-+ cp = rcu_dereference_protected(ci->params, 1);
-+ if (cp)
-+ kfree_rcu(cp, rcu);
-+}
-+
-+static struct tc_action_ops act_ctinfo_ops = {
-+ .kind = "ctinfo",
-+ .type = TCA_ID_CTINFO,
-+ .owner = THIS_MODULE,
-+ .act = tcf_ctinfo_act,
-+ .dump = tcf_ctinfo_dump,
-+ .init = tcf_ctinfo_init,
-+ .walk = tcf_ctinfo_walker,
-+ .cleanup= tcf_ctinfo_cleanup,
-+ .lookup = tcf_ctinfo_search,
-+ .size = sizeof(struct tcf_ctinfo),
-+};
-+
-+static __net_init int ctinfo_init_net(struct net *net)
-+{
-+ struct tc_action_net *tn = net_generic(net, ctinfo_net_id);
-+
-+ return tc_action_net_init(net, tn, &act_ctinfo_ops);
-+}
-+
-+static void __net_exit ctinfo_exit_net(struct list_head *net_list)
-+{
-+ tc_action_net_exit(net_list, ctinfo_net_id);
-+}
-+
-+static struct pernet_operations ctinfo_net_ops = {
-+ .init = ctinfo_init_net,
-+ .exit_batch = ctinfo_exit_net,
-+ .id = &ctinfo_net_id,
-+ .size = sizeof(struct tc_action_net),
-+};
-+
-+static int __init ctinfo_init_module(void)
-+{
-+ return tcf_register_action(&act_ctinfo_ops, &ctinfo_net_ops);
-+}
-+
-+static void __exit ctinfo_cleanup_module(void)
-+{
-+ tcf_unregister_action(&act_ctinfo_ops, &ctinfo_net_ops);
-+}
-+
-+module_init(ctinfo_init_module);
-+module_exit(ctinfo_cleanup_module);
-+MODULE_AUTHOR("Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>");
-+MODULE_DESCRIPTION("Connection tracking mark actions");
-+MODULE_LICENSE("GPL");
---- a/tools/testing/selftests/tc-testing/config
-+++ b/tools/testing/selftests/tc-testing/config
-@@ -38,6 +38,7 @@ CONFIG_NET_ACT_CSUM=m
- CONFIG_NET_ACT_VLAN=m
- CONFIG_NET_ACT_BPF=m
- CONFIG_NET_ACT_CONNMARK=m
-+CONFIG_NET_ACT_CONNCTINFO=m
- CONFIG_NET_ACT_SKBMOD=m
- CONFIG_NET_ACT_IFE=m
- CONFIG_NET_ACT_TUNNEL_KEY=m
+++ /dev/null
-From 9a4d83074769d6ecf1f5c3fef0f183b09abf3726 Mon Sep 17 00:00:00 2001
-From: Robert Marko <robimarko@gmail.com>
-Date: Sat, 6 Oct 2018 17:36:42 +0200
-Subject: [PATCH 1/8] mtd: spinand: winbond: Add support for W25N01GV
-
-W25N01GV is a single die version of the already supported
-W25M02GV with half the capacity. Everything else is the
-same so introduce support for W25N01GV.
-
-Datasheet:http://www.winbond.com/resource-files/w25n01gv%20revl%20050918%20unsecured.pdf
-
-Tested on 8devices Jalapeno dev board under OpenWrt running 4.19-rc5.
-
-Signed-off-by: Robert Marko <robimarko@gmail.com>
-Reviewed-by: Boris Brezillon <boris.brezillon@bootlin.com>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
----
- drivers/mtd/nand/spi/winbond.c | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
---- a/drivers/mtd/nand/spi/winbond.c
-+++ b/drivers/mtd/nand/spi/winbond.c
-@@ -84,6 +84,14 @@ static const struct spinand_info winbond
- 0,
- SPINAND_ECCINFO(&w25m02gv_ooblayout, NULL),
- SPINAND_SELECT_TARGET(w25m02gv_select_target)),
-+ SPINAND_INFO("W25N01GV", 0xAA,
-+ NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
-+ NAND_ECCREQ(1, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&w25m02gv_ooblayout, NULL)),
- };
-
- /**
+++ /dev/null
-From 10949af1681d5bb5cdbcc012815c6e40eec17d02 Mon Sep 17 00:00:00 2001
-From: Schrempf Frieder <frieder.schrempf@kontron.De>
-Date: Thu, 8 Nov 2018 08:32:11 +0000
-Subject: [PATCH 2/8] mtd: spinand: Add initial support for Toshiba TC58CVG2S0H
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Add minimal support for the Toshiba TC58CVG2S0H SPI NAND chip.
-
-Signed-off-by: Frieder Schrempf <frieder.schrempf@kontron.de>
-Acked-by: Clément Péron <peron.clem@gmail.com>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
----
- drivers/mtd/nand/spi/Makefile | 2 +-
- drivers/mtd/nand/spi/core.c | 1 +
- drivers/mtd/nand/spi/toshiba.c | 137 +++++++++++++++++++++++++++++++++
- include/linux/mtd/spinand.h | 1 +
- 4 files changed, 140 insertions(+), 1 deletion(-)
- create mode 100644 drivers/mtd/nand/spi/toshiba.c
-
---- a/drivers/mtd/nand/spi/Makefile
-+++ b/drivers/mtd/nand/spi/Makefile
-@@ -1,3 +1,3 @@
- # SPDX-License-Identifier: GPL-2.0
--spinand-objs := core.o macronix.o micron.o winbond.o
-+spinand-objs := core.o macronix.o micron.o toshiba.o winbond.o
- obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
---- a/drivers/mtd/nand/spi/core.c
-+++ b/drivers/mtd/nand/spi/core.c
-@@ -764,6 +764,7 @@ static const struct nand_ops spinand_ops
- static const struct spinand_manufacturer *spinand_manufacturers[] = {
- ¯onix_spinand_manufacturer,
- µn_spinand_manufacturer,
-+ &toshiba_spinand_manufacturer,
- &winbond_spinand_manufacturer,
- };
-
---- /dev/null
-+++ b/drivers/mtd/nand/spi/toshiba.c
-@@ -0,0 +1,137 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (c) 2018 exceet electronics GmbH
-+ * Copyright (c) 2018 Kontron Electronics GmbH
-+ *
-+ * Author: Frieder Schrempf <frieder.schrempf@kontron.de>
-+ */
-+
-+#include <linux/device.h>
-+#include <linux/kernel.h>
-+#include <linux/mtd/spinand.h>
-+
-+#define SPINAND_MFR_TOSHIBA 0x98
-+#define TOSH_STATUS_ECC_HAS_BITFLIPS_T (3 << 4)
-+
-+static SPINAND_OP_VARIANTS(read_cache_variants,
-+ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
-+
-+static SPINAND_OP_VARIANTS(write_cache_variants,
-+ SPINAND_PROG_LOAD(true, 0, NULL, 0));
-+
-+static SPINAND_OP_VARIANTS(update_cache_variants,
-+ SPINAND_PROG_LOAD(false, 0, NULL, 0));
-+
-+static int tc58cvg2s0h_ooblayout_ecc(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *region)
-+{
-+ if (section > 7)
-+ return -ERANGE;
-+
-+ region->offset = 128 + 16 * section;
-+ region->length = 16;
-+
-+ return 0;
-+}
-+
-+static int tc58cvg2s0h_ooblayout_free(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *region)
-+{
-+ if (section > 0)
-+ return -ERANGE;
-+
-+ /* 2 bytes reserved for BBM */
-+ region->offset = 2;
-+ region->length = 126;
-+
-+ return 0;
-+}
-+
-+static const struct mtd_ooblayout_ops tc58cvg2s0h_ooblayout = {
-+ .ecc = tc58cvg2s0h_ooblayout_ecc,
-+ .free = tc58cvg2s0h_ooblayout_free,
-+};
-+
-+static int tc58cvg2s0h_ecc_get_status(struct spinand_device *spinand,
-+ u8 status)
-+{
-+ struct nand_device *nand = spinand_to_nand(spinand);
-+ u8 mbf = 0;
-+ struct spi_mem_op op = SPINAND_GET_FEATURE_OP(0x30, &mbf);
-+
-+ switch (status & STATUS_ECC_MASK) {
-+ case STATUS_ECC_NO_BITFLIPS:
-+ return 0;
-+
-+ case STATUS_ECC_UNCOR_ERROR:
-+ return -EBADMSG;
-+
-+ case STATUS_ECC_HAS_BITFLIPS:
-+ case TOSH_STATUS_ECC_HAS_BITFLIPS_T:
-+ /*
-+ * Let's try to retrieve the real maximum number of bitflips
-+ * in order to avoid forcing the wear-leveling layer to move
-+ * data around if it's not necessary.
-+ */
-+ if (spi_mem_exec_op(spinand->spimem, &op))
-+ return nand->eccreq.strength;
-+
-+ mbf >>= 4;
-+
-+ if (WARN_ON(mbf > nand->eccreq.strength || !mbf))
-+ return nand->eccreq.strength;
-+
-+ return mbf;
-+
-+ default:
-+ break;
-+ }
-+
-+ return -EINVAL;
-+}
-+
-+static const struct spinand_info toshiba_spinand_table[] = {
-+ SPINAND_INFO("TC58CVG2S0H", 0xCD,
-+ NAND_MEMORG(1, 4096, 256, 64, 2048, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ SPINAND_HAS_QE_BIT,
-+ SPINAND_ECCINFO(&tc58cvg2s0h_ooblayout,
-+ tc58cvg2s0h_ecc_get_status)),
-+};
-+
-+static int toshiba_spinand_detect(struct spinand_device *spinand)
-+{
-+ u8 *id = spinand->id.data;
-+ int ret;
-+
-+ /*
-+ * Toshiba SPI NAND read ID needs a dummy byte,
-+ * so the first byte in id is garbage.
-+ */
-+ if (id[1] != SPINAND_MFR_TOSHIBA)
-+ return 0;
-+
-+ ret = spinand_match_and_init(spinand, toshiba_spinand_table,
-+ ARRAY_SIZE(toshiba_spinand_table),
-+ id[2]);
-+ if (ret)
-+ return ret;
-+
-+ return 1;
-+}
-+
-+static const struct spinand_manufacturer_ops toshiba_spinand_manuf_ops = {
-+ .detect = toshiba_spinand_detect,
-+};
-+
-+const struct spinand_manufacturer toshiba_spinand_manufacturer = {
-+ .id = SPINAND_MFR_TOSHIBA,
-+ .name = "Toshiba",
-+ .ops = &toshiba_spinand_manuf_ops,
-+};
---- a/include/linux/mtd/spinand.h
-+++ b/include/linux/mtd/spinand.h
-@@ -196,6 +196,7 @@ struct spinand_manufacturer {
- /* SPI NAND manufacturers */
- extern const struct spinand_manufacturer macronix_spinand_manufacturer;
- extern const struct spinand_manufacturer micron_spinand_manufacturer;
-+extern const struct spinand_manufacturer toshiba_spinand_manufacturer;
- extern const struct spinand_manufacturer winbond_spinand_manufacturer;
-
- /**
+++ /dev/null
-From c93c613214ac70c87beab5422a60077bf126b855 Mon Sep 17 00:00:00 2001
-From: Chuanhong Guo <gch981213@gmail.com>
-Date: Wed, 28 Nov 2018 21:07:25 +0800
-Subject: [PATCH 3/8] mtd: spinand: add support for GigaDevice GD5FxGQ4xA
-
-Add support for GigaDevice GD5F1G/2G/4GQ4xA SPI NAND.
-
-Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
-Reviewed-by: Frieder Schrempf <frieder.schrempf@kontron.de>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
----
- drivers/mtd/nand/spi/Makefile | 2 +-
- drivers/mtd/nand/spi/core.c | 1 +
- drivers/mtd/nand/spi/gigadevice.c | 148 ++++++++++++++++++++++++++++++
- include/linux/mtd/spinand.h | 1 +
- 4 files changed, 151 insertions(+), 1 deletion(-)
- create mode 100644 drivers/mtd/nand/spi/gigadevice.c
-
---- a/drivers/mtd/nand/spi/Makefile
-+++ b/drivers/mtd/nand/spi/Makefile
-@@ -1,3 +1,3 @@
- # SPDX-License-Identifier: GPL-2.0
--spinand-objs := core.o macronix.o micron.o toshiba.o winbond.o
-+spinand-objs := core.o gigadevice.o macronix.o micron.o toshiba.o winbond.o
- obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
---- a/drivers/mtd/nand/spi/core.c
-+++ b/drivers/mtd/nand/spi/core.c
-@@ -762,6 +762,7 @@ static const struct nand_ops spinand_ops
- };
-
- static const struct spinand_manufacturer *spinand_manufacturers[] = {
-+ &gigadevice_spinand_manufacturer,
- ¯onix_spinand_manufacturer,
- µn_spinand_manufacturer,
- &toshiba_spinand_manufacturer,
---- /dev/null
-+++ b/drivers/mtd/nand/spi/gigadevice.c
-@@ -0,0 +1,148 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Author:
-+ * Chuanhong Guo <gch981213@gmail.com>
-+ */
-+
-+#include <linux/device.h>
-+#include <linux/kernel.h>
-+#include <linux/mtd/spinand.h>
-+
-+#define SPINAND_MFR_GIGADEVICE 0xC8
-+#define GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS (1 << 4)
-+#define GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS (3 << 4)
-+
-+static SPINAND_OP_VARIANTS(read_cache_variants,
-+ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
-+
-+static SPINAND_OP_VARIANTS(write_cache_variants,
-+ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
-+ SPINAND_PROG_LOAD(true, 0, NULL, 0));
-+
-+static SPINAND_OP_VARIANTS(update_cache_variants,
-+ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
-+ SPINAND_PROG_LOAD(false, 0, NULL, 0));
-+
-+static int gd5fxgq4xa_ooblayout_ecc(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *region)
-+{
-+ if (section > 3)
-+ return -ERANGE;
-+
-+ region->offset = (16 * section) + 8;
-+ region->length = 8;
-+
-+ return 0;
-+}
-+
-+static int gd5fxgq4xa_ooblayout_free(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *region)
-+{
-+ if (section > 3)
-+ return -ERANGE;
-+
-+ if (section) {
-+ region->offset = 16 * section;
-+ region->length = 8;
-+ } else {
-+ /* section 0 has one byte reserved for bad block mark */
-+ region->offset = 1;
-+ region->length = 7;
-+ }
-+ return 0;
-+}
-+
-+static int gd5fxgq4xa_ecc_get_status(struct spinand_device *spinand,
-+ u8 status)
-+{
-+ switch (status & STATUS_ECC_MASK) {
-+ case STATUS_ECC_NO_BITFLIPS:
-+ return 0;
-+
-+ case GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS:
-+ /* 1-7 bits are flipped. return the maximum. */
-+ return 7;
-+
-+ case GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS:
-+ return 8;
-+
-+ case STATUS_ECC_UNCOR_ERROR:
-+ return -EBADMSG;
-+
-+ default:
-+ break;
-+ }
-+
-+ return -EINVAL;
-+}
-+
-+static const struct mtd_ooblayout_ops gd5fxgq4xa_ooblayout = {
-+ .ecc = gd5fxgq4xa_ooblayout_ecc,
-+ .free = gd5fxgq4xa_ooblayout_free,
-+};
-+
-+static const struct spinand_info gigadevice_spinand_table[] = {
-+ SPINAND_INFO("GD5F1GQ4xA", 0xF1,
-+ NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout,
-+ gd5fxgq4xa_ecc_get_status)),
-+ SPINAND_INFO("GD5F2GQ4xA", 0xF2,
-+ NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout,
-+ gd5fxgq4xa_ecc_get_status)),
-+ SPINAND_INFO("GD5F4GQ4xA", 0xF4,
-+ NAND_MEMORG(1, 2048, 64, 64, 4096, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout,
-+ gd5fxgq4xa_ecc_get_status)),
-+};
-+
-+static int gigadevice_spinand_detect(struct spinand_device *spinand)
-+{
-+ u8 *id = spinand->id.data;
-+ int ret;
-+
-+ /*
-+ * For GD NANDs, There is an address byte needed to shift in before IDs
-+ * are read out, so the first byte in raw_id is dummy.
-+ */
-+ if (id[1] != SPINAND_MFR_GIGADEVICE)
-+ return 0;
-+
-+ ret = spinand_match_and_init(spinand, gigadevice_spinand_table,
-+ ARRAY_SIZE(gigadevice_spinand_table),
-+ id[2]);
-+ if (ret)
-+ return ret;
-+
-+ return 1;
-+}
-+
-+static const struct spinand_manufacturer_ops gigadevice_spinand_manuf_ops = {
-+ .detect = gigadevice_spinand_detect,
-+};
-+
-+const struct spinand_manufacturer gigadevice_spinand_manufacturer = {
-+ .id = SPINAND_MFR_GIGADEVICE,
-+ .name = "GigaDevice",
-+ .ops = &gigadevice_spinand_manuf_ops,
-+};
---- a/include/linux/mtd/spinand.h
-+++ b/include/linux/mtd/spinand.h
-@@ -194,6 +194,7 @@ struct spinand_manufacturer {
- };
-
- /* SPI NAND manufacturers */
-+extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;
- extern const struct spinand_manufacturer macronix_spinand_manufacturer;
- extern const struct spinand_manufacturer micron_spinand_manufacturer;
- extern const struct spinand_manufacturer toshiba_spinand_manufacturer;
+++ /dev/null
-From db214513f62fd13c0a9af3bd5c5d634dba37e65d Mon Sep 17 00:00:00 2001
-From: Yoshio Furuyama <tmcmc-mb-yfuruyama7@ml.toshiba.co.jp>
-Date: Wed, 16 Jan 2019 14:53:19 +0900
-Subject: [PATCH 7/8] mtd: spinand: Add support for all Toshiba Memory products
-
-Add device table for Toshiba Memory products.
-Also, generalize OOB layout structure and function names.
-
-Signed-off-by: Yoshio Furuyama <tmcmc-mb-yfuruyama7@ml.toshiba.co.jp>
-Reviewed-by: Frieder Schrempf <frieder.schrempf@kontron.de>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
----
- drivers/mtd/nand/spi/toshiba.c | 79 ++++++++++++++++++++++++++++------
- 1 file changed, 65 insertions(+), 14 deletions(-)
-
---- a/drivers/mtd/nand/spi/toshiba.c
-+++ b/drivers/mtd/nand/spi/toshiba.c
-@@ -25,19 +25,19 @@ static SPINAND_OP_VARIANTS(write_cache_v
- static SPINAND_OP_VARIANTS(update_cache_variants,
- SPINAND_PROG_LOAD(false, 0, NULL, 0));
-
--static int tc58cvg2s0h_ooblayout_ecc(struct mtd_info *mtd, int section,
-+static int tc58cxgxsx_ooblayout_ecc(struct mtd_info *mtd, int section,
- struct mtd_oob_region *region)
- {
-- if (section > 7)
-+ if (section > 0)
- return -ERANGE;
-
-- region->offset = 128 + 16 * section;
-- region->length = 16;
-+ region->offset = mtd->oobsize / 2;
-+ region->length = mtd->oobsize / 2;
-
- return 0;
- }
-
--static int tc58cvg2s0h_ooblayout_free(struct mtd_info *mtd, int section,
-+static int tc58cxgxsx_ooblayout_free(struct mtd_info *mtd, int section,
- struct mtd_oob_region *region)
- {
- if (section > 0)
-@@ -45,17 +45,17 @@ static int tc58cvg2s0h_ooblayout_free(st
-
- /* 2 bytes reserved for BBM */
- region->offset = 2;
-- region->length = 126;
-+ region->length = (mtd->oobsize / 2) - 2;
-
- return 0;
- }
-
--static const struct mtd_ooblayout_ops tc58cvg2s0h_ooblayout = {
-- .ecc = tc58cvg2s0h_ooblayout_ecc,
-- .free = tc58cvg2s0h_ooblayout_free,
-+static const struct mtd_ooblayout_ops tc58cxgxsx_ooblayout = {
-+ .ecc = tc58cxgxsx_ooblayout_ecc,
-+ .free = tc58cxgxsx_ooblayout_free,
- };
-
--static int tc58cvg2s0h_ecc_get_status(struct spinand_device *spinand,
-+static int tc58cxgxsx_ecc_get_status(struct spinand_device *spinand,
- u8 status)
- {
- struct nand_device *nand = spinand_to_nand(spinand);
-@@ -94,15 +94,66 @@ static int tc58cvg2s0h_ecc_get_status(st
- }
-
- static const struct spinand_info toshiba_spinand_table[] = {
-- SPINAND_INFO("TC58CVG2S0H", 0xCD,
-+ /* 3.3V 1Gb */
-+ SPINAND_INFO("TC58CVG0S3", 0xC2,
-+ NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
-+ tc58cxgxsx_ecc_get_status)),
-+ /* 3.3V 2Gb */
-+ SPINAND_INFO("TC58CVG1S3", 0xCB,
-+ NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
-+ tc58cxgxsx_ecc_get_status)),
-+ /* 3.3V 4Gb */
-+ SPINAND_INFO("TC58CVG2S0", 0xCD,
-+ NAND_MEMORG(1, 4096, 256, 64, 2048, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
-+ tc58cxgxsx_ecc_get_status)),
-+ /* 1.8V 1Gb */
-+ SPINAND_INFO("TC58CYG0S3", 0xB2,
-+ NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
-+ tc58cxgxsx_ecc_get_status)),
-+ /* 1.8V 2Gb */
-+ SPINAND_INFO("TC58CYG1S3", 0xBB,
-+ NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
-+ tc58cxgxsx_ecc_get_status)),
-+ /* 1.8V 4Gb */
-+ SPINAND_INFO("TC58CYG2S0", 0xBD,
- NAND_MEMORG(1, 4096, 256, 64, 2048, 1, 1, 1),
- NAND_ECCREQ(8, 512),
- SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
- &write_cache_variants,
- &update_cache_variants),
-- SPINAND_HAS_QE_BIT,
-- SPINAND_ECCINFO(&tc58cvg2s0h_ooblayout,
-- tc58cvg2s0h_ecc_get_status)),
-+ 0,
-+ SPINAND_ECCINFO(&tc58cxgxsx_ooblayout,
-+ tc58cxgxsx_ecc_get_status)),
- };
-
- static int toshiba_spinand_detect(struct spinand_device *spinand)
+++ /dev/null
-From c40c7a990a46e5102a1cc4190557bf315d32d80d Mon Sep 17 00:00:00 2001
-From: Stefan Roese <sr@denx.de>
-Date: Thu, 24 Jan 2019 13:48:06 +0100
-Subject: [PATCH 8/8] mtd: spinand: Add support for GigaDevice GD5F1GQ4UExxG
-
-Add support for GigaDevice GD5F1GQ4UExxG SPI NAND chip.
-
-Signed-off-by: Stefan Roese <sr@denx.de>
-Cc: Chuanhong Guo <gch981213@gmail.com>
-Cc: Frieder Schrempf <frieder.schrempf@kontron.de>
-Cc: Miquel Raynal <miquel.raynal@bootlin.com>
-Cc: Boris Brezillon <bbrezillon@kernel.org>
-Reviewed-by: Boris Brezillon <bbrezillon@kernel.org>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
----
- drivers/mtd/nand/spi/gigadevice.c | 83 +++++++++++++++++++++++++++++++
- 1 file changed, 83 insertions(+)
-
---- a/drivers/mtd/nand/spi/gigadevice.c
-+++ b/drivers/mtd/nand/spi/gigadevice.c
-@@ -12,6 +12,8 @@
- #define GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS (1 << 4)
- #define GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS (3 << 4)
-
-+#define GD5FXGQ4UEXXG_REG_STATUS2 0xf0
-+
- static SPINAND_OP_VARIANTS(read_cache_variants,
- SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
- SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
-@@ -81,11 +83,83 @@ static int gd5fxgq4xa_ecc_get_status(str
- return -EINVAL;
- }
-
-+static int gd5fxgq4uexxg_ooblayout_ecc(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *region)
-+{
-+ if (section)
-+ return -ERANGE;
-+
-+ region->offset = 64;
-+ region->length = 64;
-+
-+ return 0;
-+}
-+
-+static int gd5fxgq4uexxg_ooblayout_free(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *region)
-+{
-+ if (section)
-+ return -ERANGE;
-+
-+ /* Reserve 1 bytes for the BBM. */
-+ region->offset = 1;
-+ region->length = 63;
-+
-+ return 0;
-+}
-+
-+static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand,
-+ u8 status)
-+{
-+ u8 status2;
-+ struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQ4UEXXG_REG_STATUS2,
-+ &status2);
-+ int ret;
-+
-+ switch (status & STATUS_ECC_MASK) {
-+ case STATUS_ECC_NO_BITFLIPS:
-+ return 0;
-+
-+ case GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS:
-+ /*
-+ * Read status2 register to determine a more fine grained
-+ * bit error status
-+ */
-+ ret = spi_mem_exec_op(spinand->spimem, &op);
-+ if (ret)
-+ return ret;
-+
-+ /*
-+ * 4 ... 7 bits are flipped (1..4 can't be detected, so
-+ * report the maximum of 4 in this case
-+ */
-+ /* bits sorted this way (3...0): ECCS1,ECCS0,ECCSE1,ECCSE0 */
-+ return ((status & STATUS_ECC_MASK) >> 2) |
-+ ((status2 & STATUS_ECC_MASK) >> 4);
-+
-+ case GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS:
-+ return 8;
-+
-+ case STATUS_ECC_UNCOR_ERROR:
-+ return -EBADMSG;
-+
-+ default:
-+ break;
-+ }
-+
-+ return -EINVAL;
-+}
-+
- static const struct mtd_ooblayout_ops gd5fxgq4xa_ooblayout = {
- .ecc = gd5fxgq4xa_ooblayout_ecc,
- .free = gd5fxgq4xa_ooblayout_free,
- };
-
-+static const struct mtd_ooblayout_ops gd5fxgq4uexxg_ooblayout = {
-+ .ecc = gd5fxgq4uexxg_ooblayout_ecc,
-+ .free = gd5fxgq4uexxg_ooblayout_free,
-+};
-+
- static const struct spinand_info gigadevice_spinand_table[] = {
- SPINAND_INFO("GD5F1GQ4xA", 0xF1,
- NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
-@@ -114,6 +188,15 @@ static const struct spinand_info gigadev
- 0,
- SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout,
- gd5fxgq4xa_ecc_get_status)),
-+ SPINAND_INFO("GD5F1GQ4UExxG", 0xd1,
-+ NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&gd5fxgq4uexxg_ooblayout,
-+ gd5fxgq4uexxg_ecc_get_status)),
- };
-
- static int gigadevice_spinand_detect(struct spinand_device *spinand)
+++ /dev/null
-From 81554171373018b83f3554b9e725d2b5bf1844a5 Mon Sep 17 00:00:00 2001
-From: Alexander Sverdlin <alexander.sverdlin@nokia.com>
-Date: Fri, 13 Jul 2018 15:06:46 +0200
-Subject: [PATCH] mtd: spi-nor: Add support for mx25u12835f
-
-This chip supports dual and quad read and uniform 4K-byte erase.
-
-Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com>
-Reviewed-by: Tudor Ambarus <tudor.ambarus@microchip.com>
-Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1088,6 +1088,8 @@ static const struct flash_info spi_nor_i
- { "mx25u6435f", INFO(0xc22537, 0, 64 * 1024, 128, SECT_4K) },
- { "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
- { "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
-+ { "mx25u12835f", INFO(0xc22538, 0, 64 * 1024, 256,
-+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- { "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
- { "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_4B_OPCODES) },
- { "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) },
+++ /dev/null
-From d014717d50b1efd011a3a028ce92563a4dc9bae5 Mon Sep 17 00:00:00 2001
-From: Jeff Kletsky <git-commits@allycomm.com>
-Date: Wed, 22 May 2019 15:05:53 -0700
-Subject: [PATCH 1/3] mtd: spinand: Define macros for page-read ops with
- three-byte addresses
-
-The GigaDevice GD5F1GQ4UFxxG SPI NAND utilizes three-byte addresses
-for its page-read ops.
-
-http://www.gigadevice.com/datasheet/gd5f1gq4xfxxg/
-
-Signed-off-by: Jeff Kletsky <git-commits@allycomm.com>
-Reviewed-by: Frieder Schrempf <frieder.schrempf@kontron.de>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
----
- include/linux/mtd/spinand.h | 30 ++++++++++++++++++++++++++++++
- 1 file changed, 30 insertions(+)
-
---- a/include/linux/mtd/spinand.h
-+++ b/include/linux/mtd/spinand.h
-@@ -68,30 +68,60 @@
- SPI_MEM_OP_DUMMY(ndummy, 1), \
- SPI_MEM_OP_DATA_IN(len, buf, 1))
-
-+#define SPINAND_PAGE_READ_FROM_CACHE_OP_3A(fast, addr, ndummy, buf, len) \
-+ SPI_MEM_OP(SPI_MEM_OP_CMD(fast ? 0x0b : 0x03, 1), \
-+ SPI_MEM_OP_ADDR(3, addr, 1), \
-+ SPI_MEM_OP_DUMMY(ndummy, 1), \
-+ SPI_MEM_OP_DATA_IN(len, buf, 1))
-+
- #define SPINAND_PAGE_READ_FROM_CACHE_X2_OP(addr, ndummy, buf, len) \
- SPI_MEM_OP(SPI_MEM_OP_CMD(0x3b, 1), \
- SPI_MEM_OP_ADDR(2, addr, 1), \
- SPI_MEM_OP_DUMMY(ndummy, 1), \
- SPI_MEM_OP_DATA_IN(len, buf, 2))
-
-+#define SPINAND_PAGE_READ_FROM_CACHE_X2_OP_3A(addr, ndummy, buf, len) \
-+ SPI_MEM_OP(SPI_MEM_OP_CMD(0x3b, 1), \
-+ SPI_MEM_OP_ADDR(3, addr, 1), \
-+ SPI_MEM_OP_DUMMY(ndummy, 1), \
-+ SPI_MEM_OP_DATA_IN(len, buf, 2))
-+
- #define SPINAND_PAGE_READ_FROM_CACHE_X4_OP(addr, ndummy, buf, len) \
- SPI_MEM_OP(SPI_MEM_OP_CMD(0x6b, 1), \
- SPI_MEM_OP_ADDR(2, addr, 1), \
- SPI_MEM_OP_DUMMY(ndummy, 1), \
- SPI_MEM_OP_DATA_IN(len, buf, 4))
-
-+#define SPINAND_PAGE_READ_FROM_CACHE_X4_OP_3A(addr, ndummy, buf, len) \
-+ SPI_MEM_OP(SPI_MEM_OP_CMD(0x6b, 1), \
-+ SPI_MEM_OP_ADDR(3, addr, 1), \
-+ SPI_MEM_OP_DUMMY(ndummy, 1), \
-+ SPI_MEM_OP_DATA_IN(len, buf, 4))
-+
- #define SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(addr, ndummy, buf, len) \
- SPI_MEM_OP(SPI_MEM_OP_CMD(0xbb, 1), \
- SPI_MEM_OP_ADDR(2, addr, 2), \
- SPI_MEM_OP_DUMMY(ndummy, 2), \
- SPI_MEM_OP_DATA_IN(len, buf, 2))
-
-+#define SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP_3A(addr, ndummy, buf, len) \
-+ SPI_MEM_OP(SPI_MEM_OP_CMD(0xbb, 1), \
-+ SPI_MEM_OP_ADDR(3, addr, 2), \
-+ SPI_MEM_OP_DUMMY(ndummy, 2), \
-+ SPI_MEM_OP_DATA_IN(len, buf, 2))
-+
- #define SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(addr, ndummy, buf, len) \
- SPI_MEM_OP(SPI_MEM_OP_CMD(0xeb, 1), \
- SPI_MEM_OP_ADDR(2, addr, 4), \
- SPI_MEM_OP_DUMMY(ndummy, 4), \
- SPI_MEM_OP_DATA_IN(len, buf, 4))
-
-+#define SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP_3A(addr, ndummy, buf, len) \
-+ SPI_MEM_OP(SPI_MEM_OP_CMD(0xeb, 1), \
-+ SPI_MEM_OP_ADDR(3, addr, 4), \
-+ SPI_MEM_OP_DUMMY(ndummy, 4), \
-+ SPI_MEM_OP_DATA_IN(len, buf, 4))
-+
- #define SPINAND_PROG_EXEC_OP(addr) \
- SPI_MEM_OP(SPI_MEM_OP_CMD(0x10, 1), \
- SPI_MEM_OP_ADDR(3, addr, 1), \
+++ /dev/null
-From 53dd94a79d3bfdaae30e5a4ebf474ea1af1d572e Mon Sep 17 00:00:00 2001
-From: Jeff Kletsky <git-commits@allycomm.com>
-Date: Wed, 22 May 2019 15:05:54 -0700
-Subject: [PATCH 2/3] mtd: spinand: Add support for two-byte device IDs
-
-The GigaDevice GD5F1GQ4UFxxG SPI NAND utilizes two-byte device IDs.
-
-http://www.gigadevice.com/datasheet/gd5f1gq4xfxxg/
-
-Signed-off-by: Jeff Kletsky <git-commits@allycomm.com>
-Reviewed-by: Frieder Schrempf <frieder.schrempf@kontron.de>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
----
- drivers/mtd/nand/spi/core.c | 2 +-
- include/linux/mtd/spinand.h | 4 ++--
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
---- a/drivers/mtd/nand/spi/core.c
-+++ b/drivers/mtd/nand/spi/core.c
-@@ -853,7 +853,7 @@ spinand_select_op_variant(struct spinand
- */
- int spinand_match_and_init(struct spinand_device *spinand,
- const struct spinand_info *table,
-- unsigned int table_size, u8 devid)
-+ unsigned int table_size, u16 devid)
- {
- struct nand_device *nand = spinand_to_nand(spinand);
- unsigned int i;
---- a/include/linux/mtd/spinand.h
-+++ b/include/linux/mtd/spinand.h
-@@ -290,7 +290,7 @@ struct spinand_ecc_info {
- */
- struct spinand_info {
- const char *model;
-- u8 devid;
-+ u16 devid;
- u32 flags;
- struct nand_memory_organization memorg;
- struct nand_ecc_req eccreq;
-@@ -445,7 +445,7 @@ static inline void spinand_set_of_node(s
-
- int spinand_match_and_init(struct spinand_device *dev,
- const struct spinand_info *table,
-- unsigned int table_size, u8 devid);
-+ unsigned int table_size, u16 devid);
-
- int spinand_upd_cfg(struct spinand_device *spinand, u8 mask, u8 val);
- int spinand_select_target(struct spinand_device *spinand, unsigned int target);
+++ /dev/null
-
-IMPORTANT NOTE
-==============
-
-The content of this patch has been adapted for Linux 4.19
-
-Changes were made in Linux 5.x to add the bad-block limit
-to the metadata available to the driver, adding a parameter
-
-NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
- ^- New bad-block limit
-
-This patch omits that parameter from the upstream patch
-for compatibility with the Linux 4.19 driver.
-
-=====
-
-From 049df13c4e63884fe6634db5568e08f65922256e Mon Sep 17 00:00:00 2001
-From: Jeff Kletsky <git-commits@allycomm.com>
-Date: Wed, 22 May 2019 15:05:55 -0700
-Subject: [PATCH 3/3] mtd: spinand: Add support for GigaDevice GD5F1GQ4UFxxG
-
-The GigaDevice GD5F1GQ4UFxxG SPI NAND is in current production devices
-and, while it has the same logical layout as the E-series devices,
-it differs in the SPI interfacing in significant ways.
-
-This support is contingent on previous commits to:
-
- * Add support for two-byte device IDs
- * Define macros for page-read ops with three-byte addresses
-
-http://www.gigadevice.com/datasheet/gd5f1gq4xfxxg/
-
-Signed-off-by: Jeff Kletsky <git-commits@allycomm.com>
-Reviewed-by: Frieder Schrempf <frieder.schrempf@kontron.de>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
----
- drivers/mtd/nand/spi/gigadevice.c | 79 +++++++++++++++++++++++++------
- 1 file changed, 64 insertions(+), 15 deletions(-)
-
---- a/drivers/mtd/nand/spi/gigadevice.c
-+++ b/drivers/mtd/nand/spi/gigadevice.c
-@@ -9,11 +9,17 @@
- #include <linux/mtd/spinand.h>
-
- #define SPINAND_MFR_GIGADEVICE 0xC8
-+
- #define GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS (1 << 4)
- #define GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS (3 << 4)
-
- #define GD5FXGQ4UEXXG_REG_STATUS2 0xf0
-
-+#define GD5FXGQ4UXFXXG_STATUS_ECC_MASK (7 << 4)
-+#define GD5FXGQ4UXFXXG_STATUS_ECC_NO_BITFLIPS (0 << 4)
-+#define GD5FXGQ4UXFXXG_STATUS_ECC_1_3_BITFLIPS (1 << 4)
-+#define GD5FXGQ4UXFXXG_STATUS_ECC_UNCOR_ERROR (7 << 4)
-+
- static SPINAND_OP_VARIANTS(read_cache_variants,
- SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
- SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
-@@ -22,6 +28,14 @@ static SPINAND_OP_VARIANTS(read_cache_va
- SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
- SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
-
-+static SPINAND_OP_VARIANTS(read_cache_variants_f,
-+ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_X4_OP_3A(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_X2_OP_3A(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_OP_3A(true, 0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_OP_3A(false, 0, 0, NULL, 0));
-+
- static SPINAND_OP_VARIANTS(write_cache_variants,
- SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
- SPINAND_PROG_LOAD(true, 0, NULL, 0));
-@@ -59,6 +73,11 @@ static int gd5fxgq4xa_ooblayout_free(str
- return 0;
- }
-
-+static const struct mtd_ooblayout_ops gd5fxgq4xa_ooblayout = {
-+ .ecc = gd5fxgq4xa_ooblayout_ecc,
-+ .free = gd5fxgq4xa_ooblayout_free,
-+};
-+
- static int gd5fxgq4xa_ecc_get_status(struct spinand_device *spinand,
- u8 status)
- {
-@@ -83,7 +102,7 @@ static int gd5fxgq4xa_ecc_get_status(str
- return -EINVAL;
- }
-
--static int gd5fxgq4uexxg_ooblayout_ecc(struct mtd_info *mtd, int section,
-+static int gd5fxgq4_variant2_ooblayout_ecc(struct mtd_info *mtd, int section,
- struct mtd_oob_region *region)
- {
- if (section)
-@@ -95,7 +114,7 @@ static int gd5fxgq4uexxg_ooblayout_ecc(s
- return 0;
- }
-
--static int gd5fxgq4uexxg_ooblayout_free(struct mtd_info *mtd, int section,
-+static int gd5fxgq4_variant2_ooblayout_free(struct mtd_info *mtd, int section,
- struct mtd_oob_region *region)
- {
- if (section)
-@@ -108,6 +127,11 @@ static int gd5fxgq4uexxg_ooblayout_free(
- return 0;
- }
-
-+static const struct mtd_ooblayout_ops gd5fxgq4_variant2_ooblayout = {
-+ .ecc = gd5fxgq4_variant2_ooblayout_ecc,
-+ .free = gd5fxgq4_variant2_ooblayout_free,
-+};
-+
- static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand,
- u8 status)
- {
-@@ -150,15 +174,25 @@ static int gd5fxgq4uexxg_ecc_get_status(
- return -EINVAL;
- }
-
--static const struct mtd_ooblayout_ops gd5fxgq4xa_ooblayout = {
-- .ecc = gd5fxgq4xa_ooblayout_ecc,
-- .free = gd5fxgq4xa_ooblayout_free,
--};
-+static int gd5fxgq4ufxxg_ecc_get_status(struct spinand_device *spinand,
-+ u8 status)
-+{
-+ switch (status & GD5FXGQ4UXFXXG_STATUS_ECC_MASK) {
-+ case GD5FXGQ4UXFXXG_STATUS_ECC_NO_BITFLIPS:
-+ return 0;
-
--static const struct mtd_ooblayout_ops gd5fxgq4uexxg_ooblayout = {
-- .ecc = gd5fxgq4uexxg_ooblayout_ecc,
-- .free = gd5fxgq4uexxg_ooblayout_free,
--};
-+ case GD5FXGQ4UXFXXG_STATUS_ECC_1_3_BITFLIPS:
-+ return 3;
-+
-+ case GD5FXGQ4UXFXXG_STATUS_ECC_UNCOR_ERROR:
-+ return -EBADMSG;
-+
-+ default: /* (2 << 4) through (6 << 4) are 4-8 corrected errors */
-+ return ((status & GD5FXGQ4UXFXXG_STATUS_ECC_MASK) >> 4) + 2;
-+ }
-+
-+ return -EINVAL;
-+}
-
- static const struct spinand_info gigadevice_spinand_table[] = {
- SPINAND_INFO("GD5F1GQ4xA", 0xF1,
-@@ -195,25 +229,40 @@ static const struct spinand_info gigadev
- &write_cache_variants,
- &update_cache_variants),
- 0,
-- SPINAND_ECCINFO(&gd5fxgq4uexxg_ooblayout,
-+ SPINAND_ECCINFO(&gd5fxgq4_variant2_ooblayout,
- gd5fxgq4uexxg_ecc_get_status)),
-+ SPINAND_INFO("GD5F1GQ4UFxxG", 0xb148,
-+ NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_f,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&gd5fxgq4_variant2_ooblayout,
-+ gd5fxgq4ufxxg_ecc_get_status)),
- };
-
- static int gigadevice_spinand_detect(struct spinand_device *spinand)
- {
- u8 *id = spinand->id.data;
-+ u16 did;
- int ret;
-
- /*
-- * For GD NANDs, There is an address byte needed to shift in before IDs
-- * are read out, so the first byte in raw_id is dummy.
-+ * Earlier GDF5-series devices (A,E) return [0][MID][DID]
-+ * Later (F) devices return [MID][DID1][DID2]
- */
-- if (id[1] != SPINAND_MFR_GIGADEVICE)
-+
-+ if (id[0] == SPINAND_MFR_GIGADEVICE)
-+ did = (id[1] << 8) + id[2];
-+ else if (id[0] == 0 && id[1] == SPINAND_MFR_GIGADEVICE)
-+ did = id[2];
-+ else
- return 0;
-
- ret = spinand_match_and_init(spinand, gigadevice_spinand_table,
- ARRAY_SIZE(gigadevice_spinand_table),
-- id[2]);
-+ did);
- if (ret)
- return ret;
-
+++ /dev/null
-From 3552691616c940a7c4125c2678ba816653cd725e Mon Sep 17 00:00:00 2001
-From: Jeff Kletsky <git-commits@allycomm.com>
-Date: Tue, 18 Jun 2019 10:08:05 -0700
-Subject: [PATCH] mtd: spinand: Add initial support for Paragon PN26G0xA
-
-Add initial support for Paragon Technology
-PN26G01Axxxxx and PN26G02Axxxxx SPI NAND
-
-Datasheets available at
-http://www.xtxtech.com/upfile/2016082517274590.pdf
-http://www.xtxtech.com/upfile/2016082517282329.pdf
-
-Signed-off-by: Jeff Kletsky <git-commits@allycomm.com>
-Reviewed-by: Frieder Schrempf <frieder.schrempf@kontron.de>
-Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
-
-ADOPTED FROM UPSTREAM due to upstream commit 377e517b5fa5 in Linux 5.2
- which added another parameter to NAND_MEMORG
----
- drivers/mtd/nand/spi/Makefile | 2 +-
- drivers/mtd/nand/spi/core.c | 1 +
- drivers/mtd/nand/spi/paragon.c | 147 +++++++++++++++++++++++++++++++++
- include/linux/mtd/spinand.h | 1 +
- 4 files changed, 150 insertions(+), 1 deletion(-)
- create mode 100644 drivers/mtd/nand/spi/paragon.c
-
---- a/drivers/mtd/nand/spi/Makefile
-+++ b/drivers/mtd/nand/spi/Makefile
-@@ -1,3 +1,3 @@
- # SPDX-License-Identifier: GPL-2.0
--spinand-objs := core.o gigadevice.o macronix.o micron.o toshiba.o winbond.o
-+spinand-objs := core.o gigadevice.o macronix.o micron.o paragon.o toshiba.o winbond.o
- obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
---- a/drivers/mtd/nand/spi/core.c
-+++ b/drivers/mtd/nand/spi/core.c
-@@ -765,6 +765,7 @@ static const struct spinand_manufacturer
- &gigadevice_spinand_manufacturer,
- ¯onix_spinand_manufacturer,
- µn_spinand_manufacturer,
-+ ¶gon_spinand_manufacturer,
- &toshiba_spinand_manufacturer,
- &winbond_spinand_manufacturer,
- };
---- /dev/null
-+++ b/drivers/mtd/nand/spi/paragon.c
-@@ -0,0 +1,147 @@
-+// SPDX-License-Identifier: GPL-2.0
-+/*
-+ * Copyright (C) 2019 Jeff Kletsky
-+ *
-+ * Author: Jeff Kletsky <git-commits@allycomm.com>
-+ */
-+
-+#include <linux/device.h>
-+#include <linux/kernel.h>
-+#include <linux/mtd/spinand.h>
-+
-+
-+#define SPINAND_MFR_PARAGON 0xa1
-+
-+
-+#define PN26G0XA_STATUS_ECC_BITMASK (3 << 4)
-+
-+#define PN26G0XA_STATUS_ECC_NONE_DETECTED (0 << 4)
-+#define PN26G0XA_STATUS_ECC_1_7_CORRECTED (1 << 4)
-+#define PN26G0XA_STATUS_ECC_ERRORED (2 << 4)
-+#define PN26G0XA_STATUS_ECC_8_CORRECTED (3 << 4)
-+
-+
-+static SPINAND_OP_VARIANTS(read_cache_variants,
-+ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
-+ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
-+
-+static SPINAND_OP_VARIANTS(write_cache_variants,
-+ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
-+ SPINAND_PROG_LOAD(true, 0, NULL, 0));
-+
-+static SPINAND_OP_VARIANTS(update_cache_variants,
-+ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
-+ SPINAND_PROG_LOAD(false, 0, NULL, 0));
-+
-+
-+static int pn26g0xa_ooblayout_ecc(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *region)
-+{
-+ if (section > 3)
-+ return -ERANGE;
-+
-+ region->offset = 6 + (15 * section); /* 4 BBM + 2 user bytes */
-+ region->length = 13;
-+
-+ return 0;
-+}
-+
-+static int pn26g0xa_ooblayout_free(struct mtd_info *mtd, int section,
-+ struct mtd_oob_region *region)
-+{
-+ if (section > 4)
-+ return -ERANGE;
-+
-+ if (section == 4) {
-+ region->offset = 64;
-+ region->length = 64;
-+ } else {
-+ region->offset = 4 + (15 * section);
-+ region->length = 2;
-+ }
-+
-+ return 0;
-+}
-+
-+static int pn26g0xa_ecc_get_status(struct spinand_device *spinand,
-+ u8 status)
-+{
-+ switch (status & PN26G0XA_STATUS_ECC_BITMASK) {
-+ case PN26G0XA_STATUS_ECC_NONE_DETECTED:
-+ return 0;
-+
-+ case PN26G0XA_STATUS_ECC_1_7_CORRECTED:
-+ return 7; /* Return upper limit by convention */
-+
-+ case PN26G0XA_STATUS_ECC_8_CORRECTED:
-+ return 8;
-+
-+ case PN26G0XA_STATUS_ECC_ERRORED:
-+ return -EBADMSG;
-+
-+ default:
-+ break;
-+ }
-+
-+ return -EINVAL;
-+}
-+
-+static const struct mtd_ooblayout_ops pn26g0xa_ooblayout = {
-+ .ecc = pn26g0xa_ooblayout_ecc,
-+ .free = pn26g0xa_ooblayout_free,
-+};
-+
-+
-+static const struct spinand_info paragon_spinand_table[] = {
-+ SPINAND_INFO("PN26G01A", 0xe1,
-+ NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&pn26g0xa_ooblayout,
-+ pn26g0xa_ecc_get_status)),
-+ SPINAND_INFO("PN26G02A", 0xe2,
-+ NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
-+ NAND_ECCREQ(8, 512),
-+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+ &write_cache_variants,
-+ &update_cache_variants),
-+ 0,
-+ SPINAND_ECCINFO(&pn26g0xa_ooblayout,
-+ pn26g0xa_ecc_get_status)),
-+};
-+
-+static int paragon_spinand_detect(struct spinand_device *spinand)
-+{
-+ u8 *id = spinand->id.data;
-+ int ret;
-+
-+ /* Read ID returns [0][MID][DID] */
-+
-+ if (id[1] != SPINAND_MFR_PARAGON)
-+ return 0;
-+
-+ ret = spinand_match_and_init(spinand, paragon_spinand_table,
-+ ARRAY_SIZE(paragon_spinand_table),
-+ id[2]);
-+ if (ret)
-+ return ret;
-+
-+ return 1;
-+}
-+
-+static const struct spinand_manufacturer_ops paragon_spinand_manuf_ops = {
-+ .detect = paragon_spinand_detect,
-+};
-+
-+const struct spinand_manufacturer paragon_spinand_manufacturer = {
-+ .id = SPINAND_MFR_PARAGON,
-+ .name = "Paragon",
-+ .ops = ¶gon_spinand_manuf_ops,
-+};
---- a/include/linux/mtd/spinand.h
-+++ b/include/linux/mtd/spinand.h
-@@ -227,6 +227,7 @@ struct spinand_manufacturer {
- extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;
- extern const struct spinand_manufacturer macronix_spinand_manufacturer;
- extern const struct spinand_manufacturer micron_spinand_manufacturer;
-+extern const struct spinand_manufacturer paragon_spinand_manufacturer;
- extern const struct spinand_manufacturer toshiba_spinand_manufacturer;
- extern const struct spinand_manufacturer winbond_spinand_manufacturer;
-
+++ /dev/null
-From 6f3ea4e5b1f0867ec217f6101fcb89783ed905d7 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Sat, 9 Feb 2019 18:23:26 +0000
-Subject: [PATCH] net: phylink: only call mac_config() during resolve
- when link is up
-
-There's little point calling mac_config() when the link is down.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 11 +++++++++--
- 1 file changed, 9 insertions(+), 2 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -339,6 +339,13 @@ static void phylink_mac_config(struct ph
- pl->ops->mac_config(pl->netdev, pl->link_an_mode, state);
- }
-
-+static void phylink_mac_config_up(struct phylink *pl,
-+ const struct phylink_link_state *state)
-+{
-+ if (state->link)
-+ phylink_mac_config(pl, state);
-+}
-+
- static void phylink_mac_an_restart(struct phylink *pl)
- {
- if (pl->link_config.an_enabled &&
-@@ -442,12 +449,12 @@ static void phylink_resolve(struct work_
- case MLO_AN_PHY:
- link_state = pl->phy_state;
- phylink_resolve_flow(pl, &link_state);
-- phylink_mac_config(pl, &link_state);
-+ phylink_mac_config_up(pl, &link_state);
- break;
-
- case MLO_AN_FIXED:
- phylink_get_fixed_state(pl, &link_state);
-- phylink_mac_config(pl, &link_state);
-+ phylink_mac_config_up(pl, &link_state);
- break;
-
- case MLO_AN_INBAND:
+++ /dev/null
-From 72f973f292b3eaaf451ebcd3253900d41f4ef24a Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 25 Jan 2019 17:42:51 +0000
-Subject: [PATCH] net: phylink: ensure inband AN works correctly
-
-Do not update the link interface mode while the link is down to avoid
-spurious link interface changes.
-
-Always call mac_config if we have a PHY to propagate the pause mode
-settings to the MAC.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 37 +++++++++++++++----------------------
- 1 file changed, 15 insertions(+), 22 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -459,28 +459,21 @@ static void phylink_resolve(struct work_
-
- case MLO_AN_INBAND:
- phylink_get_mac_state(pl, &link_state);
-- if (pl->phydev) {
-- bool changed = false;
-
-- link_state.link = link_state.link &&
-- pl->phy_state.link;
-+ /* If we have a phy, the "up" state is the union of
-+ * both the PHY and the MAC */
-+ if (pl->phydev)
-+ link_state.link &= pl->phy_state.link;
-
-- if (pl->phy_state.interface !=
-- link_state.interface) {
-- link_state.interface = pl->phy_state.interface;
-- changed = true;
-- }
-+ /* Only update if the PHY link is up */
-+ if (pl->phydev && pl->phy_state.link) {
-+ link_state.interface = pl->phy_state.interface;
-
-- /* Propagate the flow control from the PHY
-- * to the MAC. Also propagate the interface
-- * if changed.
-- */
-- if (pl->phy_state.link || changed) {
-- link_state.pause |= pl->phy_state.pause;
-- phylink_resolve_flow(pl, &link_state);
--
-- phylink_mac_config(pl, &link_state);
-- }
-+ /* If we have a PHY, we need to update with
-+ * the pause mode bits. */
-+ link_state.pause |= pl->phy_state.pause;
-+ phylink_resolve_flow(pl, &link_state);
-+ phylink_mac_config(pl, &link_state);
- }
- break;
- }
+++ /dev/null
-From 1da223db3a0c522300b519ecbe1dc45927e28088 Mon Sep 17 00:00:00 2001
-From: Andrew Lunn <andrew@lunn.ch>
-Date: Wed, 12 Sep 2018 01:53:15 +0200
-Subject: [PATCH 600/660] net: ethernet: Add helper for MACs which support asym
- pause
-
-Rather than have the MAC drivers manipulate phydev members to indicate
-they support Asym Pause, add a helper function.
-
-Signed-off-by: Andrew Lunn <andrew@lunn.ch>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/phy_device.c | 13 +++++++++++++
- include/linux/phy.h | 1 +
- 2 files changed, 14 insertions(+)
-
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -1777,6 +1777,19 @@ int phy_set_max_speed(struct phy_device
- }
- EXPORT_SYMBOL(phy_set_max_speed);
-
-+/**
-+ * phy_support_asym_pause - Enable support of asym pause
-+ * @phydev: target phy_device struct
-+ *
-+ * Description: Called by the MAC to indicate is supports Asym Pause.
-+ */
-+void phy_support_asym_pause(struct phy_device *phydev)
-+{
-+ phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
-+ phydev->advertising = phydev->supported;
-+}
-+EXPORT_SYMBOL(phy_support_asym_pause);
-+
- static void of_set_phy_supported(struct phy_device *phydev)
- {
- struct device_node *node = phydev->mdio.dev.of_node;
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -1049,6 +1049,7 @@ int phy_mii_ioctl(struct phy_device *phy
- int phy_start_interrupts(struct phy_device *phydev);
- void phy_print_status(struct phy_device *phydev);
- int phy_set_max_speed(struct phy_device *phydev, u32 max_speed);
-+void phy_support_asym_pause(struct phy_device *phydev);
-
- int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
- int (*run)(struct phy_device *));
+++ /dev/null
-From ce825df56e0480a2cbb296e38976babafb57e503 Mon Sep 17 00:00:00 2001
-From: Andrew Lunn <andrew@lunn.ch>
-Date: Wed, 12 Sep 2018 01:53:17 +0200
-Subject: [PATCH 601/660] net: ethernet: Add helper for set_pauseparam for Asym
- Pause
-
-ethtool can be used to enable/disable pause. Add a helper to configure
-the PHY when asym pause is supported.
-
-Signed-off-by: Andrew Lunn <andrew@lunn.ch>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/phy_device.c | 30 ++++++++++++++++++++++++++++++
- include/linux/phy.h | 1 +
- 2 files changed, 31 insertions(+)
-
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -1790,6 +1790,36 @@ void phy_support_asym_pause(struct phy_d
- }
- EXPORT_SYMBOL(phy_support_asym_pause);
-
-+/**
-+ * phy_set_asym_pause - Configure Pause and Asym Pause
-+ * @phydev: target phy_device struct
-+ * @rx: Receiver Pause is supported
-+ * @tx: Transmit Pause is supported
-+ *
-+ * Description: Configure advertised Pause support depending on if
-+ * transmit and receiver pause is supported. If there has been a
-+ * change in adverting, trigger a new autoneg. Generally called from
-+ * the set_pauseparam .ndo.
-+ */
-+void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx)
-+{
-+ u16 oldadv = phydev->advertising;
-+ u16 newadv = oldadv &= ~(SUPPORTED_Pause | SUPPORTED_Asym_Pause);
-+
-+ if (rx)
-+ newadv |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
-+ if (tx)
-+ newadv ^= SUPPORTED_Asym_Pause;
-+
-+ if (oldadv != newadv) {
-+ phydev->advertising = newadv;
-+
-+ if (phydev->autoneg)
-+ phy_start_aneg(phydev);
-+ }
-+}
-+EXPORT_SYMBOL(phy_set_asym_pause);
-+
- static void of_set_phy_supported(struct phy_device *phydev)
- {
- struct device_node *node = phydev->mdio.dev.of_node;
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -1050,6 +1050,7 @@ int phy_start_interrupts(struct phy_devi
- void phy_print_status(struct phy_device *phydev);
- int phy_set_max_speed(struct phy_device *phydev, u32 max_speed);
- void phy_support_asym_pause(struct phy_device *phydev);
-+void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx);
-
- int phy_register_fixup(const char *bus_id, u32 phy_uid, u32 phy_uid_mask,
- int (*run)(struct phy_device *));
+++ /dev/null
-From 1541649a9dd79e9b941d399de564475e426a2d0b Mon Sep 17 00:00:00 2001
-From: Florian Fainelli <f.fainelli@gmail.com>
-Date: Tue, 25 Sep 2018 11:28:45 -0700
-Subject: [PATCH 602/660] net: phy: Stop with excessive soft reset
-
-While consolidating the PHY reset in phy_init_hw() an unconditionaly
-BMCR soft-reset I became quite trigger happy with those. This was later
-on deactivated for the Generic PHY driver on the premise that a prior
-software entity (e.g: bootloader) might have applied workarounds in
-commit 0878fff1f42c ("net: phy: Do not perform software reset for
-Generic PHY").
-
-Since we have a hook to wire-up a soft_reset callback, just use that and
-get rid of the call to genphy_soft_reset() entirely. This speeds up
-initialization and link establishment for most PHYs out there that do
-not require a reset.
-
-Fixes: 87aa9f9c61ad ("net: phy: consolidate PHY reset in phy_init_hw()")
-Tested-by: Wang, Dongsheng <dongsheng.wang@hxt-semitech.com>
-Tested-by: Chris Healy <cphealy@gmail.com>
-Tested-by: Andrew Lunn <andrew@lunn.ch>
-Tested-by: Clemens Gruber <clemens.gruber@pqgruber.com>
-Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phy_device.c | 2 --
- 1 file changed, 2 deletions(-)
-
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -886,8 +886,6 @@ int phy_init_hw(struct phy_device *phyde
-
- if (phydev->drv->soft_reset)
- ret = phydev->drv->soft_reset(phydev);
-- else
-- ret = genphy_soft_reset(phydev);
-
- if (ret < 0)
- return ret;
+++ /dev/null
-From 80758d9542205cd2e9fa730067bc3888d4f5a096 Mon Sep 17 00:00:00 2001
-From: Nikita Yushchenko <nikita.yoush@cogentembedded.com>
-Date: Wed, 6 Feb 2019 07:36:40 +0100
-Subject: [PATCH 603/660] net: phy: provide full set of accessor functions to
- MMD registers
-
-This adds full set of locked and unlocked accessor functions to read and
-write PHY MMD registers and/or bitfields.
-
-Set of functions exactly matches what is already available for PHY
-legacy registers.
-
-Signed-off-by: Nikita Yushchenko <nikita.yoush@cogentembedded.com>
-Signed-off-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phy-core.c | 116 ++++++++++++++++++++++++++++----
- include/linux/phy.h | 134 ++++++++++++++++++++++++++++++-------
- 2 files changed, 214 insertions(+), 36 deletions(-)
-
---- a/drivers/net/phy/phy-core.c
-+++ b/drivers/net/phy/phy-core.c
-@@ -247,15 +247,15 @@ static void mmd_phy_indirect(struct mii_
- }
-
- /**
-- * phy_read_mmd - Convenience function for reading a register
-+ * __phy_read_mmd - Convenience function for reading a register
- * from an MMD on a given PHY.
- * @phydev: The phy_device struct
- * @devad: The MMD to read from (0..31)
- * @regnum: The register on the MMD to read (0..65535)
- *
-- * Same rules as for phy_read();
-+ * Same rules as for __phy_read();
- */
--int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum)
-+int __phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum)
- {
- int val;
-
-@@ -267,33 +267,52 @@ int phy_read_mmd(struct phy_device *phyd
- } else if (phydev->is_c45) {
- u32 addr = MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff);
-
-- val = mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, addr);
-+ val = __mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, addr);
- } else {
- struct mii_bus *bus = phydev->mdio.bus;
- int phy_addr = phydev->mdio.addr;
-
-- mutex_lock(&bus->mdio_lock);
- mmd_phy_indirect(bus, phy_addr, devad, regnum);
-
- /* Read the content of the MMD's selected register */
- val = __mdiobus_read(bus, phy_addr, MII_MMD_DATA);
-- mutex_unlock(&bus->mdio_lock);
- }
- return val;
- }
-+EXPORT_SYMBOL(__phy_read_mmd);
-+
-+/**
-+ * phy_read_mmd - Convenience function for reading a register
-+ * from an MMD on a given PHY.
-+ * @phydev: The phy_device struct
-+ * @devad: The MMD to read from
-+ * @regnum: The register on the MMD to read
-+ *
-+ * Same rules as for phy_read();
-+ */
-+int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum)
-+{
-+ int ret;
-+
-+ mutex_lock(&phydev->mdio.bus->mdio_lock);
-+ ret = __phy_read_mmd(phydev, devad, regnum);
-+ mutex_unlock(&phydev->mdio.bus->mdio_lock);
-+
-+ return ret;
-+}
- EXPORT_SYMBOL(phy_read_mmd);
-
- /**
-- * phy_write_mmd - Convenience function for writing a register
-+ * __phy_write_mmd - Convenience function for writing a register
- * on an MMD on a given PHY.
- * @phydev: The phy_device struct
- * @devad: The MMD to read from
- * @regnum: The register on the MMD to read
- * @val: value to write to @regnum
- *
-- * Same rules as for phy_write();
-+ * Same rules as for __phy_write();
- */
--int phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val)
-+int __phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val)
- {
- int ret;
-
-@@ -305,23 +324,43 @@ int phy_write_mmd(struct phy_device *phy
- } else if (phydev->is_c45) {
- u32 addr = MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff);
-
-- ret = mdiobus_write(phydev->mdio.bus, phydev->mdio.addr,
-- addr, val);
-+ ret = __mdiobus_write(phydev->mdio.bus, phydev->mdio.addr,
-+ addr, val);
- } else {
- struct mii_bus *bus = phydev->mdio.bus;
- int phy_addr = phydev->mdio.addr;
-
-- mutex_lock(&bus->mdio_lock);
- mmd_phy_indirect(bus, phy_addr, devad, regnum);
-
- /* Write the data into MMD's selected register */
- __mdiobus_write(bus, phy_addr, MII_MMD_DATA, val);
-- mutex_unlock(&bus->mdio_lock);
-
- ret = 0;
- }
- return ret;
- }
-+EXPORT_SYMBOL(__phy_write_mmd);
-+
-+/**
-+ * phy_write_mmd - Convenience function for writing a register
-+ * on an MMD on a given PHY.
-+ * @phydev: The phy_device struct
-+ * @devad: The MMD to read from
-+ * @regnum: The register on the MMD to read
-+ * @val: value to write to @regnum
-+ *
-+ * Same rules as for phy_write();
-+ */
-+int phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val)
-+{
-+ int ret;
-+
-+ mutex_lock(&phydev->mdio.bus->mdio_lock);
-+ ret = __phy_write_mmd(phydev, devad, regnum, val);
-+ mutex_unlock(&phydev->mdio.bus->mdio_lock);
-+
-+ return ret;
-+}
- EXPORT_SYMBOL(phy_write_mmd);
-
- /**
-@@ -371,6 +410,57 @@ int phy_modify(struct phy_device *phydev
- }
- EXPORT_SYMBOL_GPL(phy_modify);
-
-+/**
-+ * __phy_modify_mmd - Convenience function for modifying a register on MMD
-+ * @phydev: the phy_device struct
-+ * @devad: the MMD containing register to modify
-+ * @regnum: register number to modify
-+ * @mask: bit mask of bits to clear
-+ * @set: new value of bits set in mask to write to @regnum
-+ *
-+ * Unlocked helper function which allows a MMD register to be modified as
-+ * new register value = (old register value & ~mask) | set
-+ */
-+int __phy_modify_mmd(struct phy_device *phydev, int devad, u32 regnum,
-+ u16 mask, u16 set)
-+{
-+ int ret;
-+
-+ ret = __phy_read_mmd(phydev, devad, regnum);
-+ if (ret < 0)
-+ return ret;
-+
-+ ret = __phy_write_mmd(phydev, devad, regnum, (ret & ~mask) | set);
-+
-+ return ret < 0 ? ret : 0;
-+}
-+EXPORT_SYMBOL_GPL(__phy_modify_mmd);
-+
-+/**
-+ * phy_modify_mmd - Convenience function for modifying a register on MMD
-+ * @phydev: the phy_device struct
-+ * @devad: the MMD containing register to modify
-+ * @regnum: register number to modify
-+ * @mask: bit mask of bits to clear
-+ * @set: new value of bits set in mask to write to @regnum
-+ *
-+ * NOTE: MUST NOT be called from interrupt context,
-+ * because the bus read/write functions may wait for an interrupt
-+ * to conclude the operation.
-+ */
-+int phy_modify_mmd(struct phy_device *phydev, int devad, u32 regnum,
-+ u16 mask, u16 set)
-+{
-+ int ret;
-+
-+ mutex_lock(&phydev->mdio.bus->mdio_lock);
-+ ret = __phy_modify_mmd(phydev, devad, regnum, mask, set);
-+ mutex_unlock(&phydev->mdio.bus->mdio_lock);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(phy_modify_mmd);
-+
- static int __phy_read_page(struct phy_device *phydev)
- {
- return phydev->drv->read_page(phydev);
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -695,17 +695,6 @@ size_t phy_speeds(unsigned int *speeds,
- void phy_resolve_aneg_linkmode(struct phy_device *phydev);
-
- /**
-- * phy_read_mmd - Convenience function for reading a register
-- * from an MMD on a given PHY.
-- * @phydev: The phy_device struct
-- * @devad: The MMD to read from
-- * @regnum: The register on the MMD to read
-- *
-- * Same rules as for phy_read();
-- */
--int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum);
--
--/**
- * phy_read - Convenience function for reading a given PHY register
- * @phydev: the phy_device struct
- * @regnum: register number to read
-@@ -760,9 +749,60 @@ static inline int __phy_write(struct phy
- val);
- }
-
-+/**
-+ * phy_read_mmd - Convenience function for reading a register
-+ * from an MMD on a given PHY.
-+ * @phydev: The phy_device struct
-+ * @devad: The MMD to read from
-+ * @regnum: The register on the MMD to read
-+ *
-+ * Same rules as for phy_read();
-+ */
-+int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum);
-+
-+/**
-+ * __phy_read_mmd - Convenience function for reading a register
-+ * from an MMD on a given PHY.
-+ * @phydev: The phy_device struct
-+ * @devad: The MMD to read from
-+ * @regnum: The register on the MMD to read
-+ *
-+ * Same rules as for __phy_read();
-+ */
-+int __phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum);
-+
-+/**
-+ * phy_write_mmd - Convenience function for writing a register
-+ * on an MMD on a given PHY.
-+ * @phydev: The phy_device struct
-+ * @devad: The MMD to write to
-+ * @regnum: The register on the MMD to read
-+ * @val: value to write to @regnum
-+ *
-+ * Same rules as for phy_write();
-+ */
-+int phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val);
-+
-+/**
-+ * __phy_write_mmd - Convenience function for writing a register
-+ * on an MMD on a given PHY.
-+ * @phydev: The phy_device struct
-+ * @devad: The MMD to write to
-+ * @regnum: The register on the MMD to read
-+ * @val: value to write to @regnum
-+ *
-+ * Same rules as for __phy_write();
-+ */
-+int __phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val);
-+
- int __phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set);
- int phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set);
-
-+int __phy_modify_mmd(struct phy_device *phydev, int devad, u32 regnum,
-+ u16 mask, u16 set);
-+int phy_modify_mmd(struct phy_device *phydev, int devad, u32 regnum,
-+ u16 mask, u16 set);
-+
- /**
- * __phy_set_bits - Convenience function for setting bits in a PHY register
- * @phydev: the phy_device struct
-@@ -813,6 +853,66 @@ static inline int phy_clear_bits(struct
- }
-
- /**
-+ * __phy_set_bits_mmd - Convenience function for setting bits in a register
-+ * on MMD
-+ * @phydev: the phy_device struct
-+ * @devad: the MMD containing register to modify
-+ * @regnum: register number to modify
-+ * @val: bits to set
-+ *
-+ * The caller must have taken the MDIO bus lock.
-+ */
-+static inline int __phy_set_bits_mmd(struct phy_device *phydev, int devad,
-+ u32 regnum, u16 val)
-+{
-+ return __phy_modify_mmd(phydev, devad, regnum, 0, val);
-+}
-+
-+/**
-+ * __phy_clear_bits_mmd - Convenience function for clearing bits in a register
-+ * on MMD
-+ * @phydev: the phy_device struct
-+ * @devad: the MMD containing register to modify
-+ * @regnum: register number to modify
-+ * @val: bits to clear
-+ *
-+ * The caller must have taken the MDIO bus lock.
-+ */
-+static inline int __phy_clear_bits_mmd(struct phy_device *phydev, int devad,
-+ u32 regnum, u16 val)
-+{
-+ return __phy_modify_mmd(phydev, devad, regnum, val, 0);
-+}
-+
-+/**
-+ * phy_set_bits_mmd - Convenience function for setting bits in a register
-+ * on MMD
-+ * @phydev: the phy_device struct
-+ * @devad: the MMD containing register to modify
-+ * @regnum: register number to modify
-+ * @val: bits to set
-+ */
-+static inline int phy_set_bits_mmd(struct phy_device *phydev, int devad,
-+ u32 regnum, u16 val)
-+{
-+ return phy_modify_mmd(phydev, devad, regnum, 0, val);
-+}
-+
-+/**
-+ * phy_clear_bits_mmd - Convenience function for clearing bits in a register
-+ * on MMD
-+ * @phydev: the phy_device struct
-+ * @devad: the MMD containing register to modify
-+ * @regnum: register number to modify
-+ * @val: bits to clear
-+ */
-+static inline int phy_clear_bits_mmd(struct phy_device *phydev, int devad,
-+ u32 regnum, u16 val)
-+{
-+ return phy_modify_mmd(phydev, devad, regnum, val, 0);
-+}
-+
-+/**
- * phy_interrupt_is_valid - Convenience function for testing a given PHY irq
- * @phydev: the phy_device struct
- *
-@@ -888,18 +988,6 @@ static inline bool phy_is_pseudo_fixed_l
- return phydev->is_pseudo_fixed_link;
- }
-
--/**
-- * phy_write_mmd - Convenience function for writing a register
-- * on an MMD on a given PHY.
-- * @phydev: The phy_device struct
-- * @devad: The MMD to read from
-- * @regnum: The register on the MMD to read
-- * @val: value to write to @regnum
-- *
-- * Same rules as for phy_write();
-- */
--int phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val);
--
- int phy_save_page(struct phy_device *phydev);
- int phy_select_page(struct phy_device *phydev, int page);
- int phy_restore_page(struct phy_device *phydev, int oldpage, int ret);
+++ /dev/null
-From c1e3f753f6b85d7636024159bb78f764e09492f1 Mon Sep 17 00:00:00 2001
-From: Heiner Kallweit <hkallweit1@gmail.com>
-Date: Sun, 10 Feb 2019 19:57:56 +0100
-Subject: [PATCH 604/660] net: phy: add register modifying helpers returning 1
- on change
-
-When modifying registers there are scenarios where we need to know
-whether the register content actually changed. This patch adds
-new helpers to not break users of the current ones, phy_modify() etc.
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phy-core.c | 127 ++++++++++++++++++++++++++++++++++---
- include/linux/phy.h | 12 +++-
- 2 files changed, 128 insertions(+), 11 deletions(-)
-
---- a/drivers/net/phy/phy-core.c
-+++ b/drivers/net/phy/phy-core.c
-@@ -364,7 +364,7 @@ int phy_write_mmd(struct phy_device *phy
- EXPORT_SYMBOL(phy_write_mmd);
-
- /**
-- * __phy_modify() - Convenience function for modifying a PHY register
-+ * __phy_modify_changed() - Convenience function for modifying a PHY register
- * @phydev: a pointer to a &struct phy_device
- * @regnum: register number
- * @mask: bit mask of bits to clear
-@@ -372,16 +372,69 @@ EXPORT_SYMBOL(phy_write_mmd);
- *
- * Unlocked helper function which allows a PHY register to be modified as
- * new register value = (old register value & ~mask) | set
-+ *
-+ * Returns negative errno, 0 if there was no change, and 1 in case of change
- */
--int __phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set)
-+int __phy_modify_changed(struct phy_device *phydev, u32 regnum, u16 mask,
-+ u16 set)
- {
-- int ret;
-+ int new, ret;
-
- ret = __phy_read(phydev, regnum);
- if (ret < 0)
- return ret;
-
-- ret = __phy_write(phydev, regnum, (ret & ~mask) | set);
-+ new = (ret & ~mask) | set;
-+ if (new == ret)
-+ return 0;
-+
-+ ret = __phy_write(phydev, regnum, new);
-+
-+ return ret < 0 ? ret : 1;
-+}
-+EXPORT_SYMBOL_GPL(__phy_modify_changed);
-+
-+/**
-+ * phy_modify_changed - Function for modifying a PHY register
-+ * @phydev: the phy_device struct
-+ * @regnum: register number to modify
-+ * @mask: bit mask of bits to clear
-+ * @set: new value of bits set in mask to write to @regnum
-+ *
-+ * NOTE: MUST NOT be called from interrupt context,
-+ * because the bus read/write functions may wait for an interrupt
-+ * to conclude the operation.
-+ *
-+ * Returns negative errno, 0 if there was no change, and 1 in case of change
-+ */
-+int phy_modify_changed(struct phy_device *phydev, u32 regnum, u16 mask, u16 set)
-+{
-+ int ret;
-+
-+ mutex_lock(&phydev->mdio.bus->mdio_lock);
-+ ret = __phy_modify_changed(phydev, regnum, mask, set);
-+ mutex_unlock(&phydev->mdio.bus->mdio_lock);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(phy_modify_changed);
-+
-+/**
-+ * __phy_modify - Convenience function for modifying a PHY register
-+ * @phydev: the phy_device struct
-+ * @regnum: register number to modify
-+ * @mask: bit mask of bits to clear
-+ * @set: new value of bits set in mask to write to @regnum
-+ *
-+ * NOTE: MUST NOT be called from interrupt context,
-+ * because the bus read/write functions may wait for an interrupt
-+ * to conclude the operation.
-+ */
-+int __phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set)
-+{
-+ int ret;
-+
-+ ret = __phy_modify_changed(phydev, regnum, mask, set);
-
- return ret < 0 ? ret : 0;
- }
-@@ -411,7 +464,7 @@ int phy_modify(struct phy_device *phydev
- EXPORT_SYMBOL_GPL(phy_modify);
-
- /**
-- * __phy_modify_mmd - Convenience function for modifying a register on MMD
-+ * __phy_modify_mmd_changed - Function for modifying a register on MMD
- * @phydev: the phy_device struct
- * @devad: the MMD containing register to modify
- * @regnum: register number to modify
-@@ -420,17 +473,73 @@ EXPORT_SYMBOL_GPL(phy_modify);
- *
- * Unlocked helper function which allows a MMD register to be modified as
- * new register value = (old register value & ~mask) | set
-+ *
-+ * Returns negative errno, 0 if there was no change, and 1 in case of change
- */
--int __phy_modify_mmd(struct phy_device *phydev, int devad, u32 regnum,
-- u16 mask, u16 set)
-+int __phy_modify_mmd_changed(struct phy_device *phydev, int devad, u32 regnum,
-+ u16 mask, u16 set)
- {
-- int ret;
-+ int new, ret;
-
- ret = __phy_read_mmd(phydev, devad, regnum);
- if (ret < 0)
- return ret;
-
-- ret = __phy_write_mmd(phydev, devad, regnum, (ret & ~mask) | set);
-+ new = (ret & ~mask) | set;
-+ if (new == ret)
-+ return 0;
-+
-+ ret = __phy_write_mmd(phydev, devad, regnum, new);
-+
-+ return ret < 0 ? ret : 1;
-+}
-+EXPORT_SYMBOL_GPL(__phy_modify_mmd_changed);
-+
-+/**
-+ * phy_modify_mmd_changed - Function for modifying a register on MMD
-+ * @phydev: the phy_device struct
-+ * @devad: the MMD containing register to modify
-+ * @regnum: register number to modify
-+ * @mask: bit mask of bits to clear
-+ * @set: new value of bits set in mask to write to @regnum
-+ *
-+ * NOTE: MUST NOT be called from interrupt context,
-+ * because the bus read/write functions may wait for an interrupt
-+ * to conclude the operation.
-+ *
-+ * Returns negative errno, 0 if there was no change, and 1 in case of change
-+ */
-+int phy_modify_mmd_changed(struct phy_device *phydev, int devad, u32 regnum,
-+ u16 mask, u16 set)
-+{
-+ int ret;
-+
-+ mutex_lock(&phydev->mdio.bus->mdio_lock);
-+ ret = __phy_modify_mmd_changed(phydev, devad, regnum, mask, set);
-+ mutex_unlock(&phydev->mdio.bus->mdio_lock);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(phy_modify_mmd_changed);
-+
-+/**
-+ * __phy_modify_mmd - Convenience function for modifying a register on MMD
-+ * @phydev: the phy_device struct
-+ * @devad: the MMD containing register to modify
-+ * @regnum: register number to modify
-+ * @mask: bit mask of bits to clear
-+ * @set: new value of bits set in mask to write to @regnum
-+ *
-+ * NOTE: MUST NOT be called from interrupt context,
-+ * because the bus read/write functions may wait for an interrupt
-+ * to conclude the operation.
-+ */
-+int __phy_modify_mmd(struct phy_device *phydev, int devad, u32 regnum,
-+ u16 mask, u16 set)
-+{
-+ int ret;
-+
-+ ret = __phy_modify_mmd_changed(phydev, devad, regnum, mask, set);
-
- return ret < 0 ? ret : 0;
- }
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -795,13 +795,21 @@ int phy_write_mmd(struct phy_device *phy
- */
- int __phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val);
-
-+int __phy_modify_changed(struct phy_device *phydev, u32 regnum, u16 mask,
-+ u16 set);
-+int phy_modify_changed(struct phy_device *phydev, u32 regnum, u16 mask,
-+ u16 set);
- int __phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set);
- int phy_modify(struct phy_device *phydev, u32 regnum, u16 mask, u16 set);
-
-+int __phy_modify_mmd_changed(struct phy_device *phydev, int devad, u32 regnum,
-+ u16 mask, u16 set);
-+int phy_modify_mmd_changed(struct phy_device *phydev, int devad, u32 regnum,
-+ u16 mask, u16 set);
- int __phy_modify_mmd(struct phy_device *phydev, int devad, u32 regnum,
-- u16 mask, u16 set);
-+ u16 mask, u16 set);
- int phy_modify_mmd(struct phy_device *phydev, int devad, u32 regnum,
-- u16 mask, u16 set);
-+ u16 mask, u16 set);
-
- /**
- * __phy_set_bits - Convenience function for setting bits in a PHY register
+++ /dev/null
-From 2c3db705737cf52d7d24c993f0889b25b956c718 Mon Sep 17 00:00:00 2001
-From: Heiner Kallweit <hkallweit1@gmail.com>
-Date: Mon, 18 Feb 2019 21:27:18 +0100
-Subject: [PATCH 605/660] net: phy: add genphy_c45_check_and_restart_aneg
-
-This function will be used by config_aneg callback implementations of
-PHY drivers and allows to reduce boilerplate code.
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/phy-c45.c | 30 ++++++++++++++++++++++++++++++
- include/linux/phy.h | 1 +
- 2 files changed, 31 insertions(+)
-
---- a/drivers/net/phy/phy-c45.c
-+++ b/drivers/net/phy/phy-c45.c
-@@ -110,6 +110,36 @@ int genphy_c45_restart_aneg(struct phy_d
- EXPORT_SYMBOL_GPL(genphy_c45_restart_aneg);
-
- /**
-+ * genphy_c45_check_and_restart_aneg - Enable and restart auto-negotiation
-+ * @phydev: target phy_device struct
-+ * @restart: whether aneg restart is requested
-+ *
-+ * This assumes that the auto-negotiation MMD is present.
-+ *
-+ * Check, and restart auto-negotiation if needed.
-+ */
-+int genphy_c45_check_and_restart_aneg(struct phy_device *phydev, bool restart)
-+{
-+ int ret = 0;
-+
-+ if (!restart) {
-+ /* Configure and restart aneg if it wasn't set before */
-+ ret = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
-+ if (ret < 0)
-+ return ret;
-+
-+ if (!(ret & MDIO_AN_CTRL1_ENABLE))
-+ restart = true;
-+ }
-+
-+ if (restart)
-+ ret = genphy_c45_restart_aneg(phydev);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(genphy_c45_check_and_restart_aneg);
-+
-+/**
- * genphy_c45_aneg_done - return auto-negotiation complete status
- * @phydev: target phy_device struct
- *
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -1098,6 +1098,7 @@ int genphy_write_mmd_unsupported(struct
-
- /* Clause 45 PHY */
- int genphy_c45_restart_aneg(struct phy_device *phydev);
-+int genphy_c45_check_and_restart_aneg(struct phy_device *phydev, bool restart);
- int genphy_c45_aneg_done(struct phy_device *phydev);
- int genphy_c45_read_link(struct phy_device *phydev, u32 mmd_mask);
- int genphy_c45_read_lpa(struct phy_device *phydev);
+++ /dev/null
-From 4c4323084e9a67210c8d269dceba1be99356c414 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 28 May 2019 10:57:18 +0100
-Subject: [PATCH 606/660] net: phylink: remove netdev from phylink mii ioctl
- emulation
-
-The netdev used in the phylink ioctl emulation is never used, so let's
-remove it.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 12 ++++--------
- 1 file changed, 4 insertions(+), 8 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -1360,8 +1360,8 @@ EXPORT_SYMBOL_GPL(phylink_ethtool_set_ee
- *
- * FIXME: should deal with negotiation state too.
- */
--static int phylink_mii_emul_read(struct net_device *ndev, unsigned int reg,
-- struct phylink_link_state *state, bool aneg)
-+static int phylink_mii_emul_read(unsigned int reg,
-+ struct phylink_link_state *state)
- {
- struct fixed_phy_status fs;
- int val;
-@@ -1376,8 +1376,6 @@ static int phylink_mii_emul_read(struct
- if (reg == MII_BMSR) {
- if (!state->an_complete)
- val &= ~BMSR_ANEGCOMPLETE;
-- if (!aneg)
-- val &= ~BMSR_ANEGCAPABLE;
- }
- return val;
- }
-@@ -1473,8 +1471,7 @@ static int phylink_mii_read(struct phyli
- case MLO_AN_FIXED:
- if (phy_id == 0) {
- phylink_get_fixed_state(pl, &state);
-- val = phylink_mii_emul_read(pl->netdev, reg, &state,
-- true);
-+ val = phylink_mii_emul_read(reg, &state);
- }
- break;
-
-@@ -1487,8 +1484,7 @@ static int phylink_mii_read(struct phyli
- if (val < 0)
- return val;
-
-- val = phylink_mii_emul_read(pl->netdev, reg, &state,
-- true);
-+ val = phylink_mii_emul_read(reg, &state);
- }
- break;
- }
+++ /dev/null
-From cba0aba37d2228556e0d1f776d403435868cdbfa Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 28 May 2019 10:57:23 +0100
-Subject: [PATCH 607/660] net: phylink: support for link gpio interrupt
-
-Add support for using GPIO interrupts with a fixed-link GPIO rather than
-polling the GPIO every second and invoking the phylink resolution. This
-avoids unnecessary calls to mac_config().
-
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 36 ++++++++++++++++++++++++++++++++----
- 1 file changed, 32 insertions(+), 4 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -59,6 +59,7 @@ struct phylink {
- phy_interface_t cur_interface;
-
- struct gpio_desc *link_gpio;
-+ unsigned int link_irq;
- struct timer_list link_poll;
- void (*get_fixed_state)(struct net_device *dev,
- struct phylink_link_state *s);
-@@ -645,7 +646,7 @@ void phylink_destroy(struct phylink *pl)
- {
- if (pl->sfp_bus)
- sfp_unregister_upstream(pl->sfp_bus);
-- if (!IS_ERR_OR_NULL(pl->link_gpio))
-+ if (pl->link_gpio)
- gpiod_put(pl->link_gpio);
-
- cancel_work_sync(&pl->resolve);
-@@ -912,6 +913,15 @@ void phylink_mac_change(struct phylink *
- }
- EXPORT_SYMBOL_GPL(phylink_mac_change);
-
-+static irqreturn_t phylink_link_handler(int irq, void *data)
-+{
-+ struct phylink *pl = data;
-+
-+ phylink_run_resolve(pl);
-+
-+ return IRQ_HANDLED;
-+}
-+
- /**
- * phylink_start() - start a phylink instance
- * @pl: a pointer to a &struct phylink returned from phylink_create()
-@@ -947,7 +957,22 @@ void phylink_start(struct phylink *pl)
- clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state);
- phylink_run_resolve(pl);
-
-- if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio))
-+ if (pl->link_an_mode == MLO_AN_FIXED && pl->link_gpio) {
-+ int irq = gpiod_to_irq(pl->link_gpio);
-+
-+ if (irq > 0) {
-+ if (!request_irq(irq, phylink_link_handler,
-+ IRQF_TRIGGER_RISING |
-+ IRQF_TRIGGER_FALLING,
-+ "netdev link", pl))
-+ pl->link_irq = irq;
-+ else
-+ irq = 0;
-+ }
-+ if (irq <= 0)
-+ mod_timer(&pl->link_poll, jiffies + HZ);
-+ }
-+ if (pl->link_an_mode == MLO_AN_FIXED && pl->get_fixed_state)
- mod_timer(&pl->link_poll, jiffies + HZ);
- if (pl->sfp_bus)
- sfp_upstream_start(pl->sfp_bus);
-@@ -973,8 +998,11 @@ void phylink_stop(struct phylink *pl)
- phy_stop(pl->phydev);
- if (pl->sfp_bus)
- sfp_upstream_stop(pl->sfp_bus);
-- if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio))
-- del_timer_sync(&pl->link_poll);
-+ del_timer_sync(&pl->link_poll);
-+ if (pl->link_irq) {
-+ free_irq(pl->link_irq, pl);
-+ pl->link_irq = 0;
-+ }
-
- phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED);
- }
+++ /dev/null
-From eb5df3d026824832831376bbdf04e01a52776eea Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 28 May 2019 10:57:29 +0100
-Subject: [PATCH 608/660] net: phy: allow Clause 45 access via mii ioctl
-
-Allow userspace to generate Clause 45 MII access cycles via phylib.
-This is useful for tools such as mii-diag to be able to inspect Clause
-45 PHYs.
-
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phy.c | 33 ++++++++++++++++++++++++---------
- 1 file changed, 24 insertions(+), 9 deletions(-)
-
---- a/drivers/net/phy/phy.c
-+++ b/drivers/net/phy/phy.c
-@@ -397,6 +397,7 @@ int phy_mii_ioctl(struct phy_device *phy
- struct mii_ioctl_data *mii_data = if_mii(ifr);
- u16 val = mii_data->val_in;
- bool change_autoneg = false;
-+ int prtad, devad;
-
- switch (cmd) {
- case SIOCGMIIPHY:
-@@ -404,14 +405,29 @@ int phy_mii_ioctl(struct phy_device *phy
- /* fall through */
-
- case SIOCGMIIREG:
-- mii_data->val_out = mdiobus_read(phydev->mdio.bus,
-- mii_data->phy_id,
-- mii_data->reg_num);
-+ if (mdio_phy_id_is_c45(mii_data->phy_id)) {
-+ prtad = mdio_phy_id_prtad(mii_data->phy_id);
-+ devad = mdio_phy_id_devad(mii_data->phy_id);
-+ devad = MII_ADDR_C45 | devad << 16 | mii_data->reg_num;
-+ } else {
-+ prtad = mii_data->phy_id;
-+ devad = mii_data->reg_num;
-+ }
-+ mii_data->val_out = mdiobus_read(phydev->mdio.bus, prtad,
-+ devad);
- return 0;
-
- case SIOCSMIIREG:
-- if (mii_data->phy_id == phydev->mdio.addr) {
-- switch (mii_data->reg_num) {
-+ if (mdio_phy_id_is_c45(mii_data->phy_id)) {
-+ prtad = mdio_phy_id_prtad(mii_data->phy_id);
-+ devad = mdio_phy_id_devad(mii_data->phy_id);
-+ devad = MII_ADDR_C45 | devad << 16 | mii_data->reg_num;
-+ } else {
-+ prtad = mii_data->phy_id;
-+ devad = mii_data->reg_num;
-+ }
-+ if (prtad == phydev->mdio.addr) {
-+ switch (devad) {
- case MII_BMCR:
- if ((val & (BMCR_RESET | BMCR_ANENABLE)) == 0) {
- if (phydev->autoneg == AUTONEG_ENABLE)
-@@ -443,11 +459,10 @@ int phy_mii_ioctl(struct phy_device *phy
- }
- }
-
-- mdiobus_write(phydev->mdio.bus, mii_data->phy_id,
-- mii_data->reg_num, val);
-+ mdiobus_write(phydev->mdio.bus, prtad, devad, val);
-
-- if (mii_data->phy_id == phydev->mdio.addr &&
-- mii_data->reg_num == MII_BMCR &&
-+ if (prtad == phydev->mdio.addr &&
-+ devad == MII_BMCR &&
- val & BMCR_RESET)
- return phy_init_hw(phydev);
-
+++ /dev/null
-From aeabfaa63285470e81fa341e14f92d68880aa160 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 28 May 2019 10:57:34 +0100
-Subject: [PATCH 609/660] net: sfp: add mandatory attach/detach methods for sfp
- buses
-
-Add attach and detach methods for SFP buses, which will allow us to get
-rid of the netdev storage in sfp-bus.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 16 ++++++++++++++++
- drivers/net/phy/sfp-bus.c | 4 ++--
- include/linux/sfp.h | 6 ++++++
- 3 files changed, 24 insertions(+), 2 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -1615,6 +1615,20 @@ int phylink_mii_ioctl(struct phylink *pl
- }
- EXPORT_SYMBOL_GPL(phylink_mii_ioctl);
-
-+static void phylink_sfp_attach(void *upstream, struct sfp_bus *bus)
-+{
-+ struct phylink *pl = upstream;
-+
-+ pl->netdev->sfp_bus = bus;
-+}
-+
-+static void phylink_sfp_detach(void *upstream, struct sfp_bus *bus)
-+{
-+ struct phylink *pl = upstream;
-+
-+ pl->netdev->sfp_bus = NULL;
-+}
-+
- static int phylink_sfp_module_insert(void *upstream,
- const struct sfp_eeprom_id *id)
- {
-@@ -1733,6 +1747,8 @@ static void phylink_sfp_disconnect_phy(v
- }
-
- static const struct sfp_upstream_ops sfp_phylink_ops = {
-+ .attach = phylink_sfp_attach,
-+ .detach = phylink_sfp_detach,
- .module_insert = phylink_sfp_module_insert,
- .link_up = phylink_sfp_link_up,
- .link_down = phylink_sfp_link_down,
---- a/drivers/net/phy/sfp-bus.c
-+++ b/drivers/net/phy/sfp-bus.c
-@@ -350,7 +350,7 @@ static int sfp_register_bus(struct sfp_b
- bus->socket_ops->attach(bus->sfp);
- if (bus->started)
- bus->socket_ops->start(bus->sfp);
-- bus->netdev->sfp_bus = bus;
-+ bus->upstream_ops->attach(bus->upstream, bus);
- bus->registered = true;
- return 0;
- }
-@@ -359,8 +359,8 @@ static void sfp_unregister_bus(struct sf
- {
- const struct sfp_upstream_ops *ops = bus->upstream_ops;
-
-- bus->netdev->sfp_bus = NULL;
- if (bus->registered) {
-+ bus->upstream_ops->detach(bus->upstream, bus);
- if (bus->started)
- bus->socket_ops->stop(bus->sfp);
- bus->socket_ops->detach(bus->sfp);
---- a/include/linux/sfp.h
-+++ b/include/linux/sfp.h
-@@ -469,6 +469,10 @@ struct sfp_bus;
-
- /**
- * struct sfp_upstream_ops - upstream operations structure
-+ * @attach: called when the sfp socket driver is bound to the upstream
-+ * (mandatory).
-+ * @detach: called when the sfp socket driver is unbound from the upstream
-+ * (mandatory).
- * @module_insert: called after a module has been detected to determine
- * whether the module is supported for the upstream device.
- * @module_remove: called after the module has been removed.
-@@ -481,6 +485,8 @@ struct sfp_bus;
- * been removed.
- */
- struct sfp_upstream_ops {
-+ void (*attach)(void *priv, struct sfp_bus *bus);
-+ void (*detach)(void *priv, struct sfp_bus *bus);
- int (*module_insert)(void *priv, const struct sfp_eeprom_id *id);
- void (*module_remove)(void *priv);
- void (*link_down)(void *priv);
+++ /dev/null
-From 60d756717d772be90d07a07cd2cc140c76da3e4a Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 28 May 2019 10:57:39 +0100
-Subject: [PATCH 610/660] net: sfp: remove sfp-bus use of netdevs
-
-The sfp-bus code now no longer has any use for the network device
-structure, so remove its use.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Reviewed-by: Andrew Lunn <andrew@lunn.ch>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 3 +--
- drivers/net/phy/sfp-bus.c | 10 +++-------
- include/linux/sfp.h | 6 ++----
- 3 files changed, 6 insertions(+), 13 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -555,8 +555,7 @@ static int phylink_register_sfp(struct p
- return ret;
- }
-
-- pl->sfp_bus = sfp_register_upstream(ref.fwnode, pl->netdev, pl,
-- &sfp_phylink_ops);
-+ pl->sfp_bus = sfp_register_upstream(ref.fwnode, pl, &sfp_phylink_ops);
- if (!pl->sfp_bus)
- return -ENOMEM;
-
---- a/drivers/net/phy/sfp-bus.c
-+++ b/drivers/net/phy/sfp-bus.c
-@@ -23,7 +23,6 @@ struct sfp_bus {
-
- const struct sfp_upstream_ops *upstream_ops;
- void *upstream;
-- struct net_device *netdev;
- struct phy_device *phydev;
-
- bool registered;
-@@ -442,13 +441,11 @@ static void sfp_upstream_clear(struct sf
- {
- bus->upstream_ops = NULL;
- bus->upstream = NULL;
-- bus->netdev = NULL;
- }
-
- /**
- * sfp_register_upstream() - Register the neighbouring device
- * @fwnode: firmware node for the SFP bus
-- * @ndev: network device associated with the interface
- * @upstream: the upstream private data
- * @ops: the upstream's &struct sfp_upstream_ops
- *
-@@ -459,7 +456,7 @@ static void sfp_upstream_clear(struct sf
- * On error, returns %NULL.
- */
- struct sfp_bus *sfp_register_upstream(struct fwnode_handle *fwnode,
-- struct net_device *ndev, void *upstream,
-+ void *upstream,
- const struct sfp_upstream_ops *ops)
- {
- struct sfp_bus *bus = sfp_bus_get(fwnode);
-@@ -469,7 +466,6 @@ struct sfp_bus *sfp_register_upstream(st
- rtnl_lock();
- bus->upstream_ops = ops;
- bus->upstream = upstream;
-- bus->netdev = ndev;
-
- if (bus->sfp) {
- ret = sfp_register_bus(bus);
-@@ -591,7 +587,7 @@ struct sfp_bus *sfp_register_socket(stru
- bus->sfp = sfp;
- bus->socket_ops = ops;
-
-- if (bus->netdev) {
-+ if (bus->upstream_ops) {
- ret = sfp_register_bus(bus);
- if (ret)
- sfp_socket_clear(bus);
-@@ -611,7 +607,7 @@ EXPORT_SYMBOL_GPL(sfp_register_socket);
- void sfp_unregister_socket(struct sfp_bus *bus)
- {
- rtnl_lock();
-- if (bus->netdev)
-+ if (bus->upstream_ops)
- sfp_unregister_bus(bus);
- sfp_socket_clear(bus);
- rtnl_unlock();
---- a/include/linux/sfp.h
-+++ b/include/linux/sfp.h
-@@ -464,7 +464,6 @@ enum {
- struct fwnode_handle;
- struct ethtool_eeprom;
- struct ethtool_modinfo;
--struct net_device;
- struct sfp_bus;
-
- /**
-@@ -510,7 +509,7 @@ int sfp_get_module_eeprom(struct sfp_bus
- void sfp_upstream_start(struct sfp_bus *bus);
- void sfp_upstream_stop(struct sfp_bus *bus);
- struct sfp_bus *sfp_register_upstream(struct fwnode_handle *fwnode,
-- struct net_device *ndev, void *upstream,
-+ void *upstream,
- const struct sfp_upstream_ops *ops);
- void sfp_unregister_upstream(struct sfp_bus *bus);
- #else
-@@ -555,8 +554,7 @@ static inline void sfp_upstream_stop(str
- }
-
- static inline struct sfp_bus *sfp_register_upstream(
-- struct fwnode_handle *fwnode,
-- struct net_device *ndev, void *upstream,
-+ struct fwnode_handle *fwnode, void *upstream,
- const struct sfp_upstream_ops *ops)
- {
- return (struct sfp_bus *)-1;
+++ /dev/null
-From 8ac1d3e5cf7d277769ba3403d99f643fab1e3fae Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Sat, 23 Nov 2019 14:19:54 +0000
-Subject: [PATCH 611/660] net: phylink: avoid reducing support mask
-
-Avoid reducing the support mask as a result of the interface type
-selected for SFP modules, or when setting the link settings through
-ethtool - this should only change when the supported link modes of
-the hardware combination change.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/phylink.c | 13 +++++++++----
- 1 file changed, 9 insertions(+), 4 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -1137,6 +1137,7 @@ EXPORT_SYMBOL_GPL(phylink_ethtool_ksetti
- int phylink_ethtool_ksettings_set(struct phylink *pl,
- const struct ethtool_link_ksettings *kset)
- {
-+ __ETHTOOL_DECLARE_LINK_MODE_MASK(support);
- struct ethtool_link_ksettings our_kset;
- struct phylink_link_state config;
- int ret;
-@@ -1147,11 +1148,12 @@ int phylink_ethtool_ksettings_set(struct
- kset->base.autoneg != AUTONEG_ENABLE)
- return -EINVAL;
-
-+ linkmode_copy(support, pl->supported);
- config = pl->link_config;
-
- /* Mask out unsupported advertisements */
- linkmode_and(config.advertising, kset->link_modes.advertising,
-- pl->supported);
-+ support);
-
- /* FIXME: should we reject autoneg if phy/mac does not support it? */
- if (kset->base.autoneg == AUTONEG_DISABLE) {
-@@ -1161,7 +1163,7 @@ int phylink_ethtool_ksettings_set(struct
- * duplex.
- */
- s = phy_lookup_setting(kset->base.speed, kset->base.duplex,
-- pl->supported,
-+ support,
- __ETHTOOL_LINK_MODE_MASK_NBITS, false);
- if (!s)
- return -EINVAL;
-@@ -1191,7 +1193,7 @@ int phylink_ethtool_ksettings_set(struct
- __set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, config.advertising);
- }
-
-- if (phylink_validate(pl, pl->supported, &config))
-+ if (phylink_validate(pl, support, &config))
- return -EINVAL;
-
- /* If autonegotiation is enabled, we must have an advertisement */
-@@ -1633,6 +1635,7 @@ static int phylink_sfp_module_insert(voi
- {
- struct phylink *pl = upstream;
- __ETHTOOL_DECLARE_LINK_MODE_MASK(support) = { 0, };
-+ __ETHTOOL_DECLARE_LINK_MODE_MASK(support1);
- struct phylink_link_state config;
- phy_interface_t iface;
- int ret = 0;
-@@ -1660,6 +1663,8 @@ static int phylink_sfp_module_insert(voi
- return ret;
- }
-
-+ linkmode_copy(support1, support);
-+
- iface = sfp_select_interface(pl->sfp_bus, id, config.advertising);
- if (iface == PHY_INTERFACE_MODE_NA) {
- netdev_err(pl->netdev,
-@@ -1669,7 +1674,7 @@ static int phylink_sfp_module_insert(voi
- }
-
- config.interface = iface;
-- ret = phylink_validate(pl, support, &config);
-+ ret = phylink_validate(pl, support1, &config);
- if (ret) {
- netdev_err(pl->netdev, "validation of %s/%s with support %*pb failed: %d\n",
- phylink_an_mode_str(MLO_AN_INBAND),
+++ /dev/null
-From 254236a22109efa84c9e9f5a9c76a1719439e309 Mon Sep 17 00:00:00 2001
-From: Robert Hancock <hancock@sedsystems.ca>
-Date: Fri, 7 Jun 2019 10:42:35 -0600
-Subject: [PATCH 612/660] net: sfp: Stop SFP polling and interrupt handling
- during shutdown
-
-SFP device polling can cause problems during the shutdown process if the
-parent devices of the network controller have been shut down already.
-This problem was seen on the iMX6 platform with PCIe devices, where
-accessing the device after the bus is shut down causes a hang.
-
-Free any acquired GPIO interrupts and stop all delayed work in the SFP
-driver during the shutdown process, so that we ensure that no pending
-operations are still occurring after the SFP shutdown completes.
-
-Signed-off-by: Robert Hancock <hancock@sedsystems.ca>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/sfp.c | 31 ++++++++++++++++++++++++++-----
- 1 file changed, 26 insertions(+), 5 deletions(-)
-
---- a/drivers/net/phy/sfp.c
-+++ b/drivers/net/phy/sfp.c
-@@ -183,6 +183,7 @@ struct sfp {
- int (*write)(struct sfp *, bool, u8, void *, size_t);
-
- struct gpio_desc *gpio[GPIO_MAX];
-+ int gpio_irq[GPIO_MAX];
-
- bool attached;
- struct mutex st_mutex; /* Protects state */
-@@ -1803,7 +1804,7 @@ static int sfp_probe(struct platform_dev
- const struct sff_data *sff;
- struct sfp *sfp;
- bool poll = false;
-- int irq, err, i;
-+ int err, i;
-
- sfp = sfp_alloc(&pdev->dev);
- if (IS_ERR(sfp))
-@@ -1885,19 +1886,22 @@ static int sfp_probe(struct platform_dev
- if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i])
- continue;
-
-- irq = gpiod_to_irq(sfp->gpio[i]);
-- if (!irq) {
-+ sfp->gpio_irq[i] = gpiod_to_irq(sfp->gpio[i]);
-+ if (!sfp->gpio_irq[i]) {
- poll = true;
- continue;
- }
-
-- err = devm_request_threaded_irq(sfp->dev, irq, NULL, sfp_irq,
-+ err = devm_request_threaded_irq(sfp->dev, sfp->gpio_irq[i],
-+ NULL, sfp_irq,
- IRQF_ONESHOT |
- IRQF_TRIGGER_RISING |
- IRQF_TRIGGER_FALLING,
- dev_name(sfp->dev), sfp);
-- if (err)
-+ if (err) {
-+ sfp->gpio_irq[i] = 0;
- poll = true;
-+ }
- }
-
- if (poll)
-@@ -1928,9 +1932,26 @@ static int sfp_remove(struct platform_de
- return 0;
- }
-
-+static void sfp_shutdown(struct platform_device *pdev)
-+{
-+ struct sfp *sfp = platform_get_drvdata(pdev);
-+ int i;
-+
-+ for (i = 0; i < GPIO_MAX; i++) {
-+ if (!sfp->gpio_irq[i])
-+ continue;
-+
-+ devm_free_irq(sfp->dev, sfp->gpio_irq[i], sfp);
-+ }
-+
-+ cancel_delayed_work_sync(&sfp->poll);
-+ cancel_delayed_work_sync(&sfp->timeout);
-+}
-+
- static struct platform_driver sfp_driver = {
- .probe = sfp_probe,
- .remove = sfp_remove,
-+ .shutdown = sfp_shutdown,
- .driver = {
- .name = "sfp",
- .of_match_table = sfp_of_match,
+++ /dev/null
-From b8803113537a1c1f457eba6270d46e3af305031f Mon Sep 17 00:00:00 2001
-From: Arseny Solokha <asolokha@kb.kras.ru>
-Date: Wed, 24 Jul 2019 20:31:39 +0700
-Subject: [PATCH 613/660] net: phylink: don't start and stop SGMII PHYs in SFP
- modules twice
-
-SFP modules connected using the SGMII interface have their own PHYs which
-are handled by the struct phylink's phydev field. On the other hand, for
-the modules connected using 1000Base-X interface that field is not set.
-
-Since commit ce0aa27ff3f6 ("sfp: add sfp-bus to bridge between network
-devices and sfp cages") phylink_start() ends up setting the phydev field
-using the sfp-bus infrastructure, which eventually calls phy_start() on it,
-and then calling phy_start() again on the same phydev from phylink_start()
-itself. Similar call sequence holds for phylink_stop(), only in the reverse
-order. This results in WARNs during network interface bringup and shutdown
-when a copper SFP module is connected, as phy_start() and phy_stop() are
-called twice in a row for the same phy_device:
-
- % ip link set up dev eth0
- ------------[ cut here ]------------
- called from state UP
- WARNING: CPU: 1 PID: 155 at drivers/net/phy/phy.c:895 phy_start+0x74/0xc0
- Modules linked in:
- CPU: 1 PID: 155 Comm: backend Not tainted 5.2.0+ #1
- NIP: c0227bf0 LR: c0227bf0 CTR: c004d224
- REGS: df547720 TRAP: 0700 Not tainted (5.2.0+)
- MSR: 00029000 <CE,EE,ME> CR: 24002822 XER: 00000000
-
- GPR00: c0227bf0 df5477d8 df5d7080 00000014 df9d2370 df9d5ac4 1f4eb000 00000001
- GPR08: c061fe58 00000000 00000000 df5477d8 0000003c 100c8768 00000000 00000000
- GPR16: df486a00 c046f1c8 c046eea0 00000000 c046e904 c0239604 db68449c 00000000
- GPR24: e9083204 00000000 00000001 db684460 e9083404 00000000 db6dce00 db6dcc00
- NIP [c0227bf0] phy_start+0x74/0xc0
- LR [c0227bf0] phy_start+0x74/0xc0
- Call Trace:
- [df5477d8] [c0227bf0] phy_start+0x74/0xc0 (unreliable)
- [df5477e8] [c023cad0] startup_gfar+0x398/0x3f4
- [df547828] [c023cf08] gfar_enet_open+0x364/0x374
- [df547898] [c029d870] __dev_open+0xe4/0x140
- [df5478c8] [c029db70] __dev_change_flags+0xf0/0x188
- [df5478f8] [c029dc28] dev_change_flags+0x20/0x54
- [df547918] [c02ae304] do_setlink+0x310/0x818
- [df547a08] [c02b1eb8] __rtnl_newlink+0x384/0x6b0
- [df547c28] [c02b222c] rtnl_newlink+0x48/0x68
- [df547c48] [c02ad7c8] rtnetlink_rcv_msg+0x240/0x27c
- [df547c98] [c02cc068] netlink_rcv_skb+0x8c/0xf0
- [df547cd8] [c02cba3c] netlink_unicast+0x114/0x19c
- [df547d08] [c02cbd74] netlink_sendmsg+0x2b0/0x2c0
- [df547d58] [c027b668] sock_sendmsg_nosec+0x20/0x40
- [df547d68] [c027d080] ___sys_sendmsg+0x17c/0x1dc
- [df547e98] [c027df7c] __sys_sendmsg+0x68/0x84
- [df547ef8] [c027e430] sys_socketcall+0x1a0/0x204
- [df547f38] [c000d1d8] ret_from_syscall+0x0/0x38
- --- interrupt: c01 at 0xfd4e030
- LR = 0xfd4e010
- Instruction dump:
- 813f0188 38800000 2b890005 419d0014 3d40c046 5529103a 394aa208 7c8a482e
- 3c60c046 3863a1b8 4cc63182 4be009a1 <0fe00000> 48000030 3c60c046 3863a1d0
- ---[ end trace d4c095aeaf6ea998 ]---
-
-and
-
- % ip link set down dev eth0
- ------------[ cut here ]------------
- called from state HALTED
- WARNING: CPU: 1 PID: 184 at drivers/net/phy/phy.c:858 phy_stop+0x3c/0x88
-
- <...>
-
- Call Trace:
- [df581788] [c0228450] phy_stop+0x3c/0x88 (unreliable)
- [df581798] [c022d548] sfp_sm_phy_detach+0x1c/0x44
- [df5817a8] [c022e8cc] sfp_sm_event+0x4b0/0x87c
- [df581848] [c022f04c] sfp_upstream_stop+0x34/0x44
- [df581858] [c0225608] phylink_stop+0x7c/0xe4
- [df581868] [c023c57c] stop_gfar+0x7c/0x94
- [df581888] [c023c5b8] gfar_close+0x24/0x94
- [df5818a8] [c0298688] __dev_close_many+0xdc/0xf8
- [df5818c8] [c029db58] __dev_change_flags+0xd8/0x188
- [df5818f8] [c029dc28] dev_change_flags+0x20/0x54
- [df581918] [c02ae304] do_setlink+0x310/0x818
- [df581a08] [c02b1eb8] __rtnl_newlink+0x384/0x6b0
- [df581c28] [c02b222c] rtnl_newlink+0x48/0x68
- [df581c48] [c02ad7c8] rtnetlink_rcv_msg+0x240/0x27c
- [df581c98] [c02cc068] netlink_rcv_skb+0x8c/0xf0
- [df581cd8] [c02cba3c] netlink_unicast+0x114/0x19c
- [df581d08] [c02cbd74] netlink_sendmsg+0x2b0/0x2c0
- [df581d58] [c027b668] sock_sendmsg_nosec+0x20/0x40
- [df581d68] [c027d080] ___sys_sendmsg+0x17c/0x1dc
- [df581e98] [c027df7c] __sys_sendmsg+0x68/0x84
- [df581ef8] [c027e430] sys_socketcall+0x1a0/0x204
- [df581f38] [c000d1d8] ret_from_syscall+0x0/0x38
-
- <...>
-
- ---[ end trace d4c095aeaf6ea999 ]---
-
-SFP modules with the 1000Base-X interface are not affected.
-
-Place explicit calls to phy_start() and phy_stop() before enabling or after
-disabling an attached SFP module, where phydev is not yet set (or is
-already unset), so they will be made only from the inside of sfp-bus, if
-needed.
-
-Fixes: 217962615662 ("net: phy: warn if phy_start is called from invalid state")
-Signed-off-by: Arseny Solokha <asolokha@kb.kras.ru>
-Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- drivers/net/phy/phylink.c | 8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -973,10 +973,10 @@ void phylink_start(struct phylink *pl)
- }
- if (pl->link_an_mode == MLO_AN_FIXED && pl->get_fixed_state)
- mod_timer(&pl->link_poll, jiffies + HZ);
-- if (pl->sfp_bus)
-- sfp_upstream_start(pl->sfp_bus);
- if (pl->phydev)
- phy_start(pl->phydev);
-+ if (pl->sfp_bus)
-+ sfp_upstream_start(pl->sfp_bus);
- }
- EXPORT_SYMBOL_GPL(phylink_start);
-
-@@ -993,10 +993,10 @@ void phylink_stop(struct phylink *pl)
- {
- ASSERT_RTNL();
-
-- if (pl->phydev)
-- phy_stop(pl->phydev);
- if (pl->sfp_bus)
- sfp_upstream_stop(pl->sfp_bus);
-+ if (pl->phydev)
-+ phy_stop(pl->phydev);
- del_timer_sync(&pl->link_poll);
- if (pl->link_irq) {
- free_irq(pl->link_irq, pl);
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
-@@ -538,26 +538,17 @@ static const struct sfp_upstream_ops sfp
+@@ -565,26 +565,17 @@ static const struct sfp_upstream_ops sfp
static int phylink_register_sfp(struct phylink *pl,
struct fwnode_handle *fwnode)
{
- if (ret == -ENOENT)
- return 0;
-
-- netdev_err(pl->netdev, "unable to parse \"sfp\" node: %d\n",
-- ret);
+- phylink_err(pl, "unable to parse \"sfp\" node: %d\n",
+- ret);
+ bus = sfp_register_upstream_node(fwnode, pl, &sfp_phylink_ops);
+ if (IS_ERR(bus)) {
+ ret = PTR_ERR(bus);
-+ netdev_err(pl->netdev, "unable to attach SFP bus: %d\n", ret);
++ phylink_err(pl, "unable to attach SFP bus: %d\n", ret);
return ret;
}
}
--- a/drivers/net/phy/sfp-bus.c
+++ b/drivers/net/phy/sfp-bus.c
-@@ -3,6 +3,7 @@
+@@ -4,6 +4,7 @@
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/phylink.h>
#include <linux/rtnetlink.h>
#include <linux/slab.h>
-@@ -444,45 +445,63 @@ static void sfp_upstream_clear(struct sf
+@@ -445,45 +446,63 @@ static void sfp_upstream_clear(struct sf
}
/**
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
-@@ -541,7 +541,7 @@ static int phylink_register_sfp(struct p
+@@ -568,7 +568,7 @@ static int phylink_register_sfp(struct p
struct sfp_bus *bus;
int ret;
+ bus = sfp_bus_find_fwnode(fwnode);
if (IS_ERR(bus)) {
ret = PTR_ERR(bus);
- netdev_err(pl->netdev, "unable to attach SFP bus: %d\n", ret);
-@@ -550,7 +550,10 @@ static int phylink_register_sfp(struct p
+ phylink_err(pl, "unable to attach SFP bus: %d\n", ret);
+@@ -577,7 +577,10 @@ static int phylink_register_sfp(struct p
pl->sfp_bus = bus;
}
/**
-@@ -634,8 +637,7 @@ EXPORT_SYMBOL_GPL(phylink_create);
+@@ -675,8 +678,7 @@ EXPORT_SYMBOL_GPL(phylink_create);
*/
void phylink_destroy(struct phylink *pl)
{
--- a/drivers/net/phy/sfp-bus.c
+++ b/drivers/net/phy/sfp-bus.c
-@@ -328,10 +328,19 @@ static void sfp_bus_release(struct kref
+@@ -329,10 +329,19 @@ static void sfp_bus_release(struct kref
kfree(bus);
}
static int sfp_register_bus(struct sfp_bus *bus)
{
-@@ -347,11 +356,11 @@ static int sfp_register_bus(struct sfp_b
+@@ -348,11 +357,11 @@ static int sfp_register_bus(struct sfp_b
return ret;
}
}
return 0;
}
-@@ -445,13 +454,12 @@ static void sfp_upstream_clear(struct sf
+@@ -446,13 +455,12 @@ static void sfp_upstream_clear(struct sf
}
/**
*
* Returns: on success, a pointer to the sfp_bus structure,
* %NULL if no SFP is specified,
-@@ -461,9 +469,7 @@ static void sfp_upstream_clear(struct sf
+@@ -462,9 +470,7 @@ static void sfp_upstream_clear(struct sf
* %-ENOMEM if we failed to allocate the bus.
* an error from the upstream's connect_phy() method.
*/
{
struct fwnode_reference_args ref;
struct sfp_bus *bus;
-@@ -481,7 +487,39 @@ struct sfp_bus *sfp_register_upstream_no
+@@ -482,7 +488,39 @@ struct sfp_bus *sfp_register_upstream_no
if (!bus)
return ERR_PTR(-ENOMEM);
bus->upstream_ops = ops;
bus->upstream = upstream;
-@@ -494,33 +532,33 @@ struct sfp_bus *sfp_register_upstream_no
+@@ -495,33 +533,33 @@ struct sfp_bus *sfp_register_upstream_no
}
rtnl_unlock();
--- a/drivers/net/phy/sfp-bus.c
+++ b/drivers/net/phy/sfp-bus.c
-@@ -330,7 +330,7 @@ static void sfp_bus_release(struct kref
+@@ -331,7 +331,7 @@ static void sfp_bus_release(struct kref
/**
* sfp_bus_put() - put a reference on the &struct sfp_bus
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1479,19 +1479,34 @@ static void sfp_sm_mod_remove(struct sfp
+@@ -1544,19 +1544,34 @@ static void sfp_sm_mod_remove(struct sfp
dev_info(sfp->dev, "module removed\n");
}
switch (sfp->sm_mod_state) {
default:
if (event == SFP_E_INSERT && sfp->attached) {
-@@ -1531,27 +1546,10 @@ static void sfp_sm_event(struct sfp *sfp
+@@ -1596,27 +1611,10 @@ static void sfp_sm_event(struct sfp *sfp
}
break;
}
/* Some events are global */
if (sfp->sm_state != SFP_S_DOWN &&
(sfp->sm_mod_state != SFP_MOD_PRESENT ||
-@@ -1562,7 +1560,6 @@ static void sfp_sm_event(struct sfp *sfp
+@@ -1627,7 +1625,6 @@ static void sfp_sm_event(struct sfp *sfp
if (sfp->mod_phy)
sfp_sm_phy_detach(sfp);
sfp_sm_next(sfp, SFP_S_DOWN, 0);
return;
}
-@@ -1617,6 +1614,21 @@ static void sfp_sm_event(struct sfp *sfp
+@@ -1682,6 +1679,21 @@ static void sfp_sm_event(struct sfp *sfp
case SFP_S_TX_DISABLE:
break;
}
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1489,15 +1489,8 @@ static void sfp_sm_device(struct sfp *sf
+@@ -1554,15 +1554,8 @@ static void sfp_sm_device(struct sfp *sf
break;
case SFP_DEV_UP:
break;
}
}
-@@ -1559,6 +1552,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1624,6 +1617,7 @@ static void sfp_sm_main(struct sfp *sfp,
sfp_sm_link_down(sfp);
if (sfp->mod_phy)
sfp_sm_phy_detach(sfp);
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1180,7 +1180,7 @@ static void sfp_sm_next(struct sfp *sfp,
+@@ -1245,7 +1245,7 @@ static void sfp_sm_next(struct sfp *sfp,
sfp_sm_set_timer(sfp, timeout);
}
unsigned int timeout)
{
sfp->sm_mod_state = state;
-@@ -1504,22 +1504,22 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1569,22 +1569,22 @@ static void sfp_sm_module(struct sfp *sf
default:
if (event == SFP_E_INSERT && sfp->attached) {
sfp_module_tx_disable(sfp);
else
sfp_sm_set_timer(sfp, T_PROBE_RETRY);
}
-@@ -1527,7 +1527,7 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1592,7 +1592,7 @@ static void sfp_sm_module(struct sfp *sf
case SFP_MOD_HPOWER:
if (event == SFP_E_TIMEOUT) {
break;
}
/* fallthrough */
-@@ -1535,7 +1535,7 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1600,7 +1600,7 @@ static void sfp_sm_module(struct sfp *sf
case SFP_MOD_ERROR:
if (event == SFP_E_REMOVE) {
sfp_sm_mod_remove(sfp);
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1500,6 +1500,14 @@ static void sfp_sm_device(struct sfp *sf
+@@ -1565,6 +1565,14 @@ static void sfp_sm_device(struct sfp *sf
*/
static void sfp_sm_module(struct sfp *sfp, unsigned int event)
{
switch (sfp->sm_mod_state) {
default:
if (event == SFP_E_INSERT && sfp->attached) {
-@@ -1509,9 +1517,7 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1574,9 +1582,7 @@ static void sfp_sm_module(struct sfp *sf
break;
case SFP_MOD_PROBE:
int val = sfp_sm_mod_probe(sfp);
if (val == 0)
-@@ -1533,10 +1539,6 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1598,10 +1604,6 @@ static void sfp_sm_module(struct sfp *sf
/* fallthrough */
case SFP_MOD_PRESENT:
case SFP_MOD_ERROR:
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -147,11 +147,10 @@ static const enum gpiod_flags gpio_flags
+@@ -149,11 +149,10 @@ static const enum gpiod_flags gpio_flags
* the same length on the PCB, which means it's possible for MOD DEF 0 to
* connect before the I2C bus on MOD DEF 1/2.
*
#define T_HPOWER_LEVEL msecs_to_jiffies(300)
#define T_PROBE_RETRY msecs_to_jiffies(100)
-@@ -1495,8 +1494,8 @@ static void sfp_sm_device(struct sfp *sf
+@@ -1560,8 +1559,8 @@ static void sfp_sm_device(struct sfp *sf
}
}
*/
static void sfp_sm_module(struct sfp *sfp, unsigned int event)
{
-@@ -1512,7 +1511,7 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1577,7 +1576,7 @@ static void sfp_sm_module(struct sfp *sf
default:
if (event == SFP_E_INSERT && sfp->attached) {
sfp_module_tx_disable(sfp);
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -196,6 +196,8 @@ struct sfp {
+@@ -198,6 +198,8 @@ struct sfp {
unsigned int sm_retries;
struct sfp_eeprom_id id;
#if IS_ENABLED(CONFIG_HWMON)
struct sfp_diag diag;
struct device *hwmon_dev;
-@@ -1309,17 +1311,14 @@ static void sfp_sm_mod_init(struct sfp *
+@@ -1374,17 +1376,14 @@ static void sfp_sm_mod_init(struct sfp *
sfp_sm_probe_phy(sfp);
}
if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE &&
(sfp->id.ext.diagmon & (SFP_DIAGMON_DDM | SFP_DIAGMON_ADDRMODE)) !=
-@@ -1328,23 +1327,33 @@ static int sfp_sm_mod_hpower(struct sfp
+@@ -1393,23 +1392,33 @@ static int sfp_sm_mod_hpower(struct sfp
* or requires an address change sequence, so assume that
* the module powers up in the indicated power mode.
*/
return 0;
err = sfp_read(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
-@@ -1364,7 +1373,8 @@ static int sfp_sm_mod_hpower(struct sfp
+@@ -1429,7 +1438,8 @@ static int sfp_sm_mod_hpower(struct sfp
}
dev_info(sfp->dev, "Module switched to %u.%uW power level\n",
return T_HPOWER_LEVEL;
err:
-@@ -1451,6 +1461,11 @@ static int sfp_sm_mod_probe(struct sfp *
+@@ -1516,6 +1526,11 @@ static int sfp_sm_mod_probe(struct sfp *
dev_warn(sfp->dev,
"module address swap to access page 0xA2 is not supported.\n");
ret = sfp_hwmon_insert(sfp);
if (ret < 0)
return ret;
-@@ -1474,6 +1489,7 @@ static void sfp_sm_mod_remove(struct sfp
+@@ -1539,6 +1554,7 @@ static void sfp_sm_mod_remove(struct sfp
sfp_module_tx_disable(sfp);
memset(&sfp->id, 0, sizeof(sfp->id));
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1320,25 +1320,34 @@ static int sfp_module_parse_power(struct
+@@ -1385,25 +1385,34 @@ static int sfp_module_parse_power(struct
if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL))
power_mW = 2000;
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1492,11 +1492,6 @@ static void sfp_sm_mod_remove(struct sfp
+@@ -1557,11 +1557,6 @@ static void sfp_sm_mod_remove(struct sfp
sfp_hwmon_remove(sfp);
memset(&sfp->id, 0, sizeof(sfp->id));
sfp->module_power_mW = 0;
-@@ -1534,10 +1529,8 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1599,10 +1594,8 @@ static void sfp_sm_module(struct sfp *sf
switch (sfp->sm_mod_state) {
default:
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1288,14 +1288,10 @@ static void sfp_sm_fault(struct sfp *sfp
+@@ -1353,14 +1353,10 @@ static void sfp_sm_fault(struct sfp *sfp
static void sfp_sm_mod_init(struct sfp *sfp)
{
sfp_module_tx_enable(sfp);
/* Setting the serdes link mode is guesswork: there's no
* field in the EEPROM which indicates what mode should
* be used.
-@@ -1580,8 +1576,17 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1645,8 +1641,17 @@ static void sfp_sm_main(struct sfp *sfp,
switch (sfp->sm_state) {
case SFP_S_DOWN:
if (sfp->sm_mod_state == SFP_MOD_PRESENT &&
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -52,6 +52,7 @@ enum {
+@@ -54,6 +54,7 @@ enum {
SFP_DEV_UP,
SFP_S_DOWN = 0,
SFP_S_INIT,
SFP_S_WAIT_LOS,
SFP_S_LINK_UP,
-@@ -108,6 +109,7 @@ static const char *event_to_str(unsigned
+@@ -110,6 +111,7 @@ static const char *event_to_str(unsigned
static const char * const sm_state_strings[] = {
[SFP_S_DOWN] = "down",
[SFP_S_INIT] = "init",
[SFP_S_WAIT_LOS] = "wait_los",
[SFP_S_LINK_UP] = "link_up",
-@@ -139,6 +141,7 @@ static const enum gpiod_flags gpio_flags
+@@ -141,6 +143,7 @@ static const enum gpiod_flags gpio_flags
GPIOD_ASIS,
};
#define T_INIT_JIFFIES msecs_to_jiffies(300)
#define T_RESET_US 10
#define T_FAULT_RECOVER msecs_to_jiffies(1000)
-@@ -159,9 +162,6 @@ static const enum gpiod_flags gpio_flags
+@@ -161,9 +164,6 @@ static const enum gpiod_flags gpio_flags
*/
#define SFP_PHY_ADDR 22
struct sff_data {
unsigned int gpios;
bool (*module_supported)(const struct sfp_eeprom_id *id);
-@@ -1202,8 +1202,6 @@ static void sfp_sm_probe_phy(struct sfp
+@@ -1267,8 +1267,6 @@ static void sfp_sm_probe_phy(struct sfp
struct phy_device *phy;
int err;
phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR);
if (phy == ERR_PTR(-ENODEV)) {
dev_info(sfp->dev, "no PHY detected\n");
-@@ -1558,6 +1556,8 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1623,6 +1621,8 @@ static void sfp_sm_module(struct sfp *sf
static void sfp_sm_main(struct sfp *sfp, unsigned int event)
{
/* Some events are global */
if (sfp->sm_state != SFP_S_DOWN &&
(sfp->sm_mod_state != SFP_MOD_PRESENT ||
-@@ -1575,17 +1575,45 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1640,17 +1640,45 @@ static void sfp_sm_main(struct sfp *sfp,
/* The main state machine */
switch (sfp->sm_state) {
case SFP_S_DOWN:
}
break;
-@@ -1593,7 +1621,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1658,7 +1686,7 @@ static void sfp_sm_main(struct sfp *sfp,
if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT)
sfp_sm_fault(sfp, true);
else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR)
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1269,7 +1269,7 @@ static bool sfp_los_event_inactive(struc
+@@ -1334,7 +1334,7 @@ static bool sfp_los_event_inactive(struc
event == SFP_E_LOS_LOW);
}
{
if (sfp->sm_retries && !--sfp->sm_retries) {
dev_err(sfp->dev,
-@@ -1279,7 +1279,7 @@ static void sfp_sm_fault(struct sfp *sfp
+@@ -1344,7 +1344,7 @@ static void sfp_sm_fault(struct sfp *sfp
if (warn)
dev_err(sfp->dev, "module transmit fault indicated\n");
}
}
-@@ -1619,14 +1619,14 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1684,14 +1684,14 @@ static void sfp_sm_main(struct sfp *sfp,
case SFP_S_INIT:
if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT)
else if (sfp_los_event_inactive(sfp, event))
sfp_sm_link_up(sfp);
break;
-@@ -1634,7 +1634,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1699,7 +1699,7 @@ static void sfp_sm_main(struct sfp *sfp,
case SFP_S_LINK_UP:
if (event == SFP_E_TX_FAULT) {
sfp_sm_link_down(sfp);
} else if (sfp_los_event_active(sfp, event)) {
sfp_sm_link_down(sfp);
sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0);
-@@ -1650,7 +1650,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1715,7 +1715,7 @@ static void sfp_sm_main(struct sfp *sfp,
case SFP_S_REINIT:
if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) {
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -54,6 +54,7 @@ enum {
+@@ -56,6 +56,7 @@ enum {
SFP_S_DOWN = 0,
SFP_S_WAIT,
SFP_S_INIT,
SFP_S_WAIT_LOS,
SFP_S_LINK_UP,
SFP_S_TX_FAULT,
-@@ -111,6 +112,7 @@ static const char * const sm_state_strin
+@@ -113,6 +114,7 @@ static const char * const sm_state_strin
[SFP_S_DOWN] = "down",
[SFP_S_WAIT] = "wait",
[SFP_S_INIT] = "init",
[SFP_S_WAIT_LOS] = "wait_los",
[SFP_S_LINK_UP] = "link_up",
[SFP_S_TX_FAULT] = "tx_fault",
-@@ -1595,8 +1597,6 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1660,8 +1662,6 @@ static void sfp_sm_main(struct sfp *sfp,
if (event != SFP_E_TIMEOUT)
break;
if (sfp->state & SFP_F_TX_FAULT) {
/* Wait t_init before indicating that the link is up,
* provided the current state indicates no TX_FAULT. If
-@@ -1618,10 +1618,29 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1683,10 +1683,29 @@ static void sfp_sm_main(struct sfp *sfp,
break;
case SFP_S_INIT:
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -34,6 +34,8 @@ enum {
+@@ -36,6 +36,8 @@ enum {
SFP_E_INSERT = 0,
SFP_E_REMOVE,
SFP_E_DEV_DOWN,
SFP_E_DEV_UP,
SFP_E_TX_FAULT,
-@@ -48,7 +50,8 @@ enum {
+@@ -50,7 +52,8 @@ enum {
SFP_MOD_PRESENT,
SFP_MOD_ERROR,
SFP_DEV_UP,
SFP_S_DOWN = 0,
-@@ -78,6 +81,7 @@ static const char *mod_state_to_str(unsi
+@@ -80,6 +83,7 @@ static const char *mod_state_to_str(unsi
}
static const char * const dev_state_strings[] = {
[SFP_DEV_DOWN] = "down",
[SFP_DEV_UP] = "up",
};
-@@ -92,6 +96,8 @@ static const char *dev_state_to_str(unsi
+@@ -94,6 +98,8 @@ static const char *dev_state_to_str(unsi
static const char * const event_strings[] = {
[SFP_E_INSERT] = "insert",
[SFP_E_REMOVE] = "remove",
[SFP_E_DEV_DOWN] = "dev_down",
[SFP_E_DEV_UP] = "dev_up",
[SFP_E_TX_FAULT] = "tx_fault",
-@@ -186,7 +192,6 @@ struct sfp {
+@@ -188,7 +194,6 @@ struct sfp {
struct gpio_desc *gpio[GPIO_MAX];
int gpio_irq[GPIO_MAX];
struct mutex st_mutex; /* Protects state */
unsigned int state;
struct delayed_work poll;
-@@ -1494,17 +1499,26 @@ static void sfp_sm_mod_remove(struct sfp
+@@ -1559,17 +1564,26 @@ static void sfp_sm_mod_remove(struct sfp
dev_info(sfp->dev, "module removed\n");
}
sfp->sm_dev_state = SFP_DEV_DOWN;
break;
}
-@@ -1515,17 +1529,20 @@ static void sfp_sm_device(struct sfp *sf
+@@ -1580,17 +1594,20 @@ static void sfp_sm_device(struct sfp *sf
*/
static void sfp_sm_module(struct sfp *sfp, unsigned int event)
{
sfp_sm_mod_next(sfp, SFP_MOD_PROBE, T_SERIAL);
break;
-@@ -1691,8 +1708,8 @@ static void sfp_sm_event(struct sfp *sfp
+@@ -1756,8 +1773,8 @@ static void sfp_sm_event(struct sfp *sfp
sm_state_to_str(sfp->sm_state),
event_to_str(event));
sfp_sm_main(sfp, event);
dev_dbg(sfp->dev, "SM: exit %s:%s:%s\n",
-@@ -1705,15 +1722,14 @@ static void sfp_sm_event(struct sfp *sfp
+@@ -1770,15 +1787,14 @@ static void sfp_sm_event(struct sfp *sfp
static void sfp_attach(struct sfp *sfp)
{
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -47,6 +47,7 @@ enum {
+@@ -49,6 +49,7 @@ enum {
SFP_MOD_EMPTY = 0,
SFP_MOD_PROBE,
SFP_MOD_HPOWER,
SFP_MOD_PRESENT,
SFP_MOD_ERROR,
-@@ -69,6 +70,7 @@ static const char * const mod_state_str
+@@ -71,6 +72,7 @@ static const char * const mod_state_str
[SFP_MOD_EMPTY] = "empty",
[SFP_MOD_PROBE] = "probe",
[SFP_MOD_HPOWER] = "hpower",
[SFP_MOD_PRESENT] = "present",
[SFP_MOD_ERROR] = "error",
};
-@@ -1358,37 +1360,34 @@ static int sfp_module_parse_power(struct
+@@ -1423,37 +1425,34 @@ static int sfp_module_parse_power(struct
return 0;
}
}
static int sfp_sm_mod_probe(struct sfp *sfp)
-@@ -1484,7 +1483,7 @@ static int sfp_sm_mod_probe(struct sfp *
+@@ -1549,7 +1548,7 @@ static int sfp_sm_mod_probe(struct sfp *
if (ret < 0)
return ret;
}
static void sfp_sm_mod_remove(struct sfp *sfp)
-@@ -1529,13 +1528,22 @@ static void sfp_sm_device(struct sfp *sf
+@@ -1594,13 +1593,22 @@ static void sfp_sm_device(struct sfp *sf
*/
static void sfp_sm_module(struct sfp *sfp, unsigned int event)
{
sfp_sm_mod_next(sfp, SFP_MOD_EMPTY, 0);
return;
}
-@@ -1547,26 +1555,45 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1612,26 +1620,45 @@ static void sfp_sm_module(struct sfp *sf
break;
case SFP_MOD_PROBE:
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -45,11 +45,12 @@ enum {
+@@ -47,11 +47,12 @@ enum {
SFP_E_TIMEOUT,
SFP_MOD_EMPTY = 0,
SFP_DEV_DETACHED = 0,
SFP_DEV_DOWN,
-@@ -68,11 +69,12 @@ enum {
+@@ -70,11 +71,12 @@ enum {
static const char * const mod_state_strings[] = {
[SFP_MOD_EMPTY] = "empty",
};
static const char *mod_state_to_str(unsigned short mod_state)
-@@ -1479,16 +1481,13 @@ static int sfp_sm_mod_probe(struct sfp *
+@@ -1544,16 +1546,13 @@ static int sfp_sm_mod_probe(struct sfp *
if (ret < 0)
return ret;
sfp_hwmon_remove(sfp);
-@@ -1539,12 +1538,12 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1604,12 +1603,12 @@ static void sfp_sm_module(struct sfp *sf
}
/* Handle device detach globally */
return;
}
-@@ -1555,6 +1554,7 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1620,6 +1619,7 @@ static void sfp_sm_module(struct sfp *sf
break;
case SFP_MOD_PROBE:
if (event != SFP_E_TIMEOUT)
break;
-@@ -1568,6 +1568,20 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1633,6 +1633,20 @@ static void sfp_sm_module(struct sfp *sf
break;
}
/* If this is a power level 1 module, we are done */
if (sfp->module_power_mW <= 1000)
goto insert;
-@@ -1577,12 +1591,17 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1642,12 +1656,17 @@ static void sfp_sm_module(struct sfp *sf
case SFP_MOD_HPOWER:
/* Enable high power mode */
err = sfp_sm_mod_hpower(sfp, true);
break;
case SFP_MOD_WAITPWR:
-@@ -1750,8 +1769,6 @@ static void sfp_sm_event(struct sfp *sfp
+@@ -1815,8 +1834,6 @@ static void sfp_sm_event(struct sfp *sfp
static void sfp_attach(struct sfp *sfp)
{
sfp_sm_event(sfp, SFP_E_DEV_ATTACH);
}
static void sfp_detach(struct sfp *sfp)
-@@ -2001,6 +2018,11 @@ static int sfp_probe(struct platform_dev
+@@ -2084,6 +2101,11 @@ static int sfp_probe(struct platform_dev
sfp->state |= SFP_F_RATE_SELECT;
sfp_set_state(sfp, sfp->state);
sfp_module_tx_disable(sfp);
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -165,9 +165,12 @@ static const enum gpiod_flags gpio_flags
+@@ -167,9 +167,12 @@ static const enum gpiod_flags gpio_flags
* The SFF-8472 specifies t_serial ("Time from power on until module is
* ready for data transmission over the two wire serial bus.") as 300ms.
*/
/* SFP modules appear to always have their PHY configured for bus address
* 0x56 (which with mdio-i2c, translates to a PHY address of 22).
-@@ -202,6 +205,8 @@ struct sfp {
+@@ -204,6 +207,8 @@ struct sfp {
struct delayed_work timeout;
struct mutex sm_mutex; /* Protects state machine */
unsigned char sm_mod_state;
unsigned char sm_dev_state;
unsigned short sm_state;
unsigned int sm_retries;
-@@ -1392,7 +1397,7 @@ static int sfp_sm_mod_hpower(struct sfp
+@@ -1457,7 +1462,7 @@ static int sfp_sm_mod_hpower(struct sfp
return 0;
}
{
/* SFP module inserted - read I2C data */
struct sfp_eeprom_id id;
-@@ -1402,7 +1407,8 @@ static int sfp_sm_mod_probe(struct sfp *
+@@ -1467,7 +1472,8 @@ static int sfp_sm_mod_probe(struct sfp *
ret = sfp_read(sfp, false, 0, &id, sizeof(id));
if (ret < 0) {
return -EAGAIN;
}
-@@ -1549,8 +1555,11 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1614,8 +1620,11 @@ static void sfp_sm_module(struct sfp *sf
switch (sfp->sm_mod_state) {
default:
break;
case SFP_MOD_PROBE:
-@@ -1558,10 +1567,19 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1623,10 +1632,19 @@ static void sfp_sm_module(struct sfp *sf
if (event != SFP_E_TIMEOUT)
break;
}
if (err < 0) {
sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
-@@ -1596,7 +1614,7 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1661,7 +1679,7 @@ static void sfp_sm_module(struct sfp *sf
sfp_module_remove(sfp->sfp_bus);
sfp_sm_mod_next(sfp, SFP_MOD_ERROR, 0);
} else {
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -216,6 +216,8 @@ struct sfp {
+@@ -218,6 +218,8 @@ struct sfp {
#if IS_ENABLED(CONFIG_HWMON)
struct sfp_diag diag;
struct device *hwmon_dev;
char *hwmon_name;
#endif
-@@ -1094,29 +1096,27 @@ static const struct hwmon_chip_info sfp_
+@@ -1159,29 +1161,27 @@ static const struct hwmon_chip_info sfp_
.info = sfp_hwmon_info,
};
for (i = 0; sfp->hwmon_name[i]; i++)
if (hwmon_is_bad_char(sfp->hwmon_name[i]))
-@@ -1126,18 +1126,52 @@ static int sfp_hwmon_insert(struct sfp *
+@@ -1191,18 +1191,52 @@ static int sfp_hwmon_insert(struct sfp *
sfp->hwmon_name, sfp,
&sfp_hwmon_chip_info,
NULL);
#else
static int sfp_hwmon_insert(struct sfp *sfp)
{
-@@ -1147,6 +1181,15 @@ static int sfp_hwmon_insert(struct sfp *
+@@ -1212,6 +1246,15 @@ static int sfp_hwmon_insert(struct sfp *
static void sfp_hwmon_remove(struct sfp *sfp)
{
}
#endif
/* Helpers */
-@@ -1483,10 +1526,6 @@ static int sfp_sm_mod_probe(struct sfp *
+@@ -1548,10 +1591,6 @@ static int sfp_sm_mod_probe(struct sfp *
if (ret < 0)
return ret;
return 0;
}
-@@ -1635,6 +1674,15 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1700,6 +1739,15 @@ static void sfp_sm_module(struct sfp *sf
case SFP_MOD_ERROR:
break;
}
}
static void sfp_sm_main(struct sfp *sfp, unsigned int event)
-@@ -1936,6 +1984,8 @@ static struct sfp *sfp_alloc(struct devi
+@@ -2001,6 +2049,8 @@ static struct sfp *sfp_alloc(struct devi
INIT_DELAYED_WORK(&sfp->poll, sfp_poll);
INIT_DELAYED_WORK(&sfp->timeout, sfp_timeout);
return sfp;
}
-@@ -1943,6 +1993,8 @@ static void sfp_cleanup(void *data)
+@@ -2008,6 +2058,8 @@ static void sfp_cleanup(void *data)
{
struct sfp *sfp = data;
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
-@@ -30,6 +30,7 @@
+@@ -23,6 +23,7 @@
#include <linux/ethtool.h>
#include <linux/phy.h>
#include <linux/phy_led_triggers.h>
#include <linux/workqueue.h>
#include <linux/mdio.h>
#include <linux/io.h>
-@@ -871,6 +872,9 @@ void phy_stop(struct phy_device *phydev)
- if (phy_interrupt_is_valid(phydev))
- phy_disable_interrupts(phydev);
+@@ -841,6 +842,9 @@ void phy_stop(struct phy_device *phydev)
+
+ mutex_lock(&phydev->lock);
+ if (phydev->sfp_bus)
+ sfp_upstream_stop(phydev->sfp_bus);
+
phydev->state = PHY_HALTED;
- out_unlock:
-@@ -899,6 +903,9 @@ void phy_start(struct phy_device *phydev
+ mutex_unlock(&phydev->lock);
+@@ -903,6 +907,9 @@ void phy_state_machine(struct work_struc
- mutex_lock(&phydev->lock);
+ old_state = phydev->state;
+ if (phydev->sfp_bus)
+ sfp_upstream_start(phydev->sfp_bus);
+
switch (phydev->state) {
- case PHY_STARTING:
- phydev->state = PHY_PENDING;
+ case PHY_DOWN:
+ case PHY_READY:
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
-@@ -31,6 +31,7 @@
- #include <linux/ethtool.h>
+@@ -27,6 +27,7 @@
+ #include <linux/bitmap.h>
#include <linux/phy.h>
#include <linux/phy_led_triggers.h>
+#include <linux/sfp.h>
#include <linux/mdio.h>
#include <linux/io.h>
#include <linux/uaccess.h>
-@@ -944,6 +945,65 @@ void phy_attached_print(struct phy_devic
- EXPORT_SYMBOL(phy_attached_print);
+@@ -1178,6 +1179,65 @@ phy_standalone_show(struct device *dev,
+ static DEVICE_ATTR_RO(phy_standalone);
/**
+ * phy_sfp_attach - attach the SFP bus to the PHY upstream network device
* phy_attach_direct - attach a network device to a given PHY device pointer
* @dev: network device to attach
* @phydev: Pointer to phy_device to attach
-@@ -1016,6 +1076,9 @@ int phy_attach_direct(struct net_device
- phydev->attached_dev = dev;
- dev->phydev = phydev;
+@@ -1254,6 +1314,9 @@ int phy_attach_direct(struct net_device
+ dev->phydev = phydev;
+ }
+ if (phydev->sfp_bus_attached)
+ dev->sfp_bus = phydev->sfp_bus;
/* Some Ethernet drivers try to connect to a PHY device before
* calling register_netdevice() -> netdev_register_kobject() and
* does the dev->dev.kobj initialization. Here we only check for
-@@ -1950,6 +2013,9 @@ static int phy_remove(struct device *dev
+@@ -2282,6 +2345,9 @@ static int phy_remove(struct device *dev
phydev->state = PHY_DOWN;
mutex_unlock(&phydev->lock);
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
-@@ -184,6 +184,8 @@ static inline const char *phy_modes(phy_
+@@ -203,6 +203,8 @@ static inline const char *phy_modes(phy_
struct device;
struct phylink;
struct sk_buff;
/*
-@@ -382,6 +384,8 @@ struct phy_c45_device_ids {
+@@ -342,6 +344,8 @@ struct phy_c45_device_ids {
+ * dev_flags: Device-specific flags used by the PHY driver.
* irq: IRQ number of the PHY's interrupt (-1 if none)
* phy_timer: The timer for handling the state machine
- * phy_queue: A work_queue for the phy_mac_interrupt
+ * sfp_bus_attached: flag indicating whether the SFP bus has been attached
+ * sfp_bus: SFP bus attached to this PHY's fiber port
* attached_dev: The attached enet driver's device instance ptr
* adjust_link: Callback for the enet controller to respond to
* changes in the link state.
-@@ -471,6 +475,9 @@ struct phy_device {
+@@ -432,6 +436,9 @@ struct phy_device {
struct mutex lock;
struct phylink *phylink;
struct net_device *attached_dev;
-@@ -1031,6 +1038,10 @@ int phy_suspend(struct phy_device *phyde
+@@ -1020,6 +1027,10 @@ int phy_suspend(struct phy_device *phyde
int phy_resume(struct phy_device *phydev);
int __phy_resume(struct phy_device *phydev);
int phy_loopback(struct phy_device *phydev, bool enable);
--- a/drivers/net/phy/marvell10g.c
+++ b/drivers/net/phy/marvell10g.c
-@@ -25,6 +25,7 @@
+@@ -26,6 +26,7 @@
#include <linux/hwmon.h>
#include <linux/marvell_phy.h>
#include <linux/phy.h>
+#include <linux/sfp.h>
- enum {
- MV_PMA_BOOT = 0xc050,
-@@ -219,6 +220,28 @@ static int mv3310_hwmon_probe(struct phy
+ #define MV_PHY_ALASKA_NBT_QUIRK_MASK 0xfffffffe
+ #define MV_PHY_ALASKA_NBT_QUIRK_REV (MARVELL_PHY_ID_88X3310 | 0xa)
+@@ -206,6 +207,28 @@ static int mv3310_hwmon_probe(struct phy
}
#endif
static int mv3310_probe(struct phy_device *phydev)
{
struct mv3310_priv *priv;
-@@ -249,7 +272,7 @@ static int mv3310_probe(struct phy_devic
+@@ -236,7 +259,7 @@ static int mv3310_probe(struct phy_devic
if (ret)
return ret;
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
-@@ -678,12 +678,6 @@ static int phylink_bringup_phy(struct ph
- u32 advertising;
+@@ -718,11 +718,6 @@ static int phylink_bringup_phy(struct ph
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
int ret;
- memset(&config, 0, sizeof(config));
-- ethtool_convert_legacy_u32_to_link_mode(supported, phy->supported);
-- ethtool_convert_legacy_u32_to_link_mode(config.advertising,
-- phy->advertising);
+- linkmode_copy(supported, phy->supported);
+- linkmode_copy(config.advertising, phy->advertising);
- config.interface = pl->link_config.interface;
-
/*
* This is the new way of dealing with flow control for PHYs,
* as described by Timur Tabi in commit 529ed1275263 ("net: phy:
-@@ -691,10 +685,13 @@ static int phylink_bringup_phy(struct ph
+@@ -730,10 +725,12 @@ static int phylink_bringup_phy(struct ph
* using our validate call to the MAC, we rely upon the MAC
* clearing the bits from both supported and advertising fields.
*/
+ phy_support_asym_pause(phy);
+
+ memset(&config, 0, sizeof(config));
-+ ethtool_convert_legacy_u32_to_link_mode(supported, phy->supported);
-+ ethtool_convert_legacy_u32_to_link_mode(config.advertising,
-+ phy->advertising);
++ linkmode_copy(supported, phy->supported);
++ linkmode_copy(config.advertising, phy->advertising);
+ config.interface = pl->link_config.interface;
ret = phylink_validate(pl, supported, &config);
+++ /dev/null
-From 1be8018db381200c24854e0c299206c557f76fe0 Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Mon, 11 Nov 2019 11:58:09 +0000
-Subject: [PATCH 638/660] net: phy: avoid matching all-ones clause 45 PHY IDs
-
-We currently match clause 45 PHYs using any ID read from a MMD marked
-as present in the "Devices in package" registers 5 and 6. However,
-this is incorrect. 45.2 says:
-
- "The definition of the term package is vendor specific and could be
- a chip, module, or other similar entity."
-
-so a package could be more or less than the whole PHY - a PHY could be
-made up of several modules instantiated onto a single chip such as the
-Marvell 88x3310, or some of the MMDs could be disabled according to
-chip configuration, such as the Broadcom 84881.
-
-In the case of Broadcom 84881, the "Devices in package" registers
-contain 0xc000009b, meaning that there is a PHYXS present in the
-package, but all registers in MMD 4 return 0xffff. This leads to our
-matching code incorrectly binding this PHY to one of our generic PHY
-drivers.
-
-This patch changes the way we determine whether to attempt to match a
-MMD identifier, or use it to request a module - if the identifier is
-all-ones, then we skip over it. When reading the identifiers, we
-initialise phydev->c45_ids.device_ids to all-ones, only reading the
-device ID if the "Devices in package" registers indicates we should.
-
-This avoids the generic drivers incorrectly matching on a PHY ID of
-0xffffffff.
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phy_device.c | 7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
-
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -335,7 +335,7 @@ static int phy_bus_match(struct device *
-
- if (phydev->is_c45) {
- for (i = 1; i < num_ids; i++) {
-- if (!(phydev->c45_ids.devices_in_package & (1 << i)))
-+ if (phydev->c45_ids.device_ids[i] == 0xffffffff)
- continue;
-
- if ((phydrv->phy_id & phydrv->phy_id_mask) ==
-@@ -623,10 +623,13 @@ static int get_phy_id(struct mii_bus *bu
- */
- struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
- {
-- struct phy_c45_device_ids c45_ids = {0};
-+ struct phy_c45_device_ids c45_ids;
- u32 phy_id = 0;
- int r;
-
-+ c45_ids.devices_in_package = 0;
-+ memset(c45_ids.device_ids, 0xff, sizeof(c45_ids.device_ids));
-+
- r = get_phy_id(bus, addr, &phy_id, is_c45, &c45_ids);
- if (r)
- return ERR_PTR(r);
+++ /dev/null
-From 4c9633f75dc35abe1b9261e0415d77802f35741d Mon Sep 17 00:00:00 2001
-From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 5 Nov 2019 11:58:00 +0000
-Subject: [PATCH 639/660] net: phylink: fix link mode modification in PHY mode
-
-Modifying the link settings via phylink_ethtool_ksettings_set() and
-phylink_ethtool_set_pauseparam() didn't always work as intended for
-PHY based setups, as calling phylink_mac_config() would result in the
-unresolved configuration being committed to the MAC, rather than the
-configuration with the speed and duplex setting.
-
-This would work fine if the update caused the link to renegotiate,
-but if no settings have changed, phylib won't trigger a renegotiation
-cycle, and the MAC will be left incorrectly configured.
-
-Avoid calling phylink_mac_config() unless we are using an inband mode
-in phylink_ethtool_ksettings_set(), and use phy_set_asym_pause() as
-introduced in 4.20 to set the PHY settings in
-phylink_ethtool_set_pauseparam().
-
-Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
----
- drivers/net/phy/phylink.c | 24 ++++++++++++++++--------
- 1 file changed, 16 insertions(+), 8 deletions(-)
-
---- a/drivers/net/phy/phylink.c
-+++ b/drivers/net/phy/phylink.c
-@@ -1210,7 +1210,13 @@ int phylink_ethtool_ksettings_set(struct
- pl->link_config.duplex = our_kset.base.duplex;
- pl->link_config.an_enabled = our_kset.base.autoneg != AUTONEG_DISABLE;
-
-- if (!test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) {
-+ /* If we have a PHY, phylib will call our link state function if the
-+ * mode has changed, which will trigger a resolve and update the MAC
-+ * configuration. For a fixed link, this isn't able to change any
-+ * parameters, which just leaves inband mode.
-+ */
-+ if (pl->link_an_mode == MLO_AN_INBAND &&
-+ !test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) {
- phylink_mac_config(pl, &pl->link_config);
- phylink_mac_an_restart(pl);
- }
-@@ -1290,14 +1296,16 @@ int phylink_ethtool_set_pauseparam(struc
- if (pause->tx_pause)
- config->pause |= MLO_PAUSE_TX;
-
-- if (!test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) {
-+ /* If we have a PHY, phylib will call our link state function if the
-+ * mode has changed, which will trigger a resolve and update the MAC
-+ * configuration.
-+ */
-+ if (pl->phydev) {
-+ phy_set_asym_pause(pl->phydev, pause->rx_pause,
-+ pause->tx_pause);
-+ } else if (!test_bit(PHYLINK_DISABLE_STOPPED,
-+ &pl->phylink_disable_state)) {
- switch (pl->link_an_mode) {
-- case MLO_AN_PHY:
-- /* Silently mark the carrier down, and then trigger a resolve */
-- netif_carrier_off(pl->netdev);
-- phylink_run_resolve(pl);
-- break;
--
- case MLO_AN_FIXED:
- /* Should we allow fixed links to change against the config? */
- phylink_resolve_flow(pl, config);
--- a/drivers/net/phy/sfp-bus.c
+++ b/drivers/net/phy/sfp-bus.c
-@@ -9,6 +9,12 @@
+@@ -10,6 +10,12 @@
#include "sfp.h"
/**
* struct sfp_bus - internal representation of a sfp bus
*/
-@@ -21,6 +27,7 @@ struct sfp_bus {
+@@ -22,6 +28,7 @@ struct sfp_bus {
const struct sfp_socket_ops *socket_ops;
struct device *sfp_dev;
struct sfp *sfp;
const struct sfp_upstream_ops *upstream_ops;
void *upstream;
-@@ -30,6 +37,46 @@ struct sfp_bus {
+@@ -31,6 +38,46 @@ struct sfp_bus {
bool started;
};
/**
* sfp_parse_port() - Parse the EEPROM base ID, setting the port type
* @bus: a pointer to the &struct sfp_bus structure for the sfp module
-@@ -233,6 +280,9 @@ void sfp_parse_support(struct sfp_bus *b
+@@ -234,6 +281,9 @@ void sfp_parse_support(struct sfp_bus *b
phylink_set(modes, 1000baseX_Full);
}
bitmap_or(support, support, modes, __ETHTOOL_LINK_MODE_MASK_NBITS);
phylink_set(support, Autoneg);
-@@ -609,6 +659,8 @@ int sfp_module_insert(struct sfp_bus *bu
+@@ -610,6 +660,8 @@ int sfp_module_insert(struct sfp_bus *bu
const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
int ret = 0;
if (ops && ops->module_insert)
ret = ops->module_insert(bus->upstream, id);
-@@ -622,6 +674,8 @@ void sfp_module_remove(struct sfp_bus *b
+@@ -623,6 +675,8 @@ void sfp_module_remove(struct sfp_bus *b
if (ops && ops->module_remove)
ops->module_remove(bus->upstream);
--- a/drivers/net/phy/sfp-bus.c
+++ b/drivers/net/phy/sfp-bus.c
-@@ -37,7 +37,32 @@ struct sfp_bus {
+@@ -38,7 +38,32 @@ struct sfp_bus {
bool started;
};
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -199,7 +199,10 @@ struct sfp {
+@@ -201,7 +201,10 @@ struct sfp {
struct gpio_desc *gpio[GPIO_MAX];
int gpio_irq[GPIO_MAX];
unsigned int state;
struct delayed_work poll;
struct delayed_work timeout;
-@@ -393,24 +396,90 @@ static int sfp_i2c_configure(struct sfp
+@@ -395,24 +398,90 @@ static int sfp_i2c_configure(struct sfp
}
/* Interface */
}
static unsigned int sfp_check(void *buf, size_t len)
-@@ -1342,11 +1411,6 @@ static void sfp_sm_fault(struct sfp *sfp
+@@ -1407,11 +1476,6 @@ static void sfp_sm_fault(struct sfp *sfp
}
}
static void sfp_sm_probe_for_phy(struct sfp *sfp)
{
/* Setting the serdes link mode is guesswork: there's no
-@@ -1509,7 +1573,7 @@ static int sfp_sm_mod_probe(struct sfp *
+@@ -1574,7 +1638,7 @@ static int sfp_sm_mod_probe(struct sfp *
(int)sizeof(id.ext.datecode), id.ext.datecode);
/* Check whether we support this module */
dev_err(sfp->dev,
"module is not supported - phys id 0x%02x 0x%02x\n",
sfp->id.base.phys_id, sfp->id.base.phys_ext_id);
-@@ -1699,6 +1763,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1764,6 +1828,7 @@ static void sfp_sm_main(struct sfp *sfp,
if (sfp->mod_phy)
sfp_sm_phy_detach(sfp);
sfp_module_tx_disable(sfp);
sfp_sm_next(sfp, SFP_S_DOWN, 0);
return;
}
-@@ -1710,7 +1775,10 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1775,7 +1840,10 @@ static void sfp_sm_main(struct sfp *sfp,
sfp->sm_dev_state != SFP_DEV_UP)
break;
/* Initialise the fault clearance retries */
sfp->sm_retries = 5;
-@@ -1966,7 +2034,10 @@ static void sfp_poll(struct work_struct
+@@ -2031,7 +2099,10 @@ static void sfp_poll(struct work_struct
struct sfp *sfp = container_of(work, struct sfp, poll.work);
sfp_check_state(sfp);
}
static struct sfp *sfp_alloc(struct device *dev)
-@@ -2010,7 +2081,6 @@ static int sfp_probe(struct platform_dev
- {
+@@ -2076,7 +2147,6 @@ static int sfp_probe(struct platform_dev
const struct sff_data *sff;
+ struct i2c_adapter *i2c;
struct sfp *sfp;
- bool poll = false;
int err, i;
sfp = sfp_alloc(&pdev->dev);
-@@ -2100,7 +2170,7 @@ static int sfp_probe(struct platform_dev
+@@ -2183,7 +2253,7 @@ static int sfp_probe(struct platform_dev
sfp->gpio_irq[i] = gpiod_to_irq(sfp->gpio[i]);
if (!sfp->gpio_irq[i]) {
continue;
}
-@@ -2112,11 +2182,11 @@ static int sfp_probe(struct platform_dev
+@@ -2195,11 +2265,11 @@ static int sfp_probe(struct platform_dev
dev_name(sfp->dev), sfp);
if (err) {
sfp->gpio_irq[i] = 0;
# CONFIG_AD5764 is not set
# CONFIG_AD5791 is not set
# CONFIG_AD5933 is not set
+# CONFIG_AD7124 is not set
# CONFIG_AD7150 is not set
# CONFIG_AD7152 is not set
# CONFIG_AD7192 is not set
# CONFIG_AD7303 is not set
# CONFIG_AD7476 is not set
# CONFIG_AD7606 is not set
+# CONFIG_AD7606_IFACE_PARALLEL is not set
+# CONFIG_AD7606_IFACE_SPI is not set
# CONFIG_AD7746 is not set
# CONFIG_AD7766 is not set
+# CONFIG_AD7768_1 is not set
# CONFIG_AD7780 is not set
# CONFIG_AD7791 is not set
# CONFIG_AD7793 is not set
# CONFIG_AD7816 is not set
# CONFIG_AD7887 is not set
# CONFIG_AD7923 is not set
+# CONFIG_AD7949 is not set
# CONFIG_AD799X is not set
# CONFIG_AD8366 is not set
# CONFIG_AD8801 is not set
# CONFIG_ADE7759 is not set
# CONFIG_ADE7854 is not set
# CONFIG_ADF4350 is not set
+# CONFIG_ADF4371 is not set
# CONFIG_ADFS_FS is not set
+# CONFIG_ADIN_PHY is not set
# CONFIG_ADIS16060 is not set
# CONFIG_ADIS16080 is not set
# CONFIG_ADIS16130 is not set
# CONFIG_ADIS16240 is not set
# CONFIG_ADIS16260 is not set
# CONFIG_ADIS16400 is not set
+# CONFIG_ADIS16460 is not set
# CONFIG_ADIS16480 is not set
# CONFIG_ADJD_S311 is not set
# CONFIG_ADM6996_PHY is not set
CONFIG_ADVISE_SYSCALLS=y
# CONFIG_ADXL345_I2C is not set
# CONFIG_ADXL345_SPI is not set
+# CONFIG_ADXL372_I2C is not set
+# CONFIG_ADXL372_SPI is not set
# CONFIG_ADXRS450 is not set
CONFIG_AEABI=y
# CONFIG_AFE4403 is not set
# CONFIG_ALTERA_STAPL is not set
# CONFIG_ALTERA_TSE is not set
# CONFIG_ALX is not set
+# CONFIG_AL_FIC is not set
# CONFIG_AM2315 is not set
# CONFIG_AM335X_PHY_USB is not set
# CONFIG_AMBA_PL08X is not set
# CONFIG_BACKLIGHT_APPLE is not set
# CONFIG_BACKLIGHT_ARCXCNN is not set
# CONFIG_BACKLIGHT_BD6107 is not set
+# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
# CONFIG_BACKLIGHT_GENERIC is not set
# CONFIG_BACKLIGHT_GPIO is not set
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
# CONFIG_BINFMT_MISC is not set
CONFIG_BINFMT_SCRIPT=y
CONFIG_BITREVERSE=y
+# CONFIG_BLK_CGROUP_IOCOST is not set
# CONFIG_BLK_CGROUP_IOLATENCY is not set
# CONFIG_BLK_CMDLINE_PARSER is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BT_HCIBTUART is not set
# CONFIG_BT_HCIBTUSB is not set
# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set
+# CONFIG_BT_HCIBTUSB_MTK is not set
# CONFIG_BT_HCIBTUSB_RTL is not set
# CONFIG_BT_HCIDTL1 is not set
# CONFIG_BT_HCIUART is not set
# CONFIG_BT_LE is not set
# CONFIG_BT_LEDS is not set
# CONFIG_BT_MRVL is not set
+# CONFIG_BT_MTKSDIO is not set
# CONFIG_BT_MTKUART is not set
# CONFIG_BT_RFCOMM is not set
CONFIG_BT_RFCOMM_TTY=y
# CONFIG_CAN_GW is not set
# CONFIG_CAN_HI311X is not set
# CONFIG_CAN_IFI_CANFD is not set
+# CONFIG_CAN_J1939 is not set
+# CONFIG_CAN_KVASER_PCIEFD is not set
# CONFIG_CAN_MCBA_USB is not set
# CONFIG_CAN_M_CAN is not set
# CONFIG_CAN_PEAK_PCIEFD is not set
# CONFIG_CB710_CORE is not set
# CONFIG_CC10001_ADC is not set
# CONFIG_CCS811 is not set
+CONFIG_CC_CAN_LINK=y
+CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_SANCOV_TRACE_PC=y
CONFIG_CC_HAS_STACKPROTECTOR_NONE=y
+CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y
CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
# CONFIG_CDROM_PKTCDVD is not set
# CONFIG_CHARGER_GPIO is not set
# CONFIG_CHARGER_ISP1704 is not set
# CONFIG_CHARGER_LP8727 is not set
+# CONFIG_CHARGER_LT3651 is not set
# CONFIG_CHARGER_LTC3651 is not set
# CONFIG_CHARGER_MANAGER is not set
# CONFIG_CHARGER_MAX8903 is not set
# CONFIG_CHARGER_SBS is not set
# CONFIG_CHARGER_SMB347 is not set
# CONFIG_CHARGER_TWL4030 is not set
+# CONFIG_CHARGER_UCS1002 is not set
# CONFIG_CHASH_SELFTEST is not set
# CONFIG_CHASH_STATS is not set
# CONFIG_CHECKPOINT_RESTORE is not set
# CONFIG_COMMON_CLK_CDCE706 is not set
# CONFIG_COMMON_CLK_CDCE925 is not set
# CONFIG_COMMON_CLK_CS2000_CP is not set
+# CONFIG_COMMON_CLK_FIXED_MMIO is not set
# CONFIG_COMMON_CLK_IPROC is not set
# CONFIG_COMMON_CLK_MAX9485 is not set
# CONFIG_COMMON_CLK_NXP is not set
# CONFIG_COMMON_CLK_PXA is not set
# CONFIG_COMMON_CLK_QCOM is not set
# CONFIG_COMMON_CLK_SI514 is not set
+# CONFIG_COMMON_CLK_SI5341 is not set
# CONFIG_COMMON_CLK_SI5351 is not set
# CONFIG_COMMON_CLK_SI544 is not set
# CONFIG_COMMON_CLK_SI570 is not set
# CONFIG_CORESIGHT is not set
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
# CONFIG_CORTINA_PHY is not set
+# CONFIG_COUNTER is not set
# CONFIG_CPA_DEBUG is not set
# CONFIG_CPU_DCACHE_DISABLE is not set
# CONFIG_CPU_FREQ is not set
# CONFIG_CROSS_MEMORY_ATTACH is not set
CONFIG_CRYPTO=y
# CONFIG_CRYPTO_842 is not set
+# CONFIG_CRYPTO_ADIANTUM is not set
# CONFIG_CRYPTO_AEAD is not set
# CONFIG_CRYPTO_AEGIS128 is not set
# CONFIG_CRYPTO_AEGIS128L is not set
# CONFIG_CRYPTO_DEV_ATMEL_AUTHENC is not set
# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set
# CONFIG_CRYPTO_DEV_ATMEL_SHA is not set
+# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set
# CONFIG_CRYPTO_DEV_ATMEL_TDES is not set
# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set
# CONFIG_CRYPTO_DEV_CCP is not set
+# CONFIG_CRYPTO_DEV_CCP_DEBUGFS is not set
# CONFIG_CRYPTO_DEV_CCREE is not set
# CONFIG_CRYPTO_DEV_FSL_CAAM is not set
# CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC is not set
# CONFIG_CRYPTO_ECB is not set
# CONFIG_CRYPTO_ECDH is not set
# CONFIG_CRYPTO_ECHAINIV is not set
+# CONFIG_CRYPTO_ECRDSA is not set
+# CONFIG_CRYPTO_ESSIV is not set
# CONFIG_CRYPTO_FCRYPT is not set
# CONFIG_CRYPTO_FIPS is not set
# CONFIG_CRYPTO_GCM is not set
# CONFIG_CRYPTO_JITTERENTROPY is not set
# CONFIG_CRYPTO_KEYWRAP is not set
# CONFIG_CRYPTO_KHAZAD is not set
+CONFIG_CRYPTO_LIB_AES=y
+CONFIG_CRYPTO_LIB_ARC4=y
# CONFIG_CRYPTO_LRW is not set
# CONFIG_CRYPTO_LZ4 is not set
# CONFIG_CRYPTO_LZ4HC is not set
# CONFIG_CRYPTO_MORUS640 is not set
# CONFIG_CRYPTO_MORUS640_SSE2 is not set
# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_OFB is not set
# CONFIG_CRYPTO_PCBC is not set
# CONFIG_CRYPTO_PCOMP is not set
# CONFIG_CRYPTO_PCOMP2 is not set
# CONFIG_CRYPTO_SM3 is not set
# CONFIG_CRYPTO_SM4 is not set
# CONFIG_CRYPTO_SPECK is not set
+# CONFIG_CRYPTO_STATS is not set
+# CONFIG_CRYPTO_STREEBOG is not set
# CONFIG_CRYPTO_TEA is not set
# CONFIG_CRYPTO_TEST is not set
# CONFIG_CRYPTO_TGR192 is not set
# CONFIG_CRYPTO_WP512 is not set
# CONFIG_CRYPTO_XCBC is not set
# CONFIG_CRYPTO_XTS is not set
+# CONFIG_CRYPTO_XXHASH is not set
# CONFIG_CRYPTO_ZLIB is not set
# CONFIG_CRYPTO_ZSTD is not set
# CONFIG_CS5535_MFGPT is not set
# CONFIG_DEBUG_HIGHMEM is not set
# CONFIG_DEBUG_ICEDCC is not set
# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_INFO_BTF is not set
# CONFIG_DEBUG_INFO_DWARF4 is not set
CONFIG_DEBUG_INFO_REDUCED=y
# CONFIG_DEBUG_INFO_SPLIT is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_DEBUG_MEMORY_INIT is not set
+# CONFIG_DEBUG_MISC is not set
# CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_NX_TEST is not set
# CONFIG_DEBUG_PER_CPU_MAPS is not set
# CONFIG_DEBUG_PINCTRL is not set
# CONFIG_DEBUG_PI_LIST is not set
+# CONFIG_DEBUG_PLIST is not set
# CONFIG_DEBUG_PREEMPT is not set
# CONFIG_DEBUG_RODATA_TEST is not set
# CONFIG_DEBUG_RSEQ is not set
# CONFIG_DL2K is not set
# CONFIG_DLM is not set
# CONFIG_DM9000 is not set
+# CONFIG_DMABUF_SELFTESTS is not set
# CONFIG_DMADEVICES is not set
# CONFIG_DMADEVICES_DEBUG is not set
# CONFIG_DMARD06 is not set
# CONFIG_DMA_SHARED_BUFFER is not set
# CONFIG_DMA_VIRT_OPS is not set
# CONFIG_DM_CACHE is not set
+# CONFIG_DM_CLONE is not set
# CONFIG_DM_DEBUG is not set
# CONFIG_DM_DELAY is not set
+# CONFIG_DM_DUST is not set
# CONFIG_DM_ERA is not set
# CONFIG_DM_FLAKEY is not set
# CONFIG_DM_INTEGRITY is not set
# CONFIG_DP83867_PHY is not set
# CONFIG_DP83TC811_PHY is not set
# CONFIG_DPOT_DAC is not set
+# CONFIG_DPS310 is not set
CONFIG_DQL=y
# CONFIG_DRAGONRISE_FF is not set
# CONFIG_DRM is not set
# CONFIG_DRM_AMDGPU_SI is not set
# CONFIG_DRM_AMDGPU_USERPTR is not set
# CONFIG_DRM_AMD_ACP is not set
+# CONFIG_DRM_AMD_DC_DCN2_0 is not set
# CONFIG_DRM_ANALOGIX_ANX78XX is not set
# CONFIG_DRM_ARCPGU is not set
# CONFIG_DRM_ARMADA is not set
# CONFIG_DW_AXI_DMAC is not set
# CONFIG_DW_DMAC is not set
# CONFIG_DW_DMAC_PCI is not set
+# CONFIG_DW_EDMA is not set
+# CONFIG_DW_EDMA_PCIE is not set
# CONFIG_DW_WATCHDOG is not set
# CONFIG_DYNAMIC_DEBUG is not set
# CONFIG_E100 is not set
# CONFIG_EEPROM_AT24 is not set
# CONFIG_EEPROM_AT25 is not set
# CONFIG_EEPROM_DIGSY_MTC_CFG is not set
+# CONFIG_EEPROM_EE1004 is not set
# CONFIG_EEPROM_IDT_89HPESX is not set
# CONFIG_EEPROM_LEGACY is not set
# CONFIG_EEPROM_MAX6875 is not set
CONFIG_ETHERNET=y
# CONFIG_ETHOC is not set
CONFIG_EVENTFD=y
+# CONFIG_EXFAT_FS is not set
CONFIG_EXPERT=y
CONFIG_EXPORTFS=y
# CONFIG_EXPORTFS_BLOCK_OPS is not set
# CONFIG_EXTCON_ADC_JACK is not set
# CONFIG_EXTCON_ARIZONA is not set
# CONFIG_EXTCON_AXP288 is not set
+# CONFIG_EXTCON_FSA9480 is not set
# CONFIG_EXTCON_GPIO is not set
# CONFIG_EXTCON_INTEL_INT3496 is not set
# CONFIG_EXTCON_MAX3355 is not set
+# CONFIG_EXTCON_PTN5150 is not set
# CONFIG_EXTCON_QCOM_SPMI_MISC is not set
# CONFIG_EXTCON_RT8973A is not set
# CONFIG_EXTCON_SM5502 is not set
# CONFIG_FENCE_TRACE is not set
# CONFIG_FHANDLE is not set
CONFIG_FIB_RULES=y
+# CONFIG_FIELDBUS_DEV is not set
CONFIG_FILE_LOCKING=y
# CONFIG_FIND_BIT_BENCHMARK is not set
# CONFIG_FIREWIRE is not set
CONFIG_FLAT_NODE_MEM_MAP=y
# CONFIG_FM10K is not set
# CONFIG_FMC is not set
+# CONFIG_FONT_TER16x32 is not set
# CONFIG_FORCEDETH is not set
CONFIG_FORCE_MAX_ZONEORDER=11
CONFIG_FORTIFY_SOURCE=y
# CONFIG_FS_DAX is not set
# CONFIG_FS_ENCRYPTION is not set
# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_FS_VERITY is not set
# CONFIG_FTGMAC100 is not set
# CONFIG_FTL is not set
# CONFIG_FTMAC100 is not set
CONFIG_FUTEX_PI=y
# CONFIG_FW_CFG_SYSFS is not set
CONFIG_FW_LOADER=y
+# CONFIG_FW_LOADER_COMPRESS is not set
CONFIG_FW_LOADER_USER_HELPER=y
CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y
+# CONFIG_FXAS21002C is not set
CONFIG_GACT_PROB=y
# CONFIG_GADGET_UAC1 is not set
# CONFIG_GAMEPORT is not set
# CONFIG_GPIO_ALTERA is not set
# CONFIG_GPIO_AMD8111 is not set
# CONFIG_GPIO_AMDPT is not set
+# CONFIG_GPIO_AMD_FCH is not set
# CONFIG_GPIO_BCM_KONA is not set
# CONFIG_GPIO_BT8XX is not set
+# CONFIG_GPIO_CADENCE is not set
# CONFIG_GPIO_CS5535 is not set
# CONFIG_GPIO_DWAPB is not set
# CONFIG_GPIO_EM is not set
# CONFIG_GPIO_GENERIC_PLATFORM is not set
# CONFIG_GPIO_GPIO_MM is not set
# CONFIG_GPIO_GRGPIO is not set
+# CONFIG_GPIO_GW_PLD is not set
# CONFIG_GPIO_HLWD is not set
# CONFIG_GPIO_ICH is not set
# CONFIG_GPIO_IT87 is not set
# CONFIG_GPIO_PL061 is not set
# CONFIG_GPIO_RCAR is not set
# CONFIG_GPIO_RDC321X is not set
+# CONFIG_GPIO_SAMA5D2_PIOBU is not set
# CONFIG_GPIO_SCH is not set
# CONFIG_GPIO_SCH311X is not set
# CONFIG_GPIO_SX150X is not set
# CONFIG_GS_FPGABOOT is not set
# CONFIG_GTP is not set
# CONFIG_GUP_BENCHMARK is not set
+# CONFIG_HABANA_AI is not set
# CONFIG_HAMACHI is not set
# CONFIG_HAMRADIO is not set
# CONFIG_HAPPYMEAL is not set
# CONFIG_HDMI_LPE_AUDIO is not set
# CONFIG_HDQ_MASTER_OMAP is not set
# CONFIG_HEADERS_CHECK is not set
+# CONFIG_HEADERS_INSTALL is not set
+# CONFIG_HEADER_TEST is not set
# CONFIG_HERMES is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_HFSPLUS_FS_POSIX_ACL is not set
# CONFIG_HID_CORSAIR is not set
# CONFIG_HID_COUGAR is not set
# CONFIG_HID_CP2112 is not set
+# CONFIG_HID_CREATIVE_SB0540 is not set
# CONFIG_HID_CYPRESS is not set
# CONFIG_HID_DRAGONRISE is not set
# CONFIG_HID_ELAN is not set
# CONFIG_HID_LOGITECH is not set
# CONFIG_HID_LOGITECH_DJ is not set
# CONFIG_HID_LOGITECH_HIDPP is not set
+# CONFIG_HID_MACALLY is not set
# CONFIG_HID_MAGICMOUSE is not set
+# CONFIG_HID_MALTRON is not set
# CONFIG_HID_MAYFLASH is not set
# CONFIG_HID_MICROSOFT is not set
# CONFIG_HID_MONTEREY is not set
# CONFIG_HID_TIVO is not set
# CONFIG_HID_TOPSEED is not set
# CONFIG_HID_TWINHAN is not set
+# CONFIG_HID_U2FZERO is not set
# CONFIG_HID_UCLOGIC is not set
# CONFIG_HID_UDRAW_PS3 is not set
+# CONFIG_HID_VIEWSONIC is not set
# CONFIG_HID_WACOM is not set
# CONFIG_HID_WALTOP is not set
# CONFIG_HID_WIIMOTE is not set
# CONFIG_HPFS_FS is not set
# CONFIG_HP_ILO is not set
# CONFIG_HP_WIRELESS is not set
+# CONFIG_HSA_AMD is not set
# CONFIG_HSI is not set
# CONFIG_HSR is not set
# CONFIG_HTC_EGPIO is not set
# CONFIG_I2C_IMG is not set
# CONFIG_I2C_ISCH is not set
# CONFIG_I2C_ISMT is not set
+# CONFIG_I2C_JZ4780 is not set
# CONFIG_I2C_MLXCPLD is not set
# CONFIG_I2C_MPC is not set
# CONFIG_I2C_MUX is not set
# CONFIG_I2C_MV64XXX is not set
# CONFIG_I2C_NFORCE2 is not set
# CONFIG_I2C_NOMADIK is not set
+# CONFIG_I2C_NVIDIA_GPU is not set
# CONFIG_I2C_OCORES is not set
# CONFIG_I2C_OCTEON is not set
# CONFIG_I2C_PARPORT is not set
# CONFIG_I2C_VIA is not set
# CONFIG_I2C_VIAPRO is not set
# CONFIG_I2C_XILINX is not set
+# CONFIG_I3C is not set
# CONFIG_I40E is not set
# CONFIG_I40EVF is not set
# CONFIG_I6300ESB_WDT is not set
# CONFIG_IFB is not set
# CONFIG_IGB is not set
# CONFIG_IGBVF is not set
+# CONFIG_IGC is not set
# CONFIG_IIO is not set
# CONFIG_IIO_BUFFER_CB is not set
# CONFIG_IIO_BUFFER_HW_CONSUMER is not set
# CONFIG_IIO_SYSFS_TRIGGER is not set
# CONFIG_IKCONFIG is not set
# CONFIG_IKCONFIG_PROC is not set
+# CONFIG_IKHEADERS is not set
# CONFIG_IMAGE_CMDLINE_HACK is not set
# CONFIG_IMGPDC_WDT is not set
# CONFIG_IMG_MDC_DMA is not set
# CONFIG_INET_XFRM_TUNNEL is not set
# CONFIG_INFINIBAND is not set
# CONFIG_INFTL is not set
+# CONFIG_INGENIC_ADC is not set
+# CONFIG_INGENIC_CGU_JZ4725B is not set
+# CONFIG_INGENIC_CGU_JZ4740 is not set
+# CONFIG_INGENIC_CGU_JZ4770 is not set
+# CONFIG_INGENIC_CGU_JZ4780 is not set
+# CONFIG_INGENIC_TCU_CLK is not set
+# CONFIG_INGENIC_TCU_IRQ is not set
+# CONFIG_INGENIC_TIMER is not set
CONFIG_INIT_ENV_ARG_LIMIT=32
+# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
+# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
+CONFIG_INIT_STACK_NONE=y
# CONFIG_INLINE_READ_LOCK is not set
# CONFIG_INLINE_READ_LOCK_BH is not set
# CONFIG_INLINE_READ_LOCK_IRQ is not set
# CONFIG_INPUT_GPIO_DECODER is not set
# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
# CONFIG_INPUT_GPIO_TILT_POLLED is not set
+# CONFIG_INPUT_GPIO_VIBRA is not set
# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set
# CONFIG_INPUT_IMS_PCU is not set
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_MOUSE is not set
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_MPU3050 is not set
+# CONFIG_INPUT_MSM_VIBRATOR is not set
# CONFIG_INPUT_PALMAS_PWRBUTTON is not set
# CONFIG_INPUT_PCF8574 is not set
# CONFIG_INPUT_PCSPKR is not set
# CONFIG_INTEL_TH is not set
# CONFIG_INTEL_VBTN is not set
# CONFIG_INTEL_XWAY_PHY is not set
+# CONFIG_INTERCONNECT is not set
# CONFIG_INTERVAL_TREE_TEST is not set
# CONFIG_INV_MPU6050_I2C is not set
# CONFIG_INV_MPU6050_IIO is not set
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_NOOP=y
CONFIG_IO_STRICT_DEVMEM=y
+# CONFIG_IO_URING is not set
# CONFIG_IP17XX_PHY is not set
# CONFIG_IP6_NF_FILTER is not set
# CONFIG_IP6_NF_IPTABLES is not set
# CONFIG_KEYBOARD_ADC is not set
# CONFIG_KEYBOARD_ADP5588 is not set
# CONFIG_KEYBOARD_ADP5589 is not set
+# CONFIG_KEYBOARD_APPLESPI is not set
# CONFIG_KEYBOARD_ATKBD is not set
# CONFIG_KEYBOARD_BCM is not set
# CONFIG_KEYBOARD_CAP11XX is not set
# CONFIG_KEYBOARD_OMAP4 is not set
# CONFIG_KEYBOARD_OPENCORES is not set
# CONFIG_KEYBOARD_PXA27x is not set
+# CONFIG_KEYBOARD_QT1050 is not set
# CONFIG_KEYBOARD_QT1070 is not set
# CONFIG_KEYBOARD_QT2160 is not set
# CONFIG_KEYBOARD_SAMSUNG is not set
# CONFIG_KEYBOARD_TWL4030 is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYS is not set
+# CONFIG_KEYS_REQUEST_CACHE is not set
# CONFIG_KEY_DH_OPERATIONS is not set
# CONFIG_KGDB is not set
# CONFIG_KMEMCHECK is not set
# CONFIG_LATTICE_ECP3_CONFIG is not set
CONFIG_LBDAF=y
# CONFIG_LCD_AMS369FG06 is not set
+# CONFIG_LCD_CLASS_DEVICE is not set
# CONFIG_LCD_HX8357 is not set
# CONFIG_LCD_ILI922X is not set
# CONFIG_LCD_ILI9320 is not set
CONFIG_LDISC_AUTOLOAD=y
# CONFIG_LDM_PARTITION is not set
CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y
+# CONFIG_LEDS_AN30259A is not set
# CONFIG_LEDS_APU is not set
# CONFIG_LEDS_BCM6328 is not set
# CONFIG_LEDS_BCM6358 is not set
# CONFIG_LEDS_IS31FL319X is not set
# CONFIG_LEDS_IS31FL32XX is not set
# CONFIG_LEDS_LM3530 is not set
+# CONFIG_LEDS_LM3532 is not set
# CONFIG_LEDS_LM355x is not set
# CONFIG_LEDS_LM3642 is not set
# CONFIG_LEDS_LM3692X is not set
# CONFIG_LEDS_PCA963X is not set
# CONFIG_LEDS_PWM is not set
# CONFIG_LEDS_REGULATOR is not set
+# CONFIG_LEDS_SPI_BYTE is not set
# CONFIG_LEDS_SYSCON is not set
# CONFIG_LEDS_TCA6507 is not set
+# CONFIG_LEDS_TI_LMU_COMMON is not set
# CONFIG_LEDS_TLC591XX is not set
CONFIG_LEDS_TRIGGERS=y
# CONFIG_LEDS_TRIGGER_ACTIVITY is not set
+# CONFIG_LEDS_TRIGGER_AUDIO is not set
# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
# CONFIG_LEDS_TRIGGER_CAMERA is not set
# CONFIG_LEDS_TRIGGER_CPU is not set
CONFIG_LEDS_TRIGGER_NETDEV=y
# CONFIG_LEDS_TRIGGER_ONESHOT is not set
# CONFIG_LEDS_TRIGGER_PANIC is not set
+# CONFIG_LEDS_TRIGGER_PATTERN is not set
CONFIG_LEDS_TRIGGER_TIMER=y
# CONFIG_LEDS_TRIGGER_TRANSIENT is not set
# CONFIG_LEDS_USER is not set
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_LOCKD_V4=y
# CONFIG_LOCKUP_DETECTOR is not set
+# CONFIG_LOCK_EVENT_COUNTS is not set
# CONFIG_LOCK_STAT is not set
# CONFIG_LOCK_TORTURE_TEST is not set
# CONFIG_LOGFS is not set
# CONFIG_LPC_SCH is not set
# CONFIG_LP_CONSOLE is not set
# CONFIG_LSI_ET1011C_PHY is not set
+CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity"
+# CONFIG_LTC1660 is not set
# CONFIG_LTC2471 is not set
# CONFIG_LTC2485 is not set
# CONFIG_LTC2497 is not set
# CONFIG_MAX1363 is not set
# CONFIG_MAX30100 is not set
# CONFIG_MAX30102 is not set
+# CONFIG_MAX31856 is not set
# CONFIG_MAX44000 is not set
+# CONFIG_MAX44009 is not set
# CONFIG_MAX517 is not set
+# CONFIG_MAX5432 is not set
# CONFIG_MAX5481 is not set
# CONFIG_MAX5487 is not set
# CONFIG_MAX5821 is not set
# CONFIG_MAX9611 is not set
# CONFIG_MAXIM_THERMOCOUPLE is not set
CONFIG_MAY_USE_DEVLINK=y
+# CONFIG_MB1232 is not set
# CONFIG_MC3230 is not set
# CONFIG_MCB is not set
# CONFIG_MCP320X is not set
# CONFIG_MCP3422 is not set
+# CONFIG_MCP3911 is not set
# CONFIG_MCP4018 is not set
+# CONFIG_MCP41010 is not set
# CONFIG_MCP4131 is not set
# CONFIG_MCP4531 is not set
# CONFIG_MCP4725 is not set
# CONFIG_MDIO_BITBANG is not set
# CONFIG_MDIO_BUS_MUX_GPIO is not set
# CONFIG_MDIO_BUS_MUX_MMIOREG is not set
+# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set
# CONFIG_MDIO_DEVICE is not set
# CONFIG_MDIO_HISI_FEMAC is not set
# CONFIG_MDIO_MSCC_MIIM is not set
# CONFIG_MFD_MADERA is not set
# CONFIG_MFD_MAX14577 is not set
# CONFIG_MFD_MAX77620 is not set
+# CONFIG_MFD_MAX77650 is not set
# CONFIG_MFD_MAX77686 is not set
# CONFIG_MFD_MAX77693 is not set
# CONFIG_MFD_MAX77843 is not set
# CONFIG_MFD_SKY81452 is not set
# CONFIG_MFD_SM501 is not set
# CONFIG_MFD_SMSC is not set
+# CONFIG_MFD_STMFX is not set
# CONFIG_MFD_STMPE is not set
# CONFIG_MFD_SYSCON is not set
# CONFIG_MFD_T7L66XB is not set
# CONFIG_MFD_TPS65912_SPI is not set
# CONFIG_MFD_TPS68470 is not set
# CONFIG_MFD_TPS80031 is not set
+# CONFIG_MFD_TQMX86 is not set
# CONFIG_MFD_VIPERBOARD is not set
# CONFIG_MFD_VX855 is not set
# CONFIG_MFD_WL1273_CORE is not set
# CONFIG_MIPS_CDMM is not set
# CONFIG_MIPS_COBALT is not set
# CONFIG_MIPS_FPU_EMULATOR is not set
+# CONFIG_MIPS_FP_SUPPORT is not set
# CONFIG_MIPS_GENERIC is not set
# CONFIG_MIPS_MALTA is not set
# CONFIG_MIPS_O32_FP64_SUPPORT is not set
# CONFIG_MIPS_PARAVIRT is not set
# CONFIG_MIPS_PLATFORM_DEVICES is not set
# CONFIG_MIPS_SEAD3 is not set
+# CONFIG_MISC_ALCOR_PCI is not set
CONFIG_MISC_FILESYSTEMS=y
# CONFIG_MISC_RTSX_PCI is not set
# CONFIG_MISC_RTSX_USB is not set
# CONFIG_MMC_CQHCI is not set
# CONFIG_MMC_DEBUG is not set
# CONFIG_MMC_DW is not set
+# CONFIG_MMC_JZ4740 is not set
# CONFIG_MMC_MTK is not set
# CONFIG_MMC_MVSDIO is not set
# CONFIG_MMC_S3C is not set
# CONFIG_MMC_SDHCI is not set
# CONFIG_MMC_SDHCI_ACPI is not set
+# CONFIG_MMC_SDHCI_AM654 is not set
# CONFIG_MMC_SDHCI_BCM_KONA is not set
# CONFIG_MMC_SDHCI_CADENCE is not set
# CONFIG_MMC_SDHCI_F_SDH30 is not set
# CONFIG_MMC_SDHCI_IPROC is not set
# CONFIG_MMC_SDHCI_MSM is not set
# CONFIG_MMC_SDHCI_OF_ARASAN is not set
+# CONFIG_MMC_SDHCI_OF_ASPEED is not set
# CONFIG_MMC_SDHCI_OF_AT91 is not set
# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set
# CONFIG_MMC_SDHCI_OF_ESDHC is not set
# CONFIG_MMIOTRACE is not set
CONFIG_MMU=y
CONFIG_MODULES=y
+# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
# CONFIG_MODULE_COMPRESS is not set
# CONFIG_MODULE_FORCE_LOAD is not set
# CONFIG_MODULE_FORCE_UNLOAD is not set
# CONFIG_MOUSE_PS2_SENTELIC is not set
# CONFIG_MOUSE_SYNAPTICS_I2C is not set
# CONFIG_MOUSE_SYNAPTICS_USB is not set
+# CONFIG_MOXTET is not set
# CONFIG_MPL115 is not set
# CONFIG_MPL115_I2C is not set
# CONFIG_MPL115_SPI is not set
# CONFIG_MTD_DOCG3 is not set
CONFIG_MTD_GEN_PROBE=y
# CONFIG_MTD_GPIO_ADDR is not set
+# CONFIG_MTD_HYPERBUS is not set
# CONFIG_MTD_INTEL_VR_NOR is not set
# CONFIG_MTD_JEDECPROBE is not set
# CONFIG_MTD_LATCH_ADDR is not set
# CONFIG_MTD_NAND_ECC is not set
# CONFIG_MTD_NAND_ECC_BCH is not set
# CONFIG_MTD_NAND_ECC_SMC is not set
+# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set
# CONFIG_MTD_NAND_FSL_ELBC is not set
# CONFIG_MTD_NAND_FSL_IFC is not set
# CONFIG_MTD_NAND_FSL_UPM is not set
# CONFIG_MTD_NAND_MPC5121_NFC is not set
# CONFIG_MTD_NAND_MTK is not set
# CONFIG_MTD_NAND_MXC is not set
+# CONFIG_MTD_NAND_MXIC is not set
# CONFIG_MTD_NAND_NANDSIM is not set
# CONFIG_MTD_NAND_NDFC is not set
# CONFIG_MTD_NAND_NUC900 is not set
# CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_PHYSMAP is not set
# CONFIG_MTD_PHYSMAP_COMPAT is not set
+# CONFIG_MTD_PHYSMAP_GEMINI is not set
+# CONFIG_MTD_PHYSMAP_GPIO_ADDR is not set
CONFIG_MTD_PHYSMAP_OF=y
# CONFIG_MTD_PHYSMAP_OF_GEMINI is not set
# CONFIG_MTD_PHYSMAP_OF_VERSATILE is not set
+# CONFIG_MTD_PHYSMAP_VERSATILE is not set
# CONFIG_MTD_PLATRAM is not set
# CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_RAW_NAND is not set
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
# CONFIG_MTD_REDBOOT_PARTS is not set
# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
# CONFIG_NET_9P is not set
# CONFIG_NET_ACT_BPF is not set
# CONFIG_NET_ACT_CSUM is not set
+# CONFIG_NET_ACT_CT is not set
# CONFIG_NET_ACT_GACT is not set
# CONFIG_NET_ACT_IFE is not set
# CONFIG_NET_ACT_IPT is not set
# CONFIG_NET_ACT_MIRRED is not set
+# CONFIG_NET_ACT_MPLS is not set
# CONFIG_NET_ACT_NAT is not set
# CONFIG_NET_ACT_PEDIT is not set
# CONFIG_NET_ACT_POLICE is not set
# CONFIG_NET_DROP_MONITOR is not set
# CONFIG_NET_DSA is not set
# CONFIG_NET_DSA_BCM_SF2 is not set
+# CONFIG_NET_DSA_LANTIQ_GSWIP is not set
# CONFIG_NET_DSA_LEGACY is not set
# CONFIG_NET_DSA_LOOP is not set
+# CONFIG_NET_DSA_MICROCHIP_KSZ8795 is not set
+# CONFIG_NET_DSA_MICROCHIP_KSZ9477 is not set
# CONFIG_NET_DSA_MT7530 is not set
# CONFIG_NET_DSA_MV88E6060 is not set
# CONFIG_NET_DSA_MV88E6123_61_65 is not set
# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set
# CONFIG_NET_DSA_QCA8K is not set
# CONFIG_NET_DSA_REALTEK_SMI is not set
+# CONFIG_NET_DSA_SJA1105 is not set
# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set
# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set
+# CONFIG_NET_DSA_TAG_8021Q is not set
+# CONFIG_NET_DSA_TAG_BRCM is not set
+# CONFIG_NET_DSA_TAG_BRCM_PREPEND is not set
# CONFIG_NET_DSA_TAG_DSA is not set
# CONFIG_NET_DSA_TAG_EDSA is not set
+# CONFIG_NET_DSA_TAG_GSWIP is not set
+# CONFIG_NET_DSA_TAG_KSZ is not set
+# CONFIG_NET_DSA_TAG_LAN9303 is not set
+# CONFIG_NET_DSA_TAG_MTK is not set
+# CONFIG_NET_DSA_TAG_QCA is not set
+# CONFIG_NET_DSA_TAG_SJA1105 is not set
+# CONFIG_NET_DSA_TAG_TRAILER is not set
# CONFIG_NET_DSA_VITESSE_VSC73XX is not set
+# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set
+# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set
# CONFIG_NET_EMATCH is not set
# CONFIG_NET_EMATCH_CANID is not set
# CONFIG_NET_EMATCH_CMP is not set
# CONFIG_NET_SCH_SFB is not set
# CONFIG_NET_SCH_SFQ is not set
# CONFIG_NET_SCH_SKBPRIO is not set
+# CONFIG_NET_SCH_TAPRIO is not set
# CONFIG_NET_SCH_TBF is not set
# CONFIG_NET_SCH_TEQL is not set
# CONFIG_NET_SCTPPROBE is not set
# CONFIG_NET_SWITCHDEV is not set
# CONFIG_NET_TCPPROBE is not set
+# CONFIG_NET_TC_SKB_EXT is not set
# CONFIG_NET_TEAM is not set
# CONFIG_NET_TULIP is not set
# CONFIG_NET_UDP_TUNNEL is not set
CONFIG_NET_VENDOR_FARADAY=y
CONFIG_NET_VENDOR_FREESCALE=y
CONFIG_NET_VENDOR_FUJITSU=y
+CONFIG_NET_VENDOR_GOOGLE=y
CONFIG_NET_VENDOR_HISILICON=y
CONFIG_NET_VENDOR_HP=y
CONFIG_NET_VENDOR_HUAWEI=y
CONFIG_NET_VENDOR_NVIDIA=y
CONFIG_NET_VENDOR_OKI=y
CONFIG_NET_VENDOR_PACKET_ENGINES=y
+CONFIG_NET_VENDOR_PENSANDO=y
CONFIG_NET_VENDOR_QLOGIC=y
CONFIG_NET_VENDOR_QUALCOMM=y
CONFIG_NET_VENDOR_RDC=y
# CONFIG_NFT_RT is not set
# CONFIG_NFT_SET_BITMAP is not set
# CONFIG_NFT_SOCKET is not set
+# CONFIG_NFT_SYNPROXY is not set
# CONFIG_NFT_TPROXY is not set
# CONFIG_NFT_TUNNEL is not set
+# CONFIG_NFT_XFRM is not set
# CONFIG_NF_CONNTRACK is not set
# CONFIG_NF_CONNTRACK_AMANDA is not set
+# CONFIG_NF_CONNTRACK_BRIDGE is not set
# CONFIG_NF_CONNTRACK_EVENTS is not set
# CONFIG_NF_CONNTRACK_FTP is not set
# CONFIG_NF_CONNTRACK_H323 is not set
# CONFIG_NIC7018_WDT is not set
# CONFIG_NILFS2_FS is not set
# CONFIG_NIU is not set
+# CONFIG_NI_XGE_MANAGEMENT_ENET is not set
CONFIG_NLATTR=y
# CONFIG_NLMON is not set
# CONFIG_NLM_XLP_BOARD is not set
# CONFIG_NLS_MAC_TURKISH is not set
# CONFIG_NLS_UTF8 is not set
CONFIG_NMI_LOG_BUF_SHIFT=13
+# CONFIG_NOA1305 is not set
# CONFIG_NOP_USB_XCEIV is not set
# CONFIG_NORTEL_HERMES is not set
# CONFIG_NOTIFIER_ERROR_INJECTION is not set
# CONFIG_NTFS_FS is not set
# CONFIG_NTFS_RW is not set
# CONFIG_NTP_PPS is not set
+# CONFIG_NULL_TTY is not set
# CONFIG_NVM is not set
# CONFIG_NVMEM is not set
# CONFIG_NVMEM_BCM_OCOTP is not set
# CONFIG_NVMEM_IMX_OCOTP is not set
+# CONFIG_NVMEM_SYSFS is not set
# CONFIG_NVME_FC is not set
# CONFIG_NVME_TARGET is not set
# CONFIG_NVRAM is not set
# CONFIG_NV_TCO is not set
# CONFIG_NXP_STB220 is not set
# CONFIG_NXP_STB225 is not set
+# CONFIG_NXP_TJA11XX_PHY is not set
# CONFIG_N_GSM is not set
# CONFIG_OABI_COMPAT is not set
# CONFIG_OBS600 is not set
# CONFIG_PA12203001 is not set
CONFIG_PACKET=y
# CONFIG_PACKET_DIAG is not set
+# CONFIG_PACKING is not set
# CONFIG_PAGE_EXTENSION is not set
# CONFIG_PAGE_OWNER is not set
# CONFIG_PAGE_POISONING is not set
# CONFIG_PHONET is not set
# CONFIG_PHYLIB is not set
# CONFIG_PHYS_ADDR_T_64BIT is not set
+# CONFIG_PHY_CADENCE_DP is not set
+# CONFIG_PHY_CADENCE_DPHY is not set
+# CONFIG_PHY_CADENCE_SIERRA is not set
# CONFIG_PHY_CPCAP_USB is not set
# CONFIG_PHY_EXYNOS_DP_VIDEO is not set
# CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set
+# CONFIG_PHY_FSL_IMX8MQ_USB is not set
# CONFIG_PHY_MAPPHONE_MDM6600 is not set
+# CONFIG_PHY_MIXEL_MIPI_DPHY is not set
+# CONFIG_PHY_OCELOT_SERDES is not set
# CONFIG_PHY_PXA_28NM_HSIC is not set
# CONFIG_PHY_PXA_28NM_USB2 is not set
# CONFIG_PHY_QCOM_DWC3 is not set
# CONFIG_PINCTRL_EXYNOS is not set
# CONFIG_PINCTRL_EXYNOS5440 is not set
# CONFIG_PINCTRL_ICELAKE is not set
+# CONFIG_PINCTRL_INGENIC is not set
# CONFIG_PINCTRL_MCP23S08 is not set
# CONFIG_PINCTRL_MSM8X74 is not set
+# CONFIG_PINCTRL_OCELOT is not set
CONFIG_PINCTRL_SINGLE=y
+# CONFIG_PINCTRL_STMFX is not set
# CONFIG_PINCTRL_SX150X is not set
CONFIG_PINMUX=y
# CONFIG_PKCS7_MESSAGE_PARSER is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_PRINTK=y
+# CONFIG_PRINTK_CALLER is not set
CONFIG_PRINTK_NMI=y
CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
# CONFIG_PRINTK_TIME is not set
# CONFIG_PROVE_RCU_REPEATEDLY is not set
# CONFIG_PSAMPLE is not set
# CONFIG_PSB6970_PHY is not set
+# CONFIG_PSI is not set
# CONFIG_PSTORE is not set
# CONFIG_PTP_1588_CLOCK is not set
# CONFIG_PTP_1588_CLOCK_IXP46X is not set
# CONFIG_PTP_1588_CLOCK_KVM is not set
# CONFIG_PTP_1588_CLOCK_PCH is not set
# CONFIG_PUBLIC_KEY_ALGO_RSA is not set
+# CONFIG_PVPANIC is not set
# CONFIG_PWM is not set
# CONFIG_PWM_FSL_FTM is not set
# CONFIG_PWM_PCA9685 is not set
# CONFIG_RADIO_TRUST is not set
# CONFIG_RADIO_TYPHOON is not set
# CONFIG_RADIO_ZOLTRIX is not set
+# CONFIG_RAID6_PQ_BENCHMARK is not set
# CONFIG_RAID_ATTRS is not set
# CONFIG_RALINK is not set
# CONFIG_RANDOM32_SELFTEST is not set
+# CONFIG_RANDOM_TRUST_BOOTLOADER is not set
# CONFIG_RANDOM_TRUST_CPU is not set
# CONFIG_RAPIDIO is not set
# CONFIG_RAS is not set
# CONFIG_READABLE_ASM is not set
# CONFIG_REALTEK_PHY is not set
# CONFIG_REDWOOD is not set
+# CONFIG_REED_SOLOMON_TEST is not set
# CONFIG_REFCOUNT_FULL is not set
# CONFIG_REGMAP is not set
# CONFIG_REGMAP_I2C is not set
# CONFIG_REGULATOR_MAX8660 is not set
# CONFIG_REGULATOR_MAX8952 is not set
# CONFIG_REGULATOR_MAX8973 is not set
+# CONFIG_REGULATOR_MCP16502 is not set
# CONFIG_REGULATOR_MT6311 is not set
# CONFIG_REGULATOR_PFUZE100 is not set
# CONFIG_REGULATOR_PV88060 is not set
# CONFIG_REGULATOR_PV88080 is not set
# CONFIG_REGULATOR_PV88090 is not set
# CONFIG_REGULATOR_PWM is not set
+# CONFIG_REGULATOR_SLG51000 is not set
# CONFIG_REGULATOR_SY8106A is not set
+# CONFIG_REGULATOR_SY8824X is not set
# CONFIG_REGULATOR_TI_ABB is not set
# CONFIG_REGULATOR_TPS51632 is not set
# CONFIG_REGULATOR_TPS62360 is not set
# CONFIG_RTC_CLASS is not set
# CONFIG_RTC_DEBUG is not set
# CONFIG_RTC_DRV_ABB5ZES3 is not set
+# CONFIG_RTC_DRV_ABEOZ9 is not set
# CONFIG_RTC_DRV_ABX80X is not set
# CONFIG_RTC_DRV_ARMADA38X is not set
# CONFIG_RTC_DRV_AU1XXX is not set
# CONFIG_RTC_DRV_BQ32K is not set
# CONFIG_RTC_DRV_BQ4802 is not set
-CONFIG_RTC_DRV_CMOS=y
+# CONFIG_RTC_DRV_CADENCE is not set
+# CONFIG_RTC_DRV_CMOS is not set
# CONFIG_RTC_DRV_DS1286 is not set
# CONFIG_RTC_DRV_DS1302 is not set
# CONFIG_RTC_DRV_DS1305 is not set
# CONFIG_RTC_DRV_RS5C348 is not set
# CONFIG_RTC_DRV_RS5C372 is not set
# CONFIG_RTC_DRV_RTC7301 is not set
+# CONFIG_RTC_DRV_RV3028 is not set
# CONFIG_RTC_DRV_RV3029C2 is not set
# CONFIG_RTC_DRV_RV8803 is not set
# CONFIG_RTC_DRV_RX4581 is not set
# CONFIG_RTC_DRV_RX8025 is not set
# CONFIG_RTC_DRV_RX8581 is not set
# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_SD3078 is not set
# CONFIG_RTC_DRV_SNVS is not set
# CONFIG_RTC_DRV_STK17TA8 is not set
# CONFIG_RTC_DRV_SUN6I is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_ESAS2R is not set
# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_FDOMAIN_PCI is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_GENERIC_NCR5380 is not set
# CONFIG_SCSI_MVSAS is not set
# CONFIG_SCSI_MVSAS_DEBUG is not set
# CONFIG_SCSI_MVUMI is not set
+# CONFIG_SCSI_MYRB is not set
# CONFIG_SCSI_NCR53C406A is not set
# CONFIG_SCSI_NETLINK is not set
# CONFIG_SCSI_NSP32 is not set
# CONFIG_SECURITYFS is not set
CONFIG_SECURITY_DMESG_RESTRICT=y
CONFIG_SELECT_MEMORY_MODEL=y
+# CONFIG_SENSIRION_SGP30 is not set
# CONFIG_SENSORS_ABITUGURU is not set
# CONFIG_SENSORS_ABITUGURU3 is not set
# CONFIG_SENSORS_ACPI_POWER is not set
# CONFIG_SENSORS_AMC6821 is not set
# CONFIG_SENSORS_APDS990X is not set
# CONFIG_SENSORS_APPLESMC is not set
+# CONFIG_SENSORS_AS370 is not set
# CONFIG_SENSORS_ASB100 is not set
# CONFIG_SENSORS_ASC7621 is not set
# CONFIG_SENSORS_ASPEED is not set
# CONFIG_SENSORS_INA209 is not set
# CONFIG_SENSORS_INA2XX is not set
# CONFIG_SENSORS_INA3221 is not set
+# CONFIG_SENSORS_INSPUR_IPSPS is not set
# CONFIG_SENSORS_IR35221 is not set
+# CONFIG_SENSORS_IR38064 is not set
+# CONFIG_SENSORS_IRPS5401 is not set
# CONFIG_SENSORS_ISL29018 is not set
# CONFIG_SENSORS_ISL29028 is not set
+# CONFIG_SENSORS_ISL68137 is not set
# CONFIG_SENSORS_IT87 is not set
# CONFIG_SENSORS_JC42 is not set
# CONFIG_SENSORS_K10TEMP is not set
# CONFIG_SENSORS_PMBUS is not set
# CONFIG_SENSORS_POWR1220 is not set
# CONFIG_SENSORS_PWM_FAN is not set
+# CONFIG_SENSORS_PXE1610 is not set
+# CONFIG_SENSORS_RM3100_I2C is not set
+# CONFIG_SENSORS_RM3100_SPI is not set
# CONFIG_SENSORS_SCH5627 is not set
# CONFIG_SENSORS_SCH5636 is not set
# CONFIG_SENSORS_SCH56XX_COMMON is not set
# CONFIG_SERIAL_DEV_BUS is not set
CONFIG_SERIAL_EARLYCON=y
# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set
+# CONFIG_SERIAL_FSL_LINFLEXUART is not set
# CONFIG_SERIAL_FSL_LPUART is not set
# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set
# CONFIG_SERIAL_IFX6X60 is not set
# CONFIG_SERIAL_SC16IS7XX is not set
# CONFIG_SERIAL_SCCNXP is not set
# CONFIG_SERIAL_SH_SCI is not set
+# CONFIG_SERIAL_SIFIVE is not set
# CONFIG_SERIAL_STM32 is not set
# CONFIG_SERIAL_ST_ASC is not set
# CONFIG_SERIAL_TIMBERDALE is not set
# CONFIG_SG_POOL is not set
# CONFIG_SG_SPLIT is not set
CONFIG_SHMEM=y
+# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set
# CONFIG_SH_ETH is not set
# CONFIG_SH_TIMER_CMT is not set
# CONFIG_SH_TIMER_MTU2 is not set
# CONFIG_SND_GUSEXTREME is not set
# CONFIG_SND_GUSMAX is not set
# CONFIG_SND_HDA_INTEL is not set
+# CONFIG_SND_HDA_INTEL_DETECT_DMIC is not set
CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0
CONFIG_SND_HDA_PREALLOC_SIZE=64
# CONFIG_SND_HDSP is not set
# CONFIG_SND_INTERWAVE is not set
# CONFIG_SND_INTERWAVE_STB is not set
# CONFIG_SND_ISA is not set
+# CONFIG_SND_JZ4740_SOC_I2S is not set
# CONFIG_SND_KIRKWOOD_SOC is not set
# CONFIG_SND_KORG1212 is not set
# CONFIG_SND_LAYLA20 is not set
# CONFIG_SND_SOC_ADAU1761_SPI is not set
# CONFIG_SND_SOC_ADAU7002 is not set
# CONFIG_SND_SOC_AK4104 is not set
+# CONFIG_SND_SOC_AK4118 is not set
# CONFIG_SND_SOC_AK4458 is not set
# CONFIG_SND_SOC_AK4554 is not set
# CONFIG_SND_SOC_AK4613 is not set
# CONFIG_SND_SOC_AK5558 is not set
# CONFIG_SND_SOC_ALC5623 is not set
# CONFIG_SND_SOC_AMD_ACP is not set
+# CONFIG_SND_SOC_AMD_ACP3x is not set
# CONFIG_SND_SOC_AU1XAUDIO is not set
# CONFIG_SND_SOC_AU1XPSC is not set
# CONFIG_SND_SOC_BD28623 is not set
# CONFIG_SND_SOC_CS35L33 is not set
# CONFIG_SND_SOC_CS35L34 is not set
# CONFIG_SND_SOC_CS35L35 is not set
+# CONFIG_SND_SOC_CS35L36 is not set
# CONFIG_SND_SOC_CS4265 is not set
# CONFIG_SND_SOC_CS4270 is not set
# CONFIG_SND_SOC_CS4271 is not set
# CONFIG_SND_SOC_CS42L73 is not set
# CONFIG_SND_SOC_CS42XX8_I2C is not set
# CONFIG_SND_SOC_CS43130 is not set
+# CONFIG_SND_SOC_CS4341 is not set
# CONFIG_SND_SOC_CS4349 is not set
# CONFIG_SND_SOC_CS53L30 is not set
+# CONFIG_SND_SOC_CX2072X is not set
# CONFIG_SND_SOC_DIO2125 is not set
# CONFIG_SND_SOC_ES7134 is not set
# CONFIG_SND_SOC_ES7241 is not set
# CONFIG_SND_SOC_EUKREA_TLV320 is not set
# CONFIG_SND_SOC_FSL_ASOC_CARD is not set
# CONFIG_SND_SOC_FSL_ASRC is not set
+# CONFIG_SND_SOC_FSL_AUDMIX is not set
# CONFIG_SND_SOC_FSL_ESAI is not set
+# CONFIG_SND_SOC_FSL_MICFIL is not set
# CONFIG_SND_SOC_FSL_SAI is not set
# CONFIG_SND_SOC_FSL_SPDIF is not set
# CONFIG_SND_SOC_FSL_SSI is not set
# CONFIG_SND_SOC_IMX_SPDIF is not set
# CONFIG_SND_SOC_IMX_WM8962 is not set
# CONFIG_SND_SOC_INNO_RK3036 is not set
+# CONFIG_SND_SOC_INTEL_APL is not set
# CONFIG_SND_SOC_INTEL_BAYTRAIL is not set
# CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH is not set
# CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH is not set
# CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH is not set
# CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH is not set
# CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH is not set
+# CONFIG_SND_SOC_INTEL_CFL is not set
# CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH is not set
# CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH is not set
# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH is not set
# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH is not set
+# CONFIG_SND_SOC_INTEL_CML_H is not set
+# CONFIG_SND_SOC_INTEL_CML_LP is not set
+# CONFIG_SND_SOC_INTEL_CNL is not set
+# CONFIG_SND_SOC_INTEL_GLK is not set
# CONFIG_SND_SOC_INTEL_HASWELL is not set
+# CONFIG_SND_SOC_INTEL_KBL is not set
# CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH is not set
# CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH is not set
+# CONFIG_SND_SOC_INTEL_SKL is not set
# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH is not set
# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH is not set
# CONFIG_SND_SOC_INTEL_SKL_RT286_MACH is not set
# CONFIG_SND_SOC_INTEL_SKYLAKE is not set
# CONFIG_SND_SOC_INTEL_SST is not set
CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y
+# CONFIG_SND_SOC_JZ4725B_CODEC is not set
+# CONFIG_SND_SOC_JZ4740_CODEC is not set
# CONFIG_SND_SOC_MAX9759 is not set
+# CONFIG_SND_SOC_MAX98088 is not set
+# CONFIG_SND_SOC_MAX98357A is not set
# CONFIG_SND_SOC_MAX98373 is not set
# CONFIG_SND_SOC_MAX98504 is not set
# CONFIG_SND_SOC_MAX9860 is not set
# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set
# CONFIG_SND_SOC_MT2701 is not set
# CONFIG_SND_SOC_MT6351 is not set
+# CONFIG_SND_SOC_MT6358 is not set
# CONFIG_SND_SOC_MT8173 is not set
+# CONFIG_SND_SOC_MTK_BTCVSD is not set
# CONFIG_SND_SOC_NAU8540 is not set
# CONFIG_SND_SOC_NAU8810 is not set
+# CONFIG_SND_SOC_NAU8822 is not set
# CONFIG_SND_SOC_NAU8824 is not set
# CONFIG_SND_SOC_PCM1681 is not set
# CONFIG_SND_SOC_PCM1789_I2C is not set
# CONFIG_SND_SOC_PCM179X_SPI is not set
# CONFIG_SND_SOC_PCM186X_I2C is not set
# CONFIG_SND_SOC_PCM186X_SPI is not set
+# CONFIG_SND_SOC_PCM3060_I2C is not set
+# CONFIG_SND_SOC_PCM3060_SPI is not set
# CONFIG_SND_SOC_PCM3168A_I2C is not set
# CONFIG_SND_SOC_PCM3168A_SPI is not set
# CONFIG_SND_SOC_PCM512x_I2C is not set
# CONFIG_SND_SOC_PCM512x_SPI is not set
# CONFIG_SND_SOC_QCOM is not set
+# CONFIG_SND_SOC_RK3328 is not set
# CONFIG_SND_SOC_RT5616 is not set
# CONFIG_SND_SOC_RT5631 is not set
# CONFIG_SND_SOC_RT5677_SPI is not set
# CONFIG_SND_SOC_SGTL5000 is not set
# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set
# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
+# CONFIG_SND_SOC_SOF_TOPLEVEL is not set
# CONFIG_SND_SOC_SPDIF is not set
# CONFIG_SND_SOC_SSM2305 is not set
# CONFIG_SND_SOC_SSM2602_I2C is not set
# CONFIG_SND_SOC_TS3A227E is not set
# CONFIG_SND_SOC_TSCS42XX is not set
# CONFIG_SND_SOC_TSCS454 is not set
+# CONFIG_SND_SOC_UDA1334 is not set
# CONFIG_SND_SOC_WM8510 is not set
# CONFIG_SND_SOC_WM8523 is not set
# CONFIG_SND_SOC_WM8524 is not set
# CONFIG_SND_SOC_WM8804_I2C is not set
# CONFIG_SND_SOC_WM8804_SPI is not set
# CONFIG_SND_SOC_WM8903 is not set
+# CONFIG_SND_SOC_WM8904 is not set
# CONFIG_SND_SOC_WM8960 is not set
# CONFIG_SND_SOC_WM8962 is not set
# CONFIG_SND_SOC_WM8974 is not set
# CONFIG_SND_SOC_WM8978 is not set
# CONFIG_SND_SOC_WM8985 is not set
+# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set
+# CONFIG_SND_SOC_XILINX_I2S is not set
+# CONFIG_SND_SOC_XILINX_SPDIF is not set
# CONFIG_SND_SOC_XTFPGA_I2S is not set
# CONFIG_SND_SOC_ZX_AUD96P22 is not set
# CONFIG_SND_SONICVIBES is not set
# CONFIG_SPI_MEM is not set
# CONFIG_SPI_MPC52xx is not set
# CONFIG_SPI_MPC52xx_PSC is not set
+# CONFIG_SPI_MTK_QUADSPI is not set
+# CONFIG_SPI_MXIC is not set
+# CONFIG_SPI_NXP_FLEXSPI is not set
# CONFIG_SPI_OCTEON is not set
# CONFIG_SPI_OC_TINY is not set
# CONFIG_SPI_ORION is not set
# CONFIG_SPI_ROCKCHIP is not set
# CONFIG_SPI_S3C64XX is not set
# CONFIG_SPI_SC18IS602 is not set
+# CONFIG_SPI_SIFIVE is not set
# CONFIG_SPI_SLAVE is not set
# CONFIG_SPI_SPIDEV is not set
# CONFIG_SPI_THUNDERX is not set
# CONFIG_SPI_ZYNQMP_GQSPI is not set
CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_SPMI is not set
+# CONFIG_SPS30 is not set
CONFIG_SQUASHFS=y
# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
# CONFIG_SQUASHFS_DECOMP_MULTI is not set
# CONFIG_SUNGEM is not set
# CONFIG_SUNRPC is not set
# CONFIG_SUNRPC_DEBUG is not set
+CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES=y
# CONFIG_SUNRPC_GSS is not set
# CONFIG_SUNXI_SRAM is not set
# CONFIG_SUN_PARTITION is not set
# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set
# CONFIG_TEST_BITFIELD is not set
# CONFIG_TEST_BITMAP is not set
+# CONFIG_TEST_BLACKHOLE_DEV is not set
# CONFIG_TEST_BPF is not set
# CONFIG_TEST_FIRMWARE is not set
# CONFIG_TEST_HASH is not set
# CONFIG_TEST_KSTRTOX is not set
# CONFIG_TEST_LIST_SORT is not set
# CONFIG_TEST_LKM is not set
+# CONFIG_TEST_MEMCAT_P is not set
+# CONFIG_TEST_MEMINIT is not set
# CONFIG_TEST_OVERFLOW is not set
# CONFIG_TEST_POWER is not set
# CONFIG_TEST_PRINTF is not set
# CONFIG_TEST_RHASHTABLE is not set
# CONFIG_TEST_SORT is not set
+# CONFIG_TEST_STACKINIT is not set
# CONFIG_TEST_STATIC_KEYS is not set
# CONFIG_TEST_STRING_HELPERS is not set
+# CONFIG_TEST_STRSCPY is not set
# CONFIG_TEST_SYSCTL is not set
# CONFIG_TEST_UDELAY is not set
# CONFIG_TEST_USER_COPY is not set
# CONFIG_TEST_UUID is not set
+# CONFIG_TEST_VMALLOC is not set
+# CONFIG_TEST_XARRAY is not set
CONFIG_TEXTSEARCH=y
# CONFIG_TEXTSEARCH_BM is not set
# CONFIG_TEXTSEARCH_FSM is not set
# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set
# CONFIG_THERMAL_GOV_USER_SPACE is not set
# CONFIG_THERMAL_HWMON is not set
+# CONFIG_THERMAL_MMIO is not set
# CONFIG_THERMAL_STATISTICS is not set
# CONFIG_THERMAL_WRITABLE_TRIPS is not set
# CONFIG_THINKPAD_ACPI is not set
# CONFIG_TIMB_DMA is not set
CONFIG_TIMERFD=y
# CONFIG_TIMER_STATS is not set
+# CONFIG_TINYDRM_HX8357D is not set
+# CONFIG_TINYDRM_ILI9225 is not set
+# CONFIG_TINYDRM_ILI9341 is not set
+# CONFIG_TINYDRM_MI0283QT is not set
+# CONFIG_TINYDRM_REPAPER is not set
+# CONFIG_TINYDRM_ST7586 is not set
+# CONFIG_TINYDRM_ST7735R is not set
CONFIG_TINY_RCU=y
# CONFIG_TIPC is not set
# CONFIG_TI_ADC081C is not set
# CONFIG_TI_ADC128S052 is not set
# CONFIG_TI_ADC161S626 is not set
# CONFIG_TI_ADS1015 is not set
+# CONFIG_TI_ADS124S08 is not set
# CONFIG_TI_ADS7950 is not set
+# CONFIG_TI_ADS8344 is not set
# CONFIG_TI_ADS8688 is not set
# CONFIG_TI_AM335X_ADC is not set
# CONFIG_TI_CPSW is not set
# CONFIG_TI_CPSW_ALE is not set
+# CONFIG_TI_CPSW_PHY_SEL is not set
# CONFIG_TI_CPTS is not set
# CONFIG_TI_DAC082S085 is not set
# CONFIG_TI_DAC5571 is not set
+# CONFIG_TI_DAC7311 is not set
# CONFIG_TI_DAC7512 is not set
+# CONFIG_TI_DAC7612 is not set
# CONFIG_TI_DAVINCI_CPDMA is not set
# CONFIG_TI_DAVINCI_MDIO is not set
# CONFIG_TI_ST is not set
# CONFIG_TOUCHSCREEN_INEXIO is not set
# CONFIG_TOUCHSCREEN_IPAQ_MICRO is not set
# CONFIG_TOUCHSCREEN_IPROC is not set
+# CONFIG_TOUCHSCREEN_IQS5XX is not set
# CONFIG_TOUCHSCREEN_LPC32XX is not set
# CONFIG_TOUCHSCREEN_MAX11801 is not set
# CONFIG_TOUCHSCREEN_MC13783 is not set
# CONFIG_TYPHOON is not set
# CONFIG_UACCESS_WITH_MEMCPY is not set
# CONFIG_UBIFS_ATIME_SUPPORT is not set
+# CONFIG_UBIFS_FS_AUTHENTICATION is not set
# CONFIG_UBIFS_FS_ENCRYPTION is not set
CONFIG_UBIFS_FS_FORMAT4=y
# CONFIG_UBIFS_FS_SECURITY is not set
# CONFIG_UCB1400_CORE is not set
# CONFIG_UCSI is not set
# CONFIG_UDF_FS is not set
+# CONFIG_UDMABUF is not set
CONFIG_UEVENT_HELPER=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
# CONFIG_UFS_FS is not set
# CONFIG_UIO is not set
# CONFIG_ULTRA is not set
# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_UNICODE is not set
# CONFIG_UNISYSSPAR is not set
# CONFIG_UNISYS_VISORBUS is not set
CONFIG_UNIX=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARMLINUX=y
# CONFIG_USB_ATM is not set
+CONFIG_USB_AUTOSUSPEND_DELAY=2
# CONFIG_USB_BDC_UDC is not set
CONFIG_USB_BELKIN=y
# CONFIG_USB_C67X00_HCD is not set
# CONFIG_USB_CATC is not set
# CONFIG_USB_CDC_COMPOSITE is not set
+# CONFIG_USB_CDNS3 is not set
# CONFIG_USB_CHAOSKEY is not set
# CONFIG_USB_CHIPIDEA is not set
# CONFIG_USB_CONFIGFS is not set
+# CONFIG_USB_CONN_GPIO is not set
# CONFIG_USB_CXACRU is not set
# CONFIG_USB_CYPRESS_CY7C63 is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_MXS_PHY is not set
# CONFIG_USB_NET2272 is not set
# CONFIG_USB_NET2280 is not set
+# CONFIG_USB_NET_AQC111 is not set
# CONFIG_USB_NET_AX88179_178A is not set
# CONFIG_USB_NET_AX8817X is not set
# CONFIG_USB_NET_CDCETHER is not set
# CONFIG_U_SERIAL_CONSOLE is not set
# CONFIG_V4L_MEM2MEM_DRIVERS is not set
# CONFIG_V4L_TEST_DRIVERS is not set
+# CONFIG_VALIDATE_FS_PARSER is not set
# CONFIG_VBOXGUEST is not set
# CONFIG_VCNL4000 is not set
+# CONFIG_VCNL4035 is not set
# CONFIG_VDSO is not set
# CONFIG_VEML6070 is not set
# CONFIG_VETH is not set
# CONFIG_VIDEO_ADV7393 is not set
# CONFIG_VIDEO_ADV_DEBUG is not set
# CONFIG_VIDEO_AK881X is not set
+# CONFIG_VIDEO_ASPEED is not set
# CONFIG_VIDEO_BT819 is not set
# CONFIG_VIDEO_BT848 is not set
# CONFIG_VIDEO_BT856 is not set
# CONFIG_VIDEO_OV7670 is not set
# CONFIG_VIDEO_OV772X is not set
# CONFIG_VIDEO_OV7740 is not set
+# CONFIG_VIDEO_OV9640 is not set
# CONFIG_VIDEO_PVRUSB2 is not set
# CONFIG_VIDEO_RJ54N1 is not set
# CONFIG_VIDEO_SAA6588 is not set
# CONFIG_VIDEO_ZORAN is not set
# CONFIG_VIRTIO_BALLOON is not set
# CONFIG_VIRTIO_BLK_SCSI is not set
+# CONFIG_VIRTIO_FS is not set
# CONFIG_VIRTIO_INPUT is not set
CONFIG_VIRTIO_MENU=y
# CONFIG_VIRTIO_MMIO is not set
# CONFIG_VIRT_DRIVERS is not set
CONFIG_VIRT_TO_BUS=y
# CONFIG_VITESSE_PHY is not set
+# CONFIG_VL53L0X_I2C is not set
# CONFIG_VL6180 is not set
CONFIG_VLAN_8021Q=y
# CONFIG_VLAN_8021Q_GVRP is not set
# CONFIG_W1_MASTER_DS2490 is not set
# CONFIG_W1_MASTER_GPIO is not set
# CONFIG_W1_MASTER_MATROX is not set
+# CONFIG_W1_MASTER_SGI is not set
# CONFIG_W1_SLAVE_BQ27000 is not set
# CONFIG_W1_SLAVE_DS2405 is not set
# CONFIG_W1_SLAVE_DS2406 is not set
# CONFIG_W1_SLAVE_DS2431 is not set
# CONFIG_W1_SLAVE_DS2433 is not set
# CONFIG_W1_SLAVE_DS2438 is not set
+# CONFIG_W1_SLAVE_DS250X is not set
# CONFIG_W1_SLAVE_DS2760 is not set
# CONFIG_W1_SLAVE_DS2780 is not set
# CONFIG_W1_SLAVE_DS2781 is not set
# CONFIG_WATCHDOG_CORE is not set
CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y
# CONFIG_WATCHDOG_NOWAYOUT is not set
+CONFIG_WATCHDOG_OPEN_TIMEOUT=0
# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set
# CONFIG_WATCHDOG_SYSFS is not set
# CONFIG_WD80x3 is not set
# CONFIG_XILINX_EMACLITE is not set
# CONFIG_XILINX_GMII2RGMII is not set
# CONFIG_XILINX_LL_TEMAC is not set
+# CONFIG_XILINX_SDFEC is not set
# CONFIG_XILINX_VCU is not set
# CONFIG_XILINX_WATCHDOG is not set
+# CONFIG_XILINX_XADC is not set
# CONFIG_XILINX_ZYNQMP_DMA is not set
# CONFIG_XILLYBUS is not set
# CONFIG_XIL_AXIS_FIFO is not set
struct switch_port_link link;
/* check for switch port link changes */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
if (phydev->state == PHY_CHANGELINK)
+#endif
ar8xxx_check_link_states(priv);
if (phydev->mdio.addr != 0)
priv->use_count++;
if (phydev->mdio.addr == 0) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
+ linkmode_zero(phydev->supported);
+ if (ar8xxx_has_gige(priv))
+ linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, phydev->supported);
+ else
+ linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported);
+ linkmode_copy(phydev->advertising, phydev->supported);
+#else
if (ar8xxx_has_gige(priv)) {
phydev->supported = SUPPORTED_1000baseT_Full;
phydev->advertising = ADVERTISED_1000baseT_Full;
phydev->supported = SUPPORTED_100baseT_Full;
phydev->advertising = ADVERTISED_100baseT_Full;
}
+#endif
if (priv->chip->config_at_probe) {
priv->phy = phydev;
}
} else {
if (ar8xxx_has_gige(priv)) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
+ linkmode_zero(phydev->supported);
+ linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, phydev->supported);
+ linkmode_copy(phydev->advertising, phydev->supported);
+#else
phydev->supported |= SUPPORTED_1000baseT_Full;
phydev->advertising |= ADVERTISED_1000baseT_Full;
+#endif
}
if (priv->chip->phy_rgmii_set)
priv->chip->phy_rgmii_set(priv, phydev);
--- a/include/linux/module.h
+++ b/include/linux/module.h
-@@ -160,6 +160,7 @@ extern void cleanup_module(void);
+@@ -157,6 +157,7 @@ extern void cleanup_module(void);
/* Generic info of form tag = "info" */
#define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
/* For userspace: you can also call me... */
#define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias)
-@@ -203,12 +204,12 @@ extern void cleanup_module(void);
+@@ -216,12 +217,12 @@ extern void cleanup_module(void);
* Author(s), use "Name <email>" or just "Name", for multiple
* authors use multiple MODULE_AUTHOR() statements/lines.
*/
/* Creates an alias so file2alias.c can find device table. */
#define MODULE_DEVICE_TABLE(type, name) \
extern typeof(name) __mod_##type##__##name##_device_table \
-@@ -235,7 +236,9 @@ extern typeof(name) __mod_##type##__##na
+@@ -248,7 +249,9 @@ extern typeof(name) __mod_##type##__##na
*/
#if defined(MODULE) || !defined(CONFIG_SYSFS)
+#define MODULE_VERSION(_version) __MODULE_INFO_DISABLED(version)
#else
#define MODULE_VERSION(_version) \
- static struct module_version_attribute ___modver_attr = { \
-@@ -257,7 +260,7 @@ extern typeof(name) __mod_##type##__##na
+ MODULE_INFO(version, _version); \
+@@ -271,7 +274,7 @@ extern typeof(name) __mod_##type##__##na
/* Optional firmware file (or files) needed by the module
* format is simply firmware file name. Multiple firmware
* files require multiple MODULE_FIRMWARE() specifiers */
-#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware)
+#define MODULE_FIRMWARE(_firmware) MODULE_INFO_STRIP(firmware, _firmware)
- struct notifier_block;
+ #define MODULE_IMPORT_NS(ns) MODULE_INFO(import_ns, #ns)
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
-@@ -17,6 +17,16 @@
+@@ -20,10 +20,24 @@
/* Chosen so that structs with an unsigned long line up. */
#define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long))
+#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO(tag, name, info)
+#endif
+
- #ifdef MODULE
++#ifdef MODULE
#define __MODULE_INFO(tag, name, info) \
static const char __UNIQUE_ID(name)[] \
-@@ -24,8 +34,7 @@ static const char __UNIQUE_ID(name)[]
- = __stringify(tag) "=" info
- #else /* !MODULE */
- /* This struct is here for syntactic coherency, it is not used */
--#define __MODULE_INFO(tag, name, info) \
-- struct __UNIQUE_ID(name) {}
+ __used __attribute__((section(".modinfo"), unused, aligned(1))) \
+ = __MODULE_INFO_PREFIX __stringify(tag) "=" info
++#else
+#define __MODULE_INFO(tag, name, info) __MODULE_INFO_DISABLED(name)
- #endif
++#endif
+
#define __MODULE_PARM_TYPE(name, _type) \
__MODULE_INFO(parmtype, name##type, #name ":" _type)
-@@ -33,7 +42,7 @@ static const char __UNIQUE_ID(name)[]
+@@ -31,7 +45,7 @@ static const char __UNIQUE_ID(name)[]
/* One for each parameter, describing how to use it. Some files do
multiple of these per line, so can't just use MODULE_INFO. */
#define MODULE_PARM_DESC(_parm, desc) \
--- a/init/Kconfig
+++ b/init/Kconfig
-@@ -1997,6 +1997,13 @@ config TRIM_UNUSED_KSYMS
+@@ -2233,6 +2233,13 @@ config TRIM_UNUSED_KSYMS
If unsure, or if you need to build out-of-tree modules, say N.
config MODULES_TREE_LOOKUP
--- a/kernel/module.c
+++ b/kernel/module.c
-@@ -3029,9 +3029,11 @@ static int setup_load_info(struct load_i
+@@ -3107,9 +3107,11 @@ static int setup_load_info(struct load_i
static int check_modinfo(struct module *mod, struct load_info *info, int flags)
{
if (flags & MODULE_INIT_IGNORE_VERMAGIC)
modmagic = NULL;
-@@ -3052,6 +3054,7 @@ static int check_modinfo(struct module *
+@@ -3130,6 +3132,7 @@ static int check_modinfo(struct module *
mod->name);
add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
}
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
-@@ -1983,7 +1983,9 @@ static void read_symbols(const char *mod
+@@ -2051,7 +2051,9 @@ static void read_symbols(const char *mod
symname = remove_dot(info.strtab + sym->st_name);
handle_modversions(mod, &info, sym, symname);
handle_moddevtable(mod, &info, sym, symname);
+#endif
}
- if (!is_vmlinux(modname) || vmlinux_section_warnings)
- check_sec_ref(mod, modname, &info);
-@@ -2146,8 +2148,10 @@ static void add_header(struct buffer *b,
+
+ /* Apply symbol namespaces from __kstrtabns_<symbol> entries. */
+@@ -2265,8 +2267,10 @@ static void add_header(struct buffer *b,
buf_printf(b, "\n");
buf_printf(b, "BUILD_SALT;\n");
buf_printf(b, "\n");
+#endif
buf_printf(b, "\n");
buf_printf(b, "__visible struct module __this_module\n");
- buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
-@@ -2164,8 +2168,10 @@ static void add_header(struct buffer *b,
+ buf_printf(b, "__section(.gnu.linkonce.this_module) = {\n");
+@@ -2283,8 +2287,10 @@ static void add_header(struct buffer *b,
static void add_intree_flag(struct buffer *b, int is_intree)
{
}
/* Cannot check for assembler */
-@@ -2178,8 +2184,10 @@ static void add_retpoline(struct buffer
+@@ -2297,8 +2303,10 @@ static void add_retpoline(struct buffer
static void add_staging_flag(struct buffer *b, const char *name)
{
}
/**
-@@ -2278,11 +2286,13 @@ static void add_depends(struct buffer *b
+@@ -2382,11 +2390,13 @@ static void add_depends(struct buffer *b
static void add_srcversion(struct buffer *b, struct module *mod)
{
}
static void write_if_changed(struct buffer *b, const char *fname)
-@@ -2519,7 +2529,9 @@ int main(int argc, char **argv)
+@@ -2656,7 +2666,9 @@ int main(int argc, char **argv)
add_staging_flag(&buf, mod->name);
err |= add_versions(&buf, mod);
- add_depends(&buf, mod, modules);
+ add_depends(&buf, mod);
+#ifndef CONFIG_MODULE_STRIPPED
add_moddevtable(&buf, mod);
+#endif
+++ /dev/null
-From c9ef4ab0f54356ee9f91d9676ea0ec123840ddc7 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 7 Jul 2017 16:57:33 +0200
-Subject: kernel: do not build modules.order
-
-It is not needed for anything on the system and skipping this saves some
-build time, especially in cases where there is nothing to do.
-
-lede-commit: afc1675833a7bf5df094f59f7250369520646d04
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- Makefile | 2 --
- scripts/Makefile.build | 2 +-
- 2 files changed, 1 insertion(+), 3 deletions(-)
-
---- a/Makefile
-+++ b/Makefile
-@@ -1232,7 +1232,6 @@ all: modules
-
- PHONY += modules
- modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
-- $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
- @$(kecho) ' Building modules, stage 2.';
- $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
-
-@@ -1261,7 +1260,6 @@ _modinst_:
- rm -f $(MODLIB)/build ; \
- ln -s $(CURDIR) $(MODLIB)/build ; \
- fi
-- @cp -f $(objtree)/modules.order $(MODLIB)/
- @cp -f $(objtree)/modules.builtin $(MODLIB)/
- $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
-
---- a/scripts/Makefile.build
-+++ b/scripts/Makefile.build
-@@ -78,7 +78,7 @@ modorder-target := $(obj)/modules.order
- # We keep a list of all modules in $(MODVERDIR)
-
- __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
-- $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
-+ $(if $(KBUILD_MODULES),$(obj-m)) \
- $(subdir-ym) $(always)
- @:
-
--- a/include/uapi/linux/spi/spidev.h
+++ b/include/uapi/linux/spi/spidev.h
-@@ -113,7 +113,7 @@ struct spi_ioc_transfer {
+@@ -117,7 +117,7 @@ struct spi_ioc_transfer {
/* not all platforms use <asm-generic/ioctl.h> or _IOC_TYPECHECK() ... */
#define SPI_MSGSIZE(N) \
include/asm-generic/vmlinux.lds.h | 63 ++++++++++++++++++++-------------------
7 files changed, 55 insertions(+), 51 deletions(-)
---- a/Makefile
-+++ b/Makefile
-@@ -294,6 +294,11 @@ else
- scripts/Kbuild.include: ;
- include scripts/Kbuild.include
-
-+ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
-+KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections
-+LDFLAGS_vmlinux += --gc-sections
-+endif
-+
- # Read KERNELRELEASE from include/config/kernel.release (if it exists)
- KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
- KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
-@@ -782,11 +787,6 @@ ifdef CONFIG_DEBUG_SECTION_MISMATCH
- KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
- endif
-
--ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
--KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections
--LDFLAGS_vmlinux += --gc-sections
--endif
--
- # arch Makefile may override CC so keep this after arch Makefile is included
- NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
-
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
-@@ -98,6 +98,7 @@ config ARM
+@@ -111,6 +111,7 @@ config ARM
select HAVE_UID16
select HAVE_VIRT_CPU_ACCOUNTING_GEN
select IRQ_FORCED_THREADING
+ select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
select MODULES_USE_ELF_REL
select NEED_DMA_MAP_STATE
- select NO_BOOTMEM
+ select OF_EARLY_FLATTREE if OF
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
-@@ -106,6 +106,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
+@@ -107,6 +107,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
ORIG_CFLAGS := $(KBUILD_CFLAGS)
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
endif
} \
. = __stubs_start + SIZEOF(.stubs); \
__stubs_end = .; \
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -43,6 +43,7 @@ config MIPS
- select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES && 64BIT
- select HAVE_CBPF_JIT if (!64BIT && !CPU_MICROMIPS)
- select HAVE_EBPF_JIT if (64BIT && !CPU_MICROMIPS)
-+ select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
- select HAVE_CONTEXT_TRACKING
- select HAVE_COPY_THREAD_TLS
- select HAVE_C_RECORDMCOUNT
---- a/arch/mips/kernel/vmlinux.lds.S
-+++ b/arch/mips/kernel/vmlinux.lds.S
-@@ -72,7 +72,7 @@ SECTIONS
- /* Exception table for data bus errors */
- __dbe_table : {
- __start___dbe_table = .;
-- *(__dbe_table)
-+ KEEP(*(__dbe_table))
- __stop___dbe_table = .;
- }
-
-@@ -123,7 +123,7 @@ SECTIONS
- . = ALIGN(4);
- .mips.machines.init : AT(ADDR(.mips.machines.init) - LOAD_OFFSET) {
- __mips_machines_start = .;
-- *(.mips.machines.init)
-+ KEEP(*(.mips.machines.init))
- __mips_machines_end = .;
- }
-
/* Align . to a 8 byte boundary equals to maximum function alignment. */
#define ALIGN_FUNCTION() . = ALIGN(8)
-@@ -372,14 +382,14 @@
+@@ -405,14 +415,14 @@
/* Kernel symbol table: Normal symbols */ \
__ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
__start___ksymtab = .; \
__stop___ksymtab_gpl = .; \
} \
\
-@@ -441,7 +451,7 @@
+@@ -474,7 +484,7 @@
\
/* Kernel symbol table: strings */ \
__ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
} \
\
/* __*init sections */ \
-@@ -841,6 +851,8 @@
+@@ -865,6 +875,8 @@
EXIT_TEXT \
EXIT_DATA \
EXIT_CALL \
+ SYMTAB_DISCARD_GPL \
*(.discard) \
*(.discard.*) \
- }
+ *(.modinfo) \
--- a/include/linux/export.h
+++ b/include/linux/export.h
-@@ -74,12 +74,19 @@ struct kernel_symbol {
- };
- #endif
+@@ -98,18 +98,26 @@ struct kernel_symbol {
+
+ #else
+#ifdef MODULE
+#define __EXPORT_SUFFIX(sym)
+#define __EXPORT_SUFFIX(sym) "+" #sym
+#endif
+
- /* For every exported symbol, place a struct in the __ksymtab section */
- #define ___EXPORT_SYMBOL(sym, sec) \
+ #define ___export_symbol_common(sym, sec) \
extern typeof(sym) sym; \
- __CRC_SYMBOL(sym, sec) \
+ __CRC_SYMBOL(sym, sec); \
static const char __kstrtab_##sym[] \
- __attribute__((section("__ksymtab_strings"), used, aligned(1))) \
+ __attribute__((section("__ksymtab_strings" \
+ __EXPORT_SUFFIX(sym)), used, aligned(1))) \
- = #sym; \
- __KSYMTAB_ENTRY(sym, sec)
+ = #sym \
+
+ /* For every exported symbol, place a struct in the __ksymtab section */
+ #define ___EXPORT_SYMBOL_NS(sym, sec, ns) \
+ ___export_symbol_common(sym, sec); \
+ static const char __kstrtabns_##sym[] \
+- __attribute__((section("__ksymtab_strings"), used, aligned(1))) \
++ __attribute__((section("__ksymtab_strings" \
++ __EXPORT_SUFFIX(sym)), used, aligned(1))) \
+ = #ns; \
+ __KSYMTAB_ENTRY_NS(sym, sec)
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
-@@ -408,7 +408,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $(
+@@ -362,7 +362,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $(
# Linker scripts preprocessor (.lds.S -> .lds)
# ---------------------------------------------------------------------------
quiet_cmd_cpp_lds_S = LDS $@
{ {0x02, 0x21}, "lz4", unlz4 },
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
-@@ -325,7 +325,7 @@ cmd_bzip2 = (cat $(filter-out FORCE,$^)
+@@ -342,7 +342,7 @@ quiet_cmd_bzip2 = BZIP2 $@
+ # ---------------------------------------------------------------------------
quiet_cmd_lzma = LZMA $@
- cmd_lzma = (cat $(filter-out FORCE,$^) | \
-- lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
-+ lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
- (rm -f $@ ; false)
+- cmd_lzma = { cat $(real-prereqs) | lzma -9; $(size_append); } > $@
++ cmd_lzma = { cat $(real-prereqs) | lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so; $(size_append); } > $@
quiet_cmd_lzo = LZO $@
+ cmd_lzo = { cat $(real-prereqs) | lzop -9; $(size_append); } > $@
--- a/usr/gen_initramfs_list.sh
+++ b/usr/gen_initramfs_list.sh
@@ -229,7 +229,7 @@ cpio_list=
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
-@@ -241,7 +241,6 @@ config NF_CONNTRACK_FTP
+@@ -240,7 +240,6 @@ config NF_CONNTRACK_FTP
config NF_CONNTRACK_H323
tristate "H.323 protocol support"
depends on NETFILTER_ADVANCED
help
H.323 is a VoIP signalling protocol from ITU-T. As one of the most
-@@ -1077,7 +1076,6 @@ config NETFILTER_XT_TARGET_SECMARK
+@@ -1100,7 +1099,6 @@ config NETFILTER_XT_TARGET_SECMARK
config NETFILTER_XT_TARGET_TCPMSS
tristate '"TCPMSS" target support'
select CRYPTO_BLKCIPHER2
select CRYPTO_ALGAPI
-@@ -64,7 +64,7 @@ config CRYPTO_BLKCIPHER2
- select CRYPTO_WORKQUEUE
+@@ -63,7 +63,7 @@ config CRYPTO_BLKCIPHER2
+ select CRYPTO_RNG2
config CRYPTO_HASH
- tristate
select CRYPTO_HASH2
select CRYPTO_ALGAPI
-@@ -73,7 +73,7 @@ config CRYPTO_HASH2
+@@ -72,7 +72,7 @@ config CRYPTO_HASH2
select CRYPTO_ALGAPI2
config CRYPTO_RNG
bool
--- a/drivers/ssb/Kconfig
+++ b/drivers/ssb/Kconfig
-@@ -28,6 +28,7 @@ config SSB_SPROM
+@@ -29,6 +29,7 @@ config SSB_SPROM
config SSB_BLOCKIO
bool
depends on SSB
config SSB_PCIHOST_POSSIBLE
bool
-@@ -48,7 +49,7 @@ config SSB_PCIHOST
+@@ -49,7 +50,7 @@ config SSB_PCIHOST
config SSB_B43_PCI_BRIDGE
bool
depends on SSB_PCIHOST
bool
--- a/lib/Kconfig
+++ b/lib/Kconfig
-@@ -377,16 +377,16 @@ config BCH_CONST_T
+@@ -402,16 +402,16 @@ config BCH_CONST_T
# Textsearch support is select'ed if needed
#
config TEXTSEARCH
bool
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
-@@ -10,7 +10,7 @@ config NETFILTER_INGRESS
+@@ -11,7 +11,7 @@ config NETFILTER_INGRESS
infrastructure.
config NETFILTER_NETLINK
bool
--- a/net/wireless/Kconfig
+++ b/net/wireless/Kconfig
-@@ -1,5 +1,5 @@
+@@ -1,6 +1,6 @@
+ # SPDX-License-Identifier: GPL-2.0-only
config WIRELESS_EXT
- bool
+ bool "Wireless extensions"
config WEXT_CORE
def_bool y
-@@ -11,10 +11,10 @@ config WEXT_PROC
+@@ -12,10 +12,10 @@ config WEXT_PROC
depends on WEXT_CORE
config WEXT_SPY
config CFG80211
tristate "cfg80211 - wireless configuration API"
-@@ -202,7 +202,7 @@ config CFG80211_WEXT_EXPORT
+@@ -203,7 +203,7 @@ config CFG80211_WEXT_EXPORT
endif # CFG80211
config LIB80211
default n
help
This options enables a library of common routines used
-@@ -211,13 +211,16 @@ config LIB80211
+@@ -212,16 +212,16 @@ config LIB80211
Drivers should select this themselves if needed.
config LIB80211_CRYPT_WEP
- tristate
+ tristate "LIB80211_CRYPT_WEP"
-+ select LIB80211
+ select CRYPTO_LIB_ARC4
config LIB80211_CRYPT_CCMP
- tristate
+ tristate "LIB80211_CRYPT_CCMP"
-+ select LIB80211
+ select CRYPTO_AES
+ select CRYPTO_CCM
config LIB80211_CRYPT_TKIP
- tristate
+ tristate "LIB80211_CRYPT_TKIP"
-+ select LIB80211
+ select CRYPTO_LIB_ARC4
config LIB80211_DEBUG
- bool "lib80211 debugging messages"
--- a/sound/core/Kconfig
+++ b/sound/core/Kconfig
-@@ -16,7 +16,7 @@ config SND_DMAENGINE_PCM
+@@ -17,7 +17,7 @@ config SND_DMAENGINE_PCM
tristate
config SND_HWDEP
config SND_SEQ_DEVICE
tristate
-@@ -26,7 +26,7 @@ config SND_RAWMIDI
+@@ -27,7 +27,7 @@ config SND_RAWMIDI
select SND_SEQ_DEVICE if SND_SEQUENCER != n
config SND_COMPRESS_OFFLOAD
# subsystems should select the appropriate symbols.
config REGMAP
-- default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ)
+- default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SCCB || REGMAP_I3C)
select IRQ_DOMAIN if REGMAP_IRQ
- bool
+ tristate
config REGCACHE_COMPRESSED
select LZO_COMPRESS
-@@ -18,6 +17,7 @@ config REGMAP_AC97
+@@ -18,38 +17,49 @@ config REGMAP_AC97
config REGMAP_I2C
tristate
depends on I2C
config REGMAP_SLIMBUS
-@@ -26,20 +26,26 @@ config REGMAP_SLIMBUS
+ tristate
++ select REGMAP
+ depends on SLIMBUS
config REGMAP_SPI
tristate
depends on SPI
config REGMAP_SPMI
-+ select REGMAP
tristate
++ select REGMAP
depends on SPMI
config REGMAP_W1
-+ select REGMAP
tristate
++ select REGMAP
depends on W1
config REGMAP_MMIO
+ select REGMAP
config REGMAP_IRQ
-+ select REGMAP
bool
++ select REGMAP
config REGMAP_SOUNDWIRE
+ tristate
++ select REGMAP
+ depends on SOUNDWIRE
+
+ config REGMAP_SCCB
+ tristate
++ select REGMAP
+ depends on I2C
+
+ config REGMAP_I3C
+ tristate
++ select REGMAP
+ depends on I3C
--- a/drivers/base/regmap/Makefile
+++ b/drivers/base/regmap/Makefile
@@ -2,10 +2,14 @@
obj-$(CONFIG_REGMAP_SLIMBUS) += regmap-slimbus.o
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
-@@ -13,6 +13,7 @@
+@@ -9,6 +9,7 @@
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/export.h>
#include <linux/mutex.h>
#include <linux/err.h>
#include <linux/of.h>
-@@ -3039,3 +3040,5 @@ static int __init regmap_initcall(void)
+@@ -3124,3 +3125,5 @@ static int __init regmap_initcall(void)
return 0;
}
postcore_initcall(regmap_initcall);
+MODULE_LICENSE("GPL");
--- a/include/linux/regmap.h
+++ b/include/linux/regmap.h
-@@ -187,7 +187,7 @@ struct reg_sequence {
+@@ -185,7 +185,7 @@ struct reg_sequence {
pollret ?: ((cond) ? 0 : -ETIMEDOUT); \
})
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
-@@ -144,13 +144,13 @@ config CRYPTO_MANAGER
+@@ -120,13 +120,13 @@ config CRYPTO_MANAGER
cbc(aes).
config CRYPTO_MANAGER2
config CRYPTO_USER
tristate "Userspace cryptographic algorithm configuration"
-@@ -163,7 +163,6 @@ config CRYPTO_USER
+@@ -136,8 +136,6 @@ config CRYPTO_USER
+ Userspace configuration for cryptographic instantiations such as
+ cbc(aes).
+
+-if CRYPTO_MANAGER2
+-
config CRYPTO_MANAGER_DISABLE_TESTS
bool "Disable run-time self tests"
default y
-- depends on CRYPTO_MANAGER2
- help
+@@ -145,6 +143,8 @@ config CRYPTO_MANAGER_DISABLE_TESTS
Disable run-time self tests that normally take place at
algorithm registration.
+
++if CRYPTO_MANAGER2
++
+ config CRYPTO_MANAGER_EXTRA_TESTS
+ bool "Enable extra run-time crypto self tests"
+ depends on DEBUG_KERNEL && !CRYPTO_MANAGER_DISABLE_TESTS
--- a/crypto/algboss.c
+++ b/crypto/algboss.c
-@@ -247,8 +247,12 @@ static int cryptomgr_schedule_test(struc
+@@ -242,8 +242,12 @@ static int cryptomgr_schedule_test(struc
type = alg->cra_flags;
/* Do not test internal algorithms. */
--- /dev/null
+This makes it possible to select CONFIG_CRYPTO_LIB_ARC4 directly. We
+need this to be able to compile this into the kernel and make use of it
+from backports.
+
+--- a/crypto/Kconfig
++++ b/crypto/Kconfig
+@@ -1151,7 +1151,7 @@ config CRYPTO_ANUBIS
+ <http://www.larc.usp.br/~pbarreto/AnubisPage.html>
+
+ config CRYPTO_LIB_ARC4
+- tristate
++ tristate "ARC4 cipher library"
+
+ config CRYPTO_ARC4
+ tristate "ARC4 cipher algorithm"
ifneq ($(CONFIG_DCB),)
--- a/net/rfkill/Kconfig
+++ b/net/rfkill/Kconfig
-@@ -1,7 +1,11 @@
+@@ -2,7 +2,11 @@
#
# RF switch subsystem configuration
#
tristate "RF switch subsystem support"
help
Say Y here if you want to have control over RF switches
-@@ -13,19 +17,19 @@ menuconfig RFKILL
+@@ -14,19 +18,19 @@ menuconfig RFKILL
# LED trigger support
config RFKILL_LEDS
bool
help
--- a/net/rfkill/Makefile
+++ b/net/rfkill/Makefile
-@@ -4,5 +4,5 @@
+@@ -5,5 +5,5 @@
rfkill-y += core.o
rfkill-$(CONFIG_RFKILL_INPUT) += input.o
--- a/drivers/nvmem/Kconfig
+++ b/drivers/nvmem/Kconfig
-@@ -1,5 +1,5 @@
+@@ -1,6 +1,6 @@
+ # SPDX-License-Identifier: GPL-2.0-only
menuconfig NVMEM
- bool "NVMEM Support"
+ tristate "NVMEM Support"
--- a/drivers/of/Kconfig
+++ b/drivers/of/Kconfig
-@@ -71,6 +71,7 @@ config OF_IRQ
+@@ -72,6 +72,7 @@ config OF_IRQ
config OF_NET
depends on NETDEVICES
---
--- a/arch/mips/include/asm/r4kcache.h
+++ b/arch/mips/include/asm/r4kcache.h
-@@ -683,16 +683,48 @@ static inline void prot##extra##blast_##
+@@ -617,14 +617,46 @@ static inline void prot##extra##blast_##
unsigned long end) \
{ \
unsigned long lsize = cpu_##desc##_line_size(); \
+ unsigned long aend = (end + lsize - 1) & ~(lsize - 1); \
+ int lines = (aend - addr) / lsize; \
\
- __##pfx##flush_prologue \
- \
- while (1) { \
+ while (lines >= 8) { \
+ prot##cache_op(hitop, addr); \
- break; \
- addr += lsize; \
} \
- \
- __##pfx##flush_epilogue \
+ }
+
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
-@@ -1144,6 +1144,10 @@ config SYNC_R4K
+@@ -1156,6 +1156,10 @@ config SYNC_R4K
config MIPS_MACHINE
def_bool n
+++ b/arch/mips/kernel/head.S
@@ -79,6 +79,12 @@ FEXPORT(__kernel_entry)
j kernel_entry
- #endif
+ #endif /* CONFIG_BOOT_RAW */
+#ifdef CONFIG_IMAGE_CMDLINE_HACK
+ .ascii "CMDLINE:"
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
-@@ -60,20 +60,6 @@ machine-$(CONFIG_PPC64) += 64
+@@ -61,20 +61,6 @@ machine-$(CONFIG_PPC64) += 64
machine-$(CONFIG_CPU_LITTLE_ENDIAN) += le
UTS_MACHINE := $(subst $(space),,$(machine-y))
-ifdef CONFIG_PPC32
-KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
-else
--KBUILD_LDFLAGS_MODULE += -T $(srctree)/arch/powerpc/kernel/module.lds
+-KBUILD_LDS_MODULE += $(srctree)/arch/powerpc/kernel/module.lds
-ifeq ($(call ld-ifversion, -ge, 225000000, y),y)
-# Have the linker provide sfpr if possible.
-# There is a corresponding test in arch/powerpc/lib/Makefile
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
-@@ -460,7 +460,7 @@ static void lo_complete_rq(struct reques
+@@ -461,7 +461,7 @@ static void lo_complete_rq(struct reques
if (!cmd->use_aio || cmd->ret < 0 || cmd->ret == blk_rq_bytes(rq) ||
req_op(rq) != REQ_OP_READ) {
if (cmd->ret < 0)
goto end_io;
}
-@@ -1904,7 +1904,10 @@ static void loop_handle_cmd(struct loop_
+@@ -1950,7 +1950,10 @@ static void loop_handle_cmd(struct loop_
failed:
/* complete non-aio request */
if (!cmd->use_aio || ret) {
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
-@@ -426,11 +426,12 @@ static int lo_fallocate(struct loop_devi
+@@ -427,11 +427,12 @@ static int lo_fallocate(struct loop_devi
* information.
*/
struct file *file = lo->lo_backing_file;
ret = -EOPNOTSUPP;
goto out;
}
-@@ -863,6 +864,21 @@ static void loop_config_discard(struct l
+@@ -862,6 +863,21 @@ static void loop_config_discard(struct l
struct file *file = lo->lo_backing_file;
struct inode *inode = file->f_mapping->host;
struct request_queue *q = lo->lo_queue;
/*
* We use punch hole to reclaim the free space used by the
-@@ -870,22 +886,24 @@ static void loop_config_discard(struct l
+@@ -869,22 +885,24 @@ static void loop_config_discard(struct l
* encryption is enabled, because it may give an attacker
* useful information.
*/
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
-@@ -108,10 +108,14 @@ int br_handle_frame_finish(struct net *n
+@@ -103,10 +103,14 @@ int br_handle_frame_finish(struct net *n
}
}
if (IS_ENABLED(CONFIG_INET) &&
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
-@@ -337,6 +337,8 @@ struct net_bridge {
+@@ -345,6 +345,8 @@ struct net_bridge {
u16 group_fwd_mask;
u16 group_fwd_mask_required;
bridge_id bridge_id;
--- a/net/bridge/br_sysfs_br.c
+++ b/net/bridge/br_sysfs_br.c
-@@ -170,6 +170,30 @@ static ssize_t group_fwd_mask_store(stru
+@@ -166,6 +166,30 @@ static ssize_t group_fwd_mask_store(stru
}
static DEVICE_ATTR_RW(group_fwd_mask);
static ssize_t priority_show(struct device *d, struct device_attribute *attr,
char *buf)
{
-@@ -810,6 +834,7 @@ static struct attribute *bridge_attrs[]
+@@ -851,6 +875,7 @@ static struct attribute *bridge_attrs[]
&dev_attr_ageing_time.attr,
&dev_attr_stp_state.attr,
&dev_attr_group_fwd_mask.attr,
__u8 invert;
--- a/net/netfilter/xt_connmark.c
+++ b/net/netfilter/xt_connmark.c
-@@ -36,12 +36,13 @@ MODULE_ALIAS("ipt_connmark");
+@@ -24,12 +24,13 @@ MODULE_ALIAS("ipt_connmark");
MODULE_ALIAS("ip6t_connmark");
static unsigned int
ct = nf_ct_get(skb, &ctinfo);
if (ct == NULL)
-@@ -49,12 +50,24 @@ connmark_tg_shift(struct sk_buff *skb, c
+@@ -37,12 +38,24 @@ connmark_tg_shift(struct sk_buff *skb, c
switch (info->mode) {
case XT_CONNMARK_SET:
if (ct->mark != newmark) {
ct->mark = newmark;
nf_conntrack_event_cache(IPCT_MARK, ct);
-@@ -93,20 +106,36 @@ static unsigned int
+@@ -81,20 +94,36 @@ static unsigned int
connmark_tg(struct sk_buff *skb, const struct xt_action_param *par)
{
const struct xt_connmark_tginfo1 *info = par->targinfo;
return connmark_tg_shift(skb, info);
}
-@@ -177,6 +206,16 @@ static struct xt_target connmark_tg_reg[
+@@ -165,6 +194,16 @@ static struct xt_target connmark_tg_reg[
.targetsize = sizeof(struct xt_connmark_tginfo2),
.destroy = connmark_tg_destroy,
.me = THIS_MODULE,
--- a/include/net/netfilter/nf_flow_table.h
+++ b/include/net/netfilter/nf_flow_table.h
-@@ -163,6 +163,8 @@ struct nf_flow_table_hw {
+@@ -158,6 +158,8 @@ struct nf_flow_table_hw {
int nf_flow_table_hw_register(const struct nf_flow_table_hw *offload);
void nf_flow_table_hw_unregister(const struct nf_flow_table_hw *offload);
#define MODULE_ALIAS_NF_FLOWTABLE(family) \
--- a/net/netfilter/nf_flow_table_core.c
+++ b/net/netfilter/nf_flow_table_core.c
-@@ -11,6 +11,7 @@
- #include <net/netfilter/nf_conntrack.h>
+@@ -13,6 +13,7 @@
#include <net/netfilter/nf_conntrack_core.h>
+ #include <net/netfilter/nf_conntrack_l4proto.h>
#include <net/netfilter/nf_conntrack_tuple.h>
+#include <net/netfilter/nf_conntrack_acct.h>
struct flow_offload_entry {
struct flow_offload flow;
-@@ -149,6 +150,22 @@ void flow_offload_free(struct flow_offlo
+@@ -164,6 +165,22 @@ void flow_offload_free(struct flow_offlo
}
EXPORT_SYMBOL_GPL(flow_offload_free);
const struct flow_offload_tuple *tuple = data;
--- a/net/netfilter/nf_flow_table_ip.c
+++ b/net/netfilter/nf_flow_table_ip.c
-@@ -11,6 +11,7 @@
+@@ -12,6 +12,7 @@
#include <net/ip6_route.h>
#include <net/neighbour.h>
#include <net/netfilter/nf_flow_table.h>
/* For layer 4 checksum field offset. */
#include <linux/tcp.h>
#include <linux/udp.h>
-@@ -267,6 +268,7 @@ nf_flow_offload_ip_hook(void *priv, stru
+@@ -295,6 +296,7 @@ nf_flow_offload_ip_hook(void *priv, stru
skb->dev = outdev;
nexthop = rt_nexthop(rt, flow->tuplehash[!dir].tuple.src_v4.s_addr);
skb_dst_set_noref(skb, &rt->dst);
neigh_xmit(NEIGH_ARP_TABLE, outdev, &nexthop, skb);
return NF_STOLEN;
-@@ -487,6 +489,7 @@ nf_flow_offload_ipv6_hook(void *priv, st
+@@ -524,6 +526,7 @@ nf_flow_offload_ipv6_hook(void *priv, st
skb->dev = outdev;
nexthop = rt6_nexthop(rt, &flow->tuplehash[!dir].tuple.src_v6);
skb_dst_set_noref(skb, &rt->dst);
--- a/net/ipv4/netfilter/Kconfig
+++ b/net/ipv4/netfilter/Kconfig
-@@ -63,8 +63,6 @@ config NF_TABLES_ARP
+@@ -56,8 +56,6 @@ config NF_TABLES_ARP
help
This option enables the ARP support for nf_tables.
config NF_FLOW_TABLE_IPV4
tristate "Netfilter flow table IPv4 module"
depends on NF_FLOW_TABLE
-@@ -73,6 +71,8 @@ config NF_FLOW_TABLE_IPV4
+@@ -66,6 +64,8 @@ config NF_FLOW_TABLE_IPV4
To compile it as a module, choose M here.
depends on !NF_CONNTRACK || NF_CONNTRACK
--- a/net/ipv6/netfilter/Kconfig
+++ b/net/ipv6/netfilter/Kconfig
-@@ -80,7 +80,6 @@ config NFT_FIB_IPV6
+@@ -45,7 +45,6 @@ config NFT_FIB_IPV6
multicast or blackhole.
endif # NF_TABLES_IPV6
config NF_FLOW_TABLE_IPV6
tristate "Netfilter flow table IPv6 module"
-@@ -90,6 +89,8 @@ config NF_FLOW_TABLE_IPV6
+@@ -55,6 +54,8 @@ config NF_FLOW_TABLE_IPV6
To compile it as a module, choose M here.
depends on !NF_CONNTRACK || NF_CONNTRACK
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
-@@ -693,8 +693,6 @@ config NFT_FIB_NETDEV
+@@ -702,8 +702,6 @@ config NFT_FIB_NETDEV
endif # NF_TABLES_NETDEV
config NF_FLOW_TABLE_INET
tristate "Netfilter flow table mixed IPv4/IPv6 module"
depends on NF_FLOW_TABLE
-@@ -703,11 +701,12 @@ config NF_FLOW_TABLE_INET
+@@ -712,11 +710,12 @@ config NF_FLOW_TABLE_INET
To compile it as a module, choose M here.
help
This option adds the flow table core infrastructure.
-@@ -996,6 +995,15 @@ config NETFILTER_XT_TARGET_NOTRACK
+@@ -1005,6 +1004,15 @@ config NETFILTER_XT_TARGET_NOTRACK
depends on NETFILTER_ADVANCED
select NETFILTER_XT_TARGET_CT
obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o
--- /dev/null
+++ b/net/netfilter/xt_FLOWOFFLOAD.c
-@@ -0,0 +1,422 @@
+@@ -0,0 +1,427 @@
+/*
+ * Copyright (C) 2018 Felix Fietkau <nbd@nbd.name>
+ *
+ return NF_ACCEPT;
+}
+
++int nf_flow_table_iterate(struct nf_flowtable *flow_table,
++ void (*iter)(struct flow_offload *flow, void *data),
++ void *data);
++
+static int
+xt_flowoffload_create_hook(struct net_device *dev)
+{
+ struct flow_offload_tuple *tuple = &flow->tuplehash[0].tuple;
+ struct xt_flowoffload_hook *hook;
+ bool *found = data;
++ struct rtable *rt = (struct rtable *)tuple->dst_cache;
+
+ spin_lock_bh(&hooks_lock);
+ hlist_for_each_entry(hook, &hooks, list) {
+ if (hook->ops.dev->ifindex != tuple->iifidx &&
-+ hook->ops.dev->ifindex != tuple->oifidx)
++ hook->ops.dev->ifindex != rt->dst.dev->ifindex)
+ continue;
+
+ hook->used = true;
+ kfree(hook);
+ }
+
-+ nf_flow_table_cleanup(dev_net(dev), dev);
++ nf_flow_table_cleanup(dev);
+
+ return NOTIFY_DONE;
+}
+module_exit(xt_flowoffload_tg_exit);
--- a/net/netfilter/nf_flow_table_core.c
+++ b/net/netfilter/nf_flow_table_core.c
-@@ -6,7 +6,6 @@
+@@ -7,7 +7,6 @@
#include <linux/netdevice.h>
#include <net/ip.h>
#include <net/ip6_route.h>
#include <net/netfilter/nf_flow_table.h>
#include <net/netfilter/nf_conntrack.h>
#include <net/netfilter/nf_conntrack_core.h>
+@@ -338,8 +337,7 @@ flow_offload_lookup(struct nf_flowtable
+ }
+ EXPORT_SYMBOL_GPL(flow_offload_lookup);
+
+-static int
+-nf_flow_table_iterate(struct nf_flowtable *flow_table,
++int nf_flow_table_iterate(struct nf_flowtable *flow_table,
+ void (*iter)(struct flow_offload *flow, void *data),
+ void *data)
+ {
+@@ -372,6 +370,7 @@ nf_flow_table_iterate(struct nf_flowtabl
+
+ return err;
+ }
++EXPORT_SYMBOL_GPL(nf_flow_table_iterate);
+
+ static void nf_flow_offload_gc_step(struct flow_offload *flow, void *data)
+ {
--- /dev/null
+++ b/include/uapi/linux/netfilter/xt_FLOWOFFLOAD.h
@@ -0,0 +1,17 @@
+};
+
+#endif /* _XT_FLOWOFFLOAD_H */
+--- a/include/net/netfilter/nf_flow_table.h
++++ b/include/net/netfilter/nf_flow_table.h
+@@ -128,6 +128,10 @@ static inline void flow_offload_dead(str
+ flow->flags |= FLOW_OFFLOAD_DYING;
+ }
+
++int nf_flow_table_iterate(struct nf_flowtable *flow_table,
++ void (*iter)(struct flow_offload *flow, void *data),
++ void *data);
++
+ int nf_flow_snat_port(const struct flow_offload *flow,
+ struct sk_buff *skb, unsigned int thoff,
+ u8 protocol, enum flow_offload_tuple_dir dir);
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
-@@ -140,8 +140,8 @@ static inline bool dev_xmit_complete(int
+@@ -136,8 +136,8 @@ static inline bool dev_xmit_complete(int
#if defined(CONFIG_HYPERV_NET)
# define LL_MAX_HEADER 128
--- a/net/sched/sch_fq_codel.c
+++ b/net/sched/sch_fq_codel.c
-@@ -474,7 +474,11 @@ static int fq_codel_init(struct Qdisc *s
+@@ -462,7 +462,11 @@ static int fq_codel_init(struct Qdisc *s
sch->limit = 10*1024;
q->flows_cnt = 1024;
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
-@@ -487,12 +487,13 @@ extern struct Qdisc_ops noop_qdisc_ops;
+@@ -569,12 +569,13 @@ extern struct Qdisc_ops noop_qdisc_ops;
extern struct Qdisc_ops pfifo_fast_ops;
extern struct Qdisc_ops mq_qdisc_ops;
extern struct Qdisc_ops noqueue_qdisc_ops;
struct Qdisc_class_common {
--- a/net/sched/Kconfig
+++ b/net/sched/Kconfig
-@@ -3,8 +3,9 @@
+@@ -4,8 +4,9 @@
#
menuconfig NET_SCHED
device, it has to decide which ones to send first, which ones to
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
-@@ -2162,7 +2162,7 @@ static int __init pktsched_init(void)
+@@ -2271,7 +2271,7 @@ static int __init pktsched_init(void)
return err;
}
register_qdisc(&pfifo_head_drop_qdisc_ops);
--- a/net/sched/sch_fq_codel.c
+++ b/net/sched/sch_fq_codel.c
-@@ -714,7 +714,7 @@ static const struct Qdisc_class_ops fq_c
+@@ -702,7 +702,7 @@ static const struct Qdisc_class_ops fq_c
.walk = fq_codel_walk,
};
.cl_ops = &fq_codel_class_ops,
.id = "fq_codel",
.priv_size = sizeof(struct fq_codel_sched_data),
-@@ -729,6 +729,7 @@ static struct Qdisc_ops fq_codel_qdisc_o
+@@ -717,6 +717,7 @@ static struct Qdisc_ops fq_codel_qdisc_o
.dump_stats = fq_codel_dump_stats,
.owner = THIS_MODULE,
};
{
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
-@@ -35,7 +35,7 @@
+@@ -32,7 +32,7 @@
#include <net/xfrm.h>
/* Qdisc to use by default */
EXPORT_SYMBOL(default_qdisc_ops);
/* Main transmission queue. */
-@@ -1025,7 +1025,7 @@ static void attach_one_default_qdisc(str
+@@ -1034,12 +1034,12 @@ static void attach_one_default_qdisc(str
void *_unused)
{
struct Qdisc *qdisc;
if (dev->priv_flags & IFF_NO_QUEUE)
ops = &noqueue_qdisc_ops;
+ else if(dev->type == ARPHRD_CAN)
+- ops = &pfifo_fast_ops;
++ ops = &fq_codel_qdisc_ops;
+
+ qdisc = qdisc_create_dflt(dev_queue, ops, TC_H_ROOT, NULL);
+ if (!qdisc) {
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
-@@ -612,207 +612,6 @@ struct Qdisc_ops noqueue_qdisc_ops __rea
+@@ -594,211 +594,6 @@ struct Qdisc_ops noqueue_qdisc_ops __rea
.owner = THIS_MODULE,
};
-
- err = skb_array_produce(q, skb);
-
-- if (unlikely(err))
-- return qdisc_drop_cpu(skb, qdisc, to_free);
+- if (unlikely(err)) {
+- if (qdisc_is_percpu_stats(qdisc))
+- return qdisc_drop_cpu(skb, qdisc, to_free);
+- else
+- return qdisc_drop(skb, qdisc, to_free);
+- }
-
-- qdisc_qstats_atomic_qlen_inc(qdisc);
-- /* Note: skb can not be used after skb_array_produce(),
-- * so we better not use qdisc_qstats_cpu_backlog_inc()
-- */
-- this_cpu_add(qdisc->cpu_qstats->backlog, pkt_len);
+- qdisc_update_stats_at_enqueue(qdisc, pkt_len);
- return NET_XMIT_SUCCESS;
-}
-
- skb = __skb_array_consume(q);
- }
- if (likely(skb)) {
-- qdisc_qstats_cpu_backlog_dec(qdisc, skb);
-- qdisc_bstats_cpu_update(qdisc, skb);
-- qdisc_qstats_atomic_qlen_dec(qdisc);
+- qdisc_update_stats_at_dequeue(qdisc, skb);
+- } else {
+- WRITE_ONCE(qdisc->empty, true);
- }
-
- return skb;
- kfree_skb(skb);
- }
-
-- for_each_possible_cpu(i) {
-- struct gnet_stats_queue *q = per_cpu_ptr(qdisc->cpu_qstats, i);
+- if (qdisc_is_percpu_stats(qdisc)) {
+- for_each_possible_cpu(i) {
+- struct gnet_stats_queue *q;
-
-- q->backlog = 0;
+- q = per_cpu_ptr(qdisc->cpu_qstats, i);
+- q->backlog = 0;
+- q->qlen = 0;
+- }
- }
-}
-
-};
-EXPORT_SYMBOL(pfifo_fast_ops);
-
- static struct lock_class_key qdisc_tx_busylock;
- static struct lock_class_key qdisc_running_key;
-
+ struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
+ const struct Qdisc_ops *ops,
+ struct netlink_ext_ack *extack)
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
-@@ -209,6 +209,89 @@ config LED_TRIGGER_PHY
+@@ -249,6 +249,89 @@ config LED_TRIGGER_PHY
for any speed known to the PHY.
+obj-$(CONFIG_RTL8367_PHY) += rtl8367.o
+obj-$(CONFIG_RTL8367B_PHY) += rtl8367b.o
+
+ obj-$(CONFIG_MDIO_ASPEED) += mdio-aspeed.o
obj-$(CONFIG_MDIO_BCM_IPROC) += mdio-bcm-iproc.o
obj-$(CONFIG_MDIO_BCM_UNIMAC) += mdio-bcm-unimac.o
- obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
--- a/include/linux/platform_data/b53.h
+++ b/include/linux/platform_data/b53.h
@@ -29,6 +29,9 @@ struct b53_platform_data {
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
-@@ -555,6 +555,12 @@ struct phy_driver {
+@@ -522,6 +522,12 @@ struct phy_driver {
/* Determines the negotiated speed and duplex */
int (*read_status)(struct phy_device *phydev);
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
-@@ -1577,6 +1577,9 @@ int genphy_update_link(struct phy_device
- {
- int status;
+@@ -1822,6 +1822,9 @@ int genphy_update_link(struct phy_device
+ if (bmcr & BMCR_ANRESTART)
+ goto done;
+ if (phydev->drv && phydev->drv->update_link)
+ return phydev->drv->update_link(phydev);
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
-@@ -1514,6 +1514,7 @@ enum netdev_priv_flags {
+@@ -1544,6 +1544,7 @@ enum netdev_priv_flags {
IFF_FAILOVER_SLAVE = 1<<28,
IFF_L3MDEV_RX_HANDLER = 1<<29,
IFF_LIVE_RENAME_OK = 1<<30,
};
#define IFF_802_1Q_VLAN IFF_802_1Q_VLAN
-@@ -1546,6 +1547,7 @@ enum netdev_priv_flags {
+@@ -1576,6 +1577,7 @@ enum netdev_priv_flags {
#define IFF_FAILOVER_SLAVE IFF_FAILOVER_SLAVE
#define IFF_L3MDEV_RX_HANDLER IFF_L3MDEV_RX_HANDLER
#define IFF_LIVE_RENAME_OK IFF_LIVE_RENAME_OK
/**
* struct net_device - The DEVICE structure.
-@@ -1846,6 +1848,11 @@ struct net_device {
+@@ -1877,6 +1879,11 @@ struct net_device {
const struct tlsdev_ops *tlsdev_ops;
#endif
const struct header_ops *header_ops;
unsigned int flags;
-@@ -1928,6 +1935,10 @@ struct net_device {
+@@ -1959,6 +1966,10 @@ struct net_device {
struct mpls_dev __rcu *mpls_ptr;
#endif
*/
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
-@@ -2547,6 +2547,10 @@ static inline int pskb_trim(struct sk_bu
+@@ -2665,6 +2665,10 @@ static inline int pskb_trim(struct sk_bu
return (len < skb->len) ? __pskb_trim(skb, len) : 0;
}
/**
* pskb_trim_unique - remove end from a paged unique (not cloned) buffer
* @skb: buffer to alter
-@@ -2678,16 +2682,6 @@ static inline struct sk_buff *dev_alloc_
+@@ -2796,16 +2800,6 @@ static inline struct sk_buff *dev_alloc_
}
{
--- a/net/Kconfig
+++ b/net/Kconfig
-@@ -25,6 +25,12 @@ menuconfig NET
+@@ -26,6 +26,12 @@ menuconfig NET
if NET
help
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -3253,10 +3253,20 @@ static int xmit_one(struct sk_buff *skb,
- if (!list_empty(&ptype_all) || !list_empty(&dev->ptype_all))
+@@ -3194,10 +3194,20 @@ static int xmit_one(struct sk_buff *skb,
+ if (dev_nit_active(dev))
dev_queue_xmit_nit(skb, dev);
- len = skb->len;
}
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
-@@ -63,6 +63,7 @@
- #include <linux/errqueue.h>
+@@ -60,6 +60,7 @@
#include <linux/prefetch.h>
#include <linux/if_vlan.h>
+ #include <linux/mpls.h>
+#include <linux/if.h>
#include <net/protocol.h>
#include <net/dst.h>
-@@ -503,6 +504,22 @@ skb_fail:
+@@ -540,6 +541,22 @@ skb_fail:
}
EXPORT_SYMBOL(__napi_alloc_skb);
{
--- a/net/ethernet/eth.c
+++ b/net/ethernet/eth.c
-@@ -172,6 +172,12 @@ __be16 eth_type_trans(struct sk_buff *sk
+@@ -171,6 +171,12 @@ __be16 eth_type_trans(struct sk_buff *sk
const struct ethhdr *eth;
skb->dev = dev;
#include <linux/bcm47xx_nvram.h>
#include <linux/phy.h>
#include <linux/phy_fixed.h>
-@@ -1409,6 +1410,17 @@ static const struct ethtool_ops bgmac_et
+@@ -1407,6 +1408,17 @@ static const struct ethtool_ops bgmac_et
.set_link_ksettings = phy_ethtool_set_link_ksettings,
};
/**************************************************
* MII
**************************************************/
-@@ -1540,6 +1552,14 @@ int bgmac_enet_probe(struct bgmac *bgmac
+@@ -1538,6 +1550,14 @@ int bgmac_enet_probe(struct bgmac *bgmac
net_dev->hw_features = net_dev->features;
net_dev->vlan_features = net_dev->features;
err = register_netdev(bgmac->net_dev);
if (err) {
dev_err(bgmac->dev, "Cannot register net device\n");
-@@ -1562,6 +1582,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe);
+@@ -1560,6 +1580,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe);
void bgmac_enet_remove(struct bgmac *bgmac)
{
--- a/net/Kconfig
+++ b/net/Kconfig
-@@ -98,6 +98,9 @@ source "net/netlabel/Kconfig"
+@@ -100,6 +100,9 @@ source "net/netlabel/Kconfig"
endif # if INET
neighbour.o rtnetlink.o utils.o link_watch.o filter.o \
- sock_diag.o dev_ioctl.o tso.o sock_reuseport.o \
+ dev_ioctl.o tso.o sock_reuseport.o \
- fib_notifier.o xdp.o
+ fib_notifier.o xdp.o flow_offload.o
+obj-$(CONFIG_SOCK_DIAG) += sock_diag.o
obj-y += net-sysfs.o
obj-$(CONFIG_PROC_FS) += net-procfs.o
--- a/net/core/sock.c
+++ b/net/core/sock.c
-@@ -490,6 +490,18 @@ discard_and_relse:
+@@ -140,6 +140,7 @@
+
+ static DEFINE_MUTEX(proto_list_mutex);
+ static LIST_HEAD(proto_list);
++static atomic64_t cookie_gen;
+
+ static void sock_inuse_add(struct net *net, int val);
+
+@@ -539,6 +540,18 @@ discard_and_relse:
}
EXPORT_SYMBOL(__sk_receive_skb);
+
+ if (res)
+ return res;
-+ res = atomic64_inc_return(&sock_net(sk)->cookie_gen);
++ res = atomic64_inc_return(&cookie_gen);
+ atomic64_cmpxchg(&sk->sk_cookie, 0, res);
+ }
+}
struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie)
{
struct dst_entry *dst = __sk_dst_get(sk);
-@@ -1603,9 +1615,11 @@ static void __sk_free(struct sock *sk)
+@@ -1746,9 +1759,11 @@ static void __sk_free(struct sock *sk)
if (likely(sk->sk_net_refcnt))
sock_inuse_add(sock_net(sk), -1);
--- a/net/core/sock_diag.c
+++ b/net/core/sock_diag.c
-@@ -20,18 +20,6 @@ static int (*inet_rcv_compat)(struct sk_
+@@ -19,19 +19,6 @@ static const struct sock_diag_handler *s
+ static int (*inet_rcv_compat)(struct sk_buff *skb, struct nlmsghdr *nlh);
static DEFINE_MUTEX(sock_diag_table_mutex);
static struct workqueue_struct *broadcast_wq;
-
+-static atomic64_t cookie_gen;
+-
-u64 sock_gen_cookie(struct sock *sk)
-{
- while (1) {
-
- if (res)
- return res;
-- res = atomic64_inc_return(&sock_net(sk)->cookie_gen);
+- res = atomic64_inc_return(&cookie_gen);
- atomic64_cmpxchg(&sk->sk_cookie, 0, res);
- }
-}
--
+
int sock_diag_check_cookie(struct sock *sk, const __u32 *cookie)
{
- u64 res;
--- a/net/ipv4/Kconfig
+++ b/net/ipv4/Kconfig
-@@ -425,6 +425,7 @@ config INET_XFRM_MODE_BEET
+@@ -399,6 +399,7 @@ config INET_TUNNEL
config INET_DIAG
tristate "INET: socket monitoring interface"
Support for INET (TCP, DCCP, etc) socket monitoring interface used by
--- a/net/netlink/Kconfig
+++ b/net/netlink/Kconfig
-@@ -4,6 +4,7 @@
+@@ -5,6 +5,7 @@
config NETLINK_DIAG
tristate "NETLINK: socket monitoring interface"
Support for NETLINK socket monitoring interface used by the ss tool.
--- a/net/packet/Kconfig
+++ b/net/packet/Kconfig
-@@ -18,6 +18,7 @@ config PACKET
+@@ -19,6 +19,7 @@ config PACKET
config PACKET_DIAG
tristate "Packet: sockets monitoring interface"
depends on PACKET
Support for PF_PACKET sockets monitoring interface used by the ss tool.
--- a/net/unix/Kconfig
+++ b/net/unix/Kconfig
-@@ -22,6 +22,7 @@ config UNIX
+@@ -28,6 +28,7 @@ config UNIX_SCM
config UNIX_DIAG
tristate "UNIX: socket monitoring interface"
depends on UNIX
--- a/fs/locks.c
+++ b/fs/locks.c
-@@ -2786,6 +2786,8 @@ static const struct seq_operations locks
+@@ -2961,6 +2961,8 @@ static const struct seq_operations locks
static int __init proc_locks_init(void)
{
return 0;
--- a/fs/proc/Kconfig
+++ b/fs/proc/Kconfig
-@@ -97,3 +97,8 @@ config PROC_CHILDREN
-
+@@ -100,6 +100,11 @@ config PROC_CHILDREN
Say Y if you are running any user-space software which takes benefit from
this interface. For example, rkt is such a piece of software.
-+
+
+config PROC_STRIPPED
+ default n
+ depends on EXPERT
+ bool "Strip non-essential /proc functionality to reduce code size"
++
+ config PROC_PID_ARCH_STATUS
+ def_bool n
+ depends on PROC_FS
--- a/fs/proc/consoles.c
+++ b/fs/proc/consoles.c
-@@ -93,6 +93,9 @@ static const struct seq_operations conso
+@@ -92,6 +92,9 @@ static const struct seq_operations conso
static int __init proc_consoles_init(void)
{
proc_mkdir("tty/ldisc", NULL); /* Preserved: it's userspace visible */
--- a/include/net/snmp.h
+++ b/include/net/snmp.h
-@@ -123,6 +123,21 @@ struct linux_xfrm_mib {
+@@ -118,6 +118,21 @@ struct linux_xfrm_mib {
#define DECLARE_SNMP_STAT(type, name) \
extern __typeof__(type) __percpu *name
#define __SNMP_INC_STATS(mib, field) \
__this_cpu_inc(mib->mibs[field])
-@@ -153,8 +168,9 @@ struct linux_xfrm_mib {
+@@ -148,8 +163,9 @@ struct linux_xfrm_mib {
__this_cpu_add(ptr[basefield##OCTETS], addend); \
} while (0)
do { \
--- a/ipc/msg.c
+++ b/ipc/msg.c
-@@ -1292,6 +1292,9 @@ void __init msg_init(void)
+@@ -1317,6 +1317,9 @@ void __init msg_init(void)
{
msg_init_ns(&init_ipc_ns);
}
--- a/kernel/irq/proc.c
+++ b/kernel/irq/proc.c
-@@ -333,6 +333,9 @@ void register_irq_proc(unsigned int irq,
+@@ -319,6 +319,9 @@ void register_irq_proc(unsigned int irq,
void __maybe_unused *irqp = (void *)(unsigned long) irq;
char name [MAX_NAMELEN];
if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip))
return;
-@@ -386,6 +389,9 @@ void unregister_irq_proc(unsigned int ir
+@@ -372,6 +375,9 @@ void unregister_irq_proc(unsigned int ir
{
char name [MAX_NAMELEN];
if (!root_irq_dir || !desc->dir)
return;
#ifdef CONFIG_SMP
-@@ -424,6 +430,9 @@ void init_irq_proc(void)
+@@ -410,6 +416,9 @@ void init_irq_proc(void)
unsigned int irq;
struct irq_desc *desc;
if (!root_irq_dir)
--- a/kernel/time/timer_list.c
+++ b/kernel/time/timer_list.c
-@@ -375,6 +375,8 @@ static int __init init_timer_list_procfs
+@@ -370,6 +370,8 @@ static int __init init_timer_list_procfs
{
struct proc_dir_entry *pe;
if (!pe)
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
-@@ -2749,6 +2749,8 @@ static const struct seq_operations vmall
+@@ -3549,6 +3549,8 @@ static const struct seq_operations vmall
static int __init proc_vmalloc_init(void)
{
&vmalloc_op,
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
-@@ -1972,10 +1972,12 @@ void __init init_mm_internals(void)
+@@ -1988,10 +1988,12 @@ void __init init_mm_internals(void)
start_shepherd_timer();
#endif
#ifdef CONFIG_PROC_FS
--- a/net/8021q/vlanproc.c
+++ b/net/8021q/vlanproc.c
-@@ -96,6 +96,9 @@ void vlan_proc_cleanup(struct net *net)
+@@ -93,6 +93,9 @@ void vlan_proc_cleanup(struct net *net)
{
struct vlan_net *vn = net_generic(net, vlan_net_id);
if (vn->proc_vlan_conf)
remove_proc_entry(name_conf, vn->proc_vlan_dir);
-@@ -115,6 +118,9 @@ int __net_init vlan_proc_init(struct net
+@@ -112,6 +115,9 @@ int __net_init vlan_proc_init(struct net
{
struct vlan_net *vn = net_generic(net, vlan_net_id);
--- a/net/core/sock.c
+++ b/net/core/sock.c
-@@ -3486,6 +3486,8 @@ static __net_initdata struct pernet_oper
+@@ -3603,6 +3603,8 @@ static __net_initdata struct pernet_oper
static int __init proto_init(void)
{
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
-@@ -2717,11 +2717,13 @@ static const struct seq_operations fib_r
+@@ -2844,11 +2844,13 @@ static const struct seq_operations fib_r
int __net_init fib_proc_init(struct net *net)
{
fib_triestat_seq_show, NULL))
goto out2;
-@@ -2732,17 +2734,21 @@ int __net_init fib_proc_init(struct net
+@@ -2859,17 +2861,21 @@ int __net_init fib_proc_init(struct net
return 0;
out3:
--- a/net/ipv4/proc.c
+++ b/net/ipv4/proc.c
-@@ -524,5 +524,8 @@ static __net_initdata struct pernet_oper
+@@ -522,5 +522,8 @@ static __net_initdata struct pernet_oper
int __init ip_misc_proc_init(void)
{
}
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
-@@ -411,6 +411,9 @@ static struct pernet_operations ip_rt_pr
+@@ -408,6 +408,9 @@ static struct pernet_operations ip_rt_pr
static int __init ip_rt_proc_init(void)
{
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
-@@ -172,7 +172,7 @@ config SOC_BUS
+@@ -179,7 +179,7 @@ config SOC_BUS
source "drivers/base/regmap/Kconfig"
config DMA_SHARED_BUFFER
- bool
+ tristate
default n
- select ANON_INODES
select IRQ_WORK
+ help
--- a/drivers/dma-buf/Makefile
+++ b/drivers/dma-buf/Makefile
-@@ -1,3 +1,7 @@
--obj-y := dma-buf.o dma-fence.o dma-fence-array.o reservation.o seqno-fence.o
+@@ -1,9 +1,13 @@
+ # SPDX-License-Identifier: GPL-2.0-only
+-obj-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
+- dma-resv.o seqno-fence.o
-obj-$(CONFIG_SYNC_FILE) += sync_file.o
-obj-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o
+-obj-$(CONFIG_UDMABUF) += udmabuf.o
+obj-$(CONFIG_DMA_SHARED_BUFFER) := dma-shared-buffer.o
+
-+dma-buf-objs-y := dma-buf.o dma-fence.o dma-fence-array.o reservation.o seqno-fence.o
-+dma-buf-objs-$(CONFIG_SYNC_FILE) += sync_file.o
++dma-buf-objs-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
++ dma-resv.o seqno-fence.o
++dma-buf-objs-$(CONFIG_SYNC_FILE) += sync_file.o
+dma-buf-objs-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o
++dma-buf-objs-$(CONFIG_UDMABUF) += udmabuf.o
+
+dma-shared-buffer-objs := $(dma-buf-objs-y)
+
+ dmabuf_selftests-y := \
+ selftest.o \
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
-@@ -34,6 +34,7 @@
- #include <linux/poll.h>
- #include <linux/reservation.h>
- #include <linux/mm.h>
-+#include <linux/module.h>
-
- #include <uapi/linux/dma-buf.h>
-
-@@ -1159,4 +1160,5 @@ static void __exit dma_buf_deinit(void)
- {
+@@ -1297,4 +1297,5 @@ static void __exit dma_buf_deinit(void)
dma_buf_uninit_debugfs();
+ kern_unmount(dma_buf_mnt);
}
-__exitcall(dma_buf_deinit);
+module_exit(dma_buf_deinit);
+MODULE_LICENSE("GPL");
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
-@@ -2129,6 +2129,7 @@ int wake_up_state(struct task_struct *p,
+@@ -2673,6 +2673,7 @@ int wake_up_state(struct task_struct *p,
{
return try_to_wake_up(p, state, 0);
}
/*
* Perform scheduler related setup for a newly forked process p.
+--- a/fs/d_path.c
++++ b/fs/d_path.c
+@@ -307,6 +307,7 @@ char *dynamic_dname(struct dentry *dentr
+ buffer += buflen - sz;
+ return memcpy(buffer, temp, sz);
+ }
++EXPORT_SYMBOL_GPL(dynamic_dname);
+
+ char *simple_dname(struct dentry *dentry, char *buffer, int buflen)
+ {
#ifdef CONFIG_UEVENT_HELPER
/* path to the userspace helper executed on an event */
extern char uevent_helper[];
-@@ -244,4 +246,7 @@ int kobject_synth_uevent(struct kobject
+@@ -245,4 +247,7 @@ int kobject_synth_uevent(struct kobject
__printf(2, 3)
int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);
#endif /* _KOBJECT_H_ */
--- a/lib/kobject_uevent.c
+++ b/lib/kobject_uevent.c
-@@ -688,6 +688,43 @@ int add_uevent_var(struct kobj_uevent_en
+@@ -690,6 +690,43 @@ int add_uevent_var(struct kobj_uevent_en
EXPORT_SYMBOL_GPL(add_uevent_var);
#if defined(CONFIG_NET)
+++ /dev/null
-From 6b1ab74a9917012d0c559edc4ed299d9228ac89f Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 8 Jul 2017 08:26:47 +0200
-Subject: kernel: add the new 'crashlog' feature
-
-this tries to store kernel oops/panic logs in a fixed location in RAM to
-recover them available to user space using debugfs
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- include/linux/crashlog.h | 17 ++++
- init/Kconfig | 4 +
- kernel/Makefile | 1 +
- kernel/crashlog.c | 213 +++++++++++++++++++++++++++++++++++++++++++++++
- kernel/module.c | 3 +
- mm/bootmem.c | 2 +
- mm/memblock.c | 5 ++
- 7 files changed, 245 insertions(+)
- create mode 100644 include/linux/crashlog.h
- create mode 100644 kernel/crashlog.c
-
---- /dev/null
-+++ b/include/linux/crashlog.h
-@@ -0,0 +1,17 @@
-+#ifndef __CRASHLOG_H
-+#define __CRASHLOG_H
-+
-+#ifdef CONFIG_CRASHLOG
-+void crashlog_init_bootmem(struct bootmem_data *bdata);
-+void crashlog_init_memblock(phys_addr_t addr, phys_addr_t size);
-+#else
-+static inline void crashlog_init_bootmem(struct bootmem_data *bdata)
-+{
-+}
-+
-+static inline void crashlog_init_memblock(phys_addr_t addr, phys_addr_t size)
-+{
-+}
-+#endif
-+
-+#endif
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -1049,6 +1049,10 @@ config RELAY
-
- If unsure, say N.
-
-+config CRASHLOG
-+ bool "Crash logging"
-+ depends on (!NO_BOOTMEM || HAVE_MEMBLOCK)
-+
- config BLK_DEV_INITRD
- bool "Initial RAM filesystem and RAM disk (initramfs/initrd) support"
- help
---- a/kernel/Makefile
-+++ b/kernel/Makefile
-@@ -114,6 +114,7 @@ obj-$(CONFIG_TORTURE_TEST) += torture.o
- obj-$(CONFIG_HAS_IOMEM) += iomem.o
- obj-$(CONFIG_ZONE_DEVICE) += memremap.o
- obj-$(CONFIG_RSEQ) += rseq.o
-+obj-$(CONFIG_CRASHLOG) += crashlog.o
-
- $(obj)/configs.o: $(obj)/config_data.h
-
---- /dev/null
-+++ b/kernel/crashlog.c
-@@ -0,0 +1,213 @@
-+/*
-+ * Crash information logger
-+ * Copyright (C) 2010 Felix Fietkau <nbd@nbd.name>
-+ *
-+ * Based on ramoops.c
-+ * Copyright (C) 2010 Marco Stornelli <marco.stornelli@gmail.com>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * version 2 as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-+ * 02110-1301 USA
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/bootmem.h>
-+#include <linux/memblock.h>
-+#include <linux/debugfs.h>
-+#include <linux/crashlog.h>
-+#include <linux/kmsg_dump.h>
-+#include <linux/module.h>
-+#include <linux/pfn.h>
-+#include <linux/vmalloc.h>
-+#include <asm/io.h>
-+
-+#define CRASHLOG_PAGES 4
-+#define CRASHLOG_SIZE (CRASHLOG_PAGES * PAGE_SIZE)
-+#define CRASHLOG_MAGIC 0xa1eedead
-+
-+/*
-+ * Start the log at 1M before the end of RAM, as some boot loaders like
-+ * to use the end of the RAM for stack usage and other things
-+ * If this fails, fall back to using the last part.
-+ */
-+#define CRASHLOG_OFFSET (1024 * 1024)
-+
-+struct crashlog_data {
-+ u32 magic;
-+ u32 len;
-+ u8 data[];
-+};
-+
-+static struct debugfs_blob_wrapper crashlog_blob;
-+static unsigned long crashlog_addr = 0;
-+static struct crashlog_data *crashlog_buf;
-+static struct kmsg_dumper dump;
-+static bool first = true;
-+
-+extern struct list_head *crashlog_modules;
-+
-+static bool crashlog_set_addr(phys_addr_t addr, phys_addr_t size)
-+{
-+ /* Limit to lower 64 MB to avoid highmem */
-+ phys_addr_t limit = 64 * 1024 * 1024;
-+
-+ if (crashlog_addr)
-+ return false;
-+
-+ if (addr > limit)
-+ return false;
-+
-+ if (addr + size > limit)
-+ size = limit - addr;
-+
-+ crashlog_addr = addr;
-+
-+ if (addr + size > CRASHLOG_OFFSET)
-+ crashlog_addr += size - CRASHLOG_OFFSET;
-+
-+ return true;
-+}
-+
-+#ifndef CONFIG_NO_BOOTMEM
-+void __init crashlog_init_bootmem(bootmem_data_t *bdata)
-+{
-+ phys_addr_t start, end;
-+
-+ start = PFN_PHYS(bdata->node_low_pfn);
-+ end = PFN_PHYS(bdata->node_min_pfn);
-+ if (!crashlog_set_addr(start, end - start))
-+ return;
-+
-+ if (reserve_bootmem(crashlog_addr, CRASHLOG_SIZE, BOOTMEM_EXCLUSIVE) < 0) {
-+ printk("Crashlog failed to allocate RAM at address 0x%lx\n",
-+ crashlog_addr);
-+ crashlog_addr = 0;
-+ }
-+}
-+#endif
-+
-+#ifdef CONFIG_HAVE_MEMBLOCK
-+void __init_memblock crashlog_init_memblock(phys_addr_t addr, phys_addr_t size)
-+{
-+ if (!crashlog_set_addr(addr, size))
-+ return;
-+
-+ if (memblock_reserve(crashlog_addr, CRASHLOG_SIZE)) {
-+ printk("Crashlog failed to allocate RAM at address 0x%lx\n",
-+ crashlog_addr);
-+ crashlog_addr = 0;
-+ }
-+}
-+#endif
-+
-+static void __init crashlog_copy(void)
-+{
-+ if (crashlog_buf->magic != CRASHLOG_MAGIC)
-+ return;
-+
-+ if (!crashlog_buf->len || crashlog_buf->len >
-+ CRASHLOG_SIZE - sizeof(*crashlog_buf))
-+ return;
-+
-+ crashlog_blob.size = crashlog_buf->len;
-+ crashlog_blob.data = kmemdup(crashlog_buf->data,
-+ crashlog_buf->len, GFP_KERNEL);
-+
-+ debugfs_create_blob("crashlog", 0700, NULL, &crashlog_blob);
-+}
-+
-+static int get_maxlen(void)
-+{
-+ return CRASHLOG_SIZE - sizeof(*crashlog_buf) - crashlog_buf->len;
-+}
-+
-+static void crashlog_printf(const char *fmt, ...)
-+{
-+ va_list args;
-+ int len = get_maxlen();
-+
-+ if (!len)
-+ return;
-+
-+ va_start(args, fmt);
-+ crashlog_buf->len += vscnprintf(
-+ &crashlog_buf->data[crashlog_buf->len],
-+ len, fmt, args);
-+ va_end(args);
-+}
-+
-+static void crashlog_do_dump(struct kmsg_dumper *dumper,
-+ enum kmsg_dump_reason reason)
-+{
-+ struct timeval tv;
-+ struct module *m;
-+ char *buf;
-+ size_t len;
-+
-+ if (!first)
-+ crashlog_printf("\n===================================\n");
-+
-+ do_gettimeofday(&tv);
-+ crashlog_printf("Time: %lu.%lu\n",
-+ (long)tv.tv_sec, (long)tv.tv_usec);
-+
-+ if (first) {
-+ crashlog_printf("Modules:");
-+ list_for_each_entry(m, crashlog_modules, list) {
-+ crashlog_printf("\t%s@%p+%x", m->name,
-+ m->core_layout.base, m->core_layout.size,
-+ m->init_layout.base, m->init_layout.size);
-+ }
-+ crashlog_printf("\n");
-+ first = false;
-+ }
-+
-+ buf = (char *)&crashlog_buf->data[crashlog_buf->len];
-+
-+ kmsg_dump_get_buffer(dumper, true, buf, get_maxlen(), &len);
-+
-+ crashlog_buf->len += len;
-+}
-+
-+
-+int __init crashlog_init_fs(void)
-+{
-+ struct page *pages[CRASHLOG_PAGES];
-+ pgprot_t prot;
-+ int i;
-+
-+ if (!crashlog_addr) {
-+ printk("No memory allocated for crashlog\n");
-+ return -ENOMEM;
-+ }
-+
-+ printk("Crashlog allocated RAM at address 0x%lx\n", (unsigned long) crashlog_addr);
-+ for (i = 0; i < CRASHLOG_PAGES; i++)
-+ pages[i] = pfn_to_page((crashlog_addr >> PAGE_SHIFT) + i);
-+
-+ prot = pgprot_writecombine(PAGE_KERNEL);
-+ crashlog_buf = vmap(pages, CRASHLOG_PAGES, VM_MAP, prot);
-+
-+ crashlog_copy();
-+
-+ crashlog_buf->magic = CRASHLOG_MAGIC;
-+ crashlog_buf->len = 0;
-+
-+ dump.max_reason = KMSG_DUMP_OOPS;
-+ dump.dump = crashlog_do_dump;
-+ kmsg_dump_register(&dump);
-+
-+ return 0;
-+}
-+module_init(crashlog_init_fs);
---- a/kernel/module.c
-+++ b/kernel/module.c
-@@ -251,6 +251,9 @@ static void mod_update_bounds(struct mod
- #ifdef CONFIG_KGDB_KDB
- struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
- #endif /* CONFIG_KGDB_KDB */
-+#ifdef CONFIG_CRASHLOG
-+struct list_head *crashlog_modules = &modules;
-+#endif
-
- static void module_assert_mutex(void)
- {
---- a/mm/bootmem.c
-+++ b/mm/bootmem.c
-@@ -15,6 +15,7 @@
- #include <linux/export.h>
- #include <linux/kmemleak.h>
- #include <linux/range.h>
-+#include <linux/crashlog.h>
- #include <linux/bug.h>
- #include <linux/io.h>
- #include <linux/bootmem.h>
-@@ -215,6 +216,7 @@ static unsigned long __init free_all_boo
- if (!bdata->node_bootmem_map)
- return 0;
-
-+ crashlog_init_bootmem(bdata);
- map = bdata->node_bootmem_map;
- start = bdata->node_min_pfn;
- end = bdata->node_low_pfn;
---- a/mm/memblock.c
-+++ b/mm/memblock.c
-@@ -21,6 +21,7 @@
- #include <linux/seq_file.h>
- #include <linux/memblock.h>
- #include <linux/bootmem.h>
-+#include <linux/crashlog.h>
-
- #include <asm/sections.h>
- #include <linux/io.h>
-@@ -547,6 +548,8 @@ static void __init_memblock memblock_ins
- memblock_set_region_node(rgn, nid);
- type->cnt++;
- type->total_size += size;
-+ if (type == &memblock.memory)
-+ crashlog_init_memblock(base, size);
- }
-
- /**
-@@ -586,6 +589,8 @@ int __init_memblock memblock_add_range(s
- type->regions[0].flags = flags;
- memblock_set_region_node(&type->regions[0], nid);
- type->total_size = size;
-+ if (type == &memblock.memory)
-+ crashlog_init_memblock(base, size);
- return 0;
- }
- repeat:
--- a/drivers/w1/masters/w1-gpio.c
+++ b/drivers/w1/masters/w1-gpio.c
-@@ -79,7 +79,7 @@ static int w1_gpio_probe(struct platform
+@@ -76,7 +76,7 @@ static int w1_gpio_probe(struct platform
enum gpiod_flags gflags = GPIOD_OUT_LOW_OPEN_DRAIN;
int err;
+++ /dev/null
-From 852a88f35f4b7e5ebb717fed3c3a3330d5ad4336 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Petr=20=C5=A0tetiar?= <ynezz@true.cz>
-Date: Wed, 10 Apr 2019 16:43:27 +0200
-Subject: [PATCH v2] MIPS: perf: ath79: Fix perfcount IRQ assignment
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Currently it's not possible to use perf on ath79 due to genirq flags
-mismatch happening on static virtual IRQ 13 which is used for
-performance counters hardware IRQ 5.
-
-On TP-Link Archer C7v5:
-
- CPU0
- 2: 0 MIPS 2 ath9k
- 4: 318 MIPS 4 19000000.eth
- 7: 55034 MIPS 7 timer
- 8: 1236 MISC 3 ttyS0
- 12: 0 INTC 1 ehci_hcd:usb1
- 13: 0 gpio-ath79 2 keys
- 14: 0 gpio-ath79 5 keys
- 15: 31 AR724X PCI 1 ath10k_pci
-
- $ perf top
- genirq: Flags mismatch irq 13. 00014c83 (mips_perf_pmu) vs. 00002003 (keys)
-
-On TP-Link Archer C7v4:
-
- CPU0
- 4: 0 MIPS 4 19000000.eth
- 5: 7135 MIPS 5 1a000000.eth
- 7: 98379 MIPS 7 timer
- 8: 30 MISC 3 ttyS0
- 12: 90028 INTC 0 ath9k
- 13: 5520 INTC 1 ehci_hcd:usb1
- 14: 4623 INTC 2 ehci_hcd:usb2
- 15: 32844 AR724X PCI 1 ath10k_pci
- 16: 0 gpio-ath79 16 keys
- 23: 0 gpio-ath79 23 keys
-
- $ perf top
- genirq: Flags mismatch irq 13. 00014c80 (mips_perf_pmu) vs. 00000080 (ehci_hcd:usb1)
-
-This problem is happening, because currently statically assigned virtual
-IRQ 13 for performance counters is not claimed during the initialization
-of MIPS PMU during the bootup, so the IRQ subsystem doesn't know, that
-this interrupt isn't available for further use.
-
-So this patch fixes the issue by simply booking hardware IRQ 5 for MIPS PMU.
-
-Tested-by: Kevin 'ldir' Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
-Signed-off-by: Petr Å tetiar <ynezz@true.cz>
----
-
-Changes since v1:
-
- I've incorporated two comments which I've received on IRC from blogic and
- I've also reworded the commit message to match the changes in v2 of this
- patch.
-
- * use actual hardware perfcount IRQ 5 instead of the virtual IRQ 13
- * dropped the CONFIG_PERF_EVENTS ifdef around irq_create_mapping
-
- arch/mips/ath79/setup.c | 6 ------
- drivers/irqchip/irq-ath79-misc.c | 11 +++++++++++
- 2 files changed, 11 insertions(+), 6 deletions(-)
-
---- a/arch/mips/ath79/setup.c
-+++ b/arch/mips/ath79/setup.c
-@@ -211,12 +211,6 @@ const char *get_system_type(void)
- return ath79_sys_type;
- }
-
--int get_c0_perfcount_int(void)
--{
-- return ATH79_MISC_IRQ(5);
--}
--EXPORT_SYMBOL_GPL(get_c0_perfcount_int);
--
- unsigned int get_c0_compare_int(void)
- {
- return CP0_LEGACY_COMPARE_IRQ;
---- a/drivers/irqchip/irq-ath79-misc.c
-+++ b/drivers/irqchip/irq-ath79-misc.c
-@@ -22,6 +22,15 @@
- #define AR71XX_RESET_REG_MISC_INT_ENABLE 4
-
- #define ATH79_MISC_IRQ_COUNT 32
-+#define ATH79_MISC_PERF_IRQ 5
-+
-+static int ath79_perfcount_irq;
-+
-+int get_c0_perfcount_int(void)
-+{
-+ return ath79_perfcount_irq;
-+}
-+EXPORT_SYMBOL_GPL(get_c0_perfcount_int);
-
- static void ath79_misc_irq_handler(struct irq_desc *desc)
- {
-@@ -113,6 +122,8 @@ static void __init ath79_misc_intc_domai
- {
- void __iomem *base = domain->host_data;
-
-+ ath79_perfcount_irq = irq_create_mapping(domain, ATH79_MISC_PERF_IRQ);
-+
- /* Disable and clear all interrupts */
- __raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_ENABLE);
- __raw_writel(0, base + AR71XX_RESET_REG_MISC_INT_STATUS);
/*
--- a/drivers/usb/host/ehci-platform.c
+++ b/drivers/usb/host/ehci-platform.c
-@@ -208,6 +208,8 @@ static int ehci_platform_probe(struct pl
+@@ -206,6 +206,8 @@ static int ehci_platform_probe(struct pl
hcd->has_tt = 1;
if (pdata->reset_on_resume)
priv->reset_on_resume = true;
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
-@@ -6400,7 +6400,7 @@ static void __ref alloc_node_mem_map(str
+@@ -6851,7 +6851,7 @@ static void __ref alloc_node_mem_map(str
mem_map = NODE_DATA(0)->node_mem_map;
#if defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP) || defined(CONFIG_FLATMEM)
if (page_to_pfn(mem_map) != pgdat->node_start_pfn)
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
-@@ -672,6 +672,7 @@ static const struct of_device_id spidev_
- { .compatible = "lineartechnology,ltc2488" },
- { .compatible = "ge,achc" },
- { .compatible = "semtech,sx1301" },
+@@ -668,6 +668,7 @@ static const struct of_device_id spidev_
+ { .compatible = "lwn,bk4" },
+ { .compatible = "dh,dhcom-board" },
+ { .compatible = "menlo,m53cpld" },
+ { .compatible = "siliconlabs,si3210" },
{},
};
+++ /dev/null
-From: Felix Fietkau <nbd@nbd.name>
-Subject: spi: use gpio_set_value_cansleep for setting chipselect GPIO
-
-Sleeping is safe inside spi_transfer_one_message, and some GPIO chips
-need to sleep for setting values
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/drivers/spi/spi.c
-+++ b/drivers/spi/spi.c
-@@ -733,7 +733,7 @@ static void spi_set_cs(struct spi_device
- enable = !enable;
-
- if (gpio_is_valid(spi->cs_gpio)) {
-- gpio_set_value(spi->cs_gpio, !enable);
-+ gpio_set_value_cansleep(spi->cs_gpio, !enable);
- /* Some SPI masters need both GPIO CS & slave_select */
- if ((spi->controller->flags & SPI_MASTER_GPIO_SS) &&
- spi->controller->set_cs)
+++ /dev/null
-From 0f76408d8c1cb0979f4286dd23912e6e59784b35 Mon Sep 17 00:00:00 2001
-From: DENG Qingfang <dqfext@gmail.com>
-Date: Thu, 19 Sep 2019 11:42:55 +0200
-Subject: [PATCH] spi: spi-gpio: fix crash when num-chipselects is 0
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-If an spi-gpio was specified with num-chipselects = <0> in dts, kernel will crash:
-
-Unable to handle kernel paging request at virtual address 32697073
-pgd = (ptrval)
-[32697073] *pgd=00000000
-Internal error: Oops: 5 [# 1] SMP ARM
-Modules linked in:
-CPU: 2 PID: 1 Comm: swapper/0 Not tainted 4.19.72 #0
-Hardware name: Generic DT based system
-PC is at validate_desc+0x28/0x80
-LR is at gpiod_direction_output+0x14/0x128
-...
-[<c0544db4>] (validate_desc) from [<c0545228>] (gpiod_direction_output+0x14/0x128)
-[<c0545228>] (gpiod_direction_output) from [<c05fa714>] (spi_gpio_setup+0x58/0x64)
-[<c05fa714>] (spi_gpio_setup) from [<c05f7258>] (spi_setup+0x12c/0x148)
-[<c05f7258>] (spi_setup) from [<c05f7330>] (spi_add_device+0xbc/0x12c)
-[<c05f7330>] (spi_add_device) from [<c05f7f74>] (spi_register_controller+0x838/0x924)
-[<c05f7f74>] (spi_register_controller) from [<c05fa494>] (spi_bitbang_start+0x108/0x120)
-[<c05fa494>] (spi_bitbang_start) from [<c05faa34>] (spi_gpio_probe+0x314/0x338)
-[<c05faa34>] (spi_gpio_probe) from [<c05a844c>] (platform_drv_probe+0x34/0x70)
-
-The cause is spi_gpio_setup() did not check if the spi-gpio has chipselect pins
-before setting their direction and results in derefing an invalid pointer.
-
-The bug is spotted in kernel 4.19.72 on OpenWrt, and does not occur in 4.14.
-
-There is a similar fix upstream 249e2632dcd0509b8f8f296f5aabf4d48dfd6da8.
-
-Ref: https://patchwork.kernel.org/patch/11150619/
-Cc: Linus Walleij <linus.walleij@linaro.org>
-Cc: stable@vger.kernel.org
-Signed-off-by: DENG Qingfang <dqfext@gmail.com>
-Signed-off-by: Petr Å tetiar <ynezz@true.cz>
----
- drivers/spi/spi-gpio.c | 10 ++++++----
- 1 file changed, 6 insertions(+), 4 deletions(-)
-
---- a/drivers/spi/spi-gpio.c
-+++ b/drivers/spi/spi-gpio.c
-@@ -242,10 +242,12 @@ static int spi_gpio_setup(struct spi_dev
- * The CS GPIOs have already been
- * initialized from the descriptor lookup.
- */
-- cs = spi_gpio->cs_gpios[spi->chip_select];
-- if (!spi->controller_state && cs)
-- status = gpiod_direction_output(cs,
-- !(spi->mode & SPI_CS_HIGH));
-+ if (spi_gpio->has_cs) {
-+ cs = spi_gpio->cs_gpios[spi->chip_select];
-+ if (!spi->controller_state && cs)
-+ status = gpiod_direction_output(cs,
-+ !(spi->mode & SPI_CS_HIGH));
-+ }
-
- if (!status)
- status = spi_bitbang_setup(spi);
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
-@@ -193,6 +193,9 @@ static void __br_handle_local_finish(str
+@@ -190,6 +190,9 @@ static void __br_handle_local_finish(str
/* note: already called with rcu_read_lock */
static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
{
__br_handle_local_finish(skb);
/* return 1 to signal the okfn() was called so it's ok to use the skb */
-@@ -289,6 +292,17 @@ rx_handler_result_t br_handle_frame(stru
+@@ -340,6 +343,17 @@ rx_handler_result_t br_handle_frame(stru
forward:
switch (p->state) {
+ break;
+
case BR_STATE_FORWARDING:
- rhook = rcu_dereference(br_should_route_hook);
- if (rhook) {
+ case BR_STATE_LEARNING:
+ if (ether_addr_equal(p->br->dev->dev_addr, dest))
--- a/drivers/net/phy/at803x.c
+++ b/drivers/net/phy/at803x.c
-@@ -62,8 +62,10 @@
+@@ -64,8 +64,10 @@
#define ATH8030_PHY_ID 0x004dd076
#define ATH8031_PHY_ID 0x004dd074
MODULE_DESCRIPTION("Atheros 803x PHY driver");
MODULE_AUTHOR("Matus Ujhelyi");
-@@ -308,7 +310,7 @@ static void at803x_link_change_notify(st
- struct at803x_priv *priv = phydev->priv;
-
+@@ -314,7 +316,7 @@ static int at803x_config_intr(struct phy
+ static void at803x_link_change_notify(struct phy_device *phydev)
+ {
/*
- * Conduct a hardware reset for AT8030 every time a link loss is
+ * Conduct a hardware reset for AT8030/2 every time a link loss is
* signalled. This is necessary to circumvent a hardware bug that
* occurs when the cable is unplugged while TX packets are pending
* in the FIFO. In such cases, the FIFO enters an error mode it
-@@ -414,6 +416,24 @@ static struct phy_driver at803x_driver[]
+@@ -471,6 +473,24 @@ static struct phy_driver at803x_driver[]
.aneg_done = at803x_aneg_done,
.ack_interrupt = &at803x_ack_interrupt,
.config_intr = &at803x_config_intr,
+ .get_wol = at803x_get_wol,
+ .suspend = at803x_suspend,
+ .resume = at803x_resume,
-+ .features = PHY_BASIC_FEATURES,
-+ .flags = PHY_HAS_INTERRUPT,
++ /* PHY_BASIC_FEATURES */
++ .read_status = at803x_read_status,
+ .config_aneg = genphy_config_aneg,
+ .read_status = genphy_read_status,
+ .ack_interrupt = at803x_ack_interrupt,
} };
module_phy_driver(at803x_driver);
-@@ -421,6 +441,7 @@ module_phy_driver(at803x_driver);
+@@ -478,6 +498,7 @@ module_phy_driver(at803x_driver);
static struct mdio_device_id __maybe_unused atheros_tbl[] = {
{ ATH8030_PHY_ID, AT803X_PHY_ID_MASK },
{ ATH8031_PHY_ID, AT803X_PHY_ID_MASK },
--- a/Makefile
+++ b/Makefile
-@@ -657,12 +657,12 @@ KBUILD_CFLAGS += $(call cc-disable-warni
+@@ -702,11 +702,11 @@ KBUILD_CFLAGS += $(call cc-disable-warni
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
- ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
--KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,)
-+KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,) $(EXTRA_OPTIMIZATION)
- else
- ifdef CONFIG_PROFILE_ALL_BRANCHES
--KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,)
-+KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,) $(EXTRA_OPTIMIZATION)
- else
--KBUILD_CFLAGS += -O2
-+KBUILD_CFLAGS += -O2 -fno-reorder-blocks -fno-tree-ch $(EXTRA_OPTIMIZATION)
- endif
+ ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
+-KBUILD_CFLAGS += -O2
++KBUILD_CFLAGS += -O2 $(EXTRA_OPTIMIZATION)
+ else ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3
+-KBUILD_CFLAGS += -O3
++KBUILD_CFLAGS += -O3 $(EXTRA_OPTIMIZATION)
+ else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+-KBUILD_CFLAGS += -Os
++KBUILD_CFLAGS += -Os -fno-reorder-blocks -fno-tree-ch $(EXTRA_OPTIMIZATION)
endif
+ ifdef CONFIG_CC_DISABLE_WARN_MAYBE_UNINITIALIZED
--- a/init/Kconfig
+++ b/init/Kconfig
-@@ -1149,6 +1149,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
+@@ -1315,6 +1315,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
the unaligned access emulation.
see arch/parisc/kernel/unaligned.c for reference
--- a/kernel/kallsyms.c
+++ b/kernel/kallsyms.c
-@@ -74,6 +74,11 @@ static unsigned int kallsyms_expand_symb
+@@ -75,6 +75,11 @@ static unsigned int kallsyms_expand_symb
* For every byte on the compressed symbol data, copy the table
* entry for that byte.
*/
while (len) {
tptr = &kallsyms_token_table[kallsyms_token_index[*data]];
data++;
-@@ -106,6 +111,9 @@ tail:
+@@ -107,6 +112,9 @@ tail:
*/
static char kallsyms_get_symbol_type(unsigned int off)
{
* and return the first char from this token.
--- a/scripts/kallsyms.c
+++ b/scripts/kallsyms.c
-@@ -61,6 +61,7 @@ static struct addr_range percpu_range =
+@@ -59,6 +59,7 @@ static struct addr_range percpu_range =
static struct sym_entry *table;
static unsigned int table_size, table_cnt;
static int all_symbols = 0;
static int absolute_percpu = 0;
static int base_relative = 0;
-@@ -442,6 +443,9 @@ static void write_src(void)
+@@ -440,6 +441,9 @@ static void write_src(void)
free(markers);
output_label("kallsyms_token_table");
off = 0;
for (i = 0; i < 256; i++) {
-@@ -502,6 +506,9 @@ static void *find_token(unsigned char *s
+@@ -500,6 +504,9 @@ static void *find_token(unsigned char *s
{
int i;
for (i = 0; i < len - 1; i++) {
if (str[i] == token[0] && str[i+1] == token[1])
return &str[i];
-@@ -574,6 +581,9 @@ static void optimize_result(void)
+@@ -572,6 +579,9 @@ static void optimize_result(void)
{
int i, best;
/* using the '\0' symbol last allows compress_symbols to use standard
* fast string functions */
for (i = 255; i >= 0; i--) {
-@@ -756,6 +766,8 @@ int main(int argc, char **argv)
+@@ -751,6 +761,8 @@ int main(int argc, char **argv)
absolute_percpu = 1;
else if (strcmp(argv[i], "--base-relative") == 0)
base_relative = 1;
}
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
-@@ -133,6 +133,10 @@ kallsyms()
+@@ -152,6 +152,10 @@ kallsyms()
kallsymopt="${kallsymopt} --base-relative"
fi
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
-@@ -681,8 +681,10 @@ char *symbol_string(char *buf, char *end
+@@ -907,8 +907,10 @@ char *symbol_string(char *buf, char *end
struct printf_spec spec, const char *fmt)
{
unsigned long value;
#endif
if (fmt[1] == 'R')
-@@ -696,11 +698,16 @@ char *symbol_string(char *buf, char *end
- sprint_symbol(sym, value);
- else
- sprint_symbol_no_offset(sym, value);
--
-- return string(buf, end, sym, spec);
+@@ -925,8 +927,14 @@ char *symbol_string(char *buf, char *end
+
+ return string_nocheck(buf, end, sym, spec);
#else
- return special_hex_number(buf, end, value, sizeof(void *));
+ len = snprintf(sym, sizeof(sym), "0x%lx", value);
-+
+ mod = __module_address(value);
+ if (mod)
+ snprintf(sym + len, sizeof(sym) - len, " [%s@%p+0x%x]",
+++ /dev/null
---- a/arch/arm/kernel/atags.h
-+++ b/arch/arm/kernel/atags.h
-@@ -5,7 +5,7 @@ void convert_to_tag_list(struct tag *tag
- const struct machine_desc *setup_machine_tags(phys_addr_t __atags_pointer,
- unsigned int machine_nr);
- #else
--static inline const struct machine_desc *
-+static inline const struct machine_desc * __init __noreturn
- setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr)
- {
- early_print("no ATAGS support: can't continue\n");
---- a/arch/arm64/include/asm/cpufeature.h
-+++ b/arch/arm64/include/asm/cpufeature.h
-@@ -366,7 +366,7 @@ static inline bool cpu_have_feature(unsi
- }
-
- /* System capability check for constant caps */
--static inline bool __cpus_have_const_cap(int num)
-+static __always_inline bool __cpus_have_const_cap(int num)
- {
- if (num >= ARM64_NCAPS)
- return false;
-@@ -380,7 +380,7 @@ static inline bool cpus_have_cap(unsigne
- return test_bit(num, cpu_hwcaps);
- }
-
--static inline bool cpus_have_const_cap(int num)
-+static __always_inline bool cpus_have_const_cap(int num)
- {
- if (static_branch_likely(&arm64_const_caps_ready))
- return __cpus_have_const_cap(num);
---- a/arch/mips/include/asm/bitops.h
-+++ b/arch/mips/include/asm/bitops.h
-@@ -463,7 +463,7 @@ static inline void __clear_bit_unlock(un
- * Return the bit position (0..63) of the most significant 1 bit in a word
- * Returns -1 if no 1 bit exists
- */
--static inline unsigned long __fls(unsigned long word)
-+static __always_inline unsigned long __fls(unsigned long word)
- {
- int num;
-
-@@ -529,7 +529,7 @@ static inline unsigned long __fls(unsign
- * Returns 0..SZLONG-1
- * Undefined if no bit exists, so code should check against 0 first.
- */
--static inline unsigned long __ffs(unsigned long word)
-+static __always_inline unsigned long __ffs(unsigned long word)
- {
- return __fls(word & -word);
- }
---- a/arch/mips/kernel/cpu-bugs64.c
-+++ b/arch/mips/kernel/cpu-bugs64.c
-@@ -42,8 +42,8 @@ static inline void align_mod(const int a
- : GCC_IMM_ASM() (align), GCC_IMM_ASM() (mod));
- }
-
--static inline void mult_sh_align_mod(long *v1, long *v2, long *w,
-- const int align, const int mod)
-+static __always_inline void mult_sh_align_mod(long *v1, long *v2, long *w,
-+ const int align, const int mod)
- {
- unsigned long flags;
- int m1, m2;
---- a/arch/powerpc/kernel/prom_init.c
-+++ b/arch/powerpc/kernel/prom_init.c
-@@ -498,14 +498,14 @@ static int __init prom_next_node(phandle
- }
- }
-
--static inline int prom_getprop(phandle node, const char *pname,
-- void *value, size_t valuelen)
-+static inline int __init prom_getprop(phandle node, const char *pname,
-+ void *value, size_t valuelen)
- {
- return call_prom("getprop", 4, 1, node, ADDR(pname),
- (u32)(unsigned long) value, (u32) valuelen);
- }
-
--static inline int prom_getproplen(phandle node, const char *pname)
-+static inline int __init prom_getproplen(phandle node, const char *pname)
- {
- return call_prom("getproplen", 2, 1, node, ADDR(pname));
- }
---- a/arch/powerpc/mm/tlb-radix.c
-+++ b/arch/powerpc/mm/tlb-radix.c
-@@ -90,8 +90,8 @@ void radix__tlbiel_all(unsigned int acti
- asm volatile(PPC_INVALIDATE_ERAT "; isync" : : :"memory");
- }
-
--static inline void __tlbiel_pid(unsigned long pid, int set,
-- unsigned long ric)
-+static __always_inline void __tlbiel_pid(unsigned long pid, int set,
-+ unsigned long ric)
- {
- unsigned long rb,rs,prs,r;
-
-@@ -106,7 +106,7 @@ static inline void __tlbiel_pid(unsigned
- trace_tlbie(0, 1, rb, rs, ric, prs, r);
- }
-
--static inline void __tlbie_pid(unsigned long pid, unsigned long ric)
-+static __always_inline void __tlbie_pid(unsigned long pid, unsigned long ric)
- {
- unsigned long rb,rs,prs,r;
-
-@@ -136,7 +136,7 @@ static inline void __tlbiel_lpid(unsigne
- trace_tlbie(lpid, 1, rb, rs, ric, prs, r);
- }
-
--static inline void __tlbie_lpid(unsigned long lpid, unsigned long ric)
-+static __always_inline void __tlbie_lpid(unsigned long lpid, unsigned long ric)
- {
- unsigned long rb,rs,prs,r;
-
-@@ -300,7 +300,7 @@ static inline void fixup_tlbie_lpid(unsi
- /*
- * We use 128 set in radix mode and 256 set in hpt mode.
- */
--static inline void _tlbiel_pid(unsigned long pid, unsigned long ric)
-+static __always_inline void _tlbiel_pid(unsigned long pid, unsigned long ric)
- {
- int set;
-
-@@ -983,7 +983,7 @@ void radix__tlb_flush(struct mmu_gather
- tlb->need_flush_all = 0;
- }
-
--static inline void __radix__flush_tlb_range_psize(struct mm_struct *mm,
-+static __always_inline void __radix__flush_tlb_range_psize(struct mm_struct *mm,
- unsigned long start, unsigned long end,
- int psize, bool also_pwc)
- {
---- a/arch/s390/include/asm/cpacf.h
-+++ b/arch/s390/include/asm/cpacf.h
-@@ -202,7 +202,7 @@ static inline int __cpacf_check_opcode(u
- }
- }
-
--static inline int cpacf_query(unsigned int opcode, cpacf_mask_t *mask)
-+static __always_inline int cpacf_query(unsigned int opcode, cpacf_mask_t *mask)
- {
- if (__cpacf_check_opcode(opcode)) {
- __cpacf_query(opcode, mask);
---- a/arch/x86/Kconfig.debug
-+++ b/arch/x86/Kconfig.debug
-@@ -276,20 +276,6 @@ config CPA_DEBUG
- ---help---
- Do change_page_attr() self-tests every 30 seconds.
-
--config OPTIMIZE_INLINING
-- bool "Allow gcc to uninline functions marked 'inline'"
-- ---help---
-- This option determines if the kernel forces gcc to inline the functions
-- developers have marked 'inline'. Doing so takes away freedom from gcc to
-- do what it thinks is best, which is desirable for the gcc 3.x series of
-- compilers. The gcc 4.x series have a rewritten inlining algorithm and
-- enabling this option will generate a smaller kernel there. Hopefully
-- this algorithm is so good that allowing gcc 4.x and above to make the
-- decision will become the default in the future. Until then this option
-- is there to test gcc for this.
--
-- If unsure, say N.
--
- config DEBUG_ENTRY
- bool "Debug low-level entry code"
- depends on DEBUG_KERNEL
---- a/drivers/mtd/nand/raw/vf610_nfc.c
-+++ b/drivers/mtd/nand/raw/vf610_nfc.c
-@@ -373,7 +373,7 @@ static int vf610_nfc_cmd(struct nand_chi
- {
- const struct nand_op_instr *instr;
- struct vf610_nfc *nfc = chip_to_nfc(chip);
-- int op_id = -1, trfr_sz = 0, offset;
-+ int op_id = -1, trfr_sz = 0, offset = 0;
- u32 col = 0, row = 0, cmd1 = 0, cmd2 = 0, code = 0;
- bool force8bit = false;
-
---- a/lib/Kconfig.debug
-+++ b/lib/Kconfig.debug
-@@ -309,6 +309,20 @@ config HEADERS_CHECK
- exported to $(INSTALL_HDR_PATH) (usually 'usr/include' in
- your build tree), to make sure they're suitable.
-
-+config OPTIMIZE_INLINING
-+ bool "Allow compiler to uninline functions marked 'inline'"
-+ help
-+ This option determines if the kernel forces gcc to inline the functions
-+ developers have marked 'inline'. Doing so takes away freedom from gcc to
-+ do what it thinks is best, which is desirable for the gcc 3.x series of
-+ compilers. The gcc 4.x series have a rewritten inlining algorithm and
-+ enabling this option will generate a smaller kernel there. Hopefully
-+ this algorithm is so good that allowing gcc 4.x and above to make the
-+ decision will become the default in the future. Until then this option
-+ is there to test gcc for this.
-+
-+ If unsure, say N.
-+
- config DEBUG_SECTION_MISMATCH
- bool "Enable full Section mismatch analysis"
- help
---- a/arch/x86/Kconfig
-+++ b/arch/x86/Kconfig
-@@ -306,9 +306,6 @@ config ZONE_DMA32
- config AUDIT_ARCH
- def_bool y if X86_64
-
--config ARCH_SUPPORTS_OPTIMIZED_INLINING
-- def_bool y
--
- config ARCH_SUPPORTS_DEBUG_PAGEALLOC
- def_bool y
-
---- a/include/linux/compiler_types.h
-+++ b/include/linux/compiler_types.h
-@@ -268,8 +268,7 @@ struct ftrace_likely_data {
- * of extern inline functions at link time.
- * A lot of inline functions can cause havoc with function tracing.
- */
--#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
-- !defined(CONFIG_OPTIMIZE_INLINING)
-+#if !defined(CONFIG_OPTIMIZE_INLINING)
- #define inline \
- inline __attribute__((always_inline, unused)) notrace __gnu_inline
- #else
--- a/usr/Makefile
+++ b/usr/Makefile
-@@ -42,20 +42,22 @@ ifneq ($(wildcard $(obj)/$(datafile_d_y)
+@@ -42,21 +42,23 @@ ifneq ($(wildcard $(obj)/$(datafile_d_y)
include $(obj)/$(datafile_d_y)
endif
-$(deps_initramfs): klibcdirs
+$(deps_initramfs_sane): klibcdirs
# We rebuild initramfs_data.cpio if:
- # 1) Any included file is newer then initramfs_data.cpio
+ # 1) Any included file is newer than initramfs_data.cpio
# 2) There are changes in which files are included (added or deleted)
# 3) If gen_init_cpio are newer than initramfs_data.cpio
- # 4) arguments to gen_initramfs.sh changes
+ # 4) Arguments to gen_initramfs.sh changes
-$(obj)/$(datafile_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
+$(obj)/$(datafile_y): $(obj)/gen_init_cpio $(deps_initramfs_sane) klibcdirs
$(Q)$(initramfs) -l $(ramfs-input) > $(obj)/$(datafile_d_y)
$(call if_changed,initfs)
+
--- a/drivers/net/wireless/ti/Kconfig
+++ b/drivers/net/wireless/ti/Kconfig
-@@ -19,7 +19,7 @@ source "drivers/net/wireless/ti/wlcore/K
+@@ -20,7 +20,7 @@ source "drivers/net/wireless/ti/wlcore/K
config WILINK_PLATFORM_DATA
bool "TI WiLink platform data"
---
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
-@@ -1063,9 +1063,6 @@ config FW_ARC
+@@ -1066,9 +1066,6 @@ config FW_ARC
config ARCH_MAY_HAVE_PC_FDC
bool
config CEVT_BCM1480
bool
-@@ -2969,6 +2966,18 @@ choice
+@@ -3040,6 +3037,18 @@ choice
bool "Extend builtin kernel arguments with bootloader arguments"
endchoice
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
-@@ -91,7 +91,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
+@@ -92,7 +92,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
# machines may also. Since BFD is incredibly buggy with respect to
# crossformat linking we rely on the elf2ecoff tool for format conversion.
#
+++ /dev/null
-From: Manuel Lauss <manuel.lauss@gmail.com>
-Subject: [RFC PATCH v4 2/2] MIPS: make FPU emulator optional
-
-This small patch makes the MIPS FPU emulator optional. The kernel
-kills float-users on systems without a hardware FPU by sending a SIGILL.
-
-Disabling the emulator shrinks vmlinux by about 54kBytes (32bit,
-optimizing for size).
-
-Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com>
----
-v4: rediffed because of patch 1/2, should now work with micromips as well
-v3: updated patch description with size savings.
-v2: incorporated changes suggested by Jonas Gorski
- force the fpu emulator on for micromips: relocating the parts
- of the mmips code in the emulator to other areas would be a
- much larger change; I went the cheap route instead with this.
-
- arch/mips/Kbuild | 2 +-
- arch/mips/Kconfig | 14 ++++++++++++++
- arch/mips/include/asm/fpu.h | 5 +++--
- arch/mips/include/asm/fpu_emulator.h | 15 +++++++++++++++
- 4 files changed, 33 insertions(+), 3 deletions(-)
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -2893,6 +2893,20 @@ config MIPS_O32_FP64_SUPPORT
-
- If unsure, say N.
-
-+config MIPS_FPU_EMULATOR
-+ bool "MIPS FPU Emulator"
-+ default y
-+ help
-+ This option lets you disable the built-in MIPS FPU (Coprocessor 1)
-+ emulator, which handles floating-point instructions on processors
-+ without a hardware FPU. It is generally a good idea to keep the
-+ emulator built-in, unless you are perfectly sure you have a
-+ complete soft-float environment. With the emulator disabled, all
-+ users of float operations will be killed with an illegal instr-
-+ uction exception.
-+
-+ Say Y, please.
-+
- config USE_OF
- bool
- select OF
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -323,7 +323,7 @@ OBJCOPYFLAGS += --remove-section=.regin
- head-y := arch/mips/kernel/head.o
-
- libs-y += arch/mips/lib/
--libs-y += arch/mips/math-emu/
-+libs-$(CONFIG_MIPS_FPU_EMULATOR) += arch/mips/math-emu/
-
- # See arch/mips/Kbuild for content of core part of the kernel
- core-y += arch/mips/
---- a/arch/mips/include/asm/fpu.h
-+++ b/arch/mips/include/asm/fpu.h
-@@ -230,8 +230,10 @@ static inline int init_fpu(void)
- /* Restore FRE */
- write_c0_config5(config5);
- enable_fpu_hazard();
-- } else
-+ } else if (IS_ENABLED(CONFIG_MIPS_FPU_EMULATOR))
- fpu_emulator_init_fpu();
-+ else
-+ ret = SIGILL;
-
- return ret;
- }
---- a/arch/mips/include/asm/fpu_emulator.h
-+++ b/arch/mips/include/asm/fpu_emulator.h
-@@ -30,6 +30,7 @@
- #include <asm/local.h>
- #include <asm/processor.h>
-
-+#ifdef CONFIG_MIPS_FPU_EMULATOR
- #ifdef CONFIG_DEBUG_FS
-
- struct mips_fpu_emulator_stats {
-@@ -179,6 +180,16 @@ do { \
- extern int fpu_emulator_cop1Handler(struct pt_regs *xcp,
- struct mips_fpu_struct *ctx, int has_fpu,
- void __user **fault_addr);
-+#else /* no CONFIG_MIPS_FPU_EMULATOR */
-+static inline int fpu_emulator_cop1Handler(struct pt_regs *xcp,
-+ struct mips_fpu_struct *ctx, int has_fpu,
-+ void __user **fault_addr)
-+{
-+ *fault_addr = NULL;
-+ return SIGILL; /* we don't speak MIPS FPU */
-+}
-+#endif /* CONFIG_MIPS_FPU_EMULATOR */
-+
- void force_fcr31_sig(unsigned long fcr31, void __user *fault_addr,
- struct task_struct *tsk);
- int process_fpemu_return(int sig, void __user *fault_addr,
---- a/arch/mips/include/asm/dsemul.h
-+++ b/arch/mips/include/asm/dsemul.h
-@@ -41,6 +41,7 @@ struct task_struct;
- extern int mips_dsemul(struct pt_regs *regs, mips_instruction ir,
- unsigned long branch_pc, unsigned long cont_pc);
-
-+#ifdef CONFIG_MIPS_FPU_EMULATOR
- /**
- * do_dsemulret() - Return from a delay slot 'emulation' frame
- * @xcp: User thread register context.
-@@ -88,5 +89,27 @@ extern bool dsemul_thread_rollback(struc
- * before @mm is freed in order to avoid memory leaks.
- */
- extern void dsemul_mm_cleanup(struct mm_struct *mm);
-+#else
-+static inline bool do_dsemulret(struct pt_regs *xcp)
-+{
-+ return false;
-+}
-+
-+static inline bool dsemul_thread_cleanup(struct task_struct *tsk)
-+{
-+ return false;
-+}
-+
-+static inline bool dsemul_thread_rollback(struct pt_regs *regs)
-+{
-+ return false;
-+}
-+
-+static inline void dsemul_mm_cleanup(struct mm_struct *mm)
-+{
-+
-+}
-+
-+#endif
-
- #endif /* __MIPS_ASM_DSEMUL_H__ */
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
-@@ -94,8 +94,18 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
+@@ -95,8 +95,18 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
cflags-y += -msoft-float
LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */
--- a/arch/mips/kernel/module.c
+++ b/arch/mips/kernel/module.c
-@@ -44,14 +44,221 @@ struct mips_hi16 {
+@@ -32,14 +32,221 @@ struct mips_hi16 {
static LIST_HEAD(dbe_list);
static DEFINE_SPINLOCK(dbe_lock);
static int apply_r_mips_none(struct module *me, u32 *location,
u32 base, Elf_Addr v, bool rela)
-@@ -67,9 +274,40 @@ static int apply_r_mips_32(struct module
+@@ -55,9 +262,40 @@ static int apply_r_mips_32(struct module
return 0;
}
if (v % 4) {
pr_err("module %s: dangerous R_MIPS_26 relocation\n",
me->name);
-@@ -77,13 +315,17 @@ static int apply_r_mips_26(struct module
+@@ -65,13 +303,17 @@ static int apply_r_mips_26(struct module
}
if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
return 0;
}
-@@ -459,9 +701,36 @@ int module_finalize(const Elf_Ehdr *hdr,
+@@ -447,9 +689,36 @@ int module_finalize(const Elf_Ehdr *hdr,
list_add(&me->arch.dbe_list, &dbe_list);
spin_unlock_irq(&dbe_lock);
}
- strnlen_user.o uncached.o
+ strnlen_user.o uncached.o memcmp.o
- obj-y += iomap.o iomap_copy.o
+ obj-y += iomap_copy.o
obj-$(CONFIG_PCI) += iomap-pci.o
--- /dev/null
+++ b/arch/mips/lib/memcmp.c
--- a/arch/arm/kernel/module.c
+++ b/arch/arm/kernel/module.c
-@@ -95,6 +95,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons
+@@ -99,6 +99,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons
return -ENOEXEC;
}
--- a/arch/mips/kernel/machine_kexec.c
+++ b/arch/mips/kernel/machine_kexec.c
-@@ -10,14 +10,11 @@
- #include <linux/mm.h>
+@@ -9,14 +9,11 @@
#include <linux/delay.h>
+ #include <linux/libfdt.h>
+#include <asm/bootinfo.h>
#include <asm/cacheflush.h>
+#include <linux/uaccess.h>
+#include "machine_kexec.h"
- int (*_machine_kexec_prepare)(struct kimage *) = NULL;
+ static unsigned long reboot_code_buffer;
+
+@@ -30,6 +27,101 @@ void (*_crash_smp_send_stop)(void) = NUL
void (*_machine_kexec_shutdown)(void) = NULL;
-@@ -28,6 +25,101 @@ atomic_t kexec_ready_to_reboot = ATOMIC_
- void (*_crash_smp_send_stop)(void) = NULL;
- #endif
+ void (*_machine_crash_shutdown)(struct pt_regs *regs) = NULL;
+static void machine_kexec_print_args(void)
+{
static void kexec_image_info(const struct kimage *kimage)
{
unsigned long i;
-@@ -52,6 +144,18 @@ int
- machine_kexec_prepare(struct kimage *kimage)
- {
+@@ -99,6 +191,18 @@ machine_kexec_prepare(struct kimage *kim
+ #endif
+
kexec_image_info(kimage);
+ /*
+ * Whenever arguments passed from kexec-tools, Init the arguments as
if (_machine_kexec_prepare)
return _machine_kexec_prepare(kimage);
-@@ -89,10 +193,12 @@ machine_kexec(struct kimage *image)
+@@ -212,10 +316,12 @@ machine_kexec(struct kimage *image)
unsigned long *ptr;
reboot_code_buffer =
if (image->type == KEXEC_TYPE_DEFAULT) {
kexec_indirection_page =
-@@ -100,9 +206,19 @@ machine_kexec(struct kimage *image)
+@@ -223,9 +329,19 @@ machine_kexec(struct kimage *image)
} else {
kexec_indirection_page = (unsigned long)&image->head;
}
/*
* The generic kexec code builds a page list with physical
-@@ -124,15 +240,16 @@ machine_kexec(struct kimage *image)
- /*
- * we do not want to be bothered.
- */
-+ pr_info("Before irq_disable.\n");
- local_irq_disable();
-
-- printk("Will call new kernel at %08lx\n", image->start);
-- printk("Bye ...\n");
-+ pr_info("Will call new kernel at %08lx\n", image->start);
-+ pr_info("Bye ...\n");
- __flush_cache_all();
+@@ -256,7 +372,7 @@ machine_kexec(struct kimage *image)
#ifdef CONFIG_SMP
/* All secondary cpus now may jump to kexec_wait cycle */
relocated_kexec_smp_wait = reboot_code_buffer +
+#endif
--- a/arch/mips/kernel/relocate_kernel.S
+++ b/arch/mips/kernel/relocate_kernel.S
-@@ -12,8 +12,9 @@
+@@ -10,8 +10,9 @@
#include <asm/mipsregs.h>
#include <asm/stackframe.h>
#include <asm/addrspace.h>
PTR_L a0, arg0
PTR_L a1, arg1
PTR_L a2, arg2
-@@ -98,7 +99,7 @@ done:
+@@ -96,7 +97,7 @@ done:
#endif
/* jump to kexec_start_address */
j s1
#ifdef CONFIG_SMP
/*
-@@ -184,9 +185,15 @@ kexec_indirection_page:
+@@ -182,9 +183,15 @@ kexec_indirection_page:
PTR 0
.size kexec_indirection_page, PTRSIZE
--- a/arch/arc/kernel/head.S
+++ b/arch/arc/kernel/head.S
-@@ -59,6 +59,16 @@
+@@ -61,6 +61,16 @@
#endif
.endm
;----------------------------------------------------------------
--- a/arch/arc/kernel/setup.c
+++ b/arch/arc/kernel/setup.c
-@@ -526,7 +526,7 @@ void __init handle_uboot_args(void)
+@@ -529,7 +529,7 @@ void __init handle_uboot_args(void)
ignore_uboot_args:
if (use_embedded_dtb) {
if (!machine_desc)
panic("Embedded DT invalid\n");
}
-@@ -542,6 +542,8 @@ ignore_uboot_args:
+@@ -545,6 +545,8 @@ ignore_uboot_args:
}
}
handle_uboot_args();
--- a/arch/arc/kernel/vmlinux.lds.S
+++ b/arch/arc/kernel/vmlinux.lds.S
-@@ -30,6 +30,19 @@ SECTIONS
+@@ -27,6 +27,19 @@ SECTIONS
. = CONFIG_LINUX_LINK_BASE;
--- a/arch/arc/kernel/unaligned.c
+++ b/arch/arc/kernel/unaligned.c
-@@ -206,7 +206,7 @@ int misaligned_fixup(unsigned long addre
+@@ -202,7 +202,7 @@ int misaligned_fixup(unsigned long addre
char buf[TASK_COMM_LEN];
/* handle user mode only and only if enabled by sysadmin */
+++ /dev/null
-From 203f17906ff45705fbdaa0430dbbc71142c2640f Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sat, 8 Dec 2018 21:45:53 +0100
-Subject: [PATCH 1/3] MIPS: Compile post DMA flush only when needed
-
-dma_sync_phys() is only called for some CPUs when a mapping is removed.
-Add ARCH_HAS_SYNC_DMA_FOR_CPU only for the CPUs listed in
-cpu_needs_post_dma_flush() which need this extra call and do not compile
-this code in for other CPUs. We need this for R10000, R12000, BMIPS5000
-CPUs and CPUs supporting MAAR which was introduced in MIPS32r5.
-
-This will hopefully improve the performance of the not affected devices.
-
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- arch/mips/Kconfig | 6 +++++-
- arch/mips/mm/dma-noncoherent.c | 2 ++
- 2 files changed, 7 insertions(+), 1 deletion(-)
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -1117,7 +1117,6 @@ config DMA_PERDEV_COHERENT
- config DMA_NONCOHERENT
- bool
- select ARCH_HAS_SYNC_DMA_FOR_DEVICE
-- select ARCH_HAS_SYNC_DMA_FOR_CPU
- select NEED_DMA_MAP_STATE
- select DMA_NONCOHERENT_MMAP
- select DMA_NONCOHERENT_CACHE_SYNC
-@@ -1898,9 +1897,11 @@ config SYS_HAS_CPU_MIPS32_R3_5
-
- config SYS_HAS_CPU_MIPS32_R5
- bool
-+ select ARCH_HAS_SYNC_DMA_FOR_CPU
-
- config SYS_HAS_CPU_MIPS32_R6
- bool
-+ select ARCH_HAS_SYNC_DMA_FOR_CPU
-
- config SYS_HAS_CPU_MIPS64_R1
- bool
-@@ -1910,6 +1911,7 @@ config SYS_HAS_CPU_MIPS64_R2
-
- config SYS_HAS_CPU_MIPS64_R6
- bool
-+ select ARCH_HAS_SYNC_DMA_FOR_CPU
-
- config SYS_HAS_CPU_R3000
- bool
-@@ -1946,6 +1948,7 @@ config SYS_HAS_CPU_R8000
-
- config SYS_HAS_CPU_R10000
- bool
-+ select ARCH_HAS_SYNC_DMA_FOR_CPU
-
- config SYS_HAS_CPU_RM7000
- bool
-@@ -1974,6 +1977,7 @@ config SYS_HAS_CPU_BMIPS4380
- config SYS_HAS_CPU_BMIPS5000
- bool
- select SYS_HAS_CPU_BMIPS
-+ select ARCH_HAS_SYNC_DMA_FOR_CPU
-
- config SYS_HAS_CPU_XLR
- bool
---- a/arch/mips/mm/dma-noncoherent.c
-+++ b/arch/mips/mm/dma-noncoherent.c
-@@ -191,12 +191,14 @@ void arch_sync_dma_for_device(struct dev
- dma_sync_phys(paddr, size, dir);
- }
-
-+#ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU
- void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr,
- size_t size, enum dma_data_direction dir)
- {
- if (cpu_needs_post_dma_flush(dev))
- dma_sync_phys(paddr, size, dir);
- }
-+#endif
-
- void arch_dma_cache_sync(struct device *dev, void *vaddr, size_t size,
- enum dma_data_direction direction)
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
-@@ -197,7 +197,7 @@ config PPC
- select HAVE_IOREMAP_PROT
- select HAVE_IRQ_EXIT_ON_IRQ_STACK
+@@ -204,7 +204,7 @@ config PPC
select HAVE_KERNEL_GZIP
-- select HAVE_KERNEL_XZ if PPC_BOOK3S
-+ select HAVE_KERNEL_XZ if PPC_BOOK3S || PPC_85xx
+ select HAVE_KERNEL_LZMA if DEFAULT_UIMAGE
+ select HAVE_KERNEL_LZO if DEFAULT_UIMAGE
+- select HAVE_KERNEL_XZ if PPC_BOOK3S || 44x
++ select HAVE_KERNEL_XZ if PPC_BOOK3S || 44x || PPC_85xx
select HAVE_KPROBES
select HAVE_KPROBES_ON_FTRACE
select HAVE_KRETPROBES
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -11,6 +11,23 @@ menuconfig MTD
+@@ -12,6 +12,23 @@ menuconfig MTD
if MTD
depends on m
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -29,10 +29,12 @@
+@@ -15,10 +15,12 @@
#include <linux/kmod.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
/* Our partition linked list */
static LIST_HEAD(mtd_partitions);
-@@ -52,6 +54,8 @@ struct mtd_part {
+@@ -38,6 +40,8 @@ struct mtd_part {
struct list_head list;
};
/*
* Given a pointer to the MTD object in the mtd_part structure, we can retrieve
* the pointer to that structure.
-@@ -626,6 +630,7 @@ int mtd_add_partition(struct mtd_info *p
+@@ -612,6 +616,7 @@ int mtd_add_partition(struct mtd_info *p
if (ret)
goto err_remove_part;
mtd_add_partition_attrs(new);
return 0;
-@@ -712,6 +717,29 @@ int mtd_del_partition(struct mtd_info *m
+@@ -698,6 +703,29 @@ int mtd_del_partition(struct mtd_info *m
}
EXPORT_SYMBOL_GPL(mtd_del_partition);
/*
* This function, given a master MTD object and a partition table, creates
* and registers slave MTD objects which are bound to the master according to
-@@ -752,6 +780,7 @@ int add_mtd_partitions(struct mtd_info *
+@@ -738,6 +766,7 @@ int add_mtd_partitions(struct mtd_info *
goto err_del_partitions;
}
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -55,6 +55,10 @@ struct mtd_part {
+@@ -41,6 +41,10 @@ struct mtd_part {
};
static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part);
/*
* Given a pointer to the MTD object in the mtd_part structure, we can retrieve
-@@ -717,6 +721,36 @@ int mtd_del_partition(struct mtd_info *m
+@@ -703,6 +707,36 @@ int mtd_del_partition(struct mtd_info *m
}
EXPORT_SYMBOL_GPL(mtd_del_partition);
#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
#else
-@@ -1066,6 +1100,61 @@ void mtd_part_parser_cleanup(struct mtd_
+@@ -1052,6 +1086,61 @@ void mtd_part_parser_cleanup(struct mtd_
}
}
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -759,6 +759,7 @@ run_parsers_by_type(struct mtd_part *sla
+@@ -745,6 +745,7 @@ run_parsers_by_type(struct mtd_part *sla
static void split_firmware(struct mtd_info *master, struct mtd_part *part)
{
}
static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part)
-@@ -768,6 +769,12 @@ static void mtd_partition_split(struct m
+@@ -754,6 +755,12 @@ static void mtd_partition_split(struct m
if (rootfs_found)
return;
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -26,6 +26,8 @@ config MTD_SPLIT_FIRMWARE_NAME
+@@ -27,6 +27,8 @@ config MTD_SPLIT_FIRMWARE_NAME
depends on MTD_SPLIT_FIRMWARE
default "firmware"
config MTD_TESTS
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
-@@ -7,6 +7,8 @@
- obj-$(CONFIG_MTD) += mtd.o
- mtd-y := mtdcore.o mtdsuper.o mtdconcat.o mtdpart.o mtdchar.o
+@@ -9,6 +9,8 @@ mtd-y := mtdcore.o mtdsuper.o mtdconc
+
+ obj-y += parsers/
+obj-$(CONFIG_MTD_SPLIT) += mtdsplit/
+
- obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
- obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
- obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
+ # 'Users' - code which presents functionality to userspace.
+ obj-$(CONFIG_MTD_BLKDEVS) += mtd_blkdevs.o
+ obj-$(CONFIG_MTD_BLOCK) += mtdblock.o
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -1179,6 +1179,24 @@ int mtd_is_partition(const struct mtd_in
+@@ -1165,6 +1165,24 @@ int mtd_is_partition(const struct mtd_in
}
EXPORT_SYMBOL_GPL(mtd_is_partition);
{
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
-@@ -507,6 +507,24 @@ static inline void mtd_align_erase_req(s
+@@ -504,6 +504,24 @@ static inline void mtd_align_erase_req(s
req->len += mtd->erasesize - mod;
}
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -36,6 +36,8 @@
+@@ -22,6 +22,8 @@
#include "mtdcore.h"
#include "mtdsplit/mtdsplit.h"
/* Our partition linked list */
static LIST_HEAD(mtd_partitions);
static DEFINE_MUTEX(mtd_partitions_mutex);
-@@ -220,6 +222,53 @@ static int part_erase(struct mtd_info *m
+@@ -206,6 +208,53 @@ static int part_erase(struct mtd_info *m
{
struct mtd_part *part = mtd_to_part(mtd);
int ret;
instr->addr += part->offset;
ret = part->parent->_erase(part->parent, instr);
-@@ -227,6 +276,24 @@ static int part_erase(struct mtd_info *m
+@@ -213,6 +262,24 @@ static int part_erase(struct mtd_info *m
instr->fail_addr -= part->offset;
instr->addr -= part->offset;
return ret;
}
-@@ -539,19 +606,22 @@ static struct mtd_part *allocate_partiti
+@@ -525,19 +592,22 @@ static struct mtd_part *allocate_partiti
remainder = do_div(tmp, wr_alignment);
if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
/* Doesn't start on a boundary of major erase size */
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -306,7 +306,16 @@ static int part_lock(struct mtd_info *mt
+@@ -292,7 +292,16 @@ static int part_lock(struct mtd_info *mt
static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
{
struct mtd_part *part = mtd_to_part(mtd);
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -289,9 +289,16 @@ static int parse_redboot_partitions(stru
- return ret;
- }
+--- a/drivers/mtd/parsers/redboot.c
++++ b/drivers/mtd/parsers/redboot.c
+@@ -300,6 +300,7 @@ static int parse_redboot_partitions(stru
-+static const struct of_device_id redboot_parser_of_match_table[] = {
+ static const struct of_device_id mtd_parser_redboot_of_match_table[] = {
+ { .compatible = "redboot-fis" },
+ { .compatible = "ecoscentric,redboot-fis-partitions" },
-+ {},
-+};
-+MODULE_DEVICE_TABLE(of, redboot_parser_of_match_table);
-+
- static struct mtd_part_parser redboot_parser = {
- .parse_fn = parse_redboot_partitions,
- .name = "RedBoot",
-+ .of_match_table = redboot_parser_of_match_table,
+ {},
};
- module_mtd_part_parser(redboot_parser);
-
+ MODULE_DEVICE_TABLE(of, mtd_parser_redboot_of_match_table);
drivers/mtd/redboot.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
---- a/drivers/mtd/redboot.c
-+++ b/drivers/mtd/redboot.c
-@@ -265,14 +265,21 @@ static int parse_redboot_partitions(stru
+--- a/drivers/mtd/parsers/redboot.c
++++ b/drivers/mtd/parsers/redboot.c
+@@ -274,14 +274,21 @@ static int parse_redboot_partitions(stru
#endif
names += strlen(names)+1;
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -177,6 +177,22 @@ menu "Partition parsers"
+@@ -46,6 +46,22 @@ menu "Partition parsers"
source "drivers/mtd/parsers/Kconfig"
endmenu
comment "User Modules And Translation Layers"
#
---- a/drivers/mtd/Makefile
-+++ b/drivers/mtd/Makefile
-@@ -16,6 +16,7 @@ obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
- obj-$(CONFIG_MTD_AR7_PARTS) += ar7part.o
- obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o
- obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm47xxpart.o
-+obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
- obj-y += parsers/
-
- # 'Users' - code which presents functionality to userspace.
+--- a/drivers/mtd/parsers/Makefile
++++ b/drivers/mtd/parsers/Makefile
+@@ -9,3 +9,4 @@ obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
+ obj-$(CONFIG_MTD_PARSER_TRX) += parser_trx.o
+ obj-$(CONFIG_MTD_SHARPSL_PARTS) += sharpslpart.o
+ obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
++obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o
--- a/drivers/mtd/parsers/parser_trx.c
+++ b/drivers/mtd/parsers/parser_trx.c
-@@ -29,6 +29,33 @@ struct trx_header {
+@@ -25,6 +25,33 @@ struct trx_header {
uint32_t offset[3];
} __packed;
static const char *parser_trx_data_part_name(struct mtd_info *master,
size_t offset)
{
-@@ -83,21 +110,21 @@ static int parser_trx_parse(struct mtd_i
+@@ -79,21 +106,21 @@ static int parser_trx_parse(struct mtd_i
if (trx.offset[2]) {
part = &parts[curr_part++];
part->name = "loader";
drivers/mtd/bcm47xxpart.c | 10 ++++++++++
1 file changed, 10 insertions(+)
---- a/drivers/mtd/bcm47xxpart.c
-+++ b/drivers/mtd/bcm47xxpart.c
-@@ -39,6 +39,7 @@
+--- a/drivers/mtd/parsers/bcm47xxpart.c
++++ b/drivers/mtd/parsers/bcm47xxpart.c
+@@ -35,6 +35,7 @@
#define NVRAM_HEADER 0x48534C46 /* FLSH */
#define POT_MAGIC1 0x54544f50 /* POTT */
#define POT_MAGIC2 0x504f /* OP */
#define ML_MAGIC1 0x39685a42
#define ML_MAGIC2 0x26594131
#define TRX_MAGIC 0x30524448
-@@ -182,6 +183,15 @@ static int bcm47xxpart_parse(struct mtd_
+@@ -178,6 +179,15 @@ static int bcm47xxpart_parse(struct mtd_
MTD_WRITEABLE);
continue;
}
return dev;
err_destroy_mutex:
-@@ -379,7 +387,7 @@ static int block2mtd_setup2(const char *
+@@ -381,7 +389,7 @@ static int block2mtd_setup2(const char *
/* 80 for device, 12 for erase size, 80 for name, 8 for timeout */
char buf[80 + 12 + 80 + 8];
char *str = buf;
char *name;
size_t erase_size = PAGE_SIZE;
unsigned long timeout = MTD_DEFAULT_TIMEOUT;
-@@ -393,7 +401,7 @@ static int block2mtd_setup2(const char *
+@@ -395,7 +403,7 @@ static int block2mtd_setup2(const char *
strcpy(str, val);
kill_final_newline(str);
token[i] = strsep(&str, ",");
if (str) {
-@@ -419,8 +427,10 @@ static int block2mtd_setup2(const char *
+@@ -421,8 +429,10 @@ static int block2mtd_setup2(const char *
return 0;
}
}
return 0;
}
-@@ -454,7 +464,7 @@ static int block2mtd_setup(const char *v
+@@ -456,7 +466,7 @@ static int block2mtd_setup(const char *v
module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
--- a/drivers/mtd/devices/block2mtd.c
+++ b/drivers/mtd/devices/block2mtd.c
-@@ -387,7 +387,7 @@ static int block2mtd_setup2(const char *
+@@ -389,7 +389,7 @@ static int block2mtd_setup2(const char *
/* 80 for device, 12 for erase size, 80 for name, 8 for timeout */
char buf[80 + 12 + 80 + 8];
char *str = buf;
char *name;
size_t erase_size = PAGE_SIZE;
unsigned long timeout = MTD_DEFAULT_TIMEOUT;
-@@ -401,7 +401,7 @@ static int block2mtd_setup2(const char *
+@@ -403,7 +403,7 @@ static int block2mtd_setup2(const char *
strcpy(str, val);
kill_final_newline(str);
token[i] = strsep(&str, ",");
if (str) {
-@@ -430,6 +430,9 @@ static int block2mtd_setup2(const char *
+@@ -432,6 +432,9 @@ static int block2mtd_setup2(const char *
if (token[2] && (strlen(token[2]) + 1 > 80))
pr_err("mtd device name too long\n");
add_device(name, erase_size, token[2], timeout);
return 0;
-@@ -464,7 +467,7 @@ static int block2mtd_setup(const char *v
+@@ -466,7 +469,7 @@ static int block2mtd_setup(const char *v
module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1457,7 +1457,7 @@ static int spi_nor_write(struct mtd_info
+@@ -2704,7 +2704,7 @@ static int spi_nor_write(struct mtd_info
write_enable(nor);
- ret = nor->write(nor, addr, page_remain, buf + i);
+ ret = spi_nor_write_data(nor, addr, page_remain, buf + i);
- if (ret < 0)
+ if (ret <= 0)
goto write_err;
written = ret;
-@@ -1466,13 +1466,6 @@ static int spi_nor_write(struct mtd_info
- goto write_err;
- *retlen += written;
- i += written;
-- if (written != page_remain) {
-- dev_err(nor->dev,
-- "While writing %zu bytes written %zd bytes\n",
-- page_remain, written);
-- ret = -EIO;
-- goto write_err;
-- }
- }
-
- write_err:
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -812,7 +812,7 @@ static int get_chip(struct map_info *map
+@@ -910,7 +910,7 @@ static int get_chip(struct map_info *map
return 0;
case FL_ERASING:
1 file changed, 1 insertion(+)
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -1838,6 +1838,7 @@ static int __xipram do_write_buffer(stru
+@@ -2055,6 +2055,7 @@ static int __xipram do_write_buffer(stru
/* Write Buffer Load */
map_write(map, CMD(0x25), cmd_adr);
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -2735,6 +2735,7 @@ static int spi_nor_init(struct spi_nor *
+@@ -4884,6 +4884,7 @@ int spi_nor_scan(struct spi_nor *nor, co
*/
if (JEDEC_MFR(nor->info) == SNOR_MFR_ATMEL ||
JEDEC_MFR(nor->info) == SNOR_MFR_INTEL ||
+ JEDEC_MFR(nor->info) == SNOR_MFR_MACRONIX ||
JEDEC_MFR(nor->info) == SNOR_MFR_SST ||
- nor->info->flags & SPI_NOR_HAS_LOCK) {
- write_enable(nor);
+ nor->info->flags & SPI_NOR_HAS_LOCK)
+ nor->clear_sr_bp = spi_nor_clear_sr_bp;
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -2737,6 +2737,7 @@ static int spi_nor_init(struct spi_nor *
+@@ -4397,6 +4397,7 @@ static void st_micron_set_default_init(s
+
+ static void winbond_set_default_init(struct spi_nor *nor)
+ {
++ nor->flags |= SNOR_F_HAS_LOCK;
+ nor->params.set_4byte = winbond_set_4byte;
+ }
+
+@@ -4886,6 +4887,7 @@ int spi_nor_scan(struct spi_nor *nor, co
JEDEC_MFR(nor->info) == SNOR_MFR_INTEL ||
JEDEC_MFR(nor->info) == SNOR_MFR_MACRONIX ||
JEDEC_MFR(nor->info) == SNOR_MFR_SST ||
+ JEDEC_MFR(nor->info) == SNOR_MFR_WINBOND ||
- nor->info->flags & SPI_NOR_HAS_LOCK) {
- write_enable(nor);
- write_sr(nor, 0);
-@@ -2873,7 +2874,8 @@ int spi_nor_scan(struct spi_nor *nor, co
+ nor->info->flags & SPI_NOR_HAS_LOCK)
+ nor->clear_sr_bp = spi_nor_clear_sr_bp;
- /* NOR protection support for STmicro/Micron chips and similar */
- if (JEDEC_MFR(info) == SNOR_MFR_MICRON ||
-- info->flags & SPI_NOR_HAS_LOCK) {
-+ JEDEC_MFR(info) == SNOR_MFR_WINBOND ||
-+ info->flags & SPI_NOR_HAS_LOCK) {
- nor->flash_lock = stm_lock;
- nor->flash_unlock = stm_unlock;
- nor->flash_is_locked = stm_is_locked;
--- a/drivers/mtd/spi-nor/Kconfig
+++ b/drivers/mtd/spi-nor/Kconfig
-@@ -39,6 +39,17 @@ config SPI_ASPEED_SMC
+@@ -34,6 +34,17 @@ config SPI_ASPEED_SMC
and support for the SPI flash memory controller (SPI) for
the host firmware. The implementation only supports SPI NOR.
+ Any flash chip larger than the size specified in this option will
+ not use 4K sectors.
+
- config SPI_ATMEL_QUADSPI
- tristate "Atmel Quad SPI Controller"
- depends on ARCH_AT91 || (ARM && COMPILE_TEST && !ARCH_EBSA110)
+ config SPI_CADENCE_QUADSPI
+ tristate "Cadence Quad SPI controller"
+ depends on OF && (ARM || ARM64 || COMPILE_TEST)
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -2649,10 +2649,12 @@ static int spi_nor_select_erase(struct s
+@@ -4464,6 +4464,7 @@ static void spi_nor_info_init_params(str
+ struct spi_nor_erase_map *map = ¶ms->erase_map;
+ const struct flash_info *info = nor->info;
+ struct device_node *np = spi_nor_get_flash_node(nor);
++ struct mtd_info *mtd = &nor->mtd;
+ u8 i, erase_mask;
- #ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
- /* prefer "small sector" erase if possible */
-- if (info->flags & SECT_4K) {
-+ if ((info->flags & SECT_4K) && (mtd->size <=
-+ CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {
- nor->erase_opcode = SPINOR_OP_BE_4K;
- mtd->erasesize = 4096;
-- } else if (info->flags & SECT_4K_PMC) {
-+ } else if ((info->flags & SECT_4K_PMC) && (mtd->size <=
+ /* Initialize legacy flash parameters and settings. */
+@@ -4527,6 +4528,21 @@ static void spi_nor_info_init_params(str
+ */
+ erase_mask = 0;
+ i = 0;
++#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
++ if ((info->flags & SECT_4K_PMC) && (mtd->size <=
+ CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {
- nor->erase_opcode = SPINOR_OP_BE_4K_PMC;
- mtd->erasesize = 4096;
- } else
++ erase_mask |= BIT(i);
++ spi_nor_set_erase_type(&map->erase_type[i], 4096u,
++ SPINOR_OP_BE_4K_PMC);
++ i++;
++ } else if ((info->flags & SECT_4K) && (mtd->size <=
++ CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT * 1024)) {
++ erase_mask |= BIT(i);
++ spi_nor_set_erase_type(&map->erase_type[i], 4096u,
++ SPINOR_OP_BE_4K);
++ i++;
++ }
++#else
+ if (info->flags & SECT_4K_PMC) {
+ erase_mask |= BIT(i);
+ spi_nor_set_erase_type(&map->erase_type[i], 4096u,
+@@ -4538,6 +4554,7 @@ static void spi_nor_info_init_params(str
+ SPINOR_OP_BE_4K);
+ i++;
+ }
++#endif
+ erase_mask |= BIT(i);
+ spi_nor_set_erase_type(&map->erase_type[i], info->sector_size,
+ SPINOR_OP_SE);
+++ /dev/null
-From: Robert Marko <robimarko@gmail.com>
-To: linux-mtd@lists.infradead.org
-Subject: mtd: spi-nor: Add Winbond w25q128jv support
-Date: Mon, 25 Jun 2018 13:17:48 +0200
-
-Datasheet:
-http://www.winbond.com/resource-files/w25q128jv%20revf%2003272018%20plus.pdf
-
-Testing done on Mikrotik Routerboard wAP R board.
-It does not support Dual or Quad modes.
-
-Signed-off-by: Robert Marko <robimarko@gmail.com>
----
-
-Changes in v2:
- - Correct the title
----
- drivers/mtd/spi-nor/spi-nor.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1241,6 +1241,11 @@ static const struct flash_info spi_nor_i
- SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
- SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
- },
-+ {
-+ "w25q128jv", INFO(0xef7018, 0, 64 * 1024, 256,
-+ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
-+ SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
-+ },
- { "w25q80", INFO(0xef5014, 0, 64 * 1024, 16, SECT_4K) },
- { "w25q80bl", INFO(0xef4014, 0, 64 * 1024, 16, SECT_4K) },
- { "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) },
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -994,6 +994,7 @@ static const struct flash_info spi_nor_i
+@@ -2177,6 +2177,7 @@ static const struct flash_info spi_nor_i
{ "en25q32b", INFO(0x1c3016, 0, 64 * 1024, 64, 0) },
{ "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
{ "en25q64", INFO(0x1c3017, 0, 64 * 1024, 128, SECT_4K) },
+ { "en25q128", INFO(0x1c3018, 0, 64 * 1024, 256, SECT_4K) },
+ { "en25q80a", INFO(0x1c3014, 0, 64 * 1024, 16,
+ SECT_4K | SPI_NOR_DUAL_READ) },
{ "en25qh32", INFO(0x1c7016, 0, 64 * 1024, 64, 0) },
- { "en25qh128", INFO(0x1c7018, 0, 64 * 1024, 256, 0) },
- { "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512, 0) },
+++ /dev/null
-From: André Valentin <avalentin@marcant.net>
-Subject: linux/mtd: add id for mx25u3235f needed by ZyXEL NBG6817
-
-Signed-off-by: André Valentin <avalentin@marcant.net>
----
- drivers/mtd/spi-nor/spi-nor.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1083,6 +1083,7 @@ static const struct flash_info spi_nor_i
- { "mx25l3205d", INFO(0xc22016, 0, 64 * 1024, 64, SECT_4K) },
- { "mx25l3255e", INFO(0xc29e16, 0, 64 * 1024, 64, SECT_4K) },
- { "mx25l6405d", INFO(0xc22017, 0, 64 * 1024, 128, SECT_4K) },
-+ { "mx25u3235f", INFO(0xc22536, 0, 64 * 1024, 64, 0) },
- { "mx25u2033e", INFO(0xc22532, 0, 64 * 1024, 4, SECT_4K) },
- { "mx25u4035", INFO(0xc22533, 0, 64 * 1024, 8, SECT_4K) },
- { "mx25u8035", INFO(0xc22534, 0, 64 * 1024, 16, SECT_4K) },
+++ /dev/null
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -996,6 +996,7 @@ static const struct flash_info spi_nor_i
- { "en25q64", INFO(0x1c3017, 0, 64 * 1024, 128, SECT_4K) },
- { "en25q128", INFO(0x1c3018, 0, 64 * 1024, 256, SECT_4K) },
- { "en25qh32", INFO(0x1c7016, 0, 64 * 1024, 64, 0) },
-+ { "en25qh64", INFO(0x1c7017, 0, 64 * 1024, 128, 0) },
- { "en25qh128", INFO(0x1c7018, 0, 64 * 1024, 256, 0) },
- { "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512, 0) },
- { "en25s64", INFO(0x1c3817, 0, 64 * 1024, 128, SECT_4K) },
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1273,6 +1273,9 @@ static const struct flash_info spi_nor_i
+@@ -2504,6 +2504,9 @@ static const struct flash_info spi_nor_i
/* XMC (Wuhan Xinxin Semiconductor Manufacturing Corp.) */
{ "XM25QH64A", INFO(0x207017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
{ "XM25QH128A", INFO(0x207018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
-@@ -41,6 +41,7 @@
+@@ -27,6 +27,7 @@
#include <linux/reboot.h>
#include <linux/leds.h>
#include <linux/debugfs.h>
+#include <linux/root_dev.h>
+ #include <linux/nvmem-provider.h>
#include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
-@@ -593,6 +594,15 @@ int add_mtd_device(struct mtd_info *mtd)
+@@ -698,6 +699,15 @@ int add_mtd_device(struct mtd_info *mtd)
of this try_ nonsense, and no bitching about it
either. :) */
__module_get(THIS_MODULE);
+
return 0;
- fail_added:
+ fail_nvmem_add:
--- a/drivers/mtd/ubi/build.c
+++ b/drivers/mtd/ubi/build.c
-@@ -1181,6 +1181,73 @@ static struct mtd_info * __init open_mtd
+@@ -1168,6 +1168,73 @@ static struct mtd_info * __init open_mtd
return mtd;
}
static int __init ubi_init(void)
{
int err, i, k;
-@@ -1264,6 +1331,12 @@ static int __init ubi_init(void)
+@@ -1251,6 +1318,12 @@ static int __init ubi_init(void)
}
}
--- a/drivers/mtd/ubi/block.c
+++ b/drivers/mtd/ubi/block.c
-@@ -633,6 +633,44 @@ static void __init ubiblock_create_from_
+@@ -652,6 +652,44 @@ static void __init ubiblock_create_from_
}
}
static void ubiblock_remove_all(void)
{
struct ubiblock *next;
-@@ -665,6 +703,10 @@ int __init ubiblock_init(void)
+@@ -684,6 +722,10 @@ int __init ubiblock_init(void)
*/
ubiblock_create_from_param();
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
-@@ -427,7 +427,28 @@ retry:
+@@ -460,7 +460,28 @@ retry:
out:
put_page(page);
}
#ifdef CONFIG_ROOT_NFS
#define NFSROOT_TIMEOUT_MIN 5
-@@ -521,6 +542,10 @@ void __init mount_root(void)
+@@ -554,6 +575,10 @@ void __init mount_root(void)
change_floppy("root floppy");
}
#endif
--- a/drivers/mtd/ubi/block.c
+++ b/drivers/mtd/ubi/block.c
-@@ -50,6 +50,7 @@
+@@ -42,6 +42,7 @@
#include <linux/scatterlist.h>
#include <linux/idr.h>
#include <asm/div64.h>
#include "ubi-media.h"
#include "ubi.h"
-@@ -445,6 +446,15 @@ int ubiblock_create(struct ubi_volume_in
+@@ -458,6 +459,15 @@ int ubiblock_create(struct ubi_volume_in
dev_info(disk_to_dev(dev->gd), "created from ubi%d:%d(%s)",
dev->ubi_num, dev->vol_id, vi->name);
mutex_unlock(&devices_mutex);
--- a/drivers/mtd/ubi/attach.c
+++ b/drivers/mtd/ubi/attach.c
-@@ -939,6 +939,13 @@ static bool vol_ignored(int vol_id)
+@@ -926,6 +926,13 @@ static bool vol_ignored(int vol_id)
#endif
}
/**
* scan_peb - scan and process UBI headers of a PEB.
* @ubi: UBI device description object
-@@ -971,9 +978,21 @@ static int scan_peb(struct ubi_device *u
+@@ -958,9 +965,21 @@ static int scan_peb(struct ubi_device *u
return 0;
}
break;
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
-@@ -789,6 +789,7 @@ struct ubi_attach_info {
+@@ -776,6 +776,7 @@ struct ubi_attach_info {
int mean_ec;
uint64_t ec_sum;
int ec_count;
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
-@@ -938,6 +938,44 @@ out_unlock:
+@@ -1049,6 +1049,44 @@ out_unlock:
}
EXPORT_SYMBOL_GPL(get_mtd_device_nm);
mutex_lock(&mtd_table_mutex);
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
-@@ -589,6 +589,8 @@ extern struct mtd_info *get_mtd_device(s
+@@ -586,6 +586,8 @@ extern struct mtd_info *get_mtd_device(s
extern int __get_mtd_device(struct mtd_info *mtd);
extern void __put_mtd_device(struct mtd_info *mtd);
extern struct mtd_info *get_mtd_device_nm(const char *name);
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
-@@ -374,4 +374,6 @@ source "drivers/mtd/spi-nor/Kconfig"
+@@ -244,4 +244,6 @@ source "drivers/mtd/ubi/Kconfig"
- source "drivers/mtd/ubi/Kconfig"
+ source "drivers/mtd/hyperbus/Kconfig"
+source "drivers/mtd/composite/Kconfig"
+
endif # MTD
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
-@@ -39,3 +39,6 @@ obj-y += chips/ lpddr/ maps/ devices/ n
-
+@@ -32,3 +32,6 @@ obj-y += chips/ lpddr/ maps/ devices/ n
obj-$(CONFIG_MTD_SPI_NOR) += spi-nor/
obj-$(CONFIG_MTD_UBI) += ubi/
+ obj-$(CONFIG_MTD_HYPERBUS) += hyperbus/
+
+# Composite drivers must be loaded last
-+obj-y += composite/
++obj-y += composite/
--- /dev/null
+++ b/drivers/mtd/composite/Kconfig
@@ -0,0 +1,12 @@
--- a/fs/jffs2/Kconfig
+++ b/fs/jffs2/Kconfig
-@@ -135,6 +135,15 @@ config JFFS2_LZO
+@@ -136,6 +136,15 @@ config JFFS2_LZO
This feature was added in July, 2007. Say 'N' if you need
compatibility with older bootloaders or kernels.
+}
--- a/fs/jffs2/super.c
+++ b/fs/jffs2/super.c
-@@ -374,14 +374,41 @@ static int __init init_jffs2_fs(void)
+@@ -360,14 +360,41 @@ static int __init init_jffs2_fs(void)
BUILD_BUG_ON(sizeof(struct jffs2_raw_inode) != 68);
BUILD_BUG_ON(sizeof(struct jffs2_raw_summary) != 32);
#define JFFS2_NODE_ACCURATE 0x2000
--- a/lib/Kconfig
+++ b/lib/Kconfig
-@@ -278,6 +278,12 @@ config ZSTD_DECOMPRESS
+@@ -303,6 +303,12 @@ config ZSTD_DECOMPRESS
source "lib/xz/Kconfig"
ifdef CONFIG_FUNCTION_TRACER
ORIG_CFLAGS := $(KBUILD_CFLAGS)
KBUILD_CFLAGS = $(subst $(CC_FLAGS_FTRACE),,$(ORIG_CFLAGS))
-@@ -139,6 +149,8 @@ obj-$(CONFIG_ZSTD_COMPRESS) += zstd/
+@@ -150,6 +160,8 @@ obj-$(CONFIG_ZSTD_COMPRESS) += zstd/
obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd/
obj-$(CONFIG_XZ_DEC) += xz/
obj-$(CONFIG_RAID6_PQ) += raid6/
if (ret < 0)
goto out;
-@@ -561,6 +567,17 @@ full_scan:
+@@ -564,6 +570,17 @@ full_scan:
return err;
}
--- a/fs/ubifs/Kconfig
+++ b/fs/ubifs/Kconfig
-@@ -85,3 +85,16 @@ config UBIFS_FS_SECURITY
- the extended attribute support in advance.
+@@ -85,6 +85,19 @@ config UBIFS_FS_SECURITY
If you are not using a security module, say N.
-+
+
+config UBIFS_FS_FORMAT4
+ bool "Use file system format version 4 for new file systems"
+ depends on UBIFS_FS
+ format version 5 for ubifs file systems created with version 5.
+
+ If you are unsure, say N.
++
+ config UBIFS_FS_AUTHENTICATION
+ bool "UBIFS authentication support"
+ select KEYS
--- a/fs/ubifs/sb.c
+++ b/fs/ubifs/sb.c
-@@ -176,7 +176,9 @@ static int create_default_filesystem(str
+@@ -175,7 +175,9 @@ static int create_default_filesystem(str
tmp64 = (long long)max_buds * c->leb_size;
if (big_lpt)
sup_flags |= UBIFS_FLG_BIGLPT;
sup_flags |= UBIFS_FLG_DOUBLE_HASH;
+#endif
- sup->ch.node_type = UBIFS_SB_NODE;
- sup->key_hash = UBIFS_KEY_HASH_R5;
-@@ -192,7 +194,11 @@ static int create_default_filesystem(str
+ if (ubifs_authenticated(c)) {
+ sup_flags |= UBIFS_FLG_AUTHENTICATION;
+@@ -201,7 +203,11 @@ static int create_default_filesystem(str
sup->jhead_cnt = cpu_to_le32(DEFAULT_JHEADS_CNT);
sup->fanout = cpu_to_le32(DEFAULT_FANOUT);
sup->lsave_cnt = cpu_to_le32(c->lsave_cnt);
#include <net/net_namespace.h>
#ifdef CONFIG_SYSCTL
#include <linux/sysctl.h>
-@@ -433,6 +434,56 @@ static int ct_cpu_seq_show(struct seq_fi
+@@ -454,6 +455,56 @@ static int ct_cpu_seq_show(struct seq_fi
return 0;
}
static const struct seq_operations ct_cpu_seq_ops = {
.start = ct_cpu_seq_start,
.next = ct_cpu_seq_next,
-@@ -446,8 +497,9 @@ static int nf_conntrack_standalone_init_
+@@ -467,8 +518,9 @@ static int nf_conntrack_standalone_init_
kuid_t root_uid;
kgid_t root_gid;
#define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -53,6 +53,9 @@ ip_packet_match(const struct iphdr *ip,
+@@ -50,6 +50,9 @@ ip_packet_match(const struct iphdr *ip,
{
unsigned long ret;
if (NF_INVF(ipinfo, IPT_INV_SRCIP,
(ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) ||
NF_INVF(ipinfo, IPT_INV_DSTIP,
-@@ -83,6 +86,29 @@ ip_packet_match(const struct iphdr *ip,
+@@ -80,6 +83,29 @@ ip_packet_match(const struct iphdr *ip,
return true;
}
static bool
ip_checkentry(const struct ipt_ip *ip)
{
-@@ -527,6 +553,8 @@ find_check_entry(struct ipt_entry *e, st
+@@ -524,6 +550,8 @@ find_check_entry(struct ipt_entry *e, st
struct xt_mtchk_param mtpar;
struct xt_entry_match *ematch;
if (!xt_percpu_counter_alloc(alloc_state, &e->counters))
return -ENOMEM;
-@@ -821,6 +849,7 @@ copy_entries_to_user(unsigned int total_
+@@ -818,6 +846,7 @@ copy_entries_to_user(unsigned int total_
const struct xt_table_info *private = table->private;
int ret = 0;
const void *loc_cpu_entry;
counters = alloc_counters(table);
if (IS_ERR(counters))
-@@ -848,6 +877,14 @@ copy_entries_to_user(unsigned int total_
+@@ -845,6 +874,14 @@ copy_entries_to_user(unsigned int total_
goto free_counters;
}
for (i = sizeof(struct ipt_entry);
i < e->target_offset;
i += m->u.match_size) {
-@@ -1228,12 +1265,15 @@ compat_copy_entry_to_user(struct ipt_ent
+@@ -1225,12 +1262,15 @@ compat_copy_entry_to_user(struct ipt_ent
compat_uint_t origsize;
const struct xt_entry_match *ematch;
int ret = 0;
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -249,6 +249,33 @@ struct ipt_entry *ipt_next_entry(const s
+@@ -246,6 +246,33 @@ struct ipt_entry *ipt_next_entry(const s
return (void *)entry + entry->next_offset;
}
/* Returns one of the generic firewall policies, like NF_ACCEPT. */
unsigned int
ipt_do_table(struct sk_buff *skb,
-@@ -269,27 +296,28 @@ ipt_do_table(struct sk_buff *skb,
+@@ -266,27 +293,28 @@ ipt_do_table(struct sk_buff *skb,
unsigned int addend;
/* Initialization */
jumpstack = (struct ipt_entry **)private->jumpstack[cpu];
/* Switch to alternate jumpstack if we're being invoked via TEE.
-@@ -302,7 +330,16 @@ ipt_do_table(struct sk_buff *skb,
+@@ -299,7 +327,16 @@ ipt_do_table(struct sk_buff *skb,
if (static_key_false(&xt_tee_enabled))
jumpstack += private->stacksize * __this_cpu_read(nf_skb_duplicated);
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -56,9 +56,9 @@ ip_packet_match(const struct iphdr *ip,
+@@ -53,9 +53,9 @@ ip_packet_match(const struct iphdr *ip,
if (ipinfo->flags & IPT_F_NO_DEF_MATCH)
return true;
--- a/net/netfilter/nf_conntrack_proto_tcp.c
+++ b/net/netfilter/nf_conntrack_proto_tcp.c
-@@ -34,6 +34,9 @@
+@@ -31,6 +31,9 @@
#include <net/netfilter/ipv4/nf_conntrack_ipv4.h>
#include <net/netfilter/ipv6/nf_conntrack_ipv6.h>
/* "Be conservative in what you do,
be liberal in what you accept from others."
If it's non-zero, we mark only out of window RST segments as INVALID. */
-@@ -484,6 +487,9 @@ static bool tcp_in_window(const struct n
+@@ -476,6 +479,9 @@ static bool tcp_in_window(const struct n
s32 receiver_offset;
bool res, in_recv_win;
/*
* Get the required data from the packet.
*/
-@@ -1059,7 +1065,7 @@ static int tcp_packet(struct nf_conn *ct
+@@ -1123,7 +1129,7 @@ int nf_conntrack_tcp_packet(struct nf_co
IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED &&
timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK])
timeout = timeouts[TCP_CONNTRACK_UNACK];
timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS])
timeout = timeouts[TCP_CONNTRACK_RETRANS];
else
-@@ -1508,6 +1514,13 @@ static struct ctl_table tcp_sysctl_table
- .mode = 0644,
- .proc_handler = proc_dointvec,
+--- a/net/netfilter/nf_conntrack_standalone.c
++++ b/net/netfilter/nf_conntrack_standalone.c
+@@ -25,6 +25,9 @@
+ #include <net/netfilter/nf_conntrack_timestamp.h>
+ #include <linux/rculist_nulls.h>
+
++/* Do not check the TCP window for incoming packets */
++static int nf_ct_tcp_no_window_check __read_mostly = 1;
++
+ static bool enable_hooks __read_mostly;
+ MODULE_PARM_DESC(enable_hooks, "Always enable conntrack hooks");
+ module_param(enable_hooks, bool, 0000);
+@@ -646,6 +649,7 @@ enum nf_ct_sysctl_index {
+ NF_SYSCTL_CT_PROTO_TIMEOUT_GRE_STREAM,
+ #endif
+
++ NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK,
+ __NF_SYSCTL_CT_LAST_SYSCTL,
+ };
+
+@@ -972,6 +976,13 @@ static struct ctl_table nf_ct_sysctl_tab
+ .proc_handler = proc_dointvec_jiffies,
},
-+ {
+ #endif
++ [NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK] = {
+ .procname = "nf_conntrack_tcp_no_window_check",
+ .data = &nf_ct_tcp_no_window_check,
+ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+ .proc_handler = proc_dointvec,
+ },
- { }
+ {}
};
- #endif /* CONFIG_SYSCTL */
+
--- a/net/netfilter/nf_nat_core.c
+++ b/net/netfilter/nf_nat_core.c
-@@ -110,6 +110,9 @@ int nf_xfrm_me_harder(struct net *net, s
+@@ -155,6 +155,9 @@ int nf_xfrm_me_harder(struct net *net, s
struct sock *sk = skb->sk;
int err;
}
--- a/net/sched/sch_fq_codel.c
+++ b/net/sched/sch_fq_codel.c
-@@ -317,6 +317,21 @@ begin:
- flow->dropped += q->cstats.drop_count - prev_drop_count;
- flow->dropped += q->cstats.ecn_mark - prev_ecn_mark;
+@@ -305,6 +305,21 @@ begin:
+ &flow->cvars, &q->cstats, qdisc_pkt_len,
+ codel_get_enqueue_time, drop_func, dequeue_func);
+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate
+ * parent class, dequeue in parent qdisc will do the same if we
if (!skb) {
/* force a pass through old_flows to prevent starvation */
if ((head == &q->new_flows) && !list_empty(&q->old_flows))
-@@ -327,15 +342,6 @@ begin:
+@@ -315,15 +330,6 @@ begin:
}
qdisc_bstats_update(sch, skb);
flow->deficit -= qdisc_pkt_len(skb);
/* Packet socket options */
-@@ -57,6 +59,7 @@ struct sockaddr_ll {
- #define PACKET_QDISC_BYPASS 20
+@@ -58,6 +60,7 @@ struct sockaddr_ll {
#define PACKET_ROLLOVER_STATS 21
#define PACKET_FANOUT_DATA 22
-+#define PACKET_RECV_TYPE 23
+ #define PACKET_IGNORE_OUTGOING 23
++#define PACKET_RECV_TYPE 24
#define PACKET_FANOUT_HASH 0
#define PACKET_FANOUT_LB 1
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
-@@ -1796,6 +1796,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1795,6 +1795,7 @@ static int packet_rcv_spkt(struct sk_buf
{
struct sock *sk;
struct sockaddr_pkt *spkt;
/*
* When we registered the protocol we saved the socket in the data
-@@ -1803,6 +1804,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1802,6 +1803,7 @@ static int packet_rcv_spkt(struct sk_buf
*/
sk = pt->af_packet_priv;
/*
* Yank back the headers [hope the device set this
-@@ -1815,7 +1817,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1814,7 +1816,7 @@ static int packet_rcv_spkt(struct sk_buf
* so that this procedure is noop.
*/
goto out;
if (!net_eq(dev_net(dev), sock_net(sk)))
-@@ -2043,12 +2045,12 @@ static int packet_rcv(struct sk_buff *sk
+@@ -2052,12 +2054,12 @@ static int packet_rcv(struct sk_buff *sk
unsigned int snaplen, res;
bool is_drop_n_account = false;
if (!net_eq(dev_net(dev), sock_net(sk)))
goto drop;
-@@ -2174,12 +2176,12 @@ static int tpacket_rcv(struct sk_buff *s
+@@ -2181,12 +2183,12 @@ static int tpacket_rcv(struct sk_buff *s
BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32);
BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);
if (!net_eq(dev_net(dev), sock_net(sk)))
goto drop;
-@@ -3265,6 +3267,7 @@ static int packet_create(struct net *net
+@@ -3267,6 +3269,7 @@ static int packet_create(struct net *net
mutex_init(&po->pg_vec_lock);
po->rollover = NULL;
po->prot_hook.func = packet_rcv;
if (sock->type == SOCK_PACKET)
po->prot_hook.func = packet_rcv_spkt;
-@@ -3885,6 +3888,16 @@ packet_setsockopt(struct socket *sock, i
+@@ -3900,6 +3903,16 @@ packet_setsockopt(struct socket *sock, i
po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
return 0;
}
default:
return -ENOPROTOOPT;
}
-@@ -3937,6 +3950,13 @@ static int packet_getsockopt(struct sock
+@@ -3956,6 +3969,13 @@ static int packet_getsockopt(struct sock
case PACKET_VNET_HDR:
val = po->has_vnet_hdr;
break;
break;
--- a/net/packet/internal.h
+++ b/net/packet/internal.h
-@@ -132,6 +132,7 @@ struct packet_sock {
- struct net_device __rcu *cached_dev;
+@@ -133,6 +133,7 @@ struct packet_sock {
int (*xmit)(struct sk_buff *skb);
struct packet_type prot_hook ____cacheline_aligned_in_smp;
+ atomic_t tp_drops ____cacheline_aligned_in_smp;
+ unsigned int pkt_type;
};
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
-@@ -918,6 +918,13 @@ struct dev_ifalias {
- char ifalias[];
- };
+@@ -926,6 +926,13 @@ struct devlink;
+ struct tlsdev_ops;
+
+struct flow_offload;
+
/*
* This structure defines the management hooks for network devices.
* The following hooks can be defined; unless noted otherwise, they are
-@@ -1150,6 +1157,10 @@ struct dev_ifalias {
+@@ -1158,6 +1165,10 @@ struct tlsdev_ops;
* int (*ndo_bridge_dellink)(struct net_device *dev, struct nlmsghdr *nlh,
* u16 flags);
*
* int (*ndo_change_carrier)(struct net_device *dev, bool new_carrier);
* Called to change device carrier. Soft-devices (like dummy, team, etc)
* which do not represent real hardware may define this to allow their
-@@ -1377,6 +1388,8 @@ struct net_device_ops {
+@@ -1405,6 +1416,8 @@ struct net_device_ops {
int (*ndo_bridge_dellink)(struct net_device *dev,
struct nlmsghdr *nlh,
u16 flags);
int (*ndo_get_phys_port_id)(struct net_device *dev,
--- a/include/net/netfilter/nf_flow_table.h
+++ b/include/net/netfilter/nf_flow_table.h
-@@ -20,11 +20,17 @@ struct nf_flowtable_type {
+@@ -21,11 +21,17 @@ struct nf_flowtable_type {
struct module *owner;
};
};
enum flow_offload_tuple_dir {
-@@ -69,6 +75,7 @@ struct flow_offload_tuple_rhash {
+@@ -68,6 +74,7 @@ struct flow_offload_tuple_rhash {
#define FLOW_OFFLOAD_DNAT 0x2
#define FLOW_OFFLOAD_DYING 0x4
#define FLOW_OFFLOAD_TEARDOWN 0x8
struct flow_offload {
struct flow_offload_tuple_rhash tuplehash[FLOW_OFFLOAD_DIR_MAX];
-@@ -125,6 +132,22 @@ unsigned int nf_flow_offload_ip_hook(voi
+@@ -120,6 +127,22 @@ unsigned int nf_flow_offload_ip_hook(voi
unsigned int nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,
const struct nf_hook_state *state);
--- a/include/uapi/linux/netfilter/nf_tables.h
+++ b/include/uapi/linux/netfilter/nf_tables.h
-@@ -1464,6 +1464,7 @@ enum nft_object_attributes {
+@@ -1516,6 +1516,7 @@ enum nft_object_attributes {
* @NFTA_FLOWTABLE_HOOK: netfilter hook configuration(NLA_U32)
* @NFTA_FLOWTABLE_USE: number of references to this flow table (NLA_U32)
* @NFTA_FLOWTABLE_HANDLE: object handle (NLA_U64)
*/
enum nft_flowtable_attributes {
NFTA_FLOWTABLE_UNSPEC,
-@@ -1473,6 +1474,7 @@ enum nft_flowtable_attributes {
+@@ -1525,6 +1526,7 @@ enum nft_flowtable_attributes {
NFTA_FLOWTABLE_USE,
NFTA_FLOWTABLE_HANDLE,
NFTA_FLOWTABLE_PAD,
#define NFTA_FLOWTABLE_MAX (__NFTA_FLOWTABLE_MAX - 1)
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
-@@ -714,6 +714,15 @@ config NF_FLOW_TABLE
+@@ -723,6 +723,15 @@ config NF_FLOW_TABLE
To compile it as a module, choose M here.
obj-$(CONFIG_NF_FLOW_TABLE_INET) += nf_flow_table_inet.o
+obj-$(CONFIG_NF_FLOW_TABLE_HW) += nf_flow_table_hw.o
- # generic X tables
+ # generic X tables
obj-$(CONFIG_NETFILTER_XTABLES) += x_tables.o xt_tcpudp.o
--- a/net/netfilter/nf_flow_table_core.c
+++ b/net/netfilter/nf_flow_table_core.c
-@@ -228,10 +228,16 @@ int flow_offload_add(struct nf_flowtable
+@@ -248,10 +248,16 @@ static inline bool nf_flow_has_expired(c
+ return nf_flow_timeout_delta(flow->timeout) <= 0;
}
- EXPORT_SYMBOL_GPL(flow_offload_add);
+static inline bool nf_flow_in_hw(const struct flow_offload *flow)
+{
rhashtable_remove_fast(&flow_table->rhashtable,
&flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].node,
-@@ -246,6 +252,9 @@ static void flow_offload_del(struct nf_f
+@@ -271,6 +277,9 @@ static void flow_offload_del(struct nf_f
if (!(flow->flags & FLOW_OFFLOAD_TEARDOWN))
flow_offload_fixup_ct_state(e->ct);
flow_offload_free(flow);
}
-@@ -359,6 +368,9 @@ static int nf_flow_offload_gc_step(struc
- if (!teardown)
- nf_ct_offload_timeout(flow);
+@@ -361,6 +370,9 @@ static void nf_flow_offload_gc_step(stru
+ if (!teardown)
+ nf_ct_offload_timeout(flow);
-+ if (nf_flow_in_hw(flow) && !teardown)
-+ continue;
++ if (nf_flow_in_hw(flow) && !teardown)
++ return;
+
- if (nf_flow_has_expired(flow) || teardown)
- flow_offload_del(flow_table, flow);
- }
-@@ -494,10 +506,43 @@ int nf_flow_dnat_port(const struct flow_
+ if (nf_flow_has_expired(flow) || teardown)
+ flow_offload_del(flow_table, flow);
+ }
+@@ -490,10 +502,43 @@ int nf_flow_dnat_port(const struct flow_
}
EXPORT_SYMBOL_GPL(nf_flow_dnat_port);
INIT_DEFERRABLE_WORK(&flowtable->gc_work, nf_flow_offload_work_gc);
err = rhashtable_init(&flowtable->rhashtable,
-@@ -538,6 +583,8 @@ static void nf_flow_table_iterate_cleanu
+@@ -534,6 +579,8 @@ static void nf_flow_table_iterate_cleanu
{
nf_flow_table_iterate(flowtable, nf_flow_table_do_cleanup, dev);
flush_delayed_work(&flowtable->gc_work);
+ flush_work(&nf_flow_offload_hw_work);
}
- void nf_flow_table_cleanup(struct net *net, struct net_device *dev)
-@@ -551,6 +598,26 @@ void nf_flow_table_cleanup(struct net *n
+ void nf_flow_table_cleanup(struct net_device *dev)
+@@ -547,6 +594,26 @@ void nf_flow_table_cleanup(struct net_de
}
EXPORT_SYMBOL_GPL(nf_flow_table_cleanup);
void nf_flow_table_free(struct nf_flowtable *flow_table)
{
mutex_lock(&flowtable_lock);
-@@ -560,9 +627,58 @@ void nf_flow_table_free(struct nf_flowta
+@@ -556,9 +623,58 @@ void nf_flow_table_free(struct nf_flowta
nf_flow_table_iterate(flow_table, nf_flow_table_do_cleanup, NULL);
- WARN_ON(!nf_flow_offload_gc_step(flow_table));
+ nf_flow_table_iterate(flow_table, nf_flow_offload_gc_step, flow_table);
rhashtable_destroy(&flow_table->rhashtable);
+ if (flow_table->flags & NF_FLOWTABLE_F_HW)
+ nf_flow_offload_hw_free(flow_table);
+MODULE_ALIAS("nf-flow-table-hw");
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
-@@ -5503,6 +5503,13 @@ static int nf_tables_flowtable_parse_hoo
+@@ -5740,6 +5740,13 @@ static int nf_tables_flowtable_parse_hoo
if (err < 0)
return err;
ops = kcalloc(n, sizeof(struct nf_hook_ops), GFP_KERNEL);
if (!ops)
return -ENOMEM;
-@@ -5634,10 +5641,19 @@ static int nf_tables_newflowtable(struct
+@@ -5870,10 +5877,19 @@ static int nf_tables_newflowtable(struct
}
flowtable->data.type = type;
err = nf_tables_flowtable_parse_hook(&ctx, nla[NFTA_FLOWTABLE_HOOK],
flowtable);
if (err < 0)
-@@ -5763,7 +5779,8 @@ static int nf_tables_fill_flowtable_info
+@@ -5999,7 +6015,8 @@ static int nf_tables_fill_flowtable_info
nla_put_string(skb, NFTA_FLOWTABLE_NAME, flowtable->name) ||
nla_put_be32(skb, NFTA_FLOWTABLE_USE, htonl(flowtable->use)) ||
nla_put_be64(skb, NFTA_FLOWTABLE_HANDLE, cpu_to_be64(flowtable->handle),
+ nla_put_be32(skb, NFTA_FLOWTABLE_FLAGS, htonl(flowtable->data.flags)))
goto nla_put_failure;
- nest = nla_nest_start(skb, NFTA_FLOWTABLE_HOOK);
+ nest = nla_nest_start_noflag(skb, NFTA_FLOWTABLE_HOOK);
--- a/net/netfilter/nft_flow_offload.c
+++ b/net/netfilter/nft_flow_offload.c
-@@ -126,6 +126,9 @@ static void nft_flow_offload_eval(const
+@@ -128,6 +128,9 @@ static void nft_flow_offload_eval(const
if (ret < 0)
goto err_flow_add;
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
-@@ -919,6 +919,7 @@ struct dev_ifalias {
- };
+@@ -927,6 +927,7 @@ struct tlsdev_ops;
+
struct flow_offload;
+struct flow_offload_hw_path;
enum flow_offload_type {
FLOW_OFFLOAD_ADD = 0,
-@@ -1157,8 +1158,15 @@ enum flow_offload_type {
+@@ -1165,8 +1166,15 @@ enum flow_offload_type {
* int (*ndo_bridge_dellink)(struct net_device *dev, struct nlmsghdr *nlh,
* u16 flags);
*
* Adds/deletes flow entry to/from net device flowtable.
*
* int (*ndo_change_carrier)(struct net_device *dev, bool new_carrier);
-@@ -1388,8 +1396,11 @@ struct net_device_ops {
+@@ -1416,8 +1424,11 @@ struct net_device_ops {
int (*ndo_bridge_dellink)(struct net_device *dev,
struct nlmsghdr *nlh,
u16 flags);
int (*ndo_get_phys_port_id)(struct net_device *dev,
--- a/include/net/netfilter/nf_flow_table.h
+++ b/include/net/netfilter/nf_flow_table.h
-@@ -86,6 +86,21 @@ struct flow_offload {
+@@ -85,6 +85,21 @@ struct flow_offload {
};
};
--- a/net/8021q/vlan_dev.c
+++ b/net/8021q/vlan_dev.c
-@@ -32,6 +32,10 @@
+@@ -27,6 +27,11 @@
#include <linux/phy.h>
#include <net/arp.h>
- #include <net/switchdev.h>
+
+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
+#include <linux/netfilter.h>
+#include <net/netfilter/nf_flow_table.h>
+#endif
-
++
#include "vlan.h"
#include "vlanproc.h"
-@@ -771,6 +775,27 @@ static int vlan_dev_get_iflink(const str
+ #include <linux/if_vlan.h>
+@@ -744,6 +749,27 @@ static int vlan_dev_get_iflink(const str
return real_dev->ifindex;
}
static const struct ethtool_ops vlan_ethtool_ops = {
.get_link_ksettings = vlan_ethtool_get_link_ksettings,
.get_drvinfo = vlan_ethtool_get_drvinfo,
-@@ -808,6 +833,9 @@ static const struct net_device_ops vlan_
+@@ -782,6 +808,9 @@ static const struct net_device_ops vlan_
+ #endif
.ndo_fix_features = vlan_dev_fix_features,
- .ndo_get_lock_subclass = vlan_dev_get_lock_subclass,
.ndo_get_iflink = vlan_dev_get_iflink,
+#if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
+ .ndo_flow_offload_check = vlan_dev_flow_offload_check,
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
-@@ -18,6 +18,10 @@
+@@ -14,6 +14,10 @@
#include <linux/ethtool.h>
#include <linux/list.h>
#include <linux/netfilter_bridge.h>
#include <linux/uaccess.h>
#include "br_private.h"
-@@ -376,6 +380,28 @@ static const struct ethtool_ops br_ethto
+@@ -375,6 +379,28 @@ static const struct ethtool_ops br_ethto
.get_link = ethtool_op_get_link,
};
--- a/drivers/net/ppp/ppp_generic.c
+++ b/drivers/net/ppp/ppp_generic.c
-@@ -57,6 +57,11 @@
+@@ -53,6 +53,11 @@
#include <net/net_namespace.h>
#include <net/netns/generic.h>
#define PPP_VERSION "2.4.2"
/*
-@@ -1368,12 +1373,37 @@ static void ppp_dev_priv_destructor(stru
+@@ -1362,12 +1367,37 @@ static void ppp_dev_priv_destructor(stru
ppp_destroy_interface(ppp);
}
static struct device_type ppp_type = {
--- a/drivers/net/ppp/pppoe.c
+++ b/drivers/net/ppp/pppoe.c
-@@ -78,6 +78,11 @@
+@@ -73,6 +73,11 @@
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/nsproxy.h>
#include <net/net_namespace.h>
#include <net/netns/generic.h>
-@@ -976,8 +981,36 @@ static int pppoe_xmit(struct ppp_channel
+@@ -971,8 +976,36 @@ static int pppoe_xmit(struct ppp_channel
return __pppoe_xmit(sk, skb);
}
static int pppoe_recvmsg(struct socket *sock, struct msghdr *m,
--- a/include/linux/ppp_channel.h
+++ b/include/linux/ppp_channel.h
-@@ -32,6 +32,10 @@ struct ppp_channel_ops {
+@@ -28,6 +28,10 @@ struct ppp_channel_ops {
int (*start_xmit)(struct ppp_channel *, struct sk_buff *);
/* Handle an ioctl call that has come in via /dev/ppp. */
int (*ioctl)(struct ppp_channel *, unsigned int, unsigned long);
--- a/include/net/netfilter/nf_flow_table.h
+++ b/include/net/netfilter/nf_flow_table.h
-@@ -76,6 +76,7 @@ struct flow_offload_tuple_rhash {
+@@ -75,6 +75,7 @@ struct flow_offload_tuple_rhash {
#define FLOW_OFFLOAD_DYING 0x4
#define FLOW_OFFLOAD_TEARDOWN 0x8
#define FLOW_OFFLOAD_HW 0x10
struct flow_offload_tuple_rhash tuplehash[FLOW_OFFLOAD_DIR_MAX];
--- a/net/netfilter/nf_flow_table_core.c
+++ b/net/netfilter/nf_flow_table_core.c
-@@ -368,7 +368,7 @@ static int nf_flow_offload_gc_step(struc
- if (!teardown)
- nf_ct_offload_timeout(flow);
+@@ -370,7 +370,7 @@ static void nf_flow_offload_gc_step(stru
+ if (!teardown)
+ nf_ct_offload_timeout(flow);
-- if (nf_flow_in_hw(flow) && !teardown)
-+ if ((flow->flags & FLOW_OFFLOAD_KEEP) && !teardown)
- continue;
+- if (nf_flow_in_hw(flow) && !teardown)
++ if ((flow->flags & FLOW_OFFLOAD_KEEP) && !teardown)
+ return;
- if (nf_flow_has_expired(flow) || teardown)
+ if (nf_flow_has_expired(flow) || teardown)
--- a/include/net/netfilter/nf_flow_table.h
+++ b/include/net/netfilter/nf_flow_table.h
-@@ -81,9 +81,10 @@ struct flow_offload_tuple_rhash {
+@@ -80,9 +80,10 @@ struct flow_offload_tuple_rhash {
struct flow_offload {
struct flow_offload_tuple_rhash tuplehash[FLOW_OFFLOAD_DIR_MAX];
u32 flags;
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
-@@ -2511,7 +2511,7 @@ static inline int pskb_network_may_pull(
+@@ -2631,7 +2631,7 @@ static inline int pskb_network_may_pull(
* NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
*/
#ifndef NET_SKB_PAD
TUNNEL_ENCAP_FOU,
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
-@@ -16,6 +16,8 @@
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
+@@ -11,6 +11,9 @@
+ * linux/net/ipv6/sit.c and linux/net/ipv4/ipip.c
*
-+ * Changes:
-+ * Steven Barth <cyrus@openwrt.org>: MAP-E FMR support
+ * RFC 2473
++ *
++ * Changes:
++ * Steven Barth <cyrus@openwrt.org>: MAP-E FMR support
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-@@ -72,9 +74,9 @@ static bool log_ecn_error = true;
+@@ -67,9 +70,9 @@ static bool log_ecn_error = true;
module_param(log_ecn_error, bool, 0644);
MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");
return hash_32(hash, IP6_TUNNEL_HASH_SIZE_SHIFT);
}
-@@ -141,20 +143,29 @@ static struct net_device_stats *ip6_get_
+@@ -136,20 +139,29 @@ static struct net_device_stats *ip6_get_
static struct ip6_tnl *
ip6_tnl_lookup(struct net *net, const struct in6_addr *remote, const struct in6_addr *local)
{
for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {
if (ipv6_addr_equal(local, &t->parms.laddr) &&
ipv6_addr_any(&t->parms.raddr) &&
-@@ -162,7 +173,7 @@ ip6_tnl_lookup(struct net *net, const st
+@@ -157,7 +169,7 @@ ip6_tnl_lookup(struct net *net, const st
return t;
}
for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) {
if (ipv6_addr_equal(remote, &t->parms.raddr) &&
ipv6_addr_any(&t->parms.laddr) &&
-@@ -202,7 +213,7 @@ ip6_tnl_bucket(struct ip6_tnl_net *ip6n,
+@@ -197,7 +209,7 @@ ip6_tnl_bucket(struct ip6_tnl_net *ip6n,
if (!ipv6_addr_any(remote) || !ipv6_addr_any(local)) {
prio = 1;
}
return &ip6n->tnls[prio][h];
}
-@@ -383,6 +394,12 @@ ip6_tnl_dev_uninit(struct net_device *de
+@@ -378,6 +390,12 @@ ip6_tnl_dev_uninit(struct net_device *de
struct net *net = t->net;
struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id);
if (dev == ip6n->fb_tnl_dev)
RCU_INIT_POINTER(ip6n->tnls_wc[0], NULL);
else
-@@ -772,6 +789,107 @@ int ip6_tnl_rcv_ctl(struct ip6_tnl *t,
+@@ -767,6 +785,107 @@ int ip6_tnl_rcv_ctl(struct ip6_tnl *t,
}
EXPORT_SYMBOL_GPL(ip6_tnl_rcv_ctl);
static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,
const struct tnl_ptk_info *tpi,
struct metadata_dst *tun_dst,
-@@ -824,6 +942,27 @@ static int __ip6_tnl_rcv(struct ip6_tnl
+@@ -819,6 +938,27 @@ static int __ip6_tnl_rcv(struct ip6_tnl
skb_reset_network_header(skb);
memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
__skb_tunnel_rx(skb, tunnel->dev, tunnel->net);
err = dscp_ecn_decapsulate(tunnel, ipv6h, skb);
-@@ -956,6 +1095,7 @@ static void init_tel_txopt(struct ipv6_t
+@@ -951,6 +1091,7 @@ static void init_tel_txopt(struct ipv6_t
opt->ops.opt_nflen = 8;
}
/**
* ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
* @t: the outgoing tunnel device
-@@ -1308,6 +1448,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
+@@ -1303,6 +1444,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
{
struct ip6_tnl *t = netdev_priv(dev);
struct ipv6hdr *ipv6h;
int encap_limit = -1;
__u16 offset;
struct flowi6 fl6;
-@@ -1373,6 +1514,18 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
+@@ -1368,6 +1510,18 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL);
dsfield = INET_ECN_encapsulate(dsfield, ipv6_get_dsfield(ipv6h));
if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
return -1;
-@@ -1502,6 +1655,14 @@ ip6_tnl_change(struct ip6_tnl *t, const
+@@ -1497,6 +1651,14 @@ ip6_tnl_change(struct ip6_tnl *t, const
t->parms.link = p->link;
t->parms.proto = p->proto;
t->parms.fwmark = p->fwmark;
dst_cache_reset(&t->dst_cache);
ip6_tnl_link_config(t);
return 0;
-@@ -1540,6 +1701,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_
+@@ -1535,6 +1697,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_
p->flowinfo = u->flowinfo;
p->link = u->link;
p->proto = u->proto;
memcpy(p->name, u->name, sizeof(u->name));
}
-@@ -1924,6 +2086,15 @@ static int ip6_tnl_validate(struct nlatt
+@@ -1919,6 +2082,15 @@ static int ip6_tnl_validate(struct nlatt
return 0;
}
static void ip6_tnl_netlink_parms(struct nlattr *data[],
struct __ip6_tnl_parm *parms)
{
-@@ -1961,6 +2132,46 @@ static void ip6_tnl_netlink_parms(struct
+@@ -1956,6 +2128,46 @@ static void ip6_tnl_netlink_parms(struct
if (data[IFLA_IPTUN_FWMARK])
parms->fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]);
}
static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[],
-@@ -2076,6 +2287,12 @@ static void ip6_tnl_dellink(struct net_d
+@@ -2071,6 +2283,12 @@ static void ip6_tnl_dellink(struct net_d
static size_t ip6_tnl_get_size(const struct net_device *dev)
{
return
/* IFLA_IPTUN_LINK */
nla_total_size(4) +
-@@ -2105,6 +2322,24 @@ static size_t ip6_tnl_get_size(const str
+@@ -2100,6 +2318,24 @@ static size_t ip6_tnl_get_size(const str
nla_total_size(0) +
/* IFLA_IPTUN_FWMARK */
nla_total_size(4) +
0;
}
-@@ -2112,6 +2347,9 @@ static int ip6_tnl_fill_info(struct sk_b
+@@ -2107,6 +2343,9 @@ static int ip6_tnl_fill_info(struct sk_b
{
struct ip6_tnl *tunnel = netdev_priv(dev);
struct __ip6_tnl_parm *parm = &tunnel->parms;
if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) ||
nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) ||
-@@ -2121,9 +2359,27 @@ static int ip6_tnl_fill_info(struct sk_b
+@@ -2116,9 +2355,27 @@ static int ip6_tnl_fill_info(struct sk_b
nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) ||
nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) ||
nla_put_u8(skb, IFLA_IPTUN_PROTO, parm->proto) ||
if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, tunnel->encap.type) ||
nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, tunnel->encap.sport) ||
nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) ||
-@@ -2163,6 +2419,7 @@ static const struct nla_policy ip6_tnl_p
+@@ -2158,6 +2415,7 @@ static const struct nla_policy ip6_tnl_p
[IFLA_IPTUN_ENCAP_DPORT] = { .type = NLA_U16 },
[IFLA_IPTUN_COLLECT_METADATA] = { .type = NLA_FLAG },
[IFLA_IPTUN_FWMARK] = { .type = NLA_U32 },
--- a/include/net/netns/ipv6.h
+++ b/include/net/netns/ipv6.h
-@@ -78,6 +78,7 @@ struct netns_ipv6 {
+@@ -84,6 +84,7 @@ struct netns_ipv6 {
unsigned int fib6_rules_require_fldissect;
bool fib6_has_custom_rules;
struct rt6_info *ip6_prohibit_entry;
--- a/include/uapi/linux/rtnetlink.h
+++ b/include/uapi/linux/rtnetlink.h
-@@ -228,6 +228,7 @@ enum {
+@@ -235,6 +235,7 @@ enum {
RTN_THROW, /* Not in this table */
RTN_NAT, /* Translate this address */
RTN_XRESOLVE, /* Use external resolver */
--- a/net/ipv4/fib_semantics.c
+++ b/net/ipv4/fib_semantics.c
-@@ -139,6 +139,10 @@ const struct fib_prop fib_props[RTN_MAX
+@@ -141,6 +141,10 @@ const struct fib_prop fib_props[RTN_MAX
.error = -EINVAL,
.scope = RT_SCOPE_NOWHERE,
},
static void rt_fibinfo_free(struct rtable __rcu **rtp)
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
-@@ -2474,6 +2474,7 @@ static const char *const rtn_type_names[
+@@ -2592,6 +2592,7 @@ static const char *const rtn_type_names[
[RTN_THROW] = "THROW",
[RTN_NAT] = "NAT",
[RTN_XRESOLVE] = "XRESOLVE",
static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
-@@ -179,6 +179,7 @@ static int ipmr_rule_action(struct fib_r
+@@ -173,6 +173,7 @@ static int ipmr_rule_action(struct fib_r
case FR_ACT_UNREACHABLE:
return -ENETUNREACH;
case FR_ACT_PROHIBIT:
default:
--- a/net/ipv6/fib6_rules.c
+++ b/net/ipv6/fib6_rules.c
-@@ -221,6 +221,10 @@ static int __fib6_rule_action(struct fib
+@@ -216,6 +216,10 @@ static int __fib6_rule_action(struct fib
err = -EACCES;
rt = net->ipv6.ip6_prohibit_entry;
goto discard_pkt;
tb_id = fib_rule_get_table(rule, arg);
--- a/net/ipv6/ip6mr.c
+++ b/net/ipv6/ip6mr.c
-@@ -162,6 +162,8 @@ static int ip6mr_rule_action(struct fib_
+@@ -161,6 +161,8 @@ static int ip6mr_rule_action(struct fib_
return -ENETUNREACH;
case FR_ACT_PROHIBIT:
return -EACCES;
return -EINVAL;
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
-@@ -97,6 +97,8 @@ static int ip6_pkt_discard(struct sk_bu
+@@ -93,6 +93,8 @@ static int ip6_pkt_discard(struct sk_bu
static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
static int ip6_pkt_prohibit(struct sk_buff *skb);
static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb);
static void ip6_link_failure(struct sk_buff *skb);
static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
struct sk_buff *skb, u32 mtu,
-@@ -328,6 +330,18 @@ static const struct rt6_info ip6_prohibi
+@@ -326,6 +328,18 @@ static const struct rt6_info ip6_prohibi
.rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
};
static const struct rt6_info ip6_blk_hole_entry_template = {
.dst = {
.__refcnt = ATOMIC_INIT(1),
-@@ -906,6 +920,7 @@ static const int fib6_prop[RTN_MAX + 1]
+@@ -1044,6 +1058,7 @@ static const int fib6_prop[RTN_MAX + 1]
[RTN_BLACKHOLE] = -EINVAL,
[RTN_UNREACHABLE] = -EHOSTUNREACH,
[RTN_PROHIBIT] = -EACCES,
[RTN_THROW] = -EAGAIN,
[RTN_NAT] = -EINVAL,
[RTN_XRESOLVE] = -EINVAL,
-@@ -943,6 +958,10 @@ static void ip6_rt_init_dst_reject(struc
+@@ -1081,6 +1096,10 @@ static void ip6_rt_init_dst_reject(struc
rt->dst.output = ip6_pkt_prohibit_out;
rt->dst.input = ip6_pkt_prohibit;
break;
case RTN_THROW:
case RTN_UNREACHABLE:
default:
-@@ -3789,6 +3808,17 @@ static int ip6_pkt_prohibit_out(struct n
+@@ -4389,6 +4408,17 @@ static int ip6_pkt_prohibit_out(struct n
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
}
/*
* Allocate a dst for local (unicast / anycast) address.
*/
-@@ -4236,7 +4266,8 @@ static int rtm_to_fib6_config(struct sk_
+@@ -4869,7 +4899,8 @@ static int rtm_to_fib6_config(struct sk_
if (rtm->rtm_type == RTN_UNREACHABLE ||
rtm->rtm_type == RTN_BLACKHOLE ||
rtm->rtm_type == RTN_PROHIBIT ||
cfg->fc_flags |= RTF_REJECT;
if (rtm->rtm_type == RTN_LOCAL)
-@@ -5084,6 +5115,8 @@ static int ip6_route_dev_notify(struct n
+@@ -5988,6 +6019,8 @@ static int ip6_route_dev_notify(struct n
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
net->ipv6.ip6_prohibit_entry->dst.dev = dev;
net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
#endif
-@@ -5095,6 +5128,7 @@ static int ip6_route_dev_notify(struct n
+@@ -5999,6 +6032,7 @@ static int ip6_route_dev_notify(struct n
in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);
#endif
}
-@@ -5289,6 +5323,15 @@ static int __net_init ip6_route_net_init
- net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
- dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
- ip6_template_metrics, true);
+@@ -6191,6 +6225,8 @@ static int __net_init ip6_route_net_init
+
+ #ifdef CONFIG_IPV6_MULTIPLE_TABLES
+ net->ipv6.fib6_has_custom_rules = false;
+
++
+ net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
+ sizeof(*net->ipv6.ip6_prohibit_entry),
+ GFP_KERNEL);
+@@ -6201,11 +6237,21 @@ static int __net_init ip6_route_net_init
+ ip6_template_metrics, true);
+ INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->rt6i_uncached);
+
+ net->ipv6.ip6_policy_failed_entry =
-+ kmemdup(&ip6_policy_failed_entry_template,
-+ sizeof(*net->ipv6.ip6_policy_failed_entry), GFP_KERNEL);
++ kmemdup(&ip6_policy_failed_entry_template,
++ sizeof(*net->ipv6.ip6_policy_failed_entry), GFP_KERNEL);
+ if (!net->ipv6.ip6_policy_failed_entry)
-+ goto out_ip6_blk_hole_entry;
++ goto out_ip6_prohibit_entry;
+ net->ipv6.ip6_policy_failed_entry->dst.ops = &net->ipv6.ip6_dst_ops;
+ dst_init_metrics(&net->ipv6.ip6_policy_failed_entry->dst,
+ ip6_template_metrics, true);
- #endif
-
- net->ipv6.sysctl.flush_delay = 0;
-@@ -5307,6 +5350,8 @@ out:
++ INIT_LIST_HEAD(&net->ipv6.ip6_policy_failed_entry->rt6i_uncached);
++
+ net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,
+ sizeof(*net->ipv6.ip6_blk_hole_entry),
+ GFP_KERNEL);
+ if (!net->ipv6.ip6_blk_hole_entry)
+- goto out_ip6_prohibit_entry;
++ goto out_ip6_policy_failed_entry;
+ net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
+ dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
+ ip6_template_metrics, true);
+@@ -6229,6 +6275,8 @@ out:
return ret;
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
-+out_ip6_blk_hole_entry:
-+ kfree(net->ipv6.ip6_blk_hole_entry);
++out_ip6_policy_failed_entry:
++ kfree(net->ipv6.ip6_policy_failed_entry);
out_ip6_prohibit_entry:
kfree(net->ipv6.ip6_prohibit_entry);
out_ip6_null_entry:
-@@ -5327,6 +5372,7 @@ static void __net_exit ip6_route_net_exi
+@@ -6248,6 +6296,7 @@ static void __net_exit ip6_route_net_exi
+ kfree(net->ipv6.ip6_null_entry);
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
kfree(net->ipv6.ip6_prohibit_entry);
- kfree(net->ipv6.ip6_blk_hole_entry);
+ kfree(net->ipv6.ip6_policy_failed_entry);
+ kfree(net->ipv6.ip6_blk_hole_entry);
#endif
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
- }
-@@ -5403,6 +5449,9 @@ void __init ip6_route_init_special_entri
+@@ -6325,6 +6374,9 @@ void __init ip6_route_init_special_entri
init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
#endif
--- a/include/uapi/linux/icmpv6.h
+++ b/include/uapi/linux/icmpv6.h
-@@ -119,6 +119,8 @@ struct icmp6hdr {
+@@ -125,6 +125,8 @@ struct icmp6hdr {
#define ICMPV6_POLICY_FAIL 5
#define ICMPV6_REJECT_ROUTE 6
*/
--- a/include/uapi/linux/rtnetlink.h
+++ b/include/uapi/linux/rtnetlink.h
-@@ -232,6 +232,8 @@ enum {
+@@ -239,6 +239,8 @@ enum {
__RTN_MAX
};
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
-@@ -1891,6 +1891,8 @@ struct net_device {
+@@ -1922,6 +1922,8 @@ struct net_device {
struct netdev_hw_addr_list mc;
struct netdev_hw_addr_list dev_addrs;
#endif
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
-@@ -799,6 +799,7 @@ struct sk_buff {
+@@ -822,6 +822,7 @@ struct sk_buff {
#ifdef CONFIG_TLS_DEVICE
__u8 decrypted:1;
#endif
__u16 tc_index; /* traffic control index */
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -5454,6 +5454,9 @@ static enum gro_result dev_gro_receive(s
+@@ -5477,6 +5477,9 @@ static enum gro_result dev_gro_receive(s
int same_flow;
int grow;
if (netif_elide_gro(skb->dev))
goto normal;
-@@ -7112,6 +7115,48 @@ static void __netdev_adjacent_dev_unlink
+@@ -7269,6 +7272,48 @@ static void __netdev_adjacent_dev_unlink
&upper_dev->adj_list.lower);
}
static int __netdev_upper_dev_link(struct net_device *dev,
struct net_device *upper_dev, bool master,
void *upper_priv, void *upper_info,
-@@ -7162,6 +7207,7 @@ static int __netdev_upper_dev_link(struc
+@@ -7319,6 +7364,7 @@ static int __netdev_upper_dev_link(struc
if (ret)
return ret;
ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
&changeupper_info.info);
ret = notifier_to_errno(ret);
-@@ -7254,6 +7300,7 @@ void netdev_upper_dev_unlink(struct net_
+@@ -7412,6 +7458,7 @@ void netdev_upper_dev_unlink(struct net_
__netdev_adjacent_dev_unlink_neighbour(dev, upper_dev);
call_netdevice_notifiers_info(NETDEV_CHANGEUPPER,
&changeupper_info.info);
-@@ -7893,6 +7940,7 @@ int dev_set_mac_address(struct net_devic
+@@ -8142,6 +8189,7 @@ int dev_set_mac_address(struct net_devic
if (err)
return err;
dev->addr_assign_type = NET_ADDR_SET;
return 0;
--- a/net/ethernet/eth.c
+++ b/net/ethernet/eth.c
-@@ -144,6 +144,18 @@ u32 eth_get_headlen(void *data, unsigned
+@@ -143,6 +143,18 @@ u32 eth_get_headlen(const struct net_dev
}
EXPORT_SYMBOL(eth_get_headlen);
/**
* eth_type_trans - determine the packet's protocol ID.
* @skb: received socket data
-@@ -172,8 +184,12 @@ __be16 eth_type_trans(struct sk_buff *sk
- skb->pkt_type = PACKET_MULTICAST;
- }
- else if (unlikely(!ether_addr_equal_64bits(eth->h_dest,
-- dev->dev_addr)))
-+ dev->dev_addr))) {
- skb->pkt_type = PACKET_OTHERHOST;
+@@ -174,6 +186,10 @@ __be16 eth_type_trans(struct sk_buff *sk
+ } else {
+ skb->pkt_type = PACKET_OTHERHOST;
+ }
++
+ if (eth_check_local_mask(eth->h_dest, dev->dev_addr,
+ dev->local_addr_mask))
+ skb->gro_skip = 1;
-+ }
+ }
/*
- * Some variants of DSA tagging don't have an ethertype field
--- a/drivers/of/of_net.c
+++ b/drivers/of/of_net.c
@@ -11,6 +11,7 @@
- #include <linux/of_net.h>
#include <linux/phy.h>
#include <linux/export.h>
+ #include <linux/device.h>
+#include <linux/mtd/mtd.h>
/**
{
struct property *pp = of_find_property(np, name, NULL);
-@@ -48,6 +49,79 @@ static const void *of_get_mac_addr(struc
- return NULL;
+@@ -72,6 +73,79 @@ static const void *of_get_mac_addr_nvmem
+ return mac;
}
+static const void *of_get_mac_address_mtd(struct device_node *np)
/**
* Search the device tree for the best MAC address to use. 'mac-address' is
* checked first, because that is supposed to contain to "most recent" MAC
-@@ -65,11 +139,18 @@ static const void *of_get_mac_addr(struc
- * addresses. Some older U-Boots only initialized 'local-mac-address'. In
+@@ -92,12 +166,20 @@ static const void *of_get_mac_addr_nvmem
* this case, the real MAC is in 'local-mac-address', and 'mac-address' exists
* but is all zeros.
+ *
+ *
+ * If a mtd-mac-address property exists, try to fetch the MAC address from the
+ * specified mtd device, and store it as a 'mac-address' property
++ *
+ * Return: Will be a valid pointer on success and ERR_PTR in case of error.
*/
const void *of_get_mac_address(struct device_node *np)
{
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
-@@ -1201,6 +1201,9 @@ void phy_detach(struct phy_device *phyde
- struct module *ndev_owner = dev->dev.parent->driver->owner;
+@@ -1458,6 +1458,9 @@ void phy_detach(struct phy_device *phyde
+ struct module *ndev_owner = NULL;
struct mii_bus *bus;
+ if (phydev->drv && phydev->drv->detach)
+ phydev->drv->detach(phydev);
+
if (phydev->sysfs_links) {
- sysfs_remove_link(&dev->dev.kobj, "phydev");
- sysfs_remove_link(&phydev->mdio.dev.kobj, "attached_dev");
+ if (dev)
+ sysfs_remove_link(&dev->dev.kobj, "phydev");
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
-@@ -567,6 +567,12 @@ struct phy_driver {
- */
- int (*did_interrupt)(struct phy_device *phydev);
+@@ -537,6 +537,12 @@ struct phy_driver {
+ /* Override default interrupt handling */
+ int (*handle_interrupt)(struct phy_device *phydev);
+ /*
+ * Called before an ethernet device is detached
--- a/drivers/net/phy/at803x.c
+++ b/drivers/net/phy/at803x.c
-@@ -44,6 +44,7 @@
- #define AT803X_FUNC_DATA 0x4003
+@@ -46,6 +46,7 @@
+ #define AT803X_LOC_MAC_ADDR_32_47_OFFSET 0x804A
#define AT803X_REG_CHIP_CONFIG 0x1f
#define AT803X_BT_BX_REG_SEL 0x8000
+#define AT803X_SGMII_ANEG_EN 0x1000
#define AT803X_DEBUG_ADDR 0x1D
#define AT803X_DEBUG_DATA 0x1E
-@@ -252,6 +253,27 @@ static int at803x_probe(struct phy_devic
+@@ -259,6 +260,27 @@ static int at803x_probe(struct phy_devic
static int at803x_config_init(struct phy_device *phydev)
{
int ret;
+ return ret;
+ }
- ret = genphy_config_init(phydev);
- if (ret < 0)
+ /* The RX and TX delay default is:
+ * after HW reset: RX delay enabled and TX delay disabled
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -153,10 +153,20 @@ static const enum gpiod_flags gpio_flags
+@@ -155,10 +155,20 @@ static const enum gpiod_flags gpio_flags
GPIOD_ASIS,
};
/* SFP module presence detection is poor: the three MOD DEF signals are
* the same length on the PCB, which means it's possible for MOD DEF 0 to
-@@ -216,6 +226,7 @@ struct sfp {
+@@ -218,6 +228,7 @@ struct sfp {
struct sfp_eeprom_id id;
unsigned int module_power_mW;
#if IS_ENABLED(CONFIG_HWMON)
struct sfp_diag diag;
-@@ -1590,6 +1601,12 @@ static int sfp_sm_mod_probe(struct sfp *
+@@ -1655,6 +1666,12 @@ static int sfp_sm_mod_probe(struct sfp *
if (ret < 0)
return ret;
return 0;
}
-@@ -1795,11 +1812,12 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1860,11 +1877,12 @@ static void sfp_sm_main(struct sfp *sfp,
break;
if (sfp->state & SFP_F_TX_FAULT) {
if (timeout > T_WAIT)
timeout -= T_WAIT;
else
-@@ -1816,8 +1834,8 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1881,8 +1899,8 @@ static void sfp_sm_main(struct sfp *sfp,
case SFP_S_INIT:
if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) {
*/
sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT,
sfp->sm_retries == 5);
-@@ -1836,7 +1854,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1901,7 +1919,7 @@ static void sfp_sm_main(struct sfp *sfp,
case SFP_S_INIT_TX_FAULT:
if (event == SFP_E_TIMEOUT) {
sfp_module_tx_fault_reset(sfp);
}
break;
-@@ -1860,7 +1878,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1925,7 +1943,7 @@ static void sfp_sm_main(struct sfp *sfp,
case SFP_S_TX_FAULT:
if (event == SFP_E_TIMEOUT) {
sfp_module_tx_fault_reset(sfp);
--- a/drivers/net/phy/sfp-bus.c
+++ b/drivers/net/phy/sfp-bus.c
-@@ -341,9 +341,7 @@ phy_interface_t sfp_select_interface(str
+@@ -342,9 +342,7 @@ phy_interface_t sfp_select_interface(str
if (phylink_test(link_modes, 2500baseX_Full))
return PHY_INTERFACE_MODE_2500BASEX;
if (phylink_test(link_modes, 1000baseX_Full))
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1424,18 +1424,7 @@ static void sfp_sm_fault(struct sfp *sfp
+@@ -1489,18 +1489,7 @@ static void sfp_sm_fault(struct sfp *sfp
static void sfp_sm_probe_for_phy(struct sfp *sfp)
{
--- a/drivers/net/phy/marvell10g.c
+++ b/drivers/net/phy/marvell10g.c
-@@ -227,7 +227,7 @@ static int mv3310_sfp_insert(void *upstr
+@@ -214,7 +214,7 @@ static int mv3310_sfp_insert(void *upstr
phy_interface_t iface;
sfp_parse_support(phydev->sfp_bus, id, support);
dev_err(&phydev->mdio.dev, "incompatible SFP module inserted\n");
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
-@@ -1663,7 +1663,7 @@ static int phylink_sfp_module_insert(voi
+@@ -1718,7 +1718,7 @@ static int phylink_sfp_module_insert(voi
linkmode_copy(support1, support);
- iface = sfp_select_interface(pl->sfp_bus, id, config.advertising);
+ iface = sfp_select_interface(pl->sfp_bus, config.advertising);
if (iface == PHY_INTERFACE_MODE_NA) {
- netdev_err(pl->netdev,
- "selection of interface failed, advertisement %*pb\n",
+ phylink_err(pl,
+ "selection of interface failed, advertisement %*pb\n",
--- a/drivers/net/phy/sfp-bus.c
+++ b/drivers/net/phy/sfp-bus.c
-@@ -319,16 +319,12 @@ EXPORT_SYMBOL_GPL(sfp_parse_support);
+@@ -320,16 +320,12 @@ EXPORT_SYMBOL_GPL(sfp_parse_support);
/**
* sfp_select_interface() - Select appropriate phy_interface_t mode
* @bus: a pointer to the &struct sfp_bus structure for the sfp module
unsigned long *link_modes)
{
if (phylink_test(link_modes, 10000baseCR_Full) ||
-@@ -341,7 +337,8 @@ phy_interface_t sfp_select_interface(str
+@@ -342,7 +338,8 @@ phy_interface_t sfp_select_interface(str
if (phylink_test(link_modes, 2500baseX_Full))
return PHY_INTERFACE_MODE_2500BASEX;
--- a/drivers/net/phy/sfp-bus.c
+++ b/drivers/net/phy/sfp-bus.c
-@@ -123,35 +123,35 @@ int sfp_parse_port(struct sfp_bus *bus,
+@@ -124,35 +124,35 @@ int sfp_parse_port(struct sfp_bus *bus,
/* port is the physical connector, set this from the connector field. */
switch (id->base.connector) {
port = PORT_OTHER;
break;
default:
-@@ -260,22 +260,33 @@ void sfp_parse_support(struct sfp_bus *b
+@@ -261,22 +261,33 @@ void sfp_parse_support(struct sfp_bus *b
}
switch (id->base.extended_cc) {
default:
dev_warn(bus->sfp_dev,
"Unknown/unsupported extended compliance code: 0x%02x\n",
-@@ -300,7 +311,7 @@ void sfp_parse_support(struct sfp_bus *b
+@@ -301,7 +312,7 @@ void sfp_parse_support(struct sfp_bus *b
*/
if (bitmap_empty(modes, __ETHTOOL_LINK_MODE_MASK_NBITS)) {
/* If the encoding and bit rate allows 1000baseX */
br_min <= 1300 && br_max >= 1200)
phylink_set(modes, 1000baseX_Full);
}
-@@ -331,7 +342,8 @@ phy_interface_t sfp_select_interface(str
+@@ -332,7 +343,8 @@ phy_interface_t sfp_select_interface(str
phylink_test(link_modes, 10000baseSR_Full) ||
phylink_test(link_modes, 10000baseLR_Full) ||
phylink_test(link_modes, 10000baseLRM_Full) ||
if (phylink_test(link_modes, 2500baseX_Full))
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -240,7 +240,7 @@ struct sfp {
+@@ -242,7 +242,7 @@ struct sfp {
static bool sff_module_supported(const struct sfp_eeprom_id *id)
{
id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP;
}
-@@ -251,7 +251,7 @@ static const struct sff_data sff_data =
+@@ -253,7 +253,7 @@ static const struct sff_data sff_data =
static bool sfp_module_supported(const struct sfp_eeprom_id *id)
{
--- a/drivers/net/phy/sfp-bus.c
+++ b/drivers/net/phy/sfp-bus.c
-@@ -711,6 +711,27 @@ void sfp_module_remove(struct sfp_bus *b
+@@ -712,6 +712,27 @@ void sfp_module_remove(struct sfp_bus *b
}
EXPORT_SYMBOL_GPL(sfp_module_remove);
bus->sfp_dev = NULL;
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -57,6 +57,7 @@ enum {
+@@ -59,6 +59,7 @@ enum {
SFP_DEV_UP,
SFP_S_DOWN = 0,
SFP_S_WAIT,
SFP_S_INIT,
SFP_S_INIT_TX_FAULT,
-@@ -120,6 +121,7 @@ static const char *event_to_str(unsigned
+@@ -122,6 +123,7 @@ static const char *event_to_str(unsigned
static const char * const sm_state_strings[] = {
[SFP_S_DOWN] = "down",
[SFP_S_WAIT] = "wait",
[SFP_S_INIT] = "init",
[SFP_S_INIT_TX_FAULT] = "init_tx_fault",
-@@ -1766,6 +1768,8 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1831,6 +1833,8 @@ static void sfp_sm_main(struct sfp *sfp,
if (sfp->sm_state == SFP_S_LINK_UP &&
sfp->sm_dev_state == SFP_DEV_UP)
sfp_sm_link_down(sfp);
if (sfp->mod_phy)
sfp_sm_phy_detach(sfp);
sfp_module_tx_disable(sfp);
-@@ -1833,6 +1837,10 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1898,6 +1902,10 @@ static void sfp_sm_main(struct sfp *sfp,
* clear. Probe for the PHY and check the LOS state.
*/
sfp_sm_probe_for_phy(sfp);
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
-@@ -1717,6 +1717,26 @@ static int phylink_sfp_module_insert(voi
+@@ -1772,6 +1772,26 @@ static int phylink_sfp_module_insert(voi
return ret;
}
static void phylink_sfp_link_down(void *upstream)
{
struct phylink *pl = upstream;
-@@ -1752,6 +1772,8 @@ static const struct sfp_upstream_ops sfp
+@@ -1807,6 +1827,8 @@ static const struct sfp_upstream_ops sfp
.attach = phylink_sfp_attach,
.detach = phylink_sfp_detach,
.module_insert = phylink_sfp_module_insert,
.connect_phy = phylink_sfp_connect_phy,
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1331,7 +1331,6 @@ static void sfp_sm_mod_next(struct sfp *
+@@ -1396,7 +1396,6 @@ static void sfp_sm_mod_next(struct sfp *
static void sfp_sm_phy_detach(struct sfp *sfp)
{
sfp_remove_phy(sfp->sfp_bus);
phy_device_remove(sfp->mod_phy);
phy_device_free(sfp->mod_phy);
-@@ -1362,7 +1361,6 @@ static void sfp_sm_probe_phy(struct sfp
+@@ -1427,7 +1426,6 @@ static void sfp_sm_probe_phy(struct sfp
}
sfp->mod_phy = phy;
--- a/drivers/net/phy/mdio-i2c.c
+++ b/drivers/net/phy/mdio-i2c.c
-@@ -36,17 +36,24 @@ static int i2c_mii_read(struct mii_bus *
+@@ -33,17 +33,24 @@ static int i2c_mii_read(struct mii_bus *
{
struct i2c_adapter *i2c = bus->priv;
struct i2c_msg msgs[2];
msgs[1].addr = bus_addr;
msgs[1].flags = I2C_M_RD;
msgs[1].len = sizeof(data);
-@@ -64,18 +71,23 @@ static int i2c_mii_write(struct mii_bus
+@@ -61,18 +68,23 @@ static int i2c_mii_write(struct mii_bus
struct i2c_adapter *i2c = bus->priv;
struct i2c_msg msg;
int ret;
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
-@@ -728,11 +728,9 @@ static int phylink_bringup_phy(struct ph
+@@ -765,11 +765,9 @@ static int phylink_bringup_phy(struct ph
return 0;
}
if (WARN_ON(pl->link_an_mode == MLO_AN_FIXED ||
(pl->link_an_mode == MLO_AN_INBAND &&
phy_interface_mode_is_8023z(interface))))
-@@ -741,15 +739,7 @@ static int __phylink_connect_phy(struct
+@@ -778,15 +776,7 @@ static int __phylink_connect_phy(struct
if (pl->phydev)
return -EBUSY;
}
/**
-@@ -769,13 +759,23 @@ static int __phylink_connect_phy(struct
+@@ -806,13 +796,23 @@ static int __phylink_connect_phy(struct
*/
int phylink_connect_phy(struct phylink *pl, struct phy_device *phy)
{
}
EXPORT_SYMBOL_GPL(phylink_connect_phy);
-@@ -1759,8 +1759,17 @@ static void phylink_sfp_link_up(void *up
+@@ -1814,8 +1814,17 @@ static void phylink_sfp_link_up(void *up
static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
{
struct phylink *pl = upstream;
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
-@@ -671,7 +671,8 @@ static void phylink_phy_change(struct ph
- phy_duplex_to_str(phydev->duplex));
+@@ -712,7 +712,8 @@ static void phylink_phy_change(struct ph
+ phy_duplex_to_str(phydev->duplex));
}
-static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy)
{
struct phylink_link_state config;
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
-@@ -691,7 +692,7 @@ static int phylink_bringup_phy(struct ph
- ethtool_convert_legacy_u32_to_link_mode(supported, phy->supported);
- ethtool_convert_legacy_u32_to_link_mode(config.advertising,
- phy->advertising);
+@@ -730,7 +731,7 @@ static int phylink_bringup_phy(struct ph
+ memset(&config, 0, sizeof(config));
+ linkmode_copy(supported, phy->supported);
+ linkmode_copy(config.advertising, phy->advertising);
- config.interface = pl->link_config.interface;
+ config.interface = interface;
ret = phylink_validate(pl, supported, &config);
if (ret)
-@@ -707,6 +708,7 @@ static int phylink_bringup_phy(struct ph
+@@ -746,6 +747,7 @@ static int phylink_bringup_phy(struct ph
mutex_lock(&phy->lock);
mutex_lock(&pl->state_mutex);
pl->phydev = phy;
linkmode_copy(pl->supported, supported);
linkmode_copy(pl->link_config.advertising, config.advertising);
-@@ -771,7 +773,7 @@ int phylink_connect_phy(struct phylink *
+@@ -808,7 +810,7 @@ int phylink_connect_phy(struct phylink *
if (ret < 0)
return ret;
if (ret)
phy_detach(phy);
-@@ -824,7 +826,7 @@ int phylink_of_phy_connect(struct phylin
+@@ -861,7 +863,7 @@ int phylink_of_phy_connect(struct phylin
if (!phy_dev)
return -ENODEV;
if (ret)
phy_detach(phy_dev);
-@@ -1759,13 +1761,22 @@ static void phylink_sfp_link_up(void *up
+@@ -1814,13 +1816,22 @@ static void phylink_sfp_link_up(void *up
static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
{
struct phylink *pl = upstream;
u8 link_port; /* The current non-phy ethtool port */
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
-@@ -253,12 +254,12 @@ static int phylink_parse_mode(struct phy
+@@ -258,12 +259,12 @@ static int phylink_parse_mode(struct phy
dn = fwnode_get_named_child_node(fwnode, "fixed-link");
if (dn || fwnode_property_present(fwnode, "fixed-link"))
strcmp(managed, "in-band-status") == 0) {
- if (pl->link_an_mode == MLO_AN_FIXED) {
+ if (pl->cfg_link_an_mode == MLO_AN_FIXED) {
- netdev_err(pl->netdev,
- "can't use both fixed-link and in-band-status\n");
+ phylink_err(pl,
+ "can't use both fixed-link and in-band-status\n");
return -EINVAL;
-@@ -270,7 +271,7 @@ static int phylink_parse_mode(struct phy
+@@ -275,7 +276,7 @@ static int phylink_parse_mode(struct phy
phylink_set(pl->supported, Asym_Pause);
phylink_set(pl->supported, Pause);
pl->link_config.an_enabled = true;
switch (pl->link_config.interface) {
case PHY_INTERFACE_MODE_SGMII:
-@@ -330,14 +331,14 @@ static void phylink_mac_config(struct ph
+@@ -335,14 +336,14 @@ static void phylink_mac_config(struct ph
{
- netdev_dbg(pl->netdev,
- "%s: mode=%s/%s/%s/%s adv=%*pb pause=%02x link=%u an=%u\n",
-- __func__, phylink_an_mode_str(pl->link_an_mode),
-+ __func__, phylink_an_mode_str(pl->cur_link_an_mode),
- phy_modes(state->interface),
- phy_speed_to_str(state->speed),
- phy_duplex_to_str(state->duplex),
- __ETHTOOL_LINK_MODE_MASK_NBITS, state->advertising,
- state->pause, state->link, state->an_enabled);
-
-- pl->ops->mac_config(pl->netdev, pl->link_an_mode, state);
-+ pl->ops->mac_config(pl->netdev, pl->cur_link_an_mode, state);
+ phylink_dbg(pl,
+ "%s: mode=%s/%s/%s/%s adv=%*pb pause=%02x link=%u an=%u\n",
+- __func__, phylink_an_mode_str(pl->link_an_mode),
++ __func__, phylink_an_mode_str(pl->cur_link_an_mode),
+ phy_modes(state->interface),
+ phy_speed_to_str(state->speed),
+ phy_duplex_to_str(state->duplex),
+ __ETHTOOL_LINK_MODE_MASK_NBITS, state->advertising,
+ state->pause, state->link, state->an_enabled);
+
+- pl->ops->mac_config(pl->config, pl->link_an_mode, state);
++ pl->ops->mac_config(pl->config, pl->cur_link_an_mode, state);
}
static void phylink_mac_config_up(struct phylink *pl,
-@@ -446,7 +447,7 @@ static void phylink_resolve(struct work_
+@@ -443,7 +444,7 @@ static void phylink_mac_link_up(struct p
+ struct net_device *ndev = pl->netdev;
+
+ pl->cur_interface = link_state.interface;
+- pl->ops->mac_link_up(pl->config, pl->link_an_mode,
++ pl->ops->mac_link_up(pl->config, pl->cur_link_an_mode,
+ pl->cur_interface, pl->phydev);
+
+ if (ndev)
+@@ -462,7 +463,7 @@ static void phylink_mac_link_down(struct
+
+ if (ndev)
+ netif_carrier_off(ndev);
+- pl->ops->mac_link_down(pl->config, pl->link_an_mode,
++ pl->ops->mac_link_down(pl->config, pl->cur_link_an_mode,
+ pl->cur_interface);
+ phylink_info(pl, "Link is Down\n");
+ }
+@@ -481,7 +482,7 @@ static void phylink_resolve(struct work_
} else if (pl->mac_link_dropped) {
link_state.link = false;
} else {
case MLO_AN_PHY:
link_state = pl->phy_state;
phylink_resolve_flow(pl, &link_state);
-@@ -483,12 +484,12 @@ static void phylink_resolve(struct work_
- if (link_state.link != netif_carrier_ok(ndev)) {
- if (!link_state.link) {
- netif_carrier_off(ndev);
-- pl->ops->mac_link_down(ndev, pl->link_an_mode,
-+ pl->ops->mac_link_down(ndev, pl->cur_link_an_mode,
- pl->cur_interface);
- netdev_info(ndev, "Link is Down\n");
- } else {
- pl->cur_interface = link_state.interface;
-- pl->ops->mac_link_up(ndev, pl->link_an_mode,
-+ pl->ops->mac_link_up(ndev, pl->cur_link_an_mode,
- pl->cur_interface, pl->phydev);
-
- netif_carrier_on(ndev);
-@@ -610,7 +611,7 @@ struct phylink *phylink_create(struct ne
+@@ -649,7 +650,7 @@ struct phylink *phylink_create(struct ph
return ERR_PTR(ret);
}
ret = phylink_parse_fixedlink(pl, fwnode);
if (ret < 0) {
kfree(pl);
-@@ -618,6 +619,8 @@ struct phylink *phylink_create(struct ne
+@@ -657,6 +658,8 @@ struct phylink *phylink_create(struct ph
}
}
ret = phylink_register_sfp(pl, fwnode);
if (ret < 0) {
kfree(pl);
-@@ -733,8 +736,8 @@ static int phylink_bringup_phy(struct ph
+@@ -770,8 +773,8 @@ static int phylink_bringup_phy(struct ph
static int phylink_attach_phy(struct phylink *pl, struct phy_device *phy,
phy_interface_t interface)
{
phy_interface_mode_is_8023z(interface))))
return -EINVAL;
-@@ -801,8 +804,8 @@ int phylink_of_phy_connect(struct phylin
+@@ -838,8 +841,8 @@ int phylink_of_phy_connect(struct phylin
int ret;
/* Fixed links and 802.3z are handled without needing a PHY */
phy_interface_mode_is_8023z(pl->link_interface)))
return 0;
-@@ -813,7 +816,7 @@ int phylink_of_phy_connect(struct phylin
+@@ -850,7 +853,7 @@ int phylink_of_phy_connect(struct phylin
phy_node = of_parse_phandle(dn, "phy-device", 0);
if (!phy_node) {
return -ENODEV;
return 0;
}
-@@ -876,7 +879,7 @@ int phylink_fixed_state_cb(struct phylin
+@@ -913,7 +916,7 @@ int phylink_fixed_state_cb(struct phylin
/* It does not make sense to let the link be overriden unless we use
* MLO_AN_FIXED
*/
return -EINVAL;
mutex_lock(&pl->state_mutex);
-@@ -926,7 +929,7 @@ void phylink_start(struct phylink *pl)
+@@ -963,7 +966,7 @@ void phylink_start(struct phylink *pl)
ASSERT_RTNL();
- netdev_info(pl->netdev, "configuring for %s/%s link mode\n",
-- phylink_an_mode_str(pl->link_an_mode),
-+ phylink_an_mode_str(pl->cur_link_an_mode),
- phy_modes(pl->link_config.interface));
+ phylink_info(pl, "configuring for %s/%s link mode\n",
+- phylink_an_mode_str(pl->link_an_mode),
++ phylink_an_mode_str(pl->cur_link_an_mode),
+ phy_modes(pl->link_config.interface));
/* Always set the carrier off */
-@@ -948,7 +951,7 @@ void phylink_start(struct phylink *pl)
+@@ -986,7 +989,7 @@ void phylink_start(struct phylink *pl)
clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state);
phylink_run_resolve(pl);
int irq = gpiod_to_irq(pl->link_gpio);
if (irq > 0) {
-@@ -963,7 +966,7 @@ void phylink_start(struct phylink *pl)
+@@ -1001,7 +1004,7 @@ void phylink_start(struct phylink *pl)
if (irq <= 0)
mod_timer(&pl->link_poll, jiffies + HZ);
}
mod_timer(&pl->link_poll, jiffies + HZ);
if (pl->phydev)
phy_start(pl->phydev);
-@@ -1090,7 +1093,7 @@ int phylink_ethtool_ksettings_get(struct
+@@ -1128,7 +1131,7 @@ int phylink_ethtool_ksettings_get(struct
linkmode_copy(kset->link_modes.supported, pl->supported);
case MLO_AN_FIXED:
/* We are using fixed settings. Report these as the
* current link settings - and note that these also
-@@ -1163,7 +1166,7 @@ int phylink_ethtool_ksettings_set(struct
+@@ -1200,7 +1203,7 @@ int phylink_ethtool_ksettings_set(struct
/* If we have a fixed link (as specified by firmware), refuse
* to change link parameters.
*/
(s->speed != pl->link_config.speed ||
s->duplex != pl->link_config.duplex))
return -EINVAL;
-@@ -1175,7 +1178,7 @@ int phylink_ethtool_ksettings_set(struct
+@@ -1212,7 +1215,7 @@ int phylink_ethtool_ksettings_set(struct
__clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, config.advertising);
} else {
/* If we have a fixed link, refuse to enable autonegotiation */
return -EINVAL;
config.speed = SPEED_UNKNOWN;
-@@ -1217,7 +1220,7 @@ int phylink_ethtool_ksettings_set(struct
+@@ -1254,7 +1257,7 @@ int phylink_ethtool_ksettings_set(struct
* configuration. For a fixed link, this isn't able to change any
* parameters, which just leaves inband mode.
*/
!test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) {
phylink_mac_config(pl, &pl->link_config);
phylink_mac_an_restart(pl);
-@@ -1307,7 +1310,7 @@ int phylink_ethtool_set_pauseparam(struc
+@@ -1344,7 +1347,7 @@ int phylink_ethtool_set_pauseparam(struc
pause->tx_pause);
} else if (!test_bit(PHYLINK_DISABLE_STOPPED,
&pl->phylink_disable_state)) {
case MLO_AN_FIXED:
/* Should we allow fixed links to change against the config? */
phylink_resolve_flow(pl, config);
-@@ -1496,7 +1499,7 @@ static int phylink_mii_read(struct phyli
+@@ -1551,7 +1554,7 @@ static int phylink_mii_read(struct phyli
struct phylink_link_state state;
int val = 0xffff;
case MLO_AN_FIXED:
if (phy_id == 0) {
phylink_get_fixed_state(pl, &state);
-@@ -1524,7 +1527,7 @@ static int phylink_mii_read(struct phyli
+@@ -1579,7 +1582,7 @@ static int phylink_mii_read(struct phyli
static int phylink_mii_write(struct phylink *pl, unsigned int phy_id,
unsigned int reg, unsigned int val)
{
case MLO_AN_FIXED:
break;
-@@ -1698,10 +1701,10 @@ static int phylink_sfp_module_insert(voi
+@@ -1753,10 +1756,10 @@ static int phylink_sfp_module_insert(voi
linkmode_copy(pl->link_config.advertising, config.advertising);
}
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
-@@ -1633,25 +1633,21 @@ static void phylink_sfp_detach(void *ups
+@@ -1688,25 +1688,21 @@ static void phylink_sfp_detach(void *ups
pl->netdev->sfp_bus = NULL;
}
config.interface = PHY_INTERFACE_MODE_NA;
config.speed = SPEED_UNKNOWN;
config.duplex = DUPLEX_UNKNOWN;
-@@ -1666,8 +1662,6 @@ static int phylink_sfp_module_insert(voi
+@@ -1721,8 +1717,6 @@ static int phylink_sfp_module_insert(voi
return ret;
}
-
iface = sfp_select_interface(pl->sfp_bus, config.advertising);
if (iface == PHY_INTERFACE_MODE_NA) {
- netdev_err(pl->netdev,
-@@ -1677,18 +1671,18 @@ static int phylink_sfp_module_insert(voi
+ phylink_err(pl,
+@@ -1732,18 +1726,18 @@ static int phylink_sfp_module_insert(voi
}
config.interface = iface;
+ linkmode_copy(support1, support);
ret = phylink_validate(pl, support1, &config);
if (ret) {
- netdev_err(pl->netdev, "validation of %s/%s with support %*pb failed: %d\n",
-- phylink_an_mode_str(MLO_AN_INBAND),
-+ phylink_an_mode_str(mode),
- phy_modes(config.interface),
- __ETHTOOL_LINK_MODE_MASK_NBITS, support, ret);
+ phylink_err(pl, "validation of %s/%s with support %*pb failed: %d\n",
+- phylink_an_mode_str(MLO_AN_INBAND),
++ phylink_an_mode_str(mode),
+ phy_modes(config.interface),
+ __ETHTOOL_LINK_MODE_MASK_NBITS, support, ret);
return ret;
}
- netdev_dbg(pl->netdev, "requesting link mode %s/%s with support %*pb\n",
-- phylink_an_mode_str(MLO_AN_INBAND),
-- phy_modes(config.interface),
-+ phylink_an_mode_str(mode), phy_modes(config.interface),
- __ETHTOOL_LINK_MODE_MASK_NBITS, support);
+ phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n",
+- phylink_an_mode_str(MLO_AN_INBAND),
+- phy_modes(config.interface),
++ phylink_an_mode_str(mode), phy_modes(config.interface),
+ __ETHTOOL_LINK_MODE_MASK_NBITS, support);
if (phy_interface_mode_is_8023z(iface) && pl->phydev)
-@@ -1701,15 +1695,15 @@ static int phylink_sfp_module_insert(voi
+@@ -1756,15 +1750,15 @@ static int phylink_sfp_module_insert(voi
linkmode_copy(pl->link_config.advertising, config.advertising);
}
changed = true;
- netdev_info(pl->netdev, "switched to %s/%s link mode\n",
-- phylink_an_mode_str(MLO_AN_INBAND),
-+ phylink_an_mode_str(mode),
- phy_modes(config.interface));
+ phylink_info(pl, "switched to %s/%s link mode\n",
+- phylink_an_mode_str(MLO_AN_INBAND),
++ phylink_an_mode_str(mode),
+ phy_modes(config.interface));
}
-@@ -1722,6 +1716,21 @@ static int phylink_sfp_module_insert(voi
+@@ -1777,6 +1771,21 @@ static int phylink_sfp_module_insert(voi
return ret;
}
-From eb514428f75bc67d12ff019c44a8f8ca9f33c54c Mon Sep 17 00:00:00 2001
+From 52c956003a9d5bcae1f445f9dfd42b624adb6e87 Mon Sep 17 00:00:00 2001
From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Thu, 21 Nov 2019 17:42:49 +0000
-Subject: [PATCH 653/660] net: phylink: delay MAC configuration for copper SFP
- modules
+Date: Wed, 11 Dec 2019 10:56:45 +0000
+Subject: [PATCH] net: phylink: delay MAC configuration for copper SFP modules
Knowing whether we need to delay the MAC configuration because a module
may have a PHY is useful to phylink to allow NBASE-T modules to work on
capabilities rather than the EEPROM parsed capabilities to determine
whether we can support the PHY.
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: David S. Miller <davem@davemloft.net>
---
- drivers/net/phy/phylink.c | 59 +++++++++++++++++++++++++++++++--------
- drivers/net/phy/sfp-bus.c | 28 +++++++++++++++++++
- include/linux/sfp.h | 7 +++++
- 3 files changed, 83 insertions(+), 11 deletions(-)
+ drivers/net/phy/phylink.c | 53 +++++++++++++++++++++++++++++++--------
+ drivers/net/phy/sfp-bus.c | 28 +++++++++++++++++++++
+ include/linux/sfp.h | 7 ++++++
+ 3 files changed, 78 insertions(+), 10 deletions(-)
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
+ u8 sfp_port;
};
- static inline void linkmode_zero(unsigned long *dst)
-@@ -1633,7 +1636,7 @@ static void phylink_sfp_detach(void *ups
+ #define phylink_printk(level, pl, fmt, ...) \
+@@ -1688,7 +1691,7 @@ static void phylink_sfp_detach(void *ups
pl->netdev->sfp_bus = NULL;
}
const unsigned long *supported,
const unsigned long *advertising)
{
-@@ -1707,7 +1710,7 @@ static int phylink_sfp_config(struct phy
- phy_modes(config.interface));
+@@ -1762,7 +1765,7 @@ static int phylink_sfp_config(struct phy
+ phy_modes(config.interface));
}
- pl->link_port = port;
if (changed && !test_bit(PHYLINK_DISABLE_STOPPED,
&pl->phylink_disable_state))
-@@ -1720,15 +1723,20 @@ static int phylink_sfp_module_insert(voi
+@@ -1775,15 +1778,20 @@ static int phylink_sfp_module_insert(voi
const struct sfp_eeprom_id *id)
{
struct phylink *pl = upstream;
}
static int phylink_sfp_module_start(void *upstream)
-@@ -1736,10 +1744,19 @@ static int phylink_sfp_module_start(void
+@@ -1791,10 +1799,19 @@ static int phylink_sfp_module_start(void
struct phylink *pl = upstream;
/* If this SFP module has a PHY, start the PHY now. */
}
static void phylink_sfp_module_stop(void *upstream)
-@@ -1773,10 +1790,30 @@ static void phylink_sfp_link_up(void *up
+@@ -1828,10 +1845,26 @@ static void phylink_sfp_link_up(void *up
static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
{
struct phylink *pl = upstream;
- phy_interface_t interface = pl->link_config.interface;
-+ __ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
-+ __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
+ phy_interface_t interface;
int ret;
+ */
+ phy_support_asym_pause(phy);
+
-+ ethtool_convert_legacy_u32_to_link_mode(supported, phy->supported);
-+ ethtool_convert_legacy_u32_to_link_mode(advertising, phy->advertising);
-+
+ /* Do the initial configuration */
-+ ret = phylink_sfp_config(pl, ML_AN_INBAND, supported, advertising);
++ ret = phylink_sfp_config(pl, MLO_AN_INBAND, phy->supported,
++ phy->advertising);
+ if (ret < 0)
+ return ret;
+
--- a/drivers/net/phy/sfp-bus.c
+++ b/drivers/net/phy/sfp-bus.c
-@@ -102,6 +102,7 @@ static const struct sfp_quirk *sfp_looku
+@@ -103,6 +103,7 @@ static const struct sfp_quirk *sfp_looku
return NULL;
}
/**
* sfp_parse_port() - Parse the EEPROM base ID, setting the port type
* @bus: a pointer to the &struct sfp_bus structure for the sfp module
-@@ -178,6 +179,33 @@ int sfp_parse_port(struct sfp_bus *bus,
+@@ -179,6 +180,33 @@ int sfp_parse_port(struct sfp_bus *bus,
EXPORT_SYMBOL_GPL(sfp_parse_port);
/**
-From 3d8592a23dd67fb78ad85ddf711a059d3880fcb4 Mon Sep 17 00:00:00 2001
+From 7adb5b2126bc013f0964ddaefad6ad1b132e86c3 Mon Sep 17 00:00:00 2001
From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Fri, 8 Nov 2019 17:19:16 +0000
-Subject: [PATCH 654/660] net: phylink: make Broadcom BCM84881 based SFPs work
+Date: Wed, 11 Dec 2019 10:56:50 +0000
+Subject: [PATCH] net: phylink: make Broadcom BCM84881 based SFPs work
The Broadcom BCM84881 does not appear to send the SGMII control word
when operating in SGMII mode, which causes network adapters to fail
Work around this by detecting the Broadcom BCM84881 and switch to phy
mode rather than inband mode.
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: David S. Miller <davem@davemloft.net>
---
- drivers/net/phy/phylink.c | 17 ++++++++++++++++-
- 1 file changed, 16 insertions(+), 1 deletion(-)
+ drivers/net/phy/phylink.c | 18 ++++++++++++++++--
+ 1 file changed, 16 insertions(+), 2 deletions(-)
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
-@@ -1787,12 +1787,22 @@ static void phylink_sfp_link_up(void *up
+@@ -1842,10 +1842,20 @@ static void phylink_sfp_link_up(void *up
phylink_run_resolve(pl);
}
static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
{
struct phylink *pl = upstream;
- __ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
- __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
phy_interface_t interface;
+ u8 mode;
int ret;
/*
-@@ -1807,8 +1817,13 @@ static int phylink_sfp_connect_phy(void
- ethtool_convert_legacy_u32_to_link_mode(supported, phy->supported);
- ethtool_convert_legacy_u32_to_link_mode(advertising, phy->advertising);
+@@ -1857,9 +1867,13 @@ static int phylink_sfp_connect_phy(void
+ */
+ phy_support_asym_pause(phy);
+ if (phylink_phy_no_inband(phy))
+ mode = MLO_AN_PHY;
+ mode = MLO_AN_INBAND;
+
/* Do the initial configuration */
-- ret = phylink_sfp_config(pl, ML_AN_INBAND, supported, advertising);
-+ ret = phylink_sfp_config(pl, mode, supported, advertising);
+- ret = phylink_sfp_config(pl, MLO_AN_INBAND, phy->supported,
+- phy->advertising);
++ ret = phylink_sfp_config(pl, mode, phy->supported, phy->advertising);
if (ret < 0)
return ret;
-From 0f669e10ede7f06bb998373de6a9d169f47fcc66 Mon Sep 17 00:00:00 2001
+From 75f4d8d10e016f7428c268424483a927ee7a78bb Mon Sep 17 00:00:00 2001
From: Russell King <rmk+kernel@armlinux.org.uk>
-Date: Tue, 5 Nov 2019 11:54:30 +0000
-Subject: [PATCH 655/660] net: phy: add Broadcom BCM84881 PHY driver
+Date: Wed, 11 Dec 2019 10:56:56 +0000
+Subject: [PATCH] net: phy: add Broadcom BCM84881 PHY driver
Add a rudimentary Clause 45 driver for the BCM84881 PHY, found on
Methode DM7052 SFPs.
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: David S. Miller <davem@davemloft.net>
---
- drivers/net/phy/Kconfig | 5 +
+ drivers/net/phy/Kconfig | 6 +
drivers/net/phy/Makefile | 1 +
- drivers/net/phy/bcm84881.c | 290 +++++++++++++++++++++++++++++++++++++
- 3 files changed, 296 insertions(+)
+ drivers/net/phy/bcm84881.c | 269 +++++++++++++++++++++++++++++++++++++
+ 3 files changed, 276 insertions(+)
create mode 100644 drivers/net/phy/bcm84881.c
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
-@@ -280,6 +280,11 @@ config BROADCOM_PHY
+@@ -329,6 +329,12 @@ config BROADCOM_PHY
Currently supports the BCM5411, BCM5421, BCM5461, BCM54616S, BCM5464,
BCM5481, BCM54810 and BCM5482 PHYs.
+config BCM84881_PHY
+ tristate "Broadcom BCM84881 PHY"
++ depends on PHYLIB
+ ---help---
+ Support the Broadcom BCM84881 PHY.
+
---help---
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
-@@ -54,6 +54,7 @@ obj-$(CONFIG_BCM87XX_PHY) += bcm87xx.o
+@@ -62,6 +62,7 @@ obj-$(CONFIG_BCM87XX_PHY) += bcm87xx.o
obj-$(CONFIG_BCM_CYGNUS_PHY) += bcm-cygnus.o
obj-$(CONFIG_BCM_NET_PHYLIB) += bcm-phy-lib.o
obj-$(CONFIG_BROADCOM_PHY) += broadcom.o
obj-$(CONFIG_DAVICOM_PHY) += davicom.o
--- /dev/null
+++ b/drivers/net/phy/bcm84881.c
-@@ -0,0 +1,290 @@
+@@ -0,0 +1,269 @@
+// SPDX-License-Identifier: GPL-2.0
+// Broadcom BCM84881 NBASE-T PHY driver, as found on a SFP+ module.
+// Copyright (C) 2019 Russell King, Deep Blue Solutions Ltd.
+ return 0;
+}
+
-+static int genphy_c45_an_config_aneg(struct phy_device *phydev)
++static int bcm84881_get_features(struct phy_device *phydev)
+{
-+ bool changed = false;
-+ u32 advertising;
+ int ret;
+
-+ phydev->advertising &= phydev->supported;
-+ advertising = phydev->advertising;
-+
-+ ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE,
-+ ADVERTISE_ALL | ADVERTISE_100BASE4 |
-+ ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
-+ ethtool_adv_to_mii_adv_t(advertising));
-+ if (ret < 0)
++ ret = genphy_c45_pma_read_abilities(phydev);
++ if (ret)
+ return ret;
-+ if (ret > 0)
-+ changed = true;
+
-+ ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
-+ MDIO_AN_10GBT_CTRL_ADV10G,
-+ advertising & ADVERTISED_10000baseT_Full ?
-+ MDIO_AN_10GBT_CTRL_ADV10G : 0);
-+ if (ret < 0)
-+ return ret;
-+ if (ret > 0)
-+ changed = true;
++ /* Although the PHY sets bit 1.11.8, it does not support 10M modes */
++ linkmode_clear_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
++ phydev->supported);
++ linkmode_clear_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
++ phydev->supported);
+
-+ return genphy_c45_check_and_restart_aneg(phydev, changed);
++ return 0;
+}
+
+static int bcm84881_config_aneg(struct phy_device *phydev)
+ if (ret > 0)
+ changed = true;
+
-+ adv = ethtool_adv_to_mii_ctrl1000_t(phydev->advertising);
++ adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
+ ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN,
+ MDIO_AN_C22 + MII_CTRL1000,
+ ADVERTISE_1000FULL | ADVERTISE_1000HALF,
+
+static int bcm84881_read_status(struct phy_device *phydev)
+{
-+ bool autoneg_complete;
+ unsigned int mode;
+ int bmsr, val;
+
+ if (bmsr < 0)
+ return val;
+
-+ autoneg_complete = !!(val & MDIO_AN_STAT1_COMPLETE) &&
-+ !!(bmsr & BMSR_ANEGCOMPLETE);
++ phydev->autoneg_complete = !!(val & MDIO_AN_STAT1_COMPLETE) &&
++ !!(bmsr & BMSR_ANEGCOMPLETE);
+ phydev->link = !!(val & MDIO_STAT1_LSTATUS) &&
+ !!(bmsr & BMSR_LSTATUS);
-+ if (phydev->autoneg == AUTONEG_ENABLE && !autoneg_complete)
++ if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete)
+ phydev->link = false;
+
+ if (!phydev->link)
+ return 0;
+
-+ phydev->lp_advertising = 0;
++ linkmode_zero(phydev->lp_advertising);
+ phydev->speed = SPEED_UNKNOWN;
+ phydev->duplex = DUPLEX_UNKNOWN;
+ phydev->pause = 0;
+ phydev->asym_pause = 0;
+ phydev->mdix = 0;
+
-+ if (autoneg_complete) {
++ if (phydev->autoneg_complete) {
+ val = genphy_c45_read_lpa(phydev);
+ if (val < 0)
+ return val;
+ if (val < 0)
+ return val;
+
-+ phydev->lp_advertising |= mii_stat1000_to_ethtool_lpa_t(val);
++ mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, val);
+
+ if (phydev->autoneg == AUTONEG_ENABLE)
+ phy_resolve_aneg_linkmode(phydev);
+ .phy_id = 0xae025150,
+ .phy_id_mask = 0xfffffff0,
+ .name = "Broadcom BCM84881",
-+ .features = SUPPORTED_100baseT_Full |
-+ SUPPORTED_100baseT_Half |
-+ SUPPORTED_1000baseT_Full |
-+ SUPPORTED_Autoneg |
-+ SUPPORTED_TP |
-+ SUPPORTED_FIBRE |
-+ SUPPORTED_10000baseT_Full |
-+ SUPPORTED_Backplane,
+ .config_init = bcm84881_config_init,
+ .probe = bcm84881_probe,
++ .get_features = bcm84881_get_features,
+ .config_aneg = bcm84881_config_aneg,
+ .aneg_done = bcm84881_aneg_done,
+ .read_status = bcm84881_read_status,
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1337,12 +1337,12 @@ static void sfp_sm_phy_detach(struct sfp
+@@ -1402,12 +1402,12 @@ static void sfp_sm_phy_detach(struct sfp
sfp->mod_phy = NULL;
}
if (phy == ERR_PTR(-ENODEV)) {
dev_info(sfp->dev, "no PHY detected\n");
return;
-@@ -1352,6 +1352,13 @@ static void sfp_sm_probe_phy(struct sfp
+@@ -1417,6 +1417,13 @@ static void sfp_sm_probe_phy(struct sfp
return;
}
err = sfp_add_phy(sfp->sfp_bus, phy);
if (err) {
phy_device_remove(phy);
-@@ -1422,10 +1429,32 @@ static void sfp_sm_fault(struct sfp *sfp
+@@ -1487,10 +1494,32 @@ static void sfp_sm_fault(struct sfp *sfp
}
}
}
static int sfp_module_parse_power(struct sfp *sfp)
-@@ -1485,6 +1514,13 @@ static int sfp_sm_mod_hpower(struct sfp
+@@ -1550,6 +1579,13 @@ static int sfp_sm_mod_hpower(struct sfp
return -EAGAIN;
}
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -2260,6 +2260,10 @@ static int sfp_remove(struct platform_de
+@@ -2343,6 +2343,10 @@ static int sfp_remove(struct platform_de
sfp_unregister_socket(sfp->sfp_bus);
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1731,6 +1731,10 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1796,6 +1796,10 @@ static void sfp_sm_module(struct sfp *sf
break;
}
sfp_sm_mod_next(sfp, SFP_MOD_WAITDEV, 0);
/* fall through */
case SFP_MOD_WAITDEV:
-@@ -1780,15 +1784,6 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1845,15 +1849,6 @@ static void sfp_sm_module(struct sfp *sf
case SFP_MOD_ERROR:
break;
}
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -170,6 +170,14 @@ static const enum gpiod_flags gpio_flags
+@@ -172,6 +172,14 @@ static const enum gpiod_flags gpio_flags
#define T_RESET_US 10
#define T_FAULT_RECOVER msecs_to_jiffies(1000)
/* SFP module presence detection is poor: the three MOD DEF signals are
* the same length on the PCB, which means it's possible for MOD DEF 0 to
* connect before the I2C bus on MOD DEF 1/2.
-@@ -1820,7 +1828,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1885,7 +1893,7 @@ static void sfp_sm_main(struct sfp *sfp,
sfp_module_tx_enable(sfp);
/* Initialise the fault clearance retries */
/* We need to check the TX_FAULT state, which is not defined
* while TX_DISABLE is asserted. The earliest we want to do
-@@ -1860,7 +1868,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1925,7 +1933,7 @@ static void sfp_sm_main(struct sfp *sfp,
* or t_start_up, so assume there is a fault.
*/
sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT,
} else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) {
init_done: /* TX_FAULT deasserted or we timed out with TX_FAULT
* clear. Probe for the PHY and check the LOS state.
-@@ -1873,7 +1881,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1938,7 +1946,7 @@ static void sfp_sm_main(struct sfp *sfp,
sfp_sm_link_check_los(sfp);
/* Reset the fault retry count */
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -232,7 +232,7 @@ struct sfp {
+@@ -234,7 +234,7 @@ struct sfp {
unsigned char sm_mod_tries;
unsigned char sm_dev_state;
unsigned short sm_state;
struct sfp_eeprom_id id;
unsigned int module_power_mW;
-@@ -1425,7 +1425,7 @@ static bool sfp_los_event_inactive(struc
+@@ -1490,7 +1490,7 @@ static bool sfp_los_event_inactive(struc
static void sfp_sm_fault(struct sfp *sfp, unsigned int next_state, bool warn)
{
dev_err(sfp->dev,
"module persistently indicates fault, disabling\n");
sfp_sm_next(sfp, SFP_S_TX_DISABLE, 0);
-@@ -1828,7 +1828,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1893,7 +1893,7 @@ static void sfp_sm_main(struct sfp *sfp,
sfp_module_tx_enable(sfp);
/* Initialise the fault clearance retries */
/* We need to check the TX_FAULT state, which is not defined
* while TX_DISABLE is asserted. The earliest we want to do
-@@ -1868,7 +1868,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1933,7 +1933,7 @@ static void sfp_sm_main(struct sfp *sfp,
* or t_start_up, so assume there is a fault.
*/
sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT,
} else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) {
init_done: /* TX_FAULT deasserted or we timed out with TX_FAULT
* clear. Probe for the PHY and check the LOS state.
-@@ -1881,7 +1881,7 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1946,7 +1946,7 @@ static void sfp_sm_main(struct sfp *sfp,
sfp_sm_link_check_los(sfp);
/* Reset the fault retry count */
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -1345,7 +1345,7 @@ static void sfp_sm_phy_detach(struct sfp
+@@ -1410,7 +1410,7 @@ static void sfp_sm_phy_detach(struct sfp
sfp->mod_phy = NULL;
}
{
struct phy_device *phy;
int err;
-@@ -1353,18 +1353,18 @@ static void sfp_sm_probe_phy(struct sfp
+@@ -1418,18 +1418,18 @@ static void sfp_sm_probe_phy(struct sfp
phy = get_phy_device(sfp->i2c_mii, SFP_PHY_ADDR, is_c45);
if (phy == ERR_PTR(-ENODEV)) {
dev_info(sfp->dev, "no PHY detected\n");
}
err = sfp_add_phy(sfp->sfp_bus, phy);
-@@ -1372,10 +1372,12 @@ static void sfp_sm_probe_phy(struct sfp
+@@ -1437,10 +1437,12 @@ static void sfp_sm_probe_phy(struct sfp
phy_device_remove(phy);
phy_device_free(phy);
dev_err(sfp->dev, "sfp_add_phy failed: %d\n", err);
}
static void sfp_sm_link_up(struct sfp *sfp)
-@@ -1448,21 +1450,24 @@ static void sfp_sm_fault(struct sfp *sfp
+@@ -1513,21 +1515,24 @@ static void sfp_sm_fault(struct sfp *sfp
* Clause 45 copper SFP+ modules (10G) appear to switch their interface
* mode according to the negotiated line speed.
*/
}
static int sfp_module_parse_power(struct sfp *sfp)
-@@ -1873,7 +1878,10 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1938,7 +1943,10 @@ static void sfp_sm_main(struct sfp *sfp,
init_done: /* TX_FAULT deasserted or we timed out with TX_FAULT
* clear. Probe for the PHY and check the LOS state.
*/
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
-@@ -60,6 +60,7 @@ enum {
+@@ -62,6 +62,7 @@ enum {
SFP_S_FAIL,
SFP_S_WAIT,
SFP_S_INIT,
SFP_S_INIT_TX_FAULT,
SFP_S_WAIT_LOS,
SFP_S_LINK_UP,
-@@ -124,6 +125,7 @@ static const char * const sm_state_strin
+@@ -126,6 +127,7 @@ static const char * const sm_state_strin
[SFP_S_FAIL] = "fail",
[SFP_S_WAIT] = "wait",
[SFP_S_INIT] = "init",
[SFP_S_INIT_TX_FAULT] = "init_tx_fault",
[SFP_S_WAIT_LOS] = "wait_los",
[SFP_S_LINK_UP] = "link_up",
-@@ -178,6 +180,12 @@ static const enum gpiod_flags gpio_flags
+@@ -180,6 +182,12 @@ static const enum gpiod_flags gpio_flags
#define N_FAULT_INIT 5
#define N_FAULT 5
/* SFP module presence detection is poor: the three MOD DEF signals are
* the same length on the PCB, which means it's possible for MOD DEF 0 to
* connect before the I2C bus on MOD DEF 1/2.
-@@ -233,6 +241,7 @@ struct sfp {
+@@ -235,6 +243,7 @@ struct sfp {
unsigned char sm_dev_state;
unsigned short sm_state;
unsigned char sm_fault_retries;
struct sfp_eeprom_id id;
unsigned int module_power_mW;
-@@ -1351,10 +1360,8 @@ static int sfp_sm_probe_phy(struct sfp *
+@@ -1416,10 +1425,8 @@ static int sfp_sm_probe_phy(struct sfp *
int err;
phy = get_phy_device(sfp->i2c_mii, SFP_PHY_ADDR, is_c45);
if (IS_ERR(phy)) {
dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy));
return PTR_ERR(phy);
-@@ -1802,6 +1809,7 @@ static void sfp_sm_module(struct sfp *sf
+@@ -1867,6 +1874,7 @@ static void sfp_sm_module(struct sfp *sf
static void sfp_sm_main(struct sfp *sfp, unsigned int event)
{
unsigned long timeout;
/* Some events are global */
if (sfp->sm_state != SFP_S_DOWN &&
-@@ -1875,22 +1883,39 @@ static void sfp_sm_main(struct sfp *sfp,
+@@ -1940,22 +1948,39 @@ static void sfp_sm_main(struct sfp *sfp,
sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT,
sfp->sm_fault_retries == N_FAULT_INIT);
} else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) {
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
-@@ -89,6 +89,13 @@ config XEN_PCIDEV_FRONTEND
+@@ -115,6 +115,13 @@ config XEN_PCIDEV_FRONTEND
The PCI device frontend driver allows the kernel to import arbitrary
PCI devices from a PCI backend to support PCI driver domains.
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
-@@ -207,6 +207,7 @@ static void quirk_mmio_always_on(struct
+@@ -205,6 +205,7 @@ static void quirk_mmio_always_on(struct
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_ANY_ID, PCI_ANY_ID,
PCI_CLASS_BRIDGE_HOST, 8, quirk_mmio_always_on);
/*
* The Mellanox Tavor device gives false positive parity errors. Mark this
* device with a broken_parity_status to allow PCI scanning code to "skip"
-@@ -3152,6 +3153,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
+@@ -3241,6 +3242,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata);
/*
* Ivytown NTB BAR sizes are misreported by the hardware due to an erratum.
* To work around this, query the size it should be configured to by the
-@@ -3177,6 +3180,8 @@ static void quirk_intel_ntb(struct pci_d
+@@ -3266,6 +3269,8 @@ static void quirk_intel_ntb(struct pci_d
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e08, quirk_intel_ntb);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e0d, quirk_intel_ntb);
/*
* Some BIOS implementations leave the Intel GPU interrupts enabled, even
* though no one is handling them (e.g., if the i915 driver is never
-@@ -3215,6 +3220,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN
+@@ -3304,6 +3309,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq);
static struct amd_chipset_info {
struct pci_dev *nb_dev;
struct pci_dev *smbus_dev;
-@@ -628,6 +630,10 @@ bool usb_amd_pt_check_port(struct device
+@@ -630,6 +632,10 @@ bool usb_amd_pt_check_port(struct device
}
EXPORT_SYMBOL_GPL(usb_amd_pt_check_port);
/*
* Make sure the controller is completely inactive, unable to
* generate interrupts or do DMA.
-@@ -707,8 +713,17 @@ reset_needed:
+@@ -709,8 +715,17 @@ reset_needed:
uhci_reset_hc(pdev, base);
return 1;
}
static inline int io_type_enabled(struct pci_dev *pdev, unsigned int mask)
{
u16 cmd;
-@@ -1275,3 +1290,4 @@ static void quirk_usb_early_handoff(stru
+@@ -1271,3 +1286,4 @@ static void quirk_usb_early_handoff(stru
}
DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,
PCI_CLASS_SERIAL_USB, 8, quirk_usb_early_handoff);
+#endif /* CONFIG_USB_PCI */
+
+#if defined(CONFIG_USB_PCI) && !defined(CONFIG_PCI_DISABLE_COMMON_QUIRKS)
- int usb_amd_find_chipset_info(void);
int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev);
bool usb_amd_hang_symptom_quirk(void);
+ bool usb_amd_prefetch_quirk(void);
@@ -19,6 +22,18 @@ void sb800_prefetch(struct device *dev,
bool usb_amd_pt_check_port(struct device *device, int port);
#else
struct pci_dev;
-+static inline int usb_amd_find_chipset_info(void)
++static inline int usb_amd_quirk_pll_check(void)
+{
+ return 0;
+}
#endif /* __LINUX_USB_PCI_QUIRKS_H */
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
-@@ -473,7 +473,14 @@ extern int usb_hcd_pci_probe(struct pci_
+@@ -483,7 +483,14 @@ extern int usb_hcd_pci_probe(struct pci_
extern void usb_hcd_pci_remove(struct pci_dev *dev);
extern void usb_hcd_pci_shutdown(struct pci_dev *dev);
--- a/drivers/ata/Kconfig
+++ b/drivers/ata/Kconfig
-@@ -46,6 +46,22 @@ config ATA_VERBOSE_ERROR
+@@ -45,6 +45,22 @@ config ATA_VERBOSE_ERROR
If unsure, say Y.
depends on ACPI
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
-@@ -731,6 +731,19 @@ u64 ata_tf_read_block(const struct ata_t
+@@ -715,6 +715,19 @@ u64 ata_tf_read_block(const struct ata_t
return block;
}
/**
* ata_build_rw_tf - Build ATA taskfile for given read/write request
* @tf: Target ATA taskfile
-@@ -5134,6 +5147,9 @@ struct ata_queued_cmd *ata_qc_new_init(s
+@@ -5116,6 +5129,9 @@ struct ata_queued_cmd *ata_qc_new_init(s
if (tag < 0)
return NULL;
}
qc = __ata_qc_from_tag(ap, tag);
qc->tag = qc->hw_tag = tag;
-@@ -6068,6 +6084,9 @@ struct ata_port *ata_port_alloc(struct a
+@@ -6050,6 +6066,9 @@ struct ata_port *ata_port_alloc(struct a
ap->stats.unhandled_irq = 1;
ap->stats.idle_irq = 1;
#endif
ata_sff_port_init(ap);
return ap;
-@@ -6103,6 +6122,12 @@ static void ata_host_release(struct kref
+@@ -6085,6 +6104,12 @@ static void ata_host_release(struct kref
kfree(ap->pmp_link);
kfree(ap->slave_link);
kfree(ap);
host->ports[i] = NULL;
}
-@@ -6566,7 +6591,23 @@ int ata_host_register(struct ata_host *h
+@@ -6548,7 +6573,23 @@ int ata_host_register(struct ata_host *h
host->ports[i]->print_id = atomic_inc_return(&ata_print_id);
host->ports[i]->local_port_no = i + 1;
}
rc = ata_tport_add(host->dev,host->ports[i]);
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
-@@ -38,6 +38,9 @@
+@@ -22,6 +22,9 @@
#include <linux/acpi.h>
#include <linux/cdrom.h>
#include <linux/sched.h>
/*
* Define if arch has non-standard setup. This is a _PCI_ standard
-@@ -893,6 +896,12 @@ struct ata_port {
+@@ -876,6 +879,12 @@ struct ata_port {
#ifdef CONFIG_ATA_ACPI
struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */
#endif
--- a/init/Kconfig
+++ b/init/Kconfig
-@@ -1531,6 +1531,15 @@ config EMBEDDED
+@@ -1700,6 +1700,15 @@ config EMBEDDED
an embedded system so certain expert options are available
for configuration.
help
--- a/init/main.c
+++ b/init/main.c
-@@ -365,6 +365,29 @@ static inline void setup_nr_cpu_ids(void
+@@ -366,6 +366,29 @@ static inline void setup_nr_cpu_ids(void
static inline void smp_prepare_cpus(unsigned int maxcpus) { }
#endif
/*
* We need to store the untouched command line for future reference.
* We also need to store the touched command line since the parameter
-@@ -557,6 +580,7 @@ asmlinkage __visible void __init start_k
- add_device_randomness(command_line, strlen(command_line));
- boot_init_stack_canary();
- mm_init_cpumask(&init_mm);
+@@ -596,6 +619,7 @@ asmlinkage __visible void __init start_k
+ pr_notice("%s", linux_banner);
+ early_security_init();
+ setup_arch(&command_line);
+ mangle_bootargs(command_line);
setup_command_line(command_line);
setup_nr_cpu_ids();