This is the 4.19.117 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl6emrgACgkQONu9yGCS aT7KHhAAnWFfpGr89QEPUIDcdYNqmjnBlf7WRmVqQxbM+umD5AWo8fdLkKA43Fsx nNdMP6POYUwMqXahNOYwxCfRuw5sqsz/5bZO8O5p6fIXk1WhtW6Nzw78DHmDpQSj Cdfo92dJVhRcsCOElhrdsIypuBr7LoAOFjTGIzx4OZVXM3VJhWPpIgDEtU5yy/+S ym9TSU1RyQ9C/mIev3z6AXTAzAzWKdHXKtkWf3YW/7Mgr2QCcwmZxDlp9L1+L6e3 lLn2IMcFH91Wj0hJX98OhkmjA0EJ/LNU4LaaIe/DxGBEtzyLjn+aoxGIEREnU/Y6 36+3neWC3tJmUIzgyoRgVby+Jti3APEq3ncD0xzD8MAKitxihru7vKdTyfSWwmY0 xSz2UbCbbF1BeG3MZQNzgdSQCn4o21Iyxu+aQVGSvVd4k43x4jbtNedLqA6mHmkz 7I/V7UXyyzztDwlgT+DZa3LT6j4iv8VI6rPl7Evm3b5Iu9un3KLjnOEsXnvxjx9D o8dsPkK/pqbIW75bfThkoo8llmm/SsQ0n5GTKbITx9x0jU9E3VlQNHv+DUkT2CEn 1cY4hsVNql475RsOabhXbfOXI7+uwUCxKEOVN7DysT8UGARGIXZOkrGLr4UqjQHI B4J8oKBPPS5ZQKEIC7j/h4V/exqtSZYTQ1GWUNj4uo9X7KnJ+K4= =kytQ -----END PGP SIGNATURE----- Merge 4.19.117 into android-4.19 Changes in 4.19.117 amd-xgbe: Use __napi_schedule() in BH context hsr: check protocol version in hsr_newlink() net: ipv4: devinet: Fix crash when add/del multicast IP with autojoin net: ipv6: do not consider routes via gateways for anycast address check net: qrtr: send msgs from local of same id as broadcast net: revert default NAPI poll timeout to 2 jiffies net: stmmac: dwmac-sunxi: Provide TX and RX fifo sizes net: dsa: mt7530: fix tagged frames pass-through in VLAN-unaware mode ovl: fix value of i_ino for lower hardlink corner case scsi: ufs: Fix ufshcd_hold() caused scheduling while atomic jbd2: improve comments about freeing data buffers whose page mapping is NULL pwm: pca9685: Fix PWM/GPIO inter-operation ext4: fix incorrect group count in ext4_fill_super error message ext4: fix incorrect inodes per group in error message ASoC: Intel: mrfld: fix incorrect check on p->sink ASoC: Intel: mrfld: return error codes when an error occurs ALSA: usb-audio: Filter error from connector kctl ops, too ALSA: usb-audio: Don't override ignore_ctl_error value from the map ALSA: usb-audio: Don't create jack controls for PCM terminals ALSA: usb-audio: Check mapping at creating connector controls, too keys: Fix proc_keys_next to increase position index tracing: Fix the race between registering 'snapshot' event trigger and triggering 'snapshot' operation btrfs: check commit root generation in should_ignore_root mac80211_hwsim: Use kstrndup() in place of kasprintf() usb: dwc3: gadget: don't enable interrupt when disabling endpoint usb: dwc3: gadget: Don't clear flags before transfer ended drm/amd/powerplay: force the trim of the mclk dpm_levels if OD is enabled ext4: do not zeroout extents beyond i_disksize kvm: x86: Host feature SSBD doesn't imply guest feature SPEC_CTRL_SSBD scsi: target: remove boilerplate code scsi: target: fix hang when multiple threads try to destroy the same iscsi session x86/microcode/AMD: Increase microcode PATCH_MAX_SIZE x86/resctrl: Preserve CDP enable over CPU hotplug x86/resctrl: Fix invalid attempt at removing the default resource group wil6210: check rx_buff_mgmt before accessing it wil6210: ignore HALP ICR if already handled wil6210: add general initialization/size checks wil6210: make sure Rx ring sizes are correlated wil6210: remove reset file from debugfs mm/vmalloc.c: move 'area->pages' after if statement Linux 4.19.117 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ib4ab9aa34c22c034887be15902a625ecc5622b35
This commit is contained in:
commit
fd8a9d61cf
44 changed files with 251 additions and 212 deletions
2
Makefile
2
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 116
|
||||
SUBLEVEL = 117
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ struct microcode_amd {
|
|||
unsigned int mpb[0];
|
||||
};
|
||||
|
||||
#define PATCH_MAX_SIZE PAGE_SIZE
|
||||
#define PATCH_MAX_SIZE (3 * PAGE_SIZE)
|
||||
|
||||
#ifdef CONFIG_MICROCODE_AMD
|
||||
extern void __init load_ucode_amd_bsp(unsigned int family);
|
||||
|
|
|
|||
|
|
@ -555,6 +555,8 @@ static void domain_add_cpu(int cpu, struct rdt_resource *r)
|
|||
d->id = id;
|
||||
cpumask_set_cpu(cpu, &d->cpu_mask);
|
||||
|
||||
rdt_domain_reconfigure_cdp(r);
|
||||
|
||||
if (r->alloc_capable && domain_setup_ctrlval(r, d)) {
|
||||
kfree(d);
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -567,5 +567,6 @@ void cqm_setup_limbo_handler(struct rdt_domain *dom, unsigned long delay_ms);
|
|||
void cqm_handle_limbo(struct work_struct *work);
|
||||
bool has_busy_rmid(struct rdt_resource *r, struct rdt_domain *d);
|
||||
void __check_limbo(struct rdt_domain *d, bool force_free);
|
||||
void rdt_domain_reconfigure_cdp(struct rdt_resource *r);
|
||||
|
||||
#endif /* _ASM_X86_INTEL_RDT_H */
|
||||
|
|
|
|||
|
|
@ -1777,6 +1777,19 @@ static int set_cache_qos_cfg(int level, bool enable)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Restore the qos cfg state when a domain comes online */
|
||||
void rdt_domain_reconfigure_cdp(struct rdt_resource *r)
|
||||
{
|
||||
if (!r->alloc_capable)
|
||||
return;
|
||||
|
||||
if (r == &rdt_resources_all[RDT_RESOURCE_L2DATA])
|
||||
l2_qos_cfg_update(&r->alloc_enabled);
|
||||
|
||||
if (r == &rdt_resources_all[RDT_RESOURCE_L3DATA])
|
||||
l3_qos_cfg_update(&r->alloc_enabled);
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable or disable the MBA software controller
|
||||
* which helps user specify bandwidth in MBps.
|
||||
|
|
@ -2910,7 +2923,8 @@ static int rdtgroup_rmdir(struct kernfs_node *kn)
|
|||
* If the rdtgroup is a mon group and parent directory
|
||||
* is a valid "mon_groups" directory, remove the mon group.
|
||||
*/
|
||||
if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == rdtgroup_default.kn) {
|
||||
if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == rdtgroup_default.kn &&
|
||||
rdtgrp != &rdtgroup_default) {
|
||||
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP ||
|
||||
rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) {
|
||||
ret = rdtgroup_ctrl_remove(kn, rdtgrp);
|
||||
|
|
|
|||
|
|
@ -509,7 +509,8 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|||
entry->edx |= F(SPEC_CTRL);
|
||||
if (boot_cpu_has(X86_FEATURE_STIBP))
|
||||
entry->edx |= F(INTEL_STIBP);
|
||||
if (boot_cpu_has(X86_FEATURE_SSBD))
|
||||
if (boot_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) ||
|
||||
boot_cpu_has(X86_FEATURE_AMD_SSBD))
|
||||
entry->edx |= F(SPEC_CTRL_SSBD);
|
||||
/*
|
||||
* We emulate ARCH_CAPABILITIES in software even
|
||||
|
|
|
|||
|
|
@ -3788,9 +3788,12 @@ static int smu7_trim_single_dpm_states(struct pp_hwmgr *hwmgr,
|
|||
{
|
||||
uint32_t i;
|
||||
|
||||
/* force the trim if mclk_switching is disabled to prevent flicker */
|
||||
bool force_trim = (low_limit == high_limit);
|
||||
for (i = 0; i < dpm_table->count; i++) {
|
||||
/*skip the trim if od is enabled*/
|
||||
if (!hwmgr->od_enabled && (dpm_table->dpm_levels[i].value < low_limit
|
||||
if ((!hwmgr->od_enabled || force_trim)
|
||||
&& (dpm_table->dpm_levels[i].value < low_limit
|
||||
|| dpm_table->dpm_levels[i].value > high_limit))
|
||||
dpm_table->dpm_levels[i].enabled = false;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -824,8 +824,9 @@ mt7530_port_set_vlan_unaware(struct dsa_switch *ds, int port)
|
|||
*/
|
||||
mt7530_rmw(priv, MT7530_PCR_P(port), PCR_PORT_VLAN_MASK,
|
||||
MT7530_PORT_MATRIX_MODE);
|
||||
mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK,
|
||||
VLAN_ATTR(MT7530_VLAN_TRANSPARENT));
|
||||
mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK | PVC_EG_TAG_MASK,
|
||||
VLAN_ATTR(MT7530_VLAN_TRANSPARENT) |
|
||||
PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT));
|
||||
|
||||
priv->ports[port].vlan_filtering = false;
|
||||
|
||||
|
|
@ -843,8 +844,8 @@ mt7530_port_set_vlan_unaware(struct dsa_switch *ds, int port)
|
|||
if (all_user_ports_removed) {
|
||||
mt7530_write(priv, MT7530_PCR_P(MT7530_CPU_PORT),
|
||||
PCR_MATRIX(dsa_user_ports(priv->ds)));
|
||||
mt7530_write(priv, MT7530_PVC_P(MT7530_CPU_PORT),
|
||||
PORT_SPEC_TAG);
|
||||
mt7530_write(priv, MT7530_PVC_P(MT7530_CPU_PORT), PORT_SPEC_TAG
|
||||
| PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -870,8 +871,9 @@ mt7530_port_set_vlan_aware(struct dsa_switch *ds, int port)
|
|||
/* Set the port as a user port which is to be able to recognize VID
|
||||
* from incoming packets before fetching entry within the VLAN table.
|
||||
*/
|
||||
mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK,
|
||||
VLAN_ATTR(MT7530_VLAN_USER));
|
||||
mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK | PVC_EG_TAG_MASK,
|
||||
VLAN_ATTR(MT7530_VLAN_USER) |
|
||||
PVC_EG_TAG(MT7530_VLAN_EG_DISABLED));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -1297,6 +1299,10 @@ mt7530_setup(struct dsa_switch *ds)
|
|||
mt7530_cpu_port_enable(priv, i);
|
||||
else
|
||||
mt7530_port_disable(ds, i, NULL);
|
||||
|
||||
/* Enable consistent egress tag */
|
||||
mt7530_rmw(priv, MT7530_PVC_P(i), PVC_EG_TAG_MASK,
|
||||
PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT));
|
||||
}
|
||||
|
||||
/* Flush the FDB table */
|
||||
|
|
|
|||
|
|
@ -167,9 +167,16 @@ enum mt7530_port_mode {
|
|||
/* Register for port vlan control */
|
||||
#define MT7530_PVC_P(x) (0x2010 + ((x) * 0x100))
|
||||
#define PORT_SPEC_TAG BIT(5)
|
||||
#define PVC_EG_TAG(x) (((x) & 0x7) << 8)
|
||||
#define PVC_EG_TAG_MASK PVC_EG_TAG(7)
|
||||
#define VLAN_ATTR(x) (((x) & 0x3) << 6)
|
||||
#define VLAN_ATTR_MASK VLAN_ATTR(3)
|
||||
|
||||
enum mt7530_vlan_port_eg_tag {
|
||||
MT7530_VLAN_EG_DISABLED = 0,
|
||||
MT7530_VLAN_EG_CONSISTENT = 1,
|
||||
};
|
||||
|
||||
enum mt7530_vlan_port_attr {
|
||||
MT7530_VLAN_USER = 0,
|
||||
MT7530_VLAN_TRANSPARENT = 3,
|
||||
|
|
|
|||
|
|
@ -515,7 +515,7 @@ static void xgbe_isr_task(unsigned long data)
|
|||
xgbe_disable_rx_tx_ints(pdata);
|
||||
|
||||
/* Turn on polling */
|
||||
__napi_schedule_irqoff(&pdata->napi);
|
||||
__napi_schedule(&pdata->napi);
|
||||
}
|
||||
} else {
|
||||
/* Don't clear Rx/Tx status if doing per channel DMA
|
||||
|
|
|
|||
|
|
@ -155,6 +155,8 @@ static int sun7i_gmac_probe(struct platform_device *pdev)
|
|||
plat_dat->init = sun7i_gmac_init;
|
||||
plat_dat->exit = sun7i_gmac_exit;
|
||||
plat_dat->fix_mac_speed = sun7i_fix_speed;
|
||||
plat_dat->tx_fifo_size = 4096;
|
||||
plat_dat->rx_fifo_size = 16384;
|
||||
|
||||
ret = sun7i_gmac_init(pdev, plat_dat->bsp_priv);
|
||||
if (ret)
|
||||
|
|
|
|||
|
|
@ -730,32 +730,6 @@ struct dentry *wil_debugfs_create_ioblob(const char *name,
|
|||
return debugfs_create_file(name, mode, parent, wil_blob, &fops_ioblob);
|
||||
}
|
||||
|
||||
/*---reset---*/
|
||||
static ssize_t wil_write_file_reset(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
{
|
||||
struct wil6210_priv *wil = file->private_data;
|
||||
struct net_device *ndev = wil->main_ndev;
|
||||
|
||||
/**
|
||||
* BUG:
|
||||
* this code does NOT sync device state with the rest of system
|
||||
* use with care, debug only!!!
|
||||
*/
|
||||
rtnl_lock();
|
||||
dev_close(ndev);
|
||||
ndev->flags &= ~IFF_UP;
|
||||
rtnl_unlock();
|
||||
wil_reset(wil, true);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static const struct file_operations fops_reset = {
|
||||
.write = wil_write_file_reset,
|
||||
.open = simple_open,
|
||||
};
|
||||
|
||||
/*---write channel 1..4 to rxon for it, 0 to rxoff---*/
|
||||
static ssize_t wil_write_file_rxon(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos)
|
||||
|
|
@ -991,6 +965,8 @@ static ssize_t wil_write_file_txmgmt(struct file *file, const char __user *buf,
|
|||
int rc;
|
||||
void *frame;
|
||||
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
|
||||
if (!len)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -2459,7 +2435,6 @@ static const struct {
|
|||
{"desc", 0444, &fops_txdesc},
|
||||
{"bf", 0444, &fops_bf},
|
||||
{"mem_val", 0644, &fops_memread},
|
||||
{"reset", 0244, &fops_reset},
|
||||
{"rxon", 0244, &fops_rxon},
|
||||
{"tx_mgmt", 0244, &fops_txmgmt},
|
||||
{"wmi_send", 0244, &fops_wmi},
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2012-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
|
|
@ -590,10 +590,14 @@ static irqreturn_t wil6210_irq_misc(int irq, void *cookie)
|
|||
}
|
||||
|
||||
if (isr & BIT_DMA_EP_MISC_ICR_HALP) {
|
||||
wil_dbg_irq(wil, "irq_misc: HALP IRQ invoked\n");
|
||||
wil6210_mask_halp(wil);
|
||||
isr &= ~BIT_DMA_EP_MISC_ICR_HALP;
|
||||
complete(&wil->halp.comp);
|
||||
if (wil->halp.handle_icr) {
|
||||
/* no need to handle HALP ICRs until next vote */
|
||||
wil->halp.handle_icr = false;
|
||||
wil_dbg_irq(wil, "irq_misc: HALP IRQ invoked\n");
|
||||
wil6210_mask_halp(wil);
|
||||
complete(&wil->halp.comp);
|
||||
}
|
||||
}
|
||||
|
||||
wil->isr_misc = isr;
|
||||
|
|
|
|||
|
|
@ -1687,7 +1687,7 @@ int __wil_up(struct wil6210_priv *wil)
|
|||
return rc;
|
||||
|
||||
/* Rx RING. After MAC and beacon */
|
||||
rc = wil->txrx_ops.rx_init(wil, 1 << rx_ring_order);
|
||||
rc = wil->txrx_ops.rx_init(wil, rx_ring_order);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
|
|
@ -1814,11 +1814,14 @@ void wil_halp_vote(struct wil6210_priv *wil)
|
|||
|
||||
if (++wil->halp.ref_cnt == 1) {
|
||||
reinit_completion(&wil->halp.comp);
|
||||
/* mark to IRQ context to handle HALP ICR */
|
||||
wil->halp.handle_icr = true;
|
||||
wil6210_set_halp(wil);
|
||||
rc = wait_for_completion_timeout(&wil->halp.comp, to_jiffies);
|
||||
if (!rc) {
|
||||
wil_err(wil, "HALP vote timed out\n");
|
||||
/* Mask HALP as done in case the interrupt is raised */
|
||||
wil->halp.handle_icr = false;
|
||||
wil6210_mask_halp(wil);
|
||||
} else {
|
||||
wil_dbg_irq(wil,
|
||||
|
|
|
|||
|
|
@ -881,7 +881,7 @@ static void wil_rx_buf_len_init(struct wil6210_priv *wil)
|
|||
}
|
||||
}
|
||||
|
||||
static int wil_rx_init(struct wil6210_priv *wil, u16 size)
|
||||
static int wil_rx_init(struct wil6210_priv *wil, uint order)
|
||||
{
|
||||
struct wil_ring *vring = &wil->ring_rx;
|
||||
int rc;
|
||||
|
|
@ -895,7 +895,7 @@ static int wil_rx_init(struct wil6210_priv *wil, u16 size)
|
|||
|
||||
wil_rx_buf_len_init(wil);
|
||||
|
||||
vring->size = size;
|
||||
vring->size = 1 << order;
|
||||
vring->is_rx = true;
|
||||
rc = wil_vring_alloc(wil, vring);
|
||||
if (rc)
|
||||
|
|
|
|||
|
|
@ -268,6 +268,9 @@ static void wil_move_all_rx_buff_to_free_list(struct wil6210_priv *wil,
|
|||
struct list_head *active = &wil->rx_buff_mgmt.active;
|
||||
dma_addr_t pa;
|
||||
|
||||
if (!wil->rx_buff_mgmt.buff_arr)
|
||||
return;
|
||||
|
||||
while (!list_empty(active)) {
|
||||
struct wil_rx_buff *rx_buff =
|
||||
list_first_entry(active, struct wil_rx_buff, list);
|
||||
|
|
@ -590,9 +593,9 @@ static void wil_rx_buf_len_init_edma(struct wil6210_priv *wil)
|
|||
WIL_MAX_ETH_MTU : WIL_EDMA_RX_BUF_LEN_DEFAULT;
|
||||
}
|
||||
|
||||
static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size)
|
||||
static int wil_rx_init_edma(struct wil6210_priv *wil, uint desc_ring_order)
|
||||
{
|
||||
u16 status_ring_size;
|
||||
u16 status_ring_size, desc_ring_size = 1 << desc_ring_order;
|
||||
struct wil_ring *ring = &wil->ring_rx;
|
||||
int rc;
|
||||
size_t elem_size = wil->use_compressed_rx_status ?
|
||||
|
|
@ -607,7 +610,12 @@ static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size)
|
|||
"compressed RX status cannot be used with SW reorder\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (wil->rx_status_ring_order <= desc_ring_order)
|
||||
/* make sure sring is larger than desc ring */
|
||||
wil->rx_status_ring_order = desc_ring_order + 1;
|
||||
if (wil->rx_buff_id_count <= desc_ring_size)
|
||||
/* make sure we will not run out of buff_ids */
|
||||
wil->rx_buff_id_count = desc_ring_size + 512;
|
||||
if (wil->rx_status_ring_order < WIL_SRING_SIZE_ORDER_MIN ||
|
||||
wil->rx_status_ring_order > WIL_SRING_SIZE_ORDER_MAX)
|
||||
wil->rx_status_ring_order = WIL_RX_SRING_SIZE_ORDER_DEFAULT;
|
||||
|
|
|
|||
|
|
@ -602,7 +602,7 @@ struct wil_txrx_ops {
|
|||
struct wil_ring *ring, struct sk_buff *skb);
|
||||
irqreturn_t (*irq_tx)(int irq, void *cookie);
|
||||
/* RX ops */
|
||||
int (*rx_init)(struct wil6210_priv *wil, u16 ring_size);
|
||||
int (*rx_init)(struct wil6210_priv *wil, uint ring_order);
|
||||
void (*rx_fini)(struct wil6210_priv *wil);
|
||||
int (*wmi_addba_rx_resp)(struct wil6210_priv *wil, u8 mid, u8 cid,
|
||||
u8 tid, u8 token, u16 status, bool amsdu,
|
||||
|
|
@ -778,6 +778,7 @@ struct wil_halp {
|
|||
struct mutex lock; /* protect halp ref_cnt */
|
||||
unsigned int ref_cnt;
|
||||
struct completion comp;
|
||||
u8 handle_icr;
|
||||
};
|
||||
|
||||
struct wil_blob_wrapper {
|
||||
|
|
|
|||
|
|
@ -2802,7 +2802,7 @@ static void wmi_event_handle(struct wil6210_priv *wil,
|
|||
|
||||
if (mid == MID_BROADCAST)
|
||||
mid = 0;
|
||||
if (mid >= wil->max_vifs) {
|
||||
if (mid >= ARRAY_SIZE(wil->vifs) || mid >= wil->max_vifs) {
|
||||
wil_dbg_wmi(wil, "invalid mid %d, event skipped\n",
|
||||
mid);
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -3327,9 +3327,9 @@ static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info)
|
|||
param.no_vif = true;
|
||||
|
||||
if (info->attrs[HWSIM_ATTR_RADIO_NAME]) {
|
||||
hwname = kasprintf(GFP_KERNEL, "%.*s",
|
||||
nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]),
|
||||
(char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]));
|
||||
hwname = kstrndup((char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]),
|
||||
nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]),
|
||||
GFP_KERNEL);
|
||||
if (!hwname)
|
||||
return -ENOMEM;
|
||||
param.hwname = hwname;
|
||||
|
|
@ -3385,9 +3385,9 @@ static int hwsim_del_radio_nl(struct sk_buff *msg, struct genl_info *info)
|
|||
if (info->attrs[HWSIM_ATTR_RADIO_ID]) {
|
||||
idx = nla_get_u32(info->attrs[HWSIM_ATTR_RADIO_ID]);
|
||||
} else if (info->attrs[HWSIM_ATTR_RADIO_NAME]) {
|
||||
hwname = kasprintf(GFP_KERNEL, "%.*s",
|
||||
nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]),
|
||||
(char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]));
|
||||
hwname = kstrndup((char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]),
|
||||
nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]),
|
||||
GFP_KERNEL);
|
||||
if (!hwname)
|
||||
return -ENOMEM;
|
||||
} else
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/bitmap.h>
|
||||
|
||||
/*
|
||||
* Because the PCA9685 has only one prescaler per chip, changing the period of
|
||||
|
|
@ -85,6 +86,7 @@ struct pca9685 {
|
|||
#if IS_ENABLED(CONFIG_GPIOLIB)
|
||||
struct mutex lock;
|
||||
struct gpio_chip gpio;
|
||||
DECLARE_BITMAP(pwms_inuse, PCA9685_MAXCHAN + 1);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
@ -94,53 +96,53 @@ static inline struct pca9685 *to_pca(struct pwm_chip *chip)
|
|||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_GPIOLIB)
|
||||
static bool pca9685_pwm_test_and_set_inuse(struct pca9685 *pca, int pwm_idx)
|
||||
{
|
||||
bool is_inuse;
|
||||
|
||||
mutex_lock(&pca->lock);
|
||||
if (pwm_idx >= PCA9685_MAXCHAN) {
|
||||
/*
|
||||
* "all LEDs" channel:
|
||||
* pretend already in use if any of the PWMs are requested
|
||||
*/
|
||||
if (!bitmap_empty(pca->pwms_inuse, PCA9685_MAXCHAN)) {
|
||||
is_inuse = true;
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* regular channel:
|
||||
* pretend already in use if the "all LEDs" channel is requested
|
||||
*/
|
||||
if (test_bit(PCA9685_MAXCHAN, pca->pwms_inuse)) {
|
||||
is_inuse = true;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
is_inuse = test_and_set_bit(pwm_idx, pca->pwms_inuse);
|
||||
out:
|
||||
mutex_unlock(&pca->lock);
|
||||
return is_inuse;
|
||||
}
|
||||
|
||||
static void pca9685_pwm_clear_inuse(struct pca9685 *pca, int pwm_idx)
|
||||
{
|
||||
mutex_lock(&pca->lock);
|
||||
clear_bit(pwm_idx, pca->pwms_inuse);
|
||||
mutex_unlock(&pca->lock);
|
||||
}
|
||||
|
||||
static int pca9685_pwm_gpio_request(struct gpio_chip *gpio, unsigned int offset)
|
||||
{
|
||||
struct pca9685 *pca = gpiochip_get_data(gpio);
|
||||
struct pwm_device *pwm;
|
||||
|
||||
mutex_lock(&pca->lock);
|
||||
|
||||
pwm = &pca->chip.pwms[offset];
|
||||
|
||||
if (pwm->flags & (PWMF_REQUESTED | PWMF_EXPORTED)) {
|
||||
mutex_unlock(&pca->lock);
|
||||
if (pca9685_pwm_test_and_set_inuse(pca, offset))
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
pwm_set_chip_data(pwm, (void *)1);
|
||||
|
||||
mutex_unlock(&pca->lock);
|
||||
pm_runtime_get_sync(pca->chip.dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool pca9685_pwm_is_gpio(struct pca9685 *pca, struct pwm_device *pwm)
|
||||
{
|
||||
bool is_gpio = false;
|
||||
|
||||
mutex_lock(&pca->lock);
|
||||
|
||||
if (pwm->hwpwm >= PCA9685_MAXCHAN) {
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
* Check if any of the GPIOs are requested and in that case
|
||||
* prevent using the "all LEDs" channel.
|
||||
*/
|
||||
for (i = 0; i < pca->gpio.ngpio; i++)
|
||||
if (gpiochip_is_requested(&pca->gpio, i)) {
|
||||
is_gpio = true;
|
||||
break;
|
||||
}
|
||||
} else if (pwm_get_chip_data(pwm)) {
|
||||
is_gpio = true;
|
||||
}
|
||||
|
||||
mutex_unlock(&pca->lock);
|
||||
return is_gpio;
|
||||
}
|
||||
|
||||
static int pca9685_pwm_gpio_get(struct gpio_chip *gpio, unsigned int offset)
|
||||
{
|
||||
struct pca9685 *pca = gpiochip_get_data(gpio);
|
||||
|
|
@ -173,6 +175,7 @@ static void pca9685_pwm_gpio_free(struct gpio_chip *gpio, unsigned int offset)
|
|||
|
||||
pca9685_pwm_gpio_set(gpio, offset, 0);
|
||||
pm_runtime_put(pca->chip.dev);
|
||||
pca9685_pwm_clear_inuse(pca, offset);
|
||||
}
|
||||
|
||||
static int pca9685_pwm_gpio_get_direction(struct gpio_chip *chip,
|
||||
|
|
@ -224,12 +227,17 @@ static int pca9685_pwm_gpio_probe(struct pca9685 *pca)
|
|||
return devm_gpiochip_add_data(dev, &pca->gpio, pca);
|
||||
}
|
||||
#else
|
||||
static inline bool pca9685_pwm_is_gpio(struct pca9685 *pca,
|
||||
struct pwm_device *pwm)
|
||||
static inline bool pca9685_pwm_test_and_set_inuse(struct pca9685 *pca,
|
||||
int pwm_idx)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void
|
||||
pca9685_pwm_clear_inuse(struct pca9685 *pca, int pwm_idx)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int pca9685_pwm_gpio_probe(struct pca9685 *pca)
|
||||
{
|
||||
return 0;
|
||||
|
|
@ -413,7 +421,7 @@ static int pca9685_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
|
|||
{
|
||||
struct pca9685 *pca = to_pca(chip);
|
||||
|
||||
if (pca9685_pwm_is_gpio(pca, pwm))
|
||||
if (pca9685_pwm_test_and_set_inuse(pca, pwm->hwpwm))
|
||||
return -EBUSY;
|
||||
pm_runtime_get_sync(chip->dev);
|
||||
|
||||
|
|
@ -422,8 +430,11 @@ static int pca9685_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
|
|||
|
||||
static void pca9685_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
|
||||
{
|
||||
struct pca9685 *pca = to_pca(chip);
|
||||
|
||||
pca9685_pwm_disable(chip, pwm);
|
||||
pm_runtime_put(chip->dev);
|
||||
pca9685_pwm_clear_inuse(pca, pwm->hwpwm);
|
||||
}
|
||||
|
||||
static const struct pwm_ops pca9685_pwm_ops = {
|
||||
|
|
|
|||
|
|
@ -1579,6 +1579,11 @@ start:
|
|||
*/
|
||||
if (ufshcd_can_hibern8_during_gating(hba) &&
|
||||
ufshcd_is_link_hibern8(hba)) {
|
||||
if (async) {
|
||||
rc = -EAGAIN;
|
||||
hba->clk_gating.active_reqs--;
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
flush_work(&hba->clk_gating.ungate_work);
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
|
|
|
|||
|
|
@ -4275,30 +4275,37 @@ int iscsit_close_connection(
|
|||
if (!atomic_read(&sess->session_reinstatement) &&
|
||||
atomic_read(&sess->session_fall_back_to_erl0)) {
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
complete_all(&sess->session_wait_comp);
|
||||
iscsit_close_session(sess);
|
||||
|
||||
return 0;
|
||||
} else if (atomic_read(&sess->session_logout)) {
|
||||
pr_debug("Moving to TARG_SESS_STATE_FREE.\n");
|
||||
sess->session_state = TARG_SESS_STATE_FREE;
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
|
||||
if (atomic_read(&sess->sleep_on_sess_wait_comp))
|
||||
complete(&sess->session_wait_comp);
|
||||
if (atomic_read(&sess->session_close)) {
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
complete_all(&sess->session_wait_comp);
|
||||
iscsit_close_session(sess);
|
||||
} else {
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
}
|
||||
|
||||
return 0;
|
||||
} else {
|
||||
pr_debug("Moving to TARG_SESS_STATE_FAILED.\n");
|
||||
sess->session_state = TARG_SESS_STATE_FAILED;
|
||||
|
||||
if (!atomic_read(&sess->session_continuation)) {
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
if (!atomic_read(&sess->session_continuation))
|
||||
iscsit_start_time2retain_handler(sess);
|
||||
} else
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
|
||||
if (atomic_read(&sess->sleep_on_sess_wait_comp))
|
||||
complete(&sess->session_wait_comp);
|
||||
if (atomic_read(&sess->session_close)) {
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
complete_all(&sess->session_wait_comp);
|
||||
iscsit_close_session(sess);
|
||||
} else {
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -4404,9 +4411,9 @@ static void iscsit_logout_post_handler_closesession(
|
|||
complete(&conn->conn_logout_comp);
|
||||
|
||||
iscsit_dec_conn_usage_count(conn);
|
||||
atomic_set(&sess->session_close, 1);
|
||||
iscsit_stop_session(sess, sleep, sleep);
|
||||
iscsit_dec_session_usage_count(sess);
|
||||
iscsit_close_session(sess);
|
||||
}
|
||||
|
||||
static void iscsit_logout_post_handler_samecid(
|
||||
|
|
@ -4541,49 +4548,6 @@ void iscsit_fail_session(struct iscsi_session *sess)
|
|||
sess->session_state = TARG_SESS_STATE_FAILED;
|
||||
}
|
||||
|
||||
int iscsit_free_session(struct iscsi_session *sess)
|
||||
{
|
||||
u16 conn_count = atomic_read(&sess->nconn);
|
||||
struct iscsi_conn *conn, *conn_tmp = NULL;
|
||||
int is_last;
|
||||
|
||||
spin_lock_bh(&sess->conn_lock);
|
||||
atomic_set(&sess->sleep_on_sess_wait_comp, 1);
|
||||
|
||||
list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list,
|
||||
conn_list) {
|
||||
if (conn_count == 0)
|
||||
break;
|
||||
|
||||
if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) {
|
||||
is_last = 1;
|
||||
} else {
|
||||
iscsit_inc_conn_usage_count(conn_tmp);
|
||||
is_last = 0;
|
||||
}
|
||||
iscsit_inc_conn_usage_count(conn);
|
||||
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
iscsit_cause_connection_reinstatement(conn, 1);
|
||||
spin_lock_bh(&sess->conn_lock);
|
||||
|
||||
iscsit_dec_conn_usage_count(conn);
|
||||
if (is_last == 0)
|
||||
iscsit_dec_conn_usage_count(conn_tmp);
|
||||
|
||||
conn_count--;
|
||||
}
|
||||
|
||||
if (atomic_read(&sess->nconn)) {
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
wait_for_completion(&sess->session_wait_comp);
|
||||
} else
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
|
||||
iscsit_close_session(sess);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void iscsit_stop_session(
|
||||
struct iscsi_session *sess,
|
||||
int session_sleep,
|
||||
|
|
@ -4594,8 +4558,6 @@ void iscsit_stop_session(
|
|||
int is_last;
|
||||
|
||||
spin_lock_bh(&sess->conn_lock);
|
||||
if (session_sleep)
|
||||
atomic_set(&sess->sleep_on_sess_wait_comp, 1);
|
||||
|
||||
if (connection_sleep) {
|
||||
list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list,
|
||||
|
|
@ -4653,12 +4615,15 @@ int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *tpg, int force)
|
|||
spin_lock(&sess->conn_lock);
|
||||
if (atomic_read(&sess->session_fall_back_to_erl0) ||
|
||||
atomic_read(&sess->session_logout) ||
|
||||
atomic_read(&sess->session_close) ||
|
||||
(sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
|
||||
spin_unlock(&sess->conn_lock);
|
||||
continue;
|
||||
}
|
||||
iscsit_inc_session_usage_count(sess);
|
||||
atomic_set(&sess->session_reinstatement, 1);
|
||||
atomic_set(&sess->session_fall_back_to_erl0, 1);
|
||||
atomic_set(&sess->session_close, 1);
|
||||
spin_unlock(&sess->conn_lock);
|
||||
|
||||
list_move_tail(&se_sess->sess_list, &free_list);
|
||||
|
|
@ -4668,7 +4633,9 @@ int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *tpg, int force)
|
|||
list_for_each_entry_safe(se_sess, se_sess_tmp, &free_list, sess_list) {
|
||||
sess = (struct iscsi_session *)se_sess->fabric_sess_ptr;
|
||||
|
||||
iscsit_free_session(sess);
|
||||
list_del_init(&se_sess->sess_list);
|
||||
iscsit_stop_session(sess, 1, 1);
|
||||
iscsit_dec_session_usage_count(sess);
|
||||
session_count++;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@ extern int iscsi_target_rx_thread(void *);
|
|||
extern int iscsit_close_connection(struct iscsi_conn *);
|
||||
extern int iscsit_close_session(struct iscsi_session *);
|
||||
extern void iscsit_fail_session(struct iscsi_session *);
|
||||
extern int iscsit_free_session(struct iscsi_session *);
|
||||
extern void iscsit_stop_session(struct iscsi_session *, int, int);
|
||||
extern int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *, int);
|
||||
|
||||
|
|
|
|||
|
|
@ -1501,20 +1501,23 @@ static void lio_tpg_close_session(struct se_session *se_sess)
|
|||
spin_lock(&sess->conn_lock);
|
||||
if (atomic_read(&sess->session_fall_back_to_erl0) ||
|
||||
atomic_read(&sess->session_logout) ||
|
||||
atomic_read(&sess->session_close) ||
|
||||
(sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
|
||||
spin_unlock(&sess->conn_lock);
|
||||
spin_unlock_bh(&se_tpg->session_lock);
|
||||
return;
|
||||
}
|
||||
iscsit_inc_session_usage_count(sess);
|
||||
atomic_set(&sess->session_reinstatement, 1);
|
||||
atomic_set(&sess->session_fall_back_to_erl0, 1);
|
||||
atomic_set(&sess->session_close, 1);
|
||||
spin_unlock(&sess->conn_lock);
|
||||
|
||||
iscsit_stop_time2retain_timer(sess);
|
||||
spin_unlock_bh(&se_tpg->session_lock);
|
||||
|
||||
iscsit_stop_session(sess, 1, 1);
|
||||
iscsit_close_session(sess);
|
||||
iscsit_dec_session_usage_count(sess);
|
||||
}
|
||||
|
||||
static u32 lio_tpg_get_inst_index(struct se_portal_group *se_tpg)
|
||||
|
|
|
|||
|
|
@ -164,6 +164,7 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn)
|
|||
spin_lock(&sess_p->conn_lock);
|
||||
if (atomic_read(&sess_p->session_fall_back_to_erl0) ||
|
||||
atomic_read(&sess_p->session_logout) ||
|
||||
atomic_read(&sess_p->session_close) ||
|
||||
(sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
|
||||
spin_unlock(&sess_p->conn_lock);
|
||||
continue;
|
||||
|
|
@ -174,6 +175,7 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn)
|
|||
(sess_p->sess_ops->SessionType == sessiontype))) {
|
||||
atomic_set(&sess_p->session_reinstatement, 1);
|
||||
atomic_set(&sess_p->session_fall_back_to_erl0, 1);
|
||||
atomic_set(&sess_p->session_close, 1);
|
||||
spin_unlock(&sess_p->conn_lock);
|
||||
iscsit_inc_session_usage_count(sess_p);
|
||||
iscsit_stop_time2retain_timer(sess_p);
|
||||
|
|
@ -198,7 +200,6 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn)
|
|||
if (sess->session_state == TARG_SESS_STATE_FAILED) {
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
iscsit_dec_session_usage_count(sess);
|
||||
iscsit_close_session(sess);
|
||||
return 0;
|
||||
}
|
||||
spin_unlock_bh(&sess->conn_lock);
|
||||
|
|
@ -206,7 +207,6 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn)
|
|||
iscsit_stop_session(sess, 1, 1);
|
||||
iscsit_dec_session_usage_count(sess);
|
||||
|
||||
iscsit_close_session(sess);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -494,6 +494,7 @@ static int iscsi_login_non_zero_tsih_s2(
|
|||
sess_p = (struct iscsi_session *)se_sess->fabric_sess_ptr;
|
||||
if (atomic_read(&sess_p->session_fall_back_to_erl0) ||
|
||||
atomic_read(&sess_p->session_logout) ||
|
||||
atomic_read(&sess_p->session_close) ||
|
||||
(sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED))
|
||||
continue;
|
||||
if (!memcmp(sess_p->isid, pdu->isid, 6) &&
|
||||
|
|
|
|||
|
|
@ -688,12 +688,13 @@ out:
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force);
|
||||
static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
|
||||
bool interrupt);
|
||||
static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
|
||||
{
|
||||
struct dwc3_request *req;
|
||||
|
||||
dwc3_stop_active_transfer(dep, true);
|
||||
dwc3_stop_active_transfer(dep, true, false);
|
||||
|
||||
/* - giveback all requests to gadget driver */
|
||||
while (!list_empty(&dep->started_list)) {
|
||||
|
|
@ -1416,7 +1417,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
|
|||
}
|
||||
if (r == req) {
|
||||
/* wait until it is processed */
|
||||
dwc3_stop_active_transfer(dep, true);
|
||||
dwc3_stop_active_transfer(dep, true, true);
|
||||
|
||||
if (!r->trb)
|
||||
goto out0;
|
||||
|
|
@ -2365,10 +2366,8 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
|
|||
|
||||
dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
|
||||
|
||||
if (stop) {
|
||||
dwc3_stop_active_transfer(dep, true);
|
||||
dep->flags = DWC3_EP_ENABLED;
|
||||
}
|
||||
if (stop)
|
||||
dwc3_stop_active_transfer(dep, true, true);
|
||||
|
||||
/*
|
||||
* WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround.
|
||||
|
|
@ -2488,7 +2487,8 @@ static void dwc3_reset_gadget(struct dwc3 *dwc)
|
|||
}
|
||||
}
|
||||
|
||||
static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force)
|
||||
static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
|
||||
bool interrupt)
|
||||
{
|
||||
struct dwc3 *dwc = dep->dwc;
|
||||
struct dwc3_gadget_ep_cmd_params params;
|
||||
|
|
@ -2532,7 +2532,7 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force)
|
|||
|
||||
cmd = DWC3_DEPCMD_ENDTRANSFER;
|
||||
cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0;
|
||||
cmd |= DWC3_DEPCMD_CMDIOC;
|
||||
cmd |= interrupt ? DWC3_DEPCMD_CMDIOC : 0;
|
||||
cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
|
||||
|
|
|
|||
|
|
@ -525,8 +525,8 @@ static int should_ignore_root(struct btrfs_root *root)
|
|||
if (!reloc_root)
|
||||
return 0;
|
||||
|
||||
if (btrfs_root_last_snapshot(&reloc_root->root_item) ==
|
||||
root->fs_info->running_transaction->transid - 1)
|
||||
if (btrfs_header_generation(reloc_root->commit_root) ==
|
||||
root->fs_info->running_transaction->transid)
|
||||
return 0;
|
||||
/*
|
||||
* if there is reloc tree and it was created in previous
|
||||
|
|
|
|||
|
|
@ -3438,8 +3438,8 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,
|
|||
(unsigned long long)map->m_lblk, map_len);
|
||||
|
||||
sbi = EXT4_SB(inode->i_sb);
|
||||
eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >>
|
||||
inode->i_sb->s_blocksize_bits;
|
||||
eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1)
|
||||
>> inode->i_sb->s_blocksize_bits;
|
||||
if (eof_block < map->m_lblk + map_len)
|
||||
eof_block = map->m_lblk + map_len;
|
||||
|
||||
|
|
@ -3694,8 +3694,8 @@ static int ext4_split_convert_extents(handle_t *handle,
|
|||
__func__, inode->i_ino,
|
||||
(unsigned long long)map->m_lblk, map->m_len);
|
||||
|
||||
eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >>
|
||||
inode->i_sb->s_blocksize_bits;
|
||||
eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1)
|
||||
>> inode->i_sb->s_blocksize_bits;
|
||||
if (eof_block < map->m_lblk + map->m_len)
|
||||
eof_block = map->m_lblk + map->m_len;
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -4145,7 +4145,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||
if (sbi->s_inodes_per_group < sbi->s_inodes_per_block ||
|
||||
sbi->s_inodes_per_group > blocksize * 8) {
|
||||
ext4_msg(sb, KERN_ERR, "invalid inodes per group: %lu\n",
|
||||
sbi->s_blocks_per_group);
|
||||
sbi->s_inodes_per_group);
|
||||
goto failed_mount;
|
||||
}
|
||||
sbi->s_itb_per_group = sbi->s_inodes_per_group /
|
||||
|
|
@ -4276,9 +4276,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||
EXT4_BLOCKS_PER_GROUP(sb) - 1);
|
||||
do_div(blocks_count, EXT4_BLOCKS_PER_GROUP(sb));
|
||||
if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) {
|
||||
ext4_msg(sb, KERN_WARNING, "groups count too large: %u "
|
||||
ext4_msg(sb, KERN_WARNING, "groups count too large: %llu "
|
||||
"(block count %llu, first data block %u, "
|
||||
"blocks per group %lu)", sbi->s_groups_count,
|
||||
"blocks per group %lu)", blocks_count,
|
||||
ext4_blocks_count(es),
|
||||
le32_to_cpu(es->s_first_data_block),
|
||||
EXT4_BLOCKS_PER_GROUP(sb));
|
||||
|
|
|
|||
|
|
@ -992,9 +992,10 @@ restart_loop:
|
|||
* journalled data) we need to unmap buffer and clear
|
||||
* more bits. We also need to be careful about the check
|
||||
* because the data page mapping can get cleared under
|
||||
* out hands, which alse need not to clear more bits
|
||||
* because the page and buffers will be freed and can
|
||||
* never be reused once we are done with them.
|
||||
* our hands. Note that if mapping == NULL, we don't
|
||||
* need to make buffer unmapped because the page is
|
||||
* already detached from the mapping and buffers cannot
|
||||
* get reused.
|
||||
*/
|
||||
mapping = READ_ONCE(bh->b_page->mapping);
|
||||
if (mapping && !sb_is_blkdev_sb(mapping->host->i_sb)) {
|
||||
|
|
|
|||
|
|
@ -899,7 +899,7 @@ struct inode *ovl_get_inode(struct super_block *sb,
|
|||
struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL;
|
||||
bool bylower = ovl_hash_bylower(sb, upperdentry, lowerdentry,
|
||||
oip->index);
|
||||
int fsid = bylower ? oip->lowerpath->layer->fsid : 0;
|
||||
int fsid = bylower ? lowerpath->layer->fsid : 0;
|
||||
bool is_dir, metacopy = false;
|
||||
unsigned long ino = 0;
|
||||
int err = oip->newinode ? -EEXIST : -ENOMEM;
|
||||
|
|
@ -949,6 +949,8 @@ struct inode *ovl_get_inode(struct super_block *sb,
|
|||
err = -ENOMEM;
|
||||
goto out_err;
|
||||
}
|
||||
ino = realinode->i_ino;
|
||||
fsid = lowerpath->layer->fsid;
|
||||
}
|
||||
ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev, ino, fsid);
|
||||
ovl_inode_init(inode, upperdentry, lowerdentry, oip->lowerdata);
|
||||
|
|
|
|||
|
|
@ -234,6 +234,7 @@ static inline bool ipv6_anycast_destination(const struct dst_entry *dst,
|
|||
|
||||
return rt->rt6i_flags & RTF_ANYCAST ||
|
||||
(rt->rt6i_dst.plen < 127 &&
|
||||
!(rt->rt6i_flags & (RTF_GATEWAY | RTF_NONEXTHOP)) &&
|
||||
ipv6_addr_equal(&rt->rt6i_dst.addr, daddr));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -674,7 +674,7 @@ struct iscsi_session {
|
|||
atomic_t session_logout;
|
||||
atomic_t session_reinstatement;
|
||||
atomic_t session_stop_active;
|
||||
atomic_t sleep_on_sess_wait_comp;
|
||||
atomic_t session_close;
|
||||
/* connection list */
|
||||
struct list_head sess_conn_list;
|
||||
struct list_head cr_active_list;
|
||||
|
|
|
|||
|
|
@ -1081,14 +1081,10 @@ register_snapshot_trigger(char *glob, struct event_trigger_ops *ops,
|
|||
struct event_trigger_data *data,
|
||||
struct trace_event_file *file)
|
||||
{
|
||||
int ret = register_trigger(glob, ops, data, file);
|
||||
if (tracing_alloc_snapshot_instance(file->tr) != 0)
|
||||
return 0;
|
||||
|
||||
if (ret > 0 && tracing_alloc_snapshot_instance(file->tr) != 0) {
|
||||
unregister_trigger(glob, ops, data, file);
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return register_trigger(glob, ops, data, file);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
|||
|
|
@ -1677,7 +1677,6 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
|
|||
nr_pages = get_vm_area_size(area) >> PAGE_SHIFT;
|
||||
array_size = (nr_pages * sizeof(struct page *));
|
||||
|
||||
area->nr_pages = nr_pages;
|
||||
/* Please note that the recursion is strictly bounded. */
|
||||
if (array_size > PAGE_SIZE) {
|
||||
pages = __vmalloc_node(array_size, 1, nested_gfp|highmem_mask,
|
||||
|
|
@ -1685,13 +1684,16 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
|
|||
} else {
|
||||
pages = kmalloc_node(array_size, nested_gfp, node);
|
||||
}
|
||||
area->pages = pages;
|
||||
if (!area->pages) {
|
||||
|
||||
if (!pages) {
|
||||
remove_vm_area(area->addr);
|
||||
kfree(area);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
area->pages = pages;
|
||||
area->nr_pages = nr_pages;
|
||||
|
||||
for (i = 0; i < area->nr_pages; i++) {
|
||||
struct page *page;
|
||||
|
||||
|
|
|
|||
|
|
@ -3934,7 +3934,8 @@ EXPORT_SYMBOL(netdev_max_backlog);
|
|||
|
||||
int netdev_tstamp_prequeue __read_mostly = 1;
|
||||
int netdev_budget __read_mostly = 300;
|
||||
unsigned int __read_mostly netdev_budget_usecs = 2000;
|
||||
/* Must be at least 2 jiffes to guarantee 1 jiffy timeout */
|
||||
unsigned int __read_mostly netdev_budget_usecs = 2 * USEC_PER_SEC / HZ;
|
||||
int weight_p __read_mostly = 64; /* old backlog weight */
|
||||
int dev_weight_rx_bias __read_mostly = 1; /* bias for backlog weight */
|
||||
int dev_weight_tx_bias __read_mostly = 1; /* bias for output_queue quota */
|
||||
|
|
|
|||
|
|
@ -64,10 +64,16 @@ static int hsr_newlink(struct net *src_net, struct net_device *dev,
|
|||
else
|
||||
multicast_spec = nla_get_u8(data[IFLA_HSR_MULTICAST_SPEC]);
|
||||
|
||||
if (!data[IFLA_HSR_VERSION])
|
||||
if (!data[IFLA_HSR_VERSION]) {
|
||||
hsr_version = 0;
|
||||
else
|
||||
} else {
|
||||
hsr_version = nla_get_u8(data[IFLA_HSR_VERSION]);
|
||||
if (hsr_version > 1) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Only versions 0..1 are supported");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return hsr_dev_finalize(dev, link, multicast_spec, hsr_version);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -587,12 +587,15 @@ struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int ip_mc_config(struct sock *sk, bool join, const struct in_ifaddr *ifa)
|
||||
static int ip_mc_autojoin_config(struct net *net, bool join,
|
||||
const struct in_ifaddr *ifa)
|
||||
{
|
||||
#if defined(CONFIG_IP_MULTICAST)
|
||||
struct ip_mreqn mreq = {
|
||||
.imr_multiaddr.s_addr = ifa->ifa_address,
|
||||
.imr_ifindex = ifa->ifa_dev->dev->ifindex,
|
||||
};
|
||||
struct sock *sk = net->ipv4.mc_autojoin_sk;
|
||||
int ret;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
|
@ -605,6 +608,9 @@ static int ip_mc_config(struct sock *sk, bool join, const struct in_ifaddr *ifa)
|
|||
release_sock(sk);
|
||||
|
||||
return ret;
|
||||
#else
|
||||
return -EOPNOTSUPP;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
|
|
@ -646,7 +652,7 @@ static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
continue;
|
||||
|
||||
if (ipv4_is_multicast(ifa->ifa_address))
|
||||
ip_mc_config(net->ipv4.mc_autojoin_sk, false, ifa);
|
||||
ip_mc_autojoin_config(net, false, ifa);
|
||||
__inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).portid);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -907,8 +913,7 @@ static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
*/
|
||||
set_ifa_lifetime(ifa, valid_lft, prefered_lft);
|
||||
if (ifa->ifa_flags & IFA_F_MCAUTOJOIN) {
|
||||
int ret = ip_mc_config(net->ipv4.mc_autojoin_sk,
|
||||
true, ifa);
|
||||
int ret = ip_mc_autojoin_config(net, true, ifa);
|
||||
|
||||
if (ret < 0) {
|
||||
inet_free_ifa(ifa);
|
||||
|
|
|
|||
|
|
@ -769,20 +769,21 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
|
|||
|
||||
node = NULL;
|
||||
if (addr->sq_node == QRTR_NODE_BCAST) {
|
||||
enqueue_fn = qrtr_bcast_enqueue;
|
||||
if (addr->sq_port != QRTR_PORT_CTRL) {
|
||||
if (addr->sq_port != QRTR_PORT_CTRL &&
|
||||
qrtr_local_nid != QRTR_NODE_BCAST) {
|
||||
release_sock(sk);
|
||||
return -ENOTCONN;
|
||||
}
|
||||
enqueue_fn = qrtr_bcast_enqueue;
|
||||
} else if (addr->sq_node == ipc->us.sq_node) {
|
||||
enqueue_fn = qrtr_local_enqueue;
|
||||
} else {
|
||||
enqueue_fn = qrtr_node_enqueue;
|
||||
node = qrtr_node_lookup(addr->sq_node);
|
||||
if (!node) {
|
||||
release_sock(sk);
|
||||
return -ECONNRESET;
|
||||
}
|
||||
enqueue_fn = qrtr_node_enqueue;
|
||||
}
|
||||
|
||||
plen = (len + 3) & ~3;
|
||||
|
|
|
|||
|
|
@ -144,6 +144,8 @@ static void *proc_keys_next(struct seq_file *p, void *v, loff_t *_pos)
|
|||
n = key_serial_next(p, v);
|
||||
if (n)
|
||||
*_pos = key_node_serial(n);
|
||||
else
|
||||
(*_pos)++;
|
||||
return n;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1341,7 +1341,7 @@ int sst_send_pipe_gains(struct snd_soc_dai *dai, int stream, int mute)
|
|||
dai->capture_widget->name);
|
||||
w = dai->capture_widget;
|
||||
snd_soc_dapm_widget_for_each_source_path(w, p) {
|
||||
if (p->connected && !p->connected(w, p->sink))
|
||||
if (p->connected && !p->connected(w, p->source))
|
||||
continue;
|
||||
|
||||
if (p->connect && p->source->power &&
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
|
|||
dev_dbg(ctx->dev, "DRAM Ptr %p\n", ctx->dram);
|
||||
do_release_regions:
|
||||
pci_release_regions(pci);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1461,7 +1461,7 @@ error:
|
|||
usb_audio_err(chip,
|
||||
"cannot get connectors status: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n",
|
||||
UAC_GET_CUR, validx, idx, cval->val_type);
|
||||
return ret;
|
||||
return filter_error(cval, ret);
|
||||
}
|
||||
|
||||
ucontrol->value.integer.value[0] = val;
|
||||
|
|
@ -1765,11 +1765,15 @@ static void get_connector_control_name(struct usb_mixer_interface *mixer,
|
|||
|
||||
/* Build a mixer control for a UAC connector control (jack-detect) */
|
||||
static void build_connector_control(struct usb_mixer_interface *mixer,
|
||||
const struct usbmix_name_map *imap,
|
||||
struct usb_audio_term *term, bool is_input)
|
||||
{
|
||||
struct snd_kcontrol *kctl;
|
||||
struct usb_mixer_elem_info *cval;
|
||||
|
||||
if (check_ignored_ctl(find_map(imap, term->id, 0)))
|
||||
return;
|
||||
|
||||
cval = kzalloc(sizeof(*cval), GFP_KERNEL);
|
||||
if (!cval)
|
||||
return;
|
||||
|
|
@ -2107,8 +2111,9 @@ static int parse_audio_input_terminal(struct mixer_build *state, int unitid,
|
|||
check_input_term(state, term_id, &iterm);
|
||||
|
||||
/* Check for jack detection. */
|
||||
if (uac_v2v3_control_is_readable(bmctls, control))
|
||||
build_connector_control(state->mixer, &iterm, true);
|
||||
if ((iterm.type & 0xff00) != 0x0100 &&
|
||||
uac_v2v3_control_is_readable(bmctls, control))
|
||||
build_connector_control(state->mixer, state->map, &iterm, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -3069,13 +3074,13 @@ static int snd_usb_mixer_controls_badd(struct usb_mixer_interface *mixer,
|
|||
memset(&iterm, 0, sizeof(iterm));
|
||||
iterm.id = UAC3_BADD_IT_ID4;
|
||||
iterm.type = UAC_BIDIR_TERMINAL_HEADSET;
|
||||
build_connector_control(mixer, &iterm, true);
|
||||
build_connector_control(mixer, map->map, &iterm, true);
|
||||
|
||||
/* Output Term - Insertion control */
|
||||
memset(&oterm, 0, sizeof(oterm));
|
||||
oterm.id = UAC3_BADD_OT_ID3;
|
||||
oterm.type = UAC_BIDIR_TERMINAL_HEADSET;
|
||||
build_connector_control(mixer, &oterm, false);
|
||||
build_connector_control(mixer, map->map, &oterm, false);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -3104,7 +3109,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
|
|||
if (map->id == state.chip->usb_id) {
|
||||
state.map = map->map;
|
||||
state.selector_map = map->selector_map;
|
||||
mixer->ignore_ctl_error = map->ignore_ctl_error;
|
||||
mixer->ignore_ctl_error |= map->ignore_ctl_error;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -3147,10 +3152,11 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
|
|||
if (err < 0 && err != -EINVAL)
|
||||
return err;
|
||||
|
||||
if (uac_v2v3_control_is_readable(le16_to_cpu(desc->bmControls),
|
||||
if ((state.oterm.type & 0xff00) != 0x0100 &&
|
||||
uac_v2v3_control_is_readable(le16_to_cpu(desc->bmControls),
|
||||
UAC2_TE_CONNECTOR)) {
|
||||
build_connector_control(state.mixer, &state.oterm,
|
||||
false);
|
||||
build_connector_control(state.mixer, state.map,
|
||||
&state.oterm, false);
|
||||
}
|
||||
} else { /* UAC_VERSION_3 */
|
||||
struct uac3_output_terminal_descriptor *desc = p;
|
||||
|
|
@ -3172,10 +3178,11 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
|
|||
if (err < 0 && err != -EINVAL)
|
||||
return err;
|
||||
|
||||
if (uac_v2v3_control_is_readable(le32_to_cpu(desc->bmControls),
|
||||
if ((state.oterm.type & 0xff00) != 0x0100 &&
|
||||
uac_v2v3_control_is_readable(le32_to_cpu(desc->bmControls),
|
||||
UAC3_TE_INSERTION)) {
|
||||
build_connector_control(state.mixer, &state.oterm,
|
||||
false);
|
||||
build_connector_control(state.mixer, state.map,
|
||||
&state.oterm, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -364,9 +364,11 @@ static const struct usbmix_name_map dell_alc4020_map[] = {
|
|||
};
|
||||
|
||||
/* Some mobos shipped with a dummy HD-audio show the invalid GET_MIN/GET_MAX
|
||||
* response for Input Gain Pad (id=19, control=12). Skip it.
|
||||
* response for Input Gain Pad (id=19, control=12) and the connector status
|
||||
* for SPDIF terminal (id=18). Skip them.
|
||||
*/
|
||||
static const struct usbmix_name_map asus_rog_map[] = {
|
||||
{ 18, NULL }, /* OT, connector control */
|
||||
{ 19, NULL, 12 }, /* FU, Input Gain Pad */
|
||||
{}
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue