5.15.159-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainerPATCH 144/168 usb: ohci: Prevent missed ohci interrupts
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
commit fe81f354841641c7f71163b84912b25c169ed8ec upstream.
Testing ohci functionality with qemu's pci-ohci emulation often results in ohci interface stalls, resulting in hung task timeouts.
The problem is caused by lost interrupts between the emulation and the Linux kernel code. Additional interrupts raised while the ohci interrupt handler in Linux is running and before the handler clears the interrupt status are not handled. The fix for a similar problem in ehci suggests that the problem is likely caused by edge-triggered MSI interrupts. See commit 0b60557230ad ("usb: ehci: Prevent missed ehci interrupts with edge-triggered MSI") for details.
Ensure that the ohci interrupt code handles all pending interrupts before returning to solve the problem.
--- drivers/usb/host/ohci-hcd.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/usb/host/ohci-hcd.c +8 -0
@@ -890,6 +890,7 @@ static irqreturn_t ohci_irq (struct usb_/* Check for an all 1's result which is a typical consequence * of dead, unclocked, or unplugged (CardBus...) devices */ +again:if (ints == ~(u32 )0 ) { ohci->rh_state =OHCI_RH_HALTED ;ohci_dbg (ohci,"device removed!\n" );
@@ -984,6 +985,13 @@ static irqreturn_t ohci_irq (struct usb_ }spin_unlock (&ohci->lock); +/* repeat until all enabled interrupts are handled */ +if (ohci->rh_state !=OHCI_RH_HALTED ) { + ints =ohci_readl (ohci, ®s->intrstatus); +if (ints && (ints &ohci_readl (ohci, ®s->intrenable))) + goto again; + } +return IRQ_HANDLED ; }
Greg Kroah-Hartman
maintainerPATCH 145/168 usb: gadget: composite: fix OS descriptors w_value logic
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Korsgaard <[email protected]>
commit ec6ce7075ef879b91a8710829016005dc8170f17 upstream.
The OS descriptors logic had the high/low byte of w_value inverted, causing the extended properties to not be accessible for interface != 0.
Quoted 1 line
From the Microsoft documentation:
OS_Desc_CompatID.doc (w_index = 0x4):
- wValue:
High Byte = InterfaceNumber. InterfaceNumber is set to the number of the interface or function that is associated with the descriptor, typically 0x00. Because a device can have only one extended compat ID descriptor, it should ignore InterfaceNumber, regardless of the value, and simply return the descriptor.
Low Byte = 0. PageNumber is used to retrieve descriptors that are larger than 64 KB. The header section is 16 bytes, so PageNumber is set to 0 for this request.
We currently do not support >64KB compat ID descriptors, so verify that the low byte is 0.
OS_Desc_Ext_Prop.doc (w_index = 0x5):
- wValue:
High byte = InterfaceNumber. The high byte of wValue is set to the number of the interface or function that is associated with the descriptor.
Low byte = PageNumber. The low byte of wValue is used to retrieve descriptors that are larger than 64 KB. The header section is 10 bytes, so PageNumber is set to 0 for this request.
We also don't support >64KB extended properties, so verify that the low byte is 0 and use the high byte for the interface number.
--- drivers/usb/gadget/composite.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/usb/gadget/composite.c +3 -3
@@ -1978,7 +1978,7 @@ unknown: buf[5 ] =0x01 ;switch (ctrl->bRequestType &USB_RECIP_MASK ) {case USB_RECIP_DEVICE : -if (w_index !=0x4 || (w_value >>8 )) +if (w_index !=0x4 || (w_value &0xff ))break ; buf[6 ] = w_index;/* Number of ext compat interfaces */
@@ -1994,9 +1994,9 @@ unknown: }break ;case USB_RECIP_INTERFACE : -if (w_index !=0x5 || (w_value >>8 )) +if (w_index !=0x5 || (w_value &0xff ))break ; - interface = w_value &0xFF ; + interface = w_value >>8 ;if (interface >=MAX_CONFIG_INTERFACES || !os_desc_cfg->interface[interface])break ;
Greg Kroah-Hartman
maintainerPATCH 146/168 usb: gadget: f_fs: Fix a race condition when processing setup packets.
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Wulff <[email protected]>
commit 0aea736ddb877b93f6d2dd8cf439840d6b4970a9 upstream.
If the USB driver passes a pointer into the TRB buffer for creq, this buffer can be overwritten with the status response as soon as the event is queued. This can make the final check return USB_GADGET_DELAYED_STATUS when it shouldn't. Instead use the stored wLength.
--- drivers/usb/gadget/function/f_fs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/function/f_fs.c +1 -1
@@ -3414,7 +3414,7 @@ static int ffs_func_setup(struct usb_fun__ffs_event_add (ffs,FUNCTIONFS_SETUP );spin_unlock_irqrestore (&ffs->ev.waitq.lock, flags); -return creq->wLength ==0 ?USB_GADGET_DELAYED_STATUS :0 ; +return ffs->ev.setup.wLength ==0 ?USB_GADGET_DELAYED_STATUS :0 ; } static bool ffs_func_req_match(struct usb_function *f,
Greg Kroah-Hartman
maintainerPATCH 147/168 usb: xhci-plat: Dont include xhci.h
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thinh Nguyen <[email protected]>
commit 4a237d55446ff67655dc3eed2d4a41997536fc4c upstream.
The xhci_plat.h should not need to include the entire xhci.h header. This can cause redefinition in dwc3 if it selectively includes some xHCI definitions. This is a prerequisite change for a fix to disable suspend during initialization for dwc3.
--- drivers/usb/host/xhci-plat.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-plat.h +3 -1
@@ -8,7 +8,9 @@ #ifndef _XHCI_PLAT_H #define _XHCI_PLAT_H -#include "xhci.h" /* for hcd_to_xhci() */ +struct device; +struct platform_device; +struct usb_hcd; struct xhci_plat_priv { const char *firmware_name;
Greg Kroah-Hartman
maintainerPATCH 148/168 usb: dwc3: core: Prevent phy suspend during init
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thinh Nguyen <[email protected]>
commit 6d735722063a945de56472bdc6bfcb170fd43b86 upstream.
GUSB3PIPECTL.SUSPENDENABLE and GUSB2PHYCFG.SUSPHY should be cleared during initialization. Suspend during initialization can result in undefined behavior due to clock synchronization failure, which often seen as core soft reset timeout.
The programming guide recommended these bits to be cleared during initialization for DWC_usb3.0 version 1.94 and above (along with DWC_usb31 and DWC_usb32). The current check in the driver does not account if it's set by default setting from coreConsultant.
This is especially the case for DRD when switching mode to ensure the phy clocks are available to change mode. Depending on the platforms/design, some may be affected more than others. This is noted in the DWC_usb3x programming guide under the above registers.
Let's just disable them during driver load and mode switching. Restore them when the controller initialization completes.
Note that some platforms workaround this issue by disabling phy suspend through "snps,dis_u3_susphy_quirk" and "snps,dis_u2_susphy_quirk" when they should not need to.
--- drivers/usb/dwc3/core.c | 90 +++++++++++++++++++--------------------------- drivers/usb/dwc3/core.h | 1 drivers/usb/dwc3/gadget.c | 2 + drivers/usb/dwc3/host.c | 27 +++++++++++++ 4 files changed, 68 insertions(+), 52 deletions(-)
drivers/usb/dwc3/core.c +38 -52
@@ -102,6 +102,27 @@ static int dwc3_get_dr_mode(struct dwc3return 0 ; } +void dwc3_enable_susphy (struct dwc3 *dwc,bool enable) +{ +u32 reg; + + reg =dwc3_readl (dwc->regs,DWC3_GUSB3PIPECTL (0 )); +if (enable && !dwc->dis_u3_susphy_quirk) + reg |=DWC3_GUSB3PIPECTL_SUSPHY ; +else + reg &= ~DWC3_GUSB3PIPECTL_SUSPHY ; + +dwc3_writel (dwc->regs,DWC3_GUSB3PIPECTL (0 ), reg); + + reg =dwc3_readl (dwc->regs,DWC3_GUSB2PHYCFG (0 )); +if (enable && !dwc->dis_u2_susphy_quirk) + reg |=DWC3_GUSB2PHYCFG_SUSPHY ; +else + reg &= ~DWC3_GUSB2PHYCFG_SUSPHY ; + +dwc3_writel (dwc->regs,DWC3_GUSB2PHYCFG (0 ), reg); +} +void dwc3_set_prtcap (struct dwc3 *dwc,u32 mode) {u32 reg;
@@ -593,11 +614,8 @@ static int dwc3_core_ulpi_init(struct dw*/ static int dwc3_phy_setup (struct dwc3 *dwc) { -unsigned int hw_mode;u32 reg; - hw_mode =DWC3_GHWPARAMS0_MODE (dwc->hwparams.hwparams0); - reg =dwc3_readl (dwc->regs,DWC3_GUSB3PIPECTL (0 ));/*
@@ -607,21 +625,16 @@ static int dwc3_phy_setup(struct dwc3 *d reg &= ~DWC3_GUSB3PIPECTL_UX_EXIT_PX ;/* -* Above 1.94a, it is recommended to set DWC3_GUSB3PIPECTL_SUSPHY -* to '0' during coreConsultant configuration. So default value -* will be '0' when the core is reset. Application needs to set it -* to '1' after the core initialization is completed. +* Above DWC_usb3.0 1.94a, it is recommended to set +* DWC3_GUSB3PIPECTL_SUSPHY to '0' during coreConsultant configuration. +* So default value will be '0' when the core is reset. Application +* needs to set it to '1' after the core initialization is completed. +* +* Similarly for DRD controllers, GUSB3PIPECTL.SUSPENDENABLE must be +* cleared after power-on reset, and it can be set after core +* initialization. */ - if (!DWC3_VER_IS_WITHIN(DWC3, ANY, 194A)) - reg |=DWC3_GUSB3PIPECTL_SUSPHY ; - -/* -* For DRD controllers, GUSB3PIPECTL.SUSPENDENABLE must be cleared after -* power-on reset, and it can be set after core initialization, which is -* after device soft-reset during initialization. -*/ -if (hw_mode ==DWC3_GHWPARAMS0_MODE_DRD ) - reg &= ~DWC3_GUSB3PIPECTL_SUSPHY ; + reg &= ~DWC3_GUSB3PIPECTL_SUSPHY ;if (dwc->u2ss_inp3_quirk) reg |=DWC3_GUSB3PIPECTL_U2SSINP3OK ;
@@ -647,9 +660,6 @@ static int dwc3_phy_setup(struct dwc3 *dif (dwc->tx_de_emphasis_quirk) reg |=DWC3_GUSB3PIPECTL_TX_DEEPH (dwc->tx_de_emphasis); -if (dwc->dis_u3_susphy_quirk) - reg &= ~DWC3_GUSB3PIPECTL_SUSPHY ; -if (dwc->dis_del_phy_power_chg_quirk) reg &= ~DWC3_GUSB3PIPECTL_DEPOCHANGE ;
@@ -697,24 +707,15 @@ static int dwc3_phy_setup(struct dwc3 *d }/* -* Above 1.94a, it is recommended to set DWC3_GUSB2PHYCFG_SUSPHY to -* '0' during coreConsultant configuration. So default value will -* be '0' when the core is reset. Application needs to set it to -* '1' after the core initialization is completed. -*/ - if (!DWC3_VER_IS_WITHIN(DWC3, ANY, 194A)) - reg |=DWC3_GUSB2PHYCFG_SUSPHY ; - -/* -* For DRD controllers, GUSB2PHYCFG.SUSPHY must be cleared after -* power-on reset, and it can be set after core initialization, which is -* after device soft-reset during initialization. +* Above DWC_usb3.0 1.94a, it is recommended to set +* DWC3_GUSB2PHYCFG_SUSPHY to '0' during coreConsultant configuration. +* So default value will be '0' when the core is reset. Application +* needs to set it to '1' after the core initialization is completed. +* +* Similarly for DRD controllers, GUSB2PHYCFG.SUSPHY must be cleared +* after power-on reset, and it can be set after core initialization. */ -if (hw_mode ==DWC3_GHWPARAMS0_MODE_DRD ) - reg &= ~DWC3_GUSB2PHYCFG_SUSPHY ; - -if (dwc->dis_u2_susphy_quirk) - reg &= ~DWC3_GUSB2PHYCFG_SUSPHY ; + reg &= ~DWC3_GUSB2PHYCFG_SUSPHY ;if (dwc->dis_enblslpm_quirk) reg &= ~DWC3_GUSB2PHYCFG_ENBLSLPM ;
@@ -996,21 +997,6 @@ static int dwc3_core_init(struct dwc3 *dif (ret) goto err1; -if (hw_mode ==DWC3_GHWPARAMS0_MODE_DRD && - !DWC3_VER_IS_WITHIN(DWC3, ANY, 194A)) { -if (!dwc->dis_u3_susphy_quirk) { - reg =dwc3_readl (dwc->regs,DWC3_GUSB3PIPECTL (0 )); - reg |=DWC3_GUSB3PIPECTL_SUSPHY ; -dwc3_writel (dwc->regs,DWC3_GUSB3PIPECTL (0 ), reg); - } - -if (!dwc->dis_u2_susphy_quirk) { - reg =dwc3_readl (dwc->regs,DWC3_GUSB2PHYCFG (0 )); - reg |=DWC3_GUSB2PHYCFG_SUSPHY ; -dwc3_writel (dwc->regs,DWC3_GUSB2PHYCFG (0 ), reg); - } - } -dwc3_core_setup_global_control (dwc);dwc3_core_num_eps (dwc);
drivers/usb/dwc3/core.h +1 -0
@@ -1517,6 +1517,7 @@ int dwc3_event_buffers_setup(struct dwc3void dwc3_event_buffers_cleanup (struct dwc3 *dwc);int dwc3_core_soft_reset (struct dwc3 *dwc); +void dwc3_enable_susphy (struct dwc3 *dwc,bool enable);#if IS_ENABLED (CONFIG_USB_DWC3_HOST ) ||IS_ENABLED (CONFIG_USB_DWC3_DUAL_ROLE )int dwc3_host_init (struct dwc3 *dwc);
drivers/usb/dwc3/gadget.c +2 -0
@@ -2775,6 +2775,7 @@ static int __dwc3_gadget_start(struct dwdwc3_ep0_out_start (dwc);dwc3_gadget_enable_irq (dwc); +dwc3_enable_susphy (dwc, true);return 0 ;
@@ -4512,6 +4513,7 @@ void dwc3_gadget_exit(struct dwc3 *dwc)if (!dwc->gadget)return ; +dwc3_enable_susphy (dwc, false);usb_del_gadget (dwc->gadget);dwc3_gadget_free_endpoints (dwc);usb_put_gadget (dwc->gadget);
drivers/usb/dwc3/host.c +27 -0
@@ -9,9 +9,30 @@#include <linux/acpi.h> #include <linux/platform_device.h> +#include <linux/usb.h> +#include <linux/usb/hcd.h> +#include "../host/xhci-plat.h" #include "core.h" +static void dwc3_xhci_plat_start (struct usb_hcd *hcd) +{ +struct platform_device *pdev; +struct dwc3 *dwc; + +if (!usb_hcd_is_primary_hcd (hcd)) +return ; + + pdev =to_platform_device (hcd->self.controller); + dwc =dev_get_drvdata (pdev->dev.parent); + +dwc3_enable_susphy (dwc, true); +} + +static const struct xhci_plat_priv dwc3_xhci_plat_quirk = { + .plat_start = dwc3_xhci_plat_start, +}; +static int dwc3_host_get_irq (struct dwc3 *dwc) {struct platform_device *dwc3_pdev =to_platform_device (dwc->dev);
@@ -117,6 +138,11 @@ int dwc3_host_init(struct dwc3 *dwc) } } + ret =platform_device_add_data (xhci, &dwc3_xhci_plat_quirk, +sizeof (struct xhci_plat_priv )); +if (ret) + goto err; + ret =platform_device_add (xhci);if (ret) {dev_err (dwc->dev,"failed to register xHCI device\n" );
@@ -131,6 +157,7 @@ err:void dwc3_host_exit (struct dwc3 *dwc) { +dwc3_enable_susphy (dwc, false);platform_device_unregister (dwc->xhci); dwc->xhci =NULL ; }
Greg Kroah-Hartman
maintainerPATCH 149/168 ALSA: hda/realtek: Fix mute led of HP Laptop 15-da3001TU
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aman Dhoot <[email protected]>
commit 2d5af3ab9e6f1cf1468b2a5221b5c1f7f46c3333 upstream.
This patch simply add SND_PCI_QUIRK for HP Laptop 15-da3001TU to fixed mute led of laptop.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9131,6 +9131,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x860f ,"HP ZBook 15 G6" ,ALC285_FIXUP_HP_GPIO_AMP_INIT ),SND_PCI_QUIRK (0x103c ,0x861f ,"HP Elite Dragonfly G1" ,ALC285_FIXUP_HP_GPIO_AMP_INIT ),SND_PCI_QUIRK (0x103c ,0x869d ,"HP" ,ALC236_FIXUP_HP_MUTE_LED ), +SND_PCI_QUIRK (0x103c ,0x86c1 ,"HP Laptop 15-da3001TU" ,ALC236_FIXUP_HP_MUTE_LED_COEFBIT2 ),SND_PCI_QUIRK (0x103c ,0x86c7 ,"HP Envy AiO 32" ,ALC274_FIXUP_HP_ENVY_GPIO ),SND_PCI_QUIRK (0x103c ,0x86e7 ,"HP Spectre x360 15-eb0xxx" ,ALC285_FIXUP_HP_SPECTRE_X360_EB1 ), SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
Greg Kroah-Hartman
maintainerPATCH 150/168 btrfs: add missing mutex_unlock in btrfs_relocate_sys_chunks()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dominique Martinet <[email protected]>
commit 9af503d91298c3f2945e73703f0e00995be08c30 upstream.
The previous patch that replaced BUG_ON by error handling forgot to unlock the mutex in the error path.
--- fs/btrfs/volumes.c | 1 + 1 file changed, 1 insertion(+)
fs/btrfs/volumes.c +1 -0
@@ -3374,6 +3374,7 @@ again:* alignment and size). */ ret = -EUCLEAN ; +mutex_unlock (&fs_info->reclaim_bgs_lock); goto error; }
Greg Kroah-Hartman
maintainerPATCH 151/168 mptcp: ensure snd_nxt is properly initialized on connect
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit fb7a0d334894206ae35f023a82cad5a290fd7386 upstream.
Christoph reported a splat hinting at a corrupted snd_una:
WARNING: CPU: 1 PID: 38 at net/mptcp/protocol.c:1005 __mptcp_clean_una+0x4b3/0x620 net/mptcp/protocol.c:1005 Modules linked in: CPU: 1 PID: 38 Comm: kworker/1:1 Not tainted 6.9.0-rc1-gbbeac67456c9 #59 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.11.0-2.el7 04/01/2014 Workqueue: events mptcp_worker RIP: 0010:__mptcp_clean_una+0x4b3/0x620 net/mptcp/protocol.c:1005 Code: be 06 01 00 00 bf 06 01 00 00 e8 a8 12 e7 fe e9 00 fe ff ff e8 8e 1a e7 fe 0f b7 ab 3e 02 00 00 e9 d3 fd ff ff e8 7d 1a e7 fe <0f> 0b 4c 8b bb e0 05 00 00 e9 74 fc ff ff e8 6a 1a e7 fe 0f 0b e9 RSP: 0018:ffffc9000013fd48 EFLAGS: 00010293 RAX: 0000000000000000 RBX: ffff8881029bd280 RCX: ffffffff82382fe4 RDX: ffff8881003cbd00 RSI: ffffffff823833c3 RDI: 0000000000000001 RBP: 0000000000000000 R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000000 R11: fefefefefefefeff R12: ffff888138ba8000 R13: 0000000000000106 R14: ffff8881029bd908 R15: ffff888126560000 FS: 0000000000000000(0000) GS:ffff88813bd00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f604a5dae38 CR3: 0000000101dac002 CR4: 0000000000170ef0 Call Trace: <TASK> __mptcp_clean_una_wakeup net/mptcp/protocol.c:1055 [inline] mptcp_clean_una_wakeup net/mptcp/protocol.c:1062 [inline] __mptcp_retrans+0x7f/0x7e0 net/mptcp/protocol.c:2615 mptcp_worker+0x434/0x740 net/mptcp/protocol.c:2767 process_one_work+0x1e0/0x560 kernel/workqueue.c:3254 process_scheduled_works kernel/workqueue.c:3335 [inline] worker_thread+0x3c7/0x640 kernel/workqueue.c:3416 kthread+0x121/0x170 kernel/kthread.c:388 ret_from_fork+0x44/0x50 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:243 </TASK>
When fallback to TCP happens early on a client socket, snd_nxt is not yet initialized and any incoming ack will copy such value into snd_una. If the mptcp worker (dumbly) tries mptcp-level re-injection after such ack, that would unconditionally trigger a send buffer cleanup using 'bad' snd_una values.
We could easily disable re-injection for fallback sockets, but such dumb behavior already helped catching a few subtle issues and a very low to zero impact in practice.
Instead address the issue always initializing snd_nxt (and write_seq, for consistency) at connect time.
--- net/mptcp/protocol.c | 3 +++ 1 file changed, 3 insertions(+)
net/mptcp/protocol.c +3 -0
@@ -3395,6 +3395,9 @@ static int mptcp_stream_connect(struct sMPTCP_INC_STATS (sock_net (ssock->sk),MPTCP_MIB_TOKENFALLBACKINIT );mptcp_subflow_early_fallback (msk, subflow); } + +WRITE_ONCE (msk->write_seq, subflow->idsn); +WRITE_ONCE (msk->snd_nxt, subflow->idsn);if (likely (!__mptcp_check_fallback (msk)))MPTCP_INC_STATS (sock_net (sock->sk),MPTCP_MIB_MPCAPABLEACTIVE );
Greg Kroah-Hartman
maintainerPATCH 152/168 dt-bindings: iio: health: maxim,max30102: fix compatible check
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javier Carrasco <[email protected]>
commit 89384a2b656b9dace4c965432a209d5c9c3a2a6f upstream.
The "maxim,green-led-current-microamp" property is only available for the max30105 part (it provides an extra green LED), and must be set to false for the max30102 part.
Instead, the max30100 part has been used for that, which is not supported by this binding (it has its own binding).
This error was introduced during the txt to yaml conversion.
--- Documentation/devicetree/bindings/iio/health/maxim,max30102.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/devicetree/bindings/iio/health/maxim,max30102.yaml +1 -1
@@ -42,7 +42,7 @@ allOf: properties: compatible: contains: - const: maxim,max30100 + const: maxim,max30102 then: properties: maxim,green-led-current-microamp: false
Greg Kroah-Hartman
maintainerPATCH 153/168 iio:imu: adis16475: Fix sync mode setting
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ramona Gradinariu <[email protected]>
commit 74a72baf204fd509bbe8b53eec35e39869d94341 upstream.
Fix sync mode setting by applying the necessary shift bits.
--- drivers/iio/imu/adis16475.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/iio/imu/adis16475.c +3 -1
@@ -1145,6 +1145,7 @@ static int adis16475_config_sync_mode(ststruct device *dev = &st->adis.spi->dev;const struct adis16475_sync *sync;u32 sync_mode; +u16 val;/* default to internal clk */ st->clk_freq = st->info->int_clk *1000 ;
@@ -1214,8 +1215,9 @@ static int adis16475_config_sync_mode(st* I'm keeping this for simplicity and avoiding extra variables * in chip_info. */ + val =ADIS16475_SYNC_MODE (sync->sync_mode); ret =__adis_update_bits (&st->adis,ADIS16475_REG_MSG_CTRL , -ADIS16475_SYNC_MODE_MASK , sync->sync_mode); +ADIS16475_SYNC_MODE_MASK , val);if (ret)return ret;
Greg Kroah-Hartman
maintainerPATCH 154/168 iio: accel: mxc4005: Interrupt handling fixes
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 57a1592784d622ecee0b71940c65429173996b33 upstream.
There are 2 issues with interrupt handling in the mxc4005 driver:
1. mxc4005_set_trigger_state() writes MXC4005_REG_INT_MASK1_BIT_DRDYE (0x01) to INT_MASK1 to enable the interrupt, but to disable the interrupt it writes ~MXC4005_REG_INT_MASK1_BIT_DRDYE which is 0xfe, so it enables all other interrupt sources in the INT_SRC1 register. On the MXC4005 this is not an issue because only bit 0 of the register is used. On the MXC6655 OTOH this is a problem since bit7 is used as TC (Temperature Compensation) disable bit and writing 1 to this disables Temperature Compensation which should only be done when running self-tests on the chip.
Write 0 instead of ~MXC4005_REG_INT_MASK1_BIT_DRDYE to disable the interrupts to fix this.
2. The datasheets for the MXC4005 / MXC6655 do not state what the reset value for the INT_MASK0 and INT_MASK1 registers is and since these are write only we also cannot learn this from the hw. Presumably the reset value for both is all 0, which means all interrupts disabled.
Explicitly set both registers to 0 from mxc4005_chip_init() to ensure both masks are actually set to 0.
--- drivers/iio/accel/mxc4005.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-)
drivers/iio/accel/mxc4005.c +17 -7
@@ -27,9 +27,13 @@#define MXC4005_REG_ZOUT_UPPER 0x07#define MXC4005_REG_ZOUT_LOWER 0x08 +#define MXC4005_REG_INT_MASK0 0x0A +#define MXC4005_REG_INT_MASK1 0x0B#define MXC4005_REG_INT_MASK1_BIT_DRDYE 0x01 +#define MXC4005_REG_INT_CLR0 0x00 +#define MXC4005_REG_INT_CLR1 0x01#define MXC4005_REG_INT_CLR1_BIT_DRDYC 0x01
@@ -113,7 +117,9 @@ static bool mxc4005_is_readable_reg(strustatic bool mxc4005_is_writeable_reg (struct device *dev,unsigned int reg) {switch (reg) { +case MXC4005_REG_INT_CLR0 :case MXC4005_REG_INT_CLR1 : +case MXC4005_REG_INT_MASK0 :case MXC4005_REG_INT_MASK1 :case MXC4005_REG_CONTROL :return true;
@@ -330,17 +336,13 @@ static int mxc4005_set_trigger_state(str {struct iio_dev *indio_dev =iio_trigger_get_drvdata (trig);struct mxc4005_data *data =iio_priv (indio_dev); +unsigned int val;int ret;mutex_lock (&data->mutex); -if (state) { - ret =regmap_write (data->regmap,MXC4005_REG_INT_MASK1 , -MXC4005_REG_INT_MASK1_BIT_DRDYE ); - }else { - ret =regmap_write (data->regmap,MXC4005_REG_INT_MASK1 , - ~MXC4005_REG_INT_MASK1_BIT_DRDYE ); - } + val = state ?MXC4005_REG_INT_MASK1_BIT_DRDYE :0 ; + ret =regmap_write (data->regmap,MXC4005_REG_INT_MASK1 , val);if (ret <0 ) {mutex_unlock (&data->mutex);dev_err (data->dev,"failed to update reg_int_mask1" );
@@ -382,6 +384,14 @@ static int mxc4005_chip_init(struct mxc4dev_dbg (data->dev,"MXC4005 chip id %02x\n" , reg); + ret =regmap_write (data->regmap,MXC4005_REG_INT_MASK0 ,0 ); +if (ret <0 ) +return dev_err_probe (data->dev, ret,"writing INT_MASK0\n" ); + + ret =regmap_write (data->regmap,MXC4005_REG_INT_MASK1 ,0 ); +if (ret <0 ) +return dev_err_probe (data->dev, ret,"writing INT_MASK1\n" ); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 155/168 tipc: fix UAF in error path
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit 080cbb890286cd794f1ee788bbc5463e2deb7c2b upstream.
Sam Page (sam4k) working with Trend Micro Zero Day Initiative reported a UAF in the tipc_buf_append() error path:
BUG: KASAN: slab-use-after-free in kfree_skb_list_reason+0x47e/0x4c0 linux/net/core/skbuff.c:1183 Read of size 8 at addr ffff88804d2a7c80 by task poc/8034 CPU: 1 PID: 8034 Comm: poc Not tainted 6.8.2 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.0-debian-1.16.0-5 04/01/2014 Call Trace: <IRQ> __dump_stack linux/lib/dump_stack.c:88 dump_stack_lvl+0xd9/0x1b0 linux/lib/dump_stack.c:106 print_address_description linux/mm/kasan/report.c:377 print_report+0xc4/0x620 linux/mm/kasan/report.c:488 kasan_report+0xda/0x110 linux/mm/kasan/report.c:601 kfree_skb_list_reason+0x47e/0x4c0 linux/net/core/skbuff.c:1183 skb_release_data+0x5af/0x880 linux/net/core/skbuff.c:1026 skb_release_all linux/net/core/skbuff.c:1094 __kfree_skb linux/net/core/skbuff.c:1108 kfree_skb_reason+0x12d/0x210 linux/net/core/skbuff.c:1144 kfree_skb linux/./include/linux/skbuff.h:1244 tipc_buf_append+0x425/0xb50 linux/net/tipc/msg.c:186 tipc_link_input+0x224/0x7c0 linux/net/tipc/link.c:1324 tipc_link_rcv+0x76e/0x2d70 linux/net/tipc/link.c:1824 tipc_rcv+0x45f/0x10f0 linux/net/tipc/node.c:2159 tipc_udp_recv+0x73b/0x8f0 linux/net/tipc/udp_media.c:390 udp_queue_rcv_one_skb+0xad2/0x1850 linux/net/ipv4/udp.c:2108 udp_queue_rcv_skb+0x131/0xb00 linux/net/ipv4/udp.c:2186 udp_unicast_rcv_skb+0x165/0x3b0 linux/net/ipv4/udp.c:2346 __udp4_lib_rcv+0x2594/0x3400 linux/net/ipv4/udp.c:2422 ip_protocol_deliver_rcu+0x30c/0x4e0 linux/net/ipv4/ip_input.c:205 ip_local_deliver_finish+0x2e4/0x520 linux/net/ipv4/ip_input.c:233 NF_HOOK linux/./include/linux/netfilter.h:314 NF_HOOK linux/./include/linux/netfilter.h:308 ip_local_deliver+0x18e/0x1f0 linux/net/ipv4/ip_input.c:254 dst_input linux/./include/net/dst.h:461 ip_rcv_finish linux/net/ipv4/ip_input.c:449 NF_HOOK linux/./include/linux/netfilter.h:314 NF_HOOK linux/./include/linux/netfilter.h:308 ip_rcv+0x2c5/0x5d0 linux/net/ipv4/ip_input.c:569 __netif_receive_skb_one_core+0x199/0x1e0 linux/net/core/dev.c:5534 __netif_receive_skb+0x1f/0x1c0 linux/net/core/dev.c:5648 process_backlog+0x101/0x6b0 linux/net/core/dev.c:5976 __napi_poll.constprop.0+0xba/0x550 linux/net/core/dev.c:6576 napi_poll linux/net/core/dev.c:6645 net_rx_action+0x95a/0xe90 linux/net/core/dev.c:6781 __do_softirq+0x21f/0x8e7 linux/kernel/softirq.c:553 do_softirq linux/kernel/softirq.c:454 do_softirq+0xb2/0xf0 linux/kernel/softirq.c:441 </IRQ> <TASK> __local_bh_enable_ip+0x100/0x120 linux/kernel/softirq.c:381 local_bh_enable linux/./include/linux/bottom_half.h:33 rcu_read_unlock_bh linux/./include/linux/rcupdate.h:851 __dev_queue_xmit+0x871/0x3ee0 linux/net/core/dev.c:4378 dev_queue_xmit linux/./include/linux/netdevice.h:3169 neigh_hh_output linux/./include/net/neighbour.h:526 neigh_output linux/./include/net/neighbour.h:540 ip_finish_output2+0x169f/0x2550 linux/net/ipv4/ip_output.c:235 __ip_finish_output linux/net/ipv4/ip_output.c:313 __ip_finish_output+0x49e/0x950 linux/net/ipv4/ip_output.c:295 ip_finish_output+0x31/0x310 linux/net/ipv4/ip_output.c:323 NF_HOOK_COND linux/./include/linux/netfilter.h:303 ip_output+0x13b/0x2a0 linux/net/ipv4/ip_output.c:433 dst_output linux/./include/net/dst.h:451 ip_local_out linux/net/ipv4/ip_output.c:129 ip_send_skb+0x3e5/0x560 linux/net/ipv4/ip_output.c:1492 udp_send_skb+0x73f/0x1530 linux/net/ipv4/udp.c:963 udp_sendmsg+0x1a36/0x2b40 linux/net/ipv4/udp.c:1250 inet_sendmsg+0x105/0x140 linux/net/ipv4/af_inet.c:850 sock_sendmsg_nosec linux/net/socket.c:730 __sock_sendmsg linux/net/socket.c:745 __sys_sendto+0x42c/0x4e0 linux/net/socket.c:2191 __do_sys_sendto linux/net/socket.c:2203 __se_sys_sendto linux/net/socket.c:2199 __x64_sys_sendto+0xe0/0x1c0 linux/net/socket.c:2199 do_syscall_x64 linux/arch/x86/entry/common.c:52 do_syscall_64+0xd8/0x270 linux/arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x6f/0x77 linux/arch/x86/entry/entry_64.S:120 RIP: 0033:0x7f3434974f29 Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48
89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 37 8f 0d 00 f7 d8 64 89 01 48
RSP: 002b:00007fff9154f2b8 EFLAGS: 00000212 ORIG_RAX: 000000000000002c
RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f3434974f29
RDX: 00000000000032c8 RSI: 00007fff9154f300 RDI: 0000000000000003
RBP: 00007fff915532e0 R08: 00007fff91553360 R09: 0000000000000010
R10: 0000000000000000 R11: 0000000000000212 R12: 000055ed86d261d0
R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
</TASK>
In the critical scenario, either the relevant skb is freed or its ownership is transferred into a frag_lists. In both cases, the cleanup code must not free it again: we need to clear the skb reference earlier.
--- net/tipc/msg.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/tipc/msg.c +5 -1
@@ -156,6 +156,11 @@ int tipc_buf_append(struct sk_buff **heaif (!head) goto err; +/* Either the input skb ownership is transferred to headskb +* or the input skb is freed, clear the reference to avoid +* bad access on error path. +*/ + *buf =NULL ;if (skb_try_coalesce (head, frag, &headstolen, &delta)) {kfree_skb_partial (frag, headstolen); }else {
@@ -179,7 +184,6 @@ int tipc_buf_append(struct sk_buff **hea *headbuf =NULL ;return 1 ; } - *buf =NULL ;return 0 ; err:kfree_skb (*buf);
Greg Kroah-Hartman
maintainerPATCH 156/168 net: bcmgenet: synchronize use of bcmgenet_set_rx_mode()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Doug Berger <[email protected]>
commit 2dbe5f19368caae63b1f59f5bc2af78c7d522b3a upstream.
The ndo_set_rx_mode function is synchronized with the netif_addr_lock spinlock and BHs disabled. Since this function is also invoked directly from the driver the same synchronization should be applied.
--- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/genet/bcmgenet.c +3 -1
@@ -2,7 +2,7 @@/* * Broadcom GENET (Gigabit Ethernet) controller driver * -* Copyright (c) 2014-2020 Broadcom +* Copyright (c) 2014-2024 Broadcom */ #define pr_fmt (fmt) "bcmgenet: " fmt
@@ -3310,7 +3310,9 @@ static void bcmgenet_netif_start(structstruct bcmgenet_priv *priv =netdev_priv (dev);/* Start the network engine */ +netif_addr_lock_bh (dev);bcmgenet_set_rx_mode (dev); +netif_addr_unlock_bh (dev);bcmgenet_enable_rx_napi (priv);umac_enable_set (priv,CMD_TX_EN |CMD_RX_EN , true);
Greg Kroah-Hartman
maintainerPATCH 157/168 ASoC: tegra: Fix DSPK 16-bit playback
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sameer Pujar <[email protected]>
commit 2e93a29b48a017c777d4fcbfcc51aba4e6a90d38 upstream.
DSPK configuration is wrong for 16-bit playback and this happens because the client config is always fixed at 24-bit in hw_params(). Fix this by updating the client config to 16-bit for the respective playback.
--- sound/soc/tegra/tegra186_dspk.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
sound/soc/tegra/tegra186_dspk.c +3 -4
@@ -1,8 +1,7 @@// SPDX-License-Identifier: GPL-2.0-only +// SPDX-FileCopyrightText: Copyright (c) 2020-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // // tegra186_dspk.c - Tegra186 DSPK driver -// -// Copyright (c) 2020 NVIDIA CORPORATION. All rights reserved. #include <linux/clk.h> #include <linux/device.h>
@@ -241,14 +240,14 @@ static int tegra186_dspk_hw_params(strucreturn -EINVAL ; } - cif_conf.client_bits =TEGRA_ACIF_BITS_24 ; -switch (params_format (params)) {case SNDRV_PCM_FORMAT_S16_LE : cif_conf.audio_bits =TEGRA_ACIF_BITS_16 ; + cif_conf.client_bits =TEGRA_ACIF_BITS_16 ;break ;case SNDRV_PCM_FORMAT_S32_LE : cif_conf.audio_bits =TEGRA_ACIF_BITS_32 ; + cif_conf.client_bits =TEGRA_ACIF_BITS_24 ;break ;default :dev_err (dev,"unsupported format!\n" );
Greg Kroah-Hartman
maintainerPATCH 158/168 ASoC: ti: davinci-mcasp: Fix race condition during probe
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joao Paulo Goncalves <[email protected]>
commit d18ca8635db2f88c17acbdf6412f26d4f6aff414 upstream.
When using davinci-mcasp as CPU DAI with simple-card, there are some conditions that cause simple-card to finish registering a sound card before davinci-mcasp finishes registering all sound components. This creates a non-working sound card from userspace with no problem indication apart from not being able to play/record audio on a PCM stream. The issue arises during simultaneous probe execution of both drivers. Specifically, the simple-card driver, awaiting a CPU DAI, proceeds as soon as davinci-mcasp registers its DAI. However, this process can lead to the client mutex lock (client_mutex in soc-core.c) being held or davinci-mcasp being preempted before PCM DMA registration on davinci-mcasp finishes. This situation occurs when the probes of both drivers run concurrently. Below is the code path for this condition. To solve the issue, defer davinci-mcasp CPU DAI registration to the last step in the audio part of it. This way, simple-card CPU DAI parsing will be deferred until all audio components are registered.
Fail Code Path:
simple-card.c: probe startssimple-card.c: simple_dai_link_of: simple_parse_node(..,cpu,..) returns EPROBE_DEFER, no CPU DAI yet davinci-mcasp.c: probe startsdavinci-mcasp.c: devm_snd_soc_register_component() register CPU DAIsimple-card.c: probes again, finish CPU DAI parsing and call devm_snd_soc_register_card() simple-card.c: finish probedavinci-mcasp.c: *dma_pcm_platform_register() register PCM DMAdavinci-mcasp.c: probe finish
--- sound/soc/ti/davinci-mcasp.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
sound/soc/ti/davinci-mcasp.c +6 -6
@@ -2423,12 +2423,6 @@ static int davinci_mcasp_probe(struct plmcasp_reparent_fck (pdev); - ret =devm_snd_soc_register_component (&pdev->dev, &davinci_mcasp_component, - &davinci_mcasp_dai[mcasp->op_mode],1 ); - -if (ret !=0 ) - goto err; - ret =davinci_mcasp_get_dma_type (mcasp);switch (ret) {case PCM_EDMA :
@@ -2455,6 +2449,12 @@ static int davinci_mcasp_probe(struct pl goto err; } + ret =devm_snd_soc_register_component (&pdev->dev, &davinci_mcasp_component, + &davinci_mcasp_dai[mcasp->op_mode],1 ); + +if (ret !=0 ) + goto err; + no_audio: ret =davinci_mcasp_init_gpiochip (mcasp);if (ret) {
Greg Kroah-Hartman
maintainerPATCH 159/168 dyndbg: fix old BUG_ON in >control parser
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jim Cromie <[email protected]>
commit 00e7d3bea2ce7dac7bee1cf501fb071fd0ea8f6c upstream.
Fix a BUG_ON from 2009. Even if it looks "unreachable" (I didn't really look), lets make sure by removing it, doing pr_err and return -EINVAL instead.
--- lib/dynamic_debug.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
lib/dynamic_debug.c +5 -1
@@ -260,7 +260,11 @@ static int ddebug_tokenize(char *buf, ch }else {for (end = buf; *end && !isspace (*end); end++) ; -BUG_ON (end == buf); +if (end == buf) { +pr_err ("parse err after word:%d=%s\n" , nwords, + nwords ? words[nwords -1 ] :"<none>" ); +return -EINVAL ; + } }/* `buf' is start of word, `end' is one past its end */
Greg Kroah-Hartman
maintainerPATCH 160/168 slimbus: qcom-ngd-ctrl: Add timeout for wait operation
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viken Dadhaniya <[email protected]>
commit 98241a774db49988f25b7b3657026ce51ccec293 upstream.
In current driver qcom_slim_ngd_up_worker() indefinitely waiting for ctrl->qmi_up completion object. This is resulting in workqueue lockup on Kthread.
Added wait_for_completion_interruptible_timeout to allow the thread to wait for specific timeout period and bail out instead waiting infinitely.
--- drivers/slimbus/qcom-ngd-ctrl.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/slimbus/qcom-ngd-ctrl.c +5 -1
@@ -1376,7 +1376,11 @@ static void qcom_slim_ngd_up_worker(stru ctrl = container_of(work, struct qcom_slim_ngd_ctrl, ngd_up_work);/* Make sure qmi service is up before continuing */ -wait_for_completion_interruptible (&ctrl->qmi_up); +if (!wait_for_completion_interruptible_timeout (&ctrl->qmi_up, +msecs_to_jiffies (MSEC_PER_SEC ))) { +dev_err (ctrl->dev,"QMI wait timeout\n" ); +return ; + }mutex_lock (&ctrl->ssr_lock);qcom_slim_ngd_enable (ctrl, true);
Greg Kroah-Hartman
maintainerPATCH 161/168 mei: me: add lunar lake point M DID
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Usyskin <[email protected]>
commit 4108a30f1097eead0f6bd5d885e6bf093b4d460f upstream.
Add Lunar (Point) Lake M device id.
--- drivers/misc/mei/hw-me-regs.h | 2 ++ drivers/misc/mei/pci-me.c | 2 ++ 2 files changed, 4 insertions(+)
drivers/misc/mei/hw-me-regs.h +2 -0
@@ -115,6 +115,8 @@#define MEI_DEV_ID_ARL_S 0x7F68/* Arrow Lake Point S */ #define MEI_DEV_ID_ARL_H 0x7770/* Arrow Lake Point H */ +#define MEI_DEV_ID_LNL_M 0xA870/* Lunar Lake Point M */ +/* * MEI HW Section */
drivers/misc/mei/pci-me.c +2 -0
@@ -121,6 +121,8 @@ static const struct pci_device_id mei_me {MEI_PCI_DEVICE(MEI_DEV_ID_ARL_S, MEI_ME_PCH15_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ARL_H, MEI_ME_PCH15_CFG)}, + {MEI_PCI_DEVICE(MEI_DEV_ID_LNL_M, MEI_ME_PCH15_CFG)}, +/* required last entry */ {0, } };
Greg Kroah-Hartman
maintainerPATCH 162/168 drm/vmwgfx: Fix invalid reads in fence signaled events
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zack Rusin <[email protected]>
commit a37ef7613c00f2d72c8fc08bd83fb6cc76926c8c upstream.
Correctly set the length of the drm_event to the size of the structure that's actually used.
The length of the drm_event was set to the parent structure instead of to the drm_vmw_event_fence which is supposed to be read. drm_read uses the length parameter to copy the event to the user space thus resuling in oob reads.
--- drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/vmwgfx/vmwgfx_fence.c +1 -1
@@ -1068,7 +1068,7 @@ static int vmw_event_fence_action_create } event->event.base.type =DRM_VMW_EVENT_FENCE_SIGNALED ; - event->event.base.length =sizeof (*event); + event->event.base.length =sizeof (event->event); event->event.user_data = user_data; ret =drm_event_reserve_init (dev, file_priv, &event->base, &event->event.base);
Greg Kroah-Hartman
maintainerPATCH 163/168 net: fix out-of-bounds access in ops_init
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thadeu Lima de Souza Cascardo <[email protected]>
commit a26ff37e624d12e28077e5b24d2b264f62764ad6 upstream.
net_alloc_generic is called by net_alloc, which is called without any locking. It reads max_gen_ptrs, which is changed under pernet_ops_rwsem. It is read twice, first to allocate an array, then to set s.len, which is later used to limit the bounds of the array access.
It is possible that the array is allocated and another thread is registering a new pernet ops, increments max_gen_ptrs, which is then used to set s.len with a larger than allocated length for the variable array.
Fix it by reading max_gen_ptrs only once in net_alloc_generic. If max_gen_ptrs is later incremented, it will be caught in net_assign_generic.
--- net/core/net_namespace.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
net/core/net_namespace.c +10 -3
@@ -68,12 +68,15 @@ DEFINE_COOKIE(net_cookie);static struct net_generic *net_alloc_generic (void ) { +unsigned int gen_ptrs =READ_ONCE (max_gen_ptrs); +unsigned int generic_size;struct net_generic *ng; - unsigned int generic_size = offsetof(struct net_generic, ptr[max_gen_ptrs]); + + generic_size = offsetof(struct net_generic, ptr[gen_ptrs]); ng =kzalloc (generic_size,GFP_KERNEL );if (ng) - ng->s.len = max_gen_ptrs; + ng->s.len = gen_ptrs;return ng; }
@@ -1211,7 +1214,11 @@ static int register_pernet_operations(stif (error <0 )return error; *ops->id = error; - max_gen_ptrs =max (max_gen_ptrs, *ops->id +1 ); +/* This does not require READ_ONCE as writers already hold +* pernet_ops_rwsem. But WRITE_ONCE is needed to protect +* net_alloc_generic. +*/ +WRITE_ONCE (max_gen_ptrs,max (max_gen_ptrs, *ops->id +1 )); } error =__register_pernet_operations (list, ops);if (error) {
Greg Kroah-Hartman
maintainerPATCH 164/168 hwmon: (pmbus/ucd9000) Increase delay from 250 to 500us
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lakshmi Yadlapati <[email protected]>
commit 26e8383b116d0dbe74e28f86646563ab46d66d83 upstream.
Following the failure observed with a delay of 250us, experiments were conducted with various delays. It was found that a delay of 350us effectively mitigated the issue.
To provide a more optimal solution while still allowing a margin for stability, the delay is being adjusted to 500us.
--- drivers/hwmon/pmbus/ucd9000.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/hwmon/pmbus/ucd9000.c +3 -3
@@ -80,11 +80,11 @@ struct ucd9000_debugfs_entry {* It has been observed that the UCD90320 randomly fails register access when * doing another access right on the back of a register write. To mitigate this * make sure that there is a minimum delay between a write access and the -* following access. The 250us is based on experimental data. At a delay of -* 200us the issue seems to go away. Add a bit of extra margin to allow for +* following access. The 500 is based on experimental data. At a delay of +* 350us the issue seems to go away. Add a bit of extra margin to allow for * system to system differences. */ -#define UCD90320_WAIT_DELAY_US 250 +#define UCD90320_WAIT_DELAY_US 500static inline void ucd90320_wait (const struct ucd9000_data *data) {
Greg Kroah-Hartman
maintainerPATCH 165/168 regulator: core: fix debugfs creation regression
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 2a4b49bb58123bad6ec0e07b02845f74c23d5e04 upstream.
regulator_get() may sometimes be called more than once for the same consumer device, something which before commit dbe954d8f163 ("regulator:
core: Avoid debugfs: Directory ... already present! error") resulted in errors being logged.
A couple of recent commits broke the handling of such cases so that attributes are now erroneously created in the debugfs root directory the second time a regulator is requested and the log is filled with errors like:
debugfs: File 'uA_load' in directory '/' already present!
debugfs: File 'min_uV' in directory '/' already present!
debugfs: File 'max_uV' in directory '/' already present!
debugfs: File 'constraint_flags' in directory '/' already present!
on any further calls.
--- drivers/regulator/core.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-)
drivers/regulator/core.c +16 -11
@@ -1872,19 +1872,24 @@ static struct regulator *create_regulato } } -if (err != -EEXIST ) +if (err != -EEXIST ) { regulator->debugfs =debugfs_create_dir (supply_name, rdev->debugfs); -if (IS_ERR (regulator->debugfs)) -rdev_dbg (rdev,"Failed to create debugfs directory\n" ); +if (IS_ERR (regulator->debugfs)) { +rdev_dbg (rdev,"Failed to create debugfs directory\n" ); + regulator->debugfs =NULL ; + } + } -debugfs_create_u32 ("uA_load" ,0444 , regulator->debugfs, - ®ulator->uA_load); -debugfs_create_u32 ("min_uV" ,0444 , regulator->debugfs, - ®ulator->voltage[PM_SUSPEND_ON ].min_uV); -debugfs_create_u32 ("max_uV" ,0444 , regulator->debugfs, - ®ulator->voltage[PM_SUSPEND_ON ].max_uV); -debugfs_create_file ("constraint_flags" ,0444 , regulator->debugfs, - regulator, &constraint_flags_fops); +if (regulator->debugfs) { +debugfs_create_u32 ("uA_load" ,0444 , regulator->debugfs, + ®ulator->uA_load); +debugfs_create_u32 ("min_uV" ,0444 , regulator->debugfs, + ®ulator->voltage[PM_SUSPEND_ON ].min_uV); +debugfs_create_u32 ("max_uV" ,0444 , regulator->debugfs, + ®ulator->voltage[PM_SUSPEND_ON ].max_uV); +debugfs_create_file ("constraint_flags" ,0444 , regulator->debugfs, + regulator, &constraint_flags_fops); + }/* * Check now if the regulator is an always on regulator - if
Greg Kroah-Hartman
maintainerPATCH 166/168 Bluetooth: qca: add missing firmware sanity checks
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 2e4edfa1e2bd821a317e7d006517dcf2f3fac68d upstream.
Add the missing sanity checks when parsing the firmware files before downloading them to avoid accessing and corrupting memory beyond the vmalloced buffer.
--- drivers/bluetooth/btqca.c | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-)
drivers/bluetooth/btqca.c +32 -6
@@ -182,9 +182,10 @@ int qca_send_pre_shutdown_cmd(struct hci }EXPORT_SYMBOL_GPL (qca_send_pre_shutdown_cmd); -static void qca_tlv_check_data (struct hci_dev *hdev, +static int qca_tlv_check_data (struct hci_dev *hdev,struct qca_fw_config *config, -u8 *fw_data,enum qca_btsoc_type soc_type) +u8 *fw_data,size_t fw_size, +enum qca_btsoc_type soc_type) {const u8 *data;u32 type_len;
@@ -200,6 +201,9 @@ static void qca_tlv_check_data(struct hcswitch (config->type) {case ELF_TYPE_PATCH : +if (fw_size <7 ) +return -EINVAL ; + config->dnld_mode =QCA_SKIP_EVT_VSE_CC ; config->dnld_type =QCA_SKIP_EVT_VSE_CC ;
@@ -208,6 +212,9 @@ static void qca_tlv_check_data(struct hcbt_dev_dbg (hdev,"File version : 0x%x" , fw_data[6 ]);break ;case TLV_TYPE_PATCH : +if (fw_size <sizeof (struct tlv_type_hdr ) +sizeof (struct tlv_type_patch )) +return -EINVAL ; + tlv = (struct tlv_type_hdr *)fw_data; type_len =le32_to_cpu (tlv->type_len); tlv_patch = (struct tlv_type_patch *)tlv->data;
@@ -247,6 +254,9 @@ static void qca_tlv_check_data(struct hcbreak ;case TLV_TYPE_NVM : +if (fw_size <sizeof (struct tlv_type_hdr )) +return -EINVAL ; + tlv = (struct tlv_type_hdr *)fw_data; type_len =le32_to_cpu (tlv->type_len);
@@ -255,17 +265,26 @@ static void qca_tlv_check_data(struct hcBT_DBG ("TLV Type\t\t : 0x%x" , type_len &0x000000ff );BT_DBG ("Length\t\t : %d bytes" , length); +if (fw_size < length + (tlv->data - fw_data)) +return -EINVAL ; + idx =0 ; data = tlv->data; -while (idx < length) { +while (idx < length -sizeof (struct tlv_type_nvm )) { tlv_nvm = (struct tlv_type_nvm *)(data + idx); tag_id =le16_to_cpu (tlv_nvm->tag_id); tag_len =le16_to_cpu (tlv_nvm->tag_len); +if (length < idx +sizeof (struct tlv_type_nvm ) + tag_len) +return -EINVAL ; +/* Update NVM tags as needed */ switch (tag_id) {case EDL_TAG_ID_HCI : +if (tag_len <3 ) +return -EINVAL ; +/* HCI transport layer parameters * enabling software inband sleep * onto controller side.
@@ -281,6 +300,9 @@ static void qca_tlv_check_data(struct hcbreak ;case EDL_TAG_ID_DEEP_SLEEP : +if (tag_len <1 ) +return -EINVAL ; +/* Sleep enable mask * enabling deep sleep feature on controller. */
@@ -289,14 +311,16 @@ static void qca_tlv_check_data(struct hcbreak ; } - idx += (sizeof (u16) +sizeof (u16) +8 + tag_len); + idx +=sizeof (struct tlv_type_nvm ) + tag_len; }break ;default :BT_ERR ("Unknown TLV type %d" , config->type); -break ; +return -EINVAL ; } + +return 0 ; } static int qca_tlv_send_segment(struct hci_dev *hdev, int seg_size,
@@ -446,7 +470,9 @@ static int qca_download_firmware(structmemcpy (data, fw->data, size);release_firmware (fw); -qca_tlv_check_data (hdev, config, data, soc_type); + ret =qca_tlv_check_data (hdev, config, data, size, soc_type); +if (ret) +return ret; segment = data; remain = size;
Greg Kroah-Hartman
maintainerPATCH 167/168 Bluetooth: qca: fix NVM configuration parsing
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit a112d3c72a227f2edbb6d8094472cc6e503e52af upstream.
The NVM configuration files used by WCN3988 and WCN3990/1/8 have two sets of configuration tags that are enclosed by a type-length header of type four which the current parser fails to account for.
Instead the driver happily parses random data as if it were valid tags, something which can lead to the configuration data being corrupted if it ever encounters the words 0x0011 or 0x001b.
As is clear from commit b63882549b2b ("Bluetooth: btqca: Fix the NVM baudrate tag offcet for wcn3991") the intention has always been to process the configuration data also for WCN3991 and WCN3998 which encodes the baud rate at a different offset.
Fix the parser so that it can handle the WCN3xxx configuration files, which has an enclosing type-length header of type four and two sets of TLV tags enclosed by a type-length header of type two and three, respectively.
Note that only the first set, which contains the tags the driver is currently looking for, will be parsed for now.
With the parser fixed, the software in-band sleep bit will now be set for WCN3991 and WCN3998 (as it is for later controllers) and the default baud rate 3200000 may be updated by the driver also for WCN3xxx controllers.
Notably the deep-sleep feature bit is already set by default in all configuration files in linux-firmware.
--- drivers/bluetooth/btqca.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-)
drivers/bluetooth/btqca.c +22 -2
@@ -195,6 +195,7 @@ static int qca_tlv_check_data(struct hcistruct tlv_type_patch *tlv_patch;struct tlv_type_nvm *tlv_nvm;uint8_t nvm_baud_rate = config->user_baud_rate; +u8 type; config->dnld_mode =QCA_SKIP_EVT_NONE ; config->dnld_type =QCA_SKIP_EVT_NONE ;
@@ -260,11 +261,30 @@ static int qca_tlv_check_data(struct hci tlv = (struct tlv_type_hdr *)fw_data; type_len =le32_to_cpu (tlv->type_len); - length = (type_len >>8 ) &0x00ffffff ; + length = type_len >>8 ; + type = type_len &0xff ; -BT_DBG ("TLV Type\t\t : 0x%x" , type_len &0x000000ff ); +/* Some NVM files have more than one set of tags, only parse +* the first set when it has type 2 for now. When there is +* more than one set there is an enclosing header of type 4. +*/ +if (type ==4 ) { +if (fw_size <2 *sizeof (struct tlv_type_hdr )) +return -EINVAL ; + + tlv++; + + type_len =le32_to_cpu (tlv->type_len); + length = type_len >>8 ; + type = type_len &0xff ; + } + +BT_DBG ("TLV Type\t\t : 0x%x" , type);BT_DBG ("Length\t\t : %d bytes" , length); +if (type !=2 ) +break ; +if (fw_size < length + (tlv->data - fw_data))return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 168/168 Bluetooth: qca: fix firmware check error path
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 40d442f969fb1e871da6fca73d3f8aef1f888558 upstream.
A recent commit fixed the code that parses the firmware files before downloading them to the controller but introduced a memory leak in case the sanity checks ever fail.
Make sure to free the firmware buffer before returning on errors.
--- drivers/bluetooth/btqca.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/bluetooth/btqca.c +1 -1
@@ -492,7 +492,7 @@ static int qca_download_firmware(struct ret =qca_tlv_check_data (hdev, config, data, size, soc_type);if (ret) -return ret; + goto out; segment = data; remain = size;
Hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.159 release. There are 168 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 16 May 2024 10:09:32 +0000. Anything received after that time might be too late.
No problems seen on x86_64 and aarch64 with our testing.
Note: selftests have a build problem in 5.15.y, 5.10.y, 5.4.y, 4.19.y
5.15.y revert: https://lore.kernel.org/all/[email protected]/
This is not a regression in this tag but from somewhere around 5.15.152 tag.
Reverts for other stable releases:
5.10.y: https://lore.kernel.org/all/[email protected]/
5.4.y: https://lore.kernel.org/all/[email protected]/
4.19.y: https://lore.kernel.org/all/[email protected]/
Could you please queue these up for future releases.
Thanks,
Harshit
Quoted 10 lines
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.159-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Build failure on arm:
In file included from drivers/iommu/mtk_iommu_v1.c:22:drivers/iommu/mtk_iommu_v1.c:579:25: error: 'mtk_iommu_v1_of_ids' undeclared here (not in a function); did you mean 'mtk_iommu_of_ids'?
579 | MODULE_DEVICE_TABLE(of, mtk_iommu_v1_of_ids);
| ^~~~~~~~~~~~~~~~~~~
./include/linux/module.h:244:15: note: in definition of macro
'MODULE_DEVICE_TABLE'
244 | extern typeof(name) __mod_##type##__##name##_device_table
\
| ^~~~./include/linux/module.h:244:21: error:
'__mod_of__mtk_iommu_v1_of_ids_device_table' aliased to undefined symbol 'mtk_iommu_v1_of_ids'
244 | extern typeof(name) __mod_##type##__##name##_device_table
\
| ^~~~~~
drivers/iommu/mtk_iommu_v1.c:579:1: note: in expansion of macro
'MODULE_DEVICE_TABLE'
579 | MODULE_DEVICE_TABLE(of, mtk_iommu_v1_of_ids);
| ^~~~~~~~~~~~~~~~~~~make[2]: *** [scripts/Makefile.build:289: drivers/iommu/mtk_iommu_v1.o] Error 1 make[1]: *** [scripts/Makefile.build:552: drivers/iommu] Error 2
This is from patch:
bce893a92324 [email protected] 2024-05-14 iommu: mtk: fix
module autoloading
+MODULE_DEVICE_TABLE(of, mtk_iommu_v1_of_ids);
should be, I think:
+MODULE_DEVICE_TABLE(of, mtk_iommu_of_ids);
Quoted 48 lines · Harshit Mogalapalli
Hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.159 release. There are 168 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 16 May 2024 10:09:32 +0000. Anything received after that time might be too late.
No problems seen on
x86_64and aarch64 with our testing.Tested-by Harshit Mogalapalli <[email protected]>Note: selftests have a build problem in 5.15.y, 5.10.y, 5.4.y, 4.19.y
5.15.y revert:
https://lore.kernel.org/all/[email protected]/This is not a regression in this tag but from somewhere around 5.15.152 tag.
Reverts for other stable releases:
5.10.y:
https://lore.kernel.org/all/[email protected]/
5.4.y:
https://lore.kernel.org/all/[email protected]/
4.19.y:
https://lore.kernel.org/all/[email protected]/Could you please queue these up for future releases.
Thanks,
HarshitQuoted 10 lines
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.159-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Greg Kroah-Hartman
maintainerQuoted 27 lines · Martin Faltesek
Build failure on arm:
In file included from
drivers/iommu/mtk_iommu_v1.c:22:drivers/iommu/mtk_iommu_v1.c:579:25: error: 'mtk_iommu_v1_of_ids' undeclared here (not in a function); did you mean 'mtk_iommu_of_ids'?579 | MODULE_DEVICE_TABLE(of, mtk_iommu_v1_of_ids); | ^~~~~~~~~~~~~~~~~~~ ./include/linux/module.h:244:15: note: in definition of macro 'MODULE_DEVICE_TABLE' 244 | extern typeof(name) __mod_##type##__##name##_device_table \ | ^~~~
./include/linux/module.h:244:21: error:
'__mod_of__mtk_iommu_v1_of_ids_device_table' aliased to undefined symbol 'mtk_iommu_v1_of_ids'
244 | extern typeof(name) __mod_##type##__##name##_device_table\ | ^~~~~~ drivers/iommu/mtk_iommu_v1.c:579:1: note: in expansion of macro 'MODULE_DEVICE_TABLE' 579 | MODULE_DEVICE_TABLE(of, mtk_iommu_v1_of_ids); | ^~~~~~~~~~~~~~~~~~~make[2]: *** [
scripts/Makefile.build:289:drivers/iommu/mtk_iommu_v1.o] Error 1 make[1]: *** [scripts/Makefile.build:552:drivers/iommu] Error 2This is from patch:
Quoted 9 lines
bce893a92324[email protected] 2024-05-14 iommu: mtk: fix
module autoloading+MODULE_DEVICE_TABLE(of,
mtk_iommu_v1_of_ids);should be, I think:
+MODULE_DEVICE_TABLE(of,
mtk_iommu_of_ids);
Good catch, now fixed up. I'll push out a -rc2 with this in it.
greg k-h
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.159 release. There are 168 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 16 May 2024 10:09:32 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.159-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.159 release. There are 168 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 16 May 2024 10:09:32 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.159-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah