Merge 6.12.31 into android16-6.12-lts
GKI (arm64) relevant 137 out of 624 changes, affecting 192 files +1647/-1035a4f865ecdbnvmem: core: fix bit offsets of more than one byte [1 file, +17/-7]4327479e55nvmem: core: verify cell's raw_len [1 file, +12/-0]410f8b72e0nvmem: core: update raw_len if the bit reading is required [1 file, +3/-1]7aea1517fbscsi: ufs: Introduce quirk to extend PA_HIBERN8TIME for UFS devices [2 files, +35/-0]b730cb1096virtio_ring: Fix data race by tagging event_triggered as racy for KCSAN [1 file, +1/-1]2998813177dma/mapping.c: dev_dbg support for dma_addressing_limited [1 file, +10/-1]3eec42a17adma-mapping: avoid potential unused data compilation warning [1 file, +8/-4]97edaa0ec6cgroup: Fix compilation issue due to cgroup_mutex not being exported [1 file, +1/-1]f93675793bvhost_task: fix vhost_task_create() documentation [1 file, +1/-1]e22034cbeedma-mapping: Fix warning reported for missing prototype [1 file, +8/-8]4f5553a08ffs/buffer: split locking for pagecache lookups [1 file, +25/-16]e138fc2316fs/buffer: introduce sleeping flavors for pagecache lookups [2 files, +17/-0]a49a4a87cefs/buffer: use sleeping version of __find_get_block() [1 file, +9/-2]f1c5aa614bfs/jbd2: use sleeping version of __find_get_block() [1 file, +9/-6]9ece099e95fs/ext4: use sleeping version of sb_find_get_block() [1 file, +2/-1]64f505b08eblock: fix race between set_blocksize and read paths [4 files, +43/-1]218c838d03io_uring: don't duplicate flushing in io_req_post_cqe [1 file, +8/-3]8014d3e56ebpf: fix possible endless loop in BPF map iteration [1 file, +1/-1]d40ca27602fuse: Return EPERM rather than ENOSYS from link() [1 file, +2/-0]bab0bd1389exfat: call bh_read in get_block only when necessary [1 file, +77/-82]01677e7ee1io_uring/msg: initialise msg request opcode [1 file, +1/-0]e506751b7darm64: Add support for HIP09 Spectre-BHB mitigation [2 files, +3/-0]4f427ca9edtracing: Mark binary printing functions with __printf() attribute [4 files, +18/-21]15787ab82amailbox: use error ret code of of_parse_phandle_with_args() [1 file, +4/-3]f48ee562c0Bluetooth: Disable SCO support if READ_VOICE_SETTING is unsupported/broken [1 file, +3/-0]44b79041c4dql: Fix dql->limit value when reset. [1 file, +1/-1]ac30595154lockdep: Fix wait context check on softirq for PREEMPT_RT [1 file, +18/-0]e63b634806PCI: dwc: ep: Ensure proper iteration over outbound map windows [1 file, +1/-1]37ac2434aaext4: on a remount, only log the ro or r/w state when it has changed [1 file, +4/-3]1d1e1efad1libnvdimm/labels: Fix divide error in nd_label_data_init() [1 file, +2/-1]123bcd8f42pidfs: improve multi-threaded exec and premature thread-group leader exit polling [3 files, +9/-9]8f82cf305ecgroup/rstat: avoid disabling irqs for O(num_cpu) [1 file, +5/-7]a5a507fa5fblk-cgroup: improve policy registration error handling [1 file, +12/-10]94c3cbc69aext4: reorder capability check last [1 file, +2/-2]e658f2d94abpf: Return prog btf_id without capable check [1 file, +2/-2]e2520cc19bPCI: dwc: Use resource start as ioremap() input in dw_pcie_pme_turn_off() [1 file, +1/-1]50452704ecjbd2: do not try to recover wiped journal [1 file, +6/-5]dab35f4921tcp: reorganize tcp_in_ack_event() and tcp_count_delivered() [1 file, +32/-24]555c0b713cbpf: Allow pre-ordering for bpf cgroup progs [5 files, +30/-9]572ed3fb99kconfig: do not clear SYMBOL_VALID when reading include/config/auto.conf [1 file, +12/-7]174dedce64dm: restrict dm device size to 2^63-512 bytes [1 file, +4/-0]2f5f326214ext4: reject the 'data_err=abort' option in nojournal mode [1 file, +12/-0]d0dc233fe2posix-timers: Add cond_resched() to posix_timer_add() search loop [1 file, +1/-0]ae22452d15posix-timers: Ensure that timer initialization is fully visible [1 file, +14/-7]3fb9ee05ectimer_list: Don't use %pK through printk() [1 file, +2/-2]21153e0974netfilter: conntrack: Bound nf_conntrack sysctl writes [1 file, +9/-3]236a87e9d2PNP: Expand length of fixup id string [1 file, +1/-1]6215143ad3arm64/mm: Check pmd_table() in pmd_trans_huge() [1 file, +12/-12]8ad58a7ebaarm64/mm: Check PUD_TYPE_TABLE in pud_bad() [1 file, +2/-1]28306c58dammc: sdhci: Disable SD card clock before changing parameters [1 file, +7/-2]3a75fe58a1usb: xhci: Don't change the status of stalled TDs on failed Stop EP [1 file, +11/-1]101a3b9920printk: Check CON_SUSPEND when unblanking a console [1 file, +12/-2]faba68a86awifi: cfg80211: allow IR in 20 MHz configurations [5 files, +46/-25]c1502fc84dipv6: save dontfrag in cork [2 files, +6/-4]75ae2a3553badblocks: Fix a nonsense WARN_ON() which checks whether a u64 variable < 0 [1 file, +3/-2]7caad075accrypto: lzo - Fix compression buffer overrun [6 files, +106/-28]73d01bcbf2tcp: bring back NUMA dispersion in inet_ehash_locks_alloc() [1 file, +26/-11]1c17190880usb: xhci: set page size to the xHCI-supported size [2 files, +22/-20]93f581d763drm/gem: Test for imported GEM buffers with helper [2 files, +16/-2]c4525b513dnet: phylink: use pl->link_interface in phylink_expects_phy() [1 file, +1/-1]f29c876d72perf/core: Clean up perf_try_init_event() [1 file, +38/-27]af73c8fd73ublk: enforce ublks_max only for unprivileged devices [1 file, +27/-15]592ba27580perf/hw_breakpoint: Return EOPNOTSUPP for unsupported breakpoint type [1 file, +3/-2]3de322a98bscsi: logging: Fix scsi_logging_level bounds [1 file, +3/-1]f33b310eacipv4: fib: Move fib_valid_key_len() to rtm_to_fib_config(). [2 files, +16/-24]564f03a797block: mark bounce buffering as incompatible with integrity [2 files, +5/-2]82209faa87ublk: complete command synchronously on error [1 file, +6/-5]b98aad5e5emedia: uvcvideo: Add sanity check to uvc_ioctl_xu_ctrl_map [1 file, +6/-0]2d6231d5cemedia: uvcvideo: Handle uvc menu translation inside uvc_get_le_value [1 file, +32/-45]e359d62886perf: arm_pmuv3: Call kvm_vcpu_pmu_resync_el0() before enabling counters [1 file, +2/-2]673dde8d3cbpf: Search and add kfuncs in struct_ops prologue and epilogue [1 file, +24/-1]083383aba0cpuidle: menu: Avoid discarding useful information [1 file, +12/-1]20a53c3689loop: check in LO_FLAGS_DIRECT_IO in loop_default_blocksize [1 file, +1/-1]b55a97d1bddm: fix unconditional IO throttle caused by REQ_PREFLUSH [1 file, +6/-2]9f27b38771crypto: ahash - Set default reqsize from ahash_alg [2 files, +7/-0]897c98fb32crypto: skcipher - Zap type in crypto_alloc_sync_skcipher [1 file, +1/-0]4d9fa2ebc0net: ipv6: Init tunnel link-netns before registering dev [4 files, +9/-7]53f42776e4genirq/msi: Store the IOMMU IOVA directly in msi_desc instead of iommu_cookie [2 files, +25/-36]2b129e89b8bpf: don't do clean_live_states when state->loop_entry->branches > 0 [1 file, +4/-0]46ba5757a7bpf: copy_verifier_state() should copy 'loop_entry' field [1 file, +3/-0]82b54455b6PCI: Fix old_size lower bound in calculate_iosize() too [1 file, +2/-4]dc5f5c9d2bhrtimers: Replace hrtimer_clock_to_base_table with switch-case [1 file, +12/-17]000dd6e344ASoC: ops: Enforce platform maximum on initial value [1 file, +28/-1]c4260bf83bASoC: soc-dai: check return value at snd_soc_dai_set_tdm_slot() [1 file, +5/-3]5b1b4cb46dpinctrl: devicetree: do not goto err when probing hogs in pinctrl_dt_to_map [1 file, +8/-2]69689d1138media: v4l: Memset argument to 0 before calling get_mbus_config pad op [2 files, +5/-1]e6e31b0182sched: Reduce the default slice to avoid tasks getting an extra tick [1 file, +3/-3]ef31dc41cfphy: core: don't require set_mode() callback for phy_get_mode() to work [1 file, +4/-3]06daedb443xfrm: prevent high SEQ input in non-ESN mode [1 file, +12/-0]9f2911868aip: fib_rules: Fetch net from fib_rule in fib[46]_rule_configure(). [2 files, +4/-4]7fea5a9140r8152: add vendor/device ID pair for Dell Alienware AW1022z [2 files, +2/-0]16ddd67bb5pstore: Change kmsg_bytes storage size to u32 [3 files, +9/-8]73733c2fdbext4: don't write back data before punch hole in nojournal mode [1 file, +5/-13]1d15319323f2fs: introduce f2fs_base_attr for global sysfs entries [1 file, +52/-22]ded26f9e4cipv4: ip_gre: Fix set but not used warning in ipgre_err() if IPv4-only [1 file, +10/-6]76e56dbe50net: flush_backlog() small changes [1 file, +8/-4]58cdd1ee65bridge: mdb: Allow replace of a host-joined group [2 files, +2/-2]fcabb69674rcu: handle unstable rdp in rcu_read_unlock_strict() [2 files, +11/-2]d402437cdercu: fix header guard for rcu_all_qs() [1 file, +1/-1]887e39ac47perf: Avoid the read if the count is already updated [3 files, +24/-18]c80b2d159cbpf: Use kallsyms to find the function name of a struct_ops's stub function [1 file, +44/-54]46f1c2b508firmware: arm_scmi: Relax duplicate name constraint across protocol ids [1 file, +6/-13]1351052877drm/atomic: clarify the rules around drm_atomic_state->allow_modeset [1 file, +21/-2]9fddd1f154drm: Add valid clones check [1 file, +28/-0]ff214b079dnvme-pci: add quirks for device 126f:1001 [1 file, +3/-0]6d196cae4bnvme-pci: add quirks for WDC Blue SN550 15b7:5009 [1 file, +3/-0]6a09b6bad0ALSA: usb-audio: Fix duplicated name in MIDI substream names [1 file, +12/-4]ad3e83a6c8io_uring/fdinfo: annotate racy sq/cq head/tail reads [1 file, +2/-2]7f7c8c03febtrfs: correct the order of prelim_ref arguments in btrfs__prelim_ref [1 file, +1/-1]8cafd7266f__legitimize_mnt(): check for MNT_SYNC_UMOUNT should be under mount_lock [1 file, +1/-5]28756f22deespintcp: fix skb leaks [3 files, +9/-3]9cbca30102espintcp: remove encap socket caching to avoid reference leak [4 files, +8/-94]b1a687eb15xfrm: Fix UDP GRO handling for some corner cases [2 files, +20/-16]447c8f0c06kernel/fork: only call untrack_pfn_clear() on VMAs duplicated for fork() [1 file, +5/-4]252f78a931xfrm: Sanitize marks before insert [2 files, +6/-0]7207effe47driver core: Split devres APIs to device/devres.h [2 files, +125/-118]1e8b7e96f7Bluetooth: L2CAP: Fix not checking l2cap_chan security level [1 file, +8/-7]cd7f022296loop: don't require ->write_iter for writable files in loop_configure [1 file, +0/-3]873ebaf3c1io_uring: fix overflow resched cqe reordering [1 file, +1/-0]689a205cd9net/tipc: fix slab-use-after-free Read in tipc_aead_encrypt_done [1 file, +5/-0]adb05149a9can: slcan: allow reception of short error messages [1 file, +20/-6]cc55dd28c2can: bcm: add locking for bcm_op runtime updates [1 file, +45/-21]63567ecd99can: bcm: add missing rcu read protection for procfs content [1 file, +9/-4]bf85e49aafALSA: pcm: Fix race of buffer access at PCM OSS layer [3 files, +14/-2]e78908caf1pmdomain: core: Fix error checking in genpd_dev_pm_attach_by_id() [1 file, +1/-1]dc9bdfb9b0drm/edid: fixed the bug that hdr metadata was not reset [1 file, +1/-0]cb9a1019a6Input: xpad - add more controllers [1 file, +3/-0]9b8263cae6highmem: add folio_test_partial_kmap() [2 files, +12/-5]314bf771cbmemcg: always call cond_resched() after fn() [1 file, +2/-4]9da33ce114mm/page_alloc.c: avoid infinite retries caused by cpuset race [1 file, +8/-0]9f9517f156mm: mmap: map MAP_STACK to VM_NOHUGEPAGE only if THP is enabled [1 file, +2/-0]94efb0d656mm: vmalloc: actually use the in-place vrealloc region [1 file, +1/-0]483ac74183mm: vmalloc: only zero-init on vrealloc shrink [1 file, +7/-5]1d45e0170cspi: use container_of_cont() for to_spi_device() [1 file, +1/-4]d28b0305f7err.h: move IOMEM_ERR_PTR() to err.h [2 files, +3/-2]80eb73778dbpf: abort verification if env->cur_state->loop_entry != NULL [1 file, +4/-2]85fb1edd05drm/gem: Internally test import_attach for imported objects [1 file, +1/-2] Changes in 6.12.31 drm/amd/display: Configure DTBCLK_P with OPTC only for dcn401 drm/amd/display: Do not enable replay when vtotal update is pending. drm/amd/display: Correct timing_adjust_pending flag setting. drm/amd/display: Defer BW-optimization-blocked DRR adjustments i2c: designware: Use temporary variable for struct device i2c: designware: Fix an error handling path in i2c_dw_pci_probe() phy: renesas: rcar-gen3-usb2: Move IRQ request in probe phy: renesas: rcar-gen3-usb2: Lock around hardware registers and driver data phy: renesas: rcar-gen3-usb2: Assert PLL reset on PHY power off cpufreq: Add SM8650 to cpufreq-dt-platdev blocklist nvmem: rockchip-otp: Move read-offset into variant-data nvmem: rockchip-otp: add rk3576 variant data nvmem: core: fix bit offsets of more than one byte nvmem: core: verify cell's raw_len nvmem: core: update raw_len if the bit reading is required nvmem: qfprom: switch to 4-byte aligned reads scsi: target: iscsi: Fix timeout on deleted connection scsi: ufs: Introduce quirk to extend PA_HIBERN8TIME for UFS devices virtio_ring: Fix data race by tagging event_triggered as racy for KCSAN dma/mapping.c: dev_dbg support for dma_addressing_limited intel_th: avoid using deprecated page->mapping, index fields mei: vsc: Use struct vsc_tp_packet as vsc-tp tx_buf and rx_buf type dma-mapping: avoid potential unused data compilation warning cgroup: Fix compilation issue due to cgroup_mutex not being exported vhost_task: fix vhost_task_create() documentation vhost-scsi: protect vq->log_used with vq->mutex scsi: mpi3mr: Add level check to control event logging net: enetc: refactor bulk flipping of RX buffers to separate function dma-mapping: Fix warning reported for missing prototype ima: process_measurement() needlessly takes inode_lock() on MAY_READ fs/buffer: split locking for pagecache lookups fs/buffer: introduce sleeping flavors for pagecache lookups fs/buffer: use sleeping version of __find_get_block() fs/ocfs2: use sleeping version of __find_get_block() fs/jbd2: use sleeping version of __find_get_block() fs/ext4: use sleeping version of sb_find_get_block() drm/amd/display: Enable urgent latency adjustment on DCN35 drm/amdgpu: Allow P2P access through XGMI selftests/bpf: Mitigate sockmap_ktls disconnect_after_delete failure block: fix race between set_blocksize and read paths io_uring: don't duplicate flushing in io_req_post_cqe bpf: fix possible endless loop in BPF map iteration samples/bpf: Fix compilation failure for samples/bpf on LoongArch Fedora kconfig: merge_config: use an empty file as initfile x86/fred: Fix system hang during S4 resume with FRED enabled s390/vfio-ap: Fix no AP queue sharing allowed message written to kernel log cifs: Add fallback for SMB2 CREATE without FILE_READ_ATTRIBUTES cifs: Fix querying and creating MF symlinks over SMB1 cifs: Fix negotiate retry functionality smb: client: Store original IO parameters and prevent zero IO sizes fuse: Return EPERM rather than ENOSYS from link() exfat: call bh_read in get_block only when necessary io_uring/msg: initialise msg request opcode NFSv4: Check for delegation validity in nfs_start_delegation_return_locked() NFS: Don't allow waiting for exiting tasks SUNRPC: Don't allow waiting for exiting tasks arm64: Add support for HIP09 Spectre-BHB mitigation iommufd: Extend IOMMU_GET_HW_INFO to report PASID capability tracing: Mark binary printing functions with __printf() attribute ACPI: PNP: Add Intel OC Watchdog IDs to non-PNP device list tpm: Convert warn to dbg in tpm2_start_auth_session() mailbox: pcc: Use acpi_os_ioremap() instead of ioremap() mailbox: use error ret code of of_parse_phandle_with_args() riscv: Allow NOMMU kernels to access all of RAM fbdev: fsl-diu-fb: add missing device_remove_file() fbcon: Use correct erase colour for clearing in fbcon fbdev: core: tileblit: Implement missing margin clearing for tileblit cifs: Set default Netbios RFC1001 server name to hostname in UNC cifs: add validation check for the fields in smb_aces cifs: Fix establishing NetBIOS session for SMB2+ connection NFSv4: Treat ENETUNREACH errors as fatal for state recovery SUNRPC: rpc_clnt_set_transport() must not change the autobind setting SUNRPC: rpcbind should never reset the port to the value '0' spi-rockchip: Fix register out of bounds access ASoC: codecs: wsa884x: Correct VI sense channel mask ASoC: codecs: wsa883x: Correct VI sense channel mask mctp: Fix incorrect tx flow invalidation condition in mctp-i2c net: tn40xx: add pci-id of the aqr105-based Tehuti TN4010 cards net: tn40xx: create swnode for mdio and aqr105 phy and add to mdiobus thermal/drivers/mediatek/lvts: Start sensor interrupts disabled thermal/drivers/qoriq: Power down TMU on system suspend Bluetooth: btmtksdio: Prevent enabling interrupts after IRQ handler removal Bluetooth: Disable SCO support if READ_VOICE_SETTING is unsupported/broken dql: Fix dql->limit value when reset. lockdep: Fix wait context check on softirq for PREEMPT_RT objtool: Properly disable uaccess validation PCI: dwc: ep: Ensure proper iteration over outbound map windows r8169: disable RTL8126 ZRX-DC timeout tools/build: Don't pass test log files to linker pNFS/flexfiles: Report ENETDOWN as a connection error drm/amdgpu/discovery: check ip_discovery fw file available drm/amdkfd: set precise mem ops caps to disabled for gfx 11 and 12 PCI: vmd: Disable MSI remapping bypass under Xen xen/pci: Do not register devices with segments >= 0x10000 ext4: on a remount, only log the ro or r/w state when it has changed libnvdimm/labels: Fix divide error in nd_label_data_init() pidfs: improve multi-threaded exec and premature thread-group leader exit polling staging: vchiq_arm: Create keep-alive thread during probe mmc: host: Wait for Vdd to settle on card power off drm/amdgpu: Skip pcie_replay_count sysfs creation for VF cgroup/rstat: avoid disabling irqs for O(num_cpu) wifi: mt76: only mark tx-status-failed frames as ACKed on mt76x0/2 wifi: mt76: mt7996: fix SER reset trigger on WED reset wifi: mt76: mt7996: revise TXS size wifi: mt76: mt7925: load the appropriate CLC data based on hardware type wifi: mt76: mt7925: fix fails to enter low power mode in suspend state x86/headers: Replace __ASSEMBLY__ with __ASSEMBLER__ in UAPI headers x86/stackprotector/64: Only export __ref_stack_chk_guard on CONFIG_SMP x86/smpboot: Fix INIT delay assignment for extended Intel Families x86/microcode: Update the Intel processor flag scan check x86/mm: Check return value from memblock_phys_alloc_range() i2c: qup: Vote for interconnect bandwidth to DRAM i2c: pxa: fix call balance of i2c->clk handling routines btrfs: make btrfs_discard_workfn() block_group ref explicit btrfs: avoid linker error in btrfs_find_create_tree_block() btrfs: run btrfs_error_commit_super() early btrfs: fix non-empty delayed iputs list on unmount due to async workers btrfs: get zone unusable bytes while holding lock at btrfs_reclaim_bgs_work() btrfs: send: return -ENAMETOOLONG when attempting a path that is too long blk-cgroup: improve policy registration error handling drm/amdgpu: release xcp_mgr on exit drm/amd/display: Guard against setting dispclk low for dcn31x drm/amdgpu: adjust drm_firmware_drivers_only() handling i3c: master: svc: Fix missing STOP for master request s390/tlb: Use mm_has_pgste() instead of mm_alloc_pgste() dlm: make tcp still work in multi-link env clocksource/drivers/timer-riscv: Stop stimecmp when cpu hotplug um: Store full CSGSFS and SS register from mcontext um: Update min_low_pfn to match changes in uml_reserved wifi: mwifiex: Fix HT40 bandwidth issue. bnxt_en: Query FW parameters when the CAPS_CHANGE bit is set riscv: Call secondary mmu notifier when flushing the tlb ext4: reorder capability check last hypfs_create_cpu_files(): add missing check for hypfs_mkdir() failure scsi: st: Tighten the page format heuristics with MODE SELECT scsi: st: ERASE does not change tape location vfio/pci: Handle INTx IRQ_NOTCONNECTED bpf: Return prog btf_id without capable check PCI: dwc: Use resource start as ioremap() input in dw_pcie_pme_turn_off() jbd2: do not try to recover wiped journal tcp: reorganize tcp_in_ack_event() and tcp_count_delivered() rtc: rv3032: fix EERD location objtool: Fix error handling inconsistencies in check() thunderbolt: Do not add non-active NVM if NVM upgrade is disabled for retimer erofs: initialize decompression early spi: spi-mux: Fix coverity issue, unchecked return value ASoC: pcm6240: Drop bogus code handling IRQ as GPIO ASoC: mediatek: mt6359: Add stub for mt6359_accdet_enable_jack_detect bpf: Allow pre-ordering for bpf cgroup progs kbuild: fix argument parsing in scripts/config kconfig: do not clear SYMBOL_VALID when reading include/config/auto.conf crypto: octeontx2 - suppress auth failure screaming due to negative tests dm: restrict dm device size to 2^63-512 bytes net/smc: use the correct ndev to find pnetid by pnetid table xen: Add support for XenServer 6.1 platform device pinctrl-tegra: Restore SFSEL bit when freeing pins mfd: tps65219: Remove TPS65219_REG_TI_DEV_ID check drm/amdgpu/gfx12: don't read registers in mqd init drm/amdgpu/gfx11: don't read registers in mqd init drm/amdgpu: Update SRIOV video codec caps ASoC: sun4i-codec: support hp-det-gpios property clk: qcom: lpassaudiocc-sc7280: Add support for LPASS resets for QCM6490 ext4: reject the 'data_err=abort' option in nojournal mode ext4: do not convert the unwritten extents if data writeback fails RDMA/uverbs: Propagate errors from rdma_lookup_get_uobject() posix-timers: Add cond_resched() to posix_timer_add() search loop posix-timers: Ensure that timer initialization is fully visible net: stmmac: dwmac-rk: Validate GRF and peripheral GRF during probe net: hsr: Fix PRP duplicate detection timer_list: Don't use %pK through printk() wifi: rtw89: set force HE TB mode when connecting to 11ax AP netfilter: conntrack: Bound nf_conntrack sysctl writes PNP: Expand length of fixup id string phy: rockchip: usbdp: Only verify link rates/lanes/voltage when the corresponding set flags are set arm64/mm: Check pmd_table() in pmd_trans_huge() arm64/mm: Check PUD_TYPE_TABLE in pud_bad() mmc: dw_mmc: add exynos7870 DW MMC support mmc: sdhci: Disable SD card clock before changing parameters usb: xhci: Don't change the status of stalled TDs on failed Stop EP wifi: iwlwifi: mvm: fix setting the TK when associated hwmon: (dell-smm) Increment the number of fans iommu: Keep dev->iommu state consistent printk: Check CON_SUSPEND when unblanking a console wifi: iwlwifi: don't warn when if there is a FW error wifi: iwlwifi: w/a FW SMPS mode selection wifi: iwlwifi: fix debug actions order wifi: iwlwifi: mark Br device not integrated wifi: iwlwifi: fix the ECKV UEFI variable name wifi: mac80211: fix warning on disconnect during failed ML reconf wifi: mac80211_hwsim: Fix MLD address translation wifi: cfg80211: allow IR in 20 MHz configurations ipv6: save dontfrag in cork drm/amd/display: remove minimum Dispclk and apply oem panel timing. drm/amd/display: calculate the remain segments for all pipes drm/amd/display: not abort link train when bw is low drm/amd/display: Fix incorrect DPCD configs while Replay/PSR switch gfs2: Check for empty queue in run_queue auxdisplay: charlcd: Partially revert "Move hwidth and bwidth to struct hd44780_common" ASoC: qcom: sm8250: explicitly set format in sm8250_be_hw_params_fixup() badblocks: Fix a nonsense WARN_ON() which checks whether a u64 variable < 0 coresight-etb10: change etb_drvdata spinlock's type to raw_spinlock_t iommu/amd/pgtbl_v2: Improve error handling cpufreq: tegra186: Share policy per cluster watchdog: aspeed: Update bootstatus handling PCI: endpoint: pci-epf-test: Fix double free that causes kernel to oops misc: pci_endpoint_test: Give disabled BARs a distinct error code crypto: lzo - Fix compression buffer overrun crypto: mxs-dcp - Only set OTP_KEY bit for OTP key drm/amdkfd: Set per-process flags only once for gfx9/10/11/12 drm/amdkfd: Set per-process flags only once cik/vi drm/amdgpu: Fix missing drain retry fault the last entry arm64: tegra: p2597: Fix gpio for vdd-1v8-dis regulator arm64: tegra: Resize aperture for the IGX PCIe C5 slot powerpc/prom_init: Fixup missing #size-cells on PowerBook6,7 ALSA: seq: Improve data consistency at polling tcp: bring back NUMA dispersion in inet_ehash_locks_alloc() rtc: ds1307: stop disabling alarms on probe ieee802154: ca8210: Use proper setters and getters for bitwise types drm/xe: Nuke VM's mapping upon close drm/xe: Retry BO allocation soc: samsung: include linux/array_size.h where needed ARM: tegra: Switch DSI-B clock parent to PLLD on Tegra114 media: c8sectpfe: Call of_node_put(i2c_bus) only once in c8sectpfe_probe() usb: xhci: set page size to the xHCI-supported size dm cache: prevent BUG_ON by blocking retries on failed device resumes soc: mediatek: mtk-mutex: Add DPI1 SOF/EOF to MT8188 mutex tables orangefs: Do not truncate file size drm/gem: Test for imported GEM buffers with helper net: phylink: use pl->link_interface in phylink_expects_phy() blk-throttle: don't take carryover for prioritized processing of metadata remoteproc: qcom_wcnss: Handle platforms with only single power domain drm/amdgpu: Do not program AGP BAR regs under SRIOV in gfxhub_v1_0.c drm/amd/display: Ensure DMCUB idle before reset on DCN31/DCN35 drm/amd/display: Skip checking FRL_MODE bit for PCON BW determination drm/amd/display: Fix DMUB reset sequence for DCN401 drm/amd/display: Fix p-state type when p-state is unsupported drm/amd/display: Request HW cursor on DCN3.2 with SubVP perf/core: Clean up perf_try_init_event() media: cx231xx: set device_caps for 417 pinctrl: bcm281xx: Use "unsigned int" instead of bare "unsigned" rcu: Fix get_state_synchronize_rcu_full() GP-start detection net: ethernet: ti: cpsw_new: populate netdev of_node net: phy: nxp-c45-tja11xx: add match_phy_device to TJA1103/TJA1104 dpll: Add an assertion to check freq_supported_num ublk: enforce ublks_max only for unprivileged devices iommufd: Disallow allocating nested parent domain with fault ID media: imx335: Set vblank immediately net: pktgen: fix mpls maximum labels list parsing perf/hw_breakpoint: Return EOPNOTSUPP for unsupported breakpoint type ALSA: hda/realtek: Enable PC beep passthrough for HP EliteBook 855 G7 scsi: logging: Fix scsi_logging_level bounds ipv4: fib: Move fib_valid_key_len() to rtm_to_fib_config(). drm/rockchip: vop2: Add uv swap for cluster window block: mark bounce buffering as incompatible with integrity ublk: complete command synchronously on error media: uvcvideo: Add sanity check to uvc_ioctl_xu_ctrl_map media: uvcvideo: Handle uvc menu translation inside uvc_get_le_value clk: imx8mp: inform CCF of maximum frequency of clocks x86/bugs: Make spectre user default depend on MITIGATION_SPECTRE_V2 hwmon: (gpio-fan) Add missing mutex locks ARM: at91: pm: fix at91_suspend_finish for ZQ calibration drm/mediatek: mtk_dpi: Add checks for reg_h_fre_con existence fpga: altera-cvp: Increase credit timeout perf: arm_pmuv3: Call kvm_vcpu_pmu_resync_el0() before enabling counters soc: apple: rtkit: Use high prio work queue soc: apple: rtkit: Implement OSLog buffers properly wifi: ath12k: Report proper tx completion status to mac80211 PCI: brcmstb: Expand inbound window size up to 64GB PCI: brcmstb: Add a softdep to MIP MSI-X driver firmware: arm_ffa: Set dma_mask for ffa devices drm/xe/vf: Retry sending MMIO request to GUC on timeout error drm/xe/pf: Create a link between PF and VF devices net/mlx5: Avoid report two health errors on same syndrome selftests/net: have `gro.sh -t` return a correct exit code pinctrl: sophgo: avoid to modify untouched bit when setting cv1800 pinconf drm/amdkfd: KFD release_work possible circular locking drm/xe: xe_gen_wa_oob: replace program_invocation_short_name leds: pwm-multicolor: Add check for fwnode_property_read_u32 net: ethernet: mtk_ppe_offload: Allow QinQ, double ETH_P_8021Q only net: xgene-v2: remove incorrect ACPI_PTR annotation bonding: report duplicate MAC address in all situations wifi: ath12k: Improve BSS discovery with hidden SSID in 6 GHz band soc: ti: k3-socinfo: Do not use syscon helper to build regmap bpf: Search and add kfuncs in struct_ops prologue and epilogue Octeontx2-af: RPM: Register driver with PCI subsys IDs x86/build: Fix broken copy command in genimage.sh when making isoimage drm/amd/display: handle max_downscale_src_width fail check drm/amd/display: fix dcn4x init failed drm/amd/display: Fix mismatch type comparison ASoC: mediatek: mt8188: Treat DMIC_GAINx_CUR as non-volatile ASoC: mediatek: mt8188: Add reference for dmic clocks x86/nmi: Add an emergency handler in nmi_desc & use it in nmi_shootdown_cpus() vhost-scsi: Return queue full for page alloc failures during copy vdpa/mlx5: Fix mlx5_vdpa_get_config() endianness on big-endian machines cpuidle: menu: Avoid discarding useful information media: adv7180: Disable test-pattern control on adv7180 media: tc358746: improve calculation of the D-PHY timing registers net/mlx5e: Add correct match to check IPSec syndromes for switchdev mode scsi: mpi3mr: Update timestamp only for supervisor IOCs loop: check in LO_FLAGS_DIRECT_IO in loop_default_blocksize libbpf: Fix out-of-bound read dm: fix unconditional IO throttle caused by REQ_PREFLUSH scsi: scsi_debug: First fixes for tapes net/mlx5: Change POOL_NEXT_SIZE define value and make it global x86/kaslr: Reduce KASLR entropy on most x86 systems crypto: ahash - Set default reqsize from ahash_alg crypto: skcipher - Zap type in crypto_alloc_sync_skcipher net: ipv6: Init tunnel link-netns before registering dev drm/xe/oa: Ensure that polled read returns latest data MIPS: Use arch specific syscall name match function drm/amdgpu: remove all KFD fences from the BO on release x86/locking: Use ALT_OUTPUT_SP() for percpu_{,try_}cmpxchg{64,128}_op() genirq/msi: Store the IOMMU IOVA directly in msi_desc instead of iommu_cookie MIPS: pm-cps: Use per-CPU variables as per-CPU, not per-core clocksource: mips-gic-timer: Enable counter when CPUs start PCI: epf-mhi: Update device ID for SA8775P scsi: mpt3sas: Send a diag reset if target reset fails wifi: rtw88: Fix rtw_init_vht_cap() for RTL8814AU wifi: rtw88: Fix rtw_init_ht_cap() for RTL8814AU wifi: rtw88: Fix rtw_desc_to_mcsrate() to handle MCS16-31 wifi: rtw89: fw: propagate error code from rtw89_h2c_tx() wifi: rtw89: fw: get sb_sel_ver via get_unaligned_le32() wifi: rtw89: fw: add blacklist to avoid obsolete secure firmware wifi: rtw89: 8922a: fix incorrect STA-ID in EHT MU PPDU net: pktgen: fix access outside of user given buffer in pktgen_thread_write() power: supply: axp20x_battery: Update temp sensor for AXP717 from device tree EDAC/ie31200: work around false positive build warning i3c: master: svc: Flush FIFO before sending Dynamic Address Assignment(DAA) mfd: axp20x: AXP717: Add AXP717_TS_PIN_CFG to writeable regs eeprom: ee1004: Check chip before probing irqchip/riscv-imsic: Separate next and previous pointers in IMSIC vector drm/amd/pm: Fetch current power limit from PMFW drm/amd/display: Add support for disconnected eDP streams drm/amd/display: Guard against setting dispclk low when active drm/amd/display: Fix BT2020 YCbCr limited/full range input drm/amd/display: Read LTTPR ALPM caps during link cap retrieval Revert "drm/amd/display: Request HW cursor on DCN3.2 with SubVP" drm/amd/display: Don't treat wb connector as physical in create_validate_stream_for_sink serial: mctrl_gpio: split disable_ms into sync and no_sync APIs RDMA/core: Fix best page size finding when it can cross SG entries pmdomain: imx: gpcv2: use proper helper for property detection can: c_can: Use of_property_present() to test existence of DT property bpf: don't do clean_live_states when state->loop_entry->branches > 0 bpf: copy_verifier_state() should copy 'loop_entry' field eth: mlx4: don't try to complete XDP frames in netpoll PCI: Fix old_size lower bound in calculate_iosize() too ACPI: HED: Always initialize before evged vxlan: Join / leave MC group after remote changes hrtimers: Replace hrtimer_clock_to_base_table with switch-case irqchip/riscv-imsic: Set irq_set_affinity() for IMSIC base media: test-drivers: vivid: don't call schedule in loop net/mlx5: Modify LSB bitmask in temperature event to include only the first bit net/mlx5: Apply rate-limiting to high temperature warning firmware: arm_ffa: Reject higher major version as incompatible firmware: arm_ffa: Handle the presence of host partition in the partition info firmware: xilinx: Dont send linux address to get fpga config get status ASoC: ops: Enforce platform maximum on initial value ASoC: tas2764: Add reg defaults for TAS2764_INT_CLK_CFG ASoC: tas2764: Mark SW_RESET as volatile ASoC: tas2764: Power up/down amp on mute ops ASoC: soc-dai: check return value at snd_soc_dai_set_tdm_slot() pinctrl: devicetree: do not goto err when probing hogs in pinctrl_dt_to_map smack: recognize ipv4 CIPSO w/o categories smack: Revert "smackfs: Added check catlen" kunit: tool: Use qboot on QEMU x86_64 media: i2c: imx219: Correct the minimum vblanking value media: v4l: Memset argument to 0 before calling get_mbus_config pad op net/mlx4_core: Avoid impossible mlx4_db_alloc() order value drm/xe: Stop ignoring errors from xe_ttm_stolen_mgr_init() drm/xe: Fix xe_tile_init_noalloc() error propagation clk: qcom: ipq5018: allow it to be bulid on arm32 clk: qcom: clk-alpha-pll: Do not use random stack value for recalc rate drm/xe/debugfs: fixed the return value of wedged_mode_set drm/xe/debugfs: Add missing xe_pm_runtime_put in wedge_mode_set x86/ibt: Handle FineIBT in handle_cfi_failure() x86/traps: Cleanup and robustify decode_bug() sched: Reduce the default slice to avoid tasks getting an extra tick serial: sh-sci: Update the suspend/resume support pinctrl: renesas: rzg2l: Add suspend/resume support for pull up/down phy: phy-rockchip-samsung-hdptx: Swap the definitions of LCPLL_REF and ROPLL_REF phy: core: don't require set_mode() callback for phy_get_mode() to work phy: exynos5-usbdrd: fix EDS distribution tuning (gs101) soundwire: amd: change the soundwire wake enable/disable sequence soundwire: cadence_master: set frame shape and divider based on actual clk freq net: stmmac: dwmac-loongson: Set correct {tx,rx}_fifo_size drm/amdgpu/mes11: fix set_hw_resources_1 calculation drm/amdkfd: fix missing L2 cache info in topology drm/amdgpu: Set snoop bit for SDMA for MI series drm/amd/display: pass calculated dram_speed_mts to dml2 drm/amd/display: Don't try AUX transactions on disconnected link drm/amdgpu: reset psp->cmd to NULL after releasing the buffer drm/amd/pm: Skip P2S load for SMU v13.0.12 drm/amd/display: Support multiple options during psr entry. Revert "drm/amd/display: Exit idle optimizations before attempt to access PHY" drm/amd/display: Update CR AUX RD interval interpretation drm/amd/display: Initial psr_version with correct setting drm/amd/display: Increase block_sequence array size drm/amd/display: Use Nominal vBlank If Provided Instead Of Capping It drm/amd/display: Populate register address for dentist for dcn401 drm/amdgpu: Use active umc info from discovery drm/amdgpu: enlarge the VBIOS binary size limit drm/amd/display/dm: drop hw_support check in amdgpu_dm_i2c_xfer() scsi: target: spc: Fix loop traversal in spc_rsoc_get_descr() net/mlx5: XDP, Enable TX side XDP multi-buffer support net/mlx5: Extend Ethtool loopback selftest to support non-linear SKB net/mlx5e: set the tx_queue_len for pfifo_fast net/mlx5e: reduce rep rxq depth to 256 for ECPF net/mlx5e: reduce the max log mpwrq sz for ECPF and reps drm/v3d: Add clock handling xfrm: prevent high SEQ input in non-ESN mode wifi: ath12k: fix the ampdu id fetch in the HAL_RX_MPDU_START TLV mptcp: pm: userspace: flags: clearer msg if no remote addr wifi: iwlwifi: use correct IMR dump variable wifi: iwlwifi: don't warn during reprobe wifi: mac80211: don't unconditionally call drv_mgd_complete_tx() wifi: mac80211: remove misplaced drv_mgd_complete_tx() call wifi: mac80211: set ieee80211_prep_tx_info::link_id upon Auth Rx net: fec: Refactor MAC reset to function powerpc/pseries/iommu: memory notifier incorrectly adds TCEs for pmemory powerpc/pseries/iommu: create DDW for devices with DMA mask less than 64-bits arch/powerpc/perf: Check the instruction type before creating sample with perf_mem_data_src ip: fib_rules: Fetch net from fib_rule in fib[46]_rule_configure(). r8152: add vendor/device ID pair for Dell Alienware AW1022z iio: adc: ad7944: don't use storagebits for sizing pstore: Change kmsg_bytes storage size to u32 leds: trigger: netdev: Configure LED blink interval for HW offload ext4: don't write back data before punch hole in nojournal mode ext4: remove writable userspace mappings before truncating page cache wifi: rtw88: Fix download_firmware_validate() for RTL8814AU wifi: rtw88: Fix __rtw_download_firmware() for RTL8814AU wifi: rtw89: coex: Assign value over than 0 to avoid firmware timer hang wifi: rtw89: fw: validate multi-firmware header before getting its size wifi: rtw89: fw: validate multi-firmware header before accessing wifi: rtw89: call power_on ahead before selecting firmware clk: qcom: camcc-sm8250: Use clk_rcg2_shared_ops for some RCGs net: page_pool: avoid false positive warning if NAPI was never added tools/power turbostat: Clustered Uncore MHz counters should honor show/hide options hwmon: (xgene-hwmon) use appropriate type for the latency value f2fs: introduce f2fs_base_attr for global sysfs entries media: qcom: camss: csid: Only add TPG v4l2 ctrl if TPG hardware is available media: qcom: camss: Add default case in vfe_src_pad_code drm/rockchip: vop2: Improve display modes handling on RK3588 HDMI0 eth: fbnic: set IFF_UNICAST_FLT to avoid enabling promiscuous mode when adding unicast addrs tools: ynl-gen: don't output external constants net/mlx5e: Avoid WARN_ON when configuring MQPRIO with HTB offload enabled cpufreq: amd-pstate: Remove unnecessary driver_lock in set_boost vxlan: Annotate FDB data races ipv4: ip_gre: Fix set but not used warning in ipgre_err() if IPv4-only r8169: don't scan PHY addresses > 0 net: flush_backlog() small changes bridge: mdb: Allow replace of a host-joined group ice: init flow director before RDMA ice: treat dyn_allowed only as suggestion rcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y rcu: handle unstable rdp in rcu_read_unlock_strict() rcu: fix header guard for rcu_all_qs() perf: Avoid the read if the count is already updated ice: count combined queues using Rx/Tx count drm/xe/relay: Don't use GFP_KERNEL for new transactions net/mana: fix warning in the writer of client oob scsi: lpfc: Handle duplicate D_IDs in ndlp search-by D_ID routine scsi: lpfc: Ignore ndlp rport mismatch in dev_loss_tmo callbk scsi: lpfc: Free phba irq in lpfc_sli4_enable_msi() when pci_irq_vector() fails scsi: st: Restore some drive settings after reset wifi: ath12k: Avoid napi_sync() before napi_enable() HID: usbkbd: Fix the bit shift number for LED_KANA arm64: zynqmp: add clock-output-names property in clock nodes ASoC: codecs: pcm3168a: Allow for 24-bit in provider mode ASoC: rt722-sdca: Add some missing readable registers irqchip/riscv-aplic: Add support for hart indexes dm vdo indexer: prevent unterminated string warning dm vdo: use a short static string for thread name prefix drm/ast: Find VBIOS mode from regular display size bpf: Use kallsyms to find the function name of a struct_ops's stub function bpftool: Fix readlink usage in get_fd_type firmware: arm_scmi: Relax duplicate name constraint across protocol ids perf/amd/ibs: Fix perf_ibs_op.cnt_mask for CurCnt perf/amd/ibs: Fix ->config to sample period calculation for OP PMU clk: renesas: rzg2l-cpg: Refactor Runtime PM clock validation wifi: rtl8xxxu: retry firmware download on error wifi: rtw88: Don't use static local variable in rtw8822b_set_tx_power_index_by_rate wifi: rtw89: add wiphy_lock() to work that isn't held wiphy_lock() yet spi: zynqmp-gqspi: Always acknowledge interrupts regulator: ad5398: Add device tree support wifi: ath12k: fix ath12k_hal_tx_cmd_ext_desc_setup() info1 override accel/qaic: Mask out SR-IOV PCI resources drm/xe/pf: Reset GuC VF config when unprovisioning critical resource wifi: ath9k: return by of_get_mac_address wifi: ath12k: Fetch regdb.bin file from board-2.bin wifi: ath12k: Fix end offset bit definition in monitor ring descriptor drm: bridge: adv7511: fill stream capabilities drm/nouveau: fix the broken marco GSP_MSG_MAX_SIZE wifi: ath11k: Use dma_alloc_noncoherent for rx_tid buffer allocation drm/xe: Move suballocator init to after display init drm/xe: Do not attempt to bootstrap VF in execlists mode wifi: rtw89: coex: Separated Wi-Fi connecting event from Wi-Fi scan event drm/xe/sa: Always call drm_suballoc_manager_fini() drm/xe: Reject BO eviction if BO is bound to current VM drm/atomic: clarify the rules around drm_atomic_state->allow_modeset drm/buddy: fix issue that force_merge cannot free all roots drm/panel-edp: Add Starry 116KHD024006 drm: Add valid clones check ASoC: imx-card: Adjust over allocation of memory in imx_card_parse_of() book3s64/radix: Fix compile errors when CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=n pinctrl: meson: define the pull up/down resistor value as 60 kOhm smb: server: smb2pdu: check return value of xa_store() platform/x86/intel: hid: Add Pantherlake support platform/x86: asus-wmi: Disable OOBE state after resume from hibernation platform/x86: ideapad-laptop: add support for some new buttons ASoC: cs42l43: Disable headphone clamps during type detection ASoC: Intel: bytcr_rt5640: Add DMI quirk for Acer Aspire SW3-013 ALSA: hda/realtek: Add quirk for HP Spectre x360 15-df1xxx nvme-pci: add quirks for device 126f:1001 nvme-pci: add quirks for WDC Blue SN550 15b7:5009 ALSA: usb-audio: Fix duplicated name in MIDI substream names nvmet-tcp: don't restore null sk_state_change io_uring/fdinfo: annotate racy sq/cq head/tail reads cifs: Fix and improve cifs_query_path_info() and cifs_query_file_info() cifs: Fix changing times and read-only attr over SMB1 smb_set_file_info() function ASoC: intel/sdw_utils: Add volume limit to cs42l43 speakers btrfs: compression: adjust cb->compressed_folios allocation type btrfs: correct the order of prelim_ref arguments in btrfs__prelim_ref btrfs: handle empty eb->folios in num_extent_folios() btrfs: avoid NULL pointer dereference if no valid csum tree tools: ynl-gen: validate 0 len strings from kernel block: only update request sector if needed wifi: iwlwifi: add support for Killer on MTL x86/Kconfig: make CFI_AUTO_DEFAULT depend on !RUST or Rust >= 1.88 xenbus: Allow PVH dom0 a non-local xenstore drm/amd/display: Call FP Protect Before Mode Programming/Mode Support __legitimize_mnt(): check for MNT_SYNC_UMOUNT should be under mount_lock soundwire: bus: Fix race on the creation of the IRQ domain espintcp: fix skb leaks espintcp: remove encap socket caching to avoid reference leak xfrm: Fix UDP GRO handling for some corner cases dmaengine: idxd: Fix allowing write() from different address spaces x86/sev: Fix operator precedence in GHCB_MSR_VMPL_REQ_LEVEL macro kernel/fork: only call untrack_pfn_clear() on VMAs duplicated for fork() remoteproc: qcom_wcnss: Fix on platforms without fallback regulators clk: sunxi-ng: d1: Add missing divider for MMC mod clocks xfrm: Sanitize marks before insert dmaengine: idxd: Fix ->poll() return value dmaengine: fsl-edma: Fix return code for unhandled interrupts driver core: Split devres APIs to device/devres.h devres: Introduce devm_kmemdup_array() ASoC: SOF: Intel: hda: Fix UAF when reloading module irqchip/riscv-imsic: Start local sync timer on correct CPU perf/x86/intel: Fix segfault with PEBS-via-PT with sample_freq Bluetooth: L2CAP: Fix not checking l2cap_chan security level Bluetooth: btusb: use skb_pull to avoid unsafe access in QCA dump handling ptp: ocp: Limit signal/freq counts in summary output functions bridge: netfilter: Fix forwarding of fragmented packets ice: fix vf->num_mac count with port representors ice: Fix LACP bonds without SRIOV environment idpf: fix null-ptr-deref in idpf_features_check loop: don't require ->write_iter for writable files in loop_configure pinctrl: qcom: switch to devm_register_sys_off_handler() net: dwmac-sun8i: Use parsed internal PHY address instead of 1 net: lan743x: Restore SGMII CTRL register on resume io_uring: fix overflow resched cqe reordering idpf: fix idpf_vport_splitq_napi_poll() sch_hfsc: Fix qlen accounting bug when using peek in hfsc_enqueue() octeontx2-pf: Add AF_XDP non-zero copy support net/tipc: fix slab-use-after-free Read in tipc_aead_encrypt_done octeontx2-af: Set LMT_ENA bit for APR table entries octeontx2-af: Fix APR entry mapping based on APR_LMT_CFG clk: s2mps11: initialise clk_hw_onecell_data::num before accessing ::hws[] in probe() crypto: algif_hash - fix double free in hash_accept padata: do not leak refcount in reorder_work can: slcan: allow reception of short error messages can: bcm: add locking for bcm_op runtime updates can: bcm: add missing rcu read protection for procfs content ASoC: SOF: ipc4-control: Use SOF_CTRL_CMD_BINARY as numid for bytes_ext ASoC: SOF: Intel: hda-bus: Use PIO mode on ACE2+ platforms ASoc: SOF: topology: connect DAI to a single DAI link ASoC: SOF: ipc4-pcm: Delay reporting is only supported for playback direction ALSA: pcm: Fix race of buffer access at PCM OSS layer ALSA: hda/realtek: Add quirk for Lenovo Yoga Pro 7 14ASP10 llc: fix data loss when reading from a socket in llc_ui_recvmsg() can: kvaser_pciefd: Continue parsing DMA buf after dropped RX can: kvaser_pciefd: Fix echo_skb race net: dsa: microchip: linearize skb for tail-tagging switches vmxnet3: update MTU after device quiesce pmdomain: renesas: rcar: Remove obsolete nullify checks pmdomain: core: Fix error checking in genpd_dev_pm_attach_by_id() platform/x86: dell-wmi-sysman: Avoid buffer overflow in current_password_store() thermal: intel: x86_pkg_temp_thermal: Fix bogus trip temperature drm/edid: fixed the bug that hdr metadata was not reset smb: client: Fix use-after-free in cifs_fill_dirent arm64: dts: marvell: uDPU: define pinctrl state for alarm LEDs smb: client: Reset all search buffer pointers when releasing buffer Revert "drm/amd: Keep display off while going into S4" Input: xpad - add more controllers highmem: add folio_test_partial_kmap() memcg: always call cond_resched() after fn() mm/page_alloc.c: avoid infinite retries caused by cpuset race mm: mmap: map MAP_STACK to VM_NOHUGEPAGE only if THP is enabled mm: vmalloc: actually use the in-place vrealloc region mm: vmalloc: only zero-init on vrealloc shrink nilfs2: fix deadlock warnings caused by lock dependency in init_nilfs() Bluetooth: btmtksdio: Check function enabled before doing close Bluetooth: btmtksdio: Do close if SDIO card removed without close Revert "arm64: dts: allwinner: h6: Use RSB for AXP805 PMIC connection" ksmbd: fix stream write failure platform/x86: think-lmi: Fix attribute name usage for non-compliant items spi: use container_of_cont() for to_spi_device() spi: spi-fsl-dspi: restrict register range for regmap access spi: spi-fsl-dspi: Halt the module after a new message transfer spi: spi-fsl-dspi: Reset SR flags before sending a new message err.h: move IOMEM_ERR_PTR() to err.h gcc-15: make 'unterminated string initialization' just a warning gcc-15: disable '-Wunterminated-string-initialization' entirely for now Fix mis-uses of 'cc-option' for warning disablement kbuild: Properly disable -Wunterminated-string-initialization for clang drm/amd/display: Exit idle optimizations before accessing PHY bpf: abort verification if env->cur_state->loop_entry != NULL serial: sh-sci: Save and restore more registers drm/amdkfd: Correct F8_MODE for gfx950 watchdog: aspeed: fix 64-bit division pinctrl: tegra: Fix off by one in tegra_pinctrl_get_group() i3c: master: svc: Fix implicit fallthrough in svc_i3c_master_ibi_work() x86/mm/init: Handle the special case of device private pages in add_pages(), to not increase max_pfn and trigger dma_addressing_limited() bounce buffers bounce buffers drm/gem: Internally test import_attach for imported objects Linux 6.12.31 Change-Id: I017795966fb764f9320a6a0df1571d19e5e631fe Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
6
Makefile
6
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 12
|
||||
SUBLEVEL = 30
|
||||
SUBLEVEL = 31
|
||||
EXTRAVERSION =
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
@@ -1029,10 +1029,6 @@ NOSTDINC_FLAGS += -nostdinc
|
||||
# perform bounds checking.
|
||||
KBUILD_CFLAGS += $(call cc-option, -fstrict-flex-arrays=3)
|
||||
|
||||
#Currently, disable -Wstringop-overflow for GCC 11, globally.
|
||||
KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-option, -Wno-stringop-overflow)
|
||||
KBUILD_CFLAGS-$(CONFIG_CC_STRINGOP_OVERFLOW) += $(call cc-option, -Wstringop-overflow)
|
||||
|
||||
# disable invalid "can't wrap" optimizations for signed / pointers
|
||||
KBUILD_CFLAGS += -fno-strict-overflow
|
||||
|
||||
|
||||
@@ -151,28 +151,12 @@
|
||||
vcc-pg-supply = <®_aldo1>;
|
||||
};
|
||||
|
||||
&r_ir {
|
||||
linux,rc-map-name = "rc-beelink-gs1";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&r_pio {
|
||||
/*
|
||||
* FIXME: We can't add that supply for now since it would
|
||||
* create a circular dependency between pinctrl, the regulator
|
||||
* and the RSB Bus.
|
||||
*
|
||||
* vcc-pl-supply = <®_aldo1>;
|
||||
*/
|
||||
vcc-pm-supply = <®_aldo1>;
|
||||
};
|
||||
|
||||
&r_rsb {
|
||||
&r_i2c {
|
||||
status = "okay";
|
||||
|
||||
axp805: pmic@745 {
|
||||
axp805: pmic@36 {
|
||||
compatible = "x-powers,axp805", "x-powers,axp806";
|
||||
reg = <0x745>;
|
||||
reg = <0x36>;
|
||||
interrupt-parent = <&r_intc>;
|
||||
interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_LOW>;
|
||||
interrupt-controller;
|
||||
@@ -290,6 +274,22 @@
|
||||
};
|
||||
};
|
||||
|
||||
&r_ir {
|
||||
linux,rc-map-name = "rc-beelink-gs1";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&r_pio {
|
||||
/*
|
||||
* PL0 and PL1 are used for PMIC I2C
|
||||
* don't enable the pl-supply else
|
||||
* it will fail at boot
|
||||
*
|
||||
* vcc-pl-supply = <®_aldo1>;
|
||||
*/
|
||||
vcc-pm-supply = <®_aldo1>;
|
||||
};
|
||||
|
||||
&spdif {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spdif_tx_pin>;
|
||||
|
||||
@@ -175,16 +175,12 @@
|
||||
vcc-pg-supply = <®_vcc_wifi_io>;
|
||||
};
|
||||
|
||||
&r_ir {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&r_rsb {
|
||||
&r_i2c {
|
||||
status = "okay";
|
||||
|
||||
axp805: pmic@745 {
|
||||
axp805: pmic@36 {
|
||||
compatible = "x-powers,axp805", "x-powers,axp806";
|
||||
reg = <0x745>;
|
||||
reg = <0x36>;
|
||||
interrupt-parent = <&r_intc>;
|
||||
interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_LOW>;
|
||||
interrupt-controller;
|
||||
@@ -295,6 +291,10 @@
|
||||
};
|
||||
};
|
||||
|
||||
&r_ir {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rtc {
|
||||
clocks = <&ext_osc32k>;
|
||||
};
|
||||
|
||||
@@ -112,20 +112,12 @@
|
||||
vcc-pg-supply = <®_aldo1>;
|
||||
};
|
||||
|
||||
&r_ir {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&r_pio {
|
||||
vcc-pm-supply = <®_bldo3>;
|
||||
};
|
||||
|
||||
&r_rsb {
|
||||
&r_i2c {
|
||||
status = "okay";
|
||||
|
||||
axp805: pmic@745 {
|
||||
axp805: pmic@36 {
|
||||
compatible = "x-powers,axp805", "x-powers,axp806";
|
||||
reg = <0x745>;
|
||||
reg = <0x36>;
|
||||
interrupt-parent = <&r_intc>;
|
||||
interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_LOW>;
|
||||
interrupt-controller;
|
||||
@@ -240,6 +232,14 @@
|
||||
};
|
||||
};
|
||||
|
||||
&r_ir {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&r_pio {
|
||||
vcc-pm-supply = <®_bldo3>;
|
||||
};
|
||||
|
||||
&rtc {
|
||||
clocks = <&ext_osc32k>;
|
||||
};
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_quad_pins>;
|
||||
|
||||
led-power1 {
|
||||
label = "udpu:green:power";
|
||||
@@ -82,8 +84,6 @@
|
||||
|
||||
&spi0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi_quad_pins>;
|
||||
|
||||
flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
@@ -108,6 +108,10 @@
|
||||
};
|
||||
};
|
||||
|
||||
&spi_quad_pins {
|
||||
function = "gpio";
|
||||
};
|
||||
|
||||
&pinctrl_nb {
|
||||
i2c2_recovery_pins: i2c2-recovery-pins {
|
||||
groups = "i2c2";
|
||||
|
||||
@@ -10,39 +10,44 @@
|
||||
|
||||
#include <dt-bindings/clock/xlnx-zynqmp-clk.h>
|
||||
/ {
|
||||
pss_ref_clk: pss_ref_clk {
|
||||
pss_ref_clk: pss-ref-clk {
|
||||
bootph-all;
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <33333333>;
|
||||
clock-output-names = "pss_ref_clk";
|
||||
};
|
||||
|
||||
video_clk: video_clk {
|
||||
video_clk: video-clk {
|
||||
bootph-all;
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <27000000>;
|
||||
clock-output-names = "video_clk";
|
||||
};
|
||||
|
||||
pss_alt_ref_clk: pss_alt_ref_clk {
|
||||
pss_alt_ref_clk: pss-alt-ref-clk {
|
||||
bootph-all;
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <0>;
|
||||
clock-output-names = "pss_alt_ref_clk";
|
||||
};
|
||||
|
||||
gt_crx_ref_clk: gt_crx_ref_clk {
|
||||
gt_crx_ref_clk: gt-crx-ref-clk {
|
||||
bootph-all;
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <108000000>;
|
||||
clock-output-names = "gt_crx_ref_clk";
|
||||
};
|
||||
|
||||
aux_ref_clk: aux_ref_clk {
|
||||
aux_ref_clk: aux-ref-clk {
|
||||
bootph-all;
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <27000000>;
|
||||
clock-output-names = "aux_ref_clk";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -21,10 +21,10 @@ obj-$(CONFIG_CPU_HAS_LBT) += lbt.o
|
||||
|
||||
obj-$(CONFIG_ARCH_STRICT_ALIGN) += unaligned.o
|
||||
|
||||
CFLAGS_module.o += $(call cc-option,-Wno-override-init,)
|
||||
CFLAGS_syscall.o += $(call cc-option,-Wno-override-init,)
|
||||
CFLAGS_traps.o += $(call cc-option,-Wno-override-init,)
|
||||
CFLAGS_perf_event.o += $(call cc-option,-Wno-override-init,)
|
||||
CFLAGS_module.o += $(call cc-disable-warning, override-init)
|
||||
CFLAGS_syscall.o += $(call cc-disable-warning, override-init)
|
||||
CFLAGS_traps.o += $(call cc-disable-warning, override-init)
|
||||
CFLAGS_perf_event.o += $(call cc-disable-warning, override-init)
|
||||
|
||||
ifdef CONFIG_FUNCTION_TRACER
|
||||
ifndef CONFIG_DYNAMIC_FTRACE
|
||||
|
||||
@@ -19,4 +19,4 @@ kvm-y += tlb.o
|
||||
kvm-y += vcpu.o
|
||||
kvm-y += vm.o
|
||||
|
||||
CFLAGS_exit.o += $(call cc-option,-Wno-override-init,)
|
||||
CFLAGS_exit.o += $(call cc-disable-warning, override-init)
|
||||
|
||||
@@ -988,7 +988,7 @@ int __meminit radix__vmemmap_create_mapping(unsigned long start,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP
|
||||
bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap)
|
||||
{
|
||||
if (radix_enabled())
|
||||
@@ -996,6 +996,7 @@ bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap)
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
int __meminit vmemmap_check_pmd(pmd_t *pmdp, int node,
|
||||
unsigned long addr, unsigned long next)
|
||||
|
||||
@@ -9,8 +9,8 @@ CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE)
|
||||
endif
|
||||
CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,)
|
||||
CFLAGS_compat_syscall_table.o += $(call cc-option,-Wno-override-init,)
|
||||
CFLAGS_syscall_table.o += $(call cc-disable-warning, override-init)
|
||||
CFLAGS_compat_syscall_table.o += $(call cc-disable-warning, override-init)
|
||||
|
||||
ifdef CONFIG_KEXEC_CORE
|
||||
AFLAGS_kexec_relocate.o := -mcmodel=medany $(call cc-option,-mno-relax)
|
||||
|
||||
@@ -2421,6 +2421,7 @@ config STRICT_SIGALTSTACK_SIZE
|
||||
config CFI_AUTO_DEFAULT
|
||||
bool "Attempt to use FineIBT by default at boot time"
|
||||
depends on FINEIBT
|
||||
depends on !RUST || RUSTC_VERSION >= 108800
|
||||
default y
|
||||
help
|
||||
Attempt to use FineIBT by default at boot time. If enabled,
|
||||
|
||||
@@ -272,7 +272,7 @@ static int perf_ibs_init(struct perf_event *event)
|
||||
{
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
struct perf_ibs *perf_ibs;
|
||||
u64 max_cnt, config;
|
||||
u64 config;
|
||||
int ret;
|
||||
|
||||
perf_ibs = get_ibs_pmu(event->attr.type);
|
||||
@@ -309,10 +309,19 @@ static int perf_ibs_init(struct perf_event *event)
|
||||
if (!hwc->sample_period)
|
||||
hwc->sample_period = 0x10;
|
||||
} else {
|
||||
max_cnt = config & perf_ibs->cnt_mask;
|
||||
u64 period = 0;
|
||||
|
||||
if (perf_ibs == &perf_ibs_op) {
|
||||
period = (config & IBS_OP_MAX_CNT) << 4;
|
||||
if (ibs_caps & IBS_CAPS_OPCNTEXT)
|
||||
period |= config & IBS_OP_MAX_CNT_EXT_MASK;
|
||||
} else {
|
||||
period = (config & IBS_FETCH_MAX_CNT) << 4;
|
||||
}
|
||||
|
||||
config &= ~perf_ibs->cnt_mask;
|
||||
event->attr.sample_period = max_cnt << 4;
|
||||
hwc->sample_period = event->attr.sample_period;
|
||||
event->attr.sample_period = period;
|
||||
hwc->sample_period = period;
|
||||
}
|
||||
|
||||
if (!hwc->sample_period)
|
||||
@@ -1222,7 +1231,8 @@ static __init int perf_ibs_op_init(void)
|
||||
if (ibs_caps & IBS_CAPS_OPCNTEXT) {
|
||||
perf_ibs_op.max_period |= IBS_OP_MAX_CNT_EXT_MASK;
|
||||
perf_ibs_op.config_mask |= IBS_OP_MAX_CNT_EXT_MASK;
|
||||
perf_ibs_op.cnt_mask |= IBS_OP_MAX_CNT_EXT_MASK;
|
||||
perf_ibs_op.cnt_mask |= (IBS_OP_MAX_CNT_EXT_MASK |
|
||||
IBS_OP_CUR_CNT_EXT_MASK);
|
||||
}
|
||||
|
||||
if (ibs_caps & IBS_CAPS_ZEN4)
|
||||
|
||||
@@ -2240,8 +2240,9 @@ static void intel_pmu_drain_pebs_core(struct pt_regs *iregs, struct perf_sample_
|
||||
setup_pebs_fixed_sample_data);
|
||||
}
|
||||
|
||||
static void intel_pmu_pebs_event_update_no_drain(struct cpu_hw_events *cpuc, int size)
|
||||
static void intel_pmu_pebs_event_update_no_drain(struct cpu_hw_events *cpuc, u64 mask)
|
||||
{
|
||||
u64 pebs_enabled = cpuc->pebs_enabled & mask;
|
||||
struct perf_event *event;
|
||||
int bit;
|
||||
|
||||
@@ -2252,7 +2253,7 @@ static void intel_pmu_pebs_event_update_no_drain(struct cpu_hw_events *cpuc, int
|
||||
* It needs to call intel_pmu_save_and_restart_reload() to
|
||||
* update the event->count for this case.
|
||||
*/
|
||||
for_each_set_bit(bit, (unsigned long *)&cpuc->pebs_enabled, size) {
|
||||
for_each_set_bit(bit, (unsigned long *)&pebs_enabled, X86_PMC_IDX_MAX) {
|
||||
event = cpuc->events[bit];
|
||||
if (event->hw.flags & PERF_X86_EVENT_AUTO_RELOAD)
|
||||
intel_pmu_save_and_restart_reload(event, 0);
|
||||
@@ -2287,7 +2288,7 @@ static void intel_pmu_drain_pebs_nhm(struct pt_regs *iregs, struct perf_sample_d
|
||||
}
|
||||
|
||||
if (unlikely(base >= top)) {
|
||||
intel_pmu_pebs_event_update_no_drain(cpuc, size);
|
||||
intel_pmu_pebs_event_update_no_drain(cpuc, mask);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2397,7 +2398,7 @@ static void intel_pmu_drain_pebs_icl(struct pt_regs *iregs, struct perf_sample_d
|
||||
(hybrid(cpuc->pmu, fixed_cntr_mask64) << INTEL_PMC_IDX_FIXED);
|
||||
|
||||
if (unlikely(base >= top)) {
|
||||
intel_pmu_pebs_event_update_no_drain(cpuc, X86_PMC_IDX_MAX);
|
||||
intel_pmu_pebs_event_update_no_drain(cpuc, mask);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -520,6 +520,7 @@ struct pebs_xmm {
|
||||
*/
|
||||
#define IBS_OP_CUR_CNT (0xFFF80ULL<<32)
|
||||
#define IBS_OP_CUR_CNT_RAND (0x0007FULL<<32)
|
||||
#define IBS_OP_CUR_CNT_EXT_MASK (0x7FULL<<52)
|
||||
#define IBS_OP_CNT_CTL (1ULL<<19)
|
||||
#define IBS_OP_VAL (1ULL<<18)
|
||||
#define IBS_OP_ENABLE (1ULL<<17)
|
||||
|
||||
@@ -116,7 +116,7 @@ enum psc_op {
|
||||
#define GHCB_MSR_VMPL_REQ 0x016
|
||||
#define GHCB_MSR_VMPL_REQ_LEVEL(v) \
|
||||
/* GHCBData[39:32] */ \
|
||||
(((u64)(v) & GENMASK_ULL(7, 0) << 32) | \
|
||||
((((u64)(v) & GENMASK_ULL(7, 0)) << 32) | \
|
||||
/* GHCBDdata[11:0] */ \
|
||||
GHCB_MSR_VMPL_REQ)
|
||||
|
||||
|
||||
@@ -967,9 +967,18 @@ int add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages,
|
||||
ret = __add_pages(nid, start_pfn, nr_pages, params);
|
||||
WARN_ON_ONCE(ret);
|
||||
|
||||
/* update max_pfn, max_low_pfn and high_memory */
|
||||
update_end_of_memory_vars(start_pfn << PAGE_SHIFT,
|
||||
nr_pages << PAGE_SHIFT);
|
||||
/*
|
||||
* Special case: add_pages() is called by memremap_pages() for adding device
|
||||
* private pages. Do not bump up max_pfn in the device private path,
|
||||
* because max_pfn changes affect dma_addressing_limited().
|
||||
*
|
||||
* dma_addressing_limited() returning true when max_pfn is the device's
|
||||
* addressable memory can force device drivers to use bounce buffers
|
||||
* and impact their performance negatively:
|
||||
*/
|
||||
if (!params->pgmap)
|
||||
/* update max_pfn, max_low_pfn and high_memory */
|
||||
update_end_of_memory_vars(start_pfn << PAGE_SHIFT, nr_pages << PAGE_SHIFT);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -488,7 +488,8 @@ static inline void blk_zone_update_request_bio(struct request *rq,
|
||||
* the original BIO sector so that blk_zone_write_plug_bio_endio() can
|
||||
* lookup the zone write plug.
|
||||
*/
|
||||
if (req_op(rq) == REQ_OP_ZONE_APPEND || bio_zone_write_plugging(bio))
|
||||
if (req_op(rq) == REQ_OP_ZONE_APPEND ||
|
||||
bio_flagged(bio, BIO_EMULATES_ZONE_APPEND))
|
||||
bio->bi_iter.bi_sector = rq->__sector;
|
||||
}
|
||||
void blk_zone_write_plug_bio_endio(struct bio *bio);
|
||||
|
||||
@@ -265,10 +265,6 @@ static int hash_accept(struct socket *sock, struct socket *newsock,
|
||||
goto out_free_state;
|
||||
|
||||
err = crypto_ahash_import(&ctx2->req, state);
|
||||
if (err) {
|
||||
sock_orphan(sk2);
|
||||
sock_put(sk2);
|
||||
}
|
||||
|
||||
out_free_state:
|
||||
kfree_sensitive(state);
|
||||
|
||||
@@ -432,7 +432,7 @@ static int init_pci(struct qaic_device *qdev, struct pci_dev *pdev)
|
||||
int bars;
|
||||
int ret;
|
||||
|
||||
bars = pci_select_bars(pdev, IORESOURCE_MEM);
|
||||
bars = pci_select_bars(pdev, IORESOURCE_MEM) & 0x3f;
|
||||
|
||||
/* make sure the device has the expected BARs */
|
||||
if (bars != (BIT(0) | BIT(2) | BIT(4))) {
|
||||
|
||||
@@ -723,6 +723,10 @@ static int btmtksdio_close(struct hci_dev *hdev)
|
||||
{
|
||||
struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);
|
||||
|
||||
/* Skip btmtksdio_close if BTMTKSDIO_FUNC_ENABLED isn't set */
|
||||
if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state))
|
||||
return 0;
|
||||
|
||||
sdio_claim_host(bdev->func);
|
||||
|
||||
/* Disable interrupt */
|
||||
@@ -1430,11 +1434,15 @@ static void btmtksdio_remove(struct sdio_func *func)
|
||||
if (!bdev)
|
||||
return;
|
||||
|
||||
hdev = bdev->hdev;
|
||||
|
||||
/* Make sure to call btmtksdio_close before removing sdio card */
|
||||
if (test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state))
|
||||
btmtksdio_close(hdev);
|
||||
|
||||
/* Be consistent the state in btmtksdio_probe */
|
||||
pm_runtime_get_noresume(bdev->dev);
|
||||
|
||||
hdev = bdev->hdev;
|
||||
|
||||
sdio_set_drvdata(func, NULL);
|
||||
hci_unregister_dev(hdev);
|
||||
hci_free_dev(hdev);
|
||||
|
||||
@@ -2967,9 +2967,8 @@ static void btusb_coredump_qca(struct hci_dev *hdev)
|
||||
static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
{
|
||||
int ret = 0;
|
||||
unsigned int skip = 0;
|
||||
u8 pkt_type;
|
||||
u8 *sk_ptr;
|
||||
unsigned int sk_len;
|
||||
u16 seqno;
|
||||
u32 dump_size;
|
||||
|
||||
@@ -2978,18 +2977,13 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
struct usb_device *udev = btdata->udev;
|
||||
|
||||
pkt_type = hci_skb_pkt_type(skb);
|
||||
sk_ptr = skb->data;
|
||||
sk_len = skb->len;
|
||||
skip = sizeof(struct hci_event_hdr);
|
||||
if (pkt_type == HCI_ACLDATA_PKT)
|
||||
skip += sizeof(struct hci_acl_hdr);
|
||||
|
||||
if (pkt_type == HCI_ACLDATA_PKT) {
|
||||
sk_ptr += HCI_ACL_HDR_SIZE;
|
||||
sk_len -= HCI_ACL_HDR_SIZE;
|
||||
}
|
||||
skb_pull(skb, skip);
|
||||
dump_hdr = (struct qca_dump_hdr *)skb->data;
|
||||
|
||||
sk_ptr += HCI_EVENT_HDR_SIZE;
|
||||
sk_len -= HCI_EVENT_HDR_SIZE;
|
||||
|
||||
dump_hdr = (struct qca_dump_hdr *)sk_ptr;
|
||||
seqno = le16_to_cpu(dump_hdr->seqno);
|
||||
if (seqno == 0) {
|
||||
set_bit(BTUSB_HW_SSR_ACTIVE, &btdata->flags);
|
||||
@@ -3009,16 +3003,15 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
|
||||
btdata->qca_dump.ram_dump_size = dump_size;
|
||||
btdata->qca_dump.ram_dump_seqno = 0;
|
||||
sk_ptr += offsetof(struct qca_dump_hdr, data0);
|
||||
sk_len -= offsetof(struct qca_dump_hdr, data0);
|
||||
|
||||
skb_pull(skb, offsetof(struct qca_dump_hdr, data0));
|
||||
|
||||
usb_disable_autosuspend(udev);
|
||||
bt_dev_info(hdev, "%s memdump size(%u)\n",
|
||||
(pkt_type == HCI_ACLDATA_PKT) ? "ACL" : "event",
|
||||
dump_size);
|
||||
} else {
|
||||
sk_ptr += offsetof(struct qca_dump_hdr, data);
|
||||
sk_len -= offsetof(struct qca_dump_hdr, data);
|
||||
skb_pull(skb, offsetof(struct qca_dump_hdr, data));
|
||||
}
|
||||
|
||||
if (!btdata->qca_dump.ram_dump_size) {
|
||||
@@ -3038,7 +3031,6 @@ static int handle_dump_pkt_qca(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
return ret;
|
||||
}
|
||||
|
||||
skb_pull(skb, skb->len - sk_len);
|
||||
hci_devcd_append(hdev, skb);
|
||||
btdata->qca_dump.ram_dump_seqno++;
|
||||
if (seqno == QCA_LAST_SEQUENCE_NUM) {
|
||||
@@ -3066,68 +3058,58 @@ out:
|
||||
/* Return: true if the ACL packet is a dump packet, false otherwise. */
|
||||
static bool acl_pkt_is_dump_qca(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
{
|
||||
u8 *sk_ptr;
|
||||
unsigned int sk_len;
|
||||
|
||||
struct hci_event_hdr *event_hdr;
|
||||
struct hci_acl_hdr *acl_hdr;
|
||||
struct qca_dump_hdr *dump_hdr;
|
||||
struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
|
||||
bool is_dump = false;
|
||||
|
||||
sk_ptr = skb->data;
|
||||
sk_len = skb->len;
|
||||
|
||||
acl_hdr = hci_acl_hdr(skb);
|
||||
if (le16_to_cpu(acl_hdr->handle) != QCA_MEMDUMP_ACL_HANDLE)
|
||||
if (!clone)
|
||||
return false;
|
||||
|
||||
sk_ptr += HCI_ACL_HDR_SIZE;
|
||||
sk_len -= HCI_ACL_HDR_SIZE;
|
||||
event_hdr = (struct hci_event_hdr *)sk_ptr;
|
||||
acl_hdr = skb_pull_data(clone, sizeof(*acl_hdr));
|
||||
if (!acl_hdr || (le16_to_cpu(acl_hdr->handle) != QCA_MEMDUMP_ACL_HANDLE))
|
||||
goto out;
|
||||
|
||||
if ((event_hdr->evt != HCI_VENDOR_PKT) ||
|
||||
(event_hdr->plen != (sk_len - HCI_EVENT_HDR_SIZE)))
|
||||
return false;
|
||||
event_hdr = skb_pull_data(clone, sizeof(*event_hdr));
|
||||
if (!event_hdr || (event_hdr->evt != HCI_VENDOR_PKT))
|
||||
goto out;
|
||||
|
||||
sk_ptr += HCI_EVENT_HDR_SIZE;
|
||||
sk_len -= HCI_EVENT_HDR_SIZE;
|
||||
dump_hdr = skb_pull_data(clone, sizeof(*dump_hdr));
|
||||
if (!dump_hdr || (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) ||
|
||||
(dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE))
|
||||
goto out;
|
||||
|
||||
dump_hdr = (struct qca_dump_hdr *)sk_ptr;
|
||||
if ((sk_len < offsetof(struct qca_dump_hdr, data)) ||
|
||||
(dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) ||
|
||||
(dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
is_dump = true;
|
||||
out:
|
||||
consume_skb(clone);
|
||||
return is_dump;
|
||||
}
|
||||
|
||||
/* Return: true if the event packet is a dump packet, false otherwise. */
|
||||
static bool evt_pkt_is_dump_qca(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
{
|
||||
u8 *sk_ptr;
|
||||
unsigned int sk_len;
|
||||
|
||||
struct hci_event_hdr *event_hdr;
|
||||
struct qca_dump_hdr *dump_hdr;
|
||||
struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
|
||||
bool is_dump = false;
|
||||
|
||||
sk_ptr = skb->data;
|
||||
sk_len = skb->len;
|
||||
|
||||
event_hdr = hci_event_hdr(skb);
|
||||
|
||||
if ((event_hdr->evt != HCI_VENDOR_PKT)
|
||||
|| (event_hdr->plen != (sk_len - HCI_EVENT_HDR_SIZE)))
|
||||
if (!clone)
|
||||
return false;
|
||||
|
||||
sk_ptr += HCI_EVENT_HDR_SIZE;
|
||||
sk_len -= HCI_EVENT_HDR_SIZE;
|
||||
event_hdr = skb_pull_data(clone, sizeof(*event_hdr));
|
||||
if (!event_hdr || (event_hdr->evt != HCI_VENDOR_PKT))
|
||||
goto out;
|
||||
|
||||
dump_hdr = (struct qca_dump_hdr *)sk_ptr;
|
||||
if ((sk_len < offsetof(struct qca_dump_hdr, data)) ||
|
||||
(dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) ||
|
||||
(dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE))
|
||||
return false;
|
||||
dump_hdr = skb_pull_data(clone, sizeof(*dump_hdr));
|
||||
if (!dump_hdr || (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) ||
|
||||
(dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE))
|
||||
goto out;
|
||||
|
||||
return true;
|
||||
is_dump = true;
|
||||
out:
|
||||
consume_skb(clone);
|
||||
return is_dump;
|
||||
}
|
||||
|
||||
static int btusb_recv_acl_qca(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
|
||||
@@ -137,6 +137,8 @@ static int s2mps11_clk_probe(struct platform_device *pdev)
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
clk_data->num = S2MPS11_CLKS_NUM;
|
||||
|
||||
switch (hwid) {
|
||||
case S2MPS11X:
|
||||
s2mps11_reg = S2MPS11_REG_RTC_CTRL;
|
||||
@@ -186,7 +188,6 @@ static int s2mps11_clk_probe(struct platform_device *pdev)
|
||||
clk_data->hws[i] = &s2mps11_clks[i].hw;
|
||||
}
|
||||
|
||||
clk_data->num = S2MPS11_CLKS_NUM;
|
||||
of_clk_add_hw_provider(s2mps11_clks->clk_np, of_clk_hw_onecell_get,
|
||||
clk_data);
|
||||
|
||||
|
||||
@@ -1549,28 +1549,6 @@ static int rzg2l_cpg_reset_controller_register(struct rzg2l_cpg_priv *priv)
|
||||
return devm_reset_controller_register(priv->dev, &priv->rcdev);
|
||||
}
|
||||
|
||||
static bool rzg2l_cpg_is_pm_clk(struct rzg2l_cpg_priv *priv,
|
||||
const struct of_phandle_args *clkspec)
|
||||
{
|
||||
const struct rzg2l_cpg_info *info = priv->info;
|
||||
unsigned int id;
|
||||
unsigned int i;
|
||||
|
||||
if (clkspec->args_count != 2)
|
||||
return false;
|
||||
|
||||
if (clkspec->args[0] != CPG_MOD)
|
||||
return false;
|
||||
|
||||
id = clkspec->args[1] + info->num_total_core_clks;
|
||||
for (i = 0; i < info->num_no_pm_mod_clks; i++) {
|
||||
if (info->no_pm_mod_clks[i] == id)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* struct rzg2l_cpg_pm_domains - RZ/G2L PM domains data structure
|
||||
* @onecell_data: cell data
|
||||
@@ -1595,45 +1573,73 @@ struct rzg2l_cpg_pd {
|
||||
u16 id;
|
||||
};
|
||||
|
||||
static bool rzg2l_cpg_is_pm_clk(struct rzg2l_cpg_pd *pd,
|
||||
const struct of_phandle_args *clkspec)
|
||||
{
|
||||
if (clkspec->np != pd->genpd.dev.of_node || clkspec->args_count != 2)
|
||||
return false;
|
||||
|
||||
switch (clkspec->args[0]) {
|
||||
case CPG_MOD: {
|
||||
struct rzg2l_cpg_priv *priv = pd->priv;
|
||||
const struct rzg2l_cpg_info *info = priv->info;
|
||||
unsigned int id = clkspec->args[1];
|
||||
|
||||
if (id >= priv->num_mod_clks)
|
||||
return false;
|
||||
|
||||
id += info->num_total_core_clks;
|
||||
|
||||
for (unsigned int i = 0; i < info->num_no_pm_mod_clks; i++) {
|
||||
if (info->no_pm_mod_clks[i] == id)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
case CPG_CORE:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static int rzg2l_cpg_attach_dev(struct generic_pm_domain *domain, struct device *dev)
|
||||
{
|
||||
struct rzg2l_cpg_pd *pd = container_of(domain, struct rzg2l_cpg_pd, genpd);
|
||||
struct rzg2l_cpg_priv *priv = pd->priv;
|
||||
struct device_node *np = dev->of_node;
|
||||
struct of_phandle_args clkspec;
|
||||
bool once = true;
|
||||
struct clk *clk;
|
||||
unsigned int i;
|
||||
int error;
|
||||
int i = 0;
|
||||
|
||||
while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i,
|
||||
&clkspec)) {
|
||||
if (rzg2l_cpg_is_pm_clk(priv, &clkspec)) {
|
||||
if (once) {
|
||||
once = false;
|
||||
error = pm_clk_create(dev);
|
||||
if (error) {
|
||||
of_node_put(clkspec.np);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
clk = of_clk_get_from_provider(&clkspec);
|
||||
of_node_put(clkspec.np);
|
||||
if (IS_ERR(clk)) {
|
||||
error = PTR_ERR(clk);
|
||||
goto fail_destroy;
|
||||
}
|
||||
|
||||
error = pm_clk_add_clk(dev, clk);
|
||||
if (error) {
|
||||
dev_err(dev, "pm_clk_add_clk failed %d\n",
|
||||
error);
|
||||
goto fail_put;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; !of_parse_phandle_with_args(np, "clocks", "#clock-cells", i, &clkspec); i++) {
|
||||
if (!rzg2l_cpg_is_pm_clk(pd, &clkspec)) {
|
||||
of_node_put(clkspec.np);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (once) {
|
||||
once = false;
|
||||
error = pm_clk_create(dev);
|
||||
if (error) {
|
||||
of_node_put(clkspec.np);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
clk = of_clk_get_from_provider(&clkspec);
|
||||
of_node_put(clkspec.np);
|
||||
if (IS_ERR(clk)) {
|
||||
error = PTR_ERR(clk);
|
||||
goto fail_destroy;
|
||||
}
|
||||
|
||||
error = pm_clk_add_clk(dev, clk);
|
||||
if (error) {
|
||||
dev_err(dev, "pm_clk_add_clk failed %d\n", error);
|
||||
goto fail_put;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -412,19 +412,23 @@ static const struct clk_parent_data mmc0_mmc1_parents[] = {
|
||||
{ .hw = &pll_periph0_2x_clk.common.hw },
|
||||
{ .hw = &pll_audio1_div2_clk.common.hw },
|
||||
};
|
||||
static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc0_clk, "mmc0", mmc0_mmc1_parents, 0x830,
|
||||
0, 4, /* M */
|
||||
8, 2, /* P */
|
||||
24, 3, /* mux */
|
||||
BIT(31), /* gate */
|
||||
0);
|
||||
static SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(mmc0_clk, "mmc0",
|
||||
mmc0_mmc1_parents, 0x830,
|
||||
0, 4, /* M */
|
||||
8, 2, /* P */
|
||||
24, 3, /* mux */
|
||||
BIT(31), /* gate */
|
||||
2, /* post-div */
|
||||
0);
|
||||
|
||||
static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc1_clk, "mmc1", mmc0_mmc1_parents, 0x834,
|
||||
0, 4, /* M */
|
||||
8, 2, /* P */
|
||||
24, 3, /* mux */
|
||||
BIT(31), /* gate */
|
||||
0);
|
||||
static SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(mmc1_clk, "mmc1",
|
||||
mmc0_mmc1_parents, 0x834,
|
||||
0, 4, /* M */
|
||||
8, 2, /* P */
|
||||
24, 3, /* mux */
|
||||
BIT(31), /* gate */
|
||||
2, /* post-div */
|
||||
0);
|
||||
|
||||
static const struct clk_parent_data mmc2_parents[] = {
|
||||
{ .fw_name = "hosc" },
|
||||
@@ -433,12 +437,14 @@ static const struct clk_parent_data mmc2_parents[] = {
|
||||
{ .hw = &pll_periph0_800M_clk.common.hw },
|
||||
{ .hw = &pll_audio1_div2_clk.common.hw },
|
||||
};
|
||||
static SUNXI_CCU_MP_DATA_WITH_MUX_GATE(mmc2_clk, "mmc2", mmc2_parents, 0x838,
|
||||
0, 4, /* M */
|
||||
8, 2, /* P */
|
||||
24, 3, /* mux */
|
||||
BIT(31), /* gate */
|
||||
0);
|
||||
static SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(mmc2_clk, "mmc2", mmc2_parents,
|
||||
0x838,
|
||||
0, 4, /* M */
|
||||
8, 2, /* P */
|
||||
24, 3, /* mux */
|
||||
BIT(31), /* gate */
|
||||
2, /* post-div */
|
||||
0);
|
||||
|
||||
static SUNXI_CCU_GATE_HWS(bus_mmc0_clk, "bus-mmc0", psi_ahb_hws,
|
||||
0x84c, BIT(0), 0);
|
||||
|
||||
@@ -52,6 +52,28 @@ struct ccu_mp {
|
||||
} \
|
||||
}
|
||||
|
||||
#define SUNXI_CCU_MP_DATA_WITH_MUX_GATE_POSTDIV(_struct, _name, _parents, \
|
||||
_reg, \
|
||||
_mshift, _mwidth, \
|
||||
_pshift, _pwidth, \
|
||||
_muxshift, _muxwidth, \
|
||||
_gate, _postdiv, _flags)\
|
||||
struct ccu_mp _struct = { \
|
||||
.enable = _gate, \
|
||||
.m = _SUNXI_CCU_DIV(_mshift, _mwidth), \
|
||||
.p = _SUNXI_CCU_DIV(_pshift, _pwidth), \
|
||||
.mux = _SUNXI_CCU_MUX(_muxshift, _muxwidth), \
|
||||
.fixed_post_div = _postdiv, \
|
||||
.common = { \
|
||||
.reg = _reg, \
|
||||
.features = CCU_FEATURE_FIXED_POSTDIV, \
|
||||
.hw.init = CLK_HW_INIT_PARENTS_DATA(_name, \
|
||||
_parents, \
|
||||
&ccu_mp_ops, \
|
||||
_flags), \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SUNXI_CCU_MP_WITH_MUX_GATE(_struct, _name, _parents, _reg, \
|
||||
_mshift, _mwidth, \
|
||||
_pshift, _pwidth, \
|
||||
|
||||
@@ -696,7 +696,6 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
|
||||
pr_err("Boost mode is not supported by this processor or SBIOS\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
guard(mutex)(&amd_pstate_driver_lock);
|
||||
|
||||
ret = amd_pstate_cpu_boost_update(policy, state);
|
||||
WRITE_ONCE(cpudata->boost_state, !ret ? state : false);
|
||||
|
||||
@@ -56,7 +56,7 @@ static irqreturn_t fsl_edma3_tx_handler(int irq, void *dev_id)
|
||||
|
||||
intr = edma_readl_chreg(fsl_chan, ch_int);
|
||||
if (!intr)
|
||||
return IRQ_HANDLED;
|
||||
return IRQ_NONE;
|
||||
|
||||
edma_writel_chreg(fsl_chan, 1, ch_int);
|
||||
|
||||
|
||||
@@ -412,6 +412,9 @@ static int idxd_cdev_mmap(struct file *filp, struct vm_area_struct *vma)
|
||||
if (!idxd->user_submission_safe && !capable(CAP_SYS_RAWIO))
|
||||
return -EPERM;
|
||||
|
||||
if (current->mm != ctx->mm)
|
||||
return -EPERM;
|
||||
|
||||
rc = check_vma(wq, vma, __func__);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
@@ -478,6 +481,9 @@ static ssize_t idxd_cdev_write(struct file *filp, const char __user *buf, size_t
|
||||
ssize_t written = 0;
|
||||
int i;
|
||||
|
||||
if (current->mm != ctx->mm)
|
||||
return -EPERM;
|
||||
|
||||
for (i = 0; i < len/sizeof(struct dsa_hw_desc); i++) {
|
||||
int rc = idxd_submit_user_descriptor(ctx, udesc + i);
|
||||
|
||||
@@ -498,6 +504,9 @@ static __poll_t idxd_cdev_poll(struct file *filp,
|
||||
struct idxd_device *idxd = wq->idxd;
|
||||
__poll_t out = 0;
|
||||
|
||||
if (current->mm != ctx->mm)
|
||||
return POLLNVAL;
|
||||
|
||||
poll_wait(filp, &wq->err_queue, wait);
|
||||
spin_lock(&idxd->dev_lock);
|
||||
if (idxd->sw_err.valid)
|
||||
|
||||
@@ -42,7 +42,7 @@ static atomic_t scmi_syspower_registered = ATOMIC_INIT(0);
|
||||
* This helper let an SCMI driver request specific devices identified by the
|
||||
* @id_table to be created for each active SCMI instance.
|
||||
*
|
||||
* The requested device name MUST NOT be already existent for any protocol;
|
||||
* The requested device name MUST NOT be already existent for this protocol;
|
||||
* at first the freshly requested @id_table is annotated in the IDR table
|
||||
* @scmi_requested_devices and then the requested device is advertised to any
|
||||
* registered party via the @scmi_requested_devices_nh notification chain.
|
||||
@@ -52,7 +52,6 @@ static atomic_t scmi_syspower_registered = ATOMIC_INIT(0);
|
||||
static int scmi_protocol_device_request(const struct scmi_device_id *id_table)
|
||||
{
|
||||
int ret = 0;
|
||||
unsigned int id = 0;
|
||||
struct list_head *head, *phead = NULL;
|
||||
struct scmi_requested_dev *rdev;
|
||||
|
||||
@@ -67,19 +66,13 @@ static int scmi_protocol_device_request(const struct scmi_device_id *id_table)
|
||||
}
|
||||
|
||||
/*
|
||||
* Search for the matching protocol rdev list and then search
|
||||
* of any existent equally named device...fails if any duplicate found.
|
||||
* Find the matching protocol rdev list and then search of any
|
||||
* existent equally named device...fails if any duplicate found.
|
||||
*/
|
||||
mutex_lock(&scmi_requested_devices_mtx);
|
||||
idr_for_each_entry(&scmi_requested_devices, head, id) {
|
||||
if (!phead) {
|
||||
/* A list found registered in the IDR is never empty */
|
||||
rdev = list_first_entry(head, struct scmi_requested_dev,
|
||||
node);
|
||||
if (rdev->id_table->protocol_id ==
|
||||
id_table->protocol_id)
|
||||
phead = head;
|
||||
}
|
||||
phead = idr_find(&scmi_requested_devices, id_table->protocol_id);
|
||||
if (phead) {
|
||||
head = phead;
|
||||
list_for_each_entry(rdev, head, node) {
|
||||
if (!strcmp(rdev->id_table->name, id_table->name)) {
|
||||
pr_err("Ignoring duplicate request [%d] %s\n",
|
||||
|
||||
@@ -69,8 +69,7 @@ static bool set_cache_memory_policy_v9(struct device_queue_manager *dqm,
|
||||
qpd->sh_mem_config |= 1 << SH_MEM_CONFIG__RETRY_DISABLE__SHIFT;
|
||||
|
||||
if (KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 4, 3) ||
|
||||
KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 4, 4) ||
|
||||
KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 5, 0))
|
||||
KFD_GC_VERSION(dqm->dev->kfd) == IP_VERSION(9, 4, 4))
|
||||
qpd->sh_mem_config |= (1 << SH_MEM_CONFIG__F8_MODE__SHIFT);
|
||||
|
||||
qpd->sh_mem_ape1_limit = 0;
|
||||
|
||||
@@ -3315,11 +3315,6 @@ static int dm_resume(void *handle)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* leave display off for S4 sequence */
|
||||
if (adev->in_s4)
|
||||
return 0;
|
||||
|
||||
/* Recreate dc_state - DC invalidates it when setting power state to S3. */
|
||||
dc_state_release(dm_state->context);
|
||||
dm_state->context = dc_state_create(dm->dc, NULL);
|
||||
|
||||
@@ -221,7 +221,9 @@ static bool dml21_mode_check_and_programming(const struct dc *in_dc, struct dc_s
|
||||
if (!result)
|
||||
return false;
|
||||
|
||||
DC_FP_START();
|
||||
result = dml2_build_mode_programming(mode_programming);
|
||||
DC_FP_END();
|
||||
if (!result)
|
||||
return false;
|
||||
|
||||
@@ -271,7 +273,9 @@ static bool dml21_check_mode_support(const struct dc *in_dc, struct dc_state *co
|
||||
mode_support->dml2_instance = dml_init->dml2_instance;
|
||||
dml21_map_dc_state_into_dml_display_cfg(in_dc, context, dml_ctx);
|
||||
dml_ctx->v21.mode_programming.dml2_instance->scratch.build_mode_programming_locals.mode_programming_params.programming = dml_ctx->v21.mode_programming.programming;
|
||||
DC_FP_START();
|
||||
is_supported = dml2_check_mode_supported(mode_support);
|
||||
DC_FP_END();
|
||||
if (!is_supported)
|
||||
return false;
|
||||
|
||||
@@ -282,16 +286,12 @@ bool dml21_validate(const struct dc *in_dc, struct dc_state *context, struct dml
|
||||
{
|
||||
bool out = false;
|
||||
|
||||
DC_FP_START();
|
||||
|
||||
/* Use dml_validate_only for fast_validate path */
|
||||
if (fast_validate)
|
||||
out = dml21_check_mode_support(in_dc, context, dml_ctx);
|
||||
else
|
||||
out = dml21_mode_check_and_programming(in_dc, context, dml_ctx);
|
||||
|
||||
DC_FP_END();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
@@ -1888,6 +1888,7 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
|
||||
bool can_apply_edp_fast_boot = false;
|
||||
bool can_apply_seamless_boot = false;
|
||||
bool keep_edp_vdd_on = false;
|
||||
struct dc_bios *dcb = dc->ctx->dc_bios;
|
||||
DC_LOGGER_INIT();
|
||||
|
||||
|
||||
@@ -1964,6 +1965,8 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
|
||||
hws->funcs.edp_backlight_control(edp_link_with_sink, false);
|
||||
}
|
||||
/*resume from S3, no vbios posting, no need to power down again*/
|
||||
if (dcb && dcb->funcs && !dcb->funcs->is_accelerated_mode(dcb))
|
||||
clk_mgr_exit_optimized_pwr_state(dc, dc->clk_mgr);
|
||||
|
||||
power_down_all_hw_blocks(dc);
|
||||
|
||||
@@ -1976,6 +1979,8 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
|
||||
disable_vga_and_power_gate_all_controllers(dc);
|
||||
if (edp_link_with_sink && !keep_edp_vdd_on)
|
||||
dc->hwss.edp_power_control(edp_link_with_sink, false);
|
||||
if (dcb && dcb->funcs && !dcb->funcs->is_accelerated_mode(dcb))
|
||||
clk_mgr_optimize_pwr_state(dc, dc->clk_mgr);
|
||||
}
|
||||
bios_set_scratch_acc_mode_change(dc->ctx->dc_bios, 1);
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (mode->crtc_hdisplay) {
|
||||
switch (mode->hdisplay) {
|
||||
case 640:
|
||||
vbios_mode->enh_table = &res_640x480[refresh_rate_index];
|
||||
break;
|
||||
@@ -145,7 +145,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table = &res_1152x864[refresh_rate_index];
|
||||
break;
|
||||
case 1280:
|
||||
if (mode->crtc_vdisplay == 800)
|
||||
if (mode->vdisplay == 800)
|
||||
vbios_mode->enh_table = &res_1280x800[refresh_rate_index];
|
||||
else
|
||||
vbios_mode->enh_table = &res_1280x1024[refresh_rate_index];
|
||||
@@ -157,7 +157,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table = &res_1440x900[refresh_rate_index];
|
||||
break;
|
||||
case 1600:
|
||||
if (mode->crtc_vdisplay == 900)
|
||||
if (mode->vdisplay == 900)
|
||||
vbios_mode->enh_table = &res_1600x900[refresh_rate_index];
|
||||
else
|
||||
vbios_mode->enh_table = &res_1600x1200[refresh_rate_index];
|
||||
@@ -166,7 +166,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table = &res_1680x1050[refresh_rate_index];
|
||||
break;
|
||||
case 1920:
|
||||
if (mode->crtc_vdisplay == 1080)
|
||||
if (mode->vdisplay == 1080)
|
||||
vbios_mode->enh_table = &res_1920x1080[refresh_rate_index];
|
||||
else
|
||||
vbios_mode->enh_table = &res_1920x1200[refresh_rate_index];
|
||||
@@ -210,6 +210,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
hborder = (vbios_mode->enh_table->flags & HBorder) ? 8 : 0;
|
||||
vborder = (vbios_mode->enh_table->flags & VBorder) ? 8 : 0;
|
||||
|
||||
adjusted_mode->crtc_hdisplay = vbios_mode->enh_table->hde;
|
||||
adjusted_mode->crtc_htotal = vbios_mode->enh_table->ht;
|
||||
adjusted_mode->crtc_hblank_start = vbios_mode->enh_table->hde + hborder;
|
||||
adjusted_mode->crtc_hblank_end = vbios_mode->enh_table->ht - hborder;
|
||||
@@ -219,6 +220,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table->hfp +
|
||||
vbios_mode->enh_table->hsync);
|
||||
|
||||
adjusted_mode->crtc_vdisplay = vbios_mode->enh_table->vde;
|
||||
adjusted_mode->crtc_vtotal = vbios_mode->enh_table->vt;
|
||||
adjusted_mode->crtc_vblank_start = vbios_mode->enh_table->vde + vborder;
|
||||
adjusted_mode->crtc_vblank_end = vbios_mode->enh_table->vt - vborder;
|
||||
|
||||
@@ -244,7 +244,9 @@ static const struct hdmi_codec_pdata codec_data = {
|
||||
.ops = &adv7511_codec_ops,
|
||||
.max_i2s_channels = 2,
|
||||
.i2s = 1,
|
||||
.no_i2s_capture = 1,
|
||||
.spdif = 1,
|
||||
.no_spdif_capture = 1,
|
||||
};
|
||||
|
||||
int adv7511_audio_init(struct device *dev, struct adv7511 *adv7511)
|
||||
|
||||
@@ -574,6 +574,30 @@ mode_valid(struct drm_atomic_state *state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int drm_atomic_check_valid_clones(struct drm_atomic_state *state,
|
||||
struct drm_crtc *crtc)
|
||||
{
|
||||
struct drm_encoder *drm_enc;
|
||||
struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
|
||||
crtc);
|
||||
|
||||
drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask) {
|
||||
if (!drm_enc->possible_clones) {
|
||||
DRM_DEBUG("enc%d possible_clones is 0\n", drm_enc->base.id);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((crtc_state->encoder_mask & drm_enc->possible_clones) !=
|
||||
crtc_state->encoder_mask) {
|
||||
DRM_DEBUG("crtc%d failed valid clone check for mask 0x%x\n",
|
||||
crtc->base.id, crtc_state->encoder_mask);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_atomic_helper_check_modeset - validate state object for modeset changes
|
||||
* @dev: DRM device
|
||||
@@ -745,6 +769,10 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
|
||||
ret = drm_atomic_add_affected_planes(state, crtc);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
ret = drm_atomic_check_valid_clones(state, crtc);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -324,7 +324,7 @@ EXPORT_SYMBOL(drm_buddy_init);
|
||||
*/
|
||||
void drm_buddy_fini(struct drm_buddy *mm)
|
||||
{
|
||||
u64 root_size, size;
|
||||
u64 root_size, size, start;
|
||||
unsigned int order;
|
||||
int i;
|
||||
|
||||
@@ -332,7 +332,8 @@ void drm_buddy_fini(struct drm_buddy *mm)
|
||||
|
||||
for (i = 0; i < mm->n_roots; ++i) {
|
||||
order = ilog2(size) - ilog2(mm->chunk_size);
|
||||
__force_merge(mm, 0, size, order);
|
||||
start = drm_buddy_block_offset(mm->roots[i]);
|
||||
__force_merge(mm, start, start + size, order);
|
||||
|
||||
WARN_ON(!drm_buddy_block_is_free(mm->roots[i]));
|
||||
drm_block_free(mm, mm->roots[i]);
|
||||
|
||||
@@ -6596,6 +6596,7 @@ static void drm_reset_display_info(struct drm_connector *connector)
|
||||
info->has_hdmi_infoframe = false;
|
||||
info->rgb_quant_range_selectable = false;
|
||||
memset(&info->hdmi, 0, sizeof(info->hdmi));
|
||||
memset(&connector->hdr_sink_metadata, 0, sizeof(connector->hdr_sink_metadata));
|
||||
|
||||
info->edid_hdmi_rgb444_dc_modes = 0;
|
||||
info->edid_hdmi_ycbcr444_dc_modes = 0;
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
#include <linux/parser.h>
|
||||
|
||||
#define GSP_MSG_MIN_SIZE GSP_PAGE_SIZE
|
||||
#define GSP_MSG_MAX_SIZE GSP_PAGE_MIN_SIZE * 16
|
||||
#define GSP_MSG_MAX_SIZE (GSP_MSG_MIN_SIZE * 16)
|
||||
|
||||
struct r535_gsp_msg {
|
||||
u8 auth_tag_buffer[16];
|
||||
|
||||
@@ -1983,6 +1983,7 @@ static const struct edp_panel_entry edp_panels[] = {
|
||||
EDP_PANEL_ENTRY('S', 'H', 'P', 0x153a, &delay_200_500_e50, "LQ140T1JH01"),
|
||||
EDP_PANEL_ENTRY('S', 'H', 'P', 0x154c, &delay_200_500_p2e100, "LQ116M1JW10"),
|
||||
|
||||
EDP_PANEL_ENTRY('S', 'T', 'A', 0x0004, &delay_200_500_e200, "116KHD024006"),
|
||||
EDP_PANEL_ENTRY('S', 'T', 'A', 0x0100, &delay_100_500_e200, "2081116HHD028001-51D"),
|
||||
|
||||
{ /* sentinal */ }
|
||||
|
||||
@@ -157,6 +157,7 @@ struct vop2_video_port {
|
||||
struct drm_crtc crtc;
|
||||
struct vop2 *vop2;
|
||||
struct clk *dclk;
|
||||
struct clk *dclk_src;
|
||||
unsigned int id;
|
||||
const struct vop2_video_port_data *data;
|
||||
|
||||
@@ -211,6 +212,7 @@ struct vop2 {
|
||||
struct clk *hclk;
|
||||
struct clk *aclk;
|
||||
struct clk *pclk;
|
||||
struct clk *pll_hdmiphy0;
|
||||
|
||||
/* optional internal rgb encoder */
|
||||
struct rockchip_rgb *rgb;
|
||||
@@ -219,6 +221,8 @@ struct vop2 {
|
||||
struct vop2_win win[];
|
||||
};
|
||||
|
||||
#define VOP2_MAX_DCLK_RATE 600000000
|
||||
|
||||
#define vop2_output_if_is_hdmi(x) ((x) == ROCKCHIP_VOP2_EP_HDMI0 || \
|
||||
(x) == ROCKCHIP_VOP2_EP_HDMI1)
|
||||
|
||||
@@ -1051,6 +1055,9 @@ static void vop2_crtc_atomic_disable(struct drm_crtc *crtc,
|
||||
|
||||
vop2_crtc_disable_irq(vp, VP_INT_DSP_HOLD_VALID);
|
||||
|
||||
if (vp->dclk_src)
|
||||
clk_set_parent(vp->dclk, vp->dclk_src);
|
||||
|
||||
clk_disable_unprepare(vp->dclk);
|
||||
|
||||
vop2->enable_count--;
|
||||
@@ -2071,6 +2078,27 @@ static void vop2_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||
|
||||
vop2_vp_write(vp, RK3568_VP_MIPI_CTRL, 0);
|
||||
|
||||
/*
|
||||
* Switch to HDMI PHY PLL as DCLK source for display modes up
|
||||
* to 4K@60Hz, if available, otherwise keep using the system CRU.
|
||||
*/
|
||||
if (vop2->pll_hdmiphy0 && clock <= VOP2_MAX_DCLK_RATE) {
|
||||
drm_for_each_encoder_mask(encoder, crtc->dev, crtc_state->encoder_mask) {
|
||||
struct rockchip_encoder *rkencoder = to_rockchip_encoder(encoder);
|
||||
|
||||
if (rkencoder->crtc_endpoint_id == ROCKCHIP_VOP2_EP_HDMI0) {
|
||||
if (!vp->dclk_src)
|
||||
vp->dclk_src = clk_get_parent(vp->dclk);
|
||||
|
||||
ret = clk_set_parent(vp->dclk, vop2->pll_hdmiphy0);
|
||||
if (ret < 0)
|
||||
drm_warn(vop2->drm,
|
||||
"Could not switch to HDMI0 PHY PLL: %d\n", ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
clk_set_rate(vp->dclk, clock);
|
||||
|
||||
vop2_post_config(crtc);
|
||||
@@ -3242,6 +3270,12 @@ static int vop2_bind(struct device *dev, struct device *master, void *data)
|
||||
return PTR_ERR(vop2->pclk);
|
||||
}
|
||||
|
||||
vop2->pll_hdmiphy0 = devm_clk_get_optional(vop2->dev, "pll_hdmiphy0");
|
||||
if (IS_ERR(vop2->pll_hdmiphy0)) {
|
||||
drm_err(vop2->drm, "failed to get pll_hdmiphy0\n");
|
||||
return PTR_ERR(vop2->pll_hdmiphy0);
|
||||
}
|
||||
|
||||
vop2->irq = platform_get_irq(pdev, 0);
|
||||
if (vop2->irq < 0) {
|
||||
drm_err(vop2->drm, "cannot find irq for vop2\n");
|
||||
|
||||
@@ -702,6 +702,21 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Reject BO eviction if BO is bound to current VM. */
|
||||
if (evict && ctx->resv) {
|
||||
struct drm_gpuvm_bo *vm_bo;
|
||||
|
||||
drm_gem_for_each_gpuvm_bo(vm_bo, &bo->ttm.base) {
|
||||
struct xe_vm *vm = gpuvm_to_vm(vm_bo->vm);
|
||||
|
||||
if (xe_vm_resv(vm) == ctx->resv &&
|
||||
xe_vm_in_preempt_fence_mode(vm)) {
|
||||
ret = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Failed multi-hop where the old_mem is still marked as
|
||||
* TTM_PL_FLAG_TEMPORARY, should just be a dummy move.
|
||||
|
||||
@@ -708,6 +708,12 @@ int xe_device_probe(struct xe_device *xe)
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
for_each_tile(tile, xe, id) {
|
||||
err = xe_tile_init(tile);
|
||||
if (err)
|
||||
goto err;
|
||||
}
|
||||
|
||||
for_each_gt(gt, xe, id) {
|
||||
last_gt = id;
|
||||
|
||||
|
||||
@@ -323,6 +323,26 @@ static int pf_push_full_vf_config(struct xe_gt *gt, unsigned int vfid)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int pf_push_vf_cfg(struct xe_gt *gt, unsigned int vfid, bool reset)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
xe_gt_assert(gt, vfid);
|
||||
lockdep_assert_held(xe_gt_sriov_pf_master_mutex(gt));
|
||||
|
||||
if (reset)
|
||||
err = pf_send_vf_cfg_reset(gt, vfid);
|
||||
if (!err)
|
||||
err = pf_push_full_vf_config(gt, vfid);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int pf_refresh_vf_cfg(struct xe_gt *gt, unsigned int vfid)
|
||||
{
|
||||
return pf_push_vf_cfg(gt, vfid, true);
|
||||
}
|
||||
|
||||
static u64 pf_get_ggtt_alignment(struct xe_gt *gt)
|
||||
{
|
||||
struct xe_device *xe = gt_to_xe(gt);
|
||||
@@ -419,6 +439,10 @@ static int pf_provision_vf_ggtt(struct xe_gt *gt, unsigned int vfid, u64 size)
|
||||
return err;
|
||||
|
||||
pf_release_vf_config_ggtt(gt, config);
|
||||
|
||||
err = pf_refresh_vf_cfg(gt, vfid);
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
}
|
||||
xe_gt_assert(gt, !xe_ggtt_node_allocated(config->ggtt_region));
|
||||
|
||||
@@ -744,6 +768,10 @@ static int pf_provision_vf_ctxs(struct xe_gt *gt, unsigned int vfid, u32 num_ctx
|
||||
return ret;
|
||||
|
||||
pf_release_config_ctxs(gt, config);
|
||||
|
||||
ret = pf_refresh_vf_cfg(gt, vfid);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!num_ctxs)
|
||||
@@ -1041,6 +1069,10 @@ static int pf_provision_vf_dbs(struct xe_gt *gt, unsigned int vfid, u32 num_dbs)
|
||||
return ret;
|
||||
|
||||
pf_release_config_dbs(gt, config);
|
||||
|
||||
ret = pf_refresh_vf_cfg(gt, vfid);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!num_dbs)
|
||||
@@ -2003,10 +2035,7 @@ int xe_gt_sriov_pf_config_push(struct xe_gt *gt, unsigned int vfid, bool refresh
|
||||
xe_gt_assert(gt, vfid);
|
||||
|
||||
mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
|
||||
if (refresh)
|
||||
err = pf_send_vf_cfg_reset(gt, vfid);
|
||||
if (!err)
|
||||
err = pf_push_full_vf_config(gt, vfid);
|
||||
err = pf_push_vf_cfg(gt, vfid, refresh);
|
||||
mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
|
||||
|
||||
if (unlikely(err)) {
|
||||
|
||||
@@ -235,6 +235,9 @@ int xe_gt_sriov_vf_bootstrap(struct xe_gt *gt)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!xe_device_uc_enabled(gt_to_xe(gt)))
|
||||
return -ENODEV;
|
||||
|
||||
err = vf_reset_guc_state(gt);
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
|
||||
@@ -224,7 +224,7 @@ __relay_get_transaction(struct xe_guc_relay *relay, bool incoming, u32 remote, u
|
||||
* with CTB lock held which is marked as used in the reclaim path.
|
||||
* Btw, that's one of the reason why we use mempool here!
|
||||
*/
|
||||
txn = mempool_alloc(&relay->pool, incoming ? GFP_ATOMIC : GFP_KERNEL);
|
||||
txn = mempool_alloc(&relay->pool, incoming ? GFP_ATOMIC : GFP_NOWAIT);
|
||||
if (!txn)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
|
||||
@@ -57,8 +57,6 @@ struct xe_sa_manager *xe_sa_bo_manager_init(struct xe_tile *tile, u32 size, u32
|
||||
}
|
||||
sa_manager->bo = bo;
|
||||
sa_manager->is_iomem = bo->vmap.is_iomem;
|
||||
|
||||
drm_suballoc_manager_init(&sa_manager->base, managed_size, align);
|
||||
sa_manager->gpu_addr = xe_bo_ggtt_addr(bo);
|
||||
|
||||
if (bo->vmap.is_iomem) {
|
||||
@@ -72,6 +70,7 @@ struct xe_sa_manager *xe_sa_bo_manager_init(struct xe_tile *tile, u32 size, u32
|
||||
memset(sa_manager->cpu_ptr, 0, bo->ttm.base.size);
|
||||
}
|
||||
|
||||
drm_suballoc_manager_init(&sa_manager->base, managed_size, align);
|
||||
ret = drmm_add_action_or_reset(&xe->drm, xe_sa_bo_manager_fini,
|
||||
sa_manager);
|
||||
if (ret)
|
||||
|
||||
@@ -167,15 +167,19 @@ int xe_tile_init_noalloc(struct xe_tile *tile)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
tile->mem.kernel_bb_pool = xe_sa_bo_manager_init(tile, SZ_1M, 16);
|
||||
if (IS_ERR(tile->mem.kernel_bb_pool))
|
||||
return PTR_ERR(tile->mem.kernel_bb_pool);
|
||||
|
||||
xe_wa_apply_tile_workarounds(tile);
|
||||
|
||||
return xe_tile_sysfs_init(tile);
|
||||
}
|
||||
|
||||
int xe_tile_init(struct xe_tile *tile)
|
||||
{
|
||||
tile->mem.kernel_bb_pool = xe_sa_bo_manager_init(tile, SZ_1M, 16);
|
||||
if (IS_ERR(tile->mem.kernel_bb_pool))
|
||||
return PTR_ERR(tile->mem.kernel_bb_pool);
|
||||
|
||||
return 0;
|
||||
}
|
||||
void xe_tile_migrate_wait(struct xe_tile *tile)
|
||||
{
|
||||
xe_migrate_wait(tile->migrate);
|
||||
|
||||
@@ -12,6 +12,7 @@ struct xe_tile;
|
||||
|
||||
int xe_tile_init_early(struct xe_tile *tile, struct xe_device *xe, u8 id);
|
||||
int xe_tile_init_noalloc(struct xe_tile *tile);
|
||||
int xe_tile_init(struct xe_tile *tile);
|
||||
|
||||
void xe_tile_migrate_wait(struct xe_tile *tile);
|
||||
|
||||
|
||||
@@ -160,7 +160,7 @@ static int usb_kbd_event(struct input_dev *dev, unsigned int type,
|
||||
return -1;
|
||||
|
||||
spin_lock_irqsave(&kbd->leds_lock, flags);
|
||||
kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 3) | (!!test_bit(LED_COMPOSE, dev->led) << 3) |
|
||||
kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 4) | (!!test_bit(LED_COMPOSE, dev->led) << 3) |
|
||||
(!!test_bit(LED_SCROLLL, dev->led) << 2) | (!!test_bit(LED_CAPSL, dev->led) << 1) |
|
||||
(!!test_bit(LED_NUML, dev->led));
|
||||
|
||||
|
||||
@@ -512,6 +512,7 @@ static void svc_i3c_master_ibi_work(struct work_struct *work)
|
||||
break;
|
||||
case SVC_I3C_MSTATUS_IBITYPE_MASTER_REQUEST:
|
||||
svc_i3c_master_emit_stop(master);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -289,6 +289,8 @@ static const struct xpad_device {
|
||||
{ 0x1038, 0x1430, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
|
||||
{ 0x1038, 0x1431, "SteelSeries Stratus Duo", 0, XTYPE_XBOX360 },
|
||||
{ 0x10f5, 0x7005, "Turtle Beach Recon Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x10f5, 0x7008, "Turtle Beach Recon Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
|
||||
{ 0x10f5, 0x7073, "Turtle Beach Stealth Ultra Controller", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
|
||||
{ 0x11c9, 0x55f0, "Nacon GC-100XF", 0, XTYPE_XBOX360 },
|
||||
{ 0x11ff, 0x0511, "PXN V900", 0, XTYPE_XBOX360 },
|
||||
{ 0x1209, 0x2882, "Ardwiino Controller", 0, XTYPE_XBOX360 },
|
||||
@@ -353,6 +355,7 @@ static const struct xpad_device {
|
||||
{ 0x1ee9, 0x1590, "ZOTAC Gaming Zone", 0, XTYPE_XBOX360 },
|
||||
{ 0x20d6, 0x2001, "BDA Xbox Series X Wired Controller", 0, XTYPE_XBOXONE },
|
||||
{ 0x20d6, 0x2009, "PowerA Enhanced Wired Controller for Xbox Series X|S", 0, XTYPE_XBOXONE },
|
||||
{ 0x20d6, 0x2064, "PowerA Wired Controller for Xbox", MAP_SHARE_BUTTON, XTYPE_XBOXONE },
|
||||
{ 0x20d6, 0x281f, "PowerA Wired Controller For Xbox 360", 0, XTYPE_XBOX360 },
|
||||
{ 0x2345, 0xe00b, "Machenike G5 Pro Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x24c6, 0x5000, "Razer Atrox Arcade Stick", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
|
||||
@@ -31,7 +31,7 @@ struct aplic_direct {
|
||||
};
|
||||
|
||||
struct aplic_idc {
|
||||
unsigned int hart_index;
|
||||
u32 hart_index;
|
||||
void __iomem *regs;
|
||||
struct aplic_direct *direct;
|
||||
};
|
||||
@@ -219,6 +219,20 @@ static int aplic_direct_parse_parent_hwirq(struct device *dev, u32 index,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int aplic_direct_get_hart_index(struct device *dev, u32 logical_index,
|
||||
u32 *hart_index)
|
||||
{
|
||||
const char *prop_hart_index = "riscv,hart-indexes";
|
||||
struct device_node *np = to_of_node(dev->fwnode);
|
||||
|
||||
if (!np || !of_property_present(np, prop_hart_index)) {
|
||||
*hart_index = logical_index;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return of_property_read_u32_index(np, prop_hart_index, logical_index, hart_index);
|
||||
}
|
||||
|
||||
int aplic_direct_setup(struct device *dev, void __iomem *regs)
|
||||
{
|
||||
int i, j, rc, cpu, current_cpu, setup_count = 0;
|
||||
@@ -265,8 +279,12 @@ int aplic_direct_setup(struct device *dev, void __iomem *regs)
|
||||
cpumask_set_cpu(cpu, &direct->lmask);
|
||||
|
||||
idc = per_cpu_ptr(&aplic_idcs, cpu);
|
||||
idc->hart_index = i;
|
||||
idc->regs = priv->regs + APLIC_IDC_BASE + i * APLIC_IDC_SIZE;
|
||||
rc = aplic_direct_get_hart_index(dev, i, &idc->hart_index);
|
||||
if (rc) {
|
||||
dev_warn(dev, "hart index not found for IDC%d\n", i);
|
||||
continue;
|
||||
}
|
||||
idc->regs = priv->regs + APLIC_IDC_BASE + idc->hart_index * APLIC_IDC_SIZE;
|
||||
idc->direct = direct;
|
||||
|
||||
aplic_idc_set_delivery(idc, true);
|
||||
|
||||
@@ -186,17 +186,17 @@ skip:
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void __imsic_local_timer_start(struct imsic_local_priv *lpriv)
|
||||
static void __imsic_local_timer_start(struct imsic_local_priv *lpriv, unsigned int cpu)
|
||||
{
|
||||
lockdep_assert_held(&lpriv->lock);
|
||||
|
||||
if (!timer_pending(&lpriv->timer)) {
|
||||
lpriv->timer.expires = jiffies + 1;
|
||||
add_timer_on(&lpriv->timer, smp_processor_id());
|
||||
add_timer_on(&lpriv->timer, cpu);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline void __imsic_local_timer_start(struct imsic_local_priv *lpriv)
|
||||
static inline void __imsic_local_timer_start(struct imsic_local_priv *lpriv, unsigned int cpu)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
@@ -211,7 +211,7 @@ void imsic_local_sync_all(bool force_all)
|
||||
if (force_all)
|
||||
bitmap_fill(lpriv->dirty_bitmap, imsic->global.nr_ids + 1);
|
||||
if (!__imsic_local_sync(lpriv))
|
||||
__imsic_local_timer_start(lpriv);
|
||||
__imsic_local_timer_start(lpriv, smp_processor_id());
|
||||
|
||||
raw_spin_unlock_irqrestore(&lpriv->lock, flags);
|
||||
}
|
||||
@@ -256,7 +256,7 @@ static void __imsic_remote_sync(struct imsic_local_priv *lpriv, unsigned int cpu
|
||||
return;
|
||||
}
|
||||
|
||||
__imsic_local_timer_start(lpriv);
|
||||
__imsic_local_timer_start(lpriv, cpu);
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
@@ -54,7 +54,6 @@
|
||||
* Each save also has a unique nonce.
|
||||
*/
|
||||
|
||||
#define MAGIC_SIZE 32
|
||||
#define NONCE_INFO_SIZE 32
|
||||
#define MAX_SAVES 2
|
||||
|
||||
@@ -98,9 +97,11 @@ enum region_type {
|
||||
#define SUPER_VERSION_CURRENT 3
|
||||
#define SUPER_VERSION_MAXIMUM 7
|
||||
|
||||
static const u8 LAYOUT_MAGIC[MAGIC_SIZE] = "*ALBIREO*SINGLE*FILE*LAYOUT*001*";
|
||||
static const u8 LAYOUT_MAGIC[] = "*ALBIREO*SINGLE*FILE*LAYOUT*001*";
|
||||
static const u64 REGION_MAGIC = 0x416c6252676e3031; /* 'AlbRgn01' */
|
||||
|
||||
#define MAGIC_SIZE (sizeof(LAYOUT_MAGIC) - 1)
|
||||
|
||||
struct region_header {
|
||||
u64 magic;
|
||||
u64 region_blocks;
|
||||
|
||||
@@ -31,9 +31,7 @@
|
||||
|
||||
#include <linux/completion.h>
|
||||
#include <linux/device-mapper.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/lz4.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/types.h>
|
||||
@@ -142,12 +140,6 @@ static void finish_vdo_request_queue(void *ptr)
|
||||
vdo_unregister_allocating_thread();
|
||||
}
|
||||
|
||||
#ifdef MODULE
|
||||
#define MODULE_NAME THIS_MODULE->name
|
||||
#else
|
||||
#define MODULE_NAME "dm-vdo"
|
||||
#endif /* MODULE */
|
||||
|
||||
static const struct vdo_work_queue_type default_queue_type = {
|
||||
.start = start_vdo_request_queue,
|
||||
.finish = finish_vdo_request_queue,
|
||||
@@ -559,8 +551,7 @@ int vdo_make(unsigned int instance, struct device_config *config, char **reason,
|
||||
*vdo_ptr = vdo;
|
||||
|
||||
snprintf(vdo->thread_name_prefix, sizeof(vdo->thread_name_prefix),
|
||||
"%s%u", MODULE_NAME, instance);
|
||||
BUG_ON(vdo->thread_name_prefix[0] == '\0');
|
||||
"vdo%u", instance);
|
||||
result = vdo_allocate(vdo->thread_config.thread_count,
|
||||
struct vdo_thread, __func__, &vdo->threads);
|
||||
if (result != VDO_SUCCESS) {
|
||||
|
||||
@@ -683,11 +683,13 @@ static int csid_set_stream(struct v4l2_subdev *sd, int enable)
|
||||
int ret;
|
||||
|
||||
if (enable) {
|
||||
ret = v4l2_ctrl_handler_setup(&csid->ctrls);
|
||||
if (ret < 0) {
|
||||
dev_err(csid->camss->dev,
|
||||
"could not sync v4l2 controls: %d\n", ret);
|
||||
return ret;
|
||||
if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) {
|
||||
ret = v4l2_ctrl_handler_setup(&csid->ctrls);
|
||||
if (ret < 0) {
|
||||
dev_err(csid->camss->dev,
|
||||
"could not sync v4l2 controls: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (!csid->testgen.enabled &&
|
||||
@@ -761,7 +763,8 @@ static void csid_try_format(struct csid_device *csid,
|
||||
break;
|
||||
|
||||
case MSM_CSID_PAD_SRC:
|
||||
if (csid->testgen_mode->cur.val == 0) {
|
||||
if (csid->testgen.nmodes == CSID_PAYLOAD_MODE_DISABLED ||
|
||||
csid->testgen_mode->cur.val == 0) {
|
||||
/* Test generator is disabled, */
|
||||
/* keep pad formats in sync */
|
||||
u32 code = fmt->code;
|
||||
@@ -811,7 +814,8 @@ static int csid_enum_mbus_code(struct v4l2_subdev *sd,
|
||||
|
||||
code->code = csid->res->formats->formats[code->index].code;
|
||||
} else {
|
||||
if (csid->testgen_mode->cur.val == 0) {
|
||||
if (csid->testgen.nmodes == CSID_PAYLOAD_MODE_DISABLED ||
|
||||
csid->testgen_mode->cur.val == 0) {
|
||||
struct v4l2_mbus_framefmt *sink_fmt;
|
||||
|
||||
sink_fmt = __csid_get_format(csid, sd_state,
|
||||
@@ -1190,7 +1194,8 @@ static int csid_link_setup(struct media_entity *entity,
|
||||
|
||||
/* If test generator is enabled */
|
||||
/* do not allow a link from CSIPHY to CSID */
|
||||
if (csid->testgen_mode->cur.val != 0)
|
||||
if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED &&
|
||||
csid->testgen_mode->cur.val != 0)
|
||||
return -EBUSY;
|
||||
|
||||
sd = media_entity_to_v4l2_subdev(remote->entity);
|
||||
@@ -1283,25 +1288,28 @@ int msm_csid_register_entity(struct csid_device *csid,
|
||||
MSM_CSID_NAME, csid->id);
|
||||
v4l2_set_subdevdata(sd, csid);
|
||||
|
||||
ret = v4l2_ctrl_handler_init(&csid->ctrls, 1);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to init ctrl handler: %d\n", ret);
|
||||
return ret;
|
||||
if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED) {
|
||||
ret = v4l2_ctrl_handler_init(&csid->ctrls, 1);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to init ctrl handler: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
csid->testgen_mode =
|
||||
v4l2_ctrl_new_std_menu_items(&csid->ctrls,
|
||||
&csid_ctrl_ops, V4L2_CID_TEST_PATTERN,
|
||||
csid->testgen.nmodes, 0, 0,
|
||||
csid->testgen.modes);
|
||||
|
||||
if (csid->ctrls.error) {
|
||||
dev_err(dev, "Failed to init ctrl: %d\n", csid->ctrls.error);
|
||||
ret = csid->ctrls.error;
|
||||
goto free_ctrl;
|
||||
}
|
||||
|
||||
csid->subdev.ctrl_handler = &csid->ctrls;
|
||||
}
|
||||
|
||||
csid->testgen_mode = v4l2_ctrl_new_std_menu_items(&csid->ctrls,
|
||||
&csid_ctrl_ops, V4L2_CID_TEST_PATTERN,
|
||||
csid->testgen.nmodes, 0, 0,
|
||||
csid->testgen.modes);
|
||||
|
||||
if (csid->ctrls.error) {
|
||||
dev_err(dev, "Failed to init ctrl: %d\n", csid->ctrls.error);
|
||||
ret = csid->ctrls.error;
|
||||
goto free_ctrl;
|
||||
}
|
||||
|
||||
csid->subdev.ctrl_handler = &csid->ctrls;
|
||||
|
||||
ret = csid_init_formats(sd, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Failed to init format: %d\n", ret);
|
||||
@@ -1331,7 +1339,8 @@ int msm_csid_register_entity(struct csid_device *csid,
|
||||
media_cleanup:
|
||||
media_entity_cleanup(&sd->entity);
|
||||
free_ctrl:
|
||||
v4l2_ctrl_handler_free(&csid->ctrls);
|
||||
if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED)
|
||||
v4l2_ctrl_handler_free(&csid->ctrls);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1344,7 +1353,8 @@ void msm_csid_unregister_entity(struct csid_device *csid)
|
||||
{
|
||||
v4l2_device_unregister_subdev(&csid->subdev);
|
||||
media_entity_cleanup(&csid->subdev.entity);
|
||||
v4l2_ctrl_handler_free(&csid->ctrls);
|
||||
if (csid->testgen.nmodes != CSID_PAYLOAD_MODE_DISABLED)
|
||||
v4l2_ctrl_handler_free(&csid->ctrls);
|
||||
}
|
||||
|
||||
inline bool csid_is_lite(struct csid_device *csid)
|
||||
|
||||
@@ -398,6 +398,10 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
||||
return sink_code;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
WARN(1, "Unsupported HW version: %x\n",
|
||||
vfe->camss->res->version);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/timer.h>
|
||||
#include <net/netdev_queues.h>
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Kvaser AB <support@kvaser.com>");
|
||||
@@ -410,10 +411,13 @@ struct kvaser_pciefd_can {
|
||||
void __iomem *reg_base;
|
||||
struct can_berr_counter bec;
|
||||
u8 cmd_seq;
|
||||
u8 tx_max_count;
|
||||
u8 tx_idx;
|
||||
u8 ack_idx;
|
||||
int err_rep_cnt;
|
||||
int echo_idx;
|
||||
unsigned int completed_tx_pkts;
|
||||
unsigned int completed_tx_bytes;
|
||||
spinlock_t lock; /* Locks sensitive registers (e.g. MODE) */
|
||||
spinlock_t echo_lock; /* Locks the message echo buffer */
|
||||
struct timer_list bec_poll_timer;
|
||||
struct completion start_comp, flush_comp;
|
||||
};
|
||||
@@ -714,6 +718,9 @@ static int kvaser_pciefd_open(struct net_device *netdev)
|
||||
int ret;
|
||||
struct kvaser_pciefd_can *can = netdev_priv(netdev);
|
||||
|
||||
can->tx_idx = 0;
|
||||
can->ack_idx = 0;
|
||||
|
||||
ret = open_candev(netdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -745,21 +752,26 @@ static int kvaser_pciefd_stop(struct net_device *netdev)
|
||||
del_timer(&can->bec_poll_timer);
|
||||
}
|
||||
can->can.state = CAN_STATE_STOPPED;
|
||||
netdev_reset_queue(netdev);
|
||||
close_candev(netdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int kvaser_pciefd_tx_avail(const struct kvaser_pciefd_can *can)
|
||||
{
|
||||
return can->tx_max_count - (READ_ONCE(can->tx_idx) - READ_ONCE(can->ack_idx));
|
||||
}
|
||||
|
||||
static int kvaser_pciefd_prepare_tx_packet(struct kvaser_pciefd_tx_packet *p,
|
||||
struct kvaser_pciefd_can *can,
|
||||
struct can_priv *can, u8 seq,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct canfd_frame *cf = (struct canfd_frame *)skb->data;
|
||||
int packet_size;
|
||||
int seq = can->echo_idx;
|
||||
|
||||
memset(p, 0, sizeof(*p));
|
||||
if (can->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
|
||||
if (can->ctrlmode & CAN_CTRLMODE_ONE_SHOT)
|
||||
p->header[1] |= KVASER_PCIEFD_TPACKET_SMS;
|
||||
|
||||
if (cf->can_id & CAN_RTR_FLAG)
|
||||
@@ -782,7 +794,7 @@ static int kvaser_pciefd_prepare_tx_packet(struct kvaser_pciefd_tx_packet *p,
|
||||
} else {
|
||||
p->header[1] |=
|
||||
FIELD_PREP(KVASER_PCIEFD_RPACKET_DLC_MASK,
|
||||
can_get_cc_dlc((struct can_frame *)cf, can->can.ctrlmode));
|
||||
can_get_cc_dlc((struct can_frame *)cf, can->ctrlmode));
|
||||
}
|
||||
|
||||
p->header[1] |= FIELD_PREP(KVASER_PCIEFD_PACKET_SEQ_MASK, seq);
|
||||
@@ -797,22 +809,24 @@ static netdev_tx_t kvaser_pciefd_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *netdev)
|
||||
{
|
||||
struct kvaser_pciefd_can *can = netdev_priv(netdev);
|
||||
unsigned long irq_flags;
|
||||
struct kvaser_pciefd_tx_packet packet;
|
||||
unsigned int seq = can->tx_idx & (can->can.echo_skb_max - 1);
|
||||
unsigned int frame_len;
|
||||
int nr_words;
|
||||
u8 count;
|
||||
|
||||
if (can_dev_dropped_skb(netdev, skb))
|
||||
return NETDEV_TX_OK;
|
||||
if (!netif_subqueue_maybe_stop(netdev, 0, kvaser_pciefd_tx_avail(can), 1, 1))
|
||||
return NETDEV_TX_BUSY;
|
||||
|
||||
nr_words = kvaser_pciefd_prepare_tx_packet(&packet, can, skb);
|
||||
nr_words = kvaser_pciefd_prepare_tx_packet(&packet, &can->can, seq, skb);
|
||||
|
||||
spin_lock_irqsave(&can->echo_lock, irq_flags);
|
||||
/* Prepare and save echo skb in internal slot */
|
||||
can_put_echo_skb(skb, netdev, can->echo_idx, 0);
|
||||
|
||||
/* Move echo index to the next slot */
|
||||
can->echo_idx = (can->echo_idx + 1) % can->can.echo_skb_max;
|
||||
WRITE_ONCE(can->can.echo_skb[seq], NULL);
|
||||
frame_len = can_skb_get_frame_len(skb);
|
||||
can_put_echo_skb(skb, netdev, seq, frame_len);
|
||||
netdev_sent_queue(netdev, frame_len);
|
||||
WRITE_ONCE(can->tx_idx, can->tx_idx + 1);
|
||||
|
||||
/* Write header to fifo */
|
||||
iowrite32(packet.header[0],
|
||||
@@ -836,14 +850,7 @@ static netdev_tx_t kvaser_pciefd_start_xmit(struct sk_buff *skb,
|
||||
KVASER_PCIEFD_KCAN_FIFO_LAST_REG);
|
||||
}
|
||||
|
||||
count = FIELD_GET(KVASER_PCIEFD_KCAN_TX_NR_PACKETS_CURRENT_MASK,
|
||||
ioread32(can->reg_base + KVASER_PCIEFD_KCAN_TX_NR_PACKETS_REG));
|
||||
/* No room for a new message, stop the queue until at least one
|
||||
* successful transmit
|
||||
*/
|
||||
if (count >= can->can.echo_skb_max || can->can.echo_skb[can->echo_idx])
|
||||
netif_stop_queue(netdev);
|
||||
spin_unlock_irqrestore(&can->echo_lock, irq_flags);
|
||||
netif_subqueue_maybe_stop(netdev, 0, kvaser_pciefd_tx_avail(can), 1, 1);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
@@ -970,6 +977,8 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie)
|
||||
can->kv_pcie = pcie;
|
||||
can->cmd_seq = 0;
|
||||
can->err_rep_cnt = 0;
|
||||
can->completed_tx_pkts = 0;
|
||||
can->completed_tx_bytes = 0;
|
||||
can->bec.txerr = 0;
|
||||
can->bec.rxerr = 0;
|
||||
|
||||
@@ -983,11 +992,10 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie)
|
||||
tx_nr_packets_max =
|
||||
FIELD_GET(KVASER_PCIEFD_KCAN_TX_NR_PACKETS_MAX_MASK,
|
||||
ioread32(can->reg_base + KVASER_PCIEFD_KCAN_TX_NR_PACKETS_REG));
|
||||
can->tx_max_count = min(KVASER_PCIEFD_CAN_TX_MAX_COUNT, tx_nr_packets_max - 1);
|
||||
|
||||
can->can.clock.freq = pcie->freq;
|
||||
can->can.echo_skb_max = min(KVASER_PCIEFD_CAN_TX_MAX_COUNT, tx_nr_packets_max - 1);
|
||||
can->echo_idx = 0;
|
||||
spin_lock_init(&can->echo_lock);
|
||||
can->can.echo_skb_max = roundup_pow_of_two(can->tx_max_count);
|
||||
spin_lock_init(&can->lock);
|
||||
|
||||
can->can.bittiming_const = &kvaser_pciefd_bittiming_const;
|
||||
@@ -1200,7 +1208,7 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
|
||||
skb = alloc_canfd_skb(priv->dev, &cf);
|
||||
if (!skb) {
|
||||
priv->dev->stats.rx_dropped++;
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
cf->len = can_fd_dlc2len(dlc);
|
||||
@@ -1212,7 +1220,7 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
|
||||
skb = alloc_can_skb(priv->dev, (struct can_frame **)&cf);
|
||||
if (!skb) {
|
||||
priv->dev->stats.rx_dropped++;
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
can_frame_set_cc_len((struct can_frame *)cf, dlc, priv->ctrlmode);
|
||||
}
|
||||
@@ -1230,7 +1238,9 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
|
||||
priv->dev->stats.rx_packets++;
|
||||
kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp);
|
||||
|
||||
return netif_rx(skb);
|
||||
netif_rx(skb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void kvaser_pciefd_change_state(struct kvaser_pciefd_can *can,
|
||||
@@ -1507,19 +1517,21 @@ static int kvaser_pciefd_handle_ack_packet(struct kvaser_pciefd *pcie,
|
||||
netdev_dbg(can->can.dev, "Packet was flushed\n");
|
||||
} else {
|
||||
int echo_idx = FIELD_GET(KVASER_PCIEFD_PACKET_SEQ_MASK, p->header[0]);
|
||||
int len;
|
||||
u8 count;
|
||||
unsigned int len, frame_len = 0;
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (echo_idx != (can->ack_idx & (can->can.echo_skb_max - 1)))
|
||||
return 0;
|
||||
skb = can->can.echo_skb[echo_idx];
|
||||
if (skb)
|
||||
kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp);
|
||||
len = can_get_echo_skb(can->can.dev, echo_idx, NULL);
|
||||
count = FIELD_GET(KVASER_PCIEFD_KCAN_TX_NR_PACKETS_CURRENT_MASK,
|
||||
ioread32(can->reg_base + KVASER_PCIEFD_KCAN_TX_NR_PACKETS_REG));
|
||||
if (!skb)
|
||||
return 0;
|
||||
kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp);
|
||||
len = can_get_echo_skb(can->can.dev, echo_idx, &frame_len);
|
||||
|
||||
if (count < can->can.echo_skb_max && netif_queue_stopped(can->can.dev))
|
||||
netif_wake_queue(can->can.dev);
|
||||
/* Pairs with barrier in kvaser_pciefd_start_xmit() */
|
||||
smp_store_release(&can->ack_idx, can->ack_idx + 1);
|
||||
can->completed_tx_pkts++;
|
||||
can->completed_tx_bytes += frame_len;
|
||||
|
||||
if (!one_shot_fail) {
|
||||
can->can.dev->stats.tx_bytes += len;
|
||||
@@ -1635,11 +1647,26 @@ static int kvaser_pciefd_read_buffer(struct kvaser_pciefd *pcie, int dma_buf)
|
||||
{
|
||||
int pos = 0;
|
||||
int res = 0;
|
||||
unsigned int i;
|
||||
|
||||
do {
|
||||
res = kvaser_pciefd_read_packet(pcie, &pos, dma_buf);
|
||||
} while (!res && pos > 0 && pos < KVASER_PCIEFD_DMA_SIZE);
|
||||
|
||||
/* Report ACKs in this buffer to BQL en masse for correct periods */
|
||||
for (i = 0; i < pcie->nr_channels; ++i) {
|
||||
struct kvaser_pciefd_can *can = pcie->can[i];
|
||||
|
||||
if (!can->completed_tx_pkts)
|
||||
continue;
|
||||
netif_subqueue_completed_wake(can->can.dev, 0,
|
||||
can->completed_tx_pkts,
|
||||
can->completed_tx_bytes,
|
||||
kvaser_pciefd_tx_avail(can), 1);
|
||||
can->completed_tx_pkts = 0;
|
||||
can->completed_tx_bytes = 0;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
@@ -71,12 +71,21 @@ MODULE_AUTHOR("Dario Binacchi <dario.binacchi@amarulasolutions.com>");
|
||||
#define SLCAN_CMD_LEN 1
|
||||
#define SLCAN_SFF_ID_LEN 3
|
||||
#define SLCAN_EFF_ID_LEN 8
|
||||
#define SLCAN_DATA_LENGTH_LEN 1
|
||||
#define SLCAN_ERROR_LEN 1
|
||||
#define SLCAN_STATE_LEN 1
|
||||
#define SLCAN_STATE_BE_RXCNT_LEN 3
|
||||
#define SLCAN_STATE_BE_TXCNT_LEN 3
|
||||
#define SLCAN_STATE_FRAME_LEN (1 + SLCAN_CMD_LEN + \
|
||||
SLCAN_STATE_BE_RXCNT_LEN + \
|
||||
SLCAN_STATE_BE_TXCNT_LEN)
|
||||
#define SLCAN_STATE_MSG_LEN (SLCAN_CMD_LEN + \
|
||||
SLCAN_STATE_LEN + \
|
||||
SLCAN_STATE_BE_RXCNT_LEN + \
|
||||
SLCAN_STATE_BE_TXCNT_LEN)
|
||||
#define SLCAN_ERROR_MSG_LEN_MIN (SLCAN_CMD_LEN + \
|
||||
SLCAN_ERROR_LEN + \
|
||||
SLCAN_DATA_LENGTH_LEN)
|
||||
#define SLCAN_FRAME_MSG_LEN_MIN (SLCAN_CMD_LEN + \
|
||||
SLCAN_SFF_ID_LEN + \
|
||||
SLCAN_DATA_LENGTH_LEN)
|
||||
struct slcan {
|
||||
struct can_priv can;
|
||||
|
||||
@@ -176,6 +185,9 @@ static void slcan_bump_frame(struct slcan *sl)
|
||||
u32 tmpid;
|
||||
char *cmd = sl->rbuff;
|
||||
|
||||
if (sl->rcount < SLCAN_FRAME_MSG_LEN_MIN)
|
||||
return;
|
||||
|
||||
skb = alloc_can_skb(sl->dev, &cf);
|
||||
if (unlikely(!skb)) {
|
||||
sl->dev->stats.rx_dropped++;
|
||||
@@ -281,7 +293,7 @@ static void slcan_bump_state(struct slcan *sl)
|
||||
return;
|
||||
}
|
||||
|
||||
if (state == sl->can.state || sl->rcount < SLCAN_STATE_FRAME_LEN)
|
||||
if (state == sl->can.state || sl->rcount != SLCAN_STATE_MSG_LEN)
|
||||
return;
|
||||
|
||||
cmd += SLCAN_STATE_BE_RXCNT_LEN + SLCAN_CMD_LEN + 1;
|
||||
@@ -328,6 +340,9 @@ static void slcan_bump_err(struct slcan *sl)
|
||||
bool rx_errors = false, tx_errors = false, rx_over_errors = false;
|
||||
int i, len;
|
||||
|
||||
if (sl->rcount < SLCAN_ERROR_MSG_LEN_MIN)
|
||||
return;
|
||||
|
||||
/* get len from sanitized ASCII value */
|
||||
len = cmd[1];
|
||||
if (len >= '0' && len < '9')
|
||||
@@ -456,8 +471,7 @@ static void slcan_bump(struct slcan *sl)
|
||||
static void slcan_unesc(struct slcan *sl, unsigned char s)
|
||||
{
|
||||
if ((s == '\r') || (s == '\a')) { /* CR or BEL ends the pdu */
|
||||
if (!test_and_clear_bit(SLF_ERROR, &sl->flags) &&
|
||||
sl->rcount > 4)
|
||||
if (!test_and_clear_bit(SLF_ERROR, &sl->flags))
|
||||
slcan_bump(sl);
|
||||
|
||||
sl->rcount = 0;
|
||||
|
||||
@@ -3817,8 +3817,7 @@ static u32 ice_get_combined_cnt(struct ice_vsi *vsi)
|
||||
ice_for_each_q_vector(vsi, q_idx) {
|
||||
struct ice_q_vector *q_vector = vsi->q_vectors[q_idx];
|
||||
|
||||
if (q_vector->rx.rx_ring && q_vector->tx.tx_ring)
|
||||
combined++;
|
||||
combined += min(q_vector->num_ring_tx, q_vector->num_ring_rx);
|
||||
}
|
||||
|
||||
return combined;
|
||||
|
||||
@@ -45,7 +45,7 @@ static void ice_free_irq_res(struct ice_pf *pf, u16 index)
|
||||
/**
|
||||
* ice_get_irq_res - get an interrupt resource
|
||||
* @pf: board private structure
|
||||
* @dyn_only: force entry to be dynamically allocated
|
||||
* @dyn_allowed: allow entry to be dynamically allocated
|
||||
*
|
||||
* Allocate new irq entry in the free slot of the tracker. Since xarray
|
||||
* is used, always allocate new entry at the lowest possible index. Set
|
||||
@@ -53,11 +53,12 @@ static void ice_free_irq_res(struct ice_pf *pf, u16 index)
|
||||
*
|
||||
* Returns allocated irq entry or NULL on failure.
|
||||
*/
|
||||
static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, bool dyn_only)
|
||||
static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf,
|
||||
bool dyn_allowed)
|
||||
{
|
||||
struct xa_limit limit = { .max = pf->irq_tracker.num_entries,
|
||||
struct xa_limit limit = { .max = pf->irq_tracker.num_entries - 1,
|
||||
.min = 0 };
|
||||
unsigned int num_static = pf->irq_tracker.num_static;
|
||||
unsigned int num_static = pf->irq_tracker.num_static - 1;
|
||||
struct ice_irq_entry *entry;
|
||||
unsigned int index;
|
||||
int ret;
|
||||
@@ -66,9 +67,9 @@ static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, bool dyn_only)
|
||||
if (!entry)
|
||||
return NULL;
|
||||
|
||||
/* skip preallocated entries if the caller says so */
|
||||
if (dyn_only)
|
||||
limit.min = num_static;
|
||||
/* only already allocated if the caller says so */
|
||||
if (!dyn_allowed)
|
||||
limit.max = num_static;
|
||||
|
||||
ret = xa_alloc(&pf->irq_tracker.entries, &index, entry, limit,
|
||||
GFP_KERNEL);
|
||||
@@ -78,7 +79,7 @@ static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, bool dyn_only)
|
||||
entry = NULL;
|
||||
} else {
|
||||
entry->index = index;
|
||||
entry->dynamic = index >= num_static;
|
||||
entry->dynamic = index > num_static;
|
||||
}
|
||||
|
||||
return entry;
|
||||
@@ -272,7 +273,7 @@ int ice_init_interrupt_scheme(struct ice_pf *pf)
|
||||
/**
|
||||
* ice_alloc_irq - Allocate new interrupt vector
|
||||
* @pf: board private structure
|
||||
* @dyn_only: force dynamic allocation of the interrupt
|
||||
* @dyn_allowed: allow dynamic allocation of the interrupt
|
||||
*
|
||||
* Allocate new interrupt vector for a given owner id.
|
||||
* return struct msi_map with interrupt details and track
|
||||
@@ -285,20 +286,20 @@ int ice_init_interrupt_scheme(struct ice_pf *pf)
|
||||
* interrupt will be allocated with pci_msix_alloc_irq_at.
|
||||
*
|
||||
* Some callers may only support dynamically allocated interrupts.
|
||||
* This is indicated with dyn_only flag.
|
||||
* This is indicated with dyn_allowed flag.
|
||||
*
|
||||
* On failure, return map with negative .index. The caller
|
||||
* is expected to check returned map index.
|
||||
*
|
||||
*/
|
||||
struct msi_map ice_alloc_irq(struct ice_pf *pf, bool dyn_only)
|
||||
struct msi_map ice_alloc_irq(struct ice_pf *pf, bool dyn_allowed)
|
||||
{
|
||||
int sriov_base_vector = pf->sriov_base_vector;
|
||||
struct msi_map map = { .index = -ENOENT };
|
||||
struct device *dev = ice_pf_to_dev(pf);
|
||||
struct ice_irq_entry *entry;
|
||||
|
||||
entry = ice_get_irq_res(pf, dyn_only);
|
||||
entry = ice_get_irq_res(pf, dyn_allowed);
|
||||
if (!entry)
|
||||
return map;
|
||||
|
||||
|
||||
@@ -1321,12 +1321,18 @@ static void ice_lag_changeupper_event(struct ice_lag *lag, void *ptr)
|
||||
*/
|
||||
if (!primary_lag) {
|
||||
lag->primary = true;
|
||||
if (!ice_is_switchdev_running(lag->pf))
|
||||
return;
|
||||
|
||||
/* Configure primary's SWID to be shared */
|
||||
ice_lag_primary_swid(lag, true);
|
||||
primary_lag = lag;
|
||||
} else {
|
||||
u16 swid;
|
||||
|
||||
if (!ice_is_switchdev_running(primary_lag->pf))
|
||||
return;
|
||||
|
||||
swid = primary_lag->pf->hw.port_info->sw_id;
|
||||
ice_lag_set_swid(swid, lag, true);
|
||||
ice_lag_add_prune_list(primary_lag, lag->pf);
|
||||
|
||||
@@ -567,6 +567,8 @@ ice_vsi_alloc_def(struct ice_vsi *vsi, struct ice_channel *ch)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
vsi->irq_dyn_alloc = pci_msix_can_alloc_dyn(vsi->back->pdev);
|
||||
|
||||
switch (vsi->type) {
|
||||
case ICE_VSI_PF:
|
||||
case ICE_VSI_SF:
|
||||
|
||||
@@ -5175,11 +5175,12 @@ int ice_load(struct ice_pf *pf)
|
||||
|
||||
ice_napi_add(vsi);
|
||||
|
||||
ice_init_features(pf);
|
||||
|
||||
err = ice_init_rdma(pf);
|
||||
if (err)
|
||||
goto err_init_rdma;
|
||||
|
||||
ice_init_features(pf);
|
||||
ice_service_task_restart(pf);
|
||||
|
||||
clear_bit(ICE_DOWN, pf->state);
|
||||
@@ -5187,6 +5188,7 @@ int ice_load(struct ice_pf *pf)
|
||||
return 0;
|
||||
|
||||
err_init_rdma:
|
||||
ice_deinit_features(pf);
|
||||
ice_tc_indir_block_unregister(vsi);
|
||||
err_tc_indir_block_register:
|
||||
ice_unregister_netdev(vsi);
|
||||
@@ -5210,8 +5212,8 @@ void ice_unload(struct ice_pf *pf)
|
||||
|
||||
devl_assert_locked(priv_to_devlink(pf));
|
||||
|
||||
ice_deinit_features(pf);
|
||||
ice_deinit_rdma(pf);
|
||||
ice_deinit_features(pf);
|
||||
ice_tc_indir_block_unregister(vsi);
|
||||
ice_unregister_netdev(vsi);
|
||||
ice_devlink_destroy_pf_port(pf);
|
||||
|
||||
@@ -3877,7 +3877,6 @@ static int ice_vc_repr_add_mac(struct ice_vf *vf, u8 *msg)
|
||||
}
|
||||
|
||||
ice_vfhw_mac_add(vf, &al->list[i]);
|
||||
vf->num_mac++;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -143,6 +143,7 @@ enum idpf_vport_state {
|
||||
* @vport_id: Vport identifier
|
||||
* @link_speed_mbps: Link speed in mbps
|
||||
* @vport_idx: Relative vport index
|
||||
* @max_tx_hdr_size: Max header length hardware can support
|
||||
* @state: See enum idpf_vport_state
|
||||
* @netstats: Packet and byte stats
|
||||
* @stats_lock: Lock to protect stats update
|
||||
@@ -153,6 +154,7 @@ struct idpf_netdev_priv {
|
||||
u32 vport_id;
|
||||
u32 link_speed_mbps;
|
||||
u16 vport_idx;
|
||||
u16 max_tx_hdr_size;
|
||||
enum idpf_vport_state state;
|
||||
struct rtnl_link_stats64 netstats;
|
||||
spinlock_t stats_lock;
|
||||
|
||||
@@ -723,6 +723,7 @@ static int idpf_cfg_netdev(struct idpf_vport *vport)
|
||||
np->vport = vport;
|
||||
np->vport_idx = vport->idx;
|
||||
np->vport_id = vport->vport_id;
|
||||
np->max_tx_hdr_size = idpf_get_max_tx_hdr_size(adapter);
|
||||
vport->netdev = netdev;
|
||||
|
||||
return idpf_init_mac_addr(vport, netdev);
|
||||
@@ -740,6 +741,7 @@ static int idpf_cfg_netdev(struct idpf_vport *vport)
|
||||
np->adapter = adapter;
|
||||
np->vport_idx = vport->idx;
|
||||
np->vport_id = vport->vport_id;
|
||||
np->max_tx_hdr_size = idpf_get_max_tx_hdr_size(adapter);
|
||||
|
||||
spin_lock_init(&np->stats_lock);
|
||||
|
||||
@@ -2189,8 +2191,8 @@ static netdev_features_t idpf_features_check(struct sk_buff *skb,
|
||||
struct net_device *netdev,
|
||||
netdev_features_t features)
|
||||
{
|
||||
struct idpf_vport *vport = idpf_netdev_to_vport(netdev);
|
||||
struct idpf_adapter *adapter = vport->adapter;
|
||||
struct idpf_netdev_priv *np = netdev_priv(netdev);
|
||||
u16 max_tx_hdr_size = np->max_tx_hdr_size;
|
||||
size_t len;
|
||||
|
||||
/* No point in doing any of this if neither checksum nor GSO are
|
||||
@@ -2213,7 +2215,7 @@ static netdev_features_t idpf_features_check(struct sk_buff *skb,
|
||||
goto unsupported;
|
||||
|
||||
len = skb_network_header_len(skb);
|
||||
if (unlikely(len > idpf_get_max_tx_hdr_size(adapter)))
|
||||
if (unlikely(len > max_tx_hdr_size))
|
||||
goto unsupported;
|
||||
|
||||
if (!skb->encapsulation)
|
||||
@@ -2226,7 +2228,7 @@ static netdev_features_t idpf_features_check(struct sk_buff *skb,
|
||||
|
||||
/* IPLEN can support at most 127 dwords */
|
||||
len = skb_inner_network_header_len(skb);
|
||||
if (unlikely(len > idpf_get_max_tx_hdr_size(adapter)))
|
||||
if (unlikely(len > max_tx_hdr_size))
|
||||
goto unsupported;
|
||||
|
||||
/* No need to validate L4LEN as TCP is the only protocol with a
|
||||
|
||||
@@ -4022,6 +4022,14 @@ static int idpf_vport_splitq_napi_poll(struct napi_struct *napi, int budget)
|
||||
return budget;
|
||||
}
|
||||
|
||||
/* Switch to poll mode in the tear-down path after sending disable
|
||||
* queues virtchnl message, as the interrupts will be disabled after
|
||||
* that.
|
||||
*/
|
||||
if (unlikely(q_vector->num_txq && idpf_queue_has(POLL_MODE,
|
||||
q_vector->tx[0])))
|
||||
return budget;
|
||||
|
||||
work_done = min_t(int, work_done, budget - 1);
|
||||
|
||||
/* Exit the polling mode, but don't re-enable interrupts if stack might
|
||||
@@ -4032,15 +4040,7 @@ static int idpf_vport_splitq_napi_poll(struct napi_struct *napi, int budget)
|
||||
else
|
||||
idpf_vport_intr_set_wb_on_itr(q_vector);
|
||||
|
||||
/* Switch to poll mode in the tear-down path after sending disable
|
||||
* queues virtchnl message, as the interrupts will be disabled after
|
||||
* that
|
||||
*/
|
||||
if (unlikely(q_vector->num_txq && idpf_queue_has(POLL_MODE,
|
||||
q_vector->tx[0])))
|
||||
return budget;
|
||||
else
|
||||
return work_done;
|
||||
return work_done;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -13,19 +13,26 @@
|
||||
/* RVU LMTST */
|
||||
#define LMT_TBL_OP_READ 0
|
||||
#define LMT_TBL_OP_WRITE 1
|
||||
#define LMT_MAP_TABLE_SIZE (128 * 1024)
|
||||
#define LMT_MAPTBL_ENTRY_SIZE 16
|
||||
#define LMT_MAX_VFS 256
|
||||
|
||||
#define LMT_MAP_ENTRY_ENA BIT_ULL(20)
|
||||
#define LMT_MAP_ENTRY_LINES GENMASK_ULL(18, 16)
|
||||
|
||||
/* Function to perform operations (read/write) on lmtst map table */
|
||||
static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val,
|
||||
int lmt_tbl_op)
|
||||
{
|
||||
void __iomem *lmt_map_base;
|
||||
u64 tbl_base;
|
||||
u64 tbl_base, cfg;
|
||||
int pfs, vfs;
|
||||
|
||||
tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE);
|
||||
cfg = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_CFG);
|
||||
vfs = 1 << (cfg & 0xF);
|
||||
pfs = 1 << ((cfg >> 4) & 0x7);
|
||||
|
||||
lmt_map_base = ioremap_wc(tbl_base, LMT_MAP_TABLE_SIZE);
|
||||
lmt_map_base = ioremap_wc(tbl_base, pfs * vfs * LMT_MAPTBL_ENTRY_SIZE);
|
||||
if (!lmt_map_base) {
|
||||
dev_err(rvu->dev, "Failed to setup lmt map table mapping!!\n");
|
||||
return -ENOMEM;
|
||||
@@ -35,6 +42,13 @@ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val,
|
||||
*val = readq(lmt_map_base + index);
|
||||
} else {
|
||||
writeq((*val), (lmt_map_base + index));
|
||||
|
||||
cfg = FIELD_PREP(LMT_MAP_ENTRY_ENA, 0x1);
|
||||
/* 2048 LMTLINES */
|
||||
cfg |= FIELD_PREP(LMT_MAP_ENTRY_LINES, 0x6);
|
||||
|
||||
writeq(cfg, (lmt_map_base + (index + 8)));
|
||||
|
||||
/* Flushing the AP interceptor cache to make APR_LMT_MAP_ENTRY_S
|
||||
* changes effective. Write 1 for flush and read is being used as a
|
||||
* barrier and sets up a data dependency. Write to 0 after a write
|
||||
@@ -52,7 +66,7 @@ static int lmtst_map_table_ops(struct rvu *rvu, u32 index, u64 *val,
|
||||
#define LMT_MAP_TBL_W1_OFF 8
|
||||
static u32 rvu_get_lmtst_tbl_index(struct rvu *rvu, u16 pcifunc)
|
||||
{
|
||||
return ((rvu_get_pf(pcifunc) * rvu->hw->total_vfs) +
|
||||
return ((rvu_get_pf(pcifunc) * LMT_MAX_VFS) +
|
||||
(pcifunc & RVU_PFVF_FUNC_MASK)) * LMT_MAPTBL_ENTRY_SIZE;
|
||||
}
|
||||
|
||||
@@ -69,7 +83,7 @@ static int rvu_get_lmtaddr(struct rvu *rvu, u16 pcifunc,
|
||||
|
||||
mutex_lock(&rvu->rsrc_lock);
|
||||
rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_SMMU_ADDR_REQ, iova);
|
||||
pf = rvu_get_pf(pcifunc) & 0x1F;
|
||||
pf = rvu_get_pf(pcifunc) & RVU_PFVF_PF_MASK;
|
||||
val = BIT_ULL(63) | BIT_ULL(14) | BIT_ULL(13) | pf << 8 |
|
||||
((pcifunc & RVU_PFVF_FUNC_MASK) & 0xFF);
|
||||
rvu_write64(rvu, BLKADDR_RVUM, RVU_AF_SMMU_TXN_REQ, val);
|
||||
|
||||
@@ -580,6 +580,7 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp,
|
||||
u64 lmt_addr, val, tbl_base;
|
||||
int pf, vf, num_vfs, hw_vfs;
|
||||
void __iomem *lmt_map_base;
|
||||
int apr_pfs, apr_vfs;
|
||||
int buf_size = 10240;
|
||||
size_t off = 0;
|
||||
int index = 0;
|
||||
@@ -595,8 +596,12 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp,
|
||||
return -ENOMEM;
|
||||
|
||||
tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE);
|
||||
val = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_CFG);
|
||||
apr_vfs = 1 << (val & 0xF);
|
||||
apr_pfs = 1 << ((val >> 4) & 0x7);
|
||||
|
||||
lmt_map_base = ioremap_wc(tbl_base, 128 * 1024);
|
||||
lmt_map_base = ioremap_wc(tbl_base, apr_pfs * apr_vfs *
|
||||
LMT_MAPTBL_ENTRY_SIZE);
|
||||
if (!lmt_map_base) {
|
||||
dev_err(rvu->dev, "Failed to setup lmt map table mapping!!\n");
|
||||
kfree(buf);
|
||||
@@ -618,7 +623,7 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp,
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off, "PF%d \t\t\t",
|
||||
pf);
|
||||
|
||||
index = pf * rvu->hw->total_vfs * LMT_MAPTBL_ENTRY_SIZE;
|
||||
index = pf * apr_vfs * LMT_MAPTBL_ENTRY_SIZE;
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off, " 0x%llx\t\t",
|
||||
(tbl_base + index));
|
||||
lmt_addr = readq(lmt_map_base + index);
|
||||
@@ -631,7 +636,7 @@ static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp,
|
||||
/* Reading num of VFs per PF */
|
||||
rvu_get_pf_numvfs(rvu, pf, &num_vfs, &hw_vfs);
|
||||
for (vf = 0; vf < num_vfs; vf++) {
|
||||
index = (pf * rvu->hw->total_vfs * 16) +
|
||||
index = (pf * apr_vfs * LMT_MAPTBL_ENTRY_SIZE) +
|
||||
((vf + 1) * LMT_MAPTBL_ENTRY_SIZE);
|
||||
off += scnprintf(&buf[off], buf_size - 1 - off,
|
||||
"PF%d:VF%d \t\t", pf, vf);
|
||||
|
||||
@@ -988,6 +988,7 @@ static int otx2_cq_init(struct otx2_nic *pfvf, u16 qidx)
|
||||
int err, pool_id, non_xdp_queues;
|
||||
struct nix_aq_enq_req *aq;
|
||||
struct otx2_cq_queue *cq;
|
||||
struct otx2_pool *pool;
|
||||
|
||||
cq = &qset->cq[qidx];
|
||||
cq->cq_idx = qidx;
|
||||
@@ -996,8 +997,13 @@ static int otx2_cq_init(struct otx2_nic *pfvf, u16 qidx)
|
||||
cq->cq_type = CQ_RX;
|
||||
cq->cint_idx = qidx;
|
||||
cq->cqe_cnt = qset->rqe_cnt;
|
||||
if (pfvf->xdp_prog)
|
||||
if (pfvf->xdp_prog) {
|
||||
pool = &qset->pool[qidx];
|
||||
xdp_rxq_info_reg(&cq->xdp_rxq, pfvf->netdev, qidx, 0);
|
||||
xdp_rxq_info_reg_mem_model(&cq->xdp_rxq,
|
||||
MEM_TYPE_PAGE_POOL,
|
||||
pool->page_pool);
|
||||
}
|
||||
} else if (qidx < non_xdp_queues) {
|
||||
cq->cq_type = CQ_TX;
|
||||
cq->cint_idx = qidx - pfvf->hw.rx_queues;
|
||||
|
||||
@@ -3759,8 +3759,11 @@ static int mlx5e_setup_tc_mqprio(struct mlx5e_priv *priv,
|
||||
/* MQPRIO is another toplevel qdisc that can't be attached
|
||||
* simultaneously with the offloaded HTB.
|
||||
*/
|
||||
if (WARN_ON(mlx5e_selq_is_htb_enabled(&priv->selq)))
|
||||
return -EINVAL;
|
||||
if (mlx5e_selq_is_htb_enabled(&priv->selq)) {
|
||||
NL_SET_ERR_MSG_MOD(mqprio->extack,
|
||||
"MQPRIO cannot be configured when HTB offload is enabled.");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
switch (mqprio->mode) {
|
||||
case TC_MQPRIO_MODE_DCB:
|
||||
|
||||
@@ -544,6 +544,8 @@ struct net_device *fbnic_netdev_alloc(struct fbnic_dev *fbd)
|
||||
fbnic_rss_key_fill(fbn->rss_key);
|
||||
fbnic_rss_init_en_mask(fbn);
|
||||
|
||||
netdev->priv_flags |= IFF_UNICAST_FLT;
|
||||
|
||||
netdev->features |=
|
||||
NETIF_F_RXHASH |
|
||||
NETIF_F_SG |
|
||||
|
||||
@@ -3466,6 +3466,7 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
|
||||
struct pci_dev *pdev)
|
||||
{
|
||||
struct lan743x_tx *tx;
|
||||
u32 sgmii_ctl;
|
||||
int index;
|
||||
int ret;
|
||||
|
||||
@@ -3478,6 +3479,15 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
|
||||
spin_lock_init(&adapter->eth_syslock_spinlock);
|
||||
mutex_init(&adapter->sgmii_rw_lock);
|
||||
pci11x1x_set_rfe_rd_fifo_threshold(adapter);
|
||||
sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
|
||||
if (adapter->is_sgmii_en) {
|
||||
sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_;
|
||||
sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
|
||||
} else {
|
||||
sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
|
||||
sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
|
||||
}
|
||||
lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
|
||||
} else {
|
||||
adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS;
|
||||
adapter->used_tx_channels = LAN743X_USED_TX_CHANNELS;
|
||||
@@ -3526,7 +3536,6 @@ static int lan743x_hardware_init(struct lan743x_adapter *adapter,
|
||||
|
||||
static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
|
||||
{
|
||||
u32 sgmii_ctl;
|
||||
int ret;
|
||||
|
||||
adapter->mdiobus = devm_mdiobus_alloc(&adapter->pdev->dev);
|
||||
@@ -3538,10 +3547,6 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
|
||||
adapter->mdiobus->priv = (void *)adapter;
|
||||
if (adapter->is_pci11x1x) {
|
||||
if (adapter->is_sgmii_en) {
|
||||
sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
|
||||
sgmii_ctl |= SGMII_CTL_SGMII_ENABLE_;
|
||||
sgmii_ctl &= ~SGMII_CTL_SGMII_POWER_DN_;
|
||||
lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
|
||||
netif_dbg(adapter, drv, adapter->netdev,
|
||||
"SGMII operation\n");
|
||||
adapter->mdiobus->read = lan743x_mdiobus_read_c22;
|
||||
@@ -3552,10 +3557,6 @@ static int lan743x_mdiobus_init(struct lan743x_adapter *adapter)
|
||||
netif_dbg(adapter, drv, adapter->netdev,
|
||||
"lan743x-mdiobus-c45\n");
|
||||
} else {
|
||||
sgmii_ctl = lan743x_csr_read(adapter, SGMII_CTL);
|
||||
sgmii_ctl &= ~SGMII_CTL_SGMII_ENABLE_;
|
||||
sgmii_ctl |= SGMII_CTL_SGMII_POWER_DN_;
|
||||
lan743x_csr_write(adapter, SGMII_CTL, sgmii_ctl);
|
||||
netif_dbg(adapter, drv, adapter->netdev,
|
||||
"RGMII operation\n");
|
||||
// Only C22 support when RGMII I/F
|
||||
|
||||
@@ -1044,7 +1044,7 @@ static u32 mana_gd_write_client_oob(const struct gdma_wqe_request *wqe_req,
|
||||
header->inline_oob_size_div4 = client_oob_size / sizeof(u32);
|
||||
|
||||
if (oob_in_sgl) {
|
||||
WARN_ON_ONCE(!pad_data || wqe_req->num_sge < 2);
|
||||
WARN_ON_ONCE(wqe_req->num_sge < 2);
|
||||
|
||||
header->client_oob_in_sgl = 1;
|
||||
|
||||
|
||||
@@ -5258,6 +5258,7 @@ static int r8169_mdio_register(struct rtl8169_private *tp)
|
||||
new_bus->priv = tp;
|
||||
new_bus->parent = &pdev->dev;
|
||||
new_bus->irq[0] = PHY_MAC_INTERRUPT;
|
||||
new_bus->phy_mask = GENMASK(31, 1);
|
||||
snprintf(new_bus->id, MII_BUS_ID_SIZE, "r8169-%x-%x",
|
||||
pci_domain_nr(pdev->bus), pci_dev_id(pdev));
|
||||
|
||||
|
||||
@@ -964,7 +964,7 @@ static int sun8i_dwmac_set_syscon(struct device *dev,
|
||||
/* of_mdio_parse_addr returns a valid (0 ~ 31) PHY
|
||||
* address. No need to mask it again.
|
||||
*/
|
||||
reg |= 1 << H3_EPHY_ADDR_SHIFT;
|
||||
reg |= ret << H3_EPHY_ADDR_SHIFT;
|
||||
} else {
|
||||
/* For SoCs without internal PHY the PHY selection bit should be
|
||||
* set to 0 (external PHY).
|
||||
|
||||
@@ -3599,8 +3599,6 @@ vmxnet3_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
struct vmxnet3_adapter *adapter = netdev_priv(netdev);
|
||||
int err = 0;
|
||||
|
||||
WRITE_ONCE(netdev->mtu, new_mtu);
|
||||
|
||||
/*
|
||||
* Reset_work may be in the middle of resetting the device, wait for its
|
||||
* completion.
|
||||
@@ -3614,6 +3612,7 @@ vmxnet3_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
|
||||
/* we need to re-create the rx queue based on the new mtu */
|
||||
vmxnet3_rq_destroy_all(adapter);
|
||||
WRITE_ONCE(netdev->mtu, new_mtu);
|
||||
vmxnet3_adjust_rx_ring_size(adapter);
|
||||
err = vmxnet3_rq_create_all(adapter);
|
||||
if (err) {
|
||||
@@ -3630,6 +3629,8 @@ vmxnet3_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
"Closing it\n", err);
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
WRITE_ONCE(netdev->mtu, new_mtu);
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
@@ -227,9 +227,9 @@ static int vxlan_fdb_info(struct sk_buff *skb, struct vxlan_dev *vxlan,
|
||||
be32_to_cpu(fdb->vni)))
|
||||
goto nla_put_failure;
|
||||
|
||||
ci.ndm_used = jiffies_to_clock_t(now - fdb->used);
|
||||
ci.ndm_used = jiffies_to_clock_t(now - READ_ONCE(fdb->used));
|
||||
ci.ndm_confirmed = 0;
|
||||
ci.ndm_updated = jiffies_to_clock_t(now - fdb->updated);
|
||||
ci.ndm_updated = jiffies_to_clock_t(now - READ_ONCE(fdb->updated));
|
||||
ci.ndm_refcnt = 0;
|
||||
|
||||
if (nla_put(skb, NDA_CACHEINFO, sizeof(ci), &ci))
|
||||
@@ -434,8 +434,8 @@ static struct vxlan_fdb *vxlan_find_mac(struct vxlan_dev *vxlan,
|
||||
struct vxlan_fdb *f;
|
||||
|
||||
f = __vxlan_find_mac(vxlan, mac, vni);
|
||||
if (f && f->used != jiffies)
|
||||
f->used = jiffies;
|
||||
if (f && READ_ONCE(f->used) != jiffies)
|
||||
WRITE_ONCE(f->used, jiffies);
|
||||
|
||||
return f;
|
||||
}
|
||||
@@ -1009,12 +1009,12 @@ static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan,
|
||||
!(f->flags & NTF_VXLAN_ADDED_BY_USER)) {
|
||||
if (f->state != state) {
|
||||
f->state = state;
|
||||
f->updated = jiffies;
|
||||
WRITE_ONCE(f->updated, jiffies);
|
||||
notify = 1;
|
||||
}
|
||||
if (f->flags != fdb_flags) {
|
||||
f->flags = fdb_flags;
|
||||
f->updated = jiffies;
|
||||
WRITE_ONCE(f->updated, jiffies);
|
||||
notify = 1;
|
||||
}
|
||||
}
|
||||
@@ -1048,7 +1048,7 @@ static int vxlan_fdb_update_existing(struct vxlan_dev *vxlan,
|
||||
}
|
||||
|
||||
if (ndm_flags & NTF_USE)
|
||||
f->used = jiffies;
|
||||
WRITE_ONCE(f->used, jiffies);
|
||||
|
||||
if (notify) {
|
||||
if (rd == NULL)
|
||||
@@ -1477,7 +1477,7 @@ static bool vxlan_snoop(struct net_device *dev,
|
||||
src_mac, &rdst->remote_ip.sa, &src_ip->sa);
|
||||
|
||||
rdst->remote_ip = *src_ip;
|
||||
f->updated = jiffies;
|
||||
WRITE_ONCE(f->updated, jiffies);
|
||||
vxlan_fdb_notify(vxlan, f, rdst, RTM_NEWNEIGH, true, NULL);
|
||||
} else {
|
||||
u32 hash_index = fdb_head_index(vxlan, src_mac, vni);
|
||||
@@ -2825,7 +2825,7 @@ static void vxlan_cleanup(struct timer_list *t)
|
||||
if (f->flags & NTF_EXT_LEARNED)
|
||||
continue;
|
||||
|
||||
timeout = f->used + vxlan->cfg.age_interval * HZ;
|
||||
timeout = READ_ONCE(f->used) + vxlan->cfg.age_interval * HZ;
|
||||
if (time_before_eq(timeout, jiffies)) {
|
||||
netdev_dbg(vxlan->dev,
|
||||
"garbage collect %pM\n",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
||||
/*
|
||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2023, 2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef ATH11K_DP_H
|
||||
@@ -20,7 +20,6 @@ struct ath11k_ext_irq_grp;
|
||||
|
||||
struct dp_rx_tid {
|
||||
u8 tid;
|
||||
u32 *vaddr;
|
||||
dma_addr_t paddr;
|
||||
u32 size;
|
||||
u32 ba_win_sz;
|
||||
@@ -37,6 +36,9 @@ struct dp_rx_tid {
|
||||
/* Timer info related to fragments */
|
||||
struct timer_list frag_timer;
|
||||
struct ath11k_base *ab;
|
||||
u32 *vaddr_unaligned;
|
||||
dma_addr_t paddr_unaligned;
|
||||
u32 unaligned_size;
|
||||
};
|
||||
|
||||
#define DP_REO_DESC_FREE_THRESHOLD 64
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/ieee80211.h>
|
||||
@@ -675,11 +675,11 @@ void ath11k_dp_reo_cmd_list_cleanup(struct ath11k_base *ab)
|
||||
list_for_each_entry_safe(cmd, tmp, &dp->reo_cmd_list, list) {
|
||||
list_del(&cmd->list);
|
||||
rx_tid = &cmd->data;
|
||||
if (rx_tid->vaddr) {
|
||||
dma_unmap_single(ab->dev, rx_tid->paddr,
|
||||
rx_tid->size, DMA_BIDIRECTIONAL);
|
||||
kfree(rx_tid->vaddr);
|
||||
rx_tid->vaddr = NULL;
|
||||
if (rx_tid->vaddr_unaligned) {
|
||||
dma_free_noncoherent(ab->dev, rx_tid->unaligned_size,
|
||||
rx_tid->vaddr_unaligned,
|
||||
rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL);
|
||||
rx_tid->vaddr_unaligned = NULL;
|
||||
}
|
||||
kfree(cmd);
|
||||
}
|
||||
@@ -689,11 +689,11 @@ void ath11k_dp_reo_cmd_list_cleanup(struct ath11k_base *ab)
|
||||
list_del(&cmd_cache->list);
|
||||
dp->reo_cmd_cache_flush_count--;
|
||||
rx_tid = &cmd_cache->data;
|
||||
if (rx_tid->vaddr) {
|
||||
dma_unmap_single(ab->dev, rx_tid->paddr,
|
||||
rx_tid->size, DMA_BIDIRECTIONAL);
|
||||
kfree(rx_tid->vaddr);
|
||||
rx_tid->vaddr = NULL;
|
||||
if (rx_tid->vaddr_unaligned) {
|
||||
dma_free_noncoherent(ab->dev, rx_tid->unaligned_size,
|
||||
rx_tid->vaddr_unaligned,
|
||||
rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL);
|
||||
rx_tid->vaddr_unaligned = NULL;
|
||||
}
|
||||
kfree(cmd_cache);
|
||||
}
|
||||
@@ -708,11 +708,11 @@ static void ath11k_dp_reo_cmd_free(struct ath11k_dp *dp, void *ctx,
|
||||
if (status != HAL_REO_CMD_SUCCESS)
|
||||
ath11k_warn(dp->ab, "failed to flush rx tid hw desc, tid %d status %d\n",
|
||||
rx_tid->tid, status);
|
||||
if (rx_tid->vaddr) {
|
||||
dma_unmap_single(dp->ab->dev, rx_tid->paddr, rx_tid->size,
|
||||
DMA_BIDIRECTIONAL);
|
||||
kfree(rx_tid->vaddr);
|
||||
rx_tid->vaddr = NULL;
|
||||
if (rx_tid->vaddr_unaligned) {
|
||||
dma_free_noncoherent(dp->ab->dev, rx_tid->unaligned_size,
|
||||
rx_tid->vaddr_unaligned,
|
||||
rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL);
|
||||
rx_tid->vaddr_unaligned = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -749,10 +749,10 @@ static void ath11k_dp_reo_cache_flush(struct ath11k_base *ab,
|
||||
if (ret) {
|
||||
ath11k_err(ab, "failed to send HAL_REO_CMD_FLUSH_CACHE cmd, tid %d (%d)\n",
|
||||
rx_tid->tid, ret);
|
||||
dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size,
|
||||
DMA_BIDIRECTIONAL);
|
||||
kfree(rx_tid->vaddr);
|
||||
rx_tid->vaddr = NULL;
|
||||
dma_free_noncoherent(ab->dev, rx_tid->unaligned_size,
|
||||
rx_tid->vaddr_unaligned,
|
||||
rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL);
|
||||
rx_tid->vaddr_unaligned = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -802,10 +802,10 @@ static void ath11k_dp_rx_tid_del_func(struct ath11k_dp *dp, void *ctx,
|
||||
|
||||
return;
|
||||
free_desc:
|
||||
dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size,
|
||||
DMA_BIDIRECTIONAL);
|
||||
kfree(rx_tid->vaddr);
|
||||
rx_tid->vaddr = NULL;
|
||||
dma_free_noncoherent(ab->dev, rx_tid->unaligned_size,
|
||||
rx_tid->vaddr_unaligned,
|
||||
rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL);
|
||||
rx_tid->vaddr_unaligned = NULL;
|
||||
}
|
||||
|
||||
void ath11k_peer_rx_tid_delete(struct ath11k *ar,
|
||||
@@ -831,14 +831,16 @@ void ath11k_peer_rx_tid_delete(struct ath11k *ar,
|
||||
if (ret != -ESHUTDOWN)
|
||||
ath11k_err(ar->ab, "failed to send HAL_REO_CMD_UPDATE_RX_QUEUE cmd, tid %d (%d)\n",
|
||||
tid, ret);
|
||||
dma_unmap_single(ar->ab->dev, rx_tid->paddr, rx_tid->size,
|
||||
DMA_BIDIRECTIONAL);
|
||||
kfree(rx_tid->vaddr);
|
||||
rx_tid->vaddr = NULL;
|
||||
dma_free_noncoherent(ar->ab->dev, rx_tid->unaligned_size,
|
||||
rx_tid->vaddr_unaligned,
|
||||
rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL);
|
||||
rx_tid->vaddr_unaligned = NULL;
|
||||
}
|
||||
|
||||
rx_tid->paddr = 0;
|
||||
rx_tid->paddr_unaligned = 0;
|
||||
rx_tid->size = 0;
|
||||
rx_tid->unaligned_size = 0;
|
||||
}
|
||||
|
||||
static int ath11k_dp_rx_link_desc_return(struct ath11k_base *ab,
|
||||
@@ -982,10 +984,9 @@ static void ath11k_dp_rx_tid_mem_free(struct ath11k_base *ab,
|
||||
if (!rx_tid->active)
|
||||
goto unlock_exit;
|
||||
|
||||
dma_unmap_single(ab->dev, rx_tid->paddr, rx_tid->size,
|
||||
DMA_BIDIRECTIONAL);
|
||||
kfree(rx_tid->vaddr);
|
||||
rx_tid->vaddr = NULL;
|
||||
dma_free_noncoherent(ab->dev, rx_tid->unaligned_size, rx_tid->vaddr_unaligned,
|
||||
rx_tid->paddr_unaligned, DMA_BIDIRECTIONAL);
|
||||
rx_tid->vaddr_unaligned = NULL;
|
||||
|
||||
rx_tid->active = false;
|
||||
|
||||
@@ -1000,9 +1001,8 @@ int ath11k_peer_rx_tid_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id,
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct ath11k_peer *peer;
|
||||
struct dp_rx_tid *rx_tid;
|
||||
u32 hw_desc_sz;
|
||||
u32 *addr_aligned;
|
||||
void *vaddr;
|
||||
u32 hw_desc_sz, *vaddr;
|
||||
void *vaddr_unaligned;
|
||||
dma_addr_t paddr;
|
||||
int ret;
|
||||
|
||||
@@ -1050,49 +1050,40 @@ int ath11k_peer_rx_tid_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id,
|
||||
else
|
||||
hw_desc_sz = ath11k_hal_reo_qdesc_size(DP_BA_WIN_SZ_MAX, tid);
|
||||
|
||||
vaddr = kzalloc(hw_desc_sz + HAL_LINK_DESC_ALIGN - 1, GFP_ATOMIC);
|
||||
if (!vaddr) {
|
||||
rx_tid->unaligned_size = hw_desc_sz + HAL_LINK_DESC_ALIGN - 1;
|
||||
vaddr_unaligned = dma_alloc_noncoherent(ab->dev, rx_tid->unaligned_size, &paddr,
|
||||
DMA_BIDIRECTIONAL, GFP_ATOMIC);
|
||||
if (!vaddr_unaligned) {
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
addr_aligned = PTR_ALIGN(vaddr, HAL_LINK_DESC_ALIGN);
|
||||
|
||||
ath11k_hal_reo_qdesc_setup(addr_aligned, tid, ba_win_sz,
|
||||
ssn, pn_type);
|
||||
|
||||
paddr = dma_map_single(ab->dev, addr_aligned, hw_desc_sz,
|
||||
DMA_BIDIRECTIONAL);
|
||||
|
||||
ret = dma_mapping_error(ab->dev, paddr);
|
||||
if (ret) {
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
ath11k_warn(ab, "failed to setup dma map for peer %pM rx tid %d: %d\n",
|
||||
peer_mac, tid, ret);
|
||||
goto err_mem_free;
|
||||
}
|
||||
|
||||
rx_tid->vaddr = vaddr;
|
||||
rx_tid->paddr = paddr;
|
||||
rx_tid->vaddr_unaligned = vaddr_unaligned;
|
||||
vaddr = PTR_ALIGN(vaddr_unaligned, HAL_LINK_DESC_ALIGN);
|
||||
rx_tid->paddr_unaligned = paddr;
|
||||
rx_tid->paddr = rx_tid->paddr_unaligned + ((unsigned long)vaddr -
|
||||
(unsigned long)rx_tid->vaddr_unaligned);
|
||||
ath11k_hal_reo_qdesc_setup(vaddr, tid, ba_win_sz, ssn, pn_type);
|
||||
rx_tid->size = hw_desc_sz;
|
||||
rx_tid->active = true;
|
||||
|
||||
/* After dma_alloc_noncoherent, vaddr is being modified for reo qdesc setup.
|
||||
* Since these changes are not reflected in the device, driver now needs to
|
||||
* explicitly call dma_sync_single_for_device.
|
||||
*/
|
||||
dma_sync_single_for_device(ab->dev, rx_tid->paddr,
|
||||
rx_tid->size,
|
||||
DMA_TO_DEVICE);
|
||||
spin_unlock_bh(&ab->base_lock);
|
||||
|
||||
ret = ath11k_wmi_peer_rx_reorder_queue_setup(ar, vdev_id, peer_mac,
|
||||
paddr, tid, 1, ba_win_sz);
|
||||
ret = ath11k_wmi_peer_rx_reorder_queue_setup(ar, vdev_id, peer_mac, rx_tid->paddr,
|
||||
tid, 1, ba_win_sz);
|
||||
if (ret) {
|
||||
ath11k_warn(ar->ab, "failed to setup rx reorder queue for peer %pM tid %d: %d\n",
|
||||
peer_mac, tid, ret);
|
||||
ath11k_dp_rx_tid_mem_free(ab, peer_mac, vdev_id, tid);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
err_mem_free:
|
||||
kfree(rx_tid->vaddr);
|
||||
rx_tid->vaddr = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ EXPORT_SYMBOL(ath12k_core_resume);
|
||||
|
||||
static int __ath12k_core_create_board_name(struct ath12k_base *ab, char *name,
|
||||
size_t name_len, bool with_variant,
|
||||
bool bus_type_mode)
|
||||
bool bus_type_mode, bool with_default)
|
||||
{
|
||||
/* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */
|
||||
char variant[9 + ATH12K_QMI_BDF_EXT_STR_LENGTH] = { 0 };
|
||||
@@ -192,7 +192,9 @@ static int __ath12k_core_create_board_name(struct ath12k_base *ab, char *name,
|
||||
"bus=%s,qmi-chip-id=%d,qmi-board-id=%d%s",
|
||||
ath12k_bus_str(ab->hif.bus),
|
||||
ab->qmi.target.chip_id,
|
||||
ab->qmi.target.board_id, variant);
|
||||
with_default ?
|
||||
ATH12K_BOARD_ID_DEFAULT : ab->qmi.target.board_id,
|
||||
variant);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -204,19 +206,19 @@ static int __ath12k_core_create_board_name(struct ath12k_base *ab, char *name,
|
||||
static int ath12k_core_create_board_name(struct ath12k_base *ab, char *name,
|
||||
size_t name_len)
|
||||
{
|
||||
return __ath12k_core_create_board_name(ab, name, name_len, true, false);
|
||||
return __ath12k_core_create_board_name(ab, name, name_len, true, false, false);
|
||||
}
|
||||
|
||||
static int ath12k_core_create_fallback_board_name(struct ath12k_base *ab, char *name,
|
||||
size_t name_len)
|
||||
{
|
||||
return __ath12k_core_create_board_name(ab, name, name_len, false, false);
|
||||
return __ath12k_core_create_board_name(ab, name, name_len, false, false, true);
|
||||
}
|
||||
|
||||
static int ath12k_core_create_bus_type_board_name(struct ath12k_base *ab, char *name,
|
||||
size_t name_len)
|
||||
{
|
||||
return __ath12k_core_create_board_name(ab, name, name_len, false, true);
|
||||
return __ath12k_core_create_board_name(ab, name, name_len, false, true, true);
|
||||
}
|
||||
|
||||
const struct firmware *ath12k_core_firmware_request(struct ath12k_base *ab,
|
||||
|
||||
@@ -148,6 +148,7 @@ struct ath12k_ext_irq_grp {
|
||||
u32 num_irq;
|
||||
u32 grp_id;
|
||||
u64 timestamp;
|
||||
bool napi_enabled;
|
||||
struct napi_struct napi;
|
||||
struct net_device *napi_ndev;
|
||||
};
|
||||
|
||||
@@ -117,7 +117,7 @@ static void ath12k_hal_tx_cmd_ext_desc_setup(struct ath12k_base *ab,
|
||||
le32_encode_bits(ti->data_len,
|
||||
HAL_TX_MSDU_EXT_INFO1_BUF_LEN);
|
||||
|
||||
tcl_ext_cmd->info1 = le32_encode_bits(1, HAL_TX_MSDU_EXT_INFO1_EXTN_OVERRIDE) |
|
||||
tcl_ext_cmd->info1 |= le32_encode_bits(1, HAL_TX_MSDU_EXT_INFO1_EXTN_OVERRIDE) |
|
||||
le32_encode_bits(ti->encap_type,
|
||||
HAL_TX_MSDU_EXT_INFO1_ENCAP_TYPE) |
|
||||
le32_encode_bits(ti->encrypt_type,
|
||||
|
||||
@@ -2966,7 +2966,7 @@ struct hal_mon_buf_ring {
|
||||
|
||||
#define HAL_MON_DEST_COOKIE_BUF_ID GENMASK(17, 0)
|
||||
|
||||
#define HAL_MON_DEST_INFO0_END_OFFSET GENMASK(15, 0)
|
||||
#define HAL_MON_DEST_INFO0_END_OFFSET GENMASK(11, 0)
|
||||
#define HAL_MON_DEST_INFO0_FLUSH_DETECTED BIT(16)
|
||||
#define HAL_MON_DEST_INFO0_END_OF_PPDU BIT(17)
|
||||
#define HAL_MON_DEST_INFO0_INITIATOR BIT(18)
|
||||
|
||||
@@ -481,8 +481,11 @@ static void __ath12k_pci_ext_irq_disable(struct ath12k_base *ab)
|
||||
|
||||
ath12k_pci_ext_grp_disable(irq_grp);
|
||||
|
||||
napi_synchronize(&irq_grp->napi);
|
||||
napi_disable(&irq_grp->napi);
|
||||
if (irq_grp->napi_enabled) {
|
||||
napi_synchronize(&irq_grp->napi);
|
||||
napi_disable(&irq_grp->napi);
|
||||
irq_grp->napi_enabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1112,7 +1115,11 @@ void ath12k_pci_ext_irq_enable(struct ath12k_base *ab)
|
||||
for (i = 0; i < ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) {
|
||||
struct ath12k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
|
||||
|
||||
napi_enable(&irq_grp->napi);
|
||||
if (!irq_grp->napi_enabled) {
|
||||
napi_enable(&irq_grp->napi);
|
||||
irq_grp->napi_enabled = true;
|
||||
}
|
||||
|
||||
ath12k_pci_ext_grp_enable(irq_grp);
|
||||
}
|
||||
|
||||
|
||||
@@ -691,7 +691,9 @@ static int ath9k_of_init(struct ath_softc *sc)
|
||||
ah->ah_flags |= AH_NO_EEP_SWAP;
|
||||
}
|
||||
|
||||
of_get_mac_address(np, common->macaddr);
|
||||
ret = of_get_mac_address(np, common->macaddr);
|
||||
if (ret == -EPROBE_DEFER)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -587,6 +587,8 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {
|
||||
IWL_DEV_INFO(0x7A70, 0x1692, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690i_name),
|
||||
IWL_DEV_INFO(0x7AF0, 0x1691, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690s_name),
|
||||
IWL_DEV_INFO(0x7AF0, 0x1692, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690i_name),
|
||||
IWL_DEV_INFO(0x7F70, 0x1691, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690s_name),
|
||||
IWL_DEV_INFO(0x7F70, 0x1692, iwlax411_2ax_cfg_so_gf4_a0, iwl_ax411_killer_1690i_name),
|
||||
|
||||
IWL_DEV_INFO(0x271C, 0x0214, iwl9260_2ac_cfg, iwl9260_1_name),
|
||||
IWL_DEV_INFO(0x7E40, 0x1691, iwl_cfg_ma, iwl_ax411_killer_1690s_name),
|
||||
|
||||
@@ -860,9 +860,10 @@ rtl8xxxu_writeN(struct rtl8xxxu_priv *priv, u16 addr, u8 *buf, u16 len)
|
||||
return len;
|
||||
|
||||
write_error:
|
||||
dev_info(&udev->dev,
|
||||
"%s: Failed to write block at addr: %04x size: %04x\n",
|
||||
__func__, addr, blocksize);
|
||||
if (rtl8xxxu_debug & RTL8XXXU_DEBUG_REG_WRITE)
|
||||
dev_info(&udev->dev,
|
||||
"%s: Failed to write block at addr: %04x size: %04x\n",
|
||||
__func__, addr, blocksize);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
@@ -4064,8 +4065,14 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
|
||||
*/
|
||||
rtl8xxxu_write16(priv, REG_TRXFF_BNDY + 2, fops->trxff_boundary);
|
||||
|
||||
ret = rtl8xxxu_download_firmware(priv);
|
||||
dev_dbg(dev, "%s: download_firmware %i\n", __func__, ret);
|
||||
for (int retry = 5; retry >= 0 ; retry--) {
|
||||
ret = rtl8xxxu_download_firmware(priv);
|
||||
dev_dbg(dev, "%s: download_firmware %i\n", __func__, ret);
|
||||
if (ret != -EAGAIN)
|
||||
break;
|
||||
if (retry)
|
||||
dev_dbg(dev, "%s: retry firmware download\n", __func__);
|
||||
}
|
||||
if (ret)
|
||||
goto exit;
|
||||
ret = rtl8xxxu_start_firmware(priv);
|
||||
|
||||
@@ -976,11 +976,11 @@ static void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
|
||||
}
|
||||
|
||||
static void
|
||||
rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
|
||||
rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path,
|
||||
u8 rs, u32 *phy_pwr_idx)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
static const u32 offset_txagc[2] = {0x1d00, 0x1d80};
|
||||
static u32 phy_pwr_idx;
|
||||
u8 rate, rate_idx, pwr_index, shift;
|
||||
int j;
|
||||
|
||||
@@ -988,12 +988,12 @@ rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
|
||||
rate = rtw_rate_section[rs][j];
|
||||
pwr_index = hal->tx_pwr_tbl[path][rate];
|
||||
shift = rate & 0x3;
|
||||
phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
|
||||
*phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
|
||||
if (shift == 0x3) {
|
||||
rate_idx = rate & 0xfc;
|
||||
rtw_write32(rtwdev, offset_txagc[path] + rate_idx,
|
||||
phy_pwr_idx);
|
||||
phy_pwr_idx = 0;
|
||||
*phy_pwr_idx);
|
||||
*phy_pwr_idx = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1001,11 +1001,13 @@ rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
|
||||
static void rtw8822b_set_tx_power_index(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
u32 phy_pwr_idx = 0;
|
||||
int rs, path;
|
||||
|
||||
for (path = 0; path < hal->rf_path_num; path++) {
|
||||
for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++)
|
||||
rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs);
|
||||
rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs,
|
||||
&phy_pwr_idx);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5356,7 +5356,8 @@ static void _action_wl_scan(struct rtw89_dev *rtwdev)
|
||||
struct rtw89_btc_wl_info *wl = &btc->cx.wl;
|
||||
struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
|
||||
|
||||
if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) {
|
||||
if (btc->cx.state_map != BTC_WLINKING &&
|
||||
RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) {
|
||||
_action_wl_25g_mcc(rtwdev);
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], Scan offload!\n");
|
||||
} else if (rtwdev->dbcc_en) {
|
||||
@@ -7178,6 +7179,8 @@ void rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx)
|
||||
_fw_set_drv_info(rtwdev, CXDRVINFO_DBCC);
|
||||
}
|
||||
|
||||
btc->dm.tdma_instant_excute = 1;
|
||||
|
||||
_run_coex(rtwdev, BTC_RSN_NTFY_SCAN_FINISH);
|
||||
}
|
||||
|
||||
@@ -7630,7 +7633,8 @@ void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev,
|
||||
else
|
||||
wl->status.map.connecting = 0;
|
||||
|
||||
if (state == BTC_ROLE_MSTS_STA_DIS_CONN)
|
||||
if (state == BTC_ROLE_MSTS_STA_DIS_CONN ||
|
||||
state == BTC_ROLE_MSTS_STA_CONN_END)
|
||||
wl->status.map._4way = false;
|
||||
|
||||
_run_coex(rtwdev, BTC_RSN_NTFY_ROLE_INFO);
|
||||
|
||||
@@ -695,6 +695,7 @@ void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request
|
||||
struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
|
||||
struct rtw89_dev *rtwdev = hw->priv;
|
||||
|
||||
wiphy_lock(wiphy);
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
|
||||
@@ -712,6 +713,7 @@ void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request
|
||||
|
||||
exit:
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
wiphy_unlock(wiphy);
|
||||
}
|
||||
|
||||
/* Maximum Transmit Power field (@raw) can be EIRP or PSD.
|
||||
|
||||
@@ -156,9 +156,11 @@ static void ser_state_run(struct rtw89_ser *ser, u8 evt)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_SER, "ser: %s receive %s\n",
|
||||
ser_st_name(ser), ser_ev_name(ser, evt));
|
||||
|
||||
wiphy_lock(rtwdev->hw->wiphy);
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_leave_lps(rtwdev);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
wiphy_unlock(rtwdev->hw->wiphy);
|
||||
|
||||
ser->st_tbl[ser->state].st_func(ser, evt);
|
||||
}
|
||||
@@ -707,9 +709,11 @@ static void ser_l2_reset_st_hdl(struct rtw89_ser *ser, u8 evt)
|
||||
|
||||
switch (evt) {
|
||||
case SER_EV_STATE_IN:
|
||||
wiphy_lock(rtwdev->hw->wiphy);
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
ser_l2_reset_st_pre_hdl(ser);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
wiphy_unlock(rtwdev->hw->wiphy);
|
||||
|
||||
ieee80211_restart_hw(rtwdev->hw);
|
||||
ser_set_alarm(ser, SER_RECFG_TIMEOUT, SER_EV_L2_RECFG_TIMEOUT);
|
||||
|
||||
@@ -3587,6 +3587,9 @@ static const struct pci_device_id nvme_id_table[] = {
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1217, 0x8760), /* O2 Micro 64GB Steam Deck */
|
||||
.driver_data = NVME_QUIRK_DMAPOOL_ALIGN_512, },
|
||||
{ PCI_DEVICE(0x126f, 0x1001), /* Silicon Motion generic */
|
||||
.driver_data = NVME_QUIRK_NO_DEEPEST_PS |
|
||||
NVME_QUIRK_IGNORE_DEV_SUBNQN, },
|
||||
{ PCI_DEVICE(0x126f, 0x2262), /* Silicon Motion generic */
|
||||
.driver_data = NVME_QUIRK_NO_DEEPEST_PS |
|
||||
NVME_QUIRK_BOGUS_NID, },
|
||||
@@ -3610,6 +3613,9 @@ static const struct pci_device_id nvme_id_table[] = {
|
||||
NVME_QUIRK_IGNORE_DEV_SUBNQN, },
|
||||
{ PCI_DEVICE(0x15b7, 0x5008), /* Sandisk SN530 */
|
||||
.driver_data = NVME_QUIRK_BROKEN_MSI },
|
||||
{ PCI_DEVICE(0x15b7, 0x5009), /* Sandisk SN550 */
|
||||
.driver_data = NVME_QUIRK_BROKEN_MSI |
|
||||
NVME_QUIRK_NO_DEEPEST_PS },
|
||||
{ PCI_DEVICE(0x1987, 0x5012), /* Phison E12 */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1987, 0x5016), /* Phison E16 */
|
||||
|
||||
@@ -1560,6 +1560,9 @@ static void nvmet_tcp_restore_socket_callbacks(struct nvmet_tcp_queue *queue)
|
||||
{
|
||||
struct socket *sock = queue->sock;
|
||||
|
||||
if (!queue->state_change)
|
||||
return;
|
||||
|
||||
write_lock_bh(&sock->sk->sk_callback_lock);
|
||||
sock->sk->sk_data_ready = queue->data_ready;
|
||||
sock->sk->sk_state_change = queue->state_change;
|
||||
|
||||
@@ -487,7 +487,7 @@ static int meson_pinconf_get(struct pinctrl_dev *pcdev, unsigned int pin,
|
||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
if (meson_pinconf_get_pull(pc, pin) == param)
|
||||
arg = 1;
|
||||
arg = 60000;
|
||||
else
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
* @pctrl: pinctrl handle.
|
||||
* @chip: gpiochip handle.
|
||||
* @desc: pin controller descriptor
|
||||
* @restart_nb: restart notifier block.
|
||||
* @irq: parent irq for the TLMM irq_chip.
|
||||
* @intr_target_use_scm: route irq to application cpu using scm calls
|
||||
* @lock: Spinlock to protect register resources as well
|
||||
@@ -63,7 +62,6 @@ struct msm_pinctrl {
|
||||
struct pinctrl_dev *pctrl;
|
||||
struct gpio_chip chip;
|
||||
struct pinctrl_desc desc;
|
||||
struct notifier_block restart_nb;
|
||||
|
||||
int irq;
|
||||
|
||||
@@ -1470,10 +1468,9 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int msm_ps_hold_restart(struct notifier_block *nb, unsigned long action,
|
||||
void *data)
|
||||
static int msm_ps_hold_restart(struct sys_off_data *data)
|
||||
{
|
||||
struct msm_pinctrl *pctrl = container_of(nb, struct msm_pinctrl, restart_nb);
|
||||
struct msm_pinctrl *pctrl = data->cb_data;
|
||||
|
||||
writel(0, pctrl->regs[0] + PS_HOLD_OFFSET);
|
||||
mdelay(1000);
|
||||
@@ -1484,7 +1481,11 @@ static struct msm_pinctrl *poweroff_pctrl;
|
||||
|
||||
static void msm_ps_hold_poweroff(void)
|
||||
{
|
||||
msm_ps_hold_restart(&poweroff_pctrl->restart_nb, 0, NULL);
|
||||
struct sys_off_data data = {
|
||||
.cb_data = poweroff_pctrl,
|
||||
};
|
||||
|
||||
msm_ps_hold_restart(&data);
|
||||
}
|
||||
|
||||
static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl)
|
||||
@@ -1494,9 +1495,11 @@ static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl)
|
||||
|
||||
for (i = 0; i < pctrl->soc->nfunctions; i++)
|
||||
if (!strcmp(func[i].name, "ps_hold")) {
|
||||
pctrl->restart_nb.notifier_call = msm_ps_hold_restart;
|
||||
pctrl->restart_nb.priority = 128;
|
||||
if (register_restart_handler(&pctrl->restart_nb))
|
||||
if (devm_register_sys_off_handler(pctrl->dev,
|
||||
SYS_OFF_MODE_RESTART,
|
||||
128,
|
||||
msm_ps_hold_restart,
|
||||
pctrl))
|
||||
dev_err(pctrl->dev,
|
||||
"failed to setup restart handler.\n");
|
||||
poweroff_pctrl = pctrl;
|
||||
@@ -1598,8 +1601,6 @@ void msm_pinctrl_remove(struct platform_device *pdev)
|
||||
struct msm_pinctrl *pctrl = platform_get_drvdata(pdev);
|
||||
|
||||
gpiochip_remove(&pctrl->chip);
|
||||
|
||||
unregister_restart_handler(&pctrl->restart_nb);
|
||||
}
|
||||
EXPORT_SYMBOL(msm_pinctrl_remove);
|
||||
|
||||
|
||||
@@ -305,7 +305,7 @@ static const struct tegra_pingroup *tegra_pinctrl_get_group(struct pinctrl_dev *
|
||||
{
|
||||
struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
|
||||
|
||||
if (group_index < 0 || group_index > pmx->soc->ngroups)
|
||||
if (group_index < 0 || group_index >= pmx->soc->ngroups)
|
||||
return NULL;
|
||||
|
||||
return &pmx->soc->groups[group_index];
|
||||
|
||||
@@ -304,6 +304,7 @@ struct asus_wmi {
|
||||
|
||||
u32 kbd_rgb_dev;
|
||||
bool kbd_rgb_state_available;
|
||||
bool oobe_state_available;
|
||||
|
||||
u8 throttle_thermal_policy_mode;
|
||||
u32 throttle_thermal_policy_dev;
|
||||
@@ -1826,7 +1827,7 @@ static int asus_wmi_led_init(struct asus_wmi *asus)
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_OOBE)) {
|
||||
if (asus->oobe_state_available) {
|
||||
/*
|
||||
* Disable OOBE state, so that e.g. the keyboard backlight
|
||||
* works.
|
||||
@@ -4741,6 +4742,7 @@ static int asus_wmi_add(struct platform_device *pdev)
|
||||
asus->egpu_enable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_EGPU);
|
||||
asus->dgpu_disable_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_DGPU);
|
||||
asus->kbd_rgb_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_STATE);
|
||||
asus->oobe_state_available = asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_OOBE);
|
||||
asus->ally_mcu_usb_switch = acpi_has_method(NULL, ASUS_USB0_PWR_EC0_CSEE)
|
||||
&& dmi_check_system(asus_ally_mcu_quirk);
|
||||
|
||||
@@ -4994,6 +4996,13 @@ static int asus_hotk_restore(struct device *device)
|
||||
}
|
||||
if (!IS_ERR_OR_NULL(asus->kbd_led.dev))
|
||||
kbd_led_update(asus);
|
||||
if (asus->oobe_state_available) {
|
||||
/*
|
||||
* Disable OOBE state, so that e.g. the keyboard backlight
|
||||
* works.
|
||||
*/
|
||||
asus_wmi_set_devstate(ASUS_WMI_DEVID_OOBE, 1, NULL);
|
||||
}
|
||||
|
||||
if (asus_wmi_has_fnlock_key(asus))
|
||||
asus_wmi_fnlock_update(asus);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user