Merge 6.12.12 into android16-6.12
GKI (arm64) relevant 20 out of 43 changes, affecting 22 files +154/-12281aa72e17cseccomp: Stub for !CONFIG_SECCOMP [1 file, +1/-1]0485a718f3drm/connector: hdmi: Validate supported_formats matches ycbcr_420_allowed [1 file, +3/-0]418bd70d1airqchip/sunxi-nmi: Add missing SKIP_WAKE flag [1 file, +2/-1]1c3cf02db8libfs: Return ENOSPC when the directory offset range is exhausted [1 file, +2/-2]bfb98a55cfRevert "libfs: Add simple_offset_empty()" [3 files, +2/-35]9e9e710f68Revert "libfs: fix infinite directory reads for offset dir" [1 file, +11/-24]e73e46c96blibfs: Replace simple_offset end-of-directory detection [1 file, +21/-16]639b40424dlibfs: Use d_children list to iterate simple_offset directories [1 file, +58/-26]780ab83296cachestat: fix page cache statistics permission checking [1 file, +19/-0]bb50dc2aa4Revert "usb: gadget: u_serial: Disable ep before setting port to null to fix the crash caused by port being null" [1 file, +4/-4]fad7b56410ALSA: usb-audio: Add delay quirk for USB Audio Device [1 file, +2/-0]5f5e6cbc4fHID: wacom: Initialize brightness of LED trigger [1 file, +13/-11]5c92458f72Input: xpad - add support for Nacon Pro Compact [1 file, +1/-0]fae6f9589dInput: atkbd - map F23 key to support default copilot shortcut [1 file, +1/-1]a183a11cd6Input: xpad - add unofficial Xbox 360 wireless receiver clone [1 file, +1/-0]27ae0bdcb0Input: xpad - add QH Electronics VID/PID [1 file, +2/-0]ccc95d7e27Input: xpad - improve name of 8BitDo controller 2dc8:3106 [1 file, +1/-1]41359d0d2eInput: xpad - add support for Nacon Evol-X Xbox One Controller [1 file, +2/-0]5d114fa2b6Input: xpad - add support for wooting two he (arm) [1 file, +1/-0]efd96fbe23io_uring/rsrc: require cloned buffers to share accounting contexts [1 file, +7/-0] Changes in 6.12.12 ASoC: wm8994: Add depends on MFD core ASoC: codecs: es8316: Fix HW rate calculation for 48Mhz MCLK ASoC: samsung: Add missing selects for MFD_WM8994 seccomp: Stub for !CONFIG_SECCOMP ASoC: cs42l43: Add codec force suspend/resume ops scsi: iscsi: Fix redundant response for ISCSI_UEVENT_GET_HOST_STATS request drm/amd/display: Use HW lock mgr for PSR1 drm/amd/display: Initialize denominator defaults to 1 of/unittest: Add test that of_address_to_resource() fails on non-translatable address ALSA: hda/realtek: Fix volume adjustment issue on Lenovo ThinkBook 16P Gen5 drm/connector: hdmi: Validate supported_formats matches ycbcr_420_allowed irqchip/sunxi-nmi: Add missing SKIP_WAKE flag hwmon: (drivetemp) Set scsi command timeout to 10s ASoC: samsung: Add missing depends on I2C mm: zswap: properly synchronize freeing resources during CPU hotunplug mm: zswap: move allocations during CPU init outside the lock gfs2: Truncate address space when flipping GFS2_DIF_JDATA flag libfs: Return ENOSPC when the directory offset range is exhausted Revert "libfs: Add simple_offset_empty()" Revert "libfs: fix infinite directory reads for offset dir" libfs: Replace simple_offset end-of-directory detection libfs: Use d_children list to iterate simple_offset directories smb: client: handle lack of EA support in smb2_query_path_info() net: sched: fix ets qdisc OOB Indexing Revert "HID: multitouch: Add support for lenovo Y9000P Touchpad" cachestat: fix page cache statistics permission checking vfio/platform: check the bounds of read/write syscalls scsi: storvsc: Ratelimit warning logs to prevent VM denial of service USB: serial: quatech2: fix null-ptr-deref in qt2_process_read_urb() Revert "usb: gadget: u_serial: Disable ep before setting port to null to fix the crash caused by port being null" ALSA: usb-audio: Add delay quirk for USB Audio Device wifi: rtl8xxxu: add more missing rtl8192cu USB IDs HID: wacom: Initialize brightness of LED trigger Input: xpad - add support for Nacon Pro Compact Input: atkbd - map F23 key to support default copilot shortcut Input: xpad - add unofficial Xbox 360 wireless receiver clone Input: xpad - add QH Electronics VID/PID Input: xpad - improve name of 8BitDo controller 2dc8:3106 Input: xpad - add support for Nacon Evol-X Xbox One Controller Input: xpad - add support for wooting two he (arm) io_uring/rsrc: require cloned buffers to share accounting contexts drm/v3d: Assign job pointer to NULL before signaling the fence Linux 6.12.12 Change-Id: If6edc2470d23322783bf4527850fab66a7178234 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 12
|
||||
SUBLEVEL = 11
|
||||
SUBLEVEL = 12
|
||||
EXTRAVERSION =
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
|
||||
@@ -63,7 +63,8 @@ void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv,
|
||||
|
||||
bool should_use_dmub_lock(struct dc_link *link)
|
||||
{
|
||||
if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1)
|
||||
if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1 ||
|
||||
link->psr_settings.psr_version == DC_PSR_VERSION_1)
|
||||
return true;
|
||||
|
||||
if (link->replay_settings.replay_feature_enabled)
|
||||
|
||||
@@ -578,8 +578,8 @@ static void CalculateBytePerPixelAndBlockSizes(
|
||||
{
|
||||
*BytePerPixelDETY = 0;
|
||||
*BytePerPixelDETC = 0;
|
||||
*BytePerPixelY = 0;
|
||||
*BytePerPixelC = 0;
|
||||
*BytePerPixelY = 1;
|
||||
*BytePerPixelC = 1;
|
||||
|
||||
if (SourcePixelFormat == dml2_444_64) {
|
||||
*BytePerPixelDETY = 8;
|
||||
|
||||
@@ -507,6 +507,9 @@ int drmm_connector_hdmi_init(struct drm_device *dev,
|
||||
if (!supported_formats || !(supported_formats & BIT(HDMI_COLORSPACE_RGB)))
|
||||
return -EINVAL;
|
||||
|
||||
if (connector->ycbcr_420_allowed != !!(supported_formats & BIT(HDMI_COLORSPACE_YUV420)))
|
||||
return -EINVAL;
|
||||
|
||||
if (!(max_bpc == 8 || max_bpc == 10 || max_bpc == 12))
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
@@ -107,8 +107,10 @@ v3d_irq(int irq, void *arg)
|
||||
|
||||
v3d_job_update_stats(&v3d->bin_job->base, V3D_BIN);
|
||||
trace_v3d_bcl_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
v3d->bin_job = NULL;
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -118,8 +120,10 @@ v3d_irq(int irq, void *arg)
|
||||
|
||||
v3d_job_update_stats(&v3d->render_job->base, V3D_RENDER);
|
||||
trace_v3d_rcl_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
v3d->render_job = NULL;
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -129,8 +133,10 @@ v3d_irq(int irq, void *arg)
|
||||
|
||||
v3d_job_update_stats(&v3d->csd_job->base, V3D_CSD);
|
||||
trace_v3d_csd_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
v3d->csd_job = NULL;
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -167,8 +173,10 @@ v3d_hub_irq(int irq, void *arg)
|
||||
|
||||
v3d_job_update_stats(&v3d->tfu_job->base, V3D_TFU);
|
||||
trace_v3d_tfu_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
v3d->tfu_job = NULL;
|
||||
dma_fence_signal(&fence->base);
|
||||
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
||||
@@ -506,7 +506,6 @@
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PIT_E100 0xe100
|
||||
|
||||
#define I2C_VENDOR_ID_GOODIX 0x27c6
|
||||
#define I2C_DEVICE_ID_GOODIX_01E0 0x01e0
|
||||
#define I2C_DEVICE_ID_GOODIX_01E8 0x01e8
|
||||
#define I2C_DEVICE_ID_GOODIX_01E9 0x01e9
|
||||
#define I2C_DEVICE_ID_GOODIX_01F0 0x01f0
|
||||
|
||||
@@ -1452,8 +1452,7 @@ static const __u8 *mt_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
{
|
||||
if (hdev->vendor == I2C_VENDOR_ID_GOODIX &&
|
||||
(hdev->product == I2C_DEVICE_ID_GOODIX_01E8 ||
|
||||
hdev->product == I2C_DEVICE_ID_GOODIX_01E9 ||
|
||||
hdev->product == I2C_DEVICE_ID_GOODIX_01E0)) {
|
||||
hdev->product == I2C_DEVICE_ID_GOODIX_01E9)) {
|
||||
if (rdesc[607] == 0x15) {
|
||||
rdesc[607] = 0x25;
|
||||
dev_info(
|
||||
@@ -2079,10 +2078,7 @@ static const struct hid_device_id mt_devices[] = {
|
||||
I2C_DEVICE_ID_GOODIX_01E8) },
|
||||
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
|
||||
HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
|
||||
I2C_DEVICE_ID_GOODIX_01E9) },
|
||||
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
|
||||
HID_DEVICE(BUS_I2C, HID_GROUP_ANY, I2C_VENDOR_ID_GOODIX,
|
||||
I2C_DEVICE_ID_GOODIX_01E0) },
|
||||
I2C_DEVICE_ID_GOODIX_01E8) },
|
||||
|
||||
/* GoodTouch panels */
|
||||
{ .driver_data = MT_CLS_NSMU,
|
||||
|
||||
+13
-11
@@ -1370,17 +1370,6 @@ static int wacom_led_register_one(struct device *dev, struct wacom *wacom,
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!read_only) {
|
||||
led->trigger.name = name;
|
||||
error = devm_led_trigger_register(dev, &led->trigger);
|
||||
if (error) {
|
||||
hid_err(wacom->hdev,
|
||||
"failed to register LED trigger %s: %d\n",
|
||||
led->cdev.name, error);
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
led->group = group;
|
||||
led->id = id;
|
||||
led->wacom = wacom;
|
||||
@@ -1397,6 +1386,19 @@ static int wacom_led_register_one(struct device *dev, struct wacom *wacom,
|
||||
led->cdev.brightness_set = wacom_led_readonly_brightness_set;
|
||||
}
|
||||
|
||||
if (!read_only) {
|
||||
led->trigger.name = name;
|
||||
if (id == wacom->led.groups[group].select)
|
||||
led->trigger.brightness = wacom_leds_brightness_get(led);
|
||||
error = devm_led_trigger_register(dev, &led->trigger);
|
||||
if (error) {
|
||||
hid_err(wacom->hdev,
|
||||
"failed to register LED trigger %s: %d\n",
|
||||
led->cdev.name, error);
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
error = devm_led_classdev_register(dev, &led->cdev);
|
||||
if (error) {
|
||||
hid_err(wacom->hdev,
|
||||
|
||||
@@ -194,7 +194,7 @@ static int drivetemp_scsi_command(struct drivetemp_data *st,
|
||||
scsi_cmd[14] = ata_command;
|
||||
|
||||
err = scsi_execute_cmd(st->sdev, scsi_cmd, op, st->smartdata,
|
||||
ATA_SECT_SIZE, HZ, 5, NULL);
|
||||
ATA_SECT_SIZE, 10 * HZ, 5, NULL);
|
||||
if (err > 0)
|
||||
err = -EIO;
|
||||
return err;
|
||||
|
||||
@@ -150,6 +150,7 @@ static const struct xpad_device {
|
||||
{ 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 },
|
||||
{ 0x045e, 0x028f, "Microsoft X-Box 360 pad v2", 0, XTYPE_XBOX360 },
|
||||
{ 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
|
||||
{ 0x045e, 0x02a9, "Xbox 360 Wireless Receiver (Unofficial)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W },
|
||||
{ 0x045e, 0x02d1, "Microsoft X-Box One pad", 0, XTYPE_XBOXONE },
|
||||
{ 0x045e, 0x02dd, "Microsoft X-Box One pad (Firmware 2015)", 0, XTYPE_XBOXONE },
|
||||
{ 0x045e, 0x02e3, "Microsoft X-Box One Elite pad", MAP_PADDLES, XTYPE_XBOXONE },
|
||||
@@ -305,6 +306,7 @@ static const struct xpad_device {
|
||||
{ 0x1689, 0xfe00, "Razer Sabertooth", 0, XTYPE_XBOX360 },
|
||||
{ 0x17ef, 0x6182, "Lenovo Legion Controller for Windows", 0, XTYPE_XBOX360 },
|
||||
{ 0x1949, 0x041a, "Amazon Game Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x1a86, 0xe310, "QH Electronics Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x1bad, 0x0130, "Ion Drum Rocker", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
@@ -373,16 +375,19 @@ static const struct xpad_device {
|
||||
{ 0x294b, 0x3303, "Snakebyte GAMEPAD BASE X", 0, XTYPE_XBOXONE },
|
||||
{ 0x294b, 0x3404, "Snakebyte GAMEPAD RGB X", 0, XTYPE_XBOXONE },
|
||||
{ 0x2dc8, 0x2000, "8BitDo Pro 2 Wired Controller fox Xbox", 0, XTYPE_XBOXONE },
|
||||
{ 0x2dc8, 0x3106, "8BitDo Pro 2 Wired Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x2dc8, 0x3106, "8BitDo Ultimate Wireless / Pro 2 Wired Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x2dc8, 0x310a, "8BitDo Ultimate 2C Wireless Controller", 0, XTYPE_XBOX360 },
|
||||
{ 0x2e24, 0x0652, "Hyperkin Duke X-Box One pad", 0, XTYPE_XBOXONE },
|
||||
{ 0x31e3, 0x1100, "Wooting One", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1200, "Wooting Two", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1210, "Wooting Lekker", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1220, "Wooting Two HE", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1230, "Wooting Two HE (ARM)", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1300, "Wooting 60HE (AVR)", 0, XTYPE_XBOX360 },
|
||||
{ 0x31e3, 0x1310, "Wooting 60HE (ARM)", 0, XTYPE_XBOX360 },
|
||||
{ 0x3285, 0x0607, "Nacon GC-100", 0, XTYPE_XBOX360 },
|
||||
{ 0x3285, 0x0646, "Nacon Pro Compact", 0, XTYPE_XBOXONE },
|
||||
{ 0x3285, 0x0663, "Nacon Evol-X", 0, XTYPE_XBOXONE },
|
||||
{ 0x3537, 0x1004, "GameSir T4 Kaleid", 0, XTYPE_XBOX360 },
|
||||
{ 0x3767, 0x0101, "Fanatec Speedster 3 Forceshock Wheel", 0, XTYPE_XBOX },
|
||||
{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
|
||||
@@ -514,6 +519,7 @@ static const struct usb_device_id xpad_table[] = {
|
||||
XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */
|
||||
XPAD_XBOX360_VENDOR(0x17ef), /* Lenovo */
|
||||
XPAD_XBOX360_VENDOR(0x1949), /* Amazon controllers */
|
||||
XPAD_XBOX360_VENDOR(0x1a86), /* QH Electronics */
|
||||
XPAD_XBOX360_VENDOR(0x1bad), /* Harmonix Rock Band guitar and drums */
|
||||
XPAD_XBOX360_VENDOR(0x20d6), /* PowerA controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x20d6), /* PowerA controllers */
|
||||
@@ -530,6 +536,7 @@ static const struct usb_device_id xpad_table[] = {
|
||||
XPAD_XBOX360_VENDOR(0x2f24), /* GameSir controllers */
|
||||
XPAD_XBOX360_VENDOR(0x31e3), /* Wooting Keyboards */
|
||||
XPAD_XBOX360_VENDOR(0x3285), /* Nacon GC-100 */
|
||||
XPAD_XBOXONE_VENDOR(0x3285), /* Nacon Evol-X */
|
||||
XPAD_XBOX360_VENDOR(0x3537), /* GameSir Controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x3537), /* GameSir Controllers */
|
||||
{ }
|
||||
|
||||
@@ -89,7 +89,7 @@ static const unsigned short atkbd_set2_keycode[ATKBD_KEYMAP_SIZE] = {
|
||||
0, 46, 45, 32, 18, 5, 4, 95, 0, 57, 47, 33, 20, 19, 6,183,
|
||||
0, 49, 48, 35, 34, 21, 7,184, 0, 0, 50, 36, 22, 8, 9,185,
|
||||
0, 51, 37, 23, 24, 11, 10, 0, 0, 52, 53, 38, 39, 25, 12, 0,
|
||||
0, 89, 40, 0, 26, 13, 0, 0, 58, 54, 28, 27, 0, 43, 0, 85,
|
||||
0, 89, 40, 0, 26, 13, 0,193, 58, 54, 28, 27, 0, 43, 0, 85,
|
||||
0, 86, 91, 90, 92, 0, 14, 94, 0, 79,124, 75, 71,121, 0, 0,
|
||||
82, 83, 80, 76, 77, 72, 1, 69, 87, 78, 81, 74, 55, 73, 70, 99,
|
||||
|
||||
|
||||
@@ -186,7 +186,8 @@ static int __init sunxi_sc_nmi_irq_init(struct device_node *node,
|
||||
gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit;
|
||||
gc->chip_types[0].chip.irq_eoi = irq_gc_ack_set_bit;
|
||||
gc->chip_types[0].chip.irq_set_type = sunxi_sc_nmi_set_type;
|
||||
gc->chip_types[0].chip.flags = IRQCHIP_EOI_THREADED | IRQCHIP_EOI_IF_HANDLED;
|
||||
gc->chip_types[0].chip.flags = IRQCHIP_EOI_THREADED | IRQCHIP_EOI_IF_HANDLED |
|
||||
IRQCHIP_SKIP_SET_WAKE;
|
||||
gc->chip_types[0].regs.ack = reg_offs->pend;
|
||||
gc->chip_types[0].regs.mask = reg_offs->enable;
|
||||
gc->chip_types[0].regs.type = reg_offs->ctrl;
|
||||
|
||||
@@ -8147,6 +8147,8 @@ static const struct usb_device_id dev_table[] = {
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x817e, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8186, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x818a, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x317f, 0xff, 0xff, 0xff),
|
||||
@@ -8157,12 +8159,18 @@ static const struct usb_device_id dev_table[] = {
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x050d, 0x1102, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x050d, 0x11f2, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x06f8, 0xe033, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x07b8, 0x8188, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x07b8, 0x8189, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9041, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9043, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x17ba, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x1e1e, 0xff, 0xff, 0xff),
|
||||
@@ -8179,6 +8187,10 @@ static const struct usb_device_id dev_table[] = {
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x13d3, 0x3357, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x13d3, 0x3358, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x13d3, 0x3359, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x330b, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x2019, 0x4902, 0xff, 0xff, 0xff),
|
||||
@@ -8193,6 +8205,8 @@ static const struct usb_device_id dev_table[] = {
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x4856, 0x0091, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x9846, 0x9041, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0xcdab, 0x8010, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x04f2, 0xaff7, 0xff, 0xff, 0xff),
|
||||
@@ -8218,6 +8232,8 @@ static const struct usb_device_id dev_table[] = {
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x0586, 0x341f, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x06f8, 0xe033, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x06f8, 0xe035, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x17ab, 0xff, 0xff, 0xff),
|
||||
@@ -8226,6 +8242,8 @@ static const struct usb_device_id dev_table[] = {
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x0df6, 0x0070, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x0df6, 0x0077, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x0789, 0x016d, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x07aa, 0x0056, 0xff, 0xff, 0xff),
|
||||
@@ -8248,6 +8266,8 @@ static const struct usb_device_id dev_table[] = {
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x330a, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x330d, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x2019, 0xab2b, 0xff, 0xff, 0xff),
|
||||
.driver_info = (unsigned long)&rtl8192cu_fops},
|
||||
{USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x624d, 0xff, 0xff, 0xff),
|
||||
|
||||
@@ -34,5 +34,18 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
platform-tests-2 {
|
||||
// No #address-cells or #size-cells
|
||||
node {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
test-device@100 {
|
||||
compatible = "test-sub-device";
|
||||
reg = <0x100 1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1342,6 +1342,7 @@ static void __init of_unittest_bus_3cell_ranges(void)
|
||||
static void __init of_unittest_reg(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
struct resource res;
|
||||
int ret;
|
||||
u64 addr, size;
|
||||
|
||||
@@ -1358,6 +1359,19 @@ static void __init of_unittest_reg(void)
|
||||
np, addr);
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
np = of_find_node_by_path("/testcase-data/platform-tests-2/node/test-device@100");
|
||||
if (!np) {
|
||||
pr_err("missing testcase data\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = of_address_to_resource(np, 0, &res);
|
||||
unittest(ret == -EINVAL, "of_address_to_resource(%pOF) expected error on untranslatable address\n",
|
||||
np);
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
}
|
||||
|
||||
struct of_unittest_expected_res {
|
||||
|
||||
@@ -4104,7 +4104,7 @@ iscsi_if_rx(struct sk_buff *skb)
|
||||
}
|
||||
do {
|
||||
/*
|
||||
* special case for GET_STATS:
|
||||
* special case for GET_STATS, GET_CHAP and GET_HOST_STATS:
|
||||
* on success - sending reply and stats from
|
||||
* inside of if_recv_msg(),
|
||||
* on error - fall through.
|
||||
@@ -4113,6 +4113,8 @@ iscsi_if_rx(struct sk_buff *skb)
|
||||
break;
|
||||
if (ev->type == ISCSI_UEVENT_GET_CHAP && !err)
|
||||
break;
|
||||
if (ev->type == ISCSI_UEVENT_GET_HOST_STATS && !err)
|
||||
break;
|
||||
err = iscsi_if_send_reply(portid, nlh->nlmsg_type,
|
||||
ev, sizeof(*ev));
|
||||
if (err == -EAGAIN && --retries < 0) {
|
||||
|
||||
@@ -171,6 +171,12 @@ do { \
|
||||
dev_warn(&(dev)->device, fmt, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define storvsc_log_ratelimited(dev, level, fmt, ...) \
|
||||
do { \
|
||||
if (do_logging(level)) \
|
||||
dev_warn_ratelimited(&(dev)->device, fmt, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
struct vmscsi_request {
|
||||
u16 length;
|
||||
u8 srb_status;
|
||||
@@ -1177,7 +1183,7 @@ static void storvsc_on_io_completion(struct storvsc_device *stor_device,
|
||||
int loglevel = (stor_pkt->vm_srb.cdb[0] == TEST_UNIT_READY) ?
|
||||
STORVSC_LOGGING_WARN : STORVSC_LOGGING_ERROR;
|
||||
|
||||
storvsc_log(device, loglevel,
|
||||
storvsc_log_ratelimited(device, loglevel,
|
||||
"tag#%d cmd 0x%x status: scsi 0x%x srb 0x%x hv 0x%x\n",
|
||||
scsi_cmd_to_rq(request->cmd)->tag,
|
||||
stor_pkt->vm_srb.cdb[0],
|
||||
|
||||
@@ -1420,10 +1420,6 @@ void gserial_disconnect(struct gserial *gser)
|
||||
/* REVISIT as above: how best to track this? */
|
||||
port->port_line_coding = gser->port_line_coding;
|
||||
|
||||
/* disable endpoints, aborting down any active I/O */
|
||||
usb_ep_disable(gser->out);
|
||||
usb_ep_disable(gser->in);
|
||||
|
||||
port->port_usb = NULL;
|
||||
gser->ioport = NULL;
|
||||
if (port->port.count > 0) {
|
||||
@@ -1435,6 +1431,10 @@ void gserial_disconnect(struct gserial *gser)
|
||||
spin_unlock(&port->port_lock);
|
||||
spin_unlock_irqrestore(&serial_port_lock, flags);
|
||||
|
||||
/* disable endpoints, aborting down any active I/O */
|
||||
usb_ep_disable(gser->out);
|
||||
usb_ep_disable(gser->in);
|
||||
|
||||
/* finally, free any unused/unusable I/O buffers */
|
||||
spin_lock_irqsave(&port->port_lock, flags);
|
||||
if (port->port.count == 0)
|
||||
|
||||
@@ -503,7 +503,7 @@ static void qt2_process_read_urb(struct urb *urb)
|
||||
|
||||
newport = *(ch + 3);
|
||||
|
||||
if (newport > serial->num_ports) {
|
||||
if (newport >= serial->num_ports) {
|
||||
dev_err(&port->dev,
|
||||
"%s - port change to invalid port: %i\n",
|
||||
__func__, newport);
|
||||
|
||||
@@ -388,6 +388,11 @@ static ssize_t vfio_platform_read_mmio(struct vfio_platform_region *reg,
|
||||
{
|
||||
unsigned int done = 0;
|
||||
|
||||
if (off >= reg->size)
|
||||
return -EINVAL;
|
||||
|
||||
count = min_t(size_t, count, reg->size - off);
|
||||
|
||||
if (!reg->ioaddr) {
|
||||
reg->ioaddr =
|
||||
ioremap(reg->addr, reg->size);
|
||||
@@ -467,6 +472,11 @@ static ssize_t vfio_platform_write_mmio(struct vfio_platform_region *reg,
|
||||
{
|
||||
unsigned int done = 0;
|
||||
|
||||
if (off >= reg->size)
|
||||
return -EINVAL;
|
||||
|
||||
count = min_t(size_t, count, reg->size - off);
|
||||
|
||||
if (!reg->ioaddr) {
|
||||
reg->ioaddr =
|
||||
ioremap(reg->addr, reg->size);
|
||||
|
||||
@@ -251,6 +251,7 @@ static int do_gfs2_set_flags(struct inode *inode, u32 reqflags, u32 mask)
|
||||
error = filemap_fdatawait(inode->i_mapping);
|
||||
if (error)
|
||||
goto out;
|
||||
truncate_inode_pages(inode->i_mapping, 0);
|
||||
if (new_flags & GFS2_DIF_JDATA)
|
||||
gfs2_ordered_del_inode(ip);
|
||||
}
|
||||
|
||||
+77
-85
@@ -241,9 +241,16 @@ const struct inode_operations simple_dir_inode_operations = {
|
||||
};
|
||||
EXPORT_SYMBOL(simple_dir_inode_operations);
|
||||
|
||||
/* 0 is '.', 1 is '..', so always start with offset 2 or more */
|
||||
/* simple_offset_add() never assigns these to a dentry */
|
||||
enum {
|
||||
DIR_OFFSET_MIN = 2,
|
||||
DIR_OFFSET_FIRST = 2, /* Find first real entry */
|
||||
DIR_OFFSET_EOD = S32_MAX,
|
||||
};
|
||||
|
||||
/* simple_offset_add() allocation range */
|
||||
enum {
|
||||
DIR_OFFSET_MIN = DIR_OFFSET_FIRST + 1,
|
||||
DIR_OFFSET_MAX = DIR_OFFSET_EOD - 1,
|
||||
};
|
||||
|
||||
static void offset_set(struct dentry *dentry, long offset)
|
||||
@@ -287,9 +294,10 @@ int simple_offset_add(struct offset_ctx *octx, struct dentry *dentry)
|
||||
return -EBUSY;
|
||||
|
||||
ret = mtree_alloc_cyclic(&octx->mt, &offset, dentry, DIR_OFFSET_MIN,
|
||||
LONG_MAX, &octx->next_offset, GFP_KERNEL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
DIR_OFFSET_MAX, &octx->next_offset,
|
||||
GFP_KERNEL);
|
||||
if (unlikely(ret < 0))
|
||||
return ret == -EBUSY ? -ENOSPC : ret;
|
||||
|
||||
offset_set(dentry, offset);
|
||||
return 0;
|
||||
@@ -325,38 +333,6 @@ void simple_offset_remove(struct offset_ctx *octx, struct dentry *dentry)
|
||||
offset_set(dentry, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* simple_offset_empty - Check if a dentry can be unlinked
|
||||
* @dentry: dentry to be tested
|
||||
*
|
||||
* Returns 0 if @dentry is a non-empty directory; otherwise returns 1.
|
||||
*/
|
||||
int simple_offset_empty(struct dentry *dentry)
|
||||
{
|
||||
struct inode *inode = d_inode(dentry);
|
||||
struct offset_ctx *octx;
|
||||
struct dentry *child;
|
||||
unsigned long index;
|
||||
int ret = 1;
|
||||
|
||||
if (!inode || !S_ISDIR(inode->i_mode))
|
||||
return ret;
|
||||
|
||||
index = DIR_OFFSET_MIN;
|
||||
octx = inode->i_op->get_offset_ctx(inode);
|
||||
mt_for_each(&octx->mt, child, index, LONG_MAX) {
|
||||
spin_lock(&child->d_lock);
|
||||
if (simple_positive(child)) {
|
||||
spin_unlock(&child->d_lock);
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
spin_unlock(&child->d_lock);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* simple_offset_rename - handle directory offsets for rename
|
||||
* @old_dir: parent directory of source entry
|
||||
@@ -450,14 +426,6 @@ void simple_offset_destroy(struct offset_ctx *octx)
|
||||
mtree_destroy(&octx->mt);
|
||||
}
|
||||
|
||||
static int offset_dir_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct offset_ctx *ctx = inode->i_op->get_offset_ctx(inode);
|
||||
|
||||
file->private_data = (void *)ctx->next_offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* offset_dir_llseek - Advance the read position of a directory descriptor
|
||||
* @file: an open directory whose position is to be updated
|
||||
@@ -471,9 +439,6 @@ static int offset_dir_open(struct inode *inode, struct file *file)
|
||||
*/
|
||||
static loff_t offset_dir_llseek(struct file *file, loff_t offset, int whence)
|
||||
{
|
||||
struct inode *inode = file->f_inode;
|
||||
struct offset_ctx *ctx = inode->i_op->get_offset_ctx(inode);
|
||||
|
||||
switch (whence) {
|
||||
case SEEK_CUR:
|
||||
offset += file->f_pos;
|
||||
@@ -486,62 +451,89 @@ static loff_t offset_dir_llseek(struct file *file, loff_t offset, int whence)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* In this case, ->private_data is protected by f_pos_lock */
|
||||
if (!offset)
|
||||
file->private_data = (void *)ctx->next_offset;
|
||||
return vfs_setpos(file, offset, LONG_MAX);
|
||||
}
|
||||
|
||||
static struct dentry *offset_find_next(struct offset_ctx *octx, loff_t offset)
|
||||
static struct dentry *find_positive_dentry(struct dentry *parent,
|
||||
struct dentry *dentry,
|
||||
bool next)
|
||||
{
|
||||
MA_STATE(mas, &octx->mt, offset, offset);
|
||||
struct dentry *found = NULL;
|
||||
|
||||
spin_lock(&parent->d_lock);
|
||||
if (next)
|
||||
dentry = d_next_sibling(dentry);
|
||||
else if (!dentry)
|
||||
dentry = d_first_child(parent);
|
||||
hlist_for_each_entry_from(dentry, d_sib) {
|
||||
if (!simple_positive(dentry))
|
||||
continue;
|
||||
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
|
||||
if (simple_positive(dentry))
|
||||
found = dget_dlock(dentry);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
if (likely(found))
|
||||
break;
|
||||
}
|
||||
spin_unlock(&parent->d_lock);
|
||||
return found;
|
||||
}
|
||||
|
||||
static noinline_for_stack struct dentry *
|
||||
offset_dir_lookup(struct dentry *parent, loff_t offset)
|
||||
{
|
||||
struct inode *inode = d_inode(parent);
|
||||
struct offset_ctx *octx = inode->i_op->get_offset_ctx(inode);
|
||||
struct dentry *child, *found = NULL;
|
||||
|
||||
rcu_read_lock();
|
||||
child = mas_find(&mas, LONG_MAX);
|
||||
if (!child)
|
||||
goto out;
|
||||
spin_lock(&child->d_lock);
|
||||
if (simple_positive(child))
|
||||
found = dget_dlock(child);
|
||||
spin_unlock(&child->d_lock);
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
MA_STATE(mas, &octx->mt, offset, offset);
|
||||
|
||||
if (offset == DIR_OFFSET_FIRST)
|
||||
found = find_positive_dentry(parent, NULL, false);
|
||||
else {
|
||||
rcu_read_lock();
|
||||
child = mas_find(&mas, DIR_OFFSET_MAX);
|
||||
found = find_positive_dentry(parent, child, false);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
static bool offset_dir_emit(struct dir_context *ctx, struct dentry *dentry)
|
||||
{
|
||||
struct inode *inode = d_inode(dentry);
|
||||
long offset = dentry2offset(dentry);
|
||||
|
||||
return ctx->actor(ctx, dentry->d_name.name, dentry->d_name.len, offset,
|
||||
inode->i_ino, fs_umode_to_dtype(inode->i_mode));
|
||||
return dir_emit(ctx, dentry->d_name.name, dentry->d_name.len,
|
||||
inode->i_ino, fs_umode_to_dtype(inode->i_mode));
|
||||
}
|
||||
|
||||
static void offset_iterate_dir(struct inode *inode, struct dir_context *ctx, long last_index)
|
||||
static void offset_iterate_dir(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
struct offset_ctx *octx = inode->i_op->get_offset_ctx(inode);
|
||||
struct dentry *dir = file->f_path.dentry;
|
||||
struct dentry *dentry;
|
||||
|
||||
dentry = offset_dir_lookup(dir, ctx->pos);
|
||||
if (!dentry)
|
||||
goto out_eod;
|
||||
while (true) {
|
||||
dentry = offset_find_next(octx, ctx->pos);
|
||||
if (!dentry)
|
||||
return;
|
||||
struct dentry *next;
|
||||
|
||||
if (dentry2offset(dentry) >= last_index) {
|
||||
dput(dentry);
|
||||
return;
|
||||
}
|
||||
ctx->pos = dentry2offset(dentry);
|
||||
if (!offset_dir_emit(ctx, dentry))
|
||||
break;
|
||||
|
||||
if (!offset_dir_emit(ctx, dentry)) {
|
||||
dput(dentry);
|
||||
return;
|
||||
}
|
||||
|
||||
ctx->pos = dentry2offset(dentry) + 1;
|
||||
next = find_positive_dentry(dir, dentry, true);
|
||||
dput(dentry);
|
||||
|
||||
if (!next)
|
||||
goto out_eod;
|
||||
dentry = next;
|
||||
}
|
||||
dput(dentry);
|
||||
return;
|
||||
|
||||
out_eod:
|
||||
ctx->pos = DIR_OFFSET_EOD;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -561,6 +553,8 @@ static void offset_iterate_dir(struct inode *inode, struct dir_context *ctx, lon
|
||||
*
|
||||
* On return, @ctx->pos contains an offset that will read the next entry
|
||||
* in this directory when offset_readdir() is called again with @ctx.
|
||||
* Caller places this value in the d_off field of the last entry in the
|
||||
* user's buffer.
|
||||
*
|
||||
* Return values:
|
||||
* %0 - Complete
|
||||
@@ -568,19 +562,17 @@ static void offset_iterate_dir(struct inode *inode, struct dir_context *ctx, lon
|
||||
static int offset_readdir(struct file *file, struct dir_context *ctx)
|
||||
{
|
||||
struct dentry *dir = file->f_path.dentry;
|
||||
long last_index = (long)file->private_data;
|
||||
|
||||
lockdep_assert_held(&d_inode(dir)->i_rwsem);
|
||||
|
||||
if (!dir_emit_dots(file, ctx))
|
||||
return 0;
|
||||
|
||||
offset_iterate_dir(d_inode(dir), ctx, last_index);
|
||||
if (ctx->pos != DIR_OFFSET_EOD)
|
||||
offset_iterate_dir(file, ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct file_operations simple_offset_dir_operations = {
|
||||
.open = offset_dir_open,
|
||||
.llseek = offset_dir_llseek,
|
||||
.iterate_shared = offset_readdir,
|
||||
.read = generic_read_dir,
|
||||
|
||||
+75
-29
@@ -176,27 +176,27 @@ static int smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
|
||||
struct kvec *out_iov, int *out_buftype, struct dentry *dentry)
|
||||
{
|
||||
|
||||
struct reparse_data_buffer *rbuf;
|
||||
struct smb2_compound_vars *vars = NULL;
|
||||
struct kvec *rsp_iov, *iov;
|
||||
struct smb_rqst *rqst;
|
||||
int rc;
|
||||
__le16 *utf16_path = NULL;
|
||||
__u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
|
||||
struct cifs_fid fid;
|
||||
struct cifs_ses *ses = tcon->ses;
|
||||
struct TCP_Server_Info *server;
|
||||
int num_rqst = 0, i;
|
||||
int resp_buftype[MAX_COMPOUND];
|
||||
struct smb2_query_info_rsp *qi_rsp = NULL;
|
||||
struct smb2_compound_vars *vars = NULL;
|
||||
__u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
|
||||
struct cifs_open_info_data *idata;
|
||||
struct inode *inode = NULL;
|
||||
int flags = 0;
|
||||
__u8 delete_pending[8] = {1, 0, 0, 0, 0, 0, 0, 0};
|
||||
unsigned int size[2];
|
||||
void *data[2];
|
||||
unsigned int len;
|
||||
struct cifs_ses *ses = tcon->ses;
|
||||
struct reparse_data_buffer *rbuf;
|
||||
struct TCP_Server_Info *server;
|
||||
int resp_buftype[MAX_COMPOUND];
|
||||
int retries = 0, cur_sleep = 1;
|
||||
__u8 delete_pending[8] = {1,};
|
||||
struct kvec *rsp_iov, *iov;
|
||||
struct inode *inode = NULL;
|
||||
__le16 *utf16_path = NULL;
|
||||
struct smb_rqst *rqst;
|
||||
unsigned int size[2];
|
||||
struct cifs_fid fid;
|
||||
int num_rqst = 0, i;
|
||||
unsigned int len;
|
||||
int tmp_rc, rc;
|
||||
int flags = 0;
|
||||
void *data[2];
|
||||
|
||||
replay_again:
|
||||
/* reinitialize for possible replay */
|
||||
@@ -637,7 +637,14 @@ finished:
|
||||
tcon->need_reconnect = true;
|
||||
}
|
||||
|
||||
tmp_rc = rc;
|
||||
for (i = 0; i < num_cmds; i++) {
|
||||
char *buf = rsp_iov[i + i].iov_base;
|
||||
|
||||
if (buf && resp_buftype[i + 1] != CIFS_NO_BUFFER)
|
||||
rc = server->ops->map_error(buf, false);
|
||||
else
|
||||
rc = tmp_rc;
|
||||
switch (cmds[i]) {
|
||||
case SMB2_OP_QUERY_INFO:
|
||||
idata = in_iov[i].iov_base;
|
||||
@@ -803,6 +810,7 @@ finished:
|
||||
}
|
||||
}
|
||||
SMB2_close_free(&rqst[num_rqst]);
|
||||
rc = tmp_rc;
|
||||
|
||||
num_cmds += 2;
|
||||
if (out_iov && out_buftype) {
|
||||
@@ -858,22 +866,52 @@ static int parse_create_response(struct cifs_open_info_data *data,
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Check only if SMB2_OP_QUERY_WSL_EA command failed in the compound chain */
|
||||
static bool ea_unsupported(int *cmds, int num_cmds,
|
||||
struct kvec *out_iov, int *out_buftype)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (cmds[num_cmds - 1] != SMB2_OP_QUERY_WSL_EA)
|
||||
return false;
|
||||
|
||||
for (i = 1; i < num_cmds - 1; i++) {
|
||||
struct smb2_hdr *hdr = out_iov[i].iov_base;
|
||||
|
||||
if (out_buftype[i] == CIFS_NO_BUFFER || !hdr ||
|
||||
hdr->Status != STATUS_SUCCESS)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline void free_rsp_iov(struct kvec *iovs, int *buftype, int count)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
free_rsp_buf(buftype[i], iovs[i].iov_base);
|
||||
memset(&iovs[i], 0, sizeof(*iovs));
|
||||
buftype[i] = CIFS_NO_BUFFER;
|
||||
}
|
||||
}
|
||||
|
||||
int smb2_query_path_info(const unsigned int xid,
|
||||
struct cifs_tcon *tcon,
|
||||
struct cifs_sb_info *cifs_sb,
|
||||
const char *full_path,
|
||||
struct cifs_open_info_data *data)
|
||||
{
|
||||
struct cifs_open_parms oparms;
|
||||
__u32 create_options = 0;
|
||||
struct cifsFileInfo *cfile;
|
||||
struct kvec in_iov[3], out_iov[5] = {};
|
||||
struct cached_fid *cfid = NULL;
|
||||
struct cifs_open_parms oparms;
|
||||
struct cifsFileInfo *cfile;
|
||||
__u32 create_options = 0;
|
||||
int out_buftype[5] = {};
|
||||
struct smb2_hdr *hdr;
|
||||
struct kvec in_iov[3], out_iov[3] = {};
|
||||
int out_buftype[3] = {};
|
||||
int num_cmds = 0;
|
||||
int cmds[3];
|
||||
bool islink;
|
||||
int i, num_cmds = 0;
|
||||
int rc, rc2;
|
||||
|
||||
data->adjust_tz = false;
|
||||
@@ -943,14 +981,14 @@ int smb2_query_path_info(const unsigned int xid,
|
||||
if (rc || !data->reparse_point)
|
||||
goto out;
|
||||
|
||||
if (!tcon->posix_extensions)
|
||||
cmds[num_cmds++] = SMB2_OP_QUERY_WSL_EA;
|
||||
/*
|
||||
* Skip SMB2_OP_GET_REPARSE if symlink already parsed in create
|
||||
* response.
|
||||
*/
|
||||
if (data->reparse.tag != IO_REPARSE_TAG_SYMLINK)
|
||||
cmds[num_cmds++] = SMB2_OP_GET_REPARSE;
|
||||
if (!tcon->posix_extensions)
|
||||
cmds[num_cmds++] = SMB2_OP_QUERY_WSL_EA;
|
||||
|
||||
oparms = CIFS_OPARMS(cifs_sb, tcon, full_path,
|
||||
FILE_READ_ATTRIBUTES |
|
||||
@@ -958,9 +996,18 @@ int smb2_query_path_info(const unsigned int xid,
|
||||
FILE_OPEN, create_options |
|
||||
OPEN_REPARSE_POINT, ACL_NO_MODE);
|
||||
cifs_get_readable_path(tcon, full_path, &cfile);
|
||||
free_rsp_iov(out_iov, out_buftype, ARRAY_SIZE(out_iov));
|
||||
rc = smb2_compound_op(xid, tcon, cifs_sb, full_path,
|
||||
&oparms, in_iov, cmds, num_cmds,
|
||||
cfile, NULL, NULL, NULL);
|
||||
cfile, out_iov, out_buftype, NULL);
|
||||
if (rc && ea_unsupported(cmds, num_cmds,
|
||||
out_iov, out_buftype)) {
|
||||
if (data->reparse.tag != IO_REPARSE_TAG_LX_BLK &&
|
||||
data->reparse.tag != IO_REPARSE_TAG_LX_CHR)
|
||||
rc = 0;
|
||||
else
|
||||
rc = -EOPNOTSUPP;
|
||||
}
|
||||
break;
|
||||
case -EREMOTE:
|
||||
break;
|
||||
@@ -978,8 +1025,7 @@ int smb2_query_path_info(const unsigned int xid,
|
||||
}
|
||||
|
||||
out:
|
||||
for (i = 0; i < ARRAY_SIZE(out_buftype); i++)
|
||||
free_rsp_buf(out_buftype[i], out_iov[i].iov_base);
|
||||
free_rsp_iov(out_iov, out_buftype, ARRAY_SIZE(out_iov));
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -3440,7 +3440,6 @@ struct offset_ctx {
|
||||
void simple_offset_init(struct offset_ctx *octx);
|
||||
int simple_offset_add(struct offset_ctx *octx, struct dentry *dentry);
|
||||
void simple_offset_remove(struct offset_ctx *octx, struct dentry *dentry);
|
||||
int simple_offset_empty(struct dentry *dentry);
|
||||
int simple_offset_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||
struct inode *new_dir, struct dentry *new_dentry);
|
||||
int simple_offset_rename_exchange(struct inode *old_dir,
|
||||
|
||||
@@ -50,10 +50,10 @@ struct seccomp_data;
|
||||
|
||||
#ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER
|
||||
static inline int secure_computing(void) { return 0; }
|
||||
static inline int __secure_computing(const struct seccomp_data *sd) { return 0; }
|
||||
#else
|
||||
static inline void secure_computing_strict(int this_syscall) { return; }
|
||||
#endif
|
||||
static inline int __secure_computing(const struct seccomp_data *sd) { return 0; }
|
||||
|
||||
static inline long prctl_get_seccomp(void)
|
||||
{
|
||||
|
||||
@@ -1153,6 +1153,13 @@ static int io_clone_buffers(struct io_ring_ctx *ctx, struct io_ring_ctx *src_ctx
|
||||
struct io_rsrc_data *data;
|
||||
int i, ret, nbufs;
|
||||
|
||||
/*
|
||||
* Accounting state is shared between the two rings; that only works if
|
||||
* both rings are accounted towards the same counters.
|
||||
*/
|
||||
if (ctx->user != src_ctx->user || ctx->mm_account != src_ctx->mm_account)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Drop our own lock here. We'll setup the data we need and reference
|
||||
* the source buffers, then re-grab, check, and assign at the end.
|
||||
|
||||
@@ -4398,6 +4398,20 @@ resched:
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
/*
|
||||
* See mincore: reveal pagecache information only for files
|
||||
* that the calling process has write access to, or could (if
|
||||
* tried) open for writing.
|
||||
*/
|
||||
static inline bool can_do_cachestat(struct file *f)
|
||||
{
|
||||
if (f->f_mode & FMODE_WRITE)
|
||||
return true;
|
||||
if (inode_owner_or_capable(file_mnt_idmap(f), file_inode(f)))
|
||||
return true;
|
||||
return file_permission(f, MAY_WRITE) == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The cachestat(2) system call.
|
||||
*
|
||||
@@ -4457,6 +4471,11 @@ SYSCALL_DEFINE4(cachestat, unsigned int, fd,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (!can_do_cachestat(fd_file(f))) {
|
||||
fdput(f);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
if (flags != 0) {
|
||||
fdput(f);
|
||||
return -EINVAL;
|
||||
|
||||
+2
-2
@@ -3710,7 +3710,7 @@ static int shmem_unlink(struct inode *dir, struct dentry *dentry)
|
||||
|
||||
static int shmem_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
{
|
||||
if (!simple_offset_empty(dentry))
|
||||
if (!simple_empty(dentry))
|
||||
return -ENOTEMPTY;
|
||||
|
||||
drop_nlink(d_inode(dentry));
|
||||
@@ -3767,7 +3767,7 @@ static int shmem_rename2(struct mnt_idmap *idmap,
|
||||
return simple_offset_rename_exchange(old_dir, old_dentry,
|
||||
new_dir, new_dentry);
|
||||
|
||||
if (!simple_offset_empty(new_dentry))
|
||||
if (!simple_empty(new_dentry))
|
||||
return -ENOTEMPTY;
|
||||
|
||||
if (flags & RENAME_WHITEOUT) {
|
||||
|
||||
+63
-27
@@ -251,7 +251,7 @@ static struct zswap_pool *zswap_pool_create(char *type, char *compressor)
|
||||
struct zswap_pool *pool;
|
||||
char name[38]; /* 'zswap' + 32 char (max) num + \0 */
|
||||
gfp_t gfp = __GFP_NORETRY | __GFP_NOWARN | __GFP_KSWAPD_RECLAIM;
|
||||
int ret;
|
||||
int ret, cpu;
|
||||
|
||||
if (!zswap_has_pool) {
|
||||
/* if either are unset, pool initialization failed, and we
|
||||
@@ -285,6 +285,9 @@ static struct zswap_pool *zswap_pool_create(char *type, char *compressor)
|
||||
goto error;
|
||||
}
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
mutex_init(&per_cpu_ptr(pool->acomp_ctx, cpu)->mutex);
|
||||
|
||||
ret = cpuhp_state_add_instance(CPUHP_MM_ZSWP_POOL_PREPARE,
|
||||
&pool->node);
|
||||
if (ret)
|
||||
@@ -812,36 +815,41 @@ static int zswap_cpu_comp_prepare(unsigned int cpu, struct hlist_node *node)
|
||||
{
|
||||
struct zswap_pool *pool = hlist_entry(node, struct zswap_pool, node);
|
||||
struct crypto_acomp_ctx *acomp_ctx = per_cpu_ptr(pool->acomp_ctx, cpu);
|
||||
struct crypto_acomp *acomp;
|
||||
struct acomp_req *req;
|
||||
struct crypto_acomp *acomp = NULL;
|
||||
struct acomp_req *req = NULL;
|
||||
u8 *buffer = NULL;
|
||||
int ret;
|
||||
|
||||
mutex_init(&acomp_ctx->mutex);
|
||||
|
||||
acomp_ctx->buffer = kmalloc_node(PAGE_SIZE * 2, GFP_KERNEL, cpu_to_node(cpu));
|
||||
if (!acomp_ctx->buffer)
|
||||
return -ENOMEM;
|
||||
buffer = kmalloc_node(PAGE_SIZE * 2, GFP_KERNEL, cpu_to_node(cpu));
|
||||
if (!buffer) {
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
acomp = crypto_alloc_acomp_node(pool->tfm_name, 0, 0, cpu_to_node(cpu));
|
||||
if (IS_ERR(acomp)) {
|
||||
pr_err("could not alloc crypto acomp %s : %ld\n",
|
||||
pool->tfm_name, PTR_ERR(acomp));
|
||||
ret = PTR_ERR(acomp);
|
||||
goto acomp_fail;
|
||||
goto fail;
|
||||
}
|
||||
acomp_ctx->acomp = acomp;
|
||||
acomp_ctx->is_sleepable = acomp_is_async(acomp);
|
||||
|
||||
req = acomp_request_alloc(acomp_ctx->acomp);
|
||||
req = acomp_request_alloc(acomp);
|
||||
if (!req) {
|
||||
pr_err("could not alloc crypto acomp_request %s\n",
|
||||
pool->tfm_name);
|
||||
ret = -ENOMEM;
|
||||
goto req_fail;
|
||||
goto fail;
|
||||
}
|
||||
acomp_ctx->req = req;
|
||||
|
||||
/*
|
||||
* Only hold the mutex after completing allocations, otherwise we may
|
||||
* recurse into zswap through reclaim and attempt to hold the mutex
|
||||
* again resulting in a deadlock.
|
||||
*/
|
||||
mutex_lock(&acomp_ctx->mutex);
|
||||
crypto_init_wait(&acomp_ctx->wait);
|
||||
|
||||
/*
|
||||
* if the backend of acomp is async zip, crypto_req_done() will wakeup
|
||||
* crypto_wait_req(); if the backend of acomp is scomp, the callback
|
||||
@@ -850,12 +858,17 @@ static int zswap_cpu_comp_prepare(unsigned int cpu, struct hlist_node *node)
|
||||
acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
||||
crypto_req_done, &acomp_ctx->wait);
|
||||
|
||||
acomp_ctx->buffer = buffer;
|
||||
acomp_ctx->acomp = acomp;
|
||||
acomp_ctx->is_sleepable = acomp_is_async(acomp);
|
||||
acomp_ctx->req = req;
|
||||
mutex_unlock(&acomp_ctx->mutex);
|
||||
return 0;
|
||||
|
||||
req_fail:
|
||||
crypto_free_acomp(acomp_ctx->acomp);
|
||||
acomp_fail:
|
||||
kfree(acomp_ctx->buffer);
|
||||
fail:
|
||||
if (acomp)
|
||||
crypto_free_acomp(acomp);
|
||||
kfree(buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -864,17 +877,45 @@ static int zswap_cpu_comp_dead(unsigned int cpu, struct hlist_node *node)
|
||||
struct zswap_pool *pool = hlist_entry(node, struct zswap_pool, node);
|
||||
struct crypto_acomp_ctx *acomp_ctx = per_cpu_ptr(pool->acomp_ctx, cpu);
|
||||
|
||||
mutex_lock(&acomp_ctx->mutex);
|
||||
if (!IS_ERR_OR_NULL(acomp_ctx)) {
|
||||
if (!IS_ERR_OR_NULL(acomp_ctx->req))
|
||||
acomp_request_free(acomp_ctx->req);
|
||||
acomp_ctx->req = NULL;
|
||||
if (!IS_ERR_OR_NULL(acomp_ctx->acomp))
|
||||
crypto_free_acomp(acomp_ctx->acomp);
|
||||
kfree(acomp_ctx->buffer);
|
||||
}
|
||||
mutex_unlock(&acomp_ctx->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct crypto_acomp_ctx *acomp_ctx_get_cpu_lock(struct zswap_pool *pool)
|
||||
{
|
||||
struct crypto_acomp_ctx *acomp_ctx;
|
||||
|
||||
for (;;) {
|
||||
acomp_ctx = raw_cpu_ptr(pool->acomp_ctx);
|
||||
mutex_lock(&acomp_ctx->mutex);
|
||||
if (likely(acomp_ctx->req))
|
||||
return acomp_ctx;
|
||||
/*
|
||||
* It is possible that we were migrated to a different CPU after
|
||||
* getting the per-CPU ctx but before the mutex was acquired. If
|
||||
* the old CPU got offlined, zswap_cpu_comp_dead() could have
|
||||
* already freed ctx->req (among other things) and set it to
|
||||
* NULL. Just try again on the new CPU that we ended up on.
|
||||
*/
|
||||
mutex_unlock(&acomp_ctx->mutex);
|
||||
}
|
||||
}
|
||||
|
||||
static void acomp_ctx_put_unlock(struct crypto_acomp_ctx *acomp_ctx)
|
||||
{
|
||||
mutex_unlock(&acomp_ctx->mutex);
|
||||
}
|
||||
|
||||
static bool zswap_compress(struct folio *folio, struct zswap_entry *entry)
|
||||
{
|
||||
struct crypto_acomp_ctx *acomp_ctx;
|
||||
@@ -887,10 +928,7 @@ static bool zswap_compress(struct folio *folio, struct zswap_entry *entry)
|
||||
gfp_t gfp;
|
||||
u8 *dst;
|
||||
|
||||
acomp_ctx = raw_cpu_ptr(entry->pool->acomp_ctx);
|
||||
|
||||
mutex_lock(&acomp_ctx->mutex);
|
||||
|
||||
acomp_ctx = acomp_ctx_get_cpu_lock(entry->pool);
|
||||
dst = acomp_ctx->buffer;
|
||||
sg_init_table(&input, 1);
|
||||
sg_set_folio(&input, folio, PAGE_SIZE, 0);
|
||||
@@ -943,7 +981,7 @@ unlock:
|
||||
else if (alloc_ret)
|
||||
zswap_reject_alloc_fail++;
|
||||
|
||||
mutex_unlock(&acomp_ctx->mutex);
|
||||
acomp_ctx_put_unlock(acomp_ctx);
|
||||
return comp_ret == 0 && alloc_ret == 0;
|
||||
}
|
||||
|
||||
@@ -954,9 +992,7 @@ static void zswap_decompress(struct zswap_entry *entry, struct folio *folio)
|
||||
struct crypto_acomp_ctx *acomp_ctx;
|
||||
u8 *src;
|
||||
|
||||
acomp_ctx = raw_cpu_ptr(entry->pool->acomp_ctx);
|
||||
mutex_lock(&acomp_ctx->mutex);
|
||||
|
||||
acomp_ctx = acomp_ctx_get_cpu_lock(entry->pool);
|
||||
src = zpool_map_handle(zpool, entry->handle, ZPOOL_MM_RO);
|
||||
/*
|
||||
* If zpool_map_handle is atomic, we cannot reliably utilize its mapped buffer
|
||||
@@ -980,10 +1016,10 @@ static void zswap_decompress(struct zswap_entry *entry, struct folio *folio)
|
||||
acomp_request_set_params(acomp_ctx->req, &input, &output, entry->length, PAGE_SIZE);
|
||||
BUG_ON(crypto_wait_req(crypto_acomp_decompress(acomp_ctx->req), &acomp_ctx->wait));
|
||||
BUG_ON(acomp_ctx->req->dlen != PAGE_SIZE);
|
||||
mutex_unlock(&acomp_ctx->mutex);
|
||||
|
||||
if (src != acomp_ctx->buffer)
|
||||
zpool_unmap_handle(zpool, entry->handle);
|
||||
acomp_ctx_put_unlock(acomp_ctx);
|
||||
}
|
||||
|
||||
/*********************************
|
||||
|
||||
@@ -91,6 +91,8 @@ ets_class_from_arg(struct Qdisc *sch, unsigned long arg)
|
||||
{
|
||||
struct ets_sched *q = qdisc_priv(sch);
|
||||
|
||||
if (arg == 0 || arg > q->nbands)
|
||||
return NULL;
|
||||
return &q->classes[arg - 1];
|
||||
}
|
||||
|
||||
|
||||
@@ -10916,8 +10916,8 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x38e0, "Yoga Y990 Intel VECO Dual", ALC287_FIXUP_TAS2781_I2C),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38f8, "Yoga Book 9i", ALC287_FIXUP_TAS2781_I2C),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38df, "Y990 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38f9, "Thinkbook 16P Gen5", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38fa, "Thinkbook 16P Gen5", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38f9, "Thinkbook 16P Gen5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38fa, "Thinkbook 16P Gen5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x38fd, "ThinkBook plus Gen5 Hybrid", ALC287_FIXUP_TAS2781_I2C),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3913, "Lenovo 145", ALC236_FIXUP_LENOVO_INV_DMIC),
|
||||
|
||||
@@ -2397,6 +2397,7 @@ config SND_SOC_WM8993
|
||||
|
||||
config SND_SOC_WM8994
|
||||
tristate
|
||||
depends on MFD_WM8994
|
||||
|
||||
config SND_SOC_WM8995
|
||||
tristate
|
||||
|
||||
@@ -2446,6 +2446,7 @@ static const struct dev_pm_ops cs42l43_codec_pm_ops = {
|
||||
SYSTEM_SLEEP_PM_OPS(cs42l43_codec_suspend, cs42l43_codec_resume)
|
||||
NOIRQ_SYSTEM_SLEEP_PM_OPS(cs42l43_codec_suspend_noirq, cs42l43_codec_resume_noirq)
|
||||
RUNTIME_PM_OPS(NULL, cs42l43_codec_runtime_resume, NULL)
|
||||
SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume)
|
||||
};
|
||||
|
||||
static const struct platform_device_id cs42l43_codec_id_table[] = {
|
||||
|
||||
@@ -39,7 +39,9 @@ struct es8316_priv {
|
||||
struct snd_soc_jack *jack;
|
||||
int irq;
|
||||
unsigned int sysclk;
|
||||
unsigned int allowed_rates[ARRAY_SIZE(supported_mclk_lrck_ratios)];
|
||||
/* ES83xx supports halving the MCLK so it supports twice as many rates
|
||||
*/
|
||||
unsigned int allowed_rates[ARRAY_SIZE(supported_mclk_lrck_ratios) * 2];
|
||||
struct snd_pcm_hw_constraint_list sysclk_constraints;
|
||||
bool jd_inverted;
|
||||
};
|
||||
@@ -386,6 +388,12 @@ static int es8316_set_dai_sysclk(struct snd_soc_dai *codec_dai,
|
||||
|
||||
if (freq % ratio == 0)
|
||||
es8316->allowed_rates[count++] = freq / ratio;
|
||||
|
||||
/* We also check if the halved MCLK produces a valid rate
|
||||
* since the codec supports halving the MCLK.
|
||||
*/
|
||||
if ((freq / ratio) % 2 == 0)
|
||||
es8316->allowed_rates[count++] = freq / ratio / 2;
|
||||
}
|
||||
|
||||
if (count) {
|
||||
|
||||
@@ -127,8 +127,9 @@ config SND_SOC_SAMSUNG_TM2_WM5110
|
||||
|
||||
config SND_SOC_SAMSUNG_ARIES_WM8994
|
||||
tristate "SoC I2S Audio support for WM8994 on Aries"
|
||||
depends on SND_SOC_SAMSUNG && MFD_WM8994 && IIO && EXTCON
|
||||
depends on SND_SOC_SAMSUNG && I2C && IIO && EXTCON
|
||||
select SND_SOC_BT_SCO
|
||||
select MFD_WM8994
|
||||
select SND_SOC_WM8994
|
||||
select SND_SAMSUNG_I2S
|
||||
help
|
||||
@@ -140,8 +141,9 @@ config SND_SOC_SAMSUNG_ARIES_WM8994
|
||||
|
||||
config SND_SOC_SAMSUNG_MIDAS_WM1811
|
||||
tristate "SoC I2S Audio support for Midas boards"
|
||||
depends on SND_SOC_SAMSUNG && IIO
|
||||
depends on SND_SOC_SAMSUNG && I2C && IIO
|
||||
select SND_SAMSUNG_I2S
|
||||
select MFD_WM8994
|
||||
select SND_SOC_WM8994
|
||||
help
|
||||
Say Y if you want to add support for SoC audio on the Midas boards.
|
||||
|
||||
@@ -2239,6 +2239,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
|
||||
QUIRK_FLAG_CTL_MSG_DELAY_1M),
|
||||
DEVICE_FLG(0x0c45, 0x6340, /* Sonix HD USB Camera */
|
||||
QUIRK_FLAG_GET_SAMPLE_RATE),
|
||||
DEVICE_FLG(0x0d8c, 0x0014, /* USB Audio Device */
|
||||
QUIRK_FLAG_CTL_MSG_DELAY_1M),
|
||||
DEVICE_FLG(0x0ecb, 0x205c, /* JBL Quantum610 Wireless */
|
||||
QUIRK_FLAG_FIXED_RATE),
|
||||
DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */
|
||||
|
||||
Reference in New Issue
Block a user