Merge remote-tracking branch 'stable/linux-6.12.y' into rpi-6.12.y

This commit is contained in:
Dom Cobley
2025-10-06 12:40:47 +01:00
12 changed files with 86 additions and 42 deletions

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 6 VERSION = 6
PATCHLEVEL = 12 PATCHLEVEL = 12
SUBLEVEL = 50 SUBLEVEL = 51
EXTRAVERSION = EXTRAVERSION =
NAME = Baby Opossum Posse NAME = Baby Opossum Posse

View File

@@ -411,7 +411,7 @@ static void flexcop_pci_remove(struct pci_dev *pdev)
struct flexcop_pci *fc_pci = pci_get_drvdata(pdev); struct flexcop_pci *fc_pci = pci_get_drvdata(pdev);
if (irq_chk_intv > 0) if (irq_chk_intv > 0)
cancel_delayed_work(&fc_pci->irq_check_work); cancel_delayed_work_sync(&fc_pci->irq_check_work);
flexcop_pci_dma_exit(fc_pci); flexcop_pci_dma_exit(fc_pci);
flexcop_device_exit(fc_pci->fc_dev); flexcop_device_exit(fc_pci->fc_dev);

View File

@@ -536,7 +536,9 @@ static int display_open(struct inode *inode, struct file *file)
mutex_lock(&ictx->lock); mutex_lock(&ictx->lock);
if (!ictx->display_supported) { if (ictx->disconnected) {
retval = -ENODEV;
} else if (!ictx->display_supported) {
pr_err("display not supported by device\n"); pr_err("display not supported by device\n");
retval = -ENODEV; retval = -ENODEV;
} else if (ictx->display_isopen) { } else if (ictx->display_isopen) {
@@ -598,6 +600,9 @@ static int send_packet(struct imon_context *ictx)
int retval = 0; int retval = 0;
struct usb_ctrlrequest *control_req = NULL; struct usb_ctrlrequest *control_req = NULL;
if (ictx->disconnected)
return -ENODEV;
/* Check if we need to use control or interrupt urb */ /* Check if we need to use control or interrupt urb */
if (!ictx->tx_control) { if (!ictx->tx_control) {
pipe = usb_sndintpipe(ictx->usbdev_intf0, pipe = usb_sndintpipe(ictx->usbdev_intf0,
@@ -949,12 +954,14 @@ static ssize_t vfd_write(struct file *file, const char __user *buf,
static const unsigned char vfd_packet6[] = { static const unsigned char vfd_packet6[] = {
0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF };
if (ictx->disconnected)
return -ENODEV;
if (mutex_lock_interruptible(&ictx->lock)) if (mutex_lock_interruptible(&ictx->lock))
return -ERESTARTSYS; return -ERESTARTSYS;
if (ictx->disconnected) {
retval = -ENODEV;
goto exit;
}
if (!ictx->dev_present_intf0) { if (!ictx->dev_present_intf0) {
pr_err_ratelimited("no iMON device present\n"); pr_err_ratelimited("no iMON device present\n");
retval = -ENODEV; retval = -ENODEV;
@@ -1029,11 +1036,13 @@ static ssize_t lcd_write(struct file *file, const char __user *buf,
int retval = 0; int retval = 0;
struct imon_context *ictx = file->private_data; struct imon_context *ictx = file->private_data;
if (ictx->disconnected)
return -ENODEV;
mutex_lock(&ictx->lock); mutex_lock(&ictx->lock);
if (ictx->disconnected) {
retval = -ENODEV;
goto exit;
}
if (!ictx->display_supported) { if (!ictx->display_supported) {
pr_err_ratelimited("no iMON display present\n"); pr_err_ratelimited("no iMON display present\n");
retval = -ENODEV; retval = -ENODEV;
@@ -2499,7 +2508,11 @@ static void imon_disconnect(struct usb_interface *interface)
int ifnum; int ifnum;
ictx = usb_get_intfdata(interface); ictx = usb_get_intfdata(interface);
mutex_lock(&ictx->lock);
ictx->disconnected = true; ictx->disconnected = true;
mutex_unlock(&ictx->lock);
dev = ictx->dev; dev = ictx->dev;
ifnum = interface->cur_altsetting->desc.bInterfaceNumber; ifnum = interface->cur_altsetting->desc.bInterfaceNumber;

View File

@@ -1304,7 +1304,7 @@ static void xc5000_release(struct dvb_frontend *fe)
mutex_lock(&xc5000_list_mutex); mutex_lock(&xc5000_list_mutex);
if (priv) { if (priv) {
cancel_delayed_work(&priv->timer_sleep); cancel_delayed_work_sync(&priv->timer_sleep);
hybrid_tuner_release_state(priv); hybrid_tuner_release_state(priv);
} }

View File

@@ -135,6 +135,9 @@ struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id)
{ {
struct uvc_entity *entity; struct uvc_entity *entity;
if (id == UVC_INVALID_ENTITY_ID)
return NULL;
list_for_each_entry(entity, &dev->entities, list) { list_for_each_entry(entity, &dev->entities, list) {
if (entity->id == id) if (entity->id == id)
return entity; return entity;
@@ -778,14 +781,27 @@ static const u8 uvc_media_transport_input_guid[16] =
UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT; UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT;
static const u8 uvc_processing_guid[16] = UVC_GUID_UVC_PROCESSING; static const u8 uvc_processing_guid[16] = UVC_GUID_UVC_PROCESSING;
static struct uvc_entity *uvc_alloc_entity(u16 type, u16 id, static struct uvc_entity *uvc_alloc_new_entity(struct uvc_device *dev, u16 type,
unsigned int num_pads, unsigned int extra_size) u16 id, unsigned int num_pads,
unsigned int extra_size)
{ {
struct uvc_entity *entity; struct uvc_entity *entity;
unsigned int num_inputs; unsigned int num_inputs;
unsigned int size; unsigned int size;
unsigned int i; unsigned int i;
/* Per UVC 1.1+ spec 3.7.2, the ID should be non-zero. */
if (id == 0) {
dev_err(&dev->intf->dev, "Found Unit with invalid ID 0\n");
id = UVC_INVALID_ENTITY_ID;
}
/* Per UVC 1.1+ spec 3.7.2, the ID is unique. */
if (uvc_entity_by_id(dev, id)) {
dev_err(&dev->intf->dev, "Found multiple Units with ID %u\n", id);
id = UVC_INVALID_ENTITY_ID;
}
extra_size = roundup(extra_size, sizeof(*entity->pads)); extra_size = roundup(extra_size, sizeof(*entity->pads));
if (num_pads) if (num_pads)
num_inputs = type & UVC_TERM_OUTPUT ? num_pads : num_pads - 1; num_inputs = type & UVC_TERM_OUTPUT ? num_pads : num_pads - 1;
@@ -795,7 +811,7 @@ static struct uvc_entity *uvc_alloc_entity(u16 type, u16 id,
+ num_inputs; + num_inputs;
entity = kzalloc(size, GFP_KERNEL); entity = kzalloc(size, GFP_KERNEL);
if (entity == NULL) if (entity == NULL)
return NULL; return ERR_PTR(-ENOMEM);
entity->id = id; entity->id = id;
entity->type = type; entity->type = type;
@@ -907,10 +923,10 @@ static int uvc_parse_vendor_control(struct uvc_device *dev,
break; break;
} }
unit = uvc_alloc_entity(UVC_VC_EXTENSION_UNIT, buffer[3], unit = uvc_alloc_new_entity(dev, UVC_VC_EXTENSION_UNIT,
p + 1, 2*n); buffer[3], p + 1, 2 * n);
if (unit == NULL) if (IS_ERR(unit))
return -ENOMEM; return PTR_ERR(unit);
memcpy(unit->guid, &buffer[4], 16); memcpy(unit->guid, &buffer[4], 16);
unit->extension.bNumControls = buffer[20]; unit->extension.bNumControls = buffer[20];
@@ -1019,10 +1035,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
return -EINVAL; return -EINVAL;
} }
term = uvc_alloc_entity(type | UVC_TERM_INPUT, buffer[3], term = uvc_alloc_new_entity(dev, type | UVC_TERM_INPUT,
1, n + p); buffer[3], 1, n + p);
if (term == NULL) if (IS_ERR(term))
return -ENOMEM; return PTR_ERR(term);
if (UVC_ENTITY_TYPE(term) == UVC_ITT_CAMERA) { if (UVC_ENTITY_TYPE(term) == UVC_ITT_CAMERA) {
term->camera.bControlSize = n; term->camera.bControlSize = n;
@@ -1078,10 +1094,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
return 0; return 0;
} }
term = uvc_alloc_entity(type | UVC_TERM_OUTPUT, buffer[3], term = uvc_alloc_new_entity(dev, type | UVC_TERM_OUTPUT,
1, 0); buffer[3], 1, 0);
if (term == NULL) if (IS_ERR(term))
return -ENOMEM; return PTR_ERR(term);
memcpy(term->baSourceID, &buffer[7], 1); memcpy(term->baSourceID, &buffer[7], 1);
@@ -1100,9 +1116,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
return -EINVAL; return -EINVAL;
} }
unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, 0); unit = uvc_alloc_new_entity(dev, buffer[2], buffer[3],
if (unit == NULL) p + 1, 0);
return -ENOMEM; if (IS_ERR(unit))
return PTR_ERR(unit);
memcpy(unit->baSourceID, &buffer[5], p); memcpy(unit->baSourceID, &buffer[5], p);
@@ -1122,9 +1139,9 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
return -EINVAL; return -EINVAL;
} }
unit = uvc_alloc_entity(buffer[2], buffer[3], 2, n); unit = uvc_alloc_new_entity(dev, buffer[2], buffer[3], 2, n);
if (unit == NULL) if (IS_ERR(unit))
return -ENOMEM; return PTR_ERR(unit);
memcpy(unit->baSourceID, &buffer[4], 1); memcpy(unit->baSourceID, &buffer[4], 1);
unit->processing.wMaxMultiplier = unit->processing.wMaxMultiplier =
@@ -1151,9 +1168,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
return -EINVAL; return -EINVAL;
} }
unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, n); unit = uvc_alloc_new_entity(dev, buffer[2], buffer[3],
if (unit == NULL) p + 1, n);
return -ENOMEM; if (IS_ERR(unit))
return PTR_ERR(unit);
memcpy(unit->guid, &buffer[4], 16); memcpy(unit->guid, &buffer[4], 16);
unit->extension.bNumControls = buffer[20]; unit->extension.bNumControls = buffer[20];
@@ -1293,9 +1311,10 @@ static int uvc_gpio_parse(struct uvc_device *dev)
return dev_err_probe(&dev->intf->dev, irq, return dev_err_probe(&dev->intf->dev, irq,
"No IRQ for privacy GPIO\n"); "No IRQ for privacy GPIO\n");
unit = uvc_alloc_entity(UVC_EXT_GPIO_UNIT, UVC_EXT_GPIO_UNIT_ID, 0, 1); unit = uvc_alloc_new_entity(dev, UVC_EXT_GPIO_UNIT,
if (!unit) UVC_EXT_GPIO_UNIT_ID, 0, 1);
return -ENOMEM; if (IS_ERR(unit))
return PTR_ERR(unit);
unit->gpio.gpio_privacy = gpio_privacy; unit->gpio.gpio_privacy = gpio_privacy;
unit->gpio.irq = irq; unit->gpio.irq = irq;

View File

@@ -41,6 +41,8 @@
#define UVC_EXT_GPIO_UNIT 0x7ffe #define UVC_EXT_GPIO_UNIT 0x7ffe
#define UVC_EXT_GPIO_UNIT_ID 0x100 #define UVC_EXT_GPIO_UNIT_ID 0x100
#define UVC_INVALID_ENTITY_ID 0xffff
/* ------------------------------------------------------------------------ /* ------------------------------------------------------------------------
* Driver specific constants. * Driver specific constants.
*/ */

View File

@@ -2550,7 +2550,7 @@ static int ath11k_qmi_m3_load(struct ath11k_base *ab)
GFP_KERNEL); GFP_KERNEL);
if (!m3_mem->vaddr) { if (!m3_mem->vaddr) {
ath11k_err(ab, "failed to allocate memory for M3 with size %zu\n", ath11k_err(ab, "failed to allocate memory for M3 with size %zu\n",
fw->size); m3_len);
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }

View File

@@ -2776,7 +2776,7 @@ static ssize_t target_lu_gp_members_show(struct config_item *item, char *page)
config_item_name(&dev->dev_group.cg_item)); config_item_name(&dev->dev_group.cg_item));
cur_len++; /* Extra byte for NULL terminator */ cur_len++; /* Extra byte for NULL terminator */
if ((cur_len + len) > PAGE_SIZE) { if ((cur_len + len) > PAGE_SIZE || cur_len > LU_GROUP_NAME_BUF) {
pr_warn("Ran out of lu_gp_show_attr" pr_warn("Ran out of lu_gp_show_attr"
"_members buffer\n"); "_members buffer\n");
break; break;

View File

@@ -44,7 +44,7 @@ static inline int lib_sha256_base_do_update(struct sha256_state *sctx,
sctx->count += len; sctx->count += len;
if (unlikely((partial + len) >= SHA256_BLOCK_SIZE)) { if (unlikely((partial + len) >= SHA256_BLOCK_SIZE)) {
int blocks; unsigned int blocks;
if (partial) { if (partial) {
int p = SHA256_BLOCK_SIZE - partial; int p = SHA256_BLOCK_SIZE - partial;

View File

@@ -2337,6 +2337,8 @@ static int unuse_mm(struct mm_struct *mm, unsigned int type)
VMA_ITERATOR(vmi, mm, 0); VMA_ITERATOR(vmi, mm, 0);
mmap_read_lock(mm); mmap_read_lock(mm);
if (check_stable_address_space(mm))
goto unlock;
for_each_vma(vmi, vma) { for_each_vma(vmi, vma) {
if (vma->anon_vma && !is_vm_hugetlb_page(vma)) { if (vma->anon_vma && !is_vm_hugetlb_page(vma)) {
ret = unuse_vma(vma, type); ret = unuse_vma(vma, type);
@@ -2346,6 +2348,7 @@ static int unuse_mm(struct mm_struct *mm, unsigned int type)
cond_resched(); cond_resched();
} }
unlock:
mmap_read_unlock(mm); mmap_read_unlock(mm);
return ret; return ret;
} }

View File

@@ -191,10 +191,17 @@ inline bool is_a_helper<const gassign *>::test(const_gimple gs)
} }
#endif #endif
#if BUILDING_GCC_VERSION < 16000
#define TODO_verify_ssa TODO_verify_il #define TODO_verify_ssa TODO_verify_il
#define TODO_verify_flow TODO_verify_il #define TODO_verify_flow TODO_verify_il
#define TODO_verify_stmts TODO_verify_il #define TODO_verify_stmts TODO_verify_il
#define TODO_verify_rtl_sharing TODO_verify_il #define TODO_verify_rtl_sharing TODO_verify_il
#else
#define TODO_verify_ssa 0
#define TODO_verify_flow 0
#define TODO_verify_stmts 0
#define TODO_verify_rtl_sharing 0
#endif
#define INSN_DELETED_P(insn) (insn)->deleted() #define INSN_DELETED_P(insn) (insn)->deleted()

View File

@@ -587,8 +587,8 @@ static int audioreach_widget_load_module_common(struct snd_soc_component *compon
return PTR_ERR(cont); return PTR_ERR(cont);
mod = audioreach_parse_common_tokens(apm, cont, &tplg_w->priv, w); mod = audioreach_parse_common_tokens(apm, cont, &tplg_w->priv, w);
if (IS_ERR(mod)) if (IS_ERR_OR_NULL(mod))
return PTR_ERR(mod); return mod ? PTR_ERR(mod) : -ENODEV;
dobj = &w->dobj; dobj = &w->dobj;
dobj->private = mod; dobj->private = mod;