Annotation of /trunk/kernel-alx/patches-5.4/0133-5.4.34-all-fixes.patch
Parent Directory | Revision Log
Revision 3514 -
(hide annotations)
(download)
Mon May 11 14:36:40 2020 UTC (4 years, 1 month ago) by niro
File size: 73417 byte(s)
Mon May 11 14:36:40 2020 UTC (4 years, 1 month ago) by niro
File size: 73417 byte(s)
-linux-5.4.34
1 | niro | 3514 | diff --git a/Makefile b/Makefile |
2 | index c09d5a4d2e7a..fdbc51db822a 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,7 +1,7 @@ | ||
6 | # SPDX-License-Identifier: GPL-2.0 | ||
7 | VERSION = 5 | ||
8 | PATCHLEVEL = 4 | ||
9 | -SUBLEVEL = 33 | ||
10 | +SUBLEVEL = 34 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Kleptomaniac Octopus | ||
13 | |||
14 | diff --git a/arch/arm/boot/dts/imx7-colibri.dtsi b/arch/arm/boot/dts/imx7-colibri.dtsi | ||
15 | index eed78f12e79e..8bba03de51ad 100644 | ||
16 | --- a/arch/arm/boot/dts/imx7-colibri.dtsi | ||
17 | +++ b/arch/arm/boot/dts/imx7-colibri.dtsi | ||
18 | @@ -346,7 +346,7 @@ | ||
19 | &iomuxc { | ||
20 | pinctrl-names = "default"; | ||
21 | pinctrl-0 = <&pinctrl_gpio1 &pinctrl_gpio2 &pinctrl_gpio3 &pinctrl_gpio4 | ||
22 | - &pinctrl_gpio7>; | ||
23 | + &pinctrl_gpio7 &pinctrl_usbc_det>; | ||
24 | |||
25 | pinctrl_gpio1: gpio1-grp { | ||
26 | fsl,pins = < | ||
27 | @@ -451,7 +451,6 @@ | ||
28 | |||
29 | pinctrl_enet1: enet1grp { | ||
30 | fsl,pins = < | ||
31 | - MX7D_PAD_ENET1_CRS__GPIO7_IO14 0x14 | ||
32 | MX7D_PAD_ENET1_RGMII_RX_CTL__ENET1_RGMII_RX_CTL 0x73 | ||
33 | MX7D_PAD_ENET1_RGMII_RD0__ENET1_RGMII_RD0 0x73 | ||
34 | MX7D_PAD_ENET1_RGMII_RD1__ENET1_RGMII_RD1 0x73 | ||
35 | @@ -649,6 +648,12 @@ | ||
36 | >; | ||
37 | }; | ||
38 | |||
39 | + pinctrl_usbc_det: gpio-usbc-det { | ||
40 | + fsl,pins = < | ||
41 | + MX7D_PAD_ENET1_CRS__GPIO7_IO14 0x14 | ||
42 | + >; | ||
43 | + }; | ||
44 | + | ||
45 | pinctrl_usbh_reg: gpio-usbh-vbus { | ||
46 | fsl,pins = < | ||
47 | MX7D_PAD_UART3_CTS_B__GPIO4_IO7 0x14 /* SODIMM 129 USBH PEN */ | ||
48 | diff --git a/arch/arm64/boot/dts/freescale/imx8mq-librem5-devkit.dts b/arch/arm64/boot/dts/freescale/imx8mq-librem5-devkit.dts | ||
49 | index 98cfe67b7db7..19b427f68dad 100644 | ||
50 | --- a/arch/arm64/boot/dts/freescale/imx8mq-librem5-devkit.dts | ||
51 | +++ b/arch/arm64/boot/dts/freescale/imx8mq-librem5-devkit.dts | ||
52 | @@ -743,6 +743,7 @@ | ||
53 | }; | ||
54 | |||
55 | &usb3_phy0 { | ||
56 | + vbus-supply = <®_5v_p>; | ||
57 | status = "okay"; | ||
58 | }; | ||
59 | |||
60 | diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c | ||
61 | index 354b11e27c07..033a48f30dbb 100644 | ||
62 | --- a/arch/arm64/kernel/vdso.c | ||
63 | +++ b/arch/arm64/kernel/vdso.c | ||
64 | @@ -260,18 +260,7 @@ static int __aarch32_alloc_vdso_pages(void) | ||
65 | if (ret) | ||
66 | return ret; | ||
67 | |||
68 | - ret = aarch32_alloc_kuser_vdso_page(); | ||
69 | - if (ret) { | ||
70 | - unsigned long c_vvar = | ||
71 | - (unsigned long)page_to_virt(aarch32_vdso_pages[C_VVAR]); | ||
72 | - unsigned long c_vdso = | ||
73 | - (unsigned long)page_to_virt(aarch32_vdso_pages[C_VDSO]); | ||
74 | - | ||
75 | - free_page(c_vvar); | ||
76 | - free_page(c_vdso); | ||
77 | - } | ||
78 | - | ||
79 | - return ret; | ||
80 | + return aarch32_alloc_kuser_vdso_page(); | ||
81 | } | ||
82 | #else | ||
83 | static int __aarch32_alloc_vdso_pages(void) | ||
84 | diff --git a/arch/x86/include/asm/microcode_amd.h b/arch/x86/include/asm/microcode_amd.h | ||
85 | index 209492849566..5c524d4f71cd 100644 | ||
86 | --- a/arch/x86/include/asm/microcode_amd.h | ||
87 | +++ b/arch/x86/include/asm/microcode_amd.h | ||
88 | @@ -41,7 +41,7 @@ struct microcode_amd { | ||
89 | unsigned int mpb[0]; | ||
90 | }; | ||
91 | |||
92 | -#define PATCH_MAX_SIZE PAGE_SIZE | ||
93 | +#define PATCH_MAX_SIZE (3 * PAGE_SIZE) | ||
94 | |||
95 | #ifdef CONFIG_MICROCODE_AMD | ||
96 | extern void __init load_ucode_amd_bsp(unsigned int family); | ||
97 | diff --git a/arch/x86/kernel/cpu/resctrl/core.c b/arch/x86/kernel/cpu/resctrl/core.c | ||
98 | index 89049b343c7a..d8cc5223b7ce 100644 | ||
99 | --- a/arch/x86/kernel/cpu/resctrl/core.c | ||
100 | +++ b/arch/x86/kernel/cpu/resctrl/core.c | ||
101 | @@ -578,6 +578,8 @@ static void domain_add_cpu(int cpu, struct rdt_resource *r) | ||
102 | d->id = id; | ||
103 | cpumask_set_cpu(cpu, &d->cpu_mask); | ||
104 | |||
105 | + rdt_domain_reconfigure_cdp(r); | ||
106 | + | ||
107 | if (r->alloc_capable && domain_setup_ctrlval(r, d)) { | ||
108 | kfree(d); | ||
109 | return; | ||
110 | diff --git a/arch/x86/kernel/cpu/resctrl/internal.h b/arch/x86/kernel/cpu/resctrl/internal.h | ||
111 | index 181c992f448c..3dd13f3a8b23 100644 | ||
112 | --- a/arch/x86/kernel/cpu/resctrl/internal.h | ||
113 | +++ b/arch/x86/kernel/cpu/resctrl/internal.h | ||
114 | @@ -601,5 +601,6 @@ bool has_busy_rmid(struct rdt_resource *r, struct rdt_domain *d); | ||
115 | void __check_limbo(struct rdt_domain *d, bool force_free); | ||
116 | bool cbm_validate_intel(char *buf, u32 *data, struct rdt_resource *r); | ||
117 | bool cbm_validate_amd(char *buf, u32 *data, struct rdt_resource *r); | ||
118 | +void rdt_domain_reconfigure_cdp(struct rdt_resource *r); | ||
119 | |||
120 | #endif /* _ASM_X86_RESCTRL_INTERNAL_H */ | ||
121 | diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c b/arch/x86/kernel/cpu/resctrl/rdtgroup.c | ||
122 | index 954fd048ad9b..20856d80dce3 100644 | ||
123 | --- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c | ||
124 | +++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c | ||
125 | @@ -1769,6 +1769,19 @@ static int set_cache_qos_cfg(int level, bool enable) | ||
126 | return 0; | ||
127 | } | ||
128 | |||
129 | +/* Restore the qos cfg state when a domain comes online */ | ||
130 | +void rdt_domain_reconfigure_cdp(struct rdt_resource *r) | ||
131 | +{ | ||
132 | + if (!r->alloc_capable) | ||
133 | + return; | ||
134 | + | ||
135 | + if (r == &rdt_resources_all[RDT_RESOURCE_L2DATA]) | ||
136 | + l2_qos_cfg_update(&r->alloc_enabled); | ||
137 | + | ||
138 | + if (r == &rdt_resources_all[RDT_RESOURCE_L3DATA]) | ||
139 | + l3_qos_cfg_update(&r->alloc_enabled); | ||
140 | +} | ||
141 | + | ||
142 | /* | ||
143 | * Enable or disable the MBA software controller | ||
144 | * which helps user specify bandwidth in MBps. | ||
145 | @@ -2993,7 +3006,8 @@ static int rdtgroup_rmdir(struct kernfs_node *kn) | ||
146 | * If the rdtgroup is a mon group and parent directory | ||
147 | * is a valid "mon_groups" directory, remove the mon group. | ||
148 | */ | ||
149 | - if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == rdtgroup_default.kn) { | ||
150 | + if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == rdtgroup_default.kn && | ||
151 | + rdtgrp != &rdtgroup_default) { | ||
152 | if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP || | ||
153 | rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) { | ||
154 | ret = rdtgroup_ctrl_remove(kn, rdtgrp); | ||
155 | diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c | ||
156 | index ed2ecb00004f..5e6c8bfc6612 100644 | ||
157 | --- a/drivers/acpi/ec.c | ||
158 | +++ b/drivers/acpi/ec.c | ||
159 | @@ -1573,6 +1573,7 @@ static int acpi_ec_add(struct acpi_device *device) | ||
160 | |||
161 | if (boot_ec && ec->command_addr == boot_ec->command_addr && | ||
162 | ec->data_addr == boot_ec->data_addr) { | ||
163 | + boot_ec_is_ecdt = false; | ||
164 | /* | ||
165 | * Trust PNP0C09 namespace location rather than | ||
166 | * ECDT ID. But trust ECDT GPE rather than _GPE | ||
167 | @@ -1592,12 +1593,9 @@ static int acpi_ec_add(struct acpi_device *device) | ||
168 | |||
169 | if (ec == boot_ec) | ||
170 | acpi_handle_info(boot_ec->handle, | ||
171 | - "Boot %s EC initialization complete\n", | ||
172 | + "Boot %s EC used to handle transactions and events\n", | ||
173 | boot_ec_is_ecdt ? "ECDT" : "DSDT"); | ||
174 | |||
175 | - acpi_handle_info(ec->handle, | ||
176 | - "EC: Used to handle transactions and events\n"); | ||
177 | - | ||
178 | device->driver_data = ec; | ||
179 | |||
180 | ret = !!request_region(ec->data_addr, 1, "EC data"); | ||
181 | diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c | ||
182 | index 14e68f202f81..12d980aafc5f 100644 | ||
183 | --- a/drivers/acpi/nfit/core.c | ||
184 | +++ b/drivers/acpi/nfit/core.c | ||
185 | @@ -360,7 +360,7 @@ static union acpi_object *acpi_label_info(acpi_handle handle) | ||
186 | |||
187 | static u8 nfit_dsm_revid(unsigned family, unsigned func) | ||
188 | { | ||
189 | - static const u8 revid_table[NVDIMM_FAMILY_MAX+1][32] = { | ||
190 | + static const u8 revid_table[NVDIMM_FAMILY_MAX+1][NVDIMM_CMD_MAX+1] = { | ||
191 | [NVDIMM_FAMILY_INTEL] = { | ||
192 | [NVDIMM_INTEL_GET_MODES] = 2, | ||
193 | [NVDIMM_INTEL_GET_FWINFO] = 2, | ||
194 | @@ -386,7 +386,7 @@ static u8 nfit_dsm_revid(unsigned family, unsigned func) | ||
195 | |||
196 | if (family > NVDIMM_FAMILY_MAX) | ||
197 | return 0; | ||
198 | - if (func > 31) | ||
199 | + if (func > NVDIMM_CMD_MAX) | ||
200 | return 0; | ||
201 | id = revid_table[family][func]; | ||
202 | if (id == 0) | ||
203 | @@ -492,7 +492,8 @@ int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm, | ||
204 | * Check for a valid command. For ND_CMD_CALL, we also have to | ||
205 | * make sure that the DSM function is supported. | ||
206 | */ | ||
207 | - if (cmd == ND_CMD_CALL && !test_bit(func, &dsm_mask)) | ||
208 | + if (cmd == ND_CMD_CALL && | ||
209 | + (func > NVDIMM_CMD_MAX || !test_bit(func, &dsm_mask))) | ||
210 | return -ENOTTY; | ||
211 | else if (!test_bit(cmd, &cmd_mask)) | ||
212 | return -ENOTTY; | ||
213 | @@ -3499,7 +3500,8 @@ static int acpi_nfit_clear_to_send(struct nvdimm_bus_descriptor *nd_desc, | ||
214 | if (nvdimm && cmd == ND_CMD_CALL && | ||
215 | call_pkg->nd_family == NVDIMM_FAMILY_INTEL) { | ||
216 | func = call_pkg->nd_command; | ||
217 | - if ((1 << func) & NVDIMM_INTEL_SECURITY_CMDMASK) | ||
218 | + if (func > NVDIMM_CMD_MAX || | ||
219 | + (1 << func) & NVDIMM_INTEL_SECURITY_CMDMASK) | ||
220 | return -EOPNOTSUPP; | ||
221 | } | ||
222 | |||
223 | diff --git a/drivers/acpi/nfit/nfit.h b/drivers/acpi/nfit/nfit.h | ||
224 | index 24241941181c..b317f4043705 100644 | ||
225 | --- a/drivers/acpi/nfit/nfit.h | ||
226 | +++ b/drivers/acpi/nfit/nfit.h | ||
227 | @@ -34,6 +34,7 @@ | ||
228 | | ACPI_NFIT_MEM_NOT_ARMED | ACPI_NFIT_MEM_MAP_FAILED) | ||
229 | |||
230 | #define NVDIMM_FAMILY_MAX NVDIMM_FAMILY_HYPERV | ||
231 | +#define NVDIMM_CMD_MAX 31 | ||
232 | |||
233 | #define NVDIMM_STANDARD_CMDMASK \ | ||
234 | (1 << ND_CMD_SMART | 1 << ND_CMD_SMART_THRESHOLD | 1 << ND_CMD_DIMM_FLAGS \ | ||
235 | diff --git a/drivers/clk/at91/clk-usb.c b/drivers/clk/at91/clk-usb.c | ||
236 | index 22aede42a336..bda92980e015 100644 | ||
237 | --- a/drivers/clk/at91/clk-usb.c | ||
238 | +++ b/drivers/clk/at91/clk-usb.c | ||
239 | @@ -211,7 +211,7 @@ _at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name, | ||
240 | |||
241 | usb->hw.init = &init; | ||
242 | usb->regmap = regmap; | ||
243 | - usb->usbs_mask = SAM9X5_USBS_MASK; | ||
244 | + usb->usbs_mask = usbs_mask; | ||
245 | |||
246 | hw = &usb->hw; | ||
247 | ret = clk_hw_register(NULL, &usb->hw); | ||
248 | diff --git a/drivers/clk/at91/sam9x60.c b/drivers/clk/at91/sam9x60.c | ||
249 | index 77398aefeb6d..7338a3bc71eb 100644 | ||
250 | --- a/drivers/clk/at91/sam9x60.c | ||
251 | +++ b/drivers/clk/at91/sam9x60.c | ||
252 | @@ -237,9 +237,8 @@ static void __init sam9x60_pmc_setup(struct device_node *np) | ||
253 | |||
254 | parent_names[0] = "pllack"; | ||
255 | parent_names[1] = "upllck"; | ||
256 | - parent_names[2] = "mainck"; | ||
257 | - parent_names[3] = "mainck"; | ||
258 | - hw = sam9x60_clk_register_usb(regmap, "usbck", parent_names, 4); | ||
259 | + parent_names[2] = "main_osc"; | ||
260 | + hw = sam9x60_clk_register_usb(regmap, "usbck", parent_names, 3); | ||
261 | if (IS_ERR(hw)) | ||
262 | goto err_free; | ||
263 | |||
264 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | ||
265 | index f423b5384705..630e8342d162 100644 | ||
266 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | ||
267 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | ||
268 | @@ -2176,6 +2176,8 @@ static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev) | ||
269 | { | ||
270 | int i, r; | ||
271 | |||
272 | + amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE); | ||
273 | + amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE); | ||
274 | |||
275 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { | ||
276 | if (!adev->ip_blocks[i].status.valid) | ||
277 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | ||
278 | index 203ce4b1028f..e6da53e9c3f4 100644 | ||
279 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | ||
280 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | ||
281 | @@ -3805,9 +3805,12 @@ static int smu7_trim_single_dpm_states(struct pp_hwmgr *hwmgr, | ||
282 | { | ||
283 | uint32_t i; | ||
284 | |||
285 | + /* force the trim if mclk_switching is disabled to prevent flicker */ | ||
286 | + bool force_trim = (low_limit == high_limit); | ||
287 | for (i = 0; i < dpm_table->count; i++) { | ||
288 | /*skip the trim if od is enabled*/ | ||
289 | - if (!hwmgr->od_enabled && (dpm_table->dpm_levels[i].value < low_limit | ||
290 | + if ((!hwmgr->od_enabled || force_trim) | ||
291 | + && (dpm_table->dpm_levels[i].value < low_limit | ||
292 | || dpm_table->dpm_levels[i].value > high_limit)) | ||
293 | dpm_table->dpm_levels[i].enabled = false; | ||
294 | else | ||
295 | diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c | ||
296 | index 16dd338877d0..0c55c54372d7 100644 | ||
297 | --- a/drivers/i2c/busses/i2c-designware-platdrv.c | ||
298 | +++ b/drivers/i2c/busses/i2c-designware-platdrv.c | ||
299 | @@ -370,10 +370,16 @@ static int dw_i2c_plat_probe(struct platform_device *pdev) | ||
300 | adap->dev.of_node = pdev->dev.of_node; | ||
301 | adap->nr = -1; | ||
302 | |||
303 | - dev_pm_set_driver_flags(&pdev->dev, | ||
304 | - DPM_FLAG_SMART_PREPARE | | ||
305 | - DPM_FLAG_SMART_SUSPEND | | ||
306 | - DPM_FLAG_LEAVE_SUSPENDED); | ||
307 | + if (dev->flags & ACCESS_NO_IRQ_SUSPEND) { | ||
308 | + dev_pm_set_driver_flags(&pdev->dev, | ||
309 | + DPM_FLAG_SMART_PREPARE | | ||
310 | + DPM_FLAG_LEAVE_SUSPENDED); | ||
311 | + } else { | ||
312 | + dev_pm_set_driver_flags(&pdev->dev, | ||
313 | + DPM_FLAG_SMART_PREPARE | | ||
314 | + DPM_FLAG_SMART_SUSPEND | | ||
315 | + DPM_FLAG_LEAVE_SUSPENDED); | ||
316 | + } | ||
317 | |||
318 | /* The code below assumes runtime PM to be disabled. */ | ||
319 | WARN_ON(pm_runtime_enabled(&pdev->dev)); | ||
320 | diff --git a/drivers/irqchip/irq-ti-sci-inta.c b/drivers/irqchip/irq-ti-sci-inta.c | ||
321 | index ef4d625d2d80..fa7488863bd0 100644 | ||
322 | --- a/drivers/irqchip/irq-ti-sci-inta.c | ||
323 | +++ b/drivers/irqchip/irq-ti-sci-inta.c | ||
324 | @@ -37,6 +37,7 @@ | ||
325 | #define VINT_ENABLE_SET_OFFSET 0x0 | ||
326 | #define VINT_ENABLE_CLR_OFFSET 0x8 | ||
327 | #define VINT_STATUS_OFFSET 0x18 | ||
328 | +#define VINT_STATUS_MASKED_OFFSET 0x20 | ||
329 | |||
330 | /** | ||
331 | * struct ti_sci_inta_event_desc - Description of an event coming to | ||
332 | @@ -116,7 +117,7 @@ static void ti_sci_inta_irq_handler(struct irq_desc *desc) | ||
333 | chained_irq_enter(irq_desc_get_chip(desc), desc); | ||
334 | |||
335 | val = readq_relaxed(inta->base + vint_desc->vint_id * 0x1000 + | ||
336 | - VINT_STATUS_OFFSET); | ||
337 | + VINT_STATUS_MASKED_OFFSET); | ||
338 | |||
339 | for_each_set_bit(bit, &val, MAX_EVENTS_PER_VINT) { | ||
340 | virq = irq_find_mapping(domain, vint_desc->events[bit].hwirq); | ||
341 | diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c | ||
342 | index 8071c3fa3fb7..cffaf4fdd772 100644 | ||
343 | --- a/drivers/net/dsa/mt7530.c | ||
344 | +++ b/drivers/net/dsa/mt7530.c | ||
345 | @@ -66,58 +66,6 @@ static const struct mt7530_mib_desc mt7530_mib[] = { | ||
346 | MIB_DESC(1, 0xb8, "RxArlDrop"), | ||
347 | }; | ||
348 | |||
349 | -static int | ||
350 | -mt7623_trgmii_write(struct mt7530_priv *priv, u32 reg, u32 val) | ||
351 | -{ | ||
352 | - int ret; | ||
353 | - | ||
354 | - ret = regmap_write(priv->ethernet, TRGMII_BASE(reg), val); | ||
355 | - if (ret < 0) | ||
356 | - dev_err(priv->dev, | ||
357 | - "failed to priv write register\n"); | ||
358 | - return ret; | ||
359 | -} | ||
360 | - | ||
361 | -static u32 | ||
362 | -mt7623_trgmii_read(struct mt7530_priv *priv, u32 reg) | ||
363 | -{ | ||
364 | - int ret; | ||
365 | - u32 val; | ||
366 | - | ||
367 | - ret = regmap_read(priv->ethernet, TRGMII_BASE(reg), &val); | ||
368 | - if (ret < 0) { | ||
369 | - dev_err(priv->dev, | ||
370 | - "failed to priv read register\n"); | ||
371 | - return ret; | ||
372 | - } | ||
373 | - | ||
374 | - return val; | ||
375 | -} | ||
376 | - | ||
377 | -static void | ||
378 | -mt7623_trgmii_rmw(struct mt7530_priv *priv, u32 reg, | ||
379 | - u32 mask, u32 set) | ||
380 | -{ | ||
381 | - u32 val; | ||
382 | - | ||
383 | - val = mt7623_trgmii_read(priv, reg); | ||
384 | - val &= ~mask; | ||
385 | - val |= set; | ||
386 | - mt7623_trgmii_write(priv, reg, val); | ||
387 | -} | ||
388 | - | ||
389 | -static void | ||
390 | -mt7623_trgmii_set(struct mt7530_priv *priv, u32 reg, u32 val) | ||
391 | -{ | ||
392 | - mt7623_trgmii_rmw(priv, reg, 0, val); | ||
393 | -} | ||
394 | - | ||
395 | -static void | ||
396 | -mt7623_trgmii_clear(struct mt7530_priv *priv, u32 reg, u32 val) | ||
397 | -{ | ||
398 | - mt7623_trgmii_rmw(priv, reg, val, 0); | ||
399 | -} | ||
400 | - | ||
401 | static int | ||
402 | core_read_mmd_indirect(struct mt7530_priv *priv, int prtad, int devad) | ||
403 | { | ||
404 | @@ -530,27 +478,6 @@ mt7530_pad_clk_setup(struct dsa_switch *ds, int mode) | ||
405 | for (i = 0 ; i < NUM_TRGMII_CTRL; i++) | ||
406 | mt7530_rmw(priv, MT7530_TRGMII_RD(i), | ||
407 | RD_TAP_MASK, RD_TAP(16)); | ||
408 | - else | ||
409 | - if (priv->id != ID_MT7621) | ||
410 | - mt7623_trgmii_set(priv, GSW_INTF_MODE, | ||
411 | - INTF_MODE_TRGMII); | ||
412 | - | ||
413 | - return 0; | ||
414 | -} | ||
415 | - | ||
416 | -static int | ||
417 | -mt7623_pad_clk_setup(struct dsa_switch *ds) | ||
418 | -{ | ||
419 | - struct mt7530_priv *priv = ds->priv; | ||
420 | - int i; | ||
421 | - | ||
422 | - for (i = 0 ; i < NUM_TRGMII_CTRL; i++) | ||
423 | - mt7623_trgmii_write(priv, GSW_TRGMII_TD_ODT(i), | ||
424 | - TD_DM_DRVP(8) | TD_DM_DRVN(8)); | ||
425 | - | ||
426 | - mt7623_trgmii_set(priv, GSW_TRGMII_RCK_CTRL, RX_RST | RXC_DQSISEL); | ||
427 | - mt7623_trgmii_clear(priv, GSW_TRGMII_RCK_CTRL, RX_RST); | ||
428 | - | ||
429 | return 0; | ||
430 | } | ||
431 | |||
432 | @@ -857,8 +784,9 @@ mt7530_port_set_vlan_unaware(struct dsa_switch *ds, int port) | ||
433 | */ | ||
434 | mt7530_rmw(priv, MT7530_PCR_P(port), PCR_PORT_VLAN_MASK, | ||
435 | MT7530_PORT_MATRIX_MODE); | ||
436 | - mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK, | ||
437 | - VLAN_ATTR(MT7530_VLAN_TRANSPARENT)); | ||
438 | + mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK | PVC_EG_TAG_MASK, | ||
439 | + VLAN_ATTR(MT7530_VLAN_TRANSPARENT) | | ||
440 | + PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); | ||
441 | |||
442 | for (i = 0; i < MT7530_NUM_PORTS; i++) { | ||
443 | if (dsa_is_user_port(ds, i) && | ||
444 | @@ -874,8 +802,8 @@ mt7530_port_set_vlan_unaware(struct dsa_switch *ds, int port) | ||
445 | if (all_user_ports_removed) { | ||
446 | mt7530_write(priv, MT7530_PCR_P(MT7530_CPU_PORT), | ||
447 | PCR_MATRIX(dsa_user_ports(priv->ds))); | ||
448 | - mt7530_write(priv, MT7530_PVC_P(MT7530_CPU_PORT), | ||
449 | - PORT_SPEC_TAG); | ||
450 | + mt7530_write(priv, MT7530_PVC_P(MT7530_CPU_PORT), PORT_SPEC_TAG | ||
451 | + | PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); | ||
452 | } | ||
453 | } | ||
454 | |||
455 | @@ -901,8 +829,9 @@ mt7530_port_set_vlan_aware(struct dsa_switch *ds, int port) | ||
456 | /* Set the port as a user port which is to be able to recognize VID | ||
457 | * from incoming packets before fetching entry within the VLAN table. | ||
458 | */ | ||
459 | - mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK, | ||
460 | - VLAN_ATTR(MT7530_VLAN_USER)); | ||
461 | + mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK | PVC_EG_TAG_MASK, | ||
462 | + VLAN_ATTR(MT7530_VLAN_USER) | | ||
463 | + PVC_EG_TAG(MT7530_VLAN_EG_DISABLED)); | ||
464 | } | ||
465 | |||
466 | static void | ||
467 | @@ -1255,10 +1184,6 @@ mt7530_setup(struct dsa_switch *ds) | ||
468 | dn = ds->ports[MT7530_CPU_PORT].master->dev.of_node->parent; | ||
469 | |||
470 | if (priv->id == ID_MT7530) { | ||
471 | - priv->ethernet = syscon_node_to_regmap(dn); | ||
472 | - if (IS_ERR(priv->ethernet)) | ||
473 | - return PTR_ERR(priv->ethernet); | ||
474 | - | ||
475 | regulator_set_voltage(priv->core_pwr, 1000000, 1000000); | ||
476 | ret = regulator_enable(priv->core_pwr); | ||
477 | if (ret < 0) { | ||
478 | @@ -1332,6 +1257,10 @@ mt7530_setup(struct dsa_switch *ds) | ||
479 | mt7530_cpu_port_enable(priv, i); | ||
480 | else | ||
481 | mt7530_port_disable(ds, i); | ||
482 | + | ||
483 | + /* Enable consistent egress tag */ | ||
484 | + mt7530_rmw(priv, MT7530_PVC_P(i), PVC_EG_TAG_MASK, | ||
485 | + PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); | ||
486 | } | ||
487 | |||
488 | /* Setup port 5 */ | ||
489 | @@ -1416,14 +1345,6 @@ static void mt7530_phylink_mac_config(struct dsa_switch *ds, int port, | ||
490 | /* Setup TX circuit incluing relevant PAD and driving */ | ||
491 | mt7530_pad_clk_setup(ds, state->interface); | ||
492 | |||
493 | - if (priv->id == ID_MT7530) { | ||
494 | - /* Setup RX circuit, relevant PAD and driving on the | ||
495 | - * host which must be placed after the setup on the | ||
496 | - * device side is all finished. | ||
497 | - */ | ||
498 | - mt7623_pad_clk_setup(ds); | ||
499 | - } | ||
500 | - | ||
501 | priv->p6_interface = state->interface; | ||
502 | break; | ||
503 | default: | ||
504 | diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h | ||
505 | index ccb9da8cad0d..756140b7dfd5 100644 | ||
506 | --- a/drivers/net/dsa/mt7530.h | ||
507 | +++ b/drivers/net/dsa/mt7530.h | ||
508 | @@ -167,9 +167,16 @@ enum mt7530_port_mode { | ||
509 | /* Register for port vlan control */ | ||
510 | #define MT7530_PVC_P(x) (0x2010 + ((x) * 0x100)) | ||
511 | #define PORT_SPEC_TAG BIT(5) | ||
512 | +#define PVC_EG_TAG(x) (((x) & 0x7) << 8) | ||
513 | +#define PVC_EG_TAG_MASK PVC_EG_TAG(7) | ||
514 | #define VLAN_ATTR(x) (((x) & 0x3) << 6) | ||
515 | #define VLAN_ATTR_MASK VLAN_ATTR(3) | ||
516 | |||
517 | +enum mt7530_vlan_port_eg_tag { | ||
518 | + MT7530_VLAN_EG_DISABLED = 0, | ||
519 | + MT7530_VLAN_EG_CONSISTENT = 1, | ||
520 | +}; | ||
521 | + | ||
522 | enum mt7530_vlan_port_attr { | ||
523 | MT7530_VLAN_USER = 0, | ||
524 | MT7530_VLAN_TRANSPARENT = 3, | ||
525 | @@ -268,7 +275,6 @@ enum mt7530_vlan_port_attr { | ||
526 | |||
527 | /* Registers for TRGMII on the both side */ | ||
528 | #define MT7530_TRGMII_RCK_CTRL 0x7a00 | ||
529 | -#define GSW_TRGMII_RCK_CTRL 0x300 | ||
530 | #define RX_RST BIT(31) | ||
531 | #define RXC_DQSISEL BIT(30) | ||
532 | #define DQSI1_TAP_MASK (0x7f << 8) | ||
533 | @@ -277,31 +283,24 @@ enum mt7530_vlan_port_attr { | ||
534 | #define DQSI0_TAP(x) ((x) & 0x7f) | ||
535 | |||
536 | #define MT7530_TRGMII_RCK_RTT 0x7a04 | ||
537 | -#define GSW_TRGMII_RCK_RTT 0x304 | ||
538 | #define DQS1_GATE BIT(31) | ||
539 | #define DQS0_GATE BIT(30) | ||
540 | |||
541 | #define MT7530_TRGMII_RD(x) (0x7a10 + (x) * 8) | ||
542 | -#define GSW_TRGMII_RD(x) (0x310 + (x) * 8) | ||
543 | #define BSLIP_EN BIT(31) | ||
544 | #define EDGE_CHK BIT(30) | ||
545 | #define RD_TAP_MASK 0x7f | ||
546 | #define RD_TAP(x) ((x) & 0x7f) | ||
547 | |||
548 | -#define GSW_TRGMII_TXCTRL 0x340 | ||
549 | #define MT7530_TRGMII_TXCTRL 0x7a40 | ||
550 | #define TRAIN_TXEN BIT(31) | ||
551 | #define TXC_INV BIT(30) | ||
552 | #define TX_RST BIT(28) | ||
553 | |||
554 | #define MT7530_TRGMII_TD_ODT(i) (0x7a54 + 8 * (i)) | ||
555 | -#define GSW_TRGMII_TD_ODT(i) (0x354 + 8 * (i)) | ||
556 | #define TD_DM_DRVP(x) ((x) & 0xf) | ||
557 | #define TD_DM_DRVN(x) (((x) & 0xf) << 4) | ||
558 | |||
559 | -#define GSW_INTF_MODE 0x390 | ||
560 | -#define INTF_MODE_TRGMII BIT(1) | ||
561 | - | ||
562 | #define MT7530_TRGMII_TCK_CTRL 0x7a78 | ||
563 | #define TCK_TAP(x) (((x) & 0xf) << 8) | ||
564 | |||
565 | @@ -434,7 +433,6 @@ static const char *p5_intf_modes(unsigned int p5_interface) | ||
566 | * @ds: The pointer to the dsa core structure | ||
567 | * @bus: The bus used for the device and built-in PHY | ||
568 | * @rstc: The pointer to reset control used by MCM | ||
569 | - * @ethernet: The regmap used for access TRGMII-based registers | ||
570 | * @core_pwr: The power supplied into the core | ||
571 | * @io_pwr: The power supplied into the I/O | ||
572 | * @reset: The descriptor for GPIO line tied to its reset pin | ||
573 | @@ -451,7 +449,6 @@ struct mt7530_priv { | ||
574 | struct dsa_switch *ds; | ||
575 | struct mii_bus *bus; | ||
576 | struct reset_control *rstc; | ||
577 | - struct regmap *ethernet; | ||
578 | struct regulator *core_pwr; | ||
579 | struct regulator *io_pwr; | ||
580 | struct gpio_desc *reset; | ||
581 | diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c | ||
582 | index 98f8f2033154..3bd20f765120 100644 | ||
583 | --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c | ||
584 | +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c | ||
585 | @@ -514,7 +514,7 @@ static void xgbe_isr_task(unsigned long data) | ||
586 | xgbe_disable_rx_tx_ints(pdata); | ||
587 | |||
588 | /* Turn on polling */ | ||
589 | - __napi_schedule_irqoff(&pdata->napi); | ||
590 | + __napi_schedule(&pdata->napi); | ||
591 | } | ||
592 | } else { | ||
593 | /* Don't clear Rx/Tx status if doing per channel DMA | ||
594 | diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||
595 | index 703adb96429e..997dc811382a 100644 | ||
596 | --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||
597 | +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | ||
598 | @@ -65,6 +65,17 @@ u32 mtk_r32(struct mtk_eth *eth, unsigned reg) | ||
599 | return __raw_readl(eth->base + reg); | ||
600 | } | ||
601 | |||
602 | +u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned reg) | ||
603 | +{ | ||
604 | + u32 val; | ||
605 | + | ||
606 | + val = mtk_r32(eth, reg); | ||
607 | + val &= ~mask; | ||
608 | + val |= set; | ||
609 | + mtk_w32(eth, val, reg); | ||
610 | + return reg; | ||
611 | +} | ||
612 | + | ||
613 | static int mtk_mdio_busy_wait(struct mtk_eth *eth) | ||
614 | { | ||
615 | unsigned long t_start = jiffies; | ||
616 | @@ -193,7 +204,7 @@ static void mtk_mac_config(struct phylink_config *config, unsigned int mode, | ||
617 | struct mtk_mac *mac = container_of(config, struct mtk_mac, | ||
618 | phylink_config); | ||
619 | struct mtk_eth *eth = mac->hw; | ||
620 | - u32 mcr_cur, mcr_new, sid; | ||
621 | + u32 mcr_cur, mcr_new, sid, i; | ||
622 | int val, ge_mode, err; | ||
623 | |||
624 | /* MT76x8 has no hardware settings between for the MAC */ | ||
625 | @@ -255,6 +266,17 @@ static void mtk_mac_config(struct phylink_config *config, unsigned int mode, | ||
626 | PHY_INTERFACE_MODE_TRGMII) | ||
627 | mtk_gmac0_rgmii_adjust(mac->hw, | ||
628 | state->speed); | ||
629 | + | ||
630 | + /* mt7623_pad_clk_setup */ | ||
631 | + for (i = 0 ; i < NUM_TRGMII_CTRL; i++) | ||
632 | + mtk_w32(mac->hw, | ||
633 | + TD_DM_DRVP(8) | TD_DM_DRVN(8), | ||
634 | + TRGMII_TD_ODT(i)); | ||
635 | + | ||
636 | + /* Assert/release MT7623 RXC reset */ | ||
637 | + mtk_m32(mac->hw, 0, RXC_RST | RXC_DQSISEL, | ||
638 | + TRGMII_RCK_CTRL); | ||
639 | + mtk_m32(mac->hw, RXC_RST, 0, TRGMII_RCK_CTRL); | ||
640 | } | ||
641 | } | ||
642 | |||
643 | diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h | ||
644 | index 76bd12cb8150..1e787f3577aa 100644 | ||
645 | --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h | ||
646 | +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h | ||
647 | @@ -350,10 +350,13 @@ | ||
648 | #define DQSI0(x) ((x << 0) & GENMASK(6, 0)) | ||
649 | #define DQSI1(x) ((x << 8) & GENMASK(14, 8)) | ||
650 | #define RXCTL_DMWTLAT(x) ((x << 16) & GENMASK(18, 16)) | ||
651 | +#define RXC_RST BIT(31) | ||
652 | #define RXC_DQSISEL BIT(30) | ||
653 | #define RCK_CTRL_RGMII_1000 (RXC_DQSISEL | RXCTL_DMWTLAT(2) | DQSI1(16)) | ||
654 | #define RCK_CTRL_RGMII_10_100 RXCTL_DMWTLAT(2) | ||
655 | |||
656 | +#define NUM_TRGMII_CTRL 5 | ||
657 | + | ||
658 | /* TRGMII RXC control register */ | ||
659 | #define TRGMII_TCK_CTRL 0x10340 | ||
660 | #define TXCTL_DMWTLAT(x) ((x << 16) & GENMASK(18, 16)) | ||
661 | @@ -361,6 +364,11 @@ | ||
662 | #define TCK_CTRL_RGMII_1000 TXCTL_DMWTLAT(2) | ||
663 | #define TCK_CTRL_RGMII_10_100 (TXC_INV | TXCTL_DMWTLAT(2)) | ||
664 | |||
665 | +/* TRGMII TX Drive Strength */ | ||
666 | +#define TRGMII_TD_ODT(i) (0x10354 + 8 * (i)) | ||
667 | +#define TD_DM_DRVP(x) ((x) & 0xf) | ||
668 | +#define TD_DM_DRVN(x) (((x) & 0xf) << 4) | ||
669 | + | ||
670 | /* TRGMII Interface mode register */ | ||
671 | #define INTF_MODE 0x10390 | ||
672 | #define TRGMII_INTF_DIS BIT(0) | ||
673 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c | ||
674 | index 381925c90d94..d63ce3feb65c 100644 | ||
675 | --- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c | ||
676 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c | ||
677 | @@ -23,7 +23,10 @@ static int mlx5_devlink_flash_update(struct devlink *devlink, | ||
678 | if (err) | ||
679 | return err; | ||
680 | |||
681 | - return mlx5_firmware_flash(dev, fw, extack); | ||
682 | + err = mlx5_firmware_flash(dev, fw, extack); | ||
683 | + release_firmware(fw); | ||
684 | + | ||
685 | + return err; | ||
686 | } | ||
687 | |||
688 | static u8 mlx5_fw_ver_major(u32 version) | ||
689 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h | ||
690 | index 55ceabf077b2..11426f94c90c 100644 | ||
691 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h | ||
692 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h | ||
693 | @@ -1035,14 +1035,15 @@ int mlx5e_open_channels(struct mlx5e_priv *priv, | ||
694 | struct mlx5e_channels *chs); | ||
695 | void mlx5e_close_channels(struct mlx5e_channels *chs); | ||
696 | |||
697 | -/* Function pointer to be used to modify WH settings while | ||
698 | +/* Function pointer to be used to modify HW or kernel settings while | ||
699 | * switching channels | ||
700 | */ | ||
701 | -typedef int (*mlx5e_fp_hw_modify)(struct mlx5e_priv *priv); | ||
702 | +typedef int (*mlx5e_fp_preactivate)(struct mlx5e_priv *priv); | ||
703 | int mlx5e_safe_reopen_channels(struct mlx5e_priv *priv); | ||
704 | int mlx5e_safe_switch_channels(struct mlx5e_priv *priv, | ||
705 | struct mlx5e_channels *new_chs, | ||
706 | - mlx5e_fp_hw_modify hw_modify); | ||
707 | + mlx5e_fp_preactivate preactivate); | ||
708 | +int mlx5e_num_channels_changed(struct mlx5e_priv *priv); | ||
709 | void mlx5e_activate_priv_channels(struct mlx5e_priv *priv); | ||
710 | void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv); | ||
711 | |||
712 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | ||
713 | index c6776f308d5e..304ddce6b087 100644 | ||
714 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | ||
715 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | ||
716 | @@ -445,9 +445,7 @@ int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv, | ||
717 | |||
718 | if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) { | ||
719 | *cur_params = new_channels.params; | ||
720 | - if (!netif_is_rxfh_configured(priv->netdev)) | ||
721 | - mlx5e_build_default_indir_rqt(priv->rss_params.indirection_rqt, | ||
722 | - MLX5E_INDIR_RQT_SIZE, count); | ||
723 | + mlx5e_num_channels_changed(priv); | ||
724 | goto out; | ||
725 | } | ||
726 | |||
727 | @@ -455,12 +453,8 @@ int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv, | ||
728 | if (arfs_enabled) | ||
729 | mlx5e_arfs_disable(priv); | ||
730 | |||
731 | - if (!netif_is_rxfh_configured(priv->netdev)) | ||
732 | - mlx5e_build_default_indir_rqt(priv->rss_params.indirection_rqt, | ||
733 | - MLX5E_INDIR_RQT_SIZE, count); | ||
734 | - | ||
735 | /* Switch to new channels, set new parameters and close old ones */ | ||
736 | - err = mlx5e_safe_switch_channels(priv, &new_channels, NULL); | ||
737 | + err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_num_channels_changed); | ||
738 | |||
739 | if (arfs_enabled) { | ||
740 | int err2 = mlx5e_arfs_enable(priv); | ||
741 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | ||
742 | index ee7c753e9ea0..88ea279c29bb 100644 | ||
743 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | ||
744 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | ||
745 | @@ -2897,6 +2897,28 @@ static void mlx5e_netdev_set_tcs(struct net_device *netdev) | ||
746 | netdev_set_tc_queue(netdev, tc, nch, 0); | ||
747 | } | ||
748 | |||
749 | +static void mlx5e_update_netdev_queues(struct mlx5e_priv *priv) | ||
750 | +{ | ||
751 | + int num_txqs = priv->channels.num * priv->channels.params.num_tc; | ||
752 | + int num_rxqs = priv->channels.num * priv->profile->rq_groups; | ||
753 | + struct net_device *netdev = priv->netdev; | ||
754 | + | ||
755 | + mlx5e_netdev_set_tcs(netdev); | ||
756 | + netif_set_real_num_tx_queues(netdev, num_txqs); | ||
757 | + netif_set_real_num_rx_queues(netdev, num_rxqs); | ||
758 | +} | ||
759 | + | ||
760 | +int mlx5e_num_channels_changed(struct mlx5e_priv *priv) | ||
761 | +{ | ||
762 | + u16 count = priv->channels.params.num_channels; | ||
763 | + | ||
764 | + if (!netif_is_rxfh_configured(priv->netdev)) | ||
765 | + mlx5e_build_default_indir_rqt(priv->rss_params.indirection_rqt, | ||
766 | + MLX5E_INDIR_RQT_SIZE, count); | ||
767 | + | ||
768 | + return 0; | ||
769 | +} | ||
770 | + | ||
771 | static void mlx5e_build_txq_maps(struct mlx5e_priv *priv) | ||
772 | { | ||
773 | int i, ch; | ||
774 | @@ -2918,13 +2940,7 @@ static void mlx5e_build_txq_maps(struct mlx5e_priv *priv) | ||
775 | |||
776 | void mlx5e_activate_priv_channels(struct mlx5e_priv *priv) | ||
777 | { | ||
778 | - int num_txqs = priv->channels.num * priv->channels.params.num_tc; | ||
779 | - int num_rxqs = priv->channels.num * priv->profile->rq_groups; | ||
780 | - struct net_device *netdev = priv->netdev; | ||
781 | - | ||
782 | - mlx5e_netdev_set_tcs(netdev); | ||
783 | - netif_set_real_num_tx_queues(netdev, num_txqs); | ||
784 | - netif_set_real_num_rx_queues(netdev, num_rxqs); | ||
785 | + mlx5e_update_netdev_queues(priv); | ||
786 | |||
787 | mlx5e_build_txq_maps(priv); | ||
788 | mlx5e_activate_channels(&priv->channels); | ||
789 | @@ -2960,7 +2976,7 @@ void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv) | ||
790 | |||
791 | static void mlx5e_switch_priv_channels(struct mlx5e_priv *priv, | ||
792 | struct mlx5e_channels *new_chs, | ||
793 | - mlx5e_fp_hw_modify hw_modify) | ||
794 | + mlx5e_fp_preactivate preactivate) | ||
795 | { | ||
796 | struct net_device *netdev = priv->netdev; | ||
797 | int new_num_txqs; | ||
798 | @@ -2979,9 +2995,11 @@ static void mlx5e_switch_priv_channels(struct mlx5e_priv *priv, | ||
799 | |||
800 | priv->channels = *new_chs; | ||
801 | |||
802 | - /* New channels are ready to roll, modify HW settings if needed */ | ||
803 | - if (hw_modify) | ||
804 | - hw_modify(priv); | ||
805 | + /* New channels are ready to roll, call the preactivate hook if needed | ||
806 | + * to modify HW settings or update kernel parameters. | ||
807 | + */ | ||
808 | + if (preactivate) | ||
809 | + preactivate(priv); | ||
810 | |||
811 | priv->profile->update_rx(priv); | ||
812 | mlx5e_activate_priv_channels(priv); | ||
813 | @@ -2993,7 +3011,7 @@ static void mlx5e_switch_priv_channels(struct mlx5e_priv *priv, | ||
814 | |||
815 | int mlx5e_safe_switch_channels(struct mlx5e_priv *priv, | ||
816 | struct mlx5e_channels *new_chs, | ||
817 | - mlx5e_fp_hw_modify hw_modify) | ||
818 | + mlx5e_fp_preactivate preactivate) | ||
819 | { | ||
820 | int err; | ||
821 | |||
822 | @@ -3001,7 +3019,7 @@ int mlx5e_safe_switch_channels(struct mlx5e_priv *priv, | ||
823 | if (err) | ||
824 | return err; | ||
825 | |||
826 | - mlx5e_switch_priv_channels(priv, new_chs, hw_modify); | ||
827 | + mlx5e_switch_priv_channels(priv, new_chs, preactivate); | ||
828 | return 0; | ||
829 | } | ||
830 | |||
831 | @@ -5308,9 +5326,10 @@ int mlx5e_attach_netdev(struct mlx5e_priv *priv) | ||
832 | max_nch = mlx5e_get_max_num_channels(priv->mdev); | ||
833 | if (priv->channels.params.num_channels > max_nch) { | ||
834 | mlx5_core_warn(priv->mdev, "MLX5E: Reducing number of channels to %d\n", max_nch); | ||
835 | + /* Reducing the number of channels - RXFH has to be reset. */ | ||
836 | + priv->netdev->priv_flags &= ~IFF_RXFH_CONFIGURED; | ||
837 | priv->channels.params.num_channels = max_nch; | ||
838 | - mlx5e_build_default_indir_rqt(priv->rss_params.indirection_rqt, | ||
839 | - MLX5E_INDIR_RQT_SIZE, max_nch); | ||
840 | + mlx5e_num_channels_changed(priv); | ||
841 | } | ||
842 | |||
843 | err = profile->init_tx(priv); | ||
844 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | ||
845 | index cd9bb7c7b341..fddf644ba349 100644 | ||
846 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | ||
847 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | ||
848 | @@ -1814,29 +1814,30 @@ static int register_devlink_port(struct mlx5_core_dev *dev, | ||
849 | struct mlx5_eswitch_rep *rep = rpriv->rep; | ||
850 | struct netdev_phys_item_id ppid = {}; | ||
851 | unsigned int dl_port_index = 0; | ||
852 | + u16 pfnum; | ||
853 | |||
854 | if (!is_devlink_port_supported(dev, rpriv)) | ||
855 | return 0; | ||
856 | |||
857 | mlx5e_rep_get_port_parent_id(rpriv->netdev, &ppid); | ||
858 | + pfnum = PCI_FUNC(dev->pdev->devfn); | ||
859 | |||
860 | if (rep->vport == MLX5_VPORT_UPLINK) { | ||
861 | devlink_port_attrs_set(&rpriv->dl_port, | ||
862 | DEVLINK_PORT_FLAVOUR_PHYSICAL, | ||
863 | - PCI_FUNC(dev->pdev->devfn), false, 0, | ||
864 | + pfnum, false, 0, | ||
865 | &ppid.id[0], ppid.id_len); | ||
866 | dl_port_index = vport_to_devlink_port_index(dev, rep->vport); | ||
867 | } else if (rep->vport == MLX5_VPORT_PF) { | ||
868 | devlink_port_attrs_pci_pf_set(&rpriv->dl_port, | ||
869 | &ppid.id[0], ppid.id_len, | ||
870 | - dev->pdev->devfn); | ||
871 | + pfnum); | ||
872 | dl_port_index = rep->vport; | ||
873 | } else if (mlx5_eswitch_is_vf_vport(dev->priv.eswitch, | ||
874 | rpriv->rep->vport)) { | ||
875 | devlink_port_attrs_pci_vf_set(&rpriv->dl_port, | ||
876 | &ppid.id[0], ppid.id_len, | ||
877 | - dev->pdev->devfn, | ||
878 | - rep->vport - 1); | ||
879 | + pfnum, rep->vport - 1); | ||
880 | dl_port_index = vport_to_devlink_port_index(dev, rep->vport); | ||
881 | } | ||
882 | |||
883 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
884 | index 1f9107d83848..ec117e441425 100644 | ||
885 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
886 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
887 | @@ -3181,12 +3181,13 @@ static int add_vlan_pop_action(struct mlx5e_priv *priv, | ||
888 | struct mlx5_esw_flow_attr *attr, | ||
889 | u32 *action) | ||
890 | { | ||
891 | - int nest_level = attr->parse_attr->filter_dev->lower_level; | ||
892 | struct flow_action_entry vlan_act = { | ||
893 | .id = FLOW_ACTION_VLAN_POP, | ||
894 | }; | ||
895 | - int err = 0; | ||
896 | + int nest_level, err = 0; | ||
897 | |||
898 | + nest_level = attr->parse_attr->filter_dev->lower_level - | ||
899 | + priv->netdev->lower_level; | ||
900 | while (nest_level--) { | ||
901 | err = parse_tc_vlan_action(priv, &vlan_act, attr, action); | ||
902 | if (err) | ||
903 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/health.c b/drivers/net/ethernet/mellanox/mlx5/core/health.c | ||
904 | index c07f3154437c..f63beb399837 100644 | ||
905 | --- a/drivers/net/ethernet/mellanox/mlx5/core/health.c | ||
906 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/health.c | ||
907 | @@ -243,7 +243,7 @@ recover_from_sw_reset: | ||
908 | if (mlx5_get_nic_state(dev) == MLX5_NIC_IFC_DISABLED) | ||
909 | break; | ||
910 | |||
911 | - cond_resched(); | ||
912 | + msleep(20); | ||
913 | } while (!time_after(jiffies, end)); | ||
914 | |||
915 | if (mlx5_get_nic_state(dev) != MLX5_NIC_IFC_DISABLED) { | ||
916 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | ||
917 | index 102d637bc84a..65a3e3b5face 100644 | ||
918 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | ||
919 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c | ||
920 | @@ -146,6 +146,8 @@ static int sun7i_gmac_probe(struct platform_device *pdev) | ||
921 | plat_dat->init = sun7i_gmac_init; | ||
922 | plat_dat->exit = sun7i_gmac_exit; | ||
923 | plat_dat->fix_mac_speed = sun7i_fix_speed; | ||
924 | + plat_dat->tx_fifo_size = 4096; | ||
925 | + plat_dat->rx_fifo_size = 16384; | ||
926 | |||
927 | ret = sun7i_gmac_init(pdev, plat_dat->bsp_priv); | ||
928 | if (ret) | ||
929 | diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c | ||
930 | index 51b64f087717..663c68ed6ef9 100644 | ||
931 | --- a/drivers/net/phy/micrel.c | ||
932 | +++ b/drivers/net/phy/micrel.c | ||
933 | @@ -1154,7 +1154,7 @@ static struct phy_driver ksphy_driver[] = { | ||
934 | .driver_data = &ksz9021_type, | ||
935 | .probe = kszphy_probe, | ||
936 | .config_init = ksz9131_config_init, | ||
937 | - .read_status = ksz9031_read_status, | ||
938 | + .read_status = genphy_read_status, | ||
939 | .ack_interrupt = kszphy_ack_interrupt, | ||
940 | .config_intr = kszphy_config_intr, | ||
941 | .get_sset_count = kszphy_get_sset_count, | ||
942 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c | ||
943 | index 16f5cb249ed5..6e9a59e3d822 100644 | ||
944 | --- a/drivers/net/tun.c | ||
945 | +++ b/drivers/net/tun.c | ||
946 | @@ -1925,6 +1925,7 @@ drop: | ||
947 | |||
948 | skb_reset_network_header(skb); | ||
949 | skb_probe_transport_header(skb); | ||
950 | + skb_record_rx_queue(skb, tfile->queue_index); | ||
951 | |||
952 | if (skb_xdp) { | ||
953 | struct bpf_prog *xdp_prog; | ||
954 | @@ -2492,6 +2493,7 @@ build: | ||
955 | skb->protocol = eth_type_trans(skb, tun->dev); | ||
956 | skb_reset_network_header(skb); | ||
957 | skb_probe_transport_header(skb); | ||
958 | + skb_record_rx_queue(skb, tfile->queue_index); | ||
959 | |||
960 | if (skb_xdp) { | ||
961 | err = do_xdp_generic(xdp_prog, skb); | ||
962 | @@ -2503,7 +2505,6 @@ build: | ||
963 | !tfile->detached) | ||
964 | rxhash = __skb_get_hash_symmetric(skb); | ||
965 | |||
966 | - skb_record_rx_queue(skb, tfile->queue_index); | ||
967 | netif_receive_skb(skb); | ||
968 | |||
969 | /* No need for get_cpu_ptr() here since this function is | ||
970 | diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c | ||
971 | index 14f562cd715c..c48c68090d76 100644 | ||
972 | --- a/drivers/net/wireless/mac80211_hwsim.c | ||
973 | +++ b/drivers/net/wireless/mac80211_hwsim.c | ||
974 | @@ -3575,9 +3575,9 @@ static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info) | ||
975 | } | ||
976 | |||
977 | if (info->attrs[HWSIM_ATTR_RADIO_NAME]) { | ||
978 | - hwname = kasprintf(GFP_KERNEL, "%.*s", | ||
979 | - nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]), | ||
980 | - (char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME])); | ||
981 | + hwname = kstrndup((char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]), | ||
982 | + nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]), | ||
983 | + GFP_KERNEL); | ||
984 | if (!hwname) | ||
985 | return -ENOMEM; | ||
986 | param.hwname = hwname; | ||
987 | @@ -3597,9 +3597,9 @@ static int hwsim_del_radio_nl(struct sk_buff *msg, struct genl_info *info) | ||
988 | if (info->attrs[HWSIM_ATTR_RADIO_ID]) { | ||
989 | idx = nla_get_u32(info->attrs[HWSIM_ATTR_RADIO_ID]); | ||
990 | } else if (info->attrs[HWSIM_ATTR_RADIO_NAME]) { | ||
991 | - hwname = kasprintf(GFP_KERNEL, "%.*s", | ||
992 | - nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]), | ||
993 | - (char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME])); | ||
994 | + hwname = kstrndup((char *)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]), | ||
995 | + nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]), | ||
996 | + GFP_KERNEL); | ||
997 | if (!hwname) | ||
998 | return -ENOMEM; | ||
999 | } else | ||
1000 | diff --git a/drivers/platform/chrome/cros_ec_rpmsg.c b/drivers/platform/chrome/cros_ec_rpmsg.c | ||
1001 | index 0c3738c3244d..aa2059b33ba5 100644 | ||
1002 | --- a/drivers/platform/chrome/cros_ec_rpmsg.c | ||
1003 | +++ b/drivers/platform/chrome/cros_ec_rpmsg.c | ||
1004 | @@ -42,6 +42,8 @@ struct cros_ec_rpmsg { | ||
1005 | struct completion xfer_ack; | ||
1006 | struct work_struct host_event_work; | ||
1007 | struct rpmsg_endpoint *ept; | ||
1008 | + bool has_pending_host_event; | ||
1009 | + bool probe_done; | ||
1010 | }; | ||
1011 | |||
1012 | /** | ||
1013 | @@ -186,7 +188,14 @@ static int cros_ec_rpmsg_callback(struct rpmsg_device *rpdev, void *data, | ||
1014 | memcpy(ec_dev->din, resp->data, len); | ||
1015 | complete(&ec_rpmsg->xfer_ack); | ||
1016 | } else if (resp->type == HOST_EVENT_MARK) { | ||
1017 | - schedule_work(&ec_rpmsg->host_event_work); | ||
1018 | + /* | ||
1019 | + * If the host event is sent before cros_ec_register is | ||
1020 | + * finished, queue the host event. | ||
1021 | + */ | ||
1022 | + if (ec_rpmsg->probe_done) | ||
1023 | + schedule_work(&ec_rpmsg->host_event_work); | ||
1024 | + else | ||
1025 | + ec_rpmsg->has_pending_host_event = true; | ||
1026 | } else { | ||
1027 | dev_warn(ec_dev->dev, "rpmsg received invalid type = %d", | ||
1028 | resp->type); | ||
1029 | @@ -249,6 +258,11 @@ static int cros_ec_rpmsg_probe(struct rpmsg_device *rpdev) | ||
1030 | return ret; | ||
1031 | } | ||
1032 | |||
1033 | + ec_rpmsg->probe_done = true; | ||
1034 | + | ||
1035 | + if (ec_rpmsg->has_pending_host_event) | ||
1036 | + schedule_work(&ec_rpmsg->host_event_work); | ||
1037 | + | ||
1038 | return 0; | ||
1039 | } | ||
1040 | |||
1041 | diff --git a/drivers/pwm/pwm-pca9685.c b/drivers/pwm/pwm-pca9685.c | ||
1042 | index b07bdca3d510..590375be5214 100644 | ||
1043 | --- a/drivers/pwm/pwm-pca9685.c | ||
1044 | +++ b/drivers/pwm/pwm-pca9685.c | ||
1045 | @@ -20,6 +20,7 @@ | ||
1046 | #include <linux/slab.h> | ||
1047 | #include <linux/delay.h> | ||
1048 | #include <linux/pm_runtime.h> | ||
1049 | +#include <linux/bitmap.h> | ||
1050 | |||
1051 | /* | ||
1052 | * Because the PCA9685 has only one prescaler per chip, changing the period of | ||
1053 | @@ -74,6 +75,7 @@ struct pca9685 { | ||
1054 | #if IS_ENABLED(CONFIG_GPIOLIB) | ||
1055 | struct mutex lock; | ||
1056 | struct gpio_chip gpio; | ||
1057 | + DECLARE_BITMAP(pwms_inuse, PCA9685_MAXCHAN + 1); | ||
1058 | #endif | ||
1059 | }; | ||
1060 | |||
1061 | @@ -83,51 +85,51 @@ static inline struct pca9685 *to_pca(struct pwm_chip *chip) | ||
1062 | } | ||
1063 | |||
1064 | #if IS_ENABLED(CONFIG_GPIOLIB) | ||
1065 | -static int pca9685_pwm_gpio_request(struct gpio_chip *gpio, unsigned int offset) | ||
1066 | +static bool pca9685_pwm_test_and_set_inuse(struct pca9685 *pca, int pwm_idx) | ||
1067 | { | ||
1068 | - struct pca9685 *pca = gpiochip_get_data(gpio); | ||
1069 | - struct pwm_device *pwm; | ||
1070 | + bool is_inuse; | ||
1071 | |||
1072 | mutex_lock(&pca->lock); | ||
1073 | - | ||
1074 | - pwm = &pca->chip.pwms[offset]; | ||
1075 | - | ||
1076 | - if (pwm->flags & (PWMF_REQUESTED | PWMF_EXPORTED)) { | ||
1077 | - mutex_unlock(&pca->lock); | ||
1078 | - return -EBUSY; | ||
1079 | + if (pwm_idx >= PCA9685_MAXCHAN) { | ||
1080 | + /* | ||
1081 | + * "all LEDs" channel: | ||
1082 | + * pretend already in use if any of the PWMs are requested | ||
1083 | + */ | ||
1084 | + if (!bitmap_empty(pca->pwms_inuse, PCA9685_MAXCHAN)) { | ||
1085 | + is_inuse = true; | ||
1086 | + goto out; | ||
1087 | + } | ||
1088 | + } else { | ||
1089 | + /* | ||
1090 | + * regular channel: | ||
1091 | + * pretend already in use if the "all LEDs" channel is requested | ||
1092 | + */ | ||
1093 | + if (test_bit(PCA9685_MAXCHAN, pca->pwms_inuse)) { | ||
1094 | + is_inuse = true; | ||
1095 | + goto out; | ||
1096 | + } | ||
1097 | } | ||
1098 | - | ||
1099 | - pwm_set_chip_data(pwm, (void *)1); | ||
1100 | - | ||
1101 | + is_inuse = test_and_set_bit(pwm_idx, pca->pwms_inuse); | ||
1102 | +out: | ||
1103 | mutex_unlock(&pca->lock); | ||
1104 | - pm_runtime_get_sync(pca->chip.dev); | ||
1105 | - return 0; | ||
1106 | + return is_inuse; | ||
1107 | } | ||
1108 | |||
1109 | -static bool pca9685_pwm_is_gpio(struct pca9685 *pca, struct pwm_device *pwm) | ||
1110 | +static void pca9685_pwm_clear_inuse(struct pca9685 *pca, int pwm_idx) | ||
1111 | { | ||
1112 | - bool is_gpio = false; | ||
1113 | - | ||
1114 | mutex_lock(&pca->lock); | ||
1115 | + clear_bit(pwm_idx, pca->pwms_inuse); | ||
1116 | + mutex_unlock(&pca->lock); | ||
1117 | +} | ||
1118 | |||
1119 | - if (pwm->hwpwm >= PCA9685_MAXCHAN) { | ||
1120 | - unsigned int i; | ||
1121 | - | ||
1122 | - /* | ||
1123 | - * Check if any of the GPIOs are requested and in that case | ||
1124 | - * prevent using the "all LEDs" channel. | ||
1125 | - */ | ||
1126 | - for (i = 0; i < pca->gpio.ngpio; i++) | ||
1127 | - if (gpiochip_is_requested(&pca->gpio, i)) { | ||
1128 | - is_gpio = true; | ||
1129 | - break; | ||
1130 | - } | ||
1131 | - } else if (pwm_get_chip_data(pwm)) { | ||
1132 | - is_gpio = true; | ||
1133 | - } | ||
1134 | +static int pca9685_pwm_gpio_request(struct gpio_chip *gpio, unsigned int offset) | ||
1135 | +{ | ||
1136 | + struct pca9685 *pca = gpiochip_get_data(gpio); | ||
1137 | |||
1138 | - mutex_unlock(&pca->lock); | ||
1139 | - return is_gpio; | ||
1140 | + if (pca9685_pwm_test_and_set_inuse(pca, offset)) | ||
1141 | + return -EBUSY; | ||
1142 | + pm_runtime_get_sync(pca->chip.dev); | ||
1143 | + return 0; | ||
1144 | } | ||
1145 | |||
1146 | static int pca9685_pwm_gpio_get(struct gpio_chip *gpio, unsigned int offset) | ||
1147 | @@ -162,6 +164,7 @@ static void pca9685_pwm_gpio_free(struct gpio_chip *gpio, unsigned int offset) | ||
1148 | |||
1149 | pca9685_pwm_gpio_set(gpio, offset, 0); | ||
1150 | pm_runtime_put(pca->chip.dev); | ||
1151 | + pca9685_pwm_clear_inuse(pca, offset); | ||
1152 | } | ||
1153 | |||
1154 | static int pca9685_pwm_gpio_get_direction(struct gpio_chip *chip, | ||
1155 | @@ -213,12 +216,17 @@ static int pca9685_pwm_gpio_probe(struct pca9685 *pca) | ||
1156 | return devm_gpiochip_add_data(dev, &pca->gpio, pca); | ||
1157 | } | ||
1158 | #else | ||
1159 | -static inline bool pca9685_pwm_is_gpio(struct pca9685 *pca, | ||
1160 | - struct pwm_device *pwm) | ||
1161 | +static inline bool pca9685_pwm_test_and_set_inuse(struct pca9685 *pca, | ||
1162 | + int pwm_idx) | ||
1163 | { | ||
1164 | return false; | ||
1165 | } | ||
1166 | |||
1167 | +static inline void | ||
1168 | +pca9685_pwm_clear_inuse(struct pca9685 *pca, int pwm_idx) | ||
1169 | +{ | ||
1170 | +} | ||
1171 | + | ||
1172 | static inline int pca9685_pwm_gpio_probe(struct pca9685 *pca) | ||
1173 | { | ||
1174 | return 0; | ||
1175 | @@ -402,7 +410,7 @@ static int pca9685_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) | ||
1176 | { | ||
1177 | struct pca9685 *pca = to_pca(chip); | ||
1178 | |||
1179 | - if (pca9685_pwm_is_gpio(pca, pwm)) | ||
1180 | + if (pca9685_pwm_test_and_set_inuse(pca, pwm->hwpwm)) | ||
1181 | return -EBUSY; | ||
1182 | pm_runtime_get_sync(chip->dev); | ||
1183 | |||
1184 | @@ -411,8 +419,11 @@ static int pca9685_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) | ||
1185 | |||
1186 | static void pca9685_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) | ||
1187 | { | ||
1188 | + struct pca9685 *pca = to_pca(chip); | ||
1189 | + | ||
1190 | pca9685_pwm_disable(chip, pwm); | ||
1191 | pm_runtime_put(chip->dev); | ||
1192 | + pca9685_pwm_clear_inuse(pca, pwm->hwpwm); | ||
1193 | } | ||
1194 | |||
1195 | static const struct pwm_ops pca9685_pwm_ops = { | ||
1196 | diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c | ||
1197 | index a6863b51a1d0..13ab1494c384 100644 | ||
1198 | --- a/drivers/scsi/ufs/ufshcd.c | ||
1199 | +++ b/drivers/scsi/ufs/ufshcd.c | ||
1200 | @@ -1539,6 +1539,11 @@ start: | ||
1201 | */ | ||
1202 | if (ufshcd_can_hibern8_during_gating(hba) && | ||
1203 | ufshcd_is_link_hibern8(hba)) { | ||
1204 | + if (async) { | ||
1205 | + rc = -EAGAIN; | ||
1206 | + hba->clk_gating.active_reqs--; | ||
1207 | + break; | ||
1208 | + } | ||
1209 | spin_unlock_irqrestore(hba->host->host_lock, flags); | ||
1210 | flush_work(&hba->clk_gating.ungate_work); | ||
1211 | spin_lock_irqsave(hba->host->host_lock, flags); | ||
1212 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
1213 | index d19e051f2bc2..d1ce94c608a9 100644 | ||
1214 | --- a/drivers/target/iscsi/iscsi_target.c | ||
1215 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
1216 | @@ -4303,30 +4303,37 @@ int iscsit_close_connection( | ||
1217 | if (!atomic_read(&sess->session_reinstatement) && | ||
1218 | atomic_read(&sess->session_fall_back_to_erl0)) { | ||
1219 | spin_unlock_bh(&sess->conn_lock); | ||
1220 | + complete_all(&sess->session_wait_comp); | ||
1221 | iscsit_close_session(sess); | ||
1222 | |||
1223 | return 0; | ||
1224 | } else if (atomic_read(&sess->session_logout)) { | ||
1225 | pr_debug("Moving to TARG_SESS_STATE_FREE.\n"); | ||
1226 | sess->session_state = TARG_SESS_STATE_FREE; | ||
1227 | - spin_unlock_bh(&sess->conn_lock); | ||
1228 | |||
1229 | - if (atomic_read(&sess->sleep_on_sess_wait_comp)) | ||
1230 | - complete(&sess->session_wait_comp); | ||
1231 | + if (atomic_read(&sess->session_close)) { | ||
1232 | + spin_unlock_bh(&sess->conn_lock); | ||
1233 | + complete_all(&sess->session_wait_comp); | ||
1234 | + iscsit_close_session(sess); | ||
1235 | + } else { | ||
1236 | + spin_unlock_bh(&sess->conn_lock); | ||
1237 | + } | ||
1238 | |||
1239 | return 0; | ||
1240 | } else { | ||
1241 | pr_debug("Moving to TARG_SESS_STATE_FAILED.\n"); | ||
1242 | sess->session_state = TARG_SESS_STATE_FAILED; | ||
1243 | |||
1244 | - if (!atomic_read(&sess->session_continuation)) { | ||
1245 | - spin_unlock_bh(&sess->conn_lock); | ||
1246 | + if (!atomic_read(&sess->session_continuation)) | ||
1247 | iscsit_start_time2retain_handler(sess); | ||
1248 | - } else | ||
1249 | - spin_unlock_bh(&sess->conn_lock); | ||
1250 | |||
1251 | - if (atomic_read(&sess->sleep_on_sess_wait_comp)) | ||
1252 | - complete(&sess->session_wait_comp); | ||
1253 | + if (atomic_read(&sess->session_close)) { | ||
1254 | + spin_unlock_bh(&sess->conn_lock); | ||
1255 | + complete_all(&sess->session_wait_comp); | ||
1256 | + iscsit_close_session(sess); | ||
1257 | + } else { | ||
1258 | + spin_unlock_bh(&sess->conn_lock); | ||
1259 | + } | ||
1260 | |||
1261 | return 0; | ||
1262 | } | ||
1263 | @@ -4432,9 +4439,9 @@ static void iscsit_logout_post_handler_closesession( | ||
1264 | complete(&conn->conn_logout_comp); | ||
1265 | |||
1266 | iscsit_dec_conn_usage_count(conn); | ||
1267 | + atomic_set(&sess->session_close, 1); | ||
1268 | iscsit_stop_session(sess, sleep, sleep); | ||
1269 | iscsit_dec_session_usage_count(sess); | ||
1270 | - iscsit_close_session(sess); | ||
1271 | } | ||
1272 | |||
1273 | static void iscsit_logout_post_handler_samecid( | ||
1274 | @@ -4569,49 +4576,6 @@ void iscsit_fail_session(struct iscsi_session *sess) | ||
1275 | sess->session_state = TARG_SESS_STATE_FAILED; | ||
1276 | } | ||
1277 | |||
1278 | -int iscsit_free_session(struct iscsi_session *sess) | ||
1279 | -{ | ||
1280 | - u16 conn_count = atomic_read(&sess->nconn); | ||
1281 | - struct iscsi_conn *conn, *conn_tmp = NULL; | ||
1282 | - int is_last; | ||
1283 | - | ||
1284 | - spin_lock_bh(&sess->conn_lock); | ||
1285 | - atomic_set(&sess->sleep_on_sess_wait_comp, 1); | ||
1286 | - | ||
1287 | - list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list, | ||
1288 | - conn_list) { | ||
1289 | - if (conn_count == 0) | ||
1290 | - break; | ||
1291 | - | ||
1292 | - if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) { | ||
1293 | - is_last = 1; | ||
1294 | - } else { | ||
1295 | - iscsit_inc_conn_usage_count(conn_tmp); | ||
1296 | - is_last = 0; | ||
1297 | - } | ||
1298 | - iscsit_inc_conn_usage_count(conn); | ||
1299 | - | ||
1300 | - spin_unlock_bh(&sess->conn_lock); | ||
1301 | - iscsit_cause_connection_reinstatement(conn, 1); | ||
1302 | - spin_lock_bh(&sess->conn_lock); | ||
1303 | - | ||
1304 | - iscsit_dec_conn_usage_count(conn); | ||
1305 | - if (is_last == 0) | ||
1306 | - iscsit_dec_conn_usage_count(conn_tmp); | ||
1307 | - | ||
1308 | - conn_count--; | ||
1309 | - } | ||
1310 | - | ||
1311 | - if (atomic_read(&sess->nconn)) { | ||
1312 | - spin_unlock_bh(&sess->conn_lock); | ||
1313 | - wait_for_completion(&sess->session_wait_comp); | ||
1314 | - } else | ||
1315 | - spin_unlock_bh(&sess->conn_lock); | ||
1316 | - | ||
1317 | - iscsit_close_session(sess); | ||
1318 | - return 0; | ||
1319 | -} | ||
1320 | - | ||
1321 | void iscsit_stop_session( | ||
1322 | struct iscsi_session *sess, | ||
1323 | int session_sleep, | ||
1324 | @@ -4622,8 +4586,6 @@ void iscsit_stop_session( | ||
1325 | int is_last; | ||
1326 | |||
1327 | spin_lock_bh(&sess->conn_lock); | ||
1328 | - if (session_sleep) | ||
1329 | - atomic_set(&sess->sleep_on_sess_wait_comp, 1); | ||
1330 | |||
1331 | if (connection_sleep) { | ||
1332 | list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list, | ||
1333 | @@ -4681,12 +4643,15 @@ int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *tpg, int force) | ||
1334 | spin_lock(&sess->conn_lock); | ||
1335 | if (atomic_read(&sess->session_fall_back_to_erl0) || | ||
1336 | atomic_read(&sess->session_logout) || | ||
1337 | + atomic_read(&sess->session_close) || | ||
1338 | (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) { | ||
1339 | spin_unlock(&sess->conn_lock); | ||
1340 | continue; | ||
1341 | } | ||
1342 | + iscsit_inc_session_usage_count(sess); | ||
1343 | atomic_set(&sess->session_reinstatement, 1); | ||
1344 | atomic_set(&sess->session_fall_back_to_erl0, 1); | ||
1345 | + atomic_set(&sess->session_close, 1); | ||
1346 | spin_unlock(&sess->conn_lock); | ||
1347 | |||
1348 | list_move_tail(&se_sess->sess_list, &free_list); | ||
1349 | @@ -4696,7 +4661,9 @@ int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *tpg, int force) | ||
1350 | list_for_each_entry_safe(se_sess, se_sess_tmp, &free_list, sess_list) { | ||
1351 | sess = (struct iscsi_session *)se_sess->fabric_sess_ptr; | ||
1352 | |||
1353 | - iscsit_free_session(sess); | ||
1354 | + list_del_init(&se_sess->sess_list); | ||
1355 | + iscsit_stop_session(sess, 1, 1); | ||
1356 | + iscsit_dec_session_usage_count(sess); | ||
1357 | session_count++; | ||
1358 | } | ||
1359 | |||
1360 | diff --git a/drivers/target/iscsi/iscsi_target.h b/drivers/target/iscsi/iscsi_target.h | ||
1361 | index c95f56a3ce31..7409ce2a6607 100644 | ||
1362 | --- a/drivers/target/iscsi/iscsi_target.h | ||
1363 | +++ b/drivers/target/iscsi/iscsi_target.h | ||
1364 | @@ -43,7 +43,6 @@ extern int iscsi_target_rx_thread(void *); | ||
1365 | extern int iscsit_close_connection(struct iscsi_conn *); | ||
1366 | extern int iscsit_close_session(struct iscsi_session *); | ||
1367 | extern void iscsit_fail_session(struct iscsi_session *); | ||
1368 | -extern int iscsit_free_session(struct iscsi_session *); | ||
1369 | extern void iscsit_stop_session(struct iscsi_session *, int, int); | ||
1370 | extern int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *, int); | ||
1371 | |||
1372 | diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c | ||
1373 | index 42b369fc415e..0fa1d57b26fa 100644 | ||
1374 | --- a/drivers/target/iscsi/iscsi_target_configfs.c | ||
1375 | +++ b/drivers/target/iscsi/iscsi_target_configfs.c | ||
1376 | @@ -1476,20 +1476,23 @@ static void lio_tpg_close_session(struct se_session *se_sess) | ||
1377 | spin_lock(&sess->conn_lock); | ||
1378 | if (atomic_read(&sess->session_fall_back_to_erl0) || | ||
1379 | atomic_read(&sess->session_logout) || | ||
1380 | + atomic_read(&sess->session_close) || | ||
1381 | (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) { | ||
1382 | spin_unlock(&sess->conn_lock); | ||
1383 | spin_unlock_bh(&se_tpg->session_lock); | ||
1384 | return; | ||
1385 | } | ||
1386 | + iscsit_inc_session_usage_count(sess); | ||
1387 | atomic_set(&sess->session_reinstatement, 1); | ||
1388 | atomic_set(&sess->session_fall_back_to_erl0, 1); | ||
1389 | + atomic_set(&sess->session_close, 1); | ||
1390 | spin_unlock(&sess->conn_lock); | ||
1391 | |||
1392 | iscsit_stop_time2retain_timer(sess); | ||
1393 | spin_unlock_bh(&se_tpg->session_lock); | ||
1394 | |||
1395 | iscsit_stop_session(sess, 1, 1); | ||
1396 | - iscsit_close_session(sess); | ||
1397 | + iscsit_dec_session_usage_count(sess); | ||
1398 | } | ||
1399 | |||
1400 | static u32 lio_tpg_get_inst_index(struct se_portal_group *se_tpg) | ||
1401 | diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c | ||
1402 | index f53330813207..731ee67fe914 100644 | ||
1403 | --- a/drivers/target/iscsi/iscsi_target_login.c | ||
1404 | +++ b/drivers/target/iscsi/iscsi_target_login.c | ||
1405 | @@ -156,6 +156,7 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn) | ||
1406 | spin_lock(&sess_p->conn_lock); | ||
1407 | if (atomic_read(&sess_p->session_fall_back_to_erl0) || | ||
1408 | atomic_read(&sess_p->session_logout) || | ||
1409 | + atomic_read(&sess_p->session_close) || | ||
1410 | (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED)) { | ||
1411 | spin_unlock(&sess_p->conn_lock); | ||
1412 | continue; | ||
1413 | @@ -166,6 +167,7 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn) | ||
1414 | (sess_p->sess_ops->SessionType == sessiontype))) { | ||
1415 | atomic_set(&sess_p->session_reinstatement, 1); | ||
1416 | atomic_set(&sess_p->session_fall_back_to_erl0, 1); | ||
1417 | + atomic_set(&sess_p->session_close, 1); | ||
1418 | spin_unlock(&sess_p->conn_lock); | ||
1419 | iscsit_inc_session_usage_count(sess_p); | ||
1420 | iscsit_stop_time2retain_timer(sess_p); | ||
1421 | @@ -190,7 +192,6 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn) | ||
1422 | if (sess->session_state == TARG_SESS_STATE_FAILED) { | ||
1423 | spin_unlock_bh(&sess->conn_lock); | ||
1424 | iscsit_dec_session_usage_count(sess); | ||
1425 | - iscsit_close_session(sess); | ||
1426 | return 0; | ||
1427 | } | ||
1428 | spin_unlock_bh(&sess->conn_lock); | ||
1429 | @@ -198,7 +199,6 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn) | ||
1430 | iscsit_stop_session(sess, 1, 1); | ||
1431 | iscsit_dec_session_usage_count(sess); | ||
1432 | |||
1433 | - iscsit_close_session(sess); | ||
1434 | return 0; | ||
1435 | } | ||
1436 | |||
1437 | @@ -486,6 +486,7 @@ static int iscsi_login_non_zero_tsih_s2( | ||
1438 | sess_p = (struct iscsi_session *)se_sess->fabric_sess_ptr; | ||
1439 | if (atomic_read(&sess_p->session_fall_back_to_erl0) || | ||
1440 | atomic_read(&sess_p->session_logout) || | ||
1441 | + atomic_read(&sess_p->session_close) || | ||
1442 | (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED)) | ||
1443 | continue; | ||
1444 | if (!memcmp(sess_p->isid, pdu->isid, 6) && | ||
1445 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c | ||
1446 | index 09d6b11246c9..384f26322609 100644 | ||
1447 | --- a/drivers/usb/dwc3/gadget.c | ||
1448 | +++ b/drivers/usb/dwc3/gadget.c | ||
1449 | @@ -2567,10 +2567,8 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep, | ||
1450 | |||
1451 | dwc3_gadget_ep_cleanup_completed_requests(dep, event, status); | ||
1452 | |||
1453 | - if (stop) { | ||
1454 | + if (stop) | ||
1455 | dwc3_stop_active_transfer(dep, true, true); | ||
1456 | - dep->flags = DWC3_EP_ENABLED; | ||
1457 | - } | ||
1458 | |||
1459 | /* | ||
1460 | * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround. | ||
1461 | diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c | ||
1462 | index 04bdbbb746a4..32a09ed540a2 100644 | ||
1463 | --- a/fs/btrfs/relocation.c | ||
1464 | +++ b/fs/btrfs/relocation.c | ||
1465 | @@ -561,8 +561,8 @@ static int should_ignore_root(struct btrfs_root *root) | ||
1466 | if (!reloc_root) | ||
1467 | return 0; | ||
1468 | |||
1469 | - if (btrfs_root_last_snapshot(&reloc_root->root_item) == | ||
1470 | - root->fs_info->running_transaction->transid - 1) | ||
1471 | + if (btrfs_header_generation(reloc_root->commit_root) == | ||
1472 | + root->fs_info->running_transaction->transid) | ||
1473 | return 0; | ||
1474 | /* | ||
1475 | * if there is reloc tree and it was created in previous | ||
1476 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
1477 | index fb0f99dc8c22..164dbfd40c52 100644 | ||
1478 | --- a/fs/ext4/extents.c | ||
1479 | +++ b/fs/ext4/extents.c | ||
1480 | @@ -3549,8 +3549,8 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | ||
1481 | (unsigned long long)map->m_lblk, map_len); | ||
1482 | |||
1483 | sbi = EXT4_SB(inode->i_sb); | ||
1484 | - eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >> | ||
1485 | - inode->i_sb->s_blocksize_bits; | ||
1486 | + eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1) | ||
1487 | + >> inode->i_sb->s_blocksize_bits; | ||
1488 | if (eof_block < map->m_lblk + map_len) | ||
1489 | eof_block = map->m_lblk + map_len; | ||
1490 | |||
1491 | @@ -3805,8 +3805,8 @@ static int ext4_split_convert_extents(handle_t *handle, | ||
1492 | __func__, inode->i_ino, | ||
1493 | (unsigned long long)map->m_lblk, map->m_len); | ||
1494 | |||
1495 | - eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >> | ||
1496 | - inode->i_sb->s_blocksize_bits; | ||
1497 | + eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1) | ||
1498 | + >> inode->i_sb->s_blocksize_bits; | ||
1499 | if (eof_block < map->m_lblk + map->m_len) | ||
1500 | eof_block = map->m_lblk + map->m_len; | ||
1501 | /* | ||
1502 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
1503 | index 8bd806a03a90..a1eca6d30643 100644 | ||
1504 | --- a/fs/ext4/super.c | ||
1505 | +++ b/fs/ext4/super.c | ||
1506 | @@ -4109,7 +4109,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
1507 | if (sbi->s_inodes_per_group < sbi->s_inodes_per_block || | ||
1508 | sbi->s_inodes_per_group > blocksize * 8) { | ||
1509 | ext4_msg(sb, KERN_ERR, "invalid inodes per group: %lu\n", | ||
1510 | - sbi->s_blocks_per_group); | ||
1511 | + sbi->s_inodes_per_group); | ||
1512 | goto failed_mount; | ||
1513 | } | ||
1514 | sbi->s_itb_per_group = sbi->s_inodes_per_group / | ||
1515 | @@ -4238,9 +4238,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
1516 | EXT4_BLOCKS_PER_GROUP(sb) - 1); | ||
1517 | do_div(blocks_count, EXT4_BLOCKS_PER_GROUP(sb)); | ||
1518 | if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) { | ||
1519 | - ext4_msg(sb, KERN_WARNING, "groups count too large: %u " | ||
1520 | + ext4_msg(sb, KERN_WARNING, "groups count too large: %llu " | ||
1521 | "(block count %llu, first data block %u, " | ||
1522 | - "blocks per group %lu)", sbi->s_groups_count, | ||
1523 | + "blocks per group %lu)", blocks_count, | ||
1524 | ext4_blocks_count(es), | ||
1525 | le32_to_cpu(es->s_first_data_block), | ||
1526 | EXT4_BLOCKS_PER_GROUP(sb)); | ||
1527 | diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c | ||
1528 | index 754ec3c47d6f..88146008b3e3 100644 | ||
1529 | --- a/fs/jbd2/commit.c | ||
1530 | +++ b/fs/jbd2/commit.c | ||
1531 | @@ -995,9 +995,10 @@ restart_loop: | ||
1532 | * journalled data) we need to unmap buffer and clear | ||
1533 | * more bits. We also need to be careful about the check | ||
1534 | * because the data page mapping can get cleared under | ||
1535 | - * out hands, which alse need not to clear more bits | ||
1536 | - * because the page and buffers will be freed and can | ||
1537 | - * never be reused once we are done with them. | ||
1538 | + * our hands. Note that if mapping == NULL, we don't | ||
1539 | + * need to make buffer unmapped because the page is | ||
1540 | + * already detached from the mapping and buffers cannot | ||
1541 | + * get reused. | ||
1542 | */ | ||
1543 | mapping = READ_ONCE(bh->b_page->mapping); | ||
1544 | if (mapping && !sb_is_blkdev_sb(mapping->host->i_sb)) { | ||
1545 | diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c | ||
1546 | index b045cf1826fc..bb980721502d 100644 | ||
1547 | --- a/fs/overlayfs/inode.c | ||
1548 | +++ b/fs/overlayfs/inode.c | ||
1549 | @@ -881,7 +881,7 @@ struct inode *ovl_get_inode(struct super_block *sb, | ||
1550 | struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL; | ||
1551 | bool bylower = ovl_hash_bylower(sb, upperdentry, lowerdentry, | ||
1552 | oip->index); | ||
1553 | - int fsid = bylower ? oip->lowerpath->layer->fsid : 0; | ||
1554 | + int fsid = bylower ? lowerpath->layer->fsid : 0; | ||
1555 | bool is_dir, metacopy = false; | ||
1556 | unsigned long ino = 0; | ||
1557 | int err = oip->newinode ? -EEXIST : -ENOMEM; | ||
1558 | @@ -931,6 +931,8 @@ struct inode *ovl_get_inode(struct super_block *sb, | ||
1559 | err = -ENOMEM; | ||
1560 | goto out_err; | ||
1561 | } | ||
1562 | + ino = realinode->i_ino; | ||
1563 | + fsid = lowerpath->layer->fsid; | ||
1564 | } | ||
1565 | ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev, ino, fsid); | ||
1566 | ovl_inode_init(inode, upperdentry, lowerdentry, oip->lowerdata); | ||
1567 | diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h | ||
1568 | index b69c16cbbf71..2d0d91070268 100644 | ||
1569 | --- a/include/net/ip6_route.h | ||
1570 | +++ b/include/net/ip6_route.h | ||
1571 | @@ -254,6 +254,7 @@ static inline bool ipv6_anycast_destination(const struct dst_entry *dst, | ||
1572 | |||
1573 | return rt->rt6i_flags & RTF_ANYCAST || | ||
1574 | (rt->rt6i_dst.plen < 127 && | ||
1575 | + !(rt->rt6i_flags & (RTF_GATEWAY | RTF_NONEXTHOP)) && | ||
1576 | ipv6_addr_equal(&rt->rt6i_dst.addr, daddr)); | ||
1577 | } | ||
1578 | |||
1579 | diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h | ||
1580 | index a49d37140a64..591cd9e4692c 100644 | ||
1581 | --- a/include/target/iscsi/iscsi_target_core.h | ||
1582 | +++ b/include/target/iscsi/iscsi_target_core.h | ||
1583 | @@ -676,7 +676,7 @@ struct iscsi_session { | ||
1584 | atomic_t session_logout; | ||
1585 | atomic_t session_reinstatement; | ||
1586 | atomic_t session_stop_active; | ||
1587 | - atomic_t sleep_on_sess_wait_comp; | ||
1588 | + atomic_t session_close; | ||
1589 | /* connection list */ | ||
1590 | struct list_head sess_conn_list; | ||
1591 | struct list_head cr_active_list; | ||
1592 | diff --git a/kernel/trace/trace_events_trigger.c b/kernel/trace/trace_events_trigger.c | ||
1593 | index 287d77eae59b..de840de87a18 100644 | ||
1594 | --- a/kernel/trace/trace_events_trigger.c | ||
1595 | +++ b/kernel/trace/trace_events_trigger.c | ||
1596 | @@ -1088,14 +1088,10 @@ register_snapshot_trigger(char *glob, struct event_trigger_ops *ops, | ||
1597 | struct event_trigger_data *data, | ||
1598 | struct trace_event_file *file) | ||
1599 | { | ||
1600 | - int ret = register_trigger(glob, ops, data, file); | ||
1601 | - | ||
1602 | - if (ret > 0 && tracing_alloc_snapshot_instance(file->tr) != 0) { | ||
1603 | - unregister_trigger(glob, ops, data, file); | ||
1604 | - ret = 0; | ||
1605 | - } | ||
1606 | + if (tracing_alloc_snapshot_instance(file->tr) != 0) | ||
1607 | + return 0; | ||
1608 | |||
1609 | - return ret; | ||
1610 | + return register_trigger(glob, ops, data, file); | ||
1611 | } | ||
1612 | |||
1613 | static int | ||
1614 | diff --git a/net/bpfilter/main.c b/net/bpfilter/main.c | ||
1615 | index efea4874743e..05e1cfc1e5cd 100644 | ||
1616 | --- a/net/bpfilter/main.c | ||
1617 | +++ b/net/bpfilter/main.c | ||
1618 | @@ -35,7 +35,6 @@ static void loop(void) | ||
1619 | struct mbox_reply reply; | ||
1620 | int n; | ||
1621 | |||
1622 | - fprintf(debug_f, "testing the buffer\n"); | ||
1623 | n = read(0, &req, sizeof(req)); | ||
1624 | if (n != sizeof(req)) { | ||
1625 | fprintf(debug_f, "invalid request %d\n", n); | ||
1626 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
1627 | index c19c424197e3..8ad1e8f00958 100644 | ||
1628 | --- a/net/core/dev.c | ||
1629 | +++ b/net/core/dev.c | ||
1630 | @@ -3863,7 +3863,8 @@ EXPORT_SYMBOL(netdev_max_backlog); | ||
1631 | |||
1632 | int netdev_tstamp_prequeue __read_mostly = 1; | ||
1633 | int netdev_budget __read_mostly = 300; | ||
1634 | -unsigned int __read_mostly netdev_budget_usecs = 2000; | ||
1635 | +/* Must be at least 2 jiffes to guarantee 1 jiffy timeout */ | ||
1636 | +unsigned int __read_mostly netdev_budget_usecs = 2 * USEC_PER_SEC / HZ; | ||
1637 | int weight_p __read_mostly = 64; /* old backlog weight */ | ||
1638 | int dev_weight_rx_bias __read_mostly = 1; /* bias for backlog weight */ | ||
1639 | int dev_weight_tx_bias __read_mostly = 1; /* bias for output_queue quota */ | ||
1640 | diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c | ||
1641 | index fae21c863b1f..55c0b2e872a5 100644 | ||
1642 | --- a/net/hsr/hsr_netlink.c | ||
1643 | +++ b/net/hsr/hsr_netlink.c | ||
1644 | @@ -61,10 +61,16 @@ static int hsr_newlink(struct net *src_net, struct net_device *dev, | ||
1645 | else | ||
1646 | multicast_spec = nla_get_u8(data[IFLA_HSR_MULTICAST_SPEC]); | ||
1647 | |||
1648 | - if (!data[IFLA_HSR_VERSION]) | ||
1649 | + if (!data[IFLA_HSR_VERSION]) { | ||
1650 | hsr_version = 0; | ||
1651 | - else | ||
1652 | + } else { | ||
1653 | hsr_version = nla_get_u8(data[IFLA_HSR_VERSION]); | ||
1654 | + if (hsr_version > 1) { | ||
1655 | + NL_SET_ERR_MSG_MOD(extack, | ||
1656 | + "Only versions 0..1 are supported"); | ||
1657 | + return -EINVAL; | ||
1658 | + } | ||
1659 | + } | ||
1660 | |||
1661 | return hsr_dev_finalize(dev, link, multicast_spec, hsr_version); | ||
1662 | } | ||
1663 | diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c | ||
1664 | index e4632bd2026d..458dc6eb5a68 100644 | ||
1665 | --- a/net/ipv4/devinet.c | ||
1666 | +++ b/net/ipv4/devinet.c | ||
1667 | @@ -614,12 +614,15 @@ struct in_ifaddr *inet_ifa_byprefix(struct in_device *in_dev, __be32 prefix, | ||
1668 | return NULL; | ||
1669 | } | ||
1670 | |||
1671 | -static int ip_mc_config(struct sock *sk, bool join, const struct in_ifaddr *ifa) | ||
1672 | +static int ip_mc_autojoin_config(struct net *net, bool join, | ||
1673 | + const struct in_ifaddr *ifa) | ||
1674 | { | ||
1675 | +#if defined(CONFIG_IP_MULTICAST) | ||
1676 | struct ip_mreqn mreq = { | ||
1677 | .imr_multiaddr.s_addr = ifa->ifa_address, | ||
1678 | .imr_ifindex = ifa->ifa_dev->dev->ifindex, | ||
1679 | }; | ||
1680 | + struct sock *sk = net->ipv4.mc_autojoin_sk; | ||
1681 | int ret; | ||
1682 | |||
1683 | ASSERT_RTNL(); | ||
1684 | @@ -632,6 +635,9 @@ static int ip_mc_config(struct sock *sk, bool join, const struct in_ifaddr *ifa) | ||
1685 | release_sock(sk); | ||
1686 | |||
1687 | return ret; | ||
1688 | +#else | ||
1689 | + return -EOPNOTSUPP; | ||
1690 | +#endif | ||
1691 | } | ||
1692 | |||
1693 | static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, | ||
1694 | @@ -675,7 +681,7 @@ static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, | ||
1695 | continue; | ||
1696 | |||
1697 | if (ipv4_is_multicast(ifa->ifa_address)) | ||
1698 | - ip_mc_config(net->ipv4.mc_autojoin_sk, false, ifa); | ||
1699 | + ip_mc_autojoin_config(net, false, ifa); | ||
1700 | __inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).portid); | ||
1701 | return 0; | ||
1702 | } | ||
1703 | @@ -940,8 +946,7 @@ static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, | ||
1704 | */ | ||
1705 | set_ifa_lifetime(ifa, valid_lft, prefered_lft); | ||
1706 | if (ifa->ifa_flags & IFA_F_MCAUTOJOIN) { | ||
1707 | - int ret = ip_mc_config(net->ipv4.mc_autojoin_sk, | ||
1708 | - true, ifa); | ||
1709 | + int ret = ip_mc_autojoin_config(net, true, ifa); | ||
1710 | |||
1711 | if (ret < 0) { | ||
1712 | inet_free_ifa(ifa); | ||
1713 | diff --git a/net/l2tp/l2tp_netlink.c b/net/l2tp/l2tp_netlink.c | ||
1714 | index f5a9bdc4980c..ebb381c3f1b9 100644 | ||
1715 | --- a/net/l2tp/l2tp_netlink.c | ||
1716 | +++ b/net/l2tp/l2tp_netlink.c | ||
1717 | @@ -920,51 +920,51 @@ static const struct genl_ops l2tp_nl_ops[] = { | ||
1718 | .cmd = L2TP_CMD_TUNNEL_CREATE, | ||
1719 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
1720 | .doit = l2tp_nl_cmd_tunnel_create, | ||
1721 | - .flags = GENL_ADMIN_PERM, | ||
1722 | + .flags = GENL_UNS_ADMIN_PERM, | ||
1723 | }, | ||
1724 | { | ||
1725 | .cmd = L2TP_CMD_TUNNEL_DELETE, | ||
1726 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
1727 | .doit = l2tp_nl_cmd_tunnel_delete, | ||
1728 | - .flags = GENL_ADMIN_PERM, | ||
1729 | + .flags = GENL_UNS_ADMIN_PERM, | ||
1730 | }, | ||
1731 | { | ||
1732 | .cmd = L2TP_CMD_TUNNEL_MODIFY, | ||
1733 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
1734 | .doit = l2tp_nl_cmd_tunnel_modify, | ||
1735 | - .flags = GENL_ADMIN_PERM, | ||
1736 | + .flags = GENL_UNS_ADMIN_PERM, | ||
1737 | }, | ||
1738 | { | ||
1739 | .cmd = L2TP_CMD_TUNNEL_GET, | ||
1740 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
1741 | .doit = l2tp_nl_cmd_tunnel_get, | ||
1742 | .dumpit = l2tp_nl_cmd_tunnel_dump, | ||
1743 | - .flags = GENL_ADMIN_PERM, | ||
1744 | + .flags = GENL_UNS_ADMIN_PERM, | ||
1745 | }, | ||
1746 | { | ||
1747 | .cmd = L2TP_CMD_SESSION_CREATE, | ||
1748 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
1749 | .doit = l2tp_nl_cmd_session_create, | ||
1750 | - .flags = GENL_ADMIN_PERM, | ||
1751 | + .flags = GENL_UNS_ADMIN_PERM, | ||
1752 | }, | ||
1753 | { | ||
1754 | .cmd = L2TP_CMD_SESSION_DELETE, | ||
1755 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
1756 | .doit = l2tp_nl_cmd_session_delete, | ||
1757 | - .flags = GENL_ADMIN_PERM, | ||
1758 | + .flags = GENL_UNS_ADMIN_PERM, | ||
1759 | }, | ||
1760 | { | ||
1761 | .cmd = L2TP_CMD_SESSION_MODIFY, | ||
1762 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
1763 | .doit = l2tp_nl_cmd_session_modify, | ||
1764 | - .flags = GENL_ADMIN_PERM, | ||
1765 | + .flags = GENL_UNS_ADMIN_PERM, | ||
1766 | }, | ||
1767 | { | ||
1768 | .cmd = L2TP_CMD_SESSION_GET, | ||
1769 | .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, | ||
1770 | .doit = l2tp_nl_cmd_session_get, | ||
1771 | .dumpit = l2tp_nl_cmd_session_dump, | ||
1772 | - .flags = GENL_ADMIN_PERM, | ||
1773 | + .flags = GENL_UNS_ADMIN_PERM, | ||
1774 | }, | ||
1775 | }; | ||
1776 | |||
1777 | diff --git a/net/mac80211/main.c b/net/mac80211/main.c | ||
1778 | index 2d05c4cfaf6d..bc4bed021066 100644 | ||
1779 | --- a/net/mac80211/main.c | ||
1780 | +++ b/net/mac80211/main.c | ||
1781 | @@ -1045,7 +1045,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | ||
1782 | local->hw.wiphy->signal_type = CFG80211_SIGNAL_TYPE_UNSPEC; | ||
1783 | if (hw->max_signal <= 0) { | ||
1784 | result = -EINVAL; | ||
1785 | - goto fail_wiphy_register; | ||
1786 | + goto fail_workqueue; | ||
1787 | } | ||
1788 | } | ||
1789 | |||
1790 | @@ -1107,7 +1107,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | ||
1791 | |||
1792 | result = ieee80211_init_cipher_suites(local); | ||
1793 | if (result < 0) | ||
1794 | - goto fail_wiphy_register; | ||
1795 | + goto fail_workqueue; | ||
1796 | |||
1797 | if (!local->ops->remain_on_channel) | ||
1798 | local->hw.wiphy->max_remain_on_channel_duration = 5000; | ||
1799 | @@ -1133,10 +1133,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | ||
1800 | |||
1801 | local->hw.wiphy->max_num_csa_counters = IEEE80211_MAX_CSA_COUNTERS_NUM; | ||
1802 | |||
1803 | - result = wiphy_register(local->hw.wiphy); | ||
1804 | - if (result < 0) | ||
1805 | - goto fail_wiphy_register; | ||
1806 | - | ||
1807 | /* | ||
1808 | * We use the number of queues for feature tests (QoS, HT) internally | ||
1809 | * so restrict them appropriately. | ||
1810 | @@ -1192,9 +1188,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | ||
1811 | goto fail_flows; | ||
1812 | |||
1813 | rtnl_lock(); | ||
1814 | - | ||
1815 | result = ieee80211_init_rate_ctrl_alg(local, | ||
1816 | hw->rate_control_algorithm); | ||
1817 | + rtnl_unlock(); | ||
1818 | if (result < 0) { | ||
1819 | wiphy_debug(local->hw.wiphy, | ||
1820 | "Failed to initialize rate control algorithm\n"); | ||
1821 | @@ -1248,6 +1244,12 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | ||
1822 | local->sband_allocated |= BIT(band); | ||
1823 | } | ||
1824 | |||
1825 | + result = wiphy_register(local->hw.wiphy); | ||
1826 | + if (result < 0) | ||
1827 | + goto fail_wiphy_register; | ||
1828 | + | ||
1829 | + rtnl_lock(); | ||
1830 | + | ||
1831 | /* add one default STA interface if supported */ | ||
1832 | if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_STATION) && | ||
1833 | !ieee80211_hw_check(hw, NO_AUTO_VIF)) { | ||
1834 | @@ -1287,17 +1289,17 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) | ||
1835 | #if defined(CONFIG_INET) || defined(CONFIG_IPV6) | ||
1836 | fail_ifa: | ||
1837 | #endif | ||
1838 | + wiphy_unregister(local->hw.wiphy); | ||
1839 | + fail_wiphy_register: | ||
1840 | rtnl_lock(); | ||
1841 | rate_control_deinitialize(local); | ||
1842 | ieee80211_remove_interfaces(local); | ||
1843 | - fail_rate: | ||
1844 | rtnl_unlock(); | ||
1845 | + fail_rate: | ||
1846 | fail_flows: | ||
1847 | ieee80211_led_exit(local); | ||
1848 | destroy_workqueue(local->workqueue); | ||
1849 | fail_workqueue: | ||
1850 | - wiphy_unregister(local->hw.wiphy); | ||
1851 | - fail_wiphy_register: | ||
1852 | if (local->wiphy_ciphers_allocated) | ||
1853 | kfree(local->hw.wiphy->cipher_suites); | ||
1854 | kfree(local->int_scan_req); | ||
1855 | @@ -1347,8 +1349,8 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw) | ||
1856 | skb_queue_purge(&local->skb_queue_unreliable); | ||
1857 | skb_queue_purge(&local->skb_queue_tdls_chsw); | ||
1858 | |||
1859 | - destroy_workqueue(local->workqueue); | ||
1860 | wiphy_unregister(local->hw.wiphy); | ||
1861 | + destroy_workqueue(local->workqueue); | ||
1862 | ieee80211_led_exit(local); | ||
1863 | kfree(local->int_scan_req); | ||
1864 | } | ||
1865 | diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c | ||
1866 | index 3d24d45be5f4..930f48a20546 100644 | ||
1867 | --- a/net/qrtr/qrtr.c | ||
1868 | +++ b/net/qrtr/qrtr.c | ||
1869 | @@ -763,20 +763,21 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) | ||
1870 | |||
1871 | node = NULL; | ||
1872 | if (addr->sq_node == QRTR_NODE_BCAST) { | ||
1873 | - enqueue_fn = qrtr_bcast_enqueue; | ||
1874 | - if (addr->sq_port != QRTR_PORT_CTRL) { | ||
1875 | + if (addr->sq_port != QRTR_PORT_CTRL && | ||
1876 | + qrtr_local_nid != QRTR_NODE_BCAST) { | ||
1877 | release_sock(sk); | ||
1878 | return -ENOTCONN; | ||
1879 | } | ||
1880 | + enqueue_fn = qrtr_bcast_enqueue; | ||
1881 | } else if (addr->sq_node == ipc->us.sq_node) { | ||
1882 | enqueue_fn = qrtr_local_enqueue; | ||
1883 | } else { | ||
1884 | - enqueue_fn = qrtr_node_enqueue; | ||
1885 | node = qrtr_node_lookup(addr->sq_node); | ||
1886 | if (!node) { | ||
1887 | release_sock(sk); | ||
1888 | return -ECONNRESET; | ||
1889 | } | ||
1890 | + enqueue_fn = qrtr_node_enqueue; | ||
1891 | } | ||
1892 | |||
1893 | plen = (len + 3) & ~3; | ||
1894 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c | ||
1895 | index dbb6a14968ef..b65180e874fb 100644 | ||
1896 | --- a/net/wireless/nl80211.c | ||
1897 | +++ b/net/wireless/nl80211.c | ||
1898 | @@ -618,10 +618,8 @@ const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { | ||
1899 | [NL80211_ATTR_HE_CAPABILITY] = { .type = NLA_BINARY, | ||
1900 | .len = NL80211_HE_MAX_CAPABILITY_LEN }, | ||
1901 | |||
1902 | - [NL80211_ATTR_FTM_RESPONDER] = { | ||
1903 | - .type = NLA_NESTED, | ||
1904 | - .validation_data = nl80211_ftm_responder_policy, | ||
1905 | - }, | ||
1906 | + [NL80211_ATTR_FTM_RESPONDER] = | ||
1907 | + NLA_POLICY_NESTED(nl80211_ftm_responder_policy), | ||
1908 | [NL80211_ATTR_TIMEOUT] = NLA_POLICY_MIN(NLA_U32, 1), | ||
1909 | [NL80211_ATTR_PEER_MEASUREMENTS] = | ||
1910 | NLA_POLICY_NESTED(nl80211_pmsr_attr_policy), | ||
1911 | diff --git a/security/keys/proc.c b/security/keys/proc.c | ||
1912 | index 415f3f1c2da0..d0cde6685627 100644 | ||
1913 | --- a/security/keys/proc.c | ||
1914 | +++ b/security/keys/proc.c | ||
1915 | @@ -139,6 +139,8 @@ static void *proc_keys_next(struct seq_file *p, void *v, loff_t *_pos) | ||
1916 | n = key_serial_next(p, v); | ||
1917 | if (n) | ||
1918 | *_pos = key_node_serial(n); | ||
1919 | + else | ||
1920 | + (*_pos)++; | ||
1921 | return n; | ||
1922 | } | ||
1923 | |||
1924 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
1925 | index 0fcbb6ab2d58..10c8b31f8507 100644 | ||
1926 | --- a/sound/pci/hda/patch_realtek.c | ||
1927 | +++ b/sound/pci/hda/patch_realtek.c | ||
1928 | @@ -7253,6 +7253,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
1929 | SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC), | ||
1930 | SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK), | ||
1931 | SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC), | ||
1932 | + SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC), | ||
1933 | SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE), | ||
1934 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), | ||
1935 | SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC), | ||
1936 | diff --git a/sound/soc/intel/atom/sst-atom-controls.c b/sound/soc/intel/atom/sst-atom-controls.c | ||
1937 | index baef461a99f1..f883c9340eee 100644 | ||
1938 | --- a/sound/soc/intel/atom/sst-atom-controls.c | ||
1939 | +++ b/sound/soc/intel/atom/sst-atom-controls.c | ||
1940 | @@ -1333,7 +1333,7 @@ int sst_send_pipe_gains(struct snd_soc_dai *dai, int stream, int mute) | ||
1941 | dai->capture_widget->name); | ||
1942 | w = dai->capture_widget; | ||
1943 | snd_soc_dapm_widget_for_each_source_path(w, p) { | ||
1944 | - if (p->connected && !p->connected(w, p->sink)) | ||
1945 | + if (p->connected && !p->connected(w, p->source)) | ||
1946 | continue; | ||
1947 | |||
1948 | if (p->connect && p->source->power && | ||
1949 | diff --git a/sound/soc/intel/atom/sst/sst_pci.c b/sound/soc/intel/atom/sst/sst_pci.c | ||
1950 | index d952719bc098..5862fe968083 100644 | ||
1951 | --- a/sound/soc/intel/atom/sst/sst_pci.c | ||
1952 | +++ b/sound/soc/intel/atom/sst/sst_pci.c | ||
1953 | @@ -99,7 +99,7 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx) | ||
1954 | dev_dbg(ctx->dev, "DRAM Ptr %p\n", ctx->dram); | ||
1955 | do_release_regions: | ||
1956 | pci_release_regions(pci); | ||
1957 | - return 0; | ||
1958 | + return ret; | ||
1959 | } | ||
1960 | |||
1961 | /* | ||
1962 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c | ||
1963 | index d2a050bb8341..5661994e13e7 100644 | ||
1964 | --- a/sound/usb/mixer.c | ||
1965 | +++ b/sound/usb/mixer.c | ||
1966 | @@ -1446,7 +1446,7 @@ error: | ||
1967 | usb_audio_err(chip, | ||
1968 | "cannot get connectors status: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n", | ||
1969 | UAC_GET_CUR, validx, idx, cval->val_type); | ||
1970 | - return ret; | ||
1971 | + return filter_error(cval, ret); | ||
1972 | } | ||
1973 | |||
1974 | ucontrol->value.integer.value[0] = val; | ||
1975 | @@ -1750,11 +1750,15 @@ static void get_connector_control_name(struct usb_mixer_interface *mixer, | ||
1976 | |||
1977 | /* Build a mixer control for a UAC connector control (jack-detect) */ | ||
1978 | static void build_connector_control(struct usb_mixer_interface *mixer, | ||
1979 | + const struct usbmix_name_map *imap, | ||
1980 | struct usb_audio_term *term, bool is_input) | ||
1981 | { | ||
1982 | struct snd_kcontrol *kctl; | ||
1983 | struct usb_mixer_elem_info *cval; | ||
1984 | |||
1985 | + if (check_ignored_ctl(find_map(imap, term->id, 0))) | ||
1986 | + return; | ||
1987 | + | ||
1988 | cval = kzalloc(sizeof(*cval), GFP_KERNEL); | ||
1989 | if (!cval) | ||
1990 | return; | ||
1991 | @@ -2088,8 +2092,9 @@ static int parse_audio_input_terminal(struct mixer_build *state, int unitid, | ||
1992 | check_input_term(state, term_id, &iterm); | ||
1993 | |||
1994 | /* Check for jack detection. */ | ||
1995 | - if (uac_v2v3_control_is_readable(bmctls, control)) | ||
1996 | - build_connector_control(state->mixer, &iterm, true); | ||
1997 | + if ((iterm.type & 0xff00) != 0x0100 && | ||
1998 | + uac_v2v3_control_is_readable(bmctls, control)) | ||
1999 | + build_connector_control(state->mixer, state->map, &iterm, true); | ||
2000 | |||
2001 | return 0; | ||
2002 | } | ||
2003 | @@ -3050,13 +3055,13 @@ static int snd_usb_mixer_controls_badd(struct usb_mixer_interface *mixer, | ||
2004 | memset(&iterm, 0, sizeof(iterm)); | ||
2005 | iterm.id = UAC3_BADD_IT_ID4; | ||
2006 | iterm.type = UAC_BIDIR_TERMINAL_HEADSET; | ||
2007 | - build_connector_control(mixer, &iterm, true); | ||
2008 | + build_connector_control(mixer, map->map, &iterm, true); | ||
2009 | |||
2010 | /* Output Term - Insertion control */ | ||
2011 | memset(&oterm, 0, sizeof(oterm)); | ||
2012 | oterm.id = UAC3_BADD_OT_ID3; | ||
2013 | oterm.type = UAC_BIDIR_TERMINAL_HEADSET; | ||
2014 | - build_connector_control(mixer, &oterm, false); | ||
2015 | + build_connector_control(mixer, map->map, &oterm, false); | ||
2016 | } | ||
2017 | |||
2018 | return 0; | ||
2019 | @@ -3085,7 +3090,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) | ||
2020 | if (map->id == state.chip->usb_id) { | ||
2021 | state.map = map->map; | ||
2022 | state.selector_map = map->selector_map; | ||
2023 | - mixer->ignore_ctl_error = map->ignore_ctl_error; | ||
2024 | + mixer->ignore_ctl_error |= map->ignore_ctl_error; | ||
2025 | break; | ||
2026 | } | ||
2027 | } | ||
2028 | @@ -3128,10 +3133,11 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) | ||
2029 | if (err < 0 && err != -EINVAL) | ||
2030 | return err; | ||
2031 | |||
2032 | - if (uac_v2v3_control_is_readable(le16_to_cpu(desc->bmControls), | ||
2033 | + if ((state.oterm.type & 0xff00) != 0x0100 && | ||
2034 | + uac_v2v3_control_is_readable(le16_to_cpu(desc->bmControls), | ||
2035 | UAC2_TE_CONNECTOR)) { | ||
2036 | - build_connector_control(state.mixer, &state.oterm, | ||
2037 | - false); | ||
2038 | + build_connector_control(state.mixer, state.map, | ||
2039 | + &state.oterm, false); | ||
2040 | } | ||
2041 | } else { /* UAC_VERSION_3 */ | ||
2042 | struct uac3_output_terminal_descriptor *desc = p; | ||
2043 | @@ -3153,10 +3159,11 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) | ||
2044 | if (err < 0 && err != -EINVAL) | ||
2045 | return err; | ||
2046 | |||
2047 | - if (uac_v2v3_control_is_readable(le32_to_cpu(desc->bmControls), | ||
2048 | + if ((state.oterm.type & 0xff00) != 0x0100 && | ||
2049 | + uac_v2v3_control_is_readable(le32_to_cpu(desc->bmControls), | ||
2050 | UAC3_TE_INSERTION)) { | ||
2051 | - build_connector_control(state.mixer, &state.oterm, | ||
2052 | - false); | ||
2053 | + build_connector_control(state.mixer, state.map, | ||
2054 | + &state.oterm, false); | ||
2055 | } | ||
2056 | } | ||
2057 | } | ||
2058 | diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c | ||
2059 | index f6a67eecb063..3a54ca04ec4c 100644 | ||
2060 | --- a/sound/usb/mixer_maps.c | ||
2061 | +++ b/sound/usb/mixer_maps.c | ||
2062 | @@ -350,9 +350,11 @@ static const struct usbmix_name_map dell_alc4020_map[] = { | ||
2063 | }; | ||
2064 | |||
2065 | /* Some mobos shipped with a dummy HD-audio show the invalid GET_MIN/GET_MAX | ||
2066 | - * response for Input Gain Pad (id=19, control=12). Skip it. | ||
2067 | + * response for Input Gain Pad (id=19, control=12) and the connector status | ||
2068 | + * for SPDIF terminal (id=18). Skip them. | ||
2069 | */ | ||
2070 | static const struct usbmix_name_map asus_rog_map[] = { | ||
2071 | + { 18, NULL }, /* OT, connector control */ | ||
2072 | { 19, NULL, 12 }, /* FU, Input Gain Pad */ | ||
2073 | {} | ||
2074 | }; | ||
2075 | diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c | ||
2076 | index 6407dff405d9..4d8db41b949a 100644 | ||
2077 | --- a/tools/perf/builtin-report.c | ||
2078 | +++ b/tools/perf/builtin-report.c | ||
2079 | @@ -181,24 +181,23 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter, | ||
2080 | { | ||
2081 | struct hist_entry *he = iter->he; | ||
2082 | struct report *rep = arg; | ||
2083 | - struct branch_info *bi; | ||
2084 | + struct branch_info *bi = he->branch_info; | ||
2085 | struct perf_sample *sample = iter->sample; | ||
2086 | struct evsel *evsel = iter->evsel; | ||
2087 | int err; | ||
2088 | |||
2089 | + branch_type_count(&rep->brtype_stat, &bi->flags, | ||
2090 | + bi->from.addr, bi->to.addr); | ||
2091 | + | ||
2092 | if (!ui__has_annotation() && !rep->symbol_ipc) | ||
2093 | return 0; | ||
2094 | |||
2095 | - bi = he->branch_info; | ||
2096 | err = addr_map_symbol__inc_samples(&bi->from, sample, evsel); | ||
2097 | if (err) | ||
2098 | goto out; | ||
2099 | |||
2100 | err = addr_map_symbol__inc_samples(&bi->to, sample, evsel); | ||
2101 | |||
2102 | - branch_type_count(&rep->brtype_stat, &bi->flags, | ||
2103 | - bi->from.addr, bi->to.addr); | ||
2104 | - | ||
2105 | out: | ||
2106 | return err; | ||
2107 | } |