kernel: remove support for kernel 4.9
authorAdrian Schmutzler <freifunk@adrianschmutzler.de>
Sun, 5 Jan 2020 13:15:44 +0000 (14:15 +0100)
committerAdrian Schmutzler <freifunk@adrianschmutzler.de>
Wed, 8 Jan 2020 15:45:08 +0000 (16:45 +0100)
No target uses kernel 4.9 anymore.

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
224 files changed:
include/kernel-version.mk
target/linux/generic/backport-4.9/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch [deleted file]
target/linux/generic/backport-4.9/011-kbuild-export-SUBARCH.patch [deleted file]
target/linux/generic/backport-4.9/012-kbuild-add-macro-for-controlling-warnings-to-linux-c.patch [deleted file]
target/linux/generic/backport-4.9/013-disable-Wattribute-alias-warning-for-SYSCALL_DEFINEx.patch [deleted file]
target/linux/generic/backport-4.9/020-backport_netfilter_rtcache.patch [deleted file]
target/linux/generic/backport-4.9/021-bridge-multicast-to-unicast.patch [deleted file]
target/linux/generic/backport-4.9/022-net-add-devm-version-of-alloc_etherdev_mqs-function.patch [deleted file]
target/linux/generic/backport-4.9/024-1-tcp-tsq-add-tsq_flags-tsq_enum.patch [deleted file]
target/linux/generic/backport-4.9/024-2-tcp-tsq-remove-one-locked-operation-in-tcp_wfree.patch [deleted file]
target/linux/generic/backport-4.9/024-3-tcp-tsq-add-shortcut-in-tcp_tasklet_func.patch [deleted file]
target/linux/generic/backport-4.9/024-4-tcp-tsq-avoid-one-atomic-in-tcp_wfree.patch [deleted file]
target/linux/generic/backport-4.9/024-5-tcp-tsq-add-a-shortcut-in-tcp_small_queue_check.patch [deleted file]
target/linux/generic/backport-4.9/024-6-tcp-tcp_mtu_probe-is-likely-to-exit-early.patch [deleted file]
target/linux/generic/backport-4.9/024-7-net-reorganize-struct-sock-for-better-data-locality.patch [deleted file]
target/linux/generic/backport-4.9/024-8-tcp-tsq-move-tsq_flags-close-to-sk_wmem_alloc.patch [deleted file]
target/linux/generic/backport-4.9/024-9-tcp-add-a-missing-barrier-in-tcp_tasklet_func.patch [deleted file]
target/linux/generic/backport-4.9/025-tcp-allow-drivers-to-tweak-TSQ-logic.patch [deleted file]
target/linux/generic/backport-4.9/030-01-ubifs-Drop-softlimit-and-delta-fields-from-struct-ub.patch [deleted file]
target/linux/generic/backport-4.9/030-02-ubifs-Use-dirty_writeback_interval-value-for-wbuf-ti.patch [deleted file]
target/linux/generic/backport-4.9/040-mm-add-support-for-releasing-multiple-instances-of-a.patch [deleted file]
target/linux/generic/backport-4.9/060-0002-mtd-bcm47xxsflash-use-platform_-set-get-_drvdata.patch [deleted file]
target/linux/generic/backport-4.9/060-0003-mtd-bcm47xxsflash-support-reading-flash-out-of-mappi.patch [deleted file]
target/linux/generic/backport-4.9/060-0004-mtd-bcm47xxpart-move-TRX-parsing-code-to-separated-f.patch [deleted file]
target/linux/generic/backport-4.9/060-0005-mtd-bcm47xxpart-support-layouts-with-multiple-TRX-pa.patch [deleted file]
target/linux/generic/backport-4.9/061-v4.10-0001-mtd-spi-nor-add-Macronix-mx25u25635f-to-list-of-know.patch [deleted file]
target/linux/generic/backport-4.9/061-v4.10-0002-mtd-spi-nor-fix-spansion-quad-enable.patch [deleted file]
target/linux/generic/backport-4.9/061-v4.10-0003-mtd-spi-nor-fix-flags-for-s25fl128s.patch [deleted file]
target/linux/generic/backport-4.9/061-v4.10-0004-mtd-spi-nor-add-support-for-s25fl208k.patch [deleted file]
target/linux/generic/backport-4.9/061-v4.10-0005-mtd-spi-nor-Add-at25df321-spi-nor-flash-support.patch [deleted file]
target/linux/generic/backport-4.9/061-v4.10-0006-mtd-spi-nor-Add-support-for-N25Q016A.patch [deleted file]
target/linux/generic/backport-4.9/061-v4.10-0007-mtd-spi-nor-Add-support-for-mr25h40.patch [deleted file]
target/linux/generic/backport-4.9/062-v4.11-0001-mtd-spi-nor-Add-support-for-S3AN-spi-nor-devices.patch [deleted file]
target/linux/generic/backport-4.9/062-v4.11-0002-mtd-spi-nor-improve-macronix_quad_enable.patch [deleted file]
target/linux/generic/backport-4.9/062-v4.11-0003-mtd-spi-nor-remove-WARN_ONCE-message-in-spi_nor_writ.patch [deleted file]
target/linux/generic/backport-4.9/062-v4.11-0004-mtd-spi-nor-rename-SPINOR_OP_-macros-of-the-4-byte-a.patch [deleted file]
target/linux/generic/backport-4.9/062-v4.11-0005-mtd-spi-nor-add-a-stateless-method-to-support-memory.patch [deleted file]
target/linux/generic/backport-4.9/062-v4.11-0006-mtd-spi-nor-Add-lock-unlock-support-for-f25l32pa.patch [deleted file]
target/linux/generic/backport-4.9/062-v4.11-0007-mtd-spi-nor-Fix-S3AN-addressing-calculation.patch [deleted file]
target/linux/generic/backport-4.9/062-v4.11-0008-mtd-spi-nor-Add-support-for-gd25q16.patch [deleted file]
target/linux/generic/backport-4.9/063-v4.11-0001-mtd-nand-Add-Winbond-manufacturer-id.patch [deleted file]
target/linux/generic/backport-4.9/063-v4.11-0002-mtd-introduce-function-max_bad_blocks.patch [deleted file]
target/linux/generic/backport-4.9/063-v4.11-0003-mtd-Add-partition-device-node-to-mtd-partition-devic.patch [deleted file]
target/linux/generic/backport-4.9/064-v4.12-mtd-spi-nor-enable-stateless-4b-op-codes-for-mx25u25.patch [deleted file]
target/linux/generic/backport-4.9/065-v4.13-0001-mtd-handle-partitioning-on-devices-with-0-erasesize.patch [deleted file]
target/linux/generic/backport-4.9/065-v4.13-0002-mtd-partitions-factor-out-code-calling-parser.patch [deleted file]
target/linux/generic/backport-4.9/065-v4.13-0003-mtd-partitions-add-helper-for-deleting-partition.patch [deleted file]
target/linux/generic/backport-4.9/065-v4.13-0004-mtd-partitions-remove-sysfs-files-when-deleting-all-.patch [deleted file]
target/linux/generic/backport-4.9/065-v4.13-0005-mtd-partitions-rename-master-to-the-parent-where-app.patch [deleted file]
target/linux/generic/backport-4.9/065-v4.13-0006-mtd-partitions-add-support-for-subpartitions.patch [deleted file]
target/linux/generic/backport-4.9/065-v4.13-0007-mtd-partitions-add-support-for-partition-parsers.patch [deleted file]
target/linux/generic/backport-4.9/065-v4.13-0008-mtd-extract-TRX-parser-out-of-bcm47xxpart-into-a-sep.patch [deleted file]
target/linux/generic/backport-4.9/066-v4.17-0001-mtd-move-code-adding-master-MTD-out-of-mtd_add_devic.patch [deleted file]
target/linux/generic/backport-4.9/066-v4.17-0002-mtd-get-rid-of-the-mtd_add_device_partitions.patch [deleted file]
target/linux/generic/backport-4.9/067-v4.17-0001-mtd-partitions-add-of_match_table-parser-matching-fo.patch [deleted file]
target/linux/generic/backport-4.9/067-v4.17-0002-mtd-rename-ofpart-parser-to-fixed-partitions-as-it-f.patch [deleted file]
target/linux/generic/backport-4.9/067-v4.17-0003-mtd-ofpart-add-of_match_table-with-fixed-partitions.patch [deleted file]
target/linux/generic/backport-4.9/068-v4.18-0001-mtd-move-code-adding-registering-partitions-to-the-p.patch [deleted file]
target/linux/generic/backport-4.9/069-v4.18-mtd-bcm47xxpart-improve-handling-TRX-partition-size.patch [deleted file]
target/linux/generic/backport-4.9/070-bcma-from-4.11.patch [deleted file]
target/linux/generic/backport-4.9/071-v4.10-0001-net-bgmac-allocate-struct-bgmac-just-once-don-t-copy.patch [deleted file]
target/linux/generic/backport-4.9/071-v4.10-0002-net-bgmac-drop-struct-bcma_mdio-we-don-t-need-anymor.patch [deleted file]
target/linux/generic/backport-4.9/071-v4.10-0003-net-bgmac-use-PHY-subsystem-for-initializing-PHY.patch [deleted file]
target/linux/generic/backport-4.9/071-v4.15-0001-net-bgmac-enable-master-mode-for-BCM54210E-and-B5021.patch [deleted file]
target/linux/generic/backport-4.9/072-bcma-from-4.12.patch [deleted file]
target/linux/generic/backport-4.9/075-v4.10-0001-net-phy-broadcom-Update-Auxiliary-Control-Register-m.patch [deleted file]
target/linux/generic/backport-4.9/075-v4.10-0002-net-phy-broadcom-Add-support-for-BCM54612E.patch [deleted file]
target/linux/generic/backport-4.9/075-v4.10-0003-net-phy-broadcom-add-bcm54xx_auxctl_read.patch [deleted file]
target/linux/generic/backport-4.9/075-v4.10-0004-net-phy-broadcom-Add-BCM54810-PHY-entry.patch [deleted file]
target/linux/generic/backport-4.9/075-v4.10-0005-net-phy-broadcom-Move-bcm54xx_auxctl_-read-write-to-.patch [deleted file]
target/linux/generic/backport-4.9/076-v4.11-0001-net-phy-broadcom-Allow-enabling-or-disabling-of-EEE.patch [deleted file]
target/linux/generic/backport-4.9/076-v4.11-0002-net-phy-broadcom-Add-support-code-for-reading-PHY-co.patch [deleted file]
target/linux/generic/backport-4.9/076-v4.11-0003-net-phy-bcm7xxx-Add-entry-for-BCM7278.patch [deleted file]
target/linux/generic/backport-4.9/076-v4.11-0004-net-phy-bcm7xxx-Implement-EGPHY-workaround-for-7278.patch [deleted file]
target/linux/generic/backport-4.9/076-v4.11-0005-net-phy-broadcom-use-auxctl-reading-helper-in-BCM546.patch [deleted file]
target/linux/generic/backport-4.9/076-v4.11-0006-net-phy-broadcom-add-support-for-BCM54210E.patch [deleted file]
target/linux/generic/backport-4.9/076-v4.11-0007-net-phy-broadcom-rehook-BCM54612E-specific-init.patch [deleted file]
target/linux/generic/backport-4.9/076-v4.15-0001-net-phy-broadcom-support-new-device-flag-for-setting.patch [deleted file]
target/linux/generic/backport-4.9/080-0001-leds-core-add-OF-variants-of-LED-registering-functio.patch [deleted file]
target/linux/generic/backport-4.9/080-0002-leds-gpio-use-OF-variant-of-LED-registering-function.patch [deleted file]
target/linux/generic/backport-4.9/081-0001-thermal-bcm2835-add-thermal-driver-for-bcm2835-SoC.patch [deleted file]
target/linux/generic/backport-4.9/081-0002-thermal-broadcom-add-Northstar-thermal-driver.patch [deleted file]
target/linux/generic/backport-4.9/082-0001-usb-core-read-USB-ports-from-DT-in-the-usbport-LED-t.patch [deleted file]
target/linux/generic/backport-4.9/085-v4.16-0001-i2c-gpio-Enable-working-over-slow-can_sleep-GPIOs.patch [deleted file]
target/linux/generic/backport-4.9/087-regmap-make-LZO-cache-optional.patch [deleted file]
target/linux/generic/backport-4.9/090-net-generalize-napi_complete_done.patch [deleted file]
target/linux/generic/backport-4.9/094-v4.12-0001-ip6_tunnel-Fix-missing-tunnel-encapsulation-limit-op.patch [deleted file]
target/linux/generic/backport-4.9/094-v4.12-0002-ipv6-Need-to-export-ipv6_push_frag_opts-for-tunnelin.patch [deleted file]
target/linux/generic/backport-4.9/095-Allow-class-e-address-assignment-via-ifconfig-ioctl.patch [deleted file]
target/linux/generic/backport-4.9/095-v4.13-0001-rtc-ds1307-add-ds1308-variant.patch [deleted file]
target/linux/generic/backport-4.9/096-v4.20-netfilter-ipv6-Preserve-link-scope-traffic-original-.patch [deleted file]
target/linux/generic/backport-4.9/101-arm-cns3xxx-use-actual-size-reads-for-PCIe.patch [deleted file]
target/linux/generic/backport-4.9/400-v4.16-leds-trigger-Introduce-a-NETDEV-trigger.patch [deleted file]
target/linux/generic/backport-4.9/400-v4.18-mtd-bcm47xxpart-add-of_match_table-with-a-new-DT-bin.patch [deleted file]
target/linux/generic/backport-4.9/401-v4.19-mtd-parsers-trx-add-of_match_table-with-the-new-DT-b.patch [deleted file]
target/linux/generic/backport-4.9/402-v4.19-mtd-partitions-use-DT-info-for-parsing-partitions-wi.patch [deleted file]
target/linux/generic/config-4.9 [deleted file]
target/linux/generic/hack-4.9/204-module_strip.patch [deleted file]
target/linux/generic/hack-4.9/207-disable-modorder.patch [deleted file]
target/linux/generic/hack-4.9/210-darwin_scripts_include.patch [deleted file]
target/linux/generic/hack-4.9/211-host_tools_portability.patch [deleted file]
target/linux/generic/hack-4.9/212-byteshift_portability.patch [deleted file]
target/linux/generic/hack-4.9/214-spidev_h_portability.patch [deleted file]
target/linux/generic/hack-4.9/220-gc_sections.patch [deleted file]
target/linux/generic/hack-4.9/221-module_exports.patch [deleted file]
target/linux/generic/hack-4.9/230-openwrt_lzma_options.patch [deleted file]
target/linux/generic/hack-4.9/250-netfilter_depends.patch [deleted file]
target/linux/generic/hack-4.9/251-sound_kconfig.patch [deleted file]
target/linux/generic/hack-4.9/259-regmap_dynamic.patch [deleted file]
target/linux/generic/hack-4.9/260-crypto_test_dependencies.patch [deleted file]
target/linux/generic/hack-4.9/280-rfkill-stubs.patch [deleted file]
target/linux/generic/hack-4.9/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch [deleted file]
target/linux/generic/hack-4.9/301-mips_image_cmdline_hack.patch [deleted file]
target/linux/generic/hack-4.9/321-powerpc_crtsavres_prereq.patch [deleted file]
target/linux/generic/hack-4.9/531-debloat_lzma.patch [deleted file]
target/linux/generic/hack-4.9/640-bridge-only-accept-EAP-locally.patch [deleted file]
target/linux/generic/hack-4.9/641-bridge_port_isolate.patch [deleted file]
target/linux/generic/hack-4.9/651-wireless_mesh_header.patch [deleted file]
target/linux/generic/hack-4.9/660-fq_codel_defaults.patch [deleted file]
target/linux/generic/hack-4.9/661-use_fq_codel_by_default.patch [deleted file]
target/linux/generic/hack-4.9/662-remove_pfifo_fast.patch [deleted file]
target/linux/generic/hack-4.9/700-swconfig_switch_drivers.patch [deleted file]
target/linux/generic/hack-4.9/702-phy_add_aneg_done_function.patch [deleted file]
target/linux/generic/hack-4.9/710-phy-add-mdio_register_board_info.patch [deleted file]
target/linux/generic/hack-4.9/721-phy_packets.patch [deleted file]
target/linux/generic/hack-4.9/773-bgmac-add-srab-switch.patch [deleted file]
target/linux/generic/hack-4.9/901-debloat_sock_diag.patch [deleted file]
target/linux/generic/hack-4.9/902-debloat_proc.patch [deleted file]
target/linux/generic/hack-4.9/904-debloat_dma_buf.patch [deleted file]
target/linux/generic/hack-4.9/910-kobject_uevent.patch [deleted file]
target/linux/generic/hack-4.9/911-kobject_add_broadcast_uevent.patch [deleted file]
target/linux/generic/hack-4.9/921-always-create-console-node-in-initramfs.patch [deleted file]
target/linux/generic/hack-4.9/930-crashlog.patch [deleted file]
target/linux/generic/pending-4.9/0931-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch [deleted file]
target/linux/generic/pending-4.9/100-MIPS-fix-cache-flushing-for-highmem-pages.patch [deleted file]
target/linux/generic/pending-4.9/110-ehci_hcd_ignore_oc.patch [deleted file]
target/linux/generic/pending-4.9/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch [deleted file]
target/linux/generic/pending-4.9/130-add-linux-spidev-compatible-si3210.patch [deleted file]
target/linux/generic/pending-4.9/131-spi-use-gpio_set_value_cansleep-for-setting-chipsele.patch [deleted file]
target/linux/generic/pending-4.9/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch [deleted file]
target/linux/generic/pending-4.9/141-jffs2-add-RENAME_EXCHANGE-support.patch [deleted file]
target/linux/generic/pending-4.9/150-bridge_allow_receiption_on_disabled_port.patch [deleted file]
target/linux/generic/pending-4.9/161-mtd-part-add-generic-parsing-of-linux-part-probe.patch [deleted file]
target/linux/generic/pending-4.9/170-MIPS-PCI-add-controllers-before-the-specified-head.patch [deleted file]
target/linux/generic/pending-4.9/180-net-phy-at803x-add-support-for-AT8032.patch [deleted file]
target/linux/generic/pending-4.9/190-2-5-e1000e-Fix-wrong-comment-related-to-link-detection.patch [deleted file]
target/linux/generic/pending-4.9/201-extra_optimization.patch [deleted file]
target/linux/generic/pending-4.9/203-kallsyms_uncompressed.patch [deleted file]
target/linux/generic/pending-4.9/205-backtrace_module_info.patch [deleted file]
target/linux/generic/pending-4.9/220-optimize_inlining.patch [deleted file]
target/linux/generic/pending-4.9/240-remove-unsane-filenames-from-deps_initramfs-list.patch [deleted file]
target/linux/generic/pending-4.9/261-enable_wilink_platform_without_drivers.patch [deleted file]
target/linux/generic/pending-4.9/300-mips_expose_boot_raw.patch [deleted file]
target/linux/generic/pending-4.9/302-mips_no_branch_likely.patch [deleted file]
target/linux/generic/pending-4.9/304-mips_disable_fpu.patch [deleted file]
target/linux/generic/pending-4.9/305-mips_module_reloc.patch [deleted file]
target/linux/generic/pending-4.9/306-mips_mem_functions_performance.patch [deleted file]
target/linux/generic/pending-4.9/307-mips_highmem_offset.patch [deleted file]
target/linux/generic/pending-4.9/308-mips32r2_tune.patch [deleted file]
target/linux/generic/pending-4.9/309-MIPS-Add-CPU-option-reporting-to-proc-cpuinfo.patch [deleted file]
target/linux/generic/pending-4.9/310-arm_module_unresolved_weak_sym.patch [deleted file]
target/linux/generic/pending-4.9/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch [deleted file]
target/linux/generic/pending-4.9/332-arc-add-OWRTDTB-section.patch [deleted file]
target/linux/generic/pending-4.9/333-arc-enable-unaligned-access-in-kernel-mode.patch [deleted file]
target/linux/generic/pending-4.9/340-MIPS-mm-remove-mips_dma_mapping_error.patch [deleted file]
target/linux/generic/pending-4.9/341-MIPS-mm-remove-no-op-dma_map_ops-where-possible.patch [deleted file]
target/linux/generic/pending-4.9/400-mtd-add-rootfs-split-support.patch [deleted file]
target/linux/generic/pending-4.9/401-mtd-add-support-for-different-partition-parser-types.patch [deleted file]
target/linux/generic/pending-4.9/402-mtd-use-typed-mtd-parsers-for-rootfs-and-firmware-split.patch [deleted file]
target/linux/generic/pending-4.9/403-mtd-hook-mtdsplit-to-Kbuild.patch [deleted file]
target/linux/generic/pending-4.9/404-mtd-add-more-helper-functions.patch [deleted file]
target/linux/generic/pending-4.9/411-mtd-partial_eraseblock_write.patch [deleted file]
target/linux/generic/pending-4.9/412-mtd-partial_eraseblock_unlock.patch [deleted file]
target/linux/generic/pending-4.9/419-mtd-redboot-add-of_match_table-with-DT-binding.patch [deleted file]
target/linux/generic/pending-4.9/420-mtd-redboot_space.patch [deleted file]
target/linux/generic/pending-4.9/430-mtd-add-myloader-partition-parser.patch [deleted file]
target/linux/generic/pending-4.9/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch [deleted file]
target/linux/generic/pending-4.9/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch [deleted file]
target/linux/generic/pending-4.9/440-block2mtd_init.patch [deleted file]
target/linux/generic/pending-4.9/441-block2mtd_probe.patch [deleted file]
target/linux/generic/pending-4.9/450-mtd-m25p80-allow-fallback-from-spi_flash_read-to-reg.patch [deleted file]
target/linux/generic/pending-4.9/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch [deleted file]
target/linux/generic/pending-4.9/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch [deleted file]
target/linux/generic/pending-4.9/465-m25p80-mx-disable-software-protection.patch [deleted file]
target/linux/generic/pending-4.9/466-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch [deleted file]
target/linux/generic/pending-4.9/470-mtd-spi-nor-support-limiting-4K-sectors-support-base.patch [deleted file]
target/linux/generic/pending-4.9/475-mtd-spi-nor-Add-Winbond-w25q128jv-support.patch [deleted file]
target/linux/generic/pending-4.9/476-mtd-spi-nor-add-eon-en25q128.patch [deleted file]
target/linux/generic/pending-4.9/477-mtd-add-spi-nor-add-mx25u3235f.patch [deleted file]
target/linux/generic/pending-4.9/478-mtd-spi-nor-Add-support-for-XM25QH64A-and-XM25QH128A.patch [deleted file]
target/linux/generic/pending-4.9/479-mtd-spi-nor-add-eon-en25qh32.patch [deleted file]
target/linux/generic/pending-4.9/480-mtd-set-rootfs-to-be-root-dev.patch [deleted file]
target/linux/generic/pending-4.9/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch [deleted file]
target/linux/generic/pending-4.9/491-ubi-auto-create-ubiblock-device-for-rootfs.patch [deleted file]
target/linux/generic/pending-4.9/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch [deleted file]
target/linux/generic/pending-4.9/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch [deleted file]
target/linux/generic/pending-4.9/494-mtd-ubi-add-EOF-marker-support.patch [deleted file]
target/linux/generic/pending-4.9/530-jffs2_make_lzma_available.patch [deleted file]
target/linux/generic/pending-4.9/532-jffs2_eofdetect.patch [deleted file]
target/linux/generic/pending-4.9/551-ubifs-fix-default-compression-selection.patch [deleted file]
target/linux/generic/pending-4.9/600-netfilter_conntrack_flush.patch [deleted file]
target/linux/generic/pending-4.9/610-netfilter_match_bypass_default_checks.patch [deleted file]
target/linux/generic/pending-4.9/611-netfilter_match_bypass_default_table.patch [deleted file]
target/linux/generic/pending-4.9/612-netfilter_match_reduce_memory_access.patch [deleted file]
target/linux/generic/pending-4.9/613-netfilter_optional_tcp_window_check.patch [deleted file]
target/linux/generic/pending-4.9/616-net_optimize_xfrm_calls.patch [deleted file]
target/linux/generic/pending-4.9/620-net_sched-codel-do-not-defer-queue-length-update.patch [deleted file]
target/linux/generic/pending-4.9/630-packet_socket_type.patch [deleted file]
target/linux/generic/pending-4.9/655-increase_skb_pad.patch [deleted file]
target/linux/generic/pending-4.9/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch [deleted file]
target/linux/generic/pending-4.9/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch [deleted file]
target/linux/generic/pending-4.9/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch [deleted file]
target/linux/generic/pending-4.9/680-NET-skip-GRO-for-foreign-MAC-addresses.patch [deleted file]
target/linux/generic/pending-4.9/681-NET-add-of_get_mac_address_mtd.patch [deleted file]
target/linux/generic/pending-4.9/701-phy_extension.patch [deleted file]
target/linux/generic/pending-4.9/703-phy-add-detach-callback-to-struct-phy_driver.patch [deleted file]
target/linux/generic/pending-4.9/734-net-phy-at803x-allow-to-configure-via-pdata.patch [deleted file]
target/linux/generic/pending-4.9/735-net-phy-at803x-fix-at8033-sgmii-mode.patch [deleted file]
target/linux/generic/pending-4.9/810-pci_disable_common_quirks.patch [deleted file]
target/linux/generic/pending-4.9/811-pci_disable_usb_common_quirks.patch [deleted file]
target/linux/generic/pending-4.9/821-usb-Remove-annoying-warning-about-bogus-URB.patch [deleted file]
target/linux/generic/pending-4.9/834-ledtrig-libata.patch [deleted file]
target/linux/generic/pending-4.9/890-uart_optional_sysrq.patch [deleted file]
target/linux/generic/pending-4.9/920-mangle_bootargs.patch [deleted file]

index 50cd4db..eb99bd9 100644 (file)
@@ -6,11 +6,9 @@ ifdef CONFIG_TESTING_KERNEL
   KERNEL_PATCHVER:=$(KERNEL_TESTING_PATCHVER)
 endif
 
-LINUX_VERSION-4.9 = .208
 LINUX_VERSION-4.14 = .162
 LINUX_VERSION-4.19 = .93
 
-LINUX_KERNEL_HASH-4.9.208 = b7ad1c9841d671d026c55a4c91c77205f8b488ca5f980f838591c68662e0525a
 LINUX_KERNEL_HASH-4.14.162 = f65170224cd4359ce8b2793b492bd8127abdd0b91350484e001bce13f0c98b4b
 LINUX_KERNEL_HASH-4.19.93 = 2af5d23f82a8bf69a6e4d8407579293b7beeebd3054dc464d48bdb5d2d7f5834
 
diff --git a/target/linux/generic/backport-4.9/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch b/target/linux/generic/backport-4.9/010-Kbuild-don-t-hardcode-path-to-awk-in-scripts-ld-vers.patch
deleted file mode 100644 (file)
index 1115ee1..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From 13b1ecc3401653a355798eb1dee10cc1608202f4 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Mon, 18 Jan 2016 12:27:49 +0100
-Subject: [PATCH 33/34] Kbuild: don't hardcode path to awk in
- scripts/ld-version.sh
-
-On some systems /usr/bin/awk does not exist, or is broken. Find it via
-$PATH instead.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- scripts/ld-version.sh | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
---- a/scripts/ld-version.sh
-+++ b/scripts/ld-version.sh
-@@ -1,5 +1,6 @@
--#!/usr/bin/awk -f
-+#!/bin/sh
- # extract linker version number from stdin and turn into single number
-+exec awk '
-       {
-       gsub(".*\\)", "");
-       gsub(".*version ", "");
-@@ -8,3 +9,4 @@
-       print a[1]*100000000 + a[2]*1000000 + a[3]*10000;
-       exit
-       }
-+'
diff --git a/target/linux/generic/backport-4.9/011-kbuild-export-SUBARCH.patch b/target/linux/generic/backport-4.9/011-kbuild-export-SUBARCH.patch
deleted file mode 100644 (file)
index 4c0e075..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-From 173019b66dcc9d68ad9333aa744dad1e369b5aa8 Mon Sep 17 00:00:00 2001
-From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 9 Jul 2017 00:26:53 +0200
-Subject: [PATCH 34/34] kernel: add compile fix for linux 4.9 on x86
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
- Makefile | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/Makefile
-+++ b/Makefile
-@@ -407,8 +407,8 @@ KERNELRELEASE = $(shell cat include/conf
- KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
- export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
--export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
--export CPP AR NM STRIP OBJCOPY OBJDUMP
-+export ARCH SRCARCH SUBARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD
-+export CC CPP AR NM STRIP OBJCOPY OBJDUMP
- export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
- export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
diff --git a/target/linux/generic/backport-4.9/012-kbuild-add-macro-for-controlling-warnings-to-linux-c.patch b/target/linux/generic/backport-4.9/012-kbuild-add-macro-for-controlling-warnings-to-linux-c.patch
deleted file mode 100644 (file)
index 5b4b075..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-From: Arnd Bergmann <arnd@arndb.de>
-Date: Tue, 19 Jun 2018 13:14:56 -0700
-Subject: [PATCH] kbuild: add macro for controlling warnings to
- linux/compiler.h
-
-I have occasionally run into a situation where it would make sense to
-control a compiler warning from a source file rather than doing so from
-a Makefile using the $(cc-disable-warning, ...) or $(cc-option, ...)
-helpers.
-
-The approach here is similar to what glibc uses, using __diag() and
-related macros to encapsulate a _Pragma("GCC diagnostic ...") statement
-that gets turned into the respective "#pragma GCC diagnostic ..." by
-the preprocessor when the macro gets expanded.
-
-Like glibc, I also have an argument to pass the affected compiler
-version, but decided to actually evaluate that one. For now, this
-supports GCC_4_6, GCC_4_7, GCC_4_8, GCC_4_9, GCC_5, GCC_6, GCC_7,
-GCC_8 and GCC_9. Adding support for CLANG_5 and other interesting
-versions is straightforward here. GNU compilers starting with gcc-4.2
-could support it in principle, but "#pragma GCC diagnostic push"
-was only added in gcc-4.6, so it seems simpler to not deal with those
-at all. The same versions show a large number of warnings already,
-so it seems easier to just leave it at that and not do a more
-fine-grained control for them.
-
-The use cases I found so far include:
-
-- turning off the gcc-8 -Wattribute-alias warning inside of the
-  SYSCALL_DEFINEx() macro without having to do it globally.
-
-- Reducing the build time for a simple re-make after a change,
-  once we move the warnings from ./Makefile and
-  ./scripts/Makefile.extrawarn into linux/compiler.h
-
-- More control over the warnings based on other configurations,
-  using preprocessor syntax instead of Makefile syntax. This should make
-  it easier for the average developer to understand and change things.
-
-- Adding an easy way to turn the W=1 option on unconditionally
-  for a subdirectory or a specific file. This has been requested
-  by several developers in the past that want to have their subsystems
-  W=1 clean.
-
-- Integrating clang better into the build systems. Clang supports
-  more warnings than GCC, and we probably want to classify them
-  as default, W=1, W=2 etc, but there are cases in which the
-  warnings should be classified differently due to excessive false
-  positives from one or the other compiler.
-
-- Adding a way to turn the default warnings into errors (e.g. using
-  a new "make E=0" tag) while not also turning the W=1 warnings into
-  errors.
-
-This patch for now just adds the minimal infrastructure in order to
-do the first of the list above. As the #pragma GCC diagnostic
-takes precedence over command line options, the next step would be
-to convert a lot of the individual Makefiles that set nonstandard
-options to use __diag() instead.
-
-[paul.burton@mips.com:
-  - Rebase atop current master.
-  - Add __diag_GCC, or more generally __diag_<compiler>, abstraction to
-    avoid code outside of linux/compiler-gcc.h needing to duplicate
-    knowledge about different GCC versions.
-  - Add a comment argument to __diag_{ignore,warn,error} which isn't
-    used in the expansion of the macros but serves to push people to
-    document the reason for using them - per feedback from Kees Cook.
-  - Translate severity to GCC-specific pragmas in linux/compiler-gcc.h
-    rather than using GCC-specific in linux/compiler_types.h.
-  - Drop all but GCC 8 macros, since we only need to define macros for
-    versions that we need to introduce pragmas for, and as of this
-    series that's just GCC 8.
-  - Capitalize comments in linux/compiler-gcc.h to match the style of
-    the rest of the file.
-  - Line up macro definitions with tabs in linux/compiler-gcc.h.]
-
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Signed-off-by: Paul Burton <paul.burton@mips.com>
-Tested-by: Christophe Leroy <christophe.leroy@c-s.fr>
-Tested-by: Stafford Horne <shorne@gmail.com>
-Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
----
-
---- a/include/linux/compiler-gcc.h
-+++ b/include/linux/compiler-gcc.h
-@@ -351,3 +351,30 @@
- #if GCC_VERSION >= 50100
- #define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
- #endif
-+
-+
-+/*
-+ * Turn individual warnings and errors on and off locally, depending
-+ * on version.
-+ */
-+#define __diag_GCC(version, severity, s) \
-+      __diag_GCC_ ## version(__diag_GCC_ ## severity s)
-+
-+/* Severity used in pragma directives */
-+#define __diag_GCC_ignore     ignored
-+#define __diag_GCC_warn               warning
-+#define __diag_GCC_error      error
-+
-+/* Compilers before gcc-4.6 do not understand "#pragma GCC diagnostic push" */
-+#if GCC_VERSION >= 40600
-+#define __diag_str1(s)                #s
-+#define __diag_str(s)         __diag_str1(s)
-+#define __diag(s)             _Pragma(__diag_str(GCC diagnostic s))
-+#endif
-+
-+#if GCC_VERSION >= 80000
-+#define __diag_GCC_8(s)               __diag(s)
-+#else
-+#define __diag_GCC_8(s)
-+#endif
-+
---- a/include/linux/compiler.h
-+++ b/include/linux/compiler.h
-@@ -605,4 +605,23 @@ unsigned long read_word_at_a_time(const
- # define __kprobes
- # define nokprobe_inline      inline
- #endif
-+
-+#ifndef __diag
-+#define __diag(string)
-+#endif
-+
-+#ifndef __diag_GCC
-+#define __diag_GCC(version, severity, string)
-+#endif
-+
-+#define __diag_push() __diag(push)
-+#define __diag_pop()  __diag(pop)
-+
-+#define __diag_ignore(compiler, version, option, comment) \
-+      __diag_ ## compiler(version, ignore, option)
-+#define __diag_warn(compiler, version, option, comment) \
-+      __diag_ ## compiler(version, warn, option)
-+#define __diag_error(compiler, version, option, comment) \
-+      __diag_ ## compiler(version, error, option)
-+
- #endif /* __LINUX_COMPILER_H */
diff --git a/target/linux/generic/backport-4.9/013-disable-Wattribute-alias-warning-for-SYSCALL_DEFINEx.patch b/target/linux/generic/backport-4.9/013-disable-Wattribute-alias-warning-for-SYSCALL_DEFINEx.patch
deleted file mode 100644 (file)
index fc2a26d..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-From: Arnd Bergmann <arnd@arndb.de>
-Date: Tue, 19 Jun 2018 13:14:57 -0700
-Subject: [PATCH] disable -Wattribute-alias warning for SYSCALL_DEFINEx()
-
-gcc-8 warns for every single definition of a system call entry
-point, e.g.:
-
-include/linux/compat.h:56:18: error: 'compat_sys_rt_sigprocmask' alias between functions of incompatible types 'long int(int,  compat_sigset_t *, compat_sigset_t *, compat_size_t)' {aka 'long int(int,  struct <anonymous> *, struct <anonymous> *, unsigned int)'} and 'long int(long int,  long int,  long int,  long int)' [-Werror=attribute-alias]
-  asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))\
-                  ^~~~~~~~~~
-include/linux/compat.h:45:2: note: in expansion of macro 'COMPAT_SYSCALL_DEFINEx'
-  COMPAT_SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
-  ^~~~~~~~~~~~~~~~~~~~~~
-kernel/signal.c:2601:1: note: in expansion of macro 'COMPAT_SYSCALL_DEFINE4'
- COMPAT_SYSCALL_DEFINE4(rt_sigprocmask, int, how, compat_sigset_t __user *, nset,
- ^~~~~~~~~~~~~~~~~~~~~~
-include/linux/compat.h:60:18: note: aliased declaration here
-  asmlinkage long compat_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))\
-                  ^~~~~~~~~~
-
-The new warning seems reasonable in principle, but it doesn't
-help us here, since we rely on the type mismatch to sanitize the
-system call arguments. After I reported this as GCC PR82435, a new
--Wno-attribute-alias option was added that could be used to turn the
-warning off globally on the command line, but I'd prefer to do it a
-little more fine-grained.
-
-Interestingly, turning a warning off and on again inside of
-a single macro doesn't always work, in this case I had to add
-an extra statement inbetween and decided to copy the __SC_TEST
-one from the native syscall to the compat syscall macro.  See
-https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83256 for more details
-about this.
-
-[paul.burton@mips.com:
-  - Rebase atop current master.
-  - Split GCC & version arguments to __diag_ignore() in order to match
-    changes to the preceding patch.
-  - Add the comment argument to match the preceding patch.]
-
-Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82435
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Signed-off-by: Paul Burton <paul.burton@mips.com>
-Tested-by: Christophe Leroy <christophe.leroy@c-s.fr>
-Tested-by: Stafford Horne <shorne@gmail.com>
-Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
----
-
---- a/include/linux/compat.h
-+++ b/include/linux/compat.h
-@@ -47,6 +47,9 @@
-       COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
- #define COMPAT_SYSCALL_DEFINEx(x, name, ...)                          \
-+      __diag_push();                                                  \
-+      __diag_ignore(GCC, 8, "-Wattribute-alias",                      \
-+                    "Type aliasing is used to sanitize syscall arguments");\
-       asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))\
-               __attribute__((alias(__stringify(compat_SyS##name))));  \
-       static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
-@@ -55,6 +58,7 @@
-       {                                                               \
-               return C_SYSC##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__)); \
-       }                                                               \
-+      __diag_pop();                                                   \
-       static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
- #ifndef compat_user_stack_pointer
---- a/include/linux/syscalls.h
-+++ b/include/linux/syscalls.h
-@@ -192,6 +192,9 @@ extern struct trace_event_functions exit
- #define __PROTECT(...) asmlinkage_protect(__VA_ARGS__)
- #define __SYSCALL_DEFINEx(x, name, ...)                                       \
-+      __diag_push();                                                  \
-+      __diag_ignore(GCC, 8, "-Wattribute-alias",                      \
-+                    "Type aliasing is used to sanitize syscall arguments");\
-       asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))       \
-               __attribute__((alias(__stringify(SyS##name))));         \
-       static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));  \
-@@ -203,6 +206,7 @@ extern struct trace_event_functions exit
-               __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));       \
-               return ret;                                             \
-       }                                                               \
-+      __diag_pop();                                                   \
-       static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
- asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,
diff --git a/target/linux/generic/backport-4.9/020-backport_netfilter_rtcache.patch b/target/linux/generic/backport-4.9/020-backport_netfilter_rtcache.patch
deleted file mode 100644 (file)
index e7c9b4c..0000000
+++ /dev/null
@@ -1,543 +0,0 @@
-From c4d66e57455f5384128753674cc0f9e02db5e1f6 Mon Sep 17 00:00:00 2001
-From: Florian Westphal <fw@strlen.de>
-Date: Sun, 9 Jul 2017 08:58:30 +0200
-Subject: [PATCH] netfilter: conntrack: cache route for forwarded connections
-
-... to avoid per-packet FIB lookup if possible.
-
-The cached dst is re-used provided the input interface
-is the same as that of the previous packet in the same direction.
-
-If not, the cached dst is invalidated.
-
-For ipv6 we also need to store sernum, else dst_check doesn't work,
-pointed out by Eric Dumazet.
-
-This should speed up forwarding when conntrack is already in use
-anyway, especially when using reverse path filtering -- active RPF
-enforces two FIB lookups for each packet.
-
-Before the routing cache removal this didn't matter since RPF was performed
-only when route cache didn't yield a result; but without route cache it
-comes at higher price.
-
-Julian Anastasov suggested to add NETDEV_UNREGISTER handler to
-avoid holding on to dsts of 'frozen' conntracks.
-
-Signed-off-by: Florian Westphal <fw@strlen.de>
----
- include/net/netfilter/nf_conntrack_extend.h  |   4 +
- include/net/netfilter/nf_conntrack_rtcache.h |  34 +++
- net/netfilter/Kconfig                        |  12 +
- net/netfilter/Makefile                       |   3 +
- net/netfilter/nf_conntrack_rtcache.c         | 413 +++++++++++++++++++++++++++
- 5 files changed, 466 insertions(+)
- create mode 100644 include/net/netfilter/nf_conntrack_rtcache.h
- create mode 100644 net/netfilter/nf_conntrack_rtcache.c
-
---- a/include/net/netfilter/nf_conntrack_extend.h
-+++ b/include/net/netfilter/nf_conntrack_extend.h
-@@ -27,6 +27,9 @@ enum nf_ct_ext_id {
- #if IS_ENABLED(CONFIG_NETFILTER_SYNPROXY)
-       NF_CT_EXT_SYNPROXY,
- #endif
-+#if IS_ENABLED(CONFIG_NF_CONNTRACK_RTCACHE)
-+      NF_CT_EXT_RTCACHE,
-+#endif
-       NF_CT_EXT_NUM,
- };
-@@ -39,6 +42,7 @@ enum nf_ct_ext_id {
- #define NF_CT_EXT_TIMEOUT_TYPE struct nf_conn_timeout
- #define NF_CT_EXT_LABELS_TYPE struct nf_conn_labels
- #define NF_CT_EXT_SYNPROXY_TYPE struct nf_conn_synproxy
-+#define NF_CT_EXT_RTCACHE_TYPE struct nf_conn_rtcache
- /* Extensions: optional stuff which isn't permanently in struct. */
- struct nf_ct_ext {
---- /dev/null
-+++ b/include/net/netfilter/nf_conntrack_rtcache.h
-@@ -0,0 +1,34 @@
-+#include <linux/gfp.h>
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_extend.h>
-+
-+struct dst_entry;
-+
-+struct nf_conn_dst_cache {
-+      struct dst_entry *dst;
-+      int iif;
-+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
-+      u32 cookie;
-+#endif
-+
-+};
-+
-+struct nf_conn_rtcache {
-+      struct nf_conn_dst_cache cached_dst[IP_CT_DIR_MAX];
-+};
-+
-+static inline
-+struct nf_conn_rtcache *nf_ct_rtcache_find(const struct nf_conn *ct)
-+{
-+#if IS_ENABLED(CONFIG_NF_CONNTRACK_RTCACHE)
-+      return nf_ct_ext_find(ct, NF_CT_EXT_RTCACHE);
-+#else
-+      return NULL;
-+#endif
-+}
-+
-+static inline int nf_conn_rtcache_iif_get(const struct nf_conn_rtcache *rtc,
-+                                        enum ip_conntrack_dir dir)
-+{
-+      return rtc->cached_dst[dir].iif;
-+}
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -114,6 +114,18 @@ config NF_CONNTRACK_EVENTS
-         If unsure, say `N'.
-+config NF_CONNTRACK_RTCACHE
-+      tristate "Cache route entries in conntrack objects"
-+      depends on NETFILTER_ADVANCED
-+      depends on NF_CONNTRACK
-+      help
-+        If this option is enabled, the connection tracking code will
-+        cache routing information for each connection that is being
-+        forwarded, at a cost of 32 bytes per conntrack object.
-+
-+        To compile it as a module, choose M here.  If unsure, say N.
-+        The module will be called nf_conntrack_rtcache.
-+
- config NF_CONNTRACK_TIMEOUT
-       bool  'Connection tracking timeout'
-       depends on NETFILTER_ADVANCED
---- a/net/netfilter/Makefile
-+++ b/net/netfilter/Makefile
-@@ -16,6 +16,9 @@ obj-$(CONFIG_NETFILTER_NETLINK_LOG) += n
- # connection tracking
- obj-$(CONFIG_NF_CONNTRACK) += nf_conntrack.o
-+# optional conntrack route cache extension
-+obj-$(CONFIG_NF_CONNTRACK_RTCACHE) += nf_conntrack_rtcache.o
-+
- # SCTP protocol connection tracking
- obj-$(CONFIG_NF_CT_PROTO_DCCP) += nf_conntrack_proto_dccp.o
- obj-$(CONFIG_NF_CT_PROTO_GRE) += nf_conntrack_proto_gre.o
---- /dev/null
-+++ b/net/netfilter/nf_conntrack_rtcache.c
-@@ -0,0 +1,413 @@
-+/* route cache for netfilter.
-+ *
-+ * (C) 2014 Red Hat GmbH
-+ *
-+ * 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.
-+ */
-+
-+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-+
-+#include <linux/types.h>
-+#include <linux/netfilter.h>
-+#include <linux/skbuff.h>
-+#include <linux/stddef.h>
-+#include <linux/kernel.h>
-+#include <linux/netdevice.h>
-+#include <linux/export.h>
-+#include <linux/module.h>
-+
-+#include <net/dst.h>
-+
-+#include <net/netfilter/nf_conntrack.h>
-+#include <net/netfilter/nf_conntrack_core.h>
-+#include <net/netfilter/nf_conntrack_extend.h>
-+#include <net/netfilter/nf_conntrack_rtcache.h>
-+
-+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
-+#include <net/ip6_fib.h>
-+#endif
-+
-+static void __nf_conn_rtcache_destroy(struct nf_conn_rtcache *rtc,
-+                                    enum ip_conntrack_dir dir)
-+{
-+      struct dst_entry *dst = rtc->cached_dst[dir].dst;
-+
-+      dst_release(dst);
-+}
-+
-+static void nf_conn_rtcache_destroy(struct nf_conn *ct)
-+{
-+      struct nf_conn_rtcache *rtc = nf_ct_rtcache_find(ct);
-+
-+      if (!rtc)
-+              return;
-+
-+      __nf_conn_rtcache_destroy(rtc, IP_CT_DIR_ORIGINAL);
-+      __nf_conn_rtcache_destroy(rtc, IP_CT_DIR_REPLY);
-+}
-+
-+static void nf_ct_rtcache_ext_add(struct nf_conn *ct)
-+{
-+      struct nf_conn_rtcache *rtc;
-+
-+      rtc = nf_ct_ext_add(ct, NF_CT_EXT_RTCACHE, GFP_ATOMIC);
-+      if (rtc) {
-+              rtc->cached_dst[IP_CT_DIR_ORIGINAL].iif = -1;
-+              rtc->cached_dst[IP_CT_DIR_ORIGINAL].dst = NULL;
-+              rtc->cached_dst[IP_CT_DIR_REPLY].iif = -1;
-+              rtc->cached_dst[IP_CT_DIR_REPLY].dst = NULL;
-+      }
-+}
-+
-+static struct nf_conn_rtcache *nf_ct_rtcache_find_usable(struct nf_conn *ct)
-+{
-+      if (nf_ct_is_untracked(ct))
-+              return NULL;
-+      return nf_ct_rtcache_find(ct);
-+}
-+
-+static struct dst_entry *
-+nf_conn_rtcache_dst_get(const struct nf_conn_rtcache *rtc,
-+                      enum ip_conntrack_dir dir)
-+{
-+      return rtc->cached_dst[dir].dst;
-+}
-+
-+static u32 nf_rtcache_get_cookie(int pf, const struct dst_entry *dst)
-+{
-+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
-+      if (pf == NFPROTO_IPV6) {
-+              const struct rt6_info *rt = (const struct rt6_info *)dst;
-+
-+              if (rt->rt6i_node)
-+                      return (u32)rt->rt6i_node->fn_sernum;
-+      }
-+#endif
-+      return 0;
-+}
-+
-+static void nf_conn_rtcache_dst_set(int pf,
-+                                  struct nf_conn_rtcache *rtc,
-+                                  struct dst_entry *dst,
-+                                  enum ip_conntrack_dir dir, int iif)
-+{
-+      if (rtc->cached_dst[dir].iif != iif)
-+              rtc->cached_dst[dir].iif = iif;
-+
-+      if (rtc->cached_dst[dir].dst != dst) {
-+              struct dst_entry *old;
-+
-+              dst_hold(dst);
-+
-+              old = xchg(&rtc->cached_dst[dir].dst, dst);
-+              dst_release(old);
-+
-+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
-+              if (pf == NFPROTO_IPV6)
-+                      rtc->cached_dst[dir].cookie =
-+                              nf_rtcache_get_cookie(pf, dst);
-+#endif
-+      }
-+}
-+
-+static void nf_conn_rtcache_dst_obsolete(struct nf_conn_rtcache *rtc,
-+                                       enum ip_conntrack_dir dir)
-+{
-+      struct dst_entry *old;
-+
-+      pr_debug("Invalidate iif %d for dir %d on cache %p\n",
-+               rtc->cached_dst[dir].iif, dir, rtc);
-+
-+      old = xchg(&rtc->cached_dst[dir].dst, NULL);
-+      dst_release(old);
-+      rtc->cached_dst[dir].iif = -1;
-+}
-+
-+static unsigned int nf_rtcache_in(u_int8_t pf,
-+                                struct sk_buff *skb,
-+                                const struct nf_hook_state *state)
-+{
-+      struct nf_conn_rtcache *rtc;
-+      enum ip_conntrack_info ctinfo;
-+      enum ip_conntrack_dir dir;
-+      struct dst_entry *dst;
-+      struct nf_conn *ct;
-+      int iif;
-+      u32 cookie;
-+
-+      if (skb_dst(skb) || skb->sk)
-+              return NF_ACCEPT;
-+
-+      ct = nf_ct_get(skb, &ctinfo);
-+      if (!ct)
-+              return NF_ACCEPT;
-+
-+      rtc = nf_ct_rtcache_find_usable(ct);
-+      if (!rtc)
-+              return NF_ACCEPT;
-+
-+      /* if iif changes, don't use cache and let ip stack
-+       * do route lookup.
-+       *
-+       * If rp_filter is enabled it might toss skb, so
-+       * we don't want to avoid these checks.
-+       */
-+      dir = CTINFO2DIR(ctinfo);
-+      iif = nf_conn_rtcache_iif_get(rtc, dir);
-+      if (state->in->ifindex != iif) {
-+              pr_debug("ct %p, iif %d, cached iif %d, skip cached entry\n",
-+                       ct, iif, state->in->ifindex);
-+              return NF_ACCEPT;
-+      }
-+      dst = nf_conn_rtcache_dst_get(rtc, dir);
-+      if (dst == NULL)
-+              return NF_ACCEPT;
-+
-+      cookie = nf_rtcache_get_cookie(pf, dst);
-+
-+      dst = dst_check(dst, cookie);
-+      pr_debug("obtained dst %p for skb %p, cookie %d\n", dst, skb, cookie);
-+      if (likely(dst))
-+              skb_dst_set_noref(skb, dst);
-+      else
-+              nf_conn_rtcache_dst_obsolete(rtc, dir);
-+
-+      return NF_ACCEPT;
-+}
-+
-+static unsigned int nf_rtcache_forward(u_int8_t pf,
-+                                     struct sk_buff *skb,
-+                                     const struct nf_hook_state *state)
-+{
-+      struct nf_conn_rtcache *rtc;
-+      enum ip_conntrack_info ctinfo;
-+      enum ip_conntrack_dir dir;
-+      struct nf_conn *ct;
-+      struct dst_entry *dst = skb_dst(skb);
-+      int iif;
-+
-+      ct = nf_ct_get(skb, &ctinfo);
-+      if (!ct)
-+              return NF_ACCEPT;
-+
-+      if (dst && dst_xfrm(dst))
-+              return NF_ACCEPT;
-+
-+      if (!nf_ct_is_confirmed(ct)) {
-+              if (WARN_ON(nf_ct_rtcache_find(ct)))
-+                      return NF_ACCEPT;
-+              nf_ct_rtcache_ext_add(ct);
-+              return NF_ACCEPT;
-+      }
-+
-+      rtc = nf_ct_rtcache_find_usable(ct);
-+      if (!rtc)
-+              return NF_ACCEPT;
-+
-+      dir = CTINFO2DIR(ctinfo);
-+      iif = nf_conn_rtcache_iif_get(rtc, dir);
-+      pr_debug("ct %p, skb %p, dir %d, iif %d, cached iif %d\n",
-+               ct, skb, dir, iif, state->in->ifindex);
-+      if (likely(state->in->ifindex == iif))
-+              return NF_ACCEPT;
-+
-+      nf_conn_rtcache_dst_set(pf, rtc, skb_dst(skb), dir, state->in->ifindex);
-+      return NF_ACCEPT;
-+}
-+
-+static unsigned int nf_rtcache_in4(void *priv,
-+                                struct sk_buff *skb,
-+                                const struct nf_hook_state *state)
-+{
-+      return nf_rtcache_in(NFPROTO_IPV4, skb, state);
-+}
-+
-+static unsigned int nf_rtcache_forward4(void *priv,
-+                                     struct sk_buff *skb,
-+                                     const struct nf_hook_state *state)
-+{
-+      return nf_rtcache_forward(NFPROTO_IPV4, skb, state);
-+}
-+
-+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
-+static unsigned int nf_rtcache_in6(void *priv,
-+                                struct sk_buff *skb,
-+                                const struct nf_hook_state *state)
-+{
-+      return nf_rtcache_in(NFPROTO_IPV6, skb, state);
-+}
-+
-+static unsigned int nf_rtcache_forward6(void *priv,
-+                                     struct sk_buff *skb,
-+                                     const struct nf_hook_state *state)
-+{
-+      return nf_rtcache_forward(NFPROTO_IPV6, skb, state);
-+}
-+#endif
-+
-+static int nf_rtcache_dst_remove(struct nf_conn *ct, void *data)
-+{
-+      struct nf_conn_rtcache *rtc = nf_ct_rtcache_find(ct);
-+      struct net_device *dev = data;
-+
-+      if (!rtc)
-+              return 0;
-+
-+      if (dev->ifindex == rtc->cached_dst[IP_CT_DIR_ORIGINAL].iif ||
-+          dev->ifindex == rtc->cached_dst[IP_CT_DIR_REPLY].iif) {
-+              nf_conn_rtcache_dst_obsolete(rtc, IP_CT_DIR_ORIGINAL);
-+              nf_conn_rtcache_dst_obsolete(rtc, IP_CT_DIR_REPLY);
-+      }
-+
-+      return 0;
-+}
-+
-+static int nf_rtcache_netdev_event(struct notifier_block *this,
-+                                 unsigned long event, void *ptr)
-+{
-+      struct net_device *dev = netdev_notifier_info_to_dev(ptr);
-+      struct net *net = dev_net(dev);
-+
-+      if (event == NETDEV_DOWN)
-+              nf_ct_iterate_cleanup(net, nf_rtcache_dst_remove, dev, 0, 0);
-+
-+      return NOTIFY_DONE;
-+}
-+
-+static struct notifier_block nf_rtcache_notifier = {
-+      .notifier_call = nf_rtcache_netdev_event,
-+};
-+
-+static struct nf_hook_ops rtcache_ops[] = {
-+      {
-+              .hook           = nf_rtcache_in4,
-+              .pf             = NFPROTO_IPV4,
-+              .hooknum        = NF_INET_PRE_ROUTING,
-+              .priority       = NF_IP_PRI_LAST,
-+      },
-+      {
-+              .hook           = nf_rtcache_forward4,
-+              .pf             = NFPROTO_IPV4,
-+              .hooknum        = NF_INET_FORWARD,
-+              .priority       = NF_IP_PRI_LAST,
-+      },
-+#if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV6)
-+      {
-+              .hook           = nf_rtcache_in6,
-+              .pf             = NFPROTO_IPV6,
-+              .hooknum        = NF_INET_PRE_ROUTING,
-+              .priority       = NF_IP_PRI_LAST,
-+      },
-+      {
-+              .hook           = nf_rtcache_forward6,
-+              .pf             = NFPROTO_IPV6,
-+              .hooknum        = NF_INET_FORWARD,
-+              .priority       = NF_IP_PRI_LAST,
-+      },
-+#endif
-+};
-+
-+static struct nf_ct_ext_type rtcache_extend __read_mostly = {
-+      .len    = sizeof(struct nf_conn_rtcache),
-+      .align  = __alignof__(struct nf_conn_rtcache),
-+      .id     = NF_CT_EXT_RTCACHE,
-+      .destroy = nf_conn_rtcache_destroy,
-+};
-+
-+static int __init nf_conntrack_rtcache_init(void)
-+{
-+      int ret = nf_ct_extend_register(&rtcache_extend);
-+
-+      if (ret < 0) {
-+              pr_err("nf_conntrack_rtcache: Unable to register extension\n");
-+              return ret;
-+      }
-+
-+      ret = nf_register_hooks(rtcache_ops, ARRAY_SIZE(rtcache_ops));
-+      if (ret < 0) {
-+              nf_ct_extend_unregister(&rtcache_extend);
-+              return ret;
-+      }
-+
-+      ret = register_netdevice_notifier(&nf_rtcache_notifier);
-+      if (ret) {
-+              nf_unregister_hooks(rtcache_ops, ARRAY_SIZE(rtcache_ops));
-+              nf_ct_extend_unregister(&rtcache_extend);
-+      }
-+
-+      return ret;
-+}
-+
-+static int nf_rtcache_ext_remove(struct nf_conn *ct, void *data)
-+{
-+      struct nf_conn_rtcache *rtc = nf_ct_rtcache_find(ct);
-+
-+      return rtc != NULL;
-+}
-+
-+static bool __exit nf_conntrack_rtcache_wait_for_dying(struct net *net)
-+{
-+      bool wait = false;
-+      int cpu;
-+
-+      for_each_possible_cpu(cpu) {
-+              struct nf_conntrack_tuple_hash *h;
-+              struct hlist_nulls_node *n;
-+              struct nf_conn *ct;
-+              struct ct_pcpu *pcpu = per_cpu_ptr(net->ct.pcpu_lists, cpu);
-+
-+              rcu_read_lock();
-+              spin_lock_bh(&pcpu->lock);
-+
-+              hlist_nulls_for_each_entry(h, n, &pcpu->dying, hnnode) {
-+                      ct = nf_ct_tuplehash_to_ctrack(h);
-+                      if (nf_ct_rtcache_find(ct) != NULL) {
-+                              wait = true;
-+                              break;
-+                      }
-+              }
-+              spin_unlock_bh(&pcpu->lock);
-+              rcu_read_unlock();
-+      }
-+
-+      return wait;
-+}
-+
-+static void __exit nf_conntrack_rtcache_fini(void)
-+{
-+      struct net *net;
-+      int count = 0;
-+
-+      /* remove hooks so no new connections get rtcache extension */
-+      nf_unregister_hooks(rtcache_ops, ARRAY_SIZE(rtcache_ops));
-+
-+      synchronize_net();
-+
-+      unregister_netdevice_notifier(&nf_rtcache_notifier);
-+
-+      rtnl_lock();
-+
-+      /* zap all conntracks with rtcache extension */
-+      for_each_net(net)
-+              nf_ct_iterate_cleanup(net, nf_rtcache_ext_remove, NULL, 0, 0);
-+
-+      for_each_net(net) {
-+              /* .. and make sure they're gone from dying list, too */
-+              while (nf_conntrack_rtcache_wait_for_dying(net)) {
-+                      msleep(200);
-+                      WARN_ONCE(++count > 25, "Waiting for all rtcache conntracks to go away\n");
-+              }
-+      }
-+
-+      rtnl_unlock();
-+      synchronize_net();
-+      nf_ct_extend_unregister(&rtcache_extend);
-+}
-+module_init(nf_conntrack_rtcache_init);
-+module_exit(nf_conntrack_rtcache_fini);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Florian Westphal <fw@strlen.de>");
-+MODULE_DESCRIPTION("Conntrack route cache extension");
diff --git a/target/linux/generic/backport-4.9/021-bridge-multicast-to-unicast.patch b/target/linux/generic/backport-4.9/021-bridge-multicast-to-unicast.patch
deleted file mode 100644 (file)
index 42daacf..0000000
+++ /dev/null
@@ -1,499 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 19 Jan 2017 03:45:10 +0100
-Subject: [PATCH] bridge: multicast to unicast
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Implements an optional, per bridge port flag and feature to deliver
-multicast packets to any host on the according port via unicast
-individually. This is done by copying the packet per host and
-changing the multicast destination MAC to a unicast one accordingly.
-
-multicast-to-unicast works on top of the multicast snooping feature of
-the bridge. Which means unicast copies are only delivered to hosts which
-are interested in it and signalized this via IGMP/MLD reports
-previously.
-
-This feature is intended for interface types which have a more reliable
-and/or efficient way to deliver unicast packets than broadcast ones
-(e.g. wifi).
-
-However, it should only be enabled on interfaces where no IGMPv2/MLDv1
-report suppression takes place. This feature is disabled by default.
-
-The initial patch and idea is from Felix Fietkau.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-[linus.luessing@c0d3.blue: various bug + style fixes, commit message]
-Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
----
-
---- a/include/linux/if_bridge.h
-+++ b/include/linux/if_bridge.h
-@@ -46,6 +46,7 @@ struct br_ip_list {
- #define BR_LEARNING_SYNC      BIT(9)
- #define BR_PROXYARP_WIFI      BIT(10)
- #define BR_MCAST_FLOOD                BIT(11)
-+#define BR_MULTICAST_TO_UNICAST       BIT(12)
- #define BR_DEFAULT_AGEING_TIME        (300 * HZ)
---- a/include/uapi/linux/if_link.h
-+++ b/include/uapi/linux/if_link.h
-@@ -319,6 +319,7 @@ enum {
-       IFLA_BRPORT_MULTICAST_ROUTER,
-       IFLA_BRPORT_PAD,
-       IFLA_BRPORT_MCAST_FLOOD,
-+      IFLA_BRPORT_MCAST_TO_UCAST,
-       __IFLA_BRPORT_MAX
- };
- #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
---- a/net/bridge/br_forward.c
-+++ b/net/bridge/br_forward.c
-@@ -173,6 +173,29 @@ out:
-       return p;
- }
-+static void maybe_deliver_addr(struct net_bridge_port *p, struct sk_buff *skb,
-+                             const unsigned char *addr, bool local_orig)
-+{
-+      struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev;
-+      const unsigned char *src = eth_hdr(skb)->h_source;
-+
-+      if (!should_deliver(p, skb))
-+              return;
-+
-+      /* Even with hairpin, no soliloquies - prevent breaking IPv6 DAD */
-+      if (skb->dev == p->dev && ether_addr_equal(src, addr))
-+              return;
-+
-+      skb = skb_copy(skb, GFP_ATOMIC);
-+      if (!skb) {
-+              dev->stats.tx_dropped++;
-+              return;
-+      }
-+
-+      memcpy(eth_hdr(skb)->h_dest, addr, ETH_ALEN);
-+      __br_forward(p, skb, local_orig);
-+}
-+
- /* called under rcu_read_lock */
- void br_flood(struct net_bridge *br, struct sk_buff *skb,
-             enum br_pkt_type pkt_type, bool local_rcv, bool local_orig)
-@@ -241,10 +264,20 @@ void br_multicast_flood(struct net_bridg
-               rport = rp ? hlist_entry(rp, struct net_bridge_port, rlist) :
-                            NULL;
--              port = (unsigned long)lport > (unsigned long)rport ?
--                     lport : rport;
-+              if ((unsigned long)lport > (unsigned long)rport) {
-+                      port = lport;
-+
-+                      if (p->flags & MDB_PG_FLAGS_MCAST_TO_UCAST) {
-+                              maybe_deliver_addr(lport, skb, p->eth_addr,
-+                                                 local_orig);
-+                              goto delivered;
-+                      }
-+              } else {
-+                      port = rport;
-+              }
-               prev = maybe_deliver(prev, port, skb, local_orig);
-+delivered:
-               if (IS_ERR(prev))
-                       goto out;
-               if (prev == port)
---- a/net/bridge/br_mdb.c
-+++ b/net/bridge/br_mdb.c
-@@ -532,7 +532,7 @@ static int br_mdb_add_group(struct net_b
-                       break;
-       }
--      p = br_multicast_new_port_group(port, group, *pp, state);
-+      p = br_multicast_new_port_group(port, group, *pp, state, NULL);
-       if (unlikely(!p))
-               return -ENOMEM;
-       rcu_assign_pointer(*pp, p);
---- a/net/bridge/br_multicast.c
-+++ b/net/bridge/br_multicast.c
-@@ -42,12 +42,14 @@ static void br_multicast_add_router(stru
- static void br_ip4_multicast_leave_group(struct net_bridge *br,
-                                        struct net_bridge_port *port,
-                                        __be32 group,
--                                       __u16 vid);
-+                                       __u16 vid,
-+                                       const unsigned char *src);
-+
- #if IS_ENABLED(CONFIG_IPV6)
- static void br_ip6_multicast_leave_group(struct net_bridge *br,
-                                        struct net_bridge_port *port,
-                                        const struct in6_addr *group,
--                                       __u16 vid);
-+                                       __u16 vid, const unsigned char *src);
- #endif
- unsigned int br_mdb_rehash_seq;
-@@ -658,7 +660,8 @@ struct net_bridge_port_group *br_multica
-                       struct net_bridge_port *port,
-                       struct br_ip *group,
-                       struct net_bridge_port_group __rcu *next,
--                      unsigned char flags)
-+                      unsigned char flags,
-+                      const unsigned char *src)
- {
-       struct net_bridge_port_group *p;
-@@ -673,12 +676,39 @@ struct net_bridge_port_group *br_multica
-       hlist_add_head(&p->mglist, &port->mglist);
-       setup_timer(&p->timer, br_multicast_port_group_expired,
-                   (unsigned long)p);
-+
-+      if ((port->flags & BR_MULTICAST_TO_UNICAST) && src) {
-+              memcpy(p->eth_addr, src, ETH_ALEN);
-+              p->flags |= MDB_PG_FLAGS_MCAST_TO_UCAST;
-+      }
-+
-       return p;
- }
-+static bool br_port_group_equal(struct net_bridge_port_group *p,
-+                              struct net_bridge_port *port,
-+                              const unsigned char *src)
-+{
-+      if (p->port != port)
-+              return false;
-+
-+      if (!(p->flags & MDB_PG_FLAGS_MCAST_TO_UCAST) !=
-+          !(port->flags & BR_MULTICAST_TO_UNICAST))
-+              return false;
-+
-+      if (!(p->flags & MDB_PG_FLAGS_MCAST_TO_UCAST))
-+              return true;
-+
-+      if (!src)
-+              return false;
-+
-+      return ether_addr_equal(src, p->eth_addr);
-+}
-+
- static int br_multicast_add_group(struct net_bridge *br,
-                                 struct net_bridge_port *port,
--                                struct br_ip *group)
-+                                struct br_ip *group,
-+                                const unsigned char *src)
- {
-       struct net_bridge_mdb_entry *mp;
-       struct net_bridge_port_group *p;
-@@ -705,13 +735,13 @@ static int br_multicast_add_group(struct
-       for (pp = &mp->ports;
-            (p = mlock_dereference(*pp, br)) != NULL;
-            pp = &p->next) {
--              if (p->port == port)
-+              if (br_port_group_equal(p, port, src))
-                       goto found;
-               if ((unsigned long)p->port < (unsigned long)port)
-                       break;
-       }
--      p = br_multicast_new_port_group(port, group, *pp, 0);
-+      p = br_multicast_new_port_group(port, group, *pp, 0, src);
-       if (unlikely(!p))
-               goto err;
-       rcu_assign_pointer(*pp, p);
-@@ -730,7 +760,8 @@ err:
- static int br_ip4_multicast_add_group(struct net_bridge *br,
-                                     struct net_bridge_port *port,
-                                     __be32 group,
--                                    __u16 vid)
-+                                    __u16 vid,
-+                                    const unsigned char *src)
- {
-       struct br_ip br_group;
-@@ -741,14 +772,15 @@ static int br_ip4_multicast_add_group(st
-       br_group.proto = htons(ETH_P_IP);
-       br_group.vid = vid;
--      return br_multicast_add_group(br, port, &br_group);
-+      return br_multicast_add_group(br, port, &br_group, src);
- }
- #if IS_ENABLED(CONFIG_IPV6)
- static int br_ip6_multicast_add_group(struct net_bridge *br,
-                                     struct net_bridge_port *port,
-                                     const struct in6_addr *group,
--                                    __u16 vid)
-+                                    __u16 vid,
-+                                    const unsigned char *src)
- {
-       struct br_ip br_group;
-@@ -759,7 +791,7 @@ static int br_ip6_multicast_add_group(st
-       br_group.proto = htons(ETH_P_IPV6);
-       br_group.vid = vid;
--      return br_multicast_add_group(br, port, &br_group);
-+      return br_multicast_add_group(br, port, &br_group, src);
- }
- #endif
-@@ -1028,6 +1060,7 @@ static int br_ip4_multicast_igmp3_report
-                                        struct sk_buff *skb,
-                                        u16 vid)
- {
-+      const unsigned char *src;
-       struct igmpv3_report *ih;
-       struct igmpv3_grec *grec;
-       int i;
-@@ -1070,12 +1103,14 @@ static int br_ip4_multicast_igmp3_report
-                       continue;
-               }
-+              src = eth_hdr(skb)->h_source;
-               if ((type == IGMPV3_CHANGE_TO_INCLUDE ||
-                    type == IGMPV3_MODE_IS_INCLUDE) &&
-                   nsrcs == 0) {
--                      br_ip4_multicast_leave_group(br, port, group, vid);
-+                      br_ip4_multicast_leave_group(br, port, group, vid, src);
-               } else {
--                      err = br_ip4_multicast_add_group(br, port, group, vid);
-+                      err = br_ip4_multicast_add_group(br, port, group, vid,
-+                                                       src);
-                       if (err)
-                               break;
-               }
-@@ -1090,6 +1125,7 @@ static int br_ip6_multicast_mld2_report(
-                                       struct sk_buff *skb,
-                                       u16 vid)
- {
-+      const unsigned char *src = eth_hdr(skb)->h_source;
-       struct icmp6hdr *icmp6h;
-       struct mld2_grec *grec;
-       int i;
-@@ -1144,10 +1180,11 @@ static int br_ip6_multicast_mld2_report(
-                    grec->grec_type == MLD2_MODE_IS_INCLUDE) &&
-                   nsrcs == 0) {
-                       br_ip6_multicast_leave_group(br, port, &grec->grec_mca,
--                                                   vid);
-+                                                   vid, src);
-               } else {
-                       err = br_ip6_multicast_add_group(br, port,
--                                                       &grec->grec_mca, vid);
-+                                                       &grec->grec_mca, vid,
-+                                                       src);
-                       if (err)
-                               break;
-               }
-@@ -1462,7 +1499,8 @@ br_multicast_leave_group(struct net_brid
-                        struct net_bridge_port *port,
-                        struct br_ip *group,
-                        struct bridge_mcast_other_query *other_query,
--                       struct bridge_mcast_own_query *own_query)
-+                       struct bridge_mcast_own_query *own_query,
-+                       const unsigned char *src)
- {
-       struct net_bridge_mdb_htable *mdb;
-       struct net_bridge_mdb_entry *mp;
-@@ -1486,7 +1524,7 @@ br_multicast_leave_group(struct net_brid
-               for (pp = &mp->ports;
-                    (p = mlock_dereference(*pp, br)) != NULL;
-                    pp = &p->next) {
--                      if (p->port != port)
-+                      if (!br_port_group_equal(p, port, src))
-                               continue;
-                       if (p->flags & MDB_PG_FLAGS_PERMANENT)
-@@ -1520,7 +1558,7 @@ br_multicast_leave_group(struct net_brid
-               for (p = mlock_dereference(mp->ports, br);
-                    p != NULL;
-                    p = mlock_dereference(p->next, br)) {
--                      if (p->port != port)
-+                      if (!br_port_group_equal(p, port, src))
-                               continue;
-                       if (!hlist_unhashed(&p->mglist) &&
-@@ -1571,7 +1609,8 @@ out:
- static void br_ip4_multicast_leave_group(struct net_bridge *br,
-                                        struct net_bridge_port *port,
-                                        __be32 group,
--                                       __u16 vid)
-+                                       __u16 vid,
-+                                       const unsigned char *src)
- {
-       struct br_ip br_group;
-       struct bridge_mcast_own_query *own_query;
-@@ -1586,14 +1625,15 @@ static void br_ip4_multicast_leave_group
-       br_group.vid = vid;
-       br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query,
--                               own_query);
-+                               own_query, src);
- }
- #if IS_ENABLED(CONFIG_IPV6)
- static void br_ip6_multicast_leave_group(struct net_bridge *br,
-                                        struct net_bridge_port *port,
-                                        const struct in6_addr *group,
--                                       __u16 vid)
-+                                       __u16 vid,
-+                                       const unsigned char *src)
- {
-       struct br_ip br_group;
-       struct bridge_mcast_own_query *own_query;
-@@ -1608,7 +1648,7 @@ static void br_ip6_multicast_leave_group
-       br_group.vid = vid;
-       br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query,
--                               own_query);
-+                               own_query, src);
- }
- #endif
-@@ -1651,6 +1691,7 @@ static int br_multicast_ipv4_rcv(struct
-                                u16 vid)
- {
-       struct sk_buff *skb_trimmed = NULL;
-+      const unsigned char *src;
-       struct igmphdr *ih;
-       int err;
-@@ -1666,13 +1707,14 @@ static int br_multicast_ipv4_rcv(struct
-       }
-       ih = igmp_hdr(skb);
-+      src = eth_hdr(skb)->h_source;
-       BR_INPUT_SKB_CB(skb)->igmp = ih->type;
-       switch (ih->type) {
-       case IGMP_HOST_MEMBERSHIP_REPORT:
-       case IGMPV2_HOST_MEMBERSHIP_REPORT:
-               BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
--              err = br_ip4_multicast_add_group(br, port, ih->group, vid);
-+              err = br_ip4_multicast_add_group(br, port, ih->group, vid, src);
-               break;
-       case IGMPV3_HOST_MEMBERSHIP_REPORT:
-               err = br_ip4_multicast_igmp3_report(br, port, skb_trimmed, vid);
-@@ -1681,7 +1723,7 @@ static int br_multicast_ipv4_rcv(struct
-               err = br_ip4_multicast_query(br, port, skb_trimmed, vid);
-               break;
-       case IGMP_HOST_LEAVE_MESSAGE:
--              br_ip4_multicast_leave_group(br, port, ih->group, vid);
-+              br_ip4_multicast_leave_group(br, port, ih->group, vid, src);
-               break;
-       }
-@@ -1701,6 +1743,7 @@ static int br_multicast_ipv6_rcv(struct
-                                u16 vid)
- {
-       struct sk_buff *skb_trimmed = NULL;
-+      const unsigned char *src;
-       struct mld_msg *mld;
-       int err;
-@@ -1720,8 +1763,10 @@ static int br_multicast_ipv6_rcv(struct
-       switch (mld->mld_type) {
-       case ICMPV6_MGM_REPORT:
-+              src = eth_hdr(skb)->h_source;
-               BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
--              err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid);
-+              err = br_ip6_multicast_add_group(br, port, &mld->mld_mca, vid,
-+                                               src);
-               break;
-       case ICMPV6_MLD2_REPORT:
-               err = br_ip6_multicast_mld2_report(br, port, skb_trimmed, vid);
-@@ -1730,7 +1775,8 @@ static int br_multicast_ipv6_rcv(struct
-               err = br_ip6_multicast_query(br, port, skb_trimmed, vid);
-               break;
-       case ICMPV6_MGM_REDUCTION:
--              br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid);
-+              src = eth_hdr(skb)->h_source;
-+              br_ip6_multicast_leave_group(br, port, &mld->mld_mca, vid, src);
-               break;
-       }
---- a/net/bridge/br_netlink.c
-+++ b/net/bridge/br_netlink.c
-@@ -123,6 +123,7 @@ static inline size_t br_port_info_size(v
-               + nla_total_size(1)     /* IFLA_BRPORT_GUARD */
-               + nla_total_size(1)     /* IFLA_BRPORT_PROTECT */
-               + nla_total_size(1)     /* IFLA_BRPORT_FAST_LEAVE */
-+              + nla_total_size(1)     /* IFLA_BRPORT_MCAST_TO_UCAST */
-               + nla_total_size(1)     /* IFLA_BRPORT_LEARNING */
-               + nla_total_size(1)     /* IFLA_BRPORT_UNICAST_FLOOD */
-               + nla_total_size(1)     /* IFLA_BRPORT_PROXYARP */
-@@ -173,6 +174,8 @@ static int br_port_fill_attrs(struct sk_
-                      !!(p->flags & BR_ROOT_BLOCK)) ||
-           nla_put_u8(skb, IFLA_BRPORT_FAST_LEAVE,
-                      !!(p->flags & BR_MULTICAST_FAST_LEAVE)) ||
-+          nla_put_u8(skb, IFLA_BRPORT_MCAST_TO_UCAST,
-+                     !!(p->flags & BR_MULTICAST_TO_UNICAST)) ||
-           nla_put_u8(skb, IFLA_BRPORT_LEARNING, !!(p->flags & BR_LEARNING)) ||
-           nla_put_u8(skb, IFLA_BRPORT_UNICAST_FLOOD,
-                      !!(p->flags & BR_FLOOD)) ||
-@@ -586,6 +589,7 @@ static const struct nla_policy br_port_p
-       [IFLA_BRPORT_PROXYARP]  = { .type = NLA_U8 },
-       [IFLA_BRPORT_PROXYARP_WIFI] = { .type = NLA_U8 },
-       [IFLA_BRPORT_MULTICAST_ROUTER] = { .type = NLA_U8 },
-+      [IFLA_BRPORT_MCAST_TO_UCAST] = { .type = NLA_U8 },
- };
- /* Change the state of the port and notify spanning tree */
-@@ -636,6 +640,7 @@ static int br_setport(struct net_bridge_
-       br_set_port_flag(p, tb, IFLA_BRPORT_LEARNING, BR_LEARNING);
-       br_set_port_flag(p, tb, IFLA_BRPORT_UNICAST_FLOOD, BR_FLOOD);
-       br_set_port_flag(p, tb, IFLA_BRPORT_MCAST_FLOOD, BR_MCAST_FLOOD);
-+      br_set_port_flag(p, tb, IFLA_BRPORT_MCAST_TO_UCAST, BR_MULTICAST_TO_UNICAST);
-       br_set_port_flag(p, tb, IFLA_BRPORT_PROXYARP, BR_PROXYARP);
-       br_set_port_flag(p, tb, IFLA_BRPORT_PROXYARP_WIFI, BR_PROXYARP_WIFI);
---- a/net/bridge/br_private.h
-+++ b/net/bridge/br_private.h
-@@ -166,8 +166,9 @@ struct net_bridge_fdb_entry
-       struct rcu_head                 rcu;
- };
--#define MDB_PG_FLAGS_PERMANENT        BIT(0)
--#define MDB_PG_FLAGS_OFFLOAD  BIT(1)
-+#define MDB_PG_FLAGS_PERMANENT                BIT(0)
-+#define MDB_PG_FLAGS_OFFLOAD          BIT(1)
-+#define MDB_PG_FLAGS_MCAST_TO_UCAST   BIT(2)
- struct net_bridge_port_group {
-       struct net_bridge_port          *port;
-@@ -177,6 +178,7 @@ struct net_bridge_port_group {
-       struct timer_list               timer;
-       struct br_ip                    addr;
-       unsigned char                   flags;
-+      unsigned char                   eth_addr[ETH_ALEN];
- };
- struct net_bridge_mdb_entry
-@@ -591,7 +593,7 @@ void br_multicast_free_pg(struct rcu_hea
- struct net_bridge_port_group *
- br_multicast_new_port_group(struct net_bridge_port *port, struct br_ip *group,
-                           struct net_bridge_port_group __rcu *next,
--                          unsigned char flags);
-+                          unsigned char flags, const unsigned char *src);
- void br_mdb_init(void);
- void br_mdb_uninit(void);
- void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
---- a/net/bridge/br_sysfs_if.c
-+++ b/net/bridge/br_sysfs_if.c
-@@ -188,6 +188,7 @@ static BRPORT_ATTR(multicast_router, S_I
-                  store_multicast_router);
- BRPORT_ATTR_FLAG(multicast_fast_leave, BR_MULTICAST_FAST_LEAVE);
-+BRPORT_ATTR_FLAG(multicast_to_unicast, BR_MULTICAST_TO_UNICAST);
- #endif
- static const struct brport_attribute *brport_attrs[] = {
-@@ -214,6 +215,7 @@ static const struct brport_attribute *br
- #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
-       &brport_attr_multicast_router,
-       &brport_attr_multicast_fast_leave,
-+      &brport_attr_multicast_to_unicast,
- #endif
-       &brport_attr_proxyarp,
-       &brport_attr_proxyarp_wifi,
diff --git a/target/linux/generic/backport-4.9/022-net-add-devm-version-of-alloc_etherdev_mqs-function.patch b/target/linux/generic/backport-4.9/022-net-add-devm-version-of-alloc_etherdev_mqs-function.patch
deleted file mode 100644 (file)
index c5d65b7..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Sat, 28 Jan 2017 15:15:42 +0100
-Subject: [PATCH] net: add devm version of alloc_etherdev_mqs function
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This patch adds devm_alloc_etherdev_mqs function and devm_alloc_etherdev
-macro. These can be used for simpler netdev allocation without having to
-care about calling free_netdev.
-
-Thanks to this change drivers, their error paths and removal paths may
-get simpler by a bit.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
-
---- a/include/linux/etherdevice.h
-+++ b/include/linux/etherdevice.h
-@@ -54,6 +54,11 @@ struct net_device *alloc_etherdev_mqs(in
- #define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1)
- #define alloc_etherdev_mq(sizeof_priv, count) alloc_etherdev_mqs(sizeof_priv, count, count)
-+struct net_device *devm_alloc_etherdev_mqs(struct device *dev, int sizeof_priv,
-+                                         unsigned int txqs,
-+                                         unsigned int rxqs);
-+#define devm_alloc_etherdev(dev, sizeof_priv) devm_alloc_etherdev_mqs(dev, sizeof_priv, 1, 1)
-+
- struct sk_buff **eth_gro_receive(struct sk_buff **head,
-                                struct sk_buff *skb);
- int eth_gro_complete(struct sk_buff *skb, int nhoff);
---- a/net/ethernet/eth.c
-+++ b/net/ethernet/eth.c
-@@ -391,6 +391,34 @@ struct net_device *alloc_etherdev_mqs(in
- }
- EXPORT_SYMBOL(alloc_etherdev_mqs);
-+static void devm_free_netdev(struct device *dev, void *res)
-+{
-+      free_netdev(*(struct net_device **)res);
-+}
-+
-+struct net_device *devm_alloc_etherdev_mqs(struct device *dev, int sizeof_priv,
-+                                         unsigned int txqs, unsigned int rxqs)
-+{
-+      struct net_device **dr;
-+      struct net_device *netdev;
-+
-+      dr = devres_alloc(devm_free_netdev, sizeof(*dr), GFP_KERNEL);
-+      if (!dr)
-+              return NULL;
-+
-+      netdev = alloc_etherdev_mqs(sizeof_priv, txqs, rxqs);
-+      if (!netdev) {
-+              devres_free(dr);
-+              return NULL;
-+      }
-+
-+      *dr = netdev;
-+      devres_add(dev, dr);
-+
-+      return netdev;
-+}
-+EXPORT_SYMBOL(devm_alloc_etherdev_mqs);
-+
- ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len)
- {
-       return scnprintf(buf, PAGE_SIZE, "%*phC\n", len, addr);
diff --git a/target/linux/generic/backport-4.9/024-1-tcp-tsq-add-tsq_flags-tsq_enum.patch b/target/linux/generic/backport-4.9/024-1-tcp-tsq-add-tsq_flags-tsq_enum.patch
deleted file mode 100644 (file)
index 853b7d6..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-From 40fc3423b983b864bf70b03199191260ae9b2ea6 Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Sat, 3 Dec 2016 11:14:50 -0800
-Subject: [PATCH 01/10] tcp: tsq: add tsq_flags / tsq_enum
-
-This is a cleanup, to ease code review of following patches.
-
-Old 'enum tsq_flags' is renamed, and a new enumeration is added
-with the flags used in cmpxchg() operations as opposed to
-single bit operations.
-
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- include/linux/tcp.h   | 11 ++++++++++-
- net/ipv4/tcp_output.c | 16 ++++++++--------
- 2 files changed, 18 insertions(+), 9 deletions(-)
-
---- a/include/linux/tcp.h
-+++ b/include/linux/tcp.h
-@@ -368,7 +368,7 @@ struct tcp_sock {
-       u32     *saved_syn;
- };
--enum tsq_flags {
-+enum tsq_enum {
-       TSQ_THROTTLED,
-       TSQ_QUEUED,
-       TCP_TSQ_DEFERRED,          /* tcp_tasklet_func() found socket was owned */
-@@ -379,6 +379,15 @@ enum tsq_flags {
-                                   */
- };
-+enum tsq_flags {
-+      TSQF_THROTTLED                  = (1UL << TSQ_THROTTLED),
-+      TSQF_QUEUED                     = (1UL << TSQ_QUEUED),
-+      TCPF_TSQ_DEFERRED               = (1UL << TCP_TSQ_DEFERRED),
-+      TCPF_WRITE_TIMER_DEFERRED       = (1UL << TCP_WRITE_TIMER_DEFERRED),
-+      TCPF_DELACK_TIMER_DEFERRED      = (1UL << TCP_DELACK_TIMER_DEFERRED),
-+      TCPF_MTU_REDUCED_DEFERRED       = (1UL << TCP_MTU_REDUCED_DEFERRED),
-+};
-+
- static inline struct tcp_sock *tcp_sk(const struct sock *sk)
- {
-       return (struct tcp_sock *)sk;
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -790,10 +790,10 @@ static void tcp_tasklet_func(unsigned lo
-       }
- }
--#define TCP_DEFERRED_ALL ((1UL << TCP_TSQ_DEFERRED) |         \
--                        (1UL << TCP_WRITE_TIMER_DEFERRED) |   \
--                        (1UL << TCP_DELACK_TIMER_DEFERRED) |  \
--                        (1UL << TCP_MTU_REDUCED_DEFERRED))
-+#define TCP_DEFERRED_ALL (TCPF_TSQ_DEFERRED |         \
-+                        TCPF_WRITE_TIMER_DEFERRED |   \
-+                        TCPF_DELACK_TIMER_DEFERRED |  \
-+                        TCPF_MTU_REDUCED_DEFERRED)
- /**
-  * tcp_release_cb - tcp release_sock() callback
-  * @sk: socket
-@@ -814,7 +814,7 @@ void tcp_release_cb(struct sock *sk)
-               nflags = flags & ~TCP_DEFERRED_ALL;
-       } while (cmpxchg(&tp->tsq_flags, flags, nflags) != flags);
--      if (flags & (1UL << TCP_TSQ_DEFERRED))
-+      if (flags & TCPF_TSQ_DEFERRED)
-               tcp_tsq_handler(sk);
-       /* Here begins the tricky part :
-@@ -828,15 +828,15 @@ void tcp_release_cb(struct sock *sk)
-        */
-       sock_release_ownership(sk);
--      if (flags & (1UL << TCP_WRITE_TIMER_DEFERRED)) {
-+      if (flags & TCPF_WRITE_TIMER_DEFERRED) {
-               tcp_write_timer_handler(sk);
-               __sock_put(sk);
-       }
--      if (flags & (1UL << TCP_DELACK_TIMER_DEFERRED)) {
-+      if (flags & TCPF_DELACK_TIMER_DEFERRED) {
-               tcp_delack_timer_handler(sk);
-               __sock_put(sk);
-       }
--      if (flags & (1UL << TCP_MTU_REDUCED_DEFERRED)) {
-+      if (flags & TCPF_MTU_REDUCED_DEFERRED) {
-               inet_csk(sk)->icsk_af_ops->mtu_reduced(sk);
-               __sock_put(sk);
-       }
diff --git a/target/linux/generic/backport-4.9/024-2-tcp-tsq-remove-one-locked-operation-in-tcp_wfree.patch b/target/linux/generic/backport-4.9/024-2-tcp-tsq-remove-one-locked-operation-in-tcp_wfree.patch
deleted file mode 100644 (file)
index dfd9abf..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-From 408f0a6c21e124cc4f6c7aa370b38aa47e55428d Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Sat, 3 Dec 2016 11:14:51 -0800
-Subject: [PATCH 02/10] tcp: tsq: remove one locked operation in tcp_wfree()
-
-Instead of atomically clear TSQ_THROTTLED and atomically set TSQ_QUEUED
-bits, use one cmpxchg() to perform a single locked operation.
-
-Since the following patch will also set TCP_TSQ_DEFERRED here,
-this cmpxchg() will make this addition free.
-
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- net/ipv4/tcp_output.c | 13 ++++++++++---
- 1 file changed, 10 insertions(+), 3 deletions(-)
-
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -866,6 +866,7 @@ void tcp_wfree(struct sk_buff *skb)
- {
-       struct sock *sk = skb->sk;
-       struct tcp_sock *tp = tcp_sk(sk);
-+      unsigned long flags, nval, oval;
-       int wmem;
-       /* Keep one reference on sk_wmem_alloc.
-@@ -883,11 +884,17 @@ void tcp_wfree(struct sk_buff *skb)
-       if (wmem >= SKB_TRUESIZE(1) && this_cpu_ksoftirqd() == current)
-               goto out;
--      if (test_and_clear_bit(TSQ_THROTTLED, &tp->tsq_flags) &&
--          !test_and_set_bit(TSQ_QUEUED, &tp->tsq_flags)) {
--              unsigned long flags;
-+      for (oval = READ_ONCE(tp->tsq_flags);; oval = nval) {
-               struct tsq_tasklet *tsq;
-+              if (!(oval & TSQF_THROTTLED) || (oval & TSQF_QUEUED))
-+                      goto out;
-+
-+              nval = (oval & ~TSQF_THROTTLED) | TSQF_QUEUED;
-+              nval = cmpxchg(&tp->tsq_flags, oval, nval);
-+              if (nval != oval)
-+                      continue;
-+
-               /* queue this socket to tasklet queue */
-               local_irq_save(flags);
-               tsq = this_cpu_ptr(&tsq_tasklet);
diff --git a/target/linux/generic/backport-4.9/024-3-tcp-tsq-add-shortcut-in-tcp_tasklet_func.patch b/target/linux/generic/backport-4.9/024-3-tcp-tsq-add-shortcut-in-tcp_tasklet_func.patch
deleted file mode 100644 (file)
index 90979c4..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-From b223feb9de2a65c533ff95c08e834fa732906ea5 Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Sat, 3 Dec 2016 11:14:52 -0800
-Subject: [PATCH 03/10] tcp: tsq: add shortcut in tcp_tasklet_func()
-
-Under high stress, I've seen tcp_tasklet_func() consuming
-~700 usec, handling ~150 tcp sockets.
-
-By setting TCP_TSQ_DEFERRED in tcp_wfree(), we give a chance
-for other cpus/threads entering tcp_write_xmit() to grab it,
-allowing tcp_tasklet_func() to skip sockets that already did
-an xmit cycle.
-
-In the future, we might give to ACK processing an increased
-budget to reduce even more tcp_tasklet_func() amount of work.
-
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- net/ipv4/tcp_output.c | 22 ++++++++++++----------
- 1 file changed, 12 insertions(+), 10 deletions(-)
-
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -773,19 +773,19 @@ static void tcp_tasklet_func(unsigned lo
-       list_for_each_safe(q, n, &list) {
-               tp = list_entry(q, struct tcp_sock, tsq_node);
-               list_del(&tp->tsq_node);
-+              clear_bit(TSQ_QUEUED, &tp->tsq_flags);
-               sk = (struct sock *)tp;
--              bh_lock_sock(sk);
--
--              if (!sock_owned_by_user(sk)) {
--                      tcp_tsq_handler(sk);
--              } else {
--                      /* defer the work to tcp_release_cb() */
--                      set_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags);
-+              if (!sk->sk_lock.owned &&
-+                  test_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags)) {
-+                      bh_lock_sock(sk);
-+                      if (!sock_owned_by_user(sk)) {
-+                              clear_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags);
-+                              tcp_tsq_handler(sk);
-+                      }
-+                      bh_unlock_sock(sk);
-               }
--              bh_unlock_sock(sk);
--              clear_bit(TSQ_QUEUED, &tp->tsq_flags);
-               sk_free(sk);
-       }
- }
-@@ -890,7 +890,7 @@ void tcp_wfree(struct sk_buff *skb)
-               if (!(oval & TSQF_THROTTLED) || (oval & TSQF_QUEUED))
-                       goto out;
--              nval = (oval & ~TSQF_THROTTLED) | TSQF_QUEUED;
-+              nval = (oval & ~TSQF_THROTTLED) | TSQF_QUEUED | TCPF_TSQ_DEFERRED;
-               nval = cmpxchg(&tp->tsq_flags, oval, nval);
-               if (nval != oval)
-                       continue;
-@@ -2237,6 +2237,8 @@ static bool tcp_write_xmit(struct sock *
-                   unlikely(tso_fragment(sk, skb, limit, mss_now, gfp)))
-                       break;
-+              if (test_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags))
-+                      clear_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags);
-               if (tcp_small_queue_check(sk, skb, 0))
-                       break;
diff --git a/target/linux/generic/backport-4.9/024-4-tcp-tsq-avoid-one-atomic-in-tcp_wfree.patch b/target/linux/generic/backport-4.9/024-4-tcp-tsq-avoid-one-atomic-in-tcp_wfree.patch
deleted file mode 100644 (file)
index 2b5ef93..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-From a9b204d1564702b704ad6fe74f10a102c7b87ba3 Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Sat, 3 Dec 2016 11:14:53 -0800
-Subject: [PATCH 04/10] tcp: tsq: avoid one atomic in tcp_wfree()
-
-Under high load, tcp_wfree() has an atomic operation trying
-to schedule a tasklet over and over.
-
-We can schedule it only if our per cpu list was empty.
-
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- net/ipv4/tcp_output.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -886,6 +886,7 @@ void tcp_wfree(struct sk_buff *skb)
-       for (oval = READ_ONCE(tp->tsq_flags);; oval = nval) {
-               struct tsq_tasklet *tsq;
-+              bool empty;
-               if (!(oval & TSQF_THROTTLED) || (oval & TSQF_QUEUED))
-                       goto out;
-@@ -898,8 +899,10 @@ void tcp_wfree(struct sk_buff *skb)
-               /* queue this socket to tasklet queue */
-               local_irq_save(flags);
-               tsq = this_cpu_ptr(&tsq_tasklet);
-+              empty = list_empty(&tsq->head);
-               list_add(&tp->tsq_node, &tsq->head);
--              tasklet_schedule(&tsq->tasklet);
-+              if (empty)
-+                      tasklet_schedule(&tsq->tasklet);
-               local_irq_restore(flags);
-               return;
-       }
diff --git a/target/linux/generic/backport-4.9/024-5-tcp-tsq-add-a-shortcut-in-tcp_small_queue_check.patch b/target/linux/generic/backport-4.9/024-5-tcp-tsq-add-a-shortcut-in-tcp_small_queue_check.patch
deleted file mode 100644 (file)
index 0156efa..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-From 75eefc6c59fd2c5f1ab95a3a113c217237d12a31 Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Sat, 3 Dec 2016 11:14:54 -0800
-Subject: [PATCH 05/10] tcp: tsq: add a shortcut in tcp_small_queue_check()
-
-Always allow the two first skbs in write queue to be sent,
-regardless of sk_wmem_alloc/sk_pacing_rate values.
-
-This helps a lot in situations where TX completions are delayed either
-because of driver latencies or softirq latencies.
-
-Test is done with no cache line misses.
-
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- net/ipv4/tcp_output.c | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -2142,6 +2142,15 @@ static bool tcp_small_queue_check(struct
-       limit <<= factor;
-       if (atomic_read(&sk->sk_wmem_alloc) > limit) {
-+              /* Always send the 1st or 2nd skb in write queue.
-+               * No need to wait for TX completion to call us back,
-+               * after softirq/tasklet schedule.
-+               * This helps when TX completions are delayed too much.
-+               */
-+              if (skb == sk->sk_write_queue.next ||
-+                  skb->prev == sk->sk_write_queue.next)
-+                      return false;
-+
-               set_bit(TSQ_THROTTLED, &tcp_sk(sk)->tsq_flags);
-               /* It is possible TX completion already happened
-                * before we set TSQ_THROTTLED, so we must
diff --git a/target/linux/generic/backport-4.9/024-6-tcp-tcp_mtu_probe-is-likely-to-exit-early.patch b/target/linux/generic/backport-4.9/024-6-tcp-tcp_mtu_probe-is-likely-to-exit-early.patch
deleted file mode 100644 (file)
index 5669b89..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-From 12a59abc22d6664f7d3944f625ceefee92de8820 Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Sat, 3 Dec 2016 11:14:55 -0800
-Subject: [PATCH 06/10] tcp: tcp_mtu_probe() is likely to exit early
-
-Adding a likely() in tcp_mtu_probe() moves its code which used to
-be inlined in front of tcp_write_xmit()
-
-We still have a cache line miss to access icsk->icsk_mtup.enabled,
-we will probably have to reorganize fields to help data locality.
-
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- net/ipv4/tcp_output.c | 18 +++++++++---------
- 1 file changed, 9 insertions(+), 9 deletions(-)
-
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -1974,26 +1974,26 @@ static bool tcp_can_coalesce_send_queue_
-  */
- static int tcp_mtu_probe(struct sock *sk)
- {
--      struct tcp_sock *tp = tcp_sk(sk);
-       struct inet_connection_sock *icsk = inet_csk(sk);
-+      struct tcp_sock *tp = tcp_sk(sk);
-       struct sk_buff *skb, *nskb, *next;
-       struct net *net = sock_net(sk);
--      int len;
-       int probe_size;
-       int size_needed;
--      int copy;
-+      int copy, len;
-       int mss_now;
-       int interval;
-       /* Not currently probing/verifying,
-        * not in recovery,
-        * have enough cwnd, and
--       * not SACKing (the variable headers throw things off) */
--      if (!icsk->icsk_mtup.enabled ||
--          icsk->icsk_mtup.probe_size ||
--          inet_csk(sk)->icsk_ca_state != TCP_CA_Open ||
--          tp->snd_cwnd < 11 ||
--          tp->rx_opt.num_sacks || tp->rx_opt.dsack)
-+       * not SACKing (the variable headers throw things off)
-+       */
-+      if (likely(!icsk->icsk_mtup.enabled ||
-+                 icsk->icsk_mtup.probe_size ||
-+                 inet_csk(sk)->icsk_ca_state != TCP_CA_Open ||
-+                 tp->snd_cwnd < 11 ||
-+                 tp->rx_opt.num_sacks || tp->rx_opt.dsack))
-               return -1;
-       /* Use binary search for probe_size between tcp_mss_base,
diff --git a/target/linux/generic/backport-4.9/024-7-net-reorganize-struct-sock-for-better-data-locality.patch b/target/linux/generic/backport-4.9/024-7-net-reorganize-struct-sock-for-better-data-locality.patch
deleted file mode 100644 (file)
index a43b403..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-From 9115e8cd2a0c6eaaa900c462721f12e1d45f326c Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Sat, 3 Dec 2016 11:14:56 -0800
-Subject: [PATCH 07/10] net: reorganize struct sock for better data locality
-
-Group fields used in TX path, and keep some cache lines mostly read
-to permit sharing among cpus.
-
-Gained two 4 bytes holes on 64bit arches.
-
-Added a place holder for tcp tsq_flags, next to sk_wmem_alloc
-to speed up tcp_wfree() in the following patch.
-
-I have not added ____cacheline_aligned_in_smp, this might be done later.
-I prefer doing this once inet and tcp/udp sockets reorg is also done.
-
-Tested with both TCP and UDP.
-
-UDP receiver performance under flood increased by ~20 % :
-Accessing sk_filter/sk_wq/sk_napi_id no longer stalls because sk_drops
-was moved away from a critical cache line, now mostly read and shared.
-
-       /* --- cacheline 4 boundary (256 bytes) --- */
-       unsigned int               sk_napi_id;           /* 0x100   0x4 */
-       int                        sk_rcvbuf;            /* 0x104   0x4 */
-       struct sk_filter *         sk_filter;            /* 0x108   0x8 */
-       union {
-               struct socket_wq * sk_wq;                /*         0x8 */
-               struct socket_wq * sk_wq_raw;            /*         0x8 */
-       };                                               /* 0x110   0x8 */
-       struct xfrm_policy *       sk_policy[2];         /* 0x118  0x10 */
-       struct dst_entry *         sk_rx_dst;            /* 0x128   0x8 */
-       struct dst_entry *         sk_dst_cache;         /* 0x130   0x8 */
-       atomic_t                   sk_omem_alloc;        /* 0x138   0x4 */
-       int                        sk_sndbuf;            /* 0x13c   0x4 */
-       /* --- cacheline 5 boundary (320 bytes) --- */
-       int                        sk_wmem_queued;       /* 0x140   0x4 */
-       atomic_t                   sk_wmem_alloc;        /* 0x144   0x4 */
-       long unsigned int          sk_tsq_flags;         /* 0x148   0x8 */
-       struct sk_buff *           sk_send_head;         /* 0x150   0x8 */
-       struct sk_buff_head        sk_write_queue;       /* 0x158  0x18 */
-       __s32                      sk_peek_off;          /* 0x170   0x4 */
-       int                        sk_write_pending;     /* 0x174   0x4 */
-       long int                   sk_sndtimeo;          /* 0x178   0x8 */
-
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Tested-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- include/net/sock.h | 51 +++++++++++++++++++++++++++------------------------
- 1 file changed, 27 insertions(+), 24 deletions(-)
-
---- a/include/net/sock.h
-+++ b/include/net/sock.h
-@@ -344,6 +344,9 @@ struct sock {
- #define sk_rxhash             __sk_common.skc_rxhash
-       socket_lock_t           sk_lock;
-+      atomic_t                sk_drops;
-+      int                     sk_rcvlowat;
-+      struct sk_buff_head     sk_error_queue;
-       struct sk_buff_head     sk_receive_queue;
-       /*
-        * The backlog queue is special, it is always used with
-@@ -360,14 +363,13 @@ struct sock {
-               struct sk_buff  *tail;
-       } sk_backlog;
- #define sk_rmem_alloc sk_backlog.rmem_alloc
--      int                     sk_forward_alloc;
--      __u32                   sk_txhash;
-+      int                     sk_forward_alloc;
- #ifdef CONFIG_NET_RX_BUSY_POLL
--      unsigned int            sk_napi_id;
-       unsigned int            sk_ll_usec;
-+      /* ===== mostly read cache line ===== */
-+      unsigned int            sk_napi_id;
- #endif
--      atomic_t                sk_drops;
-       int                     sk_rcvbuf;
-       struct sk_filter __rcu  *sk_filter;
-@@ -380,11 +382,30 @@ struct sock {
- #endif
-       struct dst_entry        *sk_rx_dst;
-       struct dst_entry __rcu  *sk_dst_cache;
--      /* Note: 32bit hole on 64bit arches */
--      atomic_t                sk_wmem_alloc;
-       atomic_t                sk_omem_alloc;
-       int                     sk_sndbuf;
-+
-+      /* ===== cache line for TX ===== */
-+      int                     sk_wmem_queued;
-+      atomic_t                sk_wmem_alloc;
-+      unsigned long           sk_tsq_flags;
-+      struct sk_buff          *sk_send_head;
-       struct sk_buff_head     sk_write_queue;
-+      __s32                   sk_peek_off;
-+      int                     sk_write_pending;
-+      long                    sk_sndtimeo;
-+      struct timer_list       sk_timer;
-+      __u32                   sk_priority;
-+      __u32                   sk_mark;
-+      u32                     sk_pacing_rate; /* bytes per second */
-+      u32                     sk_max_pacing_rate;
-+      struct page_frag        sk_frag;
-+      netdev_features_t       sk_route_caps;
-+      netdev_features_t       sk_route_nocaps;
-+      int                     sk_gso_type;
-+      unsigned int            sk_gso_max_size;
-+      gfp_t                   sk_allocation;
-+      __u32                   sk_txhash;
-       /*
-        * Because of non atomicity rules, all
-@@ -400,31 +421,17 @@ struct sock {
- #define SK_PROTOCOL_MAX U8_MAX
-       kmemcheck_bitfield_end(flags);
--      int                     sk_wmem_queued;
--      gfp_t                   sk_allocation;
--      u32                     sk_pacing_rate; /* bytes per second */
--      u32                     sk_max_pacing_rate;
--      netdev_features_t       sk_route_caps;
--      netdev_features_t       sk_route_nocaps;
--      int                     sk_gso_type;
--      unsigned int            sk_gso_max_size;
-       u16                     sk_gso_max_segs;
--      int                     sk_rcvlowat;
-       unsigned long           sk_lingertime;
--      struct sk_buff_head     sk_error_queue;
-       struct proto            *sk_prot_creator;
-       rwlock_t                sk_callback_lock;
-       int                     sk_err,
-                               sk_err_soft;
-       u32                     sk_ack_backlog;
-       u32                     sk_max_ack_backlog;
--      __u32                   sk_priority;
--      __u32                   sk_mark;
-       struct pid              *sk_peer_pid;
-       const struct cred       *sk_peer_cred;
-       long                    sk_rcvtimeo;
--      long                    sk_sndtimeo;
--      struct timer_list       sk_timer;
-       ktime_t                 sk_stamp;
- #if BITS_PER_LONG==32
-       seqlock_t               sk_stamp_seq;
-@@ -434,10 +441,6 @@ struct sock {
-       u32                     sk_tskey;
-       struct socket           *sk_socket;
-       void                    *sk_user_data;
--      struct page_frag        sk_frag;
--      struct sk_buff          *sk_send_head;
--      __s32                   sk_peek_off;
--      int                     sk_write_pending;
- #ifdef CONFIG_SECURITY
-       void                    *sk_security;
- #endif
diff --git a/target/linux/generic/backport-4.9/024-8-tcp-tsq-move-tsq_flags-close-to-sk_wmem_alloc.patch b/target/linux/generic/backport-4.9/024-8-tcp-tsq-move-tsq_flags-close-to-sk_wmem_alloc.patch
deleted file mode 100644 (file)
index 4ac95d3..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-From 7aa5470c2c09265902b5e4289afa82e4e7c2987e Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Sat, 3 Dec 2016 11:14:57 -0800
-Subject: [PATCH 08/10] tcp: tsq: move tsq_flags close to sk_wmem_alloc
-
-tsq_flags being in the same cache line than sk_wmem_alloc
-makes a lot of sense. Both fields are changed from tcp_wfree()
-and more generally by various TSQ related functions.
-
-Prior patch made room in struct sock and added sk_tsq_flags,
-this patch deletes tsq_flags from struct tcp_sock.
-
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- include/linux/tcp.h   |  1 -
- net/ipv4/tcp.c        |  4 ++--
- net/ipv4/tcp_ipv4.c   |  2 +-
- net/ipv4/tcp_output.c | 24 +++++++++++-------------
- net/ipv4/tcp_timer.c  |  4 ++--
- net/ipv6/tcp_ipv6.c   |  2 +-
- 6 files changed, 17 insertions(+), 20 deletions(-)
-
---- a/include/linux/tcp.h
-+++ b/include/linux/tcp.h
-@@ -192,7 +192,6 @@ struct tcp_sock {
-       u32     tsoffset;       /* timestamp offset */
-       struct list_head tsq_node; /* anchor in tsq_tasklet.head list */
--      unsigned long   tsq_flags;
-       /* Data for direct copy to user */
-       struct {
---- a/net/ipv4/tcp.c
-+++ b/net/ipv4/tcp.c
-@@ -665,9 +665,9 @@ static void tcp_push(struct sock *sk, in
-       if (tcp_should_autocork(sk, skb, size_goal)) {
-               /* avoid atomic op if TSQ_THROTTLED bit is already set */
--              if (!test_bit(TSQ_THROTTLED, &tp->tsq_flags)) {
-+              if (!test_bit(TSQ_THROTTLED, &sk->sk_tsq_flags)) {
-                       NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPAUTOCORKING);
--                      set_bit(TSQ_THROTTLED, &tp->tsq_flags);
-+                      set_bit(TSQ_THROTTLED, &sk->sk_tsq_flags);
-               }
-               /* It is possible TX completion already happened
-                * before we set TSQ_THROTTLED.
---- a/net/ipv4/tcp_ipv4.c
-+++ b/net/ipv4/tcp_ipv4.c
-@@ -446,7 +446,7 @@ void tcp_v4_err(struct sk_buff *icmp_skb
-                       if (!sock_owned_by_user(sk)) {
-                               tcp_v4_mtu_reduced(sk);
-                       } else {
--                              if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, &tp->tsq_flags))
-+                              if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, &sk->sk_tsq_flags))
-                                       sock_hold(sk);
-                       }
-                       goto out;
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -773,14 +773,15 @@ static void tcp_tasklet_func(unsigned lo
-       list_for_each_safe(q, n, &list) {
-               tp = list_entry(q, struct tcp_sock, tsq_node);
-               list_del(&tp->tsq_node);
--              clear_bit(TSQ_QUEUED, &tp->tsq_flags);
-               sk = (struct sock *)tp;
-+              clear_bit(TSQ_QUEUED, &sk->sk_tsq_flags);
-+
-               if (!sk->sk_lock.owned &&
--                  test_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags)) {
-+                  test_bit(TCP_TSQ_DEFERRED, &sk->sk_tsq_flags)) {
-                       bh_lock_sock(sk);
-                       if (!sock_owned_by_user(sk)) {
--                              clear_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags);
-+                              clear_bit(TCP_TSQ_DEFERRED, &sk->sk_tsq_flags);
-                               tcp_tsq_handler(sk);
-                       }
-                       bh_unlock_sock(sk);
-@@ -803,16 +804,15 @@ static void tcp_tasklet_func(unsigned lo
-  */
- void tcp_release_cb(struct sock *sk)
- {
--      struct tcp_sock *tp = tcp_sk(sk);
-       unsigned long flags, nflags;
-       /* perform an atomic operation only if at least one flag is set */
-       do {
--              flags = tp->tsq_flags;
-+              flags = sk->sk_tsq_flags;
-               if (!(flags & TCP_DEFERRED_ALL))
-                       return;
-               nflags = flags & ~TCP_DEFERRED_ALL;
--      } while (cmpxchg(&tp->tsq_flags, flags, nflags) != flags);
-+      } while (cmpxchg(&sk->sk_tsq_flags, flags, nflags) != flags);
-       if (flags & TCPF_TSQ_DEFERRED)
-               tcp_tsq_handler(sk);
-@@ -884,7 +884,7 @@ void tcp_wfree(struct sk_buff *skb)
-       if (wmem >= SKB_TRUESIZE(1) && this_cpu_ksoftirqd() == current)
-               goto out;
--      for (oval = READ_ONCE(tp->tsq_flags);; oval = nval) {
-+      for (oval = READ_ONCE(sk->sk_tsq_flags);; oval = nval) {
-               struct tsq_tasklet *tsq;
-               bool empty;
-@@ -892,7 +892,7 @@ void tcp_wfree(struct sk_buff *skb)
-                       goto out;
-               nval = (oval & ~TSQF_THROTTLED) | TSQF_QUEUED | TCPF_TSQ_DEFERRED;
--              nval = cmpxchg(&tp->tsq_flags, oval, nval);
-+              nval = cmpxchg(&sk->sk_tsq_flags, oval, nval);
-               if (nval != oval)
-                       continue;
-@@ -2151,7 +2151,7 @@ static bool tcp_small_queue_check(struct
-                   skb->prev == sk->sk_write_queue.next)
-                       return false;
--              set_bit(TSQ_THROTTLED, &tcp_sk(sk)->tsq_flags);
-+              set_bit(TSQ_THROTTLED, &sk->sk_tsq_flags);
-               /* It is possible TX completion already happened
-                * before we set TSQ_THROTTLED, so we must
-                * test again the condition.
-@@ -2249,8 +2249,8 @@ static bool tcp_write_xmit(struct sock *
-                   unlikely(tso_fragment(sk, skb, limit, mss_now, gfp)))
-                       break;
--              if (test_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags))
--                      clear_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags);
-+              if (test_bit(TCP_TSQ_DEFERRED, &sk->sk_tsq_flags))
-+                      clear_bit(TCP_TSQ_DEFERRED, &sk->sk_tsq_flags);
-               if (tcp_small_queue_check(sk, skb, 0))
-                       break;
-@@ -3569,8 +3569,6 @@ void __tcp_send_ack(struct sock *sk, u32
-       /* We do not want pure acks influencing TCP Small Queues or fq/pacing
-        * too much.
-        * SKB_TRUESIZE(max(1 .. 66, MAX_TCP_HEADER)) is unfortunately ~784
--       * We also avoid tcp_wfree() overhead (cache line miss accessing
--       * tp->tsq_flags) by using regular sock_wfree()
-        */
-       skb_set_tcp_pure_ack(buff);
---- a/net/ipv4/tcp_timer.c
-+++ b/net/ipv4/tcp_timer.c
-@@ -327,7 +327,7 @@ static void tcp_delack_timer(unsigned lo
-               inet_csk(sk)->icsk_ack.blocked = 1;
-               __NET_INC_STATS(sock_net(sk), LINUX_MIB_DELAYEDACKLOCKED);
-               /* deleguate our work to tcp_release_cb() */
--              if (!test_and_set_bit(TCP_DELACK_TIMER_DEFERRED, &tcp_sk(sk)->tsq_flags))
-+              if (!test_and_set_bit(TCP_DELACK_TIMER_DEFERRED, &sk->sk_tsq_flags))
-                       sock_hold(sk);
-       }
-       bh_unlock_sock(sk);
-@@ -610,7 +610,7 @@ static void tcp_write_timer(unsigned lon
-               tcp_write_timer_handler(sk);
-       } else {
-               /* delegate our work to tcp_release_cb() */
--              if (!test_and_set_bit(TCP_WRITE_TIMER_DEFERRED, &tcp_sk(sk)->tsq_flags))
-+              if (!test_and_set_bit(TCP_WRITE_TIMER_DEFERRED, &sk->sk_tsq_flags))
-                       sock_hold(sk);
-       }
-       bh_unlock_sock(sk);
---- a/net/ipv6/tcp_ipv6.c
-+++ b/net/ipv6/tcp_ipv6.c
-@@ -404,7 +404,7 @@ static void tcp_v6_err(struct sk_buff *s
-               if (!sock_owned_by_user(sk))
-                       tcp_v6_mtu_reduced(sk);
-               else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,
--                                         &tp->tsq_flags))
-+                                         &sk->sk_tsq_flags))
-                       sock_hold(sk);
-               goto out;
-       }
diff --git a/target/linux/generic/backport-4.9/024-9-tcp-add-a-missing-barrier-in-tcp_tasklet_func.patch b/target/linux/generic/backport-4.9/024-9-tcp-add-a-missing-barrier-in-tcp_tasklet_func.patch
deleted file mode 100644 (file)
index bcdbe8c..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-From 0a9648f1293966c838dc570da73c15a76f4c89d6 Mon Sep 17 00:00:00 2001
-From: Eric Dumazet <edumazet@google.com>
-Date: Wed, 21 Dec 2016 05:42:43 -0800
-Subject: [PATCH 09/10] tcp: add a missing barrier in tcp_tasklet_func()
-
-Madalin reported crashes happening in tcp_tasklet_func() on powerpc64
-
-Before TSQ_QUEUED bit is cleared, we must ensure the changes done
-by list_del(&tp->tsq_node); are committed to memory, otherwise
-corruption might happen, as an other cpu could catch TSQ_QUEUED
-clearance too soon.
-
-We can notice that old kernels were immune to this bug, because
-TSQ_QUEUED was cleared after a bh_lock_sock(sk)/bh_unlock_sock(sk)
-section, but they could have missed a kick to write additional bytes,
-when NIC interrupts for a given flow are spread to multiple cpus.
-
-Affected TCP flows would need an incoming ACK or RTO timer to add more
-packets to the pipe. So overall situation should be better now.
-
-Fixes: b223feb9de2a ("tcp: tsq: add shortcut in tcp_tasklet_func()")
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Reported-by: Madalin Bucur <madalin.bucur@nxp.com>
-Tested-by: Madalin Bucur <madalin.bucur@nxp.com>
-Tested-by: Xing Lei <xing.lei@nxp.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
----
- net/ipv4/tcp_output.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -775,6 +775,7 @@ static void tcp_tasklet_func(unsigned lo
-               list_del(&tp->tsq_node);
-               sk = (struct sock *)tp;
-+              smp_mb__before_atomic();
-               clear_bit(TSQ_QUEUED, &sk->sk_tsq_flags);
-               if (!sk->sk_lock.owned &&
diff --git a/target/linux/generic/backport-4.9/025-tcp-allow-drivers-to-tweak-TSQ-logic.patch b/target/linux/generic/backport-4.9/025-tcp-allow-drivers-to-tweak-TSQ-logic.patch
deleted file mode 100644 (file)
index 11f1cd5..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-From: Eric Dumazet <edumazet@google.com>
-Date: Sat, 11 Nov 2017 15:54:12 -0800
-Subject: [PATCH] tcp: allow drivers to tweak TSQ logic
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-I had many reports that TSQ logic breaks wifi aggregation.
-
-Current logic is to allow up to 1 ms of bytes to be queued into qdisc
-and drivers queues.
-
-But Wifi aggregation needs a bigger budget to allow bigger rates to
-be discovered by various TCP Congestion Controls algorithms.
-
-This patch adds an extra socket field, allowing wifi drivers to select
-another log scale to derive TCP Small Queue credit from current pacing
-rate.
-
-Initial value is 10, meaning that this patch does not change current
-behavior.
-
-We expect wifi drivers to set this field to smaller values (tests have
-been done with values from 6 to 9)
-
-They would have to use following template :
-
-if (skb->sk && skb->sk->sk_pacing_shift != MY_PACING_SHIFT)
-     skb->sk->sk_pacing_shift = MY_PACING_SHIFT;
-
-Ref: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1670041
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Cc: Johannes Berg <johannes.berg@intel.com>
-Cc: Toke Høiland-Jørgensen <toke@toke.dk>
-Cc: Kir Kolyshkin <kir@openvz.org>
----
---- a/include/net/sock.h
-+++ b/include/net/sock.h
-@@ -260,6 +260,7 @@ struct sock_common {
-   *   @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4)
-   *   @sk_gso_max_size: Maximum GSO segment size to build
-   *   @sk_gso_max_segs: Maximum number of GSO segments
-+  *   @sk_pacing_shift: scaling factor for TCP Small Queues
-   *   @sk_lingertime: %SO_LINGER l_linger setting
-   *   @sk_backlog: always used with the per-socket spinlock held
-   *   @sk_callback_lock: used with the callbacks in the end of this struct
-@@ -422,6 +423,8 @@ struct sock {
-       kmemcheck_bitfield_end(flags);
-       u16                     sk_gso_max_segs;
-+#define sk_pacing_shift sk_pacing_shift /* for backport checks */
-+      u8                      sk_pacing_shift;
-       unsigned long           sk_lingertime;
-       struct proto            *sk_prot_creator;
-       rwlock_t                sk_callback_lock;
---- a/net/core/sock.c
-+++ b/net/core/sock.c
-@@ -2484,6 +2484,7 @@ void sock_init_data(struct socket *sock,
-       sk->sk_max_pacing_rate = ~0U;
-       sk->sk_pacing_rate = ~0U;
-+      sk->sk_pacing_shift = 10;
-       sk->sk_incoming_cpu = -1;
-       /*
-        * Before updating sk_refcnt, we must commit prior changes to memory
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -1607,7 +1607,7 @@ u32 tcp_tso_autosize(const struct sock *
- {
-       u32 bytes, segs;
--      bytes = min(sk->sk_pacing_rate >> 10,
-+      bytes = min(sk->sk_pacing_rate >> sk->sk_pacing_shift,
-                   sk->sk_gso_max_size - 1 - MAX_TCP_HEADER);
-       /* Goal is to send at least one packet per ms,
-@@ -2138,7 +2138,7 @@ static bool tcp_small_queue_check(struct
- {
-       unsigned int limit;
--      limit = max(2 * skb->truesize, sk->sk_pacing_rate >> 10);
-+      limit = max(2 * skb->truesize, sk->sk_pacing_rate >> sk->sk_pacing_shift);
-       limit = min_t(u32, limit, sysctl_tcp_limit_output_bytes);
-       limit <<= factor;
diff --git a/target/linux/generic/backport-4.9/030-01-ubifs-Drop-softlimit-and-delta-fields-from-struct-ub.patch b/target/linux/generic/backport-4.9/030-01-ubifs-Drop-softlimit-and-delta-fields-from-struct-ub.patch
deleted file mode 100644 (file)
index 8e1f312..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-From 854826c9d526fd81077742c3b000e3f7fcaef3ce Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 20 Sep 2016 10:36:14 +0200
-Subject: [PATCH] ubifs: Drop softlimit and delta fields from struct ubifs_wbuf
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Values of these fields are set during init and never modified. They are
-used (read) in a single function only. There isn't really any reason to
-keep them in a struct. It only makes struct just a bit bigger without
-any visible gain.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
-Signed-off-by: Richard Weinberger <richard@nod.at>
----
- fs/ubifs/io.c    | 18 ++++++++++--------
- fs/ubifs/ubifs.h |  5 -----
- 2 files changed, 10 insertions(+), 13 deletions(-)
-
---- a/fs/ubifs/io.c
-+++ b/fs/ubifs/io.c
-@@ -452,16 +452,22 @@ static enum hrtimer_restart wbuf_timer_c
-  */
- static void new_wbuf_timer_nolock(struct ubifs_wbuf *wbuf)
- {
-+      ktime_t softlimit = ktime_set(WBUF_TIMEOUT_SOFTLIMIT, 0);
-+      unsigned long long delta;
-+
-+      delta = WBUF_TIMEOUT_HARDLIMIT - WBUF_TIMEOUT_SOFTLIMIT;
-+      delta *= 1000000000ULL;
-+
-       ubifs_assert(!hrtimer_active(&wbuf->timer));
-+      ubifs_assert(delta <= ULONG_MAX);
-       if (wbuf->no_timer)
-               return;
-       dbg_io("set timer for jhead %s, %llu-%llu millisecs",
-              dbg_jhead(wbuf->jhead),
--             div_u64(ktime_to_ns(wbuf->softlimit), USEC_PER_SEC),
--             div_u64(ktime_to_ns(wbuf->softlimit) + wbuf->delta,
--                     USEC_PER_SEC));
--      hrtimer_start_range_ns(&wbuf->timer, wbuf->softlimit, wbuf->delta,
-+             div_u64(ktime_to_ns(softlimit), USEC_PER_SEC),
-+             div_u64(ktime_to_ns(softlimit) + delta, USEC_PER_SEC));
-+      hrtimer_start_range_ns(&wbuf->timer, softlimit, delta,
-                              HRTIMER_MODE_REL);
- }
-@@ -1059,10 +1065,6 @@ int ubifs_wbuf_init(struct ubifs_info *c
-       hrtimer_init(&wbuf->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
-       wbuf->timer.function = wbuf_timer_callback_nolock;
--      wbuf->softlimit = ktime_set(WBUF_TIMEOUT_SOFTLIMIT, 0);
--      wbuf->delta = WBUF_TIMEOUT_HARDLIMIT - WBUF_TIMEOUT_SOFTLIMIT;
--      wbuf->delta *= 1000000000ULL;
--      ubifs_assert(wbuf->delta <= ULONG_MAX);
-       return 0;
- }
---- a/fs/ubifs/ubifs.h
-+++ b/fs/ubifs/ubifs.h
-@@ -645,9 +645,6 @@ typedef int (*ubifs_lpt_scan_callback)(s
-  * @io_mutex: serializes write-buffer I/O
-  * @lock: serializes @buf, @lnum, @offs, @avail, @used, @next_ino and @inodes
-  *        fields
-- * @softlimit: soft write-buffer timeout interval
-- * @delta: hard and soft timeouts delta (the timer expire interval is @softlimit
-- *         and @softlimit + @delta)
-  * @timer: write-buffer timer
-  * @no_timer: non-zero if this write-buffer does not have a timer
-  * @need_sync: non-zero if the timer expired and the wbuf needs sync'ing
-@@ -676,8 +673,6 @@ struct ubifs_wbuf {
-       int (*sync_callback)(struct ubifs_info *c, int lnum, int free, int pad);
-       struct mutex io_mutex;
-       spinlock_t lock;
--      ktime_t softlimit;
--      unsigned long long delta;
-       struct hrtimer timer;
-       unsigned int no_timer:1;
-       unsigned int need_sync:1;
diff --git a/target/linux/generic/backport-4.9/030-02-ubifs-Use-dirty_writeback_interval-value-for-wbuf-ti.patch b/target/linux/generic/backport-4.9/030-02-ubifs-Use-dirty_writeback_interval-value-for-wbuf-ti.patch
deleted file mode 100644 (file)
index 96fa441..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-From 1b7fc2c0069f3864a3dda15430b7aded31c0bfcc Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 20 Sep 2016 10:36:15 +0200
-Subject: [PATCH] ubifs: Use dirty_writeback_interval value for wbuf timer
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Right now wbuf timer has hardcoded timeouts and there is no place for
-manual adjustments. Some projects / cases many need that though. Few
-file systems allow doing that by respecting dirty_writeback_interval
-that can be set using sysctl (dirty_writeback_centisecs).
-
-Lowering dirty_writeback_interval could be some way of dealing with user
-space apps lacking proper fsyncs. This is definitely *not* a perfect
-solution but we don't have ideal (user space) world. There were already
-advanced discussions on this matter, mostly when ext4 was introduced and
-it wasn't behaving as ext3. Anyway, the final decision was to add some
-hacks to the ext4, as trying to fix whole user space or adding new API
-was pointless.
-
-We can't (and shouldn't?) just follow ext4. We can't e.g. sync on close
-as this would cause too many commits and flash wearing. On the other
-hand we still should allow some trade-off between -o sync and default
-wbuf timeout. Respecting dirty_writeback_interval should allow some sane
-cutomizations if used warily.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
-Signed-off-by: Richard Weinberger <richard@nod.at>
----
- fs/ubifs/io.c    | 8 ++++----
- fs/ubifs/ubifs.h | 4 ----
- 2 files changed, 4 insertions(+), 8 deletions(-)
-
---- a/fs/ubifs/io.c
-+++ b/fs/ubifs/io.c
-@@ -452,11 +452,11 @@ static enum hrtimer_restart wbuf_timer_c
-  */
- static void new_wbuf_timer_nolock(struct ubifs_wbuf *wbuf)
- {
--      ktime_t softlimit = ktime_set(WBUF_TIMEOUT_SOFTLIMIT, 0);
--      unsigned long long delta;
-+      ktime_t softlimit = ms_to_ktime(dirty_writeback_interval * 10);
-+      unsigned long long delta = dirty_writeback_interval;
--      delta = WBUF_TIMEOUT_HARDLIMIT - WBUF_TIMEOUT_SOFTLIMIT;
--      delta *= 1000000000ULL;
-+      /* centi to milli, milli to nano, then 10% */
-+      delta *= 10ULL * NSEC_PER_MSEC / 10ULL;
-       ubifs_assert(!hrtimer_active(&wbuf->timer));
-       ubifs_assert(delta <= ULONG_MAX);
---- a/fs/ubifs/ubifs.h
-+++ b/fs/ubifs/ubifs.h
-@@ -83,10 +83,6 @@
-  */
- #define BGT_NAME_PATTERN "ubifs_bgt%d_%d"
--/* Write-buffer synchronization timeout interval in seconds */
--#define WBUF_TIMEOUT_SOFTLIMIT 3
--#define WBUF_TIMEOUT_HARDLIMIT 5
--
- /* Maximum possible inode number (only 32-bit inodes are supported now) */
- #define MAX_INUM 0xFFFFFFFF
diff --git a/target/linux/generic/backport-4.9/040-mm-add-support-for-releasing-multiple-instances-of-a.patch b/target/linux/generic/backport-4.9/040-mm-add-support-for-releasing-multiple-instances-of-a.patch
deleted file mode 100644 (file)
index 4656bb1..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-From: Alexander Duyck <alexander.h.duyck@intel.com>
-Date: Wed, 14 Dec 2016 15:05:26 -0800
-Subject: [PATCH] mm: add support for releasing multiple instances of a page
-
-Add a function that allows us to batch free a page that has multiple
-references outstanding.  Specifically this function can be used to drop
-a page being used in the page frag alloc cache.  With this drivers can
-make use of functionality similar to the page frag alloc cache without
-having to do any workarounds for the fact that there is no function that
-frees multiple references.
-
-Link: http://lkml.kernel.org/r/20161110113606.76501.70752.stgit@ahduyck-blue-test.jf.intel.com
-Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
-Cc: "David S. Miller" <davem@davemloft.net>
-Cc: "James E.J. Bottomley" <jejb@parisc-linux.org>
-Cc: Chris Metcalf <cmetcalf@mellanox.com>
-Cc: David Howells <dhowells@redhat.com>
-Cc: Geert Uytterhoeven <geert@linux-m68k.org>
-Cc: Hans-Christian Noren Egtvedt <egtvedt@samfundet.no>
-Cc: Helge Deller <deller@gmx.de>
-Cc: James Hogan <james.hogan@imgtec.com>
-Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-Cc: Jonas Bonn <jonas@southpole.se>
-Cc: Keguang Zhang <keguang.zhang@gmail.com>
-Cc: Ley Foon Tan <lftan@altera.com>
-Cc: Mark Salter <msalter@redhat.com>
-Cc: Max Filippov <jcmvbkbc@gmail.com>
-Cc: Michael Ellerman <mpe@ellerman.id.au>
-Cc: Michal Simek <monstr@monstr.eu>
-Cc: Ralf Baechle <ralf@linux-mips.org>
-Cc: Rich Felker <dalias@libc.org>
-Cc: Richard Kuo <rkuo@codeaurora.org>
-Cc: Russell King <linux@armlinux.org.uk>
-Cc: Steven Miao <realmz6@gmail.com>
-Cc: Tobias Klauser <tklauser@distanz.ch>
-Cc: Vineet Gupta <vgupta@synopsys.com>
-Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
----
-
---- a/include/linux/gfp.h
-+++ b/include/linux/gfp.h
-@@ -529,6 +529,8 @@ extern void free_hot_cold_page(struct pa
- extern void free_hot_cold_page_list(struct list_head *list, bool cold);
- struct page_frag_cache;
-+extern void __page_frag_drain(struct page *page, unsigned int order,
-+                            unsigned int count);
- extern void *__alloc_page_frag(struct page_frag_cache *nc,
-                              unsigned int fragsz, gfp_t gfp_mask);
- extern void __free_page_frag(void *addr);
---- a/mm/page_alloc.c
-+++ b/mm/page_alloc.c
-@@ -3935,6 +3935,20 @@ static struct page *__page_frag_refill(s
-       return page;
- }
-+void __page_frag_drain(struct page *page, unsigned int order,
-+                     unsigned int count)
-+{
-+      VM_BUG_ON_PAGE(page_ref_count(page) == 0, page);
-+
-+      if (page_ref_sub_and_test(page, count)) {
-+              if (order == 0)
-+                      free_hot_cold_page(page, false);
-+              else
-+                      __free_pages_ok(page, order);
-+      }
-+}
-+EXPORT_SYMBOL(__page_frag_drain);
-+
- void *__alloc_page_frag(struct page_frag_cache *nc,
-                       unsigned int fragsz, gfp_t gfp_mask)
- {
diff --git a/target/linux/generic/backport-4.9/060-0002-mtd-bcm47xxsflash-use-platform_-set-get-_drvdata.patch b/target/linux/generic/backport-4.9/060-0002-mtd-bcm47xxsflash-use-platform_-set-get-_drvdata.patch
deleted file mode 100644 (file)
index d975a26..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-From be5e5099183301fb7920f8f6b66bd3ac1f820a97 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Mon, 16 Jan 2017 17:28:18 +0100
-Subject: [PATCH] mtd: bcm47xxsflash: use platform_(set|get)_drvdata
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-We have generic place & helpers for storing platform driver data so
-there is no reason for using custom priv pointer.
-
-This allows cleaning up struct bcma_sflash from unneeded fields.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Acked-by: Kalle Valo <kvalo@codeaurora.org>
-Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/devices/bcm47xxsflash.c         | 6 +++---
- include/linux/bcma/bcma_driver_chipcommon.h | 3 ---
- 2 files changed, 3 insertions(+), 6 deletions(-)
-
---- a/drivers/mtd/devices/bcm47xxsflash.c
-+++ b/drivers/mtd/devices/bcm47xxsflash.c
-@@ -284,7 +284,6 @@ static int bcm47xxsflash_bcma_probe(stru
-       b47s = devm_kzalloc(dev, sizeof(*b47s), GFP_KERNEL);
-       if (!b47s)
-               return -ENOMEM;
--      sflash->priv = b47s;
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-@@ -320,6 +319,8 @@ static int bcm47xxsflash_bcma_probe(stru
-       b47s->size = sflash->size;
-       bcm47xxsflash_fill_mtd(b47s, &pdev->dev);
-+      platform_set_drvdata(pdev, b47s);
-+
-       err = mtd_device_parse_register(&b47s->mtd, probes, NULL, NULL, 0);
-       if (err) {
-               pr_err("Failed to register MTD device: %d\n", err);
-@@ -335,8 +336,7 @@ static int bcm47xxsflash_bcma_probe(stru
- static int bcm47xxsflash_bcma_remove(struct platform_device *pdev)
- {
--      struct bcma_sflash *sflash = dev_get_platdata(&pdev->dev);
--      struct bcm47xxsflash *b47s = sflash->priv;
-+      struct bcm47xxsflash *b47s = platform_get_drvdata(pdev);
-       mtd_device_unregister(&b47s->mtd);
-       iounmap(b47s->window);
---- a/include/linux/bcma/bcma_driver_chipcommon.h
-+++ b/include/linux/bcma/bcma_driver_chipcommon.h
-@@ -593,9 +593,6 @@ struct bcma_sflash {
-       u32 blocksize;
-       u16 numblocks;
-       u32 size;
--
--      struct mtd_info *mtd;
--      void *priv;
- };
- #endif
diff --git a/target/linux/generic/backport-4.9/060-0003-mtd-bcm47xxsflash-support-reading-flash-out-of-mappi.patch b/target/linux/generic/backport-4.9/060-0003-mtd-bcm47xxsflash-support-reading-flash-out-of-mappi.patch
deleted file mode 100644 (file)
index ecdae2a..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-From ccc38234fdc70120be79e7fb2df5c27ca5cd4c8a Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 8 Feb 2017 23:53:44 +0100
-Subject: [PATCH] mtd: bcm47xxsflash: support reading flash out of mapping
- window
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-For reading flash content we use MMIO but it's possible to read only
-first 16 MiB this way. It's simply an arch design/limitation.
-To support flash sizes bigger than 16 MiB implement indirect access
-using ChipCommon registers.
-This has been tested using MX25L25635F.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/devices/bcm47xxsflash.c | 24 +++++++++++++++++++++---
- drivers/mtd/devices/bcm47xxsflash.h |  3 +++
- 2 files changed, 24 insertions(+), 3 deletions(-)
-
---- a/drivers/mtd/devices/bcm47xxsflash.c
-+++ b/drivers/mtd/devices/bcm47xxsflash.c
-@@ -105,15 +105,33 @@ static int bcm47xxsflash_read(struct mtd
-                             size_t *retlen, u_char *buf)
- {
-       struct bcm47xxsflash *b47s = mtd->priv;
-+      size_t orig_len = len;
-       /* Check address range */
-       if ((from + len) > mtd->size)
-               return -EINVAL;
--      memcpy_fromio(buf, b47s->window + from, len);
--      *retlen = len;
-+      /* Read as much as possible using fast MMIO window */
-+      if (from < BCM47XXSFLASH_WINDOW_SZ) {
-+              size_t memcpy_len;
--      return len;
-+              memcpy_len = min(len, (size_t)(BCM47XXSFLASH_WINDOW_SZ - from));
-+              memcpy_fromio(buf, b47s->window + from, memcpy_len);
-+              from += memcpy_len;
-+              len -= memcpy_len;
-+              buf += memcpy_len;
-+      }
-+
-+      /* Use indirect access for content out of the window */
-+      for (; len; len--) {
-+              b47s->cc_write(b47s, BCMA_CC_FLASHADDR, from++);
-+              bcm47xxsflash_cmd(b47s, OPCODE_ST_READ4B);
-+              *buf++ = b47s->cc_read(b47s, BCMA_CC_FLASHDATA);
-+      }
-+
-+      *retlen = orig_len;
-+
-+      return orig_len;
- }
- static int bcm47xxsflash_write_st(struct mtd_info *mtd, u32 offset, size_t len,
---- a/drivers/mtd/devices/bcm47xxsflash.h
-+++ b/drivers/mtd/devices/bcm47xxsflash.h
-@@ -3,6 +3,8 @@
- #include <linux/mtd/mtd.h>
-+#define BCM47XXSFLASH_WINDOW_SZ                       SZ_16M
-+
- /* Used for ST flashes only. */
- #define OPCODE_ST_WREN                0x0006          /* Write Enable */
- #define OPCODE_ST_WRDIS               0x0004          /* Write Disable */
-@@ -16,6 +18,7 @@
- #define OPCODE_ST_RES         0x03ab          /* Read Electronic Signature */
- #define OPCODE_ST_CSA         0x1000          /* Keep chip select asserted */
- #define OPCODE_ST_SSE         0x0220          /* Sub-sector Erase */
-+#define OPCODE_ST_READ4B      0x6313          /* Read Data Bytes in 4Byte addressing mode */
- /* Used for Atmel flashes only. */
- #define OPCODE_AT_READ                                0x07e8
diff --git a/target/linux/generic/backport-4.9/060-0004-mtd-bcm47xxpart-move-TRX-parsing-code-to-separated-f.patch b/target/linux/generic/backport-4.9/060-0004-mtd-bcm47xxpart-move-TRX-parsing-code-to-separated-f.patch
deleted file mode 100644 (file)
index 999f544..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-From b522d7b0ebe3539340c2a6d46d787ae3d33bcb92 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 10 Jan 2017 23:15:24 +0100
-Subject: [PATCH] mtd: bcm47xxpart: move TRX parsing code to separated function
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This change simplifies main parsing loop logic a bit. In future it may
-be useful for moving TRX support to separated module / parser (if we
-implement support for them at some point).
-Finally parsing TRX at the end puts us in a better position as we have
-better flash layout knowledge. It may be useful e.g. if it appears there
-is more than 1 TRX partition.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/bcm47xxpart.c | 121 ++++++++++++++++++++++++++++------------------
- 1 file changed, 74 insertions(+), 47 deletions(-)
-
---- a/drivers/mtd/bcm47xxpart.c
-+++ b/drivers/mtd/bcm47xxpart.c
-@@ -83,6 +83,67 @@ out_default:
-       return "rootfs";
- }
-+static int bcm47xxpart_parse_trx(struct mtd_info *master,
-+                               struct mtd_partition *trx,
-+                               struct mtd_partition *parts,
-+                               size_t parts_len)
-+{
-+      struct trx_header header;
-+      size_t bytes_read;
-+      int curr_part = 0;
-+      int i, err;
-+
-+      if (parts_len < 3) {
-+              pr_warn("No enough space to add TRX partitions!\n");
-+              return -ENOMEM;
-+      }
-+
-+      err = mtd_read(master, trx->offset, sizeof(header), &bytes_read,
-+                     (uint8_t *)&header);
-+      if (err && !mtd_is_bitflip(err)) {
-+              pr_err("mtd_read error while reading TRX header: %d\n", err);
-+              return err;
-+      }
-+
-+      i = 0;
-+
-+      /* We have LZMA loader if offset[2] points to sth */
-+      if (header.offset[2]) {
-+              bcm47xxpart_add_part(&parts[curr_part++], "loader",
-+                                   trx->offset + header.offset[i], 0);
-+              i++;
-+      }
-+
-+      if (header.offset[i]) {
-+              bcm47xxpart_add_part(&parts[curr_part++], "linux",
-+                                   trx->offset + header.offset[i], 0);
-+              i++;
-+      }
-+
-+      if (header.offset[i]) {
-+              size_t offset = trx->offset + header.offset[i];
-+              const char *name = bcm47xxpart_trx_data_part_name(master,
-+                                                                offset);
-+
-+              bcm47xxpart_add_part(&parts[curr_part++], name, offset, 0);
-+              i++;
-+      }
-+
-+      /*
-+       * Assume that every partition ends at the beginning of the one it is
-+       * followed by.
-+       */
-+      for (i = 0; i < curr_part; i++) {
-+              u64 next_part_offset = (i < curr_part - 1) ?
-+                                      parts[i + 1].offset :
-+                                      trx->offset + trx->size;
-+
-+              parts[i].size = next_part_offset - parts[i].offset;
-+      }
-+
-+      return curr_part;
-+}
-+
- static int bcm47xxpart_parse(struct mtd_info *master,
-                            const struct mtd_partition **pparts,
-                            struct mtd_part_parser_data *data)
-@@ -93,9 +154,7 @@ static int bcm47xxpart_parse(struct mtd_
-       size_t bytes_read;
-       uint32_t offset;
-       uint32_t blocksize = master->erasesize;
--      struct trx_header *trx;
-       int trx_part = -1;
--      int last_trx_part = -1;
-       int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
-       int err;
-@@ -182,54 +241,14 @@ static int bcm47xxpart_parse(struct mtd_
-               /* TRX */
-               if (buf[0x000 / 4] == TRX_MAGIC) {
--                      if (BCM47XXPART_MAX_PARTS - curr_part < 4) {
--                              pr_warn("Not enough partitions left to register trx, scanning stopped!\n");
--                              break;
--                      }
--
--                      trx = (struct trx_header *)buf;
-+                      struct trx_header *trx;
-                       trx_part = curr_part;
-                       bcm47xxpart_add_part(&parts[curr_part++], "firmware",
-                                            offset, 0);
--                      i = 0;
--                      /* We have LZMA loader if offset[2] points to sth */
--                      if (trx->offset[2]) {
--                              bcm47xxpart_add_part(&parts[curr_part++],
--                                                   "loader",
--                                                   offset + trx->offset[i],
--                                                   0);
--                              i++;
--                      }
--
--                      if (trx->offset[i]) {
--                              bcm47xxpart_add_part(&parts[curr_part++],
--                                                   "linux",
--                                                   offset + trx->offset[i],
--                                                   0);
--                              i++;
--                      }
--
--                      /*
--                       * Pure rootfs size is known and can be calculated as:
--                       * trx->length - trx->offset[i]. We don't fill it as
--                       * we want to have jffs2 (overlay) in the same mtd.
--                       */
--                      if (trx->offset[i]) {
--                              const char *name;
--
--                              name = bcm47xxpart_trx_data_part_name(master, offset + trx->offset[i]);
--                              bcm47xxpart_add_part(&parts[curr_part++],
--                                                   name,
--                                                   offset + trx->offset[i],
--                                                   0);
--                              i++;
--                      }
--
--                      last_trx_part = curr_part - 1;
--
-                       /* Jump to the end of TRX */
-+                      trx = (struct trx_header *)buf;
-                       offset = roundup(offset + trx->length, blocksize);
-                       /* Next loop iteration will increase the offset */
-                       offset -= blocksize;
-@@ -307,9 +326,17 @@ static int bcm47xxpart_parse(struct mtd_
-                                      parts[i + 1].offset : master->size;
-               parts[i].size = next_part_offset - parts[i].offset;
--              if (i == last_trx_part && trx_part >= 0)
--                      parts[trx_part].size = next_part_offset -
--                                             parts[trx_part].offset;
-+      }
-+
-+      /* If there was TRX parse it now */
-+      if (trx_part >= 0) {
-+              int num_parts;
-+
-+              num_parts = bcm47xxpart_parse_trx(master, &parts[trx_part],
-+                                                parts + curr_part,
-+                                                BCM47XXPART_MAX_PARTS - curr_part);
-+              if (num_parts > 0)
-+                      curr_part += num_parts;
-       }
-       *pparts = parts;
diff --git a/target/linux/generic/backport-4.9/060-0005-mtd-bcm47xxpart-support-layouts-with-multiple-TRX-pa.patch b/target/linux/generic/backport-4.9/060-0005-mtd-bcm47xxpart-support-layouts-with-multiple-TRX-pa.patch
deleted file mode 100644 (file)
index bcefee8..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-From 89a0d9a9f1941a086a82bc7cd73d275cec98ba14 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 10 Jan 2017 23:15:25 +0100
-Subject: [PATCH] mtd: bcm47xxpart: support layouts with multiple TRX
- partitions
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Some devices may have an extra TRX partition used as failsafe one. If
-we detect such partition we should set a proper name for it and don't
-parse it.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/bcm47xxpart.c | 56 ++++++++++++++++++++++++++++++++++++++---------
- 1 file changed, 46 insertions(+), 10 deletions(-)
-
---- a/drivers/mtd/bcm47xxpart.c
-+++ b/drivers/mtd/bcm47xxpart.c
-@@ -9,6 +9,7 @@
-  *
-  */
-+#include <linux/bcm47xx_nvram.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/slab.h>
-@@ -144,6 +145,30 @@ static int bcm47xxpart_parse_trx(struct
-       return curr_part;
- }
-+/**
-+ * bcm47xxpart_bootpartition - gets index of TRX partition used by bootloader
-+ *
-+ * Some devices may have more than one TRX partition. In such case one of them
-+ * is the main one and another a failsafe one. Bootloader may fallback to the
-+ * failsafe firmware if it detects corruption of the main image.
-+ *
-+ * This function provides info about currently used TRX partition. It's the one
-+ * containing kernel started by the bootloader.
-+ */
-+static int bcm47xxpart_bootpartition(void)
-+{
-+      char buf[4];
-+      int bootpartition;
-+
-+      /* Check CFE environment variable */
-+      if (bcm47xx_nvram_getenv("bootpartition", buf, sizeof(buf)) > 0) {
-+              if (!kstrtoint(buf, 0, &bootpartition))
-+                      return bootpartition;
-+      }
-+
-+      return 0;
-+}
-+
- static int bcm47xxpart_parse(struct mtd_info *master,
-                            const struct mtd_partition **pparts,
-                            struct mtd_part_parser_data *data)
-@@ -154,7 +179,8 @@ static int bcm47xxpart_parse(struct mtd_
-       size_t bytes_read;
-       uint32_t offset;
-       uint32_t blocksize = master->erasesize;
--      int trx_part = -1;
-+      int trx_parts[2]; /* Array with indexes of TRX partitions */
-+      int trx_num = 0; /* Number of found TRX partitions */
-       int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, };
-       int err;
-@@ -243,7 +269,11 @@ static int bcm47xxpart_parse(struct mtd_
-               if (buf[0x000 / 4] == TRX_MAGIC) {
-                       struct trx_header *trx;
--                      trx_part = curr_part;
-+                      if (trx_num >= ARRAY_SIZE(trx_parts))
-+                              pr_warn("No enough space to store another TRX found at 0x%X\n",
-+                                      offset);
-+                      else
-+                              trx_parts[trx_num++] = curr_part;
-                       bcm47xxpart_add_part(&parts[curr_part++], "firmware",
-                                            offset, 0);
-@@ -329,14 +359,20 @@ static int bcm47xxpart_parse(struct mtd_
-       }
-       /* If there was TRX parse it now */
--      if (trx_part >= 0) {
--              int num_parts;
-+      for (i = 0; i < trx_num; i++) {
-+              struct mtd_partition *trx = &parts[trx_parts[i]];
--              num_parts = bcm47xxpart_parse_trx(master, &parts[trx_part],
--                                                parts + curr_part,
--                                                BCM47XXPART_MAX_PARTS - curr_part);
--              if (num_parts > 0)
--                      curr_part += num_parts;
-+              if (i == bcm47xxpart_bootpartition()) {
-+                      int num_parts;
-+
-+                      num_parts = bcm47xxpart_parse_trx(master, trx,
-+                                                        parts + curr_part,
-+                                                        BCM47XXPART_MAX_PARTS - curr_part);
-+                      if (num_parts > 0)
-+                              curr_part += num_parts;
-+              } else {
-+                      trx->name = "failsafe";
-+              }
-       }
-       *pparts = parts;
diff --git a/target/linux/generic/backport-4.9/061-v4.10-0001-mtd-spi-nor-add-Macronix-mx25u25635f-to-list-of-know.patch b/target/linux/generic/backport-4.9/061-v4.10-0001-mtd-spi-nor-add-Macronix-mx25u25635f-to-list-of-know.patch
deleted file mode 100644 (file)
index a70d827..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-From 355445b86f0f61125409e1217be4f0a8ee362116 Mon Sep 17 00:00:00 2001
-From: Ash Benz <ash.benz@bk.ru>
-Date: Sat, 19 Nov 2016 07:51:49 +0800
-Subject: [PATCH] mtd: spi-nor: add Macronix mx25u25635f to list of known
- devices.
-
-Signed-off-by: Ash Benz <ash.benz@bk.ru>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- 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
-@@ -878,6 +878,7 @@ static const struct flash_info spi_nor_i
-       { "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
-       { "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
-       { "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, 0) },
-+      { "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K) },
-       { "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) },
-       { "mx66l51235l", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_QUAD_READ) },
-       { "mx66l1g55g",  INFO(0xc2261b, 0, 64 * 1024, 2048, SPI_NOR_QUAD_READ) },
diff --git a/target/linux/generic/backport-4.9/061-v4.10-0002-mtd-spi-nor-fix-spansion-quad-enable.patch b/target/linux/generic/backport-4.9/061-v4.10-0002-mtd-spi-nor-fix-spansion-quad-enable.patch
deleted file mode 100644 (file)
index e4563eb..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-From 807c16253319ee6ccf8873ae64f070f7eb532cd5 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jo=C3=ABl=20Esponde?= <joel.esponde@honeywell.com>
-Date: Wed, 23 Nov 2016 12:47:40 +0100
-Subject: [PATCH] mtd: spi-nor: fix spansion quad enable
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-With the S25FL127S nor flash part, each writing to the configuration
-register takes hundreds of ms. During that  time, no more accesses to
-the flash should be done (even reads).
-
-This commit adds a wait loop after the register writing until the flash
-finishes its work.
-
-This issue could make rootfs mounting fail when the latter was done too
-much closely to this quad enable bit setting step. And in this case, a
-driver as UBIFS may try to recover the filesystem and may broke it
-completely.
-
-Signed-off-by: Joël Esponde <joel.esponde@honeywell.com>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1269,6 +1269,13 @@ static int spansion_quad_enable(struct s
-               return ret;
-       }
-+      ret = spi_nor_wait_till_ready(nor);
-+      if (ret) {
-+              dev_err(nor->dev,
-+                      "timeout while writing configuration register\n");
-+              return ret;
-+      }
-+
-       /* read back and check it */
-       ret = read_cr(nor);
-       if (!(ret > 0 && (ret & CR_QUAD_EN_SPAN))) {
diff --git a/target/linux/generic/backport-4.9/061-v4.10-0003-mtd-spi-nor-fix-flags-for-s25fl128s.patch b/target/linux/generic/backport-4.9/061-v4.10-0003-mtd-spi-nor-fix-flags-for-s25fl128s.patch
deleted file mode 100644 (file)
index 76c5d2d..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From 4287916d7bab2806305d3296b4cf261fa49d959b Mon Sep 17 00:00:00 2001
-From: Heiner Kallweit <hkallweit1@gmail.com>
-Date: Thu, 27 Oct 2016 23:13:26 +0200
-Subject: [PATCH] mtd: spi-nor: fix flags for s25fl128s
-
-The Spansion S25FL128S also supports dual read mode.
-In addition remove flag SECT_4K. 4K erases are supported,
-but not uniformly.
-
-Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
-Reviewed-by: Jagan Teki <jteki@openedev.com>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -912,7 +912,7 @@ static const struct flash_info spi_nor_i
-       { "s70fl01gs",  INFO(0x010221, 0x4d00, 256 * 1024, 256, 0) },
-       { "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024,  64, 0) },
-       { "s25sl12801", INFO(0x012018, 0x0301,  64 * 1024, 256, 0) },
--      { "s25fl128s",  INFO6(0x012018, 0x4d0180, 64 * 1024, 256, SECT_4K | SPI_NOR_QUAD_READ) },
-+      { "s25fl128s",  INFO6(0x012018, 0x4d0180, 64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-       { "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024,  64, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-       { "s25fl129p1", INFO(0x012018, 0x4d01,  64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
-       { "s25sl004a",  INFO(0x010212,      0,  64 * 1024,   8, 0) },
diff --git a/target/linux/generic/backport-4.9/061-v4.10-0004-mtd-spi-nor-add-support-for-s25fl208k.patch b/target/linux/generic/backport-4.9/061-v4.10-0004-mtd-spi-nor-add-support-for-s25fl208k.patch
deleted file mode 100644 (file)
index 004c1c5..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-From 022a400f90ceeb26405edd5e077d56e2f38c8123 Mon Sep 17 00:00:00 2001
-From: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
-Date: Wed, 5 Oct 2016 10:59:49 +0200
-Subject: [PATCH] mtd: spi-nor: add support for s25fl208k
-
-Signed-off-by: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
-Reviewed-by: Jagan Teki <jagan@openedev.com>
-Acked-by: Marek Vasut <marex@denx.de>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- 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
-@@ -928,6 +928,7 @@ static const struct flash_info spi_nor_i
-       { "s25fl132k",  INFO(0x014016,      0,  64 * 1024,  64, SECT_4K) },
-       { "s25fl164k",  INFO(0x014017,      0,  64 * 1024, 128, SECT_4K) },
-       { "s25fl204k",  INFO(0x014013,      0,  64 * 1024,   8, SECT_4K | SPI_NOR_DUAL_READ) },
-+      { "s25fl208k",  INFO(0x014014,      0,  64 * 1024,  16, SECT_4K | SPI_NOR_DUAL_READ) },
-       /* SST -- large erase sizes are "overlays", "sectors" are 4K */
-       { "sst25vf040b", INFO(0xbf258d, 0, 64 * 1024,  8, SECT_4K | SST_WRITE) },
diff --git a/target/linux/generic/backport-4.9/061-v4.10-0005-mtd-spi-nor-Add-at25df321-spi-nor-flash-support.patch b/target/linux/generic/backport-4.9/061-v4.10-0005-mtd-spi-nor-Add-at25df321-spi-nor-flash-support.patch
deleted file mode 100644 (file)
index b97d8c7..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From b08618c929b289699a496b8d45a4e1a014187e56 Mon Sep 17 00:00:00 2001
-From: Jagan Teki <jteki@openedev.com>
-Date: Tue, 26 Jul 2016 14:07:54 +0530
-Subject: [PATCH] mtd: spi-nor: Add at25df321 spi-nor flash support
-
-Add Atmel at25df321 spi-nor flash to the list of spi_nor_ids.
-
-Cc: Brian Norris <computersforpeace@gmail.com>
-Cc: Wenyou Yang <wenyou.yang@atmel.com>
-Signed-off-by: Jagan Teki <jteki@openedev.com>
-Acked-by: Wenyou Yang <wenyou.yang@atmel.com>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- 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
-@@ -799,6 +799,7 @@ static const struct flash_info spi_nor_i
-       { "at25fs040",  INFO(0x1f6604, 0, 64 * 1024,   8, SECT_4K) },
-       { "at25df041a", INFO(0x1f4401, 0, 64 * 1024,   8, SECT_4K) },
-+      { "at25df321",  INFO(0x1f4700, 0, 64 * 1024,  64, SECT_4K) },
-       { "at25df321a", INFO(0x1f4701, 0, 64 * 1024,  64, SECT_4K) },
-       { "at25df641",  INFO(0x1f4800, 0, 64 * 1024, 128, SECT_4K) },
diff --git a/target/linux/generic/backport-4.9/061-v4.10-0006-mtd-spi-nor-Add-support-for-N25Q016A.patch b/target/linux/generic/backport-4.9/061-v4.10-0006-mtd-spi-nor-Add-support-for-N25Q016A.patch
deleted file mode 100644 (file)
index 8df61f6..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From 61e4611864b396c7e9040b7335f25d3921bc87cd Mon Sep 17 00:00:00 2001
-From: Moritz Fischer <moritz.fischer@ettus.com>
-Date: Fri, 15 Jul 2016 10:03:48 -0700
-Subject: [PATCH] mtd: spi-nor: Add support for N25Q016A
-
-This commit adds support in the spi-nor driver for the
-N25Q016A, a 16Mbit SPI NOR flash from Micron.
-
-Cc: David Woodhouse <dwmw2@infradead.org>
-Cc: Brian Norris <computersforpeace@gmail.com>
-Cc: Jagan Teki <jteki@openedev.com>
-
-Signed-off-by: Moritz Fischer <moritz.fischer@ettus.com>
-Reviewed-by: Jagan Teki <jteki@openedev.com>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- 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
-@@ -885,6 +885,7 @@ static const struct flash_info spi_nor_i
-       { "mx66l1g55g",  INFO(0xc2261b, 0, 64 * 1024, 2048, SPI_NOR_QUAD_READ) },
-       /* Micron */
-+      { "n25q016a",    INFO(0x20bb15, 0, 64 * 1024,   32, SECT_4K | SPI_NOR_QUAD_READ) },
-       { "n25q032",     INFO(0x20ba16, 0, 64 * 1024,   64, SPI_NOR_QUAD_READ) },
-       { "n25q032a",    INFO(0x20bb16, 0, 64 * 1024,   64, SPI_NOR_QUAD_READ) },
-       { "n25q064",     INFO(0x20ba17, 0, 64 * 1024,  128, SECT_4K | SPI_NOR_QUAD_READ) },
diff --git a/target/linux/generic/backport-4.9/061-v4.10-0007-mtd-spi-nor-Add-support-for-mr25h40.patch b/target/linux/generic/backport-4.9/061-v4.10-0007-mtd-spi-nor-Add-support-for-mr25h40.patch
deleted file mode 100644 (file)
index 3bae77d..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From edd0c8f4932dbf3e21036cb443ba5bdf7449d02b Mon Sep 17 00:00:00 2001
-From: IWAMOTO Masahiko <iwamoto@allied-telesis.co.jp>
-Date: Wed, 5 Oct 2016 08:22:52 +0000
-Subject: [PATCH] mtd: spi-nor: Add support for mr25h40
-
-Add Everspin mr25h40 512KB MRAM to the list of supported chips.
-
-Signed-off-by: Masahiko Iwamoto <iwamoto@allied-telesis.co.jp>
-Reviewed-by: Jagan Teki <jagan@openedev.com>
-Acked-by: Marek Vasut <marex@denx.de>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- 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
-@@ -826,6 +826,7 @@ static const struct flash_info spi_nor_i
-       /* Everspin */
-       { "mr25h256", CAT25_INFO( 32 * 1024, 1, 256, 2, SPI_NOR_NO_ERASE | SPI_NOR_NO_FR) },
-       { "mr25h10",  CAT25_INFO(128 * 1024, 1, 256, 3, SPI_NOR_NO_ERASE | SPI_NOR_NO_FR) },
-+      { "mr25h40",  CAT25_INFO(512 * 1024, 1, 256, 3, SPI_NOR_NO_ERASE | SPI_NOR_NO_FR) },
-       /* Fujitsu */
-       { "mb85rs1mt", INFO(0x047f27, 0, 128 * 1024, 1, SPI_NOR_NO_ERASE) },
diff --git a/target/linux/generic/backport-4.9/062-v4.11-0001-mtd-spi-nor-Add-support-for-S3AN-spi-nor-devices.patch b/target/linux/generic/backport-4.9/062-v4.11-0001-mtd-spi-nor-Add-support-for-S3AN-spi-nor-devices.patch
deleted file mode 100644 (file)
index a174984..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-From 61cba34bd6c1bddfc38f94cc3f80bdfefcc3393b Mon Sep 17 00:00:00 2001
-From: Ricardo Ribalda <ricardo.ribalda@gmail.com>
-Date: Fri, 2 Dec 2016 12:31:44 +0100
-Subject: [PATCH] mtd: spi-nor: Add support for S3AN spi-nor devices
-
-Xilinx Spartan-3AN FPGAs contain an In-System Flash where they keep
-their configuration data and (optionally) some user data.
-
-The protocol of this flash follows most of the spi-nor standard. With
-the following differences:
-
-- Page size might not be a power of two.
-- The address calculation (default addressing mode).
-- The spi nor commands used.
-
-Protocol is described on Xilinx User Guide UG333
-
-Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
-Cc: Boris Brezillon <boris.brezillon@free-electrons.com>
-Cc: Brian Norris <computersforpeace@gmail.com>
-Cc: Marek Vasut <marek.vasut@gmail.com>
-Reviewed-by: Marek Vasut <marek.vasut@gmail.com>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 154 ++++++++++++++++++++++++++++++++++++++++--
- include/linux/mtd/spi-nor.h   |  12 ++++
- 2 files changed, 161 insertions(+), 5 deletions(-)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -75,6 +75,12 @@ struct flash_info {
-                                        * bit. Must be used with
-                                        * SPI_NOR_HAS_LOCK.
-                                        */
-+#define       SPI_S3AN                BIT(10) /*
-+                                       * Xilinx Spartan 3AN In-System Flash
-+                                       * (MFR cannot be used for probing
-+                                       * because it has the same value as
-+                                       * ATMEL flashes)
-+                                      */
- };
- #define JEDEC_MFR(info)       ((info)->id[0])
-@@ -217,6 +223,21 @@ static inline int set_4byte(struct spi_n
-               return nor->write_reg(nor, SPINOR_OP_BRWR, nor->cmd_buf, 1);
-       }
- }
-+
-+static int s3an_sr_ready(struct spi_nor *nor)
-+{
-+      int ret;
-+      u8 val;
-+
-+      ret = nor->read_reg(nor, SPINOR_OP_XRDSR, &val, 1);
-+      if (ret < 0) {
-+              dev_err(nor->dev, "error %d reading XRDSR\n", (int) ret);
-+              return ret;
-+      }
-+
-+      return !!(val & XSR_RDY);
-+}
-+
- static inline int spi_nor_sr_ready(struct spi_nor *nor)
- {
-       int sr = read_sr(nor);
-@@ -238,7 +259,11 @@ static inline int spi_nor_fsr_ready(stru
- static int spi_nor_ready(struct spi_nor *nor)
- {
-       int sr, fsr;
--      sr = spi_nor_sr_ready(nor);
-+
-+      if (nor->flags & SNOR_F_READY_XSR_RDY)
-+              sr = s3an_sr_ready(nor);
-+      else
-+              sr = spi_nor_sr_ready(nor);
-       if (sr < 0)
-               return sr;
-       fsr = nor->flags & SNOR_F_USE_FSR ? spi_nor_fsr_ready(nor) : 1;
-@@ -320,6 +345,24 @@ static void spi_nor_unlock_and_unprep(st
- }
- /*
-+ * This code converts an address to the Default Address Mode, that has non
-+ * power of two page sizes. We must support this mode because it is the default
-+ * mode supported by Xilinx tools, it can access the whole flash area and
-+ * changing over to the Power-of-two mode is irreversible and corrupts the
-+ * original data.
-+ * Addr can safely be unsigned int, the biggest S3AN device is smaller than
-+ * 4 MiB.
-+ */
-+static loff_t spi_nor_s3an_addr_convert(struct spi_nor *nor, unsigned int addr)
-+{
-+      unsigned int offset = addr;
-+
-+      offset %= nor->page_size;
-+
-+      return ((addr - offset) << 1) | offset;
-+}
-+
-+/*
-  * Initiate the erasure of a single sector
-  */
- static int spi_nor_erase_sector(struct spi_nor *nor, u32 addr)
-@@ -327,6 +370,9 @@ static int spi_nor_erase_sector(struct s
-       u8 buf[SPI_NOR_MAX_ADDR_WIDTH];
-       int i;
-+      if (nor->flags & SNOR_F_S3AN_ADDR_DEFAULT)
-+              addr = spi_nor_s3an_addr_convert(nor, addr);
-+
-       if (nor->erase)
-               return nor->erase(nor, addr);
-@@ -368,7 +414,7 @@ static int spi_nor_erase(struct mtd_info
-               return ret;
-       /* whole-chip erase? */
--      if (len == mtd->size) {
-+      if (len == mtd->size && !(nor->flags & SNOR_F_NO_OP_CHIP_ERASE)) {
-               unsigned long timeout;
-               write_enable(nor);
-@@ -782,6 +828,19 @@ static int spi_nor_is_locked(struct mtd_
-               .addr_width = (_addr_width),                            \
-               .flags = (_flags),
-+#define S3AN_INFO(_jedec_id, _n_sectors, _page_size)                  \
-+              .id = {                                                 \
-+                      ((_jedec_id) >> 16) & 0xff,                     \
-+                      ((_jedec_id) >> 8) & 0xff,                      \
-+                      (_jedec_id) & 0xff                              \
-+                      },                                              \
-+              .id_len = 3,                                            \
-+              .sector_size = (8*_page_size),                          \
-+              .n_sectors = (_n_sectors),                              \
-+              .page_size = _page_size,                                \
-+              .addr_width = 3,                                        \
-+              .flags = SPI_NOR_NO_FR | SPI_S3AN,
-+
- /* NOTE: double check command sets and memory organization when you add
-  * more nor chips.  This current list focusses on newer chips, which
-  * have been converging on command sets which including JEDEC ID.
-@@ -1020,6 +1079,13 @@ static const struct flash_info spi_nor_i
-       { "cat25c09", CAT25_INFO( 128, 8, 32, 2, SPI_NOR_NO_ERASE | SPI_NOR_NO_FR) },
-       { "cat25c17", CAT25_INFO( 256, 8, 32, 2, SPI_NOR_NO_ERASE | SPI_NOR_NO_FR) },
-       { "cat25128", CAT25_INFO(2048, 8, 64, 2, SPI_NOR_NO_ERASE | SPI_NOR_NO_FR) },
-+
-+      /* Xilinx S3AN Internal Flash */
-+      { "3S50AN", S3AN_INFO(0x1f2200, 64, 264) },
-+      { "3S200AN", S3AN_INFO(0x1f2400, 256, 264) },
-+      { "3S400AN", S3AN_INFO(0x1f2400, 256, 264) },
-+      { "3S700AN", S3AN_INFO(0x1f2500, 512, 264) },
-+      { "3S1400AN", S3AN_INFO(0x1f2600, 512, 528) },
-       { },
- };
-@@ -1060,7 +1126,12 @@ static int spi_nor_read(struct mtd_info
-               return ret;
-       while (len) {
--              ret = nor->read(nor, from, len, buf);
-+              loff_t addr = from;
-+
-+              if (nor->flags & SNOR_F_S3AN_ADDR_DEFAULT)
-+                      addr = spi_nor_s3an_addr_convert(nor, addr);
-+
-+              ret = nor->read(nor, addr, len, buf);
-               if (ret == 0) {
-                       /* We shouldn't see 0-length reads */
-                       ret = -EIO;
-@@ -1181,8 +1252,23 @@ static int spi_nor_write(struct mtd_info
-       for (i = 0; i < len; ) {
-               ssize_t written;
-+              loff_t addr = to + i;
--              page_offset = (to + i) & (nor->page_size - 1);
-+              /*
-+               * If page_size is a power of two, the offset can be quickly
-+               * calculated with an AND operation. On the other cases we
-+               * need to do a modulus operation (more expensive).
-+               * Power of two numbers have only one bit set and we can use
-+               * the instruction hweight32 to detect if we need to do a
-+               * modulus (do_div()) or not.
-+               */
-+              if (hweight32(nor->page_size) == 1) {
-+                      page_offset = addr & (nor->page_size - 1);
-+              } else {
-+                      uint64_t aux = addr;
-+
-+                      page_offset = do_div(aux, nor->page_size);
-+              }
-               WARN_ONCE(page_offset,
-                         "Writing at offset %zu into a NOR page. Writing partial pages may decrease reliability and increase wear of NOR flash.",
-                         page_offset);
-@@ -1190,8 +1276,11 @@ static int spi_nor_write(struct mtd_info
-               page_remain = min_t(size_t,
-                                   nor->page_size - page_offset, len - i);
-+              if (nor->flags & SNOR_F_S3AN_ADDR_DEFAULT)
-+                      addr = spi_nor_s3an_addr_convert(nor, addr);
-+
-               write_enable(nor);
--              ret = nor->write(nor, to + i, page_remain, buf + i);
-+              ret = nor->write(nor, addr, page_remain, buf + i);
-               if (ret < 0)
-                       goto write_err;
-               written = ret;
-@@ -1325,6 +1414,47 @@ static int spi_nor_check(struct spi_nor
-       return 0;
- }
-+static int s3an_nor_scan(const struct flash_info *info, struct spi_nor *nor)
-+{
-+      int ret;
-+      u8 val;
-+
-+      ret = nor->read_reg(nor, SPINOR_OP_XRDSR, &val, 1);
-+      if (ret < 0) {
-+              dev_err(nor->dev, "error %d reading XRDSR\n", (int) ret);
-+              return ret;
-+      }
-+
-+      nor->erase_opcode = SPINOR_OP_XSE;
-+      nor->program_opcode = SPINOR_OP_XPP;
-+      nor->read_opcode = SPINOR_OP_READ;
-+      nor->flags |= SNOR_F_NO_OP_CHIP_ERASE;
-+
-+      /*
-+       * This flashes have a page size of 264 or 528 bytes (known as
-+       * Default addressing mode). It can be changed to a more standard
-+       * Power of two mode where the page size is 256/512. This comes
-+       * with a price: there is 3% less of space, the data is corrupted
-+       * and the page size cannot be changed back to default addressing
-+       * mode.
-+       *
-+       * The current addressing mode can be read from the XRDSR register
-+       * and should not be changed, because is a destructive operation.
-+       */
-+      if (val & XSR_PAGESIZE) {
-+              /* Flash in Power of 2 mode */
-+              nor->page_size = (nor->page_size == 264) ? 256 : 512;
-+              nor->mtd.writebufsize = nor->page_size;
-+              nor->mtd.size = 8 * nor->page_size * info->n_sectors;
-+              nor->mtd.erasesize = 8 * nor->page_size;
-+      } else {
-+              /* Flash in Default addressing mode */
-+              nor->flags |= SNOR_F_S3AN_ADDR_DEFAULT;
-+      }
-+
-+      return 0;
-+}
-+
- int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
- {
-       const struct flash_info *info = NULL;
-@@ -1373,6 +1503,14 @@ int spi_nor_scan(struct spi_nor *nor, co
-       mutex_init(&nor->lock);
-       /*
-+       * Make sure the XSR_RDY flag is set before calling
-+       * spi_nor_wait_till_ready(). Xilinx S3AN share MFR
-+       * with Atmel spi-nor
-+       */
-+      if (info->flags & SPI_S3AN)
-+              nor->flags |=  SNOR_F_READY_XSR_RDY;
-+
-+      /*
-        * Atmel, SST, Intel/Numonyx, and others serial NOR tend to power up
-        * with the software protection bits set
-        */
-@@ -1530,6 +1668,12 @@ int spi_nor_scan(struct spi_nor *nor, co
-       nor->read_dummy = spi_nor_read_dummy_cycles(nor);
-+      if (info->flags & SPI_S3AN) {
-+              ret = s3an_nor_scan(info, nor);
-+              if (ret)
-+                      return ret;
-+      }
-+
-       dev_info(dev, "%s (%lld Kbytes)\n", info->name,
-                       (long long)mtd->size >> 10);
---- a/include/linux/mtd/spi-nor.h
-+++ b/include/linux/mtd/spi-nor.h
-@@ -68,6 +68,15 @@
- #define SPINOR_OP_WRDI                0x04    /* Write disable */
- #define SPINOR_OP_AAI_WP      0xad    /* Auto address increment word program */
-+/* Used for S3AN flashes only */
-+#define SPINOR_OP_XSE         0x50    /* Sector erase */
-+#define SPINOR_OP_XPP         0x82    /* Page program */
-+#define SPINOR_OP_XRDSR               0xd7    /* Read status register */
-+
-+#define XSR_PAGESIZE          BIT(0)  /* Page size in Po2 or Linear */
-+#define XSR_RDY                       BIT(7)  /* Ready */
-+
-+
- /* Used for Macronix and Winbond flashes. */
- #define SPINOR_OP_EN4B                0xb7    /* Enter 4-byte mode */
- #define SPINOR_OP_EX4B                0xe9    /* Exit 4-byte mode */
-@@ -119,6 +128,9 @@ enum spi_nor_ops {
- enum spi_nor_option_flags {
-       SNOR_F_USE_FSR          = BIT(0),
-       SNOR_F_HAS_SR_TB        = BIT(1),
-+      SNOR_F_NO_OP_CHIP_ERASE = BIT(2),
-+      SNOR_F_S3AN_ADDR_DEFAULT = BIT(3),
-+      SNOR_F_READY_XSR_RDY    = BIT(4),
- };
- /**
diff --git a/target/linux/generic/backport-4.9/062-v4.11-0002-mtd-spi-nor-improve-macronix_quad_enable.patch b/target/linux/generic/backport-4.9/062-v4.11-0002-mtd-spi-nor-improve-macronix_quad_enable.patch
deleted file mode 100644 (file)
index ec469d4..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From 1e99d0d51ec97bf48edd277658004ce030543d98 Mon Sep 17 00:00:00 2001
-From: Cyrille Pitchen <cyrille.pitchen@atmel.com>
-Date: Tue, 6 Dec 2016 17:01:41 +0100
-Subject: [PATCH] mtd: spi-nor: improve macronix_quad_enable()
-
-The patch checks whether the Quad Enable bit is already set in the Status
-Register. If so, the function exits immediately with a successful return
-code.
-
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
-Reviewed-by: Jagan Teki <jagan@openedev.com>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1311,6 +1311,9 @@ static int macronix_quad_enable(struct s
-       val = read_sr(nor);
-       if (val < 0)
-               return val;
-+      if (val & SR_QUAD_EN_MX)
-+              return 0;
-+
-       write_enable(nor);
-       write_sr(nor, val | SR_QUAD_EN_MX);
diff --git a/target/linux/generic/backport-4.9/062-v4.11-0003-mtd-spi-nor-remove-WARN_ONCE-message-in-spi_nor_writ.patch b/target/linux/generic/backport-4.9/062-v4.11-0003-mtd-spi-nor-remove-WARN_ONCE-message-in-spi_nor_writ.patch
deleted file mode 100644 (file)
index 790b557..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-From dc176595bf184e89bf28fdf91cbc1d050dfe63b3 Mon Sep 17 00:00:00 2001
-From: Cyrille Pitchen <cyrille.pitchen@atmel.com>
-Date: Tue, 6 Dec 2016 18:14:24 +0100
-Subject: [PATCH] mtd: spi-nor: remove WARN_ONCE() message in spi_nor_write()
-
-This patch removes the WARN_ONCE() test in spi_nor_write().
-This macro triggers the display of a warning message almost every time we
-use a UBI file-system because a write operation is performed at offset 64,
-which is in the middle of the SPI NOR memory page. This is a valid
-operation for ubifs.
-
-Hence this warning is pretty annoying and useless so we just remove it.
-
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
-Suggested-by: Richard Weinberger <richard@nod.at>
-Suggested-by: Andras Szemzo <szemzo.andras@gmail.com>
-Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 3 ---
- 1 file changed, 3 deletions(-)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1269,9 +1269,6 @@ static int spi_nor_write(struct mtd_info
-                       page_offset = do_div(aux, nor->page_size);
-               }
--              WARN_ONCE(page_offset,
--                        "Writing at offset %zu into a NOR page. Writing partial pages may decrease reliability and increase wear of NOR flash.",
--                        page_offset);
-               /* the size of data remaining on the first page */
-               page_remain = min_t(size_t,
-                                   nor->page_size - page_offset, len - i);
diff --git a/target/linux/generic/backport-4.9/062-v4.11-0004-mtd-spi-nor-rename-SPINOR_OP_-macros-of-the-4-byte-a.patch b/target/linux/generic/backport-4.9/062-v4.11-0004-mtd-spi-nor-rename-SPINOR_OP_-macros-of-the-4-byte-a.patch
deleted file mode 100644 (file)
index 34562e1..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-From 05aba5763dcf35eddc58aaf99c9f16d19730e0a8 Mon Sep 17 00:00:00 2001
-From: Cyrille Pitchen <cyrille.pitchen@atmel.com>
-Date: Thu, 27 Oct 2016 11:55:39 +0200
-Subject: [PATCH] mtd: spi-nor: rename SPINOR_OP_* macros of the 4-byte address
- op codes
-
-This patch renames the SPINOR_OP_* macros of the 4-byte address
-instruction set so the new names all share a common pattern: the 4-byte
-address name is built from the 3-byte address name appending the "_4B"
-suffix.
-
-The patch also introduces new op codes to support other SPI protocols such
-as SPI 1-4-4 and SPI 1-2-2.
-
-This is a transitional patch and will help a later patch of spi-nor.c
-to automate the translation from the 3-byte address op codes into their
-4-byte address version.
-
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
-Acked-by: Mark Brown <broonie@kernel.org>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
----
- drivers/mtd/devices/serial_flash_cmds.h |  7 -------
- drivers/mtd/devices/st_spi_fsm.c        | 28 ++++++++++++++--------------
- drivers/mtd/spi-nor/spi-nor.c           |  8 ++++----
- drivers/spi/spi-bcm-qspi.c              |  6 +++---
- include/linux/mtd/spi-nor.h             | 22 ++++++++++++++++------
- 5 files changed, 37 insertions(+), 34 deletions(-)
-
---- a/drivers/mtd/devices/serial_flash_cmds.h
-+++ b/drivers/mtd/devices/serial_flash_cmds.h
-@@ -18,19 +18,12 @@
- #define SPINOR_OP_RDVCR               0x85
- /* JEDEC Standard - Serial Flash Discoverable Parmeters (SFDP) Commands */
--#define SPINOR_OP_READ_1_2_2  0xbb    /* DUAL I/O READ */
--#define SPINOR_OP_READ_1_4_4  0xeb    /* QUAD I/O READ */
--
- #define SPINOR_OP_WRITE               0x02    /* PAGE PROGRAM */
- #define SPINOR_OP_WRITE_1_1_2 0xa2    /* DUAL INPUT PROGRAM */
- #define SPINOR_OP_WRITE_1_2_2 0xd2    /* DUAL INPUT EXT PROGRAM */
- #define SPINOR_OP_WRITE_1_1_4 0x32    /* QUAD INPUT PROGRAM */
- #define SPINOR_OP_WRITE_1_4_4 0x12    /* QUAD INPUT EXT PROGRAM */
--/* READ commands with 32-bit addressing */
--#define SPINOR_OP_READ4_1_2_2 0xbc
--#define SPINOR_OP_READ4_1_4_4 0xec
--
- /* Configuration flags */
- #define FLASH_FLAG_SINGLE     0x000000ff
- #define FLASH_FLAG_READ_WRITE 0x00000001
---- a/drivers/mtd/devices/st_spi_fsm.c
-+++ b/drivers/mtd/devices/st_spi_fsm.c
-@@ -507,13 +507,13 @@ static struct seq_rw_config n25q_read3_c
-  *    - 'FAST' variants configured for 8 dummy cycles (see note above.)
-  */
- static struct seq_rw_config n25q_read4_configs[] = {
--      {FLASH_FLAG_READ_1_4_4, SPINOR_OP_READ4_1_4_4,  0, 4, 4, 0x00, 0, 8},
--      {FLASH_FLAG_READ_1_1_4, SPINOR_OP_READ4_1_1_4,  0, 1, 4, 0x00, 0, 8},
--      {FLASH_FLAG_READ_1_2_2, SPINOR_OP_READ4_1_2_2,  0, 2, 2, 0x00, 0, 8},
--      {FLASH_FLAG_READ_1_1_2, SPINOR_OP_READ4_1_1_2,  0, 1, 2, 0x00, 0, 8},
--      {FLASH_FLAG_READ_FAST,  SPINOR_OP_READ4_FAST,   0, 1, 1, 0x00, 0, 8},
--      {FLASH_FLAG_READ_WRITE, SPINOR_OP_READ4,        0, 1, 1, 0x00, 0, 0},
--      {0x00,                  0,                      0, 0, 0, 0x00, 0, 0},
-+      {FLASH_FLAG_READ_1_4_4, SPINOR_OP_READ_1_4_4_4B, 0, 4, 4, 0x00, 0, 8},
-+      {FLASH_FLAG_READ_1_1_4, SPINOR_OP_READ_1_1_4_4B, 0, 1, 4, 0x00, 0, 8},
-+      {FLASH_FLAG_READ_1_2_2, SPINOR_OP_READ_1_2_2_4B, 0, 2, 2, 0x00, 0, 8},
-+      {FLASH_FLAG_READ_1_1_2, SPINOR_OP_READ_1_1_2_4B, 0, 1, 2, 0x00, 0, 8},
-+      {FLASH_FLAG_READ_FAST,  SPINOR_OP_READ_FAST_4B,  0, 1, 1, 0x00, 0, 8},
-+      {FLASH_FLAG_READ_WRITE, SPINOR_OP_READ_4B,       0, 1, 1, 0x00, 0, 0},
-+      {0x00,                  0,                       0, 0, 0, 0x00, 0, 0},
- };
- /*
-@@ -553,13 +553,13 @@ static int stfsm_mx25_en_32bit_addr_seq(
-  * entering a state that is incompatible with the SPIBoot Controller.
-  */
- static struct seq_rw_config stfsm_s25fl_read4_configs[] = {
--      {FLASH_FLAG_READ_1_4_4,  SPINOR_OP_READ4_1_4_4,  0, 4, 4, 0x00, 2, 4},
--      {FLASH_FLAG_READ_1_1_4,  SPINOR_OP_READ4_1_1_4,  0, 1, 4, 0x00, 0, 8},
--      {FLASH_FLAG_READ_1_2_2,  SPINOR_OP_READ4_1_2_2,  0, 2, 2, 0x00, 4, 0},
--      {FLASH_FLAG_READ_1_1_2,  SPINOR_OP_READ4_1_1_2,  0, 1, 2, 0x00, 0, 8},
--      {FLASH_FLAG_READ_FAST,   SPINOR_OP_READ4_FAST,   0, 1, 1, 0x00, 0, 8},
--      {FLASH_FLAG_READ_WRITE,  SPINOR_OP_READ4,        0, 1, 1, 0x00, 0, 0},
--      {0x00,                   0,                      0, 0, 0, 0x00, 0, 0},
-+      {FLASH_FLAG_READ_1_4_4,  SPINOR_OP_READ_1_4_4_4B,  0, 4, 4, 0x00, 2, 4},
-+      {FLASH_FLAG_READ_1_1_4,  SPINOR_OP_READ_1_1_4_4B,  0, 1, 4, 0x00, 0, 8},
-+      {FLASH_FLAG_READ_1_2_2,  SPINOR_OP_READ_1_2_2_4B,  0, 2, 2, 0x00, 4, 0},
-+      {FLASH_FLAG_READ_1_1_2,  SPINOR_OP_READ_1_1_2_4B,  0, 1, 2, 0x00, 0, 8},
-+      {FLASH_FLAG_READ_FAST,   SPINOR_OP_READ_FAST_4B,   0, 1, 1, 0x00, 0, 8},
-+      {FLASH_FLAG_READ_WRITE,  SPINOR_OP_READ_4B,        0, 1, 1, 0x00, 0, 0},
-+      {0x00,                   0,                        0, 0, 0, 0x00, 0, 0},
- };
- static struct seq_rw_config stfsm_s25fl_write4_configs[] = {
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1638,16 +1638,16 @@ int spi_nor_scan(struct spi_nor *nor, co
-                       /* Dedicated 4-byte command set */
-                       switch (nor->flash_read) {
-                       case SPI_NOR_QUAD:
--                              nor->read_opcode = SPINOR_OP_READ4_1_1_4;
-+                              nor->read_opcode = SPINOR_OP_READ_1_1_4_4B;
-                               break;
-                       case SPI_NOR_DUAL:
--                              nor->read_opcode = SPINOR_OP_READ4_1_1_2;
-+                              nor->read_opcode = SPINOR_OP_READ_1_1_2_4B;
-                               break;
-                       case SPI_NOR_FAST:
--                              nor->read_opcode = SPINOR_OP_READ4_FAST;
-+                              nor->read_opcode = SPINOR_OP_READ_FAST_4B;
-                               break;
-                       case SPI_NOR_NORMAL:
--                              nor->read_opcode = SPINOR_OP_READ4;
-+                              nor->read_opcode = SPINOR_OP_READ_4B;
-                               break;
-                       }
-                       nor->program_opcode = SPINOR_OP_PP_4B;
---- a/drivers/spi/spi-bcm-qspi.c
-+++ b/drivers/spi/spi-bcm-qspi.c
-@@ -371,7 +371,7 @@ static int bcm_qspi_bspi_set_flex_mode(s
-                       /* default mode, does not need flex_cmd */
-                       flex_mode = 0;
-               else
--                      command = SPINOR_OP_READ4_FAST;
-+                      command = SPINOR_OP_READ_FAST_4B;
-               break;
-       case SPI_NBITS_DUAL:
-               bpc = 0x00000001;
-@@ -384,7 +384,7 @@ static int bcm_qspi_bspi_set_flex_mode(s
-               } else {
-                       command = SPINOR_OP_READ_1_1_2;
-                       if (spans_4byte)
--                              command = SPINOR_OP_READ4_1_1_2;
-+                              command = SPINOR_OP_READ_1_1_2_4B;
-               }
-               break;
-       case SPI_NBITS_QUAD:
-@@ -399,7 +399,7 @@ static int bcm_qspi_bspi_set_flex_mode(s
-               } else {
-                       command = SPINOR_OP_READ_1_1_4;
-                       if (spans_4byte)
--                              command = SPINOR_OP_READ4_1_1_4;
-+                              command = SPINOR_OP_READ_1_1_4_4B;
-               }
-               break;
-       default:
---- a/include/linux/mtd/spi-nor.h
-+++ b/include/linux/mtd/spi-nor.h
-@@ -43,9 +43,13 @@
- #define SPINOR_OP_WRSR                0x01    /* Write status register 1 byte */
- #define SPINOR_OP_READ                0x03    /* Read data bytes (low frequency) */
- #define SPINOR_OP_READ_FAST   0x0b    /* Read data bytes (high frequency) */
--#define SPINOR_OP_READ_1_1_2  0x3b    /* Read data bytes (Dual SPI) */
--#define SPINOR_OP_READ_1_1_4  0x6b    /* Read data bytes (Quad SPI) */
-+#define SPINOR_OP_READ_1_1_2  0x3b    /* Read data bytes (Dual Output SPI) */
-+#define SPINOR_OP_READ_1_2_2  0xbb    /* Read data bytes (Dual I/O SPI) */
-+#define SPINOR_OP_READ_1_1_4  0x6b    /* Read data bytes (Quad Output SPI) */
-+#define SPINOR_OP_READ_1_4_4  0xeb    /* Read data bytes (Quad I/O SPI) */
- #define SPINOR_OP_PP          0x02    /* Page program (up to 256 bytes) */
-+#define SPINOR_OP_PP_1_1_4    0x32    /* Quad page program */
-+#define SPINOR_OP_PP_1_4_4    0x38    /* Quad page program */
- #define SPINOR_OP_BE_4K               0x20    /* Erase 4KiB block */
- #define SPINOR_OP_BE_4K_PMC   0xd7    /* Erase 4KiB block on PMC chips */
- #define SPINOR_OP_BE_32K      0x52    /* Erase 32KiB block */
-@@ -56,11 +60,17 @@
- #define SPINOR_OP_RDFSR               0x70    /* Read flag status register */
- /* 4-byte address opcodes - used on Spansion and some Macronix flashes. */
--#define SPINOR_OP_READ4               0x13    /* Read data bytes (low frequency) */
--#define SPINOR_OP_READ4_FAST  0x0c    /* Read data bytes (high frequency) */
--#define SPINOR_OP_READ4_1_1_2 0x3c    /* Read data bytes (Dual SPI) */
--#define SPINOR_OP_READ4_1_1_4 0x6c    /* Read data bytes (Quad SPI) */
-+#define SPINOR_OP_READ_4B     0x13    /* Read data bytes (low frequency) */
-+#define SPINOR_OP_READ_FAST_4B        0x0c    /* Read data bytes (high frequency) */
-+#define SPINOR_OP_READ_1_1_2_4B       0x3c    /* Read data bytes (Dual Output SPI) */
-+#define SPINOR_OP_READ_1_2_2_4B       0xbc    /* Read data bytes (Dual I/O SPI) */
-+#define SPINOR_OP_READ_1_1_4_4B       0x6c    /* Read data bytes (Quad Output SPI) */
-+#define SPINOR_OP_READ_1_4_4_4B       0xec    /* Read data bytes (Quad I/O SPI) */
- #define SPINOR_OP_PP_4B               0x12    /* Page program (up to 256 bytes) */
-+#define SPINOR_OP_PP_1_1_4_4B 0x34    /* Quad page program */
-+#define SPINOR_OP_PP_1_4_4_4B 0x3e    /* Quad page program */
-+#define SPINOR_OP_BE_4K_4B    0x21    /* Erase 4KiB block */
-+#define SPINOR_OP_BE_32K_4B   0x5c    /* Erase 32KiB block */
- #define SPINOR_OP_SE_4B               0xdc    /* Sector erase (usually 64KiB) */
- /* Used for SST flashes only. */
diff --git a/target/linux/generic/backport-4.9/062-v4.11-0005-mtd-spi-nor-add-a-stateless-method-to-support-memory.patch b/target/linux/generic/backport-4.9/062-v4.11-0005-mtd-spi-nor-add-a-stateless-method-to-support-memory.patch
deleted file mode 100644 (file)
index 1d507c1..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-From 3274ba26f27becfc4193ec6e229288140651f240 Mon Sep 17 00:00:00 2001
-From: Cyrille Pitchen <cyrille.pitchen@atmel.com>
-Date: Thu, 27 Oct 2016 12:03:57 +0200
-Subject: [PATCH] mtd: spi-nor: add a stateless method to support memory size
- above 128Mib
-
-This patch provides an alternative mean to support memory above 16MiB
-(128Mib) by replacing 3byte address op codes by their associated 4byte
-address versions.
-
-Using the dedicated 4byte address op codes doesn't change the internal
-state of the SPI NOR memory as opposed to using other means such as
-updating a Base Address Register (BAR) and sending command to enter/leave
-the 4byte mode.
-
-Hence when a CPU reset occurs, early bootloaders don't need to be aware
-of BAR value or 4byte mode being enabled: they can still access the first
-16MiB of the SPI NOR memory using the regular 3byte address op codes.
-
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
-Tested-by: Vignesh R <vigneshr@ti.com>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 101 +++++++++++++++++++++++++++++++++---------
- 1 file changed, 80 insertions(+), 21 deletions(-)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -81,6 +81,10 @@ struct flash_info {
-                                        * because it has the same value as
-                                        * ATMEL flashes)
-                                       */
-+#define SPI_NOR_4B_OPCODES    BIT(11) /*
-+                                       * Use dedicated 4byte address op codes
-+                                       * to support memory size above 128Mib.
-+                                       */
- };
- #define JEDEC_MFR(info)       ((info)->id[0])
-@@ -194,6 +198,78 @@ static inline struct spi_nor *mtd_to_spi
-       return mtd->priv;
- }
-+
-+static u8 spi_nor_convert_opcode(u8 opcode, const u8 table[][2], size_t size)
-+{
-+      size_t i;
-+
-+      for (i = 0; i < size; i++)
-+              if (table[i][0] == opcode)
-+                      return table[i][1];
-+
-+      /* No conversion found, keep input op code. */
-+      return opcode;
-+}
-+
-+static inline u8 spi_nor_convert_3to4_read(u8 opcode)
-+{
-+      static const u8 spi_nor_3to4_read[][2] = {
-+              { SPINOR_OP_READ,       SPINOR_OP_READ_4B },
-+              { SPINOR_OP_READ_FAST,  SPINOR_OP_READ_FAST_4B },
-+              { SPINOR_OP_READ_1_1_2, SPINOR_OP_READ_1_1_2_4B },
-+              { SPINOR_OP_READ_1_2_2, SPINOR_OP_READ_1_2_2_4B },
-+              { SPINOR_OP_READ_1_1_4, SPINOR_OP_READ_1_1_4_4B },
-+              { SPINOR_OP_READ_1_4_4, SPINOR_OP_READ_1_4_4_4B },
-+      };
-+
-+      return spi_nor_convert_opcode(opcode, spi_nor_3to4_read,
-+                                    ARRAY_SIZE(spi_nor_3to4_read));
-+}
-+
-+static inline u8 spi_nor_convert_3to4_program(u8 opcode)
-+{
-+      static const u8 spi_nor_3to4_program[][2] = {
-+              { SPINOR_OP_PP,         SPINOR_OP_PP_4B },
-+              { SPINOR_OP_PP_1_1_4,   SPINOR_OP_PP_1_1_4_4B },
-+              { SPINOR_OP_PP_1_4_4,   SPINOR_OP_PP_1_4_4_4B },
-+      };
-+
-+      return spi_nor_convert_opcode(opcode, spi_nor_3to4_program,
-+                                    ARRAY_SIZE(spi_nor_3to4_program));
-+}
-+
-+static inline u8 spi_nor_convert_3to4_erase(u8 opcode)
-+{
-+      static const u8 spi_nor_3to4_erase[][2] = {
-+              { SPINOR_OP_BE_4K,      SPINOR_OP_BE_4K_4B },
-+              { SPINOR_OP_BE_32K,     SPINOR_OP_BE_32K_4B },
-+              { SPINOR_OP_SE,         SPINOR_OP_SE_4B },
-+      };
-+
-+      return spi_nor_convert_opcode(opcode, spi_nor_3to4_erase,
-+                                    ARRAY_SIZE(spi_nor_3to4_erase));
-+}
-+
-+static void spi_nor_set_4byte_opcodes(struct spi_nor *nor,
-+                                    const struct flash_info *info)
-+{
-+      /* Do some manufacturer fixups first */
-+      switch (JEDEC_MFR(info)) {
-+      case SNOR_MFR_SPANSION:
-+              /* No small sector erase for 4-byte command set */
-+              nor->erase_opcode = SPINOR_OP_SE;
-+              nor->mtd.erasesize = info->sector_size;
-+              break;
-+
-+      default:
-+              break;
-+      }
-+
-+      nor->read_opcode = spi_nor_convert_3to4_read(nor->read_opcode);
-+      nor->program_opcode = spi_nor_convert_3to4_program(nor->program_opcode);
-+      nor->erase_opcode = spi_nor_convert_3to4_erase(nor->erase_opcode);
-+}
-+
- /* Enable/disable 4-byte addressing mode. */
- static inline int set_4byte(struct spi_nor *nor, const struct flash_info *info,
-                           int enable)
-@@ -1634,27 +1710,10 @@ int spi_nor_scan(struct spi_nor *nor, co
-       else if (mtd->size > 0x1000000) {
-               /* enable 4-byte addressing if the device exceeds 16MiB */
-               nor->addr_width = 4;
--              if (JEDEC_MFR(info) == SNOR_MFR_SPANSION) {
--                      /* Dedicated 4-byte command set */
--                      switch (nor->flash_read) {
--                      case SPI_NOR_QUAD:
--                              nor->read_opcode = SPINOR_OP_READ_1_1_4_4B;
--                              break;
--                      case SPI_NOR_DUAL:
--                              nor->read_opcode = SPINOR_OP_READ_1_1_2_4B;
--                              break;
--                      case SPI_NOR_FAST:
--                              nor->read_opcode = SPINOR_OP_READ_FAST_4B;
--                              break;
--                      case SPI_NOR_NORMAL:
--                              nor->read_opcode = SPINOR_OP_READ_4B;
--                              break;
--                      }
--                      nor->program_opcode = SPINOR_OP_PP_4B;
--                      /* No small sector erase for 4-byte command set */
--                      nor->erase_opcode = SPINOR_OP_SE_4B;
--                      mtd->erasesize = info->sector_size;
--              } else
-+              if (JEDEC_MFR(info) == SNOR_MFR_SPANSION ||
-+                  info->flags & SPI_NOR_4B_OPCODES)
-+                      spi_nor_set_4byte_opcodes(nor, info);
-+              else
-                       set_4byte(nor, info, 1);
-       } else {
-               nor->addr_width = 3;
diff --git a/target/linux/generic/backport-4.9/062-v4.11-0006-mtd-spi-nor-Add-lock-unlock-support-for-f25l32pa.patch b/target/linux/generic/backport-4.9/062-v4.11-0006-mtd-spi-nor-Add-lock-unlock-support-for-f25l32pa.patch
deleted file mode 100644 (file)
index be78682..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From 252c36bb9c7b98b356f033d16ea83d20fb8b4d3e Mon Sep 17 00:00:00 2001
-From: Victor Shyba <victor1984@riseup.net>
-Date: Mon, 2 Jan 2017 22:34:30 -0300
-Subject: [PATCH] mtd: spi-nor: Add lock/unlock support for f25l32pa
-
-This chip has write protection enabled on power-up,
-so this flag is necessary to support write operations.
-
-Signed-off-by: Victor Shyba <victor1984@riseup.net>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -956,7 +956,7 @@ static const struct flash_info spi_nor_i
-       { "en25s64",    INFO(0x1c3817, 0, 64 * 1024,  128, SECT_4K) },
-       /* ESMT */
--      { "f25l32pa", INFO(0x8c2016, 0, 64 * 1024, 64, SECT_4K) },
-+      { "f25l32pa", INFO(0x8c2016, 0, 64 * 1024, 64, SECT_4K | SPI_NOR_HAS_LOCK) },
-       /* Everspin */
-       { "mr25h256", CAT25_INFO( 32 * 1024, 1, 256, 2, SPI_NOR_NO_ERASE | SPI_NOR_NO_FR) },
diff --git a/target/linux/generic/backport-4.9/062-v4.11-0007-mtd-spi-nor-Fix-S3AN-addressing-calculation.patch b/target/linux/generic/backport-4.9/062-v4.11-0007-mtd-spi-nor-Fix-S3AN-addressing-calculation.patch
deleted file mode 100644 (file)
index f8d0541..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From 5f0e0758efddef5b06994a76d8c7f0b8a4c1daae Mon Sep 17 00:00:00 2001
-From: Ricardo Ribalda <ricardo.ribalda@gmail.com>
-Date: Wed, 18 Jan 2017 17:40:16 +0100
-Subject: [PATCH] mtd: spi-nor: Fix S3AN addressing calculation
-
-The page calculation under spi_nor_s3an_addr_convert() was wrong. On
-Default Address Mode we need to perform a divide by page_size.
-
-Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -431,11 +431,14 @@ static void spi_nor_unlock_and_unprep(st
-  */
- static loff_t spi_nor_s3an_addr_convert(struct spi_nor *nor, unsigned int addr)
- {
--      unsigned int offset = addr;
-+      unsigned int offset;
-+      unsigned int page;
--      offset %= nor->page_size;
-+      offset = addr % nor->page_size;
-+      page = addr / nor->page_size;
-+      page <<= (nor->page_size > 512) ? 10 : 9;
--      return ((addr - offset) << 1) | offset;
-+      return page | offset;
- }
- /*
diff --git a/target/linux/generic/backport-4.9/062-v4.11-0008-mtd-spi-nor-Add-support-for-gd25q16.patch b/target/linux/generic/backport-4.9/062-v4.11-0008-mtd-spi-nor-Add-support-for-gd25q16.patch
deleted file mode 100644 (file)
index 5253957..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From 4c5747a390acc9d1da3b332507c8bae7a8ddfc48 Mon Sep 17 00:00:00 2001
-From: Kamal Dasu <kdasu.kdev@gmail.com>
-Date: Fri, 20 Jan 2017 14:25:51 -0500
-Subject: [PATCH] mtd: spi-nor: Add support for gd25q16
-
-Add GigaDevice GD25Q16 (16M-bit) to supported list.
-
-Signed-off-by: Kamal Dasu <kdasu.kdev@gmail.com>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- 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
-@@ -971,6 +971,11 @@ static const struct flash_info spi_nor_i
-       /* GigaDevice */
-       {
-+              "gd25q16", INFO(0xc84015, 0, 64 * 1024,  32,
-+                      SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
-+                      SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
-+      },
-+      {
-               "gd25q32", INFO(0xc84016, 0, 64 * 1024,  64,
-                       SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ |
-                       SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
diff --git a/target/linux/generic/backport-4.9/063-v4.11-0001-mtd-nand-Add-Winbond-manufacturer-id.patch b/target/linux/generic/backport-4.9/063-v4.11-0001-mtd-nand-Add-Winbond-manufacturer-id.patch
deleted file mode 100644 (file)
index cbab378..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-From a4077ce5871304f8a78f80b74b18b6052a410f1a Mon Sep 17 00:00:00 2001
-From: "Andrey Jr. Melnikov" <temnota.am@gmail.com>
-Date: Thu, 8 Dec 2016 19:57:08 +0300
-Subject: [PATCH] mtd: nand: Add Winbond manufacturer id
-
-Add WINBOND manufacturer id.
-
-Signed-off-by: Andrey Jr. Melnikov <temnota.am@gmail.com>
-Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
----
- drivers/mtd/nand/nand_ids.c | 1 +
- include/linux/mtd/nand.h    | 1 +
- 2 files changed, 2 insertions(+)
-
---- a/drivers/mtd/nand/nand_ids.c
-+++ b/drivers/mtd/nand/nand_ids.c
-@@ -182,6 +182,7 @@ struct nand_manufacturers nand_manuf_ids
-       {NAND_MFR_SANDISK, "SanDisk"},
-       {NAND_MFR_INTEL, "Intel"},
-       {NAND_MFR_ATO, "ATO"},
-+      {NAND_MFR_WINBOND, "Winbond"},
-       {0x0, "Unknown"}
- };
---- a/include/linux/mtd/nand.h
-+++ b/include/linux/mtd/nand.h
-@@ -928,6 +928,7 @@ static inline void nand_set_controller_d
- #define NAND_MFR_SANDISK      0x45
- #define NAND_MFR_INTEL                0x89
- #define NAND_MFR_ATO          0x9b
-+#define NAND_MFR_WINBOND      0xef
- /* The maximum expected count of bytes in the NAND ID sequence */
- #define NAND_MAX_ID_LEN 8
diff --git a/target/linux/generic/backport-4.9/063-v4.11-0002-mtd-introduce-function-max_bad_blocks.patch b/target/linux/generic/backport-4.9/063-v4.11-0002-mtd-introduce-function-max_bad_blocks.patch
deleted file mode 100644 (file)
index b2549ca..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-From 6080ef6e7c0a0592cbcca11200d879faf65e27d4 Mon Sep 17 00:00:00 2001
-From: Jeff Westfahl <jeff.westfahl@ni.com>
-Date: Tue, 10 Jan 2017 13:30:17 -0600
-Subject: [PATCH] mtd: introduce function max_bad_blocks
-
-If implemented, 'max_bad_blocks' returns the maximum number of bad
-blocks to reserve for a MTD. An implementation for NAND is coming soon.
-
-Signed-off-by: Jeff Westfahl <jeff.westfahl@ni.com>
-Signed-off-by: Zach Brown <zach.brown@ni.com>
-Acked-by: Boris Brezillon <boris.brezillon@free-electron.com>
-Acked-by: Brian Norris <computersforpeace@gmail.com>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/mtdpart.c   | 10 ++++++++++
- include/linux/mtd/mtd.h | 13 +++++++++++++
- 2 files changed, 23 insertions(+)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -349,6 +349,14 @@ static const struct mtd_ooblayout_ops pa
-       .free = part_ooblayout_free,
- };
-+static int part_max_bad_blocks(struct mtd_info *mtd, loff_t ofs, size_t len)
-+{
-+      struct mtd_part *part = mtd_to_part(mtd);
-+
-+      return part->master->_max_bad_blocks(part->master,
-+                                           ofs + part->offset, len);
-+}
-+
- static inline void free_partition(struct mtd_part *p)
- {
-       kfree(p->mtd.name);
-@@ -475,6 +483,8 @@ static struct mtd_part *allocate_partiti
-               slave->mtd._block_isbad = part_block_isbad;
-       if (master->_block_markbad)
-               slave->mtd._block_markbad = part_block_markbad;
-+      if (master->_max_bad_blocks)
-+              slave->mtd._max_bad_blocks = part_max_bad_blocks;
-       if (master->_get_device)
-               slave->mtd._get_device = part_get_device;
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -322,6 +322,7 @@ struct mtd_info {
-       int (*_block_isreserved) (struct mtd_info *mtd, loff_t ofs);
-       int (*_block_isbad) (struct mtd_info *mtd, loff_t ofs);
-       int (*_block_markbad) (struct mtd_info *mtd, loff_t ofs);
-+      int (*_max_bad_blocks) (struct mtd_info *mtd, loff_t ofs, size_t len);
-       int (*_suspend) (struct mtd_info *mtd);
-       void (*_resume) (struct mtd_info *mtd);
-       void (*_reboot) (struct mtd_info *mtd);
-@@ -397,6 +398,18 @@ static inline u32 mtd_oobavail(struct mt
-       return ops->mode == MTD_OPS_AUTO_OOB ? mtd->oobavail : mtd->oobsize;
- }
-+static inline int mtd_max_bad_blocks(struct mtd_info *mtd,
-+                                   loff_t ofs, size_t len)
-+{
-+      if (!mtd->_max_bad_blocks)
-+              return -ENOTSUPP;
-+
-+      if (mtd->size < (len + ofs) || ofs < 0)
-+              return -EINVAL;
-+
-+      return mtd->_max_bad_blocks(mtd, ofs, len);
-+}
-+
- int mtd_wunit_to_pairing_info(struct mtd_info *mtd, int wunit,
-                             struct mtd_pairing_info *info);
- int mtd_pairing_info_to_wunit(struct mtd_info *mtd,
diff --git a/target/linux/generic/backport-4.9/063-v4.11-0003-mtd-Add-partition-device-node-to-mtd-partition-devic.patch b/target/linux/generic/backport-4.9/063-v4.11-0003-mtd-Add-partition-device-node-to-mtd-partition-devic.patch
deleted file mode 100644 (file)
index ea68fc4..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-From 42e9401bd1467d22c4dc4d2c637347b874e6a80b Mon Sep 17 00:00:00 2001
-From: Sascha Hauer <s.hauer@pengutronix.de>
-Date: Thu, 9 Feb 2017 11:50:24 +0100
-Subject: [PATCH] mtd: Add partition device node to mtd partition devices
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The user visible change here is that mtd partitions get an of_node link
-in sysfs.
-
-Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/mtdpart.c          | 1 +
- drivers/mtd/ofpart.c           | 1 +
- include/linux/mtd/partitions.h | 1 +
- 3 files changed, 3 insertions(+)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -432,6 +432,7 @@ static struct mtd_part *allocate_partiti
-       slave->mtd.dev.parent = IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) ?
-                               &master->dev :
-                               master->dev.parent;
-+      slave->mtd.dev.of_node = part->of_node;
-       slave->mtd._read = part_read;
-       slave->mtd._write = part_write;
---- a/drivers/mtd/ofpart.c
-+++ b/drivers/mtd/ofpart.c
-@@ -108,6 +108,7 @@ static int parse_ofpart_partitions(struc
-               parts[i].offset = of_read_number(reg, a_cells);
-               parts[i].size = of_read_number(reg + a_cells, s_cells);
-+              parts[i].of_node = pp;
-               partname = of_get_property(pp, "label", &len);
-               if (!partname)
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -41,6 +41,7 @@ struct mtd_partition {
-       uint64_t size;                  /* partition size */
-       uint64_t offset;                /* offset within the master MTD space */
-       uint32_t mask_flags;            /* master MTD flags to mask out for this partition */
-+      struct device_node *of_node;
- };
- #define MTDPART_OFS_RETAIN    (-3)
diff --git a/target/linux/generic/backport-4.9/064-v4.12-mtd-spi-nor-enable-stateless-4b-op-codes-for-mx25u25.patch b/target/linux/generic/backport-4.9/064-v4.12-mtd-spi-nor-enable-stateless-4b-op-codes-for-mx25u25.patch
deleted file mode 100644 (file)
index d1544b1..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From b0fcb4b413028376894feaaaf62bcb09ab1b52f2 Mon Sep 17 00:00:00 2001
-From: Mathias Kresin <dev@kresin.me>
-Date: Thu, 13 Apr 2017 09:23:54 +0200
-Subject: [PATCH] mtd: spi-nor: enable stateless 4b op codes for mx25u25635f
-
-All required stateless 4-byte op codes are supported by this flash
-chip. The stateless 4-byte support can't be autodetected due to a
-missing 4-byte Address Instruction Table in SFDP.
-
-Fixes hangs on reboot for SoCs expecting the flash chip in 3byte mode.
-
-Signed-off-by: Mathias Kresin <dev@kresin.me>
-Acked-by: Marek Vasut <marek.vasut@gmail.com>
-Signed-off-by: Cyrille Pitchen <cyrille.pitchen@atmel.com>
----
- drivers/mtd/spi-nor/spi-nor.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1023,7 +1023,7 @@ static const struct flash_info spi_nor_i
-       { "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
-       { "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
-       { "mx25l25635e", INFO(0xc22019, 0, 64 * 1024, 512, 0) },
--      { "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K) },
-+      { "mx25u25635f", INFO(0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_4B_OPCODES) },
-       { "mx25l25655e", INFO(0xc22619, 0, 64 * 1024, 512, 0) },
-       { "mx66l51235l", INFO(0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_QUAD_READ) },
-       { "mx66l1g55g",  INFO(0xc2261b, 0, 64 * 1024, 2048, SPI_NOR_QUAD_READ) },
diff --git a/target/linux/generic/backport-4.9/065-v4.13-0001-mtd-handle-partitioning-on-devices-with-0-erasesize.patch b/target/linux/generic/backport-4.9/065-v4.13-0001-mtd-handle-partitioning-on-devices-with-0-erasesize.patch
deleted file mode 100644 (file)
index d912811..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-From 1eeef2d7483a7e3f8d2dd2a5b9939b3b814dc549 Mon Sep 17 00:00:00 2001
-From: Chris Packham <chris.packham@alliedtelesis.co.nz>
-Date: Fri, 9 Jun 2017 15:58:31 +1200
-Subject: [PATCH] mtd: handle partitioning on devices with 0 erasesize
-
-erasesize is meaningful for flash devices but for SRAM there is no
-concept of an erase block so erasesize is set to 0. When partitioning
-these devices instead of ensuring partitions fall on erasesize
-boundaries we ensure they fall on writesize boundaries.
-
-Helped-by: Boris Brezillon <boris.brezillon@free-electrons.com>
-Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
-Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/mtdpart.c | 26 +++++++++++++++++---------
- 1 file changed, 17 insertions(+), 9 deletions(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -393,8 +393,12 @@ static struct mtd_part *allocate_partiti
-                       const struct mtd_partition *part, int partno,
-                       uint64_t cur_offset)
- {
-+      int wr_alignment = (master->flags & MTD_NO_ERASE) ? master->writesize:
-+                                                          master->erasesize;
-       struct mtd_part *slave;
-+      u32 remainder;
-       char *name;
-+      u64 tmp;
-       /* allocate the partition structure */
-       slave = kzalloc(sizeof(*slave), GFP_KERNEL);
-@@ -499,10 +503,11 @@ static struct mtd_part *allocate_partiti
-       if (slave->offset == MTDPART_OFS_APPEND)
-               slave->offset = cur_offset;
-       if (slave->offset == MTDPART_OFS_NXTBLK) {
-+              tmp = cur_offset;
-               slave->offset = cur_offset;
--              if (mtd_mod_by_eb(cur_offset, master) != 0) {
--                      /* Round up to next erasesize */
--                      slave->offset = (mtd_div_by_eb(cur_offset, master) + 1) * master->erasesize;
-+              remainder = do_div(tmp, wr_alignment);
-+              if (remainder) {
-+                      slave->offset += wr_alignment - remainder;
-                       printk(KERN_NOTICE "Moving partition %d: "
-                              "0x%012llx -> 0x%012llx\n", partno,
-                              (unsigned long long)cur_offset, (unsigned long long)slave->offset);
-@@ -567,19 +572,22 @@ static struct mtd_part *allocate_partiti
-               slave->mtd.erasesize = master->erasesize;
-       }
--      if ((slave->mtd.flags & MTD_WRITEABLE) &&
--          mtd_mod_by_eb(slave->offset, &slave->mtd)) {
-+      tmp = 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 */
-               /* FIXME: Let it be writable if it is on a boundary of
-                * _minor_ erase size though */
-               slave->mtd.flags &= ~MTD_WRITEABLE;
--              printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase block boundary -- force read-only\n",
-+              printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n",
-                       part->name);
-       }
--      if ((slave->mtd.flags & MTD_WRITEABLE) &&
--          mtd_mod_by_eb(slave->mtd.size, &slave->mtd)) {
-+
-+      tmp = slave->mtd.size;
-+      remainder = do_div(tmp, wr_alignment);
-+      if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
-               slave->mtd.flags &= ~MTD_WRITEABLE;
--              printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase block -- force read-only\n",
-+              printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n",
-                       part->name);
-       }
diff --git a/target/linux/generic/backport-4.9/065-v4.13-0002-mtd-partitions-factor-out-code-calling-parser.patch b/target/linux/generic/backport-4.9/065-v4.13-0002-mtd-partitions-factor-out-code-calling-parser.patch
deleted file mode 100644 (file)
index 70c1462..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-From 01f9c7240a900d5676a8496496f2974dd36996b1 Mon Sep 17 00:00:00 2001
-From: Brian Norris <computersforpeace@gmail.com>
-Date: Tue, 23 May 2017 07:30:20 +0200
-Subject: [PATCH] mtd: partitions: factor out code calling parser
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This code is going to be reused for parsers matched using OF so let's
-factor it out to make this easier.
-
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Acked-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/mtdpart.c | 33 ++++++++++++++++++++++++---------
- 1 file changed, 24 insertions(+), 9 deletions(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -832,6 +832,27 @@ static const char * const default_mtd_pa
-       NULL
- };
-+static int mtd_part_do_parse(struct mtd_part_parser *parser,
-+                           struct mtd_info *master,
-+                           struct mtd_partitions *pparts,
-+                           struct mtd_part_parser_data *data)
-+{
-+      int ret;
-+
-+      ret = (*parser->parse_fn)(master, &pparts->parts, data);
-+      pr_debug("%s: parser %s: %i\n", master->name, parser->name, ret);
-+      if (ret <= 0)
-+              return ret;
-+
-+      pr_notice("%d %s partitions found on MTD device %s\n", ret,
-+                parser->name, master->name);
-+
-+      pparts->nr_parts = ret;
-+      pparts->parser = parser;
-+
-+      return ret;
-+}
-+
- /**
-  * parse_mtd_partitions - parse MTD partitions
-  * @master: the master partition (describes whole MTD device)
-@@ -872,16 +893,10 @@ int parse_mtd_partitions(struct mtd_info
-                        parser ? parser->name : NULL);
-               if (!parser)
-                       continue;
--              ret = (*parser->parse_fn)(master, &pparts->parts, data);
--              pr_debug("%s: parser %s: %i\n",
--                       master->name, parser->name, ret);
--              if (ret > 0) {
--                      printk(KERN_NOTICE "%d %s partitions found on MTD device %s\n",
--                             ret, parser->name, master->name);
--                      pparts->nr_parts = ret;
--                      pparts->parser = parser;
-+              ret = mtd_part_do_parse(parser, master, pparts, data);
-+              /* Found partitions! */
-+              if (ret > 0)
-                       return 0;
--              }
-               mtd_part_parser_put(parser);
-               /*
-                * Stash the first error we see; only report it if no parser
diff --git a/target/linux/generic/backport-4.9/065-v4.13-0003-mtd-partitions-add-helper-for-deleting-partition.patch b/target/linux/generic/backport-4.9/065-v4.13-0003-mtd-partitions-add-helper-for-deleting-partition.patch
deleted file mode 100644 (file)
index dea64a1..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-From 08263a9ae664b24fa777d20b365601534842b236 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 21 Jun 2017 08:26:42 +0200
-Subject: [PATCH] mtd: partitions: add helper for deleting partition
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-There are two similar functions handling deletion. One handles single
-partition and another the whole MTD flash device. They share (duplicate)
-some code so it makes sense to add a small helper for that part.
-
-Function del_mtd_partitions has been moved a bit to keep all deleting
-stuff together.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/mtdpart.c | 75 +++++++++++++++++++++++++++++----------------------
- 1 file changed, 43 insertions(+), 32 deletions(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -363,32 +363,6 @@ static inline void free_partition(struct
-       kfree(p);
- }
--/*
-- * This function unregisters and destroy all slave MTD objects which are
-- * attached to the given master MTD object.
-- */
--
--int del_mtd_partitions(struct mtd_info *master)
--{
--      struct mtd_part *slave, *next;
--      int ret, err = 0;
--
--      mutex_lock(&mtd_partitions_mutex);
--      list_for_each_entry_safe(slave, next, &mtd_partitions, list)
--              if (slave->master == master) {
--                      ret = del_mtd_device(&slave->mtd);
--                      if (ret < 0) {
--                              err = ret;
--                              continue;
--                      }
--                      list_del(&slave->list);
--                      free_partition(slave);
--              }
--      mutex_unlock(&mtd_partitions_mutex);
--
--      return err;
--}
--
- static struct mtd_part *allocate_partition(struct mtd_info *master,
-                       const struct mtd_partition *part, int partno,
-                       uint64_t cur_offset)
-@@ -686,6 +660,48 @@ err_remove_part:
- }
- EXPORT_SYMBOL_GPL(mtd_add_partition);
-+/**
-+ * __mtd_del_partition - delete MTD partition
-+ *
-+ * @priv: internal MTD struct for partition to be deleted
-+ *
-+ * This function must be called with the partitions mutex locked.
-+ */
-+static int __mtd_del_partition(struct mtd_part *priv)
-+{
-+      int err;
-+
-+      err = del_mtd_device(&priv->mtd);
-+      if (err)
-+              return err;
-+
-+      list_del(&priv->list);
-+      free_partition(priv);
-+
-+      return 0;
-+}
-+
-+/*
-+ * This function unregisters and destroy all slave MTD objects which are
-+ * attached to the given master MTD object.
-+ */
-+int del_mtd_partitions(struct mtd_info *master)
-+{
-+      struct mtd_part *slave, *next;
-+      int ret, err = 0;
-+
-+      mutex_lock(&mtd_partitions_mutex);
-+      list_for_each_entry_safe(slave, next, &mtd_partitions, list)
-+              if (slave->master == master) {
-+                      ret = __mtd_del_partition(slave);
-+                      if (ret < 0)
-+                              err = ret;
-+              }
-+      mutex_unlock(&mtd_partitions_mutex);
-+
-+      return err;
-+}
-+
- int mtd_del_partition(struct mtd_info *master, int partno)
- {
-       struct mtd_part *slave, *next;
-@@ -697,12 +713,7 @@ int mtd_del_partition(struct mtd_info *m
-                   (slave->mtd.index == partno)) {
-                       sysfs_remove_files(&slave->mtd.dev.kobj,
-                                          mtd_partition_attrs);
--                      ret = del_mtd_device(&slave->mtd);
--                      if (ret < 0)
--                              break;
--
--                      list_del(&slave->list);
--                      free_partition(slave);
-+                      ret = __mtd_del_partition(slave);
-                       break;
-               }
-       mutex_unlock(&mtd_partitions_mutex);
diff --git a/target/linux/generic/backport-4.9/065-v4.13-0004-mtd-partitions-remove-sysfs-files-when-deleting-all-.patch b/target/linux/generic/backport-4.9/065-v4.13-0004-mtd-partitions-remove-sysfs-files-when-deleting-all-.patch
deleted file mode 100644 (file)
index 72edb25..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-From c5ceaba74083daf619bdb34d4871e297a177eebf Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 21 Jun 2017 08:26:43 +0200
-Subject: [PATCH] mtd: partitions: remove sysfs files when deleting all
- master's partitions
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-When support for sysfs "offset" file was added it missed to update the
-del_mtd_partitions function. It deletes partitions just like
-mtd_del_partition does so both should also take care of removing sysfs
-files.
-
-This change moves sysfs_remove_files call to the shared function to fix
-this issue.
-
-Fixes: a62c24d755291 ("mtd: part: Add sysfs variable for offset of partition")
-Cc: Dan Ehrenberg <dehrenberg@chromium.org>
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/mtdpart.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -671,6 +671,8 @@ static int __mtd_del_partition(struct mt
- {
-       int err;
-+      sysfs_remove_files(&priv->mtd.dev.kobj, mtd_partition_attrs);
-+
-       err = del_mtd_device(&priv->mtd);
-       if (err)
-               return err;
-@@ -711,8 +713,6 @@ int mtd_del_partition(struct mtd_info *m
-       list_for_each_entry_safe(slave, next, &mtd_partitions, list)
-               if ((slave->master == master) &&
-                   (slave->mtd.index == partno)) {
--                      sysfs_remove_files(&slave->mtd.dev.kobj,
--                                         mtd_partition_attrs);
-                       ret = __mtd_del_partition(slave);
-                       break;
-               }
diff --git a/target/linux/generic/backport-4.9/065-v4.13-0005-mtd-partitions-rename-master-to-the-parent-where-app.patch b/target/linux/generic/backport-4.9/065-v4.13-0005-mtd-partitions-rename-master-to-the-parent-where-app.patch
deleted file mode 100644 (file)
index 490eaa2..0000000
+++ /dev/null
@@ -1,606 +0,0 @@
-From 0a9d72b69da6d8dae1abd7990c6c4c749846ef3e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 21 Jun 2017 08:26:44 +0200
-Subject: [PATCH] mtd: partitions: rename "master" to the "parent" where
- appropriate
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This prepares mtd subsystem for the new feature: subpartitions. In some
-cases flash device partition can be a container with extra subpartitions
-(volumes).
-
-So far there was a flat structure implemented. One master (flash device)
-could be partitioned into few partitions. Every partition got its master
-and it was enough to get things running.
-
-To support subpartitions we need to store pointer to the parent for each
-partition. This is required to implement more natural tree structure and
-handle all recursion and offsets calculation.
-
-To make code consistent this patch renamed "master" to the "parent" in
-places where we can be dealing with subpartitions.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/mtdpart.c | 204 ++++++++++++++++++++++++++------------------------
- 1 file changed, 105 insertions(+), 99 deletions(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -37,10 +37,16 @@
- static LIST_HEAD(mtd_partitions);
- static DEFINE_MUTEX(mtd_partitions_mutex);
--/* Our partition node structure */
-+/**
-+ * struct mtd_part - our partition node structure
-+ *
-+ * @mtd: struct holding partition details
-+ * @parent: parent mtd - flash device or another partition
-+ * @offset: partition offset relative to the *flash device*
-+ */
- struct mtd_part {
-       struct mtd_info mtd;
--      struct mtd_info *master;
-+      struct mtd_info *parent;
-       uint64_t offset;
-       struct list_head list;
- };
-@@ -67,15 +73,15 @@ static int part_read(struct mtd_info *mt
-       struct mtd_ecc_stats stats;
-       int res;
--      stats = part->master->ecc_stats;
--      res = part->master->_read(part->master, from + part->offset, len,
-+      stats = part->parent->ecc_stats;
-+      res = part->parent->_read(part->parent, from + part->offset, len,
-                                 retlen, buf);
-       if (unlikely(mtd_is_eccerr(res)))
-               mtd->ecc_stats.failed +=
--                      part->master->ecc_stats.failed - stats.failed;
-+                      part->parent->ecc_stats.failed - stats.failed;
-       else
-               mtd->ecc_stats.corrected +=
--                      part->master->ecc_stats.corrected - stats.corrected;
-+                      part->parent->ecc_stats.corrected - stats.corrected;
-       return res;
- }
-@@ -84,7 +90,7 @@ static int part_point(struct mtd_info *m
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_point(part->master, from + part->offset, len,
-+      return part->parent->_point(part->parent, from + part->offset, len,
-                                   retlen, virt, phys);
- }
-@@ -92,7 +98,7 @@ static int part_unpoint(struct mtd_info
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_unpoint(part->master, from + part->offset, len);
-+      return part->parent->_unpoint(part->parent, from + part->offset, len);
- }
- static unsigned long part_get_unmapped_area(struct mtd_info *mtd,
-@@ -103,7 +109,7 @@ static unsigned long part_get_unmapped_a
-       struct mtd_part *part = mtd_to_part(mtd);
-       offset += part->offset;
--      return part->master->_get_unmapped_area(part->master, len, offset,
-+      return part->parent->_get_unmapped_area(part->parent, len, offset,
-                                               flags);
- }
-@@ -132,7 +138,7 @@ static int part_read_oob(struct mtd_info
-                       return -EINVAL;
-       }
--      res = part->master->_read_oob(part->master, from + part->offset, ops);
-+      res = part->parent->_read_oob(part->parent, from + part->offset, ops);
-       if (unlikely(res)) {
-               if (mtd_is_bitflip(res))
-                       mtd->ecc_stats.corrected++;
-@@ -146,7 +152,7 @@ static int part_read_user_prot_reg(struc
-               size_t len, size_t *retlen, u_char *buf)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_read_user_prot_reg(part->master, from, len,
-+      return part->parent->_read_user_prot_reg(part->parent, from, len,
-                                                retlen, buf);
- }
-@@ -154,7 +160,7 @@ static int part_get_user_prot_info(struc
-                                  size_t *retlen, struct otp_info *buf)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_get_user_prot_info(part->master, len, retlen,
-+      return part->parent->_get_user_prot_info(part->parent, len, retlen,
-                                                buf);
- }
-@@ -162,7 +168,7 @@ static int part_read_fact_prot_reg(struc
-               size_t len, size_t *retlen, u_char *buf)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_read_fact_prot_reg(part->master, from, len,
-+      return part->parent->_read_fact_prot_reg(part->parent, from, len,
-                                                retlen, buf);
- }
-@@ -170,7 +176,7 @@ static int part_get_fact_prot_info(struc
-                                  size_t *retlen, struct otp_info *buf)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_get_fact_prot_info(part->master, len, retlen,
-+      return part->parent->_get_fact_prot_info(part->parent, len, retlen,
-                                                buf);
- }
-@@ -178,7 +184,7 @@ static int part_write(struct mtd_info *m
-               size_t *retlen, const u_char *buf)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_write(part->master, to + part->offset, len,
-+      return part->parent->_write(part->parent, to + part->offset, len,
-                                   retlen, buf);
- }
-@@ -186,7 +192,7 @@ static int part_panic_write(struct mtd_i
-               size_t *retlen, const u_char *buf)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_panic_write(part->master, to + part->offset, len,
-+      return part->parent->_panic_write(part->parent, to + part->offset, len,
-                                         retlen, buf);
- }
-@@ -199,14 +205,14 @@ static int part_write_oob(struct mtd_inf
-               return -EINVAL;
-       if (ops->datbuf && to + ops->len > mtd->size)
-               return -EINVAL;
--      return part->master->_write_oob(part->master, to + part->offset, ops);
-+      return part->parent->_write_oob(part->parent, to + part->offset, ops);
- }
- static int part_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
-               size_t len, size_t *retlen, u_char *buf)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_write_user_prot_reg(part->master, from, len,
-+      return part->parent->_write_user_prot_reg(part->parent, from, len,
-                                                 retlen, buf);
- }
-@@ -214,14 +220,14 @@ static int part_lock_user_prot_reg(struc
-               size_t len)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_lock_user_prot_reg(part->master, from, len);
-+      return part->parent->_lock_user_prot_reg(part->parent, from, len);
- }
- static int part_writev(struct mtd_info *mtd, const struct kvec *vecs,
-               unsigned long count, loff_t to, size_t *retlen)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_writev(part->master, vecs, count,
-+      return part->parent->_writev(part->parent, vecs, count,
-                                    to + part->offset, retlen);
- }
-@@ -231,7 +237,7 @@ static int part_erase(struct mtd_info *m
-       int ret;
-       instr->addr += part->offset;
--      ret = part->master->_erase(part->master, instr);
-+      ret = part->parent->_erase(part->parent, instr);
-       if (ret) {
-               if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
-                       instr->fail_addr -= part->offset;
-@@ -257,51 +263,51 @@ EXPORT_SYMBOL_GPL(mtd_erase_callback);
- static int part_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_lock(part->master, ofs + part->offset, len);
-+      return part->parent->_lock(part->parent, ofs + part->offset, len);
- }
- static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_unlock(part->master, ofs + part->offset, len);
-+      return part->parent->_unlock(part->parent, ofs + part->offset, len);
- }
- static int part_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_is_locked(part->master, ofs + part->offset, len);
-+      return part->parent->_is_locked(part->parent, ofs + part->offset, len);
- }
- static void part_sync(struct mtd_info *mtd)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      part->master->_sync(part->master);
-+      part->parent->_sync(part->parent);
- }
- static int part_suspend(struct mtd_info *mtd)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_suspend(part->master);
-+      return part->parent->_suspend(part->parent);
- }
- static void part_resume(struct mtd_info *mtd)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      part->master->_resume(part->master);
-+      part->parent->_resume(part->parent);
- }
- static int part_block_isreserved(struct mtd_info *mtd, loff_t ofs)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
-       ofs += part->offset;
--      return part->master->_block_isreserved(part->master, ofs);
-+      return part->parent->_block_isreserved(part->parent, ofs);
- }
- static int part_block_isbad(struct mtd_info *mtd, loff_t ofs)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
-       ofs += part->offset;
--      return part->master->_block_isbad(part->master, ofs);
-+      return part->parent->_block_isbad(part->parent, ofs);
- }
- static int part_block_markbad(struct mtd_info *mtd, loff_t ofs)
-@@ -310,7 +316,7 @@ static int part_block_markbad(struct mtd
-       int res;
-       ofs += part->offset;
--      res = part->master->_block_markbad(part->master, ofs);
-+      res = part->parent->_block_markbad(part->parent, ofs);
-       if (!res)
-               mtd->ecc_stats.badblocks++;
-       return res;
-@@ -319,13 +325,13 @@ static int part_block_markbad(struct mtd
- static int part_get_device(struct mtd_info *mtd)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_get_device(part->master);
-+      return part->parent->_get_device(part->parent);
- }
- static void part_put_device(struct mtd_info *mtd)
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      part->master->_put_device(part->master);
-+      part->parent->_put_device(part->parent);
- }
- static int part_ooblayout_ecc(struct mtd_info *mtd, int section,
-@@ -333,7 +339,7 @@ static int part_ooblayout_ecc(struct mtd
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return mtd_ooblayout_ecc(part->master, section, oobregion);
-+      return mtd_ooblayout_ecc(part->parent, section, oobregion);
- }
- static int part_ooblayout_free(struct mtd_info *mtd, int section,
-@@ -341,7 +347,7 @@ static int part_ooblayout_free(struct mt
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return mtd_ooblayout_free(part->master, section, oobregion);
-+      return mtd_ooblayout_free(part->parent, section, oobregion);
- }
- static const struct mtd_ooblayout_ops part_ooblayout_ops = {
-@@ -353,7 +359,7 @@ static int part_max_bad_blocks(struct mt
- {
-       struct mtd_part *part = mtd_to_part(mtd);
--      return part->master->_max_bad_blocks(part->master,
-+      return part->parent->_max_bad_blocks(part->parent,
-                                            ofs + part->offset, len);
- }
-@@ -363,12 +369,12 @@ static inline void free_partition(struct
-       kfree(p);
- }
--static struct mtd_part *allocate_partition(struct mtd_info *master,
-+static struct mtd_part *allocate_partition(struct mtd_info *parent,
-                       const struct mtd_partition *part, int partno,
-                       uint64_t cur_offset)
- {
--      int wr_alignment = (master->flags & MTD_NO_ERASE) ? master->writesize:
--                                                          master->erasesize;
-+      int wr_alignment = (parent->flags & MTD_NO_ERASE) ? parent->writesize:
-+                                                          parent->erasesize;
-       struct mtd_part *slave;
-       u32 remainder;
-       char *name;
-@@ -379,25 +385,25 @@ static struct mtd_part *allocate_partiti
-       name = kstrdup(part->name, GFP_KERNEL);
-       if (!name || !slave) {
-               printk(KERN_ERR"memory allocation error while creating partitions for \"%s\"\n",
--                     master->name);
-+                     parent->name);
-               kfree(name);
-               kfree(slave);
-               return ERR_PTR(-ENOMEM);
-       }
-       /* set up the MTD object for this partition */
--      slave->mtd.type = master->type;
--      slave->mtd.flags = master->flags & ~part->mask_flags;
-+      slave->mtd.type = parent->type;
-+      slave->mtd.flags = parent->flags & ~part->mask_flags;
-       slave->mtd.size = part->size;
--      slave->mtd.writesize = master->writesize;
--      slave->mtd.writebufsize = master->writebufsize;
--      slave->mtd.oobsize = master->oobsize;
--      slave->mtd.oobavail = master->oobavail;
--      slave->mtd.subpage_sft = master->subpage_sft;
--      slave->mtd.pairing = master->pairing;
-+      slave->mtd.writesize = parent->writesize;
-+      slave->mtd.writebufsize = parent->writebufsize;
-+      slave->mtd.oobsize = parent->oobsize;
-+      slave->mtd.oobavail = parent->oobavail;
-+      slave->mtd.subpage_sft = parent->subpage_sft;
-+      slave->mtd.pairing = parent->pairing;
-       slave->mtd.name = name;
--      slave->mtd.owner = master->owner;
-+      slave->mtd.owner = parent->owner;
-       /* NOTE: Historically, we didn't arrange MTDs as a tree out of
-        * concern for showing the same data in multiple partitions.
-@@ -408,70 +414,70 @@ static struct mtd_part *allocate_partiti
-        * distinguish between the master and the partition in sysfs.
-        */
-       slave->mtd.dev.parent = IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) ?
--                              &master->dev :
--                              master->dev.parent;
-+                              &parent->dev :
-+                              parent->dev.parent;
-       slave->mtd.dev.of_node = part->of_node;
-       slave->mtd._read = part_read;
-       slave->mtd._write = part_write;
--      if (master->_panic_write)
-+      if (parent->_panic_write)
-               slave->mtd._panic_write = part_panic_write;
--      if (master->_point && master->_unpoint) {
-+      if (parent->_point && parent->_unpoint) {
-               slave->mtd._point = part_point;
-               slave->mtd._unpoint = part_unpoint;
-       }
--      if (master->_get_unmapped_area)
-+      if (parent->_get_unmapped_area)
-               slave->mtd._get_unmapped_area = part_get_unmapped_area;
--      if (master->_read_oob)
-+      if (parent->_read_oob)
-               slave->mtd._read_oob = part_read_oob;
--      if (master->_write_oob)
-+      if (parent->_write_oob)
-               slave->mtd._write_oob = part_write_oob;
--      if (master->_read_user_prot_reg)
-+      if (parent->_read_user_prot_reg)
-               slave->mtd._read_user_prot_reg = part_read_user_prot_reg;
--      if (master->_read_fact_prot_reg)
-+      if (parent->_read_fact_prot_reg)
-               slave->mtd._read_fact_prot_reg = part_read_fact_prot_reg;
--      if (master->_write_user_prot_reg)
-+      if (parent->_write_user_prot_reg)
-               slave->mtd._write_user_prot_reg = part_write_user_prot_reg;
--      if (master->_lock_user_prot_reg)
-+      if (parent->_lock_user_prot_reg)
-               slave->mtd._lock_user_prot_reg = part_lock_user_prot_reg;
--      if (master->_get_user_prot_info)
-+      if (parent->_get_user_prot_info)
-               slave->mtd._get_user_prot_info = part_get_user_prot_info;
--      if (master->_get_fact_prot_info)
-+      if (parent->_get_fact_prot_info)
-               slave->mtd._get_fact_prot_info = part_get_fact_prot_info;
--      if (master->_sync)
-+      if (parent->_sync)
-               slave->mtd._sync = part_sync;
--      if (!partno && !master->dev.class && master->_suspend &&
--          master->_resume) {
-+      if (!partno && !parent->dev.class && parent->_suspend &&
-+          parent->_resume) {
-                       slave->mtd._suspend = part_suspend;
-                       slave->mtd._resume = part_resume;
-       }
--      if (master->_writev)
-+      if (parent->_writev)
-               slave->mtd._writev = part_writev;
--      if (master->_lock)
-+      if (parent->_lock)
-               slave->mtd._lock = part_lock;
--      if (master->_unlock)
-+      if (parent->_unlock)
-               slave->mtd._unlock = part_unlock;
--      if (master->_is_locked)
-+      if (parent->_is_locked)
-               slave->mtd._is_locked = part_is_locked;
--      if (master->_block_isreserved)
-+      if (parent->_block_isreserved)
-               slave->mtd._block_isreserved = part_block_isreserved;
--      if (master->_block_isbad)
-+      if (parent->_block_isbad)
-               slave->mtd._block_isbad = part_block_isbad;
--      if (master->_block_markbad)
-+      if (parent->_block_markbad)
-               slave->mtd._block_markbad = part_block_markbad;
--      if (master->_max_bad_blocks)
-+      if (parent->_max_bad_blocks)
-               slave->mtd._max_bad_blocks = part_max_bad_blocks;
--      if (master->_get_device)
-+      if (parent->_get_device)
-               slave->mtd._get_device = part_get_device;
--      if (master->_put_device)
-+      if (parent->_put_device)
-               slave->mtd._put_device = part_put_device;
-       slave->mtd._erase = part_erase;
--      slave->master = master;
-+      slave->parent = parent;
-       slave->offset = part->offset;
-       if (slave->offset == MTDPART_OFS_APPEND)
-@@ -489,25 +495,25 @@ static struct mtd_part *allocate_partiti
-       }
-       if (slave->offset == MTDPART_OFS_RETAIN) {
-               slave->offset = cur_offset;
--              if (master->size - slave->offset >= slave->mtd.size) {
--                      slave->mtd.size = master->size - slave->offset
-+              if (parent->size - slave->offset >= slave->mtd.size) {
-+                      slave->mtd.size = parent->size - slave->offset
-                                                       - slave->mtd.size;
-               } else {
-                       printk(KERN_ERR "mtd partition \"%s\" doesn't have enough space: %#llx < %#llx, disabled\n",
--                              part->name, master->size - slave->offset,
-+                              part->name, parent->size - slave->offset,
-                               slave->mtd.size);
-                       /* register to preserve ordering */
-                       goto out_register;
-               }
-       }
-       if (slave->mtd.size == MTDPART_SIZ_FULL)
--              slave->mtd.size = master->size - slave->offset;
-+              slave->mtd.size = parent->size - slave->offset;
-       printk(KERN_NOTICE "0x%012llx-0x%012llx : \"%s\"\n", (unsigned long long)slave->offset,
-               (unsigned long long)(slave->offset + slave->mtd.size), slave->mtd.name);
-       /* let's do some sanity checks */
--      if (slave->offset >= master->size) {
-+      if (slave->offset >= parent->size) {
-               /* let's register it anyway to preserve ordering */
-               slave->offset = 0;
-               slave->mtd.size = 0;
-@@ -515,16 +521,16 @@ static struct mtd_part *allocate_partiti
-                       part->name);
-               goto out_register;
-       }
--      if (slave->offset + slave->mtd.size > master->size) {
--              slave->mtd.size = master->size - slave->offset;
-+      if (slave->offset + slave->mtd.size > parent->size) {
-+              slave->mtd.size = parent->size - slave->offset;
-               printk(KERN_WARNING"mtd: partition \"%s\" extends beyond the end of device \"%s\" -- size truncated to %#llx\n",
--                      part->name, master->name, (unsigned long long)slave->mtd.size);
-+                      part->name, parent->name, (unsigned long long)slave->mtd.size);
-       }
--      if (master->numeraseregions > 1) {
-+      if (parent->numeraseregions > 1) {
-               /* Deal with variable erase size stuff */
--              int i, max = master->numeraseregions;
-+              int i, max = parent->numeraseregions;
-               u64 end = slave->offset + slave->mtd.size;
--              struct mtd_erase_region_info *regions = master->eraseregions;
-+              struct mtd_erase_region_info *regions = parent->eraseregions;
-               /* Find the first erase regions which is part of this
-                * partition. */
-@@ -543,7 +549,7 @@ static struct mtd_part *allocate_partiti
-               BUG_ON(slave->mtd.erasesize == 0);
-       } else {
-               /* Single erase size */
--              slave->mtd.erasesize = master->erasesize;
-+              slave->mtd.erasesize = parent->erasesize;
-       }
-       tmp = slave->offset;
-@@ -566,17 +572,17 @@ static struct mtd_part *allocate_partiti
-       }
-       mtd_set_ooblayout(&slave->mtd, &part_ooblayout_ops);
--      slave->mtd.ecc_step_size = master->ecc_step_size;
--      slave->mtd.ecc_strength = master->ecc_strength;
--      slave->mtd.bitflip_threshold = master->bitflip_threshold;
-+      slave->mtd.ecc_step_size = parent->ecc_step_size;
-+      slave->mtd.ecc_strength = parent->ecc_strength;
-+      slave->mtd.bitflip_threshold = parent->bitflip_threshold;
--      if (master->_block_isbad) {
-+      if (parent->_block_isbad) {
-               uint64_t offs = 0;
-               while (offs < slave->mtd.size) {
--                      if (mtd_block_isreserved(master, offs + slave->offset))
-+                      if (mtd_block_isreserved(parent, offs + slave->offset))
-                               slave->mtd.ecc_stats.bbtblocks++;
--                      else if (mtd_block_isbad(master, offs + slave->offset))
-+                      else if (mtd_block_isbad(parent, offs + slave->offset))
-                               slave->mtd.ecc_stats.badblocks++;
-                       offs += slave->mtd.erasesize;
-               }
-@@ -610,7 +616,7 @@ static int mtd_add_partition_attrs(struc
-       return ret;
- }
--int mtd_add_partition(struct mtd_info *master, const char *name,
-+int mtd_add_partition(struct mtd_info *parent, const char *name,
-                     long long offset, long long length)
- {
-       struct mtd_partition part;
-@@ -623,7 +629,7 @@ int mtd_add_partition(struct mtd_info *m
-               return -EINVAL;
-       if (length == MTDPART_SIZ_FULL)
--              length = master->size - offset;
-+              length = parent->size - offset;
-       if (length <= 0)
-               return -EINVAL;
-@@ -633,7 +639,7 @@ int mtd_add_partition(struct mtd_info *m
-       part.size = length;
-       part.offset = offset;
--      new = allocate_partition(master, &part, -1, offset);
-+      new = allocate_partition(parent, &part, -1, offset);
-       if (IS_ERR(new))
-               return PTR_ERR(new);
-@@ -694,7 +700,7 @@ int del_mtd_partitions(struct mtd_info *
-       mutex_lock(&mtd_partitions_mutex);
-       list_for_each_entry_safe(slave, next, &mtd_partitions, list)
--              if (slave->master == master) {
-+              if (slave->parent == master) {
-                       ret = __mtd_del_partition(slave);
-                       if (ret < 0)
-                               err = ret;
-@@ -711,7 +717,7 @@ int mtd_del_partition(struct mtd_info *m
-       mutex_lock(&mtd_partitions_mutex);
-       list_for_each_entry_safe(slave, next, &mtd_partitions, list)
--              if ((slave->master == master) &&
-+              if ((slave->parent == master) &&
-                   (slave->mtd.index == partno)) {
-                       ret = __mtd_del_partition(slave);
-                       break;
-@@ -958,6 +964,6 @@ uint64_t mtd_get_device_size(const struc
-       if (!mtd_is_partition(mtd))
-               return mtd->size;
--      return mtd_to_part(mtd)->master->size;
-+      return mtd_to_part(mtd)->parent->size;
- }
- EXPORT_SYMBOL_GPL(mtd_get_device_size);
diff --git a/target/linux/generic/backport-4.9/065-v4.13-0006-mtd-partitions-add-support-for-subpartitions.patch b/target/linux/generic/backport-4.9/065-v4.13-0006-mtd-partitions-add-support-for-subpartitions.patch
deleted file mode 100644 (file)
index 578e59a..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-From 97519dc52b44af054d7654776e78eaa211cf1842 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 21 Jun 2017 08:26:45 +0200
-Subject: [PATCH] mtd: partitions: add support for subpartitions
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Some flash device partitions can be containers with extra subpartitions
-(volumes). All callbacks are already capable of this additional level of
-indirection.
-
-This patch makes sure we always display subpartitions using a tree
-structure and takes care of deleting subpartitions when parent gets
-removed.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/mtdpart.c | 23 ++++++++++++++++-------
- 1 file changed, 16 insertions(+), 7 deletions(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -413,7 +413,7 @@ static struct mtd_part *allocate_partiti
-        * parent conditional on that option. Note, this is a way to
-        * distinguish between the master and the partition in sysfs.
-        */
--      slave->mtd.dev.parent = IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) ?
-+      slave->mtd.dev.parent = IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) || mtd_is_partition(parent) ?
-                               &parent->dev :
-                               parent->dev.parent;
-       slave->mtd.dev.of_node = part->of_node;
-@@ -675,8 +675,17 @@ EXPORT_SYMBOL_GPL(mtd_add_partition);
-  */
- static int __mtd_del_partition(struct mtd_part *priv)
- {
-+      struct mtd_part *child, *next;
-       int err;
-+      list_for_each_entry_safe(child, next, &mtd_partitions, list) {
-+              if (child->parent == &priv->mtd) {
-+                      err = __mtd_del_partition(child);
-+                      if (err)
-+                              return err;
-+              }
-+      }
-+
-       sysfs_remove_files(&priv->mtd.dev.kobj, mtd_partition_attrs);
-       err = del_mtd_device(&priv->mtd);
-@@ -691,16 +700,16 @@ static int __mtd_del_partition(struct mt
- /*
-  * This function unregisters and destroy all slave MTD objects which are
-- * attached to the given master MTD object.
-+ * attached to the given MTD object.
-  */
--int del_mtd_partitions(struct mtd_info *master)
-+int del_mtd_partitions(struct mtd_info *mtd)
- {
-       struct mtd_part *slave, *next;
-       int ret, err = 0;
-       mutex_lock(&mtd_partitions_mutex);
-       list_for_each_entry_safe(slave, next, &mtd_partitions, list)
--              if (slave->parent == master) {
-+              if (slave->parent == mtd) {
-                       ret = __mtd_del_partition(slave);
-                       if (ret < 0)
-                               err = ret;
-@@ -710,14 +719,14 @@ int del_mtd_partitions(struct mtd_info *
-       return err;
- }
--int mtd_del_partition(struct mtd_info *master, int partno)
-+int mtd_del_partition(struct mtd_info *mtd, int partno)
- {
-       struct mtd_part *slave, *next;
-       int ret = -EINVAL;
-       mutex_lock(&mtd_partitions_mutex);
-       list_for_each_entry_safe(slave, next, &mtd_partitions, list)
--              if ((slave->parent == master) &&
-+              if ((slave->parent == mtd) &&
-                   (slave->mtd.index == partno)) {
-                       ret = __mtd_del_partition(slave);
-                       break;
-@@ -964,6 +973,6 @@ uint64_t mtd_get_device_size(const struc
-       if (!mtd_is_partition(mtd))
-               return mtd->size;
--      return mtd_to_part(mtd)->parent->size;
-+      return mtd_get_device_size(mtd_to_part(mtd)->parent);
- }
- EXPORT_SYMBOL_GPL(mtd_get_device_size);
diff --git a/target/linux/generic/backport-4.9/065-v4.13-0007-mtd-partitions-add-support-for-partition-parsers.patch b/target/linux/generic/backport-4.9/065-v4.13-0007-mtd-partitions-add-support-for-partition-parsers.patch
deleted file mode 100644 (file)
index c4c517f..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-From 1a0915be192606fee64830b9c5d70b7ed59426b6 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 21 Jun 2017 08:26:46 +0200
-Subject: [PATCH] mtd: partitions: add support for partition parsers
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Some devices have partitions that are kind of containers with extra
-subpartitions / volumes instead of e.g. a simple filesystem data. To
-support such cases we need to first create normal flash device
-partitions and then take care of these special ones.
-
-It's very common case for home routers. Depending on the vendor there
-are formats like TRX, Seama, TP-Link, WRGG & more. All of them are used
-to embed few partitions into a single one / single firmware file.
-
-Ideally all vendors would use some well documented / standardized format
-like UBI (and some probably start doing so), but there are still
-countless devices on the market using these poor vendor specific
-formats.
-
-This patch extends MTD subsystem by allowing to specify list of parsers
-that should be tried for a given partition. Supporting such poor formats
-is highly unlikely to be the top priority so these changes try to
-minimize maintenance cost to the minimum. It reuses existing code for
-these new parsers and just adds a one property and one new function.
-
-This implementation requires setting partition parsers in a flash
-parser. A proper change of bcm47xxpart will follow and in the future we
-will hopefully also find a solution for doing it with ofpart
-("fixed-partitions").
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/mtdpart.c          | 31 +++++++++++++++++++++++++++++++
- include/linux/mtd/partitions.h |  7 +++++++
- 2 files changed, 38 insertions(+)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -369,6 +369,35 @@ static inline void free_partition(struct
-       kfree(p);
- }
-+/**
-+ * mtd_parse_part - parse MTD partition looking for subpartitions
-+ *
-+ * @slave: part that is supposed to be a container and should be parsed
-+ * @types: NULL-terminated array with names of partition parsers to try
-+ *
-+ * Some partitions are kind of containers with extra subpartitions (volumes).
-+ * There can be various formats of such containers. This function tries to use
-+ * specified parsers to analyze given partition and registers found
-+ * subpartitions on success.
-+ */
-+static int mtd_parse_part(struct mtd_part *slave, const char *const *types)
-+{
-+      struct mtd_partitions parsed;
-+      int err;
-+
-+      err = parse_mtd_partitions(&slave->mtd, types, &parsed, NULL);
-+      if (err)
-+              return err;
-+      else if (!parsed.nr_parts)
-+              return -ENOENT;
-+
-+      err = add_mtd_partitions(&slave->mtd, parsed.parts, parsed.nr_parts);
-+
-+      mtd_part_parser_cleanup(&parsed);
-+
-+      return err;
-+}
-+
- static struct mtd_part *allocate_partition(struct mtd_info *parent,
-                       const struct mtd_partition *part, int partno,
-                       uint64_t cur_offset)
-@@ -778,6 +807,8 @@ int add_mtd_partitions(struct mtd_info *
-               }
-               mtd_add_partition_attrs(slave);
-+              if (parts[i].types)
-+                      mtd_parse_part(slave, parts[i].types);
-               cur_offset = slave->offset + slave->mtd.size;
-       }
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -20,6 +20,12 @@
-  *
-  * For each partition, these fields are available:
-  * name: string that will be used to label the partition's MTD device.
-+ * types: some partitions can be containers using specific format to describe
-+ *    embedded subpartitions / volumes. E.g. many home routers use "firmware"
-+ *    partition that contains at least kernel and rootfs. In such case an
-+ *    extra parser is needed that will detect these dynamic partitions and
-+ *    report them to the MTD subsystem. If set this property stores an array
-+ *    of parser names to use when looking for subpartitions.
-  * size: the partition size; if defined as MTDPART_SIZ_FULL, the partition
-  *    will extend to the end of the master MTD device.
-  * offset: absolute starting position within the master MTD device; if
-@@ -38,6 +44,7 @@
- struct mtd_partition {
-       const char *name;               /* identifier string */
-+      const char *const *types;       /* names of parsers to use if any */
-       uint64_t size;                  /* partition size */
-       uint64_t offset;                /* offset within the master MTD space */
-       uint32_t mask_flags;            /* master MTD flags to mask out for this partition */
diff --git a/target/linux/generic/backport-4.9/065-v4.13-0008-mtd-extract-TRX-parser-out-of-bcm47xxpart-into-a-sep.patch b/target/linux/generic/backport-4.9/065-v4.13-0008-mtd-extract-TRX-parser-out-of-bcm47xxpart-into-a-sep.patch
deleted file mode 100644 (file)
index 3761a46..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-From 99352afe8f169c95b294b6b9a8d0e18cd9e3c2a0 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 21 Jun 2017 08:26:47 +0200
-Subject: [PATCH] mtd: extract TRX parser out of bcm47xxpart into a separated
- module
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This makes TRX parsing code reusable with other platforms and parsers.
-
-Please note this patch doesn't really change anything in the existing
-code, just moves it. There is still some place for improvement (e.g.
-working on non-hacky method of checking rootfs format) but it's not
-really a subject of this change.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
----
- drivers/mtd/Kconfig              |   4 ++
- drivers/mtd/Makefile             |   1 +
- drivers/mtd/bcm47xxpart.c        |  99 ++----------------------------
- drivers/mtd/parsers/Kconfig      |   8 +++
- drivers/mtd/parsers/Makefile     |   1 +
- drivers/mtd/parsers/parser_trx.c | 126 +++++++++++++++++++++++++++++++++++++++
- 6 files changed, 145 insertions(+), 94 deletions(-)
- create mode 100644 drivers/mtd/parsers/Kconfig
- create mode 100644 drivers/mtd/parsers/Makefile
- create mode 100644 drivers/mtd/parsers/parser_trx.c
-
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -155,6 +155,10 @@ config MTD_BCM47XX_PARTS
-         This provides partitions parser for devices based on BCM47xx
-         boards.
-+menu "Partition parsers"
-+source "drivers/mtd/parsers/Kconfig"
-+endmenu
-+
- comment "User Modules And Translation Layers"
- #
---- a/drivers/mtd/Makefile
-+++ b/drivers/mtd/Makefile
-@@ -13,6 +13,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-y                         += parsers/
- # 'Users' - code which presents functionality to userspace.
- obj-$(CONFIG_MTD_BLKDEVS)     += mtd_blkdevs.o
---- a/drivers/mtd/bcm47xxpart.c
-+++ b/drivers/mtd/bcm47xxpart.c
-@@ -43,7 +43,8 @@
- #define ML_MAGIC2                     0x26594131
- #define TRX_MAGIC                     0x30524448
- #define SHSQ_MAGIC                    0x71736873      /* shsq (weird ZTE H218N endianness) */
--#define UBI_EC_MAGIC                  0x23494255      /* UBI# */
-+
-+static const char * const trx_types[] = { "trx", NULL };
- struct trx_header {
-       uint32_t magic;
-@@ -62,89 +63,6 @@ static void bcm47xxpart_add_part(struct
-       part->mask_flags = mask_flags;
- }
--static const char *bcm47xxpart_trx_data_part_name(struct mtd_info *master,
--                                                size_t offset)
--{
--      uint32_t buf;
--      size_t bytes_read;
--      int err;
--
--      err  = mtd_read(master, offset, sizeof(buf), &bytes_read,
--                      (uint8_t *)&buf);
--      if (err && !mtd_is_bitflip(err)) {
--              pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
--                      offset, err);
--              goto out_default;
--      }
--
--      if (buf == UBI_EC_MAGIC)
--              return "ubi";
--
--out_default:
--      return "rootfs";
--}
--
--static int bcm47xxpart_parse_trx(struct mtd_info *master,
--                               struct mtd_partition *trx,
--                               struct mtd_partition *parts,
--                               size_t parts_len)
--{
--      struct trx_header header;
--      size_t bytes_read;
--      int curr_part = 0;
--      int i, err;
--
--      if (parts_len < 3) {
--              pr_warn("No enough space to add TRX partitions!\n");
--              return -ENOMEM;
--      }
--
--      err = mtd_read(master, trx->offset, sizeof(header), &bytes_read,
--                     (uint8_t *)&header);
--      if (err && !mtd_is_bitflip(err)) {
--              pr_err("mtd_read error while reading TRX header: %d\n", err);
--              return err;
--      }
--
--      i = 0;
--
--      /* We have LZMA loader if offset[2] points to sth */
--      if (header.offset[2]) {
--              bcm47xxpart_add_part(&parts[curr_part++], "loader",
--                                   trx->offset + header.offset[i], 0);
--              i++;
--      }
--
--      if (header.offset[i]) {
--              bcm47xxpart_add_part(&parts[curr_part++], "linux",
--                                   trx->offset + header.offset[i], 0);
--              i++;
--      }
--
--      if (header.offset[i]) {
--              size_t offset = trx->offset + header.offset[i];
--              const char *name = bcm47xxpart_trx_data_part_name(master,
--                                                                offset);
--
--              bcm47xxpart_add_part(&parts[curr_part++], name, offset, 0);
--              i++;
--      }
--
--      /*
--       * Assume that every partition ends at the beginning of the one it is
--       * followed by.
--       */
--      for (i = 0; i < curr_part; i++) {
--              u64 next_part_offset = (i < curr_part - 1) ?
--                                      parts[i + 1].offset :
--                                      trx->offset + trx->size;
--
--              parts[i].size = next_part_offset - parts[i].offset;
--      }
--
--      return curr_part;
--}
--
- /**
-  * bcm47xxpart_bootpartition - gets index of TRX partition used by bootloader
-  *
-@@ -362,17 +280,10 @@ static int bcm47xxpart_parse(struct mtd_
-       for (i = 0; i < trx_num; i++) {
-               struct mtd_partition *trx = &parts[trx_parts[i]];
--              if (i == bcm47xxpart_bootpartition()) {
--                      int num_parts;
--
--                      num_parts = bcm47xxpart_parse_trx(master, trx,
--                                                        parts + curr_part,
--                                                        BCM47XXPART_MAX_PARTS - curr_part);
--                      if (num_parts > 0)
--                              curr_part += num_parts;
--              } else {
-+              if (i == bcm47xxpart_bootpartition())
-+                      trx->types = trx_types;
-+              else
-                       trx->name = "failsafe";
--              }
-       }
-       *pparts = parts;
---- /dev/null
-+++ b/drivers/mtd/parsers/Kconfig
-@@ -0,0 +1,8 @@
-+config MTD_PARSER_TRX
-+      tristate "Parser for TRX format partitions"
-+      depends on MTD && (BCM47XX || ARCH_BCM_5301X || COMPILE_TEST)
-+      help
-+        TRX is a firmware format used by Broadcom on their devices. It
-+        may contain up to 3/4 partitions (depending on the version).
-+        This driver will parse TRX header and report at least two partitions:
-+        kernel and rootfs.
---- /dev/null
-+++ b/drivers/mtd/parsers/Makefile
-@@ -0,0 +1 @@
-+obj-$(CONFIG_MTD_PARSER_TRX)          += parser_trx.o
---- /dev/null
-+++ b/drivers/mtd/parsers/parser_trx.c
-@@ -0,0 +1,126 @@
-+/*
-+ * Parser for TRX format partitions
-+ *
-+ * Copyright (C) 2012 - 2017 Rafał Miłecki <rafal@milecki.pl>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
-+
-+#define TRX_PARSER_MAX_PARTS          4
-+
-+/* Magics */
-+#define TRX_MAGIC                     0x30524448
-+#define UBI_EC_MAGIC                  0x23494255      /* UBI# */
-+
-+struct trx_header {
-+      uint32_t magic;
-+      uint32_t length;
-+      uint32_t crc32;
-+      uint16_t flags;
-+      uint16_t version;
-+      uint32_t offset[3];
-+} __packed;
-+
-+static const char *parser_trx_data_part_name(struct mtd_info *master,
-+                                           size_t offset)
-+{
-+      uint32_t buf;
-+      size_t bytes_read;
-+      int err;
-+
-+      err  = mtd_read(master, offset, sizeof(buf), &bytes_read,
-+                      (uint8_t *)&buf);
-+      if (err && !mtd_is_bitflip(err)) {
-+              pr_err("mtd_read error while parsing (offset: 0x%X): %d\n",
-+                      offset, err);
-+              goto out_default;
-+      }
-+
-+      if (buf == UBI_EC_MAGIC)
-+              return "ubi";
-+
-+out_default:
-+      return "rootfs";
-+}
-+
-+static int parser_trx_parse(struct mtd_info *mtd,
-+                          const struct mtd_partition **pparts,
-+                          struct mtd_part_parser_data *data)
-+{
-+      struct mtd_partition *parts;
-+      struct mtd_partition *part;
-+      struct trx_header trx;
-+      size_t bytes_read;
-+      uint8_t curr_part = 0, i = 0;
-+      int err;
-+
-+      parts = kzalloc(sizeof(struct mtd_partition) * TRX_PARSER_MAX_PARTS,
-+                      GFP_KERNEL);
-+      if (!parts)
-+              return -ENOMEM;
-+
-+      err = mtd_read(mtd, 0, sizeof(trx), &bytes_read, (uint8_t *)&trx);
-+      if (err) {
-+              pr_err("MTD reading error: %d\n", err);
-+              kfree(parts);
-+              return err;
-+      }
-+
-+      if (trx.magic != TRX_MAGIC) {
-+              kfree(parts);
-+              return -ENOENT;
-+      }
-+
-+      /* We have LZMA loader if there is address in offset[2] */
-+      if (trx.offset[2]) {
-+              part = &parts[curr_part++];
-+              part->name = "loader";
-+              part->offset = trx.offset[i];
-+              i++;
-+      }
-+
-+      if (trx.offset[i]) {
-+              part = &parts[curr_part++];
-+              part->name = "linux";
-+              part->offset = trx.offset[i];
-+              i++;
-+      }
-+
-+      if (trx.offset[i]) {
-+              part = &parts[curr_part++];
-+              part->name = parser_trx_data_part_name(mtd, trx.offset[i]);
-+              part->offset = trx.offset[i];
-+              i++;
-+      }
-+
-+      /*
-+       * Assume that every partition ends at the beginning of the one it is
-+       * followed by.
-+       */
-+      for (i = 0; i < curr_part; i++) {
-+              u64 next_part_offset = (i < curr_part - 1) ?
-+                                     parts[i + 1].offset : mtd->size;
-+
-+              parts[i].size = next_part_offset - parts[i].offset;
-+      }
-+
-+      *pparts = parts;
-+      return i;
-+};
-+
-+static struct mtd_part_parser mtd_parser_trx = {
-+      .parse_fn = parser_trx_parse,
-+      .name = "trx",
-+};
-+module_mtd_part_parser(mtd_parser_trx);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("Parser for TRX format partitions");
diff --git a/target/linux/generic/backport-4.9/066-v4.17-0001-mtd-move-code-adding-master-MTD-out-of-mtd_add_devic.patch b/target/linux/generic/backport-4.9/066-v4.17-0001-mtd-move-code-adding-master-MTD-out-of-mtd_add_devic.patch
deleted file mode 100644 (file)
index 07a456d..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-From 2c77c57d22adb05b21cdb333a0c42bdfa0e19835 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 16 Jan 2018 16:45:41 +0100
-Subject: [PATCH] mtd: move code adding master MTD out of
- mtd_add_device_partitions()
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This change is a small cleanup of mtd_device_parse_register(). When
-using MTD_PARTITIONED_MASTER it makes sure a master MTD is registered
-before dealing with partitions. The advantage of this is not mixing
-code handling master MTD with code handling partitions.
-
-This commit doesn't change any behavior except from a slightly different
-failure code path. The new code may need to call del_mtd_device when
-something goes wrong.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
----
- drivers/mtd/mtdcore.c | 25 +++++++++++++------------
- 1 file changed, 13 insertions(+), 12 deletions(-)
-
---- a/drivers/mtd/mtdcore.c
-+++ b/drivers/mtd/mtdcore.c
-@@ -631,20 +631,12 @@ static int mtd_add_device_partitions(str
- {
-       const struct mtd_partition *real_parts = parts->parts;
-       int nbparts = parts->nr_parts;
--      int ret;
--      if (nbparts == 0 || IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER)) {
--              ret = add_mtd_device(mtd);
--              if (ret)
--                      return ret;
--      }
-+      if (!nbparts && !device_is_registered(&mtd->dev))
-+              return add_mtd_device(mtd);
--      if (nbparts > 0) {
--              ret = add_mtd_partitions(mtd, real_parts, nbparts);
--              if (ret && IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER))
--                      del_mtd_device(mtd);
--              return ret;
--      }
-+      if (nbparts > 0)
-+              return add_mtd_partitions(mtd, real_parts, nbparts);
-       return 0;
- }
-@@ -704,6 +696,12 @@ int mtd_device_parse_register(struct mtd
-       mtd_set_dev_defaults(mtd);
-+      if (IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER)) {
-+              ret = add_mtd_device(mtd);
-+              if (ret)
-+                      return ret;
-+      }
-+
-       memset(&parsed, 0, sizeof(parsed));
-       ret = parse_mtd_partitions(mtd, types, &parsed, parser_data);
-@@ -743,6 +741,9 @@ int mtd_device_parse_register(struct mtd
- out:
-       /* Cleanup any parsed partitions */
-       mtd_part_parser_cleanup(&parsed);
-+      if (ret && device_is_registered(&mtd->dev))
-+              del_mtd_device(mtd);
-+
-       return ret;
- }
- EXPORT_SYMBOL_GPL(mtd_device_parse_register);
diff --git a/target/linux/generic/backport-4.9/066-v4.17-0002-mtd-get-rid-of-the-mtd_add_device_partitions.patch b/target/linux/generic/backport-4.9/066-v4.17-0002-mtd-get-rid-of-the-mtd_add_device_partitions.patch
deleted file mode 100644 (file)
index b629d43..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-From 0dbe4ea78d69756efeb0bba0764f6bd4a9ee9567 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 16 Jan 2018 16:45:42 +0100
-Subject: [PATCH] mtd: get rid of the mtd_add_device_partitions()
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This simplifies code a bit by:
-1) Avoiding an extra (tiny) function
-2) Checking for amount of parsed (found) partitions just once
-3) Avoiding clearing/filling struct mtd_partitions manually
-
-With this commit proper functions are called directly from the
-mtd_device_parse_register(). It doesn't need to use minor tricks like
-memsetting struct to 0 to trigger an expected
-mtd_add_device_partitions() behavior.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
----
- drivers/mtd/mtdcore.c | 43 ++++++++++++-------------------------------
- 1 file changed, 12 insertions(+), 31 deletions(-)
-
---- a/drivers/mtd/mtdcore.c
-+++ b/drivers/mtd/mtdcore.c
-@@ -626,21 +626,6 @@ out_error:
-       return ret;
- }
--static int mtd_add_device_partitions(struct mtd_info *mtd,
--                                   struct mtd_partitions *parts)
--{
--      const struct mtd_partition *real_parts = parts->parts;
--      int nbparts = parts->nr_parts;
--
--      if (!nbparts && !device_is_registered(&mtd->dev))
--              return add_mtd_device(mtd);
--
--      if (nbparts > 0)
--              return add_mtd_partitions(mtd, real_parts, nbparts);
--
--      return 0;
--}
--
- /*
-  * Set a few defaults based on the parent devices, if not provided by the
-  * driver
-@@ -691,7 +676,7 @@ int mtd_device_parse_register(struct mtd
-                             const struct mtd_partition *parts,
-                             int nr_parts)
- {
--      struct mtd_partitions parsed;
-+      struct mtd_partitions parsed = { };
-       int ret;
-       mtd_set_dev_defaults(mtd);
-@@ -702,24 +687,20 @@ int mtd_device_parse_register(struct mtd
-                       return ret;
-       }
--      memset(&parsed, 0, sizeof(parsed));
--
-+      /* Prefer parsed partitions over driver-provided fallback */
-       ret = parse_mtd_partitions(mtd, types, &parsed, parser_data);
--      if ((ret < 0 || parsed.nr_parts == 0) && parts && nr_parts) {
--              /* Fall back to driver-provided partitions */
--              parsed = (struct mtd_partitions){
--                      .parts          = parts,
--                      .nr_parts       = nr_parts,
--              };
--      } else if (ret < 0) {
--              /* Didn't come up with parsed OR fallback partitions */
--              pr_info("mtd: failed to find partitions; one or more parsers reports errors (%d)\n",
--                      ret);
--              /* Don't abort on errors; we can still use unpartitioned MTD */
--              memset(&parsed, 0, sizeof(parsed));
-+      if (!ret && parsed.nr_parts) {
-+              parts = parsed.parts;
-+              nr_parts = parsed.nr_parts;
-       }
--      ret = mtd_add_device_partitions(mtd, &parsed);
-+      if (nr_parts)
-+              ret = add_mtd_partitions(mtd, parts, nr_parts);
-+      else if (!device_is_registered(&mtd->dev))
-+              ret = add_mtd_device(mtd);
-+      else
-+              ret = 0;
-+
-       if (ret)
-               goto out;
diff --git a/target/linux/generic/backport-4.9/067-v4.17-0001-mtd-partitions-add-of_match_table-parser-matching-fo.patch b/target/linux/generic/backport-4.9/067-v4.17-0001-mtd-partitions-add-of_match_table-parser-matching-fo.patch
deleted file mode 100644 (file)
index cb46499..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-From 5b644aa012f67fd211138a067b9f351f30bdcc60 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 14 Mar 2018 13:10:42 +0100
-Subject: [PATCH] mtd: partitions: add of_match_table parser matching for the
- "ofpart" type
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-In order to properly support compatibility strings as described in the
-bindings/mtd/partition.txt "ofpart" type should be treated as an
-indication for looking into OF. MTD should check "compatible" property
-and search for a matching parser rather than blindly trying the one
-supporting "fixed-partitions".
-
-It also means that existing "fixed-partitions" parser should get renamed
-to use a more meaningful name.
-
-This commit achievies that aim by introducing a new mtd_part_of_parse().
-It works by looking for a matching parser for every string in the
-"compatibility" property (starting with the most specific one).
-
-Please note that driver-specified parsers still take a precedence. It's
-assumed that driver providing a parser type has a good reason for that
-(e.g. having platform data with device-specific info). Also doing
-otherwise could break existing setups. The same applies to using default
-parsers (including "cmdlinepart") as some overwrite DT data with cmdline
-argument.
-
-Partition parsers can now provide an of_match_table to enable
-flash<-->parser matching via device tree as documented in the
-mtd/partition.txt.
-
-This support is currently limited to built-in parsers as it uses
-request_module() and friends. This should be sufficient for most cases
-though as compiling parsers as modules isn't a common choice.
-
-Signed-off-by: Brian Norris <computersforpeace@gmail.com>
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Tested-by: Peter Rosin <peda@axentia.se>
-Reviewed-by: Richard Weinberger <richard@nod.at>
-Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
----
- drivers/mtd/mtdpart.c          | 116 +++++++++++++++++++++++++++++++++++++----
- include/linux/mtd/partitions.h |   1 +
- 2 files changed, 108 insertions(+), 9 deletions(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -30,6 +30,7 @@
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/partitions.h>
- #include <linux/err.h>
-+#include <linux/of.h>
- #include "mtdcore.h"
-@@ -911,6 +912,92 @@ static int mtd_part_do_parse(struct mtd_
- }
- /**
-+ * mtd_part_get_compatible_parser - find MTD parser by a compatible string
-+ *
-+ * @compat: compatible string describing partitions in a device tree
-+ *
-+ * MTD parsers can specify supported partitions by providing a table of
-+ * compatibility strings. This function finds a parser that advertises support
-+ * for a passed value of "compatible".
-+ */
-+static struct mtd_part_parser *mtd_part_get_compatible_parser(const char *compat)
-+{
-+      struct mtd_part_parser *p, *ret = NULL;
-+
-+      spin_lock(&part_parser_lock);
-+
-+      list_for_each_entry(p, &part_parsers, list) {
-+              const struct of_device_id *matches;
-+
-+              matches = p->of_match_table;
-+              if (!matches)
-+                      continue;
-+
-+              for (; matches->compatible[0]; matches++) {
-+                      if (!strcmp(matches->compatible, compat) &&
-+                          try_module_get(p->owner)) {
-+                              ret = p;
-+                              break;
-+                      }
-+              }
-+
-+              if (ret)
-+                      break;
-+      }
-+
-+      spin_unlock(&part_parser_lock);
-+
-+      return ret;
-+}
-+
-+static int mtd_part_of_parse(struct mtd_info *master,
-+                           struct mtd_partitions *pparts)
-+{
-+      struct mtd_part_parser *parser;
-+      struct device_node *np;
-+      struct property *prop;
-+      const char *compat;
-+      const char *fixed = "ofpart";
-+      int ret, err = 0;
-+
-+      np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
-+      of_property_for_each_string(np, "compatible", prop, compat) {
-+              parser = mtd_part_get_compatible_parser(compat);
-+              if (!parser)
-+                      continue;
-+              ret = mtd_part_do_parse(parser, master, pparts, NULL);
-+              if (ret > 0) {
-+                      of_node_put(np);
-+                      return ret;
-+              }
-+              mtd_part_parser_put(parser);
-+              if (ret < 0 && !err)
-+                      err = ret;
-+      }
-+      of_node_put(np);
-+
-+      /*
-+       * For backward compatibility we have to try the "ofpart"
-+       * parser. It supports old DT format with partitions specified as a
-+       * direct subnodes of a flash device DT node without any compatibility
-+       * specified we could match.
-+       */
-+      parser = mtd_part_parser_get(fixed);
-+      if (!parser && !request_module("%s", fixed))
-+              parser = mtd_part_parser_get(fixed);
-+      if (parser) {
-+              ret = mtd_part_do_parse(parser, master, pparts, NULL);
-+              if (ret > 0)
-+                      return ret;
-+              mtd_part_parser_put(parser);
-+              if (ret < 0 && !err)
-+                      err = ret;
-+      }
-+
-+      return err;
-+}
-+
-+/**
-  * parse_mtd_partitions - parse MTD partitions
-  * @master: the master partition (describes whole MTD device)
-  * @types: names of partition parsers to try or %NULL
-@@ -942,19 +1029,30 @@ int parse_mtd_partitions(struct mtd_info
-               types = default_mtd_part_types;
-       for ( ; *types; types++) {
--              pr_debug("%s: parsing partitions %s\n", master->name, *types);
--              parser = mtd_part_parser_get(*types);
--              if (!parser && !request_module("%s", *types))
-+              /*
-+               * ofpart is a special type that means OF partitioning info
-+               * should be used. It requires a bit different logic so it is
-+               * handled in a separated function.
-+               */
-+              if (!strcmp(*types, "ofpart")) {
-+                      ret = mtd_part_of_parse(master, pparts);
-+              } else {
-+                      pr_debug("%s: parsing partitions %s\n", master->name,
-+                               *types);
-                       parser = mtd_part_parser_get(*types);
--              pr_debug("%s: got parser %s\n", master->name,
--                       parser ? parser->name : NULL);
--              if (!parser)
--                      continue;
--              ret = mtd_part_do_parse(parser, master, pparts, data);
-+                      if (!parser && !request_module("%s", *types))
-+                              parser = mtd_part_parser_get(*types);
-+                      pr_debug("%s: got parser %s\n", master->name,
-+                              parser ? parser->name : NULL);
-+                      if (!parser)
-+                              continue;
-+                      ret = mtd_part_do_parse(parser, master, pparts, data);
-+                      if (ret <= 0)
-+                              mtd_part_parser_put(parser);
-+              }
-               /* Found partitions! */
-               if (ret > 0)
-                       return 0;
--              mtd_part_parser_put(parser);
-               /*
-                * Stash the first error we see; only report it if no parser
-                * succeeds
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -77,6 +77,7 @@ struct mtd_part_parser {
-       struct list_head list;
-       struct module *owner;
-       const char *name;
-+      const struct of_device_id *of_match_table;
-       int (*parse_fn)(struct mtd_info *, const struct mtd_partition **,
-                       struct mtd_part_parser_data *);
-       void (*cleanup)(const struct mtd_partition *pparts, int nr_parts);
diff --git a/target/linux/generic/backport-4.9/067-v4.17-0002-mtd-rename-ofpart-parser-to-fixed-partitions-as-it-f.patch b/target/linux/generic/backport-4.9/067-v4.17-0002-mtd-rename-ofpart-parser-to-fixed-partitions-as-it-f.patch
deleted file mode 100644 (file)
index b22ddfa..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-From c0faf43482e7f7dfb6d61847cb93d17748560b24 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 14 Mar 2018 13:10:43 +0100
-Subject: [PATCH] mtd: rename "ofpart" parser to "fixed-partitions" as it fits
- it better
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Type "ofpart" means that OF should be used to get partitioning info and
-this driver supports "fixed-partitions" binding only. Renaming it should
-lead to less confusion especially when parsers for new compatibility
-strings start to appear.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Reviewed-by: Richard Weinberger <richard@nod.at>
-Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
----
- drivers/mtd/mtdpart.c |  4 ++--
- drivers/mtd/ofpart.c  | 11 ++++++-----
- 2 files changed, 8 insertions(+), 7 deletions(-)
-
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -957,7 +957,7 @@ static int mtd_part_of_parse(struct mtd_
-       struct device_node *np;
-       struct property *prop;
-       const char *compat;
--      const char *fixed = "ofpart";
-+      const char *fixed = "fixed-partitions";
-       int ret, err = 0;
-       np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
-@@ -977,7 +977,7 @@ static int mtd_part_of_parse(struct mtd_
-       of_node_put(np);
-       /*
--       * For backward compatibility we have to try the "ofpart"
-+       * For backward compatibility we have to try the "fixed-partitions"
-        * parser. It supports old DT format with partitions specified as a
-        * direct subnodes of a flash device DT node without any compatibility
-        * specified we could match.
---- a/drivers/mtd/ofpart.c
-+++ b/drivers/mtd/ofpart.c
-@@ -25,9 +25,9 @@ static bool node_has_compatible(struct d
-       return of_get_property(pp, "compatible", NULL);
- }
--static int parse_ofpart_partitions(struct mtd_info *master,
--                                 const struct mtd_partition **pparts,
--                                 struct mtd_part_parser_data *data)
-+static int parse_fixed_partitions(struct mtd_info *master,
-+                                const struct mtd_partition **pparts,
-+                                struct mtd_part_parser_data *data)
- {
-       struct mtd_partition *parts;
-       struct device_node *mtd_node;
-@@ -141,8 +141,8 @@ ofpart_none:
- }
- static struct mtd_part_parser ofpart_parser = {
--      .parse_fn = parse_ofpart_partitions,
--      .name = "ofpart",
-+      .parse_fn = parse_fixed_partitions,
-+      .name = "fixed-partitions",
- };
- static int parse_ofoldpart_partitions(struct mtd_info *master,
-@@ -230,4 +230,5 @@ MODULE_AUTHOR("Vitaly Wool, David Gibson
-  * with the same name. Since we provide the ofoldpart parser, we should have
-  * the corresponding alias.
-  */
-+MODULE_ALIAS("fixed-partitions");
- MODULE_ALIAS("ofoldpart");
diff --git a/target/linux/generic/backport-4.9/067-v4.17-0003-mtd-ofpart-add-of_match_table-with-fixed-partitions.patch b/target/linux/generic/backport-4.9/067-v4.17-0003-mtd-ofpart-add-of_match_table-with-fixed-partitions.patch
deleted file mode 100644 (file)
index d6958c3..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-From 97b0c7c0df3efd7048ed39d7e2dee34cafd55887 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Wed, 14 Mar 2018 13:10:44 +0100
-Subject: [PATCH] mtd: ofpart: add of_match_table with "fixed-partitions"
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This allows using this parser with any flash driver that takes care of
-setting of_node (using mtd_set_of_node helper) correctly. Up to now
-support for "fixed-partitions" DT compatibility string was working only
-with flash drivers that were specifying "ofpart" (manually or by letting
-mtd use the default set of parsers).
-
-This matches existing bindings documentation.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Reviewed-by: Brian Norris <computersforpeace@gmail.com>
-Tested-by: Brian Norris <computersforpeace@gmail.com>
-Reviewed-by: Richard Weinberger <richard@nod.at>
-Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
----
- drivers/mtd/ofpart.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
---- a/drivers/mtd/ofpart.c
-+++ b/drivers/mtd/ofpart.c
-@@ -140,9 +140,16 @@ ofpart_none:
-       return ret;
- }
-+static const struct of_device_id parse_ofpart_match_table[] = {
-+      { .compatible = "fixed-partitions" },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, parse_ofpart_match_table);
-+
- static struct mtd_part_parser ofpart_parser = {
-       .parse_fn = parse_fixed_partitions,
-       .name = "fixed-partitions",
-+      .of_match_table = parse_ofpart_match_table,
- };
- static int parse_ofoldpart_partitions(struct mtd_info *master,
diff --git a/target/linux/generic/backport-4.9/068-v4.18-0001-mtd-move-code-adding-registering-partitions-to-the-p.patch b/target/linux/generic/backport-4.9/068-v4.18-0001-mtd-move-code-adding-registering-partitions-to-the-p.patch
deleted file mode 100644 (file)
index 4bedd54..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-From 5ac67ce36cfe38b4c104a42ce52c5c8d526f1c95 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 27 Mar 2018 22:35:41 +0200
-Subject: [PATCH] mtd: move code adding (registering) partitions to the
- parse_mtd_partitions()
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This commit slightly simplifies the code. Every parse_mtd_partitions()
-caller (out of two existing ones) had to add partitions & cleanup parser
-on its own. This moves that responsibility into the function.
-
-That change also allows dropping struct mtd_partitions argument.
-
-There is one minor behavior change caused by this cleanup. If
-parse_mtd_partitions() fails to add partitions (add_mtd_partitions()
-return an error) then mtd_device_parse_register() will still try to
-add (register) fallback partitions. It's a real corner case affecting
-one of uncommon error paths and shouldn't cause any harm.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
----
- drivers/mtd/mtdcore.c | 14 ++++----------
- drivers/mtd/mtdcore.h |  1 -
- drivers/mtd/mtdpart.c | 44 ++++++++++++++++----------------------------
- 3 files changed, 20 insertions(+), 39 deletions(-)
-
---- a/drivers/mtd/mtdcore.c
-+++ b/drivers/mtd/mtdcore.c
-@@ -676,7 +676,6 @@ int mtd_device_parse_register(struct mtd
-                             const struct mtd_partition *parts,
-                             int nr_parts)
- {
--      struct mtd_partitions parsed = { };
-       int ret;
-       mtd_set_dev_defaults(mtd);
-@@ -688,13 +687,10 @@ int mtd_device_parse_register(struct mtd
-       }
-       /* Prefer parsed partitions over driver-provided fallback */
--      ret = parse_mtd_partitions(mtd, types, &parsed, parser_data);
--      if (!ret && parsed.nr_parts) {
--              parts = parsed.parts;
--              nr_parts = parsed.nr_parts;
--      }
--
--      if (nr_parts)
-+      ret = parse_mtd_partitions(mtd, types, parser_data);
-+      if (ret > 0)
-+              ret = 0;
-+      else if (nr_parts)
-               ret = add_mtd_partitions(mtd, parts, nr_parts);
-       else if (!device_is_registered(&mtd->dev))
-               ret = add_mtd_device(mtd);
-@@ -720,8 +716,6 @@ int mtd_device_parse_register(struct mtd
-       }
- out:
--      /* Cleanup any parsed partitions */
--      mtd_part_parser_cleanup(&parsed);
-       if (ret && device_is_registered(&mtd->dev))
-               del_mtd_device(mtd);
---- a/drivers/mtd/mtdcore.h
-+++ b/drivers/mtd/mtdcore.h
-@@ -14,7 +14,6 @@ int del_mtd_partitions(struct mtd_info *
- struct mtd_partitions;
- int parse_mtd_partitions(struct mtd_info *master, const char * const *types,
--                       struct mtd_partitions *pparts,
-                        struct mtd_part_parser_data *data);
- void mtd_part_parser_cleanup(struct mtd_partitions *parts);
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -383,20 +383,7 @@ static inline void free_partition(struct
-  */
- static int mtd_parse_part(struct mtd_part *slave, const char *const *types)
- {
--      struct mtd_partitions parsed;
--      int err;
--
--      err = parse_mtd_partitions(&slave->mtd, types, &parsed, NULL);
--      if (err)
--              return err;
--      else if (!parsed.nr_parts)
--              return -ENOENT;
--
--      err = add_mtd_partitions(&slave->mtd, parsed.parts, parsed.nr_parts);
--
--      mtd_part_parser_cleanup(&parsed);
--
--      return err;
-+      return parse_mtd_partitions(&slave->mtd, types, NULL);
- }
- static struct mtd_part *allocate_partition(struct mtd_info *parent,
-@@ -998,30 +985,27 @@ static int mtd_part_of_parse(struct mtd_
- }
- /**
-- * parse_mtd_partitions - parse MTD partitions
-+ * parse_mtd_partitions - parse and register MTD partitions
-+ *
-  * @master: the master partition (describes whole MTD device)
-  * @types: names of partition parsers to try or %NULL
-- * @pparts: info about partitions found is returned here
-  * @data: MTD partition parser-specific data
-  *
-- * This function tries to find partition on MTD device @master. It uses MTD
-- * partition parsers, specified in @types. However, if @types is %NULL, then
-- * the default list of parsers is used. The default list contains only the
-+ * This function tries to find & register partitions on MTD device @master. It
-+ * uses MTD partition parsers, specified in @types. However, if @types is %NULL,
-+ * then the default list of parsers is used. The default list contains only the
-  * "cmdlinepart" and "ofpart" parsers ATM.
-  * Note: If there are more then one parser in @types, the kernel only takes the
-  * partitions parsed out by the first parser.
-  *
-  * This function may return:
-  * o a negative error code in case of failure
-- * o zero otherwise, and @pparts will describe the partitions, number of
-- *   partitions, and the parser which parsed them. Caller must release
-- *   resources with mtd_part_parser_cleanup() when finished with the returned
-- *   data.
-+ * o number of found partitions otherwise
-  */
- int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
--                       struct mtd_partitions *pparts,
-                        struct mtd_part_parser_data *data)
- {
-+      struct mtd_partitions pparts = { };
-       struct mtd_part_parser *parser;
-       int ret, err = 0;
-@@ -1035,7 +1019,7 @@ int parse_mtd_partitions(struct mtd_info
-                * handled in a separated function.
-                */
-               if (!strcmp(*types, "ofpart")) {
--                      ret = mtd_part_of_parse(master, pparts);
-+                      ret = mtd_part_of_parse(master, &pparts);
-               } else {
-                       pr_debug("%s: parsing partitions %s\n", master->name,
-                                *types);
-@@ -1046,13 +1030,17 @@ int parse_mtd_partitions(struct mtd_info
-                               parser ? parser->name : NULL);
-                       if (!parser)
-                               continue;
--                      ret = mtd_part_do_parse(parser, master, pparts, data);
-+                      ret = mtd_part_do_parse(parser, master, &pparts, data);
-                       if (ret <= 0)
-                               mtd_part_parser_put(parser);
-               }
-               /* Found partitions! */
--              if (ret > 0)
--                      return 0;
-+              if (ret > 0) {
-+                      err = add_mtd_partitions(master, pparts.parts,
-+                                               pparts.nr_parts);
-+                      mtd_part_parser_cleanup(&pparts);
-+                      return err ? err : pparts.nr_parts;
-+              }
-               /*
-                * Stash the first error we see; only report it if no parser
-                * succeeds
diff --git a/target/linux/generic/backport-4.9/069-v4.18-mtd-bcm47xxpart-improve-handling-TRX-partition-size.patch b/target/linux/generic/backport-4.9/069-v4.18-mtd-bcm47xxpart-improve-handling-TRX-partition-size.patch
deleted file mode 100644 (file)
index e08f8da..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-From 237ea0d4762cc14d0fc80e80d61f0f08e1050c7f Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Thu, 12 Apr 2018 07:24:52 +0200
-Subject: [PATCH] mtd: bcm47xxpart: improve handling TRX partition size
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-When bcm47xxpart finds a TRX partition (container) it's supposed to jump
-to the end of it and keep looking for more partitions. TRX and its
-subpartitions are handled by a separate parser.
-
-The problem with old code was relying on the length specified in a TRX
-header. That isn't reliable as TRX is commonly modified to have checksum
-cover only non-changing subpartitions. Otherwise modifying e.g. a rootfs
-would result in CRC32 mismatch and bootloader refusing to boot a
-firmware.
-
-Fix it by trying better to figure out a real TRX size. We can securely
-assume that TRX has to cover all subpartitions and the last one is at
-least of a block size in size. Then compare it with a length field.
-
-This makes code more optimal & reliable thanks to skipping data that
-shouldn't be parsed.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
----
- drivers/mtd/bcm47xxpart.c | 22 ++++++++++++++++++----
- 1 file changed, 18 insertions(+), 4 deletions(-)
-
---- a/drivers/mtd/bcm47xxpart.c
-+++ b/drivers/mtd/bcm47xxpart.c
-@@ -186,6 +186,8 @@ static int bcm47xxpart_parse(struct mtd_
-               /* TRX */
-               if (buf[0x000 / 4] == TRX_MAGIC) {
-                       struct trx_header *trx;
-+                      uint32_t last_subpart;
-+                      uint32_t trx_size;
-                       if (trx_num >= ARRAY_SIZE(trx_parts))
-                               pr_warn("No enough space to store another TRX found at 0x%X\n",
-@@ -195,11 +197,23 @@ static int bcm47xxpart_parse(struct mtd_
-                       bcm47xxpart_add_part(&parts[curr_part++], "firmware",
-                                            offset, 0);
--                      /* Jump to the end of TRX */
-+                      /*
-+                       * Try to find TRX size. The "length" field isn't fully
-+