This is the 5.4.126 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmDJy8EACgkQONu9yGCS aT4iaBAAxDY3xDhlTee0ajZwowSVBgjGeVuVFkoKFHNFHu190lXikaiaULlkcfot MPPjUJMH4jM+i7eUC4LWKbxgzphMyAQszAZSd7MWNzgalOids0D77VqZXwEaZIqI wam6/vd9lIeJNf/H8kinm+SDozuv0MkECSHCquTaivvCTYTMK9qKwUPk+E8h8t2o dJ4kJJY24mDRp6F+jnY0nR1CaHXSltxlMG8Viy8HJLsLKe7cRGhkXzCdLnf1m5ea ppYiaLdsD1prlrNDnXWhd8zzRYh4AEnTpEMZuFt4U0oQ7L7D0mCZHw/13SyP21z8 dzE54J4d368RZ0tT5XgiMmxd+4eBYo6Xmlj3+DmADUUHeSddXuJcLLlzDUWgHak2 5z+eqS8yh1lU2NFcMCqcgia1XBx+R1n+Ibt8IF/nyh8/PhdQ22wTtl+lfvR/G1pb w6GIoFB/jvuQ+x/RoWcmaeaqu0TKlIbtqwKOgcTNGtNTh7H7V5sDHr9VtHK5hKVE 6Jdyq+lmIgYIV2wCV3vmfLLlr0NIEDmV7NET/q0VgyWhp+kNSBVYivFeKFGMQba3 ES5LseCUwTzpCv7uFO48gQK+0v3lqmkgWjU1tFDGZKCh9Dlj6eNrwntYyIJPk2hx Dh5u3nrOeRuVYRP5W6ejWOTDDA12+diwtSMBM47vtHMYr+gBUXk= =JTCj -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEdQaENiSDAlGTDEbB7G51OISzHs0FAmDKAVwACgkQ7G51OISz Hs372A//cLcSXeASJjtYGAEqf9Yj0ZMHrY7NSb52u6/oz95VP3zVlxVAsyxhHcaN jXlcne5V5oTx86YI0QNs/wGEO/ErwhRFlN6t8NX0bmBBOj9PrvdguJlA4HSVk4xs wdBDgLtWwAKfv508KXfsX58le7oGszXst3sb9ovTlWwb56Ux4E9nIvWwvdao2Z3v hfs8uzpkhmgEHdRvrFstpxJH7ewmpG24Pr6extkyk4gfXAXVfa7/nOsRceVbMZ8K ln9Yam6MaDB4HH29enXVhK+b9rL7UfM4wwW5JSPlXhH2REfYze+r2HYorN2Bm8mR snClc+NlrpHyE8oFeydu3ZX1caXMnM07EaG6l/l33Tot8PczaTOeSZOezHFEGFAY juOE0YgqxemlNCCJUKNXfdkkPhd5wfrlzJjbNv+84hahUUAT5ET4HmuSUcTzvPkv tl61nmvsRzx635YNs5P7Z0Q5sWwxWKAMoTRM8+0DA1Uov+Hevuy2EHtg01YIsMAc E4RloWALKgbJ/yYG/hlx/xG6JAu8dMkFoaG7d6xCpNu/5oX3QnnP5EgapOQio/fr HZKO96hGdUTbwNkgbtnN6djGIcEsgnCc8JYg6h75ROalB+HHVszynKW97AwaAWTQ MV6oT1eYAJ1vjrP+XqH0ibkV10tC9Vrxs/hEeO6r7vvlVS0zytE= =jJ3r -----END PGP SIGNATURE----- Merge tag 'v5.4.126' into 5.4-2.3.x-imx This is the 5.4.126 stable release Conflicts: - drivers/usb/cdns3/gadget.c: Skip upstream commit f0509160f25e3 ("usb: cdns3: Fix runtime PM imbalance on error") as the implementation is not present in the NXP tree to apply it. Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
This commit is contained in:
commit
5134d8a627
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 125
|
||||
SUBLEVEL = 126
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
*/
|
||||
notrace void arch_local_irq_disable(void)
|
||||
{
|
||||
preempt_disable();
|
||||
preempt_disable_notrace();
|
||||
|
||||
__asm__ __volatile__(
|
||||
" .set push \n"
|
||||
|
@ -53,7 +53,7 @@ notrace void arch_local_irq_disable(void)
|
|||
: /* no inputs */
|
||||
: "memory");
|
||||
|
||||
preempt_enable();
|
||||
preempt_enable_notrace();
|
||||
}
|
||||
EXPORT_SYMBOL(arch_local_irq_disable);
|
||||
|
||||
|
@ -61,7 +61,7 @@ notrace unsigned long arch_local_irq_save(void)
|
|||
{
|
||||
unsigned long flags;
|
||||
|
||||
preempt_disable();
|
||||
preempt_disable_notrace();
|
||||
|
||||
__asm__ __volatile__(
|
||||
" .set push \n"
|
||||
|
@ -78,7 +78,7 @@ notrace unsigned long arch_local_irq_save(void)
|
|||
: /* no inputs */
|
||||
: "memory");
|
||||
|
||||
preempt_enable();
|
||||
preempt_enable_notrace();
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ notrace void arch_local_irq_restore(unsigned long flags)
|
|||
{
|
||||
unsigned long __tmp1;
|
||||
|
||||
preempt_disable();
|
||||
preempt_disable_notrace();
|
||||
|
||||
__asm__ __volatile__(
|
||||
" .set push \n"
|
||||
|
@ -106,7 +106,7 @@ notrace void arch_local_irq_restore(unsigned long flags)
|
|||
: "0" (flags)
|
||||
: "memory");
|
||||
|
||||
preempt_enable();
|
||||
preempt_enable_notrace();
|
||||
}
|
||||
EXPORT_SYMBOL(arch_local_irq_restore);
|
||||
|
||||
|
|
|
@ -122,7 +122,15 @@
|
|||
};
|
||||
|
||||
/include/ "pq3-i2c-0.dtsi"
|
||||
i2c@3000 {
|
||||
fsl,i2c-erratum-a004447;
|
||||
};
|
||||
|
||||
/include/ "pq3-i2c-1.dtsi"
|
||||
i2c@3100 {
|
||||
fsl,i2c-erratum-a004447;
|
||||
};
|
||||
|
||||
/include/ "pq3-duart-0.dtsi"
|
||||
/include/ "pq3-espi-0.dtsi"
|
||||
spi0: spi@7000 {
|
||||
|
|
|
@ -371,7 +371,23 @@
|
|||
};
|
||||
|
||||
/include/ "qoriq-i2c-0.dtsi"
|
||||
i2c@118000 {
|
||||
fsl,i2c-erratum-a004447;
|
||||
};
|
||||
|
||||
i2c@118100 {
|
||||
fsl,i2c-erratum-a004447;
|
||||
};
|
||||
|
||||
/include/ "qoriq-i2c-1.dtsi"
|
||||
i2c@119000 {
|
||||
fsl,i2c-erratum-a004447;
|
||||
};
|
||||
|
||||
i2c@119100 {
|
||||
fsl,i2c-erratum-a004447;
|
||||
};
|
||||
|
||||
/include/ "qoriq-duart-0.dtsi"
|
||||
/include/ "qoriq-duart-1.dtsi"
|
||||
/include/ "qoriq-gpio-0.dtsi"
|
||||
|
|
|
@ -20,7 +20,7 @@ SECTIONS
|
|||
.initdata : { *(.initdata) }
|
||||
__end_init = .;
|
||||
|
||||
.text : { *(.text) }
|
||||
.text : { *(.text .text.*) }
|
||||
.text32 : { *(.text32) }
|
||||
|
||||
. = ALIGN(16);
|
||||
|
|
|
@ -1483,16 +1483,16 @@ TRACE_EVENT(kvm_nested_vmenter_failed,
|
|||
TP_ARGS(msg, err),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(const char *, msg)
|
||||
__string(msg, msg)
|
||||
__field(u32, err)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->msg = msg;
|
||||
__assign_str(msg, msg);
|
||||
__entry->err = err;
|
||||
),
|
||||
|
||||
TP_printk("%s%s", __entry->msg, !__entry->err ? "" :
|
||||
TP_printk("%s%s", __get_str(msg), !__entry->err ? "" :
|
||||
__print_symbolic(__entry->err, VMX_VMENTER_INSTRUCTION_ERRORS))
|
||||
);
|
||||
|
||||
|
|
|
@ -268,9 +268,10 @@ int drm_master_open(struct drm_file *file_priv)
|
|||
void drm_master_release(struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_device *dev = file_priv->minor->dev;
|
||||
struct drm_master *master = file_priv->master;
|
||||
struct drm_master *master;
|
||||
|
||||
mutex_lock(&dev->master_mutex);
|
||||
master = file_priv->master;
|
||||
if (file_priv->magic)
|
||||
idr_remove(&file_priv->master->magic_map, file_priv->magic);
|
||||
|
||||
|
|
|
@ -118,17 +118,18 @@ int drm_getunique(struct drm_device *dev, void *data,
|
|||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_unique *u = data;
|
||||
struct drm_master *master = file_priv->master;
|
||||
struct drm_master *master;
|
||||
|
||||
mutex_lock(&master->dev->master_mutex);
|
||||
mutex_lock(&dev->master_mutex);
|
||||
master = file_priv->master;
|
||||
if (u->unique_len >= master->unique_len) {
|
||||
if (copy_to_user(u->unique, master->unique, master->unique_len)) {
|
||||
mutex_unlock(&master->dev->master_mutex);
|
||||
mutex_unlock(&dev->master_mutex);
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
u->unique_len = master->unique_len;
|
||||
mutex_unlock(&master->dev->master_mutex);
|
||||
mutex_unlock(&dev->master_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/fsl_devices.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -49,6 +50,7 @@
|
|||
#define CCR_MTX 0x10
|
||||
#define CCR_TXAK 0x08
|
||||
#define CCR_RSTA 0x04
|
||||
#define CCR_RSVD 0x02
|
||||
|
||||
#define CSR_MCF 0x80
|
||||
#define CSR_MAAS 0x40
|
||||
|
@ -70,6 +72,7 @@ struct mpc_i2c {
|
|||
u8 fdr, dfsrr;
|
||||
#endif
|
||||
struct clk *clk_per;
|
||||
bool has_errata_A004447;
|
||||
};
|
||||
|
||||
struct mpc_i2c_divider {
|
||||
|
@ -176,6 +179,75 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int i2c_mpc_wait_sr(struct mpc_i2c *i2c, int mask)
|
||||
{
|
||||
void __iomem *addr = i2c->base + MPC_I2C_SR;
|
||||
u8 val;
|
||||
|
||||
return readb_poll_timeout(addr, val, val & mask, 0, 100);
|
||||
}
|
||||
|
||||
/*
|
||||
* Workaround for Erratum A004447. From the P2040CE Rev Q
|
||||
*
|
||||
* 1. Set up the frequency divider and sampling rate.
|
||||
* 2. I2CCR - a0h
|
||||
* 3. Poll for I2CSR[MBB] to get set.
|
||||
* 4. If I2CSR[MAL] is set (an indication that SDA is stuck low), then go to
|
||||
* step 5. If MAL is not set, then go to step 13.
|
||||
* 5. I2CCR - 00h
|
||||
* 6. I2CCR - 22h
|
||||
* 7. I2CCR - a2h
|
||||
* 8. Poll for I2CSR[MBB] to get set.
|
||||
* 9. Issue read to I2CDR.
|
||||
* 10. Poll for I2CSR[MIF] to be set.
|
||||
* 11. I2CCR - 82h
|
||||
* 12. Workaround complete. Skip the next steps.
|
||||
* 13. Issue read to I2CDR.
|
||||
* 14. Poll for I2CSR[MIF] to be set.
|
||||
* 15. I2CCR - 80h
|
||||
*/
|
||||
static void mpc_i2c_fixup_A004447(struct mpc_i2c *i2c)
|
||||
{
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
writeccr(i2c, CCR_MEN | CCR_MSTA);
|
||||
ret = i2c_mpc_wait_sr(i2c, CSR_MBB);
|
||||
if (ret) {
|
||||
dev_err(i2c->dev, "timeout waiting for CSR_MBB\n");
|
||||
return;
|
||||
}
|
||||
|
||||
val = readb(i2c->base + MPC_I2C_SR);
|
||||
|
||||
if (val & CSR_MAL) {
|
||||
writeccr(i2c, 0x00);
|
||||
writeccr(i2c, CCR_MSTA | CCR_RSVD);
|
||||
writeccr(i2c, CCR_MEN | CCR_MSTA | CCR_RSVD);
|
||||
ret = i2c_mpc_wait_sr(i2c, CSR_MBB);
|
||||
if (ret) {
|
||||
dev_err(i2c->dev, "timeout waiting for CSR_MBB\n");
|
||||
return;
|
||||
}
|
||||
val = readb(i2c->base + MPC_I2C_DR);
|
||||
ret = i2c_mpc_wait_sr(i2c, CSR_MIF);
|
||||
if (ret) {
|
||||
dev_err(i2c->dev, "timeout waiting for CSR_MIF\n");
|
||||
return;
|
||||
}
|
||||
writeccr(i2c, CCR_MEN | CCR_RSVD);
|
||||
} else {
|
||||
val = readb(i2c->base + MPC_I2C_DR);
|
||||
ret = i2c_mpc_wait_sr(i2c, CSR_MIF);
|
||||
if (ret) {
|
||||
dev_err(i2c->dev, "timeout waiting for CSR_MIF\n");
|
||||
return;
|
||||
}
|
||||
writeccr(i2c, CCR_MEN);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PPC_MPC52xx) || defined(CONFIG_PPC_MPC512x)
|
||||
static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] = {
|
||||
{20, 0x20}, {22, 0x21}, {24, 0x22}, {26, 0x23},
|
||||
|
@ -586,7 +658,7 @@ static int mpc_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
|||
if ((status & (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) {
|
||||
writeb(status & ~CSR_MAL,
|
||||
i2c->base + MPC_I2C_SR);
|
||||
mpc_i2c_fixup(i2c);
|
||||
i2c_recover_bus(&i2c->adap);
|
||||
}
|
||||
return -EIO;
|
||||
}
|
||||
|
@ -622,7 +694,7 @@ static int mpc_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
|||
if ((status & (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) {
|
||||
writeb(status & ~CSR_MAL,
|
||||
i2c->base + MPC_I2C_SR);
|
||||
mpc_i2c_fixup(i2c);
|
||||
i2c_recover_bus(&i2c->adap);
|
||||
}
|
||||
return -EIO;
|
||||
}
|
||||
|
@ -637,6 +709,18 @@ static u32 mpc_functionality(struct i2c_adapter *adap)
|
|||
| I2C_FUNC_SMBUS_READ_BLOCK_DATA | I2C_FUNC_SMBUS_BLOCK_PROC_CALL;
|
||||
}
|
||||
|
||||
static int fsl_i2c_bus_recovery(struct i2c_adapter *adap)
|
||||
{
|
||||
struct mpc_i2c *i2c = i2c_get_adapdata(adap);
|
||||
|
||||
if (i2c->has_errata_A004447)
|
||||
mpc_i2c_fixup_A004447(i2c);
|
||||
else
|
||||
mpc_i2c_fixup(i2c);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_algorithm mpc_algo = {
|
||||
.master_xfer = mpc_xfer,
|
||||
.functionality = mpc_functionality,
|
||||
|
@ -648,6 +732,10 @@ static struct i2c_adapter mpc_ops = {
|
|||
.timeout = HZ,
|
||||
};
|
||||
|
||||
static struct i2c_bus_recovery_info fsl_i2c_recovery_info = {
|
||||
.recover_bus = fsl_i2c_bus_recovery,
|
||||
};
|
||||
|
||||
static const struct of_device_id mpc_i2c_of_match[];
|
||||
static int fsl_i2c_probe(struct platform_device *op)
|
||||
{
|
||||
|
@ -732,6 +820,8 @@ static int fsl_i2c_probe(struct platform_device *op)
|
|||
dev_info(i2c->dev, "timeout %u us\n", mpc_ops.timeout * 1000000 / HZ);
|
||||
|
||||
platform_set_drvdata(op, i2c);
|
||||
if (of_property_read_bool(op->dev.of_node, "fsl,i2c-erratum-a004447"))
|
||||
i2c->has_errata_A004447 = true;
|
||||
|
||||
i2c->adap = mpc_ops;
|
||||
of_address_to_resource(op->dev.of_node, 0, &res);
|
||||
|
@ -740,6 +830,7 @@ static int fsl_i2c_probe(struct platform_device *op)
|
|||
i2c_set_adapdata(&i2c->adap, i2c);
|
||||
i2c->adap.dev.parent = &op->dev;
|
||||
i2c->adap.dev.of_node = of_node_get(op->dev.of_node);
|
||||
i2c->adap.bus_recovery_info = &fsl_i2c_recovery_info;
|
||||
|
||||
result = i2c_add_adapter(&i2c->adap);
|
||||
if (result < 0)
|
||||
|
|
|
@ -577,12 +577,9 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
|
|||
props->cq_caps.max_cq_moderation_count = MLX4_MAX_CQ_COUNT;
|
||||
props->cq_caps.max_cq_moderation_period = MLX4_MAX_CQ_PERIOD;
|
||||
|
||||
if (!mlx4_is_slave(dev->dev))
|
||||
err = mlx4_get_internal_clock_params(dev->dev, &clock_params);
|
||||
|
||||
if (uhw->outlen >= resp.response_length + sizeof(resp.hca_core_clock_offset)) {
|
||||
resp.response_length += sizeof(resp.hca_core_clock_offset);
|
||||
if (!err && !mlx4_is_slave(dev->dev)) {
|
||||
if (!mlx4_get_internal_clock_params(dev->dev, &clock_params)) {
|
||||
resp.comp_mask |= MLX4_IB_QUERY_DEV_RESP_MASK_CORE_CLOCK_OFFSET;
|
||||
resp.hca_core_clock_offset = clock_params.offset % PAGE_SIZE;
|
||||
}
|
||||
|
|
|
@ -829,15 +829,14 @@ static void destroy_cq_user(struct mlx5_ib_cq *cq, struct ib_udata *udata)
|
|||
ib_umem_release(cq->buf.umem);
|
||||
}
|
||||
|
||||
static void init_cq_frag_buf(struct mlx5_ib_cq *cq,
|
||||
struct mlx5_ib_cq_buf *buf)
|
||||
static void init_cq_frag_buf(struct mlx5_ib_cq_buf *buf)
|
||||
{
|
||||
int i;
|
||||
void *cqe;
|
||||
struct mlx5_cqe64 *cqe64;
|
||||
|
||||
for (i = 0; i < buf->nent; i++) {
|
||||
cqe = get_cqe(cq, i);
|
||||
cqe = mlx5_frag_buf_get_wqe(&buf->fbc, i);
|
||||
cqe64 = buf->cqe_size == 64 ? cqe : cqe + 64;
|
||||
cqe64->op_own = MLX5_CQE_INVALID << 4;
|
||||
}
|
||||
|
@ -863,7 +862,7 @@ static int create_cq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
|
|||
if (err)
|
||||
goto err_db;
|
||||
|
||||
init_cq_frag_buf(cq, &cq->buf);
|
||||
init_cq_frag_buf(&cq->buf);
|
||||
|
||||
*inlen = MLX5_ST_SZ_BYTES(create_cq_in) +
|
||||
MLX5_FLD_SZ_BYTES(create_cq_in, pas[0]) *
|
||||
|
@ -1163,7 +1162,7 @@ static int resize_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
|
|||
if (err)
|
||||
goto ex;
|
||||
|
||||
init_cq_frag_buf(cq, cq->resize_buf);
|
||||
init_cq_frag_buf(cq->resize_buf);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -163,6 +163,7 @@ static size_t ipoib_get_size(const struct net_device *dev)
|
|||
|
||||
static struct rtnl_link_ops ipoib_link_ops __read_mostly = {
|
||||
.kind = "ipoib",
|
||||
.netns_refund = true,
|
||||
.maxtype = IFLA_IPOIB_MAX,
|
||||
.policy = ipoib_policy,
|
||||
.priv_size = sizeof(struct ipoib_dev_priv),
|
||||
|
|
|
@ -1100,7 +1100,6 @@ nj_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
card->typ = NETJET_S_TJ300;
|
||||
|
||||
card->base = pci_resource_start(pdev, 0);
|
||||
card->irq = pdev->irq;
|
||||
pci_set_drvdata(pdev, card);
|
||||
err = setup_instance(card);
|
||||
if (err)
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#define DM_VERITY_VERIFY_ERR(s) DM_VERITY_ROOT_HASH_VERIFICATION " " s
|
||||
|
||||
static bool require_signatures;
|
||||
module_param(require_signatures, bool, false);
|
||||
module_param(require_signatures, bool, 0444);
|
||||
MODULE_PARM_DESC(require_signatures,
|
||||
"Verify the roothash of dm-verity hash tree");
|
||||
|
||||
|
|
|
@ -325,6 +325,8 @@ static int __init cops_probe1(struct net_device *dev, int ioaddr)
|
|||
break;
|
||||
}
|
||||
|
||||
dev->base_addr = ioaddr;
|
||||
|
||||
/* Reserve any actual interrupt. */
|
||||
if (dev->irq) {
|
||||
retval = request_irq(dev->irq, cops_interrupt, 0, dev->name, dev);
|
||||
|
@ -332,8 +334,6 @@ static int __init cops_probe1(struct net_device *dev, int ioaddr)
|
|||
goto err_out;
|
||||
}
|
||||
|
||||
dev->base_addr = ioaddr;
|
||||
|
||||
lp = netdev_priv(dev);
|
||||
spin_lock_init(&lp->lock);
|
||||
|
||||
|
|
|
@ -1335,6 +1335,7 @@ static struct slave *bond_alloc_slave(struct bonding *bond,
|
|||
|
||||
slave->bond = bond;
|
||||
slave->dev = slave_dev;
|
||||
INIT_DELAYED_WORK(&slave->notify_work, bond_netdev_notify_work);
|
||||
|
||||
if (bond_kobj_init(slave))
|
||||
return NULL;
|
||||
|
@ -1347,7 +1348,6 @@ static struct slave *bond_alloc_slave(struct bonding *bond,
|
|||
return NULL;
|
||||
}
|
||||
}
|
||||
INIT_DELAYED_WORK(&slave->notify_work, bond_netdev_notify_work);
|
||||
|
||||
return slave;
|
||||
}
|
||||
|
|
|
@ -1520,6 +1520,7 @@ static const struct ksz_chip_data ksz9477_switch_chips[] = {
|
|||
.num_statics = 16,
|
||||
.cpu_ports = 0x7F, /* can be configured as cpu port */
|
||||
.port_cnt = 7, /* total physical port count */
|
||||
.phy_errata_9477 = true,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -1245,8 +1245,10 @@ int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param,
|
|||
goto failed;
|
||||
|
||||
/* SR-IOV capability was enabled but there are no VFs*/
|
||||
if (iov->total == 0)
|
||||
if (iov->total == 0) {
|
||||
err = -EINVAL;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
iov->nr_virtfn = min_t(u16, iov->total, num_vfs_param);
|
||||
|
||||
|
|
|
@ -2536,6 +2536,9 @@ static struct net_device_stats *gem_get_stats(struct macb *bp)
|
|||
struct gem_stats *hwstat = &bp->hw_stats.gem;
|
||||
struct net_device_stats *nstat = &bp->dev->stats;
|
||||
|
||||
if (!netif_running(bp->dev))
|
||||
return nstat;
|
||||
|
||||
gem_update_stats(bp);
|
||||
|
||||
nstat->rx_errors = (hwstat->rx_frame_check_sequence_errors +
|
||||
|
|
|
@ -823,6 +823,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|||
#define QUERY_DEV_CAP_MAD_DEMUX_OFFSET 0xb0
|
||||
#define QUERY_DEV_CAP_DMFS_HIGH_RATE_QPN_BASE_OFFSET 0xa8
|
||||
#define QUERY_DEV_CAP_DMFS_HIGH_RATE_QPN_RANGE_OFFSET 0xac
|
||||
#define QUERY_DEV_CAP_MAP_CLOCK_TO_USER 0xc1
|
||||
#define QUERY_DEV_CAP_QP_RATE_LIMIT_NUM_OFFSET 0xcc
|
||||
#define QUERY_DEV_CAP_QP_RATE_LIMIT_MAX_OFFSET 0xd0
|
||||
#define QUERY_DEV_CAP_QP_RATE_LIMIT_MIN_OFFSET 0xd2
|
||||
|
@ -841,6 +842,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|||
|
||||
if (mlx4_is_mfunc(dev))
|
||||
disable_unsupported_roce_caps(outbox);
|
||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAP_CLOCK_TO_USER);
|
||||
dev_cap->map_clock_to_user = field & 0x80;
|
||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_QP_OFFSET);
|
||||
dev_cap->reserved_qps = 1 << (field & 0xf);
|
||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_QP_OFFSET);
|
||||
|
|
|
@ -131,6 +131,7 @@ struct mlx4_dev_cap {
|
|||
u32 health_buffer_addrs;
|
||||
struct mlx4_port_cap port_cap[MLX4_MAX_PORTS + 1];
|
||||
bool wol_port[MLX4_MAX_PORTS + 1];
|
||||
bool map_clock_to_user;
|
||||
};
|
||||
|
||||
struct mlx4_func_cap {
|
||||
|
|
|
@ -498,6 +498,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|||
}
|
||||
}
|
||||
|
||||
dev->caps.map_clock_to_user = dev_cap->map_clock_to_user;
|
||||
dev->caps.uar_page_size = PAGE_SIZE;
|
||||
dev->caps.num_uars = dev_cap->uar_size / PAGE_SIZE;
|
||||
dev->caps.local_ca_ack_delay = dev_cap->local_ca_ack_delay;
|
||||
|
@ -1948,6 +1949,11 @@ int mlx4_get_internal_clock_params(struct mlx4_dev *dev,
|
|||
if (mlx4_is_slave(dev))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!dev->caps.map_clock_to_user) {
|
||||
mlx4_dbg(dev, "Map clock to user is not supported.\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (!params)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -115,7 +115,7 @@ static int ql_sem_spinlock(struct ql3_adapter *qdev,
|
|||
value = readl(&port_regs->CommonRegs.semaphoreReg);
|
||||
if ((value & (sem_mask >> 16)) == sem_bits)
|
||||
return 0;
|
||||
ssleep(1);
|
||||
mdelay(1000);
|
||||
} while (--seconds);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -457,7 +457,8 @@ void mdiobus_unregister(struct mii_bus *bus)
|
|||
struct mdio_device *mdiodev;
|
||||
int i;
|
||||
|
||||
BUG_ON(bus->state != MDIOBUS_REGISTERED);
|
||||
if (WARN_ON_ONCE(bus->state != MDIOBUS_REGISTERED))
|
||||
return;
|
||||
bus->state = MDIOBUS_UNREGISTERED;
|
||||
|
||||
for (i = 0; i < PHY_MAX_ADDR; i++) {
|
||||
|
|
|
@ -62,7 +62,8 @@ config NVME_FC
|
|||
config NVME_TCP
|
||||
tristate "NVM Express over Fabrics TCP host driver"
|
||||
depends on INET
|
||||
depends on BLK_DEV_NVME
|
||||
depends on BLOCK
|
||||
select NVME_CORE
|
||||
select NVME_FABRICS
|
||||
select CRYPTO
|
||||
select CRYPTO_CRC32C
|
||||
|
|
|
@ -336,6 +336,11 @@ static void nvmf_log_connect_error(struct nvme_ctrl *ctrl,
|
|||
cmd->connect.recfmt);
|
||||
break;
|
||||
|
||||
case NVME_SC_HOST_PATH_ERROR:
|
||||
dev_err(ctrl->device,
|
||||
"Connect command failed: host path error\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
dev_err(ctrl->device,
|
||||
"Connect command failed, error wo/DNR bit: %d\n",
|
||||
|
|
|
@ -1381,6 +1381,12 @@ static int set_machine_constraints(struct regulator_dev *rdev)
|
|||
* and we have control then make sure it is enabled.
|
||||
*/
|
||||
if (rdev->constraints->always_on || rdev->constraints->boot_on) {
|
||||
/* If we want to enable this regulator, make sure that we know
|
||||
* the supplying regulator.
|
||||
*/
|
||||
if (rdev->supply_name && !rdev->supply)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
if (rdev->supply) {
|
||||
ret = regulator_enable(rdev->supply);
|
||||
if (ret < 0) {
|
||||
|
|
|
@ -814,6 +814,13 @@ static int max77620_regulator_probe(struct platform_device *pdev)
|
|||
config.dev = dev;
|
||||
config.driver_data = pmic;
|
||||
|
||||
/*
|
||||
* Set of_node_reuse flag to prevent driver core from attempting to
|
||||
* claim any pinmux resources already claimed by the parent device.
|
||||
* Otherwise PMIC driver will fail to re-probe.
|
||||
*/
|
||||
device_set_of_node_from_dev(&pdev->dev, pdev->dev.parent);
|
||||
|
||||
for (id = 0; id < MAX77620_NUM_REGS; id++) {
|
||||
struct regulator_dev *rdev;
|
||||
struct regulator_desc *rdesc;
|
||||
|
|
|
@ -83,6 +83,7 @@ static void vfio_ccw_sch_io_todo(struct work_struct *work)
|
|||
struct vfio_ccw_private *private;
|
||||
struct irb *irb;
|
||||
bool is_final;
|
||||
bool cp_is_finished = false;
|
||||
|
||||
private = container_of(work, struct vfio_ccw_private, io_work);
|
||||
irb = &private->irb;
|
||||
|
@ -91,14 +92,21 @@ static void vfio_ccw_sch_io_todo(struct work_struct *work)
|
|||
(SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT));
|
||||
if (scsw_is_solicited(&irb->scsw)) {
|
||||
cp_update_scsw(&private->cp, &irb->scsw);
|
||||
if (is_final && private->state == VFIO_CCW_STATE_CP_PENDING)
|
||||
if (is_final && private->state == VFIO_CCW_STATE_CP_PENDING) {
|
||||
cp_free(&private->cp);
|
||||
cp_is_finished = true;
|
||||
}
|
||||
}
|
||||
mutex_lock(&private->io_mutex);
|
||||
memcpy(private->io_region->irb_area, irb, sizeof(*irb));
|
||||
mutex_unlock(&private->io_mutex);
|
||||
|
||||
if (private->mdev && is_final)
|
||||
/*
|
||||
* Reset to IDLE only if processing of a channel program
|
||||
* has finished. Do not overwrite a possible processing
|
||||
* state if the final interrupt was for HSCH or CSCH.
|
||||
*/
|
||||
if (private->mdev && cp_is_finished)
|
||||
private->state = VFIO_CCW_STATE_IDLE;
|
||||
|
||||
if (private->io_trigger)
|
||||
|
|
|
@ -1219,6 +1219,7 @@ int bnx2fc_eh_abort(struct scsi_cmnd *sc_cmd)
|
|||
was a result from the ABTS request rather than the CLEANUP
|
||||
request */
|
||||
set_bit(BNX2FC_FLAG_IO_CLEANUP, &io_req->req_flags);
|
||||
rc = FAILED;
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
|
|
@ -3274,14 +3274,14 @@ hisi_sas_v3_destroy_irqs(struct pci_dev *pdev, struct hisi_hba *hisi_hba)
|
|||
{
|
||||
int i;
|
||||
|
||||
free_irq(pci_irq_vector(pdev, 1), hisi_hba);
|
||||
free_irq(pci_irq_vector(pdev, 2), hisi_hba);
|
||||
free_irq(pci_irq_vector(pdev, 11), hisi_hba);
|
||||
devm_free_irq(&pdev->dev, pci_irq_vector(pdev, 1), hisi_hba);
|
||||
devm_free_irq(&pdev->dev, pci_irq_vector(pdev, 2), hisi_hba);
|
||||
devm_free_irq(&pdev->dev, pci_irq_vector(pdev, 11), hisi_hba);
|
||||
for (i = 0; i < hisi_hba->cq_nvecs; i++) {
|
||||
struct hisi_sas_cq *cq = &hisi_hba->cq[i];
|
||||
int nr = hisi_sas_intr_conv ? 16 : 16 + i;
|
||||
|
||||
free_irq(pci_irq_vector(pdev, nr), cq);
|
||||
devm_free_irq(&pdev->dev, pci_irq_vector(pdev, nr), cq);
|
||||
}
|
||||
pci_free_irq_vectors(pdev);
|
||||
}
|
||||
|
|
|
@ -253,12 +253,11 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
|
|||
|
||||
device_enable_async_suspend(&shost->shost_dev);
|
||||
|
||||
get_device(&shost->shost_gendev);
|
||||
error = device_add(&shost->shost_dev);
|
||||
if (error)
|
||||
goto out_del_gendev;
|
||||
|
||||
get_device(&shost->shost_gendev);
|
||||
|
||||
if (shost->transportt->host_size) {
|
||||
shost->shost_data = kzalloc(shost->transportt->host_size,
|
||||
GFP_KERNEL);
|
||||
|
@ -275,33 +274,36 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
|
|||
shost->work_q_name);
|
||||
if (!shost->work_q) {
|
||||
error = -EINVAL;
|
||||
goto out_free_shost_data;
|
||||
goto out_del_dev;
|
||||
}
|
||||
}
|
||||
|
||||
error = scsi_sysfs_add_host(shost);
|
||||
if (error)
|
||||
goto out_destroy_host;
|
||||
goto out_del_dev;
|
||||
|
||||
scsi_proc_host_add(shost);
|
||||
scsi_autopm_put_host(shost);
|
||||
return error;
|
||||
|
||||
out_destroy_host:
|
||||
if (shost->work_q)
|
||||
destroy_workqueue(shost->work_q);
|
||||
out_free_shost_data:
|
||||
kfree(shost->shost_data);
|
||||
/*
|
||||
* Any host allocation in this function will be freed in
|
||||
* scsi_host_dev_release().
|
||||
*/
|
||||
out_del_dev:
|
||||
device_del(&shost->shost_dev);
|
||||
out_del_gendev:
|
||||
/*
|
||||
* Host state is SHOST_RUNNING so we have to explicitly release
|
||||
* ->shost_dev.
|
||||
*/
|
||||
put_device(&shost->shost_dev);
|
||||
device_del(&shost->shost_gendev);
|
||||
out_disable_runtime_pm:
|
||||
device_disable_async_suspend(&shost->shost_gendev);
|
||||
pm_runtime_disable(&shost->shost_gendev);
|
||||
pm_runtime_set_suspended(&shost->shost_gendev);
|
||||
pm_runtime_put_noidle(&shost->shost_gendev);
|
||||
scsi_mq_destroy_tags(shost);
|
||||
fail:
|
||||
return error;
|
||||
}
|
||||
|
@ -342,7 +344,7 @@ static void scsi_host_dev_release(struct device *dev)
|
|||
|
||||
ida_simple_remove(&host_index_ida, shost->host_no);
|
||||
|
||||
if (parent)
|
||||
if (shost->shost_state != SHOST_CREATED)
|
||||
put_device(parent);
|
||||
kfree(shost);
|
||||
}
|
||||
|
@ -389,8 +391,10 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
|
|||
mutex_init(&shost->scan_mutex);
|
||||
|
||||
index = ida_simple_get(&host_index_ida, 0, 0, GFP_KERNEL);
|
||||
if (index < 0)
|
||||
goto fail_kfree;
|
||||
if (index < 0) {
|
||||
kfree(shost);
|
||||
return NULL;
|
||||
}
|
||||
shost->host_no = index;
|
||||
|
||||
shost->dma_channel = 0xff;
|
||||
|
@ -482,7 +486,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
|
|||
shost_printk(KERN_WARNING, shost,
|
||||
"error handler thread failed to spawn, error = %ld\n",
|
||||
PTR_ERR(shost->ehandler));
|
||||
goto fail_index_remove;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
shost->tmf_work_q = alloc_workqueue("scsi_tmf_%d",
|
||||
|
@ -491,17 +495,18 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
|
|||
if (!shost->tmf_work_q) {
|
||||
shost_printk(KERN_WARNING, shost,
|
||||
"failed to create tmf workq\n");
|
||||
goto fail_kthread;
|
||||
goto fail;
|
||||
}
|
||||
scsi_proc_hostdir_add(shost->hostt);
|
||||
return shost;
|
||||
fail:
|
||||
/*
|
||||
* Host state is still SHOST_CREATED and that is enough to release
|
||||
* ->shost_gendev. scsi_host_dev_release() will free
|
||||
* dev_name(&shost->shost_dev).
|
||||
*/
|
||||
put_device(&shost->shost_gendev);
|
||||
|
||||
fail_kthread:
|
||||
kthread_stop(shost->ehandler);
|
||||
fail_index_remove:
|
||||
ida_simple_remove(&host_index_ida, shost->host_no);
|
||||
fail_kfree:
|
||||
kfree(shost);
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(scsi_host_alloc);
|
||||
|
|
|
@ -1559,10 +1559,12 @@ void qlt_stop_phase2(struct qla_tgt *tgt)
|
|||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&tgt->ha->optrom_mutex);
|
||||
mutex_lock(&vha->vha_tgt.tgt_mutex);
|
||||
tgt->tgt_stop = 0;
|
||||
tgt->tgt_stopped = 1;
|
||||
mutex_unlock(&vha->vha_tgt.tgt_mutex);
|
||||
mutex_unlock(&tgt->ha->optrom_mutex);
|
||||
|
||||
ql_dbg(ql_dbg_tgt_mgt, vha, 0xf00c, "Stop of tgt %p finished\n",
|
||||
tgt);
|
||||
|
|
|
@ -574,7 +574,13 @@ static void pvscsi_complete_request(struct pvscsi_adapter *adapter,
|
|||
case BTSTAT_SUCCESS:
|
||||
case BTSTAT_LINKED_COMMAND_COMPLETED:
|
||||
case BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG:
|
||||
/* If everything went fine, let's move on.. */
|
||||
/*
|
||||
* Commands like INQUIRY may transfer less data than
|
||||
* requested by the initiator via bufflen. Set residual
|
||||
* count to make upper layer aware of the actual amount
|
||||
* of data returned.
|
||||
*/
|
||||
scsi_set_resid(cmd, scsi_bufflen(cmd) - e->dataLen);
|
||||
cmd->result = (DID_OK << 16);
|
||||
break;
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@
|
|||
#define BCM2835_SPI_FIFO_SIZE 64
|
||||
#define BCM2835_SPI_FIFO_SIZE_3_4 48
|
||||
#define BCM2835_SPI_DMA_MIN_LENGTH 96
|
||||
#define BCM2835_SPI_NUM_CS 3 /* raise as necessary */
|
||||
#define BCM2835_SPI_NUM_CS 24 /* raise as necessary */
|
||||
#define BCM2835_SPI_MODE_BITS (SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \
|
||||
| SPI_NO_CS | SPI_3WIRE)
|
||||
|
||||
|
@ -1181,6 +1181,12 @@ static int bcm2835_spi_setup(struct spi_device *spi)
|
|||
struct gpio_chip *chip;
|
||||
u32 cs;
|
||||
|
||||
if (spi->chip_select >= BCM2835_SPI_NUM_CS) {
|
||||
dev_err(&spi->dev, "only %d chip-selects supported\n",
|
||||
BCM2835_SPI_NUM_CS - 1);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Precalculate SPI slave's CS register value for ->prepare_message():
|
||||
* The driver always uses software-controlled GPIO chip select, hence
|
||||
|
@ -1274,7 +1280,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev)
|
|||
ctlr->use_gpio_descriptors = true;
|
||||
ctlr->mode_bits = BCM2835_SPI_MODE_BITS;
|
||||
ctlr->bits_per_word_mask = SPI_BPW_MASK(8);
|
||||
ctlr->num_chipselect = BCM2835_SPI_NUM_CS;
|
||||
ctlr->num_chipselect = 3;
|
||||
ctlr->setup = bcm2835_spi_setup;
|
||||
ctlr->transfer_one = bcm2835_spi_transfer_one;
|
||||
ctlr->handle_err = bcm2835_spi_handle_err;
|
||||
|
|
|
@ -181,6 +181,8 @@ int spi_bitbang_setup(struct spi_device *spi)
|
|||
{
|
||||
struct spi_bitbang_cs *cs = spi->controller_state;
|
||||
struct spi_bitbang *bitbang;
|
||||
bool initial_setup = false;
|
||||
int retval;
|
||||
|
||||
bitbang = spi_master_get_devdata(spi->master);
|
||||
|
||||
|
@ -189,22 +191,30 @@ int spi_bitbang_setup(struct spi_device *spi)
|
|||
if (!cs)
|
||||
return -ENOMEM;
|
||||
spi->controller_state = cs;
|
||||
initial_setup = true;
|
||||
}
|
||||
|
||||
/* per-word shift register access, in hardware or bitbanging */
|
||||
cs->txrx_word = bitbang->txrx_word[spi->mode & (SPI_CPOL|SPI_CPHA)];
|
||||
if (!cs->txrx_word)
|
||||
return -EINVAL;
|
||||
if (!cs->txrx_word) {
|
||||
retval = -EINVAL;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
if (bitbang->setup_transfer) {
|
||||
int retval = bitbang->setup_transfer(spi, NULL);
|
||||
retval = bitbang->setup_transfer(spi, NULL);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
dev_dbg(&spi->dev, "%s, %u nsec/bit\n", __func__, 2 * cs->nsecs);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free:
|
||||
if (initial_setup)
|
||||
kfree(cs);
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(spi_bitbang_setup);
|
||||
|
||||
|
|
|
@ -442,6 +442,7 @@ static int fsl_spi_setup(struct spi_device *spi)
|
|||
{
|
||||
struct mpc8xxx_spi *mpc8xxx_spi;
|
||||
struct fsl_spi_reg *reg_base;
|
||||
bool initial_setup = false;
|
||||
int retval;
|
||||
u32 hw_mode;
|
||||
struct spi_mpc8xxx_cs *cs = spi_get_ctldata(spi);
|
||||
|
@ -454,6 +455,7 @@ static int fsl_spi_setup(struct spi_device *spi)
|
|||
if (!cs)
|
||||
return -ENOMEM;
|
||||
spi_set_ctldata(spi, cs);
|
||||
initial_setup = true;
|
||||
}
|
||||
mpc8xxx_spi = spi_master_get_devdata(spi->master);
|
||||
|
||||
|
@ -477,6 +479,8 @@ static int fsl_spi_setup(struct spi_device *spi)
|
|||
retval = fsl_spi_setup_transfer(spi, NULL);
|
||||
if (retval < 0) {
|
||||
cs->hw_mode = hw_mode; /* Restore settings */
|
||||
if (initial_setup)
|
||||
kfree(cs);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
@ -424,15 +424,22 @@ done:
|
|||
static int uwire_setup(struct spi_device *spi)
|
||||
{
|
||||
struct uwire_state *ust = spi->controller_state;
|
||||
bool initial_setup = false;
|
||||
int status;
|
||||
|
||||
if (ust == NULL) {
|
||||
ust = kzalloc(sizeof(*ust), GFP_KERNEL);
|
||||
if (ust == NULL)
|
||||
return -ENOMEM;
|
||||
spi->controller_state = ust;
|
||||
initial_setup = true;
|
||||
}
|
||||
|
||||
return uwire_setup_transfer(spi, NULL);
|
||||
status = uwire_setup_transfer(spi, NULL);
|
||||
if (status && initial_setup)
|
||||
kfree(ust);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static void uwire_cleanup(struct spi_device *spi)
|
||||
|
|
|
@ -1043,8 +1043,25 @@ static void omap2_mcspi_release_dma(struct spi_master *master)
|
|||
}
|
||||
}
|
||||
|
||||
static void omap2_mcspi_cleanup(struct spi_device *spi)
|
||||
{
|
||||
struct omap2_mcspi_cs *cs;
|
||||
|
||||
if (spi->controller_state) {
|
||||
/* Unlink controller state from context save list */
|
||||
cs = spi->controller_state;
|
||||
list_del(&cs->node);
|
||||
|
||||
kfree(cs);
|
||||
}
|
||||
|
||||
if (gpio_is_valid(spi->cs_gpio))
|
||||
gpio_free(spi->cs_gpio);
|
||||
}
|
||||
|
||||
static int omap2_mcspi_setup(struct spi_device *spi)
|
||||
{
|
||||
bool initial_setup = false;
|
||||
int ret;
|
||||
struct omap2_mcspi *mcspi = spi_master_get_devdata(spi->master);
|
||||
struct omap2_mcspi_regs *ctx = &mcspi->ctx;
|
||||
|
@ -1062,6 +1079,7 @@ static int omap2_mcspi_setup(struct spi_device *spi)
|
|||
spi->controller_state = cs;
|
||||
/* Link this to context save list */
|
||||
list_add_tail(&cs->node, &ctx->cs);
|
||||
initial_setup = true;
|
||||
|
||||
if (gpio_is_valid(spi->cs_gpio)) {
|
||||
ret = gpio_request(spi->cs_gpio, dev_name(&spi->dev));
|
||||
|
@ -1077,33 +1095,22 @@ static int omap2_mcspi_setup(struct spi_device *spi)
|
|||
ret = pm_runtime_get_sync(mcspi->dev);
|
||||
if (ret < 0) {
|
||||
pm_runtime_put_noidle(mcspi->dev);
|
||||
if (initial_setup)
|
||||
omap2_mcspi_cleanup(spi);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = omap2_mcspi_setup_transfer(spi, NULL);
|
||||
if (ret && initial_setup)
|
||||
omap2_mcspi_cleanup(spi);
|
||||
|
||||
pm_runtime_mark_last_busy(mcspi->dev);
|
||||
pm_runtime_put_autosuspend(mcspi->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void omap2_mcspi_cleanup(struct spi_device *spi)
|
||||
{
|
||||
struct omap2_mcspi_cs *cs;
|
||||
|
||||
if (spi->controller_state) {
|
||||
/* Unlink controller state from context save list */
|
||||
cs = spi->controller_state;
|
||||
list_del(&cs->node);
|
||||
|
||||
kfree(cs);
|
||||
}
|
||||
|
||||
if (gpio_is_valid(spi->cs_gpio))
|
||||
gpio_free(spi->cs_gpio);
|
||||
}
|
||||
|
||||
static irqreturn_t omap2_mcspi_irq_handler(int irq, void *data)
|
||||
{
|
||||
struct omap2_mcspi *mcspi = data;
|
||||
|
|
|
@ -1241,6 +1241,8 @@ static int setup_cs(struct spi_device *spi, struct chip_data *chip,
|
|||
chip->gpio_cs_inverted = spi->mode & SPI_CS_HIGH;
|
||||
|
||||
err = gpiod_direction_output(gpiod, !chip->gpio_cs_inverted);
|
||||
if (err)
|
||||
gpiod_put(chip->gpiod_cs);
|
||||
}
|
||||
|
||||
return err;
|
||||
|
@ -1254,6 +1256,7 @@ static int setup(struct spi_device *spi)
|
|||
struct driver_data *drv_data =
|
||||
spi_controller_get_devdata(spi->controller);
|
||||
uint tx_thres, tx_hi_thres, rx_thres;
|
||||
int err;
|
||||
|
||||
switch (drv_data->ssp_type) {
|
||||
case QUARK_X1000_SSP:
|
||||
|
@ -1400,7 +1403,11 @@ static int setup(struct spi_device *spi)
|
|||
if (drv_data->ssp_type == CE4100_SSP)
|
||||
return 0;
|
||||
|
||||
return setup_cs(spi, chip, chip_info);
|
||||
err = setup_cs(spi, chip, chip_info);
|
||||
if (err)
|
||||
kfree(chip);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void cleanup(struct spi_device *spi)
|
||||
|
|
|
@ -1066,6 +1066,7 @@ static const struct of_device_id sprd_spi_of_match[] = {
|
|||
{ .compatible = "sprd,sc9860-spi", },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sprd_spi_of_match);
|
||||
|
||||
static struct platform_driver sprd_spi_driver = {
|
||||
.driver = {
|
||||
|
|
|
@ -47,10 +47,6 @@ static void spidev_release(struct device *dev)
|
|||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
|
||||
/* spi controllers may cleanup for released devices */
|
||||
if (spi->controller->cleanup)
|
||||
spi->controller->cleanup(spi);
|
||||
|
||||
spi_controller_put(spi->controller);
|
||||
kfree(spi->driver_override);
|
||||
kfree(spi);
|
||||
|
@ -549,6 +545,12 @@ static int spi_dev_check(struct device *dev, void *data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void spi_cleanup(struct spi_device *spi)
|
||||
{
|
||||
if (spi->controller->cleanup)
|
||||
spi->controller->cleanup(spi);
|
||||
}
|
||||
|
||||
/**
|
||||
* spi_add_device - Add spi_device allocated with spi_alloc_device
|
||||
* @spi: spi_device to register
|
||||
|
@ -613,11 +615,13 @@ int spi_add_device(struct spi_device *spi)
|
|||
|
||||
/* Device may be bound to an active driver when this returns */
|
||||
status = device_add(&spi->dev);
|
||||
if (status < 0)
|
||||
if (status < 0) {
|
||||
dev_err(dev, "can't add %s, status %d\n",
|
||||
dev_name(&spi->dev), status);
|
||||
else
|
||||
spi_cleanup(spi);
|
||||
} else {
|
||||
dev_dbg(dev, "registered child %s\n", dev_name(&spi->dev));
|
||||
}
|
||||
|
||||
done:
|
||||
mutex_unlock(&spi_add_lock);
|
||||
|
@ -710,7 +714,9 @@ void spi_unregister_device(struct spi_device *spi)
|
|||
}
|
||||
if (ACPI_COMPANION(&spi->dev))
|
||||
acpi_device_clear_enumerated(ACPI_COMPANION(&spi->dev));
|
||||
device_unregister(&spi->dev);
|
||||
device_del(&spi->dev);
|
||||
spi_cleanup(spi);
|
||||
put_device(&spi->dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(spi_unregister_device);
|
||||
|
||||
|
|
|
@ -2406,7 +2406,7 @@ void rtw_cfg80211_indicate_sta_assoc(struct adapter *padapter, u8 *pmgmt_frame,
|
|||
DBG_871X(FUNC_ADPT_FMT"\n", FUNC_ADPT_ARG(padapter));
|
||||
|
||||
{
|
||||
struct station_info sinfo;
|
||||
struct station_info sinfo = {};
|
||||
u8 ie_offset;
|
||||
if (GetFrameSubType(pmgmt_frame) == WIFI_ASSOCREQ)
|
||||
ie_offset = _ASOCREQ_IE_OFFSET_;
|
||||
|
|
|
@ -292,6 +292,9 @@ static struct dwc3_ep *dwc3_wIndex_to_dep(struct dwc3 *dwc, __le16 wIndex_le)
|
|||
epnum |= 1;
|
||||
|
||||
dep = dwc->eps[epnum];
|
||||
if (dep == NULL)
|
||||
return NULL;
|
||||
|
||||
if (dep->flags & DWC3_EP_ENABLED)
|
||||
return dep;
|
||||
|
||||
|
|
|
@ -164,6 +164,14 @@ int usb_assign_descriptors(struct usb_function *f,
|
|||
{
|
||||
struct usb_gadget *g = f->config->cdev->gadget;
|
||||
|
||||
/* super-speed-plus descriptor falls back to super-speed one,
|
||||
* if such a descriptor was provided, thus avoiding a NULL
|
||||
* pointer dereference if a 5gbps capable gadget is used with
|
||||
* a 10gbps capable config (device port + cable + host port)
|
||||
*/
|
||||
if (!ssp)
|
||||
ssp = ss;
|
||||
|
||||
if (fs) {
|
||||
f->fs_descriptors = usb_copy_descriptors(fs);
|
||||
if (!f->fs_descriptors)
|
||||
|
|
|
@ -791,7 +791,7 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
fs_ecm_notify_desc.bEndpointAddress;
|
||||
|
||||
status = usb_assign_descriptors(f, ecm_fs_function, ecm_hs_function,
|
||||
ecm_ss_function, NULL);
|
||||
ecm_ss_function, ecm_ss_function);
|
||||
if (status)
|
||||
goto fail;
|
||||
|
||||
|
|
|
@ -304,7 +304,7 @@ static int eem_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
eem_ss_out_desc.bEndpointAddress = eem_fs_out_desc.bEndpointAddress;
|
||||
|
||||
status = usb_assign_descriptors(f, eem_fs_function, eem_hs_function,
|
||||
eem_ss_function, NULL);
|
||||
eem_ss_function, eem_ss_function);
|
||||
if (status)
|
||||
goto fail;
|
||||
|
||||
|
@ -497,7 +497,7 @@ static int eem_unwrap(struct gether *port,
|
|||
skb2 = skb_clone(skb, GFP_ATOMIC);
|
||||
if (unlikely(!skb2)) {
|
||||
DBG(cdev, "unable to unframe EEM packet\n");
|
||||
continue;
|
||||
goto next;
|
||||
}
|
||||
skb_trim(skb2, len - ETH_FCS_LEN);
|
||||
|
||||
|
@ -507,7 +507,7 @@ static int eem_unwrap(struct gether *port,
|
|||
GFP_ATOMIC);
|
||||
if (unlikely(!skb3)) {
|
||||
dev_kfree_skb_any(skb2);
|
||||
continue;
|
||||
goto next;
|
||||
}
|
||||
dev_kfree_skb_any(skb2);
|
||||
skb_queue_tail(list, skb3);
|
||||
|
|
|
@ -3585,6 +3585,9 @@ static void ffs_func_unbind(struct usb_configuration *c,
|
|||
ffs->func = NULL;
|
||||
}
|
||||
|
||||
/* Drain any pending AIO completions */
|
||||
drain_workqueue(ffs->io_completion_wq);
|
||||
|
||||
if (!--opts->refcnt)
|
||||
functionfs_unbind(ffs);
|
||||
|
||||
|
|
|
@ -808,7 +808,8 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
hidg_fs_out_ep_desc.bEndpointAddress;
|
||||
|
||||
status = usb_assign_descriptors(f, hidg_fs_descriptors,
|
||||
hidg_hs_descriptors, hidg_ss_descriptors, NULL);
|
||||
hidg_hs_descriptors, hidg_ss_descriptors,
|
||||
hidg_ss_descriptors);
|
||||
if (status)
|
||||
goto fail;
|
||||
|
||||
|
|
|
@ -207,7 +207,7 @@ autoconf_fail:
|
|||
ss_loop_sink_desc.bEndpointAddress = fs_loop_sink_desc.bEndpointAddress;
|
||||
|
||||
ret = usb_assign_descriptors(f, fs_loopback_descs, hs_loopback_descs,
|
||||
ss_loopback_descs, NULL);
|
||||
ss_loopback_descs, ss_loopback_descs);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -583,7 +583,7 @@ static void ncm_do_notify(struct f_ncm *ncm)
|
|||
data[0] = cpu_to_le32(ncm_bitrate(cdev->gadget));
|
||||
data[1] = data[0];
|
||||
|
||||
DBG(cdev, "notify speed %d\n", ncm_bitrate(cdev->gadget));
|
||||
DBG(cdev, "notify speed %u\n", ncm_bitrate(cdev->gadget));
|
||||
ncm->notify_state = NCM_NOTIFY_CONNECT;
|
||||
break;
|
||||
}
|
||||
|
@ -1101,11 +1101,11 @@ static struct sk_buff *ncm_wrap_ntb(struct gether *port,
|
|||
ncm->ndp_dgram_count = 1;
|
||||
|
||||
/* Note: we skip opts->next_ndp_index */
|
||||
}
|
||||
|
||||
/* Delay the timer. */
|
||||
hrtimer_start(&ncm->task_timer, TX_TIMEOUT_NSECS,
|
||||
HRTIMER_MODE_REL_SOFT);
|
||||
/* Start the timer. */
|
||||
hrtimer_start(&ncm->task_timer, TX_TIMEOUT_NSECS,
|
||||
HRTIMER_MODE_REL_SOFT);
|
||||
}
|
||||
|
||||
/* Add the datagram position entries */
|
||||
ntb_ndp = skb_put_zero(ncm->skb_tx_ndp, dgram_idx_len);
|
||||
|
|
|
@ -1063,7 +1063,8 @@ autoconf_fail:
|
|||
ss_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress;
|
||||
|
||||
ret = usb_assign_descriptors(f, fs_printer_function,
|
||||
hs_printer_function, ss_printer_function, NULL);
|
||||
hs_printer_function, ss_printer_function,
|
||||
ss_printer_function);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -789,7 +789,7 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
ss_notify_desc.bEndpointAddress = fs_notify_desc.bEndpointAddress;
|
||||
|
||||
status = usb_assign_descriptors(f, eth_fs_function, eth_hs_function,
|
||||
eth_ss_function, NULL);
|
||||
eth_ss_function, eth_ss_function);
|
||||
if (status)
|
||||
goto fail;
|
||||
|
||||
|
|
|
@ -233,7 +233,7 @@ static int gser_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
gser_ss_out_desc.bEndpointAddress = gser_fs_out_desc.bEndpointAddress;
|
||||
|
||||
status = usb_assign_descriptors(f, gser_fs_function, gser_hs_function,
|
||||
gser_ss_function, NULL);
|
||||
gser_ss_function, gser_ss_function);
|
||||
if (status)
|
||||
goto fail;
|
||||
dev_dbg(&cdev->gadget->dev, "generic ttyGS%d: %s speed IN/%s OUT/%s\n",
|
||||
|
|
|
@ -431,7 +431,8 @@ no_iso:
|
|||
ss_iso_sink_desc.bEndpointAddress = fs_iso_sink_desc.bEndpointAddress;
|
||||
|
||||
ret = usb_assign_descriptors(f, fs_source_sink_descs,
|
||||
hs_source_sink_descs, ss_source_sink_descs, NULL);
|
||||
hs_source_sink_descs, ss_source_sink_descs,
|
||||
ss_source_sink_descs);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -358,7 +358,7 @@ geth_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
fs_subset_out_desc.bEndpointAddress;
|
||||
|
||||
status = usb_assign_descriptors(f, fs_eth_function, hs_eth_function,
|
||||
ss_eth_function, NULL);
|
||||
ss_eth_function, ss_eth_function);
|
||||
if (status)
|
||||
goto fail;
|
||||
|
||||
|
|
|
@ -2056,7 +2056,8 @@ static int tcm_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
uasp_fs_cmd_desc.bEndpointAddress = uasp_ss_cmd_desc.bEndpointAddress;
|
||||
|
||||
ret = usb_assign_descriptors(f, uasp_fs_function_desc,
|
||||
uasp_hs_function_desc, uasp_ss_function_desc, NULL);
|
||||
uasp_hs_function_desc, uasp_ss_function_desc,
|
||||
uasp_ss_function_desc);
|
||||
if (ret)
|
||||
goto ep_fail;
|
||||
|
||||
|
|
|
@ -1871,9 +1871,8 @@ static void musb_pm_runtime_check_session(struct musb *musb)
|
|||
schedule_delayed_work(&musb->irq_work,
|
||||
msecs_to_jiffies(1000));
|
||||
musb->quirk_retries--;
|
||||
break;
|
||||
}
|
||||
fallthrough;
|
||||
break;
|
||||
case MUSB_QUIRK_B_INVALID_VBUS_91:
|
||||
if (musb->quirk_retries && !musb->flush_irq_work) {
|
||||
musb_dbg(musb,
|
||||
|
|
|
@ -507,6 +507,12 @@ struct cp210x_single_port_config {
|
|||
#define CP210X_2NCONFIG_GPIO_RSTLATCH_IDX 587
|
||||
#define CP210X_2NCONFIG_GPIO_CONTROL_IDX 600
|
||||
|
||||
/* CP2102N QFN20 port configuration values */
|
||||
#define CP2102N_QFN20_GPIO2_TXLED_MODE BIT(2)
|
||||
#define CP2102N_QFN20_GPIO3_RXLED_MODE BIT(3)
|
||||
#define CP2102N_QFN20_GPIO1_RS485_MODE BIT(4)
|
||||
#define CP2102N_QFN20_GPIO0_CLK_MODE BIT(6)
|
||||
|
||||
/* CP210X_VENDOR_SPECIFIC, CP210X_WRITE_LATCH call writes these 0x2 bytes. */
|
||||
struct cp210x_gpio_write {
|
||||
u8 mask;
|
||||
|
@ -1691,7 +1697,19 @@ static int cp2102n_gpioconf_init(struct usb_serial *serial)
|
|||
priv->gpio_pushpull = (gpio_pushpull >> 3) & 0x0f;
|
||||
|
||||
/* 0 indicates GPIO mode, 1 is alternate function */
|
||||
priv->gpio_altfunc = (gpio_ctrl >> 2) & 0x0f;
|
||||
if (priv->partnum == CP210X_PARTNUM_CP2102N_QFN20) {
|
||||
/* QFN20 is special... */
|
||||
if (gpio_ctrl & CP2102N_QFN20_GPIO0_CLK_MODE) /* GPIO 0 */
|
||||
priv->gpio_altfunc |= BIT(0);
|
||||
if (gpio_ctrl & CP2102N_QFN20_GPIO1_RS485_MODE) /* GPIO 1 */
|
||||
priv->gpio_altfunc |= BIT(1);
|
||||
if (gpio_ctrl & CP2102N_QFN20_GPIO2_TXLED_MODE) /* GPIO 2 */
|
||||
priv->gpio_altfunc |= BIT(2);
|
||||
if (gpio_ctrl & CP2102N_QFN20_GPIO3_RXLED_MODE) /* GPIO 3 */
|
||||
priv->gpio_altfunc |= BIT(3);
|
||||
} else {
|
||||
priv->gpio_altfunc = (gpio_ctrl >> 2) & 0x0f;
|
||||
}
|
||||
|
||||
if (priv->partnum == CP210X_PARTNUM_CP2102N_QFN28) {
|
||||
/*
|
||||
|
|
|
@ -611,6 +611,7 @@ static const struct usb_device_id id_table_combined[] = {
|
|||
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONLX_PLUS_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_NT_ORION_IO_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_NT_ORIONMX_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SYNAPSE_SS200_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_CUSTOMWARE_MINIPLEX2_PID) },
|
||||
|
|
|
@ -581,6 +581,7 @@
|
|||
#define FTDI_NT_ORIONLXM_PID 0x7c90 /* OrionLXm Substation Automation Platform */
|
||||
#define FTDI_NT_ORIONLX_PLUS_PID 0x7c91 /* OrionLX+ Substation Automation Platform */
|
||||
#define FTDI_NT_ORION_IO_PID 0x7c92 /* Orion I/O */
|
||||
#define FTDI_NT_ORIONMX_PID 0x7c93 /* OrionMX */
|
||||
|
||||
/*
|
||||
* Synapse Wireless product ids (FTDI_VID)
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
|
||||
#define ZYXEL_VENDOR_ID 0x0586
|
||||
#define ZYXEL_OMNINET_ID 0x1000
|
||||
#define ZYXEL_OMNI_56K_PLUS_ID 0x1500
|
||||
/* This one seems to be a re-branded ZyXEL device */
|
||||
#define BT_IGNITIONPRO_ID 0x2000
|
||||
|
||||
|
@ -40,6 +41,7 @@ static int omninet_port_remove(struct usb_serial_port *port);
|
|||
|
||||
static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(ZYXEL_VENDOR_ID, ZYXEL_OMNINET_ID) },
|
||||
{ USB_DEVICE(ZYXEL_VENDOR_ID, ZYXEL_OMNI_56K_PLUS_ID) },
|
||||
{ USB_DEVICE(ZYXEL_VENDOR_ID, BT_IGNITIONPRO_ID) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
|
|
@ -416,7 +416,7 @@ static void qt2_close(struct usb_serial_port *port)
|
|||
|
||||
/* flush the port transmit buffer */
|
||||
i = usb_control_msg(serial->dev,
|
||||
usb_rcvctrlpipe(serial->dev, 0),
|
||||
usb_sndctrlpipe(serial->dev, 0),
|
||||
QT2_FLUSH_DEVICE, 0x40, 1,
|
||||
port_priv->device_port, NULL, 0, QT2_USB_TIMEOUT);
|
||||
|
||||
|
@ -426,7 +426,7 @@ static void qt2_close(struct usb_serial_port *port)
|
|||
|
||||
/* flush the port receive buffer */
|
||||
i = usb_control_msg(serial->dev,
|
||||
usb_rcvctrlpipe(serial->dev, 0),
|
||||
usb_sndctrlpipe(serial->dev, 0),
|
||||
QT2_FLUSH_DEVICE, 0x40, 0,
|
||||
port_priv->device_port, NULL, 0, QT2_USB_TIMEOUT);
|
||||
|
||||
|
@ -670,7 +670,7 @@ static int qt2_attach(struct usb_serial *serial)
|
|||
int status;
|
||||
|
||||
/* power on unit */
|
||||
status = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
|
||||
status = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),
|
||||
0xc2, 0x40, 0x8000, 0, NULL, 0,
|
||||
QT2_USB_TIMEOUT);
|
||||
if (status < 0) {
|
||||
|
|
|
@ -243,7 +243,7 @@ find_mux:
|
|||
dev = class_find_device(&typec_mux_class, NULL, con->fwnode,
|
||||
mux_fwnode_match);
|
||||
|
||||
return dev ? to_typec_switch(dev) : ERR_PTR(-EPROBE_DEFER);
|
||||
return dev ? to_typec_mux(dev) : ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -377,7 +377,7 @@ static int wcove_pd_transmit(struct tcpc_dev *tcpc,
|
|||
const u8 *data = (void *)msg;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < pd_header_cnt(msg->header) * 4 + 2; i++) {
|
||||
for (i = 0; i < pd_header_cnt_le(msg->header) * 4 + 2; i++) {
|
||||
ret = regmap_write(wcove->regmap, USBC_TX_DATA + i,
|
||||
data[i]);
|
||||
if (ret)
|
||||
|
|
|
@ -977,6 +977,7 @@ err_unregister:
|
|||
}
|
||||
|
||||
err_reset:
|
||||
memset(&ucsi->cap, 0, sizeof(ucsi->cap));
|
||||
ucsi_reset_ppm(ucsi);
|
||||
err:
|
||||
mutex_unlock(&ucsi->ppm_lock);
|
||||
|
|
|
@ -2463,6 +2463,24 @@ static int validate_super(struct btrfs_fs_info *fs_info,
|
|||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
if (memcmp(fs_info->fs_devices->fsid, fs_info->super_copy->fsid,
|
||||
BTRFS_FSID_SIZE)) {
|
||||
btrfs_err(fs_info,
|
||||
"superblock fsid doesn't match fsid of fs_devices: %pU != %pU",
|
||||
fs_info->super_copy->fsid, fs_info->fs_devices->fsid);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
if (btrfs_fs_incompat(fs_info, METADATA_UUID) &&
|
||||
memcmp(fs_info->fs_devices->metadata_uuid,
|
||||
fs_info->super_copy->metadata_uuid, BTRFS_FSID_SIZE)) {
|
||||
btrfs_err(fs_info,
|
||||
"superblock metadata_uuid doesn't match metadata uuid of fs_devices: %pU != %pU",
|
||||
fs_info->super_copy->metadata_uuid,
|
||||
fs_info->fs_devices->metadata_uuid);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
if (memcmp(fs_info->fs_devices->metadata_uuid, sb->dev_item.fsid,
|
||||
BTRFS_FSID_SIZE) != 0) {
|
||||
btrfs_err(fs_info,
|
||||
|
@ -2837,14 +2855,6 @@ int open_ctree(struct super_block *sb,
|
|||
|
||||
disk_super = fs_info->super_copy;
|
||||
|
||||
ASSERT(!memcmp(fs_info->fs_devices->fsid, fs_info->super_copy->fsid,
|
||||
BTRFS_FSID_SIZE));
|
||||
|
||||
if (btrfs_fs_incompat(fs_info, METADATA_UUID)) {
|
||||
ASSERT(!memcmp(fs_info->fs_devices->metadata_uuid,
|
||||
fs_info->super_copy->metadata_uuid,
|
||||
BTRFS_FSID_SIZE));
|
||||
}
|
||||
|
||||
features = btrfs_super_flags(disk_super);
|
||||
if (features & BTRFS_SUPER_FLAG_CHANGING_FSID_V2) {
|
||||
|
|
|
@ -1163,7 +1163,7 @@ int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,
|
|||
int del_nr = 0;
|
||||
int del_slot = 0;
|
||||
int recow;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
u64 ino = btrfs_ino(inode);
|
||||
|
||||
path = btrfs_alloc_path();
|
||||
|
@ -1384,7 +1384,7 @@ again:
|
|||
}
|
||||
out:
|
||||
btrfs_free_path(path);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -399,7 +399,7 @@ struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init)
|
|||
|
||||
if (cl_init->hostname == NULL) {
|
||||
WARN_ON(1);
|
||||
return NULL;
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
/* see if the client already exists */
|
||||
|
|
|
@ -203,6 +203,7 @@ struct nfs4_exception {
|
|||
struct inode *inode;
|
||||
nfs4_stateid *stateid;
|
||||
long timeout;
|
||||
unsigned char task_is_privileged : 1;
|
||||
unsigned char delay : 1,
|
||||
recovering : 1,
|
||||
retry : 1;
|
||||
|
|
|
@ -435,8 +435,8 @@ struct nfs_client *nfs4_init_client(struct nfs_client *clp,
|
|||
*/
|
||||
nfs_mark_client_ready(clp, -EPERM);
|
||||
}
|
||||
nfs_put_client(clp);
|
||||
clear_bit(NFS_CS_TSM_POSSIBLE, &clp->cl_flags);
|
||||
nfs_put_client(clp);
|
||||
return old;
|
||||
|
||||
error:
|
||||
|
|
|
@ -581,6 +581,8 @@ int nfs4_handle_exception(struct nfs_server *server, int errorcode, struct nfs4_
|
|||
goto out_retry;
|
||||
}
|
||||
if (exception->recovering) {
|
||||
if (exception->task_is_privileged)
|
||||
return -EDEADLOCK;
|
||||
ret = nfs4_wait_clnt_recover(clp);
|
||||
if (test_bit(NFS_MIG_FAILED, &server->mig_status))
|
||||
return -EIO;
|
||||
|
@ -606,6 +608,8 @@ nfs4_async_handle_exception(struct rpc_task *task, struct nfs_server *server,
|
|||
goto out_retry;
|
||||
}
|
||||
if (exception->recovering) {
|
||||
if (exception->task_is_privileged)
|
||||
return -EDEADLOCK;
|
||||
rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL);
|
||||
if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0)
|
||||
rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task);
|
||||
|
@ -5795,6 +5799,14 @@ static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen
|
|||
do {
|
||||
err = __nfs4_proc_set_acl(inode, buf, buflen);
|
||||
trace_nfs4_set_acl(inode, err);
|
||||
if (err == -NFS4ERR_BADOWNER || err == -NFS4ERR_BADNAME) {
|
||||
/*
|
||||
* no need to retry since the kernel
|
||||
* isn't involved in encoding the ACEs.
|
||||
*/
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
||||
err = nfs4_handle_exception(NFS_SERVER(inode), err,
|
||||
&exception);
|
||||
} while (exception.retry);
|
||||
|
@ -6231,6 +6243,7 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
|
|||
struct nfs4_exception exception = {
|
||||
.inode = data->inode,
|
||||
.stateid = &data->stateid,
|
||||
.task_is_privileged = data->args.seq_args.sa_privileged,
|
||||
};
|
||||
|
||||
if (!nfs4_sequence_done(task, &data->res.seq_res))
|
||||
|
@ -6349,7 +6362,6 @@ static int _nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred,
|
|||
data = kzalloc(sizeof(*data), GFP_NOFS);
|
||||
if (data == NULL)
|
||||
return -ENOMEM;
|
||||
nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1, 0);
|
||||
|
||||
nfs4_state_protect(server->nfs_client,
|
||||
NFS_SP4_MACH_CRED_CLEANUP,
|
||||
|
@ -6377,6 +6389,12 @@ static int _nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred,
|
|||
}
|
||||
}
|
||||
|
||||
if (!data->inode)
|
||||
nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1,
|
||||
1);
|
||||
else
|
||||
nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1,
|
||||
0);
|
||||
task_setup_data.callback_data = data;
|
||||
msg.rpc_argp = &data->args;
|
||||
msg.rpc_resp = &data->res;
|
||||
|
@ -9332,15 +9350,20 @@ int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
|
|||
&task_setup_data.rpc_client, &msg);
|
||||
|
||||
dprintk("--> %s\n", __func__);
|
||||
lrp->inode = nfs_igrab_and_active(lrp->args.inode);
|
||||
if (!sync) {
|
||||
lrp->inode = nfs_igrab_and_active(lrp->args.inode);
|
||||
if (!lrp->inode) {
|
||||
nfs4_layoutreturn_release(lrp);
|
||||
return -EAGAIN;
|
||||
}
|
||||
task_setup_data.flags |= RPC_TASK_ASYNC;
|
||||
}
|
||||
nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1, 0);
|
||||
if (!lrp->inode)
|
||||
nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1,
|
||||
1);
|
||||
else
|
||||
nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1,
|
||||
0);
|
||||
task = rpc_run_task(&task_setup_data);
|
||||
if (IS_ERR(task))
|
||||
return PTR_ERR(task);
|
||||
|
|
|
@ -2527,6 +2527,13 @@ out:
|
|||
}
|
||||
|
||||
#ifdef CONFIG_SECURITY
|
||||
static int proc_pid_attr_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
file->private_data = NULL;
|
||||
__mem_open(inode, file, PTRACE_MODE_READ_FSCREDS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t proc_pid_attr_read(struct file * file, char __user * buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
|
@ -2557,7 +2564,7 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf,
|
|||
int rv;
|
||||
|
||||
/* A task may only write when it was the opener. */
|
||||
if (file->f_cred != current_real_cred())
|
||||
if (file->private_data != current->mm)
|
||||
return -EPERM;
|
||||
|
||||
rcu_read_lock();
|
||||
|
@ -2607,9 +2614,11 @@ out:
|
|||
}
|
||||
|
||||
static const struct file_operations proc_pid_attr_operations = {
|
||||
.open = proc_pid_attr_open,
|
||||
.read = proc_pid_attr_read,
|
||||
.write = proc_pid_attr_write,
|
||||
.llseek = generic_file_llseek,
|
||||
.release = mem_release,
|
||||
};
|
||||
|
||||
#define LSM_DIR_OPS(LSM) \
|
||||
|
|
|
@ -882,6 +882,7 @@
|
|||
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
||||
#define PERCPU_DECRYPTED_SECTION \
|
||||
. = ALIGN(PAGE_SIZE); \
|
||||
*(.data..decrypted) \
|
||||
*(.data..percpu..decrypted) \
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
#else
|
||||
|
|
|
@ -1045,7 +1045,15 @@ __gfn_to_memslot(struct kvm_memslots *slots, gfn_t gfn)
|
|||
static inline unsigned long
|
||||
__gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn)
|
||||
{
|
||||
return slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE;
|
||||
/*
|
||||
* The index was checked originally in search_memslots. To avoid
|
||||
* that a malicious guest builds a Spectre gadget out of e.g. page
|
||||
* table walks, do not let the processor speculate loads outside
|
||||
* the guest's registered memslots.
|
||||
*/
|
||||
unsigned long offset = gfn - slot->base_gfn;
|
||||
offset = array_index_nospec(offset, slot->npages);
|
||||
return slot->userspace_addr + offset * PAGE_SIZE;
|
||||
}
|
||||
|
||||
static inline int memslot_id(struct kvm *kvm, gfn_t gfn)
|
||||
|
|
|
@ -632,6 +632,7 @@ struct mlx4_caps {
|
|||
bool wol_port[MLX4_MAX_PORTS + 1];
|
||||
struct mlx4_rate_limit_caps rl_caps;
|
||||
u32 health_buffer_addrs;
|
||||
bool map_clock_to_user;
|
||||
};
|
||||
|
||||
struct mlx4_buf_list {
|
||||
|
|
|
@ -425,7 +425,7 @@ static inline unsigned int rdo_max_power(u32 rdo)
|
|||
#define PD_T_SENDER_RESPONSE 60 /* 24 - 30 ms, relaxed */
|
||||
#define PD_T_SOURCE_ACTIVITY 45
|
||||
#define PD_T_SINK_ACTIVITY 135
|
||||
#define PD_T_SINK_WAIT_CAP 240
|
||||
#define PD_T_SINK_WAIT_CAP 310 /* 310 - 620 ms */
|
||||
#define PD_T_PS_TRANSITION 500
|
||||
#define PD_T_SRC_TRANSITION 35
|
||||
#define PD_T_DRP_SNK 40
|
||||
|
|
|
@ -821,6 +821,10 @@ static int cgroup1_rename(struct kernfs_node *kn, struct kernfs_node *new_parent
|
|||
struct cgroup *cgrp = kn->priv;
|
||||
int ret;
|
||||
|
||||
/* do not accept '\n' to prevent making /proc/<pid>/cgroup unparsable */
|
||||
if (strchr(new_name_str, '\n'))
|
||||
return -EINVAL;
|
||||
|
||||
if (kernfs_type(kn) != KERNFS_DIR)
|
||||
return -ENOTDIR;
|
||||
if (kn->parent != new_parent)
|
||||
|
|
|
@ -5721,8 +5721,6 @@ int __init cgroup_init_early(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static u16 cgroup_disable_mask __initdata;
|
||||
|
||||
/**
|
||||
* cgroup_init - cgroup initialization
|
||||
*
|
||||
|
@ -5781,12 +5779,8 @@ int __init cgroup_init(void)
|
|||
* disabled flag and cftype registration needs kmalloc,
|
||||
* both of which aren't available during early_init.
|
||||
*/
|
||||
if (cgroup_disable_mask & (1 << ssid)) {
|
||||
static_branch_disable(cgroup_subsys_enabled_key[ssid]);
|
||||
printk(KERN_INFO "Disabling %s control group subsystem\n",
|
||||
ss->name);
|
||||
if (!cgroup_ssid_enabled(ssid))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (cgroup1_ssid_disabled(ssid))
|
||||
printk(KERN_INFO "Disabling %s control group subsystem in v1 mounts\n",
|
||||
|
@ -6173,7 +6167,10 @@ static int __init cgroup_disable(char *str)
|
|||
if (strcmp(token, ss->name) &&
|
||||
strcmp(token, ss->legacy_name))
|
||||
continue;
|
||||
cgroup_disable_mask |= 1 << i;
|
||||
|
||||
static_branch_disable(cgroup_subsys_enabled_key[i]);
|
||||
pr_info("Disabling %s control group subsystem\n",
|
||||
ss->name);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
|
|
@ -4249,7 +4249,9 @@ find_get_context(struct pmu *pmu, struct task_struct *task,
|
|||
cpuctx = per_cpu_ptr(pmu->pmu_cpu_context, cpu);
|
||||
ctx = &cpuctx->ctx;
|
||||
get_ctx(ctx);
|
||||
raw_spin_lock_irqsave(&ctx->lock, flags);
|
||||
++ctx->pin_count;
|
||||
raw_spin_unlock_irqrestore(&ctx->lock, flags);
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
|
|
@ -7660,7 +7660,7 @@ static bool __update_blocked_fair(struct rq *rq, bool *done)
|
|||
/* Propagate pending load changes to the parent, if any: */
|
||||
se = cfs_rq->tg->se[cpu];
|
||||
if (se && !skip_blocked_update(se))
|
||||
update_load_avg(cfs_rq_of(se), se, 0);
|
||||
update_load_avg(cfs_rq_of(se), se, UPDATE_TG);
|
||||
|
||||
/*
|
||||
* There can be a lot of idle CPU cgroups. Don't let fully
|
||||
|
|
|
@ -1953,12 +1953,18 @@ static int ftrace_hash_ipmodify_update(struct ftrace_ops *ops,
|
|||
|
||||
static void print_ip_ins(const char *fmt, const unsigned char *p)
|
||||
{
|
||||
char ins[MCOUNT_INSN_SIZE];
|
||||
int i;
|
||||
|
||||
if (probe_kernel_read(ins, p, MCOUNT_INSN_SIZE)) {
|
||||
printk(KERN_CONT "%s[FAULT] %px\n", fmt, p);
|
||||
return;
|
||||
}
|
||||
|
||||
printk(KERN_CONT "%s", fmt);
|
||||
|
||||
for (i = 0; i < MCOUNT_INSN_SIZE; i++)
|
||||
printk(KERN_CONT "%s%02x", i ? ":" : "", p[i]);
|
||||
printk(KERN_CONT "%s%02x", i ? ":" : "", ins[i]);
|
||||
}
|
||||
|
||||
enum ftrace_bug_type ftrace_bug_type;
|
||||
|
|
|
@ -2487,7 +2487,7 @@ trace_event_buffer_lock_reserve(struct ring_buffer **current_rb,
|
|||
(entry = this_cpu_read(trace_buffered_event))) {
|
||||
/* Try to use the per cpu buffer first */
|
||||
val = this_cpu_inc_return(trace_buffered_event_cnt);
|
||||
if ((len < (PAGE_SIZE - sizeof(*entry))) && val == 1) {
|
||||
if ((len < (PAGE_SIZE - sizeof(*entry) - sizeof(entry->array[0]))) && val == 1) {
|
||||
trace_event_setup(entry, type, flags, pc);
|
||||
entry->array[0] = len;
|
||||
return entry;
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
#include <linux/uaccess.h>
|
||||
#include <linux/sched/isolation.h>
|
||||
#include <linux/nmi.h>
|
||||
#include <linux/kvm_para.h>
|
||||
|
||||
#include "workqueue_internal.h"
|
||||
|
||||
|
@ -5734,6 +5735,7 @@ static void wq_watchdog_timer_fn(struct timer_list *unused)
|
|||
{
|
||||
unsigned long thresh = READ_ONCE(wq_watchdog_thresh) * HZ;
|
||||
bool lockup_detected = false;
|
||||
unsigned long now = jiffies;
|
||||
struct worker_pool *pool;
|
||||
int pi;
|
||||
|
||||
|
@ -5748,6 +5750,12 @@ static void wq_watchdog_timer_fn(struct timer_list *unused)
|
|||
if (list_empty(&pool->worklist))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* If a virtual machine is stopped by the host it can look to
|
||||
* the watchdog like a stall.
|
||||
*/
|
||||
kvm_check_and_clear_guest_paused();
|
||||
|
||||
/* get the latest of pool and touched timestamps */
|
||||
pool_ts = READ_ONCE(pool->watchdog_ts);
|
||||
touched = READ_ONCE(wq_watchdog_touched);
|
||||
|
@ -5766,12 +5774,12 @@ static void wq_watchdog_timer_fn(struct timer_list *unused)
|
|||
}
|
||||
|
||||
/* did we stall? */
|
||||
if (time_after(jiffies, ts + thresh)) {
|
||||
if (time_after(now, ts + thresh)) {
|
||||
lockup_detected = true;
|
||||
pr_emerg("BUG: workqueue lockup - pool");
|
||||
pr_cont_pool_info(pool);
|
||||
pr_cont(" stuck for %us!\n",
|
||||
jiffies_to_msecs(jiffies - pool_ts) / 1000);
|
||||
jiffies_to_msecs(now - pool_ts) / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -452,11 +452,13 @@ void netlink_table_ungrab(void)
|
|||
static inline void
|
||||
netlink_lock_table(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
/* read_lock() synchronizes us to netlink_table_grab */
|
||||
|
||||
read_lock(&nl_table_lock);
|
||||
read_lock_irqsave(&nl_table_lock, flags);
|
||||
atomic_inc(&nl_table_users);
|
||||
read_unlock(&nl_table_lock);
|
||||
read_unlock_irqrestore(&nl_table_lock, flags);
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
|
@ -333,7 +333,7 @@ static int rawsock_create(struct net *net, struct socket *sock,
|
|||
return -ESOCKTNOSUPPORT;
|
||||
|
||||
if (sock->type == SOCK_RAW) {
|
||||
if (!capable(CAP_NET_RAW))
|
||||
if (!ns_capable(net->user_ns, CAP_NET_RAW))
|
||||
return -EPERM;
|
||||
sock->ops = &rawsock_raw_ops;
|
||||
} else {
|
||||
|
|
|
@ -240,12 +240,23 @@ static struct rds_connection *__rds_conn_create(struct net *net,
|
|||
if (loop_trans) {
|
||||
rds_trans_put(loop_trans);
|
||||
conn->c_loopback = 1;
|
||||
if (is_outgoing && trans->t_prefer_loopback) {
|
||||
/* "outgoing" connection - and the transport
|
||||
* says it wants the connection handled by the
|
||||
* loopback transport. This is what TCP does.
|
||||
*/
|
||||
trans = &rds_loop_transport;
|
||||
if (trans->t_prefer_loopback) {
|
||||
if (likely(is_outgoing)) {
|
||||
/* "outgoing" connection to local address.
|
||||
* Protocol says it wants the connection
|
||||
* handled by the loopback transport.
|
||||
* This is what TCP does.
|
||||
*/
|
||||
trans = &rds_loop_transport;
|
||||
} else {
|
||||
/* No transport currently in use
|
||||
* should end up here, but if it
|
||||
* does, reset/destroy the connection.
|
||||
*/
|
||||
kmem_cache_free(rds_conn_slab, conn);
|
||||
conn = ERR_PTR(-EOPNOTSUPP);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -323,8 +323,8 @@ out:
|
|||
}
|
||||
#endif
|
||||
|
||||
static int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
|
||||
__u32 scope_id)
|
||||
int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
|
||||
__u32 scope_id)
|
||||
{
|
||||
struct net_device *dev = NULL;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
|
|
|
@ -60,7 +60,8 @@ u32 rds_tcp_snd_una(struct rds_tcp_connection *tc);
|
|||
u64 rds_tcp_map_seq(struct rds_tcp_connection *tc, u32 seq);
|
||||
extern struct rds_transport rds_tcp_transport;
|
||||
void rds_tcp_accept_work(struct sock *sk);
|
||||
|
||||
int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
|
||||
__u32 scope_id);
|
||||
/* tcp_connect.c */
|
||||
int rds_tcp_conn_path_connect(struct rds_conn_path *cp);
|
||||
void rds_tcp_conn_path_shutdown(struct rds_conn_path *conn);
|
||||
|
|
|
@ -198,6 +198,12 @@ int rds_tcp_accept_one(struct socket *sock)
|
|||
}
|
||||
#endif
|
||||
|
||||
if (!rds_tcp_laddr_check(sock_net(sock->sk), peer_addr, dev_if)) {
|
||||
/* local address connection is only allowed via loopback */
|
||||
ret = -EOPNOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
|
||||
conn = rds_conn_create(sock_net(sock->sk),
|
||||
my_addr, peer_addr,
|
||||
&rds_tcp_transport, 0, GFP_KERNEL, dev_if);
|
||||
|
|
|
@ -41,6 +41,7 @@ struct max98088_priv {
|
|||
enum max98088_type devtype;
|
||||
struct max98088_pdata *pdata;
|
||||
struct clk *mclk;
|
||||
unsigned char mclk_prescaler;
|
||||
unsigned int sysclk;
|
||||
struct max98088_cdata dai[2];
|
||||
int eq_textcnt;
|
||||
|
@ -998,13 +999,16 @@ static int max98088_dai1_hw_params(struct snd_pcm_substream *substream,
|
|||
/* Configure NI when operating as master */
|
||||
if (snd_soc_component_read32(component, M98088_REG_14_DAI1_FORMAT)
|
||||
& M98088_DAI_MAS) {
|
||||
unsigned long pclk;
|
||||
|
||||
if (max98088->sysclk == 0) {
|
||||
dev_err(component->dev, "Invalid system clock frequency\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
ni = 65536ULL * (rate < 50000 ? 96ULL : 48ULL)
|
||||
* (unsigned long long int)rate;
|
||||
do_div(ni, (unsigned long long int)max98088->sysclk);
|
||||
pclk = DIV_ROUND_CLOSEST(max98088->sysclk, max98088->mclk_prescaler);
|
||||
ni = DIV_ROUND_CLOSEST_ULL(ni, pclk);
|
||||
snd_soc_component_write(component, M98088_REG_12_DAI1_CLKCFG_HI,
|
||||
(ni >> 8) & 0x7F);
|
||||
snd_soc_component_write(component, M98088_REG_13_DAI1_CLKCFG_LO,
|
||||
|
@ -1065,13 +1069,16 @@ static int max98088_dai2_hw_params(struct snd_pcm_substream *substream,
|
|||
/* Configure NI when operating as master */
|
||||
if (snd_soc_component_read32(component, M98088_REG_1C_DAI2_FORMAT)
|
||||
& M98088_DAI_MAS) {
|
||||
unsigned long pclk;
|
||||
|
||||
if (max98088->sysclk == 0) {
|
||||
dev_err(component->dev, "Invalid system clock frequency\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
ni = 65536ULL * (rate < 50000 ? 96ULL : 48ULL)
|
||||
* (unsigned long long int)rate;
|
||||
do_div(ni, (unsigned long long int)max98088->sysclk);
|
||||
pclk = DIV_ROUND_CLOSEST(max98088->sysclk, max98088->mclk_prescaler);
|
||||
ni = DIV_ROUND_CLOSEST_ULL(ni, pclk);
|
||||
snd_soc_component_write(component, M98088_REG_1A_DAI2_CLKCFG_HI,
|
||||
(ni >> 8) & 0x7F);
|
||||
snd_soc_component_write(component, M98088_REG_1B_DAI2_CLKCFG_LO,
|
||||
|
@ -1113,8 +1120,10 @@ static int max98088_dai_set_sysclk(struct snd_soc_dai *dai,
|
|||
*/
|
||||
if ((freq >= 10000000) && (freq < 20000000)) {
|
||||
snd_soc_component_write(component, M98088_REG_10_SYS_CLK, 0x10);
|
||||
max98088->mclk_prescaler = 1;
|
||||
} else if ((freq >= 20000000) && (freq < 30000000)) {
|
||||
snd_soc_component_write(component, M98088_REG_10_SYS_CLK, 0x20);
|
||||
max98088->mclk_prescaler = 2;
|
||||
} else {
|
||||
dev_err(component->dev, "Invalid master clock frequency\n");
|
||||
return -EINVAL;
|
||||
|
|
|
@ -411,6 +411,7 @@ static const struct of_device_id sti_sas_dev_match[] = {
|
|||
},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, sti_sas_dev_match);
|
||||
|
||||
static int sti_sas_driver_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
|
|
@ -568,6 +568,17 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
|||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Glavey TM800A550L */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
|
||||
/* Above strings are too generic, also match on BIOS version */
|
||||
DMI_MATCH(DMI_BIOS_VERSION, "ZY-8-BI-PX4S70VTR400-X423B-005-D"),
|
||||
},
|
||||
.driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
|
@ -635,6 +646,20 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
|
|||
BYT_RT5640_MONO_SPEAKER |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Lenovo Miix 3-830 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Lenovo MIIX 3-830"),
|
||||
},
|
||||
.driver_data = (void *)(BYT_RT5640_IN1_MAP |
|
||||
BYT_RT5640_JD_SRC_JD2_IN4N |
|
||||
BYT_RT5640_OVCD_TH_2000UA |
|
||||
BYT_RT5640_OVCD_SF_0P75 |
|
||||
BYT_RT5640_MONO_SPEAKER |
|
||||
BYT_RT5640_DIFF_MIC |
|
||||
BYT_RT5640_SSP0_AIF1 |
|
||||
BYT_RT5640_MCLK_EN),
|
||||
},
|
||||
{ /* Linx Linx7 tablet */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LINX"),
|
||||
|
|
|
@ -1631,6 +1631,7 @@ int perf_session__peek_event(struct perf_session *session, off_t file_offset,
|
|||
if (event->header.size < hdr_sz || event->header.size > buf_sz)
|
||||
return -1;
|
||||
|
||||
buf += hdr_sz;
|
||||
rest = event->header.size - hdr_sz;
|
||||
|
||||
if (readn(fd, buf, rest) != (ssize_t)rest)
|
||||
|
|
Loading…
Reference in New Issue