mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
Merge c56ba3ea8e ("misc: fastrpc: Fix copy buffer page size") into android14-6.1-lts
Steps on the way to 6.1.129 Resolves merge conflicts with: drivers/i3c/master.c Change-Id: Ic60a64372e5acbd938424301c505f7520ca81003 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -1249,7 +1249,7 @@
|
||||
compatible = "nvidia,tegra234-sce-fabric";
|
||||
reg = <0xb600000 0x40000>;
|
||||
interrupts = <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "okay";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
rce-fabric@be00000 {
|
||||
@@ -1574,6 +1574,8 @@
|
||||
#redistributor-regions = <1>;
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-controller;
|
||||
|
||||
#address-cells = <0>;
|
||||
};
|
||||
|
||||
smmu_iso: iommu@10000000{
|
||||
|
||||
@@ -855,7 +855,7 @@
|
||||
|
||||
adsp: remoteproc@3000000 {
|
||||
compatible = "qcom,sm6350-adsp-pas";
|
||||
reg = <0 0x03000000 0 0x100>;
|
||||
reg = <0x0 0x03000000 0x0 0x10000>;
|
||||
|
||||
interrupts-extended = <&pdc 6 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<&smp2p_adsp_in 0 IRQ_TYPE_EDGE_RISING>,
|
||||
@@ -923,7 +923,7 @@
|
||||
|
||||
mpss: remoteproc@4080000 {
|
||||
compatible = "qcom,sm6350-mpss-pas";
|
||||
reg = <0x0 0x04080000 0x0 0x4040>;
|
||||
reg = <0x0 0x04080000 0x0 0x10000>;
|
||||
|
||||
interrupts-extended = <&intc GIC_SPI 136 IRQ_TYPE_EDGE_RISING>,
|
||||
<&modem_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
|
||||
|
||||
@@ -1641,7 +1641,7 @@
|
||||
|
||||
mpss: remoteproc@4080000 {
|
||||
compatible = "qcom,sm8350-mpss-pas";
|
||||
reg = <0x0 0x04080000 0x0 0x4040>;
|
||||
reg = <0x0 0x04080000 0x0 0x10000>;
|
||||
|
||||
interrupts-extended = <&intc GIC_SPI 264 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<&smp2p_modem_in 0 IRQ_TYPE_EDGE_RISING>,
|
||||
|
||||
@@ -2265,7 +2265,7 @@
|
||||
|
||||
remoteproc_mpss: remoteproc@4080000 {
|
||||
compatible = "qcom,sm8450-mpss-pas";
|
||||
reg = <0x0 0x04080000 0x0 0x4040>;
|
||||
reg = <0x0 0x04080000 0x0 0x10000>;
|
||||
|
||||
interrupts-extended = <&intc GIC_SPI 264 IRQ_TYPE_EDGE_RISING>,
|
||||
<&smp2p_modem_in 0 IRQ_TYPE_EDGE_RISING>,
|
||||
|
||||
@@ -21,13 +21,11 @@ static ssize_t boardinfo_show(struct kobject *kobj,
|
||||
"BIOS Info\n"
|
||||
"Vendor\t\t\t: %s\n"
|
||||
"Version\t\t\t: %s\n"
|
||||
"ROM Size\t\t: %d KB\n"
|
||||
"Release Date\t\t: %s\n",
|
||||
strsep(&tmp_board_manufacturer, "-"),
|
||||
eboard->name,
|
||||
strsep(&tmp_bios_vendor, "-"),
|
||||
einter->description,
|
||||
einter->size,
|
||||
especial->special_name);
|
||||
}
|
||||
static struct kobj_attribute boardinfo_attr = __ATTR(boardinfo, 0444,
|
||||
|
||||
@@ -1660,7 +1660,7 @@ static int fpux_emu(struct pt_regs *xcp, struct mips_fpu_struct *ctx,
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x3:
|
||||
case 0x7:
|
||||
if (MIPSInst_FUNC(ir) != pfetch_op)
|
||||
return SIGILL;
|
||||
|
||||
|
||||
@@ -580,8 +580,10 @@ static int pseries_eeh_get_state(struct eeh_pe *pe, int *delay)
|
||||
|
||||
switch(rets[0]) {
|
||||
case 0:
|
||||
result = EEH_STATE_MMIO_ACTIVE |
|
||||
EEH_STATE_DMA_ACTIVE;
|
||||
result = EEH_STATE_MMIO_ACTIVE |
|
||||
EEH_STATE_DMA_ACTIVE |
|
||||
EEH_STATE_MMIO_ENABLED |
|
||||
EEH_STATE_DMA_ENABLED;
|
||||
break;
|
||||
case 1:
|
||||
result = EEH_STATE_RESET_ACTIVE |
|
||||
|
||||
@@ -34,6 +34,7 @@ targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma \
|
||||
# avoid errors with '-march=i386', and future flags may depend on the target to
|
||||
# be valid.
|
||||
KBUILD_CFLAGS := -m$(BITS) -O2 $(CLANG_FLAGS)
|
||||
KBUILD_CFLAGS += -std=gnu11
|
||||
KBUILD_CFLAGS += -fno-strict-aliasing -fPIE
|
||||
KBUILD_CFLAGS += -Wundef
|
||||
KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
|
||||
|
||||
@@ -601,11 +601,12 @@ static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
||||
file_accessed(iocb->ki_filp);
|
||||
|
||||
ret = blkdev_direct_IO(iocb, to);
|
||||
if (ret >= 0) {
|
||||
if (ret > 0) {
|
||||
iocb->ki_pos += ret;
|
||||
count -= ret;
|
||||
}
|
||||
iov_iter_revert(to, count - iov_iter_count(to));
|
||||
if (ret != -EIOCBQUEUED)
|
||||
iov_iter_revert(to, count - iov_iter_count(to));
|
||||
if (ret < 0 || !count)
|
||||
goto reexpand;
|
||||
}
|
||||
|
||||
@@ -263,9 +263,7 @@ static acpi_status acpi_platformrt_space_handler(u32 function,
|
||||
if (!handler || !module)
|
||||
goto invalid_guid;
|
||||
|
||||
if (!handler->handler_addr ||
|
||||
!handler->static_data_buffer_addr ||
|
||||
!handler->acpi_param_buffer_addr) {
|
||||
if (!handler->handler_addr) {
|
||||
buffer->prm_status = PRM_HANDLER_ERROR;
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
@@ -658,7 +658,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct ata_port *ap = qc->ap;
|
||||
struct page *page;
|
||||
unsigned int offset;
|
||||
unsigned int offset, count;
|
||||
|
||||
if (!qc->cursg) {
|
||||
qc->curbytes = qc->nbytes;
|
||||
@@ -674,25 +674,27 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
|
||||
page = nth_page(page, (offset >> PAGE_SHIFT));
|
||||
offset %= PAGE_SIZE;
|
||||
|
||||
trace_ata_sff_pio_transfer_data(qc, offset, qc->sect_size);
|
||||
/* don't overrun current sg */
|
||||
count = min(qc->cursg->length - qc->cursg_ofs, qc->sect_size);
|
||||
|
||||
trace_ata_sff_pio_transfer_data(qc, offset, count);
|
||||
|
||||
/*
|
||||
* Split the transfer when it splits a page boundary. Note that the
|
||||
* split still has to be dword aligned like all ATA data transfers.
|
||||
*/
|
||||
WARN_ON_ONCE(offset % 4);
|
||||
if (offset + qc->sect_size > PAGE_SIZE) {
|
||||
if (offset + count > PAGE_SIZE) {
|
||||
unsigned int split_len = PAGE_SIZE - offset;
|
||||
|
||||
ata_pio_xfer(qc, page, offset, split_len);
|
||||
ata_pio_xfer(qc, nth_page(page, 1), 0,
|
||||
qc->sect_size - split_len);
|
||||
ata_pio_xfer(qc, nth_page(page, 1), 0, count - split_len);
|
||||
} else {
|
||||
ata_pio_xfer(qc, page, offset, qc->sect_size);
|
||||
ata_pio_xfer(qc, page, offset, count);
|
||||
}
|
||||
|
||||
qc->curbytes += qc->sect_size;
|
||||
qc->cursg_ofs += qc->sect_size;
|
||||
qc->curbytes += count;
|
||||
qc->cursg_ofs += count;
|
||||
|
||||
if (qc->cursg_ofs == qc->cursg->length) {
|
||||
qc->cursg = sg_next(qc->cursg);
|
||||
|
||||
@@ -786,7 +786,7 @@ static int qce_aead_register_one(const struct qce_aead_def *def, struct qce_devi
|
||||
alg->init = qce_aead_init;
|
||||
alg->exit = qce_aead_exit;
|
||||
|
||||
alg->base.cra_priority = 300;
|
||||
alg->base.cra_priority = 275;
|
||||
alg->base.cra_flags = CRYPTO_ALG_ASYNC |
|
||||
CRYPTO_ALG_ALLOCATES_MEMORY |
|
||||
CRYPTO_ALG_KERN_DRIVER_ONLY |
|
||||
|
||||
@@ -48,16 +48,19 @@ static void qce_unregister_algs(struct qce_device *qce)
|
||||
static int qce_register_algs(struct qce_device *qce)
|
||||
{
|
||||
const struct qce_algo_ops *ops;
|
||||
int i, ret = -ENODEV;
|
||||
int i, j, ret = -ENODEV;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(qce_ops); i++) {
|
||||
ops = qce_ops[i];
|
||||
ret = ops->register_algs(qce);
|
||||
if (ret)
|
||||
break;
|
||||
if (ret) {
|
||||
for (j = i - 1; j >= 0; j--)
|
||||
ops->unregister_algs(qce);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qce_handle_request(struct crypto_async_request *async_req)
|
||||
@@ -236,7 +239,7 @@ static int qce_crypto_probe(struct platform_device *pdev)
|
||||
|
||||
ret = qce_check_version(qce);
|
||||
if (ret)
|
||||
goto err_clks;
|
||||
goto err_dma;
|
||||
|
||||
spin_lock_init(&qce->lock);
|
||||
tasklet_init(&qce->done_tasklet, qce_tasklet_req_done,
|
||||
|
||||
@@ -482,7 +482,7 @@ static int qce_ahash_register_one(const struct qce_ahash_def *def,
|
||||
|
||||
base = &alg->halg.base;
|
||||
base->cra_blocksize = def->blocksize;
|
||||
base->cra_priority = 300;
|
||||
base->cra_priority = 175;
|
||||
base->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY;
|
||||
base->cra_ctxsize = sizeof(struct qce_sha_ctx);
|
||||
base->cra_alignmask = 0;
|
||||
|
||||
@@ -461,7 +461,7 @@ static int qce_skcipher_register_one(const struct qce_skcipher_def *def,
|
||||
alg->encrypt = qce_skcipher_encrypt;
|
||||
alg->decrypt = qce_skcipher_decrypt;
|
||||
|
||||
alg->base.cra_priority = 300;
|
||||
alg->base.cra_priority = 275;
|
||||
alg->base.cra_flags = CRYPTO_ALG_ASYNC |
|
||||
CRYPTO_ALG_ALLOCATES_MEMORY |
|
||||
CRYPTO_ALG_KERN_DRIVER_ONLY;
|
||||
|
||||
@@ -154,6 +154,12 @@ struct as73211_data {
|
||||
BIT(AS73211_SCAN_INDEX_TEMP) | \
|
||||
AS73211_SCAN_MASK_COLOR)
|
||||
|
||||
static const unsigned long as73211_scan_masks[] = {
|
||||
AS73211_SCAN_MASK_COLOR,
|
||||
AS73211_SCAN_MASK_ALL,
|
||||
0
|
||||
};
|
||||
|
||||
static const struct iio_chan_spec as73211_channels[] = {
|
||||
{
|
||||
.type = IIO_TEMP,
|
||||
@@ -602,9 +608,12 @@ static irqreturn_t as73211_trigger_handler(int irq __always_unused, void *p)
|
||||
|
||||
/* AS73211 starts reading at address 2 */
|
||||
ret = i2c_master_recv(data->client,
|
||||
(char *)&scan.chan[1], 3 * sizeof(scan.chan[1]));
|
||||
(char *)&scan.chan[0], 3 * sizeof(scan.chan[0]));
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
|
||||
/* Avoid pushing uninitialized data */
|
||||
scan.chan[3] = 0;
|
||||
}
|
||||
|
||||
if (data_result) {
|
||||
@@ -612,9 +621,15 @@ static irqreturn_t as73211_trigger_handler(int irq __always_unused, void *p)
|
||||
* Saturate all channels (in case of overflows). Temperature channel
|
||||
* is not affected by overflows.
|
||||
*/
|
||||
scan.chan[1] = cpu_to_le16(U16_MAX);
|
||||
scan.chan[2] = cpu_to_le16(U16_MAX);
|
||||
scan.chan[3] = cpu_to_le16(U16_MAX);
|
||||
if (*indio_dev->active_scan_mask == AS73211_SCAN_MASK_ALL) {
|
||||
scan.chan[1] = cpu_to_le16(U16_MAX);
|
||||
scan.chan[2] = cpu_to_le16(U16_MAX);
|
||||
scan.chan[3] = cpu_to_le16(U16_MAX);
|
||||
} else {
|
||||
scan.chan[0] = cpu_to_le16(U16_MAX);
|
||||
scan.chan[1] = cpu_to_le16(U16_MAX);
|
||||
scan.chan[2] = cpu_to_le16(U16_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
iio_push_to_buffers_with_timestamp(indio_dev, &scan, iio_get_time_ns(indio_dev));
|
||||
@@ -684,6 +699,7 @@ static int as73211_probe(struct i2c_client *client)
|
||||
indio_dev->channels = as73211_channels;
|
||||
indio_dev->num_channels = ARRAY_SIZE(as73211_channels);
|
||||
indio_dev->modes = INDIO_DIRECT_MODE;
|
||||
indio_dev->available_scan_masks = as73211_scan_masks;
|
||||
|
||||
ret = i2c_smbus_read_byte_data(data->client, AS73211_REG_OSR);
|
||||
if (ret < 0)
|
||||
|
||||
@@ -555,7 +555,8 @@ static void __exception_irq_entry aic_handle_fiq(struct pt_regs *regs)
|
||||
AIC_FIQ_HWIRQ(AIC_TMR_EL02_VIRT));
|
||||
}
|
||||
|
||||
if (read_sysreg_s(SYS_IMP_APL_PMCR0_EL1) & PMCR0_IACT) {
|
||||
if ((read_sysreg_s(SYS_IMP_APL_PMCR0_EL1) & (PMCR0_IMODE | PMCR0_IACT)) ==
|
||||
(FIELD_PREP(PMCR0_IMODE, PMCR0_IMODE_FIQ) | PMCR0_IACT)) {
|
||||
int irq;
|
||||
if (cpumask_test_cpu(smp_processor_id(),
|
||||
&aic_irqc->fiq_aff[AIC_CPU_PMU_P]->aff))
|
||||
|
||||
@@ -388,7 +388,6 @@ static void tegra_hsp_sm_recv32(struct tegra_hsp_channel *channel)
|
||||
value = tegra_hsp_channel_readl(channel, HSP_SM_SHRD_MBOX);
|
||||
value &= ~HSP_SM_SHRD_MBOX_FULL;
|
||||
msg = (void *)(unsigned long)value;
|
||||
mbox_chan_received_data(channel->chan, msg);
|
||||
|
||||
/*
|
||||
* Need to clear all bits here since some producers, such as TCU, depend
|
||||
@@ -398,6 +397,8 @@ static void tegra_hsp_sm_recv32(struct tegra_hsp_channel *channel)
|
||||
* explicitly, so we have to make sure we cover all possible cases.
|
||||
*/
|
||||
tegra_hsp_channel_writel(channel, 0x0, HSP_SM_SHRD_MBOX);
|
||||
|
||||
mbox_chan_received_data(channel->chan, msg);
|
||||
}
|
||||
|
||||
static const struct tegra_hsp_sm_ops tegra_hsp_sm_32bit_ops = {
|
||||
@@ -433,7 +434,6 @@ static void tegra_hsp_sm_recv128(struct tegra_hsp_channel *channel)
|
||||
value[3] = tegra_hsp_channel_readl(channel, HSP_SHRD_MBOX_TYPE1_DATA3);
|
||||
|
||||
msg = (void *)(unsigned long)value;
|
||||
mbox_chan_received_data(channel->chan, msg);
|
||||
|
||||
/*
|
||||
* Clear data registers and tag.
|
||||
@@ -443,6 +443,8 @@ static void tegra_hsp_sm_recv128(struct tegra_hsp_channel *channel)
|
||||
tegra_hsp_channel_writel(channel, 0x0, HSP_SHRD_MBOX_TYPE1_DATA2);
|
||||
tegra_hsp_channel_writel(channel, 0x0, HSP_SHRD_MBOX_TYPE1_DATA3);
|
||||
tegra_hsp_channel_writel(channel, 0x0, HSP_SHRD_MBOX_TYPE1_TAG);
|
||||
|
||||
mbox_chan_received_data(channel->chan, msg);
|
||||
}
|
||||
|
||||
static const struct tegra_hsp_sm_ops tegra_hsp_sm_128bit_ops = {
|
||||
|
||||
@@ -56,6 +56,7 @@ struct convert_context {
|
||||
struct bio *bio_out;
|
||||
struct bvec_iter iter_out;
|
||||
atomic_t cc_pending;
|
||||
unsigned int tag_offset;
|
||||
u64 cc_sector;
|
||||
union {
|
||||
struct skcipher_request *req;
|
||||
@@ -1223,6 +1224,7 @@ static void crypt_convert_init(struct crypt_config *cc,
|
||||
if (bio_out)
|
||||
ctx->iter_out = bio_out->bi_iter;
|
||||
ctx->cc_sector = sector + cc->iv_offset;
|
||||
ctx->tag_offset = 0;
|
||||
init_completion(&ctx->restart);
|
||||
}
|
||||
|
||||
@@ -1554,7 +1556,6 @@ static void crypt_free_req(struct crypt_config *cc, void *req, struct bio *base_
|
||||
static blk_status_t crypt_convert(struct crypt_config *cc,
|
||||
struct convert_context *ctx, bool atomic, bool reset_pending)
|
||||
{
|
||||
unsigned int tag_offset = 0;
|
||||
unsigned int sector_step = cc->sector_size >> SECTOR_SHIFT;
|
||||
int r;
|
||||
|
||||
@@ -1577,9 +1578,9 @@ static blk_status_t crypt_convert(struct crypt_config *cc,
|
||||
atomic_inc(&ctx->cc_pending);
|
||||
|
||||
if (crypt_integrity_aead(cc))
|
||||
r = crypt_convert_block_aead(cc, ctx, ctx->r.req_aead, tag_offset);
|
||||
r = crypt_convert_block_aead(cc, ctx, ctx->r.req_aead, ctx->tag_offset);
|
||||
else
|
||||
r = crypt_convert_block_skcipher(cc, ctx, ctx->r.req, tag_offset);
|
||||
r = crypt_convert_block_skcipher(cc, ctx, ctx->r.req, ctx->tag_offset);
|
||||
|
||||
switch (r) {
|
||||
/*
|
||||
@@ -1599,8 +1600,8 @@ static blk_status_t crypt_convert(struct crypt_config *cc,
|
||||
* exit and continue processing in a workqueue
|
||||
*/
|
||||
ctx->r.req = NULL;
|
||||
ctx->tag_offset++;
|
||||
ctx->cc_sector += sector_step;
|
||||
tag_offset++;
|
||||
return BLK_STS_DEV_RESOURCE;
|
||||
}
|
||||
} else {
|
||||
@@ -1614,8 +1615,8 @@ static blk_status_t crypt_convert(struct crypt_config *cc,
|
||||
*/
|
||||
case -EINPROGRESS:
|
||||
ctx->r.req = NULL;
|
||||
ctx->tag_offset++;
|
||||
ctx->cc_sector += sector_step;
|
||||
tag_offset++;
|
||||
continue;
|
||||
/*
|
||||
* The request was already processed (synchronously).
|
||||
@@ -1623,7 +1624,7 @@ static blk_status_t crypt_convert(struct crypt_config *cc,
|
||||
case 0:
|
||||
atomic_dec(&ctx->cc_pending);
|
||||
ctx->cc_sector += sector_step;
|
||||
tag_offset++;
|
||||
ctx->tag_offset++;
|
||||
if (!atomic)
|
||||
cond_resched();
|
||||
continue;
|
||||
@@ -2029,7 +2030,6 @@ static void kcryptd_crypt_write_continue(struct work_struct *work)
|
||||
struct crypt_config *cc = io->cc;
|
||||
struct convert_context *ctx = &io->ctx;
|
||||
int crypt_finished;
|
||||
sector_t sector = io->sector;
|
||||
blk_status_t r;
|
||||
|
||||
wait_for_completion(&ctx->restart);
|
||||
@@ -2046,10 +2046,8 @@ static void kcryptd_crypt_write_continue(struct work_struct *work)
|
||||
}
|
||||
|
||||
/* Encryption was already finished, submit io now */
|
||||
if (crypt_finished) {
|
||||
if (crypt_finished)
|
||||
kcryptd_crypt_write_io_submit(io, 0);
|
||||
io->sector = sector;
|
||||
}
|
||||
|
||||
crypt_dec_pending(io);
|
||||
}
|
||||
@@ -2060,14 +2058,13 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
|
||||
struct convert_context *ctx = &io->ctx;
|
||||
struct bio *clone;
|
||||
int crypt_finished;
|
||||
sector_t sector = io->sector;
|
||||
blk_status_t r;
|
||||
|
||||
/*
|
||||
* Prevent io from disappearing until this function completes.
|
||||
*/
|
||||
crypt_inc_pending(io);
|
||||
crypt_convert_init(cc, ctx, NULL, io->base_bio, sector);
|
||||
crypt_convert_init(cc, ctx, NULL, io->base_bio, io->sector);
|
||||
|
||||
clone = crypt_alloc_buffer(io, io->base_bio->bi_iter.bi_size);
|
||||
if (unlikely(!clone)) {
|
||||
@@ -2084,8 +2081,6 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
|
||||
io->ctx.iter_in = clone->bi_iter;
|
||||
}
|
||||
|
||||
sector += bio_sectors(clone);
|
||||
|
||||
crypt_inc_pending(io);
|
||||
r = crypt_convert(cc, ctx,
|
||||
test_bit(DM_CRYPT_NO_WRITE_WORKQUEUE, &cc->flags), true);
|
||||
@@ -2109,10 +2104,8 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
|
||||
}
|
||||
|
||||
/* Encryption was already finished, submit io now */
|
||||
if (crypt_finished) {
|
||||
if (crypt_finished)
|
||||
kcryptd_crypt_write_io_submit(io, 0);
|
||||
io->sector = sector;
|
||||
}
|
||||
|
||||
dec:
|
||||
crypt_dec_pending(io);
|
||||
|
||||
@@ -3649,15 +3649,15 @@ out_media_entity_cleanup:
|
||||
out_cleanup:
|
||||
ccs_cleanup(sensor);
|
||||
|
||||
out_free_ccs_limits:
|
||||
kfree(sensor->ccs_limits);
|
||||
|
||||
out_release_mdata:
|
||||
kvfree(sensor->mdata.backing);
|
||||
|
||||
out_release_sdata:
|
||||
kvfree(sensor->sdata.backing);
|
||||
|
||||
out_free_ccs_limits:
|
||||
kfree(sensor->ccs_limits);
|
||||
|
||||
out_power_off:
|
||||
ccs_power_off(&client->dev);
|
||||
mutex_destroy(&sensor->mutex);
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <linux/limits.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include "ccs-data-defs.h"
|
||||
|
||||
@@ -97,7 +98,7 @@ ccs_data_parse_length_specifier(const struct __ccs_data_length_specifier *__len,
|
||||
plen = ((size_t)
|
||||
(__len3->length[0] &
|
||||
((1 << CCS_DATA_LENGTH_SPECIFIER_SIZE_SHIFT) - 1))
|
||||
<< 16) + (__len3->length[0] << 8) + __len3->length[1];
|
||||
<< 16) + (__len3->length[1] << 8) + __len3->length[2];
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -948,15 +949,15 @@ int ccs_data_parse(struct ccs_data_container *ccsdata, const void *data,
|
||||
|
||||
rval = __ccs_data_parse(&bin, ccsdata, data, len, dev, verbose);
|
||||
if (rval)
|
||||
return rval;
|
||||
goto out_cleanup;
|
||||
|
||||
rval = bin_backing_alloc(&bin);
|
||||
if (rval)
|
||||
return rval;
|
||||
goto out_cleanup;
|
||||
|
||||
rval = __ccs_data_parse(&bin, ccsdata, data, len, dev, false);
|
||||
if (rval)
|
||||
goto out_free;
|
||||
goto out_cleanup;
|
||||
|
||||
if (verbose && ccsdata->version)
|
||||
print_ccs_data_version(dev, ccsdata->version);
|
||||
@@ -965,15 +966,16 @@ int ccs_data_parse(struct ccs_data_container *ccsdata, const void *data,
|
||||
rval = -EPROTO;
|
||||
dev_dbg(dev, "parsing mismatch; base %p; now %p; end %p\n",
|
||||
bin.base, bin.now, bin.end);
|
||||
goto out_free;
|
||||
goto out_cleanup;
|
||||
}
|
||||
|
||||
ccsdata->backing = bin.base;
|
||||
|
||||
return 0;
|
||||
|
||||
out_free:
|
||||
out_cleanup:
|
||||
kvfree(bin.base);
|
||||
memset(ccsdata, 0, sizeof(*ccsdata));
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
@@ -1971,6 +1971,7 @@ static int ov5640_get_light_freq(struct ov5640_dev *sensor)
|
||||
light_freq = 50;
|
||||
} else {
|
||||
/* 60Hz */
|
||||
light_freq = 60;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1531,10 +1531,8 @@ bool uvc_ctrl_status_event_async(struct urb *urb, struct uvc_video_chain *chain,
|
||||
struct uvc_device *dev = chain->dev;
|
||||
struct uvc_ctrl_work *w = &dev->async_ctrl;
|
||||
|
||||
if (list_empty(&ctrl->info.mappings)) {
|
||||
ctrl->handle = NULL;
|
||||
if (list_empty(&ctrl->info.mappings))
|
||||
return false;
|
||||
}
|
||||
|
||||
w->data = data;
|
||||
w->urb = urb;
|
||||
@@ -1564,13 +1562,13 @@ static void uvc_ctrl_send_events(struct uvc_fh *handle,
|
||||
{
|
||||
struct uvc_control_mapping *mapping;
|
||||
struct uvc_control *ctrl;
|
||||
u32 changes = V4L2_EVENT_CTRL_CH_VALUE;
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
|
||||
for (i = 0; i < xctrls_count; ++i) {
|
||||
ctrl = uvc_find_control(handle->chain, xctrls[i].id, &mapping);
|
||||
u32 changes = V4L2_EVENT_CTRL_CH_VALUE;
|
||||
|
||||
ctrl = uvc_find_control(handle->chain, xctrls[i].id, &mapping);
|
||||
if (ctrl->info.flags & UVC_CTRL_FLAG_ASYNCHRONOUS)
|
||||
/* Notification will be sent from an Interrupt event. */
|
||||
continue;
|
||||
|
||||
@@ -754,27 +754,14 @@ static const u8 uvc_media_transport_input_guid[16] =
|
||||
UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT;
|
||||
static const u8 uvc_processing_guid[16] = UVC_GUID_UVC_PROCESSING;
|
||||
|
||||
static struct uvc_entity *uvc_alloc_new_entity(struct uvc_device *dev, u16 type,
|
||||
u16 id, unsigned int num_pads,
|
||||
unsigned int extra_size)
|
||||
static struct uvc_entity *uvc_alloc_entity(u16 type, u16 id,
|
||||
unsigned int num_pads, unsigned int extra_size)
|
||||
{
|
||||
struct uvc_entity *entity;
|
||||
unsigned int num_inputs;
|
||||
unsigned int size;
|
||||
unsigned int i;
|
||||
|
||||
/* Per UVC 1.1+ spec 3.7.2, the ID should be non-zero. */
|
||||
if (id == 0) {
|
||||
dev_err(&dev->udev->dev, "Found Unit with invalid ID 0.\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
/* Per UVC 1.1+ spec 3.7.2, the ID is unique. */
|
||||
if (uvc_entity_by_id(dev, id)) {
|
||||
dev_err(&dev->udev->dev, "Found multiple Units with ID %u\n", id);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
extra_size = roundup(extra_size, sizeof(*entity->pads));
|
||||
if (num_pads)
|
||||
num_inputs = type & UVC_TERM_OUTPUT ? num_pads : num_pads - 1;
|
||||
@@ -784,7 +771,7 @@ static struct uvc_entity *uvc_alloc_new_entity(struct uvc_device *dev, u16 type,
|
||||
+ num_inputs;
|
||||
entity = kzalloc(size, GFP_KERNEL);
|
||||
if (entity == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
return NULL;
|
||||
|
||||
entity->id = id;
|
||||
entity->type = type;
|
||||
@@ -875,10 +862,10 @@ static int uvc_parse_vendor_control(struct uvc_device *dev,
|
||||
break;
|
||||
}
|
||||
|
||||
unit = uvc_alloc_new_entity(dev, UVC_VC_EXTENSION_UNIT,
|
||||
buffer[3], p + 1, 2 * n);
|
||||
if (IS_ERR(unit))
|
||||
return PTR_ERR(unit);
|
||||
unit = uvc_alloc_entity(UVC_VC_EXTENSION_UNIT, buffer[3],
|
||||
p + 1, 2*n);
|
||||
if (unit == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(unit->guid, &buffer[4], 16);
|
||||
unit->extension.bNumControls = buffer[20];
|
||||
@@ -988,10 +975,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
term = uvc_alloc_new_entity(dev, type | UVC_TERM_INPUT,
|
||||
buffer[3], 1, n + p);
|
||||
if (IS_ERR(term))
|
||||
return PTR_ERR(term);
|
||||
term = uvc_alloc_entity(type | UVC_TERM_INPUT, buffer[3],
|
||||
1, n + p);
|
||||
if (term == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (UVC_ENTITY_TYPE(term) == UVC_ITT_CAMERA) {
|
||||
term->camera.bControlSize = n;
|
||||
@@ -1048,10 +1035,10 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
term = uvc_alloc_new_entity(dev, type | UVC_TERM_OUTPUT,
|
||||
buffer[3], 1, 0);
|
||||
if (IS_ERR(term))
|
||||
return PTR_ERR(term);
|
||||
term = uvc_alloc_entity(type | UVC_TERM_OUTPUT, buffer[3],
|
||||
1, 0);
|
||||
if (term == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(term->baSourceID, &buffer[7], 1);
|
||||
|
||||
@@ -1072,10 +1059,9 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
unit = uvc_alloc_new_entity(dev, buffer[2], buffer[3],
|
||||
p + 1, 0);
|
||||
if (IS_ERR(unit))
|
||||
return PTR_ERR(unit);
|
||||
unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, 0);
|
||||
if (unit == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(unit->baSourceID, &buffer[5], p);
|
||||
|
||||
@@ -1097,9 +1083,9 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
unit = uvc_alloc_new_entity(dev, buffer[2], buffer[3], 2, n);
|
||||
if (IS_ERR(unit))
|
||||
return PTR_ERR(unit);
|
||||
unit = uvc_alloc_entity(buffer[2], buffer[3], 2, n);
|
||||
if (unit == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(unit->baSourceID, &buffer[4], 1);
|
||||
unit->processing.wMaxMultiplier =
|
||||
@@ -1128,10 +1114,9 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
unit = uvc_alloc_new_entity(dev, buffer[2], buffer[3],
|
||||
p + 1, n);
|
||||
if (IS_ERR(unit))
|
||||
return PTR_ERR(unit);
|
||||
unit = uvc_alloc_entity(buffer[2], buffer[3], p + 1, n);
|
||||
if (unit == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(unit->guid, &buffer[4], 16);
|
||||
unit->extension.bNumControls = buffer[20];
|
||||
@@ -1275,10 +1260,9 @@ static int uvc_gpio_parse(struct uvc_device *dev)
|
||||
return irq;
|
||||
}
|
||||
|
||||
unit = uvc_alloc_new_entity(dev, UVC_EXT_GPIO_UNIT,
|
||||
UVC_EXT_GPIO_UNIT_ID, 0, 1);
|
||||
if (IS_ERR(unit))
|
||||
return PTR_ERR(unit);
|
||||
unit = uvc_alloc_entity(UVC_EXT_GPIO_UNIT, UVC_EXT_GPIO_UNIT_ID, 0, 1);
|
||||
if (!unit)
|
||||
return -ENOMEM;
|
||||
|
||||
unit->gpio.gpio_privacy = gpio_privacy;
|
||||
unit->gpio.irq = irq;
|
||||
|
||||
@@ -321,7 +321,7 @@ int v4l2_create_fwnode_links_to_pad(struct v4l2_subdev *src_sd,
|
||||
|
||||
sink_sd = media_entity_to_v4l2_subdev(sink->entity);
|
||||
|
||||
fwnode_graph_for_each_endpoint(dev_fwnode(src_sd->dev), endpoint) {
|
||||
fwnode_graph_for_each_endpoint(src_sd->fwnode, endpoint) {
|
||||
struct fwnode_handle *remote_ep;
|
||||
int src_idx, sink_idx, ret;
|
||||
struct media_pad *src;
|
||||
|
||||
@@ -932,7 +932,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
|
||||
mmap_read_lock(current->mm);
|
||||
vma = find_vma(current->mm, ctx->args[i].ptr);
|
||||
if (vma)
|
||||
pages[i].addr += ctx->args[i].ptr -
|
||||
pages[i].addr += (ctx->args[i].ptr & PAGE_MASK) -
|
||||
vma->vm_start;
|
||||
mmap_read_unlock(current->mm);
|
||||
|
||||
@@ -959,8 +959,8 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
|
||||
(pkt_size - rlen);
|
||||
pages[i].addr = pages[i].addr & PAGE_MASK;
|
||||
|
||||
pg_start = (args & PAGE_MASK) >> PAGE_SHIFT;
|
||||
pg_end = ((args + len - 1) & PAGE_MASK) >> PAGE_SHIFT;
|
||||
pg_start = (rpra[i].buf.pv & PAGE_MASK) >> PAGE_SHIFT;
|
||||
pg_end = ((rpra[i].buf.pv + len - 1) & PAGE_MASK) >> PAGE_SHIFT;
|
||||
pages[i].size = (pg_end - pg_start + 1) * PAGE_SIZE;
|
||||
args = args + mlen;
|
||||
rlen -= mlen;
|
||||
@@ -2117,7 +2117,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
|
||||
|
||||
err = fastrpc_device_register(rdev, data, false, domains[domain_id]);
|
||||
if (err)
|
||||
goto fdev_error;
|
||||
goto populate_error;
|
||||
break;
|
||||
default:
|
||||
err = -EINVAL;
|
||||
|
||||
@@ -2923,6 +2923,7 @@ static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
ret = ONENAND_IS_4KB_PAGE(this) ?
|
||||
onenand_mlc_read_ops_nolock(mtd, from, &ops) :
|
||||
onenand_read_ops_nolock(mtd, from, &ops);
|
||||
*retlen = ops.retlen;
|
||||
|
||||
/* Exit OTP access mode */
|
||||
this->command(mtd, ONENAND_CMD_RESET, 0, 0);
|
||||
|
||||
@@ -3104,7 +3104,9 @@ static unsigned long check_vendor_combination_bug(struct pci_dev *pdev)
|
||||
* because of high power consumption (> 2 Watt) in s2idle
|
||||
* sleep. Only some boards with Intel CPU are affected.
|
||||
*/
|
||||
if (dmi_match(DMI_BOARD_NAME, "GMxPXxx") ||
|
||||
if (dmi_match(DMI_BOARD_NAME, "DN50Z-140HC-YD") ||
|
||||
dmi_match(DMI_BOARD_NAME, "GMxPXxx") ||
|
||||
dmi_match(DMI_BOARD_NAME, "GXxMRXx") ||
|
||||
dmi_match(DMI_BOARD_NAME, "PH4PG31") ||
|
||||
dmi_match(DMI_BOARD_NAME, "PH4PRX1_PH6PRX1") ||
|
||||
dmi_match(DMI_BOARD_NAME, "PH6PG01_PH6PG71"))
|
||||
|
||||
@@ -1532,6 +1532,8 @@ static int __nvmem_cell_entry_write(struct nvmem_cell_entry *cell, void *buf, si
|
||||
return -EINVAL;
|
||||
|
||||
if (cell->bit_offset || cell->nbits) {
|
||||
if (len != BITS_TO_BYTES(cell->nbits) && len != cell->bytes)
|
||||
return -EINVAL;
|
||||
buf = nvmem_cell_prepare_write_buffer(cell, buf, len);
|
||||
if (IS_ERR(buf))
|
||||
return PTR_ERR(buf);
|
||||
|
||||
@@ -143,6 +143,7 @@ static int sdam_probe(struct platform_device *pdev)
|
||||
sdam->sdam_config.id = NVMEM_DEVID_AUTO;
|
||||
sdam->sdam_config.owner = THIS_MODULE;
|
||||
sdam->sdam_config.stride = 1;
|
||||
sdam->sdam_config.size = sdam->size;
|
||||
sdam->sdam_config.word_size = 1;
|
||||
sdam->sdam_config.reg_read = sdam_read;
|
||||
sdam->sdam_config.reg_write = sdam_write;
|
||||
|
||||
@@ -234,6 +234,7 @@ void pci_epf_remove_vepf(struct pci_epf *epf_pf, struct pci_epf *epf_vf)
|
||||
|
||||
mutex_lock(&epf_pf->lock);
|
||||
clear_bit(epf_vf->vfunc_no, &epf_pf->vfunction_num_map);
|
||||
epf_vf->epf_pf = NULL;
|
||||
list_del(&epf_vf->list);
|
||||
mutex_unlock(&epf_pf->lock);
|
||||
}
|
||||
|
||||
@@ -4043,6 +4043,8 @@ struct qla_hw_data {
|
||||
uint32_t npiv_supported :1;
|
||||
uint32_t pci_channel_io_perm_failure :1;
|
||||
uint32_t fce_enabled :1;
|
||||
uint32_t user_enabled_fce :1;
|
||||
uint32_t fce_dump_buf_alloced :1;
|
||||
uint32_t fac_supported :1;
|
||||
|
||||
uint32_t chip_reset_done :1;
|
||||
|
||||
@@ -409,27 +409,32 @@ qla2x00_dfs_fce_show(struct seq_file *s, void *unused)
|
||||
|
||||
mutex_lock(&ha->fce_mutex);
|
||||
|
||||
seq_puts(s, "FCE Trace Buffer\n");
|
||||
seq_printf(s, "In Pointer = %llx\n\n", (unsigned long long)ha->fce_wr);
|
||||
seq_printf(s, "Base = %llx\n\n", (unsigned long long) ha->fce_dma);
|
||||
seq_puts(s, "FCE Enable Registers\n");
|
||||
seq_printf(s, "%08x %08x %08x %08x %08x %08x\n",
|
||||
ha->fce_mb[0], ha->fce_mb[2], ha->fce_mb[3], ha->fce_mb[4],
|
||||
ha->fce_mb[5], ha->fce_mb[6]);
|
||||
if (ha->flags.user_enabled_fce) {
|
||||
seq_puts(s, "FCE Trace Buffer\n");
|
||||
seq_printf(s, "In Pointer = %llx\n\n", (unsigned long long)ha->fce_wr);
|
||||
seq_printf(s, "Base = %llx\n\n", (unsigned long long)ha->fce_dma);
|
||||
seq_puts(s, "FCE Enable Registers\n");
|
||||
seq_printf(s, "%08x %08x %08x %08x %08x %08x\n",
|
||||
ha->fce_mb[0], ha->fce_mb[2], ha->fce_mb[3], ha->fce_mb[4],
|
||||
ha->fce_mb[5], ha->fce_mb[6]);
|
||||
|
||||
fce = (uint32_t *) ha->fce;
|
||||
fce_start = (unsigned long long) ha->fce_dma;
|
||||
for (cnt = 0; cnt < fce_calc_size(ha->fce_bufs) / 4; cnt++) {
|
||||
if (cnt % 8 == 0)
|
||||
seq_printf(s, "\n%llx: ",
|
||||
(unsigned long long)((cnt * 4) + fce_start));
|
||||
else
|
||||
seq_putc(s, ' ');
|
||||
seq_printf(s, "%08x", *fce++);
|
||||
fce = (uint32_t *)ha->fce;
|
||||
fce_start = (unsigned long long)ha->fce_dma;
|
||||
for (cnt = 0; cnt < fce_calc_size(ha->fce_bufs) / 4; cnt++) {
|
||||
if (cnt % 8 == 0)
|
||||
seq_printf(s, "\n%llx: ",
|
||||
(unsigned long long)((cnt * 4) + fce_start));
|
||||
else
|
||||
seq_putc(s, ' ');
|
||||
seq_printf(s, "%08x", *fce++);
|
||||
}
|
||||
|
||||
seq_puts(s, "\nEnd\n");
|
||||
} else {
|
||||
seq_puts(s, "FCE Trace is currently not enabled\n");
|
||||
seq_puts(s, "\techo [ 1 | 0 ] > fce\n");
|
||||
}
|
||||
|
||||
seq_puts(s, "\nEnd\n");
|
||||
|
||||
mutex_unlock(&ha->fce_mutex);
|
||||
|
||||
return 0;
|
||||
@@ -467,7 +472,7 @@ qla2x00_dfs_fce_release(struct inode *inode, struct file *file)
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
int rval;
|
||||
|
||||
if (ha->flags.fce_enabled)
|
||||
if (ha->flags.fce_enabled || !ha->fce)
|
||||
goto out;
|
||||
|
||||
mutex_lock(&ha->fce_mutex);
|
||||
@@ -488,11 +493,88 @@ out:
|
||||
return single_release(inode, file);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
qla2x00_dfs_fce_write(struct file *file, const char __user *buffer,
|
||||
size_t count, loff_t *pos)
|
||||
{
|
||||
struct seq_file *s = file->private_data;
|
||||
struct scsi_qla_host *vha = s->private;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
char *buf;
|
||||
int rc = 0;
|
||||
unsigned long enable;
|
||||
|
||||
if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
|
||||
!IS_QLA27XX(ha) && !IS_QLA28XX(ha)) {
|
||||
ql_dbg(ql_dbg_user, vha, 0xd034,
|
||||
"this adapter does not support FCE.");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buf = memdup_user_nul(buffer, count);
|
||||
if (IS_ERR(buf)) {
|
||||
ql_dbg(ql_dbg_user, vha, 0xd037,
|
||||
"fail to copy user buffer.");
|
||||
return PTR_ERR(buf);
|
||||
}
|
||||
|
||||
enable = kstrtoul(buf, 0, 0);
|
||||
rc = count;
|
||||
|
||||
mutex_lock(&ha->fce_mutex);
|
||||
|
||||
if (enable) {
|
||||
if (ha->flags.user_enabled_fce) {
|
||||
mutex_unlock(&ha->fce_mutex);
|
||||
goto out_free;
|
||||
}
|
||||
ha->flags.user_enabled_fce = 1;
|
||||
if (!ha->fce) {
|
||||
rc = qla2x00_alloc_fce_trace(vha);
|
||||
if (rc) {
|
||||
ha->flags.user_enabled_fce = 0;
|
||||
mutex_unlock(&ha->fce_mutex);
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
/* adjust fw dump buffer to take into account of this feature */
|
||||
if (!ha->flags.fce_dump_buf_alloced)
|
||||
qla2x00_alloc_fw_dump(vha);
|
||||
}
|
||||
|
||||
if (!ha->flags.fce_enabled)
|
||||
qla_enable_fce_trace(vha);
|
||||
|
||||
ql_dbg(ql_dbg_user, vha, 0xd045, "User enabled FCE .\n");
|
||||
} else {
|
||||
if (!ha->flags.user_enabled_fce) {
|
||||
mutex_unlock(&ha->fce_mutex);
|
||||
goto out_free;
|
||||
}
|
||||
ha->flags.user_enabled_fce = 0;
|
||||
if (ha->flags.fce_enabled) {
|
||||
qla2x00_disable_fce_trace(vha, NULL, NULL);
|
||||
ha->flags.fce_enabled = 0;
|
||||
}
|
||||
|
||||
qla2x00_free_fce_trace(ha);
|
||||
/* no need to re-adjust fw dump buffer */
|
||||
|
||||
ql_dbg(ql_dbg_user, vha, 0xd04f, "User disabled FCE .\n");
|
||||
}
|
||||
|
||||
mutex_unlock(&ha->fce_mutex);
|
||||
out_free:
|
||||
kfree(buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static const struct file_operations dfs_fce_ops = {
|
||||
.open = qla2x00_dfs_fce_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = qla2x00_dfs_fce_release,
|
||||
.write = qla2x00_dfs_fce_write,
|
||||
};
|
||||
|
||||
static int
|
||||
@@ -671,8 +753,6 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha)
|
||||
if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
|
||||
!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
|
||||
goto out;
|
||||
if (!ha->fce)
|
||||
goto out;
|
||||
|
||||
if (qla2x00_dfs_root)
|
||||
goto create_dir;
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
/*
|
||||
* Global Function Prototypes in qla_init.c source file.
|
||||
*/
|
||||
int qla2x00_alloc_fce_trace(scsi_qla_host_t *);
|
||||
void qla2x00_free_fce_trace(struct qla_hw_data *ha);
|
||||
void qla_enable_fce_trace(scsi_qla_host_t *);
|
||||
extern int qla2x00_initialize_adapter(scsi_qla_host_t *);
|
||||
extern int qla24xx_post_prli_work(struct scsi_qla_host *vha, fc_port_t *fcport);
|
||||
|
||||
|
||||
@@ -2682,7 +2682,7 @@ exit:
|
||||
return rval;
|
||||
}
|
||||
|
||||
static void qla_enable_fce_trace(scsi_qla_host_t *vha)
|
||||
void qla_enable_fce_trace(scsi_qla_host_t *vha)
|
||||
{
|
||||
int rval;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
@@ -3718,25 +3718,24 @@ qla24xx_chip_diag(scsi_qla_host_t *vha)
|
||||
return rval;
|
||||
}
|
||||
|
||||
static void
|
||||
qla2x00_alloc_fce_trace(scsi_qla_host_t *vha)
|
||||
int qla2x00_alloc_fce_trace(scsi_qla_host_t *vha)
|
||||
{
|
||||
dma_addr_t tc_dma;
|
||||
void *tc;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (!IS_FWI2_CAPABLE(ha))
|
||||
return;
|
||||
return -EINVAL;
|
||||
|
||||
if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
|
||||
!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
|
||||
return;
|
||||
return -EINVAL;
|
||||
|
||||
if (ha->fce) {
|
||||
ql_dbg(ql_dbg_init, vha, 0x00bd,
|
||||
"%s: FCE Mem is already allocated.\n",
|
||||
__func__);
|
||||
return;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* Allocate memory for Fibre Channel Event Buffer. */
|
||||
@@ -3746,7 +3745,7 @@ qla2x00_alloc_fce_trace(scsi_qla_host_t *vha)
|
||||
ql_log(ql_log_warn, vha, 0x00be,
|
||||
"Unable to allocate (%d KB) for FCE.\n",
|
||||
FCE_SIZE / 1024);
|
||||
return;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ql_dbg(ql_dbg_init, vha, 0x00c0,
|
||||
@@ -3755,6 +3754,16 @@ qla2x00_alloc_fce_trace(scsi_qla_host_t *vha)
|
||||
ha->fce_dma = tc_dma;
|
||||
ha->fce = tc;
|
||||
ha->fce_bufs = FCE_NUM_BUFFERS;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void qla2x00_free_fce_trace(struct qla_hw_data *ha)
|
||||
{
|
||||
if (!ha->fce)
|
||||
return;
|
||||
dma_free_coherent(&ha->pdev->dev, FCE_SIZE, ha->fce, ha->fce_dma);
|
||||
ha->fce = NULL;
|
||||
ha->fce_dma = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -3845,9 +3854,10 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
|
||||
if (ha->tgt.atio_ring)
|
||||
mq_size += ha->tgt.atio_q_length * sizeof(request_t);
|
||||
|
||||
qla2x00_alloc_fce_trace(vha);
|
||||
if (ha->fce)
|
||||
if (ha->fce) {
|
||||
fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
|
||||
ha->flags.fce_dump_buf_alloced = 1;
|
||||
}
|
||||
qla2x00_alloc_eft_trace(vha);
|
||||
if (ha->eft)
|
||||
eft_size = EFT_SIZE;
|
||||
|
||||
@@ -1791,6 +1791,7 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd)
|
||||
|
||||
length = scsi_bufflen(scmnd);
|
||||
payload = (struct vmbus_packet_mpb_array *)&cmd_request->mpb;
|
||||
payload->range.len = 0;
|
||||
payload_sz = 0;
|
||||
|
||||
if (scsi_sg_count(scmnd)) {
|
||||
|
||||
@@ -116,7 +116,8 @@ struct qcom_smem_state *qcom_smem_state_get(struct device *dev,
|
||||
|
||||
if (args.args_count != 1) {
|
||||
dev_err(dev, "invalid #qcom,smem-state-cells\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
state = ERR_PTR(-EINVAL);
|
||||
goto put;
|
||||
}
|
||||
|
||||
state = of_node_to_state(args.np);
|
||||
|
||||
@@ -652,7 +652,7 @@ static int qcom_socinfo_probe(struct platform_device *pdev)
|
||||
if (!qs->attr.soc_id || !qs->attr.revision)
|
||||
return -ENOMEM;
|
||||
|
||||
if (offsetof(struct socinfo, serial_num) <= item_size) {
|
||||
if (offsetofend(struct socinfo, serial_num) <= item_size) {
|
||||
qs->attr.serial_number = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||
"%u",
|
||||
le32_to_cpu(info->serial_num));
|
||||
|
||||
@@ -165,6 +165,7 @@ struct sci_port {
|
||||
static struct sci_port sci_ports[SCI_NPORTS];
|
||||
static unsigned long sci_ports_in_use;
|
||||
static struct uart_driver sci_uart_driver;
|
||||
static bool sci_uart_earlycon;
|
||||
|
||||
static inline struct sci_port *
|
||||
to_sci_port(struct uart_port *uart)
|
||||
@@ -3318,6 +3319,7 @@ static int sci_probe_single(struct platform_device *dev,
|
||||
static int sci_probe(struct platform_device *dev)
|
||||
{
|
||||
struct plat_sci_port *p;
|
||||
struct resource *res;
|
||||
struct sci_port *sp;
|
||||
unsigned int dev_id;
|
||||
int ret;
|
||||
@@ -3347,6 +3349,26 @@ static int sci_probe(struct platform_device *dev)
|
||||
}
|
||||
|
||||
sp = &sci_ports[dev_id];
|
||||
|
||||
/*
|
||||
* In case:
|
||||
* - the probed port alias is zero (as the one used by earlycon), and
|
||||
* - the earlycon is still active (e.g., "earlycon keep_bootcon" in
|
||||
* bootargs)
|
||||
*
|
||||
* defer the probe of this serial. This is a debug scenario and the user
|
||||
* must be aware of it.
|
||||
*
|
||||
* Except when the probed port is the same as the earlycon port.
|
||||
*/
|
||||
|
||||
res = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
||||
if (!res)
|
||||
return -ENODEV;
|
||||
|
||||
if (sci_uart_earlycon && sp == &sci_ports[0] && sp->port.mapbase != res->start)
|
||||
return dev_err_probe(&dev->dev, -EBUSY, "sci_port[0] is used by earlycon!\n");
|
||||
|
||||
platform_set_drvdata(dev, sp);
|
||||
|
||||
ret = sci_probe_single(dev, dev_id, p, sp);
|
||||
@@ -3430,7 +3452,7 @@ sh_early_platform_init_buffer("earlyprintk", &sci_driver,
|
||||
early_serial_buf, ARRAY_SIZE(early_serial_buf));
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_SH_SCI_EARLYCON
|
||||
static struct plat_sci_port port_cfg __initdata;
|
||||
static struct plat_sci_port port_cfg;
|
||||
|
||||
static int __init early_console_setup(struct earlycon_device *device,
|
||||
int type)
|
||||
@@ -3445,6 +3467,7 @@ static int __init early_console_setup(struct earlycon_device *device,
|
||||
port_cfg.type = type;
|
||||
sci_ports[0].cfg = &port_cfg;
|
||||
sci_ports[0].params = sci_probe_regmap(&port_cfg);
|
||||
sci_uart_earlycon = true;
|
||||
port_cfg.scscr = sci_serial_in(&sci_ports[0].port, SCSCR);
|
||||
sci_serial_out(&sci_ports[0].port, SCSCR,
|
||||
SCSCR_RE | SCSCR_TE | port_cfg.scscr);
|
||||
|
||||
@@ -396,6 +396,11 @@ static ssize_t vfio_platform_read_mmio(struct vfio_platform_region *reg,
|
||||
|
||||
count = min_t(size_t, count, reg->size - off);
|
||||
|
||||
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);
|
||||
@@ -480,6 +485,11 @@ static ssize_t vfio_platform_write_mmio(struct vfio_platform_region *reg,
|
||||
|
||||
count = min_t(size_t, count, reg->size - off);
|
||||
|
||||
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);
|
||||
|
||||
@@ -839,6 +839,9 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
|
||||
struct nfs4_pnfs_ds *ds;
|
||||
u32 ds_idx;
|
||||
|
||||
if (NFS_SERVER(pgio->pg_inode)->flags &
|
||||
(NFS_MOUNT_SOFT|NFS_MOUNT_SOFTERR))
|
||||
pgio->pg_maxretrans = io_maxretrans;
|
||||
retry:
|
||||
ff_layout_pg_check_layout(pgio, req);
|
||||
/* Use full layout for now */
|
||||
@@ -852,6 +855,8 @@ retry:
|
||||
if (!pgio->pg_lseg)
|
||||
goto out_nolseg;
|
||||
}
|
||||
/* Reset wb_nio, since getting layout segment was successful */
|
||||
req->wb_nio = 0;
|
||||
|
||||
ds = ff_layout_get_ds_for_read(pgio, &ds_idx);
|
||||
if (!ds) {
|
||||
@@ -868,14 +873,24 @@ retry:
|
||||
pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].rsize;
|
||||
|
||||
pgio->pg_mirror_idx = ds_idx;
|
||||
|
||||
if (NFS_SERVER(pgio->pg_inode)->flags &
|
||||
(NFS_MOUNT_SOFT|NFS_MOUNT_SOFTERR))
|
||||
pgio->pg_maxretrans = io_maxretrans;
|
||||
return;
|
||||
out_nolseg:
|
||||
if (pgio->pg_error < 0)
|
||||
return;
|
||||
if (pgio->pg_error < 0) {
|
||||
if (pgio->pg_error != -EAGAIN)
|
||||
return;
|
||||
/* Retry getting layout segment if lower layer returned -EAGAIN */
|
||||
if (pgio->pg_maxretrans && req->wb_nio++ > pgio->pg_maxretrans) {
|
||||
if (NFS_SERVER(pgio->pg_inode)->flags & NFS_MOUNT_SOFTERR)
|
||||
pgio->pg_error = -ETIMEDOUT;
|
||||
else
|
||||
pgio->pg_error = -EIO;
|
||||
return;
|
||||
}
|
||||
pgio->pg_error = 0;
|
||||
/* Sleep for 1 second before retrying */
|
||||
ssleep(1);
|
||||
goto retry;
|
||||
}
|
||||
out_mds:
|
||||
trace_pnfs_mds_fallback_pg_init_read(pgio->pg_inode,
|
||||
0, NFS4_MAX_UINT64, IOMODE_READ,
|
||||
|
||||
@@ -1267,7 +1267,7 @@ int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
if (size) {
|
||||
if (phys && blkphy << blkbits == phys + size) {
|
||||
/* The current extent goes on */
|
||||
size += n << blkbits;
|
||||
size += (u64)n << blkbits;
|
||||
} else {
|
||||
/* Terminate the current extent */
|
||||
ret = fiemap_fill_next_extent(
|
||||
@@ -1280,14 +1280,14 @@ int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
flags = FIEMAP_EXTENT_MERGED;
|
||||
logical = blkoff << blkbits;
|
||||
phys = blkphy << blkbits;
|
||||
size = n << blkbits;
|
||||
size = (u64)n << blkbits;
|
||||
}
|
||||
} else {
|
||||
/* Start a new extent */
|
||||
flags = FIEMAP_EXTENT_MERGED;
|
||||
logical = blkoff << blkbits;
|
||||
phys = blkphy << blkbits;
|
||||
size = n << blkbits;
|
||||
size = (u64)n << blkbits;
|
||||
}
|
||||
blkoff += n;
|
||||
}
|
||||
|
||||
@@ -2344,7 +2344,7 @@ static int ocfs2_verify_volume(struct ocfs2_dinode *di,
|
||||
mlog(ML_ERROR, "found superblock with incorrect block "
|
||||
"size bits: found %u, should be 9, 10, 11, or 12\n",
|
||||
blksz_bits);
|
||||
} else if ((1 << le32_to_cpu(blksz_bits)) != blksz) {
|
||||
} else if ((1 << blksz_bits) != blksz) {
|
||||
mlog(ML_ERROR, "found superblock with incorrect block "
|
||||
"size: found %u, should be %u\n", 1 << blksz_bits, blksz);
|
||||
} else if (le16_to_cpu(di->id2.i_super.s_major_rev_level) !=
|
||||
|
||||
@@ -65,7 +65,7 @@ static int ocfs2_fast_symlink_read_folio(struct file *f, struct folio *folio)
|
||||
|
||||
if (status < 0) {
|
||||
mlog_errno(status);
|
||||
return status;
|
||||
goto out;
|
||||
}
|
||||
|
||||
fe = (struct ocfs2_dinode *) bh->b_data;
|
||||
@@ -76,9 +76,10 @@ static int ocfs2_fast_symlink_read_folio(struct file *f, struct folio *folio)
|
||||
memcpy(kaddr, link, len + 1);
|
||||
kunmap_atomic(kaddr);
|
||||
SetPageUptodate(page);
|
||||
out:
|
||||
unlock_page(page);
|
||||
brelse(bh);
|
||||
return 0;
|
||||
return status;
|
||||
}
|
||||
|
||||
const struct address_space_operations ocfs2_fast_symlink_aops = {
|
||||
|
||||
@@ -1726,8 +1726,11 @@ xfs_inactive(
|
||||
goto out;
|
||||
|
||||
/* Try to clean out the cow blocks if there are any. */
|
||||
if (xfs_inode_has_cow_data(ip))
|
||||
xfs_reflink_cancel_cow_range(ip, 0, NULLFILEOFF, true);
|
||||
if (xfs_inode_has_cow_data(ip)) {
|
||||
error = xfs_reflink_cancel_cow_range(ip, 0, NULLFILEOFF, true);
|
||||
if (error)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (VFS_I(ip)->i_nlink != 0) {
|
||||
/*
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <rv/automata.h>
|
||||
#include <linux/rv.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#ifdef CONFIG_RV_REACTORS
|
||||
|
||||
@@ -324,10 +325,13 @@ static inline struct da_monitor *da_get_monitor_##name(struct task_struct *tsk)
|
||||
static void da_monitor_reset_all_##name(void) \
|
||||
{ \
|
||||
struct task_struct *g, *p; \
|
||||
int cpu; \
|
||||
\
|
||||
read_lock(&tasklist_lock); \
|
||||
for_each_process_thread(g, p) \
|
||||
da_monitor_reset_##name(da_get_monitor_##name(p)); \
|
||||
for_each_present_cpu(cpu) \
|
||||
da_monitor_reset_##name(da_get_monitor_##name(idle_task(cpu))); \
|
||||
read_unlock(&tasklist_lock); \
|
||||
} \
|
||||
\
|
||||
|
||||
@@ -1486,6 +1486,11 @@ int io_connect(struct io_kiocb *req, unsigned int issue_flags)
|
||||
io = &__io;
|
||||
}
|
||||
|
||||
if (unlikely(req->flags & REQ_F_FAIL)) {
|
||||
ret = -ECONNRESET;
|
||||
goto out;
|
||||
}
|
||||
|
||||
file_flags = force_nonblock ? O_NONBLOCK : 0;
|
||||
|
||||
ret = __sys_connect_file(req->file, &io->address,
|
||||
|
||||
@@ -288,6 +288,8 @@ static int io_poll_check_events(struct io_kiocb *req, bool *locked)
|
||||
return IOU_POLL_REISSUE;
|
||||
}
|
||||
}
|
||||
if (unlikely(req->cqe.res & EPOLLERR))
|
||||
req_set_fail(req);
|
||||
if (req->apoll_events & EPOLLONESHOT)
|
||||
return IOU_POLL_DONE;
|
||||
if (io_is_uring_fops(req->file))
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/log2.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/panic_notifier.h>
|
||||
#include <linux/random.h>
|
||||
@@ -997,6 +998,7 @@ void *__kfence_alloc(struct kmem_cache *s, size_t size, gfp_t flags)
|
||||
* properties (e.g. reside in DMAable memory).
|
||||
*/
|
||||
if ((flags & GFP_ZONEMASK) ||
|
||||
((flags & __GFP_THISNODE) && num_online_nodes() > 1) ||
|
||||
(s->flags & (SLAB_CACHE_DMA | SLAB_CACHE_DMA32))) {
|
||||
atomic_long_inc(&counters[KFENCE_COUNTER_SKIP_INCOMPAT]);
|
||||
return NULL;
|
||||
|
||||
@@ -1543,7 +1543,7 @@ static void kmemleak_scan(void)
|
||||
unsigned long phys = object->pointer;
|
||||
|
||||
if (PHYS_PFN(phys) < min_low_pfn ||
|
||||
PHYS_PFN(phys + object->size) >= max_low_pfn)
|
||||
PHYS_PFN(phys + object->size) > max_low_pfn)
|
||||
__paint_it(object, KMEMLEAK_BLACK);
|
||||
}
|
||||
|
||||
|
||||
@@ -540,6 +540,8 @@ static u8 nci_hci_create_pipe(struct nci_dev *ndev, u8 dest_host,
|
||||
|
||||
pr_debug("pipe created=%d\n", pipe);
|
||||
|
||||
if (pipe >= NCI_HCI_MAX_PIPES)
|
||||
pipe = NCI_HCI_INVALID_PIPE;
|
||||
return pipe;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,10 @@ KBUILD_CFLAGS += -Wno-sign-compare
|
||||
KBUILD_CFLAGS += -Wno-type-limits
|
||||
KBUILD_CFLAGS += -Wno-shift-negative-value
|
||||
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
KBUILD_CFLAGS += -Wno-enum-enum-conversion
|
||||
endif
|
||||
|
||||
KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN1
|
||||
|
||||
else
|
||||
@@ -66,7 +70,6 @@ KBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, cast-function-type-strict)
|
||||
KBUILD_CFLAGS += -Wno-enum-compare-conditional
|
||||
KBUILD_CFLAGS += -Wno-enum-enum-conversion
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
@@ -80,7 +80,11 @@ static int compare_input_type(const void *ap, const void *bp)
|
||||
|
||||
/* In case one has boost and the other one has not,
|
||||
pick the one with boost first. */
|
||||
return (int)(b->has_boost_on_pin - a->has_boost_on_pin);
|
||||
if (a->has_boost_on_pin != b->has_boost_on_pin)
|
||||
return (int)(b->has_boost_on_pin - a->has_boost_on_pin);
|
||||
|
||||
/* Keep the original order */
|
||||
return a->order - b->order;
|
||||
}
|
||||
|
||||
/* Reorder the surround channels
|
||||
@@ -400,6 +404,8 @@ int snd_hda_parse_pin_defcfg(struct hda_codec *codec,
|
||||
reorder_outputs(cfg->speaker_outs, cfg->speaker_pins);
|
||||
|
||||
/* sort inputs in the order of AUTO_PIN_* type */
|
||||
for (i = 0; i < cfg->num_inputs; i++)
|
||||
cfg->inputs[i].order = i;
|
||||
sort(cfg->inputs, cfg->num_inputs, sizeof(cfg->inputs[0]),
|
||||
compare_input_type, NULL);
|
||||
|
||||
|
||||
@@ -35,6 +35,7 @@ struct auto_pin_cfg_item {
|
||||
unsigned int is_headset_mic:1;
|
||||
unsigned int is_headphone_mic:1; /* Mic-only in headphone jack */
|
||||
unsigned int has_boost_on_pin:1;
|
||||
int order;
|
||||
};
|
||||
|
||||
struct auto_pin_cfg;
|
||||
|
||||
@@ -10214,6 +10214,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1849, 0x0269, "Positivo Master C6400", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
||||
SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
|
||||
SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
|
||||
|
||||
@@ -297,6 +297,34 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "83AS"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "83L3"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "83N6"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "83Q2"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "83Q3"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.driver_data = &acp6x_card,
|
||||
.matches = {
|
||||
|
||||
@@ -1216,7 +1216,7 @@ again:
|
||||
return ret;
|
||||
|
||||
if (cfg_truncate > 0) {
|
||||
xdisconnect(fd);
|
||||
shutdown(fd, SHUT_WR);
|
||||
} else if (--cfg_repeat > 0) {
|
||||
xdisconnect(fd);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user