mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-08 04:42:04 -04:00
This is the 5.4.34 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl6emyEACgkQONu9yGCS aT4XDBAAhFzbxvspY/tUCArQHN6Cl05OKkcjAdhn2n6i0lpOge8qFI/2ZEUKF/rT 0BjHxn9HjMXjVZ6v7kFh1smBiv+XwWe7peG3ahNNUF7sqxwuNnK7agGynKorPjaV UX1uK8ehvAHmZM+7iRQ9I9I4NfZcnGC9E2C2YWjcfuGe8GtrO18g4dMkEmKcDprF N8M71bo8jKCDr5Y1nqNGRPO8vRpEqKecK8EayTYTLlwPjYjTEsUc7LCYwMMIHHyb 28QlSDwSEZEPwZxSath7WKPEP0Oy5Gjtc0rZDXo+Kix3E8IxJj94pJWsy3tD9X/6 CgMN4wDtpgQlYrmYuFJQNC0MGUFN3SpqWtFDkClj0SZpuRBoYKy2sLezPkX2MAsn JuMHcBdzVoVBxiDy2/BpHD4EIB0NnhJUJw+bxLXYaktTOpQWPLLoo7lG6csDPCsr Z959FayVcHxQonfCGX4qaYFb7ZcEAu/rvD5s3aqJebeflQoxEgKucHsO8B77azmC D/YxYt65tXcIXyxZvtTQHBLHrqgXeutwWueY+Wryk3taLswFqvhe+dycZn+GKxud nP0jn4sNHP6lvHNzN28FcpkbWneETT/WSyP/N3sVE9ePW57hi+bhThCZiZE7mkVw sebT2LE0FgKn20hoXTcijc/AUA81jSxxO17bP1mZGkLp5rqb1+8= =GOl9 -----END PGP SIGNATURE----- Merge 5.4.34 into android-5.4-stable Changes in 5.4.34 amd-xgbe: Use __napi_schedule() in BH context hsr: check protocol version in hsr_newlink() l2tp: Allow management of tunnels and session in user namespace net: dsa: mt7530: fix tagged frames pass-through in VLAN-unaware mode 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: phy: micrel: use genphy_read_status for KSZ9131 net: qrtr: send msgs from local of same id as broadcast net: revert default NAPI poll timeout to 2 jiffies net: tun: record RX queue in skb before do_xdp_generic() net: dsa: mt7530: move mt7623 settings out off the mt7530 net: ethernet: mediatek: move mt7623 settings out off the mt7530 net/mlx5: Fix frequent ioread PCI access during recovery net/mlx5e: Add missing release firmware call net/mlx5e: Fix nest_level for vlan pop action net/mlx5e: Fix pfnum in devlink port attribute net: stmmac: dwmac-sunxi: Provide TX and RX fifo sizes Revert "ACPI: EC: Do not clear boot_ec_is_ecdt in acpi_ec_add()" ovl: fix value of i_ino for lower hardlink corner case scsi: ufs: Fix ufshcd_hold() caused scheduling while atomic platform/chrome: cros_ec_rpmsg: Fix race with host event jbd2: improve comments about freeing data buffers whose page mapping is NULL acpi/nfit: improve bounds checking for 'func' perf report: Fix no branch type statistics report issue pwm: pca9685: Fix PWM/GPIO inter-operation net/bpfilter: remove superfluous testing message ext4: fix incorrect group count in ext4_fill_super error message ext4: fix incorrect inodes per group in error message clk: at91: sam9x60: fix usb clock parents clk: at91: usb: use proper usbs_mask ARM: dts: imx7-colibri: fix muxing of usbc_det pin arm64: dts: librem5-devkit: add a vbus supply to usb0 usb: dwc3: gadget: Don't clear flags before transfer ended ASoC: Intel: mrfld: fix incorrect check on p->sink ASoC: Intel: mrfld: return error codes when an error occurs ALSA: hda/realtek - Enable the headset mic on Asus FX505DT 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 arm64: vdso: don't free unallocated pages 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 nl80211: fix NL80211_ATTR_FTM_RESPONDER policy mac80211: fix race in ieee80211_register_hw() mac80211_hwsim: Use kstrndup() in place of kasprintf() net/mlx5e: Encapsulate updating netdev queues into a function net/mlx5e: Rename hw_modify to preactivate net/mlx5e: Use preactivate hook to set the indirection table drm/amd/powerplay: force the trim of the mclk dpm_levels if OD is enabled drm/amdgpu: fix the hw hang during perform system reboot and reset i2c: designware: platdrv: Remove DPM_FLAG_SMART_SUSPEND flag on BYT and CHT ext4: do not zeroout extents beyond i_disksize irqchip/ti-sci-inta: Fix processing of masked irqs x86/resctrl: Preserve CDP enable over CPU hotplug x86/resctrl: Fix invalid attempt at removing the default resource group 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 Linux 5.4.34 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ice46175a7478217e00e649fa26ee8631985746f1
This commit is contained in:
commit
265e61b656
63 changed files with 366 additions and 356 deletions
2
Makefile
2
Makefile
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 33
|
||||
SUBLEVEL = 34
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@
|
|||
&iomuxc {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gpio1 &pinctrl_gpio2 &pinctrl_gpio3 &pinctrl_gpio4
|
||||
&pinctrl_gpio7>;
|
||||
&pinctrl_gpio7 &pinctrl_usbc_det>;
|
||||
|
||||
pinctrl_gpio1: gpio1-grp {
|
||||
fsl,pins = <
|
||||
|
|
@ -451,7 +451,6 @@
|
|||
|
||||
pinctrl_enet1: enet1grp {
|
||||
fsl,pins = <
|
||||
MX7D_PAD_ENET1_CRS__GPIO7_IO14 0x14
|
||||
MX7D_PAD_ENET1_RGMII_RX_CTL__ENET1_RGMII_RX_CTL 0x73
|
||||
MX7D_PAD_ENET1_RGMII_RD0__ENET1_RGMII_RD0 0x73
|
||||
MX7D_PAD_ENET1_RGMII_RD1__ENET1_RGMII_RD1 0x73
|
||||
|
|
@ -649,6 +648,12 @@
|
|||
>;
|
||||
};
|
||||
|
||||
pinctrl_usbc_det: gpio-usbc-det {
|
||||
fsl,pins = <
|
||||
MX7D_PAD_ENET1_CRS__GPIO7_IO14 0x14
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_usbh_reg: gpio-usbh-vbus {
|
||||
fsl,pins = <
|
||||
MX7D_PAD_UART3_CTS_B__GPIO4_IO7 0x14 /* SODIMM 129 USBH PEN */
|
||||
|
|
|
|||
|
|
@ -743,6 +743,7 @@
|
|||
};
|
||||
|
||||
&usb3_phy0 {
|
||||
vbus-supply = <®_5v_p>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -260,18 +260,7 @@ static int __aarch32_alloc_vdso_pages(void)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = aarch32_alloc_kuser_vdso_page();
|
||||
if (ret) {
|
||||
unsigned long c_vvar =
|
||||
(unsigned long)page_to_virt(aarch32_vdso_pages[C_VVAR]);
|
||||
unsigned long c_vdso =
|
||||
(unsigned long)page_to_virt(aarch32_vdso_pages[C_VDSO]);
|
||||
|
||||
free_page(c_vvar);
|
||||
free_page(c_vdso);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return aarch32_alloc_kuser_vdso_page();
|
||||
}
|
||||
#else
|
||||
static int __aarch32_alloc_vdso_pages(void)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -578,6 +578,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;
|
||||
|
|
|
|||
|
|
@ -601,5 +601,6 @@ bool has_busy_rmid(struct rdt_resource *r, struct rdt_domain *d);
|
|||
void __check_limbo(struct rdt_domain *d, bool force_free);
|
||||
bool cbm_validate_intel(char *buf, u32 *data, struct rdt_resource *r);
|
||||
bool cbm_validate_amd(char *buf, u32 *data, struct rdt_resource *r);
|
||||
void rdt_domain_reconfigure_cdp(struct rdt_resource *r);
|
||||
|
||||
#endif /* _ASM_X86_RESCTRL_INTERNAL_H */
|
||||
|
|
|
|||
|
|
@ -1769,6 +1769,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.
|
||||
|
|
@ -2993,7 +3006,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);
|
||||
|
|
|
|||
|
|
@ -1573,6 +1573,7 @@ static int acpi_ec_add(struct acpi_device *device)
|
|||
|
||||
if (boot_ec && ec->command_addr == boot_ec->command_addr &&
|
||||
ec->data_addr == boot_ec->data_addr) {
|
||||
boot_ec_is_ecdt = false;
|
||||
/*
|
||||
* Trust PNP0C09 namespace location rather than
|
||||
* ECDT ID. But trust ECDT GPE rather than _GPE
|
||||
|
|
@ -1592,12 +1593,9 @@ static int acpi_ec_add(struct acpi_device *device)
|
|||
|
||||
if (ec == boot_ec)
|
||||
acpi_handle_info(boot_ec->handle,
|
||||
"Boot %s EC initialization complete\n",
|
||||
"Boot %s EC used to handle transactions and events\n",
|
||||
boot_ec_is_ecdt ? "ECDT" : "DSDT");
|
||||
|
||||
acpi_handle_info(ec->handle,
|
||||
"EC: Used to handle transactions and events\n");
|
||||
|
||||
device->driver_data = ec;
|
||||
|
||||
ret = !!request_region(ec->data_addr, 1, "EC data");
|
||||
|
|
|
|||
|
|
@ -360,7 +360,7 @@ static union acpi_object *acpi_label_info(acpi_handle handle)
|
|||
|
||||
static u8 nfit_dsm_revid(unsigned family, unsigned func)
|
||||
{
|
||||
static const u8 revid_table[NVDIMM_FAMILY_MAX+1][32] = {
|
||||
static const u8 revid_table[NVDIMM_FAMILY_MAX+1][NVDIMM_CMD_MAX+1] = {
|
||||
[NVDIMM_FAMILY_INTEL] = {
|
||||
[NVDIMM_INTEL_GET_MODES] = 2,
|
||||
[NVDIMM_INTEL_GET_FWINFO] = 2,
|
||||
|
|
@ -386,7 +386,7 @@ static u8 nfit_dsm_revid(unsigned family, unsigned func)
|
|||
|
||||
if (family > NVDIMM_FAMILY_MAX)
|
||||
return 0;
|
||||
if (func > 31)
|
||||
if (func > NVDIMM_CMD_MAX)
|
||||
return 0;
|
||||
id = revid_table[family][func];
|
||||
if (id == 0)
|
||||
|
|
@ -492,7 +492,8 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
|
|||
* Check for a valid command. For ND_CMD_CALL, we also have to
|
||||
* make sure that the DSM function is supported.
|
||||
*/
|
||||
if (cmd == ND_CMD_CALL && !test_bit(func, &dsm_mask))
|
||||
if (cmd == ND_CMD_CALL &&
|
||||
(func > NVDIMM_CMD_MAX || !test_bit(func, &dsm_mask)))
|
||||
return -ENOTTY;
|
||||
else if (!test_bit(cmd, &cmd_mask))
|
||||
return -ENOTTY;
|
||||
|
|
@ -3499,7 +3500,8 @@ static int acpi_nfit_clear_to_send(struct nvdimm_bus_descriptor *nd_desc,
|
|||
if (nvdimm && cmd == ND_CMD_CALL &&
|
||||
call_pkg->nd_family == NVDIMM_FAMILY_INTEL) {
|
||||
func = call_pkg->nd_command;
|
||||
if ((1 << func) & NVDIMM_INTEL_SECURITY_CMDMASK)
|
||||
if (func > NVDIMM_CMD_MAX ||
|
||||
(1 << func) & NVDIMM_INTEL_SECURITY_CMDMASK)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
| ACPI_NFIT_MEM_NOT_ARMED | ACPI_NFIT_MEM_MAP_FAILED)
|
||||
|
||||
#define NVDIMM_FAMILY_MAX NVDIMM_FAMILY_HYPERV
|
||||
#define NVDIMM_CMD_MAX 31
|
||||
|
||||
#define NVDIMM_STANDARD_CMDMASK \
|
||||
(1 << ND_CMD_SMART | 1 << ND_CMD_SMART_THRESHOLD | 1 << ND_CMD_DIMM_FLAGS \
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ _at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
|
|||
|
||||
usb->hw.init = &init;
|
||||
usb->regmap = regmap;
|
||||
usb->usbs_mask = SAM9X5_USBS_MASK;
|
||||
usb->usbs_mask = usbs_mask;
|
||||
|
||||
hw = &usb->hw;
|
||||
ret = clk_hw_register(NULL, &usb->hw);
|
||||
|
|
|
|||
|
|
@ -237,9 +237,8 @@ static void __init sam9x60_pmc_setup(struct device_node *np)
|
|||
|
||||
parent_names[0] = "pllack";
|
||||
parent_names[1] = "upllck";
|
||||
parent_names[2] = "mainck";
|
||||
parent_names[3] = "mainck";
|
||||
hw = sam9x60_clk_register_usb(regmap, "usbck", parent_names, 4);
|
||||
parent_names[2] = "main_osc";
|
||||
hw = sam9x60_clk_register_usb(regmap, "usbck", parent_names, 3);
|
||||
if (IS_ERR(hw))
|
||||
goto err_free;
|
||||
|
||||
|
|
|
|||
|
|
@ -2176,6 +2176,8 @@ static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev)
|
|||
{
|
||||
int i, r;
|
||||
|
||||
amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);
|
||||
amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);
|
||||
|
||||
for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
|
||||
if (!adev->ip_blocks[i].status.valid)
|
||||
|
|
|
|||
|
|
@ -3805,9 +3805,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
|
||||
|
|
|
|||
|
|
@ -370,10 +370,16 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
|
|||
adap->dev.of_node = pdev->dev.of_node;
|
||||
adap->nr = -1;
|
||||
|
||||
dev_pm_set_driver_flags(&pdev->dev,
|
||||
DPM_FLAG_SMART_PREPARE |
|
||||
DPM_FLAG_SMART_SUSPEND |
|
||||
DPM_FLAG_LEAVE_SUSPENDED);
|
||||
if (dev->flags & ACCESS_NO_IRQ_SUSPEND) {
|
||||
dev_pm_set_driver_flags(&pdev->dev,
|
||||
DPM_FLAG_SMART_PREPARE |
|
||||
DPM_FLAG_LEAVE_SUSPENDED);
|
||||
} else {
|
||||
dev_pm_set_driver_flags(&pdev->dev,
|
||||
DPM_FLAG_SMART_PREPARE |
|
||||
DPM_FLAG_SMART_SUSPEND |
|
||||
DPM_FLAG_LEAVE_SUSPENDED);
|
||||
}
|
||||
|
||||
/* The code below assumes runtime PM to be disabled. */
|
||||
WARN_ON(pm_runtime_enabled(&pdev->dev));
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#define VINT_ENABLE_SET_OFFSET 0x0
|
||||
#define VINT_ENABLE_CLR_OFFSET 0x8
|
||||
#define VINT_STATUS_OFFSET 0x18
|
||||
#define VINT_STATUS_MASKED_OFFSET 0x20
|
||||
|
||||
/**
|
||||
* struct ti_sci_inta_event_desc - Description of an event coming to
|
||||
|
|
@ -116,7 +117,7 @@ static void ti_sci_inta_irq_handler(struct irq_desc *desc)
|
|||
chained_irq_enter(irq_desc_get_chip(desc), desc);
|
||||
|
||||
val = readq_relaxed(inta->base + vint_desc->vint_id * 0x1000 +
|
||||
VINT_STATUS_OFFSET);
|
||||
VINT_STATUS_MASKED_OFFSET);
|
||||
|
||||
for_each_set_bit(bit, &val, MAX_EVENTS_PER_VINT) {
|
||||
virq = irq_find_mapping(domain, vint_desc->events[bit].hwirq);
|
||||
|
|
|
|||
|
|
@ -66,58 +66,6 @@ static const struct mt7530_mib_desc mt7530_mib[] = {
|
|||
MIB_DESC(1, 0xb8, "RxArlDrop"),
|
||||
};
|
||||
|
||||
static int
|
||||
mt7623_trgmii_write(struct mt7530_priv *priv, u32 reg, u32 val)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = regmap_write(priv->ethernet, TRGMII_BASE(reg), val);
|
||||
if (ret < 0)
|
||||
dev_err(priv->dev,
|
||||
"failed to priv write register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32
|
||||
mt7623_trgmii_read(struct mt7530_priv *priv, u32 reg)
|
||||
{
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
ret = regmap_read(priv->ethernet, TRGMII_BASE(reg), &val);
|
||||
if (ret < 0) {
|
||||
dev_err(priv->dev,
|
||||
"failed to priv read register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void
|
||||
mt7623_trgmii_rmw(struct mt7530_priv *priv, u32 reg,
|
||||
u32 mask, u32 set)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = mt7623_trgmii_read(priv, reg);
|
||||
val &= ~mask;
|
||||
val |= set;
|
||||
mt7623_trgmii_write(priv, reg, val);
|
||||
}
|
||||
|
||||
static void
|
||||
mt7623_trgmii_set(struct mt7530_priv *priv, u32 reg, u32 val)
|
||||
{
|
||||
mt7623_trgmii_rmw(priv, reg, 0, val);
|
||||
}
|
||||
|
||||
static void
|
||||
mt7623_trgmii_clear(struct mt7530_priv *priv, u32 reg, u32 val)
|
||||
{
|
||||
mt7623_trgmii_rmw(priv, reg, val, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
core_read_mmd_indirect(struct mt7530_priv *priv, int prtad, int devad)
|
||||
{
|
||||
|
|
@ -530,27 +478,6 @@ mt7530_pad_clk_setup(struct dsa_switch *ds, int mode)
|
|||
for (i = 0 ; i < NUM_TRGMII_CTRL; i++)
|
||||
mt7530_rmw(priv, MT7530_TRGMII_RD(i),
|
||||
RD_TAP_MASK, RD_TAP(16));
|
||||
else
|
||||
if (priv->id != ID_MT7621)
|
||||
mt7623_trgmii_set(priv, GSW_INTF_MODE,
|
||||
INTF_MODE_TRGMII);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
mt7623_pad_clk_setup(struct dsa_switch *ds)
|
||||
{
|
||||
struct mt7530_priv *priv = ds->priv;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < NUM_TRGMII_CTRL; i++)
|
||||
mt7623_trgmii_write(priv, GSW_TRGMII_TD_ODT(i),
|
||||
TD_DM_DRVP(8) | TD_DM_DRVN(8));
|
||||
|
||||
mt7623_trgmii_set(priv, GSW_TRGMII_RCK_CTRL, RX_RST | RXC_DQSISEL);
|
||||
mt7623_trgmii_clear(priv, GSW_TRGMII_RCK_CTRL, RX_RST);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -857,8 +784,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));
|
||||
|
||||
for (i = 0; i < MT7530_NUM_PORTS; i++) {
|
||||
if (dsa_is_user_port(ds, i) &&
|
||||
|
|
@ -874,8 +802,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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -901,8 +829,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
|
||||
|
|
@ -1255,10 +1184,6 @@ mt7530_setup(struct dsa_switch *ds)
|
|||
dn = ds->ports[MT7530_CPU_PORT].master->dev.of_node->parent;
|
||||
|
||||
if (priv->id == ID_MT7530) {
|
||||
priv->ethernet = syscon_node_to_regmap(dn);
|
||||
if (IS_ERR(priv->ethernet))
|
||||
return PTR_ERR(priv->ethernet);
|
||||
|
||||
regulator_set_voltage(priv->core_pwr, 1000000, 1000000);
|
||||
ret = regulator_enable(priv->core_pwr);
|
||||
if (ret < 0) {
|
||||
|
|
@ -1332,6 +1257,10 @@ mt7530_setup(struct dsa_switch *ds)
|
|||
mt7530_cpu_port_enable(priv, i);
|
||||
else
|
||||
mt7530_port_disable(ds, i);
|
||||
|
||||
/* Enable consistent egress tag */
|
||||
mt7530_rmw(priv, MT7530_PVC_P(i), PVC_EG_TAG_MASK,
|
||||
PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT));
|
||||
}
|
||||
|
||||
/* Setup port 5 */
|
||||
|
|
@ -1416,14 +1345,6 @@ static void mt7530_phylink_mac_config(struct dsa_switch *ds, int port,
|
|||
/* Setup TX circuit incluing relevant PAD and driving */
|
||||
mt7530_pad_clk_setup(ds, state->interface);
|
||||
|
||||
if (priv->id == ID_MT7530) {
|
||||
/* Setup RX circuit, relevant PAD and driving on the
|
||||
* host which must be placed after the setup on the
|
||||
* device side is all finished.
|
||||
*/
|
||||
mt7623_pad_clk_setup(ds);
|
||||
}
|
||||
|
||||
priv->p6_interface = state->interface;
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
@ -268,7 +275,6 @@ enum mt7530_vlan_port_attr {
|
|||
|
||||
/* Registers for TRGMII on the both side */
|
||||
#define MT7530_TRGMII_RCK_CTRL 0x7a00
|
||||
#define GSW_TRGMII_RCK_CTRL 0x300
|
||||
#define RX_RST BIT(31)
|
||||
#define RXC_DQSISEL BIT(30)
|
||||
#define DQSI1_TAP_MASK (0x7f << 8)
|
||||
|
|
@ -277,31 +283,24 @@ enum mt7530_vlan_port_attr {
|
|||
#define DQSI0_TAP(x) ((x) & 0x7f)
|
||||
|
||||
#define MT7530_TRGMII_RCK_RTT 0x7a04
|
||||
#define GSW_TRGMII_RCK_RTT 0x304
|
||||
#define DQS1_GATE BIT(31)
|
||||
#define DQS0_GATE BIT(30)
|
||||
|
||||
#define MT7530_TRGMII_RD(x) (0x7a10 + (x) * 8)
|
||||
#define GSW_TRGMII_RD(x) (0x310 + (x) * 8)
|
||||
#define BSLIP_EN BIT(31)
|
||||
#define EDGE_CHK BIT(30)
|
||||
#define RD_TAP_MASK 0x7f
|
||||
#define RD_TAP(x) ((x) & 0x7f)
|
||||
|
||||
#define GSW_TRGMII_TXCTRL 0x340
|
||||
#define MT7530_TRGMII_TXCTRL 0x7a40
|
||||
#define TRAIN_TXEN BIT(31)
|
||||
#define TXC_INV BIT(30)
|
||||
#define TX_RST BIT(28)
|
||||
|
||||
#define MT7530_TRGMII_TD_ODT(i) (0x7a54 + 8 * (i))
|
||||
#define GSW_TRGMII_TD_ODT(i) (0x354 + 8 * (i))
|
||||
#define TD_DM_DRVP(x) ((x) & 0xf)
|
||||
#define TD_DM_DRVN(x) (((x) & 0xf) << 4)
|
||||
|
||||
#define GSW_INTF_MODE 0x390
|
||||
#define INTF_MODE_TRGMII BIT(1)
|
||||
|
||||
#define MT7530_TRGMII_TCK_CTRL 0x7a78
|
||||
#define TCK_TAP(x) (((x) & 0xf) << 8)
|
||||
|
||||
|
|
@ -434,7 +433,6 @@ static const char *p5_intf_modes(unsigned int p5_interface)
|
|||
* @ds: The pointer to the dsa core structure
|
||||
* @bus: The bus used for the device and built-in PHY
|
||||
* @rstc: The pointer to reset control used by MCM
|
||||
* @ethernet: The regmap used for access TRGMII-based registers
|
||||
* @core_pwr: The power supplied into the core
|
||||
* @io_pwr: The power supplied into the I/O
|
||||
* @reset: The descriptor for GPIO line tied to its reset pin
|
||||
|
|
@ -451,7 +449,6 @@ struct mt7530_priv {
|
|||
struct dsa_switch *ds;
|
||||
struct mii_bus *bus;
|
||||
struct reset_control *rstc;
|
||||
struct regmap *ethernet;
|
||||
struct regulator *core_pwr;
|
||||
struct regulator *io_pwr;
|
||||
struct gpio_desc *reset;
|
||||
|
|
|
|||
|
|
@ -514,7 +514,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
|
||||
|
|
|
|||
|
|
@ -65,6 +65,17 @@ u32 mtk_r32(struct mtk_eth *eth, unsigned reg)
|
|||
return __raw_readl(eth->base + reg);
|
||||
}
|
||||
|
||||
u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned reg)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = mtk_r32(eth, reg);
|
||||
val &= ~mask;
|
||||
val |= set;
|
||||
mtk_w32(eth, val, reg);
|
||||
return reg;
|
||||
}
|
||||
|
||||
static int mtk_mdio_busy_wait(struct mtk_eth *eth)
|
||||
{
|
||||
unsigned long t_start = jiffies;
|
||||
|
|
@ -193,7 +204,7 @@ static void mtk_mac_config(struct phylink_config *config, unsigned int mode,
|
|||
struct mtk_mac *mac = container_of(config, struct mtk_mac,
|
||||
phylink_config);
|
||||
struct mtk_eth *eth = mac->hw;
|
||||
u32 mcr_cur, mcr_new, sid;
|
||||
u32 mcr_cur, mcr_new, sid, i;
|
||||
int val, ge_mode, err;
|
||||
|
||||
/* MT76x8 has no hardware settings between for the MAC */
|
||||
|
|
@ -255,6 +266,17 @@ static void mtk_mac_config(struct phylink_config *config, unsigned int mode,
|
|||
PHY_INTERFACE_MODE_TRGMII)
|
||||
mtk_gmac0_rgmii_adjust(mac->hw,
|
||||
state->speed);
|
||||
|
||||
/* mt7623_pad_clk_setup */
|
||||
for (i = 0 ; i < NUM_TRGMII_CTRL; i++)
|
||||
mtk_w32(mac->hw,
|
||||
TD_DM_DRVP(8) | TD_DM_DRVN(8),
|
||||
TRGMII_TD_ODT(i));
|
||||
|
||||
/* Assert/release MT7623 RXC reset */
|
||||
mtk_m32(mac->hw, 0, RXC_RST | RXC_DQSISEL,
|
||||
TRGMII_RCK_CTRL);
|
||||
mtk_m32(mac->hw, RXC_RST, 0, TRGMII_RCK_CTRL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -350,10 +350,13 @@
|
|||
#define DQSI0(x) ((x << 0) & GENMASK(6, 0))
|
||||
#define DQSI1(x) ((x << 8) & GENMASK(14, 8))
|
||||
#define RXCTL_DMWTLAT(x) ((x << 16) & GENMASK(18, 16))
|
||||
#define RXC_RST BIT(31)
|
||||
#define RXC_DQSISEL BIT(30)
|
||||
#define RCK_CTRL_RGMII_1000 (RXC_DQSISEL | RXCTL_DMWTLAT(2) | DQSI1(16))
|
||||
#define RCK_CTRL_RGMII_10_100 RXCTL_DMWTLAT(2)
|
||||
|
||||
#define NUM_TRGMII_CTRL 5
|
||||
|
||||
/* TRGMII RXC control register */
|
||||
#define TRGMII_TCK_CTRL 0x10340
|
||||
#define TXCTL_DMWTLAT(x) ((x << 16) & GENMASK(18, 16))
|
||||
|
|
@ -361,6 +364,11 @@
|
|||
#define TCK_CTRL_RGMII_1000 TXCTL_DMWTLAT(2)
|
||||
#define TCK_CTRL_RGMII_10_100 (TXC_INV | TXCTL_DMWTLAT(2))
|
||||
|
||||
/* TRGMII TX Drive Strength */
|
||||
#define TRGMII_TD_ODT(i) (0x10354 + 8 * (i))
|
||||
#define TD_DM_DRVP(x) ((x) & 0xf)
|
||||
#define TD_DM_DRVN(x) (((x) & 0xf) << 4)
|
||||
|
||||
/* TRGMII Interface mode register */
|
||||
#define INTF_MODE 0x10390
|
||||
#define TRGMII_INTF_DIS BIT(0)
|
||||
|
|
|
|||
|
|
@ -23,7 +23,10 @@ static int mlx5_devlink_flash_update(struct devlink *devlink,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
return mlx5_firmware_flash(dev, fw, extack);
|
||||
err = mlx5_firmware_flash(dev, fw, extack);
|
||||
release_firmware(fw);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static u8 mlx5_fw_ver_major(u32 version)
|
||||
|
|
|
|||
|
|
@ -1035,14 +1035,15 @@ int mlx5e_open_channels(struct mlx5e_priv *priv,
|
|||
struct mlx5e_channels *chs);
|
||||
void mlx5e_close_channels(struct mlx5e_channels *chs);
|
||||
|
||||
/* Function pointer to be used to modify WH settings while
|
||||
/* Function pointer to be used to modify HW or kernel settings while
|
||||
* switching channels
|
||||
*/
|
||||
typedef int (*mlx5e_fp_hw_modify)(struct mlx5e_priv *priv);
|
||||
typedef int (*mlx5e_fp_preactivate)(struct mlx5e_priv *priv);
|
||||
int mlx5e_safe_reopen_channels(struct mlx5e_priv *priv);
|
||||
int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
|
||||
struct mlx5e_channels *new_chs,
|
||||
mlx5e_fp_hw_modify hw_modify);
|
||||
mlx5e_fp_preactivate preactivate);
|
||||
int mlx5e_num_channels_changed(struct mlx5e_priv *priv);
|
||||
void mlx5e_activate_priv_channels(struct mlx5e_priv *priv);
|
||||
void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv);
|
||||
|
||||
|
|
|
|||
|
|
@ -445,9 +445,7 @@ int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv,
|
|||
|
||||
if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
|
||||
*cur_params = new_channels.params;
|
||||
if (!netif_is_rxfh_configured(priv->netdev))
|
||||
mlx5e_build_default_indir_rqt(priv->rss_params.indirection_rqt,
|
||||
MLX5E_INDIR_RQT_SIZE, count);
|
||||
mlx5e_num_channels_changed(priv);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -455,12 +453,8 @@ int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv,
|
|||
if (arfs_enabled)
|
||||
mlx5e_arfs_disable(priv);
|
||||
|
||||
if (!netif_is_rxfh_configured(priv->netdev))
|
||||
mlx5e_build_default_indir_rqt(priv->rss_params.indirection_rqt,
|
||||
MLX5E_INDIR_RQT_SIZE, count);
|
||||
|
||||
/* Switch to new channels, set new parameters and close old ones */
|
||||
err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
|
||||
err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_num_channels_changed);
|
||||
|
||||
if (arfs_enabled) {
|
||||
int err2 = mlx5e_arfs_enable(priv);
|
||||
|
|
|
|||
|
|
@ -2897,6 +2897,28 @@ static void mlx5e_netdev_set_tcs(struct net_device *netdev)
|
|||
netdev_set_tc_queue(netdev, tc, nch, 0);
|
||||
}
|
||||
|
||||
static void mlx5e_update_netdev_queues(struct mlx5e_priv *priv)
|
||||
{
|
||||
int num_txqs = priv->channels.num * priv->channels.params.num_tc;
|
||||
int num_rxqs = priv->channels.num * priv->profile->rq_groups;
|
||||
struct net_device *netdev = priv->netdev;
|
||||
|
||||
mlx5e_netdev_set_tcs(netdev);
|
||||
netif_set_real_num_tx_queues(netdev, num_txqs);
|
||||
netif_set_real_num_rx_queues(netdev, num_rxqs);
|
||||
}
|
||||
|
||||
int mlx5e_num_channels_changed(struct mlx5e_priv *priv)
|
||||
{
|
||||
u16 count = priv->channels.params.num_channels;
|
||||
|
||||
if (!netif_is_rxfh_configured(priv->netdev))
|
||||
mlx5e_build_default_indir_rqt(priv->rss_params.indirection_rqt,
|
||||
MLX5E_INDIR_RQT_SIZE, count);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlx5e_build_txq_maps(struct mlx5e_priv *priv)
|
||||
{
|
||||
int i, ch;
|
||||
|
|
@ -2918,13 +2940,7 @@ static void mlx5e_build_txq_maps(struct mlx5e_priv *priv)
|
|||
|
||||
void mlx5e_activate_priv_channels(struct mlx5e_priv *priv)
|
||||
{
|
||||
int num_txqs = priv->channels.num * priv->channels.params.num_tc;
|
||||
int num_rxqs = priv->channels.num * priv->profile->rq_groups;
|
||||
struct net_device *netdev = priv->netdev;
|
||||
|
||||
mlx5e_netdev_set_tcs(netdev);
|
||||
netif_set_real_num_tx_queues(netdev, num_txqs);
|
||||
netif_set_real_num_rx_queues(netdev, num_rxqs);
|
||||
mlx5e_update_netdev_queues(priv);
|
||||
|
||||
mlx5e_build_txq_maps(priv);
|
||||
mlx5e_activate_channels(&priv->channels);
|
||||
|
|
@ -2960,7 +2976,7 @@ void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv)
|
|||
|
||||
static void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
|
||||
struct mlx5e_channels *new_chs,
|
||||
mlx5e_fp_hw_modify hw_modify)
|
||||
mlx5e_fp_preactivate preactivate)
|
||||
{
|
||||
struct net_device *netdev = priv->netdev;
|
||||
int new_num_txqs;
|
||||
|
|
@ -2979,9 +2995,11 @@ static void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
|
|||
|
||||
priv->channels = *new_chs;
|
||||
|
||||
/* New channels are ready to roll, modify HW settings if needed */
|
||||
if (hw_modify)
|
||||
hw_modify(priv);
|
||||
/* New channels are ready to roll, call the preactivate hook if needed
|
||||
* to modify HW settings or update kernel parameters.
|
||||
*/
|
||||
if (preactivate)
|
||||
preactivate(priv);
|
||||
|
||||
priv->profile->update_rx(priv);
|
||||
mlx5e_activate_priv_channels(priv);
|
||||
|
|
@ -2993,7 +3011,7 @@ static void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
|
|||
|
||||
int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
|
||||
struct mlx5e_channels *new_chs,
|
||||
mlx5e_fp_hw_modify hw_modify)
|
||||
mlx5e_fp_preactivate preactivate)
|
||||
{
|
||||
int err;
|
||||
|
||||
|
|
@ -3001,7 +3019,7 @@ int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
mlx5e_switch_priv_channels(priv, new_chs, hw_modify);
|
||||
mlx5e_switch_priv_channels(priv, new_chs, preactivate);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -5308,9 +5326,10 @@ int mlx5e_attach_netdev(struct mlx5e_priv *priv)
|
|||
max_nch = mlx5e_get_max_num_channels(priv->mdev);
|
||||
if (priv->channels.params.num_channels > max_nch) {
|
||||
mlx5_core_warn(priv->mdev, "MLX5E: Reducing number of channels to %d\n", max_nch);
|
||||
/* Reducing the number of channels - RXFH has to be reset. */
|
||||
priv->netdev->priv_flags &= ~IFF_RXFH_CONFIGURED;
|
||||
priv->channels.params.num_channels = max_nch;
|
||||
mlx5e_build_default_indir_rqt(priv->rss_params.indirection_rqt,
|
||||
MLX5E_INDIR_RQT_SIZE, max_nch);
|
||||
mlx5e_num_channels_changed(priv);
|
||||
}
|
||||
|
||||
err = profile->init_tx(priv);
|
||||
|
|
|
|||
|
|
@ -1814,29 +1814,30 @@ static int register_devlink_port(struct mlx5_core_dev *dev,
|
|||
struct mlx5_eswitch_rep *rep = rpriv->rep;
|
||||
struct netdev_phys_item_id ppid = {};
|
||||
unsigned int dl_port_index = 0;
|
||||
u16 pfnum;
|
||||
|
||||
if (!is_devlink_port_supported(dev, rpriv))
|
||||
return 0;
|
||||
|
||||
mlx5e_rep_get_port_parent_id(rpriv->netdev, &ppid);
|
||||
pfnum = PCI_FUNC(dev->pdev->devfn);
|
||||
|
||||
if (rep->vport == MLX5_VPORT_UPLINK) {
|
||||
devlink_port_attrs_set(&rpriv->dl_port,
|
||||
DEVLINK_PORT_FLAVOUR_PHYSICAL,
|
||||
PCI_FUNC(dev->pdev->devfn), false, 0,
|
||||
pfnum, false, 0,
|
||||
&ppid.id[0], ppid.id_len);
|
||||
dl_port_index = vport_to_devlink_port_index(dev, rep->vport);
|
||||
} else if (rep->vport == MLX5_VPORT_PF) {
|
||||
devlink_port_attrs_pci_pf_set(&rpriv->dl_port,
|
||||
&ppid.id[0], ppid.id_len,
|
||||
dev->pdev->devfn);
|
||||
pfnum);
|
||||
dl_port_index = rep->vport;
|
||||
} else if (mlx5_eswitch_is_vf_vport(dev->priv.eswitch,
|
||||
rpriv->rep->vport)) {
|
||||
devlink_port_attrs_pci_vf_set(&rpriv->dl_port,
|
||||
&ppid.id[0], ppid.id_len,
|
||||
dev->pdev->devfn,
|
||||
rep->vport - 1);
|
||||
pfnum, rep->vport - 1);
|
||||
dl_port_index = vport_to_devlink_port_index(dev, rep->vport);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3181,12 +3181,13 @@ static int add_vlan_pop_action(struct mlx5e_priv *priv,
|
|||
struct mlx5_esw_flow_attr *attr,
|
||||
u32 *action)
|
||||
{
|
||||
int nest_level = attr->parse_attr->filter_dev->lower_level;
|
||||
struct flow_action_entry vlan_act = {
|
||||
.id = FLOW_ACTION_VLAN_POP,
|
||||
};
|
||||
int err = 0;
|
||||
int nest_level, err = 0;
|
||||
|
||||
nest_level = attr->parse_attr->filter_dev->lower_level -
|
||||
priv->netdev->lower_level;
|
||||
while (nest_level--) {
|
||||
err = parse_tc_vlan_action(priv, &vlan_act, attr, action);
|
||||
if (err)
|
||||
|
|
|
|||
|
|
@ -243,7 +243,7 @@ recover_from_sw_reset:
|
|||
if (mlx5_get_nic_state(dev) == MLX5_NIC_IFC_DISABLED)
|
||||
break;
|
||||
|
||||
cond_resched();
|
||||
msleep(20);
|
||||
} while (!time_after(jiffies, end));
|
||||
|
||||
if (mlx5_get_nic_state(dev) != MLX5_NIC_IFC_DISABLED) {
|
||||
|
|
|
|||
|
|
@ -146,6 +146,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)
|
||||
|
|
|
|||
|
|
@ -1154,7 +1154,7 @@ static struct phy_driver ksphy_driver[] = {
|
|||
.driver_data = &ksz9021_type,
|
||||
.probe = kszphy_probe,
|
||||
.config_init = ksz9131_config_init,
|
||||
.read_status = ksz9031_read_status,
|
||||
.read_status = genphy_read_status,
|
||||
.ack_interrupt = kszphy_ack_interrupt,
|
||||
.config_intr = kszphy_config_intr,
|
||||
.get_sset_count = kszphy_get_sset_count,
|
||||
|
|
|
|||
|
|
@ -1925,6 +1925,7 @@ drop:
|
|||
|
||||
skb_reset_network_header(skb);
|
||||
skb_probe_transport_header(skb);
|
||||
skb_record_rx_queue(skb, tfile->queue_index);
|
||||
|
||||
if (skb_xdp) {
|
||||
struct bpf_prog *xdp_prog;
|
||||
|
|
@ -2492,6 +2493,7 @@ build:
|
|||
skb->protocol = eth_type_trans(skb, tun->dev);
|
||||
skb_reset_network_header(skb);
|
||||
skb_probe_transport_header(skb);
|
||||
skb_record_rx_queue(skb, tfile->queue_index);
|
||||
|
||||
if (skb_xdp) {
|
||||
err = do_xdp_generic(xdp_prog, skb);
|
||||
|
|
@ -2503,7 +2505,6 @@ build:
|
|||
!tfile->detached)
|
||||
rxhash = __skb_get_hash_symmetric(skb);
|
||||
|
||||
skb_record_rx_queue(skb, tfile->queue_index);
|
||||
netif_receive_skb(skb);
|
||||
|
||||
/* No need for get_cpu_ptr() here since this function is
|
||||
|
|
|
|||
|
|
@ -3581,9 +3581,9 @@ static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info)
|
|||
}
|
||||
|
||||
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;
|
||||
|
|
@ -3603,9 +3603,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
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@ struct cros_ec_rpmsg {
|
|||
struct completion xfer_ack;
|
||||
struct work_struct host_event_work;
|
||||
struct rpmsg_endpoint *ept;
|
||||
bool has_pending_host_event;
|
||||
bool probe_done;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -186,7 +188,14 @@ static int cros_ec_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
|
|||
memcpy(ec_dev->din, resp->data, len);
|
||||
complete(&ec_rpmsg->xfer_ack);
|
||||
} else if (resp->type == HOST_EVENT_MARK) {
|
||||
schedule_work(&ec_rpmsg->host_event_work);
|
||||
/*
|
||||
* If the host event is sent before cros_ec_register is
|
||||
* finished, queue the host event.
|
||||
*/
|
||||
if (ec_rpmsg->probe_done)
|
||||
schedule_work(&ec_rpmsg->host_event_work);
|
||||
else
|
||||
ec_rpmsg->has_pending_host_event = true;
|
||||
} else {
|
||||
dev_warn(ec_dev->dev, "rpmsg received invalid type = %d",
|
||||
resp->type);
|
||||
|
|
@ -249,6 +258,11 @@ static int cros_ec_rpmsg_probe(struct rpmsg_device *rpdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ec_rpmsg->probe_done = true;
|
||||
|
||||
if (ec_rpmsg->has_pending_host_event)
|
||||
schedule_work(&ec_rpmsg->host_event_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,6 +20,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
|
||||
|
|
@ -74,6 +75,7 @@ struct pca9685 {
|
|||
#if IS_ENABLED(CONFIG_GPIOLIB)
|
||||
struct mutex lock;
|
||||
struct gpio_chip gpio;
|
||||
DECLARE_BITMAP(pwms_inuse, PCA9685_MAXCHAN + 1);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
@ -83,53 +85,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);
|
||||
|
|
@ -162,6 +164,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,
|
||||
|
|
@ -213,12 +216,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;
|
||||
|
|
@ -402,7 +410,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);
|
||||
|
||||
|
|
@ -411,8 +419,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 = {
|
||||
|
|
|
|||
|
|
@ -4303,30 +4303,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;
|
||||
}
|
||||
|
|
@ -4432,9 +4439,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(
|
||||
|
|
@ -4569,49 +4576,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,
|
||||
|
|
@ -4622,8 +4586,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,
|
||||
|
|
@ -4681,12 +4643,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);
|
||||
|
|
@ -4696,7 +4661,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);
|
||||
|
||||
|
|
|
|||
|
|
@ -1476,20 +1476,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)
|
||||
|
|
|
|||
|
|
@ -156,6 +156,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;
|
||||
|
|
@ -166,6 +167,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);
|
||||
|
|
@ -190,7 +192,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);
|
||||
|
|
@ -198,7 +199,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;
|
||||
}
|
||||
|
||||
|
|
@ -486,6 +486,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) &&
|
||||
|
|
|
|||
|
|
@ -2567,10 +2567,8 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
|
|||
|
||||
dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
|
||||
|
||||
if (stop) {
|
||||
if (stop)
|
||||
dwc3_stop_active_transfer(dep, true, true);
|
||||
dep->flags = DWC3_EP_ENABLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround.
|
||||
|
|
|
|||
|
|
@ -561,8 +561,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
|
||||
|
|
|
|||
|
|
@ -3549,8 +3549,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;
|
||||
|
||||
|
|
@ -3805,8 +3805,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;
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -4136,7 +4136,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 /
|
||||
|
|
@ -4265,9 +4265,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));
|
||||
|
|
|
|||
|
|
@ -995,9 +995,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)) {
|
||||
|
|
|
|||
|
|
@ -882,7 +882,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;
|
||||
|
|
@ -932,6 +932,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);
|
||||
|
|
|
|||
|
|
@ -254,6 +254,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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -676,7 +676,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;
|
||||
|
|
|
|||
|
|
@ -1088,14 +1088,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
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@ static void loop(void)
|
|||
struct mbox_reply reply;
|
||||
int n;
|
||||
|
||||
fprintf(debug_f, "testing the buffer\n");
|
||||
n = read(0, &req, sizeof(req));
|
||||
if (n != sizeof(req)) {
|
||||
fprintf(debug_f, "invalid request %d\n", n);
|
||||
|
|
|
|||
|
|
@ -3863,7 +3863,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 */
|
||||
|
|
|
|||
|
|
@ -61,10 +61,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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -614,12 +614,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();
|
||||
|
|
@ -632,6 +635,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,
|
||||
|
|
@ -675,7 +681,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;
|
||||
}
|
||||
|
|
@ -940,8 +946,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);
|
||||
|
|
|
|||
|
|
@ -920,51 +920,51 @@ static const struct genl_ops l2tp_nl_ops[] = {
|
|||
.cmd = L2TP_CMD_TUNNEL_CREATE,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = l2tp_nl_cmd_tunnel_create,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
},
|
||||
{
|
||||
.cmd = L2TP_CMD_TUNNEL_DELETE,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = l2tp_nl_cmd_tunnel_delete,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
},
|
||||
{
|
||||
.cmd = L2TP_CMD_TUNNEL_MODIFY,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = l2tp_nl_cmd_tunnel_modify,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
},
|
||||
{
|
||||
.cmd = L2TP_CMD_TUNNEL_GET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = l2tp_nl_cmd_tunnel_get,
|
||||
.dumpit = l2tp_nl_cmd_tunnel_dump,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
},
|
||||
{
|
||||
.cmd = L2TP_CMD_SESSION_CREATE,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = l2tp_nl_cmd_session_create,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
},
|
||||
{
|
||||
.cmd = L2TP_CMD_SESSION_DELETE,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = l2tp_nl_cmd_session_delete,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
},
|
||||
{
|
||||
.cmd = L2TP_CMD_SESSION_MODIFY,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = l2tp_nl_cmd_session_modify,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
},
|
||||
{
|
||||
.cmd = L2TP_CMD_SESSION_GET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = l2tp_nl_cmd_session_get,
|
||||
.dumpit = l2tp_nl_cmd_session_dump,
|
||||
.flags = GENL_ADMIN_PERM,
|
||||
.flags = GENL_UNS_ADMIN_PERM,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1045,7 +1045,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
|||
local->hw.wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC;
|
||||
if (hw->max_signal <= 0) {
|
||||
result = -EINVAL;
|
||||
goto fail_wiphy_register;
|
||||
goto fail_workqueue;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1107,7 +1107,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
|||
|
||||
result = ieee80211_init_cipher_suites(local);
|
||||
if (result < 0)
|
||||
goto fail_wiphy_register;
|
||||
goto fail_workqueue;
|
||||
|
||||
if (!local->ops->remain_on_channel)
|
||||
local->hw.wiphy->max_remain_on_channel_duration = 5000;
|
||||
|
|
@ -1133,10 +1133,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
|||
|
||||
local->hw.wiphy->max_num_csa_counters = IEEE80211_MAX_CSA_COUNTERS_NUM;
|
||||
|
||||
result = wiphy_register(local->hw.wiphy);
|
||||
if (result < 0)
|
||||
goto fail_wiphy_register;
|
||||
|
||||
/*
|
||||
* We use the number of queues for feature tests (QoS, HT) internally
|
||||
* so restrict them appropriately.
|
||||
|
|
@ -1192,9 +1188,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
|||
goto fail_flows;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
result = ieee80211_init_rate_ctrl_alg(local,
|
||||
hw->rate_control_algorithm);
|
||||
rtnl_unlock();
|
||||
if (result < 0) {
|
||||
wiphy_debug(local->hw.wiphy,
|
||||
"Failed to initialize rate control algorithm\n");
|
||||
|
|
@ -1248,6 +1244,12 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
|||
local->sband_allocated |= BIT(band);
|
||||
}
|
||||
|
||||
result = wiphy_register(local->hw.wiphy);
|
||||
if (result < 0)
|
||||
goto fail_wiphy_register;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
/* add one default STA interface if supported */
|
||||
if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION) &&
|
||||
!ieee80211_hw_check(hw, NO_AUTO_VIF)) {
|
||||
|
|
@ -1287,17 +1289,17 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
|||
#if defined(CONFIG_INET) || defined(CONFIG_IPV6)
|
||||
fail_ifa:
|
||||
#endif
|
||||
wiphy_unregister(local->hw.wiphy);
|
||||
fail_wiphy_register:
|
||||
rtnl_lock();
|
||||
rate_control_deinitialize(local);
|
||||
ieee80211_remove_interfaces(local);
|
||||
fail_rate:
|
||||
rtnl_unlock();
|
||||
fail_rate:
|
||||
fail_flows:
|
||||
ieee80211_led_exit(local);
|
||||
destroy_workqueue(local->workqueue);
|
||||
fail_workqueue:
|
||||
wiphy_unregister(local->hw.wiphy);
|
||||
fail_wiphy_register:
|
||||
if (local->wiphy_ciphers_allocated)
|
||||
kfree(local->hw.wiphy->cipher_suites);
|
||||
kfree(local->int_scan_req);
|
||||
|
|
@ -1347,8 +1349,8 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw)
|
|||
skb_queue_purge(&local->skb_queue_unreliable);
|
||||
skb_queue_purge(&local->skb_queue_tdls_chsw);
|
||||
|
||||
destroy_workqueue(local->workqueue);
|
||||
wiphy_unregister(local->hw.wiphy);
|
||||
destroy_workqueue(local->workqueue);
|
||||
ieee80211_led_exit(local);
|
||||
kfree(local->int_scan_req);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -763,20 +763,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;
|
||||
|
|
|
|||
|
|
@ -618,10 +618,8 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
|||
[NL80211_ATTR_HE_CAPABILITY] = { .type = NLA_BINARY,
|
||||
.len = NL80211_HE_MAX_CAPABILITY_LEN },
|
||||
|
||||
[NL80211_ATTR_FTM_RESPONDER] = {
|
||||
.type = NLA_NESTED,
|
||||
.validation_data = nl80211_ftm_responder_policy,
|
||||
},
|
||||
[NL80211_ATTR_FTM_RESPONDER] =
|
||||
NLA_POLICY_NESTED(nl80211_ftm_responder_policy),
|
||||
[NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1),
|
||||
[NL80211_ATTR_PEER_MEASUREMENTS] =
|
||||
NLA_POLICY_NESTED(nl80211_pmsr_attr_policy),
|
||||
|
|
|
|||
|
|
@ -139,6 +139,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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7253,6 +7253,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
|
||||
SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
|
||||
|
|
|
|||
|
|
@ -1333,7 +1333,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 &&
|
||||
|
|
|
|||
|
|
@ -99,7 +99,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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1446,7 +1446,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;
|
||||
|
|
@ -1750,11 +1750,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;
|
||||
|
|
@ -2088,8 +2092,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;
|
||||
}
|
||||
|
|
@ -3050,13 +3055,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;
|
||||
|
|
@ -3085,7 +3090,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;
|
||||
}
|
||||
}
|
||||
|
|
@ -3128,10 +3133,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;
|
||||
|
|
@ -3153,10 +3159,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -350,9 +350,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 */
|
||||
{}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -181,24 +181,23 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,
|
|||
{
|
||||
struct hist_entry *he = iter->he;
|
||||
struct report *rep = arg;
|
||||
struct branch_info *bi;
|
||||
struct branch_info *bi = he->branch_info;
|
||||
struct perf_sample *sample = iter->sample;
|
||||
struct evsel *evsel = iter->evsel;
|
||||
int err;
|
||||
|
||||
branch_type_count(&rep->brtype_stat, &bi->flags,
|
||||
bi->from.addr, bi->to.addr);
|
||||
|
||||
if (!ui__has_annotation() && !rep->symbol_ipc)
|
||||
return 0;
|
||||
|
||||
bi = he->branch_info;
|
||||
err = addr_map_symbol__inc_samples(&bi->from, sample, evsel);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = addr_map_symbol__inc_samples(&bi->to, sample, evsel);
|
||||
|
||||
branch_type_count(&rep->brtype_stat, &bi->flags,
|
||||
bi->from.addr, bi->to.addr);
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue