From f44eeed25de615a69272131ae22b49b4be3c5ffd Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Mon, 2 May 2022 00:06:23 -0400 Subject: [PATCH] Fixes for 5.15 Signed-off-by: Sasha Levin --- ...a-platforms-fix-deadlock-in-rs_close.patch | 86 ++++++ ...rm-dts-am3517-evm-fix-misc-pinmuxing.patch | 153 +++++++++++ .../arm-dts-at91-fix-pinctrl-phandles.patch | 78 ++++++ ...map-mclk-for-wm8731-on-at91sam9g20ek.patch | 45 +++ ...a5d4_xplained-fix-pinctrl-phandle-na.patch | 44 +++ ...-suspend-warning-for-vpe-powerdomain.patch | 54 ++++ ...rm-dts-fix-mmc-order-for-omap3-gta04.patch | 38 +++ ...-apalis-fix-sgtl5000-detection-issue.patch | 71 +++++ ...-imx6ull-colibri-fix-vqmmc-regulator.patch | 39 +++ ...som-lv-fix-wrong-pinmuxing-on-omap35.patch | 104 +++++++ ...ix-refcount-leak-in-omap_gic_of_init.patch | 42 +++ ...-ddr4-evk-describe-the-32.768-khz-pm.patch | 45 +++ .../arm64-dts-imx8mn-fix-sai-nodes.patch | 80 ++++++ ...-correct-scu-clock-controller-s-comp.patch | 51 ++++ ...remove-cpu-opps-below-1ghz-for-g12b-.patch | 146 ++++++++++ ...remove-cpu-opps-below-1ghz-for-sm1-b.patch | 60 ++++ ...sm1-bananapi-m5-fix-wrong-gpio-pin-l.patch | 42 +++ ...cpi-correct-device-endpoints-for-max.patch | 46 ++++ ...ble-the-regulator-when-probing-fails.patch | 90 ++++++ .../bnx2x-fix-napi-api-usage-sequence.patch | 152 +++++++++++ ...iscard-lowest-hash-bit-for-non-layer.patch | 99 +++++++ ...h-when-using-bpf_skb_set_tunnel_key-.patch | 88 ++++++ ...x-the-return-value-of-sunxi_rsb_devi.patch | 43 +++ ...-omap3-gpt12-quirk-handling-soc-spec.patch | 65 +++++ ...-unwritten-data-to-the-server-before.patch | 59 ++++ ...mmc-check-return-value-after-calling.patch | 39 +++ ...ry-leak-in-sun50i_cpufreq_nvmem_prob.patch | 64 +++++ ...com-cpufreq-hw-clear-dcvs-interrupts.patch | 65 +++++ ...freq-hw-fix-throttle-frequency-value.patch | 86 ++++++ ...fix-the-race-between-lmh-worker-and-.patch | 73 +++++ ...s-net-hippi-fix-deadlock-in-rr_close.patch | 53 ++++ ...fix-memory-leak-in-dcn21_clock_sourc.patch | 34 +++ .../drm-amdkfd-fix-gws-queue-count.patch | 222 +++++++++++++++ ...e-obsolete-references-to-phys_offset.patch | 65 +++++ ...in-start_this_handle-during-umount-f.patch | 118 ++++++++ ...re-not-to-return-short-direct-writes.patch | 37 +++ .../gfs2-minor-retry-logic-cleanup.patch | 86 ++++++ ...eads-or-writes-upon-glock-contention.patch | 52 ++++ ...less-loops-in-gfs2_file_buffered_wri.patch | 56 ++++ ...i160-disable-regulator-in-error-path.patch | 90 ++++++ ...ct-qcom-sdx55-drop-ip0-interconnects.patch | 97 +++++++ ...eck-reserved-fields-for-recv-recvmsg.patch | 35 +++ ...eck-reserved-fields-for-send-sendmsg.patch | 35 +++ ...-o_seqno-start-from-0-in-native-mode.patch | 70 +++++ ...ix-race-condition-on-o_seqno-in-coll.patch | 152 +++++++++++ ...-o_seqno-start-from-0-in-native-mode.patch | 51 ++++ ...rint-the-memory-size-of-ip_vs_conn_t.patch | 38 +++ ...gbe-ensure-ipsec-vf-pf-compatibility.patch | 45 +++ ...crement-reference-count-of-parent-fp.patch | 51 ++++ ...sector-size-to-fs_sector_size_inform.patch | 66 +++++ ...pc-if-fix-hf-ospi-data-transfer-in-m.patch | 169 ++++++++++++ ...rt-field-data-corruption-in-mtd_info.patch | 48 ++++ ...awnand-fix-ecc-parameters-for-mt7622.patch | 99 +++++++ ...return-value-check-of-wait_for_compl.patch | 84 ++++++ ...e-status-block-before-tx-timestampin.patch | 61 +++++ ...ing-of_node_put-in-dsa_port_link_reg.patch | 39 +++ ...swip-don-t-set-gswip_mii_cfg_rmii_cl.patch | 60 ++++ ...x-fix-port_hidden_wait-to-account-fo.patch | 54 ++++ ...ing-of_node_put-in-fec_enet_init_sto.patch | 36 +++ ...urn-value-for-mailbox-handling-in-pf.patch | 100 +++++++ ...lidity-check-for-message-data-length.patch | 42 +++ ...nited-state-and-stop-client-after-fa.patch | 54 ++++ ...the-return-code-of-hclge_get_ring_ch.patch | 40 +++ ...marvell10g-fix-return-value-on-error.patch | 41 +++ ...-code-when-tcp-connection-was-refuse.patch | 41 +++ ...track-fix-udp-offload-timeout-sysctl.patch | 45 +++ ...t_rbtree-overlap-detection-with-elem.patch | 49 ++++ ...-addresses-of-synthesized-spe-events.patch | 55 ++++ ...error-path-in-phy_g12a_usb3_pcie_pro.patch | 73 +++++ ...6600-fix-pm-error-handling-in-phy_md.patch | 46 ++++ ...os5250-sata-fix-missing-device-put-i.patch | 77 ++++++ ...missing-of_node_put-in-exynos_sata_p.patch | 38 +++ ...ng-pm_runtime_disable-in-serdes_am65.patch | 39 +++ ...-fix-error-handling-in-omap_usb2_ena.patch | 38 +++ ...nctrl-mediatek-moore-fix-build-error.patch | 42 +++ ...chio-fix-use-of-irq_of_parse_and_map.patch | 43 +++ ...ctrl-rockchip-fix-rk3308-pinmux-bits.patch | 162 +++++++++++ ...-not-call-stm32_gpio_get-for-edge-tr.patch | 50 ++++ ...ep-pinctrl-block-clock-enabled-when-.patch | 140 ++++++++++ .../powerpc-perf-fix-32bit-compile.patch | 44 +++ ...dd-ethtool-private-flag-for-driver-d.patch | 258 ++++++++++++++++++ ...strreset_chunk-in-sctp_generate_reco.patch | 66 +++++ ...t-vm-verify-mmap-addr-in-mremap_test.patch | 109 ++++++++ ...fy-remap-destination-address-in-mrem.patch | 107 ++++++++ queue-5.15/series | 95 +++++++ ...e-the-most-recently-sent-skb-when-fi.patch | 102 +++++++ ...y-not-work-correctly-when-receiving-.patch | 88 ++++++ ...l-xmit-stalls-caused-by-tcp_notsent_.patch | 145 ++++++++++ ...sure-treq-af_specific-is-initialized.patch | 145 ++++++++++ ...t-tcp_header_len-for-incoming-connec.patch | 40 +++ ...ip-tls_append_frag-on-zero-copy-size.patch | 59 ++++ ...nt-ring-dequeue-pointer-erdp-update-.patch | 64 +++++ ...v-udlfb-properly-check-endpoint-type.patch | 92 +++++++ ...-check-for-metadata_dst-with-skb_val.patch | 103 +++++++ ...shcache-fix-wrong-alignment-if-size-.patch | 51 ++++ ...-l2fwd-for-copy-mode-busy-poll-combo.patch | 55 ++++ 96 files changed, 7088 insertions(+) create mode 100644 queue-5.15/arch-xtensa-platforms-fix-deadlock-in-rs_close.patch create mode 100644 queue-5.15/arm-dts-am3517-evm-fix-misc-pinmuxing.patch create mode 100644 queue-5.15/arm-dts-at91-fix-pinctrl-phandles.patch create mode 100644 queue-5.15/arm-dts-at91-map-mclk-for-wm8731-on-at91sam9g20ek.patch create mode 100644 queue-5.15/arm-dts-at91-sama5d4_xplained-fix-pinctrl-phandle-na.patch create mode 100644 queue-5.15/arm-dts-dra7-fix-suspend-warning-for-vpe-powerdomain.patch create mode 100644 queue-5.15/arm-dts-fix-mmc-order-for-omap3-gta04.patch create mode 100644 queue-5.15/arm-dts-imx6qdl-apalis-fix-sgtl5000-detection-issue.patch create mode 100644 queue-5.15/arm-dts-imx6ull-colibri-fix-vqmmc-regulator.patch create mode 100644 queue-5.15/arm-dts-logicpd-som-lv-fix-wrong-pinmuxing-on-omap35.patch create mode 100644 queue-5.15/arm-omap2-fix-refcount-leak-in-omap_gic_of_init.patch create mode 100644 queue-5.15/arm64-dts-imx8mn-ddr4-evk-describe-the-32.768-khz-pm.patch create mode 100644 queue-5.15/arm64-dts-imx8mn-fix-sai-nodes.patch create mode 100644 queue-5.15/arm64-dts-imx8qm-correct-scu-clock-controller-s-comp.patch create mode 100644 queue-5.15/arm64-dts-meson-remove-cpu-opps-below-1ghz-for-g12b-.patch create mode 100644 queue-5.15/arm64-dts-meson-remove-cpu-opps-below-1ghz-for-sm1-b.patch create mode 100644 queue-5.15/arm64-dts-meson-sm1-bananapi-m5-fix-wrong-gpio-pin-l.patch create mode 100644 queue-5.15/asoc-intel-soc-acpi-correct-device-endpoints-for-max.patch create mode 100644 queue-5.15/asoc-wm8731-disable-the-regulator-when-probing-fails.patch create mode 100644 queue-5.15/bnx2x-fix-napi-api-usage-sequence.patch create mode 100644 queue-5.15/bonding-do-not-discard-lowest-hash-bit-for-non-layer.patch create mode 100644 queue-5.15/bpf-lwt-fix-crash-when-using-bpf_skb_set_tunnel_key-.patch create mode 100644 queue-5.15/bus-sunxi-rsb-fix-the-return-value-of-sunxi_rsb_devi.patch create mode 100644 queue-5.15/bus-ti-sysc-make-omap3-gpt12-quirk-handling-soc-spec.patch create mode 100644 queue-5.15/cifs-destage-any-unwritten-data-to-the-server-before.patch create mode 100644 queue-5.15/clk-sunxi-sun9i-mmc-check-return-value-after-calling.patch create mode 100644 queue-5.15/cpufreq-fix-memory-leak-in-sun50i_cpufreq_nvmem_prob.patch create mode 100644 queue-5.15/cpufreq-qcom-cpufreq-hw-clear-dcvs-interrupts.patch create mode 100644 queue-5.15/cpufreq-qcom-cpufreq-hw-fix-throttle-frequency-value.patch create mode 100644 queue-5.15/cpufreq-qcom-hw-fix-the-race-between-lmh-worker-and-.patch create mode 100644 queue-5.15/drivers-net-hippi-fix-deadlock-in-rr_close.patch create mode 100644 queue-5.15/drm-amd-display-fix-memory-leak-in-dcn21_clock_sourc.patch create mode 100644 queue-5.15/drm-amdkfd-fix-gws-queue-count.patch create mode 100644 queue-5.15/drm-sun4i-remove-obsolete-references-to-phys_offset.patch create mode 100644 queue-5.15/ext4-fix-bug_on-in-start_this_handle-during-umount-f.patch create mode 100644 queue-5.15/gfs2-make-sure-not-to-return-short-direct-writes.patch create mode 100644 queue-5.15/gfs2-minor-retry-logic-cleanup.patch create mode 100644 queue-5.15/gfs2-no-short-reads-or-writes-upon-glock-contention.patch create mode 100644 queue-5.15/gfs2-prevent-endless-loops-in-gfs2_file_buffered_wri.patch create mode 100644 queue-5.15/iio-imu-bmi160-disable-regulator-in-error-path.patch create mode 100644 queue-5.15/interconnect-qcom-sdx55-drop-ip0-interconnects.patch create mode 100644 queue-5.15/io_uring-check-reserved-fields-for-recv-recvmsg.patch create mode 100644 queue-5.15/io_uring-check-reserved-fields-for-send-sendmsg.patch create mode 100644 queue-5.15/ip6_gre-make-o_seqno-start-from-0-in-native-mode.patch create mode 100644 queue-5.15/ip_gre-ip6_gre-fix-race-condition-on-o_seqno-in-coll.patch create mode 100644 queue-5.15/ip_gre-make-o_seqno-start-from-0-in-native-mode.patch create mode 100644 queue-5.15/ipvs-correctly-print-the-memory-size-of-ip_vs_conn_t.patch create mode 100644 queue-5.15/ixgbe-ensure-ipsec-vf-pf-compatibility.patch create mode 100644 queue-5.15/ksmbd-increment-reference-count-of-parent-fp.patch create mode 100644 queue-5.15/ksmbd-set-fixed-sector-size-to-fs_sector_size_inform.patch create mode 100644 queue-5.15/memory-renesas-rpc-if-fix-hf-ospi-data-transfer-in-m.patch create mode 100644 queue-5.15/mtd-fix-part-field-data-corruption-in-mtd_info.patch create mode 100644 queue-5.15/mtd-rawnand-fix-ecc-parameters-for-mt7622.patch create mode 100644 queue-5.15/mtd-rawnand-fix-return-value-check-of-wait_for_compl.patch create mode 100644 queue-5.15/net-bcmgenet-hide-status-block-before-tx-timestampin.patch create mode 100644 queue-5.15/net-dsa-add-missing-of_node_put-in-dsa_port_link_reg.patch create mode 100644 queue-5.15/net-dsa-lantiq_gswip-don-t-set-gswip_mii_cfg_rmii_cl.patch create mode 100644 queue-5.15/net-dsa-mv88e6xxx-fix-port_hidden_wait-to-account-fo.patch create mode 100644 queue-5.15/net-fec-add-missing-of_node_put-in-fec_enet_init_sto.patch create mode 100644 queue-5.15/net-hns3-add-return-value-for-mailbox-handling-in-pf.patch create mode 100644 queue-5.15/net-hns3-add-validity-check-for-message-data-length.patch create mode 100644 queue-5.15/net-hns3-clear-inited-state-and-stop-client-after-fa.patch create mode 100644 queue-5.15/net-hns3-modify-the-return-code-of-hclge_get_ring_ch.patch create mode 100644 queue-5.15/net-phy-marvell10g-fix-return-value-on-error.patch create mode 100644 queue-5.15/net-smc-sync-err-code-when-tcp-connection-was-refuse.patch create mode 100644 queue-5.15/netfilter-conntrack-fix-udp-offload-timeout-sysctl.patch create mode 100644 queue-5.15/netfilter-nft_set_rbtree-overlap-detection-with-elem.patch create mode 100644 queue-5.15/perf-arm-spe-fix-addresses-of-synthesized-spe-events.patch create mode 100644 queue-5.15/phy-amlogic-fix-error-path-in-phy_g12a_usb3_pcie_pro.patch create mode 100644 queue-5.15/phy-mapphone-mdm6600-fix-pm-error-handling-in-phy_md.patch create mode 100644 queue-5.15/phy-samsung-exynos5250-sata-fix-missing-device-put-i.patch create mode 100644 queue-5.15/phy-samsung-fix-missing-of_node_put-in-exynos_sata_p.patch create mode 100644 queue-5.15/phy-ti-add-missing-pm_runtime_disable-in-serdes_am65.patch create mode 100644 queue-5.15/phy-ti-omap-usb2-fix-error-handling-in-omap_usb2_ena.patch create mode 100644 queue-5.15/pinctrl-mediatek-moore-fix-build-error.patch create mode 100644 queue-5.15/pinctrl-pistachio-fix-use-of-irq_of_parse_and_map.patch create mode 100644 queue-5.15/pinctrl-rockchip-fix-rk3308-pinmux-bits.patch create mode 100644 queue-5.15/pinctrl-stm32-do-not-call-stm32_gpio_get-for-edge-tr.patch create mode 100644 queue-5.15/pinctrl-stm32-keep-pinctrl-block-clock-enabled-when-.patch create mode 100644 queue-5.15/powerpc-perf-fix-32bit-compile.patch create mode 100644 queue-5.15/revert-ibmvnic-add-ethtool-private-flag-for-driver-d.patch create mode 100644 queue-5.15/sctp-check-asoc-strreset_chunk-in-sctp_generate_reco.patch create mode 100644 queue-5.15/selftest-vm-verify-mmap-addr-in-mremap_test.patch create mode 100644 queue-5.15/selftest-vm-verify-remap-destination-address-in-mrem.patch create mode 100644 queue-5.15/tcp-ensure-to-use-the-most-recently-sent-skb-when-fi.patch create mode 100644 queue-5.15/tcp-fix-f-rto-may-not-work-correctly-when-receiving-.patch create mode 100644 queue-5.15/tcp-fix-potential-xmit-stalls-caused-by-tcp_notsent_.patch create mode 100644 queue-5.15/tcp-make-sure-treq-af_specific-is-initialized.patch create mode 100644 queue-5.15/tcp-md5-incorrect-tcp_header_len-for-incoming-connec.patch create mode 100644 queue-5.15/tls-skip-tls_append_frag-on-zero-copy-size.patch create mode 100644 queue-5.15/usb-fix-xhci-event-ring-dequeue-pointer-erdp-update-.patch create mode 100644 queue-5.15/video-fbdev-udlfb-properly-check-endpoint-type.patch create mode 100644 queue-5.15/wireguard-device-check-for-metadata_dst-with-skb_val.patch create mode 100644 queue-5.15/x86-__memcpy_flushcache-fix-wrong-alignment-if-size-.patch create mode 100644 queue-5.15/xsk-fix-l2fwd-for-copy-mode-busy-poll-combo.patch diff --git a/queue-5.15/arch-xtensa-platforms-fix-deadlock-in-rs_close.patch b/queue-5.15/arch-xtensa-platforms-fix-deadlock-in-rs_close.patch new file mode 100644 index 00000000000..597e344c793 --- /dev/null +++ b/queue-5.15/arch-xtensa-platforms-fix-deadlock-in-rs_close.patch @@ -0,0 +1,86 @@ +From dc269ffe8db2c05dccf096d92860ed8efdba179e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Apr 2022 23:44:30 +0800 +Subject: arch: xtensa: platforms: Fix deadlock in rs_close() + +From: Duoming Zhou + +[ Upstream commit eb5adc70754d26a260f8b42d39db42da0d0af500 ] + +There is a deadlock in rs_close(), which is shown +below: + + (Thread 1) | (Thread 2) + | rs_open() +rs_close() | mod_timer() + spin_lock_bh() //(1) | (wait a time) + ... | rs_poll() + del_timer_sync() | spin_lock() //(2) + (wait timer to stop) | ... + +We hold timer_lock in position (1) of thread 1 and +use del_timer_sync() to wait timer to stop, but timer handler +also need timer_lock in position (2) of thread 2. +As a result, rs_close() will block forever. + +This patch deletes the redundant timer_lock in order to +prevent the deadlock. Because there is no race condition +between rs_close, rs_open and rs_poll. + +Signed-off-by: Duoming Zhou +Message-Id: <20220407154430.22387-1-duoming@zju.edu.cn> +Signed-off-by: Max Filippov +Signed-off-by: Sasha Levin +--- + arch/xtensa/platforms/iss/console.c | 8 -------- + 1 file changed, 8 deletions(-) + +diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c +index 81d7c7e8f7e9..10b79d3c74e0 100644 +--- a/arch/xtensa/platforms/iss/console.c ++++ b/arch/xtensa/platforms/iss/console.c +@@ -36,24 +36,19 @@ static void rs_poll(struct timer_list *); + static struct tty_driver *serial_driver; + static struct tty_port serial_port; + static DEFINE_TIMER(serial_timer, rs_poll); +-static DEFINE_SPINLOCK(timer_lock); + + static int rs_open(struct tty_struct *tty, struct file * filp) + { +- spin_lock_bh(&timer_lock); + if (tty->count == 1) + mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); +- spin_unlock_bh(&timer_lock); + + return 0; + } + + static void rs_close(struct tty_struct *tty, struct file * filp) + { +- spin_lock_bh(&timer_lock); + if (tty->count == 1) + del_timer_sync(&serial_timer); +- spin_unlock_bh(&timer_lock); + } + + +@@ -73,8 +68,6 @@ static void rs_poll(struct timer_list *unused) + int rd = 1; + unsigned char c; + +- spin_lock(&timer_lock); +- + while (simc_poll(0)) { + rd = simc_read(0, &c, 1); + if (rd <= 0) +@@ -87,7 +80,6 @@ static void rs_poll(struct timer_list *unused) + tty_flip_buffer_push(port); + if (rd) + mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); +- spin_unlock(&timer_lock); + } + + +-- +2.35.1 + diff --git a/queue-5.15/arm-dts-am3517-evm-fix-misc-pinmuxing.patch b/queue-5.15/arm-dts-am3517-evm-fix-misc-pinmuxing.patch new file mode 100644 index 00000000000..9fd731a3053 --- /dev/null +++ b/queue-5.15/arm-dts-am3517-evm-fix-misc-pinmuxing.patch @@ -0,0 +1,153 @@ +From 557a1f808c79ff2d398486d9f2eccd229646c5a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 26 Feb 2022 15:48:19 -0600 +Subject: ARM: dts: am3517-evm: Fix misc pinmuxing + +From: Adam Ford + +[ Upstream commit 942da3af32b2288e674736eb159d1fc676261691 ] + +The bootloader for the AM3517 has previously done much of the pin +muxing, but as the bootloader is moving more and more to a model +based on the device tree, it may no longer automatically mux the +pins, so it is necessary to add the pinmuxing to the Linux device +trees so the respective peripherals can remain functional. + +Fixes: 6ed1d7997561 ("ARM: dts: am3517-evm: Add support for UI board and Audio") +Signed-off-by: Adam Ford +Message-Id: <20220226214820.747847-1-aford173@gmail.com> +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/am3517-evm.dts | 45 +++++++++++++++++++++++++++---- + arch/arm/boot/dts/am3517-som.dtsi | 9 +++++++ + 2 files changed, 49 insertions(+), 5 deletions(-) + +diff --git a/arch/arm/boot/dts/am3517-evm.dts b/arch/arm/boot/dts/am3517-evm.dts +index 0d2fac98ce7d..c8b80f156ec9 100644 +--- a/arch/arm/boot/dts/am3517-evm.dts ++++ b/arch/arm/boot/dts/am3517-evm.dts +@@ -161,6 +161,8 @@ pwm11: dmtimer-pwm@11 { + + /* HS USB Host PHY on PORT 1 */ + hsusb1_phy: hsusb1_phy { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&hsusb1_rst_pins>; + compatible = "usb-nop-xceiv"; + reset-gpios = <&gpio2 25 GPIO_ACTIVE_LOW>; /* gpio_57 */ + #phy-cells = <0>; +@@ -168,7 +170,9 @@ hsusb1_phy: hsusb1_phy { + }; + + &davinci_emac { +- status = "okay"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <ðernet_pins>; ++ status = "okay"; + }; + + &davinci_mdio { +@@ -193,6 +197,8 @@ dpi_out: endpoint { + }; + + &i2c2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c2_pins>; + clock-frequency = <400000>; + /* User DIP swithes [1:8] / User LEDS [1:2] */ + tca6416: gpio@21 { +@@ -205,6 +211,8 @@ tca6416: gpio@21 { + }; + + &i2c3 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c3_pins>; + clock-frequency = <400000>; + }; + +@@ -223,6 +231,8 @@ &mmc3 { + }; + + &usbhshost { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&hsusb1_pins>; + port1-mode = "ehci-phy"; + }; + +@@ -231,8 +241,35 @@ &usbhsehci { + }; + + &omap3_pmx_core { +- pinctrl-names = "default"; +- pinctrl-0 = <&hsusb1_rst_pins>; ++ ++ ethernet_pins: pinmux_ethernet_pins { ++ pinctrl-single,pins = < ++ OMAP3_CORE1_IOPAD(0x21fe, PIN_INPUT | MUX_MODE0) /* rmii_mdio_data */ ++ OMAP3_CORE1_IOPAD(0x2200, MUX_MODE0) /* rmii_mdio_clk */ ++ OMAP3_CORE1_IOPAD(0x2202, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rmii_rxd0 */ ++ OMAP3_CORE1_IOPAD(0x2204, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rmii_rxd1 */ ++ OMAP3_CORE1_IOPAD(0x2206, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rmii_crs_dv */ ++ OMAP3_CORE1_IOPAD(0x2208, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* rmii_rxer */ ++ OMAP3_CORE1_IOPAD(0x220a, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* rmii_txd0 */ ++ OMAP3_CORE1_IOPAD(0x220c, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* rmii_txd1 */ ++ OMAP3_CORE1_IOPAD(0x220e, PIN_OUTPUT_PULLDOWN |MUX_MODE0) /* rmii_txen */ ++ OMAP3_CORE1_IOPAD(0x2210, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rmii_50mhz_clk */ ++ >; ++ }; ++ ++ i2c2_pins: pinmux_i2c2_pins { ++ pinctrl-single,pins = < ++ OMAP3_CORE1_IOPAD(0x21be, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c2_scl */ ++ OMAP3_CORE1_IOPAD(0x21c0, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c2_sda */ ++ >; ++ }; ++ ++ i2c3_pins: pinmux_i2c3_pins { ++ pinctrl-single,pins = < ++ OMAP3_CORE1_IOPAD(0x21c2, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c3_scl */ ++ OMAP3_CORE1_IOPAD(0x21c4, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c3_sda */ ++ >; ++ }; + + leds_pins: pinmux_leds_pins { + pinctrl-single,pins = < +@@ -300,8 +337,6 @@ OMAP3_CORE1_IOPAD(0x20ba, PIN_OUTPUT | MUX_MODE4) /* gpmc_ncs6.gpio_57 */ + }; + + &omap3_pmx_core2 { +- pinctrl-names = "default"; +- pinctrl-0 = <&hsusb1_pins>; + + hsusb1_pins: pinmux_hsusb1_pins { + pinctrl-single,pins = < +diff --git a/arch/arm/boot/dts/am3517-som.dtsi b/arch/arm/boot/dts/am3517-som.dtsi +index 8b669e2eafec..f7b680f6c48a 100644 +--- a/arch/arm/boot/dts/am3517-som.dtsi ++++ b/arch/arm/boot/dts/am3517-som.dtsi +@@ -69,6 +69,8 @@ nand@0,0 { + }; + + &i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; + clock-frequency = <400000>; + + s35390a: s35390a@30 { +@@ -179,6 +181,13 @@ bluetooth { + + &omap3_pmx_core { + ++ i2c1_pins: pinmux_i2c1_pins { ++ pinctrl-single,pins = < ++ OMAP3_CORE1_IOPAD(0x21ba, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c1_scl */ ++ OMAP3_CORE1_IOPAD(0x21bc, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c1_sda */ ++ >; ++ }; ++ + wl12xx_buffer_pins: pinmux_wl12xx_buffer_pins { + pinctrl-single,pins = < + OMAP3_CORE1_IOPAD(0x2156, PIN_OUTPUT | MUX_MODE4) /* mmc1_dat7.gpio_129 */ +-- +2.35.1 + diff --git a/queue-5.15/arm-dts-at91-fix-pinctrl-phandles.patch b/queue-5.15/arm-dts-at91-fix-pinctrl-phandles.patch new file mode 100644 index 00000000000..c89ae0dfc9a --- /dev/null +++ b/queue-5.15/arm-dts-at91-fix-pinctrl-phandles.patch @@ -0,0 +1,78 @@ +From cb43eb4b66da422e74061ee36c4a3777eb6bfb5f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Mar 2022 17:13:23 +0300 +Subject: ARM: dts: at91: fix pinctrl phandles + +From: Claudiu Beznea + +[ Upstream commit 0c640d9544d0109da3889d71ae77301e556db977 ] + +Commit bf781869e5cf ("ARM: dts: at91: add pinctrl-{names, 0} for all +gpios") introduces pinctrl phandles for pins used by individual +controllers to avoid failures due to commit 2ab73c6d8323 ("gpio: +Support GPIO controllers without pin-ranges"). For SPI controllers +available on SAMA5D4 and SAMA5D3 some of the pins are defined in +SoC specific dtsi on behalf of pinctrl-0. Adding extra pinctrl phandles +on board specific dts also on behalf of pinctrl-0 overwrite the pinctrl-0 +phandle specified in SoC specific dtsi. Thus add the board specific +pinctrl to pinctrl-1. + +Fixes: bf781869e5cf ("ARM: dts: at91: add pinctrl-{names, 0} for all gpios") +Depends-on: 5c8b49852910 ("ARM: dts: at91: sama5d4_xplained: fix pinctrl phandle name") +Reported-by: Ajay Kathat +Co-developed-by: Ajay Kathat +Signed-off-by: Ajay Kathat +Tested-by: Ajay Kathat +Signed-off-by: Claudiu Beznea +Signed-off-by: Nicolas Ferre +Link: https://lore.kernel.org/r/20220331141323.194355-2-claudiu.beznea@microchip.com +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/at91-sama5d3_xplained.dts | 8 ++++---- + arch/arm/boot/dts/at91-sama5d4_xplained.dts | 4 ++-- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/arch/arm/boot/dts/at91-sama5d3_xplained.dts b/arch/arm/boot/dts/at91-sama5d3_xplained.dts +index d72c042f2850..a49c2966b41e 100644 +--- a/arch/arm/boot/dts/at91-sama5d3_xplained.dts ++++ b/arch/arm/boot/dts/at91-sama5d3_xplained.dts +@@ -57,8 +57,8 @@ slot@0 { + }; + + spi0: spi@f0004000 { +- pinctrl-names = "default"; +- pinctrl-0 = <&pinctrl_spi0_cs>; ++ pinctrl-names = "default", "cs"; ++ pinctrl-1 = <&pinctrl_spi0_cs>; + cs-gpios = <&pioD 13 0>, <0>, <0>, <&pioD 16 0>; + status = "okay"; + }; +@@ -171,8 +171,8 @@ slot@0 { + }; + + spi1: spi@f8008000 { +- pinctrl-names = "default"; +- pinctrl-0 = <&pinctrl_spi1_cs>; ++ pinctrl-names = "default", "cs"; ++ pinctrl-1 = <&pinctrl_spi1_cs>; + cs-gpios = <&pioC 25 0>; + status = "okay"; + }; +diff --git a/arch/arm/boot/dts/at91-sama5d4_xplained.dts b/arch/arm/boot/dts/at91-sama5d4_xplained.dts +index accb92cfac44..e519d2747936 100644 +--- a/arch/arm/boot/dts/at91-sama5d4_xplained.dts ++++ b/arch/arm/boot/dts/at91-sama5d4_xplained.dts +@@ -81,8 +81,8 @@ usart4: serial@fc010000 { + }; + + spi1: spi@fc018000 { +- pinctrl-names = "default"; +- pinctrl-0 = <&pinctrl_spi1_cs>; ++ pinctrl-names = "default", "cs"; ++ pinctrl-1 = <&pinctrl_spi1_cs>; + cs-gpios = <&pioB 21 0>; + status = "okay"; + }; +-- +2.35.1 + diff --git a/queue-5.15/arm-dts-at91-map-mclk-for-wm8731-on-at91sam9g20ek.patch b/queue-5.15/arm-dts-at91-map-mclk-for-wm8731-on-at91sam9g20ek.patch new file mode 100644 index 00000000000..88d230ef884 --- /dev/null +++ b/queue-5.15/arm-dts-at91-map-mclk-for-wm8731-on-at91sam9g20ek.patch @@ -0,0 +1,45 @@ +From 92a3eb3be86e915c118ad26c317b504eaf7cfd9c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Apr 2022 11:28:05 +0100 +Subject: ARM: dts: at91: Map MCLK for wm8731 on at91sam9g20ek + +From: Mark Brown + +[ Upstream commit 0e486fe341fabd8e583f3d601a874cd394979c45 ] + +The MCLK of the WM8731 on the AT91SAM9G20-EK board is connected to the +PCK0 output of the SoC and is expected to be set to 12MHz. Previously +this was mapped using pre-common clock API calls in the audio machine +driver but the conversion to the common clock framework broke that so +describe things in the DT instead. + +Fixes: ff78a189b0ae55f ("ARM: at91: remove old at91-specific clock driver") +Signed-off-by: Mark Brown +Reviewed-by: Claudiu Beznea +Signed-off-by: Nicolas Ferre +Link: https://lore.kernel.org/r/20220404102806.581374-2-broonie@kernel.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/at91sam9g20ek_common.dtsi | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi +index 87bb39060e8b..ca03685f0f08 100644 +--- a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi ++++ b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi +@@ -219,6 +219,12 @@ i2c-gpio-0 { + wm8731: wm8731@1b { + compatible = "wm8731"; + reg = <0x1b>; ++ ++ /* PCK0 at 12MHz */ ++ clocks = <&pmc PMC_TYPE_SYSTEM 8>; ++ clock-names = "mclk"; ++ assigned-clocks = <&pmc PMC_TYPE_SYSTEM 8>; ++ assigned-clock-rates = <12000000>; + }; + }; + +-- +2.35.1 + diff --git a/queue-5.15/arm-dts-at91-sama5d4_xplained-fix-pinctrl-phandle-na.patch b/queue-5.15/arm-dts-at91-sama5d4_xplained-fix-pinctrl-phandle-na.patch new file mode 100644 index 00000000000..ff5f34f8b0b --- /dev/null +++ b/queue-5.15/arm-dts-at91-sama5d4_xplained-fix-pinctrl-phandle-na.patch @@ -0,0 +1,44 @@ +From aa9d26a3cd4acd0249297b2bd05c098cd660edda Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Mar 2022 17:13:22 +0300 +Subject: ARM: dts: at91: sama5d4_xplained: fix pinctrl phandle name + +From: Claudiu Beznea + +[ Upstream commit 5c8b49852910caffeebb1ce541fdd264ffc691b8 ] + +Pinctrl phandle is for spi1 so rename it to reflect this. + +Signed-off-by: Claudiu Beznea +Signed-off-by: Nicolas Ferre +Link: https://lore.kernel.org/r/20220331141323.194355-1-claudiu.beznea@microchip.com +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/at91-sama5d4_xplained.dts | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/boot/dts/at91-sama5d4_xplained.dts b/arch/arm/boot/dts/at91-sama5d4_xplained.dts +index d241c24f0d83..accb92cfac44 100644 +--- a/arch/arm/boot/dts/at91-sama5d4_xplained.dts ++++ b/arch/arm/boot/dts/at91-sama5d4_xplained.dts +@@ -82,7 +82,7 @@ usart4: serial@fc010000 { + + spi1: spi@fc018000 { + pinctrl-names = "default"; +- pinctrl-0 = <&pinctrl_spi0_cs>; ++ pinctrl-0 = <&pinctrl_spi1_cs>; + cs-gpios = <&pioB 21 0>; + status = "okay"; + }; +@@ -140,7 +140,7 @@ pinctrl_macb0_phy_irq: macb0_phy_irq_0 { + atmel,pins = + ; + }; +- pinctrl_spi0_cs: spi0_cs_default { ++ pinctrl_spi1_cs: spi1_cs_default { + atmel,pins = + ; + }; +-- +2.35.1 + diff --git a/queue-5.15/arm-dts-dra7-fix-suspend-warning-for-vpe-powerdomain.patch b/queue-5.15/arm-dts-dra7-fix-suspend-warning-for-vpe-powerdomain.patch new file mode 100644 index 00000000000..ed78d33d903 --- /dev/null +++ b/queue-5.15/arm-dts-dra7-fix-suspend-warning-for-vpe-powerdomain.patch @@ -0,0 +1,54 @@ +From b84767315b910122de6aaa34213d78f89abdded9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Apr 2022 12:26:51 +0300 +Subject: ARM: dts: dra7: Fix suspend warning for vpe powerdomain + +From: Tony Lindgren + +[ Upstream commit 8d2453d9a307c2eafd21242dd73f35f05fb7ce74 ] + +We currently are getting the following warning after a system suspend: + +Powerdomain (vpe_pwrdm) didn't enter target state 0 + +Looks like this is because the STANDBYMODE bit for SMART_IDLE should +not be used. The TRM "Table 12-348. VPE_SYSCONFIG" says that the value +for SMART_IDLE is "0x2: Same behavior as bit-field value of 0x1". But +if the SMART_IDLE value is used, PM_VPE_PWRSTST LASTPOWERSTATEENTERED +bits always show value of 3. + +Let's fix the issue by dropping SMART_IDLE for vpe. And let's also add +the missing the powerdomain for vpe. + +Fixes: 1a2095160594 ("ARM: dts: dra7: Add ti-sysc node for VPE") +Cc: Benoit Parrot +Reported-by: Kevin Hilman +Reviewed-by: Kevin Hilman +Tested-by: Kevin Hilman +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/dra7-l4.dtsi | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/boot/dts/dra7-l4.dtsi b/arch/arm/boot/dts/dra7-l4.dtsi +index 0a11bacffc1f..5733e3a4ea8e 100644 +--- a/arch/arm/boot/dts/dra7-l4.dtsi ++++ b/arch/arm/boot/dts/dra7-l4.dtsi +@@ -4188,11 +4188,11 @@ target-module@1d0010 { /* 0x489d0000, ap 27 30.0 */ + reg = <0x1d0010 0x4>; + reg-names = "sysc"; + ti,sysc-midle = , +- , +- ; ++ ; + ti,sysc-sidle = , + , + ; ++ power-domains = <&prm_vpe>; + clocks = <&vpe_clkctrl DRA7_VPE_VPE_CLKCTRL 0>; + clock-names = "fck"; + #address-cells = <1>; +-- +2.35.1 + diff --git a/queue-5.15/arm-dts-fix-mmc-order-for-omap3-gta04.patch b/queue-5.15/arm-dts-fix-mmc-order-for-omap3-gta04.patch new file mode 100644 index 00000000000..74151ade53e --- /dev/null +++ b/queue-5.15/arm-dts-fix-mmc-order-for-omap3-gta04.patch @@ -0,0 +1,38 @@ +From 5695fe2d96847259522a0aa9c4828ce73f88dc19 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Mar 2022 14:00:20 +0100 +Subject: ARM: dts: Fix mmc order for omap3-gta04 + +From: H. Nikolaus Schaller + +[ Upstream commit 09269dd050094593fc747f2a5853d189fefcb6b5 ] + +Commit a1ebdb374199 ("ARM: dts: Fix swapped mmc order for omap3") +introduces general mmc aliases. Let's tailor them to the need +of the GTA04 board which does not make use of mmc2 and mmc3 interfaces. + +Fixes: a1ebdb374199 ("ARM: dts: Fix swapped mmc order for omap3") +Signed-off-by: H. Nikolaus Schaller +Message-Id: +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/omap3-gta04.dtsi | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm/boot/dts/omap3-gta04.dtsi b/arch/arm/boot/dts/omap3-gta04.dtsi +index 23ab27fe4ee5..3923b38e798d 100644 +--- a/arch/arm/boot/dts/omap3-gta04.dtsi ++++ b/arch/arm/boot/dts/omap3-gta04.dtsi +@@ -31,6 +31,8 @@ chosen { + aliases { + display0 = &lcd; + display1 = &tv0; ++ /delete-property/ mmc2; ++ /delete-property/ mmc3; + }; + + ldo_3v3: fixedregulator { +-- +2.35.1 + diff --git a/queue-5.15/arm-dts-imx6qdl-apalis-fix-sgtl5000-detection-issue.patch b/queue-5.15/arm-dts-imx6qdl-apalis-fix-sgtl5000-detection-issue.patch new file mode 100644 index 00000000000..ceb12d25836 --- /dev/null +++ b/queue-5.15/arm-dts-imx6qdl-apalis-fix-sgtl5000-detection-issue.patch @@ -0,0 +1,71 @@ +From 7f4737333de179dc2e78b3289e87c154461a2fba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 26 Mar 2022 12:14:55 -0300 +Subject: ARM: dts: imx6qdl-apalis: Fix sgtl5000 detection issue + +From: Fabio Estevam + +[ Upstream commit fa51e1dc4b91375bc18349663a52395ad585bd3c ] + +On a custom carrier board with a i.MX6Q Apalis SoM, the sgtl5000 codec +on the SoM is often not detected and the following error message is +seen when the sgtl5000 driver tries to read the ID register: + +sgtl5000 1-000a: Error reading chip id -6 + +The reason for the error is that the MCLK clock is not provided +early enough. + +Fix the problem by describing the MCLK pinctrl inside the codec +node instead of placing it inside the audmux pinctrl group. + +With this change applied the sgtl5000 is always detected on every boot. + +Fixes: 693e3ffaae5a ("ARM: dts: imx6: Add support for Toradex Apalis iMX6Q/D SoM") +Signed-off-by: Fabio Estevam +Reviewed-by: Tim Harvey +Acked-by: Max Krummenacher +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6qdl-apalis.dtsi | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/boot/dts/imx6qdl-apalis.dtsi b/arch/arm/boot/dts/imx6qdl-apalis.dtsi +index 30fa349f9d05..a696873dc1ab 100644 +--- a/arch/arm/boot/dts/imx6qdl-apalis.dtsi ++++ b/arch/arm/boot/dts/imx6qdl-apalis.dtsi +@@ -286,6 +286,8 @@ vgen6_reg: vgen6 { + codec: sgtl5000@a { + compatible = "fsl,sgtl5000"; + reg = <0x0a>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_sgtl5000>; + clocks = <&clks IMX6QDL_CLK_CKO>; + VDDA-supply = <®_module_3v3_audio>; + VDDIO-supply = <®_module_3v3>; +@@ -516,8 +518,6 @@ MX6QDL_PAD_DISP0_DAT20__AUD4_TXC 0x130b0 + MX6QDL_PAD_DISP0_DAT21__AUD4_TXD 0x130b0 + MX6QDL_PAD_DISP0_DAT22__AUD4_TXFS 0x130b0 + MX6QDL_PAD_DISP0_DAT23__AUD4_RXD 0x130b0 +- /* SGTL5000 sys_mclk */ +- MX6QDL_PAD_GPIO_5__CCM_CLKO1 0x130b0 + >; + }; + +@@ -810,6 +810,12 @@ MX6QDL_PAD_NANDF_CS1__GPIO6_IO14 0x000b0 + >; + }; + ++ pinctrl_sgtl5000: sgtl5000grp { ++ fsl,pins = < ++ MX6QDL_PAD_GPIO_5__CCM_CLKO1 0x130b0 ++ >; ++ }; ++ + pinctrl_spdif: spdifgrp { + fsl,pins = < + MX6QDL_PAD_GPIO_16__SPDIF_IN 0x1b0b0 +-- +2.35.1 + diff --git a/queue-5.15/arm-dts-imx6ull-colibri-fix-vqmmc-regulator.patch b/queue-5.15/arm-dts-imx6ull-colibri-fix-vqmmc-regulator.patch new file mode 100644 index 00000000000..964348f8f88 --- /dev/null +++ b/queue-5.15/arm-dts-imx6ull-colibri-fix-vqmmc-regulator.patch @@ -0,0 +1,39 @@ +From 1b35ab2d034b94ab7258ac2937d76bdb70afe662 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Apr 2022 10:50:54 +0200 +Subject: ARM: dts: imx6ull-colibri: fix vqmmc regulator + +From: Max Krummenacher + +[ Upstream commit 45974e4276a8d6653394f66666fc57d8ffa6de9a ] + +The correct spelling for the property is gpios. Otherwise, the regulator +will neither reserve nor control any GPIOs. Thus, any SD/MMC card which +can use UHS-I modes will fail. + +Fixes: c2e4987e0e02 ("ARM: dts: imx6ull: add Toradex Colibri iMX6ULL support") +Signed-off-by: Max Krummenacher +Signed-off-by: Denys Drozdov +Signed-off-by: Marcel Ziswiler +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/imx6ull-colibri.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/imx6ull-colibri.dtsi b/arch/arm/boot/dts/imx6ull-colibri.dtsi +index 0cdbf7b6e728..b6fc879e9dbe 100644 +--- a/arch/arm/boot/dts/imx6ull-colibri.dtsi ++++ b/arch/arm/boot/dts/imx6ull-colibri.dtsi +@@ -37,7 +37,7 @@ reg_module_3v3_avdd: regulator-module-3v3-avdd { + + reg_sd1_vmmc: regulator-sd1-vmmc { + compatible = "regulator-gpio"; +- gpio = <&gpio5 9 GPIO_ACTIVE_HIGH>; ++ gpios = <&gpio5 9 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_snvs_reg_sd>; + regulator-always-on; +-- +2.35.1 + diff --git a/queue-5.15/arm-dts-logicpd-som-lv-fix-wrong-pinmuxing-on-omap35.patch b/queue-5.15/arm-dts-logicpd-som-lv-fix-wrong-pinmuxing-on-omap35.patch new file mode 100644 index 00000000000..e7636f2be1e --- /dev/null +++ b/queue-5.15/arm-dts-logicpd-som-lv-fix-wrong-pinmuxing-on-omap35.patch @@ -0,0 +1,104 @@ +From a982832e3dd858552fce62f29d60f8bc3f35d26c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Mar 2022 11:18:17 -0600 +Subject: ARM: dts: logicpd-som-lv: Fix wrong pinmuxing on OMAP35 + +From: Adam Ford + +[ Upstream commit 46ff3df87215ff42c0cd2c4bdb7d74540384a69c ] + +The pinout of the OMAP35 and DM37 variants of the SOM-LV are the +same, but the macros which define the pinmuxing are different +between OMAP3530 and DM3730. The pinmuxing was correct for +for the DM3730, but wrong for the OMAP3530. Since the boot loader +was correctly pin-muxing the pins, this was not obvious. As the +bootloader not guaranteed to pinmux all the pins any more, this +causes an issue, so the pinmux needs to be moved from a common +file to their respective board files. + +Fixes: f8a2e3ff7103 ("ARM: dts: Add minimal support for LogicPD OMAP35xx SOM-LV devkit") +Signed-off-by: Adam Ford +Message-Id: <20220303171818.11060-1-aford173@gmail.com> +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/logicpd-som-lv-35xx-devkit.dts | 15 +++++++++++++++ + arch/arm/boot/dts/logicpd-som-lv-37xx-devkit.dts | 15 +++++++++++++++ + arch/arm/boot/dts/logicpd-som-lv.dtsi | 15 --------------- + 3 files changed, 30 insertions(+), 15 deletions(-) + +diff --git a/arch/arm/boot/dts/logicpd-som-lv-35xx-devkit.dts b/arch/arm/boot/dts/logicpd-som-lv-35xx-devkit.dts +index 2a0a98fe67f0..3240c67e0c39 100644 +--- a/arch/arm/boot/dts/logicpd-som-lv-35xx-devkit.dts ++++ b/arch/arm/boot/dts/logicpd-som-lv-35xx-devkit.dts +@@ -11,3 +11,18 @@ / { + model = "LogicPD Zoom OMAP35xx SOM-LV Development Kit"; + compatible = "logicpd,dm3730-som-lv-devkit", "ti,omap3430", "ti,omap3"; + }; ++ ++&omap3_pmx_core2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&hsusb2_2_pins>; ++ hsusb2_2_pins: pinmux_hsusb2_2_pins { ++ pinctrl-single,pins = < ++ OMAP3430_CORE2_IOPAD(0x25f0, PIN_OUTPUT | MUX_MODE3) /* etk_d10.hsusb2_clk */ ++ OMAP3430_CORE2_IOPAD(0x25f2, PIN_OUTPUT | MUX_MODE3) /* etk_d11.hsusb2_stp */ ++ OMAP3430_CORE2_IOPAD(0x25f4, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d12.hsusb2_dir */ ++ OMAP3430_CORE2_IOPAD(0x25f6, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d13.hsusb2_nxt */ ++ OMAP3430_CORE2_IOPAD(0x25f8, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d14.hsusb2_data0 */ ++ OMAP3430_CORE2_IOPAD(0x25fa, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d15.hsusb2_data1 */ ++ >; ++ }; ++}; +diff --git a/arch/arm/boot/dts/logicpd-som-lv-37xx-devkit.dts b/arch/arm/boot/dts/logicpd-som-lv-37xx-devkit.dts +index a604d92221a4..c757f0d7781c 100644 +--- a/arch/arm/boot/dts/logicpd-som-lv-37xx-devkit.dts ++++ b/arch/arm/boot/dts/logicpd-som-lv-37xx-devkit.dts +@@ -11,3 +11,18 @@ / { + model = "LogicPD Zoom DM3730 SOM-LV Development Kit"; + compatible = "logicpd,dm3730-som-lv-devkit", "ti,omap3630", "ti,omap3"; + }; ++ ++&omap3_pmx_core2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&hsusb2_2_pins>; ++ hsusb2_2_pins: pinmux_hsusb2_2_pins { ++ pinctrl-single,pins = < ++ OMAP3630_CORE2_IOPAD(0x25f0, PIN_OUTPUT | MUX_MODE3) /* etk_d10.hsusb2_clk */ ++ OMAP3630_CORE2_IOPAD(0x25f2, PIN_OUTPUT | MUX_MODE3) /* etk_d11.hsusb2_stp */ ++ OMAP3630_CORE2_IOPAD(0x25f4, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d12.hsusb2_dir */ ++ OMAP3630_CORE2_IOPAD(0x25f6, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d13.hsusb2_nxt */ ++ OMAP3630_CORE2_IOPAD(0x25f8, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d14.hsusb2_data0 */ ++ OMAP3630_CORE2_IOPAD(0x25fa, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d15.hsusb2_data1 */ ++ >; ++ }; ++}; +diff --git a/arch/arm/boot/dts/logicpd-som-lv.dtsi b/arch/arm/boot/dts/logicpd-som-lv.dtsi +index b56524cc7fe2..55b619c99e24 100644 +--- a/arch/arm/boot/dts/logicpd-som-lv.dtsi ++++ b/arch/arm/boot/dts/logicpd-som-lv.dtsi +@@ -265,21 +265,6 @@ OMAP3_WKUP_IOPAD(0x2a0c, PIN_OUTPUT | MUX_MODE4) /* sys_boot1.gpio_3 */ + }; + }; + +-&omap3_pmx_core2 { +- pinctrl-names = "default"; +- pinctrl-0 = <&hsusb2_2_pins>; +- hsusb2_2_pins: pinmux_hsusb2_2_pins { +- pinctrl-single,pins = < +- OMAP3630_CORE2_IOPAD(0x25f0, PIN_OUTPUT | MUX_MODE3) /* etk_d10.hsusb2_clk */ +- OMAP3630_CORE2_IOPAD(0x25f2, PIN_OUTPUT | MUX_MODE3) /* etk_d11.hsusb2_stp */ +- OMAP3630_CORE2_IOPAD(0x25f4, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d12.hsusb2_dir */ +- OMAP3630_CORE2_IOPAD(0x25f6, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d13.hsusb2_nxt */ +- OMAP3630_CORE2_IOPAD(0x25f8, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d14.hsusb2_data0 */ +- OMAP3630_CORE2_IOPAD(0x25fa, PIN_INPUT_PULLDOWN | MUX_MODE3) /* etk_d15.hsusb2_data1 */ +- >; +- }; +-}; +- + &uart2 { + interrupts-extended = <&intc 73 &omap3_pmx_core OMAP3_UART2_RX>; + pinctrl-names = "default"; +-- +2.35.1 + diff --git a/queue-5.15/arm-omap2-fix-refcount-leak-in-omap_gic_of_init.patch b/queue-5.15/arm-omap2-fix-refcount-leak-in-omap_gic_of_init.patch new file mode 100644 index 00000000000..7750d41da1f --- /dev/null +++ b/queue-5.15/arm-omap2-fix-refcount-leak-in-omap_gic_of_init.patch @@ -0,0 +1,42 @@ +From 48bdaa8d664f53ed1835e049ddb7b717398bef6d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Mar 2022 10:43:01 +0000 +Subject: ARM: OMAP2+: Fix refcount leak in omap_gic_of_init + +From: Miaoqian Lin + +[ Upstream commit 0f83e6b4161617014017a694888dd8743f46f071 ] + +The of_find_compatible_node() function returns a node pointer with +refcount incremented, We should use of_node_put() on it when done +Add the missing of_node_put() to release the refcount. + +Fixes: fd1c07861491 ("ARM: OMAP4: Fix the init code to have OMAP4460 errata available in DT build") +Signed-off-by: Miaoqian Lin +Message-Id: <20220309104302.18398-1-linmq006@gmail.com> +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/mach-omap2/omap4-common.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c +index 5c3845730dbf..0b80f8bcd304 100644 +--- a/arch/arm/mach-omap2/omap4-common.c ++++ b/arch/arm/mach-omap2/omap4-common.c +@@ -314,10 +314,12 @@ void __init omap_gic_of_init(void) + + np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-gic"); + gic_dist_base_addr = of_iomap(np, 0); ++ of_node_put(np); + WARN_ON(!gic_dist_base_addr); + + np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-twd-timer"); + twd_base = of_iomap(np, 0); ++ of_node_put(np); + WARN_ON(!twd_base); + + skip_errata_init: +-- +2.35.1 + diff --git a/queue-5.15/arm64-dts-imx8mn-ddr4-evk-describe-the-32.768-khz-pm.patch b/queue-5.15/arm64-dts-imx8mn-ddr4-evk-describe-the-32.768-khz-pm.patch new file mode 100644 index 00000000000..f20787ea687 --- /dev/null +++ b/queue-5.15/arm64-dts-imx8mn-ddr4-evk-describe-the-32.768-khz-pm.patch @@ -0,0 +1,45 @@ +From f7b5556e9689ddb10efb24455e752736ba56b393 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Apr 2022 14:47:31 -0300 +Subject: arm64: dts: imx8mn-ddr4-evk: Describe the 32.768 kHz PMIC clock + +From: Fabio Estevam + +[ Upstream commit 0310b5aa0656a94102344f1e9ae2892e342a665d ] + +The ROHM BD71847 PMIC has a 32.768 kHz clock. + +Describe the PMIC clock to fix the following boot errors: + +bd718xx-clk bd71847-clk.1.auto: No parent clk found +bd718xx-clk: probe of bd71847-clk.1.auto failed with error -22 + +Based on the same fix done for imx8mm-evk as per commit +a6a355ede574 ("arm64: dts: imx8mm-evk: Add 32.768 kHz clock to PMIC") + +Fixes: 3e44dd09736d ("arm64: dts: imx8mn-ddr4-evk: Add rohm,bd71847 PMIC support") +Signed-off-by: Fabio Estevam +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts b/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts +index 7dfee715a2c4..d8ce217c6016 100644 +--- a/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts ++++ b/arch/arm64/boot/dts/freescale/imx8mn-ddr4-evk.dts +@@ -59,6 +59,10 @@ pmic@4b { + interrupts = <3 IRQ_TYPE_LEVEL_LOW>; + rohm,reset-snvs-powered; + ++ #clock-cells = <0>; ++ clocks = <&osc_32k 0>; ++ clock-output-names = "clk-32k-out"; ++ + regulators { + buck1_reg: BUCK1 { + regulator-name = "buck1"; +-- +2.35.1 + diff --git a/queue-5.15/arm64-dts-imx8mn-fix-sai-nodes.patch b/queue-5.15/arm64-dts-imx8mn-fix-sai-nodes.patch new file mode 100644 index 00000000000..e008b21025b --- /dev/null +++ b/queue-5.15/arm64-dts-imx8mn-fix-sai-nodes.patch @@ -0,0 +1,80 @@ +From 022bc0bec2fc40d03dd8f22db23633b9f97f4bed Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Apr 2022 01:42:05 +0200 +Subject: arm64: dts: imx8mn: Fix SAI nodes + +From: Marek Vasut + +[ Upstream commit 574518b7ccbaef74cb89eb1a1a0da88afa1e0113 ] + +The most specific compatible string element should be "fsl,imx8mn-sai" +on i.MX8M Nano, fix it from current "fsl,imx8mm-sai" (two Ms, likely +due to copy-paste error from i.MX8M Mini). + +Fixes: 9e9860069725f ("arm64: dts: imx8mn: Add SAI nodes") +Signed-off-by: Marek Vasut +Cc: Adam Ford +Cc: Fabio Estevam +Cc: Peng Fan +Cc: Shawn Guo +Cc: NXP Linux Team +To: linux-arm-kernel@lists.infradead.org +Reviewed-by: Adam Ford +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/freescale/imx8mn.dtsi | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/arch/arm64/boot/dts/freescale/imx8mn.dtsi b/arch/arm64/boot/dts/freescale/imx8mn.dtsi +index da6c942fb7f9..6d6cbd4c83b8 100644 +--- a/arch/arm64/boot/dts/freescale/imx8mn.dtsi ++++ b/arch/arm64/boot/dts/freescale/imx8mn.dtsi +@@ -263,7 +263,7 @@ spba2: spba-bus@30000000 { + ranges; + + sai2: sai@30020000 { +- compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai"; ++ compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; + reg = <0x30020000 0x10000>; + interrupts = ; + clocks = <&clk IMX8MN_CLK_SAI2_IPG>, +@@ -277,7 +277,7 @@ sai2: sai@30020000 { + }; + + sai3: sai@30030000 { +- compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai"; ++ compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; + reg = <0x30030000 0x10000>; + interrupts = ; + clocks = <&clk IMX8MN_CLK_SAI3_IPG>, +@@ -291,7 +291,7 @@ sai3: sai@30030000 { + }; + + sai5: sai@30050000 { +- compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai"; ++ compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; + reg = <0x30050000 0x10000>; + interrupts = ; + clocks = <&clk IMX8MN_CLK_SAI5_IPG>, +@@ -307,7 +307,7 @@ sai5: sai@30050000 { + }; + + sai6: sai@30060000 { +- compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai"; ++ compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; + reg = <0x30060000 0x10000>; + interrupts = ; + clocks = <&clk IMX8MN_CLK_SAI6_IPG>, +@@ -364,7 +364,7 @@ spdif1: spdif@30090000 { + }; + + sai7: sai@300b0000 { +- compatible = "fsl,imx8mm-sai", "fsl,imx8mq-sai"; ++ compatible = "fsl,imx8mn-sai", "fsl,imx8mq-sai"; + reg = <0x300b0000 0x10000>; + interrupts = ; + clocks = <&clk IMX8MN_CLK_SAI7_IPG>, +-- +2.35.1 + diff --git a/queue-5.15/arm64-dts-imx8qm-correct-scu-clock-controller-s-comp.patch b/queue-5.15/arm64-dts-imx8qm-correct-scu-clock-controller-s-comp.patch new file mode 100644 index 00000000000..83992269f8b --- /dev/null +++ b/queue-5.15/arm64-dts-imx8qm-correct-scu-clock-controller-s-comp.patch @@ -0,0 +1,51 @@ +From 0e846f6577bf920803b8d56b956c5e23f42abad5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 4 Mar 2022 16:04:43 +0800 +Subject: arm64: dts: imx8qm: Correct SCU clock controller's compatible + property + +From: Liu Ying + +[ Upstream commit dd2737fab4a6ce9ba4eb84842bedbd87d55241a6 ] + +The fsl,scu.txt dt-binding documentation explicitly mentions +that the compatible string should be either "fsl,imx8qm-clock" +or "fsl,imx8qxp-clock", followed by "fsl,scu-clk". Also, i.MX8qm +SCU clocks and i.MX8qxp SCU clocks are really not the same, so +we have to set the compatible property according to SoC name. +Let's correct the i.MX8qm clock controller's compatible property +from +"fsl,imx8qxp-clk", "fsl,scu-clk" +to +"fsl,imx8qm-clk", "fsl,scu-clk" . + +Fixes: f2180be18a63 ("arm64: dts: imx: add imx8qm common dts file") +Cc: Rob Herring +Cc: Shawn Guo +Cc: Sascha Hauer +Cc: Pengutronix Kernel Team +Cc: Fabio Estevam +Cc: NXP Linux Team +Signed-off-by: Liu Ying +Signed-off-by: Shawn Guo +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/freescale/imx8qm.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/freescale/imx8qm.dtsi b/arch/arm64/boot/dts/freescale/imx8qm.dtsi +index aebbe2b84aa1..a143f38bc78b 100644 +--- a/arch/arm64/boot/dts/freescale/imx8qm.dtsi ++++ b/arch/arm64/boot/dts/freescale/imx8qm.dtsi +@@ -155,7 +155,7 @@ pd: imx8qx-pd { + }; + + clk: clock-controller { +- compatible = "fsl,imx8qxp-clk", "fsl,scu-clk"; ++ compatible = "fsl,imx8qm-clk", "fsl,scu-clk"; + #clock-cells = <2>; + }; + +-- +2.35.1 + diff --git a/queue-5.15/arm64-dts-meson-remove-cpu-opps-below-1ghz-for-g12b-.patch b/queue-5.15/arm64-dts-meson-remove-cpu-opps-below-1ghz-for-g12b-.patch new file mode 100644 index 00000000000..f86006859fd --- /dev/null +++ b/queue-5.15/arm64-dts-meson-remove-cpu-opps-below-1ghz-for-g12b-.patch @@ -0,0 +1,146 @@ +From 97dcf0aaedc29c4429b5d861e779115f171c08d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Feb 2022 10:06:37 +0000 +Subject: arm64: dts: meson: remove CPU opps below 1GHz for G12B boards + +From: Christian Hewitt + +[ Upstream commit 6c4d636bc00dc17c63ffb2a73a0da850240e26e3 ] + +Amlogic G12B devices experience CPU stalls and random board wedges when +the system idles and CPU cores clock down to lower opp points. Recent +vendor kernels include a change to remove 100-250MHz and other distro +sources also remove the 500/667MHz points. Unless all 100-667Mhz opps +are removed or the CPU governor forced to performance stalls are still +observed, so let's remove them to improve stability and uptime. + +Fixes: b96d4e92709b ("arm64: dts: meson-g12b: support a311d and s922x cpu operating points") +Signed-off-by: Christian Hewitt +Reviewed-by: Neil Armstrong +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220210100638.19130-2-christianshewitt@gmail.com +Signed-off-by: Sasha Levin +--- + .../boot/dts/amlogic/meson-g12b-a311d.dtsi | 40 ------------------- + .../boot/dts/amlogic/meson-g12b-s922x.dtsi | 40 ------------------- + 2 files changed, 80 deletions(-) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi +index d61f43052a34..8e9ad1e51d66 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-g12b-a311d.dtsi +@@ -11,26 +11,6 @@ cpu_opp_table_0: opp-table-0 { + compatible = "operating-points-v2"; + opp-shared; + +- opp-100000000 { +- opp-hz = /bits/ 64 <100000000>; +- opp-microvolt = <731000>; +- }; +- +- opp-250000000 { +- opp-hz = /bits/ 64 <250000000>; +- opp-microvolt = <731000>; +- }; +- +- opp-500000000 { +- opp-hz = /bits/ 64 <500000000>; +- opp-microvolt = <731000>; +- }; +- +- opp-667000000 { +- opp-hz = /bits/ 64 <667000000>; +- opp-microvolt = <731000>; +- }; +- + opp-1000000000 { + opp-hz = /bits/ 64 <1000000000>; + opp-microvolt = <761000>; +@@ -71,26 +51,6 @@ cpub_opp_table_1: opp-table-1 { + compatible = "operating-points-v2"; + opp-shared; + +- opp-100000000 { +- opp-hz = /bits/ 64 <100000000>; +- opp-microvolt = <731000>; +- }; +- +- opp-250000000 { +- opp-hz = /bits/ 64 <250000000>; +- opp-microvolt = <731000>; +- }; +- +- opp-500000000 { +- opp-hz = /bits/ 64 <500000000>; +- opp-microvolt = <731000>; +- }; +- +- opp-667000000 { +- opp-hz = /bits/ 64 <667000000>; +- opp-microvolt = <731000>; +- }; +- + opp-1000000000 { + opp-hz = /bits/ 64 <1000000000>; + opp-microvolt = <731000>; +diff --git a/arch/arm64/boot/dts/amlogic/meson-g12b-s922x.dtsi b/arch/arm64/boot/dts/amlogic/meson-g12b-s922x.dtsi +index 1e5d0ee5d541..44c23c984034 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-g12b-s922x.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-g12b-s922x.dtsi +@@ -11,26 +11,6 @@ cpu_opp_table_0: opp-table-0 { + compatible = "operating-points-v2"; + opp-shared; + +- opp-100000000 { +- opp-hz = /bits/ 64 <100000000>; +- opp-microvolt = <731000>; +- }; +- +- opp-250000000 { +- opp-hz = /bits/ 64 <250000000>; +- opp-microvolt = <731000>; +- }; +- +- opp-500000000 { +- opp-hz = /bits/ 64 <500000000>; +- opp-microvolt = <731000>; +- }; +- +- opp-667000000 { +- opp-hz = /bits/ 64 <667000000>; +- opp-microvolt = <731000>; +- }; +- + opp-1000000000 { + opp-hz = /bits/ 64 <1000000000>; + opp-microvolt = <731000>; +@@ -76,26 +56,6 @@ cpub_opp_table_1: opp-table-1 { + compatible = "operating-points-v2"; + opp-shared; + +- opp-100000000 { +- opp-hz = /bits/ 64 <100000000>; +- opp-microvolt = <751000>; +- }; +- +- opp-250000000 { +- opp-hz = /bits/ 64 <250000000>; +- opp-microvolt = <751000>; +- }; +- +- opp-500000000 { +- opp-hz = /bits/ 64 <500000000>; +- opp-microvolt = <751000>; +- }; +- +- opp-667000000 { +- opp-hz = /bits/ 64 <667000000>; +- opp-microvolt = <751000>; +- }; +- + opp-1000000000 { + opp-hz = /bits/ 64 <1000000000>; + opp-microvolt = <771000>; +-- +2.35.1 + diff --git a/queue-5.15/arm64-dts-meson-remove-cpu-opps-below-1ghz-for-sm1-b.patch b/queue-5.15/arm64-dts-meson-remove-cpu-opps-below-1ghz-for-sm1-b.patch new file mode 100644 index 00000000000..19d2495a5f7 --- /dev/null +++ b/queue-5.15/arm64-dts-meson-remove-cpu-opps-below-1ghz-for-sm1-b.patch @@ -0,0 +1,60 @@ +From cb15237d3a77367003712ea7298e3e5eff8cca81 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Feb 2022 10:06:38 +0000 +Subject: arm64: dts: meson: remove CPU opps below 1GHz for SM1 boards + +From: Christian Hewitt + +[ Upstream commit fd86d85401c2049f652293877c0f7e6e5afc3bbc ] + +Amlogic SM1 devices experience CPU stalls and random board wedges when +the system idles and CPU cores clock down to lower opp points. Recent +vendor kernels include a change to remove 100-250MHz and other distro +sources also remove the 500/667MHz points. Unless all 100-667Mhz opps +are removed or the CPU governor forced to performance stalls are still +observed, so let's remove them to improve stability and uptime. + +Fixes: 3d9e76483049 ("arm64: dts: meson-sm1-sei610: enable DVFS") +Signed-off-by: Christian Hewitt +Reviewed-by: Neil Armstrong +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220210100638.19130-3-christianshewitt@gmail.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-sm1.dtsi | 20 -------------------- + 1 file changed, 20 deletions(-) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi b/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi +index 3d8b1f4f2001..78bdbd2ccc9d 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-sm1.dtsi +@@ -95,26 +95,6 @@ cpu_opp_table: opp-table { + compatible = "operating-points-v2"; + opp-shared; + +- opp-100000000 { +- opp-hz = /bits/ 64 <100000000>; +- opp-microvolt = <730000>; +- }; +- +- opp-250000000 { +- opp-hz = /bits/ 64 <250000000>; +- opp-microvolt = <730000>; +- }; +- +- opp-500000000 { +- opp-hz = /bits/ 64 <500000000>; +- opp-microvolt = <730000>; +- }; +- +- opp-667000000 { +- opp-hz = /bits/ 64 <666666666>; +- opp-microvolt = <750000>; +- }; +- + opp-1000000000 { + opp-hz = /bits/ 64 <1000000000>; + opp-microvolt = <770000>; +-- +2.35.1 + diff --git a/queue-5.15/arm64-dts-meson-sm1-bananapi-m5-fix-wrong-gpio-pin-l.patch b/queue-5.15/arm64-dts-meson-sm1-bananapi-m5-fix-wrong-gpio-pin-l.patch new file mode 100644 index 00000000000..9a72f08bf99 --- /dev/null +++ b/queue-5.15/arm64-dts-meson-sm1-bananapi-m5-fix-wrong-gpio-pin-l.patch @@ -0,0 +1,42 @@ +From 6960137632db7c1a018b4c81056f228002a7e24c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Apr 2022 10:44:28 -0400 +Subject: arm64: dts: meson-sm1-bananapi-m5: fix wrong GPIO pin labeling for + CON1 + +From: Guillaume Giraudon + +[ Upstream commit 962dd65e575dde950ef0844568edc37cfb39f302 ] + +The labels for lines 61 through 84 on the periphs-banks were offset by 2. +2 lines are missing in the BOOT GPIO lines (contains 14, should be 16) +Added 2 empty entries in BOOT to realigned the rest of GPIO labels +to match the Banana Pi M5 schematics. + +(Thanks to Neil Armstrong for the heads up on the position of the missing pins) + +Fixes: 976e920183e4 ("arm64: dts: meson-sm1: add Banana PI BPI-M5 board dts") +Signed-off-by: Guillaume Giraudon +Reviewed-by: Neil Armstrong +Signed-off-by: Neil Armstrong +Link: https://lore.kernel.org/r/20220411144427.874-1-ggiraudon@prism19.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts +index 5751c48620ed..cadba194b149 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-sm1-bananapi-m5.dts +@@ -437,6 +437,7 @@ &gpio { + "", + "eMMC_RST#", /* BOOT_12 */ + "eMMC_DS", /* BOOT_13 */ ++ "", "", + /* GPIOC */ + "SD_D0_B", /* GPIOC_0 */ + "SD_D1_B", /* GPIOC_1 */ +-- +2.35.1 + diff --git a/queue-5.15/asoc-intel-soc-acpi-correct-device-endpoints-for-max.patch b/queue-5.15/asoc-intel-soc-acpi-correct-device-endpoints-for-max.patch new file mode 100644 index 00000000000..73c7716e00b --- /dev/null +++ b/queue-5.15/asoc-intel-soc-acpi-correct-device-endpoints-for-max.patch @@ -0,0 +1,46 @@ +From eb72429b41148336ffbaa50dbef3c382c3a06612 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Apr 2022 14:23:41 -0500 +Subject: ASoC: Intel: soc-acpi: correct device endpoints for max98373 + +From: Chao Song + +[ Upstream commit 97326be14df7bacc6ba5c62c0556298c27ea0432 ] + +The left speaker of max98373 uses spk_r_endpoint, and right +speaker uses spk_l_endpoint, this is obviously wrong. + +This patch corrects the endpoints for max98373 codec. + +Signed-off-by: Chao Song +Signed-off-by: Pierre-Louis Bossart +Link: https://lore.kernel.org/r/20220406192341.271465-1-pierre-louis.bossart@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/intel/common/soc-acpi-intel-tgl-match.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c +index 11801b905ecc..c93d8019b0e5 100644 +--- a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c ++++ b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c +@@ -127,13 +127,13 @@ static const struct snd_soc_acpi_adr_device mx8373_1_adr[] = { + { + .adr = 0x000123019F837300ull, + .num_endpoints = 1, +- .endpoints = &spk_l_endpoint, ++ .endpoints = &spk_r_endpoint, + .name_prefix = "Right" + }, + { + .adr = 0x000127019F837300ull, + .num_endpoints = 1, +- .endpoints = &spk_r_endpoint, ++ .endpoints = &spk_l_endpoint, + .name_prefix = "Left" + } + }; +-- +2.35.1 + diff --git a/queue-5.15/asoc-wm8731-disable-the-regulator-when-probing-fails.patch b/queue-5.15/asoc-wm8731-disable-the-regulator-when-probing-fails.patch new file mode 100644 index 00000000000..db1422ca8fd --- /dev/null +++ b/queue-5.15/asoc-wm8731-disable-the-regulator-when-probing-fails.patch @@ -0,0 +1,90 @@ +From ebffe55aff8cea074206d1237cde1ff755bb18cd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Apr 2022 20:10:38 +0800 +Subject: ASoC: wm8731: Disable the regulator when probing fails + +From: Zheyu Ma + +[ Upstream commit 92ccbf17eeacf510cf1eed9c252d9332ca24f02d ] + +When the driver fails during probing, the driver should disable the +regulator, not just handle it in wm8731_hw_init(). + +The following log reveals it: + +[ 17.812483] WARNING: CPU: 1 PID: 364 at drivers/regulator/core.c:2257 _regulator_put+0x3ec/0x4e0 +[ 17.815958] RIP: 0010:_regulator_put+0x3ec/0x4e0 +[ 17.824467] Call Trace: +[ 17.824774] +[ 17.825040] regulator_bulk_free+0x82/0xe0 +[ 17.825514] devres_release_group+0x319/0x3d0 +[ 17.825882] i2c_device_probe+0x766/0x940 +[ 17.829198] i2c_register_driver+0xb5/0x130 + +Signed-off-by: Zheyu Ma +Link: https://lore.kernel.org/r/20220405121038.4094051-1-zheyuma97@gmail.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/wm8731.c | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c +index dcee7b2bd3d7..859ebcec8383 100644 +--- a/sound/soc/codecs/wm8731.c ++++ b/sound/soc/codecs/wm8731.c +@@ -602,7 +602,7 @@ static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731) + ret = wm8731_reset(wm8731->regmap); + if (ret < 0) { + dev_err(dev, "Failed to issue reset: %d\n", ret); +- goto err_regulator_enable; ++ goto err; + } + + /* Clear POWEROFF, keep everything else disabled */ +@@ -619,10 +619,7 @@ static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731) + + regcache_mark_dirty(wm8731->regmap); + +-err_regulator_enable: +- /* Regulators will be enabled by bias management */ +- regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); +- ++err: + return ret; + } + +@@ -766,21 +763,27 @@ static int wm8731_i2c_probe(struct i2c_client *i2c, + ret = PTR_ERR(wm8731->regmap); + dev_err(&i2c->dev, "Failed to allocate register map: %d\n", + ret); +- return ret; ++ goto err_regulator_enable; + } + + ret = wm8731_hw_init(&i2c->dev, wm8731); + if (ret != 0) +- return ret; ++ goto err_regulator_enable; + + ret = devm_snd_soc_register_component(&i2c->dev, + &soc_component_dev_wm8731, &wm8731_dai, 1); + if (ret != 0) { + dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret); +- return ret; ++ goto err_regulator_enable; + } + + return 0; ++ ++err_regulator_enable: ++ /* Regulators will be enabled by bias management */ ++ regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); ++ ++ return ret; + } + + static int wm8731_i2c_remove(struct i2c_client *client) +-- +2.35.1 + diff --git a/queue-5.15/bnx2x-fix-napi-api-usage-sequence.patch b/queue-5.15/bnx2x-fix-napi-api-usage-sequence.patch new file mode 100644 index 00000000000..dba0c93752a --- /dev/null +++ b/queue-5.15/bnx2x-fix-napi-api-usage-sequence.patch @@ -0,0 +1,152 @@ +From d519a48a32c3880f678a9412a2ddc0b34e6c3803 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Apr 2022 08:39:13 -0700 +Subject: bnx2x: fix napi API usage sequence + +From: Manish Chopra + +[ Upstream commit af68656d66eda219b7f55ce8313a1da0312c79e1 ] + +While handling PCI errors (AER flow) driver tries to +disable NAPI [napi_disable()] after NAPI is deleted +[__netif_napi_del()] which causes unexpected system +hang/crash. + +System message log shows the following: +======================================= +[ 3222.537510] EEH: Detected PCI bus error on PHB#384-PE#800000 [ 3222.537511] EEH: This PCI device has failed 2 times in the last hour and will be permanently disabled after 5 failures. +[ 3222.537512] EEH: Notify device drivers to shutdown [ 3222.537513] EEH: Beginning: 'error_detected(IO frozen)' +[ 3222.537514] EEH: PE#800000 (PCI 0384:80:00.0): Invoking +bnx2x->error_detected(IO frozen) +[ 3222.537516] bnx2x: [bnx2x_io_error_detected:14236(eth14)]IO error detected [ 3222.537650] EEH: PE#800000 (PCI 0384:80:00.0): bnx2x driver reports: +'need reset' +[ 3222.537651] EEH: PE#800000 (PCI 0384:80:00.1): Invoking +bnx2x->error_detected(IO frozen) +[ 3222.537651] bnx2x: [bnx2x_io_error_detected:14236(eth13)]IO error detected [ 3222.537729] EEH: PE#800000 (PCI 0384:80:00.1): bnx2x driver reports: +'need reset' +[ 3222.537729] EEH: Finished:'error_detected(IO frozen)' with aggregate recovery state:'need reset' +[ 3222.537890] EEH: Collect temporary log [ 3222.583481] EEH: of node=0384:80:00.0 [ 3222.583519] EEH: PCI device/vendor: 168e14e4 [ 3222.583557] EEH: PCI cmd/status register: 00100140 [ 3222.583557] EEH: PCI-E capabilities and status follow: +[ 3222.583744] EEH: PCI-E 00: 00020010 012c8da2 00095d5e 00455c82 [ 3222.583892] EEH: PCI-E 10: 10820000 00000000 00000000 00000000 [ 3222.583893] EEH: PCI-E 20: 00000000 [ 3222.583893] EEH: PCI-E AER capability register set follows: +[ 3222.584079] EEH: PCI-E AER 00: 13c10001 00000000 00000000 00062030 [ 3222.584230] EEH: PCI-E AER 10: 00002000 000031c0 000001e0 00000000 [ 3222.584378] EEH: PCI-E AER 20: 00000000 00000000 00000000 00000000 [ 3222.584416] EEH: PCI-E AER 30: 00000000 00000000 [ 3222.584416] EEH: of node=0384:80:00.1 [ 3222.584454] EEH: PCI device/vendor: 168e14e4 [ 3222.584491] EEH: PCI cmd/status register: 00100140 [ 3222.584492] EEH: PCI-E capabilities and status follow: +[ 3222.584677] EEH: PCI-E 00: 00020010 012c8da2 00095d5e 00455c82 [ 3222.584825] EEH: PCI-E 10: 10820000 00000000 00000000 00000000 [ 3222.584826] EEH: PCI-E 20: 00000000 [ 3222.584826] EEH: PCI-E AER capability register set follows: +[ 3222.585011] EEH: PCI-E AER 00: 13c10001 00000000 00000000 00062030 [ 3222.585160] EEH: PCI-E AER 10: 00002000 000031c0 000001e0 00000000 [ 3222.585309] EEH: PCI-E AER 20: 00000000 00000000 00000000 00000000 [ 3222.585347] EEH: PCI-E AER 30: 00000000 00000000 [ 3222.586872] RTAS: event: 5, Type: Platform Error (224), Severity: 2 [ 3222.586873] EEH: Reset without hotplug activity [ 3224.762767] EEH: Beginning: 'slot_reset' +[ 3224.762770] EEH: PE#800000 (PCI 0384:80:00.0): Invoking +bnx2x->slot_reset() +[ 3224.762771] bnx2x: [bnx2x_io_slot_reset:14271(eth14)]IO slot reset initializing... +[ 3224.762887] bnx2x 0384:80:00.0: enabling device (0140 -> 0142) [ 3224.768157] bnx2x: [bnx2x_io_slot_reset:14287(eth14)]IO slot reset +--> driver unload + +Uninterruptible tasks +===================== +crash> ps | grep UN + 213 2 11 c000000004c89e00 UN 0.0 0 0 [eehd] + 215 2 0 c000000004c80000 UN 0.0 0 0 +[kworker/0:2] + 2196 1 28 c000000004504f00 UN 0.1 15936 11136 wickedd + 4287 1 9 c00000020d076800 UN 0.0 4032 3008 agetty + 4289 1 20 c00000020d056680 UN 0.0 7232 3840 agetty + 32423 2 26 c00000020038c580 UN 0.0 0 0 +[kworker/26:3] + 32871 4241 27 c0000002609ddd00 UN 0.1 18624 11648 sshd + 32920 10130 16 c00000027284a100 UN 0.1 48512 12608 sendmail + 33092 32987 0 c000000205218b00 UN 0.1 48512 12608 sendmail + 33154 4567 16 c000000260e51780 UN 0.1 48832 12864 pickup + 33209 4241 36 c000000270cb6500 UN 0.1 18624 11712 sshd + 33473 33283 0 c000000205211480 UN 0.1 48512 12672 sendmail + 33531 4241 37 c00000023c902780 UN 0.1 18624 11648 sshd + +EEH handler hung while bnx2x sleeping and holding RTNL lock +=========================================================== +crash> bt 213 +PID: 213 TASK: c000000004c89e00 CPU: 11 COMMAND: "eehd" + #0 [c000000004d477e0] __schedule at c000000000c70808 + #1 [c000000004d478b0] schedule at c000000000c70ee0 + #2 [c000000004d478e0] schedule_timeout at c000000000c76dec + #3 [c000000004d479c0] msleep at c0000000002120cc + #4 [c000000004d479f0] napi_disable at c000000000a06448 + ^^^^^^^^^^^^^^^^ + #5 [c000000004d47a30] bnx2x_netif_stop at c0080000018dba94 [bnx2x] + #6 [c000000004d47a60] bnx2x_io_slot_reset at c0080000018a551c [bnx2x] + #7 [c000000004d47b20] eeh_report_reset at c00000000004c9bc + #8 [c000000004d47b90] eeh_pe_report at c00000000004d1a8 + #9 [c000000004d47c40] eeh_handle_normal_event at c00000000004da64 + +And the sleeping source code +============================ +crash> dis -ls c000000000a06448 +FILE: ../net/core/dev.c +LINE: 6702 + + 6697 { + 6698 might_sleep(); + 6699 set_bit(NAPI_STATE_DISABLE, &n->state); + 6700 + 6701 while (test_and_set_bit(NAPI_STATE_SCHED, &n->state)) +* 6702 msleep(1); + 6703 while (test_and_set_bit(NAPI_STATE_NPSVC, &n->state)) + 6704 msleep(1); + 6705 + 6706 hrtimer_cancel(&n->timer); + 6707 + 6708 clear_bit(NAPI_STATE_DISABLE, &n->state); + 6709 } + +EEH calls into bnx2x twice based on the system log above, first through +bnx2x_io_error_detected() and then bnx2x_io_slot_reset(), and executes +the following call chains: + +bnx2x_io_error_detected() + +-> bnx2x_eeh_nic_unload() + +-> bnx2x_del_all_napi() + +-> __netif_napi_del() + +bnx2x_io_slot_reset() + +-> bnx2x_netif_stop() + +-> bnx2x_napi_disable() + +->napi_disable() + +Fix this by correcting the sequence of NAPI APIs usage, +that is delete the NAPI after disabling it. + +Fixes: 7fa6f34081f1 ("bnx2x: AER revised") +Reported-by: David Christensen +Tested-by: David Christensen +Signed-off-by: Manish Chopra +Signed-off-by: Ariel Elior +Link: https://lore.kernel.org/r/20220426153913.6966-1-manishc@marvell.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +index bdd4e420f869..553f3de93957 100644 +--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c ++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +@@ -14158,10 +14158,6 @@ static int bnx2x_eeh_nic_unload(struct bnx2x *bp) + + /* Stop Tx */ + bnx2x_tx_disable(bp); +- /* Delete all NAPI objects */ +- bnx2x_del_all_napi(bp); +- if (CNIC_LOADED(bp)) +- bnx2x_del_all_napi_cnic(bp); + netdev_reset_tc(bp->dev); + + del_timer_sync(&bp->timer); +@@ -14266,6 +14262,11 @@ static pci_ers_result_t bnx2x_io_slot_reset(struct pci_dev *pdev) + bnx2x_drain_tx_queues(bp); + bnx2x_send_unload_req(bp, UNLOAD_RECOVERY); + bnx2x_netif_stop(bp, 1); ++ bnx2x_del_all_napi(bp); ++ ++ if (CNIC_LOADED(bp)) ++ bnx2x_del_all_napi_cnic(bp); ++ + bnx2x_free_irq(bp); + + /* Report UNLOAD_DONE to MCP */ +-- +2.35.1 + diff --git a/queue-5.15/bonding-do-not-discard-lowest-hash-bit-for-non-layer.patch b/queue-5.15/bonding-do-not-discard-lowest-hash-bit-for-non-layer.patch new file mode 100644 index 00000000000..d06e94976e4 --- /dev/null +++ b/queue-5.15/bonding-do-not-discard-lowest-hash-bit-for-non-layer.patch @@ -0,0 +1,99 @@ +From 7b7fadc08938d3872d156fb5199f00aba73f57f5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 16 Apr 2022 16:44:10 +0530 +Subject: bonding: do not discard lowest hash bit for non layer3+4 hashing + +From: suresh kumar + +[ Upstream commit 49aefd131739df552f83c566d0665744c30b1d70 ] + +Commit b5f862180d70 was introduced to discard lowest hash bit for layer3+4 hashing +but it also removes last bit from non layer3+4 hashing + +Below script shows layer2+3 hashing will result in same slave to be used with above commit. +$ cat hash.py +#/usr/bin/python3.6 + +h_dests=[0xa0, 0xa1] +h_source=0xe3 +hproto=0x8 +saddr=0x1e7aa8c0 +daddr=0x17aa8c0 + +for h_dest in h_dests: + hash = (h_dest ^ h_source ^ hproto ^ saddr ^ daddr) + hash ^= hash >> 16 + hash ^= hash >> 8 + print(hash) + +print("with last bit removed") +for h_dest in h_dests: + hash = (h_dest ^ h_source ^ hproto ^ saddr ^ daddr) + hash ^= hash >> 16 + hash ^= hash >> 8 + hash = hash >> 1 + print(hash) + +Output: +$ python3.6 hash.py +522133332 +522133333 <-------------- will result in both slaves being used + +with last bit removed +261066666 +261066666 <-------------- only single slave used + +Signed-off-by: suresh kumar +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/bonding/bond_main.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c +index 46c3301a5e07..2e75b7e8f70b 100644 +--- a/drivers/net/bonding/bond_main.c ++++ b/drivers/net/bonding/bond_main.c +@@ -3817,14 +3817,19 @@ static bool bond_flow_dissect(struct bonding *bond, struct sk_buff *skb, const v + return true; + } + +-static u32 bond_ip_hash(u32 hash, struct flow_keys *flow) ++static u32 bond_ip_hash(u32 hash, struct flow_keys *flow, int xmit_policy) + { + hash ^= (__force u32)flow_get_u32_dst(flow) ^ + (__force u32)flow_get_u32_src(flow); + hash ^= (hash >> 16); + hash ^= (hash >> 8); ++ + /* discard lowest hash bit to deal with the common even ports pattern */ +- return hash >> 1; ++ if (xmit_policy == BOND_XMIT_POLICY_LAYER34 || ++ xmit_policy == BOND_XMIT_POLICY_ENCAP34) ++ return hash >> 1; ++ ++ return hash; + } + + /* Generate hash based on xmit policy. If @skb is given it is used to linearize +@@ -3854,7 +3859,7 @@ static u32 __bond_xmit_hash(struct bonding *bond, struct sk_buff *skb, const voi + memcpy(&hash, &flow.ports.ports, sizeof(hash)); + } + +- return bond_ip_hash(hash, &flow); ++ return bond_ip_hash(hash, &flow, bond->params.xmit_policy); + } + + /** +@@ -5012,7 +5017,7 @@ static u32 bond_sk_hash_l34(struct sock *sk) + /* L4 */ + memcpy(&hash, &flow.ports.ports, sizeof(hash)); + /* L3 */ +- return bond_ip_hash(hash, &flow); ++ return bond_ip_hash(hash, &flow, BOND_XMIT_POLICY_LAYER34); + } + + static struct net_device *__bond_sk_get_lower_dev(struct bonding *bond, +-- +2.35.1 + diff --git a/queue-5.15/bpf-lwt-fix-crash-when-using-bpf_skb_set_tunnel_key-.patch b/queue-5.15/bpf-lwt-fix-crash-when-using-bpf_skb_set_tunnel_key-.patch new file mode 100644 index 00000000000..a34b5184e9a --- /dev/null +++ b/queue-5.15/bpf-lwt-fix-crash-when-using-bpf_skb_set_tunnel_key-.patch @@ -0,0 +1,88 @@ +From 653a1fa7c680f92d4d79d3fc9c6901deb3eed6dd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Apr 2022 19:52:19 +0300 +Subject: bpf, lwt: Fix crash when using bpf_skb_set_tunnel_key() from bpf_xmit + lwt hook + +From: Eyal Birger + +[ Upstream commit b02d196c44ead1a5949729be9ff08fe781c3e48a ] + +xmit_check_hhlen() observes the dst for getting the device hard header +length to make sure a modified packet can fit. When a helper which changes +the dst - such as bpf_skb_set_tunnel_key() - is called as part of the +xmit program the accessed dst is no longer valid. + +This leads to the following splat: + + BUG: kernel NULL pointer dereference, address: 00000000000000de + #PF: supervisor read access in kernel mode + #PF: error_code(0x0000) - not-present page + PGD 0 P4D 0 + Oops: 0000 [#1] PREEMPT SMP PTI + CPU: 0 PID: 798 Comm: ping Not tainted 5.18.0-rc2+ #103 + Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014 + RIP: 0010:bpf_xmit+0xfb/0x17f + Code: c6 c0 4d cd 8e 48 c7 c7 7d 33 f0 8e e8 42 09 fb ff 48 8b 45 58 48 8b 95 c8 00 00 00 48 2b 95 c0 00 00 00 48 83 e0 fe 48 8b 00 <0f> b7 80 de 00 00 00 39 c2 73 22 29 d0 b9 20 0a 00 00 31 d2 48 89 + RSP: 0018:ffffb148c0bc7b98 EFLAGS: 00010282 + RAX: 0000000000000000 RBX: 0000000000240008 RCX: 0000000000000000 + RDX: 0000000000000010 RSI: 00000000ffffffea RDI: 00000000ffffffff + RBP: ffff922a828a4e00 R08: ffffffff8f1350e8 R09: 00000000ffffdfff + R10: ffffffff8f055100 R11: ffffffff8f105100 R12: 0000000000000000 + R13: ffff922a828a4e00 R14: 0000000000000040 R15: 0000000000000000 + FS: 00007f414e8f0080(0000) GS:ffff922afdc00000(0000) knlGS:0000000000000000 + CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 + CR2: 00000000000000de CR3: 0000000002d80006 CR4: 0000000000370ef0 + Call Trace: + + lwtunnel_xmit.cold+0x71/0xc8 + ip_finish_output2+0x279/0x520 + ? __ip_finish_output.part.0+0x21/0x130 + +Fix by fetching the device hard header length before running the BPF code. + +Fixes: 3a0af8fd61f9 ("bpf: BPF for lightweight tunnel infrastructure") +Signed-off-by: Eyal Birger +Signed-off-by: Daniel Borkmann +Link: https://lore.kernel.org/bpf/20220420165219.1755407-1-eyal.birger@gmail.com +Signed-off-by: Sasha Levin +--- + net/core/lwt_bpf.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/net/core/lwt_bpf.c b/net/core/lwt_bpf.c +index 2f7940bcf715..3fd207fe1284 100644 +--- a/net/core/lwt_bpf.c ++++ b/net/core/lwt_bpf.c +@@ -158,10 +158,8 @@ static int bpf_output(struct net *net, struct sock *sk, struct sk_buff *skb) + return dst->lwtstate->orig_output(net, sk, skb); + } + +-static int xmit_check_hhlen(struct sk_buff *skb) ++static int xmit_check_hhlen(struct sk_buff *skb, int hh_len) + { +- int hh_len = skb_dst(skb)->dev->hard_header_len; +- + if (skb_headroom(skb) < hh_len) { + int nhead = HH_DATA_ALIGN(hh_len - skb_headroom(skb)); + +@@ -273,6 +271,7 @@ static int bpf_xmit(struct sk_buff *skb) + + bpf = bpf_lwt_lwtunnel(dst->lwtstate); + if (bpf->xmit.prog) { ++ int hh_len = dst->dev->hard_header_len; + __be16 proto = skb->protocol; + int ret; + +@@ -290,7 +289,7 @@ static int bpf_xmit(struct sk_buff *skb) + /* If the header was expanded, headroom might be too + * small for L2 header to come, expand as needed. + */ +- ret = xmit_check_hhlen(skb); ++ ret = xmit_check_hhlen(skb, hh_len); + if (unlikely(ret)) + return ret; + +-- +2.35.1 + diff --git a/queue-5.15/bus-sunxi-rsb-fix-the-return-value-of-sunxi_rsb_devi.patch b/queue-5.15/bus-sunxi-rsb-fix-the-return-value-of-sunxi_rsb_devi.patch new file mode 100644 index 00000000000..d8769b99f5a --- /dev/null +++ b/queue-5.15/bus-sunxi-rsb-fix-the-return-value-of-sunxi_rsb_devi.patch @@ -0,0 +1,43 @@ +From e020cc77d908305490170a9e1249b0db5c0ef332 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 16:35:49 +0200 +Subject: bus: sunxi-rsb: Fix the return value of sunxi_rsb_device_create() + +From: Christophe JAILLET + +[ Upstream commit fff8c10368e64e7f8960f149375c12ca5f3b30af ] + +This code is really spurious. +It always returns an ERR_PTR, even when err is known to be 0 and calls +put_device() after a successful device_register() call. + +It is likely that the return statement in the normal path is missing. +Add 'return rdev;' to fix it. + +Fixes: d787dcdb9c8f ("bus: sunxi-rsb: Add driver for Allwinner Reduced Serial Bus") +Signed-off-by: Christophe JAILLET +Reviewed-by: Samuel Holland +Tested-by: Samuel Holland +Signed-off-by: Jernej Skrabec +Link: https://lore.kernel.org/r/ef2b9576350bba4c8e05e669e9535e9e2a415763.1650551719.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Sasha Levin +--- + drivers/bus/sunxi-rsb.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/bus/sunxi-rsb.c b/drivers/bus/sunxi-rsb.c +index 4566e730ef2b..60b082fe2ed0 100644 +--- a/drivers/bus/sunxi-rsb.c ++++ b/drivers/bus/sunxi-rsb.c +@@ -227,6 +227,8 @@ static struct sunxi_rsb_device *sunxi_rsb_device_create(struct sunxi_rsb *rsb, + + dev_dbg(&rdev->dev, "device %s registered\n", dev_name(&rdev->dev)); + ++ return rdev; ++ + err_device_add: + put_device(&rdev->dev); + +-- +2.35.1 + diff --git a/queue-5.15/bus-ti-sysc-make-omap3-gpt12-quirk-handling-soc-spec.patch b/queue-5.15/bus-ti-sysc-make-omap3-gpt12-quirk-handling-soc-spec.patch new file mode 100644 index 00000000000..ba4c626f527 --- /dev/null +++ b/queue-5.15/bus-ti-sysc-make-omap3-gpt12-quirk-handling-soc-spec.patch @@ -0,0 +1,65 @@ +From 6a55d6740da454e4989012c73443e163d766cb4f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Apr 2022 12:26:51 +0300 +Subject: bus: ti-sysc: Make omap3 gpt12 quirk handling SoC specific + +From: Tony Lindgren + +[ Upstream commit a12315d6d27093392b6c634e1d35a59f1d1f7a59 ] + +On beagleboard revisions A to B4 we need to use gpt12 as the system timer. +However, the quirk handling added for gpt12 caused a regression for system +suspend for am335x as the PM coprocessor needs the timers idled for +suspend. + +Let's make the gpt12 quirk specific to omap34xx, other SoCs don't need +it. Beagleboard revisions C and later no longer need to use the gpt12 +related quirk. Then at some point, if we decide to drop support for the old +beagleboard revisions A to B4, we can also drop the gpt12 related quirks +completely. + +Fixes: 3ff340e24c9d ("bus: ti-sysc: Fix gpt12 system timer issue with reserved status") +Reported-by: Kevin Hilman +Suggested-by: Kevin Hilman +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + drivers/bus/ti-sysc.c | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c +index ebf22929ff32..00d46f3ae22f 100644 +--- a/drivers/bus/ti-sysc.c ++++ b/drivers/bus/ti-sysc.c +@@ -3162,13 +3162,27 @@ static int sysc_check_disabled_devices(struct sysc *ddata) + */ + static int sysc_check_active_timer(struct sysc *ddata) + { ++ int error; ++ + if (ddata->cap->type != TI_SYSC_OMAP2_TIMER && + ddata->cap->type != TI_SYSC_OMAP4_TIMER) + return 0; + ++ /* ++ * Quirk for omap3 beagleboard revision A to B4 to use gpt12. ++ * Revision C and later are fixed with commit 23885389dbbb ("ARM: ++ * dts: Fix timer regression for beagleboard revision c"). This all ++ * can be dropped if we stop supporting old beagleboard revisions ++ * A to B4 at some point. ++ */ ++ if (sysc_soc->soc == SOC_3430) ++ error = -ENXIO; ++ else ++ error = -EBUSY; ++ + if ((ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT) && + (ddata->cfg.quirks & SYSC_QUIRK_NO_IDLE)) +- return -ENXIO; ++ return error; + + return 0; + } +-- +2.35.1 + diff --git a/queue-5.15/cifs-destage-any-unwritten-data-to-the-server-before.patch b/queue-5.15/cifs-destage-any-unwritten-data-to-the-server-before.patch new file mode 100644 index 00000000000..eff83e4a0c0 --- /dev/null +++ b/queue-5.15/cifs-destage-any-unwritten-data-to-the-server-before.patch @@ -0,0 +1,59 @@ +From 4efee5e9ca39dc05e593fda58072a0dc46086e30 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 11:15:36 +1000 +Subject: cifs: destage any unwritten data to the server before calling + copychunk_write + +From: Ronnie Sahlberg + +[ Upstream commit f5d0f921ea362636e4a2efb7c38d1ead373a8700 ] + +because the copychunk_write might cover a region of the file that has not yet +been sent to the server and thus fail. + +A simple way to reproduce this is: +truncate -s 0 /mnt/testfile; strace -f -o x -ttT xfs_io -i -f -c 'pwrite 0k 128k' -c 'fcollapse 16k 24k' /mnt/testfile + +the issue is that the 'pwrite 0k 128k' becomes rearranged on the wire with +the 'fcollapse 16k 24k' due to write-back caching. + +fcollapse is implemented in cifs.ko as a SMB2 IOCTL(COPYCHUNK_WRITE) call +and it will fail serverside since the file is still 0b in size serverside +until the writes have been destaged. +To avoid this we must ensure that we destage any unwritten data to the +server before calling COPYCHUNK_WRITE. + +Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1997373 +Reported-by: Xiaoli Feng +Signed-off-by: Ronnie Sahlberg +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/cifs/smb2ops.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c +index db3ead52ec7c..0c1af2dd9069 100644 +--- a/fs/cifs/smb2ops.c ++++ b/fs/cifs/smb2ops.c +@@ -1849,9 +1849,17 @@ smb2_copychunk_range(const unsigned int xid, + int chunks_copied = 0; + bool chunk_sizes_updated = false; + ssize_t bytes_written, total_bytes_written = 0; ++ struct inode *inode; + + pcchunk = kmalloc(sizeof(struct copychunk_ioctl), GFP_KERNEL); + ++ /* ++ * We need to flush all unwritten data before we can send the ++ * copychunk ioctl to the server. ++ */ ++ inode = d_inode(trgtfile->dentry); ++ filemap_write_and_wait(inode->i_mapping); ++ + if (pcchunk == NULL) + return -ENOMEM; + +-- +2.35.1 + diff --git a/queue-5.15/clk-sunxi-sun9i-mmc-check-return-value-after-calling.patch b/queue-5.15/clk-sunxi-sun9i-mmc-check-return-value-after-calling.patch new file mode 100644 index 00000000000..57ea19a501d --- /dev/null +++ b/queue-5.15/clk-sunxi-sun9i-mmc-check-return-value-after-calling.patch @@ -0,0 +1,39 @@ +From 30c92755fa99b8c8989597923aa84ad76f0fa1d1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 21:43:08 +0800 +Subject: clk: sunxi: sun9i-mmc: check return value after calling + platform_get_resource() + +From: Yang Yingliang + +[ Upstream commit f58ca215cda1975f77b2b762903684a3c101bec9 ] + +It will cause null-ptr-deref if platform_get_resource() returns NULL, +we need check the return value. + +Fixes: 7a6fca879f59 ("clk: sunxi: Add driver for A80 MMC config clocks/resets") +Signed-off-by: Yang Yingliang +Reviewed-by: Samuel Holland +Signed-off-by: Jernej Skrabec +Link: https://lore.kernel.org/r/20220421134308.2885094-1-yangyingliang@huawei.com +Signed-off-by: Sasha Levin +--- + drivers/clk/sunxi/clk-sun9i-mmc.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/clk/sunxi/clk-sun9i-mmc.c b/drivers/clk/sunxi/clk-sun9i-mmc.c +index 542b31d6e96d..636bcf2439ef 100644 +--- a/drivers/clk/sunxi/clk-sun9i-mmc.c ++++ b/drivers/clk/sunxi/clk-sun9i-mmc.c +@@ -109,6 +109,8 @@ static int sun9i_a80_mmc_config_clk_probe(struct platform_device *pdev) + spin_lock_init(&data->lock); + + r = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!r) ++ return -EINVAL; + /* one clock/reset pair per word */ + count = DIV_ROUND_UP((resource_size(r)), SUN9I_MMC_WIDTH); + data->membase = devm_ioremap_resource(&pdev->dev, r); +-- +2.35.1 + diff --git a/queue-5.15/cpufreq-fix-memory-leak-in-sun50i_cpufreq_nvmem_prob.patch b/queue-5.15/cpufreq-fix-memory-leak-in-sun50i_cpufreq_nvmem_prob.patch new file mode 100644 index 00000000000..670cbb09d7e --- /dev/null +++ b/queue-5.15/cpufreq-fix-memory-leak-in-sun50i_cpufreq_nvmem_prob.patch @@ -0,0 +1,64 @@ +From 3964ebea87e1fe2b90bfba13020248e8a702cf88 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 23 Apr 2022 15:12:04 +0000 +Subject: cpufreq: fix memory leak in sun50i_cpufreq_nvmem_probe + +From: Xiaobing Luo + +[ Upstream commit 1aa24a8f3b5133dae4bc1e57427e345445f3e902 ] + +-------------------------------------------- +unreferenced object 0xffff000010742a00 (size 128): + comm "swapper/0", pid 1, jiffies 4294902015 (age 1187.652s) + hex dump (first 32 bytes): + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + backtrace: + [<00000000b4dfebaa>] __kmalloc+0x338/0x474 + [<00000000d6e716db>] sun50i_cpufreq_nvmem_probe+0xc4/0x36c + [<000000007d6082a0>] platform_probe+0x98/0x11c + [<00000000c990f549>] really_probe+0x234/0x5a0 + [<000000002d9fecc6>] __driver_probe_device+0x194/0x224 + [<00000000cf0b94fa>] driver_probe_device+0x64/0x13c + [<00000000f238e4cf>] __device_attach_driver+0xf8/0x180 + [<000000006720e418>] bus_for_each_drv+0xf8/0x160 + [<00000000df4f14f6>] __device_attach+0x174/0x29c + [<00000000782002fb>] device_initial_probe+0x20/0x30 + [<00000000c2681b06>] bus_probe_device+0xfc/0x110 + [<00000000964cf3bd>] device_add+0x5f0/0xcd0 + [<000000004b9264e3>] platform_device_add+0x198/0x390 + [<00000000fa82a9d0>] platform_device_register_full+0x178/0x210 + [<000000009a5daf13>] sun50i_cpufreq_init+0xf8/0x168 + [<000000000377cc7c>] do_one_initcall+0xe4/0x570 +-------------------------------------------- + +if sun50i_cpufreq_get_efuse failed, then opp_tables leak. + +Fixes: f328584f7bff ("cpufreq: Add sun50i nvmem based CPU scaling driver") +Signed-off-by: Xiaobing Luo +Reviewed-by: Samuel Holland +Signed-off-by: Viresh Kumar +Signed-off-by: Sasha Levin +--- + drivers/cpufreq/sun50i-cpufreq-nvmem.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/cpufreq/sun50i-cpufreq-nvmem.c b/drivers/cpufreq/sun50i-cpufreq-nvmem.c +index 2deed8d8773f..75e1bf3a08f7 100644 +--- a/drivers/cpufreq/sun50i-cpufreq-nvmem.c ++++ b/drivers/cpufreq/sun50i-cpufreq-nvmem.c +@@ -98,8 +98,10 @@ static int sun50i_cpufreq_nvmem_probe(struct platform_device *pdev) + return -ENOMEM; + + ret = sun50i_cpufreq_get_efuse(&speed); +- if (ret) ++ if (ret) { ++ kfree(opp_tables); + return ret; ++ } + + snprintf(name, MAX_NAME_LEN, "speed%d", speed); + +-- +2.35.1 + diff --git a/queue-5.15/cpufreq-qcom-cpufreq-hw-clear-dcvs-interrupts.patch b/queue-5.15/cpufreq-qcom-cpufreq-hw-clear-dcvs-interrupts.patch new file mode 100644 index 00000000000..307c58c07b2 --- /dev/null +++ b/queue-5.15/cpufreq-qcom-cpufreq-hw-clear-dcvs-interrupts.patch @@ -0,0 +1,65 @@ +From 26571a4debd19a1e37c846383ee855238e44fd00 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Apr 2022 23:09:19 +0300 +Subject: cpufreq: qcom-cpufreq-hw: Clear dcvs interrupts + +From: Vladimir Zapolskiy + +[ Upstream commit e4e6448638a01905faeda9bf96aa9df7c8ef463c ] + +It's noted that dcvs interrupts are not self-clearing, thus an interrupt +handler runs constantly, which leads to a severe regression in runtime. +To fix the problem an explicit write to clear interrupt register is +required, note that on OSM platforms the register may not be present. + +Fixes: 275157b367f4 ("cpufreq: qcom-cpufreq-hw: Add dcvs interrupt support") +Signed-off-by: Vladimir Zapolskiy +Signed-off-by: Viresh Kumar +Signed-off-by: Sasha Levin +--- + drivers/cpufreq/qcom-cpufreq-hw.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/cpufreq/qcom-cpufreq-hw.c b/drivers/cpufreq/qcom-cpufreq-hw.c +index e73ecab23c85..bb2f59fd0de4 100644 +--- a/drivers/cpufreq/qcom-cpufreq-hw.c ++++ b/drivers/cpufreq/qcom-cpufreq-hw.c +@@ -24,6 +24,8 @@ + #define CLK_HW_DIV 2 + #define LUT_TURBO_IND 1 + ++#define GT_IRQ_STATUS BIT(2) ++ + #define HZ_PER_KHZ 1000 + + struct qcom_cpufreq_soc_data { +@@ -31,6 +33,7 @@ struct qcom_cpufreq_soc_data { + u32 reg_domain_state; + u32 reg_freq_lut; + u32 reg_volt_lut; ++ u32 reg_intr_clr; + u32 reg_current_vote; + u32 reg_perf_state; + u8 lut_row_size; +@@ -349,6 +352,10 @@ static irqreturn_t qcom_lmh_dcvs_handle_irq(int irq, void *data) + disable_irq_nosync(c_data->throttle_irq); + schedule_delayed_work(&c_data->throttle_work, 0); + ++ if (c_data->soc_data->reg_intr_clr) ++ writel_relaxed(GT_IRQ_STATUS, ++ c_data->base + c_data->soc_data->reg_intr_clr); ++ + return IRQ_HANDLED; + } + +@@ -366,6 +373,7 @@ static const struct qcom_cpufreq_soc_data epss_soc_data = { + .reg_domain_state = 0x20, + .reg_freq_lut = 0x100, + .reg_volt_lut = 0x200, ++ .reg_intr_clr = 0x308, + .reg_perf_state = 0x320, + .lut_row_size = 4, + }; +-- +2.35.1 + diff --git a/queue-5.15/cpufreq-qcom-cpufreq-hw-fix-throttle-frequency-value.patch b/queue-5.15/cpufreq-qcom-cpufreq-hw-fix-throttle-frequency-value.patch new file mode 100644 index 00000000000..a5ef73e8ade --- /dev/null +++ b/queue-5.15/cpufreq-qcom-cpufreq-hw-fix-throttle-frequency-value.patch @@ -0,0 +1,86 @@ +From dd0e4419b0c43f7c7e8a400d42d98736fb1a28f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 1 Apr 2022 10:14:24 +0300 +Subject: cpufreq: qcom-cpufreq-hw: Fix throttle frequency value on EPSS + platforms + +From: Vladimir Zapolskiy + +[ Upstream commit f84ccad5f5660f86a642a3d7e2bfdc4e7a8a2d49 ] + +On QCOM platforms with EPSS flavour of cpufreq IP a throttled frequency is +obtained from another register REG_DOMAIN_STATE, thus the helper function +qcom_lmh_get_throttle_freq() should be modified accordingly, as for now +it returns gibberish since .reg_current_vote is unset for EPSS hardware. + +To exclude a hardcoded magic number 19200 it is replaced by "xo" clock rate +in KHz. + +Fixes: 275157b367f4 ("cpufreq: qcom-cpufreq-hw: Add dcvs interrupt support") +Reviewed-by: Bjorn Andersson +Signed-off-by: Vladimir Zapolskiy +Signed-off-by: Viresh Kumar +Signed-off-by: Sasha Levin +--- + drivers/cpufreq/qcom-cpufreq-hw.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +diff --git a/drivers/cpufreq/qcom-cpufreq-hw.c b/drivers/cpufreq/qcom-cpufreq-hw.c +index dfe72d82858f..e73ecab23c85 100644 +--- a/drivers/cpufreq/qcom-cpufreq-hw.c ++++ b/drivers/cpufreq/qcom-cpufreq-hw.c +@@ -28,6 +28,7 @@ + + struct qcom_cpufreq_soc_data { + u32 reg_enable; ++ u32 reg_domain_state; + u32 reg_freq_lut; + u32 reg_volt_lut; + u32 reg_current_vote; +@@ -266,11 +267,16 @@ static void qcom_get_related_cpus(int index, struct cpumask *m) + } + } + +-static unsigned int qcom_lmh_get_throttle_freq(struct qcom_cpufreq_data *data) ++static unsigned long qcom_lmh_get_throttle_freq(struct qcom_cpufreq_data *data) + { +- unsigned int val = readl_relaxed(data->base + data->soc_data->reg_current_vote); ++ unsigned int lval; + +- return (val & 0x3FF) * 19200; ++ if (data->soc_data->reg_current_vote) ++ lval = readl_relaxed(data->base + data->soc_data->reg_current_vote) & 0x3ff; ++ else ++ lval = readl_relaxed(data->base + data->soc_data->reg_domain_state) & 0xff; ++ ++ return lval * xo_rate; + } + + static void qcom_lmh_dcvs_notify(struct qcom_cpufreq_data *data) +@@ -280,14 +286,12 @@ static void qcom_lmh_dcvs_notify(struct qcom_cpufreq_data *data) + int cpu = cpumask_first(policy->related_cpus); + struct device *dev = get_cpu_device(cpu); + struct dev_pm_opp *opp; +- unsigned int freq; + + /* + * Get the h/w throttled frequency, normalize it using the + * registered opp table and use it to calculate thermal pressure. + */ +- freq = qcom_lmh_get_throttle_freq(data); +- freq_hz = freq * HZ_PER_KHZ; ++ freq_hz = qcom_lmh_get_throttle_freq(data); + + opp = dev_pm_opp_find_freq_floor(dev, &freq_hz); + if (IS_ERR(opp) && PTR_ERR(opp) == -ERANGE) +@@ -359,6 +363,7 @@ static const struct qcom_cpufreq_soc_data qcom_soc_data = { + + static const struct qcom_cpufreq_soc_data epss_soc_data = { + .reg_enable = 0x0, ++ .reg_domain_state = 0x20, + .reg_freq_lut = 0x100, + .reg_volt_lut = 0x200, + .reg_perf_state = 0x320, +-- +2.35.1 + diff --git a/queue-5.15/cpufreq-qcom-hw-fix-the-race-between-lmh-worker-and-.patch b/queue-5.15/cpufreq-qcom-hw-fix-the-race-between-lmh-worker-and-.patch new file mode 100644 index 00000000000..23c278465ad --- /dev/null +++ b/queue-5.15/cpufreq-qcom-hw-fix-the-race-between-lmh-worker-and-.patch @@ -0,0 +1,73 @@ +From fd9051e0b0eed27f1b1d9f3acf00469054699529 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 26 Mar 2022 18:51:51 +0300 +Subject: cpufreq: qcom-hw: fix the race between LMH worker and cpuhp + +From: Dmitry Baryshkov + +[ Upstream commit 5e4f009da6be563984ba4db4ef4f32529e9aeb90 ] + +The driver would disable the worker when cpu is being put offline, but +it happens closer to the end of cpufreq_offline(). The function +qcom_lmh_dcvs_poll() can be running in parallel with this, when +policy->cpus already has been updated. Read policy->related_cpus +instead. + +[ 37.122433] ------------[ cut here ]------------ +[ 37.127225] WARNING: CPU: 0 PID: 187 at drivers/base/arch_topology.c:180 topology_update_thermal_pressure+0xec/0x100 +[ 37.138098] Modules linked in: +[ 37.141279] CPU: 0 PID: 187 Comm: kworker/0:3 Tainted: G S 5.17.0-rc6-00389-g37c83d0b8710-dirty #713 +[ 37.158306] Workqueue: events qcom_lmh_dcvs_poll +[ 37.163095] pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) +[ 37.170278] pc : topology_update_thermal_pressure+0xec/0x100 +[ 37.176131] lr : topology_update_thermal_pressure+0x20/0x100 +[ 37.181977] sp : ffff800009b6bce0 +[ 37.185402] x29: ffff800009b6bce0 x28: ffffd87abe92b000 x27: ffff04bd7292e205 +[ 37.192792] x26: ffffd87abe930af8 x25: ffffd87abe94e4c8 x24: 0000000000000000 +[ 37.200180] x23: ffff04bb01177018 x22: ffff04bb011770c0 x21: ffff04bb01177000 +[ 37.207567] x20: ffff04bb0a419000 x19: 00000000000c4e00 x18: 0000000000000000 +[ 37.214954] x17: 000000040044ffff x16: 004000b2b5503510 x15: 0000006aaa1326d2 +[ 37.222333] x14: 0000000000000232 x13: 0000000000000001 x12: 0000000000000040 +[ 37.229718] x11: ffff04bb00400000 x10: 968f57bd39f701c8 x9 : ffff04bb0acc8674 +[ 37.237095] x8 : fefefefefefefeff x7 : 0000000000000018 x6 : ffffd87abd90092c +[ 37.244478] x5 : 0000000000000016 x4 : 0000000000000000 x3 : 0000000000000100 +[ 37.251852] x2 : ffff04bb0a419020 x1 : 0000000000000100 x0 : 0000000000000100 +[ 37.259235] Call trace: +[ 37.261771] topology_update_thermal_pressure+0xec/0x100 +[ 37.267266] qcom_lmh_dcvs_poll+0xbc/0x154 +[ 37.271505] process_one_work+0x288/0x69c +[ 37.275654] worker_thread+0x74/0x470 +[ 37.279450] kthread+0xfc/0x100 +[ 37.282712] ret_from_fork+0x10/0x20 +[ 37.286417] irq event stamp: 74 +[ 37.289664] hardirqs last enabled at (73): [] _raw_spin_unlock_irq+0x44/0x80 +[ 37.298632] hardirqs last disabled at (74): [] __schedule+0x710/0xa10 +[ 37.306885] softirqs last enabled at (58): [] _stext+0x410/0x588 +[ 37.314778] softirqs last disabled at (51): [] __irq_exit_rcu+0x158/0x174 +[ 37.323386] ---[ end trace 0000000000000000 ]--- + +Fixes: 275157b367f4 ("cpufreq: qcom-cpufreq-hw: Add dcvs interrupt support") +Signed-off-by: Dmitry Baryshkov +Reviewed-by: Bjorn Andersson +Signed-off-by: Viresh Kumar +Signed-off-by: Sasha Levin +--- + drivers/cpufreq/qcom-cpufreq-hw.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/cpufreq/qcom-cpufreq-hw.c b/drivers/cpufreq/qcom-cpufreq-hw.c +index 35d93361fda1..dfe72d82858f 100644 +--- a/drivers/cpufreq/qcom-cpufreq-hw.c ++++ b/drivers/cpufreq/qcom-cpufreq-hw.c +@@ -277,7 +277,7 @@ static void qcom_lmh_dcvs_notify(struct qcom_cpufreq_data *data) + { + unsigned long max_capacity, capacity, freq_hz, throttled_freq; + struct cpufreq_policy *policy = data->policy; +- int cpu = cpumask_first(policy->cpus); ++ int cpu = cpumask_first(policy->related_cpus); + struct device *dev = get_cpu_device(cpu); + struct dev_pm_opp *opp; + unsigned int freq; +-- +2.35.1 + diff --git a/queue-5.15/drivers-net-hippi-fix-deadlock-in-rr_close.patch b/queue-5.15/drivers-net-hippi-fix-deadlock-in-rr_close.patch new file mode 100644 index 00000000000..11bbb96102e --- /dev/null +++ b/queue-5.15/drivers-net-hippi-fix-deadlock-in-rr_close.patch @@ -0,0 +1,53 @@ +From 95341109f9bfd53ce20f4297658b6f3585b7012d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 17 Apr 2022 20:55:19 +0800 +Subject: drivers: net: hippi: Fix deadlock in rr_close() + +From: Duoming Zhou + +[ Upstream commit bc6de2878429e85c1f1afaa566f7b5abb2243eef ] + +There is a deadlock in rr_close(), which is shown below: + + (Thread 1) | (Thread 2) + | rr_open() +rr_close() | add_timer() + spin_lock_irqsave() //(1) | (wait a time) + ... | rr_timer() + del_timer_sync() | spin_lock_irqsave() //(2) + (wait timer to stop) | ... + +We hold rrpriv->lock in position (1) of thread 1 and +use del_timer_sync() to wait timer to stop, but timer handler +also need rrpriv->lock in position (2) of thread 2. +As a result, rr_close() will block forever. + +This patch extracts del_timer_sync() from the protection of +spin_lock_irqsave(), which could let timer handler to obtain +the needed lock. + +Signed-off-by: Duoming Zhou +Link: https://lore.kernel.org/r/20220417125519.82618-1-duoming@zju.edu.cn +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + drivers/net/hippi/rrunner.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/net/hippi/rrunner.c b/drivers/net/hippi/rrunner.c +index 7661dbb31162..50e4bea46d67 100644 +--- a/drivers/net/hippi/rrunner.c ++++ b/drivers/net/hippi/rrunner.c +@@ -1353,7 +1353,9 @@ static int rr_close(struct net_device *dev) + + rrpriv->fw_running = 0; + ++ spin_unlock_irqrestore(&rrpriv->lock, flags); + del_timer_sync(&rrpriv->timer); ++ spin_lock_irqsave(&rrpriv->lock, flags); + + writel(0, ®s->TxPi); + writel(0, ®s->IpRxPi); +-- +2.35.1 + diff --git a/queue-5.15/drm-amd-display-fix-memory-leak-in-dcn21_clock_sourc.patch b/queue-5.15/drm-amd-display-fix-memory-leak-in-dcn21_clock_sourc.patch new file mode 100644 index 00000000000..5877248b9c1 --- /dev/null +++ b/queue-5.15/drm-amd-display-fix-memory-leak-in-dcn21_clock_sourc.patch @@ -0,0 +1,34 @@ +From 97bce4b1ecb554555b23a652b131f21f9e787994 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 17:03:09 +0800 +Subject: drm/amd/display: Fix memory leak in dcn21_clock_source_create + +From: Miaoqian Lin + +[ Upstream commit 65e54987508b6f0771f56bdfa3ee1926d52785ae ] + +When dcn20_clk_src_construct() fails, we need to release clk_src. + +Fixes: 6f4e6361c3ff ("drm/amd/display: Add Renoir resource (v2)") +Signed-off-by: Miaoqian Lin +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c +index fbbdf9976183..5b8274b8c384 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c +@@ -1428,6 +1428,7 @@ static struct clock_source *dcn21_clock_source_create( + return &clk_src->base; + } + ++ kfree(clk_src); + BREAK_TO_DEBUGGER(); + return NULL; + } +-- +2.35.1 + diff --git a/queue-5.15/drm-amdkfd-fix-gws-queue-count.patch b/queue-5.15/drm-amdkfd-fix-gws-queue-count.patch new file mode 100644 index 00000000000..2b01c1d65c1 --- /dev/null +++ b/queue-5.15/drm-amdkfd-fix-gws-queue-count.patch @@ -0,0 +1,222 @@ +From 9288e4eefe78406b9c9ef72c762470c498641585 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Apr 2022 11:55:58 -0400 +Subject: drm/amdkfd: Fix GWS queue count + +From: David Yat Sin + +[ Upstream commit 7c6b6e18c890f30965b0589b0a57645e1dbccfde ] + +dqm->gws_queue_count and pdd->qpd.mapped_gws_queue need to be updated +each time the queue gets evicted. + +Fixes: b8020b0304c8 ("drm/amdkfd: Enable over-subscription with >1 GWS queue") +Signed-off-by: David Yat Sin +Reviewed-by: Felix Kuehling +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + .../drm/amd/amdkfd/kfd_device_queue_manager.c | 83 +++++++++---------- + 1 file changed, 37 insertions(+), 46 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +index 4f2e0cc8a51a..442857f3bde7 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +@@ -138,19 +138,33 @@ void program_sh_mem_settings(struct device_queue_manager *dqm, + } + + static void increment_queue_count(struct device_queue_manager *dqm, +- enum kfd_queue_type type) ++ struct qcm_process_device *qpd, ++ struct queue *q) + { + dqm->active_queue_count++; +- if (type == KFD_QUEUE_TYPE_COMPUTE || type == KFD_QUEUE_TYPE_DIQ) ++ if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE || ++ q->properties.type == KFD_QUEUE_TYPE_DIQ) + dqm->active_cp_queue_count++; ++ ++ if (q->properties.is_gws) { ++ dqm->gws_queue_count++; ++ qpd->mapped_gws_queue = true; ++ } + } + + static void decrement_queue_count(struct device_queue_manager *dqm, +- enum kfd_queue_type type) ++ struct qcm_process_device *qpd, ++ struct queue *q) + { + dqm->active_queue_count--; +- if (type == KFD_QUEUE_TYPE_COMPUTE || type == KFD_QUEUE_TYPE_DIQ) ++ if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE || ++ q->properties.type == KFD_QUEUE_TYPE_DIQ) + dqm->active_cp_queue_count--; ++ ++ if (q->properties.is_gws) { ++ dqm->gws_queue_count--; ++ qpd->mapped_gws_queue = false; ++ } + } + + static int allocate_doorbell(struct qcm_process_device *qpd, struct queue *q) +@@ -390,7 +404,7 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm, + list_add(&q->list, &qpd->queues_list); + qpd->queue_count++; + if (q->properties.is_active) +- increment_queue_count(dqm, q->properties.type); ++ increment_queue_count(dqm, qpd, q); + + /* + * Unconditionally increment this counter, regardless of the queue's +@@ -515,13 +529,8 @@ static int destroy_queue_nocpsch_locked(struct device_queue_manager *dqm, + deallocate_vmid(dqm, qpd, q); + } + qpd->queue_count--; +- if (q->properties.is_active) { +- decrement_queue_count(dqm, q->properties.type); +- if (q->properties.is_gws) { +- dqm->gws_queue_count--; +- qpd->mapped_gws_queue = false; +- } +- } ++ if (q->properties.is_active) ++ decrement_queue_count(dqm, qpd, q); + + return retval; + } +@@ -613,12 +622,11 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q) + * dqm->active_queue_count to determine whether a new runlist must be + * uploaded. + */ +- if (q->properties.is_active && !prev_active) +- increment_queue_count(dqm, q->properties.type); +- else if (!q->properties.is_active && prev_active) +- decrement_queue_count(dqm, q->properties.type); +- +- if (q->gws && !q->properties.is_gws) { ++ if (q->properties.is_active && !prev_active) { ++ increment_queue_count(dqm, &pdd->qpd, q); ++ } else if (!q->properties.is_active && prev_active) { ++ decrement_queue_count(dqm, &pdd->qpd, q); ++ } else if (q->gws && !q->properties.is_gws) { + if (q->properties.is_active) { + dqm->gws_queue_count++; + pdd->qpd.mapped_gws_queue = true; +@@ -680,11 +688,7 @@ static int evict_process_queues_nocpsch(struct device_queue_manager *dqm, + mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type( + q->properties.type)]; + q->properties.is_active = false; +- decrement_queue_count(dqm, q->properties.type); +- if (q->properties.is_gws) { +- dqm->gws_queue_count--; +- qpd->mapped_gws_queue = false; +- } ++ decrement_queue_count(dqm, qpd, q); + + if (WARN_ONCE(!dqm->sched_running, "Evict when stopped\n")) + continue; +@@ -730,7 +734,7 @@ static int evict_process_queues_cpsch(struct device_queue_manager *dqm, + continue; + + q->properties.is_active = false; +- decrement_queue_count(dqm, q->properties.type); ++ decrement_queue_count(dqm, qpd, q); + } + pdd->last_evict_timestamp = get_jiffies_64(); + retval = execute_queues_cpsch(dqm, +@@ -801,11 +805,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm, + mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type( + q->properties.type)]; + q->properties.is_active = true; +- increment_queue_count(dqm, q->properties.type); +- if (q->properties.is_gws) { +- dqm->gws_queue_count++; +- qpd->mapped_gws_queue = true; +- } ++ increment_queue_count(dqm, qpd, q); + + if (WARN_ONCE(!dqm->sched_running, "Restore when stopped\n")) + continue; +@@ -863,7 +863,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm, + continue; + + q->properties.is_active = true; +- increment_queue_count(dqm, q->properties.type); ++ increment_queue_count(dqm, &pdd->qpd, q); + } + retval = execute_queues_cpsch(dqm, + KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0); +@@ -1265,7 +1265,7 @@ static int create_kernel_queue_cpsch(struct device_queue_manager *dqm, + dqm->total_queue_count); + + list_add(&kq->list, &qpd->priv_queue_list); +- increment_queue_count(dqm, kq->queue->properties.type); ++ increment_queue_count(dqm, qpd, kq->queue); + qpd->is_debug = true; + execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0); + dqm_unlock(dqm); +@@ -1279,7 +1279,7 @@ static void destroy_kernel_queue_cpsch(struct device_queue_manager *dqm, + { + dqm_lock(dqm); + list_del(&kq->list); +- decrement_queue_count(dqm, kq->queue->properties.type); ++ decrement_queue_count(dqm, qpd, kq->queue); + qpd->is_debug = false; + execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0); + /* +@@ -1346,7 +1346,7 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, + qpd->queue_count++; + + if (q->properties.is_active) { +- increment_queue_count(dqm, q->properties.type); ++ increment_queue_count(dqm, qpd, q); + + execute_queues_cpsch(dqm, + KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0); +@@ -1548,15 +1548,11 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm, + list_del(&q->list); + qpd->queue_count--; + if (q->properties.is_active) { +- decrement_queue_count(dqm, q->properties.type); ++ decrement_queue_count(dqm, qpd, q); + retval = execute_queues_cpsch(dqm, + KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0); + if (retval == -ETIME) + qpd->reset_wavefronts = true; +- if (q->properties.is_gws) { +- dqm->gws_queue_count--; +- qpd->mapped_gws_queue = false; +- } + } + + /* +@@ -1747,7 +1743,7 @@ static int process_termination_cpsch(struct device_queue_manager *dqm, + /* Clean all kernel queues */ + list_for_each_entry_safe(kq, kq_next, &qpd->priv_queue_list, list) { + list_del(&kq->list); +- decrement_queue_count(dqm, kq->queue->properties.type); ++ decrement_queue_count(dqm, qpd, kq->queue); + qpd->is_debug = false; + dqm->total_queue_count--; + filter = KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES; +@@ -1760,13 +1756,8 @@ static int process_termination_cpsch(struct device_queue_manager *dqm, + else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) + deallocate_sdma_queue(dqm, q); + +- if (q->properties.is_active) { +- decrement_queue_count(dqm, q->properties.type); +- if (q->properties.is_gws) { +- dqm->gws_queue_count--; +- qpd->mapped_gws_queue = false; +- } +- } ++ if (q->properties.is_active) ++ decrement_queue_count(dqm, qpd, q); + + dqm->total_queue_count--; + } +-- +2.35.1 + diff --git a/queue-5.15/drm-sun4i-remove-obsolete-references-to-phys_offset.patch b/queue-5.15/drm-sun4i-remove-obsolete-references-to-phys_offset.patch new file mode 100644 index 00000000000..fe6741f0c5e --- /dev/null +++ b/queue-5.15/drm-sun4i-remove-obsolete-references-to-phys_offset.patch @@ -0,0 +1,65 @@ +From bd7918f9cfdebc09dd5303ea91b93fec40d2ba92 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Apr 2022 11:26:21 -0500 +Subject: drm/sun4i: Remove obsolete references to PHYS_OFFSET + +From: Samuel Holland + +[ Upstream commit dc3ae06c5f2170d879ff58696f629d8c3868aec3 ] + +commit b4bdc4fbf8d0 ("soc: sunxi: Deal with the MBUS DMA offsets in a +central place") added a platform device notifier that sets the DMA +offset for all of the display engine frontend and backend devices. + +The code applying the offset to DMA buffer physical addresses was then +removed from the backend driver in commit 756668ba682e ("drm/sun4i: +backend: Remove the MBUS quirks"), but the code subtracting PHYS_OFFSET +was left in the frontend driver. + +As a result, the offset was applied twice in the frontend driver. This +likely went unnoticed because it only affects specific configurations +(scaling or certain pixel formats) where the frontend is used, on boards +with both one of these older SoCs and more than 1 GB of DRAM. + +In addition, the references to PHYS_OFFSET prevent compiling the driver +on architectures where PHYS_OFFSET is not defined. + +Fixes: b4bdc4fbf8d0 ("soc: sunxi: Deal with the MBUS DMA offsets in a central place") +Reviewed-by: Jernej Skrabec +Signed-off-by: Samuel Holland +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20220424162633.12369-4-samuel@sholland.org +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/sun4i/sun4i_frontend.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/drivers/gpu/drm/sun4i/sun4i_frontend.c b/drivers/gpu/drm/sun4i/sun4i_frontend.c +index edb60ae0a9b7..faecc2935039 100644 +--- a/drivers/gpu/drm/sun4i/sun4i_frontend.c ++++ b/drivers/gpu/drm/sun4i/sun4i_frontend.c +@@ -222,13 +222,11 @@ void sun4i_frontend_update_buffer(struct sun4i_frontend *frontend, + + /* Set the physical address of the buffer in memory */ + paddr = drm_fb_cma_get_gem_addr(fb, state, 0); +- paddr -= PHYS_OFFSET; + DRM_DEBUG_DRIVER("Setting buffer #0 address to %pad\n", &paddr); + regmap_write(frontend->regs, SUN4I_FRONTEND_BUF_ADDR0_REG, paddr); + + if (fb->format->num_planes > 1) { + paddr = drm_fb_cma_get_gem_addr(fb, state, swap ? 2 : 1); +- paddr -= PHYS_OFFSET; + DRM_DEBUG_DRIVER("Setting buffer #1 address to %pad\n", &paddr); + regmap_write(frontend->regs, SUN4I_FRONTEND_BUF_ADDR1_REG, + paddr); +@@ -236,7 +234,6 @@ void sun4i_frontend_update_buffer(struct sun4i_frontend *frontend, + + if (fb->format->num_planes > 2) { + paddr = drm_fb_cma_get_gem_addr(fb, state, swap ? 1 : 2); +- paddr -= PHYS_OFFSET; + DRM_DEBUG_DRIVER("Setting buffer #2 address to %pad\n", &paddr); + regmap_write(frontend->regs, SUN4I_FRONTEND_BUF_ADDR2_REG, + paddr); +-- +2.35.1 + diff --git a/queue-5.15/ext4-fix-bug_on-in-start_this_handle-during-umount-f.patch b/queue-5.15/ext4-fix-bug_on-in-start_this_handle-during-umount-f.patch new file mode 100644 index 00000000000..0f2553f8bc8 --- /dev/null +++ b/queue-5.15/ext4-fix-bug_on-in-start_this_handle-during-umount-f.patch @@ -0,0 +1,118 @@ +From 18b08f338e0f53d39fa6a15447612d2aee71678e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 22 Mar 2022 09:24:19 +0800 +Subject: ext4: fix bug_on in start_this_handle during umount filesystem + +From: Ye Bin + +[ Upstream commit b98535d091795a79336f520b0708457aacf55c67 ] + +We got issue as follows: +------------[ cut here ]------------ +kernel BUG at fs/jbd2/transaction.c:389! +invalid opcode: 0000 [#1] PREEMPT SMP KASAN PTI +CPU: 9 PID: 131 Comm: kworker/9:1 Not tainted 5.17.0-862.14.0.6.x86_64-00001-g23f87daf7d74-dirty #197 +Workqueue: events flush_stashed_error_work +RIP: 0010:start_this_handle+0x41c/0x1160 +RSP: 0018:ffff888106b47c20 EFLAGS: 00010202 +RAX: ffffed10251b8400 RBX: ffff888128dc204c RCX: ffffffffb52972ac +RDX: 0000000000000200 RSI: 0000000000000004 RDI: ffff888128dc2050 +RBP: 0000000000000039 R08: 0000000000000001 R09: ffffed10251b840a +R10: ffff888128dc204f R11: ffffed10251b8409 R12: ffff888116d78000 +R13: 0000000000000000 R14: dffffc0000000000 R15: ffff888128dc2000 +FS: 0000000000000000(0000) GS:ffff88839d680000(0000) knlGS:0000000000000000 +CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +CR2: 0000000001620068 CR3: 0000000376c0e000 CR4: 00000000000006e0 +DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 +DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 +Call Trace: + + jbd2__journal_start+0x38a/0x790 + jbd2_journal_start+0x19/0x20 + flush_stashed_error_work+0x110/0x2b3 + process_one_work+0x688/0x1080 + worker_thread+0x8b/0xc50 + kthread+0x26f/0x310 + ret_from_fork+0x22/0x30 + +Modules linked in: +---[ end trace 0000000000000000 ]--- + +Above issue may happen as follows: + umount read procfs error_work +ext4_put_super + flush_work(&sbi->s_error_work); + + ext4_mb_seq_groups_show + ext4_mb_load_buddy_gfp + ext4_mb_init_group + ext4_mb_init_cache + ext4_read_block_bitmap_nowait + ext4_validate_block_bitmap + ext4_error + ext4_handle_error + schedule_work(&EXT4_SB(sb)->s_error_work); + + ext4_unregister_sysfs(sb); + jbd2_journal_destroy(sbi->s_journal); + journal_kill_thread + journal->j_flags |= JBD2_UNMOUNT; + + flush_stashed_error_work + jbd2_journal_start + start_this_handle + BUG_ON(journal->j_flags & JBD2_UNMOUNT); + +To solve this issue, we call 'ext4_unregister_sysfs() before flushing +s_error_work in ext4_put_super(). + +Signed-off-by: Ye Bin +Reviewed-by: Jan Kara +Reviewed-by: Ritesh Harjani +Link: https://lore.kernel.org/r/20220322012419.725457-1-yebin10@huawei.com +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/ext4/super.c | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +diff --git a/fs/ext4/super.c b/fs/ext4/super.c +index fa21d8180319..d12f11c6fbf2 100644 +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -1167,20 +1167,25 @@ static void ext4_put_super(struct super_block *sb) + int aborted = 0; + int i, err; + +- ext4_unregister_li_request(sb); +- ext4_quota_off_umount(sb); +- +- flush_work(&sbi->s_error_work); +- destroy_workqueue(sbi->rsv_conversion_wq); +- ext4_release_orphan_info(sb); +- + /* + * Unregister sysfs before destroying jbd2 journal. + * Since we could still access attr_journal_task attribute via sysfs + * path which could have sbi->s_journal->j_task as NULL ++ * Unregister sysfs before flush sbi->s_error_work. ++ * Since user may read /proc/fs/ext4/xx/mb_groups during umount, If ++ * read metadata verify failed then will queue error work. ++ * flush_stashed_error_work will call start_this_handle may trigger ++ * BUG_ON. + */ + ext4_unregister_sysfs(sb); + ++ ext4_unregister_li_request(sb); ++ ext4_quota_off_umount(sb); ++ ++ flush_work(&sbi->s_error_work); ++ destroy_workqueue(sbi->rsv_conversion_wq); ++ ext4_release_orphan_info(sb); ++ + if (sbi->s_journal) { + aborted = is_journal_aborted(sbi->s_journal); + err = jbd2_journal_destroy(sbi->s_journal); +-- +2.35.1 + diff --git a/queue-5.15/gfs2-make-sure-not-to-return-short-direct-writes.patch b/queue-5.15/gfs2-make-sure-not-to-return-short-direct-writes.patch new file mode 100644 index 00000000000..ec7787a454e --- /dev/null +++ b/queue-5.15/gfs2-make-sure-not-to-return-short-direct-writes.patch @@ -0,0 +1,37 @@ +From c27876309aab29dfbb9b01070b9ba080952f0551 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 24 Mar 2022 23:13:26 +0100 +Subject: gfs2: Make sure not to return short direct writes + +From: Andreas Gruenbacher + +[ Upstream commit 3bde4c48586074202044456285a97ccdf9048988 ] + +When direct writes fail with -ENOTBLK because we're writing into a +hole (gfs2_iomap_begin()) or because of a page invalidation failure +(iomap_dio_rw()), we're falling back to buffered writes. In that case, +when we lose the inode glock in gfs2_file_buffered_write(), we want to +re-acquire it instead of returning a short write. + +Signed-off-by: Andreas Gruenbacher +Signed-off-by: Sasha Levin +--- + fs/gfs2/file.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c +index 964c19e27ce2..42fa4b5b81a0 100644 +--- a/fs/gfs2/file.c ++++ b/fs/gfs2/file.c +@@ -1076,7 +1076,7 @@ static ssize_t gfs2_file_buffered_write(struct kiocb *iocb, + from->count = min(from->count, window_size - leftover); + if (gfs2_holder_queued(gh)) + goto retry_under_glock; +- if (read) ++ if (read && !(iocb->ki_flags & IOCB_DIRECT)) + goto out_uninit; + goto retry; + } +-- +2.35.1 + diff --git a/queue-5.15/gfs2-minor-retry-logic-cleanup.patch b/queue-5.15/gfs2-minor-retry-logic-cleanup.patch new file mode 100644 index 00000000000..da61348b7be --- /dev/null +++ b/queue-5.15/gfs2-minor-retry-logic-cleanup.patch @@ -0,0 +1,86 @@ +From d99b8019f50b623a94c5ed3b28df9063b5ee1404 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Mar 2022 14:20:38 +0100 +Subject: gfs2: Minor retry logic cleanup + +From: Andreas Gruenbacher + +[ Upstream commit 124c458a401a2497f796e4f2d6cafac6edbea8e9 ] + +Clean up the retry logic in the read and write functions somewhat. + +Signed-off-by: Andreas Gruenbacher +Signed-off-by: Sasha Levin +--- + fs/gfs2/file.c | 34 ++++++++++++++++------------------ + 1 file changed, 16 insertions(+), 18 deletions(-) + +diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c +index 97e2793e22d7..964c19e27ce2 100644 +--- a/fs/gfs2/file.c ++++ b/fs/gfs2/file.c +@@ -858,9 +858,9 @@ static ssize_t gfs2_file_direct_read(struct kiocb *iocb, struct iov_iter *to, + leftover = fault_in_iov_iter_writeable(to, window_size); + gfs2_holder_disallow_demote(gh); + if (leftover != window_size) { +- if (!gfs2_holder_queued(gh)) +- goto retry; +- goto retry_under_glock; ++ if (gfs2_holder_queued(gh)) ++ goto retry_under_glock; ++ goto retry; + } + } + if (gfs2_holder_queued(gh)) +@@ -927,9 +927,9 @@ static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from, + leftover = fault_in_iov_iter_readable(from, window_size); + gfs2_holder_disallow_demote(gh); + if (leftover != window_size) { +- if (!gfs2_holder_queued(gh)) +- goto retry; +- goto retry_under_glock; ++ if (gfs2_holder_queued(gh)) ++ goto retry_under_glock; ++ goto retry; + } + } + out: +@@ -996,12 +996,11 @@ static ssize_t gfs2_file_read_iter(struct kiocb *iocb, struct iov_iter *to) + leftover = fault_in_iov_iter_writeable(to, window_size); + gfs2_holder_disallow_demote(&gh); + if (leftover != window_size) { +- if (!gfs2_holder_queued(&gh)) { +- if (written) +- goto out_uninit; +- goto retry; +- } +- goto retry_under_glock; ++ if (gfs2_holder_queued(&gh)) ++ goto retry_under_glock; ++ if (written) ++ goto out_uninit; ++ goto retry; + } + } + if (gfs2_holder_queued(&gh)) +@@ -1075,12 +1074,11 @@ static ssize_t gfs2_file_buffered_write(struct kiocb *iocb, + gfs2_holder_disallow_demote(gh); + if (leftover != window_size) { + from->count = min(from->count, window_size - leftover); +- if (!gfs2_holder_queued(gh)) { +- if (read) +- goto out_uninit; +- goto retry; +- } +- goto retry_under_glock; ++ if (gfs2_holder_queued(gh)) ++ goto retry_under_glock; ++ if (read) ++ goto out_uninit; ++ goto retry; + } + } + out_unlock: +-- +2.35.1 + diff --git a/queue-5.15/gfs2-no-short-reads-or-writes-upon-glock-contention.patch b/queue-5.15/gfs2-no-short-reads-or-writes-upon-glock-contention.patch new file mode 100644 index 00000000000..25d166444a1 --- /dev/null +++ b/queue-5.15/gfs2-no-short-reads-or-writes-upon-glock-contention.patch @@ -0,0 +1,52 @@ +From 5894422c898b34894e79fff6ff71b1516d62d4b7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Apr 2022 14:51:33 +0200 +Subject: gfs2: No short reads or writes upon glock contention + +From: Andreas Gruenbacher + +[ Upstream commit 296abc0d91d8b65d42224dd33452ace14491ad08 ] + +Commit 00bfe02f4796 ("gfs2: Fix mmap + page fault deadlocks for buffered +I/O") changed gfs2_file_read_iter() and gfs2_file_buffered_write() to +allow dropping the inode glock while faulting in user buffers. When the +lock was dropped, a short result was returned to indicate that the +operation was interrupted. + +As pointed out by Linus (see the link below), this behavior is broken +and the operations should always re-acquire the inode glock and resume +the operation instead. + +Link: https://lore.kernel.org/lkml/CAHk-=whaz-g_nOOoo8RRiWNjnv2R+h6_xk2F1J4TuSRxk1MtLw@mail.gmail.com/ +Fixes: 00bfe02f4796 ("gfs2: Fix mmap + page fault deadlocks for buffered I/O") +Signed-off-by: Andreas Gruenbacher +Signed-off-by: Sasha Levin +--- + fs/gfs2/file.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c +index 42fa4b5b81a0..eb5ea0262f3c 100644 +--- a/fs/gfs2/file.c ++++ b/fs/gfs2/file.c +@@ -998,8 +998,6 @@ static ssize_t gfs2_file_read_iter(struct kiocb *iocb, struct iov_iter *to) + if (leftover != window_size) { + if (gfs2_holder_queued(&gh)) + goto retry_under_glock; +- if (written) +- goto out_uninit; + goto retry; + } + } +@@ -1076,8 +1074,6 @@ static ssize_t gfs2_file_buffered_write(struct kiocb *iocb, + from->count = min(from->count, window_size - leftover); + if (gfs2_holder_queued(gh)) + goto retry_under_glock; +- if (read && !(iocb->ki_flags & IOCB_DIRECT)) +- goto out_uninit; + goto retry; + } + } +-- +2.35.1 + diff --git a/queue-5.15/gfs2-prevent-endless-loops-in-gfs2_file_buffered_wri.patch b/queue-5.15/gfs2-prevent-endless-loops-in-gfs2_file_buffered_wri.patch new file mode 100644 index 00000000000..28d265ddb22 --- /dev/null +++ b/queue-5.15/gfs2-prevent-endless-loops-in-gfs2_file_buffered_wri.patch @@ -0,0 +1,56 @@ +From 9c151289d848d383c292f11b45ec5756649d8892 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Nov 2021 13:57:17 +0100 +Subject: gfs2: Prevent endless loops in gfs2_file_buffered_write + +From: Andreas Gruenbacher + +[ Upstream commit 554c577cee95bdc1d03d9f457e57dc96eb791845 ] + +Currently, instead of performing a short write, +iomap_file_buffered_write will fail when part of its iov iterator cannot +be read. In contrast, gfs2_file_buffered_write will loop around if it +can read part of the iov iterator, so we can end up in an endless loop. + +This should be fixed in iomap_file_buffered_write (and also +generic_perform_write), but this comes a bit late in the 5.16 +development cycle, so work around it in the filesystem by +trimming the iov iterator to the known-good size for now. + +Signed-off-by: Andreas Gruenbacher +Signed-off-by: Sasha Levin +--- + fs/gfs2/file.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c +index 247b8d95b5ef..97e2793e22d7 100644 +--- a/fs/gfs2/file.c ++++ b/fs/gfs2/file.c +@@ -1021,6 +1021,7 @@ static ssize_t gfs2_file_buffered_write(struct kiocb *iocb, + struct gfs2_sbd *sdp = GFS2_SB(inode); + struct gfs2_holder *statfs_gh = NULL; + size_t prev_count = 0, window_size = 0; ++ size_t orig_count = iov_iter_count(from); + size_t read = 0; + ssize_t ret; + +@@ -1065,6 +1066,7 @@ static ssize_t gfs2_file_buffered_write(struct kiocb *iocb, + if (inode == sdp->sd_rindex) + gfs2_glock_dq_uninit(statfs_gh); + ++ from->count = orig_count - read; + if (should_fault_in_pages(ret, from, &prev_count, &window_size)) { + size_t leftover; + +@@ -1072,6 +1074,7 @@ static ssize_t gfs2_file_buffered_write(struct kiocb *iocb, + leftover = fault_in_iov_iter_readable(from, window_size); + gfs2_holder_disallow_demote(gh); + if (leftover != window_size) { ++ from->count = min(from->count, window_size - leftover); + if (!gfs2_holder_queued(gh)) { + if (read) + goto out_uninit; +-- +2.35.1 + diff --git a/queue-5.15/iio-imu-bmi160-disable-regulator-in-error-path.patch b/queue-5.15/iio-imu-bmi160-disable-regulator-in-error-path.patch new file mode 100644 index 00000000000..9b3423e8c18 --- /dev/null +++ b/queue-5.15/iio-imu-bmi160-disable-regulator-in-error-path.patch @@ -0,0 +1,90 @@ +From bbea6c954c1d2772aa0e86ca8b4acb5565ef4499 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 27 Mar 2022 08:40:05 -0700 +Subject: iio:imu:bmi160: disable regulator in error path + +From: Tong Zhang + +[ Upstream commit d926054d5565d3cfa2c7c3f7a48e79bcc10453ed ] + +Regulator should be disabled in error path as mentioned in _regulator_put(). +Also disable accel if gyro cannot be enabled. + +[ 16.233604] WARNING: CPU: 0 PID: 2177 at drivers/regulator/core.c:2257 _regulator_put +[ 16.240453] Call Trace: +[ 16.240572] +[ 16.240676] regulator_put+0x26/0x40 +[ 16.240853] regulator_bulk_free+0x26/0x50 +[ 16.241050] release_nodes+0x3f/0x70 +[ 16.241225] devres_release_group+0x147/0x1c0 +[ 16.241441] ? bmi160_core_probe+0x175/0x3a0 [bmi160_core] + +Fixes: 5dea3fb066f0 ("iio: imu: bmi160: added regulator support") +Reviewed-by: Andy Shevchenko +Signed-off-by: Tong Zhang +Link: https://lore.kernel.org/r/20220327154005.806049-1-ztong0001@gmail.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/imu/bmi160/bmi160_core.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +diff --git a/drivers/iio/imu/bmi160/bmi160_core.c b/drivers/iio/imu/bmi160/bmi160_core.c +index 824b5124a5f5..01336105792e 100644 +--- a/drivers/iio/imu/bmi160/bmi160_core.c ++++ b/drivers/iio/imu/bmi160/bmi160_core.c +@@ -730,7 +730,7 @@ static int bmi160_chip_init(struct bmi160_data *data, bool use_spi) + + ret = regmap_write(data->regmap, BMI160_REG_CMD, BMI160_CMD_SOFTRESET); + if (ret) +- return ret; ++ goto disable_regulator; + + usleep_range(BMI160_SOFTRESET_USLEEP, BMI160_SOFTRESET_USLEEP + 1); + +@@ -741,29 +741,37 @@ static int bmi160_chip_init(struct bmi160_data *data, bool use_spi) + if (use_spi) { + ret = regmap_read(data->regmap, BMI160_REG_DUMMY, &val); + if (ret) +- return ret; ++ goto disable_regulator; + } + + ret = regmap_read(data->regmap, BMI160_REG_CHIP_ID, &val); + if (ret) { + dev_err(dev, "Error reading chip id\n"); +- return ret; ++ goto disable_regulator; + } + if (val != BMI160_CHIP_ID_VAL) { + dev_err(dev, "Wrong chip id, got %x expected %x\n", + val, BMI160_CHIP_ID_VAL); +- return -ENODEV; ++ ret = -ENODEV; ++ goto disable_regulator; + } + + ret = bmi160_set_mode(data, BMI160_ACCEL, true); + if (ret) +- return ret; ++ goto disable_regulator; + + ret = bmi160_set_mode(data, BMI160_GYRO, true); + if (ret) +- return ret; ++ goto disable_accel; + + return 0; ++ ++disable_accel: ++ bmi160_set_mode(data, BMI160_ACCEL, false); ++ ++disable_regulator: ++ regulator_bulk_disable(ARRAY_SIZE(data->supplies), data->supplies); ++ return ret; + } + + static int bmi160_data_rdy_trigger_set_state(struct iio_trigger *trig, +-- +2.35.1 + diff --git a/queue-5.15/interconnect-qcom-sdx55-drop-ip0-interconnects.patch b/queue-5.15/interconnect-qcom-sdx55-drop-ip0-interconnects.patch new file mode 100644 index 00000000000..6800085ba6d --- /dev/null +++ b/queue-5.15/interconnect-qcom-sdx55-drop-ip0-interconnects.patch @@ -0,0 +1,97 @@ +From ed3bdb9807140ddff0346ee4af2830fe002dd5da Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Apr 2022 15:00:33 -0700 +Subject: interconnect: qcom: sdx55: Drop IP0 interconnects + +From: Stephen Boyd + +[ Upstream commit 2fb251c265608636fc961b7d38e1a03937e57371 ] + +Similar to the sc7180 commit, let's drop the IP0 interconnects here +because the IP0 resource is also used in the clk-rpmh driver on sdx55. +It's bad to have the clk framework and interconnect framework control +the same RPMh resource without any coordination. The rpmh driver in the +kernel doesn't aggregate resources between clients either, so leaving +control to clk-rpmh avoids any issues with unused interconnects turning +off IP0 behind the back of the clk framework. + +Cc: Alex Elder +Cc: Manivannan Sadhasivam +Cc: Bjorn Andersson +Cc: Taniya Das +Cc: Mike Tipton +Fixes: b2150cab9a97 ("clk: qcom: rpmh: add support for SDX55 rpmh IPA clock") +Signed-off-by: Stephen Boyd +Reviewed-by: Alex Elder +Acked-by: Manivannan Sadhasivam +Reviewed-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20220412220033.1273607-3-swboyd@chromium.org +Signed-off-by: Georgi Djakov +Signed-off-by: Sasha Levin +--- + drivers/interconnect/qcom/sdx55.c | 21 --------------------- + 1 file changed, 21 deletions(-) + +diff --git a/drivers/interconnect/qcom/sdx55.c b/drivers/interconnect/qcom/sdx55.c +index 03d604f84cc5..e3ac25a997b7 100644 +--- a/drivers/interconnect/qcom/sdx55.c ++++ b/drivers/interconnect/qcom/sdx55.c +@@ -18,7 +18,6 @@ + #include "icc-rpmh.h" + #include "sdx55.h" + +-DEFINE_QNODE(ipa_core_master, SDX55_MASTER_IPA_CORE, 1, 8, SDX55_SLAVE_IPA_CORE); + DEFINE_QNODE(llcc_mc, SDX55_MASTER_LLCC, 4, 4, SDX55_SLAVE_EBI_CH0); + DEFINE_QNODE(acm_tcu, SDX55_MASTER_TCU_0, 1, 8, SDX55_SLAVE_LLCC, SDX55_SLAVE_MEM_NOC_SNOC, SDX55_SLAVE_MEM_NOC_PCIE_SNOC); + DEFINE_QNODE(qnm_snoc_gc, SDX55_MASTER_SNOC_GC_MEM_NOC, 1, 8, SDX55_SLAVE_LLCC); +@@ -40,7 +39,6 @@ DEFINE_QNODE(xm_pcie, SDX55_MASTER_PCIE, 1, 8, SDX55_SLAVE_ANOC_SNOC); + DEFINE_QNODE(xm_qdss_etr, SDX55_MASTER_QDSS_ETR, 1, 8, SDX55_SLAVE_SNOC_CFG, SDX55_SLAVE_EMAC_CFG, SDX55_SLAVE_USB3, SDX55_SLAVE_AOSS, SDX55_SLAVE_SPMI_FETCHER, SDX55_SLAVE_QDSS_CFG, SDX55_SLAVE_PDM, SDX55_SLAVE_SNOC_MEM_NOC_GC, SDX55_SLAVE_TCSR, SDX55_SLAVE_CNOC_DDRSS, SDX55_SLAVE_SPMI_VGI_COEX, SDX55_SLAVE_QPIC, SDX55_SLAVE_OCIMEM, SDX55_SLAVE_IPA_CFG, SDX55_SLAVE_USB3_PHY_CFG, SDX55_SLAVE_AOP, SDX55_SLAVE_BLSP_1, SDX55_SLAVE_SDCC_1, SDX55_SLAVE_CNOC_MSS, SDX55_SLAVE_PCIE_PARF, SDX55_SLAVE_ECC_CFG, SDX55_SLAVE_AUDIO, SDX55_SLAVE_AOSS, SDX55_SLAVE_PRNG, SDX55_SLAVE_CRYPTO_0_CFG, SDX55_SLAVE_TCU, SDX55_SLAVE_CLK_CTL, SDX55_SLAVE_IMEM_CFG); + DEFINE_QNODE(xm_sdc1, SDX55_MASTER_SDCC_1, 1, 8, SDX55_SLAVE_AOSS, SDX55_SLAVE_IPA_CFG, SDX55_SLAVE_ANOC_SNOC, SDX55_SLAVE_AOP, SDX55_SLAVE_AUDIO); + DEFINE_QNODE(xm_usb3, SDX55_MASTER_USB3, 1, 8, SDX55_SLAVE_ANOC_SNOC); +-DEFINE_QNODE(ipa_core_slave, SDX55_SLAVE_IPA_CORE, 1, 8); + DEFINE_QNODE(ebi, SDX55_SLAVE_EBI_CH0, 1, 4); + DEFINE_QNODE(qns_llcc, SDX55_SLAVE_LLCC, 1, 16, SDX55_SLAVE_EBI_CH0); + DEFINE_QNODE(qns_memnoc_snoc, SDX55_SLAVE_MEM_NOC_SNOC, 1, 8, SDX55_MASTER_MEM_NOC_SNOC); +@@ -82,7 +80,6 @@ DEFINE_QNODE(xs_sys_tcu_cfg, SDX55_SLAVE_TCU, 1, 8); + DEFINE_QBCM(bcm_mc0, "MC0", true, &ebi); + DEFINE_QBCM(bcm_sh0, "SH0", true, &qns_llcc); + DEFINE_QBCM(bcm_ce0, "CE0", false, &qxm_crypto); +-DEFINE_QBCM(bcm_ip0, "IP0", false, &ipa_core_slave); + DEFINE_QBCM(bcm_pn0, "PN0", false, &qhm_snoc_cfg); + DEFINE_QBCM(bcm_sh3, "SH3", false, &xm_apps_rdwr); + DEFINE_QBCM(bcm_sh4, "SH4", false, &qns_memnoc_snoc, &qns_sys_pcie); +@@ -219,22 +216,6 @@ static const struct qcom_icc_desc sdx55_system_noc = { + .num_bcms = ARRAY_SIZE(system_noc_bcms), + }; + +-static struct qcom_icc_bcm *ipa_virt_bcms[] = { +- &bcm_ip0, +-}; +- +-static struct qcom_icc_node *ipa_virt_nodes[] = { +- [MASTER_IPA_CORE] = &ipa_core_master, +- [SLAVE_IPA_CORE] = &ipa_core_slave, +-}; +- +-static const struct qcom_icc_desc sdx55_ipa_virt = { +- .nodes = ipa_virt_nodes, +- .num_nodes = ARRAY_SIZE(ipa_virt_nodes), +- .bcms = ipa_virt_bcms, +- .num_bcms = ARRAY_SIZE(ipa_virt_bcms), +-}; +- + static const struct of_device_id qnoc_of_match[] = { + { .compatible = "qcom,sdx55-mc-virt", + .data = &sdx55_mc_virt}, +@@ -242,8 +223,6 @@ static const struct of_device_id qnoc_of_match[] = { + .data = &sdx55_mem_noc}, + { .compatible = "qcom,sdx55-system-noc", + .data = &sdx55_system_noc}, +- { .compatible = "qcom,sdx55-ipa-virt", +- .data = &sdx55_ipa_virt}, + { } + }; + MODULE_DEVICE_TABLE(of, qnoc_of_match); +-- +2.35.1 + diff --git a/queue-5.15/io_uring-check-reserved-fields-for-recv-recvmsg.patch b/queue-5.15/io_uring-check-reserved-fields-for-recv-recvmsg.patch new file mode 100644 index 00000000000..639c86ab5f9 --- /dev/null +++ b/queue-5.15/io_uring-check-reserved-fields-for-recv-recvmsg.patch @@ -0,0 +1,35 @@ +From 6d3e18db74b21451df5e77249bd36ba6c7b59651 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Apr 2022 19:34:57 -0600 +Subject: io_uring: check reserved fields for recv/recvmsg + +From: Jens Axboe + +[ Upstream commit 5a1e99b61b0c81388cde0c808b3e4173907df19f ] + +We should check unused fields for non-zero and -EINVAL if they are set, +making it consistent with other opcodes. + +Fixes: aa1fa28fc73e ("io_uring: add support for recvmsg()") +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + fs/io_uring.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 48c9a550e48c..7aad4bde92e9 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -5009,6 +5009,8 @@ static int io_recvmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) + + if (unlikely(req->ctx->flags & IORING_SETUP_IOPOLL)) + return -EINVAL; ++ if (unlikely(sqe->addr2 || sqe->file_index)) ++ return -EINVAL; + + sr->umsg = u64_to_user_ptr(READ_ONCE(sqe->addr)); + sr->len = READ_ONCE(sqe->len); +-- +2.35.1 + diff --git a/queue-5.15/io_uring-check-reserved-fields-for-send-sendmsg.patch b/queue-5.15/io_uring-check-reserved-fields-for-send-sendmsg.patch new file mode 100644 index 00000000000..c044a999686 --- /dev/null +++ b/queue-5.15/io_uring-check-reserved-fields-for-send-sendmsg.patch @@ -0,0 +1,35 @@ +From 36f4a9f3647afa96232303ddf6bb2040c5d75ba6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Apr 2022 19:34:11 -0600 +Subject: io_uring: check reserved fields for send/sendmsg + +From: Jens Axboe + +[ Upstream commit 588faa1ea5eecb351100ee5d187b9be99210f70d ] + +We should check unused fields for non-zero and -EINVAL if they are set, +making it consistent with other opcodes. + +Fixes: 0fa03c624d8f ("io_uring: add support for sendmsg()") +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + fs/io_uring.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 1bf1ea2cd8b0..48c9a550e48c 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -4786,6 +4786,8 @@ static int io_sendmsg_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) + + if (unlikely(req->ctx->flags & IORING_SETUP_IOPOLL)) + return -EINVAL; ++ if (unlikely(sqe->addr2 || sqe->file_index)) ++ return -EINVAL; + + sr->umsg = u64_to_user_ptr(READ_ONCE(sqe->addr)); + sr->len = READ_ONCE(sqe->len); +-- +2.35.1 + diff --git a/queue-5.15/ip6_gre-make-o_seqno-start-from-0-in-native-mode.patch b/queue-5.15/ip6_gre-make-o_seqno-start-from-0-in-native-mode.patch new file mode 100644 index 00000000000..080a9708557 --- /dev/null +++ b/queue-5.15/ip6_gre-make-o_seqno-start-from-0-in-native-mode.patch @@ -0,0 +1,70 @@ +From 871eb87b319dedca16146327526e528eab81c943 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 15:08:38 -0700 +Subject: ip6_gre: Make o_seqno start from 0 in native mode + +From: Peilin Ye + +[ Upstream commit fde98ae91f79cab4e020f40c35ed23cbdc59661c ] + +For IP6GRE and IP6GRETAP devices, currently o_seqno starts from 1 in +native mode. According to RFC 2890 2.2., "The first datagram is sent +with a sequence number of 0." Fix it. + +It is worth mentioning that o_seqno already starts from 0 in collect_md +mode, see the "if (tunnel->parms.collect_md)" clause in __gre6_xmit(), +where tunnel->o_seqno is passed to gre_build_header() before getting +incremented. + +Fixes: c12b395a4664 ("gre: Support GRE over IPv6") +Signed-off-by: Peilin Ye +Acked-by: William Tu +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv6/ip6_gre.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c +index 869c3337e319..4ccbee5e7526 100644 +--- a/net/ipv6/ip6_gre.c ++++ b/net/ipv6/ip6_gre.c +@@ -724,6 +724,7 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb, + { + struct ip6_tnl *tunnel = netdev_priv(dev); + __be16 protocol; ++ __be16 flags; + + if (dev->type == ARPHRD_ETHER) + IPCB(skb)->flags = 0; +@@ -739,7 +740,6 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb, + if (tunnel->parms.collect_md) { + struct ip_tunnel_info *tun_info; + const struct ip_tunnel_key *key; +- __be16 flags; + int tun_hlen; + + tun_info = skb_tunnel_info_txcheck(skb); +@@ -770,15 +770,14 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb, + : 0); + + } else { +- if (tunnel->parms.o_flags & TUNNEL_SEQ) +- tunnel->o_seqno++; +- + if (skb_cow_head(skb, dev->needed_headroom ?: tunnel->hlen)) + return -ENOMEM; + +- gre_build_header(skb, tunnel->tun_hlen, tunnel->parms.o_flags, ++ flags = tunnel->parms.o_flags; ++ ++ gre_build_header(skb, tunnel->tun_hlen, flags, + protocol, tunnel->parms.o_key, +- htonl(tunnel->o_seqno)); ++ (flags & TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) : 0); + } + + return ip6_tnl_xmit(skb, dev, dsfield, fl6, encap_limit, pmtu, +-- +2.35.1 + diff --git a/queue-5.15/ip_gre-ip6_gre-fix-race-condition-on-o_seqno-in-coll.patch b/queue-5.15/ip_gre-ip6_gre-fix-race-condition-on-o_seqno-in-coll.patch new file mode 100644 index 00000000000..d9b273cb44c --- /dev/null +++ b/queue-5.15/ip_gre-ip6_gre-fix-race-condition-on-o_seqno-in-coll.patch @@ -0,0 +1,152 @@ +From c4798b700953ab3b973fe881502d73fd45a4c844 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 15:09:02 -0700 +Subject: ip_gre, ip6_gre: Fix race condition on o_seqno in collect_md mode + +From: Peilin Ye + +[ Upstream commit 31c417c948d7f6909cb63f0ac3298f3c38f8ce20 ] + +As pointed out by Jakub Kicinski, currently using TUNNEL_SEQ in +collect_md mode is racy for [IP6]GRE[TAP] devices. Consider the +following sequence of events: + +1. An [IP6]GRE[TAP] device is created in collect_md mode using "ip link + add ... external". "ip" ignores "[o]seq" if "external" is specified, + so TUNNEL_SEQ is off, and the device is marked as NETIF_F_LLTX (i.e. + it uses lockless TX); +2. Someone sets TUNNEL_SEQ on outgoing skb's, using e.g. + bpf_skb_set_tunnel_key() in an eBPF program attached to this device; +3. gre_fb_xmit() or __gre6_xmit() processes these skb's: + + gre_build_header(skb, tun_hlen, + flags, protocol, + tunnel_id_to_key32(tun_info->key.tun_id), + (flags & TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) + : 0); ^^^^^^^^^^^^^^^^^ + +Since we are not using the TX lock (&txq->_xmit_lock), multiple CPUs may +try to do this tunnel->o_seqno++ in parallel, which is racy. Fix it by +making o_seqno atomic_t. + +As mentioned by Eric Dumazet in commit b790e01aee74 ("ip_gre: lockless +xmit"), making o_seqno atomic_t increases "chance for packets being out +of order at receiver" when NETIF_F_LLTX is on. + +Maybe a better fix would be: + +1. Do not ignore "oseq" in external mode. Users MUST specify "oseq" if + they want the kernel to allow sequencing of outgoing packets; +2. Reject all outgoing TUNNEL_SEQ packets if the device was not created + with "oseq". + +Unfortunately, that would break userspace. + +We could now make [IP6]GRE[TAP] devices always NETIF_F_LLTX, but let us +do it in separate patches to keep this fix minimal. + +Suggested-by: Jakub Kicinski +Fixes: 77a5196a804e ("gre: add sequence number for collect md mode.") +Signed-off-by: Peilin Ye +Acked-by: William Tu +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + include/net/ip6_tunnel.h | 2 +- + include/net/ip_tunnels.h | 2 +- + net/ipv4/ip_gre.c | 6 +++--- + net/ipv6/ip6_gre.c | 7 ++++--- + 4 files changed, 9 insertions(+), 8 deletions(-) + +diff --git a/include/net/ip6_tunnel.h b/include/net/ip6_tunnel.h +index 028eaea1c854..42d50856fcf2 100644 +--- a/include/net/ip6_tunnel.h ++++ b/include/net/ip6_tunnel.h +@@ -57,7 +57,7 @@ struct ip6_tnl { + + /* These fields used only by GRE */ + __u32 i_seqno; /* The last seen seqno */ +- __u32 o_seqno; /* The last output seqno */ ++ atomic_t o_seqno; /* The last output seqno */ + int hlen; /* tun_hlen + encap_hlen */ + int tun_hlen; /* Precalculated header length */ + int encap_hlen; /* Encap header length (FOU,GUE) */ +diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h +index bc3b13ec93c9..37d5d4968e20 100644 +--- a/include/net/ip_tunnels.h ++++ b/include/net/ip_tunnels.h +@@ -113,7 +113,7 @@ struct ip_tunnel { + + /* These four fields used only by GRE */ + u32 i_seqno; /* The last seen seqno */ +- u32 o_seqno; /* The last output seqno */ ++ atomic_t o_seqno; /* The last output seqno */ + int tun_hlen; /* Precalculated header length */ + + /* These four fields used only by ERSPAN */ +diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c +index 4b7d7ed4bab8..276a3b7b0e9c 100644 +--- a/net/ipv4/ip_gre.c ++++ b/net/ipv4/ip_gre.c +@@ -464,7 +464,7 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev, + /* Push GRE header. */ + gre_build_header(skb, tunnel->tun_hlen, + flags, proto, tunnel->parms.o_key, +- (flags & TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) : 0); ++ (flags & TUNNEL_SEQ) ? htonl(atomic_fetch_inc(&tunnel->o_seqno)) : 0); + + ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol); + } +@@ -502,7 +502,7 @@ static void gre_fb_xmit(struct sk_buff *skb, struct net_device *dev, + (TUNNEL_CSUM | TUNNEL_KEY | TUNNEL_SEQ); + gre_build_header(skb, tunnel_hlen, flags, proto, + tunnel_id_to_key32(tun_info->key.tun_id), +- (flags & TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) : 0); ++ (flags & TUNNEL_SEQ) ? htonl(atomic_fetch_inc(&tunnel->o_seqno)) : 0); + + ip_md_tunnel_xmit(skb, dev, IPPROTO_GRE, tunnel_hlen); + +@@ -579,7 +579,7 @@ static void erspan_fb_xmit(struct sk_buff *skb, struct net_device *dev) + } + + gre_build_header(skb, 8, TUNNEL_SEQ, +- proto, 0, htonl(tunnel->o_seqno++)); ++ proto, 0, htonl(atomic_fetch_inc(&tunnel->o_seqno))); + + ip_md_tunnel_xmit(skb, dev, IPPROTO_GRE, tunnel_hlen); + +diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c +index 4ccbee5e7526..a817ac6d9759 100644 +--- a/net/ipv6/ip6_gre.c ++++ b/net/ipv6/ip6_gre.c +@@ -766,7 +766,7 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb, + gre_build_header(skb, tun_hlen, + flags, protocol, + tunnel_id_to_key32(tun_info->key.tun_id), +- (flags & TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) ++ (flags & TUNNEL_SEQ) ? htonl(atomic_fetch_inc(&tunnel->o_seqno)) + : 0); + + } else { +@@ -777,7 +777,8 @@ static netdev_tx_t __gre6_xmit(struct sk_buff *skb, + + gre_build_header(skb, tunnel->tun_hlen, flags, + protocol, tunnel->parms.o_key, +- (flags & TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) : 0); ++ (flags & TUNNEL_SEQ) ? htonl(atomic_fetch_inc(&tunnel->o_seqno)) ++ : 0); + } + + return ip6_tnl_xmit(skb, dev, dsfield, fl6, encap_limit, pmtu, +@@ -1055,7 +1056,7 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb, + /* Push GRE header. */ + proto = (t->parms.erspan_ver == 1) ? htons(ETH_P_ERSPAN) + : htons(ETH_P_ERSPAN2); +- gre_build_header(skb, 8, TUNNEL_SEQ, proto, 0, htonl(t->o_seqno++)); ++ gre_build_header(skb, 8, TUNNEL_SEQ, proto, 0, htonl(atomic_fetch_inc(&t->o_seqno))); + + /* TooBig packet may have updated dst->dev's mtu */ + if (!t->parms.collect_md && dst && dst_mtu(dst) > dst->dev->mtu) +-- +2.35.1 + diff --git a/queue-5.15/ip_gre-make-o_seqno-start-from-0-in-native-mode.patch b/queue-5.15/ip_gre-make-o_seqno-start-from-0-in-native-mode.patch new file mode 100644 index 00000000000..31358df5b02 --- /dev/null +++ b/queue-5.15/ip_gre-make-o_seqno-start-from-0-in-native-mode.patch @@ -0,0 +1,51 @@ +From 6aaa71b532690cd4facbaddf273e379b550617e5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 15:07:57 -0700 +Subject: ip_gre: Make o_seqno start from 0 in native mode + +From: Peilin Ye + +[ Upstream commit ff827beb706ed719c766acf36449801ded0c17fc ] + +For GRE and GRETAP devices, currently o_seqno starts from 1 in native +mode. According to RFC 2890 2.2., "The first datagram is sent with a +sequence number of 0." Fix it. + +It is worth mentioning that o_seqno already starts from 0 in collect_md +mode, see gre_fb_xmit(), where tunnel->o_seqno is passed to +gre_build_header() before getting incremented. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Signed-off-by: Peilin Ye +Acked-by: William Tu +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/ip_gre.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c +index e7f3e37e4aa8..4b7d7ed4bab8 100644 +--- a/net/ipv4/ip_gre.c ++++ b/net/ipv4/ip_gre.c +@@ -459,14 +459,12 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev, + __be16 proto) + { + struct ip_tunnel *tunnel = netdev_priv(dev); +- +- if (tunnel->parms.o_flags & TUNNEL_SEQ) +- tunnel->o_seqno++; ++ __be16 flags = tunnel->parms.o_flags; + + /* Push GRE header. */ + gre_build_header(skb, tunnel->tun_hlen, +- tunnel->parms.o_flags, proto, tunnel->parms.o_key, +- htonl(tunnel->o_seqno)); ++ flags, proto, tunnel->parms.o_key, ++ (flags & TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) : 0); + + ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol); + } +-- +2.35.1 + diff --git a/queue-5.15/ipvs-correctly-print-the-memory-size-of-ip_vs_conn_t.patch b/queue-5.15/ipvs-correctly-print-the-memory-size-of-ip_vs_conn_t.patch new file mode 100644 index 00000000000..e7ee4afbca0 --- /dev/null +++ b/queue-5.15/ipvs-correctly-print-the-memory-size-of-ip_vs_conn_t.patch @@ -0,0 +1,38 @@ +From ae304fa78d8807ab71e4528db9c66a14a522659b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Apr 2022 19:05:45 +0800 +Subject: ipvs: correctly print the memory size of ip_vs_conn_tab + +From: Pengcheng Yang + +[ Upstream commit eba1a872cb73314280d5448d934935b23e30b7ca ] + +The memory size of ip_vs_conn_tab changed after we use hlist +instead of list. + +Fixes: 731109e78415 ("ipvs: use hlist instead of list") +Signed-off-by: Pengcheng Yang +Acked-by: Julian Anastasov +Acked-by: Simon Horman +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/ipvs/ip_vs_conn.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c +index 2c467c422dc6..fb67f1ca2495 100644 +--- a/net/netfilter/ipvs/ip_vs_conn.c ++++ b/net/netfilter/ipvs/ip_vs_conn.c +@@ -1495,7 +1495,7 @@ int __init ip_vs_conn_init(void) + pr_info("Connection hash table configured " + "(size=%d, memory=%ldKbytes)\n", + ip_vs_conn_tab_size, +- (long)(ip_vs_conn_tab_size*sizeof(struct list_head))/1024); ++ (long)(ip_vs_conn_tab_size*sizeof(*ip_vs_conn_tab))/1024); + IP_VS_DBG(0, "Each connection entry needs %zd bytes at least\n", + sizeof(struct ip_vs_conn)); + +-- +2.35.1 + diff --git a/queue-5.15/ixgbe-ensure-ipsec-vf-pf-compatibility.patch b/queue-5.15/ixgbe-ensure-ipsec-vf-pf-compatibility.patch new file mode 100644 index 00000000000..1e57877b69a --- /dev/null +++ b/queue-5.15/ixgbe-ensure-ipsec-vf-pf-compatibility.patch @@ -0,0 +1,45 @@ +From 146dc3ad9f3c38be52bbc9da99c3a827f4fc2deb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Apr 2022 10:31:52 -0700 +Subject: ixgbe: ensure IPsec VF<->PF compatibility + +From: Leon Romanovsky + +[ Upstream commit f049efc7f7cd2f3c419f55040928eaefb13b3636 ] + +The VF driver can forward any IPsec flags and such makes the function +is not extendable and prone to backward/forward incompatibility. + +If new software runs on VF, it won't know that PF configured something +completely different as it "knows" only XFRM_OFFLOAD_INBOUND flag. + +Fixes: eda0333ac293 ("ixgbe: add VF IPsec management") +Reviewed-by: Raed Salem +Signed-off-by: Leon Romanovsky +Reviewed-by: Shannon Nelson +Tested-by: Konrad Jankowski +Signed-off-by: Tony Nguyen +Link: https://lore.kernel.org/r/20220427173152.443102-1-anthony.l.nguyen@intel.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c +index e596e1a9fc75..69d11ff7677d 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c +@@ -903,7 +903,8 @@ int ixgbe_ipsec_vf_add_sa(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf) + /* Tx IPsec offload doesn't seem to work on this + * device, so block these requests for now. + */ +- if (!(sam->flags & XFRM_OFFLOAD_INBOUND)) { ++ sam->flags = sam->flags & ~XFRM_OFFLOAD_IPV6; ++ if (sam->flags != XFRM_OFFLOAD_INBOUND) { + err = -EOPNOTSUPP; + goto err_out; + } +-- +2.35.1 + diff --git a/queue-5.15/ksmbd-increment-reference-count-of-parent-fp.patch b/queue-5.15/ksmbd-increment-reference-count-of-parent-fp.patch new file mode 100644 index 00000000000..cc6bb6599e4 --- /dev/null +++ b/queue-5.15/ksmbd-increment-reference-count-of-parent-fp.patch @@ -0,0 +1,51 @@ +From 40077541c62b3985f7b7e83792f7553b7707b923 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Apr 2022 12:04:43 +0900 +Subject: ksmbd: increment reference count of parent fp + +From: Namjae Jeon + +[ Upstream commit 8510a043d334ecdf83d4604782f288db6bf21d60 ] + +Add missing increment reference count of parent fp in +ksmbd_lookup_fd_inode(). + +Signed-off-by: Namjae Jeon +Reviewed-by: Hyunchul Lee +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/ksmbd/smb2pdu.c | 2 ++ + fs/ksmbd/vfs_cache.c | 1 + + 2 files changed, 3 insertions(+) + +diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c +index 192d8308afc2..a9fdb47c2791 100644 +--- a/fs/ksmbd/smb2pdu.c ++++ b/fs/ksmbd/smb2pdu.c +@@ -5768,8 +5768,10 @@ static int set_rename_info(struct ksmbd_work *work, struct ksmbd_file *fp, + if (parent_fp) { + if (parent_fp->daccess & FILE_DELETE_LE) { + pr_err("parent dir is opened with delete access\n"); ++ ksmbd_fd_put(work, parent_fp); + return -ESHARE; + } ++ ksmbd_fd_put(work, parent_fp); + } + next: + return smb2_rename(work, fp, user_ns, rename_info, +diff --git a/fs/ksmbd/vfs_cache.c b/fs/ksmbd/vfs_cache.c +index 29c1db66bd0f..8b873d92d785 100644 +--- a/fs/ksmbd/vfs_cache.c ++++ b/fs/ksmbd/vfs_cache.c +@@ -497,6 +497,7 @@ struct ksmbd_file *ksmbd_lookup_fd_inode(struct inode *inode) + list_for_each_entry(lfp, &ci->m_fp_list, node) { + if (inode == file_inode(lfp->filp)) { + atomic_dec(&ci->m_count); ++ lfp = ksmbd_fp_get(lfp); + read_unlock(&ci->m_lock); + return lfp; + } +-- +2.35.1 + diff --git a/queue-5.15/ksmbd-set-fixed-sector-size-to-fs_sector_size_inform.patch b/queue-5.15/ksmbd-set-fixed-sector-size-to-fs_sector_size_inform.patch new file mode 100644 index 00000000000..82044cf021e --- /dev/null +++ b/queue-5.15/ksmbd-set-fixed-sector-size-to-fs_sector_size_inform.patch @@ -0,0 +1,66 @@ +From 5b570398c7aaf92df1a9589f95760b3ea48971c5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Apr 2022 10:01:36 +0900 +Subject: ksmbd: set fixed sector size to FS_SECTOR_SIZE_INFORMATION + +From: Namjae Jeon + +[ Upstream commit 02655a70b7cc0f534531ee65fa72692f4d31a944 ] + +Currently ksmbd is using ->f_bsize from vfs_statfs() as sector size. +If fat/exfat is a local share, ->f_bsize is a cluster size that is too +large to be used as a sector size. Sector sizes larger than 4K cause +problem occurs when mounting an iso file through windows client. + +The error message can be obtained using Mount-DiskImage command, + the error is: +"Mount-DiskImage : The sector size of the physical disk on which the +virtual disk resides is not supported." + +This patch reports fixed 4KB sector size if ->s_blocksize is bigger +than 4KB. + +Signed-off-by: Namjae Jeon +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/ksmbd/smb2pdu.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c +index a9fdb47c2791..1ed3046dd5b3 100644 +--- a/fs/ksmbd/smb2pdu.c ++++ b/fs/ksmbd/smb2pdu.c +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + + #include "glob.h" + #include "smb2pdu.h" +@@ -4997,15 +4998,17 @@ static int smb2_get_info_filesystem(struct ksmbd_work *work, + case FS_SECTOR_SIZE_INFORMATION: + { + struct smb3_fs_ss_info *info; ++ unsigned int sector_size = ++ min_t(unsigned int, path.mnt->mnt_sb->s_blocksize, 4096); + + info = (struct smb3_fs_ss_info *)(rsp->Buffer); + +- info->LogicalBytesPerSector = cpu_to_le32(stfs.f_bsize); ++ info->LogicalBytesPerSector = cpu_to_le32(sector_size); + info->PhysicalBytesPerSectorForAtomicity = +- cpu_to_le32(stfs.f_bsize); +- info->PhysicalBytesPerSectorForPerf = cpu_to_le32(stfs.f_bsize); ++ cpu_to_le32(sector_size); ++ info->PhysicalBytesPerSectorForPerf = cpu_to_le32(sector_size); + info->FSEffPhysicalBytesPerSectorForAtomicity = +- cpu_to_le32(stfs.f_bsize); ++ cpu_to_le32(sector_size); + info->Flags = cpu_to_le32(SSINFO_FLAGS_ALIGNED_DEVICE | + SSINFO_FLAGS_PARTITION_ALIGNED_ON_DEVICE); + info->ByteOffsetForSectorAlignment = 0; +-- +2.35.1 + diff --git a/queue-5.15/memory-renesas-rpc-if-fix-hf-ospi-data-transfer-in-m.patch b/queue-5.15/memory-renesas-rpc-if-fix-hf-ospi-data-transfer-in-m.patch new file mode 100644 index 00000000000..f867388a1d3 --- /dev/null +++ b/queue-5.15/memory-renesas-rpc-if-fix-hf-ospi-data-transfer-in-m.patch @@ -0,0 +1,169 @@ +From 869c3895abb5ec33436afdd5b38342dce39e155b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Apr 2022 09:05:26 +0200 +Subject: memory: renesas-rpc-if: Fix HF/OSPI data transfer in Manual Mode + +From: Geert Uytterhoeven + +[ Upstream commit 7e842d70fe599bc13594b650b2144c4b6e6d6bf1 ] + +HyperFlash devices fail to probe: + + rpc-if-hyperflash rpc-if-hyperflash: probing of hyperbus device failed + +In HyperFlash or Octal-SPI Flash mode, the Transfer Data Enable bits +(SPIDE) in the Manual Mode Enable Setting Register (SMENR) are derived +from half of the transfer size, cfr. the rpcif_bits_set() helper +function. However, rpcif_reg_{read,write}() does not take the bus size +into account, and does not double all Manual Mode Data Register access +sizes when communicating with a HyperFlash or Octal-SPI Flash device. + +Fix this, and avoid the back-and-forth conversion between transfer size +and Transfer Data Enable bits, by explicitly storing the transfer size +in struct rpcif, and using that value to determine access size in +rpcif_reg_{read,write}(). + +Enforce that the "high" Manual Mode Read/Write Data Registers +(SM[RW]DR1) are only used for 8-byte data accesses. +While at it, forbid writing to the Manual Mode Read Data Registers, +as they are read-only. + +Fixes: fff53a551db50f5e ("memory: renesas-rpc-if: Correct QSPI data transfer in Manual mode") +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Krzysztof Kozlowski +Tested-by: Lad Prabhakar +Tested-by: Wolfram Sang +Reviewed-by: Wolfram Sang +Link: https://lore.kernel.org/r/cde9bfacf704c81865f57b15d1b48a4793da4286.1649681476.git.geert+renesas@glider.be +Link: https://lore.kernel.org/r/20220420070526.9367-1-krzysztof.kozlowski@linaro.org' +Signed-off-by: Arnd Bergmann +Signed-off-by: Sasha Levin +--- + drivers/memory/renesas-rpc-if.c | 60 +++++++++++++++++++++++++-------- + include/memory/renesas-rpc-if.h | 1 + + 2 files changed, 47 insertions(+), 14 deletions(-) + +diff --git a/drivers/memory/renesas-rpc-if.c b/drivers/memory/renesas-rpc-if.c +index 2a4c1f94bfa0..3a416705f61c 100644 +--- a/drivers/memory/renesas-rpc-if.c ++++ b/drivers/memory/renesas-rpc-if.c +@@ -162,25 +162,39 @@ static const struct regmap_access_table rpcif_volatile_table = { + + + /* +- * Custom accessor functions to ensure SMRDR0 and SMWDR0 are always accessed +- * with proper width. Requires SMENR_SPIDE to be correctly set before! ++ * Custom accessor functions to ensure SM[RW]DR[01] are always accessed with ++ * proper width. Requires rpcif.xfer_size to be correctly set before! + */ + static int rpcif_reg_read(void *context, unsigned int reg, unsigned int *val) + { + struct rpcif *rpc = context; + +- if (reg == RPCIF_SMRDR0 || reg == RPCIF_SMWDR0) { +- u32 spide = readl(rpc->base + RPCIF_SMENR) & RPCIF_SMENR_SPIDE(0xF); +- +- if (spide == 0x8) { ++ switch (reg) { ++ case RPCIF_SMRDR0: ++ case RPCIF_SMWDR0: ++ switch (rpc->xfer_size) { ++ case 1: + *val = readb(rpc->base + reg); + return 0; +- } else if (spide == 0xC) { ++ ++ case 2: + *val = readw(rpc->base + reg); + return 0; +- } else if (spide != 0xF) { ++ ++ case 4: ++ case 8: ++ *val = readl(rpc->base + reg); ++ return 0; ++ ++ default: + return -EILSEQ; + } ++ ++ case RPCIF_SMRDR1: ++ case RPCIF_SMWDR1: ++ if (rpc->xfer_size != 8) ++ return -EILSEQ; ++ break; + } + + *val = readl(rpc->base + reg); +@@ -192,18 +206,34 @@ static int rpcif_reg_write(void *context, unsigned int reg, unsigned int val) + { + struct rpcif *rpc = context; + +- if (reg == RPCIF_SMRDR0 || reg == RPCIF_SMWDR0) { +- u32 spide = readl(rpc->base + RPCIF_SMENR) & RPCIF_SMENR_SPIDE(0xF); +- +- if (spide == 0x8) { ++ switch (reg) { ++ case RPCIF_SMWDR0: ++ switch (rpc->xfer_size) { ++ case 1: + writeb(val, rpc->base + reg); + return 0; +- } else if (spide == 0xC) { ++ ++ case 2: + writew(val, rpc->base + reg); + return 0; +- } else if (spide != 0xF) { ++ ++ case 4: ++ case 8: ++ writel(val, rpc->base + reg); ++ return 0; ++ ++ default: + return -EILSEQ; + } ++ ++ case RPCIF_SMWDR1: ++ if (rpc->xfer_size != 8) ++ return -EILSEQ; ++ break; ++ ++ case RPCIF_SMRDR0: ++ case RPCIF_SMRDR1: ++ return -EPERM; + } + + writel(val, rpc->base + reg); +@@ -442,6 +472,7 @@ int rpcif_manual_xfer(struct rpcif *rpc) + + smenr |= RPCIF_SMENR_SPIDE(rpcif_bits_set(rpc, nbytes)); + regmap_write(rpc->regmap, RPCIF_SMENR, smenr); ++ rpc->xfer_size = nbytes; + + memcpy(data, rpc->buffer + pos, nbytes); + if (nbytes == 8) { +@@ -506,6 +537,7 @@ int rpcif_manual_xfer(struct rpcif *rpc) + regmap_write(rpc->regmap, RPCIF_SMENR, smenr); + regmap_write(rpc->regmap, RPCIF_SMCR, + rpc->smcr | RPCIF_SMCR_SPIE); ++ rpc->xfer_size = nbytes; + ret = wait_msg_xfer_end(rpc); + if (ret) + goto err_out; +diff --git a/include/memory/renesas-rpc-if.h b/include/memory/renesas-rpc-if.h +index 77c694a19149..15dd0076c293 100644 +--- a/include/memory/renesas-rpc-if.h ++++ b/include/memory/renesas-rpc-if.h +@@ -66,6 +66,7 @@ struct rpcif { + size_t size; + enum rpcif_data_dir dir; + u8 bus_size; ++ u8 xfer_size; + void *buffer; + u32 xferlen; + u32 smcr; +-- +2.35.1 + diff --git a/queue-5.15/mtd-fix-part-field-data-corruption-in-mtd_info.patch b/queue-5.15/mtd-fix-part-field-data-corruption-in-mtd_info.patch new file mode 100644 index 00000000000..caf13f6cb78 --- /dev/null +++ b/queue-5.15/mtd-fix-part-field-data-corruption-in-mtd_info.patch @@ -0,0 +1,48 @@ +From d141a34b5ba5bc4297c45f9c05a58b130fa550e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 17 Apr 2022 11:46:47 -0700 +Subject: mtd: fix 'part' field data corruption in mtd_info + +From: Oleksandr Ocheretnyi + +[ Upstream commit 37c5f9e80e015d0df17d0c377c18523002986851 ] + +Commit 46b5889cc2c5 ("mtd: implement proper partition handling") +started using "mtd_get_master_ofs()" in mtd callbacks to determine +memory offsets by means of 'part' field from mtd_info, what previously +was smashed accessing 'master' field in the mtd_set_dev_defaults() method. +That provides wrong offset what causes hardware access errors. + +Just make 'part', 'master' as separate fields, rather than using +union type to avoid 'part' data corruption when mtd_set_dev_defaults() +is called. + +Fixes: 46b5889cc2c5 ("mtd: implement proper partition handling") +Signed-off-by: Oleksandr Ocheretnyi +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220417184649.449289-1-oocheret@cisco.com +Signed-off-by: Sasha Levin +--- + include/linux/mtd/mtd.h | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h +index 88227044fc86..8a2c60235ebb 100644 +--- a/include/linux/mtd/mtd.h ++++ b/include/linux/mtd/mtd.h +@@ -394,10 +394,8 @@ struct mtd_info { + /* List of partitions attached to this MTD device */ + struct list_head partitions; + +- union { +- struct mtd_part part; +- struct mtd_master master; +- }; ++ struct mtd_part part; ++ struct mtd_master master; + }; + + static inline struct mtd_info *mtd_get_master(struct mtd_info *mtd) +-- +2.35.1 + diff --git a/queue-5.15/mtd-rawnand-fix-ecc-parameters-for-mt7622.patch b/queue-5.15/mtd-rawnand-fix-ecc-parameters-for-mt7622.patch new file mode 100644 index 00000000000..fb1d6bc3999 --- /dev/null +++ b/queue-5.15/mtd-rawnand-fix-ecc-parameters-for-mt7622.patch @@ -0,0 +1,99 @@ +From d491a41e5ab5794cb9e77ff647df739a7b33776d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 3 Apr 2022 00:03:13 +0800 +Subject: mtd: rawnand: fix ecc parameters for mt7622 + +From: Chuanhong Guo + +[ Upstream commit 9fe4e0d3cbfe90152137963cc024ecb63db6e8e6 ] + +According to the datasheet, mt7622 only has 5 ECC capabilities instead +of 7, and the decoding error register is arranged as follows: ++------+---------+---------+---------+---------+ +| Bits | 19:15 | 14:10 | 9:5 | 4:0 | ++------+---------+---------+---------+---------+ +| Name | ERRNUM3 | ERRNUM2 | ERRNUM1 | ERRNUM0 | ++------+---------+---------+---------+---------+ +This means err_mask should be 0x1f instead of 0x3f and the number of +bits shifted in mtk_ecc_get_stats should be 5 instead of 8. + +This commit introduces err_shift for the difference in this register +and fix other existing parameters. + +Public MT7622 reference manual can be found on [0] and the info this +commit is based on is from page 656 and page 660. + +[0]: https://wiki.banana-pi.org/Banana_Pi_BPI-R64#Documents + +Fixes: 98dea8d71931 ("mtd: nand: mtk: Support MT7622 NAND flash controller.") +Signed-off-by: Chuanhong Guo +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220402160315.919094-1-gch981213@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/mtk_ecc.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/drivers/mtd/nand/raw/mtk_ecc.c b/drivers/mtd/nand/raw/mtk_ecc.c +index c437d97debb8..ec9d1fb07006 100644 +--- a/drivers/mtd/nand/raw/mtk_ecc.c ++++ b/drivers/mtd/nand/raw/mtk_ecc.c +@@ -43,6 +43,7 @@ + + struct mtk_ecc_caps { + u32 err_mask; ++ u32 err_shift; + const u8 *ecc_strength; + const u32 *ecc_regs; + u8 num_ecc_strength; +@@ -76,7 +77,7 @@ static const u8 ecc_strength_mt2712[] = { + }; + + static const u8 ecc_strength_mt7622[] = { +- 4, 6, 8, 10, 12, 14, 16 ++ 4, 6, 8, 10, 12 + }; + + enum mtk_ecc_regs { +@@ -221,7 +222,7 @@ void mtk_ecc_get_stats(struct mtk_ecc *ecc, struct mtk_ecc_stats *stats, + for (i = 0; i < sectors; i++) { + offset = (i >> 2) << 2; + err = readl(ecc->regs + ECC_DECENUM0 + offset); +- err = err >> ((i % 4) * 8); ++ err = err >> ((i % 4) * ecc->caps->err_shift); + err &= ecc->caps->err_mask; + if (err == ecc->caps->err_mask) { + /* uncorrectable errors */ +@@ -449,6 +450,7 @@ EXPORT_SYMBOL(mtk_ecc_get_parity_bits); + + static const struct mtk_ecc_caps mtk_ecc_caps_mt2701 = { + .err_mask = 0x3f, ++ .err_shift = 8, + .ecc_strength = ecc_strength_mt2701, + .ecc_regs = mt2701_ecc_regs, + .num_ecc_strength = 20, +@@ -459,6 +461,7 @@ static const struct mtk_ecc_caps mtk_ecc_caps_mt2701 = { + + static const struct mtk_ecc_caps mtk_ecc_caps_mt2712 = { + .err_mask = 0x7f, ++ .err_shift = 8, + .ecc_strength = ecc_strength_mt2712, + .ecc_regs = mt2712_ecc_regs, + .num_ecc_strength = 23, +@@ -468,10 +471,11 @@ static const struct mtk_ecc_caps mtk_ecc_caps_mt2712 = { + }; + + static const struct mtk_ecc_caps mtk_ecc_caps_mt7622 = { +- .err_mask = 0x3f, ++ .err_mask = 0x1f, ++ .err_shift = 5, + .ecc_strength = ecc_strength_mt7622, + .ecc_regs = mt7622_ecc_regs, +- .num_ecc_strength = 7, ++ .num_ecc_strength = 5, + .ecc_mode_shift = 4, + .parity_bits = 13, + .pg_irq_sel = 0, +-- +2.35.1 + diff --git a/queue-5.15/mtd-rawnand-fix-return-value-check-of-wait_for_compl.patch b/queue-5.15/mtd-rawnand-fix-return-value-check-of-wait_for_compl.patch new file mode 100644 index 00000000000..83246a6b289 --- /dev/null +++ b/queue-5.15/mtd-rawnand-fix-return-value-check-of-wait_for_compl.patch @@ -0,0 +1,84 @@ +From d207b0eca732dd814a694a851c9fa1f1a3a53853 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Apr 2022 08:34:31 +0000 +Subject: mtd: rawnand: Fix return value check of wait_for_completion_timeout + +From: Miaoqian Lin + +[ Upstream commit 084c16ab423a8890121b902b405823bfec5b4365 ] + +wait_for_completion_timeout() returns unsigned long not int. +It returns 0 if timed out, and positive if completed. +The check for <= 0 is ambiguous and should be == 0 here +indicating timeout which is the only error case. + +Fixes: 83738d87e3a0 ("mtd: sh_flctl: Add DMA capabilty") +Signed-off-by: Miaoqian Lin +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20220412083435.29254-1-linmq006@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/mtd/nand/raw/sh_flctl.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +diff --git a/drivers/mtd/nand/raw/sh_flctl.c b/drivers/mtd/nand/raw/sh_flctl.c +index 13df4bdf792a..8f89e2d3d817 100644 +--- a/drivers/mtd/nand/raw/sh_flctl.c ++++ b/drivers/mtd/nand/raw/sh_flctl.c +@@ -384,7 +384,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, + dma_addr_t dma_addr; + dma_cookie_t cookie; + uint32_t reg; +- int ret; ++ int ret = 0; ++ unsigned long time_left; + + if (dir == DMA_FROM_DEVICE) { + chan = flctl->chan_fifo0_rx; +@@ -425,13 +426,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, + goto out; + } + +- ret = ++ time_left = + wait_for_completion_timeout(&flctl->dma_complete, + msecs_to_jiffies(3000)); + +- if (ret <= 0) { ++ if (time_left == 0) { + dmaengine_terminate_all(chan); + dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n"); ++ ret = -ETIMEDOUT; + } + + out: +@@ -441,7 +443,7 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl *flctl, unsigned long *buf, + + dma_unmap_single(chan->device->dev, dma_addr, len, dir); + +- /* ret > 0 is success */ ++ /* ret == 0 is success */ + return ret; + } + +@@ -465,7 +467,7 @@ static void read_fiforeg(struct sh_flctl *flctl, int rlen, int offset) + + /* initiate DMA transfer */ + if (flctl->chan_fifo0_rx && rlen >= 32 && +- flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_FROM_DEVICE) > 0) ++ !flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_FROM_DEVICE)) + goto convert; /* DMA success */ + + /* do polling transfer */ +@@ -524,7 +526,7 @@ static void write_ec_fiforeg(struct sh_flctl *flctl, int rlen, + + /* initiate DMA transfer */ + if (flctl->chan_fifo0_tx && rlen >= 32 && +- flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_TO_DEVICE) > 0) ++ !flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_TO_DEVICE)) + return; /* DMA success */ + + /* do polling transfer */ +-- +2.35.1 + diff --git a/queue-5.15/net-bcmgenet-hide-status-block-before-tx-timestampin.patch b/queue-5.15/net-bcmgenet-hide-status-block-before-tx-timestampin.patch new file mode 100644 index 00000000000..078b2e13b53 --- /dev/null +++ b/queue-5.15/net-bcmgenet-hide-status-block-before-tx-timestampin.patch @@ -0,0 +1,61 @@ +From 2c4527e0b587998bca694ddbcbcd2eca4c1e376b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Apr 2022 09:53:07 -0700 +Subject: net: bcmgenet: hide status block before TX timestamping + +From: Jonathan Lemon + +[ Upstream commit acac0541d1d65e81e599ec399d34d184d2424401 ] + +The hardware checksum offloading requires use of a transmit +status block inserted before the outgoing frame data, this was +updated in '9a9ba2a4aaaa ("net: bcmgenet: always enable status blocks")' + +However, skb_tx_timestamp() assumes that it is passed a raw frame +and PTP parsing chokes on this status block. + +Fix this by calling __skb_pull(), which hides the TSB before calling +skb_tx_timestamp(), so an outgoing PTP packet is parsed correctly. + +As the data in the skb has already been set up for DMA, and the +dma_unmap_* calls use a separately stored address, there is no +no effective change in the data transmission. + +Signed-off-by: Jonathan Lemon +Acked-by: Florian Fainelli +Link: https://lore.kernel.org/r/20220424165307.591145-1-jonathan.lemon@gmail.com +Fixes: d03825fba459 ("net: bcmgenet: add skb_tx_timestamp call") +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/broadcom/genet/bcmgenet.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c +index b4f99dd284e5..8bcc39b1575c 100644 +--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c ++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c +@@ -1991,6 +1991,11 @@ static struct sk_buff *bcmgenet_add_tsb(struct net_device *dev, + return skb; + } + ++static void bcmgenet_hide_tsb(struct sk_buff *skb) ++{ ++ __skb_pull(skb, sizeof(struct status_64)); ++} ++ + static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) + { + struct bcmgenet_priv *priv = netdev_priv(dev); +@@ -2097,6 +2102,8 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) + } + + GENET_CB(skb)->last_cb = tx_cb_ptr; ++ ++ bcmgenet_hide_tsb(skb); + skb_tx_timestamp(skb); + + /* Decrement total BD count and advance our write pointer */ +-- +2.35.1 + diff --git a/queue-5.15/net-dsa-add-missing-of_node_put-in-dsa_port_link_reg.patch b/queue-5.15/net-dsa-add-missing-of_node_put-in-dsa_port_link_reg.patch new file mode 100644 index 00000000000..d146d33f9cc --- /dev/null +++ b/queue-5.15/net-dsa-add-missing-of_node_put-in-dsa_port_link_reg.patch @@ -0,0 +1,39 @@ +From 5a935fcf37af616812a1bb7f0c15b736489a2cce Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Apr 2022 19:04:08 +0800 +Subject: net: dsa: Add missing of_node_put() in dsa_port_link_register_of + +From: Miaoqian Lin + +[ Upstream commit fc06b2867f4cea543505acfb194c2be4ebf0c7d3 ] + +The device_node pointer is returned by of_parse_phandle() with refcount +incremented. We should use of_node_put() on it when done. +of_node_put() will check for NULL value. + +Fixes: a20f997010c4 ("net: dsa: Don't instantiate phylink for CPU/DSA ports unless needed") +Signed-off-by: Miaoqian Lin +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/dsa/port.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/net/dsa/port.c b/net/dsa/port.c +index 616330a16d31..63e88de96393 100644 +--- a/net/dsa/port.c ++++ b/net/dsa/port.c +@@ -1201,8 +1201,10 @@ int dsa_port_link_register_of(struct dsa_port *dp) + if (ds->ops->phylink_mac_link_down) + ds->ops->phylink_mac_link_down(ds, port, + MLO_AN_FIXED, PHY_INTERFACE_MODE_NA); ++ of_node_put(phy_np); + return dsa_port_phylink_register(dp); + } ++ of_node_put(phy_np); + return 0; + } + +-- +2.35.1 + diff --git a/queue-5.15/net-dsa-lantiq_gswip-don-t-set-gswip_mii_cfg_rmii_cl.patch b/queue-5.15/net-dsa-lantiq_gswip-don-t-set-gswip_mii_cfg_rmii_cl.patch new file mode 100644 index 00000000000..725d0c1f0fb --- /dev/null +++ b/queue-5.15/net-dsa-lantiq_gswip-don-t-set-gswip_mii_cfg_rmii_cl.patch @@ -0,0 +1,60 @@ +From 9b623fae2b909f3443180778b8a15bcca4d9eec3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Apr 2022 17:20:27 +0200 +Subject: net: dsa: lantiq_gswip: Don't set GSWIP_MII_CFG_RMII_CLK + +From: Martin Blumenstingl + +[ Upstream commit 71cffebf6358a7f5031f5b208bbdc1cb4db6e539 ] + +Commit 4b5923249b8fa4 ("net: dsa: lantiq_gswip: Configure all remaining +GSWIP_MII_CFG bits") added all known bits in the GSWIP_MII_CFGp +register. It helped bring this register into a well-defined state so the +driver has to rely less on the bootloader to do things right. +Unfortunately it also sets the GSWIP_MII_CFG_RMII_CLK bit without any +possibility to configure it. Upon further testing it turns out that all +boards which are supported by the GSWIP driver in OpenWrt which use an +RMII PHY have a dedicated oscillator on the board which provides the +50MHz RMII reference clock. + +Don't set the GSWIP_MII_CFG_RMII_CLK bit (but keep the code which always +clears it) to fix support for the Fritz!Box 7362 SL in OpenWrt. This is +a board with two Atheros AR8030 RMII PHYs. With the "RMII clock" bit set +the MAC also generates the RMII reference clock whose signal then +conflicts with the signal from the oscillator on the board. This results +in a constant cycle of the PHY detecting link up/down (and as a result +of that: the two ports using the AR8030 PHYs are not working). + +At the time of writing this patch there's no known board where the MAC +(GSWIP) has to generate the RMII reference clock. If needed this can be +implemented in future by providing a device-tree flag so the +GSWIP_MII_CFG_RMII_CLK bit can be toggled per port. + +Fixes: 4b5923249b8fa4 ("net: dsa: lantiq_gswip: Configure all remaining GSWIP_MII_CFG bits") +Tested-by: Jan Hoffmann +Signed-off-by: Martin Blumenstingl +Acked-by: Hauke Mehrtens +Link: https://lore.kernel.org/r/20220425152027.2220750-1-martin.blumenstingl@googlemail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/dsa/lantiq_gswip.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/drivers/net/dsa/lantiq_gswip.c b/drivers/net/dsa/lantiq_gswip.c +index 9e006a25b636..8a8f392813d8 100644 +--- a/drivers/net/dsa/lantiq_gswip.c ++++ b/drivers/net/dsa/lantiq_gswip.c +@@ -1663,9 +1663,6 @@ static void gswip_phylink_mac_config(struct dsa_switch *ds, int port, + break; + case PHY_INTERFACE_MODE_RMII: + miicfg |= GSWIP_MII_CFG_MODE_RMIIM; +- +- /* Configure the RMII clock as output: */ +- miicfg |= GSWIP_MII_CFG_RMII_CLK; + break; + case PHY_INTERFACE_MODE_RGMII: + case PHY_INTERFACE_MODE_RGMII_ID: +-- +2.35.1 + diff --git a/queue-5.15/net-dsa-mv88e6xxx-fix-port_hidden_wait-to-account-fo.patch b/queue-5.15/net-dsa-mv88e6xxx-fix-port_hidden_wait-to-account-fo.patch new file mode 100644 index 00000000000..f6101c80f66 --- /dev/null +++ b/queue-5.15/net-dsa-mv88e6xxx-fix-port_hidden_wait-to-account-fo.patch @@ -0,0 +1,54 @@ +From 8c8a674bea0fb47492f512f5141b72ce780822d2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Apr 2022 07:04:54 +0000 +Subject: net: dsa: mv88e6xxx: Fix port_hidden_wait to account for + port_base_addr +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Nathan Rossi + +[ Upstream commit 24cbdb910bb62b5be3865275e5682be1a7708c0f ] + +The other port_hidden functions rely on the port_read/port_write +functions to access the hidden control port. These functions apply the +offset for port_base_addr where applicable. Update port_hidden_wait to +use the port_wait_bit so that port_base_addr offsets are accounted for +when waiting for the busy bit to change. + +Without the offset the port_hidden_wait function would timeout on +devices that have a non-zero port_base_addr (e.g. MV88E6141), however +devices that have a zero port_base_addr would operate correctly (e.g. +MV88E6390). + +Fixes: 609070133aff ("net: dsa: mv88e6xxx: update code operating on hidden registers") +Signed-off-by: Nathan Rossi +Reviewed-by: Marek Behún +Reviewed-by: Andrew Lunn +Link: https://lore.kernel.org/r/20220425070454.348584-1-nathan@nathanrossi.com +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + drivers/net/dsa/mv88e6xxx/port_hidden.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/dsa/mv88e6xxx/port_hidden.c b/drivers/net/dsa/mv88e6xxx/port_hidden.c +index b49d05f0e117..7a9f9ff6dedf 100644 +--- a/drivers/net/dsa/mv88e6xxx/port_hidden.c ++++ b/drivers/net/dsa/mv88e6xxx/port_hidden.c +@@ -40,8 +40,9 @@ int mv88e6xxx_port_hidden_wait(struct mv88e6xxx_chip *chip) + { + int bit = __bf_shf(MV88E6XXX_PORT_RESERVED_1A_BUSY); + +- return mv88e6xxx_wait_bit(chip, MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT, +- MV88E6XXX_PORT_RESERVED_1A, bit, 0); ++ return mv88e6xxx_port_wait_bit(chip, ++ MV88E6XXX_PORT_RESERVED_1A_CTRL_PORT, ++ MV88E6XXX_PORT_RESERVED_1A, bit, 0); + } + + int mv88e6xxx_port_hidden_read(struct mv88e6xxx_chip *chip, int block, int port, +-- +2.35.1 + diff --git a/queue-5.15/net-fec-add-missing-of_node_put-in-fec_enet_init_sto.patch b/queue-5.15/net-fec-add-missing-of_node_put-in-fec_enet_init_sto.patch new file mode 100644 index 00000000000..8d78cb66d1b --- /dev/null +++ b/queue-5.15/net-fec-add-missing-of_node_put-in-fec_enet_init_sto.patch @@ -0,0 +1,36 @@ +From 43b7f8409d7c62f92ef1d3ce47fcb7b3445e42cf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Apr 2022 20:52:31 +0800 +Subject: net: fec: add missing of_node_put() in fec_enet_init_stop_mode() + +From: Yang Yingliang + +[ Upstream commit d2b52ec056d5bddb055c8f21d7489a23548d0838 ] + +Put device node in error path in fec_enet_init_stop_mode(). + +Fixes: 8a448bf832af ("net: ethernet: fec: move GPR register offset and bit into DT") +Signed-off-by: Yang Yingliang +Link: https://lore.kernel.org/r/20220426125231.375688-1-yangyingliang@huawei.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/freescale/fec_main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c +index a3e87e10ee6b..67eb9b671244 100644 +--- a/drivers/net/ethernet/freescale/fec_main.c ++++ b/drivers/net/ethernet/freescale/fec_main.c +@@ -3726,7 +3726,7 @@ static int fec_enet_init_stop_mode(struct fec_enet_private *fep, + ARRAY_SIZE(out_val)); + if (ret) { + dev_dbg(&fep->pdev->dev, "no stop mode property\n"); +- return ret; ++ goto out; + } + + fep->stop_gpr.gpr = syscon_node_to_regmap(gpr_np); +-- +2.35.1 + diff --git a/queue-5.15/net-hns3-add-return-value-for-mailbox-handling-in-pf.patch b/queue-5.15/net-hns3-add-return-value-for-mailbox-handling-in-pf.patch new file mode 100644 index 00000000000..07ea0d0f76e --- /dev/null +++ b/queue-5.15/net-hns3-add-return-value-for-mailbox-handling-in-pf.patch @@ -0,0 +1,100 @@ +From b4d7137bd5453c8674745c83fda7902672c720ad Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Apr 2022 20:57:25 +0800 +Subject: net: hns3: add return value for mailbox handling in PF + +From: Jian Shen + +[ Upstream commit c59d606296842409a6e5a4828235b0bd46b12bc4 ] + +Currently, there are some querying mailboxes sent from VF to PF, +and VF will wait the PF's handling result. For mailbox +HCLGE_MBX_GET_QID_IN_PF and HCLGE_MBX_GET_RSS_KEY, it may fail +when the input parameter is invalid, but the prototype of their +handler function is void. In this case, PF always return success +to VF, which may cause the VF get incorrect result. + +Fixes it by adding return value for these function. + +Fixes: 63b1279d9905 ("net: hns3: check queue id range before using") +Fixes: 532cfc0df1e4 ("net: hns3: add a check for index in hclge_get_rss_key()") +Signed-off-by: Jian Shen +Signed-off-by: Guangbin Huang +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + .../hisilicon/hns3/hns3pf/hclge_mbx.c | 22 ++++++++++--------- + 1 file changed, 12 insertions(+), 10 deletions(-) + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c +index c256305a2212..4a5b11b6fed3 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c +@@ -593,9 +593,9 @@ static int hclge_set_vf_mtu(struct hclge_vport *vport, + return hclge_set_vport_mtu(vport, mtu); + } + +-static void hclge_get_queue_id_in_pf(struct hclge_vport *vport, +- struct hclge_mbx_vf_to_pf_cmd *mbx_req, +- struct hclge_respond_to_vf_msg *resp_msg) ++static int hclge_get_queue_id_in_pf(struct hclge_vport *vport, ++ struct hclge_mbx_vf_to_pf_cmd *mbx_req, ++ struct hclge_respond_to_vf_msg *resp_msg) + { + struct hnae3_handle *handle = &vport->nic; + struct hclge_dev *hdev = vport->back; +@@ -605,17 +605,18 @@ static void hclge_get_queue_id_in_pf(struct hclge_vport *vport, + if (queue_id >= handle->kinfo.num_tqps) { + dev_err(&hdev->pdev->dev, "Invalid queue id(%u) from VF %u\n", + queue_id, mbx_req->mbx_src_vfid); +- return; ++ return -EINVAL; + } + + qid_in_pf = hclge_covert_handle_qid_global(&vport->nic, queue_id); + memcpy(resp_msg->data, &qid_in_pf, sizeof(qid_in_pf)); + resp_msg->len = sizeof(qid_in_pf); ++ return 0; + } + +-static void hclge_get_rss_key(struct hclge_vport *vport, +- struct hclge_mbx_vf_to_pf_cmd *mbx_req, +- struct hclge_respond_to_vf_msg *resp_msg) ++static int hclge_get_rss_key(struct hclge_vport *vport, ++ struct hclge_mbx_vf_to_pf_cmd *mbx_req, ++ struct hclge_respond_to_vf_msg *resp_msg) + { + #define HCLGE_RSS_MBX_RESP_LEN 8 + struct hclge_dev *hdev = vport->back; +@@ -631,13 +632,14 @@ static void hclge_get_rss_key(struct hclge_vport *vport, + dev_warn(&hdev->pdev->dev, + "failed to get the rss hash key, the index(%u) invalid !\n", + index); +- return; ++ return -EINVAL; + } + + memcpy(resp_msg->data, + &hdev->vport[0].rss_hash_key[index * HCLGE_RSS_MBX_RESP_LEN], + HCLGE_RSS_MBX_RESP_LEN); + resp_msg->len = HCLGE_RSS_MBX_RESP_LEN; ++ return 0; + } + + static void hclge_link_fail_parse(struct hclge_dev *hdev, u8 link_fail_code) +@@ -812,10 +814,10 @@ void hclge_mbx_handler(struct hclge_dev *hdev) + "VF fail(%d) to set mtu\n", ret); + break; + case HCLGE_MBX_GET_QID_IN_PF: +- hclge_get_queue_id_in_pf(vport, req, &resp_msg); ++ ret = hclge_get_queue_id_in_pf(vport, req, &resp_msg); + break; + case HCLGE_MBX_GET_RSS_KEY: +- hclge_get_rss_key(vport, req, &resp_msg); ++ ret = hclge_get_rss_key(vport, req, &resp_msg); + break; + case HCLGE_MBX_GET_LINK_MODE: + hclge_get_link_mode(vport, req); +-- +2.35.1 + diff --git a/queue-5.15/net-hns3-add-validity-check-for-message-data-length.patch b/queue-5.15/net-hns3-add-validity-check-for-message-data-length.patch new file mode 100644 index 00000000000..00a4c3bd702 --- /dev/null +++ b/queue-5.15/net-hns3-add-validity-check-for-message-data-length.patch @@ -0,0 +1,42 @@ +From a6805152b19b1566b2057e7fac106a39d6cf42e3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Apr 2022 20:57:24 +0800 +Subject: net: hns3: add validity check for message data length + +From: Jian Shen + +[ Upstream commit 7d413735cb18ff73aaba3457b16b08332e8d3cc4 ] + +Add validity check for message data length in function +hclge_send_mbx_msg(), avoid unexpected overflow. + +Fixes: dde1a86e93ca ("net: hns3: Add mailbox support to PF driver") +Signed-off-by: Jian Shen +Signed-off-by: Guangbin Huang +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c +index e30bf3027375..c256305a2212 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c +@@ -93,6 +93,13 @@ static int hclge_send_mbx_msg(struct hclge_vport *vport, u8 *msg, u16 msg_len, + enum hclge_cmd_status status; + struct hclge_desc desc; + ++ if (msg_len > HCLGE_MBX_MAX_MSG_SIZE) { ++ dev_err(&hdev->pdev->dev, ++ "msg data length(=%u) exceeds maximum(=%u)\n", ++ msg_len, HCLGE_MBX_MAX_MSG_SIZE); ++ return -EMSGSIZE; ++ } ++ + resp_pf_to_vf = (struct hclge_mbx_pf_to_vf_cmd *)desc.data; + + hclge_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_MBX_PF_TO_VF, false); +-- +2.35.1 + diff --git a/queue-5.15/net-hns3-clear-inited-state-and-stop-client-after-fa.patch b/queue-5.15/net-hns3-clear-inited-state-and-stop-client-after-fa.patch new file mode 100644 index 00000000000..eccc7578cd4 --- /dev/null +++ b/queue-5.15/net-hns3-clear-inited-state-and-stop-client-after-fa.patch @@ -0,0 +1,54 @@ +From 28928887654221a734fc6f880aca14f4cdfff4e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Apr 2022 20:57:20 +0800 +Subject: net: hns3: clear inited state and stop client after failed to + register netdev + +From: Jian Shen + +[ Upstream commit e98365afc1e94ea1609268866a44112b3572c58b ] + +If failed to register netdev, it needs to clear INITED state and stop +client in case of cause problem when concurrency with uninitialized +process of driver. + +Fixes: a289a7e5c1d4 ("net: hns3: put off calling register_netdev() until client initialize complete") +Signed-off-by: Jian Shen +Signed-off-by: Guangbin Huang +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +index 16cbd146ad06..818a028703c6 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +@@ -5092,6 +5092,13 @@ static void hns3_state_init(struct hnae3_handle *handle) + set_bit(HNS3_NIC_STATE_RXD_ADV_LAYOUT_ENABLE, &priv->state); + } + ++static void hns3_state_uninit(struct hnae3_handle *handle) ++{ ++ struct hns3_nic_priv *priv = handle->priv; ++ ++ clear_bit(HNS3_NIC_STATE_INITED, &priv->state); ++} ++ + static int hns3_client_init(struct hnae3_handle *handle) + { + struct pci_dev *pdev = handle->pdev; +@@ -5209,7 +5216,9 @@ static int hns3_client_init(struct hnae3_handle *handle) + return ret; + + out_reg_netdev_fail: ++ hns3_state_uninit(handle); + hns3_dbg_uninit(handle); ++ hns3_client_stop(handle); + out_client_start: + hns3_free_rx_cpu_rmap(netdev); + hns3_nic_uninit_irq(priv); +-- +2.35.1 + diff --git a/queue-5.15/net-hns3-modify-the-return-code-of-hclge_get_ring_ch.patch b/queue-5.15/net-hns3-modify-the-return-code-of-hclge_get_ring_ch.patch new file mode 100644 index 00000000000..0cfa4f189ec --- /dev/null +++ b/queue-5.15/net-hns3-modify-the-return-code-of-hclge_get_ring_ch.patch @@ -0,0 +1,40 @@ +From 5579ff95629fea503d059dd34824a6c6a152b408 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Apr 2022 20:57:23 +0800 +Subject: net: hns3: modify the return code of hclge_get_ring_chain_from_mbx + +From: Jie Wang + +[ Upstream commit 48009e9972974c52a5f649f761862dd67bce3d13 ] + +Currently, function hclge_get_ring_chain_from_mbx will return -ENOMEM if +ring_num is bigger than HCLGE_MBX_MAX_RING_CHAIN_PARAM_NUM. It is better to +return -EINVAL for the invalid parameter case. + +So this patch fixes it by return -EINVAL in this abnormal branch. + +Fixes: 5d02a58dae60 ("net: hns3: fix for buffer overflow smatch warning") +Signed-off-by: Jie Wang +Signed-off-by: Guangbin Huang +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c +index 65d78ee4d65a..e30bf3027375 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c +@@ -175,7 +175,7 @@ static int hclge_get_ring_chain_from_mbx( + ring_num = req->msg.ring_num; + + if (ring_num > HCLGE_MBX_MAX_RING_CHAIN_PARAM_NUM) +- return -ENOMEM; ++ return -EINVAL; + + for (i = 0; i < ring_num; i++) { + if (req->msg.param[i].tqp_index >= vport->nic.kinfo.rss_size) { +-- +2.35.1 + diff --git a/queue-5.15/net-phy-marvell10g-fix-return-value-on-error.patch b/queue-5.15/net-phy-marvell10g-fix-return-value-on-error.patch new file mode 100644 index 00000000000..716cfd96cda --- /dev/null +++ b/queue-5.15/net-phy-marvell10g-fix-return-value-on-error.patch @@ -0,0 +1,41 @@ +From e89f94943b15033c790106980125b43c63967daa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Apr 2022 09:27:38 +0300 +Subject: net: phy: marvell10g: fix return value on error +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Baruch Siach + +[ Upstream commit 0ed9704b660b259b54743cad8a84a11148f60f0a ] + +Return back the error value that we get from phy_read_mmd(). + +Fixes: c84786fa8f91 ("net: phy: marvell10g: read copper results from CSSR1") +Signed-off-by: Baruch Siach +Reviewed-by: Marek Behún +Reviewed-by: Russell King (Oracle) +Link: https://lore.kernel.org/r/f47cb031aeae873bb008ba35001607304a171a20.1650868058.git.baruch@tkos.co.il +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + drivers/net/phy/marvell10g.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c +index bd310e8d5e43..df33637c5269 100644 +--- a/drivers/net/phy/marvell10g.c ++++ b/drivers/net/phy/marvell10g.c +@@ -789,7 +789,7 @@ static int mv3310_read_status_copper(struct phy_device *phydev) + + cssr1 = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_CSSR1); + if (cssr1 < 0) +- return val; ++ return cssr1; + + /* If the link settings are not resolved, mark the link down */ + if (!(cssr1 & MV_PCS_CSSR1_RESOLVED)) { +-- +2.35.1 + diff --git a/queue-5.15/net-smc-sync-err-code-when-tcp-connection-was-refuse.patch b/queue-5.15/net-smc-sync-err-code-when-tcp-connection-was-refuse.patch new file mode 100644 index 00000000000..8412827beea --- /dev/null +++ b/queue-5.15/net-smc-sync-err-code-when-tcp-connection-was-refuse.patch @@ -0,0 +1,41 @@ +From 456f83e682ac496ac2db24acf3653d18ddfbf32b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 17:40:27 +0800 +Subject: net/smc: sync err code when tcp connection was refused + +From: liuyacan + +[ Upstream commit 4e2e65e2e56c6ceb4ea1719360080c0af083229e ] + +In the current implementation, when TCP initiates a connection +to an unavailable [ip,port], ECONNREFUSED will be stored in the +TCP socket, but SMC will not. However, some apps (like curl) use +getsockopt(,,SO_ERROR,,) to get the error information, which makes +them miss the error message and behave strangely. + +Fixes: 50717a37db03 ("net/smc: nonblocking connect rework") +Signed-off-by: liuyacan +Reviewed-by: Tony Lu +Acked-by: Karsten Graul +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/smc/af_smc.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c +index 499058248bdb..fb801c249d92 100644 +--- a/net/smc/af_smc.c ++++ b/net/smc/af_smc.c +@@ -1223,6 +1223,8 @@ static void smc_connect_work(struct work_struct *work) + smc->sk.sk_state = SMC_CLOSED; + if (rc == -EPIPE || rc == -EAGAIN) + smc->sk.sk_err = EPIPE; ++ else if (rc == -ECONNREFUSED) ++ smc->sk.sk_err = ECONNREFUSED; + else if (signal_pending(current)) + smc->sk.sk_err = -sock_intr_errno(timeo); + sock_put(&smc->sk); /* passive closing */ +-- +2.35.1 + diff --git a/queue-5.15/netfilter-conntrack-fix-udp-offload-timeout-sysctl.patch b/queue-5.15/netfilter-conntrack-fix-udp-offload-timeout-sysctl.patch new file mode 100644 index 00000000000..735ab19ce02 --- /dev/null +++ b/queue-5.15/netfilter-conntrack-fix-udp-offload-timeout-sysctl.patch @@ -0,0 +1,45 @@ +From e0fc6eeccfdc3c0de4ef089d932d507767b5300b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Apr 2022 14:09:00 +0300 +Subject: netfilter: conntrack: fix udp offload timeout sysctl + +From: Volodymyr Mytnyk + +[ Upstream commit 626873c446f7559d5af8b48cefad903ffd85cf4e ] + +`nf_flowtable_udp_timeout` sysctl option is available only +if CONFIG_NFT_FLOW_OFFLOAD enabled. But infra for this flow +offload UDP timeout was added under CONFIG_NF_FLOW_TABLE +config option. So, if you have CONFIG_NFT_FLOW_OFFLOAD +disabled and CONFIG_NF_FLOW_TABLE enabled, the +`nf_flowtable_udp_timeout` is not present in sysfs. +Please note, that TCP flow offload timeout sysctl option +is present even CONFIG_NFT_FLOW_OFFLOAD is disabled. + +I suppose it was a typo in commit that adds UDP flow offload +timeout and CONFIG_NF_FLOW_TABLE should be used instead. + +Fixes: 975c57504da1 ("netfilter: conntrack: Introduce udp offload timeout configuration") +Signed-off-by: Volodymyr Mytnyk +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nf_conntrack_standalone.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c +index 3e1afd10a9b6..55aa55b252b2 100644 +--- a/net/netfilter/nf_conntrack_standalone.c ++++ b/net/netfilter/nf_conntrack_standalone.c +@@ -823,7 +823,7 @@ static struct ctl_table nf_ct_sysctl_table[] = { + .mode = 0644, + .proc_handler = proc_dointvec_jiffies, + }, +-#if IS_ENABLED(CONFIG_NFT_FLOW_OFFLOAD) ++#if IS_ENABLED(CONFIG_NF_FLOW_TABLE) + [NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD] = { + .procname = "nf_flowtable_udp_timeout", + .maxlen = sizeof(unsigned int), +-- +2.35.1 + diff --git a/queue-5.15/netfilter-nft_set_rbtree-overlap-detection-with-elem.patch b/queue-5.15/netfilter-nft_set_rbtree-overlap-detection-with-elem.patch new file mode 100644 index 00000000000..4452cd903be --- /dev/null +++ b/queue-5.15/netfilter-nft_set_rbtree-overlap-detection-with-elem.patch @@ -0,0 +1,49 @@ +From 5d3475ed8d30ba47402a799528c4ba3cceebf41e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Apr 2022 12:21:05 +0200 +Subject: netfilter: nft_set_rbtree: overlap detection with element re-addition + after deletion + +From: Pablo Neira Ayuso + +[ Upstream commit babc3dc9524f0bcb5a0ec61f3c3639b11508fad6 ] + +This patch fixes spurious EEXIST errors. + +Extend d2df92e98a34 ("netfilter: nft_set_rbtree: handle element +re-addition after deletion") to deal with elements with same end flags +in the same transation. + +Reset the overlap flag as described by 7c84d41416d8 ("netfilter: +nft_set_rbtree: Detect partial overlaps on insertion"). + +Fixes: 7c84d41416d8 ("netfilter: nft_set_rbtree: Detect partial overlaps on insertion") +Fixes: d2df92e98a34 ("netfilter: nft_set_rbtree: handle element re-addition after deletion") +Signed-off-by: Pablo Neira Ayuso +Reviewed-by: Stefano Brivio +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nft_set_rbtree.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c +index d600a566da32..7325bee7d144 100644 +--- a/net/netfilter/nft_set_rbtree.c ++++ b/net/netfilter/nft_set_rbtree.c +@@ -349,7 +349,11 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, + *ext = &rbe->ext; + return -EEXIST; + } else { +- p = &parent->rb_left; ++ overlap = false; ++ if (nft_rbtree_interval_end(rbe)) ++ p = &parent->rb_left; ++ else ++ p = &parent->rb_right; + } + } + +-- +2.35.1 + diff --git a/queue-5.15/perf-arm-spe-fix-addresses-of-synthesized-spe-events.patch b/queue-5.15/perf-arm-spe-fix-addresses-of-synthesized-spe-events.patch new file mode 100644 index 00000000000..11476aae3ab --- /dev/null +++ b/queue-5.15/perf-arm-spe-fix-addresses-of-synthesized-spe-events.patch @@ -0,0 +1,55 @@ +From 6ad22b6fd14db3b47a6b460e5e0382a21f87f381 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 17:52:03 +0100 +Subject: perf arm-spe: Fix addresses of synthesized SPE events + +From: Timothy Hayes + +[ Upstream commit 4e13f6706d5aee1a6b835a44f6cf4971a921dcb8 ] + +This patch corrects a bug whereby synthesized events from SPE +samples are missing virtual addresses. + +Fixes: 54f7815efef7fad9 ("perf arm-spe: Fill address info for samples") +Reviewed-by: Leo Yan +Signed-off-by: Timothy Hayes +Cc: Alexander Shishkin +Cc: bpf@vger.kernel.org +Cc: Jiri Olsa +Cc: John Fastabend +Cc: John Garry +Cc: KP Singh +Cc: Leo Yan +Cc: linux-arm-kernel@lists.infradead.org +Cc: Mark Rutland +Cc: Martin KaFai Lau +Cc: Mathieu Poirier +Cc: Namhyung Kim +Cc: netdev@vger.kernel.org +Cc: Song Liu +Cc: Will Deacon +Cc: Yonghong Song +Link: https://lore.kernel.org/r/20220421165205.117662-2-timothy.hayes@arm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/arm-spe.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c +index 7054f23150e1..235549bb28b9 100644 +--- a/tools/perf/util/arm-spe.c ++++ b/tools/perf/util/arm-spe.c +@@ -927,7 +927,8 @@ arm_spe_synth_events(struct arm_spe *spe, struct perf_session *session) + attr.type = PERF_TYPE_HARDWARE; + attr.sample_type = evsel->core.attr.sample_type & PERF_SAMPLE_MASK; + attr.sample_type |= PERF_SAMPLE_IP | PERF_SAMPLE_TID | +- PERF_SAMPLE_PERIOD | PERF_SAMPLE_DATA_SRC; ++ PERF_SAMPLE_PERIOD | PERF_SAMPLE_DATA_SRC | ++ PERF_SAMPLE_ADDR; + if (spe->timeless_decoding) + attr.sample_type &= ~(u64)PERF_SAMPLE_TIME; + else +-- +2.35.1 + diff --git a/queue-5.15/phy-amlogic-fix-error-path-in-phy_g12a_usb3_pcie_pro.patch b/queue-5.15/phy-amlogic-fix-error-path-in-phy_g12a_usb3_pcie_pro.patch new file mode 100644 index 00000000000..d221ecd1fb2 --- /dev/null +++ b/queue-5.15/phy-amlogic-fix-error-path-in-phy_g12a_usb3_pcie_pro.patch @@ -0,0 +1,73 @@ +From 2edd9e0b3dfcdc52496e8e832209725d5a3593eb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Apr 2022 16:03:10 +0200 +Subject: phy: amlogic: fix error path in phy_g12a_usb3_pcie_probe() + +From: Heiner Kallweit + +[ Upstream commit 2c8045d48dee703ad8eab2be7d6547765a89c069 ] + +If clk_prepare_enable() fails we call clk_disable_unprepare() +in the error path what results in a warning that the clock +is disabled and unprepared already. +And if we fail later in phy_g12a_usb3_pcie_probe() then we +bail out w/o calling clk_disable_unprepare(). +This patch fixes both errors. + +Fixes: 36077e16c050 ("phy: amlogic: Add Amlogic G12A USB3 + PCIE Combo PHY Driver") +Signed-off-by: Heiner Kallweit +Link: https://lore.kernel.org/r/8e416f95-1084-ee28-860e-7884f7fa2e32@gmail.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + .../phy/amlogic/phy-meson-g12a-usb3-pcie.c | 20 +++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +diff --git a/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c b/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c +index 5b471ab80fe2..54d65a6f0fcc 100644 +--- a/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c ++++ b/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c +@@ -414,19 +414,19 @@ static int phy_g12a_usb3_pcie_probe(struct platform_device *pdev) + + ret = clk_prepare_enable(priv->clk_ref); + if (ret) +- goto err_disable_clk_ref; ++ return ret; + + priv->reset = devm_reset_control_array_get_exclusive(dev); +- if (IS_ERR(priv->reset)) +- return PTR_ERR(priv->reset); ++ if (IS_ERR(priv->reset)) { ++ ret = PTR_ERR(priv->reset); ++ goto err_disable_clk_ref; ++ } + + priv->phy = devm_phy_create(dev, np, &phy_g12a_usb3_pcie_ops); + if (IS_ERR(priv->phy)) { + ret = PTR_ERR(priv->phy); +- if (ret != -EPROBE_DEFER) +- dev_err(dev, "failed to create PHY\n"); +- +- return ret; ++ dev_err_probe(dev, ret, "failed to create PHY\n"); ++ goto err_disable_clk_ref; + } + + phy_set_drvdata(priv->phy, priv); +@@ -434,8 +434,12 @@ static int phy_g12a_usb3_pcie_probe(struct platform_device *pdev) + + phy_provider = devm_of_phy_provider_register(dev, + phy_g12a_usb3_pcie_xlate); ++ if (IS_ERR(phy_provider)) { ++ ret = PTR_ERR(phy_provider); ++ goto err_disable_clk_ref; ++ } + +- return PTR_ERR_OR_ZERO(phy_provider); ++ return 0; + + err_disable_clk_ref: + clk_disable_unprepare(priv->clk_ref); +-- +2.35.1 + diff --git a/queue-5.15/phy-mapphone-mdm6600-fix-pm-error-handling-in-phy_md.patch b/queue-5.15/phy-mapphone-mdm6600-fix-pm-error-handling-in-phy_md.patch new file mode 100644 index 00000000000..3d0d25846ff --- /dev/null +++ b/queue-5.15/phy-mapphone-mdm6600-fix-pm-error-handling-in-phy_md.patch @@ -0,0 +1,46 @@ +From 51343415689ca3ca1cc35e7b9353540de6401c29 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Mar 2022 02:46:11 +0000 +Subject: phy: mapphone-mdm6600: Fix PM error handling in phy_mdm6600_probe + +From: Miaoqian Lin + +[ Upstream commit d644e0d79829b1b9a14beedbdb0dc1256fc3677d ] + +The pm_runtime_enable will increase power disable depth. +If the probe fails, we should use pm_runtime_disable() to balance +pm_runtime_enable(). And use pm_runtime_dont_use_autosuspend() to +undo pm_runtime_use_autosuspend() +In the PM Runtime docs: + Drivers in ->remove() callback should undo the runtime PM changes done + in ->probe(). Usually this means calling pm_runtime_disable(), + pm_runtime_dont_use_autosuspend() etc. + +We should do this in error handling. + +Fixes: f7f50b2a7b05 ("phy: mapphone-mdm6600: Add runtime PM support for n_gsm on USB suspend") +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220301024615.31899-1-linmq006@gmail.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/motorola/phy-mapphone-mdm6600.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/phy/motorola/phy-mapphone-mdm6600.c b/drivers/phy/motorola/phy-mapphone-mdm6600.c +index 5172971f4c36..3cd4d51c247c 100644 +--- a/drivers/phy/motorola/phy-mapphone-mdm6600.c ++++ b/drivers/phy/motorola/phy-mapphone-mdm6600.c +@@ -629,7 +629,8 @@ static int phy_mdm6600_probe(struct platform_device *pdev) + cleanup: + if (error < 0) + phy_mdm6600_device_power_off(ddata); +- ++ pm_runtime_disable(ddata->dev); ++ pm_runtime_dont_use_autosuspend(ddata->dev); + return error; + } + +-- +2.35.1 + diff --git a/queue-5.15/phy-samsung-exynos5250-sata-fix-missing-device-put-i.patch b/queue-5.15/phy-samsung-exynos5250-sata-fix-missing-device-put-i.patch new file mode 100644 index 00000000000..98e62a8bbde --- /dev/null +++ b/queue-5.15/phy-samsung-exynos5250-sata-fix-missing-device-put-i.patch @@ -0,0 +1,77 @@ +From 1fcc2cdc46de238215b38ad2b778b77d5894846c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Apr 2022 11:18:57 +0200 +Subject: phy: samsung: exynos5250-sata: fix missing device put in probe error + paths + +From: Krzysztof Kozlowski + +[ Upstream commit 5c8402c4db45dd55c2c93c8d730f5dfa7c78a702 ] + +The actions of of_find_i2c_device_by_node() in probe function should be +reversed in error paths by putting the reference to obtained device. + +Fixes: bcff4cba41bc ("PHY: Exynos: Add Exynos5250 SATA PHY driver") +Signed-off-by: Krzysztof Kozlowski +Reviewed-by: Alim Akhtar +Link: https://lore.kernel.org/r/20220407091857.230386-2-krzysztof.kozlowski@linaro.org +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/samsung/phy-exynos5250-sata.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +diff --git a/drivers/phy/samsung/phy-exynos5250-sata.c b/drivers/phy/samsung/phy-exynos5250-sata.c +index 6c305a3fe187..595adba5fb8f 100644 +--- a/drivers/phy/samsung/phy-exynos5250-sata.c ++++ b/drivers/phy/samsung/phy-exynos5250-sata.c +@@ -196,20 +196,21 @@ static int exynos_sata_phy_probe(struct platform_device *pdev) + sata_phy->phyclk = devm_clk_get(dev, "sata_phyctrl"); + if (IS_ERR(sata_phy->phyclk)) { + dev_err(dev, "failed to get clk for PHY\n"); +- return PTR_ERR(sata_phy->phyclk); ++ ret = PTR_ERR(sata_phy->phyclk); ++ goto put_dev; + } + + ret = clk_prepare_enable(sata_phy->phyclk); + if (ret < 0) { + dev_err(dev, "failed to enable source clk\n"); +- return ret; ++ goto put_dev; + } + + sata_phy->phy = devm_phy_create(dev, NULL, &exynos_sata_phy_ops); + if (IS_ERR(sata_phy->phy)) { +- clk_disable_unprepare(sata_phy->phyclk); + dev_err(dev, "failed to create PHY\n"); +- return PTR_ERR(sata_phy->phy); ++ ret = PTR_ERR(sata_phy->phy); ++ goto clk_disable; + } + + phy_set_drvdata(sata_phy->phy, sata_phy); +@@ -217,11 +218,18 @@ static int exynos_sata_phy_probe(struct platform_device *pdev) + phy_provider = devm_of_phy_provider_register(dev, + of_phy_simple_xlate); + if (IS_ERR(phy_provider)) { +- clk_disable_unprepare(sata_phy->phyclk); +- return PTR_ERR(phy_provider); ++ ret = PTR_ERR(phy_provider); ++ goto clk_disable; + } + + return 0; ++ ++clk_disable: ++ clk_disable_unprepare(sata_phy->phyclk); ++put_dev: ++ put_device(&sata_phy->client->dev); ++ ++ return ret; + } + + static const struct of_device_id exynos_sata_phy_of_match[] = { +-- +2.35.1 + diff --git a/queue-5.15/phy-samsung-fix-missing-of_node_put-in-exynos_sata_p.patch b/queue-5.15/phy-samsung-fix-missing-of_node_put-in-exynos_sata_p.patch new file mode 100644 index 00000000000..d4e59e0b95d --- /dev/null +++ b/queue-5.15/phy-samsung-fix-missing-of_node_put-in-exynos_sata_p.patch @@ -0,0 +1,38 @@ +From e468f87b1a48aabb61fbcd43ea07c6b253277d59 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Apr 2022 11:18:56 +0200 +Subject: phy: samsung: Fix missing of_node_put() in exynos_sata_phy_probe + +From: Miaoqian Lin + +[ Upstream commit 388ec8f079f2f20d5cd183c3bc6f33cbc3ffd3ef ] + +The device_node pointer is returned by of_parse_phandle() with refcount +incremented. We should use of_node_put() on it when done. + +Fixes: bcff4cba41bc ("PHY: Exynos: Add Exynos5250 SATA PHY driver") +Signed-off-by: Miaoqian Lin +Reviewed-by: Krzysztof Kozlowski +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20220407091857.230386-1-krzysztof.kozlowski@linaro.org +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/samsung/phy-exynos5250-sata.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/phy/samsung/phy-exynos5250-sata.c b/drivers/phy/samsung/phy-exynos5250-sata.c +index 9ec234243f7c..6c305a3fe187 100644 +--- a/drivers/phy/samsung/phy-exynos5250-sata.c ++++ b/drivers/phy/samsung/phy-exynos5250-sata.c +@@ -187,6 +187,7 @@ static int exynos_sata_phy_probe(struct platform_device *pdev) + return -EINVAL; + + sata_phy->client = of_find_i2c_device_by_node(node); ++ of_node_put(node); + if (!sata_phy->client) + return -EPROBE_DEFER; + +-- +2.35.1 + diff --git a/queue-5.15/phy-ti-add-missing-pm_runtime_disable-in-serdes_am65.patch b/queue-5.15/phy-ti-add-missing-pm_runtime_disable-in-serdes_am65.patch new file mode 100644 index 00000000000..abd4ce0763c --- /dev/null +++ b/queue-5.15/phy-ti-add-missing-pm_runtime_disable-in-serdes_am65.patch @@ -0,0 +1,39 @@ +From 1e913bbdfaf76430b715bfe6d41f630bf812d736 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Mar 2022 02:58:49 +0000 +Subject: phy: ti: Add missing pm_runtime_disable() in serdes_am654_probe + +From: Miaoqian Lin + +[ Upstream commit ce88613e5bd579478653a028291098143f2a5bdf ] + +The pm_runtime_enable() will increase power disable depth. +If the probe fails, we should use pm_runtime_disable() to balance +pm_runtime_enable(). +Add missing pm_runtime_disable() for serdes_am654_probe(). + +Fixes: 71e2f5c5c224 ("phy: ti: Add a new SERDES driver for TI's AM654x SoC") +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220301025853.1911-1-linmq006@gmail.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/ti/phy-am654-serdes.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/phy/ti/phy-am654-serdes.c b/drivers/phy/ti/phy-am654-serdes.c +index 2ff56ce77b30..21c0088f5ca9 100644 +--- a/drivers/phy/ti/phy-am654-serdes.c ++++ b/drivers/phy/ti/phy-am654-serdes.c +@@ -838,7 +838,7 @@ static int serdes_am654_probe(struct platform_device *pdev) + + clk_err: + of_clk_del_provider(node); +- ++ pm_runtime_disable(dev); + return ret; + } + +-- +2.35.1 + diff --git a/queue-5.15/phy-ti-omap-usb2-fix-error-handling-in-omap_usb2_ena.patch b/queue-5.15/phy-ti-omap-usb2-fix-error-handling-in-omap_usb2_ena.patch new file mode 100644 index 00000000000..e20fb2393a2 --- /dev/null +++ b/queue-5.15/phy-ti-omap-usb2-fix-error-handling-in-omap_usb2_ena.patch @@ -0,0 +1,38 @@ +From e718a6f57ca8adf2bf796dd8c3775ca1a309fd58 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 18 Mar 2022 10:57:46 +0000 +Subject: phy: ti: omap-usb2: Fix error handling in omap_usb2_enable_clocks + +From: Miaoqian Lin + +[ Upstream commit 3588060befff75ff39fab7122b94c6fb3148fcda ] + +The corresponding API for clk_prepare_enable is clk_disable_unprepare. +Make sure that the clock is unprepared on exit by changing clk_disable +to clk_disable_unprepare. + +Fixes: ed31ee7cf1fe ("phy: ti: usb2: Fix logic on -EPROBE_DEFER") +Signed-off-by: Miaoqian Lin +Link: https://lore.kernel.org/r/20220318105748.19532-1-linmq006@gmail.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/ti/phy-omap-usb2.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/phy/ti/phy-omap-usb2.c b/drivers/phy/ti/phy-omap-usb2.c +index ebceb1520ce8..ca8532a3f193 100644 +--- a/drivers/phy/ti/phy-omap-usb2.c ++++ b/drivers/phy/ti/phy-omap-usb2.c +@@ -215,7 +215,7 @@ static int omap_usb2_enable_clocks(struct omap_usb *phy) + return 0; + + err1: +- clk_disable(phy->wkupclk); ++ clk_disable_unprepare(phy->wkupclk); + + err0: + return ret; +-- +2.35.1 + diff --git a/queue-5.15/pinctrl-mediatek-moore-fix-build-error.patch b/queue-5.15/pinctrl-mediatek-moore-fix-build-error.patch new file mode 100644 index 00000000000..7377f224215 --- /dev/null +++ b/queue-5.15/pinctrl-mediatek-moore-fix-build-error.patch @@ -0,0 +1,42 @@ +From 8e3fb25f42e977d657b90cb77137a00f94f02cec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 9 Apr 2022 18:59:58 +0800 +Subject: pinctrl: mediatek: moore: Fix build error + +From: YueHaibing + +[ Upstream commit 87950929e2ff2236207bdbe14bff8230558b541b ] + +If EINT_MTK is m and PINCTRL_MTK_V2 is y, build fails: + +drivers/pinctrl/mediatek/pinctrl-moore.o: In function `mtk_gpio_set_config': +pinctrl-moore.c:(.text+0xa6c): undefined reference to `mtk_eint_set_debounce' +drivers/pinctrl/mediatek/pinctrl-moore.o: In function `mtk_gpio_to_irq': +pinctrl-moore.c:(.text+0xacc): undefined reference to `mtk_eint_find_irq' + +Select EINT_MTK for PINCTRL_MTK_V2 to fix this. + +Fixes: 8174a8512e3e ("pinctrl: mediatek: make MediaTek pinctrl v2 driver ready for buidling loadable module") +Signed-off-by: YueHaibing +Link: https://lore.kernel.org/r/20220409105958.37412-1-yuehaibing@huawei.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/mediatek/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/pinctrl/mediatek/Kconfig b/drivers/pinctrl/mediatek/Kconfig +index 7040a7a7bd5d..246b0e951e1c 100644 +--- a/drivers/pinctrl/mediatek/Kconfig ++++ b/drivers/pinctrl/mediatek/Kconfig +@@ -30,6 +30,7 @@ config PINCTRL_MTK_MOORE + select GENERIC_PINMUX_FUNCTIONS + select GPIOLIB + select OF_GPIO ++ select EINT_MTK + select PINCTRL_MTK_V2 + + config PINCTRL_MTK_PARIS +-- +2.35.1 + diff --git a/queue-5.15/pinctrl-pistachio-fix-use-of-irq_of_parse_and_map.patch b/queue-5.15/pinctrl-pistachio-fix-use-of-irq_of_parse_and_map.patch new file mode 100644 index 00000000000..9029a1e62ec --- /dev/null +++ b/queue-5.15/pinctrl-pistachio-fix-use-of-irq_of_parse_and_map.patch @@ -0,0 +1,43 @@ +From fc221cef785daa4349f0619a791aebad1b99fb17 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Apr 2022 03:14:30 +0000 +Subject: pinctrl: pistachio: fix use of irq_of_parse_and_map() + +From: Lv Ruyi + +[ Upstream commit 0c9843a74a85224a89daa81fa66891dae2f930e1 ] + +The irq_of_parse_and_map() function returns 0 on failure, and does not +return an negative value. + +Fixes: cefc03e5995e ("pinctrl: Add Pistachio SoC pin control driver") +Reported-by: Zeal Robot +Signed-off-by: Lv Ruyi +Link: https://lore.kernel.org/r/20220424031430.3170759-1-lv.ruyi@zte.com.cn +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/pinctrl-pistachio.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/pinctrl/pinctrl-pistachio.c b/drivers/pinctrl/pinctrl-pistachio.c +index 8d271c6b0ca4..5de691c630b4 100644 +--- a/drivers/pinctrl/pinctrl-pistachio.c ++++ b/drivers/pinctrl/pinctrl-pistachio.c +@@ -1374,10 +1374,10 @@ static int pistachio_gpio_register(struct pistachio_pinctrl *pctl) + } + + irq = irq_of_parse_and_map(child, 0); +- if (irq < 0) { +- dev_err(pctl->dev, "No IRQ for bank %u: %d\n", i, irq); ++ if (!irq) { ++ dev_err(pctl->dev, "No IRQ for bank %u\n", i); + of_node_put(child); +- ret = irq; ++ ret = -EINVAL; + goto err; + } + +-- +2.35.1 + diff --git a/queue-5.15/pinctrl-rockchip-fix-rk3308-pinmux-bits.patch b/queue-5.15/pinctrl-rockchip-fix-rk3308-pinmux-bits.patch new file mode 100644 index 00000000000..1ebe3828161 --- /dev/null +++ b/queue-5.15/pinctrl-rockchip-fix-rk3308-pinmux-bits.patch @@ -0,0 +1,162 @@ +From 369f21d1ac92c706ab342c47a411ce890e42a95e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Apr 2022 16:24:31 +0200 +Subject: pinctrl: rockchip: fix RK3308 pinmux bits + +From: Luca Ceresoli + +[ Upstream commit 1f3e25a068832f8892a5ff71467622d012f5bc9f ] + +Some of the pinmuxing bits described in rk3308_mux_recalced_data are wrong, +pointing to non-existing registers. + +Fix the entire table. + +Also add a comment in front of each entry with the same string that appears +in the datasheet to make the table easier to compare with the docs. + +This fix has been tested on real hardware for the gpio3b3_sel entry. + +Fixes: 7825aeb7b208 ("pinctrl: rockchip: add rk3308 SoC support") +Signed-off-by: Luca Ceresoli +Reviewed-by: Heiko Stuebner +Link: https://lore.kernel.org/r/20220420142432.248565-1-luca.ceresoli@bootlin.com +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/pinctrl-rockchip.c | 45 ++++++++++++++++++++---------- + 1 file changed, 30 insertions(+), 15 deletions(-) + +diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c +index 923ff21a44c0..543a4991cf70 100644 +--- a/drivers/pinctrl/pinctrl-rockchip.c ++++ b/drivers/pinctrl/pinctrl-rockchip.c +@@ -455,95 +455,110 @@ static struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = { + + static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = { + { ++ /* gpio1b6_sel */ + .num = 1, + .pin = 14, + .reg = 0x28, + .bit = 12, + .mask = 0xf + }, { ++ /* gpio1b7_sel */ + .num = 1, + .pin = 15, + .reg = 0x2c, + .bit = 0, + .mask = 0x3 + }, { ++ /* gpio1c2_sel */ + .num = 1, + .pin = 18, + .reg = 0x30, + .bit = 4, + .mask = 0xf + }, { ++ /* gpio1c3_sel */ + .num = 1, + .pin = 19, + .reg = 0x30, + .bit = 8, + .mask = 0xf + }, { ++ /* gpio1c4_sel */ + .num = 1, + .pin = 20, + .reg = 0x30, + .bit = 12, + .mask = 0xf + }, { ++ /* gpio1c5_sel */ + .num = 1, + .pin = 21, + .reg = 0x34, + .bit = 0, + .mask = 0xf + }, { ++ /* gpio1c6_sel */ + .num = 1, + .pin = 22, + .reg = 0x34, + .bit = 4, + .mask = 0xf + }, { ++ /* gpio1c7_sel */ + .num = 1, + .pin = 23, + .reg = 0x34, + .bit = 8, + .mask = 0xf + }, { ++ /* gpio3b4_sel */ + .num = 3, + .pin = 12, + .reg = 0x68, + .bit = 8, + .mask = 0xf + }, { ++ /* gpio3b5_sel */ + .num = 3, + .pin = 13, + .reg = 0x68, + .bit = 12, + .mask = 0xf + }, { ++ /* gpio2a2_sel */ + .num = 2, + .pin = 2, +- .reg = 0x608, +- .bit = 0, +- .mask = 0x7 ++ .reg = 0x40, ++ .bit = 4, ++ .mask = 0x3 + }, { ++ /* gpio2a3_sel */ + .num = 2, + .pin = 3, +- .reg = 0x608, +- .bit = 4, +- .mask = 0x7 ++ .reg = 0x40, ++ .bit = 6, ++ .mask = 0x3 + }, { ++ /* gpio2c0_sel */ + .num = 2, + .pin = 16, +- .reg = 0x610, +- .bit = 8, +- .mask = 0x7 ++ .reg = 0x50, ++ .bit = 0, ++ .mask = 0x3 + }, { ++ /* gpio3b2_sel */ + .num = 3, + .pin = 10, +- .reg = 0x610, +- .bit = 0, +- .mask = 0x7 ++ .reg = 0x68, ++ .bit = 4, ++ .mask = 0x3 + }, { ++ /* gpio3b3_sel */ + .num = 3, + .pin = 11, +- .reg = 0x610, +- .bit = 4, +- .mask = 0x7 ++ .reg = 0x68, ++ .bit = 6, ++ .mask = 0x3 + }, + }; + +-- +2.35.1 + diff --git a/queue-5.15/pinctrl-stm32-do-not-call-stm32_gpio_get-for-edge-tr.patch b/queue-5.15/pinctrl-stm32-do-not-call-stm32_gpio_get-for-edge-tr.patch new file mode 100644 index 00000000000..09c26757f95 --- /dev/null +++ b/queue-5.15/pinctrl-stm32-do-not-call-stm32_gpio_get-for-edge-tr.patch @@ -0,0 +1,50 @@ +From 2e3b573918d20eaf5523534eebd603be66bb16d3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Apr 2022 23:54:10 +0200 +Subject: pinctrl: stm32: Do not call stm32_gpio_get() for edge triggered IRQs + in EOI + +From: Marek Vasut + +[ Upstream commit e74200ebf7c4f6a7a7d1be9f63833ddba251effa ] + +The stm32_gpio_get() should only be called for LEVEL triggered interrupts, +skip calling it for EDGE triggered interrupts altogether to avoid wasting +CPU cycles in EOI handler. On this platform, EDGE triggered interrupts are +the majority and LEVEL triggered interrupts are the exception no less, and +the CPU cycles are not abundant. + +Fixes: 47beed513a85b ("pinctrl: stm32: Add level interrupt support to gpio irq chip") +Signed-off-by: Marek Vasut +Cc: Alexandre Torgue +Cc: Fabien Dessenne +Cc: Linus Walleij +Cc: Marc Zyngier +Cc: linux-stm32@st-md-mailman.stormreply.com +Cc: linux-arm-kernel@lists.infradead.org +To: linux-gpio@vger.kernel.org +Link: https://lore.kernel.org/r/20220415215410.498349-1-marex@denx.de +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/stm32/pinctrl-stm32.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c +index 8934b4878fa8..2c78af0aac57 100644 +--- a/drivers/pinctrl/stm32/pinctrl-stm32.c ++++ b/drivers/pinctrl/stm32/pinctrl-stm32.c +@@ -311,6 +311,10 @@ static void stm32_gpio_irq_trigger(struct irq_data *d) + struct stm32_gpio_bank *bank = d->domain->host_data; + int level; + ++ /* Do not access the GPIO if this is not LEVEL triggered IRQ. */ ++ if (!(bank->irq_type[d->hwirq] & IRQ_TYPE_LEVEL_MASK)) ++ return; ++ + /* If level interrupt type then retrig */ + level = stm32_gpio_get(&bank->gpio_chip, d->hwirq); + if ((level == 0 && bank->irq_type[d->hwirq] == IRQ_TYPE_LEVEL_LOW) || +-- +2.35.1 + diff --git a/queue-5.15/pinctrl-stm32-keep-pinctrl-block-clock-enabled-when-.patch b/queue-5.15/pinctrl-stm32-keep-pinctrl-block-clock-enabled-when-.patch new file mode 100644 index 00000000000..c7e6c17b0c4 --- /dev/null +++ b/queue-5.15/pinctrl-stm32-keep-pinctrl-block-clock-enabled-when-.patch @@ -0,0 +1,140 @@ +From 7a89fe2f9f261f920f991729054edce8cb039dc7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 16:08:27 +0200 +Subject: pinctrl: stm32: Keep pinctrl block clock enabled when LEVEL IRQ + requested + +From: Marek Vasut + +[ Upstream commit 05d8af449d93e04547b4c6b328e39c890bc803f4 ] + +The current EOI handler for LEVEL triggered interrupts calls clk_enable(), +register IO, clk_disable(). The clock manipulation requires locking which +happens with IRQs disabled in clk_enable_lock(). Instead of turning the +clock on and off all the time, enable the clock in case LEVEL interrupt is +requested and keep the clock enabled until all LEVEL interrupts are freed. +The LEVEL interrupts are an exception on this platform and seldom used, so +this does not affect the common case. + +This simplifies the LEVEL interrupt handling considerably and also fixes +the following splat found when using preempt-rt: + ------------[ cut here ]------------ + WARNING: CPU: 0 PID: 0 at kernel/locking/rtmutex.c:2040 __rt_mutex_trylock+0x37/0x62 + Modules linked in: + CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.10.109-rt65-stable-standard-00068-g6a5afc4b1217 #85 + Hardware name: STM32 (Device Tree Support) + [] (unwind_backtrace) from [] (show_stack+0xb/0xc) + [] (show_stack) from [] (dump_stack+0x6f/0x84) + [] (dump_stack) from [] (__warn+0x7f/0xa4) + [] (__warn) from [] (warn_slowpath_fmt+0x3b/0x74) + [] (warn_slowpath_fmt) from [] (__rt_mutex_trylock+0x37/0x62) + [] (__rt_mutex_trylock) from [] (rt_spin_trylock+0x7/0x16) + [] (rt_spin_trylock) from [] (clk_enable_lock+0xb/0x80) + [] (clk_enable_lock) from [] (clk_core_enable_lock+0x9/0x18) + [] (clk_core_enable_lock) from [] (stm32_gpio_get+0x11/0x24) + [] (stm32_gpio_get) from [] (stm32_gpio_irq_trigger+0x1f/0x48) + [] (stm32_gpio_irq_trigger) from [] (handle_fasteoi_irq+0x71/0xa8) + [] (handle_fasteoi_irq) from [] (generic_handle_irq+0x19/0x22) + [] (generic_handle_irq) from [] (__handle_domain_irq+0x55/0x64) + [] (__handle_domain_irq) from [] (gic_handle_irq+0x53/0x64) + [] (gic_handle_irq) from [] (__irq_svc+0x65/0xc0) + Exception stack(0xc0e01f18 to 0xc0e01f60) + 1f00: 0000300c 00000000 + 1f20: 0000300c c010ff01 00000000 00000000 c0e00000 c0e07714 00000001 c0e01f78 + 1f40: c0e07758 00000000 ef7cd0ff c0e01f68 c010554b c0105542 40000033 ffffffff + [] (__irq_svc) from [] (arch_cpu_idle+0xc/0x1e) + [] (arch_cpu_idle) from [] (default_idle_call+0x21/0x3c) + [] (default_idle_call) from [] (do_idle+0xe3/0x1e4) + [] (do_idle) from [] (cpu_startup_entry+0x13/0x14) + [] (cpu_startup_entry) from [] (start_kernel+0x397/0x3d4) + [] (start_kernel) from [<00000000>] (0x0) + ---[ end trace 0000000000000002 ]--- + +Power consumption measured on STM32MP157C DHCOM SoM is not increased or +is below noise threshold. + +Fixes: 47beed513a85b ("pinctrl: stm32: Add level interrupt support to gpio irq chip") +Signed-off-by: Marek Vasut +Cc: Alexandre Torgue +Cc: Fabien Dessenne +Cc: Linus Walleij +Cc: Marc Zyngier +Cc: linux-stm32@st-md-mailman.stormreply.com +Cc: linux-arm-kernel@lists.infradead.org +To: linux-gpio@vger.kernel.org +Reviewed-by: Fabien Dessenne +Link: https://lore.kernel.org/r/20220421140827.214088-1-marex@denx.de +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/stm32/pinctrl-stm32.c | 19 +++++++++++++++++-- + 1 file changed, 17 insertions(+), 2 deletions(-) + +diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c +index 2c78af0aac57..97a4fb5a9328 100644 +--- a/drivers/pinctrl/stm32/pinctrl-stm32.c ++++ b/drivers/pinctrl/stm32/pinctrl-stm32.c +@@ -225,6 +225,13 @@ static void stm32_gpio_free(struct gpio_chip *chip, unsigned offset) + pinctrl_gpio_free(chip->base + offset); + } + ++static int stm32_gpio_get_noclk(struct gpio_chip *chip, unsigned int offset) ++{ ++ struct stm32_gpio_bank *bank = gpiochip_get_data(chip); ++ ++ return !!(readl_relaxed(bank->base + STM32_GPIO_IDR) & BIT(offset)); ++} ++ + static int stm32_gpio_get(struct gpio_chip *chip, unsigned offset) + { + struct stm32_gpio_bank *bank = gpiochip_get_data(chip); +@@ -232,7 +239,7 @@ static int stm32_gpio_get(struct gpio_chip *chip, unsigned offset) + + clk_enable(bank->clk); + +- ret = !!(readl_relaxed(bank->base + STM32_GPIO_IDR) & BIT(offset)); ++ ret = stm32_gpio_get_noclk(chip, offset); + + clk_disable(bank->clk); + +@@ -316,7 +323,7 @@ static void stm32_gpio_irq_trigger(struct irq_data *d) + return; + + /* If level interrupt type then retrig */ +- level = stm32_gpio_get(&bank->gpio_chip, d->hwirq); ++ level = stm32_gpio_get_noclk(&bank->gpio_chip, d->hwirq); + if ((level == 0 && bank->irq_type[d->hwirq] == IRQ_TYPE_LEVEL_LOW) || + (level == 1 && bank->irq_type[d->hwirq] == IRQ_TYPE_LEVEL_HIGH)) + irq_chip_retrigger_hierarchy(d); +@@ -358,6 +365,7 @@ static int stm32_gpio_irq_request_resources(struct irq_data *irq_data) + { + struct stm32_gpio_bank *bank = irq_data->domain->host_data; + struct stm32_pinctrl *pctl = dev_get_drvdata(bank->gpio_chip.parent); ++ unsigned long flags; + int ret; + + ret = stm32_gpio_direction_input(&bank->gpio_chip, irq_data->hwirq); +@@ -371,6 +379,10 @@ static int stm32_gpio_irq_request_resources(struct irq_data *irq_data) + return ret; + } + ++ flags = irqd_get_trigger_type(irq_data); ++ if (flags & IRQ_TYPE_LEVEL_MASK) ++ clk_enable(bank->clk); ++ + return 0; + } + +@@ -378,6 +390,9 @@ static void stm32_gpio_irq_release_resources(struct irq_data *irq_data) + { + struct stm32_gpio_bank *bank = irq_data->domain->host_data; + ++ if (bank->irq_type[irq_data->hwirq] & IRQ_TYPE_LEVEL_MASK) ++ clk_disable(bank->clk); ++ + gpiochip_unlock_as_irq(&bank->gpio_chip, irq_data->hwirq); + } + +-- +2.35.1 + diff --git a/queue-5.15/powerpc-perf-fix-32bit-compile.patch b/queue-5.15/powerpc-perf-fix-32bit-compile.patch new file mode 100644 index 00000000000..8ccc9af6021 --- /dev/null +++ b/queue-5.15/powerpc-perf-fix-32bit-compile.patch @@ -0,0 +1,44 @@ +From 72eb9a419b7bed89956679cb6393ad3eacb028ce Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 12:57:56 +1000 +Subject: powerpc/perf: Fix 32bit compile + +From: Alexey Kardashevskiy + +[ Upstream commit bb82c574691daf8f7fa9a160264d15c5804cb769 ] + +The "read_bhrb" global symbol is only called under CONFIG_PPC64 of +arch/powerpc/perf/core-book3s.c but it is compiled for both 32 and 64 bit +anyway (and LLVM fails to link this on 32bit). + +This fixes it by moving bhrb.o to obj64 targets. + +Signed-off-by: Alexey Kardashevskiy +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220421025756.571995-1-aik@ozlabs.ru +Signed-off-by: Sasha Levin +--- + arch/powerpc/perf/Makefile | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/powerpc/perf/Makefile b/arch/powerpc/perf/Makefile +index 2f46e31c7612..4f53d0b97539 100644 +--- a/arch/powerpc/perf/Makefile ++++ b/arch/powerpc/perf/Makefile +@@ -3,11 +3,11 @@ + obj-y += callchain.o callchain_$(BITS).o perf_regs.o + obj-$(CONFIG_COMPAT) += callchain_32.o + +-obj-$(CONFIG_PPC_PERF_CTRS) += core-book3s.o bhrb.o ++obj-$(CONFIG_PPC_PERF_CTRS) += core-book3s.o + obj64-$(CONFIG_PPC_PERF_CTRS) += ppc970-pmu.o power5-pmu.o \ + power5+-pmu.o power6-pmu.o power7-pmu.o \ + isa207-common.o power8-pmu.o power9-pmu.o \ +- generic-compat-pmu.o power10-pmu.o ++ generic-compat-pmu.o power10-pmu.o bhrb.o + obj32-$(CONFIG_PPC_PERF_CTRS) += mpc7450-pmu.o + + obj-$(CONFIG_PPC_POWERNV) += imc-pmu.o +-- +2.35.1 + diff --git a/queue-5.15/revert-ibmvnic-add-ethtool-private-flag-for-driver-d.patch b/queue-5.15/revert-ibmvnic-add-ethtool-private-flag-for-driver-d.patch new file mode 100644 index 00000000000..147a422ff1e --- /dev/null +++ b/queue-5.15/revert-ibmvnic-add-ethtool-private-flag-for-driver-d.patch @@ -0,0 +1,258 @@ +From 6d878d8f0a8571e40b3c7c5a51b91d9641b14090 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Apr 2022 18:51:46 -0500 +Subject: Revert "ibmvnic: Add ethtool private flag for driver-defined queue + limits" + +From: Dany Madden + +[ Upstream commit aeaf59b78712c7a1827c76f086acff4f586e072f ] + +This reverts commit 723ad916134784b317b72f3f6cf0f7ba774e5dae + +When client requests channel or ring size larger than what the server +can support the server will cap the request to the supported max. So, +the client would not be able to successfully request resources that +exceed the server limit. + +Fixes: 723ad9161347 ("ibmvnic: Add ethtool private flag for driver-defined queue limits") +Signed-off-by: Dany Madden +Link: https://lore.kernel.org/r/20220427235146.23189-1-drt@linux.ibm.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/ibm/ibmvnic.c | 129 ++++++++--------------------- + drivers/net/ethernet/ibm/ibmvnic.h | 6 -- + 2 files changed, 35 insertions(+), 100 deletions(-) + +diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c +index c809e8fe648f..b262aa84b6a2 100644 +--- a/drivers/net/ethernet/ibm/ibmvnic.c ++++ b/drivers/net/ethernet/ibm/ibmvnic.c +@@ -2961,13 +2961,8 @@ static void ibmvnic_get_ringparam(struct net_device *netdev, + { + struct ibmvnic_adapter *adapter = netdev_priv(netdev); + +- if (adapter->priv_flags & IBMVNIC_USE_SERVER_MAXES) { +- ring->rx_max_pending = adapter->max_rx_add_entries_per_subcrq; +- ring->tx_max_pending = adapter->max_tx_entries_per_subcrq; +- } else { +- ring->rx_max_pending = IBMVNIC_MAX_QUEUE_SZ; +- ring->tx_max_pending = IBMVNIC_MAX_QUEUE_SZ; +- } ++ ring->rx_max_pending = adapter->max_rx_add_entries_per_subcrq; ++ ring->tx_max_pending = adapter->max_tx_entries_per_subcrq; + ring->rx_mini_max_pending = 0; + ring->rx_jumbo_max_pending = 0; + ring->rx_pending = adapter->req_rx_add_entries_per_subcrq; +@@ -2980,23 +2975,21 @@ static int ibmvnic_set_ringparam(struct net_device *netdev, + struct ethtool_ringparam *ring) + { + struct ibmvnic_adapter *adapter = netdev_priv(netdev); +- int ret; + +- ret = 0; ++ if (ring->rx_pending > adapter->max_rx_add_entries_per_subcrq || ++ ring->tx_pending > adapter->max_tx_entries_per_subcrq) { ++ netdev_err(netdev, "Invalid request.\n"); ++ netdev_err(netdev, "Max tx buffers = %llu\n", ++ adapter->max_rx_add_entries_per_subcrq); ++ netdev_err(netdev, "Max rx buffers = %llu\n", ++ adapter->max_tx_entries_per_subcrq); ++ return -EINVAL; ++ } ++ + adapter->desired.rx_entries = ring->rx_pending; + adapter->desired.tx_entries = ring->tx_pending; + +- ret = wait_for_reset(adapter); +- +- if (!ret && +- (adapter->req_rx_add_entries_per_subcrq != ring->rx_pending || +- adapter->req_tx_entries_per_subcrq != ring->tx_pending)) +- netdev_info(netdev, +- "Could not match full ringsize request. Requested: RX %d, TX %d; Allowed: RX %llu, TX %llu\n", +- ring->rx_pending, ring->tx_pending, +- adapter->req_rx_add_entries_per_subcrq, +- adapter->req_tx_entries_per_subcrq); +- return ret; ++ return wait_for_reset(adapter); + } + + static void ibmvnic_get_channels(struct net_device *netdev, +@@ -3004,14 +2997,8 @@ static void ibmvnic_get_channels(struct net_device *netdev, + { + struct ibmvnic_adapter *adapter = netdev_priv(netdev); + +- if (adapter->priv_flags & IBMVNIC_USE_SERVER_MAXES) { +- channels->max_rx = adapter->max_rx_queues; +- channels->max_tx = adapter->max_tx_queues; +- } else { +- channels->max_rx = IBMVNIC_MAX_QUEUES; +- channels->max_tx = IBMVNIC_MAX_QUEUES; +- } +- ++ channels->max_rx = adapter->max_rx_queues; ++ channels->max_tx = adapter->max_tx_queues; + channels->max_other = 0; + channels->max_combined = 0; + channels->rx_count = adapter->req_rx_queues; +@@ -3024,22 +3011,11 @@ static int ibmvnic_set_channels(struct net_device *netdev, + struct ethtool_channels *channels) + { + struct ibmvnic_adapter *adapter = netdev_priv(netdev); +- int ret; + +- ret = 0; + adapter->desired.rx_queues = channels->rx_count; + adapter->desired.tx_queues = channels->tx_count; + +- ret = wait_for_reset(adapter); +- +- if (!ret && +- (adapter->req_rx_queues != channels->rx_count || +- adapter->req_tx_queues != channels->tx_count)) +- netdev_info(netdev, +- "Could not match full channels request. Requested: RX %d, TX %d; Allowed: RX %llu, TX %llu\n", +- channels->rx_count, channels->tx_count, +- adapter->req_rx_queues, adapter->req_tx_queues); +- return ret; ++ return wait_for_reset(adapter); + } + + static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data) +@@ -3047,43 +3023,32 @@ static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data) + struct ibmvnic_adapter *adapter = netdev_priv(dev); + int i; + +- switch (stringset) { +- case ETH_SS_STATS: +- for (i = 0; i < ARRAY_SIZE(ibmvnic_stats); +- i++, data += ETH_GSTRING_LEN) +- memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN); ++ if (stringset != ETH_SS_STATS) ++ return; + +- for (i = 0; i < adapter->req_tx_queues; i++) { +- snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i); +- data += ETH_GSTRING_LEN; ++ for (i = 0; i < ARRAY_SIZE(ibmvnic_stats); i++, data += ETH_GSTRING_LEN) ++ memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN); + +- snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i); +- data += ETH_GSTRING_LEN; ++ for (i = 0; i < adapter->req_tx_queues; i++) { ++ snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i); ++ data += ETH_GSTRING_LEN; + +- snprintf(data, ETH_GSTRING_LEN, +- "tx%d_dropped_packets", i); +- data += ETH_GSTRING_LEN; +- } ++ snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i); ++ data += ETH_GSTRING_LEN; + +- for (i = 0; i < adapter->req_rx_queues; i++) { +- snprintf(data, ETH_GSTRING_LEN, "rx%d_packets", i); +- data += ETH_GSTRING_LEN; ++ snprintf(data, ETH_GSTRING_LEN, "tx%d_dropped_packets", i); ++ data += ETH_GSTRING_LEN; ++ } + +- snprintf(data, ETH_GSTRING_LEN, "rx%d_bytes", i); +- data += ETH_GSTRING_LEN; ++ for (i = 0; i < adapter->req_rx_queues; i++) { ++ snprintf(data, ETH_GSTRING_LEN, "rx%d_packets", i); ++ data += ETH_GSTRING_LEN; + +- snprintf(data, ETH_GSTRING_LEN, "rx%d_interrupts", i); +- data += ETH_GSTRING_LEN; +- } +- break; ++ snprintf(data, ETH_GSTRING_LEN, "rx%d_bytes", i); ++ data += ETH_GSTRING_LEN; + +- case ETH_SS_PRIV_FLAGS: +- for (i = 0; i < ARRAY_SIZE(ibmvnic_priv_flags); i++) +- strcpy(data + i * ETH_GSTRING_LEN, +- ibmvnic_priv_flags[i]); +- break; +- default: +- return; ++ snprintf(data, ETH_GSTRING_LEN, "rx%d_interrupts", i); ++ data += ETH_GSTRING_LEN; + } + } + +@@ -3096,8 +3061,6 @@ static int ibmvnic_get_sset_count(struct net_device *dev, int sset) + return ARRAY_SIZE(ibmvnic_stats) + + adapter->req_tx_queues * NUM_TX_STATS + + adapter->req_rx_queues * NUM_RX_STATS; +- case ETH_SS_PRIV_FLAGS: +- return ARRAY_SIZE(ibmvnic_priv_flags); + default: + return -EOPNOTSUPP; + } +@@ -3150,26 +3113,6 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev, + } + } + +-static u32 ibmvnic_get_priv_flags(struct net_device *netdev) +-{ +- struct ibmvnic_adapter *adapter = netdev_priv(netdev); +- +- return adapter->priv_flags; +-} +- +-static int ibmvnic_set_priv_flags(struct net_device *netdev, u32 flags) +-{ +- struct ibmvnic_adapter *adapter = netdev_priv(netdev); +- bool which_maxes = !!(flags & IBMVNIC_USE_SERVER_MAXES); +- +- if (which_maxes) +- adapter->priv_flags |= IBMVNIC_USE_SERVER_MAXES; +- else +- adapter->priv_flags &= ~IBMVNIC_USE_SERVER_MAXES; +- +- return 0; +-} +- + static const struct ethtool_ops ibmvnic_ethtool_ops = { + .get_drvinfo = ibmvnic_get_drvinfo, + .get_msglevel = ibmvnic_get_msglevel, +@@ -3183,8 +3126,6 @@ static const struct ethtool_ops ibmvnic_ethtool_ops = { + .get_sset_count = ibmvnic_get_sset_count, + .get_ethtool_stats = ibmvnic_get_ethtool_stats, + .get_link_ksettings = ibmvnic_get_link_ksettings, +- .get_priv_flags = ibmvnic_get_priv_flags, +- .set_priv_flags = ibmvnic_set_priv_flags, + }; + + /* Routines for managing CRQs/sCRQs */ +diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h +index ef395fd3b1e6..1a9ed9202654 100644 +--- a/drivers/net/ethernet/ibm/ibmvnic.h ++++ b/drivers/net/ethernet/ibm/ibmvnic.h +@@ -43,11 +43,6 @@ + + #define IBMVNIC_RESET_DELAY 100 + +-static const char ibmvnic_priv_flags[][ETH_GSTRING_LEN] = { +-#define IBMVNIC_USE_SERVER_MAXES 0x1 +- "use-server-maxes" +-}; +- + struct ibmvnic_login_buffer { + __be32 len; + __be32 version; +@@ -885,7 +880,6 @@ struct ibmvnic_adapter { + struct ibmvnic_control_ip_offload_buffer ip_offload_ctrl; + dma_addr_t ip_offload_ctrl_tok; + u32 msg_enable; +- u32 priv_flags; + + /* Vital Product Data (VPD) */ + struct ibmvnic_vpd *vpd; +-- +2.35.1 + diff --git a/queue-5.15/sctp-check-asoc-strreset_chunk-in-sctp_generate_reco.patch b/queue-5.15/sctp-check-asoc-strreset_chunk-in-sctp_generate_reco.patch new file mode 100644 index 00000000000..8d43361919e --- /dev/null +++ b/queue-5.15/sctp-check-asoc-strreset_chunk-in-sctp_generate_reco.patch @@ -0,0 +1,66 @@ +From 55c1c0bfb455f9ee05e9a0ba1f3e37c0d5730e37 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Apr 2022 16:52:41 -0400 +Subject: sctp: check asoc strreset_chunk in sctp_generate_reconf_event + +From: Xin Long + +[ Upstream commit 165e3e17fe8fe6a8aab319bc6e631a2e23b9a857 ] + +A null pointer reference issue can be triggered when the response of a +stream reconf request arrives after the timer is triggered, such as: + + send Incoming SSN Reset Request ---> + CPU0: + reconf timer is triggered, + go to the handler code before hold sk lock + <--- reply with Outgoing SSN Reset Request + CPU1: + process Outgoing SSN Reset Request, + and set asoc->strreset_chunk to NULL + CPU0: + continue the handler code, hold sk lock, + and try to hold asoc->strreset_chunk, crash! + +In Ying Xu's testing, the call trace is: + + [ ] BUG: kernel NULL pointer dereference, address: 0000000000000010 + [ ] RIP: 0010:sctp_chunk_hold+0xe/0x40 [sctp] + [ ] Call Trace: + [ ] + [ ] sctp_sf_send_reconf+0x2c/0x100 [sctp] + [ ] sctp_do_sm+0xa4/0x220 [sctp] + [ ] sctp_generate_reconf_event+0xbd/0xe0 [sctp] + [ ] call_timer_fn+0x26/0x130 + +This patch is to fix it by returning from the timer handler if asoc +strreset_chunk is already set to NULL. + +Fixes: 7b9438de0cd4 ("sctp: add stream reconf timer") +Reported-by: Ying Xu +Signed-off-by: Xin Long +Acked-by: Marcelo Ricardo Leitner +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/sctp/sm_sideeffect.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c +index b3815b568e8e..463c4a58d2c3 100644 +--- a/net/sctp/sm_sideeffect.c ++++ b/net/sctp/sm_sideeffect.c +@@ -458,6 +458,10 @@ void sctp_generate_reconf_event(struct timer_list *t) + goto out_unlock; + } + ++ /* This happens when the response arrives after the timer is triggered. */ ++ if (!asoc->strreset_chunk) ++ goto out_unlock; ++ + error = sctp_do_sm(net, SCTP_EVENT_T_TIMEOUT, + SCTP_ST_TIMEOUT(SCTP_EVENT_TIMEOUT_RECONF), + asoc->state, asoc->ep, asoc, +-- +2.35.1 + diff --git a/queue-5.15/selftest-vm-verify-mmap-addr-in-mremap_test.patch b/queue-5.15/selftest-vm-verify-mmap-addr-in-mremap_test.patch new file mode 100644 index 00000000000..63ac84be841 --- /dev/null +++ b/queue-5.15/selftest-vm-verify-mmap-addr-in-mremap_test.patch @@ -0,0 +1,109 @@ +From df52e58be26061f564884d5cb61e8c9d6b824ad9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 16:35:49 -0700 +Subject: selftest/vm: verify mmap addr in mremap_test + +From: Sidhartha Kumar + +[ Upstream commit 9c85a9bae267f6b5e5e374d0d023bbbe9db096d3 ] + +Avoid calling mmap with requested addresses that are less than the +system's mmap_min_addr. When run as root, mmap returns EACCES when +trying to map addresses < mmap_min_addr. This is not one of the error +codes for the condition to retry the mmap in the test. + +Rather than arbitrarily retrying on EACCES, don't attempt an mmap until +addr > vm.mmap_min_addr. + +Add a munmap call after an alignment check as the mappings are retained +after the retry and can reach the vm.max_map_count sysctl. + +Link: https://lkml.kernel.org/r/20220420215721.4868-1-sidhartha.kumar@oracle.com +Signed-off-by: Sidhartha Kumar +Reviewed-by: Shuah Khan +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/vm/mremap_test.c | 41 +++++++++++++++++++++++- + 1 file changed, 40 insertions(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/vm/mremap_test.c b/tools/testing/selftests/vm/mremap_test.c +index 0624d1bd71b5..2b3b4f15185f 100644 +--- a/tools/testing/selftests/vm/mremap_test.c ++++ b/tools/testing/selftests/vm/mremap_test.c +@@ -6,6 +6,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -64,6 +65,35 @@ enum { + .expect_failure = should_fail \ + } + ++/* Returns mmap_min_addr sysctl tunable from procfs */ ++static unsigned long long get_mmap_min_addr(void) ++{ ++ FILE *fp; ++ int n_matched; ++ static unsigned long long addr; ++ ++ if (addr) ++ return addr; ++ ++ fp = fopen("/proc/sys/vm/mmap_min_addr", "r"); ++ if (fp == NULL) { ++ ksft_print_msg("Failed to open /proc/sys/vm/mmap_min_addr: %s\n", ++ strerror(errno)); ++ exit(KSFT_SKIP); ++ } ++ ++ n_matched = fscanf(fp, "%llu", &addr); ++ if (n_matched != 1) { ++ ksft_print_msg("Failed to read /proc/sys/vm/mmap_min_addr: %s\n", ++ strerror(errno)); ++ fclose(fp); ++ exit(KSFT_SKIP); ++ } ++ ++ fclose(fp); ++ return addr; ++} ++ + /* + * Returns the start address of the mapping on success, else returns + * NULL on failure. +@@ -72,8 +102,15 @@ static void *get_source_mapping(struct config c) + { + unsigned long long addr = 0ULL; + void *src_addr = NULL; ++ unsigned long long mmap_min_addr; ++ ++ mmap_min_addr = get_mmap_min_addr(); ++ + retry: + addr += c.src_alignment; ++ if (addr < mmap_min_addr) ++ goto retry; ++ + src_addr = mmap((void *) addr, c.region_size, PROT_READ | PROT_WRITE, + MAP_FIXED_NOREPLACE | MAP_ANONYMOUS | MAP_SHARED, + -1, 0); +@@ -91,8 +128,10 @@ static void *get_source_mapping(struct config c) + * alignment in the tests. + */ + if (((unsigned long long) src_addr & (c.src_alignment - 1)) || +- !((unsigned long long) src_addr & c.src_alignment)) ++ !((unsigned long long) src_addr & c.src_alignment)) { ++ munmap(src_addr, c.region_size); + goto retry; ++ } + + if (!src_addr) + goto error; +-- +2.35.1 + diff --git a/queue-5.15/selftest-vm-verify-remap-destination-address-in-mrem.patch b/queue-5.15/selftest-vm-verify-remap-destination-address-in-mrem.patch new file mode 100644 index 00000000000..14626f33c12 --- /dev/null +++ b/queue-5.15/selftest-vm-verify-remap-destination-address-in-mrem.patch @@ -0,0 +1,107 @@ +From 6326629d9b7bf6b8291fdd8a229f661220ab7ddf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 16:35:52 -0700 +Subject: selftest/vm: verify remap destination address in mremap_test + +From: Sidhartha Kumar + +[ Upstream commit 18d609daa546c919fd36b62a7b510c18de4b4af8 ] + +Because mremap does not have a MAP_FIXED_NOREPLACE flag, it can destroy +existing mappings. This causes a segfault when regions such as text are +remapped and the permissions are changed. + +Verify the requested mremap destination address does not overlap any +existing mappings by using mmap's MAP_FIXED_NOREPLACE flag. Keep +incrementing the destination address until a valid mapping is found or +fail the current test once the max address is reached. + +Link: https://lkml.kernel.org/r/20220420215721.4868-2-sidhartha.kumar@oracle.com +Signed-off-by: Sidhartha Kumar +Reviewed-by: Shuah Khan +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/vm/mremap_test.c | 42 ++++++++++++++++++++++-- + 1 file changed, 39 insertions(+), 3 deletions(-) + +diff --git a/tools/testing/selftests/vm/mremap_test.c b/tools/testing/selftests/vm/mremap_test.c +index 2b3b4f15185f..e3ce33a9954e 100644 +--- a/tools/testing/selftests/vm/mremap_test.c ++++ b/tools/testing/selftests/vm/mremap_test.c +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + + #include "../kselftest.h" + +@@ -65,6 +66,30 @@ enum { + .expect_failure = should_fail \ + } + ++/* ++ * Returns false if the requested remap region overlaps with an ++ * existing mapping (e.g text, stack) else returns true. ++ */ ++static bool is_remap_region_valid(void *addr, unsigned long long size) ++{ ++ void *remap_addr = NULL; ++ bool ret = true; ++ ++ /* Use MAP_FIXED_NOREPLACE flag to ensure region is not mapped */ ++ remap_addr = mmap(addr, size, PROT_READ | PROT_WRITE, ++ MAP_FIXED_NOREPLACE | MAP_ANONYMOUS | MAP_SHARED, ++ -1, 0); ++ ++ if (remap_addr == MAP_FAILED) { ++ if (errno == EEXIST) ++ ret = false; ++ } else { ++ munmap(remap_addr, size); ++ } ++ ++ return ret; ++} ++ + /* Returns mmap_min_addr sysctl tunable from procfs */ + static unsigned long long get_mmap_min_addr(void) + { +@@ -112,8 +137,8 @@ static void *get_source_mapping(struct config c) + goto retry; + + src_addr = mmap((void *) addr, c.region_size, PROT_READ | PROT_WRITE, +- MAP_FIXED_NOREPLACE | MAP_ANONYMOUS | MAP_SHARED, +- -1, 0); ++ MAP_FIXED_NOREPLACE | MAP_ANONYMOUS | MAP_SHARED, ++ -1, 0); + if (src_addr == MAP_FAILED) { + if (errno == EPERM || errno == EEXIST) + goto retry; +@@ -180,9 +205,20 @@ static long long remap_region(struct config c, unsigned int threshold_mb, + if (!((unsigned long long) addr & c.dest_alignment)) + addr = (void *) ((unsigned long long) addr | c.dest_alignment); + ++ /* Don't destroy existing mappings unless expected to overlap */ ++ while (!is_remap_region_valid(addr, c.region_size) && !c.overlapping) { ++ /* Check for unsigned overflow */ ++ if (addr + c.dest_alignment < addr) { ++ ksft_print_msg("Couldn't find a valid region to remap to\n"); ++ ret = -1; ++ goto out; ++ } ++ addr += c.dest_alignment; ++ } ++ + clock_gettime(CLOCK_MONOTONIC, &t_start); + dest_addr = mremap(src_addr, c.region_size, c.region_size, +- MREMAP_MAYMOVE|MREMAP_FIXED, (char *) addr); ++ MREMAP_MAYMOVE|MREMAP_FIXED, (char *) addr); + clock_gettime(CLOCK_MONOTONIC, &t_end); + + if (dest_addr == MAP_FAILED) { +-- +2.35.1 + diff --git a/queue-5.15/series b/queue-5.15/series index 7e8f0ef3d3b..4ecf91caf29 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -42,3 +42,98 @@ riscv-patch_text-fixup-last-cpu-should-be-master.patch x86-pci-xen-disable-pci-msi-masking-for-xen_hvm-guests.patch iocost-don-t-reset-the-inuse-weight-of-under-weighted-debtors.patch virtio_net-fix-wrong-buf-address-calculation-when-using-xdp.patch +cpufreq-qcom-hw-fix-the-race-between-lmh-worker-and-.patch +cpufreq-qcom-cpufreq-hw-fix-throttle-frequency-value.patch +video-fbdev-udlfb-properly-check-endpoint-type.patch +arm64-dts-meson-remove-cpu-opps-below-1ghz-for-g12b-.patch +arm64-dts-meson-remove-cpu-opps-below-1ghz-for-sm1-b.patch +iio-imu-bmi160-disable-regulator-in-error-path.patch +mtd-rawnand-fix-ecc-parameters-for-mt7622.patch +xsk-fix-l2fwd-for-copy-mode-busy-poll-combo.patch +arm64-dts-imx8qm-correct-scu-clock-controller-s-comp.patch +usb-fix-xhci-event-ring-dequeue-pointer-erdp-update-.patch +arm-dts-imx6qdl-apalis-fix-sgtl5000-detection-issue.patch +arm64-dts-imx8mn-fix-sai-nodes.patch +arm64-dts-meson-sm1-bananapi-m5-fix-wrong-gpio-pin-l.patch +phy-samsung-fix-missing-of_node_put-in-exynos_sata_p.patch +phy-samsung-exynos5250-sata-fix-missing-device-put-i.patch +arm-omap2-fix-refcount-leak-in-omap_gic_of_init.patch +bus-ti-sysc-make-omap3-gpt12-quirk-handling-soc-spec.patch +arm-dts-dra7-fix-suspend-warning-for-vpe-powerdomain.patch +phy-ti-omap-usb2-fix-error-handling-in-omap_usb2_ena.patch +arm-dts-at91-map-mclk-for-wm8731-on-at91sam9g20ek.patch +arm-dts-at91-sama5d4_xplained-fix-pinctrl-phandle-na.patch +arm-dts-at91-fix-pinctrl-phandles.patch +phy-mapphone-mdm6600-fix-pm-error-handling-in-phy_md.patch +phy-ti-add-missing-pm_runtime_disable-in-serdes_am65.patch +interconnect-qcom-sdx55-drop-ip0-interconnects.patch +arm-dts-fix-mmc-order-for-omap3-gta04.patch +arm-dts-am3517-evm-fix-misc-pinmuxing.patch +arm-dts-logicpd-som-lv-fix-wrong-pinmuxing-on-omap35.patch +ipvs-correctly-print-the-memory-size-of-ip_vs_conn_t.patch +phy-amlogic-fix-error-path-in-phy_g12a_usb3_pcie_pro.patch +pinctrl-mediatek-moore-fix-build-error.patch +mtd-rawnand-fix-return-value-check-of-wait_for_compl.patch +mtd-fix-part-field-data-corruption-in-mtd_info.patch +pinctrl-stm32-do-not-call-stm32_gpio_get-for-edge-tr.patch +memory-renesas-rpc-if-fix-hf-ospi-data-transfer-in-m.patch +net-dsa-add-missing-of_node_put-in-dsa_port_link_reg.patch +netfilter-nft_set_rbtree-overlap-detection-with-elem.patch +bpf-lwt-fix-crash-when-using-bpf_skb_set_tunnel_key-.patch +pinctrl-rockchip-fix-rk3308-pinmux-bits.patch +tcp-md5-incorrect-tcp_header_len-for-incoming-connec.patch +pinctrl-stm32-keep-pinctrl-block-clock-enabled-when-.patch +tcp-ensure-to-use-the-most-recently-sent-skb-when-fi.patch +wireguard-device-check-for-metadata_dst-with-skb_val.patch +sctp-check-asoc-strreset_chunk-in-sctp_generate_reco.patch +arm-dts-imx6ull-colibri-fix-vqmmc-regulator.patch +arm64-dts-imx8mn-ddr4-evk-describe-the-32.768-khz-pm.patch +pinctrl-pistachio-fix-use-of-irq_of_parse_and_map.patch +cpufreq-fix-memory-leak-in-sun50i_cpufreq_nvmem_prob.patch +net-hns3-clear-inited-state-and-stop-client-after-fa.patch +net-hns3-modify-the-return-code-of-hclge_get_ring_ch.patch +net-hns3-add-validity-check-for-message-data-length.patch +net-hns3-add-return-value-for-mailbox-handling-in-pf.patch +net-smc-sync-err-code-when-tcp-connection-was-refuse.patch +ip_gre-make-o_seqno-start-from-0-in-native-mode.patch +ip6_gre-make-o_seqno-start-from-0-in-native-mode.patch +ip_gre-ip6_gre-fix-race-condition-on-o_seqno-in-coll.patch +tcp-fix-potential-xmit-stalls-caused-by-tcp_notsent_.patch +tcp-make-sure-treq-af_specific-is-initialized.patch +bus-sunxi-rsb-fix-the-return-value-of-sunxi_rsb_devi.patch +clk-sunxi-sun9i-mmc-check-return-value-after-calling.patch +cpufreq-qcom-cpufreq-hw-clear-dcvs-interrupts.patch +net-bcmgenet-hide-status-block-before-tx-timestampin.patch +net-phy-marvell10g-fix-return-value-on-error.patch +net-dsa-mv88e6xxx-fix-port_hidden_wait-to-account-fo.patch +drm-sun4i-remove-obsolete-references-to-phys_offset.patch +net-dsa-lantiq_gswip-don-t-set-gswip_mii_cfg_rmii_cl.patch +io_uring-check-reserved-fields-for-send-sendmsg.patch +io_uring-check-reserved-fields-for-recv-recvmsg.patch +netfilter-conntrack-fix-udp-offload-timeout-sysctl.patch +drm-amdkfd-fix-gws-queue-count.patch +drm-amd-display-fix-memory-leak-in-dcn21_clock_sourc.patch +tls-skip-tls_append_frag-on-zero-copy-size.patch +bnx2x-fix-napi-api-usage-sequence.patch +net-fec-add-missing-of_node_put-in-fec_enet_init_sto.patch +gfs2-prevent-endless-loops-in-gfs2_file_buffered_wri.patch +gfs2-minor-retry-logic-cleanup.patch +gfs2-make-sure-not-to-return-short-direct-writes.patch +gfs2-no-short-reads-or-writes-upon-glock-contention.patch +perf-arm-spe-fix-addresses-of-synthesized-spe-events.patch +ixgbe-ensure-ipsec-vf-pf-compatibility.patch +revert-ibmvnic-add-ethtool-private-flag-for-driver-d.patch +tcp-fix-f-rto-may-not-work-correctly-when-receiving-.patch +asoc-intel-soc-acpi-correct-device-endpoints-for-max.patch +asoc-wm8731-disable-the-regulator-when-probing-fails.patch +ext4-fix-bug_on-in-start_this_handle-during-umount-f.patch +arch-xtensa-platforms-fix-deadlock-in-rs_close.patch +ksmbd-increment-reference-count-of-parent-fp.patch +ksmbd-set-fixed-sector-size-to-fs_sector_size_inform.patch +bonding-do-not-discard-lowest-hash-bit-for-non-layer.patch +x86-__memcpy_flushcache-fix-wrong-alignment-if-size-.patch +cifs-destage-any-unwritten-data-to-the-server-before.patch +drivers-net-hippi-fix-deadlock-in-rr_close.patch +powerpc-perf-fix-32bit-compile.patch +selftest-vm-verify-mmap-addr-in-mremap_test.patch +selftest-vm-verify-remap-destination-address-in-mrem.patch diff --git a/queue-5.15/tcp-ensure-to-use-the-most-recently-sent-skb-when-fi.patch b/queue-5.15/tcp-ensure-to-use-the-most-recently-sent-skb-when-fi.patch new file mode 100644 index 00000000000..34d4d618810 --- /dev/null +++ b/queue-5.15/tcp-ensure-to-use-the-most-recently-sent-skb-when-fi.patch @@ -0,0 +1,102 @@ +From 10fc03e4cf1efbc1af61c43b359e6242854bf339 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Apr 2022 10:34:41 +0800 +Subject: tcp: ensure to use the most recently sent skb when filling the rate + sample + +From: Pengcheng Yang + +[ Upstream commit b253a0680ceadc5d7b4acca7aa2d870326cad8ad ] + +If an ACK (s)acks multiple skbs, we favor the information +from the most recently sent skb by choosing the skb with +the highest prior_delivered count. But in the interval +between receiving ACKs, we send multiple skbs with the same +prior_delivered, because the tp->delivered only changes +when we receive an ACK. + +We used RACK's solution, copying tcp_rack_sent_after() as +tcp_skb_sent_after() helper to determine "which packet was +sent last?". Later, we will use tcp_skb_sent_after() instead +in RACK. + +Fixes: b9f64820fb22 ("tcp: track data delivery rate for a TCP connection") +Signed-off-by: Pengcheng Yang +Cc: Paolo Abeni +Acked-by: Neal Cardwell +Tested-by: Neal Cardwell +Reviewed-by: Eric Dumazet +Link: https://lore.kernel.org/r/1650422081-22153-1-git-send-email-yangpc@wangsu.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + include/net/tcp.h | 6 ++++++ + net/ipv4/tcp_rate.c | 11 ++++++++--- + 2 files changed, 14 insertions(+), 3 deletions(-) + +diff --git a/include/net/tcp.h b/include/net/tcp.h +index 31d384c3778a..71a9aeae693d 100644 +--- a/include/net/tcp.h ++++ b/include/net/tcp.h +@@ -1026,6 +1026,7 @@ struct rate_sample { + int losses; /* number of packets marked lost upon ACK */ + u32 acked_sacked; /* number of packets newly (S)ACKed upon ACK */ + u32 prior_in_flight; /* in flight before this ACK */ ++ u32 last_end_seq; /* end_seq of most recently ACKed packet */ + bool is_app_limited; /* is sample from packet with bubble in pipe? */ + bool is_retrans; /* is sample from retransmission? */ + bool is_ack_delayed; /* is this (likely) a delayed ACK? */ +@@ -1148,6 +1149,11 @@ void tcp_rate_gen(struct sock *sk, u32 delivered, u32 lost, + bool is_sack_reneg, struct rate_sample *rs); + void tcp_rate_check_app_limited(struct sock *sk); + ++static inline bool tcp_skb_sent_after(u64 t1, u64 t2, u32 seq1, u32 seq2) ++{ ++ return t1 > t2 || (t1 == t2 && after(seq1, seq2)); ++} ++ + /* These functions determine how the current flow behaves in respect of SACK + * handling. SACK is negotiated with the peer, and therefore it can vary + * between different flows. +diff --git a/net/ipv4/tcp_rate.c b/net/ipv4/tcp_rate.c +index 0de693565963..6ab197928abb 100644 +--- a/net/ipv4/tcp_rate.c ++++ b/net/ipv4/tcp_rate.c +@@ -73,26 +73,31 @@ void tcp_rate_skb_sent(struct sock *sk, struct sk_buff *skb) + * + * If an ACK (s)acks multiple skbs (e.g., stretched-acks), this function is + * called multiple times. We favor the information from the most recently +- * sent skb, i.e., the skb with the highest prior_delivered count. ++ * sent skb, i.e., the skb with the most recently sent time and the highest ++ * sequence. + */ + void tcp_rate_skb_delivered(struct sock *sk, struct sk_buff *skb, + struct rate_sample *rs) + { + struct tcp_sock *tp = tcp_sk(sk); + struct tcp_skb_cb *scb = TCP_SKB_CB(skb); ++ u64 tx_tstamp; + + if (!scb->tx.delivered_mstamp) + return; + ++ tx_tstamp = tcp_skb_timestamp_us(skb); + if (!rs->prior_delivered || +- after(scb->tx.delivered, rs->prior_delivered)) { ++ tcp_skb_sent_after(tx_tstamp, tp->first_tx_mstamp, ++ scb->end_seq, rs->last_end_seq)) { + rs->prior_delivered = scb->tx.delivered; + rs->prior_mstamp = scb->tx.delivered_mstamp; + rs->is_app_limited = scb->tx.is_app_limited; + rs->is_retrans = scb->sacked & TCPCB_RETRANS; ++ rs->last_end_seq = scb->end_seq; + + /* Record send time of most recently ACKed packet: */ +- tp->first_tx_mstamp = tcp_skb_timestamp_us(skb); ++ tp->first_tx_mstamp = tx_tstamp; + /* Find the duration of the "send phase" of this window: */ + rs->interval_us = tcp_stamp_us_delta(tp->first_tx_mstamp, + scb->tx.first_tx_mstamp); +-- +2.35.1 + diff --git a/queue-5.15/tcp-fix-f-rto-may-not-work-correctly-when-receiving-.patch b/queue-5.15/tcp-fix-f-rto-may-not-work-correctly-when-receiving-.patch new file mode 100644 index 00000000000..6faed097627 --- /dev/null +++ b/queue-5.15/tcp-fix-f-rto-may-not-work-correctly-when-receiving-.patch @@ -0,0 +1,88 @@ +From 16e0e64b22eda01f6ca7417d427bbe32d02ce0e7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Apr 2022 18:03:39 +0800 +Subject: tcp: fix F-RTO may not work correctly when receiving DSACK + +From: Pengcheng Yang + +[ Upstream commit d9157f6806d1499e173770df1f1b234763de5c79 ] + +Currently DSACK is regarded as a dupack, which may cause +F-RTO to incorrectly enter "loss was real" when receiving +DSACK. + +Packetdrill to demonstrate: + +// Enable F-RTO and TLP + 0 `sysctl -q net.ipv4.tcp_frto=2` + 0 `sysctl -q net.ipv4.tcp_early_retrans=3` + 0 `sysctl -q net.ipv4.tcp_congestion_control=cubic` + +// Establish a connection + +0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 + +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 + +0 bind(3, ..., ...) = 0 + +0 listen(3, 1) = 0 + +// RTT 10ms, RTO 210ms + +.1 < S 0:0(0) win 32792 + +0 > S. 0:0(0) ack 1 <...> + +.01 < . 1:1(0) ack 1 win 257 + +0 accept(3, ..., ...) = 4 + +// Send 2 data segments + +0 write(4, ..., 2000) = 2000 + +0 > P. 1:2001(2000) ack 1 + +// TLP ++.022 > P. 1001:2001(1000) ack 1 + +// Continue to send 8 data segments + +0 write(4, ..., 10000) = 10000 + +0 > P. 2001:10001(8000) ack 1 + +// RTO ++.188 > . 1:1001(1000) ack 1 + +// The original data is acked and new data is sent(F-RTO step 2.b) + +0 < . 1:1(0) ack 2001 win 257 + +0 > P. 10001:12001(2000) ack 1 + +// D-SACK caused by TLP is regarded as a dupack, this results in +// the incorrect judgment of "loss was real"(F-RTO step 3.a) ++.022 < . 1:1(0) ack 2001 win 257 + +// Never-retransmitted data(3001:4001) are acked and +// expect to switch to open state(F-RTO step 3.b) + +0 < . 1:1(0) ack 4001 win 257 ++0 %{ assert tcpi_ca_state == 0, tcpi_ca_state }% + +Fixes: e33099f96d99 ("tcp: implement RFC5682 F-RTO") +Signed-off-by: Pengcheng Yang +Acked-by: Neal Cardwell +Tested-by: Neal Cardwell +Reviewed-by: Eric Dumazet +Link: https://lore.kernel.org/r/1650967419-2150-1-git-send-email-yangpc@wangsu.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/ipv4/tcp_input.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c +index 6bd283b58bb8..dfd32cd3b95e 100644 +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -3860,7 +3860,8 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) + tcp_process_tlp_ack(sk, ack, flag); + + if (tcp_ack_is_dubious(sk, flag)) { +- if (!(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP))) { ++ if (!(flag & (FLAG_SND_UNA_ADVANCED | ++ FLAG_NOT_DUP | FLAG_DSACKING_ACK))) { + num_dupack = 1; + /* Consider if pure acks were aggregated in tcp_add_backlog() */ + if (!(flag & FLAG_DATA)) +-- +2.35.1 + diff --git a/queue-5.15/tcp-fix-potential-xmit-stalls-caused-by-tcp_notsent_.patch b/queue-5.15/tcp-fix-potential-xmit-stalls-caused-by-tcp_notsent_.patch new file mode 100644 index 00000000000..250206ce9ca --- /dev/null +++ b/queue-5.15/tcp-fix-potential-xmit-stalls-caused-by-tcp_notsent_.patch @@ -0,0 +1,145 @@ +From a599e8a7afdfd7fea94876bb760eec7153e9ad88 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Apr 2022 17:34:07 -0700 +Subject: tcp: fix potential xmit stalls caused by TCP_NOTSENT_LOWAT + +From: Eric Dumazet + +[ Upstream commit 4bfe744ff1644fbc0a991a2677dc874475dd6776 ] + +I had this bug sitting for too long in my pile, it is time to fix it. + +Thanks to Doug Porter for reminding me of it! + +We had various attempts in the past, including commit +0cbe6a8f089e ("tcp: remove SOCK_QUEUE_SHRUNK"), +but the issue is that TCP stack currently only generates +EPOLLOUT from input path, when tp->snd_una has advanced +and skb(s) cleaned from rtx queue. + +If a flow has a big RTT, and/or receives SACKs, it is possible +that the notsent part (tp->write_seq - tp->snd_nxt) reaches 0 +and no more data can be sent until tp->snd_una finally advances. + +What is needed is to also check if POLLOUT needs to be generated +whenever tp->snd_nxt is advanced, from output path. + +This bug triggers more often after an idle period, as +we do not receive ACK for at least one RTT. tcp_notsent_lowat +could be a fraction of what CWND and pacing rate would allow to +send during this RTT. + +In a followup patch, I will remove the bogus call +to tcp_chrono_stop(sk, TCP_CHRONO_SNDBUF_LIMITED) +from tcp_check_space(). Fact that we have decided to generate +an EPOLLOUT does not mean the application has immediately +refilled the transmit queue. This optimistic call +might have been the reason the bug seemed not too serious. + +Tested: + +200 ms rtt, 1% packet loss, 32 MB tcp_rmem[2] and tcp_wmem[2] + +$ echo 500000 >/proc/sys/net/ipv4/tcp_notsent_lowat +$ cat bench_rr.sh +SUM=0 +for i in {1..10} +do + V=`netperf -H remote_host -l30 -t TCP_RR -- -r 10000000,10000 -o LOCAL_BYTES_SENT | egrep -v "MIGRATED|Bytes"` + echo $V + SUM=$(($SUM + $V)) +done +echo SUM=$SUM + +Before patch: +$ bench_rr.sh +130000000 +80000000 +140000000 +140000000 +140000000 +140000000 +130000000 +40000000 +90000000 +110000000 +SUM=1140000000 + +After patch: +$ bench_rr.sh +430000000 +590000000 +530000000 +450000000 +450000000 +350000000 +450000000 +490000000 +480000000 +460000000 +SUM=4680000000 # This is 410 % of the value before patch. + +Fixes: c9bee3b7fdec ("tcp: TCP_NOTSENT_LOWAT socket option") +Signed-off-by: Eric Dumazet +Reported-by: Doug Porter +Cc: Soheil Hassas Yeganeh +Cc: Neal Cardwell +Acked-by: Soheil Hassas Yeganeh +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + include/net/tcp.h | 1 + + net/ipv4/tcp_input.c | 12 +++++++++++- + net/ipv4/tcp_output.c | 1 + + 3 files changed, 13 insertions(+), 1 deletion(-) + +diff --git a/include/net/tcp.h b/include/net/tcp.h +index 71a9aeae693d..89d231477ef4 100644 +--- a/include/net/tcp.h ++++ b/include/net/tcp.h +@@ -608,6 +608,7 @@ void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req); + void tcp_reset(struct sock *sk, struct sk_buff *skb); + void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff *skb); + void tcp_fin(struct sock *sk); ++void tcp_check_space(struct sock *sk); + + /* tcp_timer.c */ + void tcp_init_xmit_timers(struct sock *); +diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c +index 509f577869d4..6bd283b58bb8 100644 +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -5420,7 +5420,17 @@ static void tcp_new_space(struct sock *sk) + INDIRECT_CALL_1(sk->sk_write_space, sk_stream_write_space, sk); + } + +-static void tcp_check_space(struct sock *sk) ++/* Caller made space either from: ++ * 1) Freeing skbs in rtx queues (after tp->snd_una has advanced) ++ * 2) Sent skbs from output queue (and thus advancing tp->snd_nxt) ++ * ++ * We might be able to generate EPOLLOUT to the application if: ++ * 1) Space consumed in output/rtx queues is below sk->sk_sndbuf/2 ++ * 2) notsent amount (tp->write_seq - tp->snd_nxt) became ++ * small enough that tcp_stream_memory_free() decides it ++ * is time to generate EPOLLOUT. ++ */ ++void tcp_check_space(struct sock *sk) + { + /* pairs with tcp_poll() */ + smp_mb(); +diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c +index 369752f5f676..df413282fa2e 100644 +--- a/net/ipv4/tcp_output.c ++++ b/net/ipv4/tcp_output.c +@@ -82,6 +82,7 @@ static void tcp_event_new_data_sent(struct sock *sk, struct sk_buff *skb) + + NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPORIGDATASENT, + tcp_skb_pcount(skb)); ++ tcp_check_space(sk); + } + + /* SND.NXT, if window was not shrunk or the amount of shrunk was less than one +-- +2.35.1 + diff --git a/queue-5.15/tcp-make-sure-treq-af_specific-is-initialized.patch b/queue-5.15/tcp-make-sure-treq-af_specific-is-initialized.patch new file mode 100644 index 00000000000..f4e4a51daf2 --- /dev/null +++ b/queue-5.15/tcp-make-sure-treq-af_specific-is-initialized.patch @@ -0,0 +1,145 @@ +From 17701da7ebebb246cdf8c992137164047daa7d75 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Apr 2022 13:35:09 -0700 +Subject: tcp: make sure treq->af_specific is initialized + +From: Eric Dumazet + +[ Upstream commit ba5a4fdd63ae0c575707030db0b634b160baddd7 ] + +syzbot complained about a recent change in TCP stack, +hitting a NULL pointer [1] + +tcp request sockets have an af_specific pointer, which +was used before the blamed change only for SYNACK generation +in non SYNCOOKIE mode. + +tcp requests sockets momentarily created when third packet +coming from client in SYNCOOKIE mode were not using +treq->af_specific. + +Make sure this field is populated, in the same way normal +TCP requests sockets do in tcp_conn_request(). + +[1] +TCP: request_sock_TCPv6: Possible SYN flooding on port 20002. Sending cookies. Check SNMP counters. +general protection fault, probably for non-canonical address 0xdffffc0000000001: 0000 [#1] PREEMPT SMP KASAN +KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f] +CPU: 1 PID: 3695 Comm: syz-executor864 Not tainted 5.18.0-rc3-syzkaller-00224-g5fd1fe4807f9 #0 +Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 +RIP: 0010:tcp_create_openreq_child+0xe16/0x16b0 net/ipv4/tcp_minisocks.c:534 +Code: 48 c1 ea 03 80 3c 02 00 0f 85 e5 07 00 00 4c 8b b3 28 01 00 00 48 b8 00 00 00 00 00 fc ff df 49 8d 7e 08 48 89 fa 48 c1 ea 03 <80> 3c 02 00 0f 85 c9 07 00 00 48 8b 3c 24 48 89 de 41 ff 56 08 48 +RSP: 0018:ffffc90000de0588 EFLAGS: 00010202 +RAX: dffffc0000000000 RBX: ffff888076490330 RCX: 0000000000000100 +RDX: 0000000000000001 RSI: ffffffff87d67ff0 RDI: 0000000000000008 +RBP: ffff88806ee1c7f8 R08: 0000000000000000 R09: 0000000000000000 +R10: ffffffff87d67f00 R11: 0000000000000000 R12: ffff88806ee1bfc0 +R13: ffff88801b0e0368 R14: 0000000000000000 R15: 0000000000000000 +FS: 00007f517fe58700(0000) GS:ffff8880b9d00000(0000) knlGS:0000000000000000 +CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +CR2: 00007ffcead76960 CR3: 000000006f97b000 CR4: 00000000003506e0 +DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 +DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 +Call Trace: + + tcp_v6_syn_recv_sock+0x199/0x23b0 net/ipv6/tcp_ipv6.c:1267 + tcp_get_cookie_sock+0xc9/0x850 net/ipv4/syncookies.c:207 + cookie_v6_check+0x15c3/0x2340 net/ipv6/syncookies.c:258 + tcp_v6_cookie_check net/ipv6/tcp_ipv6.c:1131 [inline] + tcp_v6_do_rcv+0x1148/0x13b0 net/ipv6/tcp_ipv6.c:1486 + tcp_v6_rcv+0x3305/0x3840 net/ipv6/tcp_ipv6.c:1725 + ip6_protocol_deliver_rcu+0x2e9/0x1900 net/ipv6/ip6_input.c:422 + ip6_input_finish+0x14c/0x2c0 net/ipv6/ip6_input.c:464 + NF_HOOK include/linux/netfilter.h:307 [inline] + NF_HOOK include/linux/netfilter.h:301 [inline] + ip6_input+0x9c/0xd0 net/ipv6/ip6_input.c:473 + dst_input include/net/dst.h:461 [inline] + ip6_rcv_finish net/ipv6/ip6_input.c:76 [inline] + NF_HOOK include/linux/netfilter.h:307 [inline] + NF_HOOK include/linux/netfilter.h:301 [inline] + ipv6_rcv+0x27f/0x3b0 net/ipv6/ip6_input.c:297 + __netif_receive_skb_one_core+0x114/0x180 net/core/dev.c:5405 + __netif_receive_skb+0x24/0x1b0 net/core/dev.c:5519 + process_backlog+0x3a0/0x7c0 net/core/dev.c:5847 + __napi_poll+0xb3/0x6e0 net/core/dev.c:6413 + napi_poll net/core/dev.c:6480 [inline] + net_rx_action+0x8ec/0xc60 net/core/dev.c:6567 + __do_softirq+0x29b/0x9c2 kernel/softirq.c:558 + invoke_softirq kernel/softirq.c:432 [inline] + __irq_exit_rcu+0x123/0x180 kernel/softirq.c:637 + irq_exit_rcu+0x5/0x20 kernel/softirq.c:649 + sysvec_apic_timer_interrupt+0x93/0xc0 arch/x86/kernel/apic/apic.c:1097 + +Fixes: 5b0b9e4c2c89 ("tcp: md5: incorrect tcp_header_len for incoming connections") +Signed-off-by: Eric Dumazet +Cc: Francesco Ruggeri +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + include/net/tcp.h | 1 + + net/ipv4/syncookies.c | 8 +++++++- + net/ipv6/syncookies.c | 3 ++- + 3 files changed, 10 insertions(+), 2 deletions(-) + +diff --git a/include/net/tcp.h b/include/net/tcp.h +index 89d231477ef4..91ac329ca578 100644 +--- a/include/net/tcp.h ++++ b/include/net/tcp.h +@@ -470,6 +470,7 @@ int __cookie_v4_check(const struct iphdr *iph, const struct tcphdr *th, + u32 cookie); + struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb); + struct request_sock *cookie_tcp_reqsk_alloc(const struct request_sock_ops *ops, ++ const struct tcp_request_sock_ops *af_ops, + struct sock *sk, struct sk_buff *skb); + #ifdef CONFIG_SYN_COOKIES + +diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c +index 33792cf55a79..10b469aee492 100644 +--- a/net/ipv4/syncookies.c ++++ b/net/ipv4/syncookies.c +@@ -283,6 +283,7 @@ bool cookie_ecn_ok(const struct tcp_options_received *tcp_opt, + EXPORT_SYMBOL(cookie_ecn_ok); + + struct request_sock *cookie_tcp_reqsk_alloc(const struct request_sock_ops *ops, ++ const struct tcp_request_sock_ops *af_ops, + struct sock *sk, + struct sk_buff *skb) + { +@@ -299,6 +300,10 @@ struct request_sock *cookie_tcp_reqsk_alloc(const struct request_sock_ops *ops, + return NULL; + + treq = tcp_rsk(req); ++ ++ /* treq->af_specific might be used to perform TCP_MD5 lookup */ ++ treq->af_specific = af_ops; ++ + treq->syn_tos = TCP_SKB_CB(skb)->ip_dsfield; + #if IS_ENABLED(CONFIG_MPTCP) + treq->is_mptcp = sk_is_mptcp(sk); +@@ -366,7 +371,8 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) + goto out; + + ret = NULL; +- req = cookie_tcp_reqsk_alloc(&tcp_request_sock_ops, sk, skb); ++ req = cookie_tcp_reqsk_alloc(&tcp_request_sock_ops, ++ &tcp_request_sock_ipv4_ops, sk, skb); + if (!req) + goto out; + +diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c +index e8cfb9e997bf..ca92dd6981de 100644 +--- a/net/ipv6/syncookies.c ++++ b/net/ipv6/syncookies.c +@@ -170,7 +170,8 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) + goto out; + + ret = NULL; +- req = cookie_tcp_reqsk_alloc(&tcp6_request_sock_ops, sk, skb); ++ req = cookie_tcp_reqsk_alloc(&tcp6_request_sock_ops, ++ &tcp_request_sock_ipv6_ops, sk, skb); + if (!req) + goto out; + +-- +2.35.1 + diff --git a/queue-5.15/tcp-md5-incorrect-tcp_header_len-for-incoming-connec.patch b/queue-5.15/tcp-md5-incorrect-tcp_header_len-for-incoming-connec.patch new file mode 100644 index 00000000000..6be8a36565c --- /dev/null +++ b/queue-5.15/tcp-md5-incorrect-tcp_header_len-for-incoming-connec.patch @@ -0,0 +1,40 @@ +From 3624604e284a72dab940def70428de86c266a571 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Apr 2022 17:50:26 -0700 +Subject: tcp: md5: incorrect tcp_header_len for incoming connections + +From: Francesco Ruggeri + +[ Upstream commit 5b0b9e4c2c895227c8852488b3f09839233bba54 ] + +In tcp_create_openreq_child we adjust tcp_header_len for md5 using the +remote address in newsk. But that address is still 0 in newsk at this +point, and it is only set later by the callers (tcp_v[46]_syn_recv_sock). +Use the address from the request socket instead. + +Fixes: cfb6eeb4c860 ("[TCP]: MD5 Signature Option (RFC2385) support.") +Signed-off-by: Francesco Ruggeri +Reviewed-by: Eric Dumazet +Link: https://lore.kernel.org/r/20220421005026.686A45EC01F2@us226.sjc.aristanetworks.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/ipv4/tcp_minisocks.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c +index 0a4f3f16140a..13783fc58e03 100644 +--- a/net/ipv4/tcp_minisocks.c ++++ b/net/ipv4/tcp_minisocks.c +@@ -538,7 +538,7 @@ struct sock *tcp_create_openreq_child(const struct sock *sk, + newtp->tsoffset = treq->ts_off; + #ifdef CONFIG_TCP_MD5SIG + newtp->md5sig_info = NULL; /*XXX*/ +- if (newtp->af_specific->md5_lookup(sk, newsk)) ++ if (treq->af_specific->req_md5_lookup(sk, req_to_sk(req))) + newtp->tcp_header_len += TCPOLEN_MD5SIG_ALIGNED; + #endif + if (skb->len >= TCP_MSS_DEFAULT + newtp->tcp_header_len) +-- +2.35.1 + diff --git a/queue-5.15/tls-skip-tls_append_frag-on-zero-copy-size.patch b/queue-5.15/tls-skip-tls_append_frag-on-zero-copy-size.patch new file mode 100644 index 00000000000..d16af0703e2 --- /dev/null +++ b/queue-5.15/tls-skip-tls_append_frag-on-zero-copy-size.patch @@ -0,0 +1,59 @@ +From afa57dee8380c2ed6c37bfeea5008e7dceb411a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Apr 2022 18:49:49 +0300 +Subject: tls: Skip tls_append_frag on zero copy size + +From: Maxim Mikityanskiy + +[ Upstream commit a0df71948e9548de819a6f1da68f5f1742258a52 ] + +Calling tls_append_frag when max_open_record_len == record->len might +add an empty fragment to the TLS record if the call happens to be on the +page boundary. Normally tls_append_frag coalesces the zero-sized +fragment to the previous one, but not if it's on page boundary. + +If a resync happens then, the mlx5 driver posts dump WQEs in +tx_post_resync_dump, and the empty fragment may become a data segment +with byte_count == 0, which will confuse the NIC and lead to a CQE +error. + +This commit fixes the described issue by skipping tls_append_frag on +zero size to avoid adding empty fragments. The fix is not in the driver, +because an empty fragment is hardly the desired behavior. + +Fixes: e8f69799810c ("net/tls: Add generic NIC offload infrastructure") +Signed-off-by: Maxim Mikityanskiy +Reviewed-by: Tariq Toukan +Link: https://lore.kernel.org/r/20220426154949.159055-1-maximmi@nvidia.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/tls/tls_device.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c +index b932469ee69c..a40553e83f8b 100644 +--- a/net/tls/tls_device.c ++++ b/net/tls/tls_device.c +@@ -483,11 +483,13 @@ static int tls_push_data(struct sock *sk, + copy = min_t(size_t, size, (pfrag->size - pfrag->offset)); + copy = min_t(size_t, copy, (max_open_record_len - record->len)); + +- rc = tls_device_copy_data(page_address(pfrag->page) + +- pfrag->offset, copy, msg_iter); +- if (rc) +- goto handle_error; +- tls_append_frag(record, pfrag, copy); ++ if (copy) { ++ rc = tls_device_copy_data(page_address(pfrag->page) + ++ pfrag->offset, copy, msg_iter); ++ if (rc) ++ goto handle_error; ++ tls_append_frag(record, pfrag, copy); ++ } + + size -= copy; + if (!size) { +-- +2.35.1 + diff --git a/queue-5.15/usb-fix-xhci-event-ring-dequeue-pointer-erdp-update-.patch b/queue-5.15/usb-fix-xhci-event-ring-dequeue-pointer-erdp-update-.patch new file mode 100644 index 00000000000..f27bc0aa796 --- /dev/null +++ b/queue-5.15/usb-fix-xhci-event-ring-dequeue-pointer-erdp-update-.patch @@ -0,0 +1,64 @@ +From ea87f879c752e7ecc7c1ae440dbfe8ffe56f3b69 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Apr 2022 16:48:21 +0300 +Subject: USB: Fix xhci event ring dequeue pointer ERDP update issue + +From: Weitao Wang + +[ Upstream commit e91ac20889d1a26d077cc511365cd7ff4346a6f3 ] + +In some situations software handles TRB events slower than adding TRBs. +If the number of TRB events to be processed in a given interrupt is exactly +the same as the event ring size 256, then the local variable +"event_ring_deq" that holds the initial dequeue position is equal to +software_dequeue after handling all 256 interrupts. + +It will cause driver to not update ERDP to hardware, + +Software dequeue pointer is out of sync with ERDP on interrupt exit. +On the next interrupt, the event ring may full but driver will not +update ERDP as software_dequeue is equal to ERDP. + +[ 536.377115] xhci_hcd 0000:00:12.0: ERROR unknown event type 37 +[ 566.933173] sd 8:0:0:0: [sdb] tag#27 uas_eh_abort_handler 0 uas-tag 7 inflight: CMD OUT +[ 566.933181] sd 8:0:0:0: [sdb] tag#27 CDB: Write(10) 2a 00 17 71 e6 78 00 00 08 00 +[ 572.041186] xhci_hcd On some situataions,the0000:00:12.0: xHCI host not responding to stop endpoint command. +[ 572.057193] xhci_hcd 0000:00:12.0: Host halt failed, -110 +[ 572.057196] xhci_hcd 0000:00:12.0: xHCI host controller not responding, assume dead +[ 572.057236] sd 8:0:0:0: [sdb] tag#26 uas_eh_abort_handler 0 uas-tag 6 inflight: CMD +[ 572.057240] sd 8:0:0:0: [sdb] tag#26 CDB: Write(10) 2a 00 38 eb cc d8 00 00 08 00 +[ 572.057244] sd 8:0:0:0: [sdb] tag#25 uas_eh_abort_handler 0 uas-tag 5 inflight: CMD + +Hardware ERDP is updated mid event handling if there are more than 128 +events in an interrupt (half of ring size). +Fix this by updating the software local variable at the same time as +hardware ERDP. + +[commit message rewording -Mathias] + +Fixes: dc0ffbea5729 ("usb: host: xhci: update event ring dequeue pointer on purpose") +Reviewed-by: Peter Chen +Signed-off-by: Weitao Wang +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20220408134823.2527272-2-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci-ring.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c +index d0b6806275e0..f9707997969d 100644 +--- a/drivers/usb/host/xhci-ring.c ++++ b/drivers/usb/host/xhci-ring.c +@@ -3141,6 +3141,7 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) + if (event_loop++ < TRBS_PER_SEGMENT / 2) + continue; + xhci_update_erst_dequeue(xhci, event_ring_deq); ++ event_ring_deq = xhci->event_ring->dequeue; + + /* ring is half-full, force isoc trbs to interrupt more often */ + if (xhci->isoc_bei_interval > AVOID_BEI_INTERVAL_MIN) +-- +2.35.1 + diff --git a/queue-5.15/video-fbdev-udlfb-properly-check-endpoint-type.patch b/queue-5.15/video-fbdev-udlfb-properly-check-endpoint-type.patch new file mode 100644 index 00000000000..ebef72fb6bd --- /dev/null +++ b/queue-5.15/video-fbdev-udlfb-properly-check-endpoint-type.patch @@ -0,0 +1,92 @@ +From 84a231a18580204155d81cc8a7466cc04a650e30 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 22 Mar 2022 23:04:38 +0300 +Subject: video: fbdev: udlfb: properly check endpoint type + +From: Pavel Skripkin + +[ Upstream commit aaf7dbe07385e0b8deb7237eca2a79926bbc7091 ] + +syzbot reported warning in usb_submit_urb, which is caused by wrong +endpoint type. + +This driver uses out bulk endpoint for communication, so +let's check if this endpoint is present and bail out early if not. + +Fail log: + +usb 1-1: BOGUS urb xfer, pipe 3 != type 1 +WARNING: CPU: 0 PID: 4822 at drivers/usb/core/urb.c:493 usb_submit_urb+0xd27/0x1540 drivers/usb/core/urb.c:493 +Modules linked in: +CPU: 0 PID: 4822 Comm: kworker/0:3 Tainted: G W 5.13.0-syzkaller #0 +... +Workqueue: usb_hub_wq hub_event +RIP: 0010:usb_submit_urb+0xd27/0x1540 drivers/usb/core/urb.c:493 +... +Call Trace: + dlfb_submit_urb+0x89/0x160 drivers/video/fbdev/udlfb.c:1969 + dlfb_set_video_mode+0x21f0/0x2950 drivers/video/fbdev/udlfb.c:315 + dlfb_ops_set_par+0x2a3/0x840 drivers/video/fbdev/udlfb.c:1110 + dlfb_usb_probe.cold+0x113e/0x1f4a drivers/video/fbdev/udlfb.c:1732 + usb_probe_interface+0x315/0x7f0 drivers/usb/core/driver.c:396 + +Fixes: 88e58b1a42f8 ("Staging: add udlfb driver") +Reported-and-tested-by: syzbot+53ce4a4246d0fe0fee34@syzkaller.appspotmail.com +Signed-off-by: Pavel Skripkin +Signed-off-by: Helge Deller +Signed-off-by: Sasha Levin +--- + drivers/video/fbdev/udlfb.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/drivers/video/fbdev/udlfb.c b/drivers/video/fbdev/udlfb.c +index 90f48b71fd8f..d9eec1b60e66 100644 +--- a/drivers/video/fbdev/udlfb.c ++++ b/drivers/video/fbdev/udlfb.c +@@ -1649,8 +1649,9 @@ static int dlfb_usb_probe(struct usb_interface *intf, + const struct device_attribute *attr; + struct dlfb_data *dlfb; + struct fb_info *info; +- int retval = -ENOMEM; ++ int retval; + struct usb_device *usbdev = interface_to_usbdev(intf); ++ struct usb_endpoint_descriptor *out; + + /* usb initialization */ + dlfb = kzalloc(sizeof(*dlfb), GFP_KERNEL); +@@ -1664,6 +1665,12 @@ static int dlfb_usb_probe(struct usb_interface *intf, + dlfb->udev = usb_get_dev(usbdev); + usb_set_intfdata(intf, dlfb); + ++ retval = usb_find_common_endpoints(intf->cur_altsetting, NULL, &out, NULL, NULL); ++ if (retval) { ++ dev_err(&intf->dev, "Device should have at lease 1 bulk endpoint!\n"); ++ goto error; ++ } ++ + dev_dbg(&intf->dev, "console enable=%d\n", console); + dev_dbg(&intf->dev, "fb_defio enable=%d\n", fb_defio); + dev_dbg(&intf->dev, "shadow enable=%d\n", shadow); +@@ -1673,6 +1680,7 @@ static int dlfb_usb_probe(struct usb_interface *intf, + if (!dlfb_parse_vendor_descriptor(dlfb, intf)) { + dev_err(&intf->dev, + "firmware not recognized, incompatible device?\n"); ++ retval = -ENODEV; + goto error; + } + +@@ -1686,8 +1694,10 @@ static int dlfb_usb_probe(struct usb_interface *intf, + + /* allocates framebuffer driver structure, not framebuffer memory */ + info = framebuffer_alloc(0, &dlfb->udev->dev); +- if (!info) ++ if (!info) { ++ retval = -ENOMEM; + goto error; ++ } + + dlfb->info = info; + info->par = dlfb; +-- +2.35.1 + diff --git a/queue-5.15/wireguard-device-check-for-metadata_dst-with-skb_val.patch b/queue-5.15/wireguard-device-check-for-metadata_dst-with-skb_val.patch new file mode 100644 index 00000000000..c94e9d5d815 --- /dev/null +++ b/queue-5.15/wireguard-device-check-for-metadata_dst-with-skb_val.patch @@ -0,0 +1,103 @@ +From e102256f5cab82d297dc3121b56bcca4d363df0e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Apr 2022 15:48:05 +0200 +Subject: wireguard: device: check for metadata_dst with skb_valid_dst() + +From: Nikolay Aleksandrov + +[ Upstream commit 45ac774c33d834fe9d4de06ab5f1022fe8cd2071 ] + +When we try to transmit an skb with md_dst attached through wireguard +we hit a null pointer dereference in wg_xmit() due to the use of +dst_mtu() which calls into dst_blackhole_mtu() which in turn tries to +dereference dst->dev. + +Since wireguard doesn't use md_dsts we should use skb_valid_dst(), which +checks for DST_METADATA flag, and if it's set, then falls back to +wireguard's device mtu. That gives us the best chance of transmitting +the packet; otherwise if the blackhole netdev is used we'd get +ETH_MIN_MTU. + + [ 263.693506] BUG: kernel NULL pointer dereference, address: 00000000000000e0 + [ 263.693908] #PF: supervisor read access in kernel mode + [ 263.694174] #PF: error_code(0x0000) - not-present page + [ 263.694424] PGD 0 P4D 0 + [ 263.694653] Oops: 0000 [#1] PREEMPT SMP NOPTI + [ 263.694876] CPU: 5 PID: 951 Comm: mausezahn Kdump: loaded Not tainted 5.18.0-rc1+ #522 + [ 263.695190] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1.fc35 04/01/2014 + [ 263.695529] RIP: 0010:dst_blackhole_mtu+0x17/0x20 + [ 263.695770] Code: 00 00 00 0f 1f 44 00 00 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 8b 47 10 48 83 e0 fc 8b 40 04 85 c0 75 09 48 8b 07 <8b> 80 e0 00 00 00 c3 66 90 0f 1f 44 00 00 48 89 d7 be 01 00 00 00 + [ 263.696339] RSP: 0018:ffffa4a4422fbb28 EFLAGS: 00010246 + [ 263.696600] RAX: 0000000000000000 RBX: ffff8ac9c3553000 RCX: 0000000000000000 + [ 263.696891] RDX: 0000000000000401 RSI: 00000000fffffe01 RDI: ffffc4a43fb48900 + [ 263.697178] RBP: ffffa4a4422fbb90 R08: ffffffff9622635e R09: 0000000000000002 + [ 263.697469] R10: ffffffff9b69a6c0 R11: ffffa4a4422fbd0c R12: ffff8ac9d18b1a00 + [ 263.697766] R13: ffff8ac9d0ce1840 R14: ffff8ac9d18b1a00 R15: ffff8ac9c3553000 + [ 263.698054] FS: 00007f3704c337c0(0000) GS:ffff8acaebf40000(0000) knlGS:0000000000000000 + [ 263.698470] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 + [ 263.698826] CR2: 00000000000000e0 CR3: 0000000117a5c000 CR4: 00000000000006e0 + [ 263.699214] Call Trace: + [ 263.699505] + [ 263.699759] wg_xmit+0x411/0x450 + [ 263.700059] ? bpf_skb_set_tunnel_key+0x46/0x2d0 + [ 263.700382] ? dev_queue_xmit_nit+0x31/0x2b0 + [ 263.700719] dev_hard_start_xmit+0xd9/0x220 + [ 263.701047] __dev_queue_xmit+0x8b9/0xd30 + [ 263.701344] __bpf_redirect+0x1a4/0x380 + [ 263.701664] __dev_queue_xmit+0x83b/0xd30 + [ 263.701961] ? packet_parse_headers+0xb4/0xf0 + [ 263.702275] packet_sendmsg+0x9a8/0x16a0 + [ 263.702596] ? _raw_spin_unlock_irqrestore+0x23/0x40 + [ 263.702933] sock_sendmsg+0x5e/0x60 + [ 263.703239] __sys_sendto+0xf0/0x160 + [ 263.703549] __x64_sys_sendto+0x20/0x30 + [ 263.703853] do_syscall_64+0x3b/0x90 + [ 263.704162] entry_SYSCALL_64_after_hwframe+0x44/0xae + [ 263.704494] RIP: 0033:0x7f3704d50506 + [ 263.704789] Code: 48 c7 c0 ff ff ff ff eb b7 66 2e 0f 1f 84 00 00 00 00 00 90 41 89 ca 64 8b 04 25 18 00 00 00 85 c0 75 11 b8 2c 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 72 c3 90 55 48 83 ec 30 44 89 4c 24 2c 4c 89 + [ 263.705652] RSP: 002b:00007ffe954b0b88 EFLAGS: 00000246 ORIG_RAX: 000000000000002c + [ 263.706141] RAX: ffffffffffffffda RBX: 0000558bb259b490 RCX: 00007f3704d50506 + [ 263.706544] RDX: 000000000000004a RSI: 0000558bb259b7b2 RDI: 0000000000000003 + [ 263.706952] RBP: 0000000000000000 R08: 00007ffe954b0b90 R09: 0000000000000014 + [ 263.707339] R10: 0000000000000000 R11: 0000000000000246 R12: 00007ffe954b0b90 + [ 263.707735] R13: 000000000000004a R14: 0000558bb259b7b2 R15: 0000000000000001 + [ 263.708132] + [ 263.708398] Modules linked in: bridge netconsole bonding [last unloaded: bridge] + [ 263.708942] CR2: 00000000000000e0 + +Fixes: e7096c131e51 ("net: WireGuard secure network tunnel") +Link: https://github.com/cilium/cilium/issues/19428 +Reported-by: Martynas Pumputis +Signed-off-by: Nikolay Aleksandrov +Acked-by: Daniel Borkmann +Signed-off-by: Jason A. Donenfeld +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/wireguard/device.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireguard/device.c b/drivers/net/wireguard/device.c +index a46067c38bf5..5eaef79c06e1 100644 +--- a/drivers/net/wireguard/device.c ++++ b/drivers/net/wireguard/device.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -152,7 +153,7 @@ static netdev_tx_t wg_xmit(struct sk_buff *skb, struct net_device *dev) + goto err_peer; + } + +- mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu; ++ mtu = skb_valid_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu; + + __skb_queue_head_init(&packets); + if (!skb_is_gso(skb)) { +-- +2.35.1 + diff --git a/queue-5.15/x86-__memcpy_flushcache-fix-wrong-alignment-if-size-.patch b/queue-5.15/x86-__memcpy_flushcache-fix-wrong-alignment-if-size-.patch new file mode 100644 index 00000000000..70e7d13c08f --- /dev/null +++ b/queue-5.15/x86-__memcpy_flushcache-fix-wrong-alignment-if-size-.patch @@ -0,0 +1,51 @@ +From 76cb7755229faa7245561ef315c8b6376c56a069 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Apr 2022 09:56:23 -0400 +Subject: x86: __memcpy_flushcache: fix wrong alignment if size > 2^32 + +From: Mikulas Patocka + +[ Upstream commit a6823e4e360fe975bd3da4ab156df7c74c8b07f3 ] + +The first "if" condition in __memcpy_flushcache is supposed to align the +"dest" variable to 8 bytes and copy data up to this alignment. However, +this condition may misbehave if "size" is greater than 4GiB. + +The statement min_t(unsigned, size, ALIGN(dest, 8) - dest); casts both +arguments to unsigned int and selects the smaller one. However, the +cast truncates high bits in "size" and it results in misbehavior. + +For example: + + suppose that size == 0x100000001, dest == 0x200000002 + min_t(unsigned, size, ALIGN(dest, 8) - dest) == min_t(0x1, 0xe) == 0x1; + ... + dest += 0x1; + +so we copy just one byte "and" dest remains unaligned. + +This patch fixes the bug by replacing unsigned with size_t. + +Signed-off-by: Mikulas Patocka +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + arch/x86/lib/usercopy_64.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c +index 508c81e97ab1..f1c0befb62df 100644 +--- a/arch/x86/lib/usercopy_64.c ++++ b/arch/x86/lib/usercopy_64.c +@@ -121,7 +121,7 @@ void __memcpy_flushcache(void *_dst, const void *_src, size_t size) + + /* cache copy and flush to align dest */ + if (!IS_ALIGNED(dest, 8)) { +- unsigned len = min_t(unsigned, size, ALIGN(dest, 8) - dest); ++ size_t len = min_t(size_t, size, ALIGN(dest, 8) - dest); + + memcpy((void *) dest, (void *) source, len); + clean_cache_range((void *) dest, len); +-- +2.35.1 + diff --git a/queue-5.15/xsk-fix-l2fwd-for-copy-mode-busy-poll-combo.patch b/queue-5.15/xsk-fix-l2fwd-for-copy-mode-busy-poll-combo.patch new file mode 100644 index 00000000000..e12fc1ec869 --- /dev/null +++ b/queue-5.15/xsk-fix-l2fwd-for-copy-mode-busy-poll-combo.patch @@ -0,0 +1,55 @@ +From 98a9feeea88e2881547e9a10854406770754d004 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Apr 2022 17:58:04 +0200 +Subject: xsk: Fix l2fwd for copy mode + busy poll combo + +From: Maciej Fijalkowski + +[ Upstream commit 8de8b71b787f38983d414d2dba169a3bfefa668a ] + +While checking AF_XDP copy mode combined with busy poll, strange +results were observed. rxdrop and txonly scenarios worked fine, but +l2fwd broke immediately. + +After a deeper look, it turned out that for l2fwd, Tx side was exiting +early due to xsk_no_wakeup() returning true and in the end +xsk_generic_xmit() was never called. Note that AF_XDP Tx in copy mode +is syscall steered, so the current behavior is broken. + +Txonly scenario only worked due to the fact that +sk_mark_napi_id_once_xdp() was never called - since Rx side is not in +the picture for this case and mentioned function is called in +xsk_rcv_check(), sk::sk_napi_id was never set, which in turn meant that +xsk_no_wakeup() was returning false (see the sk->sk_napi_id >= +MIN_NAPI_ID check in there). + +To fix this, prefer busy poll in xsk_sendmsg() only when zero copy is +enabled on a given AF_XDP socket. By doing so, busy poll in copy mode +would not exit early on Tx side and eventually xsk_generic_xmit() will +be called. + +Fixes: a0731952d9cd ("xsk: Add busy-poll support for {recv,send}msg()") +Signed-off-by: Maciej Fijalkowski +Signed-off-by: Daniel Borkmann +Link: https://lore.kernel.org/bpf/20220406155804.434493-1-maciej.fijalkowski@intel.com +Signed-off-by: Sasha Levin +--- + net/xdp/xsk.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c +index 426e287431d2..444ad0bc0908 100644 +--- a/net/xdp/xsk.c ++++ b/net/xdp/xsk.c +@@ -655,7 +655,7 @@ static int __xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len + if (sk_can_busy_loop(sk)) + sk_busy_loop(sk, 1); /* only support non-blocking sockets */ + +- if (xsk_no_wakeup(sk)) ++ if (xs->zc && xsk_no_wakeup(sk)) + return 0; + + pool = xs->pool; +-- +2.35.1 + -- 2.47.3