6.1.63-rc1 review
Subsystems (7)
Greg Kroah-Hartman
maintainercover 6.1.63-rc1 review
This is the start of the stable review cycle for the 6.1.63 release. There are 379 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 17 Nov 2023 19:25:27 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.63-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.1.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.1.63-rc1
Filipe Manana <[email protected]>
btrfs: use u64 for buffer sizes in the tree search ioctls
Dominique Martinet <[email protected]>
Revert "mmc: core: Capture correct oemid-bits for eMMC cards"
Yazen Ghannam <[email protected]>
x86/amd_nb: Use Family 19h Models 60h-7Fh Function 4 IDs
Jens Axboe <[email protected]>
io_uring/net: ensure socket is marked connected on connect retry
Yujie Liu <[email protected]>
tracing/kprobes: Fix the order of argument descriptions
Arnd Bergmann <[email protected]>
fbdev: fsl-diu-fb: mark wr_reg_wa() static
Dan Carpenter <[email protected]>
fbdev: imsttfb: fix a resource leak in probe
Helge Deller <[email protected]>
fbdev: imsttfb: Fix error path of imsttfb_probe()
Amit Kumar Mahapatra <[email protected]>
spi: spi-zynq-qspi: add spi-mem to driver kconfig dependencies
Jerome Brunet <[email protected]>
ASoC: dapm: fix clock get name
Jerome Brunet <[email protected]>
ASoC: hdmi-codec: register hpd callback on component probe
Eugen Hristev <[email protected]>
ASoC: mediatek: mt8186_mt6366_rt1019_rt5682s: trivial: fix error messages
Erik Kurzinger <[email protected]>
drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE
Anup Patel <[email protected]>
RISC-V: Don't fail in riscv_of_parent_hartid() for disabled HARTs
Florian Westphal <[email protected]>
netfilter: nat: fix ipv6 nat redirect with mapped and scoped addresses
Jeremy Sowden <[email protected]>
netfilter: nft_redir: use struct nf_nat_range2 throughout and deduplicate eval call-backs
Maciej Żenczykowski <[email protected]>
netfilter: xt_recent: fix (increase) ipv6 literal buffer length
Roman Bacik <[email protected]>
i2c: iproc: handle invalid slave state
Heiner Kallweit <[email protected]>
r8169: respect userspace disabling IFF_MULTICAST
Filippo Storniolo <[email protected]>
vsock/virtio: remove socket from connected/bound list on shutdown
Bobby Eshleman <[email protected]>
virtio/vsock: replace virtio_vsock_pkt with sk_buff
Yu Kuai <[email protected]>
blk-core: use pr_warn_ratelimited() in bio_check_ro()
Li Lingfeng <[email protected]>
nbd: fix uaf in nbd_open
George Shuklin <[email protected]>
tg3: power down device only on SYSTEM_POWER_OFF
Anuj Gupta <[email protected]>
nvme: fix error-handling for io_uring nvme-passthrough
D. Wythe <[email protected]>
net/smc: put sk reference if close work was canceled
D. Wythe <[email protected]>
net/smc: allow cdc msg send rather than drop it with NULL sndbuf_desc
D. Wythe <[email protected]>
net/smc: fix dangling sock under state SMC_APPFINCLOSEWAIT
Geetha sowjanya <[email protected]>
octeontx2-pf: Free pending and dropped SQEs
Subbaraya Sundeep <[email protected]>
octeontx2-pf: qos send queues management
Hariprasad Kelam <[email protected]>
octeontx2-pf: Rename tot_tx_queues to non_qos_queues
Hangbin Liu <[email protected]>
selftests: pmtu.sh: fix result checking
Furong Xu <[email protected]>
net: stmmac: xgmac: Enable support for multiple Flexible PPS outputs
NeilBrown <[email protected]>
Fix termination state for idr_for_each_entry_ul()
Patrick Thompson <[email protected]>
net: r8169: Disable multicast filter for RTL8168H and RTL8107E
Kuniyuki Iwashima <[email protected]>
dccp/tcp: Call security_inet_conn_request() after setting IPv6 addresses.
Kuniyuki Iwashima <[email protected]>
dccp: Call security_inet_conn_request() after setting IPv4 addresses.
Jian Shen <[email protected]>
net: page_pool: add missing free_percpu when page_pool_init fail
Ratheesh Kannoth <[email protected]>
octeontx2-pf: Fix holes in error code
Ratheesh Kannoth <[email protected]>
octeontx2-pf: Fix error codes
Eric Dumazet <[email protected]>
inet: shrink struct flowi_common
Hou Tao <[email protected]>
bpf: Check map->usercnt after timer->timer is assigned
Shigeru Yoshida <[email protected]>
tipc: Change nla_policy for bearer-related names to NLA_NUL_STRING
Dan Carpenter <[email protected]>
hsr: Prevent use after free in prp_create_tagged_frame()
Willem de Bruijn <[email protected]>
llc: verify mac len before reading mac header
Linus Walleij <[email protected]>
watchdog: ixp4xx: Make sure restart always works
Dan Carpenter <[email protected]>
Input: synaptics-rmi4 - fix use after free in rmi_unregister_function()
Florian Fainelli <[email protected]>
pwm: brcmstb: Utilize appropriate clock APIs in suspend/resume
Uwe Kleine-König <[email protected]>
pwm: sti: Reduce number of allocations and drop usage of chip_data
Ben Wolsieffer <[email protected]>
regmap: prevent noinc writes from clobbering cache
Marek Szyprowski <[email protected]>
media: cec: meson: always include meson sub-directory in Makefile
Hans Verkuil <[email protected]>
media: dvb-usb-v2: af9035: fix missing unlock
Pratyush Yadav <[email protected]>
media: cadence: csi2rx: Unregister v4l2 async notifier
Jernej Skrabec <[email protected]>
media: cedrus: Fix clock/reset sequence
Jiasheng Jiang <[email protected]>
media: vidtv: mux: Add check and kfree for kstrdup
Jiasheng Jiang <[email protected]>
media: vidtv: psi: Add check for kstrdup
Katya Orlova <[email protected]>
media: s3c-camif: Avoid inappropriate kfree()
Fei Shao <[email protected]>
media: mtk-jpegenc: Fix bug in JPEG encode quality selection
Ming Qian <[email protected]>
media: amphion: handle firmware debug message
Zheng Wang <[email protected]>
media: bttv: fix use after free error due to btv->timeout timer
Xiaolei Wang <[email protected]>
media: ov5640: Fix a memory leak when ov5640_probe fails
Christophe JAILLET <[email protected]>
media: i2c: max9286: Fix some redundant of_node_put() calls
Guoniu.zhou <[email protected]>
media: ov5640: fix vblank unchange issue when work at dvp mode
Jacopo Mondi <[email protected]>
media: ov5640: Drop dead code using frame_interval
Marek Vasut <[email protected]>
media: verisilicon: Do not enable G2 postproc downscale if source is narrower than destination
Marek Vasut <[email protected]>
media: hantro: Check whether reset op is defined before use
Yang Yingliang <[email protected]>
pcmcia: ds: fix possible name leak in error path in pcmcia_device_add()
Yang Yingliang <[email protected]>
pcmcia: ds: fix refcount leak in pcmcia_device_add()
Yang Yingliang <[email protected]>
pcmcia: cs: fix possible hung task and memory leak pccardd()
Javier Carrasco <[email protected]>
rtc: pcf85363: fix wrong mask/val parameters in regmap_update_bits call
Dan Williams <[email protected]>
virt: sevguest: Fix passing a stack buffer as a scatterlist target
Dionna Glaze <[email protected]>
x86/sev: Change snp_guest_issue_request()'s fw_err argument
Peter Gonda <[email protected]>
crypto: ccp - Name -1 return value as SEV_RET_NO_FW_CALL
Dan Williams <[email protected]>
cxl/mem: Fix shutdown order
Dinghao Liu <[email protected]>
i3c: Fix potential refcount leak in i3c_master_register_new_i3c_devs
Hangyu Hua <[email protected]>
9p/net: fix possible memory leak in p9_check_errors()
Ian Rogers <[email protected]>
perf hist: Add missing puts to hist__account_cycles
Ian Rogers <[email protected]>
perf machine: Avoid out of bounds LBR memory read
Sergey Shtylyov <[email protected]>
usb: host: xhci-plat: fix possible kernel oops while resuming
Basavaraj Natikar <[email protected]>
xhci: Loosen RPM as default policy to cover for AMD xHC 1.1
Wang Yufen <[email protected]>
powerpc/pseries: fix potential memory leak in init_cpu_associativity()
Sebastian Andrzej Siewior <[email protected]>
powerpc/imc-pmu: Use the correct spinlock initializer.
Haren Myneni <[email protected]>
powerpc/vas: Limit open window failure messages in log bufffer
Benjamin Gray <[email protected]>
powerpc/xive: Fix endian conversion size
Christophe Leroy <[email protected]>
powerpc/40x: Remove stale PTE_ATOMIC_UPDATES macro
Masahiro Yamada <[email protected]>
modpost: fix ishtp MODULE_DEVICE_TABLE built on big-endian host
Masahiro Yamada <[email protected]>
modpost: fix tee MODULE_DEVICE_TABLE built on big-endian host
Christophe Leroy <[email protected]>
powerpc: Only define __parse_fpscr() when required
Konrad Dybcio <[email protected]>
interconnect: qcom: sm8350: Set ACV enable_mask
Konrad Dybcio <[email protected]>
interconnect: qcom: sm8350: Retire DEFINE_QBCM
Konrad Dybcio <[email protected]>
interconnect: qcom: sm8150: Set ACV enable_mask
Konrad Dybcio <[email protected]>
interconnect: qcom: sm8150: Retire DEFINE_QBCM
Dmitry Baryshkov <[email protected]>
interconnect: qcom: sm8150: Drop IP0 interconnects
Dmitry Baryshkov <[email protected]>
interconnect: move ignore_list out of of_count_icc_providers()
Konrad Dybcio <[email protected]>
interconnect: qcom: sm6350: Set ACV enable_mask
Konrad Dybcio <[email protected]>
interconnect: qcom: sm6350: Retire DEFINE_QBCM
Konrad Dybcio <[email protected]>
interconnect: qcom: sdm845: Set ACV enable_mask
Konrad Dybcio <[email protected]>
interconnect: qcom: sdm845: Retire DEFINE_QBCM
Konrad Dybcio <[email protected]>
interconnect: qcom: sc8280xp: Set ACV enable_mask
Konrad Dybcio <[email protected]>
interconnect: qcom: sc8180x: Set ACV enable_mask
Konrad Dybcio <[email protected]>
interconnect: qcom: sc7280: Set ACV enable_mask
Konrad Dybcio <[email protected]>
interconnect: qcom: sc7180: Set ACV enable_mask
Konrad Dybcio <[email protected]>
interconnect: qcom: sc7180: Retire DEFINE_QBCM
Chao Yu <[email protected]>
f2fs: fix to initialize map.m_pblk in f2fs_precache_extents()
Christophe JAILLET <[email protected]>
dmaengine: pxa_dma: Remove an erroneous BUG_ON() in pxad_free_desc()
Jonas Blixt <[email protected]>
USB: usbip: fix stub_dev hub disconnect
Matti Vaittinen <[email protected]>
tools: iio: iio_generic_buffer ensure alignment
Jinjie Ruan <[email protected]>
misc: st_core: Do not call kfree_skb() under spin_lock_irqsave()
Dan Carpenter <[email protected]>
dmaengine: ti: edma: handle irq_of_parse_and_map() errors
Michał Mirosław <[email protected]>
usb: chipidea: Simplify Tegra DMA alignment code
Michał Mirosław <[email protected]>
usb: chipidea: Fix DMA overwrite for Tegra
Jia-Ju Bai <[email protected]>
usb: dwc2: fix possible NULL pointer dereference caused by driver concurrency
Fenghua Yu <[email protected]>
dmaengine: idxd: Register dsa_bus_type before registering idxd sub-drivers
Namhyung Kim <[email protected]>
perf record: Fix BTF type checks in the off-cpu profiling
Biju Das <[email protected]>
pinctrl: renesas: rzg2l: Make reverse order of enable() for disable()
Zheng Yejian <[email protected]>
livepatch: Fix missing newline character in klp_resolve_symbols()
Yi Yang <[email protected]>
tty: tty_jobctrl: fix pid memleak in disassociate_ctty()
Chao Yu <[email protected]>
f2fs: compress: fix to avoid redundant compress extension
Chao Yu <[email protected]>
f2fs: compress: fix to avoid use-after-free on dic
Chao Yu <[email protected]>
f2fs: compress: fix deadloop in f2fs_write_cache_pages()
Vishal Moola (Oracle) <[email protected]>
f2fs: convert f2fs_write_cache_pages() to use filemap_get_folios_tag()
Vishal Moola (Oracle) <[email protected]>
filemap: add filemap_get_folios_tag()
Yang Jihong <[email protected]>
perf kwork: Set ordered_events to true in 'struct perf_tool'
Yang Jihong <[email protected]>
perf kwork: Add the supported subcommands to the document
Yang Jihong <[email protected]>
perf kwork: Fix incorrect and missing free atom in work_push_atom()
Jinjie Ruan <[email protected]>
iio: frequency: adf4350: Use device managed functions and fix power down issue.
Ian Rogers <[email protected]>
perf stat: Fix aggr mode initialization
Georgia Garcia <[email protected]>
apparmor: fix invalid reference on profile->disconnected
Rae Moar <[email protected]>
apparmor: test: make static symbols visible during kunit testing
Rae Moar <[email protected]>
kunit: add macro to allow conditionally exposing static symbols to tests
Christophe JAILLET <[email protected]>
leds: trigger: ledtrig-cpu:: Fix 'output may be truncated' issue for 'cpu'
Uwe Kleine-König <[email protected]>
leds: pwm: Don't disable the PWM when the LED should be off
Marek Behún <[email protected]>
leds: turris-omnia: Do not use SMBUS calls
Marek Behún <[email protected]>
leds: turris-omnia: Drop unnecessary mutex locking
Hans de Goede <[email protected]>
mfd: arizona-spi: Set pdata.hpdet_channel for ACPI enumerated devs
Chen-Yu Tsai <[email protected]>
dt-bindings: mfd: mt6397: Split out compatible for MediaTek MT6366 PMIC
Fabien Parent <[email protected]>
dt-bindings: mfd: mt6397: Add binding for MT6357
Dinghao Liu <[email protected]>
mfd: dln2: Fix double put in dln2_probe
Herve Codina <[email protected]>
mfd: core: Ensure disabled devices are skipped without aborting
Michał Mirosław <[email protected]>
mfd: core: Un-constify mfd_cell.of_reg
George Kennedy <[email protected]>
IB/mlx5: Fix init stage error handling to avoid double free of same QP and UAF
Kuninori Morimoto <[email protected]>
ASoC: ams-delta.c: use component after check
Giovanni Cabiddu <[email protected]>
crypto: qat - fix deadlock in backlog processing
WangJinchao <[email protected]>
padata: Fix refcnt handling in padata_free_shell()
Cezary Rojewski <[email protected]>
ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails
Hans de Goede <[email protected]>
HID: logitech-hidpp: Move get_wireless_feature_index() check to hidpp_connect_event()
Hans de Goede <[email protected]>
HID: logitech-hidpp: Revert "Don't restart communication if not necessary"
Hans de Goede <[email protected]>
HID: logitech-hidpp: Don't restart IO, instead defer hid_connect() only
Bastien Nocera <[email protected]>
HID: logitech-hidpp: Remove HIDPP_QUIRK_NO_HIDINPUT quirk
Bastien Nocera <[email protected]>
Revert "HID: logitech-hidpp: add a module parameter to keep firmware gestures"
Geert Uytterhoeven <[email protected]>
sh: bios: Revive earlyprintk support
Danny Kaehn <[email protected]>
hid: cp2112: Fix IRQ shutdown stopping polling for all IRQs on chip
Andy Shevchenko <[email protected]>
HID: cp2112: Make irq_chip immutable
Leon Romanovsky <[email protected]>
RDMA/hfi1: Workaround truncation compilation error
Daniel Mentz <[email protected]>
scsi: ufs: core: Leave space for '\0' in utf8 desc string
Zhang Shurong <[email protected]>
ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe
Maarten Lankhorst <[email protected]>
ASoC: SOF: core: Ensure sof_ops_free() is still called when probe never ran.
Luoyouming <[email protected]>
RDMA/hns: The UD mode can only be configured with DCQCN
Luoyouming <[email protected]>
RDMA/hns: Add check for SL
Chengchang Tang <[email protected]>
RDMA/hns: Fix signed-unsigned mixed comparisons
Chengchang Tang <[email protected]>
RDMA/hns: Fix uninitialized ucmd in hns_roce_create_qp_common()
Chengchang Tang <[email protected]>
RDMA/hns: Fix printing level of asynchronous events
Patrisious Haddad <[email protected]>
IB/mlx5: Fix rdma counter binding for RAW QP
Kuninori Morimoto <[email protected]>
ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not described
Gou Hao <[email protected]>
ext4: move 'ix' sanity check to corrent position
Kursad Oney <[email protected]>
ARM: 9321/1: memset: cast the constant byte to unsigned char
Longfang Liu <[email protected]>
crypto: hisilicon/qm - fix PF queue parameter issue
Kai Ye <[email protected]>
crypto: hisilicon/qm - split a debugfs.c from qm
Kai Ye <[email protected]>
crypto: hisilicon/qm - modify the process of regs dfx
Kai Ye <[email protected]>
crypto: hisilicon/qm - delete redundant null assignment operations
Danny Kaehn <[email protected]>
hid: cp2112: Fix duplicate workqueue initialization
Ilpo Järvinen <[email protected]>
PCI: vmd: Correct PCI Header Type Register's multi-function check
Giovanni Cabiddu <[email protected]>
crypto: qat - increase size of buffers
Gaurav Jain <[email protected]>
crypto: caam/jr - fix Chacha20 + Poly1305 self test failure
Gaurav Jain <[email protected]>
crypto: caam/qi2 - fix Chacha20 + Poly1305 self test failure
Tomas Glozar <[email protected]>
nd_btt: Make BTT lanes preemptible
Chen Ni <[email protected]>
libnvdimm/of_pmem: Use devm_kstrdup instead of kstrdup and check its return value
Tyrel Datwyler <[email protected]>
scsi: ibmvfc: Fix erroneous use of rtas_busy_delay with hcall return code
Giovanni Cabiddu <[email protected]>
crypto: qat - fix unregistration of crypto algorithms
Giovanni Cabiddu <[email protected]>
crypto: qat - extend buffer list interface
Giovanni Cabiddu <[email protected]>
crypto: qat - generalize crypto request buffers
Giovanni Cabiddu <[email protected]>
crypto: qat - change bufferlist logic interface
Giovanni Cabiddu <[email protected]>
crypto: qat - rename bufferlist functions
Giovanni Cabiddu <[email protected]>
crypto: qat - relocate bufferlist logic
Giovanni Cabiddu <[email protected]>
crypto: qat - ignore subsequent state up commands
Gustavo A. R. Silva <[email protected]>
RDMA/core: Use size_{add,sub,mul}() in calls to struct_size()
Jonas Gorski <[email protected]>
hwrng: geode - fix accessing registers
Stefan Wahren <[email protected]>
hwrng: bcm2835 - Fix hwrng throughput regression
Christophe JAILLET <[email protected]>
crypto: hisilicon/hpre - Fix a erroneous check after snprintf()
Herbert Xu <[email protected]>
KEYS: Include linux/errno.h in linux/verification.h
Cristian Ciocaltea <[email protected]>
ALSA: hda: cs35l41: Undo runtime PM changes at driver exit time
Cristian Ciocaltea <[email protected]>
ALSA: hda: cs35l41: Fix unbalanced pm_runtime_get()
Cristian Ciocaltea <[email protected]>
ASoC: cs35l41: Undo runtime PM changes at driver exit time
Cristian Ciocaltea <[email protected]>
ASoC: cs35l41: Verify PM runtime resume errors in IRQ handler
Andrea Righi <[email protected]>
module/decompress: use vmalloc() for gzip decompression workspace
Ilpo Järvinen <[email protected]>
selftests/resctrl: Ensure the benchmark commands fits to its array
Maciej Wieczor-Retman <[email protected]>
selftests/pidfd: Fix ksft print formats
Thierry Reding <[email protected]>
arm64: tegra: Use correct interrupts for Tegra234 TKE
Adam Ford <[email protected]>
arm64: dts: imx8mn: Add sound-dai-cells to micfil node
Adam Ford <[email protected]>
arm64: dts: imx8mm: Add sound-dai-cells to micfil node
Fabio Estevam <[email protected]>
arm64: dts: imx8qm-ss-img: Fix jpegenc compatible entry
Sudeep Holla <[email protected]>
clk: scmi: Free scmi_clk allocated when the clocks with invalid info are skipped
Adam Ford <[email protected]>
ARM: dts: am3517-evm: Fix LED3/4 pinmux
Sudeep Holla <[email protected]>
firmware: arm_ffa: Allow the FF-A drivers to use 32bit mode of messaging
Sudeep Holla <[email protected]>
firmware: arm_ffa: Assign the missing IDR allocation ID to the FFA device
Jai Luthra <[email protected]>
arm64: dts: ti: k3-am62a7-sk: Drop i2c-1 to 100Khz
Dhruva Gole <[email protected]>
firmware: ti_sci: Mark driver as non removable
Jinjie Ruan <[email protected]>
kunit: Fix missed memory release in kunit_free_suite_set()
Uwe Kleine-König <[email protected]>
soc: qcom: llcc: Handle a second device without data corruption
Krzysztof Kozlowski <[email protected]>
ARM: dts: qcom: mdm9615: populate vsdcc fixed regulator
Stephan Gerhold <[email protected]>
arm64: dts: qcom: apq8016-sbc: Add missing ADV7533 regulators
Chris Packham <[email protected]>
ARM64: dts: marvell: cn9310: Use appropriate label for spi1 pins
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: sdm845-mtp: fix WiFi configuration
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: sm8350: fix pinctrl for UART18
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: sm8150: add ref clock to PCIe PHYs
Konrad Dybcio <[email protected]>
arm64: dts: qcom: sc7280: Add missing LMH interrupts
Krzysztof Kozlowski <[email protected]>
arm64: dts: qcom: msm8992-libra: drop duplicated reserved memory
Gaurav Kohli <[email protected]>
arm64: dts: qcom: msm8916: Fix iommu local address range
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: sc7280: link usb3_phy_wrapper_gcc_usb30_pipe_clk
David Heidelberg <[email protected]>
arm64: dts: qcom: sdm845: cheza doesn't support LMh node
Geert Uytterhoeven <[email protected]>
ARM: dts: renesas: blanche: Fix typo in GP_11_2 pin name
Junhao He <[email protected]>
perf: hisi: Fix use-after-free when register pmu fails
Yicong Yang <[email protected]>
drivers/perf: hisi_pcie: Check the type first in pmu::event_init()
Robin Murphy <[email protected]>
perf/arm-cmn: Fix DTC domain detection
Robin Murphy <[email protected]>
perf/arm-cmn: Revamp model detection
Hao Chen <[email protected]>
drivers/perf: hisi: use cpuhp_state_remove_instance_nocalls() for hisi_hns3_pmu uninit process
AngeloGioacchino Del Regno <[email protected]>
drm: mediatek: mtk_dsi: Fix NO_EOT_PACKET settings/handling
Andre Przywara <[email protected]>
clocksource/drivers/arm_arch_timer: limit XGene-1 workaround
Dmitry Baryshkov <[email protected]>
drm/msm/dsi: free TX buffer in unbind
Dmitry Baryshkov <[email protected]>
drm/msm/dsi: use msm_gem_kernel_put to free TX buffer
Marek Marczykowski-Górecki <[email protected]>
xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled
Juergen Gross <[email protected]>
xenbus: fix error exit in xenbus_init()
Dan Carpenter <[email protected]>
drm/rockchip: Fix type promotion bug in rockchip_gem_iommu_map()
Mark Rutland <[email protected]>
arm64/arm: xen: enlighten: Fix KPTI checks
Dmitry Baryshkov <[email protected]>
drm/bridge: lt9611uxc: fix the race in the error path
Johnny Liu <[email protected]>
gpu: host1x: Correct allocated size for contexts
Christophe JAILLET <[email protected]>
drm/rockchip: cdn-dp: Fix some error handling paths in cdn_dp_probe()
Jason-JH.Lin <[email protected]>
drm/mediatek: Fix iommu fault during crtc enabling
Jason-JH.Lin <[email protected]>
drm/mediatek: Fix iommu fault by swapping FBs after updating plane state
Gabriel Krisman Bertazi <[email protected]>
io_uring/kbuf: Allow the full buffer id space for provided buffers
Gabriel Krisman Bertazi <[email protected]>
io_uring/kbuf: Fix check of BID wrapping in provided buffers
Michel Dänzer <[email protected]>
drm/amd/display: Bail from dm_check_crtc_cursor if no relevant change
Michel Dänzer <[email protected]>
drm/amd/display: Refactor dm_get_plane_scale helper
Michel Dänzer <[email protected]>
drm/amd/display: Check all enabled planes in dm_check_crtc_cursor
Xiaogang Chen <[email protected]>
drm/amdkfd: fix some race conditions in vram buffer alloc/free of svm code
Tomi Valkeinen <[email protected]>
drm/bridge: tc358768: Fix tc358768_ns_to_cnt()
Tomi Valkeinen <[email protected]>
drm/bridge: tc358768: Clean up clock period code
Tomi Valkeinen <[email protected]>
drm/bridge: tc358768: Rename dsibclk to hsbyteclk
Tomi Valkeinen <[email protected]>
drm/bridge: tc358768: Use dev for dbg prints, not priv->dev
Tomi Valkeinen <[email protected]>
drm/bridge: tc358768: Print logical values, not raw register values
Tomi Valkeinen <[email protected]>
drm/bridge: tc358768: Use struct videomode
Francesco Dolcini <[email protected]>
drm/bridge: tc358768: remove unused variable
Tomi Valkeinen <[email protected]>
drm/bridge: tc358768: Fix bit updates
Tomi Valkeinen <[email protected]>
drm/bridge: tc358768: Fix use of uninitialized variable
Tomi Valkeinen <[email protected]>
drm/bridge: lt8912b: Add missing drm_bridge_attach call
Tomi Valkeinen <[email protected]>
drm/bridge: lt8912b: Manually disable HPD only if it was enabled
Tomi Valkeinen <[email protected]>
drm/bridge: lt8912b: Fix crash on bridge detach
Tomi Valkeinen <[email protected]>
drm/bridge: lt8912b: Fix bridge_detach
Stefan Eichenberger <[email protected]>
drm/bridge: lt8912b: Add hot plug detection
Jai Luthra <[email protected]>
drm: bridge: it66121: Fix invalid connector dereference
Konstantin Meskhidze <[email protected]>
drm/radeon: possible buffer overflow
Jonas Karlman <[email protected]>
drm/rockchip: vop2: Add missing call to crtc reset helper
Jonas Karlman <[email protected]>
drm/rockchip: vop2: Don't crash for invalid duplicate_state
Jonas Karlman <[email protected]>
drm/rockchip: vop: Fix call to crtc reset helper
Jonas Karlman <[email protected]>
drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs
Harshit Mogalapalli <[email protected]>
hte: tegra: Fix missing error code in tegra_hte_test_probe()
Armin Wolf <[email protected]>
hwmon: (sch5627) Disallow write access if virtual registers are locked
Armin Wolf <[email protected]>
hwmon: (sch5627) Use bit macros when accessing the control register
Guenter Roeck <[email protected]>
Revert "hwmon: (sch56xx-common) Add automatic module loading on supported devices"
Guenter Roeck <[email protected]>
Revert "hwmon: (sch56xx-common) Add DMI override table"
Zhang Rui <[email protected]>
hwmon: (coretemp) Fix potentially truncated sysfs attribute name
Dragos Bogdan <[email protected]>
hwmon: (axi-fan-control) Fix possible NULL pointer dereference
Armin Wolf <[email protected]>
platform/x86: wmi: Fix opening of char device
Armin Wolf <[email protected]>
platform/x86: wmi: Fix probe failure when failing to register WMI devices
Varadarajan Narayanan <[email protected]>
clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt2701: Add check for mtk_alloc_clk_data
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt7629: Add check for mtk_alloc_clk_data
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt7629-eth: Add check for mtk_alloc_clk_data
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt6797: Add check for mtk_alloc_clk_data
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt6779: Add check for mtk_alloc_clk_data
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data
Jonathan Neuschäfer <[email protected]>
clk: npcm7xx: Fix incorrect kfree
Dan Carpenter <[email protected]>
clk: ti: fix double free in of_ti_divider_clk_setup()
Dario Binacchi <[email protected]>
clk: ti: change ti_clk_register[_omap_hw]() API
Dan Carpenter <[email protected]>
clk: keystone: pll: fix a couple NULL vs IS_ERR() checks
Han Xu <[email protected]>
spi: nxp-fspi: use the correct ioremap function
Randy Dunlap <[email protected]>
clk: linux/clk-provider.h: fix kernel-doc warnings and typos
Claudiu Beznea <[email protected]>
clk: renesas: rzg2l: Fix computation formula
Claudiu Beznea <[email protected]>
clk: renesas: rzg2l: Use FIELD_GET() for PLL register fields
Claudiu Beznea <[email protected]>
clk: renesas: rzg2l: Trust value returned by hardware
Claudiu Beznea <[email protected]>
clk: renesas: rzg2l: Lock around writes to mux register
Claudiu Beznea <[email protected]>
clk: renesas: rzg2l: Wait for status bit of SD mux before continuing
Dirk Behme <[email protected]>
clk: renesas: rcar-gen3: Extend SDnH divider table
Robert Chiras <[email protected]>
clk: imx: imx8qxp: Fix elcdif_pll clock
Peng Fan <[email protected]>
clk: imx: imx8mq: correct error handling path
Abel Vesa <[email protected]>
clk: imx: Select MXC_CLK for CLK_IMX8QXP
Chen-Yu Tsai <[email protected]>
regulator: mt6358: Fail probe on unknown chip ID
Danila Tikhonov <[email protected]>
clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src
Konrad Dybcio <[email protected]>
clk: qcom: mmcc-msm8998: Fix the SMMU GDSC
Konrad Dybcio <[email protected]>
clk: qcom: mmcc-msm8998: Don't check halt bit on some branch clks
Devi Priya <[email protected]>
clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies
Konrad Dybcio <[email protected]>
clk: qcom: gcc-msm8996: Remove RPM bus clocks
Zhang Shurong <[email protected]>
spi: tegra: Fix missing IRQ check in tegra_slink_probe()
Christophe JAILLET <[email protected]>
regmap: debugfs: Fix a erroneous check after snprintf()
Eric Dumazet <[email protected]>
ipvlan: properly track tx_errors
Eric Dumazet <[email protected]>
net: add DEV_STATS_READ() helper
Yan Zhai <[email protected]>
ipv6: avoid atomic fragment on GSO packets
Christophe JAILLET <[email protected]>
ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias()
Song Liu <[email protected]>
bpf: Fix unnecessary -EBUSY from htab_lock_bucket
Marcel Ziswiler <[email protected]>
Bluetooth: hci_sync: Fix Opcode prints in bt_dev_dbg/err
Miri Korenblit <[email protected]>
wifi: iwlwifi: empty overflow queue during flush
Johannes Berg <[email protected]>
wifi: iwlwifi: pcie: synchronize IRQs before NAPI
Gregory Greenman <[email protected]>
wifi: iwlwifi: call napi_synchronize() before freeing rx/tx queues
Eric Dumazet <[email protected]>
tcp: fix cookie_init_timestamp() overflows
Eric Dumazet <[email protected]>
chtls: fix tp->rcv_tstamp initialization
Phil Sutter <[email protected]>
net: skb_find_text: Ignore patterns extending past 'to'
Xin Long <[email protected]>
selftests: netfilter: test for sctp collision processing in nf_conntrack
Heiner Kallweit <[email protected]>
r8169: fix rare issue with broken rx after link-down on RTL8125
Juhee Kang <[email protected]>
r8169: use tp_to_dev instead of open code
Dan Carpenter <[email protected]>
thermal: core: prevent potential string overflow
Phil Sutter <[email protected]>
netfilter: nf_tables: Drop pointless memset when dumping rules
Felipe Negrelli Wolter <[email protected]>
wifi: wfx: fix case where rates are out of order
Sascha Hauer <[email protected]>
PM / devfreq: rockchip-dfi: Make pmu regmap mandatory
Marc Kleine-Budde <[email protected]>
can: dev: can_put_echo_skb(): don't crash kernel if can_priv::echo_skb is accessed out of bounds
Marc Kleine-Budde <[email protected]>
can: dev: can_restart(): fix race condition between controller restart and netif_carrier_on()
Marc Kleine-Budde <[email protected]>
can: dev: can_restart(): don't crash kernel if carrier is OK
Aditya Kumar Singh <[email protected]>
wifi: ath11k: fix Tx power value during active CAC
Ondrej Zary <[email protected]>
ACPI: video: Add acpi_backlight=vendor quirk for Toshiba Portégé R100
Andy Shevchenko <[email protected]>
ACPI: property: Allow _DSD buffer data only for byte accessors
Dmitry Antipov <[email protected]>
wifi: rtlwifi: fix EDCA limit set by BT coexistence
Eric Dumazet <[email protected]>
tcp_metrics: do not create an entry from tcp_init_metrics()
Eric Dumazet <[email protected]>
tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics()
Eric Dumazet <[email protected]>
tcp_metrics: add missing barriers on delete
Christophe JAILLET <[email protected]>
wifi: ath: dfs_pattern_detector: Fix a memory initialization issue
MeiChia Chiu <[email protected]>
wifi: mt76: mt7915: fix beamforming availability check
Felix Fietkau <[email protected]>
wifi: mt76: mt7603: improve stuck beacon handling
Felix Fietkau <[email protected]>
wifi: mt76: mt7603: improve watchdog reset reliablity
Felix Fietkau <[email protected]>
wifi: mt76: mt7603: rework/fix rx pse hang check
Baochen Qiang <[email protected]>
wifi: ath11k: fix boot failure with one MSI vector
Jinjie Ruan <[email protected]>
wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file()
Lorenzo Bianconi <[email protected]>
net: ethernet: mtk_wed: fix EXT_INT_STATUS_RX_FBUF definitions for MT7986 SoC
Gustavo A. R. Silva <[email protected]>
net: spider_net: Use size_add() in call to struct_size()
Gustavo A. R. Silva <[email protected]>
tipc: Use size_add() in calls to struct_size()
Gustavo A. R. Silva <[email protected]>
tls: Use size_add() in call to struct_size()
Herbert Xu <[email protected]>
tls: Only use data field in crypto completion function
Gustavo A. R. Silva <[email protected]>
mlxsw: Use size_mul() in call to struct_size()
Gustavo A. R. Silva <[email protected]>
gve: Use size_add() in call to struct_size()
Aananth V <[email protected]>
tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed
Eric Dumazet <[email protected]>
udp: add missing WRITE_ONCE() around up->encap_rcv
Miri Korenblit <[email protected]>
wifi: iwlwifi: Use FW rate for non-data frames
Leon Hwang <[email protected]>
selftests/bpf: Correct map_fd to data_fd in tailcalls
Brett Creeley <[email protected]>
iavf: Fix promiscuous mode configuration flow messages
Andrii Staikov <[email protected]>
i40e: fix potential memory leaks in i40e_remove()
Emmanuel Grumbach <[email protected]>
wifi: iwlwifi: honor the enable_ini value
Johannes Berg <[email protected]>
wifi: mac80211: fix # of MSDU in A-MSDU calculation
Johannes Berg <[email protected]>
wifi: mac80211: move sched-scan stop work to wiphy work
Johannes Berg <[email protected]>
wifi: mac80211: move offchannel works to wiphy work
Johannes Berg <[email protected]>
wifi: mac80211: move scan work to wiphy work
Johannes Berg <[email protected]>
wifi: mac80211: move radar detect work to wiphy work
Johannes Berg <[email protected]>
wifi: cfg80211: add flush functions for wiphy work
Chen Yu <[email protected]>
genirq/matrix: Exclude managed interrupts in irq_matrix_allocated()
Kees Cook <[email protected]>
string: Adjust strtomem() logic to allow for smaller sources
Jiasheng Jiang <[email protected]>
pstore/platform: Add check for kstrdup
Ivaylo Dimitrov <[email protected]>
drivers/clocksource/timer-ti-dm: Don't call clk_get_rate() in stop function
Yuntao Wang <[email protected]>
x86/boot: Fix incorrect startup_gdt_descr.size
Adam Dunlap <[email protected]>
x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot
Alison Schofield <[email protected]>
ACPI/NUMA: Apply SRAT proximity domain to entire CFMWS window
Alison Schofield <[email protected]>
x86/numa: Introduce numa_fill_memblks()
Ben Wolsieffer <[email protected]>
futex: Don't include process MM in futex key on no-MMU
Josh Poimboeuf <[email protected]>
x86/srso: Fix SBPB enablement for (possible) future fixed HW
Jingbo Xu <[email protected]>
writeback, cgroup: switch inodes with dirty timestamps to release dying cgwbs
Reuben Hawkins <[email protected]>
vfs: fix readahead(2) on block devices
Peter Zijlstra <[email protected]>
sched: Fix stop_one_cpu_nowait() vs hotplug
Aaron Plattner <[email protected]>
objtool: Propagate early errors
Qais Yousef <[email protected]>
sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0
Qais Yousef <[email protected]>
sched/uclamp: Set max_spare_cap_cpu even if max_spare_cap is 0
David Howells <[email protected]>
iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user()
Chengming Zhou <[email protected]>
sched/fair: Fix cfs_rq_is_decayed() on !SMP
Zev Weiss <[email protected]>
hwmon: (nct6775) Fix incorrect variable reuse in fan_div calculation
-------------
Diffstat:
Documentation/devicetree/bindings/mfd/mt6397.txt | 5 +- Documentation/virt/coco/sev-guest.rst | 20 +- Makefile | 4 +- arch/arm/boot/dts/am3517-evm.dts | 16 +- arch/arm/boot/dts/qcom-mdm9615.dtsi | 14 +- arch/arm/boot/dts/r8a7792-blanche.dts | 2 +- arch/arm/lib/memset.S | 1 + arch/arm/xen/enlighten.c | 25 +- arch/arm64/boot/dts/freescale/imx8mm.dtsi | 1 + arch/arm64/boot/dts/freescale/imx8mn.dtsi | 1 + arch/arm64/boot/dts/freescale/imx8qm-ss-img.dtsi | 2 +- arch/arm64/boot/dts/marvell/cn9130-crb.dtsi | 4 +- arch/arm64/boot/dts/marvell/cn9130-db.dtsi | 4 +- arch/arm64/boot/dts/nvidia/tegra234.dtsi | 12 +- arch/arm64/boot/dts/qcom/apq8016-sbc.dts | 3 + arch/arm64/boot/dts/qcom/msm8916.dtsi | 2 +- arch/arm64/boot/dts/qcom/msm8992-xiaomi-libra.dts | 5 - arch/arm64/boot/dts/qcom/sc7280.dtsi | 11 +- arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi | 12 + arch/arm64/boot/dts/qcom/sdm845-mtp.dts | 2 + arch/arm64/boot/dts/qcom/sm8150.dtsi | 12 +- arch/arm64/boot/dts/qcom/sm8350.dtsi | 2 +- arch/arm64/boot/dts/ti/k3-am62a7-sk.dts | 2 +- arch/arm64/include/asm/cputype.h | 3 +- arch/arm64/kvm/guest.c | 2 +- arch/powerpc/include/asm/nohash/32/pte-40x.h | 3 - arch/powerpc/kernel/traps.c | 2 + arch/powerpc/perf/imc-pmu.c | 2 +- arch/powerpc/platforms/book3s/vas-api.c | 34 +- arch/powerpc/platforms/pseries/lpar.c | 4 +- arch/powerpc/platforms/pseries/vas.c | 4 +- arch/powerpc/sysdev/xive/native.c | 2 +- arch/riscv/kernel/cpu.c | 11 +- arch/sh/Kconfig.debug | 11 + arch/x86/include/asm/sev-common.h | 4 - arch/x86/include/asm/sev.h | 10 +- arch/x86/include/asm/sparsemem.h | 2 + arch/x86/include/asm/uaccess.h | 2 +- arch/x86/kernel/amd_nb.c | 3 + arch/x86/kernel/cpu/bugs.c | 2 +- arch/x86/kernel/head64.c | 2 +- arch/x86/kernel/sev.c | 15 +- arch/x86/lib/copy_mc.c | 8 +- arch/x86/mm/maccess.c | 19 +- arch/x86/mm/numa.c | 80 ++ block/blk-core.c | 4 +- drivers/acpi/device_sysfs.c | 10 +- drivers/acpi/numa/srat.c | 11 +- drivers/acpi/property.c | 19 +- drivers/acpi/video_detect.c | 26 + drivers/base/regmap/regmap-debugfs.c | 2 +- drivers/base/regmap/regmap.c | 16 +- drivers/block/nbd.c | 11 +- drivers/char/hw_random/bcm2835-rng.c | 2 +- drivers/char/hw_random/core.c | 6 + drivers/char/hw_random/geode-rng.c | 6 +- drivers/clk/clk-npcm7xx.c | 2 +- drivers/clk/clk-scmi.c | 1 + drivers/clk/imx/Kconfig | 1 + drivers/clk/imx/clk-imx8mq.c | 17 +- drivers/clk/imx/clk-imx8qxp.c | 2 +- drivers/clk/keystone/pll.c | 15 +- drivers/clk/mediatek/clk-mt2701.c | 8 + drivers/clk/mediatek/clk-mt6765.c | 6 + drivers/clk/mediatek/clk-mt6779.c | 4 + drivers/clk/mediatek/clk-mt6797.c | 6 + drivers/clk/mediatek/clk-mt7629-eth.c | 4 + drivers/clk/mediatek/clk-mt7629.c | 6 + drivers/clk/qcom/Kconfig | 1 + drivers/clk/qcom/clk-rcg2.c | 14 +- drivers/clk/qcom/gcc-msm8996.c | 237 +--- drivers/clk/qcom/gcc-sm8150.c | 2 +- drivers/clk/qcom/mmcc-msm8998.c | 7 +- drivers/clk/renesas/rcar-cpg-lib.c | 15 +- drivers/clk/renesas/rzg2l-cpg.c | 62 +- drivers/clk/renesas/rzg2l-cpg.h | 2 +- drivers/clk/ti/apll.c | 4 +- drivers/clk/ti/clk-dra7-atl.c | 2 +- drivers/clk/ti/clk.c | 34 +- drivers/clk/ti/clkctrl.c | 4 +- drivers/clk/ti/clock.h | 10 +- drivers/clk/ti/composite.c | 2 +- drivers/clk/ti/divider.c | 8 +- drivers/clk/ti/dpll.c | 4 +- drivers/clk/ti/fixed-factor.c | 2 +- drivers/clk/ti/gate.c | 6 +- drivers/clk/ti/interface.c | 7 +- drivers/clk/ti/mux.c | 6 +- drivers/clocksource/arm_arch_timer.c | 5 +- drivers/clocksource/timer-ti-dm.c | 36 +- drivers/crypto/caam/caamalg.c | 3 +- drivers/crypto/caam/caamalg_qi2.c | 3 +- drivers/crypto/ccp/sev-dev.c | 8 +- drivers/crypto/hisilicon/Makefile | 2 +- drivers/crypto/hisilicon/debugfs.c | 1097 ++++++++++++++++ drivers/crypto/hisilicon/hpre/hpre_main.c | 14 +- drivers/crypto/hisilicon/qm.c | 1370 ++------------------ drivers/crypto/hisilicon/qm_common.h | 86 ++ drivers/crypto/hisilicon/sec2/sec_main.c | 12 +- drivers/crypto/hisilicon/zip/zip_main.c | 12 +- drivers/crypto/qat/qat_common/Makefile | 3 +- drivers/crypto/qat/qat_common/adf_accel_devices.h | 2 +- drivers/crypto/qat/qat_common/adf_common_drv.h | 1 + drivers/crypto/qat/qat_common/adf_init.c | 6 +- drivers/crypto/qat/qat_common/adf_sysfs.c | 4 +- .../crypto/qat/qat_common/adf_transport_debug.c | 4 +- drivers/crypto/qat/qat_common/qat_algs.c | 208 +-- drivers/crypto/qat/qat_common/qat_algs_send.c | 46 +- drivers/crypto/qat/qat_common/qat_bl.c | 224 ++++ drivers/crypto/qat/qat_common/qat_bl.h | 55 + drivers/crypto/qat/qat_common/qat_crypto.h | 36 +- drivers/cxl/core/memdev.c | 2 +- drivers/devfreq/event/rockchip-dfi.c | 15 +- drivers/dma/idxd/Makefile | 6 +- drivers/dma/pxa_dma.c | 1 - drivers/dma/ti/edma.c | 4 +- drivers/firmware/arm_ffa/bus.c | 1 + drivers/firmware/arm_ffa/driver.c | 12 +- drivers/firmware/ti_sci.c | 46 +- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 8 +- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 70 +- drivers/gpu/drm/bridge/ite-it66121.c | 12 +- drivers/gpu/drm/bridge/lontium-lt8912b.c | 37 +- drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 10 +- drivers/gpu/drm/bridge/tc358768.c | 168 +-- drivers/gpu/drm/drm_syncobj.c | 3 +- drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 3 + drivers/gpu/drm/mediatek/mtk_drm_plane.c | 2 +- drivers/gpu/drm/mediatek/mtk_dsi.c | 4 +- drivers/gpu/drm/msm/dsi/dsi.c | 1 + drivers/gpu/drm/msm/dsi/dsi.h | 1 + drivers/gpu/drm/msm/dsi/dsi_host.c | 16 +- drivers/gpu/drm/radeon/evergreen.c | 7 +- drivers/gpu/drm/rockchip/cdn-dp-core.c | 15 +- drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 2 +- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 8 +- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 39 +- drivers/gpu/host1x/context.c | 4 +- drivers/hid/hid-cp2112.c | 43 +- drivers/hid/hid-logitech-hidpp.c | 76 +- drivers/hte/hte-tegra194-test.c | 4 +- drivers/hwmon/axi-fan-control.c | 29 +- drivers/hwmon/coretemp.c | 2 +- drivers/hwmon/nct6775-core.c | 12 +- drivers/hwmon/sch5627.c | 21 +- drivers/hwmon/sch56xx-common.c | 64 +- drivers/i2c/busses/i2c-bcm-iproc.c | 133 +- drivers/i3c/master.c | 4 +- drivers/iio/frequency/adf4350.c | 75 +- drivers/infiniband/core/device.c | 2 +- drivers/infiniband/core/sa_query.c | 4 +- drivers/infiniband/core/sysfs.c | 10 +- drivers/infiniband/core/user_mad.c | 4 +- drivers/infiniband/hw/hfi1/efivar.c | 2 +- drivers/infiniband/hw/hns/hns_roce_ah.c | 13 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 34 +- drivers/infiniband/hw/hns/hns_roce_qp.c | 2 +- drivers/infiniband/hw/mlx5/main.c | 4 +- drivers/infiniband/hw/mlx5/qp.c | 27 + drivers/input/rmi4/rmi_bus.c | 2 +- drivers/interconnect/core.c | 12 +- drivers/interconnect/qcom/sc7180.c | 256 +++- drivers/interconnect/qcom/sc7280.c | 1 + drivers/interconnect/qcom/sc8180x.c | 1 + drivers/interconnect/qcom/sc8280xp.c | 1 + drivers/interconnect/qcom/sdm845.c | 278 +++- drivers/interconnect/qcom/sm6350.c | 252 +++- drivers/interconnect/qcom/sm8150.c | 305 ++++- drivers/interconnect/qcom/sm8150.h | 4 +- drivers/interconnect/qcom/sm8350.c | 309 ++++- drivers/leds/leds-pwm.c | 2 +- drivers/leds/leds-turris-omnia.c | 65 +- drivers/leds/trigger/ledtrig-cpu.c | 4 +- drivers/media/cec/platform/Makefile | 2 +- drivers/media/i2c/max9286.c | 2 - drivers/media/i2c/ov5640.c | 37 +- drivers/media/pci/bt8xx/bttv-driver.c | 1 + drivers/media/platform/amphion/vpu_defs.h | 1 + drivers/media/platform/amphion/vpu_helpers.c | 1 + drivers/media/platform/amphion/vpu_malone.c | 1 + drivers/media/platform/amphion/vpu_msgs.c | 31 +- drivers/media/platform/cadence/cdns-csi2rx.c | 7 +- .../media/platform/mediatek/jpeg/mtk_jpeg_enc_hw.c | 5 +- .../platform/samsung/s3c-camif/camif-capture.c | 6 +- drivers/media/platform/verisilicon/hantro_drv.c | 3 +- .../media/platform/verisilicon/hantro_postproc.c | 2 +- drivers/media/test-drivers/vidtv/vidtv_mux.c | 7 +- drivers/media/test-drivers/vidtv/vidtv_psi.c | 45 +- drivers/media/usb/dvb-usb-v2/af9035.c | 13 +- drivers/mfd/arizona-spi.c | 3 + drivers/mfd/dln2.c | 1 - drivers/mfd/mfd-core.c | 17 +- drivers/misc/ti-st/st_core.c | 7 +- drivers/mmc/core/mmc.c | 2 +- drivers/net/can/dev/dev.c | 10 +- drivers/net/can/dev/skb.c | 6 +- drivers/net/ethernet/broadcom/tg3.c | 3 +- .../chelsio/inline_crypto/chtls/chtls_cm.c | 2 +- drivers/net/ethernet/google/gve/gve_main.c | 2 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 10 +- drivers/net/ethernet/intel/iavf/iavf.h | 16 +- drivers/net/ethernet/intel/iavf/iavf_main.c | 43 +- drivers/net/ethernet/intel/iavf/iavf_virtchnl.c | 75 +- .../ethernet/marvell/octeontx2/af/rvu_debugfs.c | 5 + .../net/ethernet/marvell/octeontx2/nic/Makefile | 2 +- .../ethernet/marvell/octeontx2/nic/otx2_common.c | 64 +- .../ethernet/marvell/octeontx2/nic/otx2_common.h | 42 +- .../net/ethernet/marvell/octeontx2/nic/otx2_pf.c | 131 +- .../ethernet/marvell/octeontx2/nic/otx2_struct.h | 34 +- .../net/ethernet/marvell/octeontx2/nic/otx2_txrx.c | 66 +- .../net/ethernet/marvell/octeontx2/nic/otx2_txrx.h | 3 +- .../net/ethernet/marvell/octeontx2/nic/otx2_vf.c | 9 +- drivers/net/ethernet/marvell/octeontx2/nic/qos.h | 19 + .../net/ethernet/marvell/octeontx2/nic/qos_sq.c | 282 ++++ drivers/net/ethernet/mediatek/mtk_wed_regs.h | 4 +- .../mellanox/mlxsw/spectrum_acl_bloom_filter.c | 2 +- drivers/net/ethernet/realtek/r8169_main.c | 15 +- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 2 +- .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 14 +- drivers/net/ethernet/toshiba/spider_net.c | 2 +- drivers/net/ipvlan/ipvlan_core.c | 8 +- drivers/net/ipvlan/ipvlan_main.c | 1 + drivers/net/macsec.c | 6 +- drivers/net/wireless/ath/ath11k/mac.c | 8 + drivers/net/wireless/ath/ath11k/pci.c | 24 +- drivers/net/wireless/ath/dfs_pattern_detector.c | 2 +- drivers/net/wireless/intel/iwlwifi/dvm/tx.c | 5 +- .../net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h | 1 + drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.h | 5 +- drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 51 +- drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 11 +- drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 18 +- drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 1 + drivers/net/wireless/intel/iwlwifi/pcie/rx.c | 18 +- .../net/wireless/intel/iwlwifi/pcie/trans-gen2.c | 2 + drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 2 + drivers/net/wireless/intel/iwlwifi/queue/tx.c | 9 +- drivers/net/wireless/intel/iwlwifi/queue/tx.h | 2 +- drivers/net/wireless/mediatek/mt76/mt7603/beacon.c | 76 +- drivers/net/wireless/mediatek/mt76/mt7603/core.c | 2 + drivers/net/wireless/mediatek/mt76/mt7603/mac.c | 52 +- drivers/net/wireless/mediatek/mt76/mt7603/regs.h | 5 + drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 4 +- .../net/wireless/realtek/rtlwifi/rtl8188ee/dm.c | 2 +- .../wireless/realtek/rtlwifi/rtl8192c/dm_common.c | 2 +- .../net/wireless/realtek/rtlwifi/rtl8723ae/dm.c | 2 +- drivers/net/wireless/realtek/rtw88/debug.c | 4 +- drivers/net/wireless/silabs/wfx/data_tx.c | 71 +- drivers/nvdimm/of_pmem.c | 8 +- drivers/nvdimm/region_devs.c | 8 +- drivers/nvme/host/ioctl.c | 7 +- drivers/pci/controller/vmd.c | 3 +- drivers/pcmcia/cs.c | 1 + drivers/pcmcia/ds.c | 14 +- drivers/perf/arm-cmn.c | 161 ++- drivers/perf/hisilicon/hisi_pcie_pmu.c | 7 +- drivers/perf/hisilicon/hisi_uncore_pa_pmu.c | 4 +- drivers/perf/hisilicon/hisi_uncore_sllc_pmu.c | 4 +- drivers/perf/hisilicon/hns3_pmu.c | 8 +- drivers/pinctrl/renesas/pinctrl-rzg2l.c | 3 +- drivers/platform/x86/wmi.c | 36 +- drivers/pwm/pwm-brcmstb.c | 4 +- drivers/pwm/pwm-sti.c | 29 +- drivers/regulator/mt6358-regulator.c | 14 +- drivers/rtc/rtc-pcf85363.c | 2 +- drivers/scsi/ibmvscsi/ibmvfc.c | 3 +- drivers/soc/qcom/llcc-qcom.c | 3 + drivers/spi/Kconfig | 1 + drivers/spi/spi-nxp-fspi.c | 2 +- drivers/spi/spi-tegra20-slink.c | 2 + drivers/staging/media/sunxi/cedrus/cedrus_hw.c | 24 +- drivers/thermal/thermal_core.c | 6 +- drivers/tty/tty_jobctrl.c | 17 +- drivers/ufs/core/ufshcd.c | 2 +- drivers/usb/chipidea/host.c | 48 +- drivers/usb/dwc2/hcd.c | 2 +- drivers/usb/host/xhci-pci.c | 2 + drivers/usb/host/xhci-plat.c | 23 +- drivers/usb/usbip/stub_dev.c | 9 +- drivers/vhost/vsock.c | 214 ++- drivers/video/fbdev/fsl-diu-fb.c | 2 +- drivers/video/fbdev/imsttfb.c | 33 +- drivers/virt/coco/sev-guest/sev-guest.c | 113 +- drivers/watchdog/ixp4xx_wdt.c | 28 +- drivers/xen/xen-pciback/conf_space.c | 19 +- drivers/xen/xen-pciback/conf_space_capability.c | 8 +- drivers/xen/xen-pciback/conf_space_header.c | 21 +- drivers/xen/xenbus/xenbus_probe.c | 2 +- fs/btrfs/ioctl.c | 10 +- fs/ext4/extents.c | 10 +- fs/f2fs/data.c | 106 +- fs/f2fs/file.c | 1 + fs/f2fs/super.c | 33 + fs/fs-writeback.c | 41 +- fs/pstore/platform.c | 9 +- include/kunit/visibility.h | 33 + include/linux/clk-provider.h | 15 +- include/linux/cpuhotplug.h | 1 + include/linux/hisi_acc_qm.h | 15 +- include/linux/hw_random.h | 1 + include/linux/idr.h | 6 +- include/linux/mfd/core.h | 2 +- include/linux/netdevice.h | 1 + include/linux/numa.h | 7 + include/linux/pagemap.h | 2 + include/linux/string.h | 7 +- include/linux/verification.h | 1 + include/linux/virtio_vsock.h | 129 +- include/net/cfg80211.h | 21 + include/net/flow.h | 2 +- include/net/netfilter/nf_nat_redirect.h | 3 +- include/net/tcp.h | 2 +- include/uapi/linux/psp-sev.h | 7 + include/uapi/linux/sev-guest.h | 18 +- io_uring/kbuf.c | 11 +- io_uring/net.c | 24 +- kernel/bpf/hashtab.c | 7 +- kernel/bpf/helpers.c | 25 +- kernel/futex/core.c | 12 +- kernel/irq/matrix.c | 6 +- kernel/livepatch/core.c | 2 +- kernel/module/decompress.c | 4 +- kernel/padata.c | 6 +- kernel/sched/core.c | 10 +- kernel/sched/deadline.c | 2 + kernel/sched/fair.c | 35 +- kernel/sched/rt.c | 4 + kernel/trace/trace_kprobe.c | 2 +- lib/kunit/executor.c | 4 +- mm/filemap.c | 54 + mm/readahead.c | 3 +- net/9p/client.c | 6 +- net/bluetooth/hci_sync.c | 4 +- net/core/page_pool.c | 6 +- net/core/skbuff.c | 3 +- net/dccp/ipv4.c | 6 +- net/dccp/ipv6.c | 6 +- net/hsr/hsr_forward.c | 4 +- net/ipv4/syncookies.c | 20 +- net/ipv4/tcp_input.c | 9 +- net/ipv4/tcp_metrics.c | 15 +- net/ipv4/udp.c | 6 +- net/ipv6/ip6_output.c | 8 +- net/ipv6/syncookies.c | 7 +- net/llc/llc_input.c | 10 +- net/llc/llc_s_ac.c | 3 + net/llc/llc_station.c | 3 + net/mac80211/ieee80211_i.h | 18 +- net/mac80211/iface.c | 2 +- net/mac80211/main.c | 25 +- net/mac80211/offchannel.c | 36 +- net/mac80211/scan.c | 36 +- net/mac80211/sta_info.c | 2 +- net/mac80211/util.c | 11 +- net/netfilter/nf_nat_redirect.c | 98 +- net/netfilter/nf_tables_api.c | 4 - net/netfilter/nft_redir.c | 84 +- net/netfilter/xt_REDIRECT.c | 10 +- net/netfilter/xt_recent.c | 2 +- net/smc/af_smc.c | 4 +- net/smc/smc.h | 5 + net/smc/smc_cdc.c | 11 +- net/smc/smc_close.c | 5 +- net/tipc/link.c | 4 +- net/tipc/netlink.c | 4 +- net/tls/tls.h | 2 + net/tls/tls_sw.c | 42 +- net/vmw_vsock/virtio_transport.c | 149 +-- net/vmw_vsock/virtio_transport_common.c | 438 ++++--- net/vmw_vsock/vsock_loopback.c | 51 +- net/wireless/core.c | 34 +- net/wireless/core.h | 3 +- net/wireless/sysfs.c | 4 +- scripts/mod/file2alias.c | 14 +- security/apparmor/Kconfig | 4 +- security/apparmor/Makefile | 3 + security/apparmor/include/policy_unpack.h | 50 + security/apparmor/policy.c | 1 + security/apparmor/policy_unpack.c | 241 ++-- security/apparmor/policy_unpack_test.c | 69 +- sound/pci/hda/cs35l41_hda.c | 5 +- sound/soc/codecs/cs35l41.c | 14 +- sound/soc/codecs/hdmi-codec.c | 27 +- sound/soc/fsl/fsl_easrc.c | 8 +- sound/soc/fsl/mpc5200_dma.c | 3 + sound/soc/intel/skylake/skl-sst-utils.c | 1 + .../mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c | 4 +- sound/soc/soc-dapm.c | 2 +- sound/soc/sof/core.c | 6 +- sound/soc/ti/ams-delta.c | 4 +- tools/iio/iio_generic_buffer.c | 13 +- tools/objtool/objtool.c | 4 +- tools/perf/Documentation/perf-kwork.txt | 2 +- tools/perf/builtin-kwork.c | 13 +- tools/perf/builtin-stat.c | 2 +- tools/perf/util/bpf_off_cpu.c | 5 +- tools/perf/util/hist.c | 10 +- tools/perf/util/machine.c | 22 +- tools/testing/selftests/bpf/prog_tests/tailcalls.c | 32 +- tools/testing/selftests/net/pmtu.sh | 2 +- tools/testing/selftests/netfilter/Makefile | 5 +- .../netfilter/conntrack_sctp_collision.sh | 89 ++ tools/testing/selftests/netfilter/sctp_collision.c | 99 ++ tools/testing/selftests/netfilter/xt_string.sh | 128 ++ tools/testing/selftests/pidfd/pidfd_fdinfo_test.c | 2 +- tools/testing/selftests/pidfd/pidfd_test.c | 12 +- tools/testing/selftests/resctrl/resctrl_tests.c | 5 + 407 files changed, 7409 insertions(+), 4526 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/379 hwmon: (nct6775) Fix incorrect variable reuse in fan_div calculation
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zev Weiss <[email protected]>
commit 920057ad521dc8669e534736c2a12c14ec9fb2d7 upstream.
In the regmap conversion in commit 4ef2774511dc ("hwmon: (nct6775) Convert register access to regmap API") I reused the 'reg' variable for all three register reads in the fan speed calculation loop in nct6775_update_device(), but failed to notice that the value from the first one (data->REG_FAN[i]) is actually used in the call to nct6775_select_fan_div() at the end of the loop body. Since that patch the register value passed to nct6775_select_fan_div() has been (conditionally) incorrectly clobbered with the value of a different register than intended, which has in at least some cases resulted in fan speeds being adjusted down to zero.
Fix this by using dedicated temporaries for the two intermediate register reads instead of 'reg'.
--- drivers/hwmon/nct6775-core.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/hwmon/nct6775-core.c +8 -4
@@ -1528,17 +1528,21 @@ struct nct6775_data *nct6775_update_devi data->fan_div[i]);if (data->has_fan_min &BIT (i)) { - err =nct6775_read_value (data, data->REG_FAN_MIN[i], ®); +u16 tmp; + + err =nct6775_read_value (data, data->REG_FAN_MIN[i], &tmp);if (err) goto out; - data->fan_min[i] = reg; + data->fan_min[i] = tmp; }if (data->REG_FAN_PULSES[i]) { - err =nct6775_read_value (data, data->REG_FAN_PULSES[i], ®); +u16 tmp; + + err =nct6775_read_value (data, data->REG_FAN_PULSES[i], &tmp);if (err) goto out; - data->fan_pulses[i] = (reg >> data->FAN_PULSE_SHIFT[i]) &0x03 ; + data->fan_pulses[i] = (tmp >> data->FAN_PULSE_SHIFT[i]) &0x03 ; } err =nct6775_select_fan_div (dev, data, i, reg);
Greg Kroah-Hartman
maintainerPATCH 2/379 sched/fair: Fix cfs_rq_is_decayed() on !SMP
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengming Zhou <[email protected]>
[ Upstream commit c0490bc9bb62d9376f3dd4ec28e03ca0fef97152 ]
We don't need to maintain per-queue leaf_cfs_rq_list on !SMP, since it's used for cfs_rq load tracking & balancing on SMP.
But sched debug interface uses it to print per-cfs_rq stats.
This patch fixes the !SMP version of cfs_rq_is_decayed(), so the per-queue leaf_cfs_rq_list is also maintained correctly on !SMP, to fix the warning in assert_list_leaf_cfs_rq().
--- kernel/sched/fair.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/fair.c +1 -1
@@ -4585,7 +4585,7 @@ static inline void update_misfit_status(struct task_struct *p, struct rq *rq)static inline bool cfs_rq_is_decayed (struct cfs_rq *cfs_rq) { -return true; +return !cfs_rq->nr_running; }#define UPDATE_TG 0x0
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 3/379 iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit 066baf92bed934c9fb4bcee97a193f47aa63431c ]
copy_mc_to_user() has the destination marked __user on powerpc, but not on x86; the latter results in a sparse warning in lib/iov_iter.c.
Fix this by applying the tag on x86 too.
--- arch/x86/include/asm/uaccess.h | 2 +- arch/x86/lib/copy_mc.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
arch/x86/include/asm/uaccess.h +1 -1
@@ -518,7 +518,7 @@ copy_mc_to_kernel(void *to, const void *from, unsigned len);#define copy_mc_to_kernel copy_mc_to_kernelunsigned long __must_check -copy_mc_to_user (void *to,const void *from,unsigned len); +copy_mc_to_user (void __user *to,const void *from,unsigned len);#endif /*
arch/x86/lib/copy_mc.c +4 -4
@@ -70,23 +70,23 @@ unsigned long __must_check copy_mc_to_kernel(void *dst, const void *src, unsigne }EXPORT_SYMBOL_GPL (copy_mc_to_kernel); -unsigned long __must_check copy_mc_to_user (void *dst,const void *src,unsigned len) +unsigned long __must_check copy_mc_to_user (void __user *dst,const void *src,unsigned len) {unsigned long ret;if (copy_mc_fragile_enabled) {__uaccess_begin (); - ret =copy_mc_fragile (dst, src, len); + ret =copy_mc_fragile ((__force void *)dst, src, len);__uaccess_end ();return ret; }if (static_cpu_has (X86_FEATURE_ERMS )) {__uaccess_begin (); - ret =copy_mc_enhanced_fast_string (dst, src, len); + ret =copy_mc_enhanced_fast_string ((__force void *)dst, src, len);__uaccess_end ();return ret; } -return copy_user_generic (dst, src, len); +return copy_user_generic ((__force void *)dst, src, len); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 4/379 sched/uclamp: Set max_spare_cap_cpu even if max_spare_cap is 0
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qais Yousef <[email protected]>
[ Upstream commit 6b00a40147653c8ea748e8f4396510f252763364 ]
When uclamp_max is being used, the util of the task could be higher than the spare capacity of the CPU, but due to uclamp_max value we force-fit it there.
The way the condition for checking for max_spare_cap in find_energy_efficient_cpu() was constructed; it ignored any CPU that has its spare_cap less than or _equal_ to max_spare_cap. Since we initialize max_spare_cap to 0; this lead to never setting max_spare_cap_cpu and hence ending up never performing compute_energy() for this cluster and missing an opportunity for a better energy efficient placement to honour uclamp_max setting.
max_spare_cap = 0;
cpu_cap = capacity_of(cpu) - cpu_util(p); // 0 if cpu_util(p) is high
...
util_fits_cpu(...); // will return true if uclamp_max forces it to fit
...
// this logic will fail to update max_spare_cap_cpu if cpu_cap is 0
if (cpu_cap > max_spare_cap) {
max_spare_cap = cpu_cap;
max_spare_cap_cpu = cpu;
}prev_spare_cap suffers from a similar problem.
Fix the logic by converting the variables into long and treating -1 value as 'not populated' instead of 0 which is a viable and correct spare capacity value. We need to be careful signed comparison is used when comparing with cpu_cap in one of the conditions.
--- kernel/sched/fair.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
kernel/sched/fair.c +5 -6
@@ -7287,11 +7287,10 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu)for (; pd; pd = pd->next) {unsigned long util_min = p_util_min, util_max = p_util_max;unsigned long cpu_cap, cpu_thermal_cap, util; -unsigned long cur_delta, max_spare_cap =0 ; +long prev_spare_cap =-1 , max_spare_cap =-1 ;unsigned long rq_util_min, rq_util_max; -unsigned long prev_spare_cap =0 ; +unsigned long cur_delta, base_energy;int max_spare_cap_cpu =-1 ; -unsigned long base_energy;int fits, max_fits =-1 ;cpumask_and (cpus,perf_domain_span (pd), cpu_online_mask);
@@ -7354,7 +7353,7 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) prev_spare_cap = cpu_cap; prev_fits = fits; }else if ((fits > max_fits) || - ((fits == max_fits) && (cpu_cap > max_spare_cap))) { + ((fits == max_fits) && ((long )cpu_cap > max_spare_cap))) {/* * Find the CPU with the maximum spare capacity * among the remaining CPUs in the performance
@@ -7366,7 +7365,7 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) } } -if (max_spare_cap_cpu <0 && prev_spare_cap ==0 ) +if (max_spare_cap_cpu <0 && prev_spare_cap <0 )continue ;eenv_pd_busy_time (&eenv, cpus, p);
@@ -7374,7 +7373,7 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) base_energy =compute_energy (&eenv, pd, cpus, p,-1 );/* Evaluate the energy impact of using prev_cpu. */ -if (prev_spare_cap >0 ) { +if (prev_spare_cap >-1 ) { prev_delta =compute_energy (&eenv, pd, cpus, p, prev_cpu);/* CPU utilization has changed */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 5/379 sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qais Yousef <[email protected]>
[ Upstream commit 23c9519def98ee0fa97ea5871535e9b136f522fc ]
find_energy_efficient_cpu() bails out early if effective util of the task is 0 as the delta at this point will be zero and there's nothing for EAS to do. When uclamp is being used, this could lead to wrong decisions when uclamp_max is set to 0. In this case the task is capped to performance point 0, but it is actually running and consuming energy and we can benefit from EAS energy calculations.
Rework the condition so that it bails out when both util and uclamp_min are 0.
We can do that without needing to use uclamp_task_util(); remove it.
--- kernel/sched/fair.c | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-)
kernel/sched/fair.c +1 -17
@@ -4279,22 +4279,6 @@ static inline unsigned long task_util_est(struct task_struct *p)return max (task_util (p),_task_util_est (p)); } -#ifdef CONFIG_UCLAMP_TASK -static inline unsigned long uclamp_task_util (struct task_struct *p, -unsigned long uclamp_min, -unsigned long uclamp_max) -{ -return clamp (task_util_est (p), uclamp_min, uclamp_max); -} -#else -static inline unsigned long uclamp_task_util (struct task_struct *p, -unsigned long uclamp_min, -unsigned long uclamp_max) -{ -return task_util_est (p); -} -#endif -static inline void util_est_enqueue (struct cfs_rq *cfs_rq,struct task_struct *p) {
@@ -7279,7 +7263,7 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) target = prev_cpu;sync_entity_load_avg (&p->se); -if (!uclamp_task_util (p, p_util_min, p_util_max)) +if (!task_util_est (p) && p_util_min ==0 ) goto unlock;eenv_task_busy_time (&eenv, p, prev_cpu);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 6/379 objtool: Propagate early errors
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaron Plattner <[email protected]>
[ Upstream commit e959c279d391c10b35ce300fb4b0fe3b98e86bd2 ]
If objtool runs into a problem that causes it to exit early, the overall tool still returns a status code of 0, which causes the build to continue as if nothing went wrong.
Note this only affects early errors, as later errors are still ignored by check().
--- tools/objtool/objtool.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
tools/objtool/objtool.c +1 -3
@@ -146,7 +146,5 @@ int main(int argc, const char **argv)exec_cmd_init ("objtool" ,UNUSED ,UNUSED ,UNUSED );pager_init (UNUSED ); -objtool_run (argc, argv); - -return 0 ; +return objtool_run (argc, argv); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 7/379 sched: Fix stop_one_cpu_nowait() vs hotplug
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
[ Upstream commit f0498d2a54e7966ce23cd7c7ff42c64fa0059b07 ]
Kuyo reported sporadic failures on a sched_setaffinity() vs CPU hotplug stress-test -- notably affine_move_task() remains stuck in wait_for_completion(), leading to a hung-task detector warning.
Specifically, it was reported that stop_one_cpu_nowait(.fn = migration_cpu_stop) returns false -- this stopper is responsible for the matching complete().
The race scenario is:
CPU0 CPU1 // doing _cpu_down()
__set_cpus_allowed_ptr()
task_rq_lock();
takedown_cpu()
stop_machine_cpuslocked(take_cpu_down..)
<PREEMPT: cpu_stopper_thread()
MULTI_STOP_PREPARE
...
__set_cpus_allowed_ptr_locked()
affine_move_task()
task_rq_unlock();<PREEMPT: cpu_stopper_thread()\>
ack_state()
MULTI_STOP_RUN
take_cpu_down()
__cpu_disable();
stop_machine_park();
stopper->enabled = false;
/>
/>
stop_one_cpu_nowait(.fn = migration_cpu_stop);
if (stopper->enabled) // false!!!That is, by doing stop_one_cpu_nowait() after dropping rq-lock, the stopper thread gets a chance to preempt and allows the cpu-down for the target CPU to complete.
OTOH, since stop_one_cpu_nowait() / cpu_stop_queue_work() needs to issue a wakeup, it must not be ran under the scheduler locks.
Solve this apparent contradiction by keeping preemption disabled over the unlock + queue_stopper combination:
preempt_disable(); task_rq_unlock(...); if (!stop_pending) stop_one_cpu_nowait(...) preempt_enable();
This respects the lock ordering contraints while still avoiding the above race. That is, if we find the CPU is online under rq-lock, the targeted stop_one_cpu_nowait() must succeed.
Apply this pattern to all similar stop_one_cpu_nowait() invocations.
--- kernel/sched/core.c | 10 ++++++++-- kernel/sched/deadline.c | 2 ++ kernel/sched/fair.c | 4 +++- kernel/sched/rt.c | 4 ++++ 4 files changed, 17 insertions(+), 3 deletions(-)
kernel/sched/core.c +8 -2
@@ -2463,9 +2463,11 @@ static int migration_cpu_stop(void *data)* it. */ WARN_ON_ONCE (!pending->stop_pending); +preempt_disable ();task_rq_unlock (rq, p, &rf);stop_one_cpu_nowait (task_cpu (p), migration_cpu_stop, &pending->arg, &pending->stop_work); +preempt_enable ();return 0 ; } out:
@@ -2746,12 +2748,13 @@ static int affine_move_task(struct rq *rq, struct task_struct *p, struct rq_flag complete = true; } +preempt_disable ();task_rq_unlock (rq, p, rf); -if (push_task) {stop_one_cpu_nowait (rq->cpu, push_cpu_stop, p, &rq->push_work); } +preempt_enable ();if (complete)complete_all (&pending->done);
@@ -2817,12 +2820,13 @@ static int affine_move_task(struct rq *rq, struct task_struct *p, struct rq_flagif (flags &SCA_MIGRATE_ENABLE ) p->migration_flags &= ~MDF_PUSH ; +preempt_disable ();task_rq_unlock (rq, p, rf); -if (!stop_pending) {stop_one_cpu_nowait (cpu_of (rq), migration_cpu_stop, &pending->arg, &pending->stop_work); } +preempt_enable ();if (flags &SCA_MIGRATE_ENABLE )return 0 ;
@@ -9255,9 +9259,11 @@ static void balance_push(struct rq *rq)* Temporarily drop rq->lock such that we can wake-up the stop task. * Both preemption and IRQs are still disabled. */ +preempt_disable ();raw_spin_rq_unlock (rq);stop_one_cpu_nowait (rq->cpu, __balance_push_cpu_stop, push_task,this_cpu_ptr (&push_work)); +preempt_enable ();/* * At this point need_resched() is true and we'll take the loop in * schedule(). The next pick is obviously going to be the stop task
kernel/sched/deadline.c +2 -0
@@ -2460,9 +2460,11 @@ static void pull_dl_task(struct rq *this_rq)double_unlock_balance (this_rq, src_rq);if (push_task) { +preempt_disable ();raw_spin_rq_unlock (this_rq);stop_one_cpu_nowait (src_rq->cpu, push_cpu_stop, push_task, &src_rq->push_work); +preempt_enable ();raw_spin_rq_lock (this_rq); } }
kernel/sched/fair.c +3 -1
@@ -10713,13 +10713,15 @@ static int load_balance(int this_cpu, struct rq *this_rq, busiest->push_cpu = this_cpu; active_balance =1 ; } -raw_spin_rq_unlock_irqrestore (busiest, flags); +preempt_disable (); +raw_spin_rq_unlock_irqrestore (busiest, flags);if (active_balance) {stop_one_cpu_nowait (cpu_of (busiest), active_load_balance_cpu_stop, busiest, &busiest->active_balance_work); } +preempt_enable (); } }else { sd->nr_balance_failed =0 ;
kernel/sched/rt.c +4 -0
@@ -2109,9 +2109,11 @@ static int push_rt_task(struct rq *rq, bool pull)*/ push_task =get_push_task (rq);if (push_task) { +preempt_disable ();raw_spin_rq_unlock (rq);stop_one_cpu_nowait (rq->cpu, push_cpu_stop, push_task, &rq->push_work); +preempt_enable ();raw_spin_rq_lock (rq); }
@@ -2448,9 +2450,11 @@ static void pull_rt_task(struct rq *this_rq)double_unlock_balance (this_rq, src_rq);if (push_task) { +preempt_disable ();raw_spin_rq_unlock (this_rq);stop_one_cpu_nowait (src_rq->cpu, push_cpu_stop, push_task, &src_rq->push_work); +preempt_enable ();raw_spin_rq_lock (this_rq); } }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 8/379 vfs: fix readahead(2) on block devices
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Reuben Hawkins <[email protected]>
[ Upstream commit 7116c0af4b8414b2f19fdb366eea213cbd9d91c2 ]
Readahead was factored to call generic_fadvise. That refactor added an S_ISREG restriction which broke readahead on block devices.
In addition to S_ISREG, this change checks S_ISBLK to fix block device readahead. There is no change in behavior with any file type besides block devices in this change.
--- mm/readahead.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
mm/readahead.c +2 -1
@@ -749,7 +749,8 @@ ssize_t ksys_readahead(int fd, loff_t offset, size_t count)*/ ret = -EINVAL ;if (!f.file->f_mapping || !f.file->f_mapping->a_ops || - !S_ISREG (file_inode (f.file)->i_mode)) + (!S_ISREG (file_inode (f.file)->i_mode) && + !S_ISBLK (file_inode (f.file)->i_mode))) goto out; ret =vfs_fadvise (f.file, offset, count,POSIX_FADV_WILLNEED );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 9/379 writeback, cgroup: switch inodes with dirty timestamps to release dying cgwbs
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jingbo Xu <[email protected]>
[ Upstream commit 6654408a33e6297d8e1d2773409431d487399b95 ]
The cgwb cleanup routine will try to release the dying cgwb by switching the attached inodes. It fetches the attached inodes from wb->b_attached list, omitting the fact that inodes only with dirty timestamps reside in wb->b_dirty_time list, which is the case when lazytime is enabled. This causes enormous zombie memory cgroup when lazytime is enabled, as inodes with dirty timestamps can not be switched to a live cgwb for a long time.
It is reasonable not to switch cgwb for inodes with dirty data, as otherwise it may break the bandwidth restrictions. However since the writeback of inode metadata is not accounted for, let's also switch inodes with dirty timestamps to avoid zombie memory and block cgroups when laztytime is enabled.
--- fs/fs-writeback.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-)
fs/fs-writeback.c +29 -12
@@ -611,6 +611,24 @@ static void inode_switch_wbs(struct inode *inode, int new_wb_id)kfree (isw); } +static bool isw_prepare_wbs_switch (struct inode_switch_wbs_context *isw, +struct list_head *list,int *nr) +{ +struct inode *inode; + +list_for_each_entry (inode, list, i_io_list) { +if (!inode_prepare_wbs_switch (inode, isw->new_wb)) +continue ; + + isw->inodes[*nr] = inode; + (*nr)++; + +if (*nr >=WB_MAX_INODES_PER_ISW -1 ) +return true; + } +return false; +} +/** * cleanup_offline_cgwb - detach associated inodes * @wb: target wb
@@ -623,7 +641,6 @@ bool cleanup_offline_cgwb(struct bdi_writeback *wb) {struct cgroup_subsys_state *memcg_css;struct inode_switch_wbs_context *isw; -struct inode *inode;int nr;bool restart = false;
@@ -645,17 +662,17 @@ bool cleanup_offline_cgwb(struct bdi_writeback *wb) nr =0 ;spin_lock (&wb->list_lock); -list_for_each_entry (inode, &wb->b_attached, i_io_list) { -if (!inode_prepare_wbs_switch (inode, isw->new_wb)) -continue ; - - isw->inodes[nr++] = inode; - -if (nr >=WB_MAX_INODES_PER_ISW -1 ) { - restart = true; -break ; - } - } +/* +* In addition to the inodes that have completed writeback, also switch +* cgwbs for those inodes only with dirty timestamps. Otherwise, those +* inodes won't be written back for a long time when lazytime is +* enabled, and thus pinning the dying cgwbs. It won't break the +* bandwidth restrictions, as writeback of inode metadata is not +* accounted for. +*/ + restart =isw_prepare_wbs_switch (isw, &wb->b_attached, &nr); +if (!restart) + restart =isw_prepare_wbs_switch (isw, &wb->b_dirty_time, &nr);spin_unlock (&wb->list_lock);/* no attached inodes? bail out */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 10/379 x86/srso: Fix SBPB enablement for (possible) future fixed HW
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josh Poimboeuf <[email protected]>
[ Upstream commit 1d1142ac51307145dbb256ac3535a1d43a1c9800 ]
Make the SBPB check more robust against the (possible) case where future HW has SRSO fixed but doesn't have the SRSO_NO bit set.
--- arch/x86/kernel/cpu/bugs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/cpu/bugs.c +1 -1
@@ -2477,7 +2477,7 @@ static void __init srso_select_mitigation(void)pr_info ("%s%s\n" , srso_strings[srso_mitigation], (has_microcode ?"" :", no microcode" )); pred_cmd: -if ((boot_cpu_has (X86_FEATURE_SRSO_NO ) || srso_cmd ==SRSO_CMD_OFF ) && +if ((!boot_cpu_has_bug (X86_BUG_SRSO ) || srso_cmd ==SRSO_CMD_OFF ) &&boot_cpu_has (X86_FEATURE_SBPB )) x86_pred_cmd =PRED_CMD_SBPB ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 11/379 futex: Dont include process MM in futex key on no-MMU
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Wolsieffer <[email protected]>
[ Upstream commit c73801ae4f22b390228ebf471d55668e824198b6 ]
On no-MMU, all futexes are treated as private because there is no need to map a virtual address to physical to match the futex across processes. This doesn't quite work though, because private futexes include the current process's mm_struct as part of their key. This makes it impossible for one process to wake up a shared futex being waited on in another process.
Fix this bug by excluding the mm_struct from the key. With a single address space, the futex address is already a unique key.
--- kernel/futex/core.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
kernel/futex/core.c +11 -1
@@ -248,7 +248,17 @@ int get_futex_key(u32 __user *uaddr, bool fshared, union futex_key *key,* but access_ok() should be faster than find_vma() */ if (!fshared) { - key->private.mm = mm; +/* +* On no-MMU, shared futexes are treated as private, therefore +* we must not include the current process in the key. Since +* there is only one address space, the address is a unique key +* on its own. +*/ +if (IS_ENABLED (CONFIG_MMU )) + key->private.mm = mm; +else + key->private.mm =NULL ; + key->private.address = address;return 0 ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 12/379 x86/numa: Introduce numa_fill_memblks()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alison Schofield <[email protected]>
[ Upstream commit 8f012db27c9516be1a7aca93ea4a6ca9c75056c9 ]
numa_fill_memblks() fills in the gaps in numa_meminfo memblks over an physical address range.
The ACPI driver will use numa_fill_memblks() to implement a new Linux policy that prescribes extending proximity domains in a portion of a CFMWS window to the entire window.
Dan Williams offered this explanation of the policy:
A CFWMS is an ACPI data structure that indicates *potential* locations where CXL memory can be placed. It is the playground where the CXL driver has free reign to establish regions. That space can be populated by BIOS created regions, or driver created regions, after hotplug or other reconfiguration.
When BIOS creates a region in a CXL Window it additionally describes that subset of the Window range in the other typical ACPI tables SRAT, SLIT, and HMAT. The rationale for BIOS not pre-describing the entire CXL Window in SRAT, SLIT, and HMAT is that it can not predict the future. I.e. there is nothing stopping higher or lower performance devices being placed in the same Window. Compare that to ACPI memory hotplug that just onlines additional capacity in the proximity domain with little freedom for dynamic performance differentiation.
That leaves the OS with a choice, should unpopulated window capacity match the proximity domain of an existing region, or should it allocate a new one? This patch takes the simple position of minimizing proximity domain proliferation by reusing any proximity domain intersection for the entire Window. If the Window has no intersections then allocate a new proximity domain. Note that SRAT, SLIT and HMAT information can be enumerated dynamically in a standard way from device provided data. Think of CXL as the end of ACPI needing to describe memory attributes, CXL offers a standard discovery model for performance attributes, but Linux still needs to interoperate with the old regime.
Stable-dep-of: 8f1004679987 ("ACPI/NUMA: Apply SRAT proximity domain to entire CFMWS window")
--- arch/x86/include/asm/sparsemem.h | 2 + arch/x86/mm/numa.c | 80 ++++++++++++++++++++++++++++++++ include/linux/numa.h | 7 +++ 3 files changed, 89 insertions(+)
arch/x86/include/asm/sparsemem.h +2 -0
@@ -37,6 +37,8 @@ extern int phys_to_target_node(phys_addr_t start);#define phys_to_target_node phys_to_target_nodeextern int memory_add_physaddr_to_nid (u64 start);#define memory_add_physaddr_to_nid memory_add_physaddr_to_nid +extern int numa_fill_memblks (u64 start,u64 end); +#define numa_fill_memblks numa_fill_memblks#endif #endif /* __ASSEMBLY__ */
arch/x86/mm/numa.c +80 -0
90 lines not on this page · raw message
include/linux/numa.h +7 -0
@@ -12,6 +12,7 @@#define MAX_NUMNODES (1 << NODES_SHIFT)#define NUMA_NO_NODE (-1) +#define NUMA_NO_MEMBLK (-1)/* optionally keep NUMA memory info available post init */ #ifdef CONFIG_NUMA_KEEP_MEMINFO
@@ -43,6 +44,12 @@ static inline int phys_to_target_node(u64 start) return 0; }#endif +#ifndef numa_fill_memblks +static inline int __init numa_fill_memblks (u64 start,u64 end) +{ +return NUMA_NO_MEMBLK ; +} +#endif #else /* !CONFIG_NUMA */ static inline int numa_map_to_online_node (int node) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 13/379 ACPI/NUMA: Apply SRAT proximity domain to entire CFMWS window
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alison Schofield <[email protected]>
[ Upstream commit 8f1004679987302b155f14b966ca6d4335814fcb ]
Commit fd49f99c1809 ("ACPI: NUMA: Add a node and memblk for each CFMWS not in SRAT") did not account for the case where the BIOS only partially describes a CFMWS Window in the SRAT. That means the omitted address ranges, of a partially described CFMWS Window, do not get assigned to a NUMA node.
Replace the call to phys_to_target_node() with numa_add_memblks(). Numa_add_memblks() searches an HPA range for existing memblk(s) and extends those memblk(s) to fill the entire CFMWS Window.
Extending the existing memblks is a simple strategy that reuses SRAT defined proximity domains from part of a window to fill out the entire window, based on the knowledge* that all of a CFMWS window is of a similar performance class.
*Note that this heuristic will evolve when CFMWS Windows present a wider range of characteristics. The extension of the proximity domain, implemented here, is likely a step in developing a more sophisticated performance profile in the future.
There is no change in behavior when the SRAT does not describe the CFMWS Window at all. In that case, a new NUMA node with a single memblk covering the entire CFMWS Window is created.
--- drivers/acpi/numa/srat.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/acpi/numa/srat.c +8 -3
@@ -310,11 +310,16 @@ static int __init acpi_parse_cfmws(union acpi_subtable_headers *header, start = cfmws->base_hpa; end = cfmws->base_hpa + cfmws->window_size; -/* Skip if the SRAT already described the NUMA details for this HPA */ - node =phys_to_target_node (start); -if (node !=NUMA_NO_NODE ) +/* +* The SRAT may have already described NUMA details for all, +* or a portion of, this CFMWS HPA range. Extend the memblks +* found for any portion of the window to cover the entire +* window. +*/ +if (!numa_fill_memblks (start, end))return 0 ; +/* No SRAT description. Create a new node. */ node =acpi_map_pxm_to_node (*fake_pxm);if (node ==NUMA_NO_NODE ) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 14/379 x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Dunlap <[email protected]>
[ Upstream commit f79936545fb122856bd78b189d3c7ee59928c751 ]
Previously, if copy_from_kernel_nofault() was called before boot_cpu_data.x86_virt_bits was set up, then it would trigger undefined behavior due to a shift by 64.
This ended up causing boot failures in the latest version of ubuntu2204 in the gcp project when using SEV-SNP.
Specifically, this function is called during an early #VC handler which is triggered by a CPUID to check if NX is implemented.
--- arch/x86/mm/maccess.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
arch/x86/mm/maccess.c +14 -5
@@ -9,12 +9,21 @@ bool copy_from_kernel_nofault_allowed(const void *unsafe_src, size_t size)unsigned long vaddr = (unsigned long )unsafe_src;/* -* Range covering the highest possible canonical userspace address -* as well as non-canonical address range. For the canonical range -* we also need to include the userspace guard page. +* Do not allow userspace addresses. This disallows +* normal userspace and the userspace guard page: */ -return vaddr >=TASK_SIZE_MAX +PAGE_SIZE && - __is_canonical_address(vaddr, boot_cpu_data.x86_virt_bits); +if (vaddr <TASK_SIZE_MAX +PAGE_SIZE ) +return false; + +/* +* Allow everything during early boot before 'x86_virt_bits' +* is initialized. Needed for instruction decoding in early +* exception handlers. +*/ +if (!boot_cpu_data.x86_virt_bits) +return true; + + return __is_canonical_address(vaddr, boot_cpu_data.x86_virt_bits); }#else bool copy_from_kernel_nofault_allowed (const void *unsafe_src,size_t size)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 15/379 x86/boot: Fix incorrect startup_gdt_descr.size
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuntao Wang <[email protected]>
[ Upstream commit 001470fed5959d01faecbd57fcf2f60294da0de1 ]
Since the size value is added to the base address to yield the last valid byte address of the GDT, the current size value of startup_gdt_descr is incorrect (too large by one), fix it.
[ mingo: This probably never mattered, because startup_gdt[] is only used
in a very controlled fashion - but make it consistent nevertheless. ]
--- arch/x86/kernel/head64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/head64.c +1 -1
@@ -80,7 +80,7 @@ static struct desc_struct startup_gdt[GDT_ENTRIES] = {* while the kernel still uses a direct mapping. */ static struct desc_ptr startup_gdt_descr = { - .size =sizeof (startup_gdt), + .size =sizeof (startup_gdt)-1 , .address =0 , };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 16/379 drivers/clocksource/timer-ti-dm: Dont call clk_get_rate() in stop function
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivaylo Dimitrov <[email protected]>
[ Upstream commit 12590d4d0e331d3cb9e6b3494515cd61c8a6624e ]
clk_get_rate() might sleep, and that prevents dm-timer based PWM from being used from atomic context.
Fix that by getting fclk rate in probe() and using a notifier in case rate changes.
--- drivers/clocksource/timer-ti-dm.c | 36 ++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 8 deletions(-)
drivers/clocksource/timer-ti-dm.c +28 -8
@@ -141,6 +141,8 @@ struct dmtimer {struct platform_device *pdev;struct list_head node;struct notifier_block nb; +struct notifier_block fclk_nb; +unsigned long fclk_rate; };static u32 omap_reserved_systimers;
@@ -254,8 +256,7 @@ static inline void __omap_dm_timer_enable_posted(struct dmtimer *timer) timer->posted =OMAP_TIMER_POSTED ; } -static inline void __omap_dm_timer_stop (struct dmtimer *timer, -unsigned long rate) +static inline void __omap_dm_timer_stop (struct dmtimer *timer) {u32 l;
@@ -270,7 +271,7 @@ static inline void __omap_dm_timer_stop(struct dmtimer *timer,* Wait for functional clock period x 3.5 to make sure that * timer is stopped */ -udelay (3500000 / rate +1 ); +udelay (3500000 / timer->fclk_rate +1 );#endif }
@@ -349,6 +350,21 @@ static int omap_timer_context_notifier(struct notifier_block *nb,return NOTIFY_OK ; } +static int omap_timer_fclk_notifier (struct notifier_block *nb, +unsigned long event,void *data) +{ +struct clk_notifier_data *clk_data = data; + struct dmtimer *timer = container_of(nb, struct dmtimer, fclk_nb); + +switch (event) { +case POST_RATE_CHANGE : + timer->fclk_rate = clk_data->new_rate; +return NOTIFY_OK ; +default : +return NOTIFY_DONE ; + } +} +static int omap_dm_timer_reset (struct dmtimer *timer) {u32 l, timeout =100000 ;
@@ -742,7 +758,6 @@ static int omap_dm_timer_stop(struct omap_dm_timer *cookie) {struct dmtimer *timer;struct device *dev; -unsigned long rate =0 ; timer =to_dmtimer (cookie);if (unlikely (!timer))
@@ -750,10 +765,7 @@ static int omap_dm_timer_stop(struct omap_dm_timer *cookie) dev = &timer->pdev->dev; -if (!timer->omap1) - rate =clk_get_rate (timer->fclk); - -__omap_dm_timer_stop (timer, rate); +__omap_dm_timer_stop (timer);pm_runtime_put_sync (dev);
@@ -1112,6 +1124,14 @@ static int omap_dm_timer_probe(struct platform_device *pdev) timer->fclk =devm_clk_get (dev,"fck" );if (IS_ERR (timer->fclk))return PTR_ERR (timer->fclk); + + timer->fclk_nb.notifier_call = omap_timer_fclk_notifier; + ret =devm_clk_notifier_register (dev, timer->fclk, + &timer->fclk_nb); +if (ret) +return ret; + + timer->fclk_rate =clk_get_rate (timer->fclk); }else { timer->fclk =ERR_PTR (-ENODEV ); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 17/379 pstore/platform: Add check for kstrdup
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit a19d48f7c5d57c0f0405a7d4334d1d38fe9d3c1c ]
Add check for the return value of kstrdup() and return the error if it fails in order to avoid NULL pointer dereference.
--- fs/pstore/platform.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
fs/pstore/platform.c +8 -1
@@ -561,6 +561,8 @@ static int pstore_write_user_compat(struct pstore_record *record,*/ int pstore_register (struct pstore_info *psi) { +char *new_backend; +if (backend &&strcmp (backend, psi->name)) {pr_warn ("ignoring unexpected backend '%s'\n" , psi->name);return -EPERM ;
@@ -580,11 +582,16 @@ int pstore_register(struct pstore_info *psi)return -EINVAL ; } + new_backend =kstrdup (psi->name,GFP_KERNEL ); +if (!new_backend) +return -ENOMEM ; +mutex_lock (&psinfo_lock);if (psinfo) {pr_warn ("backend '%s' already loaded: ignoring '%s'\n" , psinfo->name, psi->name);mutex_unlock (&psinfo_lock); +kfree (new_backend);return -EBUSY ; }
@@ -617,7 +624,7 @@ int pstore_register(struct pstore_info *psi)* Update the module parameter backend, so it is visible * through /sys/module/pstore/parameters/backend */ - backend =kstrdup (psi->name,GFP_KERNEL ); + backend = new_backend;pr_info ("Registered %s as persistent store backend\n" , psi->name);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 18/379 string: Adjust strtomem() logic to allow for smaller sources
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit 0e108725f6cc5b3be9e607f89c9fbcbb236367b7 ]
Arnd noticed we have a case where a shorter source string is being copied into a destination byte array, but this results in a strnlen() call that exceeds the size of the source. This is seen with -Wstringop-overread:
In file included from ../include/linux/uuid.h:11,
from ../include/linux/mod_devicetable.h:14,
from ../include/linux/cpufeature.h:12,
from ../arch/x86/coco/tdx/tdx.c:7:
../arch/x86/coco/tdx/tdx.c: In function 'tdx_panic.constprop':
../include/linux/string.h:284:9: error: 'strnlen' specified bound 64 exceeds source size 60 [-Werror=stringop-overread]
284 | memcpy_and_pad(dest, _dest_len, src, strnlen(src, _dest_len), pad); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../arch/x86/coco/tdx/tdx.c:124:9: note: in expansion of macro 'strtomem_pad'
124 | strtomem_pad(message.str, msg, '\0');
| ^~~~~~~~~~~~Use the smaller of the two buffer sizes when calling strnlen(). When src length is unknown (SIZE_MAX), it is adjusted to use dest length, which is what the original code did.
--- include/linux/string.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
include/linux/string.h +5 -2
@@ -276,10 +276,12 @@ void memcpy_and_pad(void *dest, size_t dest_len, const void *src, size_t count,*/ #define strtomem_pad (dest, src, pad) do { \ const size_t _dest_len = __builtin_object_size(dest, 1); \ + const size_t _src_len = __builtin_object_size(src, 1); \ \ BUILD_BUG_ON(!__builtin_constant_p(_dest_len) || \ _dest_len == (size_t)-1); \ - memcpy_and_pad(dest, _dest_len, src, strnlen(src, _dest_len), pad); \ + memcpy_and_pad(dest, _dest_len, src, \ + strnlen(src, min(_src_len, _dest_len)), pad); \ } while (0)/**
@@ -297,10 +299,11 @@ void memcpy_and_pad(void *dest, size_t dest_len, const void *src, size_t count,*/ #define strtomem (dest, src) do { \ const size_t _dest_len = __builtin_object_size(dest, 1); \ + const size_t _src_len = __builtin_object_size(src, 1); \ \ BUILD_BUG_ON(!__builtin_constant_p(_dest_len) || \ _dest_len == (size_t)-1); \ - memcpy(dest, src, min(_dest_len, strnlen(src, _dest_len))); \ + memcpy(dest, src, strnlen(src, min(_src_len, _dest_len))); \ } while (0)/**
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 19/379 genirq/matrix: Exclude managed interrupts in irq_matrix_allocated()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Yu <[email protected]>
[ Upstream commit a0b0bad10587ae2948a7c36ca4ffc206007fbcf3 ]
When a CPU is about to be offlined, x86 validates that all active interrupts which are targeted to this CPU can be migrated to the remaining online CPUs. If not, the offline operation is aborted.
The validation uses irq_matrix_allocated() to retrieve the number of vectors which are allocated on the outgoing CPU. The returned number of allocated vectors includes also vectors which are associated to managed interrupts.
That's overaccounting because managed interrupts are:
- not migrated when the affinity mask of the interrupt targets only the outgoing CPU
- migrated to another CPU, but in that case the vector is already pre-allocated on the potential target CPUs and must not be taken into account.
As a consequence the check whether the remaining online CPUs have enough capacity for migrating the allocated vectors from the outgoing CPU might fail incorrectly.
Let irq_matrix_allocated() return only the number of allocated non-managed interrupts to make this validation check correct.
[ tglx: Amend changelog and fixup kernel-doc comment ]
--- kernel/irq/matrix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/irq/matrix.c +3 -3
@@ -466,16 +466,16 @@ unsigned int irq_matrix_reserved(struct irq_matrix *m) }/** -* irq_matrix_allocated - Get the number of allocated irqs on the local cpu +* irq_matrix_allocated - Get the number of allocated non-managed irqs on the local CPU * @m: Pointer to the matrix to search * -* This returns number of allocated irqs +* This returns number of allocated non-managed interrupts. */ unsigned int irq_matrix_allocated (struct irq_matrix *m) {struct cpumap *cm =this_cpu_ptr (m->maps); -return cm->allocated; +return cm->allocated - cm->managed_allocated; }#ifdef CONFIG_GENERIC_IRQ_DEBUGFS
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 20/379 wifi: cfg80211: add flush functions for wiphy work
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 56cfb8ce1f7f6c4e5ca571a2ec0880e131cd0311 ]
There may be sometimes reasons to actually run the work if it's pending, add flush functions for both regular and delayed wiphy work that will do this.
Stable-dep-of: eadfb54756ae ("wifi: mac80211: move sched-scan stop work to wiphy work")
--- include/net/cfg80211.h | 21 +++++++++++++++++++++ net/wireless/core.c | 34 ++++++++++++++++++++++++++++++++-- net/wireless/core.h | 3 ++- net/wireless/sysfs.c | 4 ++-- 4 files changed, 57 insertions(+), 5 deletions(-)
include/net/cfg80211.h +21 -0
@@ -5690,6 +5690,16 @@ void wiphy_work_queue(struct wiphy *wiphy, struct wiphy_work *work);*/ void wiphy_work_cancel (struct wiphy *wiphy,struct wiphy_work *work); +/** +* wiphy_work_flush - flush previously queued work +* @wiphy: the wiphy, for debug purposes +* @work: the work to flush, this can be %NULL to flush all work +* +* Flush the work (i.e. run it if pending). This must be called +* under the wiphy mutex acquired by wiphy_lock(). +*/ +void wiphy_work_flush (struct wiphy *wiphy,struct wiphy_work *work); +struct wiphy_delayed_work {struct wiphy_work work;struct wiphy *wiphy;
@@ -5733,6 +5743,17 @@ void wiphy_delayed_work_queue(struct wiphy *wiphy,void wiphy_delayed_work_cancel (struct wiphy *wiphy,struct wiphy_delayed_work *dwork); +/** +* wiphy_delayed work_flush - flush previously queued delayed work +* @wiphy: the wiphy, for debug purposes +* @work: the work to flush +* +* Flush the work (i.e. run it if pending). This must be called +* under the wiphy mutex acquired by wiphy_lock(). +*/ +void wiphy_delayed_work_flush (struct wiphy *wiphy, +struct wiphy_delayed_work *dwork); +/** * struct wireless_dev - wireless device state *
net/wireless/core.c +32 -2
@@ -1042,7 +1042,8 @@ void wiphy_rfkill_start_polling(struct wiphy *wiphy) }EXPORT_SYMBOL (wiphy_rfkill_start_polling); -void cfg80211_process_wiphy_works (struct cfg80211_registered_device *rdev) +void cfg80211_process_wiphy_works (struct cfg80211_registered_device *rdev, +struct wiphy_work *end) {unsigned int runaway_limit =100 ;unsigned long flags;
@@ -1061,6 +1062,10 @@ void cfg80211_process_wiphy_works(struct cfg80211_registered_device *rdev) wk->func (&rdev->wiphy, wk);spin_lock_irqsave (&rdev->wiphy_work_lock, flags); + +if (wk == end) +break ; +if (WARN_ON (--runaway_limit ==0 ))INIT_LIST_HEAD (&rdev->wiphy_work_list); }
@@ -1111,7 +1116,7 @@ void wiphy_unregister(struct wiphy *wiphy)#endif /* surely nothing is reachable now, clean up work */ -cfg80211_process_wiphy_works (rdev); +cfg80211_process_wiphy_works (rdev,NULL );wiphy_unlock (&rdev->wiphy);rtnl_unlock ();
@@ -1636,6 +1641,21 @@ void wiphy_work_cancel(struct wiphy *wiphy, struct wiphy_work *work) }EXPORT_SYMBOL_GPL (wiphy_work_cancel); +void wiphy_work_flush (struct wiphy *wiphy,struct wiphy_work *work) +{ +struct cfg80211_registered_device *rdev =wiphy_to_rdev (wiphy); +unsigned long flags; +bool run; + +spin_lock_irqsave (&rdev->wiphy_work_lock, flags); + run = !work || !list_empty (&work->entry); +spin_unlock_irqrestore (&rdev->wiphy_work_lock, flags); + +if (run) +cfg80211_process_wiphy_works (rdev, work); +} +EXPORT_SYMBOL_GPL (wiphy_work_flush); +void wiphy_delayed_work_timer (struct timer_list *t) {struct wiphy_delayed_work *dwork =from_timer (dwork, t, timer);
@@ -1668,6 +1688,16 @@ void wiphy_delayed_work_cancel(struct wiphy *wiphy, }EXPORT_SYMBOL_GPL (wiphy_delayed_work_cancel); +void wiphy_delayed_work_flush (struct wiphy *wiphy, +struct wiphy_delayed_work *dwork) +{ +lockdep_assert_held (&wiphy->mtx); + +del_timer_sync (&dwork->timer); +wiphy_work_flush (wiphy, &dwork->work); +} +EXPORT_SYMBOL_GPL (wiphy_delayed_work_flush); +static int __init cfg80211_init (void ) {int err;
net/wireless/core.h +2 -1
@@ -461,7 +461,8 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev, struct net_device *dev, enum nl80211_iftype ntype, struct vif_params *params);void cfg80211_process_rdev_events (struct cfg80211_registered_device *rdev); -void cfg80211_process_wiphy_works (struct cfg80211_registered_device *rdev); +void cfg80211_process_wiphy_works (struct cfg80211_registered_device *rdev, +struct wiphy_work *end);void cfg80211_process_wdev_events (struct wireless_dev *wdev); bool cfg80211_does_bw_fit_range(const struct ieee80211_freq_range *freq_range,
net/wireless/sysfs.c +2 -2
@@ -105,14 +105,14 @@ static int wiphy_suspend(struct device *dev)cfg80211_leave_all (rdev);cfg80211_process_rdev_events (rdev); } -cfg80211_process_wiphy_works (rdev); +cfg80211_process_wiphy_works (rdev,NULL );if (rdev->ops->suspend) ret =rdev_suspend (rdev, rdev->wiphy.wowlan_config);if (ret ==1 ) {/* Driver refuse to configure wowlan */ cfg80211_leave_all (rdev);cfg80211_process_rdev_events (rdev); -cfg80211_process_wiphy_works (rdev); +cfg80211_process_wiphy_works (rdev,NULL ); ret =rdev_suspend (rdev,NULL ); }if (ret ==0 )
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 21/379 wifi: mac80211: move radar detect work to wiphy work
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 228e4f931b0e630dacca8dd867ddd863aea53913 ]
Move the radar detect work to wiphy work in order to lock the wiphy for it without doing it manually.
Stable-dep-of: eadfb54756ae ("wifi: mac80211: move sched-scan stop work to wiphy work")
--- net/mac80211/ieee80211_i.h | 5 +++-- net/mac80211/main.c | 9 +++++---- net/mac80211/util.c | 7 +++---- 3 files changed, 11 insertions(+), 10 deletions(-)
net/mac80211/ieee80211_i.h +3 -2
@@ -1361,7 +1361,7 @@ struct ieee80211_local {/* wowlan is enabled -- don't reconfig on resume */ bool wowlan; -struct work_struct radar_detected_work; +struct wiphy_work radar_detected_work;/* number of RX chains the hardware has */ u8 rx_chains;
@@ -2483,7 +2483,8 @@ bool ieee80211_is_radar_required(struct ieee80211_local *local);void ieee80211_dfs_cac_timer (unsigned long data);void ieee80211_dfs_cac_timer_work (struct work_struct *work);void ieee80211_dfs_cac_cancel (struct ieee80211_local *local); -void ieee80211_dfs_radar_detected_work (struct work_struct *work); +void ieee80211_dfs_radar_detected_work (struct wiphy *wiphy, +struct wiphy_work *work);int ieee80211_send_action_csa (struct ieee80211_sub_if_data *sdata,struct cfg80211_csa_settings *csa_settings);
net/mac80211/main.c +5 -4
@@ -337,7 +337,6 @@ static void ieee80211_restart_work(struct work_struct *work)/* wait for scan work complete */ flush_workqueue (local->workqueue);flush_work (&local->sched_scan_stopped_work); -flush_work (&local->radar_detected_work);rtnl_lock ();/* we might do interface manipulations, so need both */
@@ -811,8 +810,8 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,INIT_WORK (&local->restart_work, ieee80211_restart_work); -INIT_WORK (&local->radar_detected_work, - ieee80211_dfs_radar_detected_work); +wiphy_work_init (&local->radar_detected_work, + ieee80211_dfs_radar_detected_work);INIT_WORK (&local->reconfig_filter, ieee80211_reconfig_filter); local->smps_mode =IEEE80211_SMPS_OFF ;
@@ -1471,13 +1470,15 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw)*/ ieee80211_remove_interfaces (local); +wiphy_lock (local->hw.wiphy); +wiphy_work_cancel (local->hw.wiphy, &local->radar_detected_work); +wiphy_unlock (local->hw.wiphy);rtnl_unlock ();cancel_delayed_work_sync (&local->roc_work);cancel_work_sync (&local->restart_work);cancel_work_sync (&local->reconfig_filter);flush_work (&local->sched_scan_stopped_work); -flush_work (&local->radar_detected_work);ieee80211_clear_tx_pending (local);rate_control_deinitialize (local);
net/mac80211/util.c +3 -4
@@ -4069,7 +4069,8 @@ void ieee80211_dfs_cac_cancel(struct ieee80211_local *local)mutex_unlock (&local->mtx); } -void ieee80211_dfs_radar_detected_work (struct work_struct *work) +void ieee80211_dfs_radar_detected_work (struct wiphy *wiphy, +struct wiphy_work *work) {struct ieee80211_local *local = container_of(work, struct ieee80211_local, radar_detected_work);
@@ -4087,9 +4088,7 @@ void ieee80211_dfs_radar_detected_work(struct work_struct *work) }mutex_unlock (&local->chanctx_mtx); -wiphy_lock (local->hw.wiphy);ieee80211_dfs_cac_cancel (local); -wiphy_unlock (local->hw.wiphy);if (num_chanctx >1 )/* XXX: multi-channel is not supported yet */
@@ -4104,7 +4103,7 @@ void ieee80211_radar_detected(struct ieee80211_hw *hw)trace_api_radar_detected (local); -schedule_work (&local->radar_detected_work); +wiphy_work_queue (hw->wiphy, &local->radar_detected_work); }EXPORT_SYMBOL (ieee80211_radar_detected);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 22/379 wifi: mac80211: move scan work to wiphy work
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 201712512cbbda360f62c222a4bab260350462a0 ]
Move the scan work to wiphy work, which also simplifies the way we handle the work vs. the scan configuration.
Stable-dep-of: eadfb54756ae ("wifi: mac80211: move sched-scan stop work to wiphy work")
--- net/mac80211/ieee80211_i.h | 4 ++-- net/mac80211/iface.c | 2 +- net/mac80211/main.c | 4 +--- net/mac80211/scan.c | 29 ++++++++++++----------------- net/mac80211/util.c | 4 ++-- 5 files changed, 18 insertions(+), 25 deletions(-)
net/mac80211/ieee80211_i.h +2 -2
@@ -1445,7 +1445,7 @@ struct ieee80211_local {unsigned long leave_oper_channel_time;enum mac80211_scan_state next_scan_state; -struct delayed_work scan_work; +struct wiphy_delayed_work scan_work;struct ieee80211_sub_if_data __rcu *scan_sdata;/* For backward compatibility only -- do not use */ struct cfg80211_chan_def _oper_chandef;
@@ -1862,7 +1862,7 @@ int ieee80211_mesh_csa_beacon(struct ieee80211_sub_if_data *sdata,int ieee80211_mesh_finish_csa (struct ieee80211_sub_if_data *sdata);/* scan/BSS handling */ -void ieee80211_scan_work (struct work_struct *work); +void ieee80211_scan_work (struct wiphy *wiphy,struct wiphy_work *work); int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, const u8 *ssid, u8 ssid_len, struct ieee80211_channel **channels,
net/mac80211/iface.c +1 -1
@@ -697,7 +697,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_doieee80211_recalc_ps (local);if (cancel_scan) -flush_delayed_work (&local->scan_work); +wiphy_delayed_work_flush (local->hw.wiphy, &local->scan_work);if (local->open_count ==0 ) {ieee80211_stop_device (local);
net/mac80211/main.c +1 -3
@@ -334,9 +334,7 @@ static void ieee80211_restart_work(struct work_struct *work)struct ieee80211_sub_if_data *sdata;int ret; -/* wait for scan work complete */ flush_workqueue (local->workqueue); -flush_work (&local->sched_scan_stopped_work);rtnl_lock ();/* we might do interface manipulations, so need both */
@@ -806,7 +804,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,INIT_LIST_HEAD (&local->chanctx_list);mutex_init (&local->chanctx_mtx); -INIT_DELAYED_WORK (&local->scan_work, ieee80211_scan_work); +wiphy_delayed_work_init (&local->scan_work, ieee80211_scan_work);INIT_WORK (&local->restart_work, ieee80211_restart_work);
net/mac80211/scan.c +12 -17
@@ -291,8 +291,8 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)* the beacon/proberesp rx gives us an opportunity to upgrade * to active scan */ -set_bit (SCAN_BEACON_DONE , &local->scanning); -ieee80211_queue_delayed_work (&local->hw, &local->scan_work,0 ); +set_bit (SCAN_BEACON_DONE , &local->scanning); +wiphy_delayed_work_queue (local->hw.wiphy, &local->scan_work,0 ); }if (ieee80211_is_probe_resp (mgmt->frame_control)) {
@@ -522,7 +522,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw,memcpy (&local->scan_info, info,sizeof (*info)); -ieee80211_queue_delayed_work (&local->hw, &local->scan_work,0 ); +wiphy_delayed_work_queue (local->hw.wiphy, &local->scan_work,0 ); }EXPORT_SYMBOL (ieee80211_scan_completed);
@@ -562,8 +562,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local,/* We need to set power level at maximum rate for scanning. */ ieee80211_hw_config (local,0 ); -ieee80211_queue_delayed_work (&local->hw, - &local->scan_work,0 ); +wiphy_delayed_work_queue (local->hw.wiphy, &local->scan_work,0 );return 0 ; }
@@ -620,8 +619,8 @@ void ieee80211_run_deferred_scan(struct ieee80211_local *local) lockdep_is_held(&local->mtx))))return ; -ieee80211_queue_delayed_work (&local->hw, &local->scan_work, -round_jiffies_relative (0 )); +wiphy_delayed_work_queue (local->hw.wiphy, &local->scan_work, +round_jiffies_relative (0 )); } static void ieee80211_send_scan_probe_req(struct ieee80211_sub_if_data *sdata,
@@ -812,8 +811,8 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata, }/* Now, just wait a bit and we are all done! */ -ieee80211_queue_delayed_work (&local->hw, &local->scan_work, - next_delay); +wiphy_delayed_work_queue (local->hw.wiphy, &local->scan_work, + next_delay);return 0 ; }else {/* Do normal software scan */
@@ -1060,7 +1059,7 @@ static void ieee80211_scan_state_resume(struct ieee80211_local *local, local->next_scan_state =SCAN_SET_CHANNEL ; } -void ieee80211_scan_work (struct work_struct *work) +void ieee80211_scan_work (struct wiphy *wiphy,struct wiphy_work *work) {struct ieee80211_local *local = container_of(work, struct ieee80211_local, scan_work.work);
@@ -1154,7 +1153,8 @@ void ieee80211_scan_work(struct work_struct *work) } }while (next_delay ==0 ); -ieee80211_queue_delayed_work (&local->hw, &local->scan_work, next_delay); +wiphy_delayed_work_queue (local->hw.wiphy, &local->scan_work, + next_delay); goto out; out_complete:
@@ -1297,12 +1297,7 @@ void ieee80211_scan_cancel(struct ieee80211_local *local) goto out; } -/* -* If the work is currently running, it must be blocked on -* the mutex, but we'll set scan_sdata = NULL and it'll -* simply exit once it acquires the mutex. -*/ -cancel_delayed_work (&local->scan_work); +wiphy_delayed_work_cancel (local->hw.wiphy, &local->scan_work);/* and clean up */ memset (&local->scan_info,0 ,sizeof (local->scan_info));__ieee80211_scan_completed (&local->hw, true);
net/mac80211/util.c +2 -2
@@ -2234,8 +2234,8 @@ static void ieee80211_flush_completed_scan(struct ieee80211_local *local,*/ if (aborted)set_bit (SCAN_ABORTED , &local->scanning); -ieee80211_queue_delayed_work (&local->hw, &local->scan_work,0 ); -flush_delayed_work (&local->scan_work); +wiphy_delayed_work_queue (local->hw.wiphy, &local->scan_work,0 ); +wiphy_delayed_work_flush (local->hw.wiphy, &local->scan_work); } }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 23/379 wifi: mac80211: move offchannel works to wiphy work
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 97c19e42b264e6b71a9ff9deea04c19f621805b9 ]
Make the offchannel works wiphy works to have the
wiphy locked for executing them.
Stable-dep-of: eadfb54756ae ("wifi: mac80211: move sched-scan stop work to wiphy work")
--- net/mac80211/ieee80211_i.h | 4 ++-- net/mac80211/main.c | 6 +++--- net/mac80211/offchannel.c | 36 ++++++++++++++++++------------------ 3 files changed, 23 insertions(+), 23 deletions(-)
net/mac80211/ieee80211_i.h +2 -2
@@ -1538,9 +1538,9 @@ struct ieee80211_local {/* * Remain-on-channel support */ -struct delayed_work roc_work; +struct wiphy_delayed_work roc_work;struct list_head roc_list; -struct work_struct hw_roc_start, hw_roc_done; +struct wiphy_work hw_roc_start, hw_roc_done;unsigned long hw_roc_start_time;u64 roc_cookie_counter;
net/mac80211/main.c +3 -3
@@ -374,8 +374,8 @@ static void ieee80211_restart_work(struct work_struct *work)ieee80211_scan_cancel (local);/* make sure any new ROC will consider local->in_reconfig */ -flush_delayed_work (&local->roc_work); -flush_work (&local->hw_roc_done); +wiphy_delayed_work_flush (local->hw.wiphy, &local->roc_work); +wiphy_work_flush (local->hw.wiphy, &local->hw_roc_done);/* wait for all packet processing to be done */ synchronize_net ();
@@ -1469,11 +1469,11 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw)ieee80211_remove_interfaces (local);wiphy_lock (local->hw.wiphy); +wiphy_delayed_work_cancel (local->hw.wiphy, &local->roc_work);wiphy_work_cancel (local->hw.wiphy, &local->radar_detected_work);wiphy_unlock (local->hw.wiphy);rtnl_unlock (); -cancel_delayed_work_sync (&local->roc_work);cancel_work_sync (&local->restart_work);cancel_work_sync (&local->reconfig_filter);flush_work (&local->sched_scan_stopped_work);
net/mac80211/offchannel.c +18 -18
@@ -230,7 +230,7 @@ static bool ieee80211_recalc_sw_work(struct ieee80211_local *local,if (dur ==LONG_MAX )return false; -mod_delayed_work (local->workqueue, &local->roc_work, dur); +wiphy_delayed_work_queue (local->hw.wiphy, &local->roc_work, dur);return true; }
@@ -258,7 +258,7 @@ static void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc, roc->notified = true; } -static void ieee80211_hw_roc_start (struct work_struct *work) +static void ieee80211_hw_roc_start (struct wiphy *wiphy,struct wiphy_work *work) {struct ieee80211_local *local = container_of(work, struct ieee80211_local, hw_roc_start);
@@ -285,7 +285,7 @@ void ieee80211_ready_on_channel(struct ieee80211_hw *hw)trace_api_ready_on_channel (local); -ieee80211_queue_work (hw, &local->hw_roc_start); +wiphy_work_queue (hw->wiphy, &local->hw_roc_start); }EXPORT_SYMBOL_GPL (ieee80211_ready_on_channel);
@@ -338,7 +338,7 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local) tmp->started = true; tmp->abort = true; } -ieee80211_queue_work (&local->hw, &local->hw_roc_done); +wiphy_work_queue (local->hw.wiphy, &local->hw_roc_done);return ; }
@@ -368,8 +368,8 @@ static void _ieee80211_start_next_roc(struct ieee80211_local *local)ieee80211_hw_config (local,0 ); } -ieee80211_queue_delayed_work (&local->hw, &local->roc_work, -msecs_to_jiffies (min_dur)); +wiphy_delayed_work_queue (local->hw.wiphy, &local->roc_work, +msecs_to_jiffies (min_dur));/* tell userspace or send frame(s) */ list_for_each_entry (tmp, &local->roc_list, list) {
@@ -407,8 +407,8 @@ void ieee80211_start_next_roc(struct ieee80211_local *local)_ieee80211_start_next_roc (local); }else {/* delay it a bit */ -ieee80211_queue_delayed_work (&local->hw, &local->roc_work, -round_jiffies_relative (HZ /2 )); +wiphy_delayed_work_queue (local->hw.wiphy, &local->roc_work, +round_jiffies_relative (HZ /2 )); } }
@@ -451,7 +451,7 @@ static void __ieee80211_roc_work(struct ieee80211_local *local) } } -static void ieee80211_roc_work (struct work_struct *work) +static void ieee80211_roc_work (struct wiphy *wiphy,struct wiphy_work *work) {struct ieee80211_local *local = container_of(work, struct ieee80211_local, roc_work.work);
@@ -461,7 +461,7 @@ static void ieee80211_roc_work(struct work_struct *work)mutex_unlock (&local->mtx); } -static void ieee80211_hw_roc_done (struct work_struct *work) +static void ieee80211_hw_roc_done (struct wiphy *wiphy,struct wiphy_work *work) {struct ieee80211_local *local = container_of(work, struct ieee80211_local, hw_roc_done);
@@ -482,7 +482,7 @@ void ieee80211_remain_on_channel_expired(struct ieee80211_hw *hw)trace_api_remain_on_channel_expired (local); -ieee80211_queue_work (hw, &local->hw_roc_done); +wiphy_work_queue (hw->wiphy, &local->hw_roc_done); }EXPORT_SYMBOL_GPL (ieee80211_remain_on_channel_expired);
@@ -586,8 +586,8 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,/* if not HW assist, just queue & schedule work */ if (!local->ops->remain_on_channel) {list_add_tail (&roc->list, &local->roc_list); -ieee80211_queue_delayed_work (&local->hw, - &local->roc_work,0 ); +wiphy_delayed_work_queue (local->hw.wiphy, + &local->roc_work,0 ); }else {/* otherwise actually kick it off here * (for error handling)
@@ -695,7 +695,7 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local,if (!cookie)return -ENOENT ; -flush_work (&local->hw_roc_start); +wiphy_work_flush (local->hw.wiphy, &local->hw_roc_start);mutex_lock (&local->mtx);list_for_each_entry_safe (roc, tmp, &local->roc_list, list) {
@@ -745,7 +745,7 @@ static int ieee80211_cancel_roc(struct ieee80211_local *local, }else {/* go through work struct to return to the operating channel */ found->abort = true; -mod_delayed_work (local->workqueue, &local->roc_work,0 ); +wiphy_delayed_work_queue (local->hw.wiphy, &local->roc_work,0 ); } out_unlock:
@@ -994,9 +994,9 @@ int ieee80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,void ieee80211_roc_setup (struct ieee80211_local *local) { -INIT_WORK (&local->hw_roc_start, ieee80211_hw_roc_start); -INIT_WORK (&local->hw_roc_done, ieee80211_hw_roc_done); -INIT_DELAYED_WORK (&local->roc_work, ieee80211_roc_work); +wiphy_work_init (&local->hw_roc_start, ieee80211_hw_roc_start); +wiphy_work_init (&local->hw_roc_done, ieee80211_hw_roc_done); +wiphy_delayed_work_init (&local->roc_work, ieee80211_roc_work);INIT_LIST_HEAD (&local->roc_list); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 24/379 wifi: mac80211: move sched-scan stop work to wiphy work
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit eadfb54756aea5610d8d0a467f66305f777c85dd ]
This also has the wiphy locked here then. We need to use the _locked version of cfg80211_sched_scan_stopped() now, which also fixes an old deadlock there.
--- net/mac80211/ieee80211_i.h | 5 +++-- net/mac80211/main.c | 6 +++--- net/mac80211/scan.c | 7 ++++--- 3 files changed, 10 insertions(+), 8 deletions(-)
net/mac80211/ieee80211_i.h +3 -2
@@ -1438,7 +1438,7 @@ struct ieee80211_local {int hw_scan_ies_bufsize;struct cfg80211_scan_info scan_info; -struct work_struct sched_scan_stopped_work; +struct wiphy_work sched_scan_stopped_work;struct ieee80211_sub_if_data __rcu *sched_scan_sdata;struct cfg80211_sched_scan_request __rcu *sched_scan_req;u8 scan_addr[ETH_ALEN ];
@@ -1892,7 +1892,8 @@ int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata, struct cfg80211_sched_scan_request *req);int ieee80211_request_sched_scan_stop (struct ieee80211_local *local);void ieee80211_sched_scan_end (struct ieee80211_local *local); -void ieee80211_sched_scan_stopped_work (struct work_struct *work); +void ieee80211_sched_scan_stopped_work (struct wiphy *wiphy, +struct wiphy_work *work);/* off-channel/mgmt-tx */ void ieee80211_offchannel_stop_vifs (struct ieee80211_local *local);
net/mac80211/main.c +3 -3
@@ -820,8 +820,8 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len, ieee80211_dynamic_ps_disable_work);timer_setup (&local->dynamic_ps_timer, ieee80211_dynamic_ps_timer,0 ); -INIT_WORK (&local->sched_scan_stopped_work, - ieee80211_sched_scan_stopped_work); +wiphy_work_init (&local->sched_scan_stopped_work, + ieee80211_sched_scan_stopped_work);spin_lock_init (&local->ack_status_lock);idr_init (&local->ack_status_frames);
@@ -1470,13 +1470,13 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw)wiphy_lock (local->hw.wiphy);wiphy_delayed_work_cancel (local->hw.wiphy, &local->roc_work); +wiphy_work_cancel (local->hw.wiphy, &local->sched_scan_stopped_work);wiphy_work_cancel (local->hw.wiphy, &local->radar_detected_work);wiphy_unlock (local->hw.wiphy);rtnl_unlock ();cancel_work_sync (&local->restart_work);cancel_work_sync (&local->reconfig_filter); -flush_work (&local->sched_scan_stopped_work);ieee80211_clear_tx_pending (local);rate_control_deinitialize (local);
net/mac80211/scan.c +4 -3
@@ -1439,10 +1439,11 @@ void ieee80211_sched_scan_end(struct ieee80211_local *local)mutex_unlock (&local->mtx); -cfg80211_sched_scan_stopped (local->hw.wiphy,0 ); +cfg80211_sched_scan_stopped_locked (local->hw.wiphy,0 ); } -void ieee80211_sched_scan_stopped_work (struct work_struct *work) +void ieee80211_sched_scan_stopped_work (struct wiphy *wiphy, +struct wiphy_work *work) {struct ieee80211_local *local = container_of(work, struct ieee80211_local,
@@ -1465,6 +1466,6 @@ void ieee80211_sched_scan_stopped(struct ieee80211_hw *hw)if (local->in_reconfig)return ; -schedule_work (&local->sched_scan_stopped_work); +wiphy_work_queue (hw->wiphy, &local->sched_scan_stopped_work); }EXPORT_SYMBOL (ieee80211_sched_scan_stopped);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 25/379 wifi: mac80211: fix # of MSDU in A-MSDU calculation
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 428e8976a15f849ad92b1c1e38dda2a684350ff7 ]
During my refactoring I wanted to get rid of the switch, but replaced it with the wrong calculation. Fix that.
--- net/mac80211/sta_info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mac80211/sta_info.c +1 -1
@@ -2918,7 +2918,7 @@ void ieee80211_sta_set_max_amsdu_subframes(struct sta_info *sta, WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB) << 1;if (val) - sta->sta.max_amsdu_subframes =4 << val; + sta->sta.max_amsdu_subframes =4 << (4 - val); }#ifdef CONFIG_LOCKDEP
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 26/379 wifi: iwlwifi: honor the enable_ini value
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emmanuel Grumbach <[email protected]>
[ Upstream commit e0c1ca236e28e4263fba76d47a108ed95dcae33e ]
In case the user sets the enable_ini to some preset, we want to honor the value.
Remove the ops to set the value of the module parameter is runtime, we don't want to allow to modify the value in runtime since we configure the firmware once at the beginning on its life.
--- .../wireless/intel/iwlwifi/fw/api/dbg-tlv.h | 1 + .../net/wireless/intel/iwlwifi/iwl-dbg-tlv.h | 5 +- drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 51 +++++++------------ .../net/wireless/intel/iwlwifi/iwl-trans.h | 4 ++ 4 files changed, 25 insertions(+), 36 deletions(-)
drivers/net/wireless/intel/iwlwifi/fw/api/dbg-tlv.h +1 -0
@@ -13,6 +13,7 @@#define IWL_FW_INI_DOMAIN_ALWAYS_ON 0#define IWL_FW_INI_REGION_ID_MASK GENMASK(15, 0)#define IWL_FW_INI_REGION_DUMP_POLICY_MASK GENMASK(31, 16) +#define IWL_FW_INI_PRESET_DISABLE 0xff/** * struct iwl_fw_ini_hcmd
drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.h +3 -2
@@ -1,6 +1,6 @@/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ /* -* Copyright (C) 2018-2022 Intel Corporation +* Copyright (C) 2018-2023 Intel Corporation */ #ifndef __iwl_dbg_tlv_h__#define __iwl_dbg_tlv_h__
@@ -10,7 +10,8 @@#include <fw/file.h> #include <fw/api/dbg-tlv.h> -#define IWL_DBG_TLV_MAX_PRESET 15 +#define IWL_DBG_TLV_MAX_PRESET 15 +#define ENABLE_INI (IWL_DBG_TLV_MAX_PRESET + 1)/** * struct iwl_dbg_tlv_node - debug TLV node
drivers/net/wireless/intel/iwlwifi/iwl-drv.c +17 -34
69 lines not on this page · raw message
drivers/net/wireless/intel/iwlwifi/iwl-trans.h +4 -0
@@ -56,6 +56,10 @@* 6) Eventually, the free function will be called. */ +/* default preset 0 (start from bit 16)*/ +#define IWL_FW_DBG_DOMAIN_POS 16 +#define IWL_FW_DBG_DOMAIN BIT(IWL_FW_DBG_DOMAIN_POS) +#define IWL_TRANS_FW_DBG_DOMAIN (trans) IWL_FW_INI_DOMAIN_ALWAYS_ON#define FH_RSCSR_FRAME_SIZE_MSK 0x00003FFF/* bits 0-13 */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 27/379 i40e: fix potential memory leaks in i40e_remove()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrii Staikov <[email protected]>
[ Upstream commit 5ca636d927a106780451d957734f02589b972e2b ]
Instead of freeing memory of a single VSI, make sure the memory for all VSIs is cleared before releasing VSIs. Add releasing of their resources in a loop with the iteration number equal to the number of allocated VSIs.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +7 -3
@@ -16283,11 +16283,15 @@ static void i40e_remove(struct pci_dev *pdev)i40e_switch_branch_release (pf->veb[i]); } -/* Now we can shutdown the PF's VSI, just before we kill +/* Now we can shutdown the PF's VSIs, just before we kill * adminq and hmc. */ -if (pf->vsi[pf->lan_vsi]) -i40e_vsi_release (pf->vsi[pf->lan_vsi]); +for (i = pf->num_alloc_vsi; i--;) +if (pf->vsi[i]) { +i40e_vsi_close (pf->vsi[i]); +i40e_vsi_release (pf->vsi[i]); + pf->vsi[i] =NULL ; + }i40e_cloud_filter_exit (pf);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 28/379 iavf: Fix promiscuous mode configuration flow messages
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brett Creeley <[email protected]>
[ Upstream commit 221465de6bd8090ab61267f019866e8d2dd4ea3d ]
Currently when configuring promiscuous mode on the AVF we detect a change in the netdev->flags. We use IFF_PROMISC and IFF_ALLMULTI to determine whether or not we need to request/release promiscuous mode and/or multicast promiscuous mode. The problem is that the AQ calls for setting/clearing promiscuous/multicast mode are treated separately. This leads to a case where we can trigger two promiscuous mode AQ calls in a row with the incorrect state. To fix this make a few changes.
Use IAVF_FLAG_AQ_CONFIGURE_PROMISC_MODE instead of the previous IAVF_FLAG_AQ_[REQUEST|RELEASE]_[PROMISC|ALLMULTI] flags.
In iavf_set_rx_mode() detect if there is a change in the netdev->flags in comparison with adapter->flags and set the IAVF_FLAG_AQ_CONFIGURE_PROMISC_MODE aq_required bit. Then in iavf_process_aq_command() only check for IAVF_FLAG_CONFIGURE_PROMISC_MODE and call iavf_set_promiscuous() if it's set.
In iavf_set_promiscuous() check again to see which (if any) promiscuous mode bits have changed when comparing the netdev->flags with the adapter->flags. Use this to set the flags which get sent to the PF driver.
Add a spinlock that is used for updating current_netdev_promisc_flags and only allows one promiscuous mode AQ at a time.
[1] Fixes the fact that we will only have one AQ call in the aq_required queue at any one time.
[2] Streamlines the change in promiscuous mode to only set one AQ required bit.
[3] This allows us to keep track of the current state of the flags and also makes it so we can take the most recent netdev->flags promiscuous mode state.
[4] This fixes the problem where a change in the netdev->flags can cause IAVF_FLAG_AQ_CONFIGURE_PROMISC_MODE to be set in iavf_set_rx_mode(), but cleared in iavf_set_promiscuous() before the change is ever made via AQ call.
--- drivers/net/ethernet/intel/iavf/iavf.h | 16 ++-- drivers/net/ethernet/intel/iavf/iavf_main.c | 43 +++++------ .../net/ethernet/intel/iavf/iavf_virtchnl.c | 75 ++++++++++++------- 3 files changed, 74 insertions(+), 60 deletions(-)
drivers/net/ethernet/intel/iavf/iavf.h +9 -7
@@ -298,8 +298,6 @@ struct iavf_adapter {#define IAVF_FLAG_CLIENT_NEEDS_OPEN BIT(10)#define IAVF_FLAG_CLIENT_NEEDS_CLOSE BIT(11)#define IAVF_FLAG_CLIENT_NEEDS_L2_PARAMS BIT(12) -#define IAVF_FLAG_PROMISC_ON BIT(13) -#define IAVF_FLAG_ALLMULTI_ON BIT(14)#define IAVF_FLAG_LEGACY_RX BIT(15)#define IAVF_FLAG_REINIT_ITR_NEEDED BIT(16)#define IAVF_FLAG_QUEUES_DISABLED BIT(17)
@@ -325,10 +323,7 @@ struct iavf_adapter {#define IAVF_FLAG_AQ_SET_HENA BIT_ULL(12)#define IAVF_FLAG_AQ_SET_RSS_KEY BIT_ULL(13)#define IAVF_FLAG_AQ_SET_RSS_LUT BIT_ULL(14) -#define IAVF_FLAG_AQ_REQUEST_PROMISC BIT_ULL(15) -#define IAVF_FLAG_AQ_RELEASE_PROMISC BIT_ULL(16) -#define IAVF_FLAG_AQ_REQUEST_ALLMULTI BIT_ULL(17) -#define IAVF_FLAG_AQ_RELEASE_ALLMULTI BIT_ULL(18) +#define IAVF_FLAG_AQ_CONFIGURE_PROMISC_MODE BIT_ULL(15)#define IAVF_FLAG_AQ_ENABLE_VLAN_STRIPPING BIT_ULL(19)#define IAVF_FLAG_AQ_DISABLE_VLAN_STRIPPING BIT_ULL(20)#define IAVF_FLAG_AQ_ENABLE_CHANNELS BIT_ULL(21)
@@ -365,6 +360,12 @@ struct iavf_adapter { (IAVF_EXTENDED_CAP_SEND_VLAN_V2 | \IAVF_EXTENDED_CAP_RECV_VLAN_V2 ) +/* Lock to prevent possible clobbering of +* current_netdev_promisc_flags + */ +spinlock_t current_netdev_promisc_flags_lock; +netdev_features_t current_netdev_promisc_flags; +/* OS defined structs */ struct net_device *netdev;struct pci_dev *pdev;
@@ -551,7 +552,8 @@ void iavf_add_ether_addrs(struct iavf_adapter *adapter);void iavf_del_ether_addrs (struct iavf_adapter *adapter);void iavf_add_vlans (struct iavf_adapter *adapter);void iavf_del_vlans (struct iavf_adapter *adapter); -void iavf_set_promiscuous (struct iavf_adapter *adapter,int flags); +void iavf_set_promiscuous (struct iavf_adapter *adapter); +bool iavf_promiscuous_mode_changed (struct iavf_adapter *adapter);void iavf_request_stats (struct iavf_adapter *adapter);int iavf_request_reset (struct iavf_adapter *adapter);void iavf_get_hena (struct iavf_adapter *adapter);
drivers/net/ethernet/intel/iavf/iavf_main.c +17 -26
67 lines not on this page · raw message
drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +48 -27
98 lines not on this page · raw message
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 29/379 selftests/bpf: Correct map_fd to data_fd in tailcalls
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Hwang <[email protected]>
[ Upstream commit 96daa9874211d5497aa70fa409b67afc29f0cb86 ]
Get and check data_fd. It should not check map_fd again.
Meanwhile, correct some 'return' to 'goto out'.
Thank the suggestion from Maciej in "bpf, x64: Fix tailcall infinite loop"[0] discussions.
[0] https://lore.kernel.org/bpf/[email protected]/T/#m7d3b601066ba66400d436b7e7579b2df4a101033
--- .../selftests/bpf/prog_tests/tailcalls.c | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-)
tools/testing/selftests/bpf/prog_tests/tailcalls.c +16 -16
@@ -271,11 +271,11 @@ static void test_tailcall_count(const char *which) data_map =bpf_object__find_map_by_name (obj,"tailcall.bss" );if (CHECK_FAIL (!data_map || !bpf_map__is_internal (data_map))) -return ; + goto out; data_fd =bpf_map__fd (data_map); -if (CHECK_FAIL (map_fd <0 )) -return ; +if (CHECK_FAIL (data_fd <0 )) + goto out; i =0 ; err =bpf_map_lookup_elem (data_fd, &i, &val);
@@ -352,11 +352,11 @@ static void test_tailcall_4(void) data_map =bpf_object__find_map_by_name (obj,"tailcall.bss" );if (CHECK_FAIL (!data_map || !bpf_map__is_internal (data_map))) -return ; + goto out; data_fd =bpf_map__fd (data_map); -if (CHECK_FAIL (map_fd <0 )) -return ; +if (CHECK_FAIL (data_fd <0 )) + goto out;for (i =0 ; i <bpf_map__max_entries (prog_array); i++) {snprintf (prog_name,sizeof (prog_name),"classifier_%d" , i);
@@ -442,11 +442,11 @@ static void test_tailcall_5(void) data_map =bpf_object__find_map_by_name (obj,"tailcall.bss" );if (CHECK_FAIL (!data_map || !bpf_map__is_internal (data_map))) -return ; + goto out; data_fd =bpf_map__fd (data_map); -if (CHECK_FAIL (map_fd <0 )) -return ; +if (CHECK_FAIL (data_fd <0 )) + goto out;for (i =0 ; i <bpf_map__max_entries (prog_array); i++) {snprintf (prog_name,sizeof (prog_name),"classifier_%d" , i);
@@ -631,11 +631,11 @@ static void test_tailcall_bpf2bpf_2(void) data_map =bpf_object__find_map_by_name (obj,"tailcall.bss" );if (CHECK_FAIL (!data_map || !bpf_map__is_internal (data_map))) -return ; + goto out; data_fd =bpf_map__fd (data_map); -if (CHECK_FAIL (map_fd <0 )) -return ; +if (CHECK_FAIL (data_fd <0 )) + goto out; i =0 ; err =bpf_map_lookup_elem (data_fd, &i, &val);
@@ -805,11 +805,11 @@ static void test_tailcall_bpf2bpf_4(bool noise) data_map =bpf_object__find_map_by_name (obj,"tailcall.bss" );if (CHECK_FAIL (!data_map || !bpf_map__is_internal (data_map))) -return ; + goto out; data_fd =bpf_map__fd (data_map); -if (CHECK_FAIL (map_fd <0 )) -return ; +if (CHECK_FAIL (data_fd <0 )) + goto out; i =0 ; val.noise = noise;
@@ -872,7 +872,7 @@ static void test_tailcall_bpf2bpf_6(void)ASSERT_EQ (topts.retval,0 ,"tailcall retval" ); data_fd =bpf_map__fd (obj->maps.bss); -if (!ASSERT_GE (map_fd,0 ,"bss map fd" )) +if (!ASSERT_GE (data_fd,0 ,"bss map fd" )) goto out; i =0 ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 30/379 wifi: iwlwifi: Use FW rate for non-data frames
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miri Korenblit <[email protected]>
[ Upstream commit 499d02790495958506a64f37ceda7e97345a50a8 ]
Currently we are setting the rate in the tx cmd for mgmt frames (e.g. during connection establishment). This was problematic when sending mgmt frames in eSR mode, as we don't know what link this frame will be sent on (This is decided by the FW), so we don't know what is the lowest rate.
Fix this by not setting the rate in tx cmd and rely
on FW to choose the right one.
Set rate only for injected frames with fixed rate,
or when no sta is given.
Also set for important frames (EAPOL etc.) the High Priority flag.
--- drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/tx.c +9 -5
@@ -524,16 +524,20 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb, flags |=IWL_TX_FLAGS_ENCRYPT_DIS ;/* -* For data packets rate info comes from the fw. Only -* set rate/antenna during connection establishment or in case -* no station is given. +* For data and mgmt packets rate info comes from the fw. Only +* set rate/antenna for injected frames with fixed rate, or +* when no sta is given. */ -if (!sta || !ieee80211_is_data (hdr->frame_control) || - mvmsta->sta_state <IEEE80211_STA_AUTHORIZED ) { +if (unlikely (!sta || + info->control.flags &IEEE80211_TX_CTRL_RATE_INJECT )) { flags |=IWL_TX_FLAGS_CMD_RATE ; rate_n_flags =iwl_mvm_get_tx_rate_n_flags (mvm, info, sta, hdr->frame_control); + }else if (!ieee80211_is_data (hdr->frame_control) || + mvmsta->sta_state <IEEE80211_STA_AUTHORIZED ) { +/* These are important frames */ + flags |=IWL_TX_FLAGS_HIGH_PRI ; } if (mvm->trans->trans_cfg->device_family >=
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 31/379 udp: add missing WRITE_ONCE() around up->encap_rcv
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 6d5a12eb91224d707f8691dccb40a5719fe5466d ]
UDP_ENCAP_ESPINUDP_NON_IKE setsockopt() writes over up->encap_rcv while other cpus read it.
--- net/ipv4/udp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/ipv4/udp.c +4 -2
@@ -2714,10 +2714,12 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,case UDP_ENCAP_ESPINUDP_NON_IKE :#if IS_ENABLED (CONFIG_IPV6 )if (sk->sk_family ==AF_INET6 ) - up->encap_rcv = ipv6_stub->xfrm6_udp_encap_rcv; +WRITE_ONCE (up->encap_rcv, + ipv6_stub->xfrm6_udp_encap_rcv); else#endif - up->encap_rcv = xfrm4_udp_encap_rcv; +WRITE_ONCE (up->encap_rcv, + xfrm4_udp_encap_rcv);#endif fallthrough;case UDP_ENCAP_L2TPINUDP :
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 32/379 tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aananth V <[email protected]>
[ Upstream commit e326578a21414738de45f77badd332fb00bd0f58 ]
For passive TCP Fast Open sockets that had SYN/ACK timeout and did not send more data in SYN_RECV, upon receiving the final ACK in 3WHS, the congestion state may awkwardly stay in CA_Loss mode unless the CA state was undone due to TCP timestamp checks. However, if tcp_rcv_synrecv_state_fastopen() decides not to undo, then we should enter CA_Open, because at that point we have received an ACK covering the retransmitted SYNACKs. Currently, the icsk_ca_state is only set to CA_Open after we receive an ACK for a data-packet. This is because tcp_ack does not call tcp_fastretrans_alert (and tcp_process_loss) if !prior_packets
Note that tcp_process_loss() calls tcp_try_undo_recovery(), so having tcp_rcv_synrecv_state_fastopen() decide that if we're in CA_Loss we should call tcp_try_undo_recovery() is consistent with that, and low risk.
--- net/ipv4/tcp_input.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
net/ipv4/tcp_input.c +5 -4
@@ -6420,22 +6420,23 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,static void tcp_rcv_synrecv_state_fastopen (struct sock *sk) { +struct tcp_sock *tp =tcp_sk (sk);struct request_sock *req;/* If we are still handling the SYNACK RTO, see if timestamp ECR allows * undo. If peer SACKs triggered fast recovery, we can't undo here. */ -if (inet_csk (sk)->icsk_ca_state == TCP_CA_Loss) -tcp_try_undo_loss (sk, false); +if (inet_csk (sk)->icsk_ca_state == TCP_CA_Loss && !tp->packets_out) +tcp_try_undo_recovery (sk);/* Reset rtx states to prevent spurious retransmits_timed_out() */ -tcp_sk (sk)->retrans_stamp =0 ; + tp->retrans_stamp =0 ;inet_csk (sk)->icsk_retransmits =0 ;/* Once we leave TCP_SYN_RECV or TCP_FIN_WAIT_1, * we no longer need req so release it. */ - req =rcu_dereference_protected (tcp_sk (sk)->fastopen_rsk, + req =rcu_dereference_protected (tp->fastopen_rsk,lockdep_sock_is_held (sk));reqsk_fastopen_remove (sk, req, false);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 33/379 gve: Use size_add() in call to struct_size()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
[ Upstream commit d692873cbe861a870cdc9cbfb120eefd113c3dfd ]
If, for any reason, tx_stats_num + rx_stats_num wraps around, the protection that struct_size() adds against potential integer overflows is defeated. Fix this by hardening call to struct_size() with size_add().
--- drivers/net/ethernet/google/gve/gve_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/google/gve/gve_main.c +1 -1
@@ -139,7 +139,7 @@ static int gve_alloc_stats_report(struct gve_priv *priv) rx_stats_num = (GVE_RX_STATS_REPORT_NUM +NIC_RX_STATS_REPORT_NUM ) * priv->rx_cfg.num_queues; priv->stats_report_len =struct_size (priv->stats_report, stats, - tx_stats_num + rx_stats_num); +size_add (tx_stats_num, rx_stats_num)); priv->stats_report =dma_alloc_coherent (&priv->pdev->dev, priv->stats_report_len, &priv->stats_report_bus,GFP_KERNEL );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 34/379 mlxsw: Use size_mul() in call to struct_size()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
[ Upstream commit e22c6ea025013ae447fe269269753ffec763dde5 ]
If, for any reason, the open-coded arithmetic causes a wraparound, the protection that struct_size() adds against potential integer overflows is defeated. Fix this by hardening call to struct_size() with size_mul().
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c +1 -1
@@ -496,7 +496,7 @@ mlxsw_sp_acl_bf_init(struct mlxsw_sp *mlxsw_sp, unsigned int num_erp_banks)* is 2^ACL_MAX_BF_LOG */ bf_bank_size =1 <<MLXSW_CORE_RES_GET (mlxsw_sp->core,ACL_MAX_BF_LOG ); - bf =kzalloc (struct_size (bf, refcnt, bf_bank_size * num_erp_banks), + bf =kzalloc (struct_size (bf, refcnt,size_mul (bf_bank_size, num_erp_banks)),GFP_KERNEL );if (!bf)return ERR_PTR (-ENOMEM );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 35/379 tls: Only use data field in crypto completion function
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
[ Upstream commit 8d338c76f7cfe0eb4bc46078b1c09c8c5fc75353 ]
The crypto_async_request passed to the completion is not guaranteed to be the original request object. Only the data field can be relied upon.
Fix this by storing the socket pointer with the AEAD request.
Stable-dep-of: a2713257ee2b ("tls: Use size_add() in call to struct_size()")
--- net/tls/tls.h | 2 ++ net/tls/tls_sw.c | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 31 insertions(+), 11 deletions(-)
net/tls/tls.h +2 -0
@@ -70,6 +70,8 @@ struct tls_rec {char content_type;struct scatterlist sg_content_type; +struct sock *sk; +char aad_space[TLS_AAD_SPACE_SIZE ];u8 iv_data[MAX_IV_SIZE ];struct aead_request aead_req;
net/tls/tls_sw.c +29 -11
@@ -38,6 +38,7 @@#include <linux/bug.h> #include <linux/sched/signal.h> #include <linux/module.h> +#include <linux/kernel.h> #include <linux/splice.h> #include <crypto/aead.h>
@@ -57,6 +58,7 @@ struct tls_decrypt_arg { };struct tls_decrypt_ctx { +struct sock *sk;u8 iv[MAX_IV_SIZE ];u8 aad[TLS_MAX_AAD_SIZE ];u8 tail;
@@ -179,18 +181,25 @@ static int tls_padding_length(struct tls_prot_info *prot, struct sk_buff *skb,return sub; } -static void tls_decrypt_done (struct crypto_async_request *req,int err) +static void tls_decrypt_done (crypto_completion_data_t *data,int err) { -struct aead_request *aead_req = (struct aead_request *)req; +struct aead_request *aead_req =crypto_get_completion_data (data); +struct crypto_aead *aead =crypto_aead_reqtfm (aead_req);struct scatterlist *sgout = aead_req->dst;struct scatterlist *sgin = aead_req->src;struct tls_sw_context_rx *ctx; +struct tls_decrypt_ctx *dctx;struct tls_context *tls_ctx;struct scatterlist *sg;unsigned int pages;struct sock *sk; +int aead_size; - sk = (struct sock *)req->data; + aead_size =sizeof (*aead_req) +crypto_aead_reqsize (aead); + aead_size = ALIGN(aead_size, __alignof__(*dctx)); + dctx = (void *)((u8 *)aead_req + aead_size); + + sk = dctx->sk; tls_ctx =tls_get_ctx (sk); ctx =tls_sw_ctx_rx (tls_ctx);
@@ -242,7 +251,7 @@ static int tls_do_decryption(struct sock *sk,if (darg->async) {aead_request_set_callback (aead_req,CRYPTO_TFM_REQ_MAY_BACKLOG , - tls_decrypt_done, sk); + tls_decrypt_done, aead_req);atomic_inc (&ctx->decrypt_pending); }else { aead_request_set_callback(aead_req,
@@ -338,6 +347,8 @@ static struct tls_rec *tls_get_rec(struct sock *sk)sg_set_buf (&rec->sg_aead_out[0 ], rec->aad_space, prot->aad_size);sg_unmark_end (&rec->sg_aead_out[1 ]); + rec->sk = sk; +return rec; }
@@ -419,22 +430,27 @@ int tls_tx_records(struct sock *sk, int flags)return rc; } -static void tls_encrypt_done (struct crypto_async_request *req,int err) +static void tls_encrypt_done (crypto_completion_data_t *data,int err) { -struct aead_request *aead_req = (struct aead_request *)req; -struct sock *sk = req->data; -struct tls_context *tls_ctx =tls_get_ctx (sk); -struct tls_prot_info *prot = &tls_ctx->prot_info; -struct tls_sw_context_tx *ctx =tls_sw_ctx_tx (tls_ctx); +struct aead_request *aead_req =crypto_get_completion_data (data); +struct tls_sw_context_tx *ctx; +struct tls_context *tls_ctx; +struct tls_prot_info *prot;struct scatterlist *sge;struct sk_msg *msg_en;struct tls_rec *rec;bool ready = false; +struct sock *sk;int pending; rec = container_of(aead_req, struct tls_rec, aead_req); msg_en = &rec->msg_encrypted; + sk = rec->sk; + tls_ctx =tls_get_ctx (sk); + prot = &tls_ctx->prot_info; + ctx =tls_sw_ctx_tx (tls_ctx); + sge =sk_msg_elem (msg_en, msg_en->sg.curr); sge->offset -= prot->prepend_size; sge->length += prot->prepend_size;
@@ -522,7 +538,7 @@ static int tls_do_encryption(struct sock *sk, data_len, rec->iv_data);aead_request_set_callback (aead_req,CRYPTO_TFM_REQ_MAY_BACKLOG , - tls_encrypt_done, sk); + tls_encrypt_done, aead_req);/* Add the record in tx_list */ list_add_tail ((struct list_head *)&rec->list, &ctx->tx_list);
@@ -1495,6 +1511,7 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,* Both structs are variable length. */ aead_size =sizeof (*aead_req) +crypto_aead_reqsize (ctx->aead_recv); + aead_size = ALIGN(aead_size, __alignof__(*dctx)); mem =kmalloc (aead_size +struct_size (dctx, sg, n_sgin + n_sgout), sk->sk_allocation);if (!mem) {
@@ -1505,6 +1522,7 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,/* Segment the allocated memory */ aead_req = (struct aead_request *)mem; dctx = (struct tls_decrypt_ctx *)(mem + aead_size); + dctx->sk = sk; sgin = &dctx->sg[0 ]; sgout = &dctx->sg[n_sgin];
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 36/379 tls: Use size_add() in call to struct_size()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
[ Upstream commit a2713257ee2be22827d7bc248302d408c91bfb95 ]
If, for any reason, the open-coded arithmetic causes a wraparound, the protection that struct_size() adds against potential integer overflows is defeated. Fix this by hardening call to struct_size() with size_add().
--- net/tls/tls_sw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/tls/tls_sw.c +1 -1
@@ -1512,7 +1512,7 @@ static int tls_decrypt_sg(struct sock *sk, struct iov_iter *out_iov,*/ aead_size =sizeof (*aead_req) +crypto_aead_reqsize (ctx->aead_recv); aead_size = ALIGN(aead_size, __alignof__(*dctx)); - mem =kmalloc (aead_size +struct_size (dctx, sg, n_sgin + n_sgout), + mem =kmalloc (aead_size +struct_size (dctx, sg,size_add (n_sgin, n_sgout)), sk->sk_allocation);if (!mem) { err = -ENOMEM ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 37/379 tipc: Use size_add() in calls to struct_size()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
[ Upstream commit 2506a91734754de690869824fb0d1ac592ec1266 ]
If, for any reason, the open-coded arithmetic causes a wraparound, the protection that struct_size() adds against potential integer overflows is defeated. Fix this by hardening call to struct_size() with size_add().
--- net/tipc/link.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/tipc/link.c +2 -2
@@ -1446,7 +1446,7 @@ u16 tipc_get_gap_ack_blks(struct tipc_gap_ack_blks **ga, struct tipc_link *l, p = (struct tipc_gap_ack_blks *)msg_data (hdr); sz =ntohs (p->len);/* Sanity check */ -if (sz ==struct_size (p, gacks, p->ugack_cnt + p->bgack_cnt)) { +if (sz ==struct_size (p, gacks,size_add (p->ugack_cnt, p->bgack_cnt))) {/* Good, check if the desired type exists */ if ((uc && p->ugack_cnt) || (!uc && p->bgack_cnt)) goto ok;
@@ -1533,7 +1533,7 @@ static u16 tipc_build_gap_ack_blks(struct tipc_link *l, struct tipc_msg *hdr) __tipc_build_gap_ack_blks(ga, l, ga->bgack_cnt) : 0;/* Total len */ - len =struct_size (ga, gacks, ga->bgack_cnt + ga->ugack_cnt); + len =struct_size (ga, gacks,size_add (ga->bgack_cnt, ga->ugack_cnt)); ga->len =htons (len);return len; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 38/379 net: spider_net: Use size_add() in call to struct_size()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
[ Upstream commit 0201409079b975e46cc40e8bdff4bd61329ee10f ]
If, for any reason, the open-coded arithmetic causes a wraparound, the protection that struct_size() adds against potential integer overflows is defeated. Fix this by hardening call to struct_size() with size_add().
--- drivers/net/ethernet/toshiba/spider_net.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/toshiba/spider_net.c +1 -1
@@ -2332,7 +2332,7 @@ spider_net_alloc_card(void)struct spider_net_card *card; netdev =alloc_etherdev (struct_size (card, darray, - tx_descriptors + rx_descriptors)); +size_add (tx_descriptors, rx_descriptors)));if (!netdev)return NULL ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 39/379 net: ethernet: mtk_wed: fix EXT_INT_STATUS_RX_FBUF definitions for MT7986 SoC
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit c80471ba74b7f332ac19b985ccb76d852d507acf ]
Fix MTK_WED_EXT_INT_STATUS_RX_FBUF_LO_TH and MTK_WED_EXT_INT_STATUS_RX_FBUF_HI_TH definitions for MT7986 (MT7986 is the only SoC to use them).
--- drivers/net/ethernet/mediatek/mtk_wed_regs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mediatek/mtk_wed_regs.h +2 -2
@@ -51,8 +51,8 @@ struct mtk_wdma_desc {#define MTK_WED_EXT_INT_STATUS_TKID_TITO_INVALID BIT(4)#define MTK_WED_EXT_INT_STATUS_TX_FBUF_LO_TH BIT(8)#define MTK_WED_EXT_INT_STATUS_TX_FBUF_HI_TH BIT(9) -#define MTK_WED_EXT_INT_STATUS_RX_FBUF_LO_TH BIT(12) -#define MTK_WED_EXT_INT_STATUS_RX_FBUF_HI_TH BIT(13) +#define MTK_WED_EXT_INT_STATUS_RX_FBUF_LO_TH BIT(10)/* wed v2 */ +#define MTK_WED_EXT_INT_STATUS_RX_FBUF_HI_TH BIT(11)/* wed v2 */ #define MTK_WED_EXT_INT_STATUS_RX_DRV_R_RESP_ERR BIT(16)#define MTK_WED_EXT_INT_STATUS_RX_DRV_W_RESP_ERR BIT(17)#define MTK_WED_EXT_INT_STATUS_RX_DRV_COHERENT BIT(18)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 40/379 wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 74f7957c9b1b95553faaf146a2553e023a9d1720 ]
Since debugfs_create_file() return ERR_PTR and never return NULL, so use IS_ERR() to check it instead of checking NULL.
--- drivers/net/wireless/realtek/rtw88/debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw88/debug.c +2 -2
@@ -1191,9 +1191,9 @@ static struct rtw_debugfs_priv rtw_debug_priv_dm_cap = {#define rtw_debugfs_add_core (name, mode, fopname, parent) \ do { \ rtw_debug_priv_ ##name.rtwdev = rtwdev; \ - if (!debugfs_create_file(#name, mode, \ + if (IS_ERR(debugfs_create_file(#name, mode, \ parent, &rtw_debug_priv_ ##name,\ - &file_ops_ ##fopname)) \ + &file_ops_ ##fopname))) \ pr_debug("Unable to initialize debugfs:%s\n", \ #name); \ } while (0)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 41/379 wifi: ath11k: fix boot failure with one MSI vector
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baochen Qiang <[email protected]>
[ Upstream commit 39564b475ac5a589e6c22c43a08cbd283c295d2c ]
Commit 5b32b6dd96633 ("ath11k: Remove core PCI references from PCI common code") breaks with one MSI vector because it moves affinity setting after IRQ request, see below log:
[ 1417.278835] ath11k_pci 0000:02:00.0: failed to receive control response completion, polling.. [ 1418.302829] ath11k_pci 0000:02:00.0: Service connect timeout [ 1418.302833] ath11k_pci 0000:02:00.0: failed to connect to HTT: -110 [ 1418.303669] ath11k_pci 0000:02:00.0: failed to start core: -110
The detail is, if do affinity request after IRQ activated, which is done in request_irq(), kernel caches that request and returns success directly. Later when a subsequent MHI interrupt is fired, kernel will do the real affinity setting work, as a result, changs the MSI vector. However at that time host has configured old vector to hardware, so host never receives CE or DP interrupts.
Fix it by setting affinity before registering MHI controller where host is, for the first time, doing IRQ request.
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3
Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-01160-QCAMSLSWPLZ-1
--- drivers/net/wireless/ath/ath11k/pci.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/net/wireless/ath/ath11k/pci.c +12 -12
@@ -853,10 +853,16 @@ static int ath11k_pci_probe(struct pci_dev *pdev,if (ret) goto err_pci_disable_msi; + ret =ath11k_pci_set_irq_affinity_hint (ab_pci,cpumask_of (0 )); +if (ret) { +ath11k_err (ab,"failed to set irq affinity %d\n" , ret); + goto err_pci_disable_msi; + } + ret =ath11k_mhi_register (ab_pci);if (ret) {ath11k_err (ab,"failed to register mhi: %d\n" , ret); - goto err_pci_disable_msi; + goto err_irq_affinity_cleanup; } ret =ath11k_hal_srng_init (ab);
@@ -877,12 +883,6 @@ static int ath11k_pci_probe(struct pci_dev *pdev, goto err_ce_free; } - ret =ath11k_pci_set_irq_affinity_hint (ab_pci,cpumask_of (0 )); -if (ret) { -ath11k_err (ab,"failed to set irq affinity %d\n" , ret); - goto err_free_irq; - } -/* kernel may allocate a dummy vector before request_irq and * then allocate a real vector when request_irq is called. * So get msi_data here again to avoid spurious interrupt
@@ -891,19 +891,16 @@ static int ath11k_pci_probe(struct pci_dev *pdev, ret =ath11k_pci_config_msi_data (ab_pci);if (ret) {ath11k_err (ab,"failed to config msi_data: %d\n" , ret); - goto err_irq_affinity_cleanup; + goto err_free_irq; } ret =ath11k_core_init (ab);if (ret) {ath11k_err (ab,"failed to init core: %d\n" , ret); - goto err_irq_affinity_cleanup; + goto err_free_irq; }return 0 ; -err_irq_affinity_cleanup: -ath11k_pci_set_irq_affinity_hint (ab_pci,NULL ); - err_free_irq:ath11k_pcic_free_irq (ab);
@@ -916,6 +913,9 @@ static int ath11k_pci_probe(struct pci_dev *pdev, err_mhi_unregister:ath11k_mhi_unregister (ab_pci); +err_irq_affinity_cleanup: +ath11k_pci_set_irq_affinity_hint (ab_pci,NULL ); + err_pci_disable_msi:ath11k_pci_free_msi (ab_pci);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 42/379 wifi: mt76: mt7603: rework/fix rx pse hang check
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit baa19b2e4b7bbb509a7ca7939c8785477dcd40ee ]
It turns out that the code in mt7603_rx_pse_busy() does not detect actual hardware hangs, it only checks for busy conditions in PSE.
A reset should only be performed if these conditions are true and if there is no rx activity as well.
Reset the counter whenever a rx interrupt occurs. In order to also deal with a fully loaded CPU that leaves interrupts disabled with continuous NAPI polling, also check for pending rx interrupts in the function itself.
--- .../net/wireless/mediatek/mt76/mt7603/core.c | 2 ++ .../net/wireless/mediatek/mt76/mt7603/mac.c | 23 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7603/core.c +2 -0
@@ -42,11 +42,13 @@ irqreturn_t mt7603_irq_handler(int irq, void *dev_instance) }if (intr &MT_INT_RX_DONE (0 )) { + dev->rx_pse_check =0 ;mt7603_irq_disable (dev,MT_INT_RX_DONE (0 ));napi_schedule (&dev->mt76.napi[0 ]); }if (intr &MT_INT_RX_DONE (1 )) { + dev->rx_pse_check =0 ;mt7603_irq_disable (dev,MT_INT_RX_DONE (1 ));napi_schedule (&dev->mt76.napi[1 ]); }
drivers/net/wireless/mediatek/mt76/mt7603/mac.c +16 -7
@@ -1559,20 +1559,29 @@ static bool mt7603_rx_pse_busy(struct mt7603_dev *dev) {u32 addr, val; -if (mt76_rr (dev,MT_MCU_DEBUG_RESET ) &MT_MCU_DEBUG_RESET_QUEUES ) -return true; -if (mt7603_rx_fifo_busy (dev)) -return false; + goto out; addr =mt7603_reg_map (dev,MT_CLIENT_BASE_PHYS_ADDR +MT_CLIENT_STATUS );mt76_wr (dev, addr,3 ); val =mt76_rr (dev, addr) >>16 ; -if (is_mt7628 (dev) && (val &0x4001 ) ==0x4001 ) -return true; +if (!(val &BIT (0 ))) +return false; + +if (is_mt7628 (dev)) + val &=0xa000 ; +else + val &=0x8000 ; +if (!val) +return false; + +out: +if (mt76_rr (dev,MT_INT_SOURCE_CSR ) & + (MT_INT_RX_DONE (0 ) |MT_INT_RX_DONE (1 ))) +return false; -return (val &0x8001 ) ==0x8001 || (val &0xe001 ) ==0xe001 ; +return true; } static bool
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 43/379 wifi: mt76: mt7603: improve watchdog reset reliablity
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit c677dda165231c3efffb9de4bace249d5d2a51b9 ]
Only trigger PSE reset if PSE was stuck, otherwise it can cause DMA issues. Trigger the PSE reset while DMA is fully stopped in order to improve reliabilty.
--- .../net/wireless/mediatek/mt76/mt7603/mac.c | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7603/mac.c +12 -17
@@ -1430,15 +1430,6 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)mt7603_beacon_set_timer (dev,-1 ,0 ); -if (dev->reset_cause[RESET_CAUSE_RESET_FAILED ] || - dev->cur_reset_cause ==RESET_CAUSE_RX_PSE_BUSY || - dev->cur_reset_cause ==RESET_CAUSE_BEACON_STUCK || - dev->cur_reset_cause ==RESET_CAUSE_TX_HANG ) -mt7603_pse_reset (dev); - -if (dev->reset_cause[RESET_CAUSE_RESET_FAILED ]) - goto skip_dma_reset; -mt7603_mac_stop (dev); mt76_clear(dev, MT_WPDMA_GLO_CFG,
@@ -1448,28 +1439,32 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)mt7603_irq_disable (dev, mask); -mt76_set (dev,MT_WPDMA_GLO_CFG ,MT_WPDMA_GLO_CFG_FORCE_TX_EOF ); -mt7603_pse_client_reset (dev);mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WM ], true);for (i =0 ; i < __MT_TXQ_MAX; i++)mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[i], true); +mt7603_dma_sched_reset (dev); + +mt76_tx_status_check (&dev->mt76, true); +mt76_for_each_q_rx (&dev->mt76, i) {mt76_queue_rx_reset (dev, i); } -mt76_tx_status_check (&dev->mt76, true); +if (dev->reset_cause[RESET_CAUSE_RESET_FAILED ] || + dev->cur_reset_cause ==RESET_CAUSE_RX_PSE_BUSY ) +mt7603_pse_reset (dev); -mt7603_dma_sched_reset (dev); +if (!dev->reset_cause[RESET_CAUSE_RESET_FAILED ]) { +mt7603_mac_dma_start (dev); -mt7603_mac_dma_start (dev); +mt7603_irq_enable (dev, mask); -mt7603_irq_enable (dev, mask); +clear_bit (MT76_RESET , &dev->mphy.state); + } -skip_dma_reset: -clear_bit (MT76_RESET , &dev->mphy.state);mutex_unlock (&dev->mt76.mutex);mt76_worker_enable (&dev->mt76.tx_worker);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 44/379 wifi: mt76: mt7603: improve stuck beacon handling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit 3176205933494bd184c6acd70e796c382bc729b5 ]
Before preparing the new beacon, check the queue status, flush out all previous beacons and buffered multicast packets, then (if necessary) try to recover more gracefully from a stuck beacon condition by making a less invasive attempt at getting the MAC un-stuck.
--- .../wireless/mediatek/mt76/mt7603/beacon.c | 76 ++++++++++++++----- .../net/wireless/mediatek/mt76/mt7603/regs.h | 5 ++ 2 files changed, 60 insertions(+), 21 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7603/beacon.c +55 -21
@@ -9,6 +9,23 @@ struct beacon_bc_data {int count[MT7603_MAX_INTERFACES ]; }; +static void +mt7603_mac_stuck_beacon_recovery (struct mt7603_dev *dev) +{ +if (dev->beacon_check %5 !=4 ) +return ; + +mt76_clear (dev,MT_WPDMA_GLO_CFG ,MT_WPDMA_GLO_CFG_TX_DMA_EN ); +mt76_set (dev,MT_SCH_4 ,MT_SCH_4_RESET ); +mt76_clear (dev,MT_SCH_4 ,MT_SCH_4_RESET ); +mt76_set (dev,MT_WPDMA_GLO_CFG ,MT_WPDMA_GLO_CFG_TX_DMA_EN ); + +mt76_set (dev,MT_WF_CFG_OFF_WOCCR ,MT_WF_CFG_OFF_WOCCR_TMAC_GC_DIS ); +mt76_set (dev,MT_ARB_SCR ,MT_ARB_SCR_TX_DISABLE ); +mt76_clear (dev,MT_ARB_SCR ,MT_ARB_SCR_TX_DISABLE ); +mt76_clear (dev,MT_WF_CFG_OFF_WOCCR ,MT_WF_CFG_OFF_WOCCR_TMAC_GC_DIS ); +} +static void mt7603_update_beacon_iter (void *priv,u8 *mac,struct ieee80211_vif *vif) {
@@ -16,6 +33,8 @@ mt7603_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)struct mt76_dev *mdev = &dev->mt76;struct mt7603_vif *mvif = (struct mt7603_vif *)vif->drv_priv;struct sk_buff *skb =NULL ; +u32 om_idx = mvif->idx; +u32 val;if (!(mdev->beacon_mask &BIT (mvif->idx)))return ;
@@ -24,20 +43,33 @@ mt7603_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)if (!skb)return ; -mt76_tx_queue_skb (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], -MT_TXQ_BEACON , skb, &mvif->sta.wcid,NULL ); +if (om_idx) + om_idx |=0x10 ; + val =MT_DMA_FQCR0_BUSY |MT_DMA_FQCR0_MODE | +FIELD_PREP (MT_DMA_FQCR0_TARGET_BSS , om_idx) | +FIELD_PREP (MT_DMA_FQCR0_DEST_PORT_ID ,3 ) | +FIELD_PREP (MT_DMA_FQCR0_DEST_QUEUE_ID ,8 );spin_lock_bh (&dev->ps_lock); -mt76_wr (dev,MT_DMA_FQCR0 ,MT_DMA_FQCR0_BUSY | -FIELD_PREP (MT_DMA_FQCR0_TARGET_WCID , mvif->sta.wcid.idx) | -FIELD_PREP (MT_DMA_FQCR0_TARGET_QID , - dev->mphy.q_tx[MT_TXQ_CAB ]->hw_idx) | -FIELD_PREP (MT_DMA_FQCR0_DEST_PORT_ID ,3 ) | -FIELD_PREP (MT_DMA_FQCR0_DEST_QUEUE_ID ,8 )); -if (!mt76_poll (dev,MT_DMA_FQCR0 ,MT_DMA_FQCR0_BUSY ,0 ,5000 )) +mt76_wr (dev,MT_DMA_FQCR0 , val | +FIELD_PREP (MT_DMA_FQCR0_TARGET_QID ,MT_TX_HW_QUEUE_BCN )); +if (!mt76_poll (dev,MT_DMA_FQCR0 ,MT_DMA_FQCR0_BUSY ,0 ,5000 )) { dev->beacon_check =MT7603_WATCHDOG_TIMEOUT ; + goto out; + } + +mt76_wr (dev,MT_DMA_FQCR0 , val | +FIELD_PREP (MT_DMA_FQCR0_TARGET_QID ,MT_TX_HW_QUEUE_BMC )); +if (!mt76_poll (dev,MT_DMA_FQCR0 ,MT_DMA_FQCR0_BUSY ,0 ,5000 )) { + dev->beacon_check =MT7603_WATCHDOG_TIMEOUT ; + goto out; + } +mt76_tx_queue_skb (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], +MT_TXQ_BEACON , skb, &mvif->sta.wcid,NULL ); + +out:spin_unlock_bh (&dev->ps_lock); }
@@ -81,6 +113,18 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t) data.dev = dev;__skb_queue_head_init (&data.q); +/* Flush all previous CAB queue packets and beacons */ +mt76_wr (dev,MT_WF_ARB_CAB_FLUSH ,GENMASK (30 ,16 ) |BIT (0 )); + +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_CAB ], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], false); + +if (dev->mphy.q_tx[MT_TXQ_BEACON ]->queued >0 ) + dev->beacon_check++; +else + dev->beacon_check =0 ; +mt7603_mac_stuck_beacon_recovery (dev); + q = dev->mphy.q_tx[MT_TXQ_BEACON ];spin_lock (&q->lock); ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
@@ -89,14 +133,9 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)mt76_queue_kick (dev, q);spin_unlock (&q->lock); -/* Flush all previous CAB queue packets */ -mt76_wr (dev,MT_WF_ARB_CAB_FLUSH ,GENMASK (30 ,16 ) |BIT (0 )); - -mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_CAB ], false); -mt76_csa_check (mdev);if (mdev->csa_complete) - goto out; +return ; q = dev->mphy.q_tx[MT_TXQ_CAB ]; do {
@@ -108,7 +147,7 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t) skb_queue_len(&data.q) < 8);if (skb_queue_empty (&data.q)) - goto out; +return ;for (i =0 ; i <ARRAY_SIZE (data.tail); i++) {if (!data.tail[i])
@@ -136,11 +175,6 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)MT_WF_ARB_CAB_START_BSSn (0 ) | (MT_WF_ARB_CAB_START_BSS0n (1 ) * ((1 << (MT7603_MAX_INTERFACES - 1)) - 1))); - -out: -mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], false); -if (dev->mphy.q_tx[MT_TXQ_BEACON ]->queued >hweight8 (mdev->beacon_mask)) - dev->beacon_check++; }void mt7603_beacon_set_timer (struct mt7603_dev *dev,int idx,int intval)
drivers/net/wireless/mediatek/mt76/mt7603/regs.h +5 -0
@@ -462,6 +462,11 @@ enum {#define MT_WF_SEC_BASE 0x21a00#define MT_WF_SEC (ofs) (MT_WF_SEC_BASE + (ofs)) +#define MT_WF_CFG_OFF_BASE 0x21e00 +#define MT_WF_CFG_OFF (ofs) (MT_WF_CFG_OFF_BASE + (ofs)) +#define MT_WF_CFG_OFF_WOCCR MT_WF_CFG_OFF(0x004) +#define MT_WF_CFG_OFF_WOCCR_TMAC_GC_DIS BIT(4) +#define MT_SEC_SCR MT_WF_SEC(0x004)#define MT_SEC_SCR_MASK_ORDER GENMASK(1, 0)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 45/379 wifi: mt76: mt7915: fix beamforming availability check
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: MeiChia Chiu <[email protected]>
[ Upstream commit ced1a0b8f3944e44e7f4eb3772dea1bada25d38a ]
Without this patch, when ap sets the tx stream number to 2, ap won't send any beamforming packet.
--- drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +2 -2
@@ -988,13 +988,13 @@ mt7915_is_ebf_supported(struct mt7915_phy *phy, struct ieee80211_vif *vif, struct ieee80211_sta *sta, bool bfee) {struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; -int tx_ant =hweight8 (phy->mt76->chainmask) -1 ; +int sts =hweight16 (phy->mt76->chainmask);if (vif->type !=NL80211_IFTYPE_STATION && vif->type !=NL80211_IFTYPE_AP )return false; -if (!bfee && tx_ant <2 ) +if (!bfee && sts <2 )return false;if (sta->deflink.he_cap.has_he) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 46/379 wifi: ath: dfs_pattern_detector: Fix a memory initialization issue
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 79bd60ee87e1136718a686d6617ced5de88ee350 ]
If an error occurs and channel_detector_exit() is called, it relies on entries of the 'detectors' array to be NULL.
Otherwise, it may access to un-initialized memory.
Fix it and initialize the memory, as what was done before the commit in Fixes.
--- drivers/net/wireless/ath/dfs_pattern_detector.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/dfs_pattern_detector.c +1 -1
@@ -206,7 +206,7 @@ channel_detector_create(struct dfs_pattern_detector *dpd, u16 freq)INIT_LIST_HEAD (&cd->head); cd->freq = freq; - cd->detectors =kmalloc_array (dpd->num_radar_types, + cd->detectors =kcalloc (dpd->num_radar_types,sizeof (*cd->detectors),GFP_ATOMIC );if (cd->detectors ==NULL ) goto fail;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 47/379 tcp_metrics: add missing barriers on delete
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit cbc3a153222805d65f821e10f4f78b6afce06f86 ]
When removing an item from RCU protected list, we must prevent store-tearing, using rcu_assign_pointer() or WRITE_ONCE().
--- net/ipv4/tcp_metrics.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp_metrics.c +2 -2
@@ -908,7 +908,7 @@ static void tcp_metrics_flush_all(struct net *net) match = net ?net_eq (tm_net (tm), net) : !refcount_read (&tm_net (tm)->ns.count);if (match) { - *pp = tm->tcpm_next; +rcu_assign_pointer (*pp, tm->tcpm_next);kfree_rcu (tm, rcu_head); }else { pp = &tm->tcpm_next;
@@ -949,7 +949,7 @@ static int tcp_metrics_nl_cmd_del(struct sk_buff *skb, struct genl_info *info)if (addr_same (&tm->tcpm_daddr, &daddr) && (!src ||addr_same (&tm->tcpm_saddr, &saddr)) &&net_eq (tm_net (tm), net)) { - *pp = tm->tcpm_next; +rcu_assign_pointer (*pp, tm->tcpm_next);kfree_rcu (tm, rcu_head); found = true; }else {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 48/379 tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 081480014a64a69d901f8ef1ffdd56d6085cf87e ]
We need to set tp->snd_ssthresh to TCP_INFINITE_SSTHRESH in the case tcp_get_metrics() fails for some reason.
--- net/ipv4/tcp_metrics.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
net/ipv4/tcp_metrics.c +4 -5
@@ -470,6 +470,10 @@ void tcp_init_metrics(struct sock *sk)u32 val, crtt =0 ;/* cached RTT scaled by 8 */ sk_dst_confirm (sk); +/* ssthresh may have been reduced unnecessarily during. +* 3WHS. Restore it back to its initial default. +*/ + tp->snd_ssthresh =TCP_INFINITE_SSTHRESH ;if (!dst) goto reset;
@@ -489,11 +493,6 @@ void tcp_init_metrics(struct sock *sk) tp->snd_ssthresh = val;if (tp->snd_ssthresh > tp->snd_cwnd_clamp) tp->snd_ssthresh = tp->snd_cwnd_clamp; - }else { -/* ssthresh may have been reduced unnecessarily during. -* 3WHS. Restore it back to its initial default. -*/ - tp->snd_ssthresh =TCP_INFINITE_SSTHRESH ; } val =tcp_metric_get (tm,TCP_METRIC_REORDERING );if (val && tp->reordering != val)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 49/379 tcp_metrics: do not create an entry from tcp_init_metrics()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit a135798e6e200ecb2f864cecca6d257ba278370c ]
tcp_init_metrics() only wants to get metrics if they were previously stored in the cache. Creating an entry is adding useless costs, especially when tcp_no_metrics_save is set.
--- net/ipv4/tcp_metrics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_metrics.c +1 -1
@@ -478,7 +478,7 @@ void tcp_init_metrics(struct sock *sk) goto reset;rcu_read_lock (); - tm =tcp_get_metrics (sk, dst, true); + tm =tcp_get_metrics (sk, dst, false);if (!tm) {rcu_read_unlock (); goto reset;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 50/379 wifi: rtlwifi: fix EDCA limit set by BT coexistence
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
[ Upstream commit 3391ee7f9ea508c375d443cd712c2e699be235b4 ]
In 'rtl92c_dm_check_edca_turbo()', 'rtl88e_dm_check_edca_turbo()', and 'rtl8723e_dm_check_edca_turbo()', the DL limit should be set from the corresponding field of 'rtlpriv->btcoexist' rather than UL. Compile tested only.
--- drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c | 2 +- drivers/net/wireless/realtek/rtlwifi/rtl8192c/dm_common.c | 2 +- drivers/net/wireless/realtek/rtlwifi/rtl8723ae/dm.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c +1 -1
@@ -799,7 +799,7 @@ static void rtl88e_dm_check_edca_turbo(struct ieee80211_hw *hw) }if (rtlpriv->btcoexist.bt_edca_dl !=0 ) { - edca_be_ul = rtlpriv->btcoexist.bt_edca_dl; + edca_be_dl = rtlpriv->btcoexist.bt_edca_dl; bt_change_edca = true; }
drivers/net/wireless/realtek/rtlwifi/rtl8192c/dm_common.c +1 -1
@@ -640,7 +640,7 @@ static void rtl92c_dm_check_edca_turbo(struct ieee80211_hw *hw) }if (rtlpriv->btcoexist.bt_edca_dl !=0 ) { - edca_be_ul = rtlpriv->btcoexist.bt_edca_dl; + edca_be_dl = rtlpriv->btcoexist.bt_edca_dl; bt_change_edca = true; }
drivers/net/wireless/realtek/rtlwifi/rtl8723ae/dm.c +1 -1
@@ -466,7 +466,7 @@ static void rtl8723e_dm_check_edca_turbo(struct ieee80211_hw *hw) }if (rtlpriv->btcoexist.bt_edca_dl !=0 ) { - edca_be_ul = rtlpriv->btcoexist.bt_edca_dl; + edca_be_dl = rtlpriv->btcoexist.bt_edca_dl; bt_change_edca = true; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 51/379 ACPI: property: Allow _DSD buffer data only for byte accessors
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 046ece773cc77ef5d2a1431b188ac3d0840ed150 ]
In accordance with ACPI specificication and _DSD data buffer representation the data there is an array of bytes. Hence, accessing it with something longer will create a sparse data which is against of how device property APIs work in general and also not defined in the ACPI specification (see [1]). Fix the code to emit an error if non-byte accessor is used to retrieve _DSD buffer data.
--- drivers/acpi/property.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
drivers/acpi/property.c +10 -9
@@ -1114,25 +1114,26 @@ static int acpi_data_prop_read(const struct acpi_device_data *data,switch (proptype) {case DEV_PROP_STRING :break ; - case DEV_PROP_U8 ... DEV_PROP_U64: +default :if (obj->type ==ACPI_TYPE_BUFFER ) {if (nval > obj->buffer.length)return -EOVERFLOW ; -break ; + }else { +if (nval > obj->package.count) +return -EOVERFLOW ; } - fallthrough; -default : -if (nval > obj->package.count) -return -EOVERFLOW ;break ; }if (nval ==0 )return -EINVAL ; -if (obj->type !=ACPI_TYPE_BUFFER ) - items = obj->package.elements; -else +if (obj->type ==ACPI_TYPE_BUFFER ) { +if (proptype !=DEV_PROP_U8 ) +return -EPROTO ; items = obj; + }else { + items = obj->package.elements; + }switch (proptype) {case DEV_PROP_U8 :
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 52/379 =?UTF-8?q?ACPI:=20video:=20Add=20acpi=5Fbacklight=3Dvendor=20quir?= =?UTF-8?q?k=20for=20Toshiba=20Port=C3=A9g=C3=A9=20R100?=
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ondrej Zary <[email protected]>
[ Upstream commit 35a341c9b25da6a479bd8013bcb11a680a7233e3 ]
Toshiba Portégé R100 has both acpi_video and toshiba_acpi vendor backlight driver working. But none of them gets activated as it has a VGA with no kernel driver (Trident CyberBlade XP4m32).
The DMI strings are very generic ("Portable PC") so add a custom callback function to check for Trident CyberBlade XP4m32 PCI device before enabling the vendor backlight driver (better than acpi_video as it has more brightness steps).
--- drivers/acpi/video_detect.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
drivers/acpi/video_detect.c +26 -0
@@ -130,6 +130,16 @@ static int video_detect_force_native(const struct dmi_system_id *d)return 0 ; } +static int video_detect_portege_r100 (const struct dmi_system_id *d) +{ +struct pci_dev *dev; +/* Search for Trident CyberBlade XP4m32 to confirm Portégé R100 */ + dev =pci_get_device (PCI_VENDOR_ID_TRIDENT ,0x2100 ,NULL ); +if (dev) + acpi_backlight_dmi = acpi_backlight_vendor; +return 0 ; +} +static const struct dmi_system_id video_detect_dmi_table[] = {/* * Models which should use the vendor backlight interface,
@@ -268,6 +278,22 @@ static const struct dmi_system_id video_detect_dmi_table[] = { }, }, +/* +* Toshiba Portégé R100 has working both acpi_video and toshiba_acpi +* vendor driver. But none of them gets activated as it has a VGA with +* no kernel driver (Trident CyberBlade XP4m32). +* The DMI strings are generic so check for the VGA chip in callback. +*/ + { + .callback = video_detect_portege_r100, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"), + DMI_MATCH(DMI_BOARD_NAME, "Portable PC") + }, + }, + /* * Models which need acpi_video backlight control where the GPU drivers * do not call acpi_video_register_backlight() because no internal panel
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 53/379 wifi: ath11k: fix Tx power value during active CAC
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aditya Kumar Singh <[email protected]>
[ Upstream commit 77f1ee6fd8b6e470f721d05a2e269039d5cafcb7 ]
Tx power is fetched from firmware's pdev stats. However, during active CAC, firmware does not fill the current Tx power and sends the max initialised value filled during firmware init. If host sends this power to user space, this is wrong since in certain situations, the Tx power could be greater than the max allowed by the regulatory. Hence, host should not be fetching the Tx power during an active CAC.
Fix this issue by returning -EAGAIN error so that user space knows that there's no valid value available.
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
--- drivers/net/wireless/ath/ath11k/mac.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/net/wireless/ath/ath11k/mac.c +8 -0
@@ -8549,6 +8549,14 @@ static int ath11k_mac_op_get_txpower(struct ieee80211_hw *hw,if (ar->state !=ATH11K_STATE_ON ) goto err_fallback; +/* Firmware doesn't provide Tx power during CAC hence no need to fetch +* the stats. +*/ +if (test_bit (ATH11K_CAC_RUNNING , &ar->dev_flags)) { +mutex_unlock (&ar->conf_mutex); +return -EAGAIN ; + } + req_param.pdev_id = ar->pdev->pdev_id; req_param.stats_id =WMI_REQUEST_PDEV_STAT ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 54/379 can: dev: can_restart(): dont crash kernel if carrier is OK
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit fe5c9940dfd8ba0c73672dddb30acd1b7a11d4c7 ]
During testing, I triggered a can_restart() with the netif carrier being OK [1]. The BUG_ON, which checks if the carrier is OK, results in a fatal kernel crash. This is neither helpful for debugging nor for a production system.
[1] The root cause is a race condition in can_restart() which will be fixed in the next patch.
Do not crash the kernel, issue an error message instead, and continue restarting the CAN device anyway.
--- drivers/net/can/dev/dev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/can/dev/dev.c +2 -1
@@ -132,7 +132,8 @@ static void can_restart(struct net_device *dev)struct can_frame *cf;int err; -BUG_ON (netif_carrier_ok (dev)); +if (netif_carrier_ok (dev)) +netdev_err (dev,"Attempt to restart for bus-off recovery, but carrier is OK?\n" );/* No synchronization needed because the device is bus-off and * no messages can come in or go out.
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 55/379 can: dev: can_restart(): fix race condition between controller restart and netif_carrier_on()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit 6841cab8c4504835e4011689cbdb3351dec693fd ]
This race condition was discovered while updating the at91_can driver to use can_bus_off(). The following scenario describes how the converted at91_can driver would behave.
When a CAN device goes into BUS-OFF state, the driver usually stops/resets the CAN device and calls can_bus_off().
This function sets the netif carrier to off, and (if configured by user space) schedules a delayed work that calls can_restart() to restart the CAN device.
The can_restart() function first checks if the carrier is off and triggers an error message if the carrier is OK.
Then it calls the driver's do_set_mode() function to restart the device, then it sets the netif carrier to on. There is a race window between these two calls.
The at91 CAN controller (observed on the sama5d3, a single core 32 bit ARM CPU) has a hardware limitation. If the device goes into bus-off while sending a CAN frame, there is no way to abort the sending of this frame. After the controller is enabled again, another attempt is made to send it.
If the bus is still faulty, the device immediately goes back to the bus-off state. The driver calls can_bus_off(), the netif carrier is switched off and another can_restart is scheduled. This occurs within the race window before the original can_restart() handler marks the netif carrier as OK. This would cause the 2nd can_restart() to be called with an OK netif carrier, resulting in an error message.
The flow of the 1st can_restart() looks like this:
can_restart()
// bail out if netif_carrier is OK
netif_carrier_ok(dev)
priv->do_set_mode(dev, CAN_MODE_START)
// enable CAN controller
// sama5d3 restarts sending old message
// CAN devices goes into BUS_OFF, triggers IRQ// IRQ handler start
at91_irq()
at91_irq_err_line()
can_bus_off()
netif_carrier_off()
schedule_delayed_work()// IRQ handler end
netif_carrier_on()
The 2nd can_restart() will be called with an OK netif carrier and the error message will be printed.
To close the race window, first set the netif carrier to on, then restart the controller. In case the restart fails with an error code, roll back the netif carrier to off.
--- drivers/net/can/dev/dev.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/can/dev/dev.c +4 -3
@@ -154,11 +154,12 @@ static void can_restart(struct net_device *dev) priv->can_stats.restarts++;/* Now restart the device */ - err = priv->do_set_mode (dev,CAN_MODE_START ); -netif_carrier_on (dev); -if (err) + err = priv->do_set_mode (dev,CAN_MODE_START ); +if (err) {netdev_err (dev,"Error %d during restart" , err); +netif_carrier_off (dev); + } }static void can_restart_work (struct work_struct *work)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 56/379 can: dev: can_put_echo_skb(): dont crash kernel if can_priv::echo_skb is accessed out of bounds
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit 6411959c10fe917288cbb1038886999148560057 ]
If the "struct can_priv::echoo_skb" is accessed out of bounds, this would cause a kernel crash. Instead, issue a meaningful warning message and return with an error.
--- drivers/net/can/dev/skb.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/can/dev/skb.c +5 -1
@@ -49,7 +49,11 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, {struct can_priv *priv =netdev_priv (dev); -BUG_ON (idx >= priv->echo_skb_max); +if (idx >= priv->echo_skb_max) { +netdev_err (dev,"%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n" , + __func__, idx, priv->echo_skb_max); +return -EINVAL ; + }/* check flag whether this packet has to be looped back */ if (!(dev->flags & IFF_ECHO) ||
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 57/379 PM / devfreq: rockchip-dfi: Make pmu regmap mandatory
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sascha Hauer <[email protected]>
[ Upstream commit 1e0731c05c985deb68a97fa44c1adcd3305dda90 ]
As a matter of fact the regmap_pmu already is mandatory because it is used unconditionally in the driver. Bail out gracefully in probe() rather than crashing later.
--- drivers/devfreq/event/rockchip-dfi.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/devfreq/event/rockchip-dfi.c +8 -7
@@ -193,14 +193,15 @@ static int rockchip_dfi_probe(struct platform_device *pdev)return dev_err_probe (dev,PTR_ERR (data->clk),"Cannot get the clk pclk_ddr_mon\n" ); -/* try to find the optional reference to the pmu syscon */ node =of_parse_phandle (np,"rockchip,pmu" ,0 ); -if (node) { - data->regmap_pmu =syscon_node_to_regmap (node); -of_node_put (node); -if (IS_ERR (data->regmap_pmu)) -return PTR_ERR (data->regmap_pmu); - } +if (!node) +return dev_err_probe (&pdev->dev, -ENODEV ,"Can't find pmu_grf registers\n" ); + + data->regmap_pmu =syscon_node_to_regmap (node); +of_node_put (node); +if (IS_ERR (data->regmap_pmu)) +return PTR_ERR (data->regmap_pmu); + data->dev = dev; desc =devm_kzalloc (dev,sizeof (*desc),GFP_KERNEL );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 58/379 wifi: wfx: fix case where rates are out of order
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felipe Negrelli Wolter <[email protected]>
[ Upstream commit ea2274ab0b18549dbf0e755e41d8c5e8b5232dc3 ]
When frames are sent over the air, the device always applies the data rates in descending order. The driver assumed Minstrel also provided rate in descending order.
However, in some cases, Minstrel can a choose a fallback rate greater than the primary rate. In this case, the two rates was inverted, the device try highest rate first and we get many retries.
Since the device always applies rates in descending order, the workaround is to drop the rate when it higher than its predecessor in the rate list. Thus [ 4, 5, 3 ] becomes [ 4, 3 ].
This patch has been tested in isolated room with a series of attenuators. Here are the Minstrel statistics with 80dBm of attenuation:
Without the fix:
best ____________rate__________ ____statistics___ _____last____ ______sum-of________
mode guard # rate [name idx airtime max_tp] [avg(tp) avg(prob)] [retry|suc|att] [#success | #attempts]
HT20 LGI 1 S MCS0 0 1477 5.6 5.2 82.7 3 0 0 3 4
HT20 LGI 1 MCS1 1 738 10.6 0.0 0.0 0 0 0 0 1
HT20 LGI 1 D MCS2 2 492 14.9 13.5 81.5 5 0 0 5 9
HT20 LGI 1 C MCS3 3 369 18.8 17.6 84.3 5 0 0 76 96
HT20 LGI 1 A P MCS4 4 246 25.4 22.4 79.5 5 0 0 11268 14026
HT20 LGI 1 B S MCS5 5 185 30.7 19.7 57.7 5 8 9 3918 9793
HT20 LGI 1 MCS6 6 164 33.0 0.0 0.0 5 0 0 6 102
HT20 LGI 1 MCS7 7 148 35.1 0.0 0.0 0 0 0 0 44
With the fix:
best ____________rate__________ ____statistics___ _____last____ ______sum-of________
mode guard # rate [name idx airtime max_tp] [avg(tp) avg(prob)] [retry|suc|att] [#success | #attempts]
HT20 LGI 1 S MCS0 0 1477 5.6 1.8 28.6 1 0 0 1 5
HT20 LGI 1 DP MCS1 1 738 10.6 9.7 82.6 4 0 0 14 34
HT20 LGI 1 MCS2 2 492 14.9 9.2 55.4 5 0 0 52 77
HT20 LGI 1 B S MCS3 3 369 18.8 15.6 74.9 5 1 1 417 554
HT20 LGI 1 A MCS4 4 246 25.4 16.7 59.2 5 1 1 13812 17951
HT20 LGI 1 C S MCS5 5 185 30.7 14.0 41.0 5 1 5 57 640
HT20 LGI 1 MCS6 6 164 33.0 0.0 0.0 0 0 1 0 48
HT20 LGI 1 S MCS7 7 148 35.1 0.0 0.0 0 0 0 0 36We can notice the device try now to send with lower rates (and high success rates). At the end, we measured 20-25% better throughput with this patch.
--- drivers/net/wireless/silabs/wfx/data_tx.c | 71 +++++++++-------------- 1 file changed, 29 insertions(+), 42 deletions(-)
drivers/net/wireless/silabs/wfx/data_tx.c +29 -42
@@ -226,53 +226,40 @@ static u8 wfx_tx_get_link_id(struct wfx_vif *wvif, struct ieee80211_sta *sta,static void wfx_tx_fixup_rates (struct ieee80211_tx_rate *rates) { -int i; -bool finished; +bool has_rate0 = false; +int i, j; -/* Firmware is not able to mix rates with different flags */ -for (i =0 ; i <IEEE80211_TX_MAX_RATES ; i++) { -if (rates[0 ].flags &IEEE80211_TX_RC_SHORT_GI ) - rates[i].flags |=IEEE80211_TX_RC_SHORT_GI ; -if (!(rates[0 ].flags &IEEE80211_TX_RC_SHORT_GI )) +for (i =1 , j =1 ; j <IEEE80211_TX_MAX_RATES ; j++) { +if (rates[j].idx ==-1 ) +break ; +/* The device use the rates in descending order, whatever the request from minstrel. +* We have to trade off here. Most important is to respect the primary rate +* requested by minstrel. So, we drops the entries with rate higher than the +* previous. +*/ +if (rates[j].idx >= rates[i -1 ].idx) { + rates[i -1 ].count += rates[j].count; + rates[i -1 ].count =min_t (u16,15 , rates[i -1 ].count); + }else { +memcpy (rates + i, rates + j,sizeof (rates[i])); +if (rates[i].idx ==0 ) + has_rate0 = true; +/* The device apply Short GI only on the first rate */ rates[i].flags &= ~IEEE80211_TX_RC_SHORT_GI ; -if (!(rates[0 ].flags &IEEE80211_TX_RC_USE_RTS_CTS )) - rates[i].flags &= ~IEEE80211_TX_RC_USE_RTS_CTS ; - } - -/* Sort rates and remove duplicates */ -do { - finished = true; -for (i =0 ; i <IEEE80211_TX_MAX_RATES -1 ; i++) { -if (rates[i +1 ].idx == rates[i].idx && - rates[i].idx !=-1 ) { - rates[i].count += rates[i +1 ].count; -if (rates[i].count >15 ) - rates[i].count =15 ; - rates[i +1 ].idx =-1 ; - rates[i +1 ].count =0 ; - - finished = false; - } -if (rates[i +1 ].idx > rates[i].idx) { -swap (rates[i +1 ], rates[i]); - finished = false; - } + i++; } - }while (!finished); + }/* Ensure that MCS0 or 1Mbps is present at the end of the retry list */ -for (i =0 ; i <IEEE80211_TX_MAX_RATES ; i++) { -if (rates[i].idx ==0 ) -break ; -if (rates[i].idx ==-1 ) { - rates[i].idx =0 ; - rates[i].count =8 ;/* == hw->max_rate_tries */ - rates[i].flags = rates[i -1 ].flags &IEEE80211_TX_RC_MCS ; -break ; - } +if (!has_rate0 && i <IEEE80211_TX_MAX_RATES ) { + rates[i].idx =0 ; + rates[i].count =8 ;/* == hw->max_rate_tries */ + rates[i].flags = rates[0 ].flags &IEEE80211_TX_RC_MCS ; + i++; + } +for (; i <IEEE80211_TX_MAX_RATES ; i++) { +memset (rates + i,0 ,sizeof (rates[i])); + rates[i].idx =-1 ; } -/* All retries use long GI */ -for (i =1 ; i <IEEE80211_TX_MAX_RATES ; i++) - rates[i].flags &= ~IEEE80211_TX_RC_SHORT_GI ; }static u8 wfx_tx_get_retry_policy_id (struct wfx_vif *wvif,struct ieee80211_tx_info *tx_info)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 59/379 netfilter: nf_tables: Drop pointless memset when dumping rules
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Sutter <[email protected]>
[ Upstream commit 30fa41a0f6df4c85790cc6499ddc4a926a113bfa ]
None of the dump callbacks uses netlink_callback::args beyond the first element, no need to zero the data.
--- net/netfilter/nf_tables_api.c | 4 ---- 1 file changed, 4 deletions(-)
net/netfilter/nf_tables_api.c +0 -4
@@ -3279,10 +3279,6 @@ static int __nf_tables_dump_rules(struct sk_buff *skb, goto cont_skip;if (*idx < s_idx) goto cont; -if (*idx > s_idx) { -memset (&cb->args[1 ],0 , -sizeof (cb->args) -sizeof (cb->args[0 ])); - }if (prule) handle = prule->handle;else
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 60/379 thermal: core: prevent potential string overflow
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit c99626092efca3061b387043d4a7399bf75fbdd5 ]
The dev->id value comes from ida_alloc() so it's a number between zero and INT_MAX. If it's too high then these sprintf()s will overflow.
--- drivers/thermal/thermal_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/thermal/thermal_core.c +4 -2
@@ -649,7 +649,8 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,if (result) goto release_ida; -sprintf (dev->attr_name,"cdev%d_trip_point" , dev->id); +snprintf (dev->attr_name,sizeof (dev->attr_name),"cdev%d_trip_point" , + dev->id);sysfs_attr_init (&dev->attr.attr); dev->attr.attr.name = dev->attr_name; dev->attr.attr.mode =0444 ;
@@ -658,7 +659,8 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,if (result) goto remove_symbol_link; -sprintf (dev->weight_attr_name,"cdev%d_weight" , dev->id); +snprintf (dev->weight_attr_name,sizeof (dev->weight_attr_name), +"cdev%d_weight" , dev->id);sysfs_attr_init (&dev->weight_attr.attr); dev->weight_attr.attr.name = dev->weight_attr_name; dev->weight_attr.attr.mode =S_IWUSR |S_IRUGO ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 61/379 r8169: use tp_to_dev instead of open code
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juhee Kang <[email protected]>
[ Upstream commit 4b6c6065fca123d419afef005a696f51e6590470 ]
The open code is defined as a helper function(tp_to_dev) on r8169_main.c, which the open code is &tp->pci_dev->dev. The helper function was added in commit 1e1205b7d3e9 ("r8169: add helper tp_to_dev"). And then later, commit f1e911d5d0df ("r8169: add basic phylib support") added r8169_phylink_handler function but it didn't use the helper function. Thus, tp_to_dev() replaces the open code. This patch doesn't change logic.
Stable-dep-of: 621735f59064 ("r8169: fix rare issue with broken rx after link-down on RTL8125")
--- drivers/net/ethernet/realtek/r8169_main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/realtek/r8169_main.c +3 -2
@@ -4556,12 +4556,13 @@ static int rtl8169_poll(struct napi_struct *napi, int budget)static void r8169_phylink_handler (struct net_device *ndev) {struct rtl8169_private *tp =netdev_priv (ndev); +struct device *d =tp_to_dev (tp);if (netif_carrier_ok (ndev)) {rtl_link_chg_patch (tp); -pm_request_resume (&tp->pci_dev->dev); +pm_request_resume (d); }else { -pm_runtime_idle (&tp->pci_dev->dev); +pm_runtime_idle (d); }phy_print_status (tp->phydev);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 62/379 r8169: fix rare issue with broken rx after link-down on RTL8125
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit 621735f590643e3048ca2060c285b80551660601 ]
In very rare cases (I've seen two reports so far about different RTL8125 chip versions) it seems the MAC locks up when link goes down and requires a software reset to get revived.
Realtek doesn't publish hw errata information, therefore the root cause is unknown. Realtek vendor drivers do a full hw re-initialization on each link-up event, the slimmed-down variant here was reported to fix the issue for the reporting user.
It's not fully clear which parts of the NIC are reset as part of the software reset, therefore I can't rule out side effects.
--- drivers/net/ethernet/realtek/r8169_main.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/realtek/r8169_main.c +4 -0
@@ -4561,7 +4561,11 @@ static void r8169_phylink_handler(struct net_device *ndev)if (netif_carrier_ok (ndev)) {rtl_link_chg_patch (tp);pm_request_resume (d); +netif_wake_queue (tp->dev); }else { +/* In few cases rx is broken after link-down otherwise */ +if (rtl_is_8125 (tp)) +rtl_reset_work (tp);pm_runtime_idle (d); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 63/379 selftests: netfilter: test for sctp collision processing in nf_conntrack
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
[ Upstream commit cf791b22bef7d9352ff730a8727d3871942d6001 ]
This patch adds a test case to reproduce the SCTP DATA chunk retransmission timeout issue caused by the improper SCTP collision processing in netfilter nf_conntrack_proto_sctp.
In this test, client sends a INIT chunk, but the INIT_ACK replied from server is delayed until the server sends a INIT chunk to start a new connection from its side. After the connection is complete from server side, the delayed INIT_ACK arrives in nf_conntrack_proto_sctp.
The delayed INIT_ACK should be dropped in nf_conntrack_proto_sctp instead of updating the vtag with the out-of-date init_tag, otherwise, the vtag in DATA chunks later sent by client don't match the vtag in the conntrack entry and the DATA chunks get dropped.
Stable-dep-of: c4eee56e14fe ("net: skb_find_text: Ignore patterns extending past 'to'")
--- tools/testing/selftests/netfilter/Makefile | 5 +- .../netfilter/conntrack_sctp_collision.sh | 89 +++++++++++++++++ .../selftests/netfilter/sctp_collision.c | 99 +++++++++++++++++++ 3 files changed, 191 insertions(+), 2 deletions(-) create mode 100755 tools/testing/selftests/netfilter/conntrack_sctp_collision.sh create mode 100644 tools/testing/selftests/netfilter/sctp_collision.c
tools/testing/selftests/netfilter/Makefile +3 -2
@@ -6,13 +6,14 @@ TEST_PROGS := nft_trans_stress.sh nft_fib.sh nft_nat.sh bridge_brouter.sh \ nft_concat_range.sh nft_conntrack_helper.sh \ nft_queue.sh nft_meta.sh nf_nat_edemux.sh \ ipip-conntrack-mtu.sh conntrack_tcp_unreplied.sh \ - conntrack_vrf.sh nft_synproxy.sh rpath.sh nft_audit.sh + conntrack_vrf.sh nft_synproxy.sh rpath.sh nft_audit.sh \ + conntrack_sctp_collision.sh HOSTPKG_CONFIG := pkg-config CFLAGS += $(shell $(HOSTPKG_CONFIG) --cflags libmnl 2>/dev/null) LDLIBS += $(shell $(HOSTPKG_CONFIG) --libs libmnl 2>/dev/null || echo -lmnl) -TEST_GEN_FILES = nf-queue connect_close audit_logread +TEST_GEN_FILES = nf-queue connect_close audit_logread sctp_collision include ../lib.mk
tools/testing/selftests/netfilter/conntrack_sctp_collision.sh new file +89 -0
89 lines not on this page · raw message
tools/testing/selftests/netfilter/sctp_collision.c new file +99 -0
99 lines not on this page · raw message
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 64/379 net: skb_find_text: Ignore patterns extending past to
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Sutter <[email protected]>
[ Upstream commit c4eee56e14fe001e1cff54f0b438a5e2d0dd7454 ]
Assume that caller's 'to' offset really represents an upper boundary for the pattern search, so patterns extending past this offset are to be rejected.
The old behaviour also was kind of inconsistent when it comes to fragmentation (or otherwise non-linear skbs): If the pattern started in between 'to' and 'from' offsets but extended to the next fragment, it was not found if 'to' offset was still within the current fragment.
Test the new behaviour in a kselftest using iptables' string match.
--- net/core/skbuff.c | 3 +- tools/testing/selftests/netfilter/Makefile | 2 +- .../testing/selftests/netfilter/xt_string.sh | 128 ++++++++++++++++++ 3 files changed, 131 insertions(+), 2 deletions(-) create mode 100755 tools/testing/selftests/netfilter/xt_string.sh
net/core/skbuff.c +2 -1
@@ -3958,6 +3958,7 @@ static void skb_ts_finish(struct ts_config *conf, struct ts_state *state)unsigned int skb_find_text (struct sk_buff *skb,unsigned int from,unsigned int to,struct ts_config *config) { +unsigned int patlen = config->ops->get_pattern_len (config);struct ts_state state;unsigned int ret;
@@ -3969,7 +3970,7 @@ unsigned int skb_find_text(struct sk_buff *skb, unsigned int from,skb_prepare_seq_read (skb, from, to,TS_SKB_CB (&state)); ret =textsearch_find (config, &state); -return (ret <= to - from ? ret :UINT_MAX ); +return (ret + patlen <= to - from ? ret :UINT_MAX ); }EXPORT_SYMBOL (skb_find_text);
tools/testing/selftests/netfilter/Makefile +1 -1
@@ -7,7 +7,7 @@ TEST_PROGS := nft_trans_stress.sh nft_fib.sh nft_nat.sh bridge_brouter.sh \ nft_queue.sh nft_meta.sh nf_nat_edemux.sh \ ipip-conntrack-mtu.sh conntrack_tcp_unreplied.sh \ conntrack_vrf.sh nft_synproxy.sh rpath.sh nft_audit.sh \ - conntrack_sctp_collision.sh + conntrack_sctp_collision.sh xt_string.sh HOSTPKG_CONFIG := pkg-config
tools/testing/selftests/netfilter/xt_string.sh new file +128 -0
128 lines not on this page · raw message
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 65/379 chtls: fix tp->rcv_tstamp initialization
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 225d9ddbacb102621af6d28ff7bf5a0b4ce249d8 ]
tp->rcv_tstamp should be set to tcp_jiffies, not tcp_time_stamp().
--- drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c +1 -1
@@ -2259,7 +2259,7 @@ static void chtls_rx_ack(struct sock *sk, struct sk_buff *skb)if (tp->snd_una != snd_una) { tp->snd_una = snd_una; - tp->rcv_tstamp =tcp_time_stamp (tp); + tp->rcv_tstamp = tcp_jiffies32;if (tp->snd_una == tp->snd_nxt && !csk_flag_nochk (csk,CSK_TX_FAILOVER ))csk_reset_flag (csk,CSK_TX_WAIT_IDLE );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 66/379 tcp: fix cookie_init_timestamp() overflows
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 73ed8e03388d16c12fc577e5c700b58a29045a15 ]
cookie_init_timestamp() is supposed to return a 64bit timestamp suitable for both TSval determination and setting of skb->tstamp.
Unfortunately it uses 32bit fields and overflows after 2^32 * 10^6 nsec (~49 days) of uptime.
Generated TSval are still correct, but skb->tstamp might be set far away in the past, potentially confusing other layers.
tcp_ns_to_ts() is changed to return a full 64bit value, ts and ts_now variables are changed to u64 type, and TSMASK is removed in favor of shifts operations.
While we are at it, change this sequence:
ts >>= TSBITS; ts--; ts <<= TSBITS; ts |= options; to: ts -= (1UL << TSBITS);
--- include/net/tcp.h | 2 +- net/ipv4/syncookies.c | 20 +++++++------------- 2 files changed, 8 insertions(+), 14 deletions(-)
include/net/tcp.h +1 -1
@@ -810,7 +810,7 @@ static inline u32 tcp_time_stamp(const struct tcp_sock *tp) }/* Convert a nsec timestamp into TCP TSval timestamp (ms based currently) */ -static inline u32 tcp_ns_to_ts (u64 ns) +static inline u64 tcp_ns_to_ts (u64 ns) {return div_u64 (ns,NSEC_PER_SEC /TCP_TS_HZ ); }
net/ipv4/syncookies.c +7 -13
@@ -41,7 +41,6 @@ static siphash_aligned_key_t syncookie_secret[2];* requested/supported by the syn/synack exchange. */ #define TSBITS 6 -#define TSMASK (((__u32)1 << TSBITS) - 1)static u32 cookie_hash (__be32 saddr,__be32 daddr,__be16 sport,__be16 dport,u32 count,int c)
@@ -62,27 +61,22 @@ static u32 cookie_hash(__be32 saddr, __be32 daddr, __be16 sport, __be16 dport,*/ u64 cookie_init_timestamp (struct request_sock *req,u64 now) { -struct inet_request_sock *ireq; -u32 ts, ts_now =tcp_ns_to_ts (now); +const struct inet_request_sock *ireq =inet_rsk (req); +u64 ts, ts_now =tcp_ns_to_ts (now);u32 options =0 ; - ireq =inet_rsk (req); - options = ireq->wscale_ok ? ireq->snd_wscale :TS_OPT_WSCALE_MASK ;if (ireq->sack_ok) options |=TS_OPT_SACK ;if (ireq->ecn_ok) options |=TS_OPT_ECN ; - ts = ts_now & ~TSMASK ; + ts = (ts_now >>TSBITS ) <<TSBITS ; ts |= options; -if (ts > ts_now) { - ts >>=TSBITS ; - ts--; - ts <<=TSBITS ; - ts |= options; - } -return (u64 )ts * (NSEC_PER_SEC /TCP_TS_HZ ); +if (ts > ts_now) + ts -= (1UL <<TSBITS ); + +return ts * (NSEC_PER_SEC /TCP_TS_HZ ); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 67/379 wifi: iwlwifi: call napi_synchronize() before freeing rx/tx queues
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gregory Greenman <[email protected]>
[ Upstream commit 5af2bb3168db6b0af9988eb25cccf2e3bc4455e2 ]
When rx/tx queues are being freed, on a different CPU there could be still rx flow running. Call napi_synchronize() to prevent such a race.
Stable-dep-of: 37fb29bd1f90 ("wifi: iwlwifi: pcie: synchronize IRQs before NAPI")
--- .../net/wireless/intel/iwlwifi/pcie/internal.h | 1 + drivers/net/wireless/intel/iwlwifi/pcie/rx.c | 18 +++++++++++++++++- .../wireless/intel/iwlwifi/pcie/trans-gen2.c | 1 + .../net/wireless/intel/iwlwifi/pcie/trans.c | 1 + 4 files changed, 20 insertions(+), 1 deletion(-)
drivers/net/wireless/intel/iwlwifi/pcie/internal.h +1 -0
@@ -497,6 +497,7 @@ int iwl_pcie_rx_stop(struct iwl_trans *trans);void iwl_pcie_rx_free (struct iwl_trans *trans);void iwl_pcie_free_rbs_pool (struct iwl_trans *trans);void iwl_pcie_rx_init_rxb_lists (struct iwl_rxq *rxq); +void iwl_pcie_rx_napi_sync (struct iwl_trans *trans);void iwl_pcie_rxq_alloc_rbs (struct iwl_trans *trans,gfp_t priority,struct iwl_rxq *rxq);
drivers/net/wireless/intel/iwlwifi/pcie/rx.c +17 -1
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* -* Copyright (C) 2003-2014, 2018-2022 Intel Corporation +* Copyright (C) 2003-2014, 2018-2023 Intel Corporation * Copyright (C) 2013-2015 Intel Mobile Communications GmbH * Copyright (C) 2016-2017 Intel Deutschland GmbH */
@@ -1053,6 +1053,22 @@ static int iwl_pcie_napi_poll_msix(struct napi_struct *napi, int budget)return ret; } +void iwl_pcie_rx_napi_sync (struct iwl_trans *trans) +{ +struct iwl_trans_pcie *trans_pcie =IWL_TRANS_GET_PCIE_TRANS (trans); +int i; + +if (unlikely (!trans_pcie->rxq)) +return ; + +for (i =0 ; i < trans->num_rx_queues; i++) { +struct iwl_rxq *rxq = &trans_pcie->rxq[i]; + +if (rxq && rxq->napi.poll) +napi_synchronize (&rxq->napi); + } +} +static int _iwl_pcie_rx_init (struct iwl_trans *trans) {struct iwl_trans_pcie *trans_pcie =IWL_TRANS_GET_PCIE_TRANS (trans);
drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c +1 -0
@@ -156,6 +156,7 @@ void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans)if (test_and_clear_bit (STATUS_DEVICE_ENABLED , &trans->status)) {IWL_DEBUG_INFO (trans,"DEVICE_ENABLED bit was set and is now cleared\n" ); +iwl_pcie_rx_napi_sync (trans);iwl_txq_gen2_tx_free (trans);iwl_pcie_rx_stop (trans); }
drivers/net/wireless/intel/iwlwifi/pcie/trans.c +1 -0
@@ -1261,6 +1261,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans)if (test_and_clear_bit (STATUS_DEVICE_ENABLED , &trans->status)) {IWL_DEBUG_INFO (trans,"DEVICE_ENABLED bit was set and is now cleared\n" ); +iwl_pcie_rx_napi_sync (trans);iwl_pcie_tx_stop (trans);iwl_pcie_rx_stop (trans);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 68/379 wifi: iwlwifi: pcie: synchronize IRQs before NAPI
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 37fb29bd1f90f16d1abc95c0e9f0ff8eec9829ad ]
When we want to synchronize the NAPI, which was added in commit 5af2bb3168db ("wifi: iwlwifi: call napi_synchronize() before freeing rx/tx queues"), we also need to make sure we can't actually reschedule the NAPI. Yes, this happens while interrupts are disabled, but interrupts may still be running or pending. Also call iwl_pcie_synchronize_irqs() to ensure we won't reschedule the NAPI.
--- drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c | 1 + drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 1 + 2 files changed, 2 insertions(+)
drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c +1 -0
@@ -156,6 +156,7 @@ void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans)if (test_and_clear_bit (STATUS_DEVICE_ENABLED , &trans->status)) {IWL_DEBUG_INFO (trans,"DEVICE_ENABLED bit was set and is now cleared\n" ); +iwl_pcie_synchronize_irqs (trans);iwl_pcie_rx_napi_sync (trans);iwl_txq_gen2_tx_free (trans);iwl_pcie_rx_stop (trans);
drivers/net/wireless/intel/iwlwifi/pcie/trans.c +1 -0
@@ -1261,6 +1261,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans)if (test_and_clear_bit (STATUS_DEVICE_ENABLED , &trans->status)) {IWL_DEBUG_INFO (trans,"DEVICE_ENABLED bit was set and is now cleared\n" ); +iwl_pcie_synchronize_irqs (trans);iwl_pcie_rx_napi_sync (trans);iwl_pcie_tx_stop (trans);iwl_pcie_rx_stop (trans);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 69/379 wifi: iwlwifi: empty overflow queue during flush
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miri Korenblit <[email protected]>
[ Upstream commit 658939fc68d3241f9a0019e224cd7154438c23f2 ]
If a TX queue has no space for new TX frames, the driver will keep these frames in the overflow queue, and during reclaim flow it will retry to send the frames from that queue.
But if the reclaim flow was invoked from TX queue flush, we will also TX these frames, which is wrong as we don't want to TX anything after flush.
This might also cause assert 0x125F when removing the queue, saying that the driver removes a non-empty queue
Fix this by TXing the overflow queue's frames only if we are not in flush queue flow.
--- drivers/net/wireless/intel/iwlwifi/dvm/tx.c | 5 +++-- drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 7 ++++--- drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 4 ++-- drivers/net/wireless/intel/iwlwifi/queue/tx.c | 9 +++++---- drivers/net/wireless/intel/iwlwifi/queue/tx.h | 2 +- 5 files changed, 15 insertions(+), 12 deletions(-)
drivers/net/wireless/intel/iwlwifi/dvm/tx.c +3 -2
@@ -3,6 +3,7 @@* * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. * Copyright (C) 2019 Intel Corporation +* Copyright (C) 2023 Intel Corporation *****************************************************************************/ #include <linux/kernel.h>
@@ -1169,7 +1170,7 @@ void iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb)iwlagn_check_ratid_empty (priv, sta_id, tid); } -iwl_trans_reclaim (priv->trans, txq_id, ssn, &skbs); +iwl_trans_reclaim (priv->trans, txq_id, ssn, &skbs, false); freed =0 ;
@@ -1315,7 +1316,7 @@ void iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,* block-ack window (we assume that they've been successfully * transmitted ... if not, it's too late anyway). */ iwl_trans_reclaim (priv->trans, scd_flow, ba_resp_scd_ssn, - &reclaimed_skbs); + &reclaimed_skbs, false); IWL_DEBUG_TX_REPLY(priv, "REPLY_COMPRESSED_BA [%d] Received from %pM, " "sta_id = %d\n",
drivers/net/wireless/intel/iwlwifi/iwl-trans.h +4 -3
@@ -567,7 +567,7 @@ struct iwl_trans_ops {int (*tx)(struct iwl_trans *trans,struct sk_buff *skb,struct iwl_device_tx_cmd *dev_cmd,int queue);void (*reclaim)(struct iwl_trans *trans,int queue,int ssn, -struct sk_buff_head *skbs); +struct sk_buff_head *skbs,bool is_flush);void (*set_q_ptrs)(struct iwl_trans *trans,int queue,int ptr);
@@ -1191,14 +1191,15 @@ static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb, }static inline void iwl_trans_reclaim (struct iwl_trans *trans,int queue, -int ssn,struct sk_buff_head *skbs) +int ssn,struct sk_buff_head *skbs, +bool is_flush) {if (WARN_ON_ONCE (trans->state !=IWL_TRANS_FW_ALIVE )) {IWL_ERR (trans,"%s bad state = %d\n" , __func__, trans->state);return ; } - trans->ops->reclaim (trans, queue, ssn, skbs); + trans->ops->reclaim (trans, queue, ssn, skbs, is_flush); } static inline void iwl_trans_set_q_ptrs(struct iwl_trans *trans, int queue,
drivers/net/wireless/intel/iwlwifi/mvm/tx.c +2 -2
@@ -1576,7 +1576,7 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm, seq_ctl =le16_to_cpu (tx_resp->seq_ctl);/* we can free until ssn % q.n_bd not inclusive */ -iwl_trans_reclaim (mvm->trans, txq_id, ssn, &skbs); +iwl_trans_reclaim (mvm->trans, txq_id, ssn, &skbs, false);while (!skb_queue_empty (&skbs)) {struct sk_buff *skb =__skb_dequeue (&skbs);
@@ -1927,7 +1927,7 @@ static void iwl_mvm_tx_reclaim(struct iwl_mvm *mvm, int sta_id, int tid,* block-ack window (we assume that they've been successfully * transmitted ... if not, it's too late anyway). */ -iwl_trans_reclaim (mvm->trans, txq, index, &reclaimed_skbs); +iwl_trans_reclaim (mvm->trans, txq, index, &reclaimed_skbs, is_flush); skb_queue_walk(&reclaimed_skbs, skb) {struct ieee80211_tx_info *info =IEEE80211_SKB_CB (skb);
drivers/net/wireless/intel/iwlwifi/queue/tx.c +5 -4
@@ -1551,7 +1551,7 @@ void iwl_txq_progress(struct iwl_txq *txq)/* Frees buffers until index _not_ inclusive */ void iwl_txq_reclaim (struct iwl_trans *trans,int txq_id,int ssn, -struct sk_buff_head *skbs) +struct sk_buff_head *skbs,bool is_flush) {struct iwl_txq *txq = trans->txqs.txq[txq_id];int tfd_num =iwl_txq_get_cmd_index (txq, ssn);
@@ -1622,9 +1622,11 @@ void iwl_txq_reclaim(struct iwl_trans *trans, int txq_id, int ssn,if (iwl_txq_space (trans, txq) > txq->low_mark &&test_bit (txq_id, trans->txqs.queue_stopped)) {struct sk_buff_head overflow_skbs; +struct sk_buff *skb;__skb_queue_head_init (&overflow_skbs); -skb_queue_splice_init (&txq->overflow_q, &overflow_skbs); +skb_queue_splice_init (&txq->overflow_q, + is_flush ? skbs : &overflow_skbs);/* * We are going to transmit from the overflow queue.
@@ -1644,8 +1646,7 @@ void iwl_txq_reclaim(struct iwl_trans *trans, int txq_id, int ssn,*/ spin_unlock_bh (&txq->lock); -while (!skb_queue_empty (&overflow_skbs)) { -struct sk_buff *skb =__skb_dequeue (&overflow_skbs); +while ((skb =__skb_dequeue (&overflow_skbs))) {struct iwl_device_tx_cmd *dev_cmd_ptr; dev_cmd_ptr = *(void **)((u8 *)skb->cb +
drivers/net/wireless/intel/iwlwifi/queue/tx.h +1 -1
@@ -173,7 +173,7 @@ void iwl_txq_gen1_update_byte_cnt_tbl(struct iwl_trans *trans, struct iwl_txq *txq, u16 byte_cnt, int num_tbs);void iwl_txq_reclaim (struct iwl_trans *trans,int txq_id,int ssn, -struct sk_buff_head *skbs); +struct sk_buff_head *skbs,bool is_flush);void iwl_txq_set_q_ptrs (struct iwl_trans *trans,int txq_id,int ptr);void iwl_trans_txq_freeze_timer (struct iwl_trans *trans,unsigned long txqs,bool freeze);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 70/379 Bluetooth: hci_sync: Fix Opcode prints in bt_dev_dbg/err
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcel Ziswiler <[email protected]>
[ Upstream commit 530886897c789cf77c9a0d4a7cc5549f0768b5f8 ]
Printed Opcodes may be missing leading zeros:
Bluetooth: hci0: Opcode 0x c03 failed: -110
Fix this by always printing leading zeros:
Bluetooth: hci0: Opcode 0x0c03 failed: -110
--- net/bluetooth/hci_sync.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/bluetooth/hci_sync.c +2 -2
@@ -151,7 +151,7 @@ struct sk_buff *__hci_cmd_sync_sk(struct hci_dev *hdev, u16 opcode, u32 plen,struct sk_buff *skb;int err =0 ; -bt_dev_dbg (hdev,"Opcode 0x%4x" , opcode); +bt_dev_dbg (hdev,"Opcode 0x%4.4x" , opcode);hci_req_init (&req, hdev);
@@ -247,7 +247,7 @@ int __hci_cmd_sync_status_sk(struct hci_dev *hdev, u16 opcode, u32 plen, skb =__hci_cmd_sync_sk (hdev, opcode, plen, param, event, timeout, sk);if (IS_ERR (skb)) {if (!event) -bt_dev_err (hdev,"Opcode 0x%4x failed: %ld" , opcode, +bt_dev_err (hdev,"Opcode 0x%4.4x failed: %ld" , opcode,PTR_ERR (skb));return PTR_ERR (skb); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 71/379 bpf: Fix unnecessary -EBUSY from htab_lock_bucket
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Song Liu <[email protected]>
[ Upstream commit d35381aa73f7e1e8b25f3ed5283287a64d9ddff5 ]
htab_lock_bucket uses the following logic to avoid recursion:
1. preempt_disable();
2. check percpu counter htab->map_locked[hash] for recursion; 2.1. if map_lock[hash] is already taken, return -BUSY;
3. raw_spin_lock_irqsave();
However, if an IRQ hits between 2 and 3, BPF programs attached to the IRQ logic will not able to access the same hash of the hashtab and get -EBUSY.
This -EBUSY is not really necessary. Fix it by disabling IRQ before checking map_locked:
1. preempt_disable();
2. local_irq_save();
3. check percpu counter htab->map_locked[hash] for recursion; 3.1. if map_lock[hash] is already taken, return -BUSY;
4. raw_spin_lock().
Similarly, use raw_spin_unlock() and local_irq_restore() in htab_unlock_bucket().
--- kernel/bpf/hashtab.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
kernel/bpf/hashtab.c +5 -2
@@ -155,13 +155,15 @@ static inline int htab_lock_bucket(const struct bpf_htab *htab, hash = hash &min_t (u32,HASHTAB_MAP_LOCK_MASK , htab->n_buckets -1 );preempt_disable (); +local_irq_save (flags);if (unlikely (__this_cpu_inc_return (*(htab->map_locked[hash])) !=1 )) {__this_cpu_dec (*(htab->map_locked[hash])); +local_irq_restore (flags);preempt_enable ();return -EBUSY ; } -raw_spin_lock_irqsave (&b->raw_lock, flags); +raw_spin_lock (&b->raw_lock); *pflags = flags;return 0 ;
@@ -172,8 +174,9 @@ static inline void htab_unlock_bucket(const struct bpf_htab *htab, unsigned long flags) { hash = hash &min_t (u32,HASHTAB_MAP_LOCK_MASK , htab->n_buckets -1 ); -raw_spin_unlock_irqrestore (&b->raw_lock, flags); +raw_spin_unlock (&b->raw_lock);__this_cpu_dec (*(htab->map_locked[hash])); +local_irq_restore (flags);preempt_enable (); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 72/379 ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 48cf49d31994ff97b33c4044e618560ec84d35fb ]
snprintf() does not return negative values on error.
To know if the buffer was too small, the returned value needs to be compared with the length of the passed buffer. If it is greater or equal, the output has been truncated, so add checks for the truncation to create_pnp_modalias() and create_of_modalias(). Also make them return -ENOMEM in that case, as they already do that elsewhere.
Moreover, the remaining size of the buffer used by snprintf() needs to be updated after the first write to avoid out-of-bounds access as already done correctly in create_pnp_modalias(), but not in create_of_modalias(), so change the latter accordingly.
--- drivers/acpi/device_sysfs.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/acpi/device_sysfs.c +6 -4
@@ -158,8 +158,8 @@ static int create_pnp_modalias(struct acpi_device *acpi_dev, char *modalias,return 0 ; len =snprintf (modalias, size,"acpi:" ); -if (len <=0 ) -return len; +if (len >= size) +return -ENOMEM ; size -= len;
@@ -212,8 +212,10 @@ static int create_of_modalias(struct acpi_device *acpi_dev, char *modalias, len =snprintf (modalias, size,"of:N%sT" , (char *)buf.pointer);ACPI_FREE (buf.pointer); -if (len <=0 ) -return len; +if (len >= size) +return -ENOMEM ; + + size -= len; of_compatible = acpi_dev->data.of_compatible;if (of_compatible->type ==ACPI_TYPE_PACKAGE ) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 73/379 ipv6: avoid atomic fragment on GSO packets
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yan Zhai <[email protected]>
[ Upstream commit 03d6c848bfb406e9ef6d9846d759e97beaeea113 ]
When the ipv6 stack output a GSO packet, if its gso_size is larger than dst MTU, then all segments would be fragmented. However, it is possible for a GSO packet to have a trailing segment with smaller actual size than both gso_size as well as the MTU, which leads to an "atomic fragment". Atomic fragments are considered harmful in RFC-8021. An Existing report from APNIC also shows that atomic fragments are more likely to be dropped even it is equivalent to a no-op [1].
Add an extra check in the GSO slow output path. For each segment from the original over-sized packet, if it fits with the path MTU, then avoid generating an atomic fragment.
--- net/ipv6/ip6_output.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
net/ipv6/ip6_output.c +7 -1
@@ -161,7 +161,13 @@ ip6_finish_output_gso_slowpath_drop(struct net *net, struct sock *sk,int err;skb_mark_not_on_list (segs); - err =ip6_fragment (net, sk, segs, ip6_finish_output2); +/* Last GSO segment can be smaller than gso_size (and MTU). +* Adding a fragment header would produce an "atomic fragment", +* which is considered harmful (RFC-8021). Avoid that. +*/ + err = segs->len > mtu ? +ip6_fragment (net, sk, segs, ip6_finish_output2) : +ip6_finish_output2 (net, sk, segs);if (err && ret ==0 ) ret = err; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 74/379 net: add DEV_STATS_READ() helper
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 0b068c714ca9479d2783cc333fff5bc2d4a6d45c ]
Companion of DEV_STATS_INC() & DEV_STATS_ADD().
This is going to be used in the series.
Use it in macsec_get_stats64().
Stable-dep-of: ff672b9ffeb3 ("ipvlan: properly track tx_errors")
--- drivers/net/macsec.c | 6 +++--- include/linux/netdevice.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-)
drivers/net/macsec.c +3 -3
@@ -3664,9 +3664,9 @@ static void macsec_get_stats64(struct net_device *dev,dev_fetch_sw_netstats (s, dev->tstats); - s->rx_dropped =atomic_long_read (&dev->stats.__rx_dropped); - s->tx_dropped =atomic_long_read (&dev->stats.__tx_dropped); - s->rx_errors =atomic_long_read (&dev->stats.__rx_errors); + s->rx_dropped =DEV_STATS_READ (dev, rx_dropped); + s->tx_dropped =DEV_STATS_READ (dev, tx_dropped); + s->rx_errors =DEV_STATS_READ (dev, rx_errors); }static int macsec_get_iflink (const struct net_device *dev)
include/linux/netdevice.h +1 -0
@@ -5190,5 +5190,6 @@ extern struct net_device *blackhole_netdev;#define DEV_STATS_INC (DEV ,FIELD ) atomic_long_inc(&(DEV)->stats.__##FIELD)#define DEV_STATS_ADD (DEV ,FIELD ,VAL ) \ atomic_long_add((VAL), &(DEV)->stats.__##FIELD) +#define DEV_STATS_READ (DEV ,FIELD ) atomic_long_read(&(DEV)->stats.__##FIELD)#endif /* _LINUX_NETDEVICE_H */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 75/379 ipvlan: properly track tx_errors
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit ff672b9ffeb3f82135488ac16c5c5eb4b992999b ]
Both ipvlan_process_v4_outbound() and ipvlan_process_v6_outbound() increment dev->stats.tx_errors in case of errors.
Unfortunately there are two issues :
1) ipvlan_get_stats64() does not propagate dev->stats.tx_errors to user.
2) Increments are not atomic. KCSAN would complain eventually.
Use DEV_STATS_INC() to not miss an update, and change ipvlan_get_stats64() to copy the value back to user.
--- drivers/net/ipvlan/ipvlan_core.c | 8 ++++---- drivers/net/ipvlan/ipvlan_main.c | 1 + 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +4 -4
@@ -441,12 +441,12 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) err =ip_local_out (net, skb->sk, skb);if (unlikely (net_xmit_eval (err))) - dev->stats.tx_errors++; +DEV_STATS_INC (dev, tx_errors);else ret =NET_XMIT_SUCCESS ; goto out; err: - dev->stats.tx_errors++; +DEV_STATS_INC (dev, tx_errors);kfree_skb (skb); out:return ret;
@@ -482,12 +482,12 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) err =ip6_local_out (net, skb->sk, skb);if (unlikely (net_xmit_eval (err))) - dev->stats.tx_errors++; +DEV_STATS_INC (dev, tx_errors);else ret =NET_XMIT_SUCCESS ; goto out; err: - dev->stats.tx_errors++; +DEV_STATS_INC (dev, tx_errors);kfree_skb (skb); out:return ret;
drivers/net/ipvlan/ipvlan_main.c +1 -0
@@ -324,6 +324,7 @@ static void ipvlan_get_stats64(struct net_device *dev, s->rx_dropped = rx_errs; s->tx_dropped = tx_drps; } + s->tx_errors =DEV_STATS_READ (dev, tx_errors); }static int ipvlan_vlan_rx_add_vid (struct net_device *dev,__be16 proto,u16 vid)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 76/379 regmap: debugfs: Fix a erroneous check after snprintf()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit d3601857e14de6369f00ae19564f1d817d175d19 ]
This error handling looks really strange.
Check if the string has been truncated instead.
--- drivers/base/regmap/regmap-debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/base/regmap/regmap-debugfs.c +1 -1
@@ -48,7 +48,7 @@ static ssize_t regmap_name_read_file(struct file *file, name = map->dev->driver->name; ret =snprintf (buf,PAGE_SIZE ,"%s\n" , name); -if (ret <0 ) { +if (ret >=PAGE_SIZE ) {kfree (buf);return ret; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 77/379 spi: tegra: Fix missing IRQ check in tegra_slink_probe()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Shurong <[email protected]>
[ Upstream commit eb9913b511f10968a02cfa5329a896855dd152a3 ]
This func misses checking for platform_get_irq()'s call and may passes the negative error codes to request_irq(), which takes unsigned IRQ #, causing it to fail with -EINVAL, overriding an original error code.
Fix this by stop calling request_irq() with invalid IRQ #s.
--- drivers/spi/spi-tegra20-slink.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/spi/spi-tegra20-slink.c +2 -0
@@ -1093,6 +1093,8 @@ static int tegra_slink_probe(struct platform_device *pdev)reset_control_deassert (tspi->rst); spi_irq =platform_get_irq (pdev,0 ); +if (spi_irq <0 ) +return spi_irq; tspi->irq = spi_irq; ret = request_threaded_irq(tspi->irq, tegra_slink_isr, tegra_slink_isr_thread, IRQF_ONESHOT,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 78/379 clk: qcom: gcc-msm8996: Remove RPM bus clocks
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 4afda5f6bcdf673ef2556fcfa458daf3a5a648d8 ]
The GCC driver contains clocks that are owned (meaning configured and scaled) by the RPM core.
Remove them from Linux to stop interjecting the RPM's logic.
--- drivers/clk/qcom/gcc-msm8996.c | 237 +-------------------------------- 1 file changed, 5 insertions(+), 232 deletions(-)
drivers/clk/qcom/gcc-msm8996.c +5 -232
@@ -245,71 +245,6 @@ static const struct clk_parent_data gcc_xo_gpll0_gpll4_gpll0_early_div[] = { { .hw = &gpll0_early_div.hw } }; -static const struct freq_tbl ftbl_system_noc_clk_src[] = { -F (19200000 ,P_XO ,1 ,0 ,0 ), -F (50000000 ,P_GPLL0_EARLY_DIV ,6 ,0 ,0 ), -F (100000000 ,P_GPLL0 ,6 ,0 ,0 ), -F (150000000 ,P_GPLL0 ,4 ,0 ,0 ), -F (200000000 ,P_GPLL0 ,3 ,0 ,0 ), -F (240000000 ,P_GPLL0 ,2.5 ,0 ,0 ), - { } -}; - -static struct clk_rcg2 system_noc_clk_src = { - .cmd_rcgr =0x0401c , - .hid_width =5 , - .parent_map = gcc_xo_gpll0_gpll0_early_div_map, - .freq_tbl = ftbl_system_noc_clk_src, - .clkr.hw.init = &(struct clk_init_data ){ - .name ="system_noc_clk_src" , - .parent_data = gcc_xo_gpll0_gpll0_early_div, - .num_parents =ARRAY_SIZE (gcc_xo_gpll0_gpll0_early_div), - .ops = &clk_rcg2_ops, - }, -}; - -static const struct freq_tbl ftbl_config_noc_clk_src[] = { -F (19200000 ,P_XO ,1 ,0 ,0 ), -F (37500000 ,P_GPLL0 ,16 ,0 ,0 ), -F (75000000 ,P_GPLL0 ,8 ,0 ,0 ), - { } -}; - -static struct clk_rcg2 config_noc_clk_src = { - .cmd_rcgr =0x0500c , - .hid_width =5 , - .parent_map = gcc_xo_gpll0_map, - .freq_tbl = ftbl_config_noc_clk_src, - .clkr.hw.init = &(struct clk_init_data ){ - .name ="config_noc_clk_src" , - .parent_data = gcc_xo_gpll0, - .num_parents =ARRAY_SIZE (gcc_xo_gpll0), - .ops = &clk_rcg2_ops, - }, -}; - -static const struct freq_tbl ftbl_periph_noc_clk_src[] = { -F (19200000 ,P_XO ,1 ,0 ,0 ), -F (37500000 ,P_GPLL0 ,16 ,0 ,0 ), -F (50000000 ,P_GPLL0 ,12 ,0 ,0 ), -F (75000000 ,P_GPLL0 ,8 ,0 ,0 ), -F (100000000 ,P_GPLL0 ,6 ,0 ,0 ), - { } -}; - -static struct clk_rcg2 periph_noc_clk_src = { - .cmd_rcgr =0x06014 , - .hid_width =5 , - .parent_map = gcc_xo_gpll0_map, - .freq_tbl = ftbl_periph_noc_clk_src, - .clkr.hw.init = &(struct clk_init_data ){ - .name ="periph_noc_clk_src" , - .parent_data = gcc_xo_gpll0, - .num_parents =ARRAY_SIZE (gcc_xo_gpll0), - .ops = &clk_rcg2_ops, - }, -}; -static const struct freq_tbl ftbl_usb30_master_clk_src[] = {F (19200000 ,P_XO ,1 ,0 ,0 ),F (120000000 ,P_GPLL0 ,5 ,0 ,0 ),
@@ -1298,11 +1233,7 @@ static struct clk_branch gcc_mmss_noc_cfg_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_mmss_noc_cfg_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT |CLK_IGNORE_UNUSED , + .flags =CLK_IGNORE_UNUSED , .ops = &clk_branch2_ops, }, },
@@ -1465,11 +1396,6 @@ static struct clk_branch gcc_usb_phy_cfg_ahb2phy_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_usb_phy_cfg_ahb2phy_clk" , - .parent_hws = (const struct clk_hw *[]){ - &periph_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -1499,11 +1425,6 @@ static struct clk_branch gcc_sdcc1_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_sdcc1_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &periph_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -1550,11 +1471,6 @@ static struct clk_branch gcc_sdcc2_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_sdcc2_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &periph_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -1584,11 +1500,6 @@ static struct clk_branch gcc_sdcc3_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_sdcc3_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &periph_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -1618,11 +1529,6 @@ static struct clk_branch gcc_sdcc4_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_sdcc4_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &periph_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -1636,11 +1542,6 @@ static struct clk_branch gcc_blsp1_ahb_clk = { .enable_mask = BIT(17), .hw.init = &(struct clk_init_data ){ .name ="gcc_blsp1_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &periph_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -1978,11 +1879,6 @@ static struct clk_branch gcc_blsp2_ahb_clk = { .enable_mask = BIT(15), .hw.init = &(struct clk_init_data ){ .name ="gcc_blsp2_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &periph_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2319,11 +2215,6 @@ static struct clk_branch gcc_pdm_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pdm_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &periph_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2354,11 +2245,6 @@ static struct clk_branch gcc_prng_ahb_clk = { .enable_mask = BIT(13), .hw.init = &(struct clk_init_data ){ .name ="gcc_prng_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2371,11 +2257,6 @@ static struct clk_branch gcc_tsif_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_tsif_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &periph_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2423,11 +2304,6 @@ static struct clk_branch gcc_boot_rom_ahb_clk = { .enable_mask = BIT(10), .hw.init = &(struct clk_init_data ){ .name ="gcc_boot_rom_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2521,11 +2397,6 @@ static struct clk_branch gcc_pcie_0_slv_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pcie_0_slv_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2538,11 +2409,6 @@ static struct clk_branch gcc_pcie_0_mstr_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pcie_0_mstr_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2555,11 +2421,6 @@ static struct clk_branch gcc_pcie_0_cfg_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pcie_0_cfg_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2607,11 +2468,6 @@ static struct clk_branch gcc_pcie_1_slv_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pcie_1_slv_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2624,11 +2480,6 @@ static struct clk_branch gcc_pcie_1_mstr_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pcie_1_mstr_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2641,11 +2492,6 @@ static struct clk_branch gcc_pcie_1_cfg_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pcie_1_cfg_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2693,11 +2539,6 @@ static struct clk_branch gcc_pcie_2_slv_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pcie_2_slv_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2710,11 +2551,6 @@ static struct clk_branch gcc_pcie_2_mstr_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pcie_2_mstr_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2727,11 +2563,6 @@ static struct clk_branch gcc_pcie_2_cfg_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pcie_2_cfg_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2779,11 +2610,6 @@ static struct clk_branch gcc_pcie_phy_cfg_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_pcie_phy_cfg_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -2830,11 +2656,6 @@ static struct clk_branch gcc_ufs_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_ufs_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -3061,11 +2882,7 @@ static struct clk_branch gcc_aggre0_snoc_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_aggre0_snoc_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT |CLK_IS_CRITICAL , + .flags =CLK_IS_CRITICAL , .ops = &clk_branch2_ops, }, },
@@ -3078,11 +2895,7 @@ static struct clk_branch gcc_aggre0_cnoc_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_aggre0_cnoc_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT |CLK_IS_CRITICAL , + .flags =CLK_IS_CRITICAL , .ops = &clk_branch2_ops, }, },
@@ -3095,11 +2908,7 @@ static struct clk_branch gcc_smmu_aggre0_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_smmu_aggre0_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT |CLK_IS_CRITICAL , + .flags =CLK_IS_CRITICAL , .ops = &clk_branch2_ops, }, },
@@ -3112,11 +2921,7 @@ static struct clk_branch gcc_smmu_aggre0_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_smmu_aggre0_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT |CLK_IS_CRITICAL , + .flags =CLK_IS_CRITICAL , .ops = &clk_branch2_ops, }, },
@@ -3163,10 +2968,6 @@ static struct clk_branch gcc_dcc_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_dcc_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , .ops = &clk_branch2_ops, }, },
@@ -3179,10 +2980,6 @@ static struct clk_branch gcc_aggre0_noc_mpu_cfg_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_aggre0_noc_mpu_cfg_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , .ops = &clk_branch2_ops, }, },
@@ -3195,11 +2992,6 @@ static struct clk_branch gcc_qspi_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_qspi_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &periph_noc_clk_src.clkr.hw, - }, - .num_parents =1 , - .flags =CLK_SET_RATE_PARENT , .ops = &clk_branch2_ops, }, },
@@ -3348,10 +3140,6 @@ static struct clk_branch gcc_mss_cfg_ahb_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_mss_cfg_ahb_clk" , - .parent_hws = (const struct clk_hw *[]){ - &config_noc_clk_src.clkr.hw, - }, - .num_parents =1 , .ops = &clk_branch2_ops, }, },
@@ -3364,10 +3152,6 @@ static struct clk_branch gcc_mss_mnoc_bimc_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_mss_mnoc_bimc_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , .ops = &clk_branch2_ops, }, },
@@ -3380,10 +3164,6 @@ static struct clk_branch gcc_mss_snoc_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_mss_snoc_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , .ops = &clk_branch2_ops, }, },
@@ -3396,10 +3176,6 @@ static struct clk_branch gcc_mss_q6_bimc_axi_clk = { .enable_mask = BIT(0), .hw.init = &(struct clk_init_data ){ .name ="gcc_mss_q6_bimc_axi_clk" , - .parent_hws = (const struct clk_hw *[]){ - &system_noc_clk_src.clkr.hw, - }, - .num_parents =1 , .ops = &clk_branch2_ops, }, },
@@ -3495,9 +3271,6 @@ static struct clk_regmap *gcc_msm8996_clocks[] = { [GPLL0] = &gpll0.clkr, [GPLL4_EARLY] = &gpll4_early.clkr, [GPLL4] = &gpll4.clkr, - [SYSTEM_NOC_CLK_SRC] = &system_noc_clk_src.clkr, - [CONFIG_NOC_CLK_SRC] = &config_noc_clk_src.clkr, - [PERIPH_NOC_CLK_SRC] = &periph_noc_clk_src.clkr, [USB30_MASTER_CLK_SRC] = &usb30_master_clk_src.clkr, [USB30_MOCK_UTMI_CLK_SRC] = &usb30_mock_utmi_clk_src.clkr, [USB3_PHY_AUX_CLK_SRC] = &usb3_phy_aux_clk_src.clkr,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 79/379 clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Devi Priya <[email protected]>
[ Upstream commit f7b7d30158cff246667273bd2a62fc93ee0725d2 ]
If the parent clock rate is greater than unsigned long max/2 then integer overflow happens when calculating the clock rate on 32-bit systems. As RCG2 uses half integer dividers, the clock rate is first being multiplied by 2 which will overflow the unsigned long max value. Hence, replace the common pattern of doing 64-bit multiplication and then a do_div() call with simpler mult_frac call.
--- drivers/clk/qcom/clk-rcg2.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)
drivers/clk/qcom/clk-rcg2.c +4 -10
@@ -158,17 +158,11 @@ static int clk_rcg2_set_parent(struct clk_hw *hw, u8 index)static unsigned long calc_rate (unsigned long rate,u32 m,u32 n,u32 mode,u32 hid_div) { -if (hid_div) { - rate *=2 ; - rate /= hid_div +1 ; - } +if (hid_div) + rate =mult_frac (rate,2 , hid_div +1 ); -if (mode) { -u64 tmp = rate; - tmp *= m; -do_div (tmp, n); - rate = tmp; - } +if (mode) + rate =mult_frac (rate, m, n);return rate; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 80/379 clk: qcom: mmcc-msm8998: Dont check halt bit on some branch clks
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 9906c4140897bbdbff7bb71c6ae67903cb9954ce ]
Some branch clocks are governed externally and we're only supposed to send a request concerning their shutdown, not actually ensure it happens.
Use the BRANCH_HALT_SKIP define to skip checking the halt bit.
--- drivers/clk/qcom/mmcc-msm8998.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/clk/qcom/mmcc-msm8998.c +3 -0
@@ -2478,6 +2478,7 @@ static struct clk_branch fd_ahb_clk = {static struct clk_branch mnoc_ahb_clk = { .halt_reg =0x5024 , + .halt_check =BRANCH_HALT_SKIP , .clkr = { .enable_reg =0x5024 , .enable_mask =BIT (0 ),
@@ -2493,6 +2494,7 @@ static struct clk_branch mnoc_ahb_clk = {static struct clk_branch bimc_smmu_ahb_clk = { .halt_reg =0xe004 , + .halt_check =BRANCH_HALT_SKIP , .hwcg_reg =0xe004 , .hwcg_bit =1 , .clkr = {
@@ -2510,6 +2512,7 @@ static struct clk_branch bimc_smmu_ahb_clk = {static struct clk_branch bimc_smmu_axi_clk = { .halt_reg =0xe008 , + .halt_check =BRANCH_HALT_SKIP , .hwcg_reg =0xe008 , .hwcg_bit =1 , .clkr = {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 81/379 clk: qcom: mmcc-msm8998: Fix the SMMU GDSC
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 1fc62c8347397faf4e18249e88ecd4470c0a5357 ]
The SMMU GDSC doesn't have to be ALWAYS-ON and shouldn't feature the HW_CTRL flag (it's separate from hw_ctrl_addr). In addition to that, it should feature a cxc entry for bimc_smmu_axi_clk and be marked as votable.
Fix all of these issues.
--- drivers/clk/qcom/mmcc-msm8998.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/clk/qcom/mmcc-msm8998.c +3 -1
@@ -2653,11 +2653,13 @@ static struct gdsc camss_cpp_gdsc = {static struct gdsc bimc_smmu_gdsc = { .gdscr =0xe020 , .gds_hw_ctrl =0xe024 , + .cxcs = (unsigned int []){0xe008 }, + .cxc_count =1 , .pd = { .name ="bimc_smmu" , }, .pwrsts =PWRSTS_OFF_ON , - .flags =HW_CTRL |ALWAYS_ON , + .flags =VOTABLE , };static struct clk_regmap *mmcc_msm8998_clocks[] = {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 82/379 clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danila Tikhonov <[email protected]>
[ Upstream commit 7138c244fb293f24ce8ab782961022eff00a10c4 ]
Set .flags = CLK_OPS_PARENT_ENABLE to fix "gcc_sdcc2_apps_clk_src: rcg didn't update its configuration" error.
--- drivers/clk/qcom/gcc-sm8150.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/gcc-sm8150.c +1 -1
@@ -792,7 +792,7 @@ static struct clk_rcg2 gcc_sdcc2_apps_clk_src = { .name = "gcc_sdcc2_apps_clk_src", .parent_data = gcc_parents_6, .num_parents = ARRAY_SIZE(gcc_parents_6), - .flags = CLK_SET_RATE_PARENT, + .flags = CLK_OPS_PARENT_ENABLE, .ops = &clk_rcg2_floor_ops, }, };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 83/379 regulator: mt6358: Fail probe on unknown chip ID
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
[ Upstream commit 7442edec72bc657e6ce38ae01de9f10e55decfaa ]
The MT6358 and MT6366 PMICs, and likely many others from MediaTek, have a chip ID register, making the chip semi-discoverable.
The driver currently supports two PMICs and expects to be probed on one or the other. It does not account for incorrect mfd driver entries or device trees. While these should not happen, if they do, it could be catastrophic for the device. The driver should be sure the hardware is what it expects.
Make the driver fail to probe if the chip ID presented is not a known one.
--- drivers/regulator/mt6358-regulator.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
drivers/regulator/mt6358-regulator.c +10 -4
@@ -655,12 +655,18 @@ static int mt6358_regulator_probe(struct platform_device *pdev)struct mt6358_regulator_info *mt6358_info;int i, max_regulator; -if (mt6397->chip_id ==MT6366_CHIP_ID ) { - max_regulator =MT6366_MAX_REGULATOR ; - mt6358_info = mt6366_regulators; - }else { +switch (mt6397->chip_id) { +case MT6358_CHIP_ID : max_regulator =MT6358_MAX_REGULATOR ; mt6358_info = mt6358_regulators; +break ; +case MT6366_CHIP_ID : + max_regulator =MT6366_MAX_REGULATOR ; + mt6358_info = mt6366_regulators; +break ; +default : +dev_err (&pdev->dev,"unsupported chip ID: %d\n" , mt6397->chip_id); +return -EINVAL ; }for (i =0 ; i < max_regulator; i++) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 84/379 clk: imx: Select MXC_CLK for CLK_IMX8QXP
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abel Vesa <[email protected]>
[ Upstream commit 317e69c49b4ceef8aebb47d771498ccb3571bdf9 ]
If the i.MX8QXP clock provider is built-in but the MXC_CLK is built as module, build fails:
aarch64-linux-ld: drivers/clk/imx/clk-imx8-acm.o: in function `imx8_acm_clk_probe':
clk-imx8-acm.c:(.text+0x3d0): undefined reference to `imx_check_clk_hws'
Fix that by selecting MXC_CLK in case of CLK_IMX8QXP.
--- drivers/clk/imx/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/clk/imx/Kconfig +1 -0
@@ -96,6 +96,7 @@ config CLK_IMX8QXP depends on (ARCH_MXC && ARM64) || COMPILE_TEST depends on IMX_SCU && HAVE_ARM_SMCCC select MXC_CLK_SCU + select MXC_CLK help Build the driver for IMX8QXP SCU based clocks.
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 85/379 clk: imx: imx8mq: correct error handling path
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 577ad169966e6e75b10e004389a3f79813e84b5d ]
Avoid memory leak in error handling path. It does not make much sense for the SoC without clk driver, to make program behavior correct, let's fix it.
--- drivers/clk/imx/clk-imx8mq.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
drivers/clk/imx/clk-imx8mq.c +10 -7
@@ -288,8 +288,7 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)void __iomem *base;int err; - clk_hw_data =kzalloc (struct_size (clk_hw_data, hws, -IMX8MQ_CLK_END ),GFP_KERNEL ); + clk_hw_data =devm_kzalloc (dev,struct_size (clk_hw_data, hws,IMX8MQ_CLK_END ),GFP_KERNEL );if (WARN_ON (!clk_hw_data))return -ENOMEM ;
@@ -306,10 +305,12 @@ static int imx8mq_clocks_probe(struct platform_device *pdev) hws[IMX8MQ_CLK_EXT4 ] =imx_obtain_fixed_clk_hw (np,"clk_ext4" ); np =of_find_compatible_node (NULL ,NULL ,"fsl,imx8mq-anatop" ); - base =of_iomap (np,0 ); + base =devm_of_iomap (dev, np,0 ,NULL );of_node_put (np); -if (WARN_ON (!base)) -return -ENOMEM ; +if (WARN_ON (IS_ERR (base))) { + err =PTR_ERR (base); + goto unregister_hws; + } hws[IMX8MQ_ARM_PLL_REF_SEL ] =imx_clk_hw_mux ("arm_pll_ref_sel" , base +0x28 ,16 ,2 , pll_ref_sels,ARRAY_SIZE (pll_ref_sels)); hws[IMX8MQ_GPU_PLL_REF_SEL ] =imx_clk_hw_mux ("gpu_pll_ref_sel" , base +0x18 ,16 ,2 , pll_ref_sels,ARRAY_SIZE (pll_ref_sels));
@@ -395,8 +396,10 @@ static int imx8mq_clocks_probe(struct platform_device *pdev) np = dev->of_node; base =devm_platform_ioremap_resource (pdev,0 ); -if (WARN_ON (IS_ERR (base))) -return PTR_ERR (base); +if (WARN_ON (IS_ERR (base))) { + err =PTR_ERR (base); + goto unregister_hws; + }/* CORE */ hws[IMX8MQ_CLK_A53_DIV ] =imx8m_clk_hw_composite_core ("arm_a53_div" , imx8mq_a53_sels, base +0x8000 );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 86/379 clk: imx: imx8qxp: Fix elcdif_pll clock
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Chiras <[email protected]>
[ Upstream commit 15cee75dacb82ade710d61bfd536011933ef9bf2 ]
Move the elcdif_pll clock initialization before the lcd_clk, since the elcdif_clk needs to be initialized ahead of lcd_clk, being its parent. This change fixes issues with the LCD clocks during suspend/resume.
--- drivers/clk/imx/clk-imx8qxp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/imx/clk-imx8qxp.c +1 -1
@@ -148,10 +148,10 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)imx_clk_scu ("adc0_clk" ,IMX_SC_R_ADC_0 ,IMX_SC_PM_CLK_PER );imx_clk_scu ("adc1_clk" ,IMX_SC_R_ADC_1 ,IMX_SC_PM_CLK_PER );imx_clk_scu ("pwm_clk" ,IMX_SC_R_LCD_0_PWM_0 ,IMX_SC_PM_CLK_PER ); +imx_clk_scu ("elcdif_pll" ,IMX_SC_R_ELCDIF_PLL ,IMX_SC_PM_CLK_PLL );imx_clk_scu2 ("lcd_clk" , lcd_sels,ARRAY_SIZE (lcd_sels),IMX_SC_R_LCD_0 ,IMX_SC_PM_CLK_PER );imx_clk_scu2 ("lcd_pxl_clk" , lcd_pxl_sels,ARRAY_SIZE (lcd_pxl_sels),IMX_SC_R_LCD_0 ,IMX_SC_PM_CLK_MISC0 );imx_clk_scu ("lcd_pxl_bypass_div_clk" ,IMX_SC_R_LCD_0 ,IMX_SC_PM_CLK_BYPASS ); -imx_clk_scu ("elcdif_pll" ,IMX_SC_R_ELCDIF_PLL ,IMX_SC_PM_CLK_PLL );/* Audio SS */ imx_clk_scu ("audio_pll0_clk" ,IMX_SC_R_AUDIO_PLL_0 ,IMX_SC_PM_CLK_PLL );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 87/379 clk: renesas: rcar-gen3: Extend SDnH divider table
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dirk Behme <[email protected]>
[ Upstream commit d5252d9697a3e7007c741e9c103073868955a304 ]
The clock dividers might be used with clock stop bit enabled or not. Current tables only support recommended values from the datasheet. This might result in warnings like below because no valid clock divider is found. Resulting in a 0 divider.
There are Renesas ARM Trusted Firmware version out there which e.g. configure 0x201 (shifted logical right by 2: 0x80) and with this match the added { STPnHCK | 0, 1 }:
------------[ cut here ]------------ sd1h: Zero divisor and CLK_DIVIDER_ALLOW_ZERO not set WARNING: CPU: 1 PID: 1 at drivers/clk/clk-divider.c:141 divider_recalc_rate+0x48/0x70 Modules linked in: CPU: 1 PID: 1 Comm: swapper/0 Not tainted 6.1.52 #1 Hardware name: Custom board based on r8a7796 (DT) pstate: 40000005 (nZcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : divider_recalc_rate+0x48/0x70 ... ------------[ cut here ]------------
--- drivers/clk/renesas/rcar-cpg-lib.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/clk/renesas/rcar-cpg-lib.c +14 -1
@@ -70,8 +70,21 @@ void cpg_simple_notifier_register(struct raw_notifier_head *notifiers,#define STPnHCK BIT(9 - SDnSRCFC_SHIFT)static const struct clk_div_table cpg_sdh_div_table[] = { +/* +* These values are recommended by the datasheet. Because they come +* first, Linux will only use these. +*/ {0 ,1 }, {1 ,2 }, { STPnHCK |2 ,4 }, { STPnHCK |3 ,8 }, - { STPnHCK |4 ,16 }, {0 ,0 }, + { STPnHCK |4 ,16 }, +/* +* These values are not recommended because STPnHCK is wrong. But they +* have been seen because of broken firmware. So, we support reading +* them but Linux will sanitize them when initializing through +* recalc_rate. +*/ + { STPnHCK |0 ,1 }, { STPnHCK |1 ,2 }, {2 ,4 }, {3 ,8 }, {4 ,16 }, +/* Sentinel */ + {0 ,0 } }; struct clk * __init cpg_sdh_clk_register(const char *name,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 88/379 clk: renesas: rzg2l: Wait for status bit of SD mux before continuing
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit 549f4ae2601f968e2474c6031fb4799468882f64 ]
The hardware user manual for RZ/G2L (r01uh0914ej0130-rzg2l-rzg2lc.pdf, chapter 7.4.7 Procedure for Switching Clocks by the Dynamic Switching Frequency Selectors) specifies that we need to check CPG_PL2SDHI_DSEL for SD clock switching status.
--- drivers/clk/renesas/rzg2l-cpg.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
drivers/clk/renesas/rzg2l-cpg.c +10 -7
@@ -192,7 +192,8 @@ static int rzg2l_cpg_sd_clk_mux_set_parent(struct clk_hw *hw, u8 index)u32 off =GET_REG_OFFSET (hwdata->conf);u32 shift =GET_SHIFT (hwdata->conf);const u32 clk_src_266 =2 ; -u32 bitmask; +u32 msk, val, bitmask; +int ret;/* * As per the HW manual, we should not directly switch from 533 MHz to
@@ -206,14 +207,10 @@ static int rzg2l_cpg_sd_clk_mux_set_parent(struct clk_hw *hw, u8 index)* the index to value mapping is done by adding 1 to the index. */ bitmask = (GENMASK (GET_WIDTH (hwdata->conf) -1 ,0 ) << shift) <<16 ; + msk = off ?CPG_CLKSTATUS_SELSDHI1_STS :CPG_CLKSTATUS_SELSDHI0_STS ;if (index != clk_src_266) { -u32 msk, val; -int ret; -writel (bitmask | ((clk_src_266 +1 ) << shift), priv->base + off); - msk = off ?CPG_CLKSTATUS_SELSDHI1_STS :CPG_CLKSTATUS_SELSDHI0_STS ; - ret =readl_poll_timeout (priv->base +CPG_CLKSTATUS , val, !(val & msk),100 ,CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US );
@@ -225,7 +222,13 @@ static int rzg2l_cpg_sd_clk_mux_set_parent(struct clk_hw *hw, u8 index)writel (bitmask | ((index +1 ) << shift), priv->base + off); -return 0 ; + ret =readl_poll_timeout (priv->base +CPG_CLKSTATUS , val, + !(val & msk),100 , +CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US ); +if (ret) +dev_err (priv->dev,"failed to switch clk source\n" ); + +return ret; }static u8 rzg2l_cpg_sd_clk_mux_get_parent (struct clk_hw *hw)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 89/379 clk: renesas: rzg2l: Lock around writes to mux register
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit d2692ed490e680a41401cef879adebcfafb4298f ]
The SD MUX output (SD0) is further divided by 4 in G2{L,UL}. The divided clock is SD0_DIV4. SD0_DIV4 is registered with CLK_SET_RATE_PARENT which means a rate request for it is propagated to the MUX and could reach rzg2l_cpg_sd_clk_mux_set_parent() concurrently with the users of SD0.
Add proper locking to avoid concurrent accesses on SD MUX set rate registers.
--- drivers/clk/renesas/rzg2l-cpg.c | 23 +++++++++++++---------- drivers/clk/renesas/rzg2l-cpg.h | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-)
drivers/clk/renesas/rzg2l-cpg.c +13 -10
@@ -193,6 +193,7 @@ static int rzg2l_cpg_sd_clk_mux_set_parent(struct clk_hw *hw, u8 index)u32 shift =GET_SHIFT (hwdata->conf);const u32 clk_src_266 =2 ;u32 msk, val, bitmask; +unsigned long flags;int ret;/*
@@ -208,23 +209,25 @@ static int rzg2l_cpg_sd_clk_mux_set_parent(struct clk_hw *hw, u8 index)*/ bitmask = (GENMASK (GET_WIDTH (hwdata->conf) -1 ,0 ) << shift) <<16 ; msk = off ?CPG_CLKSTATUS_SELSDHI1_STS :CPG_CLKSTATUS_SELSDHI0_STS ; +spin_lock_irqsave (&priv->rmw_lock, flags);if (index != clk_src_266) {writel (bitmask | ((clk_src_266 +1 ) << shift), priv->base + off); - ret =readl_poll_timeout (priv->base +CPG_CLKSTATUS , val, - !(val & msk),100 , -CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US ); -if (ret) { -dev_err (priv->dev,"failed to switch clk source\n" ); -return ret; - } + ret =readl_poll_timeout_atomic (priv->base +CPG_CLKSTATUS , val, + !(val & msk),10 , +CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US ); +if (ret) + goto unlock; }writel (bitmask | ((index +1 ) << shift), priv->base + off); - ret =readl_poll_timeout (priv->base +CPG_CLKSTATUS , val, - !(val & msk),100 , -CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US ); + ret =readl_poll_timeout_atomic (priv->base +CPG_CLKSTATUS , val, + !(val & msk),10 , +CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US ); +unlock: +spin_unlock_irqrestore (&priv->rmw_lock, flags); +if (ret)dev_err (priv->dev,"failed to switch clk source\n" );
drivers/clk/renesas/rzg2l-cpg.h +1 -1
@@ -43,7 +43,7 @@#define CPG_CLKSTATUS_SELSDHI0_STS BIT(28)#define CPG_CLKSTATUS_SELSDHI1_STS BIT(29) -#define CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US 20000 +#define CPG_SDHI_CLK_SWITCH_STATUS_TIMEOUT_US 200/* n = 0/1/2 for PLL1/4/6 */ #define CPG_SAMPLL_CLK1 (n) (0x04 + (16 * n))
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 90/379 clk: renesas: rzg2l: Trust value returned by hardware
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit bf51d3b2d048c312764a55d91d67a85ee5535e31 ]
The onitial value of the CPG_PL2SDHI_DSEL bits 0..1 or 4..6 is 01b. The hardware user's manual (r01uh0914ej0130-rzg2l-rzg2lc.pdf) specifies that setting 0 is prohibited. Hence rzg2l_cpg_sd_clk_mux_get_parent() should just read CPG_PL2SDHI_DSEL, trust the value, and return the proper clock parent index based on the value read.
--- drivers/clk/renesas/rzg2l-cpg.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/clk/renesas/rzg2l-cpg.c +1 -7
@@ -242,14 +242,8 @@ static u8 rzg2l_cpg_sd_clk_mux_get_parent(struct clk_hw *hw) val >>=GET_SHIFT (hwdata->conf); val &=GENMASK (GET_WIDTH (hwdata->conf) -1 ,0 ); -if (val) { - val--; - }else { -/* Prohibited clk source, change it to 533 MHz(reset value) */ -rzg2l_cpg_sd_clk_mux_set_parent (hw,0 ); - } -return val; +return val ? val -1 :0 ; }static const struct clk_ops rzg2l_cpg_sd_clk_mux_ops = {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 91/379 clk: renesas: rzg2l: Use FIELD_GET() for PLL register fields
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit 72977f07b035e488c3f1928832a1616c6cae7278 ]
Use FIELD_GET() for PLL register fields. This is its purpose.
Stable-dep-of: a2b23159499e ("clk: renesas: rzg2l: Fix computation formula")
--- drivers/clk/renesas/rzg2l-cpg.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/clk/renesas/rzg2l-cpg.c +5 -5
@@ -11,6 +11,7 @@* Copyright (C) 2015 Renesas Electronics Corp. */ +#include <linux/bitfield.h> #include <linux/clk.h> #include <linux/clk-provider.h> #include <linux/clk/renesas.h>
@@ -39,14 +40,13 @@#define WARN_DEBUG (x) do { } while (0)#endif -#define DIV_RSMASK (v, s, m) ((v >> s) & m)#define GET_SHIFT (val) ((val >> 12) & 0xff)#define GET_WIDTH (val) ((val >> 8) & 0xf) -#define KDIV (val) DIV_RSMASK(val, 16, 0xffff) -#define MDIV (val) DIV_RSMASK(val, 6, 0x3ff) -#define PDIV (val) DIV_RSMASK(val, 0, 0x3f) -#define SDIV (val) DIV_RSMASK(val, 0, 0x7) +#define KDIV (val) FIELD_GET(GENMASK(31, 16), val) +#define MDIV (val) FIELD_GET(GENMASK(15, 6), val) +#define PDIV (val) FIELD_GET(GENMASK(5, 0), val) +#define SDIV (val) FIELD_GET(GENMASK(2, 0), val)#define CLK_ON_R (reg) (reg)#define CLK_MON_R (reg) (0x180 + (reg))
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 92/379 clk: renesas: rzg2l: Fix computation formula
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit a2b23159499efd36b2d63b3c4534075d12ddc97a ]
According to the hardware manual for RZ/G2L (r01uh0914ej0130-rzg2l-rzg2lc.pdf), the computation formula for PLL rate is as follows:
Fout = ((m + k/65536) * Fin) / (p * 2^s)
and k has values in the range [-32768, 32767]. Dividing k by 65536 with integer arithmetic gives zero all the time, causing slight differences b/w what has been set vs. what is displayed. Thus, get rid of this and decompose the formula before dividing k by 65536.
--- drivers/clk/renesas/rzg2l-cpg.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/clk/renesas/rzg2l-cpg.c +6 -6
@@ -43,7 +43,7 @@#define GET_SHIFT (val) ((val >> 12) & 0xff)#define GET_WIDTH (val) ((val >> 8) & 0xf) -#define KDIV (val) FIELD_GET(GENMASK(31, 16), val) +#define KDIV (val) ((s16)FIELD_GET(GENMASK(31, 16), val))#define MDIV (val) FIELD_GET(GENMASK(15, 6), val)#define PDIV (val) FIELD_GET(GENMASK(5, 0), val)#define SDIV (val) FIELD_GET(GENMASK(2, 0), val)
@@ -699,18 +699,18 @@ static unsigned long rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw *hw,struct pll_clk *pll_clk =to_pll (hw);struct rzg2l_cpg_priv *priv = pll_clk->priv;unsigned int val1, val2; -unsigned int mult =1 ; -unsigned int div =1 ; +u64 rate;if (pll_clk->type !=CLK_TYPE_SAM_PLL )return parent_rate; val1 =readl (priv->base +GET_REG_SAMPLL_CLK1 (pll_clk->conf)); val2 =readl (priv->base +GET_REG_SAMPLL_CLK2 (pll_clk->conf)); - mult =MDIV (val1) +KDIV (val1) /65536 ; - div =PDIV (val1) <<SDIV (val2); -return DIV_ROUND_CLOSEST_ULL ((u64 )parent_rate * mult, div); + rate =mul_u64_u32_shr (parent_rate, (MDIV (val1) <<16 ) +KDIV (val1), +16 +SDIV (val2)); + +return DIV_ROUND_CLOSEST_ULL (rate,PDIV (val1)); }static const struct clk_ops rzg2l_cpg_pll_ops = {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 93/379 clk: linux/clk-provider.h: fix kernel-doc warnings and typos
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit 84aefafe6b294041b7fa0757414c4a29c1bdeea2 ]
Fix spelling of "Structure".
Fix multiple kernel-doc warnings:
clk-provider.h:269: warning: Function parameter or member 'recalc_rate' not described in 'clk_ops'
clk-provider.h:468: warning: Function parameter or member 'parent_data' not described in 'clk_hw_register_fixed_rate_with_accuracy_parent_data' clk-provider.h:468: warning: Excess function parameter 'parent_name' description in 'clk_hw_register_fixed_rate_with_accuracy_parent_data' clk-provider.h:482: warning: Function parameter or member 'parent_data' not described in 'clk_hw_register_fixed_rate_parent_accuracy' clk-provider.h:482: warning: Excess function parameter 'parent_name' description in 'clk_hw_register_fixed_rate_parent_accuracy' clk-provider.h:687: warning: Function parameter or member 'flags' not described in 'clk_divider'
clk-provider.h:1164: warning: Function parameter or member 'flags' not described in 'clk_fractional_divider' clk-provider.h:1164: warning: Function parameter or member 'approximation' not described in 'clk_fractional_divider' clk-provider.h:1213: warning: Function parameter or member 'flags' not described in 'clk_multiplier'
--- include/linux/clk-provider.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
include/linux/clk-provider.h +8 -7
@@ -72,7 +72,7 @@ void clk_hw_forward_rate_request(const struct clk_hw *core, unsigned long parent_rate);/** -* struct clk_duty - Struture encoding the duty cycle ratio of a clock +* struct clk_duty - Structure encoding the duty cycle ratio of a clock * * @num: Numerator of the duty cycle ratio * @den: Denominator of the duty cycle ratio
@@ -127,7 +127,7 @@ struct clk_duty {* @restore_context: Restore the context of the clock after a restoration * of power. * -* @recalc_rate Recalculate the rate of this clock, by querying hardware. The +* @recalc_rate: Recalculate the rate of this clock, by querying hardware. The * parent rate is an input parameter. It is up to the caller to * ensure that the prepare_mutex is held across this call. If the * driver cannot figure out a rate for this clock, it must return
@@ -454,7 +454,7 @@ struct clk *clk_register_fixed_rate(struct device *dev, const char *name,* clock with the clock framework * @dev: device that is registering this clock * @name: name of this clock -* @parent_name: name of clock's parent +* @parent_data: name of clock's parent * @flags: framework-specific flags * @fixed_rate: non-adjustable clock rate * @fixed_accuracy: non-adjustable clock accuracy
@@ -469,7 +469,7 @@ struct clk *clk_register_fixed_rate(struct device *dev, const char *name,* the clock framework * @dev: device that is registering this clock * @name: name of this clock -* @parent_name: name of clock's parent +* @parent_data: name of clock's parent * @flags: framework-specific flags * @fixed_rate: non-adjustable clock rate */
@@ -628,7 +628,7 @@ struct clk_div_table {* Clock with an adjustable divider affecting its output frequency. Implements * .recalc_rate, .set_rate and .round_rate * -* Flags: +* @flags: * CLK_DIVIDER_ONE_BASED - by default the divisor is the value read from the * register plus one. If CLK_DIVIDER_ONE_BASED is set then the divider is * the raw value read from the register, with the value of zero considered
@@ -1109,11 +1109,12 @@ struct clk_hw *clk_hw_register_fixed_factor_parent_hw(struct device *dev,* @mwidth: width of the numerator bit field * @nshift: shift to the denominator bit field * @nwidth: width of the denominator bit field +* @approximation: clk driver's callback for calculating the divider clock * @lock: register lock * * Clock with adjustable fractional divider affecting its output frequency. * -* Flags: +* @flags: * CLK_FRAC_DIVIDER_ZERO_BASED - by default the numerator and denominator * is the value read from the register. If CLK_FRAC_DIVIDER_ZERO_BASED * is set then the numerator and denominator are both the value read
@@ -1172,7 +1173,7 @@ void clk_hw_unregister_fractional_divider(struct clk_hw *hw);* Clock with an adjustable multiplier affecting its output frequency. * Implements .recalc_rate, .set_rate and .round_rate * -* Flags: +* @flags: * CLK_MULTIPLIER_ZERO_BYPASS - By default, the multiplier is the value read * from the register, with 0 being a valid value effectively * zeroing the output clock rate. If CLK_MULTIPLIER_ZERO_BYPASS is
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 94/379 spi: nxp-fspi: use the correct ioremap function
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Han Xu <[email protected]>
[ Upstream commit c3aa5cb264a38ae9bbcce32abca4c155af0456df ]
AHB memory as MMIO should be mapped with ioremap rather than ioremap_wc, which should have been used initially just to handle unaligned access as a workaround.
--- drivers/spi/spi-nxp-fspi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-nxp-fspi.c +1 -1
@@ -708,7 +708,7 @@ static int nxp_fspi_read_ahb(struct nxp_fspi *f, const struct spi_mem_op *op) f->memmap_len = len >NXP_FSPI_MIN_IOMAP ? len :NXP_FSPI_MIN_IOMAP ; - f->ahb_addr =ioremap_wc (f->memmap_phy + f->memmap_start, + f->ahb_addr =ioremap (f->memmap_phy + f->memmap_start, f->memmap_len);if (!f->ahb_addr) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 95/379 clk: keystone: pll: fix a couple NULL vs IS_ERR() checks
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit a5d14f8b551eb1551c10053653ee8e27f19672fa ]
The clk_register_divider() and clk_register_mux() functions returns error pointers on error but this code checks for NULL. Fix that.
--- drivers/clk/keystone/pll.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/clk/keystone/pll.c +9 -6
@@ -281,12 +281,13 @@ static void __init of_pll_div_clk_init(struct device_node *node) clk =clk_register_divider (NULL , clk_name, parent_name,0 , reg, shift, mask,0 ,NULL ); -if (clk) { -of_clk_add_provider (node, of_clk_src_simple_get, clk); - }else { +if (IS_ERR (clk)) {pr_err ("%s: error registering divider %s\n" , __func__, clk_name);iounmap (reg); +return ; } + +of_clk_add_provider (node, of_clk_src_simple_get, clk); }CLK_OF_DECLARE (pll_divider_clock,"ti,keystone,pll-divider-clock" , of_pll_div_clk_init);
@@ -328,10 +329,12 @@ static void __init of_pll_mux_clk_init(struct device_node *node) clk =clk_register_mux (NULL , clk_name, (const char **)&parents,ARRAY_SIZE (parents) ,0 , reg, shift, mask,0 ,NULL ); -if (clk) -of_clk_add_provider (node, of_clk_src_simple_get, clk); -else +if (IS_ERR (clk)) {pr_err ("%s: error registering mux %s\n" , __func__, clk_name); +return ; + } + +of_clk_add_provider (node, of_clk_src_simple_get, clk); }CLK_OF_DECLARE (pll_mux_clock,"ti,keystone,pll-mux-clock" , of_pll_mux_clk_init);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 96/379 clk: ti: change ti_clk_register[_omap_hw]() API
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 3400d546a741a2b2001d88e7fa29110d45a3930d ]
The ti_clk_register() and ti_clk_register_omap_hw() functions are always called with the parameter of type "struct device" set to NULL, since the functions from which they are called always have a parameter of type "struct device_node". Replacing "struct device" type parameter with "struct device_node" will allow you to register a TI clock to the common clock framework by taking advantage of the facilities provided by the "struct device_node" type. Further, adding the "of_" prefix to the name of these functions explicitly binds them to the "struct device_node" type.
The patch has been tested on a Beaglebone board.
Stable-dep-of: 7af5b9eadd64 ("clk: ti: fix double free in of_ti_divider_clk_setup()")
--- drivers/clk/ti/apll.c | 4 ++-- drivers/clk/ti/clk-dra7-atl.c | 2 +- drivers/clk/ti/clk.c | 34 ++++++++++++++++------------------ drivers/clk/ti/clkctrl.c | 4 ++-- drivers/clk/ti/clock.h | 10 +++++----- drivers/clk/ti/composite.c | 2 +- drivers/clk/ti/divider.c | 2 +- drivers/clk/ti/dpll.c | 4 ++-- drivers/clk/ti/fixed-factor.c | 2 +- drivers/clk/ti/gate.c | 6 +++--- drivers/clk/ti/interface.c | 7 ++++--- drivers/clk/ti/mux.c | 6 +++--- 12 files changed, 41 insertions(+), 42 deletions(-)
drivers/clk/ti/apll.c +2 -2
@@ -160,7 +160,7 @@ static void __init omap_clk_register_apll(void *user, ad->clk_bypass =__clk_get_hw (clk); name =ti_dt_clk_name (node); - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);kfree (init->parent_names);
@@ -400,7 +400,7 @@ static void __init of_omap2_apll_setup(struct device_node *node) goto cleanup; name =ti_dt_clk_name (node); - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);kfree (init);
drivers/clk/ti/clk-dra7-atl.c +1 -1
@@ -197,7 +197,7 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node) init.parent_names = parent_names; - clk =ti_clk_register (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register (node, &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);
drivers/clk/ti/clk.c +16 -18
@@ -475,7 +475,7 @@ void __init ti_clk_add_aliases(void) clkspec.np = np; clk =of_clk_get_from_provider (&clkspec); -ti_clk_add_alias (NULL , clk,ti_dt_clk_name (np)); +ti_clk_add_alias (clk,ti_dt_clk_name (np)); } }
@@ -528,7 +528,6 @@ void omap2_clk_enable_init_clocks(const char **clk_names, u8 num_clocks)/** * ti_clk_add_alias - add a clock alias for a TI clock -* @dev: device alias for this clock * @clk: clock handle to create alias for * @con: connection ID for this clock *
@@ -536,7 +535,7 @@ void omap2_clk_enable_init_clocks(const char **clk_names, u8 num_clocks)* and assigns the data to it. Returns 0 if successful, negative error * value otherwise. */ -int ti_clk_add_alias (struct device *dev,struct clk *clk,const char *con) +int ti_clk_add_alias (struct clk *clk,const char *con) {struct clk_lookup *cl;
@@ -550,8 +549,6 @@ int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con)if (!cl)return -ENOMEM ; -if (dev) - cl->dev_id =dev_name (dev); cl->con_id = con; cl->clk = clk;
@@ -561,8 +558,8 @@ int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con) }/** -* ti_clk_register - register a TI clock to the common clock framework -* @dev: device for this clock +* of_ti_clk_register - register a TI clock to the common clock framework +* @node: device node for this clock * @hw: hardware clock handle * @con: connection ID for this clock *
@@ -570,17 +567,18 @@ int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con)* alias for it. Returns a handle to the registered clock if successful, * ERR_PTR value in failure. */ -struct clk *ti_clk_register (struct device *dev,struct clk_hw *hw, -const char *con) +struct clk *of_ti_clk_register (struct device_node *node,struct clk_hw *hw, +const char *con) {struct clk *clk;int ret; - clk =clk_register (dev, hw); -if (IS_ERR (clk)) -return clk; + ret =of_clk_hw_register (node, hw); +if (ret) +return ERR_PTR (ret); - ret =ti_clk_add_alias (dev, clk, con); + clk = hw->clk; + ret =ti_clk_add_alias (clk, con);if (ret) {clk_unregister (clk);return ERR_PTR (ret);
@@ -590,8 +588,8 @@ struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw, }/** -* ti_clk_register_omap_hw - register a clk_hw_omap to the clock framework -* @dev: device for this clock +* of_ti_clk_register_omap_hw - register a clk_hw_omap to the clock framework +* @node: device node for this clock * @hw: hardware clock handle * @con: connection ID for this clock *
@@ -600,13 +598,13 @@ struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw,* Returns a handle to the registered clock if successful, ERR_PTR value * in failure. */ -struct clk *ti_clk_register_omap_hw (struct device *dev,struct clk_hw *hw, -const char *con) +struct clk *of_ti_clk_register_omap_hw (struct device_node *node, +struct clk_hw *hw,const char *con) {struct clk *clk;struct clk_hw_omap *oclk; - clk =ti_clk_register (dev, hw, con); + clk =of_ti_clk_register (node, hw, con);if (IS_ERR (clk))return clk;
drivers/clk/ti/clkctrl.c +2 -2
@@ -308,7 +308,7 @@ _ti_clkctrl_clk_register(struct omap_clkctrl_provider *provider, init.ops = ops; init.flags =0 ; - clk =ti_clk_register (NULL , clk_hw, init.name); + clk =of_ti_clk_register (node, clk_hw, init.name);if (IS_ERR_OR_NULL (clk)) { ret = -EINVAL ; goto cleanup;
@@ -689,7 +689,7 @@ static void __init _ti_omap4_clkctrl_setup(struct device_node *node) init.ops = &omap4_clkctrl_clk_ops; hw->hw.init = &init; - clk =ti_clk_register_omap_hw (NULL , &hw->hw, init.name); + clk =of_ti_clk_register_omap_hw (node, &hw->hw, init.name);if (IS_ERR_OR_NULL (clk)) goto cleanup;
drivers/clk/ti/clock.h +5 -5
@@ -199,12 +199,12 @@ extern const struct omap_clkctrl_data dm816_clkctrl_data[];typedef void (*ti_of_clk_init_cb_t )(void *,struct device_node *); -struct clk *ti_clk_register (struct device *dev,struct clk_hw *hw, -const char *con); -struct clk *ti_clk_register_omap_hw (struct device *dev,struct clk_hw *hw, -const char *con); +struct clk *of_ti_clk_register (struct device_node *node,struct clk_hw *hw, +const char *con); +struct clk *of_ti_clk_register_omap_hw (struct device_node *node, +struct clk_hw *hw,const char *con);const char *ti_dt_clk_name (struct device_node *np); -int ti_clk_add_alias (struct device *dev,struct clk *clk,const char *con); +int ti_clk_add_alias (struct clk *clk,const char *con);void ti_clk_add_aliases (void );void ti_clk_latch (struct clk_omap_reg *reg,s8 shift);
drivers/clk/ti/composite.c +1 -1
@@ -176,7 +176,7 @@ static void __init _register_composite(void *user, &ti_composite_gate_ops, 0);if (!IS_ERR (clk)) { - ret =ti_clk_add_alias (NULL , clk, name); + ret =ti_clk_add_alias (clk, name);if (ret) {clk_unregister (clk); goto cleanup;
drivers/clk/ti/divider.c +1 -1
@@ -326,7 +326,7 @@ static struct clk *_register_divider(struct device_node *node, div->hw.init = &init;/* register the clock */ - clk =ti_clk_register (NULL , &div->hw, name); + clk =of_ti_clk_register (node, &div->hw, name);if (IS_ERR (clk))kfree (div);
drivers/clk/ti/dpll.c +2 -2
@@ -187,7 +187,7 @@ static void __init _register_dpll(void *user,/* register the clock */ name =ti_dt_clk_name (node); - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);
@@ -259,7 +259,7 @@ static void _register_dpll_x2(struct device_node *node,#endif /* register the clock */ - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (IS_ERR (clk))kfree (clk_hw);
drivers/clk/ti/fixed-factor.c +1 -1
@@ -54,7 +54,7 @@ static void __init of_ti_fixed_factor_clk_setup(struct device_node *node)if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);of_ti_clk_autoidle_setup (node); -ti_clk_add_alias (NULL , clk, clk_name); +ti_clk_add_alias (clk, clk_name); } } CLK_OF_DECLARE(ti_fixed_factor_clk, "ti,fixed-factor-clock",
drivers/clk/ti/gate.c +3 -3
@@ -85,7 +85,7 @@ static int omap36xx_gate_clk_enable_with_hsdiv_restore(struct clk_hw *hw)return ret; } -static struct clk *_register_gate(struct device *dev, const char *name, +static struct clk *_register_gate(struct device_node *node, const char *name, const char *parent_name, unsigned long flags, struct clk_omap_reg *reg, u8 bit_idx, u8 clk_gate_flags, const struct clk_ops *ops,
@@ -115,7 +115,7 @@ static struct clk *_register_gate(struct device *dev, const char *name, init.flags = flags; - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (IS_ERR (clk))kfree (clk_hw);
@@ -158,7 +158,7 @@ static void __init _of_ti_gate_clk_setup(struct device_node *node, clk_gate_flags |=INVERT_ENABLE ; name =ti_dt_clk_name (node); - clk =_register_gate (NULL , name, parent_name, flags, ®, + clk =_register_gate (node, name, parent_name, flags, ®, enable_bit, clk_gate_flags, ops, hw_ops);if (!IS_ERR (clk))
drivers/clk/ti/interface.c +4 -3
@@ -24,7 +24,8 @@ static const struct clk_ops ti_interface_clk_ops = { .is_enabled = &omap2_dflt_clk_is_enabled, }; -static struct clk *_register_interface (struct device *dev,const char *name, +static struct clk *_register_interface (struct device_node *node, +const char *name,const char *parent_name,struct clk_omap_reg *reg,u8 bit_idx,const struct clk_hw_omap_ops *ops)
@@ -49,7 +50,7 @@ static struct clk *_register_interface(struct device *dev, const char *name, init.num_parents =1 ; init.parent_names = &parent_name; - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (IS_ERR (clk))kfree (clk_hw);
@@ -80,7 +81,7 @@ static void __init _of_ti_interface_clk_setup(struct device_node *node, } name =ti_dt_clk_name (node); - clk =_register_interface (NULL , name, parent_name, ®, + clk =_register_interface (node, name, parent_name, ®, enable_bit, ops);if (!IS_ERR (clk))
drivers/clk/ti/mux.c +3 -3
@@ -118,7 +118,7 @@ const struct clk_ops ti_clk_mux_ops = { .restore_context = clk_mux_restore_context, }; -static struct clk *_register_mux(struct device *dev, const char *name, +static struct clk *_register_mux(struct device_node *node, const char *name, const char * const *parent_names, u8 num_parents, unsigned long flags, struct clk_omap_reg *reg, u8 shift, u32 mask,
@@ -148,7 +148,7 @@ static struct clk *_register_mux(struct device *dev, const char *name, mux->table = table; mux->hw.init = &init; - clk =ti_clk_register (dev, &mux->hw, name); + clk =of_ti_clk_register (node, &mux->hw, name);if (IS_ERR (clk))kfree (mux);
@@ -207,7 +207,7 @@ static void of_mux_clk_setup(struct device_node *node) mask = (1 <<fls (mask)) -1 ; name =ti_dt_clk_name (node); - clk =_register_mux (NULL , name, parent_names, num_parents, + clk =_register_mux (node, name, parent_names, num_parents, flags, ®, shift, mask, latch, clk_mux_flags,NULL );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 97/379 clk: ti: fix double free in of_ti_divider_clk_setup()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 7af5b9eadd64c9e02a71f97c45bcdf3b64841f6b ]
The "div" pointer is freed in _register_divider() and again in of_ti_divider_clk_setup(). Delete the free in _register_divider()
--- drivers/clk/ti/divider.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/clk/ti/divider.c +1 -7
@@ -309,7 +309,6 @@ static struct clk *_register_divider(struct device_node *node,u32 flags, struct clk_omap_divider *div) { - struct clk *clk; struct clk_init_data init;const char *parent_name;const char *name;
@@ -326,12 +325,7 @@ static struct clk *_register_divider(struct device_node *node, div->hw.init = &init;/* register the clock */ - clk =of_ti_clk_register (node, &div->hw, name); - -if (IS_ERR (clk)) -kfree (div); - -return clk; +return of_ti_clk_register (node, &div->hw, name); } int ti_clk_parse_divider_data(int *div_table, int num_dividers, int max_div,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 98/379 clk: npcm7xx: Fix incorrect kfree
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Neuschäfer <[email protected]>
[ Upstream commit bbc5080bef4a245106aa8e8d424ba8847ca7c0ca ]
The corresponding allocation is:
Quoted 2 lines
npcm7xx_clk_data= kzalloc(struct_size(npcm7xx_clk_data, hws,NPCM7XX_NUM_CLOCKS), GFP_KERNEL);
... so, kfree should be applied to npcm7xx_clk_data, not npcm7xx_clk_data->hws.
--- drivers/clk/clk-npcm7xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/clk-npcm7xx.c +1 -1
@@ -510,7 +510,7 @@ static void __init npcm7xx_clk_init(struct device_node *clk_np)return ; npcm7xx_init_fail: -kfree (npcm7xx_clk_data->hws); +kfree (npcm7xx_clk_data); npcm7xx_init_np_err:iounmap (clk_base); npcm7xx_init_error:
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 99/379 clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit b82681042724924ae3ba0f2f2eeec217fa31e830 ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt6765.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/clk/mediatek/clk-mt6765.c +6 -0
@@ -738,6 +738,8 @@ static int clk_mt6765_apmixed_probe(struct platform_device *pdev) } clk_data =mtk_alloc_clk_data (CLK_APMIXED_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data);
@@ -773,6 +775,8 @@ static int clk_mt6765_top_probe(struct platform_device *pdev) } clk_data =mtk_alloc_clk_data (CLK_TOP_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_fixed_clks (fixed_clks,ARRAY_SIZE (fixed_clks), clk_data);
@@ -813,6 +817,8 @@ static int clk_mt6765_ifr_probe(struct platform_device *pdev) } clk_data =mtk_alloc_clk_data (CLK_IFR_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, ifr_clks,ARRAY_SIZE (ifr_clks), clk_data);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 100/379 clk: mediatek: clk-mt6779: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 1f57f78fbacf630430bf954e5a84caafdfea30c0 ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt6779.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/clk/mediatek/clk-mt6779.c +4 -0
@@ -1218,6 +1218,8 @@ static int clk_mt6779_apmixed_probe(struct platform_device *pdev)struct device_node *node = pdev->dev.of_node; clk_data =mtk_alloc_clk_data (CLK_APMIXED_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data);
@@ -1238,6 +1240,8 @@ static int clk_mt6779_top_probe(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_TOP_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_fixed_clks (top_fixed_clks,ARRAY_SIZE (top_fixed_clks), clk_data);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 101/379 clk: mediatek: clk-mt6797: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 606f6366a35a3329545e38129804d65ef26ed7d2 ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt6797.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/clk/mediatek/clk-mt6797.c +6 -0
@@ -392,6 +392,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_TOP_NR ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_factors (top_fixed_divs,ARRAY_SIZE (top_fixed_divs), clk_data);
@@ -546,6 +548,8 @@ static void mtk_infrasys_init_early(struct device_node *node)if (!infra_clk_data) { infra_clk_data =mtk_alloc_clk_data (CLK_INFRA_NR ); +if (!infra_clk_data) +return ;for (i =0 ; i <CLK_INFRA_NR ; i++) infra_clk_data->hws[i] =ERR_PTR (-EPROBE_DEFER );
@@ -571,6 +575,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)if (!infra_clk_data) { infra_clk_data =mtk_alloc_clk_data (CLK_INFRA_NR ); +if (!infra_clk_data) +return -ENOMEM ; }else {for (i =0 ; i <CLK_INFRA_NR ; i++) {if (infra_clk_data->hws[i] ==ERR_PTR (-EPROBE_DEFER ))
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 102/379 clk: mediatek: clk-mt7629-eth: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 0884393c63cc9a1772f7121a6645ba7bd76feeb9 ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt7629-eth.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/clk/mediatek/clk-mt7629-eth.c +4 -0
@@ -79,6 +79,8 @@ static int clk_mt7629_ethsys_init(struct platform_device *pdev)int r; clk_data =mtk_alloc_clk_data (CLK_ETH_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, eth_clks,CLK_ETH_NR_CLK , clk_data);
@@ -101,6 +103,8 @@ static int clk_mt7629_sgmiisys_init(struct platform_device *pdev)int r; clk_data =mtk_alloc_clk_data (CLK_SGMII_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, sgmii_clks[id++],CLK_SGMII_NR_CLK , clk_data);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 103/379 clk: mediatek: clk-mt7629: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 2befa515c1bb6cdd33c262b909d93d1973a219aa ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt7629.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/clk/mediatek/clk-mt7629.c +6 -0
@@ -557,6 +557,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_TOP_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_fixed_clks (top_fixed_clks,ARRAY_SIZE (top_fixed_clks), clk_data);
@@ -580,6 +582,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)struct clk_hw_onecell_data *clk_data; clk_data =mtk_alloc_clk_data (CLK_INFRA_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), clk_data);
@@ -603,6 +607,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_PERI_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, peri_clks,ARRAY_SIZE (peri_clks), clk_data);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 104/379 clk: mediatek: clk-mt2701: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 0d6e24b422a2166a9297a8286ff2e6ab9a5e8cd3 ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt2701.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/clk/mediatek/clk-mt2701.c +8 -0
@@ -670,6 +670,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_TOP_NR ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_fixed_clks (top_fixed_clks,ARRAY_SIZE (top_fixed_clks), clk_data);
@@ -749,6 +751,8 @@ static void __init mtk_infrasys_init_early(struct device_node *node)if (!infra_clk_data) { infra_clk_data =mtk_alloc_clk_data (CLK_INFRA_NR ); +if (!infra_clk_data) +return ;for (i =0 ; i <CLK_INFRA_NR ; i++) infra_clk_data->hws[i] =ERR_PTR (-EPROBE_DEFER );
@@ -776,6 +780,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)if (!infra_clk_data) { infra_clk_data =mtk_alloc_clk_data (CLK_INFRA_NR ); +if (!infra_clk_data) +return -ENOMEM ; }else {for (i =0 ; i <CLK_INFRA_NR ; i++) {if (infra_clk_data->hws[i] ==ERR_PTR (-EPROBE_DEFER ))
@@ -893,6 +899,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_PERI_NR ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, peri_clks,ARRAY_SIZE (peri_clks), clk_data);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 105/379 clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Varadarajan Narayanan <[email protected]>
[ Upstream commit 6a15647d0adc686226045e8046369f34d6ab03ed ]
The config IPQ_APSS_6018 should depend on QCOM_SMEM, to avoid the following error reported by 'kernel test robot'
loongarch64-linux-ld: drivers/clk/qcom/apss-ipq6018.o: in function `apss_ipq6018_probe': >> apss-ipq6018.c:(.text+0xd0): undefined reference to `qcom_smem_get_soc_id'
--- drivers/clk/qcom/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/clk/qcom/Kconfig +1 -0
@@ -127,6 +127,7 @@ config IPQ_APSS_6018 tristate "IPQ APSS Clock Controller" select IPQ_APSS_PLL depends on QCOM_APCS_IPC || COMPILE_TEST + depends on QCOM_SMEM help Support for APSS clock controller on IPQ platforms. The APSS clock controller manages the Mux and enable block that feeds the
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 106/379 platform/x86: wmi: Fix probe failure when failing to register WMI devices
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit ed85891a276edaf7a867de0e9acd0837bc3008f2 ]
When a WMI device besides the first one somehow fails to register, retval is returned while still containing a negative error code. This causes the ACPI device fail to probe, leaving behind zombie WMI devices leading to various errors later.
Handle the single error path separately and return 0 unconditionally after trying to register all WMI devices to solve the issue. Also continue to register WMI devices even if some fail to allocate memory.
--- drivers/platform/x86/wmi.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/platform/x86/wmi.c +8 -8
@@ -1212,8 +1212,8 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device)struct wmi_block *wblock, *next;union acpi_object *obj;acpi_status status; -int retval =0 ;u32 i, total; +int retval; status =acpi_evaluate_object (device->handle,"_WDG" ,NULL , &out);if (ACPI_FAILURE (status))
@@ -1224,8 +1224,8 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device)return -ENXIO ;if (obj->type !=ACPI_TYPE_BUFFER ) { - retval = -ENXIO ; - goto out_free_pointer; +kfree (obj); +return -ENXIO ; } gblock = (const struct guid_block *)obj->buffer.pointer;
@@ -1240,8 +1240,8 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device) wblock =kzalloc (sizeof (*wblock),GFP_KERNEL );if (!wblock) { - retval = -ENOMEM ; -break ; +dev_err (wmi_bus_dev,"Failed to allocate %pUL\n" , &gblock[i].guid); +continue ; } wblock->acpi_device = device;
@@ -1280,9 +1280,9 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device) } } -out_free_pointer: -kfree (out.pointer); -return retval; +kfree (obj); + +return 0 ; }/*
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 107/379 platform/x86: wmi: Fix opening of char device
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit eba9ac7abab91c8f6d351460239108bef5e7a0b6 ]
Since commit fa1f68db6ca7 ("drivers: misc: pass miscdevice pointer via file private data"), the miscdevice stores a pointer to itself inside filp->private_data, which means that private_data will not be NULL when wmi_char_open() is called. This might cause memory corruption should wmi_char_open() be unable to find its driver, something which can happen when the associated WMI device is deleted in wmi_free_devices().
Fix the problem by using the miscdevice pointer to retrieve the WMI device data associated with a char device using container_of(). This also avoids wmi_char_open() picking a wrong WMI device bound to a driver with the same name as the original driver.
--- drivers/platform/x86/wmi.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-)
drivers/platform/x86/wmi.c +6 -14
@@ -849,21 +849,13 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver) }static int wmi_char_open (struct inode *inode,struct file *filp) { -const char *driver_name = filp->f_path.dentry->d_iname; -struct wmi_block *wblock; -struct wmi_block *next; - -list_for_each_entry_safe (wblock, next, &wmi_block_list, list) { -if (!wblock->dev.dev.driver) -continue ; -if (strcmp (driver_name, wblock->dev.dev.driver->name) ==0 ) { - filp->private_data = wblock; -break ; - } - } +/* +* The miscdevice already stores a pointer to itself +* inside filp->private_data +*/ + struct wmi_block *wblock = container_of(filp->private_data, struct wmi_block, char_dev); -if (!filp->private_data) -return -ENODEV ; + filp->private_data = wblock;return nonseekable_open (inode, filp); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 108/379 hwmon: (axi-fan-control) Fix possible NULL pointer dereference
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dragos Bogdan <[email protected]>
[ Upstream commit 2a5b3370a1d9750eca325292e291c8c7cb8cf2e0 ]
axi_fan_control_irq_handler(), dependent on the private axi_fan_control_data structure, might be called before the hwmon device is registered. That will cause an "Unable to handle kernel NULL pointer dereference" error.
--- drivers/hwmon/axi-fan-control.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
drivers/hwmon/axi-fan-control.c +16 -13
@@ -496,6 +496,21 @@ static int axi_fan_control_probe(struct platform_device *pdev)return -ENODEV ; } + ret =axi_fan_control_init (ctl, pdev->dev.of_node); +if (ret) { +dev_err (&pdev->dev,"Failed to initialize device\n" ); +return ret; + } + + ctl->hdev =devm_hwmon_device_register_with_info (&pdev->dev, + name, + ctl, + &axi_chip_info, + axi_fan_control_groups); + +if (IS_ERR (ctl->hdev)) +return PTR_ERR (ctl->hdev); + ctl->irq =platform_get_irq (pdev,0 );if (ctl->irq <0 )return ctl->irq;
@@ -509,19 +524,7 @@ static int axi_fan_control_probe(struct platform_device *pdev)return ret; } - ret =axi_fan_control_init (ctl, pdev->dev.of_node); -if (ret) { -dev_err (&pdev->dev,"Failed to initialize device\n" ); -return ret; - } - - ctl->hdev =devm_hwmon_device_register_with_info (&pdev->dev, - name, - ctl, - &axi_chip_info, - axi_fan_control_groups); - -return PTR_ERR_OR_ZERO (ctl->hdev); +return 0 ; }static struct platform_driver axi_fan_control_driver = {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 109/379 hwmon: (coretemp) Fix potentially truncated sysfs attribute name
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Rui <[email protected]>
[ Upstream commit bbfff736d30e5283ad09e748caff979d75ddef7f ]
When build with W=1 and "-Werror=format-truncation", below error is observed in coretemp driver,
drivers/hwmon/coretemp.c: In function 'create_core_data':
Quoted 1 line
Quoted 1 line
drivers/hwmon/coretemp.c:393:34: error: '%s' directive output may be truncated writing likely 5 or more bytes into a region of size between 3 and 13 [-Werror=format-truncation=]
393 | "temp%d_%s", attr_no, suffixes[i]);
| ^~
drivers/hwmon/coretemp.c:393:26: note: assuming directive output of 5 bytes
393 | "temp%d_%s", attr_no, suffixes[i]);
| ^~~~~~~~~~~
drivers/hwmon/coretemp.c:392:17: note: 'snprintf' output 7 or more bytes (assuming 22) into a destination of size 19
392 | snprintf(tdata->attr_name[i], CORETEMP_NAME_LENGTH,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
393 | "temp%d_%s", attr_no, suffixes[i]);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cc1: all warnings being treated as errors
Given that
1. '%d' could take 10 charactors,
2. '%s' could take 10 charactors ("crit_alarm"),
3. "temp", "_" and the NULL terminator take 6 charactors, fix the problem by increasing CORETEMP_NAME_LENGTH to 28.
--- drivers/hwmon/coretemp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/coretemp.c +1 -1
@@ -41,7 +41,7 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius");#define PKG_SYSFS_ATTR_NO 1/* Sysfs attribute for package temp */ #define BASE_SYSFS_ATTR_NO 2/* Sysfs Base attr no for coretemp */ #define NUM_REAL_CORES 128/* Number of Real cores per cpu */ -#define CORETEMP_NAME_LENGTH 19/* String Length of attrs */ +#define CORETEMP_NAME_LENGTH 28/* String Length of attrs */ #define MAX_CORE_ATTRS 4/* Maximum no of basic attrs */ #define TOTAL_ATTRS (MAX_CORE_ATTRS + 1)#define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 110/379 Revert "hwmon: (sch56xx-common) Add DMI override table"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit 28da9dee3594423534f3ea1e1f61e6bb2d2fa651 ]
This reverts commit fd2d53c367ae9983c2100ac733a834e0c79d7537.
As reported by Ian Nartowicz, this and the preceding patch result in a failure to load the driver on Celsius W280. While the alternative would be to add the board to the DMI override table, it is quite likely that other systems are also affected. Revert the offending patches to avoid future problems.
--- drivers/hwmon/sch56xx-common.c | 44 ++++++++-------------------------- 1 file changed, 10 insertions(+), 34 deletions(-)
drivers/hwmon/sch56xx-common.c +10 -34
@@ -523,28 +523,6 @@ static int __init sch56xx_device_add(int address, const char *name)return PTR_ERR_OR_ZERO (sch56xx_pdev); } -static const struct dmi_system_id sch56xx_dmi_override_table[]__initconst = { - { - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"CELSIUS W380" ), - }, - }, - { - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"ESPRIMO P710" ), - }, - }, - { - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), -DMI_MATCH (DMI_PRODUCT_NAME ,"ESPRIMO E9900" ), - }, - }, - { } -}; -/* For autoloading only */ static const struct dmi_system_id sch56xx_dmi_table[]__initconst = { {
@@ -565,18 +543,16 @@ static int __init sch56xx_init(void)if (!dmi_check_system (sch56xx_dmi_table))return -ENODEV ; -if (!dmi_check_system (sch56xx_dmi_override_table)) { -/* -* Some machines like the Esprimo P720 and Esprimo C700 have -* onboard devices named " Antiope"/" Theseus" instead of -* "Antiope"/"Theseus", so we need to check for both. -*/ -if (!dmi_find_device (DMI_DEV_TYPE_OTHER ,"Antiope" ,NULL ) && - !dmi_find_device (DMI_DEV_TYPE_OTHER ," Antiope" ,NULL ) && - !dmi_find_device (DMI_DEV_TYPE_OTHER ,"Theseus" ,NULL ) && - !dmi_find_device (DMI_DEV_TYPE_OTHER ," Theseus" ,NULL )) -return -ENODEV ; - } +/* +* Some machines like the Esprimo P720 and Esprimo C700 have +* onboard devices named " Antiope"/" Theseus" instead of +* "Antiope"/"Theseus", so we need to check for both. +*/ +if (!dmi_find_device (DMI_DEV_TYPE_OTHER ,"Antiope" ,NULL ) && + !dmi_find_device (DMI_DEV_TYPE_OTHER ," Antiope" ,NULL ) && + !dmi_find_device (DMI_DEV_TYPE_OTHER ,"Theseus" ,NULL ) && + !dmi_find_device (DMI_DEV_TYPE_OTHER ," Theseus" ,NULL )) +return -ENODEV ; }/*
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 111/379 Revert "hwmon: (sch56xx-common) Add automatic module loading on supported devices"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit d621a46d05107f4e510383d6a38f2160c62d28f7 ]
This reverts commit 393935baa45e5ccb9603cf7f9f020ed1bc0915f7.
As reported by Ian Nartowicz, this and the next patch result in a failure to load the driver on Celsius W280. While the alternative would be to add the board to the DMI override table, it is quite likely that other systems are also affected. Revert the offending patches to avoid future problems.
--- drivers/hwmon/sch56xx-common.c | 40 ++-------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-)
drivers/hwmon/sch56xx-common.c +2 -38
@@ -7,10 +7,8 @@#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt#include <linux/module.h> -#include <linux/mod_devicetable.h> #include <linux/init.h> #include <linux/platform_device.h> -#include <linux/dmi.h> #include <linux/err.h> #include <linux/io.h> #include <linux/acpi.h>
@@ -21,10 +19,7 @@#include <linux/slab.h> #include "sch56xx-common.h" -static bool ignore_dmi; -module_param (ignore_dmi, bool,0 ); -MODULE_PARM_DESC (ignore_dmi,"Omit DMI check for supported devices (default=0)" ); - +/* Insmod parameters */ static bool nowayout =WATCHDOG_NOWAYOUT ;module_param (nowayout, bool,0 ); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
@@ -523,42 +518,11 @@ static int __init sch56xx_device_add(int address, const char *name)return PTR_ERR_OR_ZERO (sch56xx_pdev); } -/* For autoloading only */ -static const struct dmi_system_id sch56xx_dmi_table[]__initconst = { - { - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"FUJITSU" ), - }, - }, - { } -}; -MODULE_DEVICE_TABLE (dmi, sch56xx_dmi_table); -static int __init sch56xx_init (void ) { -const char *name =NULL ;int address; +const char *name =NULL ; -if (!ignore_dmi) { -if (!dmi_check_system (sch56xx_dmi_table)) -return -ENODEV ; - -/* -* Some machines like the Esprimo P720 and Esprimo C700 have -* onboard devices named " Antiope"/" Theseus" instead of -* "Antiope"/"Theseus", so we need to check for both. -*/ -if (!dmi_find_device (DMI_DEV_TYPE_OTHER ,"Antiope" ,NULL ) && - !dmi_find_device (DMI_DEV_TYPE_OTHER ," Antiope" ,NULL ) && - !dmi_find_device (DMI_DEV_TYPE_OTHER ,"Theseus" ,NULL ) && - !dmi_find_device (DMI_DEV_TYPE_OTHER ," Theseus" ,NULL )) -return -ENODEV ; - } - -/* -* Some devices like the Esprimo C700 have both onboard devices, -* so we still have to check manually -*/ address =sch56xx_find (0x4e , &name);if (address <0 ) address =sch56xx_find (0x2e , &name);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 112/379 hwmon: (sch5627) Use bit macros when accessing the control register
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit 7f0b28e0653f36b51542d25dd54ed312c397ecfc ]
Use bit macros then accessing SCH5627_REG_CTRL, so that people do not need to look at the datasheet to find out what each bit does.
Tested on a Fujitsu Esprimo P720.
Stable-dep-of: 7da8a6354360 ("hwmon: (sch5627) Disallow write access if virtual registers are locked")
--- drivers/hwmon/sch5627.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/hwmon/sch5627.c +8 -4
@@ -6,6 +6,7 @@#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt +#include <linux/bits.h> #include <linux/module.h> #include <linux/mod_devicetable.h> #include <linux/init.h>
@@ -32,6 +33,9 @@#define SCH5627_REG_PRIMARY_ID 0x3f#define SCH5627_REG_CTRL 0x40 +#define SCH5627_CTRL_START BIT(0) +#define SCH5627_CTRL_VBAT BIT(4) +#define SCH5627_NO_TEMPS 8#define SCH5627_NO_FANS 4#define SCH5627_NO_IN 5
@@ -147,7 +151,8 @@ static int sch5627_update_in(struct sch5627_data *data)/* Trigger a Vbat voltage measurement every 5 minutes */ if (time_after (jiffies, data->last_battery +300 *HZ )) { -sch56xx_write_virtual_reg (data->addr,SCH5627_REG_CTRL , data->control |0x10 ); +sch56xx_write_virtual_reg (data->addr,SCH5627_REG_CTRL , + data->control |SCH5627_CTRL_VBAT ); data->last_battery = jiffies; }
@@ -483,14 +488,13 @@ static int sch5627_probe(struct platform_device *pdev)return val; data->control = val; -if (!(data->control &0x01 )) { +if (!(data->control &SCH5627_CTRL_START )) {pr_err ("hardware monitoring not enabled\n" );return -ENODEV ; }/* Trigger a Vbat voltage measurement, so that we get a valid reading the first time we read Vbat */ -sch56xx_write_virtual_reg (data->addr,SCH5627_REG_CTRL , - data->control |0x10 ); +sch56xx_write_virtual_reg (data->addr,SCH5627_REG_CTRL , data->control |SCH5627_CTRL_VBAT ); data->last_battery = jiffies;/*
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 113/379 hwmon: (sch5627) Disallow write access if virtual registers are locked
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit 7da8a635436029957c5350da3acf51d78ed64071 ]
When the lock bit inside SCH5627_REG_CTRL is set, then the virtual registers become read-only until the next power cycle. Disallow write access to those registers in such a case.
Tested on a Fujitsu Esprimo P720.
--- drivers/hwmon/sch5627.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/hwmon/sch5627.c +9 -0
@@ -34,6 +34,7 @@#define SCH5627_REG_CTRL 0x40#define SCH5627_CTRL_START BIT(0) +#define SCH5627_CTRL_LOCK BIT(1)#define SCH5627_CTRL_VBAT BIT(4)#define SCH5627_NO_TEMPS 8
@@ -231,6 +232,14 @@ static int reg_to_rpm(u16 reg)static umode_t sch5627_is_visible (const void *drvdata,enum hwmon_sensor_types type,u32 attr,int channel) { +const struct sch5627_data *data = drvdata; + +/* Once the lock bit is set, the virtual registers become read-only +* until the next power cycle. +*/ +if (data->control &SCH5627_CTRL_LOCK ) +return 0444 ; +if (type == hwmon_pwm && attr == hwmon_pwm_auto_channels_temp)return 0644 ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 114/379 hte: tegra: Fix missing error code in tegra_hte_test_probe()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harshit Mogalapalli <[email protected]>
[ Upstream commit b7c3ca3553d1de5e86c85636828e186d30cd0628 ]
The value of 'ret' is zero when of_hte_req_count() fails to get number of entitties to timestamp. And returning success(zero) on this failure path is incorrect.
--- drivers/hte/hte-tegra194-test.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/hte/hte-tegra194-test.c +3 -1
@@ -154,8 +154,10 @@ static int tegra_hte_test_probe(struct platform_device *pdev) } cnt =of_hte_req_count (hte.pdev); -if (cnt <0 ) +if (cnt <0 ) { + ret = cnt; goto free_irq; + }dev_info (&pdev->dev,"Total requested lines:%d\n" , cnt);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 115/379 drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Karlman <[email protected]>
[ Upstream commit 13fc28804bf10ca0b7bce3efbba95c534836d7ca ]
struct rockchip_crtc_state members such as output_type, output_bpc and enable_afbc is always reset to zero in the atomic_duplicate_state crtc funcs.
Fix this by using kmemdup on the subclass rockchip_crtc_state struct.
--- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/rockchip/rockchip_drm_vop.c +2 -1
@@ -1606,7 +1606,8 @@ static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc)if (WARN_ON (!crtc->state))return NULL ; - rockchip_state =kzalloc (sizeof (*rockchip_state),GFP_KERNEL ); + rockchip_state =kmemdup (to_rockchip_crtc_state (crtc->state), +sizeof (*rockchip_state),GFP_KERNEL );if (!rockchip_state)return NULL ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 116/379 drm/rockchip: vop: Fix call to crtc reset helper
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Karlman <[email protected]>
[ Upstream commit 5aacd290837828c089a83ac9795c74c4c9e2c923 ]
Allocation of crtc_state may fail in vop_crtc_reset, causing an invalid pointer to be passed to __drm_atomic_helper_crtc_reset.
Fix this by adding a NULL check of crtc_state, similar to other drivers.
--- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/rockchip/rockchip_drm_vop.c +4 -1
@@ -1632,7 +1632,10 @@ static void vop_crtc_reset(struct drm_crtc *crtc)if (crtc->state)vop_crtc_destroy_state (crtc, crtc->state); -__drm_atomic_helper_crtc_reset (crtc, &crtc_state->base); +if (crtc_state) +__drm_atomic_helper_crtc_reset (crtc, &crtc_state->base); +else +__drm_atomic_helper_crtc_reset (crtc,NULL ); }#ifdef CONFIG_DRM_ANALOGIX_DP
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 117/379 drm/rockchip: vop2: Dont crash for invalid duplicate_state
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Karlman <[email protected]>
[ Upstream commit 342f7e4967d02b0ec263b15916304fc54841b608 ]
It's possible for users to try to duplicate the CRTC state even when the state doesn't exist. drm_atomic_helper_crtc_duplicate_state() (and other users of __drm_atomic_helper_crtc_duplicate_state()) already guard this with a WARN_ON() instead of crashing, so let's do that here too.
--- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +5 -3
@@ -2094,11 +2094,13 @@ static void vop2_crtc_reset(struct drm_crtc *crtc)static struct drm_crtc_state *vop2_crtc_duplicate_state (struct drm_crtc *crtc) { -struct rockchip_crtc_state *vcstate, *old_vcstate; +struct rockchip_crtc_state *vcstate; - old_vcstate =to_rockchip_crtc_state (crtc->state); +if (WARN_ON (!crtc->state)) +return NULL ; - vcstate =kmemdup (old_vcstate,sizeof (*old_vcstate),GFP_KERNEL ); + vcstate =kmemdup (to_rockchip_crtc_state (crtc->state), +sizeof (*vcstate),GFP_KERNEL );if (!vcstate)return NULL ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 118/379 drm/rockchip: vop2: Add missing call to crtc reset helper
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Karlman <[email protected]>
[ Upstream commit 4d49d87b3606369c6e29b9d051892ee1a6fc4e75 ]
Add missing call to crtc reset helper to properly vblank reset.
Also move vop2_crtc_reset and call vop2_crtc_destroy_state to simplify and remove duplicated code.
--- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 31 +++++++++----------- 1 file changed, 14 insertions(+), 17 deletions(-)
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +14 -17
@@ -2075,23 +2075,6 @@ static const struct drm_crtc_helper_funcs vop2_crtc_helper_funcs = { .atomic_disable = vop2_crtc_atomic_disable, }; -static void vop2_crtc_reset (struct drm_crtc *crtc) -{ -struct rockchip_crtc_state *vcstate =to_rockchip_crtc_state (crtc->state); - -if (crtc->state) { -__drm_atomic_helper_crtc_destroy_state (crtc->state); -kfree (vcstate); - } - - vcstate =kzalloc (sizeof (*vcstate),GFP_KERNEL ); -if (!vcstate) -return ; - - crtc->state = &vcstate->base; - crtc->state->crtc = crtc; -} -static struct drm_crtc_state *vop2_crtc_duplicate_state (struct drm_crtc *crtc) {struct rockchip_crtc_state *vcstate;
@@ -2118,6 +2101,20 @@ static void vop2_crtc_destroy_state(struct drm_crtc *crtc,kfree (vcstate); } +static void vop2_crtc_reset (struct drm_crtc *crtc) +{ +struct rockchip_crtc_state *vcstate = +kzalloc (sizeof (*vcstate),GFP_KERNEL ); + +if (crtc->state) +vop2_crtc_destroy_state (crtc, crtc->state); + +if (vcstate) +__drm_atomic_helper_crtc_reset (crtc, &vcstate->base); +else +__drm_atomic_helper_crtc_reset (crtc,NULL ); +} +static const struct drm_crtc_funcs vop2_crtc_funcs = { .set_config = drm_atomic_helper_set_config, .page_flip = drm_atomic_helper_page_flip,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 119/379 drm/radeon: possible buffer overflow
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Meskhidze <[email protected]>
[ Upstream commit dd05484f99d16715a88eedfca363828ef9a4c2d4 ]
Buffer 'afmt_status' of size 6 could overflow, since index 'afmt_idx' is checked after access.
--- drivers/gpu/drm/radeon/evergreen.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/gpu/drm/radeon/evergreen.c +4 -3
@@ -4821,14 +4821,15 @@ int evergreen_irq_process(struct radeon_device *rdev)break ;case 44 :/* hdmi */ afmt_idx = src_data; -if (!(afmt_status[afmt_idx] &AFMT_AZ_FORMAT_WTRIG )) -DRM_DEBUG ("IH: IH event w/o asserted irq bit?\n" ); -if (afmt_idx >5 ) {DRM_ERROR ("Unhandled interrupt: %d %d\n" , src_id, src_data);break ; } + +if (!(afmt_status[afmt_idx] &AFMT_AZ_FORMAT_WTRIG )) +DRM_DEBUG ("IH: IH event w/o asserted irq bit?\n" ); + afmt_status[afmt_idx] &= ~AFMT_AZ_FORMAT_WTRIG ; queue_hdmi = true;DRM_DEBUG ("IH: HDMI%d\n" , afmt_idx +1 );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 120/379 drm: bridge: it66121: Fix invalid connector dereference
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jai Luthra <[email protected]>
[ Upstream commit d0375f6858c4ff7244b62b02eb5e93428e1916cd ]
Fix the NULL pointer dereference when no monitor is connected, and the sound card is opened from userspace.
Instead return an empty buffer (of zeroes) as the EDID information to the sound framework if there is no connector attached.
--- drivers/gpu/drm/bridge/ite-it66121.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/ite-it66121.c +8 -4
@@ -1464,10 +1464,14 @@ static int it66121_audio_get_eld(struct device *dev, void *data,struct it66121_ctx *ctx =dev_get_drvdata (dev);mutex_lock (&ctx->lock); - -memcpy (buf, ctx->connector->eld, -min (sizeof (ctx->connector->eld), len)); - +if (!ctx->connector) { +/* Pass en empty ELD if connector not available */ +dev_dbg (dev,"No connector present, passing empty EDID data" ); +memset (buf,0 , len); + }else { +memcpy (buf, ctx->connector->eld, +min (sizeof (ctx->connector->eld), len)); + }mutex_unlock (&ctx->lock);return 0 ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 121/379 drm/bridge: lt8912b: Add hot plug detection
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Eichenberger <[email protected]>
[ Upstream commit 3b0a01a6a5224ed9b3f69f44edaa889b2e2b9779 ]
Enable hot plug detection when it is available on the HDMI port. Without this connecting to a different monitor with incompatible timing before the 10 seconds poll period will lead to a broken display output.
Stable-dep-of: 941882a0e96d ("drm/bridge: lt8912b: Fix bridge_detach")
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +19 -2
@@ -516,14 +516,27 @@ static int lt8912_attach_dsi(struct lt8912 *lt)return 0 ; } +static void lt8912_bridge_hpd_cb (void *data,enum drm_connector_status status) +{ +struct lt8912 *lt = data; + +if (lt->bridge.dev) +drm_helper_hpd_irq_event (lt->bridge.dev); +} +static int lt8912_bridge_connector_init (struct drm_bridge *bridge) {int ret;struct lt8912 *lt =bridge_to_lt8912 (bridge);struct drm_connector *connector = <->connector; - connector->polled =DRM_CONNECTOR_POLL_CONNECT | -DRM_CONNECTOR_POLL_DISCONNECT ; +if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD ) { +drm_bridge_hpd_enable (lt->hdmi_port, lt8912_bridge_hpd_cb, lt); + connector->polled =DRM_CONNECTOR_POLL_HPD ; + }else { + connector->polled =DRM_CONNECTOR_POLL_CONNECT | +DRM_CONNECTOR_POLL_DISCONNECT ; + } ret = drm_connector_init(bridge->dev, connector, <8912_connector_funcs,
@@ -577,6 +590,10 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge)if (lt->is_attached) {lt8912_hard_power_off (lt); + +if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD ) +drm_bridge_hpd_disable (lt->hdmi_port); +drm_connector_unregister (<->connector);drm_connector_cleanup (<->connector); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 122/379 drm/bridge: lt8912b: Fix bridge_detach
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 941882a0e96d245f38116e940912b404b6a93c6f ]
The driver calls lt8912_bridge_detach() from its lt8912_remove() function. As the DRM core detaches bridges automatically, this leads to calling lt8912_bridge_detach() twice. The code probably has tried to manage the double-call with the 'is_attached' variable, but the driver never sets the variable to false, so its of no help.
Fix the issue by dropping the call to lt8912_bridge_detach() from lt8912_remove(), as the DRM core will handle the detach call for us, and also drop the useless is_attached field.
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +5 -11
@@ -45,7 +45,6 @@ struct lt8912 {u8 data_lanes;bool is_power_on; -bool is_attached; };static int lt8912_write_init_config (struct lt8912 *lt)
@@ -575,8 +574,6 @@ static int lt8912_bridge_attach(struct drm_bridge *bridge,if (ret) goto error; - lt->is_attached = true; -return 0 ; error:
@@ -588,15 +585,13 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge) {struct lt8912 *lt =bridge_to_lt8912 (bridge); -if (lt->is_attached) { -lt8912_hard_power_off (lt); +lt8912_hard_power_off (lt); -if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD ) -drm_bridge_hpd_disable (lt->hdmi_port); +if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD ) +drm_bridge_hpd_disable (lt->hdmi_port); -drm_connector_unregister (<->connector); -drm_connector_cleanup (<->connector); - } +drm_connector_unregister (<->connector); +drm_connector_cleanup (<->connector); } static enum drm_connector_status
@@ -751,7 +746,6 @@ static void lt8912_remove(struct i2c_client *client) {struct lt8912 *lt =i2c_get_clientdata (client); -lt8912_bridge_detach (<->bridge);drm_bridge_remove (<->bridge);lt8912_free_i2c (lt);lt8912_put_dt (lt);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 123/379 drm/bridge: lt8912b: Fix crash on bridge detach
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 44283993144a03af9df31934d6c32bbd42d1a347 ]
The lt8912b driver, in its bridge detach function, calls drm_connector_unregister() and drm_connector_cleanup().
drm_connector_unregister() should be called only for connectors explicitly registered with drm_connector_register(), which is not the case in lt8912b.
The driver's drm_connector_funcs.destroy hook is set to drm_connector_cleanup().
Thus the driver should not call either drm_connector_unregister() nor drm_connector_cleanup() in its lt8912_bridge_detach(), as they cause a crash on bridge detach:
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
Mem abort info:
ESR = 0x0000000096000006
EC = 0x25: DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
FSC = 0x06: level 2 translation fault
Data abort info:
ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000
CM = 0, WnR = 0, TnD = 0, TagAccess = 0
GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=00000000858f3000
[0000000000000000] pgd=0800000085918003, p4d=0800000085918003, pud=0800000085431003, pmd=0000000000000000
Internal error: Oops: 0000000096000006 [#1] PREEMPT SMP Modules linked in: tidss(-) display_connector lontium_lt8912b tc358768 panel_lvds panel_simple drm_dma_helper drm_kms_helper drm drm_panel_orientation_quirks CPU: 3 PID: 462 Comm: rmmod Tainted: G W 6.5.0-rc2+ #2 Hardware name: Toradex Verdin AM62 on Verdin Development Board (DT) pstate: 80000005 (Nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : drm_connector_cleanup+0x78/0x2d4 [drm] lr : lt8912_bridge_detach+0x54/0x6c [lontium_lt8912b]
sp : ffff800082ed3a90
x29: ffff800082ed3a90 x28: ffff0000040c1940 x27: 0000000000000000
x26: 0000000000000000 x25: dead000000000122 x24: dead000000000122
x23: dead000000000100 x22: ffff000003fb6388 x21: 0000000000000000
x20: 0000000000000000 x19: ffff000003fb6260 x18: fffffffffffe56e8
x17: 0000000000000000 x16: 0010000000000000 x15: 0000000000000038
x14: 0000000000000000 x13: ffff800081914b48 x12: 000000000000040e
x11: 000000000000015a x10: ffff80008196ebb8 x9 : ffff800081914b48 x8 : 00000000ffffefff x7 : ffff0000040c1940 x6 : ffff80007aa649d0 x5 : 0000000000000000 x4 : 0000000000000001 x3 : ffff80008159e008 x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000
Call trace: drm_connector_cleanup+0x78/0x2d4 [drm] lt8912_bridge_detach+0x54/0x6c [lontium_lt8912b] drm_bridge_detach+0x44/0x84 [drm] drm_encoder_cleanup+0x40/0xb8 [drm] drmm_encoder_alloc_release+0x1c/0x30 [drm] drm_managed_release+0xac/0x148 [drm] drm_dev_put.part.0+0x88/0xb8 [drm] devm_drm_dev_init_release+0x14/0x24 [drm] devm_action_release+0x14/0x20 release_nodes+0x5c/0x90 devres_release_all+0x8c/0xe0 device_unbind_cleanup+0x18/0x68 device_release_driver_internal+0x208/0x23c driver_detach+0x4c/0x94 bus_remove_driver+0x70/0xf4 driver_unregister+0x30/0x60 platform_driver_unregister+0x14/0x20 tidss_platform_driver_exit+0x18/0xb2c [tidss] __arm64_sys_delete_module+0x1a0/0x2b4 invoke_syscall+0x48/0x110 el0_svc_common.constprop.0+0x60/0x10c do_el0_svc_compat+0x1c/0x40 el0_svc_compat+0x40/0xac el0t_32_sync_handler+0xb0/0x138 el0t_32_sync+0x194/0x198 Code: 9104a276 f2fbd5b7 aa0203e1 91008af8 (f85c0420)
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 3 --- 1 file changed, 3 deletions(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +0 -3
@@ -589,9 +589,6 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge)if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD )drm_bridge_hpd_disable (lt->hdmi_port); - -drm_connector_unregister (<->connector); -drm_connector_cleanup (<->connector); } static enum drm_connector_status
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 124/379 drm/bridge: lt8912b: Manually disable HPD only if it was enabled
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 6985c5efc4057bc79137807295d84ada3123d051 ]
lt8912b only calls drm_bridge_hpd_enable() if it creates a connector and the next bridge has DRM_BRIDGE_OP_HPD set. However, when calling drm_bridge_hpd_disable() it misses checking if a connector was created, calling drm_bridge_hpd_disable() even if HPD was never enabled. I don't see any issues caused by this wrong call, though.
Add the check to avoid wrongly calling drm_bridge_hpd_disable().
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +1 -1
@@ -587,7 +587,7 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge)lt8912_hard_power_off (lt); -if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD ) +if (lt->connector.dev && lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD )drm_bridge_hpd_disable (lt->hdmi_port); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 125/379 drm/bridge: lt8912b: Add missing drm_bridge_attach call
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit f45acf7acf75921c0409d452f0165f51a19a74fd ]
The driver does not call drm_bridge_attach(), which causes the next bridge to not be added to the bridge chain. This causes the pipeline init to fail when DRM_BRIDGE_ATTACH_NO_CONNECTOR is used.
Add the call to drm_bridge_attach().
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/bridge/lontium-lt8912b.c +7 -0
@@ -558,6 +558,13 @@ static int lt8912_bridge_attach(struct drm_bridge *bridge,struct lt8912 *lt =bridge_to_lt8912 (bridge);int ret; + ret =drm_bridge_attach (bridge->encoder, lt->hdmi_port, bridge, +DRM_BRIDGE_ATTACH_NO_CONNECTOR ); +if (ret <0 ) { +dev_err (lt->dev,"Failed to attach next bridge (%d)\n" , ret); +return ret; + } +if (!(flags &DRM_BRIDGE_ATTACH_NO_CONNECTOR )) { ret =lt8912_bridge_connector_init (bridge);if (ret) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 126/379 drm/bridge: tc358768: Fix use of uninitialized variable
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit a2d9036615f0adfa5b0a46bb2ce42ef1d9a04fbe ]
smatch reports:
drivers/gpu/drm/bridge/tc358768.c:223 tc358768_update_bits() error: uninitialized symbol 'orig'.
Fix this by bailing out from tc358768_update_bits() if the tc358768_read() produces an error.
--- drivers/gpu/drm/bridge/tc358768.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/bridge/tc358768.c +4 -0
@@ -217,6 +217,10 @@ static void tc358768_update_bits(struct tc358768_priv *priv, u32 reg, u32 mask,u32 tmp, orig;tc358768_read (priv, reg, &orig); + +if (priv->error) +return ; + tmp = orig & ~mask; tmp |= val & mask;if (tmp != orig)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 127/379 drm/bridge: tc358768: Fix bit updates
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 66962d5c3c51377b9b90cae35b7e038950438e02 ]
The driver has a few places where it does:
if (thing_is_enabled_in_config)
update_thing_bit_in_hw()
This means that if the thing is _not_ enabled, the bit never gets cleared. This affects the h/vsyncs and continuous DSI clock bits.
Fix the driver to always update the bit.
--- drivers/gpu/drm/bridge/tc358768.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/gpu/drm/bridge/tc358768.c +7 -6
@@ -797,8 +797,8 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) val |=BIT (i +1 );tc358768_write (priv,TC358768_HSTXVREGEN , val); -if (!(mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS )) -tc358768_write (priv,TC358768_TXOPTIONCNTRL ,0x1 ); +tc358768_write (priv,TC358768_TXOPTIONCNTRL , + (mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS ) ?0 :BIT (0 ));/* TXTAGOCNT[26:16] RXTASURECNT[10:0] */ val =tc358768_to_ns ((lptxcnt +1 ) * dsibclk_nsk *4 );
@@ -864,11 +864,12 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)tc358768_write (priv,TC358768_DSI_HACT , hact);/* VSYNC polarity */ -if (!(mode->flags &DRM_MODE_FLAG_NVSYNC )) -tc358768_update_bits (priv,TC358768_CONFCTL ,BIT (5 ),BIT (5 )); +tc358768_update_bits (priv,TC358768_CONFCTL ,BIT (5 ), + (mode->flags &DRM_MODE_FLAG_PVSYNC ) ?BIT (5 ) :0 ); +/* HSYNC polarity */ -if (mode->flags &DRM_MODE_FLAG_PHSYNC ) -tc358768_update_bits (priv,TC358768_PP_MISC ,BIT (0 ),BIT (0 )); +tc358768_update_bits (priv,TC358768_PP_MISC ,BIT (0 ), + (mode->flags &DRM_MODE_FLAG_PHSYNC ) ?BIT (0 ) :0 );/* Start DSI Tx */ tc358768_write (priv,TC358768_DSI_START ,0x1 );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 128/379 drm/bridge: tc358768: remove unused variable
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Francesco Dolcini <[email protected]>
[ Upstream commit e4a5e4442a8065c6959e045c061de801d545226d ]
Remove the unused phy_delay_nsk variable, before it was wrongly used to compute some register value, the fixed computation is no longer using it and therefore can be removed.
Stable-dep-of: f1dabbe64506 ("drm/bridge: tc358768: Fix tc358768_ns_to_cnt()")
--- drivers/gpu/drm/bridge/tc358768.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/gpu/drm/bridge/tc358768.c +1 -3
@@ -647,7 +647,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)u32 val, val2, lptxcnt, hact, data_type;s32 raw_val;const struct drm_display_mode *mode; -u32 dsibclk_nsk, dsiclk_nsk, ui_nsk, phy_delay_nsk; +u32 dsibclk_nsk, dsiclk_nsk, ui_nsk;u32 dsiclk, dsibclk, video_start;const u32 internal_delay =40 ;int ret, i;
@@ -731,11 +731,9 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) dsibclk); dsiclk_nsk = (u32 )div_u64 ((u64 )1000000000 *TC358768_PRECISION , dsiclk); ui_nsk = dsiclk_nsk /2 ; - phy_delay_nsk = dsibclk_nsk +2 * dsiclk_nsk;dev_dbg (priv->dev,"dsiclk_nsk: %u\n" , dsiclk_nsk);dev_dbg (priv->dev,"ui_nsk: %u\n" , ui_nsk);dev_dbg (priv->dev,"dsibclk_nsk: %u\n" , dsibclk_nsk); -dev_dbg (priv->dev,"phy_delay_nsk: %u\n" , phy_delay_nsk);/* LP11 > 100us for D-PHY Rx Init */ val =tc358768_ns_to_cnt (100 *1000 , dsibclk_nsk) -1 ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 129/379 drm/bridge: tc358768: Use struct videomode
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit e5fb21678136a9d009d5c43821881eb4c34fae97 ]
The TC358768 documentation uses HFP, HBP, etc. values to deal with the video mode, while the driver currently uses the DRM display mode (htotal, hsync_start, etc).
Change the driver to convert the DRM display mode to struct videomode, which then allows us to use the same units the documentation uses. This makes it much easier to work on the code when using the TC358768 documentation as a reference.
Stable-dep-of: f1dabbe64506 ("drm/bridge: tc358768: Fix tc358768_ns_to_cnt()")
--- drivers/gpu/drm/bridge/tc358768.c | 45 ++++++++++++++++--------------- 1 file changed, 24 insertions(+), 21 deletions(-)
drivers/gpu/drm/bridge/tc358768.c +24 -21
@@ -651,6 +651,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)u32 dsiclk, dsibclk, video_start;const u32 internal_delay =40 ;int ret, i; +struct videomode vm;if (mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS ) {dev_warn_once (priv->dev,"Non-continuous mode unimplemented, falling back to continuous\n" );
@@ -674,6 +675,8 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)return ; } +drm_display_mode_to_videomode (mode, &vm); + dsiclk = priv->dsiclk; dsibclk = dsiclk /4 ;
@@ -682,28 +685,28 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)switch (dsi_dev->format) {case MIPI_DSI_FMT_RGB888 : val |= (0x3 <<4 ); - hact = mode->hdisplay *3 ; - video_start = (mode->htotal - mode->hsync_start) *3 ; + hact = vm.hactive *3 ; + video_start = (vm.hsync_len + vm.hback_porch) *3 ; data_type =MIPI_DSI_PACKED_PIXEL_STREAM_24 ;break ;case MIPI_DSI_FMT_RGB666 : val |= (0x4 <<4 ); - hact = mode->hdisplay *3 ; - video_start = (mode->htotal - mode->hsync_start) *3 ; + hact = vm.hactive *3 ; + video_start = (vm.hsync_len + vm.hback_porch) *3 ; data_type =MIPI_DSI_PACKED_PIXEL_STREAM_18 ;break ;case MIPI_DSI_FMT_RGB666_PACKED : val |= (0x4 <<4 ) |BIT (3 ); - hact = mode->hdisplay *18 /8 ; - video_start = (mode->htotal - mode->hsync_start) *18 /8 ; + hact = vm.hactive *18 /8 ; + video_start = (vm.hsync_len + vm.hback_porch) *18 /8 ; data_type =MIPI_DSI_PIXEL_STREAM_3BYTE_18 ;break ;case MIPI_DSI_FMT_RGB565 : val |= (0x5 <<4 ); - hact = mode->hdisplay *2 ; - video_start = (mode->htotal - mode->hsync_start) *2 ; + hact = vm.hactive *2 ; + video_start = (vm.hsync_len + vm.hback_porch) *2 ; data_type =MIPI_DSI_PACKED_PIXEL_STREAM_16 ;break ;default :
@@ -815,43 +818,43 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)tc358768_write (priv,TC358768_DSI_EVENT ,0 );/* vact */ -tc358768_write (priv,TC358768_DSI_VACT , mode->vdisplay); +tc358768_write (priv,TC358768_DSI_VACT , vm.vactive);/* vsw */ -tc358768_write (priv,TC358768_DSI_VSW , - mode->vsync_end - mode->vsync_start); +tc358768_write (priv,TC358768_DSI_VSW , vm.vsync_len); +/* vbp */ -tc358768_write (priv,TC358768_DSI_VBPR , - mode->vtotal - mode->vsync_end); +tc358768_write (priv,TC358768_DSI_VBPR , vm.vback_porch);/* hsw * byteclk * ndl / pclk */ - val = (u32 )div_u64 ((mode->hsync_end - mode->hsync_start) * + val = (u32 )div_u64 (vm.hsync_len * ((u64 )priv->dsiclk /4 ) * priv->dsi_lanes, - mode->clock *1000 ); + vm.pixelclock);tc358768_write (priv,TC358768_DSI_HSW , val);/* hbp * byteclk * ndl / pclk */ - val = (u32 )div_u64 ((mode->htotal - mode->hsync_end) * + val = (u32 )div_u64 (vm.hback_porch * ((u64 )priv->dsiclk /4 ) * priv->dsi_lanes, - mode->clock *1000 ); + vm.pixelclock);tc358768_write (priv,TC358768_DSI_HBPR , val); }else {/* Set event mode */ tc358768_write (priv,TC358768_DSI_EVENT ,1 );/* vact */ -tc358768_write (priv,TC358768_DSI_VACT , mode->vdisplay); +tc358768_write (priv,TC358768_DSI_VACT , vm.vactive);/* vsw (+ vbp) */ tc358768_write (priv,TC358768_DSI_VSW , - mode->vtotal - mode->vsync_start); + vm.vsync_len + vm.vback_porch); +/* vbp (not used in event mode) */ tc358768_write (priv,TC358768_DSI_VBPR ,0 );/* (hsw + hbp) * byteclk * ndl / pclk */ - val = (u32 )div_u64 ((mode->htotal - mode->hsync_start) * + val = (u32 )div_u64 ((vm.hsync_len + vm.hback_porch) * ((u64 )priv->dsiclk /4 ) * priv->dsi_lanes, - mode->clock *1000 ); + vm.pixelclock);tc358768_write (priv,TC358768_DSI_HSW , val);/* hbp (not used in event mode) */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 130/379 drm/bridge: tc358768: Print logical values, not raw register values
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 013ea98cdfccef3b7c38b087c1f629488d2ef683 ]
The driver debug prints DSI related timings as raw register values in hex. It is much more useful to see the "logical" value of the timing, not the register value.
Change the prints to print the values separately, in case a single register contains multiple values, and use %u to have it in a more human consumable form.
Stable-dep-of: f1dabbe64506 ("drm/bridge: tc358768: Fix tc358768_ns_to_cnt()")
--- drivers/gpu/drm/bridge/tc358768.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
drivers/gpu/drm/bridge/tc358768.c +12 -9
@@ -740,57 +740,59 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)/* LP11 > 100us for D-PHY Rx Init */ val =tc358768_ns_to_cnt (100 *1000 , dsibclk_nsk) -1 ; -dev_dbg (priv->dev,"LINEINITCNT: 0x%x\n" , val); +dev_dbg (priv->dev,"LINEINITCNT: %u\n" , val);tc358768_write (priv,TC358768_LINEINITCNT , val);/* LPTimeCnt > 50ns */ val =tc358768_ns_to_cnt (50 , dsibclk_nsk) -1 ; lptxcnt = val; -dev_dbg (priv->dev,"LPTXTIMECNT: 0x%x\n" , val); +dev_dbg (priv->dev,"LPTXTIMECNT: %u\n" , val);tc358768_write (priv,TC358768_LPTXTIMECNT , val);/* 38ns < TCLK_PREPARE < 95ns */ val =tc358768_ns_to_cnt (65 , dsibclk_nsk) -1 ; +dev_dbg (priv->dev,"TCLK_PREPARECNT %u\n" , val);/* TCLK_PREPARE + TCLK_ZERO > 300ns */ val2 =tc358768_ns_to_cnt (300 -tc358768_to_ns (2 * ui_nsk), dsibclk_nsk) -2 ; +dev_dbg (priv->dev,"TCLK_ZEROCNT %u\n" , val2); val |= val2 <<8 ; -dev_dbg (priv->dev,"TCLK_HEADERCNT: 0x%x\n" , val);tc358768_write (priv,TC358768_TCLK_HEADERCNT , val);/* TCLK_TRAIL > 60ns AND TEOT <= 105 ns + 12*UI */ raw_val =tc358768_ns_to_cnt (60 +tc358768_to_ns (2 * ui_nsk), dsibclk_nsk) -5 ; val =clamp (raw_val,0 ,127 ); -dev_dbg (priv->dev,"TCLK_TRAILCNT: 0x%x\n" , val); +dev_dbg (priv->dev,"TCLK_TRAILCNT: %u\n" , val);tc358768_write (priv,TC358768_TCLK_TRAILCNT , val);/* 40ns + 4*UI < THS_PREPARE < 85ns + 6*UI */ val =50 +tc358768_to_ns (4 * ui_nsk); val =tc358768_ns_to_cnt (val, dsibclk_nsk) -1 ; +dev_dbg (priv->dev,"THS_PREPARECNT %u\n" , val);/* THS_PREPARE + THS_ZERO > 145ns + 10*UI */ raw_val =tc358768_ns_to_cnt (145 -tc358768_to_ns (3 * ui_nsk), dsibclk_nsk) -10 ; val2 =clamp (raw_val,0 ,127 ); +dev_dbg (priv->dev,"THS_ZEROCNT %u\n" , val2); val |= val2 <<8 ; -dev_dbg (priv->dev,"THS_HEADERCNT: 0x%x\n" , val);tc358768_write (priv,TC358768_THS_HEADERCNT , val);/* TWAKEUP > 1ms in lptxcnt steps */ val =tc358768_ns_to_cnt (1020000 , dsibclk_nsk); val = val / (lptxcnt +1 ) -1 ; -dev_dbg (priv->dev,"TWAKEUP: 0x%x\n" , val); +dev_dbg (priv->dev,"TWAKEUP: %u\n" , val);tc358768_write (priv,TC358768_TWAKEUP , val);/* TCLK_POSTCNT > 60ns + 52*UI */ val =tc358768_ns_to_cnt (60 +tc358768_to_ns (52 * ui_nsk), dsibclk_nsk) -3 ; -dev_dbg (priv->dev,"TCLK_POSTCNT: 0x%x\n" , val); +dev_dbg (priv->dev,"TCLK_POSTCNT: %u\n" , val);tc358768_write (priv,TC358768_TCLK_POSTCNT , val);/* max(60ns + 4*UI, 8*UI) < THS_TRAILCNT < 105ns + 12*UI */ raw_val =tc358768_ns_to_cnt (60 +tc358768_to_ns (18 * ui_nsk), dsibclk_nsk) -4 ; val =clamp (raw_val,0 ,15 ); -dev_dbg (priv->dev,"THS_TRAILCNT: 0x%x\n" , val); +dev_dbg (priv->dev,"THS_TRAILCNT: %u\n" , val);tc358768_write (priv,TC358768_THS_TRAILCNT , val); val =BIT (0 );
@@ -804,10 +806,11 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)/* TXTAGOCNT[26:16] RXTASURECNT[10:0] */ val =tc358768_to_ns ((lptxcnt +1 ) * dsibclk_nsk *4 ); val =tc358768_ns_to_cnt (val, dsibclk_nsk) /4 -1 ; +dev_dbg (priv->dev,"TXTAGOCNT: %u\n" , val); val2 =tc358768_ns_to_cnt (tc358768_to_ns ((lptxcnt +1 ) * dsibclk_nsk), dsibclk_nsk) -2 ; +dev_dbg (priv->dev,"RXTASURECNT: %u\n" , val2); val = val <<16 | val2; -dev_dbg (priv->dev,"BTACNTRL1: 0x%x\n" , val);tc358768_write (priv,TC358768_BTACNTRL1 , val);/* START[0] */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 131/379 drm/bridge: tc358768: Use dev for dbg prints, not priv->dev
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 89cfd50e13f1bead4350998a3a77422bef1ee0a5 ]
Simplify the code by capturing the priv->dev value to dev variable, and use it.
Stable-dep-of: f1dabbe64506 ("drm/bridge: tc358768: Fix tc358768_ns_to_cnt()")
--- drivers/gpu/drm/bridge/tc358768.c | 41 ++++++++++++++++--------------- 1 file changed, 21 insertions(+), 20 deletions(-)
drivers/gpu/drm/bridge/tc358768.c +21 -20
@@ -652,9 +652,10 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)const u32 internal_delay =40 ;int ret, i;struct videomode vm; +struct device *dev = priv->dev;if (mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS ) { -dev_warn_once (priv->dev,"Non-continuous mode unimplemented, falling back to continuous\n" ); +dev_warn_once (dev,"Non-continuous mode unimplemented, falling back to continuous\n" ); mode_flags &= ~MIPI_DSI_CLOCK_NON_CONTINUOUS ; }
@@ -662,7 +663,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) ret =tc358768_sw_reset (priv);if (ret) { -dev_err (priv->dev,"Software reset failed: %d\n" , ret); +dev_err (dev,"Software reset failed: %d\n" , ret);tc358768_hw_disable (priv);return ; }
@@ -670,7 +671,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) mode = &bridge->encoder->crtc->state->adjusted_mode; ret =tc358768_setup_pll (priv, mode);if (ret) { -dev_err (priv->dev,"PLL setup failed: %d\n" , ret); +dev_err (dev,"PLL setup failed: %d\n" , ret);tc358768_hw_disable (priv);return ; }
@@ -710,7 +711,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) data_type =MIPI_DSI_PACKED_PIXEL_STREAM_16 ;break ;default : -dev_err (priv->dev,"Invalid data format (%u)\n" , +dev_err (dev,"Invalid data format (%u)\n" , dsi_dev->format);tc358768_hw_disable (priv);return ;
@@ -734,65 +735,65 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) dsibclk); dsiclk_nsk = (u32 )div_u64 ((u64 )1000000000 *TC358768_PRECISION , dsiclk); ui_nsk = dsiclk_nsk /2 ; -dev_dbg (priv->dev,"dsiclk_nsk: %u\n" , dsiclk_nsk); -dev_dbg (priv->dev,"ui_nsk: %u\n" , ui_nsk); -dev_dbg (priv->dev,"dsibclk_nsk: %u\n" , dsibclk_nsk); +dev_dbg (dev,"dsiclk_nsk: %u\n" , dsiclk_nsk); +dev_dbg (dev,"ui_nsk: %u\n" , ui_nsk); +dev_dbg (dev,"dsibclk_nsk: %u\n" , dsibclk_nsk);/* LP11 > 100us for D-PHY Rx Init */ val =tc358768_ns_to_cnt (100 *1000 , dsibclk_nsk) -1 ; -dev_dbg (priv->dev,"LINEINITCNT: %u\n" , val); +dev_dbg (dev,"LINEINITCNT: %u\n" , val);tc358768_write (priv,TC358768_LINEINITCNT , val);/* LPTimeCnt > 50ns */ val =tc358768_ns_to_cnt (50 , dsibclk_nsk) -1 ; lptxcnt = val; -dev_dbg (priv->dev,"LPTXTIMECNT: %u\n" , val); +dev_dbg (dev,"LPTXTIMECNT: %u\n" , val);tc358768_write (priv,TC358768_LPTXTIMECNT , val);/* 38ns < TCLK_PREPARE < 95ns */ val =tc358768_ns_to_cnt (65 , dsibclk_nsk) -1 ; -dev_dbg (priv->dev,"TCLK_PREPARECNT %u\n" , val); +dev_dbg (dev,"TCLK_PREPARECNT %u\n" , val);/* TCLK_PREPARE + TCLK_ZERO > 300ns */ val2 =tc358768_ns_to_cnt (300 -tc358768_to_ns (2 * ui_nsk), dsibclk_nsk) -2 ; -dev_dbg (priv->dev,"TCLK_ZEROCNT %u\n" , val2); +dev_dbg (dev,"TCLK_ZEROCNT %u\n" , val2); val |= val2 <<8 ;tc358768_write (priv,TC358768_TCLK_HEADERCNT , val);/* TCLK_TRAIL > 60ns AND TEOT <= 105 ns + 12*UI */ raw_val =tc358768_ns_to_cnt (60 +tc358768_to_ns (2 * ui_nsk), dsibclk_nsk) -5 ; val =clamp (raw_val,0 ,127 ); -dev_dbg (priv->dev,"TCLK_TRAILCNT: %u\n" , val); +dev_dbg (dev,"TCLK_TRAILCNT: %u\n" , val);tc358768_write (priv,TC358768_TCLK_TRAILCNT , val);/* 40ns + 4*UI < THS_PREPARE < 85ns + 6*UI */ val =50 +tc358768_to_ns (4 * ui_nsk); val =tc358768_ns_to_cnt (val, dsibclk_nsk) -1 ; -dev_dbg (priv->dev,"THS_PREPARECNT %u\n" , val); +dev_dbg (dev,"THS_PREPARECNT %u\n" , val);/* THS_PREPARE + THS_ZERO > 145ns + 10*UI */ raw_val =tc358768_ns_to_cnt (145 -tc358768_to_ns (3 * ui_nsk), dsibclk_nsk) -10 ; val2 =clamp (raw_val,0 ,127 ); -dev_dbg (priv->dev,"THS_ZEROCNT %u\n" , val2); +dev_dbg (dev,"THS_ZEROCNT %u\n" , val2); val |= val2 <<8 ;tc358768_write (priv,TC358768_THS_HEADERCNT , val);/* TWAKEUP > 1ms in lptxcnt steps */ val =tc358768_ns_to_cnt (1020000 , dsibclk_nsk); val = val / (lptxcnt +1 ) -1 ; -dev_dbg (priv->dev,"TWAKEUP: %u\n" , val); +dev_dbg (dev,"TWAKEUP: %u\n" , val);tc358768_write (priv,TC358768_TWAKEUP , val);/* TCLK_POSTCNT > 60ns + 52*UI */ val =tc358768_ns_to_cnt (60 +tc358768_to_ns (52 * ui_nsk), dsibclk_nsk) -3 ; -dev_dbg (priv->dev,"TCLK_POSTCNT: %u\n" , val); +dev_dbg (dev,"TCLK_POSTCNT: %u\n" , val);tc358768_write (priv,TC358768_TCLK_POSTCNT , val);/* max(60ns + 4*UI, 8*UI) < THS_TRAILCNT < 105ns + 12*UI */ raw_val =tc358768_ns_to_cnt (60 +tc358768_to_ns (18 * ui_nsk), dsibclk_nsk) -4 ; val =clamp (raw_val,0 ,15 ); -dev_dbg (priv->dev,"THS_TRAILCNT: %u\n" , val); +dev_dbg (dev,"THS_TRAILCNT: %u\n" , val);tc358768_write (priv,TC358768_THS_TRAILCNT , val); val =BIT (0 );
@@ -806,10 +807,10 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)/* TXTAGOCNT[26:16] RXTASURECNT[10:0] */ val =tc358768_to_ns ((lptxcnt +1 ) * dsibclk_nsk *4 ); val =tc358768_ns_to_cnt (val, dsibclk_nsk) /4 -1 ; -dev_dbg (priv->dev,"TXTAGOCNT: %u\n" , val); +dev_dbg (dev,"TXTAGOCNT: %u\n" , val); val2 =tc358768_ns_to_cnt (tc358768_to_ns ((lptxcnt +1 ) * dsibclk_nsk), dsibclk_nsk) -2 ; -dev_dbg (priv->dev,"RXTASURECNT: %u\n" , val2); +dev_dbg (dev,"RXTASURECNT: %u\n" , val2); val = val <<16 | val2;tc358768_write (priv,TC358768_BTACNTRL1 , val);
@@ -903,7 +904,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) ret =tc358768_clear_error (priv);if (ret) { -dev_err (priv->dev,"Bridge pre_enable failed: %d\n" , ret); +dev_err (dev,"Bridge pre_enable failed: %d\n" , ret);tc358768_bridge_disable (bridge);tc358768_bridge_post_disable (bridge); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 132/379 drm/bridge: tc358768: Rename dsibclk to hsbyteclk
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 699cf62a7d4550759f4a50e614b1952f93de4783 ]
The Toshiba documentation talks about HSByteClk when referring to the DSI HS byte clock, whereas the driver uses 'dsibclk' name. Also, in a few places the driver calculates the byte clock from the DSI clock, even if the byte clock is already available in a variable.
To align the driver with the documentation, change the 'dsibclk' variable to 'hsbyteclk'. This also make it easier to visually separate 'dsibclk' and 'dsiclk' variables.
Stable-dep-of: f1dabbe64506 ("drm/bridge: tc358768: Fix tc358768_ns_to_cnt()")
--- drivers/gpu/drm/bridge/tc358768.c | 48 +++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-)
drivers/gpu/drm/bridge/tc358768.c +24 -24
@@ -605,7 +605,7 @@ static int tc358768_setup_pll(struct tc358768_priv *priv,dev_dbg (priv->dev,"PLL: refclk %lu, fbd %u, prd %u, frs %u\n" ,clk_get_rate (priv->refclk), fbd, prd, frs); -dev_dbg (priv->dev,"PLL: pll_clk: %u, DSIClk %u, DSIByteClk %u\n" , +dev_dbg (priv->dev,"PLL: pll_clk: %u, DSIClk %u, HSByteClk %u\n" , priv->dsiclk *2 , priv->dsiclk, priv->dsiclk /4 ); dev_dbg(priv->dev, "PLL: pclk %u (panel: %u)\n", tc358768_pll_to_pclk(priv, priv->dsiclk * 2),
@@ -647,8 +647,8 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)u32 val, val2, lptxcnt, hact, data_type;s32 raw_val;const struct drm_display_mode *mode; -u32 dsibclk_nsk, dsiclk_nsk, ui_nsk; -u32 dsiclk, dsibclk, video_start; +u32 hsbyteclk_nsk, dsiclk_nsk, ui_nsk; +u32 dsiclk, hsbyteclk, video_start;const u32 internal_delay =40 ;int ret, i;struct videomode vm;
@@ -679,7 +679,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)drm_display_mode_to_videomode (mode, &vm); dsiclk = priv->dsiclk; - dsibclk = dsiclk /4 ; + hsbyteclk = dsiclk /4 ;/* Data Format Control Register */ val =BIT (2 ) |BIT (1 ) |BIT (0 );/* rdswap_en | dsitx_en | txdt_en */
@@ -731,67 +731,67 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)tc358768_write (priv,TC358768_D0W_CNTRL + i *4 ,0x0000 );/* DSI Timings */ - dsibclk_nsk = (u32 )div_u64 ((u64 )1000000000 *TC358768_PRECISION , - dsibclk); + hsbyteclk_nsk = (u32 )div_u64 ((u64 )1000000000 *TC358768_PRECISION , + hsbyteclk); dsiclk_nsk = (u32 )div_u64 ((u64 )1000000000 *TC358768_PRECISION , dsiclk); ui_nsk = dsiclk_nsk /2 ;dev_dbg (dev,"dsiclk_nsk: %u\n" , dsiclk_nsk);dev_dbg (dev,"ui_nsk: %u\n" , ui_nsk); -dev_dbg (dev,"dsibclk_nsk: %u\n" , dsibclk_nsk); +dev_dbg (dev,"hsbyteclk_nsk: %u\n" , hsbyteclk_nsk);/* LP11 > 100us for D-PHY Rx Init */ - val =tc358768_ns_to_cnt (100 *1000 , dsibclk_nsk) -1 ; + val =tc358768_ns_to_cnt (100 *1000 , hsbyteclk_nsk) -1 ;dev_dbg (dev,"LINEINITCNT: %u\n" , val);tc358768_write (priv,TC358768_LINEINITCNT , val);/* LPTimeCnt > 50ns */ - val =tc358768_ns_to_cnt (50 , dsibclk_nsk) -1 ; + val =tc358768_ns_to_cnt (50 , hsbyteclk_nsk) -1 ; lptxcnt = val;dev_dbg (dev,"LPTXTIMECNT: %u\n" , val);tc358768_write (priv,TC358768_LPTXTIMECNT , val);/* 38ns < TCLK_PREPARE < 95ns */ - val =tc358768_ns_to_cnt (65 , dsibclk_nsk) -1 ; + val =tc358768_ns_to_cnt (65 , hsbyteclk_nsk) -1 ;dev_dbg (dev,"TCLK_PREPARECNT %u\n" , val);/* TCLK_PREPARE + TCLK_ZERO > 300ns */ val2 =tc358768_ns_to_cnt (300 -tc358768_to_ns (2 * ui_nsk), - dsibclk_nsk) -2 ; + hsbyteclk_nsk) -2 ;dev_dbg (dev,"TCLK_ZEROCNT %u\n" , val2); val |= val2 <<8 ;tc358768_write (priv,TC358768_TCLK_HEADERCNT , val);/* TCLK_TRAIL > 60ns AND TEOT <= 105 ns + 12*UI */ - raw_val =tc358768_ns_to_cnt (60 +tc358768_to_ns (2 * ui_nsk), dsibclk_nsk) -5 ; + raw_val =tc358768_ns_to_cnt (60 +tc358768_to_ns (2 * ui_nsk), hsbyteclk_nsk) -5 ; val =clamp (raw_val,0 ,127 );dev_dbg (dev,"TCLK_TRAILCNT: %u\n" , val);tc358768_write (priv,TC358768_TCLK_TRAILCNT , val);/* 40ns + 4*UI < THS_PREPARE < 85ns + 6*UI */ val =50 +tc358768_to_ns (4 * ui_nsk); - val =tc358768_ns_to_cnt (val, dsibclk_nsk) -1 ; + val =tc358768_ns_to_cnt (val, hsbyteclk_nsk) -1 ;dev_dbg (dev,"THS_PREPARECNT %u\n" , val);/* THS_PREPARE + THS_ZERO > 145ns + 10*UI */ - raw_val =tc358768_ns_to_cnt (145 -tc358768_to_ns (3 * ui_nsk), dsibclk_nsk) -10 ; + raw_val =tc358768_ns_to_cnt (145 -tc358768_to_ns (3 * ui_nsk), hsbyteclk_nsk) -10 ; val2 =clamp (raw_val,0 ,127 );dev_dbg (dev,"THS_ZEROCNT %u\n" , val2); val |= val2 <<8 ;tc358768_write (priv,TC358768_THS_HEADERCNT , val);/* TWAKEUP > 1ms in lptxcnt steps */ - val =tc358768_ns_to_cnt (1020000 , dsibclk_nsk); + val =tc358768_ns_to_cnt (1020000 , hsbyteclk_nsk); val = val / (lptxcnt +1 ) -1 ;dev_dbg (dev,"TWAKEUP: %u\n" , val);tc358768_write (priv,TC358768_TWAKEUP , val);/* TCLK_POSTCNT > 60ns + 52*UI */ val =tc358768_ns_to_cnt (60 +tc358768_to_ns (52 * ui_nsk), - dsibclk_nsk) -3 ; + hsbyteclk_nsk) -3 ;dev_dbg (dev,"TCLK_POSTCNT: %u\n" , val);tc358768_write (priv,TC358768_TCLK_POSTCNT , val);/* max(60ns + 4*UI, 8*UI) < THS_TRAILCNT < 105ns + 12*UI */ raw_val =tc358768_ns_to_cnt (60 +tc358768_to_ns (18 * ui_nsk), - dsibclk_nsk) -4 ; + hsbyteclk_nsk) -4 ; val =clamp (raw_val,0 ,15 );dev_dbg (dev,"THS_TRAILCNT: %u\n" , val);tc358768_write (priv,TC358768_THS_TRAILCNT , val);
@@ -805,11 +805,11 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) (mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) ? 0 : BIT(0));/* TXTAGOCNT[26:16] RXTASURECNT[10:0] */ - val =tc358768_to_ns ((lptxcnt +1 ) * dsibclk_nsk *4 ); - val =tc358768_ns_to_cnt (val, dsibclk_nsk) /4 -1 ; + val =tc358768_to_ns ((lptxcnt +1 ) * hsbyteclk_nsk *4 ); + val =tc358768_ns_to_cnt (val, hsbyteclk_nsk) /4 -1 ;dev_dbg (dev,"TXTAGOCNT: %u\n" , val); - val2 =tc358768_ns_to_cnt (tc358768_to_ns ((lptxcnt +1 ) * dsibclk_nsk), - dsibclk_nsk) -2 ; + val2 =tc358768_ns_to_cnt (tc358768_to_ns ((lptxcnt +1 ) * hsbyteclk_nsk), + hsbyteclk_nsk) -2 ;dev_dbg (dev,"RXTASURECNT: %u\n" , val2); val = val <<16 | val2;tc358768_write (priv,TC358768_BTACNTRL1 , val);
@@ -832,13 +832,13 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)/* hsw * byteclk * ndl / pclk */ val = (u32 )div_u64 (vm.hsync_len * - ((u64 )priv->dsiclk /4 ) * priv->dsi_lanes, + (u64 )hsbyteclk * priv->dsi_lanes, vm.pixelclock);tc358768_write (priv,TC358768_DSI_HSW , val);/* hbp * byteclk * ndl / pclk */ val = (u32 )div_u64 (vm.hback_porch * - ((u64 )priv->dsiclk /4 ) * priv->dsi_lanes, + (u64 )hsbyteclk * priv->dsi_lanes, vm.pixelclock);tc358768_write (priv,TC358768_DSI_HBPR , val); }else {
@@ -857,7 +857,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)/* (hsw + hbp) * byteclk * ndl / pclk */ val = (u32 )div_u64 ((vm.hsync_len + vm.hback_porch) * - ((u64 )priv->dsiclk /4 ) * priv->dsi_lanes, + (u64 )hsbyteclk * priv->dsi_lanes, vm.pixelclock);tc358768_write (priv,TC358768_DSI_HSW , val);
Signature · 1 line
2.42.0