1
0
Fork 0

This is the 5.4.80 stable release

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl+8/L0ACgkQONu9yGCS
 aT624w/+M3fyTWj45qssxAOYUbWH4OPzKjMTKq1qHOGTBGYcVLxmggDV5xziQs8B
 WiCUysdJsM9Xwe/a9+fy9X2FHk7KxILf02mYLVcwyLJLXCHsCXtvBeTf937h5SaI
 cIsR1e2LQ7s1mTnVmBs2DGDQcD6Y17f/FoTpBejOSB9O+MSBNoBhOR/aaDUzzLm1
 sfpQ3zpnF6iAo2KYITxq/QkyRyiCPMl1c+/ggLTYvrM15DGhnChPN9j1+X0TLdjz
 UuZakvX/UY9vnY6oWla7wybwUzZMfFqZtehvwFA4wqeZqXcJcb+nBpfpoT1Gp9bv
 cpz+8nmF0ER1eS6m1C/XqiTr3IqDOSAHfcu80HzJRC+dmcXjxyNj+AZyFhm+uCJS
 IyUi6+mFwCypg3II2QEMNYdeips4Qj051IPNl5gEteNC4GQqXef3JdR52qIDzsHe
 9xgQVFZjVDYpZ6AOkyjqzGJ0dy3a1f7GNIPxwe6DUnbkOkOB+Z5KhGFbEOp+yGoa
 3PUnVvtrTs07VkB0afwoj7xIyfowmjxCPSSXkfnYY2iJ6FYsfCm2x/RtM5tTvgT+
 E8W71RxsyRwhjC2Z85wi6PR59XTIJcw3oJvJkrvchCAsc3Z1L7wBtjyHdvouxo8+
 h/NlGOAisTiQFdT2IixgmTZaoxE7fQLDCJDMmgZT2qPJ1hn7Pbo=
 =Puge
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEdQaENiSDAlGTDEbB7G51OISzHs0FAl+9WisACgkQ7G51OISz
 Hs3jpA/8DXrkNu/ObTWzrCgdSIBVHUcN9mJqh7q67at5XnSTJwiN3iIa6ni3Sb63
 6wqOYazsSB4KQWosjWSgzYzTsasrB4OgeFMKXxrBM8uoPniNPaSQZk3cJs+v8kQg
 ptd6vhu4AoV4gKYLQqps2rDJ+VpG7N8YI3Cb8KrxDzff0NWfWtKpJlyUnEd+ABIM
 oKfknpDumjK3mHFTgmZb0YK6WWtXlxhBge74hnogkuw0g5yvZ5PNvdat6nrMlof3
 ytN067rV97saMAZE0syaKKnpBpWAKCYeTCx0xhZrphQMl/XafYPOdZbCj3B380Fb
 OlDrCprYKGLDF9HedYgDJia4omK36CGh4S+ZjwBfV4DtNlsd+qXzcz/OMrx0B557
 AZJpYLtq8XG71ogJ57fbgda10PGd21cLtTAQBkal0FTH3+56MH9mX14oOwr+vzcA
 7dK80TbSGLIGWwRDYQI4OAgS3uLCrwrDvvf8lZEB+uV5pIIYr1YQ25e+UFLQuzUH
 nKsXnUsrTNm2WkeOoFh7+O8JkMT3JyN7jteT19u2RZ1ZLNgJJJHyY2BivGyOONbV
 vkZzKlfeXtyXvC4aSx9wpvW86vJzwTY+fde9E+5S3SgG9ixsVGf8+dlfMF/kmgtF
 1atdOYQYWDoVzKpcVtr6JCtpVkT2Wi3cqo5UUdBkRznd+3wZG1w=
 =Fg5i
 -----END PGP SIGNATURE-----

Merge tag 'v5.4.80' into 5.4-2.2.x-imx

This is the 5.4.80 stable release

Conflicts (manual resolve):
- arch/arm64/boot/dts/freescale/imx8mn.dtsi:
Fix minor merge conflict where commit [8381af1b684c] in stable tree
removed one blank line.

- drivers/net/can/flexcan.c:
Fix merge fuzz during integration of stable commit [4c0a778fcf7b5].

Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
5.4-rM2-2.2.x-imx-squashed
Andrey Zhizhikin 2020-11-24 19:05:55 +00:00
commit 2490de76d9
157 changed files with 980 additions and 522 deletions

View File

@ -82,7 +82,8 @@ Default MMUv2-compatible layout::
+------------------+ +------------------+
| VMALLOC area | VMALLOC_START 0xc0000000 128MB - 64KB | VMALLOC area | VMALLOC_START 0xc0000000 128MB - 64KB
+------------------+ VMALLOC_END +------------------+ VMALLOC_END
| Cache aliasing | TLBTEMP_BASE_1 0xc7ff0000 DCACHE_WAY_SIZE +------------------+
| Cache aliasing | TLBTEMP_BASE_1 0xc8000000 DCACHE_WAY_SIZE
| remap area 1 | | remap area 1 |
+------------------+ +------------------+
| Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
@ -124,7 +125,8 @@ Default MMUv2-compatible layout::
+------------------+ +------------------+
| VMALLOC area | VMALLOC_START 0xa0000000 128MB - 64KB | VMALLOC area | VMALLOC_START 0xa0000000 128MB - 64KB
+------------------+ VMALLOC_END +------------------+ VMALLOC_END
| Cache aliasing | TLBTEMP_BASE_1 0xa7ff0000 DCACHE_WAY_SIZE +------------------+
| Cache aliasing | TLBTEMP_BASE_1 0xa8000000 DCACHE_WAY_SIZE
| remap area 1 | | remap area 1 |
+------------------+ +------------------+
| Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE
@ -167,7 +169,8 @@ Default MMUv2-compatible layout::
+------------------+ +------------------+
| VMALLOC area | VMALLOC_START 0x90000000 128MB - 64KB | VMALLOC area | VMALLOC_START 0x90000000 128MB - 64KB
+------------------+ VMALLOC_END +------------------+ VMALLOC_END
| Cache aliasing | TLBTEMP_BASE_1 0x97ff0000 DCACHE_WAY_SIZE +------------------+
| Cache aliasing | TLBTEMP_BASE_1 0x98000000 DCACHE_WAY_SIZE
| remap area 1 | | remap area 1 |
+------------------+ +------------------+
| Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE | Cache aliasing | TLBTEMP_BASE_2 DCACHE_WAY_SIZE

View File

@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 5 VERSION = 5
PATCHLEVEL = 4 PATCHLEVEL = 4
SUBLEVEL = 79 SUBLEVEL = 80
EXTRAVERSION = EXTRAVERSION =
NAME = Kleptomaniac Octopus NAME = Kleptomaniac Octopus

View File

@ -59,7 +59,7 @@
MX50_PAD_CSPI_MISO__CSPI_MISO 0x00 MX50_PAD_CSPI_MISO__CSPI_MISO 0x00
MX50_PAD_CSPI_MOSI__CSPI_MOSI 0x00 MX50_PAD_CSPI_MOSI__CSPI_MOSI 0x00
MX50_PAD_CSPI_SS0__GPIO4_11 0xc4 MX50_PAD_CSPI_SS0__GPIO4_11 0xc4
MX50_PAD_ECSPI1_MOSI__CSPI_SS1 0xf4 MX50_PAD_ECSPI1_MOSI__GPIO4_13 0x84
>; >;
}; };

View File

@ -98,7 +98,7 @@
&fec { &fec {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet>; pinctrl-0 = <&pinctrl_enet>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };

View File

@ -154,7 +154,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&gmac_rgmii_pins>; pinctrl-0 = <&gmac_rgmii_pins>;
phy-handle = <&phy1>; phy-handle = <&phy1>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };

View File

@ -130,7 +130,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&gmac_rgmii_pins>; pinctrl-0 = <&gmac_rgmii_pins>;
phy-handle = <&phy1>; phy-handle = <&phy1>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
status = "okay"; status = "okay";
}; };

View File

@ -151,7 +151,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&gmac_rgmii_pins>; pinctrl-0 = <&gmac_rgmii_pins>;
phy-handle = <&phy1>; phy-handle = <&phy1>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };

View File

@ -131,7 +131,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_sw>; phy-supply = <&reg_sw>;
phy-handle = <&rgmii_phy>; phy-handle = <&rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
allwinner,rx-delay-ps = <700>; allwinner,rx-delay-ps = <700>;
allwinner,tx-delay-ps = <700>; allwinner,tx-delay-ps = <700>;
status = "okay"; status = "okay";

View File

@ -183,7 +183,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_dldo4>; phy-supply = <&reg_dldo4>;
phy-handle = <&rgmii_phy>; phy-handle = <&rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };

View File

@ -53,11 +53,6 @@
}; };
}; };
&emac {
/* LEDs changed to active high on the plus */
/delete-property/ allwinner,leds-active-low;
};
&mmc1 { &mmc1 {
vmmc-supply = <&reg_vcc3v3>; vmmc-supply = <&reg_vcc3v3>;
bus-width = <4>; bus-width = <4>;

View File

@ -67,7 +67,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };

View File

@ -129,7 +129,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&gmac_rgmii_pins>; pinctrl-0 = <&gmac_rgmii_pins>;
phy-handle = <&phy1>; phy-handle = <&phy1>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-supply = <&reg_dc1sw>; phy-supply = <&reg_dc1sw>;
status = "okay"; status = "okay";
}; };

View File

@ -129,7 +129,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&gmac_rgmii_pins>; pinctrl-0 = <&gmac_rgmii_pins>;
phy-handle = <&phy1>; phy-handle = <&phy1>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-supply = <&reg_cldo1>; phy-supply = <&reg_cldo1>;
status = "okay"; status = "okay";
}; };

View File

@ -124,7 +124,7 @@
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&gmac_rgmii_pins>; pinctrl-0 = <&gmac_rgmii_pins>;
phy-handle = <&phy1>; phy-handle = <&phy1>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-supply = <&reg_cldo1>; phy-supply = <&reg_cldo1>;
status = "okay"; status = "okay";
}; };

View File

@ -126,7 +126,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };

View File

@ -127,7 +127,7 @@
&emac { &emac {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&rgmii_pins>; pinctrl-0 = <&rgmii_pins>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-supply = <&reg_dc1sw>; phy-supply = <&reg_dc1sw>;
status = "okay"; status = "okay";

View File

@ -129,7 +129,7 @@
&emac { &emac {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&rgmii_pins>; pinctrl-0 = <&rgmii_pins>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
status = "okay"; status = "okay";

View File

@ -52,7 +52,7 @@
&emac { &emac {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&rgmii_pins>; pinctrl-0 = <&rgmii_pins>;
phy-mode = "rgmii"; phy-mode = "rgmii-txid";
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
status = "okay"; status = "okay";
}; };

View File

@ -157,7 +157,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };

View File

@ -164,7 +164,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };

View File

@ -83,7 +83,7 @@
&emac { &emac {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&ext_rgmii_pins>; pinctrl-0 = <&ext_rgmii_pins>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-supply = <&reg_aldo2>; phy-supply = <&reg_aldo2>;
status = "okay"; status = "okay";

View File

@ -66,7 +66,7 @@
&emac { &emac {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&ext_rgmii_pins>; pinctrl-0 = <&ext_rgmii_pins>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-supply = <&reg_aldo2>; phy-supply = <&reg_aldo2>;
allwinner,rx-delay-ps = <200>; allwinner,rx-delay-ps = <200>;

View File

@ -262,6 +262,8 @@ extern struct arm64_ftr_reg arm64_ftr_reg_ctrel0;
/* /*
* CPU feature detected at boot time based on feature of one or more CPUs. * CPU feature detected at boot time based on feature of one or more CPUs.
* All possible conflicts for a late CPU are ignored. * All possible conflicts for a late CPU are ignored.
* NOTE: this means that a late CPU with the feature will *not* cause the
* capability to be advertised by cpus_have_*cap()!
*/ */
#define ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE \ #define ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE \
(ARM64_CPUCAP_SCOPE_LOCAL_CPU | \ (ARM64_CPUCAP_SCOPE_LOCAL_CPU | \

View File

@ -511,14 +511,13 @@ static void erratum_1418040_thread_switch(struct task_struct *prev,
bool prev32, next32; bool prev32, next32;
u64 val; u64 val;
if (!(IS_ENABLED(CONFIG_ARM64_ERRATUM_1418040) && if (!IS_ENABLED(CONFIG_ARM64_ERRATUM_1418040))
cpus_have_const_cap(ARM64_WORKAROUND_1418040)))
return; return;
prev32 = is_compat_thread(task_thread_info(prev)); prev32 = is_compat_thread(task_thread_info(prev));
next32 = is_compat_thread(task_thread_info(next)); next32 = is_compat_thread(task_thread_info(next));
if (prev32 == next32) if (prev32 == next32 || !this_cpu_has_cap(ARM64_WORKAROUND_1418040))
return; return;
val = read_sysreg(cntkctl_el1); val = read_sysreg(cntkctl_el1);

View File

@ -66,7 +66,6 @@ static int cpu_psci_cpu_disable(unsigned int cpu)
static void cpu_psci_cpu_die(unsigned int cpu) static void cpu_psci_cpu_die(unsigned int cpu)
{ {
int ret;
/* /*
* There are no known implementations of PSCI actually using the * There are no known implementations of PSCI actually using the
* power state field, pass a sensible default for now. * power state field, pass a sensible default for now.
@ -74,9 +73,7 @@ static void cpu_psci_cpu_die(unsigned int cpu)
u32 state = PSCI_POWER_STATE_TYPE_POWER_DOWN << u32 state = PSCI_POWER_STATE_TYPE_POWER_DOWN <<
PSCI_0_2_POWER_STATE_TYPE_SHIFT; PSCI_0_2_POWER_STATE_TYPE_SHIFT;
ret = psci_ops.cpu_off(state); psci_ops.cpu_off(state);
pr_crit("unable to power off CPU%u (%d)\n", cpu, ret);
} }
static int cpu_psci_cpu_kill(unsigned int cpu) static int cpu_psci_cpu_kill(unsigned int cpu)

View File

@ -388,6 +388,7 @@ void cpu_die_early(void)
/* Mark this CPU absent */ /* Mark this CPU absent */
set_cpu_present(cpu, 0); set_cpu_present(cpu, 0);
rcu_report_dead(cpu);
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
update_cpu_boot_status(CPU_KILL_ME); update_cpu_boot_status(CPU_KILL_ME);

View File

@ -152,6 +152,7 @@ static struct clk __init *alchemy_clk_setup_cpu(const char *parent_name,
{ {
struct clk_init_data id; struct clk_init_data id;
struct clk_hw *h; struct clk_hw *h;
struct clk *clk;
h = kzalloc(sizeof(*h), GFP_KERNEL); h = kzalloc(sizeof(*h), GFP_KERNEL);
if (!h) if (!h)
@ -164,7 +165,13 @@ static struct clk __init *alchemy_clk_setup_cpu(const char *parent_name,
id.ops = &alchemy_clkops_cpu; id.ops = &alchemy_clkops_cpu;
h->init = &id; h->init = &id;
return clk_register(NULL, h); clk = clk_register(NULL, h);
if (IS_ERR(clk)) {
pr_err("failed to register clock\n");
kfree(h);
}
return clk;
} }
/* AUXPLLs ************************************************************/ /* AUXPLLs ************************************************************/

View File

@ -437,6 +437,7 @@ int has_transparent_hugepage(void)
} }
return mask == PM_HUGE_MASK; return mask == PM_HUGE_MASK;
} }
EXPORT_SYMBOL(has_transparent_hugepage);
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ #endif /* CONFIG_TRANSPARENT_HUGEPAGE */

View File

@ -2217,4 +2217,4 @@ out:
} }
arch_initcall(init_cpum_sampling_pmu); arch_initcall(init_cpum_sampling_pmu);
core_param(cpum_sfb_size, CPUM_SF_MAX_SDB, sfb_size, 0640); core_param(cpum_sfb_size, CPUM_SF_MAX_SDB, sfb_size, 0644);

View File

@ -100,53 +100,6 @@ static int has_newer_microcode(void *mc, unsigned int csig, int cpf, int new_rev
return find_matching_signature(mc, csig, cpf); return find_matching_signature(mc, csig, cpf);
} }
/*
* Given CPU signature and a microcode patch, this function finds if the
* microcode patch has matching family and model with the CPU.
*
* %true - if there's a match
* %false - otherwise
*/
static bool microcode_matches(struct microcode_header_intel *mc_header,
unsigned long sig)
{
unsigned long total_size = get_totalsize(mc_header);
unsigned long data_size = get_datasize(mc_header);
struct extended_sigtable *ext_header;
unsigned int fam_ucode, model_ucode;
struct extended_signature *ext_sig;
unsigned int fam, model;
int ext_sigcount, i;
fam = x86_family(sig);
model = x86_model(sig);
fam_ucode = x86_family(mc_header->sig);
model_ucode = x86_model(mc_header->sig);
if (fam == fam_ucode && model == model_ucode)
return true;
/* Look for ext. headers: */
if (total_size <= data_size + MC_HEADER_SIZE)
return false;
ext_header = (void *) mc_header + data_size + MC_HEADER_SIZE;
ext_sig = (void *)ext_header + EXT_HEADER_SIZE;
ext_sigcount = ext_header->count;
for (i = 0; i < ext_sigcount; i++) {
fam_ucode = x86_family(ext_sig->sig);
model_ucode = x86_model(ext_sig->sig);
if (fam == fam_ucode && model == model_ucode)
return true;
ext_sig++;
}
return false;
}
static struct ucode_patch *memdup_patch(void *data, unsigned int size) static struct ucode_patch *memdup_patch(void *data, unsigned int size)
{ {
struct ucode_patch *p; struct ucode_patch *p;
@ -164,7 +117,7 @@ static struct ucode_patch *memdup_patch(void *data, unsigned int size)
return p; return p;
} }
static void save_microcode_patch(void *data, unsigned int size) static void save_microcode_patch(struct ucode_cpu_info *uci, void *data, unsigned int size)
{ {
struct microcode_header_intel *mc_hdr, *mc_saved_hdr; struct microcode_header_intel *mc_hdr, *mc_saved_hdr;
struct ucode_patch *iter, *tmp, *p = NULL; struct ucode_patch *iter, *tmp, *p = NULL;
@ -210,6 +163,9 @@ static void save_microcode_patch(void *data, unsigned int size)
if (!p) if (!p)
return; return;
if (!find_matching_signature(p->data, uci->cpu_sig.sig, uci->cpu_sig.pf))
return;
/* /*
* Save for early loading. On 32-bit, that needs to be a physical * Save for early loading. On 32-bit, that needs to be a physical
* address as the APs are running from physical addresses, before * address as the APs are running from physical addresses, before
@ -344,13 +300,14 @@ scan_microcode(void *data, size_t size, struct ucode_cpu_info *uci, bool save)
size -= mc_size; size -= mc_size;
if (!microcode_matches(mc_header, uci->cpu_sig.sig)) { if (!find_matching_signature(data, uci->cpu_sig.sig,
uci->cpu_sig.pf)) {
data += mc_size; data += mc_size;
continue; continue;
} }
if (save) { if (save) {
save_microcode_patch(data, mc_size); save_microcode_patch(uci, data, mc_size);
goto next; goto next;
} }
@ -483,14 +440,14 @@ static void show_saved_mc(void)
* Save this microcode patch. It will be loaded early when a CPU is * Save this microcode patch. It will be loaded early when a CPU is
* hot-added or resumes. * hot-added or resumes.
*/ */
static void save_mc_for_early(u8 *mc, unsigned int size) static void save_mc_for_early(struct ucode_cpu_info *uci, u8 *mc, unsigned int size)
{ {
/* Synchronization during CPU hotplug. */ /* Synchronization during CPU hotplug. */
static DEFINE_MUTEX(x86_cpu_microcode_mutex); static DEFINE_MUTEX(x86_cpu_microcode_mutex);
mutex_lock(&x86_cpu_microcode_mutex); mutex_lock(&x86_cpu_microcode_mutex);
save_microcode_patch(mc, size); save_microcode_patch(uci, mc, size);
show_saved_mc(); show_saved_mc();
mutex_unlock(&x86_cpu_microcode_mutex); mutex_unlock(&x86_cpu_microcode_mutex);
@ -934,7 +891,7 @@ static enum ucode_state generic_load_microcode(int cpu, struct iov_iter *iter)
* permanent memory. So it will be loaded early when a CPU is hot added * permanent memory. So it will be loaded early when a CPU is hot added
* or resumes. * or resumes.
*/ */
save_mc_for_early(new_mc, new_mc_size); save_mc_for_early(uci, new_mc, new_mc_size);
pr_debug("CPU%d found a matching microcode update with version 0x%x (current=0x%x)\n", pr_debug("CPU%d found a matching microcode update with version 0x%x (current=0x%x)\n",
cpu, new_rev, uci->cpu_sig.rev); cpu, new_rev, uci->cpu_sig.rev);

View File

@ -512,9 +512,6 @@ int tboot_force_iommu(void)
if (!tboot_enabled()) if (!tboot_enabled())
return 0; return 0;
if (intel_iommu_tboot_noforce)
return 1;
if (no_iommu || swiotlb || dmar_disabled) if (no_iommu || swiotlb || dmar_disabled)
pr_warning("Forcing Intel-IOMMU to enabled\n"); pr_warning("Forcing Intel-IOMMU to enabled\n");

View File

@ -217,28 +217,30 @@ int __init efi_alloc_page_tables(void)
gfp_mask = GFP_KERNEL | __GFP_ZERO; gfp_mask = GFP_KERNEL | __GFP_ZERO;
efi_pgd = (pgd_t *)__get_free_pages(gfp_mask, PGD_ALLOCATION_ORDER); efi_pgd = (pgd_t *)__get_free_pages(gfp_mask, PGD_ALLOCATION_ORDER);
if (!efi_pgd) if (!efi_pgd)
return -ENOMEM; goto fail;
pgd = efi_pgd + pgd_index(EFI_VA_END); pgd = efi_pgd + pgd_index(EFI_VA_END);
p4d = p4d_alloc(&init_mm, pgd, EFI_VA_END); p4d = p4d_alloc(&init_mm, pgd, EFI_VA_END);
if (!p4d) { if (!p4d)
free_page((unsigned long)efi_pgd); goto free_pgd;
return -ENOMEM;
}
pud = pud_alloc(&init_mm, p4d, EFI_VA_END); pud = pud_alloc(&init_mm, p4d, EFI_VA_END);
if (!pud) { if (!pud)
if (pgtable_l5_enabled()) goto free_p4d;
free_page((unsigned long) pgd_page_vaddr(*pgd));
free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER);
return -ENOMEM;
}
efi_mm.pgd = efi_pgd; efi_mm.pgd = efi_pgd;
mm_init_cpumask(&efi_mm); mm_init_cpumask(&efi_mm);
init_new_context(NULL, &efi_mm); init_new_context(NULL, &efi_mm);
return 0; return 0;
free_p4d:
if (pgtable_l5_enabled())
free_page((unsigned long)pgd_page_vaddr(*pgd));
free_pgd:
free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER);
fail:
return -ENOMEM;
} }
/* /*

View File

@ -70,7 +70,7 @@
*/ */
#define VMALLOC_START (XCHAL_KSEG_CACHED_VADDR - 0x10000000) #define VMALLOC_START (XCHAL_KSEG_CACHED_VADDR - 0x10000000)
#define VMALLOC_END (VMALLOC_START + 0x07FEFFFF) #define VMALLOC_END (VMALLOC_START + 0x07FEFFFF)
#define TLBTEMP_BASE_1 (VMALLOC_END + 1) #define TLBTEMP_BASE_1 (VMALLOC_START + 0x08000000)
#define TLBTEMP_BASE_2 (TLBTEMP_BASE_1 + DCACHE_WAY_SIZE) #define TLBTEMP_BASE_2 (TLBTEMP_BASE_1 + DCACHE_WAY_SIZE)
#if 2 * DCACHE_WAY_SIZE > ICACHE_WAY_SIZE #if 2 * DCACHE_WAY_SIZE > ICACHE_WAY_SIZE
#define TLBTEMP_SIZE (2 * DCACHE_WAY_SIZE) #define TLBTEMP_SIZE (2 * DCACHE_WAY_SIZE)

View File

@ -71,8 +71,10 @@ static inline void kmap_invalidate_coherent(struct page *page,
kvaddr = TLBTEMP_BASE_1 + kvaddr = TLBTEMP_BASE_1 +
(page_to_phys(page) & DCACHE_ALIAS_MASK); (page_to_phys(page) & DCACHE_ALIAS_MASK);
preempt_disable();
__invalidate_dcache_page_alias(kvaddr, __invalidate_dcache_page_alias(kvaddr,
page_to_phys(page)); page_to_phys(page));
preempt_enable();
} }
} }
} }
@ -157,6 +159,7 @@ void flush_dcache_page(struct page *page)
if (!alias && !mapping) if (!alias && !mapping)
return; return;
preempt_disable();
virt = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK); virt = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK);
__flush_invalidate_dcache_page_alias(virt, phys); __flush_invalidate_dcache_page_alias(virt, phys);
@ -167,6 +170,7 @@ void flush_dcache_page(struct page *page)
if (mapping) if (mapping)
__invalidate_icache_page_alias(virt, phys); __invalidate_icache_page_alias(virt, phys);
preempt_enable();
} }
/* There shouldn't be an entry in the cache for this page anymore. */ /* There shouldn't be an entry in the cache for this page anymore. */
@ -200,8 +204,10 @@ void local_flush_cache_page(struct vm_area_struct *vma, unsigned long address,
unsigned long phys = page_to_phys(pfn_to_page(pfn)); unsigned long phys = page_to_phys(pfn_to_page(pfn));
unsigned long virt = TLBTEMP_BASE_1 + (address & DCACHE_ALIAS_MASK); unsigned long virt = TLBTEMP_BASE_1 + (address & DCACHE_ALIAS_MASK);
preempt_disable();
__flush_invalidate_dcache_page_alias(virt, phys); __flush_invalidate_dcache_page_alias(virt, phys);
__invalidate_icache_page_alias(virt, phys); __invalidate_icache_page_alias(virt, phys);
preempt_enable();
} }
EXPORT_SYMBOL(local_flush_cache_page); EXPORT_SYMBOL(local_flush_cache_page);
@ -228,11 +234,13 @@ update_mmu_cache(struct vm_area_struct * vma, unsigned long addr, pte_t *ptep)
unsigned long phys = page_to_phys(page); unsigned long phys = page_to_phys(page);
unsigned long tmp; unsigned long tmp;
preempt_disable();
tmp = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK); tmp = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK);
__flush_invalidate_dcache_page_alias(tmp, phys); __flush_invalidate_dcache_page_alias(tmp, phys);
tmp = TLBTEMP_BASE_1 + (addr & DCACHE_ALIAS_MASK); tmp = TLBTEMP_BASE_1 + (addr & DCACHE_ALIAS_MASK);
__flush_invalidate_dcache_page_alias(tmp, phys); __flush_invalidate_dcache_page_alias(tmp, phys);
__invalidate_icache_page_alias(tmp, phys); __invalidate_icache_page_alias(tmp, phys);
preempt_enable();
clear_bit(PG_arch_1, &page->flags); clear_bit(PG_arch_1, &page->flags);
} }
@ -266,7 +274,9 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
if (alias) { if (alias) {
unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK); unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
preempt_disable();
__flush_invalidate_dcache_page_alias(t, phys); __flush_invalidate_dcache_page_alias(t, phys);
preempt_enable();
} }
/* Copy data */ /* Copy data */
@ -281,9 +291,11 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
if (alias) { if (alias) {
unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK); unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
preempt_disable();
__flush_invalidate_dcache_range((unsigned long) dst, len); __flush_invalidate_dcache_range((unsigned long) dst, len);
if ((vma->vm_flags & VM_EXEC) != 0) if ((vma->vm_flags & VM_EXEC) != 0)
__invalidate_icache_page_alias(t, phys); __invalidate_icache_page_alias(t, phys);
preempt_enable();
} else if ((vma->vm_flags & VM_EXEC) != 0) { } else if ((vma->vm_flags & VM_EXEC) != 0) {
__flush_dcache_range((unsigned long)dst,len); __flush_dcache_range((unsigned long)dst,len);
@ -305,7 +317,9 @@ extern void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
if (alias) { if (alias) {
unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK); unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
preempt_disable();
__flush_invalidate_dcache_page_alias(t, phys); __flush_invalidate_dcache_page_alias(t, phys);
preempt_enable();
} }
memcpy(dst, src, len); memcpy(dst, src, len);

View File

@ -85,7 +85,18 @@ static const struct dmi_system_id lid_blacklst[] = {
*/ */
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
DMI_MATCH(DMI_PRODUCT_NAME, "E2215T MD60198"), DMI_MATCH(DMI_PRODUCT_NAME, "E2215T"),
},
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
},
{
/*
* Medion Akoya E2228T, notification of the LID device only
* happens on close, not on open and _LID always returns closed.
*/
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
DMI_MATCH(DMI_PRODUCT_NAME, "E2228T"),
}, },
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN, .driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
}, },

View File

@ -1706,6 +1706,8 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb)
if (push_scqe(card, vc, scq, &scqe, skb) != 0) { if (push_scqe(card, vc, scq, &scqe, skb) != 0) {
atomic_inc(&vcc->stats->tx_err); atomic_inc(&vcc->stats->tx_err);
dma_unmap_single(&card->pcidev->dev, NS_PRV_DMA(skb), skb->len,
DMA_TO_DEVICE);
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
return -EIO; return -EIO;
} }

View File

@ -299,8 +299,8 @@ irq_source_info_dcn20[DAL_IRQ_SOURCES_NUMBER] = {
pflip_int_entry(1), pflip_int_entry(1),
pflip_int_entry(2), pflip_int_entry(2),
pflip_int_entry(3), pflip_int_entry(3),
[DC_IRQ_SOURCE_PFLIP5] = dummy_irq_entry(), pflip_int_entry(4),
[DC_IRQ_SOURCE_PFLIP6] = dummy_irq_entry(), pflip_int_entry(5),
[DC_IRQ_SOURCE_PFLIP_UNDERLAY0] = dummy_irq_entry(), [DC_IRQ_SOURCE_PFLIP_UNDERLAY0] = dummy_irq_entry(),
gpio_pad_int_entry(0), gpio_pad_int_entry(0),
gpio_pad_int_entry(1), gpio_pad_int_entry(1),

View File

@ -11893,10 +11893,11 @@ compute_sink_pipe_bpp(const struct drm_connector_state *conn_state,
case 10 ... 11: case 10 ... 11:
bpp = 10 * 3; bpp = 10 * 3;
break; break;
case 12: case 12 ... 16:
bpp = 12 * 3; bpp = 12 * 3;
break; break;
default: default:
MISSING_CASE(conn_state->max_bpc);
return -EINVAL; return -EINVAL;
} }

View File

@ -209,6 +209,7 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master,
phy_node = of_parse_phandle(dev->of_node, "phys", 0); phy_node = of_parse_phandle(dev->of_node, "phys", 0);
if (!phy_node) { if (!phy_node) {
dev_err(dev, "Can't found PHY phandle\n"); dev_err(dev, "Can't found PHY phandle\n");
ret = -EINVAL;
goto err_disable_clk_tmds; goto err_disable_clk_tmds;
} }

View File

@ -328,7 +328,7 @@ static const char mse_bluetooth_descriptor[] = {
0x25, 0x01, /* LOGICAL_MAX (1) */ 0x25, 0x01, /* LOGICAL_MAX (1) */
0x75, 0x01, /* REPORT_SIZE (1) */ 0x75, 0x01, /* REPORT_SIZE (1) */
0x95, 0x04, /* REPORT_COUNT (4) */ 0x95, 0x04, /* REPORT_COUNT (4) */
0x81, 0x06, /* INPUT */ 0x81, 0x02, /* INPUT (Data,Var,Abs) */
0xC0, /* END_COLLECTION */ 0xC0, /* END_COLLECTION */
0xC0, /* END_COLLECTION */ 0xC0, /* END_COLLECTION */
}; };
@ -866,11 +866,24 @@ static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
schedule_work(&djrcv_dev->work); schedule_work(&djrcv_dev->work);
} }
/*
* Some quad/bluetooth keyboards have a builtin touchpad in this case we see
* only 1 paired device with a device_type of REPORT_TYPE_KEYBOARD. For the
* touchpad to work we must also forward mouse input reports to the dj_hiddev
* created for the keyboard (instead of forwarding them to a second paired
* device with a device_type of REPORT_TYPE_MOUSE as we normally would).
*/
static const u16 kbd_builtin_touchpad_ids[] = {
0xb309, /* Dinovo Edge */
0xb30c, /* Dinovo Mini */
};
static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev, static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
struct hidpp_event *hidpp_report, struct hidpp_event *hidpp_report,
struct dj_workitem *workitem) struct dj_workitem *workitem)
{ {
struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
int i, id;
workitem->type = WORKITEM_TYPE_PAIRED; workitem->type = WORKITEM_TYPE_PAIRED;
workitem->device_type = hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] & workitem->device_type = hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] &
@ -882,6 +895,13 @@ static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA | workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
POWER_KEYS | MEDIA_CENTER | POWER_KEYS | MEDIA_CENTER |
HIDPP; HIDPP;
id = (workitem->quad_id_msb << 8) | workitem->quad_id_lsb;
for (i = 0; i < ARRAY_SIZE(kbd_builtin_touchpad_ids); i++) {
if (id == kbd_builtin_touchpad_ids[i]) {
workitem->reports_supported |= STD_MOUSE;
break;
}
}
break; break;
case REPORT_TYPE_MOUSE: case REPORT_TYPE_MOUSE:
workitem->reports_supported |= STD_MOUSE | HIDPP; workitem->reports_supported |= STD_MOUSE | HIDPP;

View File

@ -88,6 +88,8 @@ MODULE_PARM_DESC(disable_tap_to_click,
#define HIDPP_CAPABILITY_BATTERY_MILEAGE BIT(2) #define HIDPP_CAPABILITY_BATTERY_MILEAGE BIT(2)
#define HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS BIT(3) #define HIDPP_CAPABILITY_BATTERY_LEVEL_STATUS BIT(3)
#define lg_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, EV_KEY, (c))
/* /*
* There are two hidpp protocols in use, the first version hidpp10 is known * There are two hidpp protocols in use, the first version hidpp10 is known
* as register access protocol or RAP, the second version hidpp20 is known as * as register access protocol or RAP, the second version hidpp20 is known as
@ -2768,6 +2770,26 @@ static int g920_get_config(struct hidpp_device *hidpp,
return g920_ff_set_autocenter(hidpp, data); return g920_ff_set_autocenter(hidpp, data);
} }
/* -------------------------------------------------------------------------- */
/* Logitech Dinovo Mini keyboard with builtin touchpad */
/* -------------------------------------------------------------------------- */
#define DINOVO_MINI_PRODUCT_ID 0xb30c
static int lg_dinovo_input_mapping(struct hid_device *hdev, struct hid_input *hi,
struct hid_field *field, struct hid_usage *usage,
unsigned long **bit, int *max)
{
if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
return 0;
switch (usage->hid & HID_USAGE) {
case 0x00d: lg_map_key_clear(KEY_MEDIA); break;
default:
return 0;
}
return 1;
}
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/* HID++1.0 devices which use HID++ reports for their wheels */ /* HID++1.0 devices which use HID++ reports for their wheels */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
@ -3003,6 +3025,9 @@ static int hidpp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
field->application != HID_GD_MOUSE) field->application != HID_GD_MOUSE)
return m560_input_mapping(hdev, hi, field, usage, bit, max); return m560_input_mapping(hdev, hi, field, usage, bit, max);
if (hdev->product == DINOVO_MINI_PRODUCT_ID)
return lg_dinovo_input_mapping(hdev, hi, field, usage, bit, max);
return 0; return 0;
} }
@ -3741,6 +3766,7 @@ static const struct hid_device_id hidpp_devices[] = {
LDJ_DEVICE(0x405e), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, LDJ_DEVICE(0x405e), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
{ /* Mouse Logitech MX Anywhere 2 */ { /* Mouse Logitech MX Anywhere 2 */
LDJ_DEVICE(0x404a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, LDJ_DEVICE(0x404a), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
{ LDJ_DEVICE(0x4072), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
{ LDJ_DEVICE(0xb013), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, { LDJ_DEVICE(0xb013), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
{ LDJ_DEVICE(0xb018), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, { LDJ_DEVICE(0xb018), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },
{ LDJ_DEVICE(0xb01f), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 }, { LDJ_DEVICE(0xb01f), .driver_data = HIDPP_QUIRK_HI_RES_SCROLL_X2121 },

View File

@ -251,9 +251,13 @@ int hv_synic_cleanup(unsigned int cpu)
/* /*
* Hyper-V does not provide a way to change the connect CPU once * Hyper-V does not provide a way to change the connect CPU once
* it is set; we must prevent the connect CPU from going offline. * it is set; we must prevent the connect CPU from going offline
* while the VM is running normally. But in the panic or kexec()
* path where the vmbus is already disconnected, the CPU must be
* allowed to shut down.
*/ */
if (cpu == VMBUS_CONNECT_CPU) if (cpu == VMBUS_CONNECT_CPU &&
vmbus_connection.conn_state == CONNECTED)
return -EBUSY; return -EBUSY;
/* /*

View File

@ -54,16 +54,18 @@ static irqreturn_t pulse_handler(int irq, void *dev_id)
static void sample_timer(struct timer_list *t) static void sample_timer(struct timer_list *t)
{ {
struct pwm_fan_ctx *ctx = from_timer(ctx, t, rpm_timer); struct pwm_fan_ctx *ctx = from_timer(ctx, t, rpm_timer);
unsigned int delta = ktime_ms_delta(ktime_get(), ctx->sample_start);
int pulses; int pulses;
u64 tmp;
pulses = atomic_read(&ctx->pulses); if (delta) {
atomic_sub(pulses, &ctx->pulses); pulses = atomic_read(&ctx->pulses);
tmp = (u64)pulses * ktime_ms_delta(ktime_get(), ctx->sample_start) * 60; atomic_sub(pulses, &ctx->pulses);
do_div(tmp, ctx->pulses_per_revolution * 1000); ctx->rpm = (unsigned int)(pulses * 1000 * 60) /
ctx->rpm = tmp; (ctx->pulses_per_revolution * delta);
ctx->sample_start = ktime_get();
}
ctx->sample_start = ktime_get();
mod_timer(&ctx->rpm_timer, jiffies + HZ); mod_timer(&ctx->rpm_timer, jiffies + HZ);
} }

View File

@ -126,6 +126,12 @@ enum kx_chipset {
KX_MAX_CHIPS /* this must be last */ KX_MAX_CHIPS /* this must be last */
}; };
enum kx_acpi_type {
ACPI_GENERIC,
ACPI_SMO8500,
ACPI_KIOX010A,
};
struct kxcjk1013_data { struct kxcjk1013_data {
struct i2c_client *client; struct i2c_client *client;
struct iio_trigger *dready_trig; struct iio_trigger *dready_trig;
@ -142,7 +148,7 @@ struct kxcjk1013_data {
bool motion_trigger_on; bool motion_trigger_on;
int64_t timestamp; int64_t timestamp;
enum kx_chipset chipset; enum kx_chipset chipset;
bool is_smo8500_device; enum kx_acpi_type acpi_type;
}; };
enum kxcjk1013_axis { enum kxcjk1013_axis {
@ -269,6 +275,32 @@ static const struct {
{19163, 1, 0}, {19163, 1, 0},
{38326, 0, 1} }; {38326, 0, 1} };
#ifdef CONFIG_ACPI
enum kiox010a_fn_index {
KIOX010A_SET_LAPTOP_MODE = 1,
KIOX010A_SET_TABLET_MODE = 2,
};
static int kiox010a_dsm(struct device *dev, int fn_index)
{
acpi_handle handle = ACPI_HANDLE(dev);
guid_t kiox010a_dsm_guid;
union acpi_object *obj;
if (!handle)
return -ENODEV;
guid_parse("1f339696-d475-4e26-8cad-2e9f8e6d7a91", &kiox010a_dsm_guid);
obj = acpi_evaluate_dsm(handle, &kiox010a_dsm_guid, 1, fn_index, NULL);
if (!obj)
return -EIO;
ACPI_FREE(obj);
return 0;
}
#endif
static int kxcjk1013_set_mode(struct kxcjk1013_data *data, static int kxcjk1013_set_mode(struct kxcjk1013_data *data,
enum kxcjk1013_mode mode) enum kxcjk1013_mode mode)
{ {
@ -346,6 +378,13 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data)
{ {
int ret; int ret;
#ifdef CONFIG_ACPI
if (data->acpi_type == ACPI_KIOX010A) {
/* Make sure the kbd and touchpad on 2-in-1s using 2 KXCJ91008-s work */
kiox010a_dsm(&data->client->dev, KIOX010A_SET_LAPTOP_MODE);
}
#endif
ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_WHO_AM_I); ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_WHO_AM_I);
if (ret < 0) { if (ret < 0) {
dev_err(&data->client->dev, "Error reading who_am_i\n"); dev_err(&data->client->dev, "Error reading who_am_i\n");
@ -1233,7 +1272,7 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private)
static const char *kxcjk1013_match_acpi_device(struct device *dev, static const char *kxcjk1013_match_acpi_device(struct device *dev,
enum kx_chipset *chipset, enum kx_chipset *chipset,
bool *is_smo8500_device) enum kx_acpi_type *acpi_type)
{ {
const struct acpi_device_id *id; const struct acpi_device_id *id;
@ -1242,7 +1281,9 @@ static const char *kxcjk1013_match_acpi_device(struct device *dev,
return NULL; return NULL;
if (strcmp(id->id, "SMO8500") == 0) if (strcmp(id->id, "SMO8500") == 0)
*is_smo8500_device = true; *acpi_type = ACPI_SMO8500;
else if (strcmp(id->id, "KIOX010A") == 0)
*acpi_type = ACPI_KIOX010A;
*chipset = (enum kx_chipset)id->driver_data; *chipset = (enum kx_chipset)id->driver_data;
@ -1278,7 +1319,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
} else if (ACPI_HANDLE(&client->dev)) { } else if (ACPI_HANDLE(&client->dev)) {
name = kxcjk1013_match_acpi_device(&client->dev, name = kxcjk1013_match_acpi_device(&client->dev,
&data->chipset, &data->chipset,
&data->is_smo8500_device); &data->acpi_type);
} else } else
return -ENODEV; return -ENODEV;
@ -1296,7 +1337,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &kxcjk1013_info; indio_dev->info = &kxcjk1013_info;
if (client->irq > 0 && !data->is_smo8500_device) { if (client->irq > 0 && data->acpi_type != ACPI_SMO8500) {
ret = devm_request_threaded_irq(&client->dev, client->irq, ret = devm_request_threaded_irq(&client->dev, client->irq,
kxcjk1013_data_rdy_trig_poll, kxcjk1013_data_rdy_trig_poll,
kxcjk1013_event_handler, kxcjk1013_event_handler,

View File

@ -9,9 +9,9 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/mod_devicetable.h>
#include <linux/of_device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/iopoll.h> #include <linux/iopoll.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
@ -279,6 +279,8 @@ static int mt6577_auxadc_probe(struct platform_device *pdev)
goto err_disable_clk; goto err_disable_clk;
} }
adc_dev->dev_comp = device_get_match_data(&pdev->dev);
mutex_init(&adc_dev->lock); mutex_init(&adc_dev->lock);
mt6577_auxadc_mod_reg(adc_dev->reg_base + MT6577_AUXADC_MISC, mt6577_auxadc_mod_reg(adc_dev->reg_base + MT6577_AUXADC_MISC,

View File

@ -485,6 +485,7 @@ config VCNL4000
config VCNL4035 config VCNL4035
tristate "VCNL4035 combined ALS and proximity sensor" tristate "VCNL4035 combined ALS and proximity sensor"
select IIO_BUFFER
select IIO_TRIGGERED_BUFFER select IIO_TRIGGERED_BUFFER
select REGMAP_I2C select REGMAP_I2C
depends on I2C depends on I2C

View File

@ -80,6 +80,9 @@ config INFINIBAND_ADDR_TRANS_CONFIGFS
This allows the user to config the default GID type that the CM This allows the user to config the default GID type that the CM
uses for each device, when initiaing new connections. uses for each device, when initiaing new connections.
config INFINIBAND_VIRT_DMA
def_bool !HIGHMEM
if INFINIBAND_USER_ACCESS || !INFINIBAND_USER_ACCESS if INFINIBAND_USER_ACCESS || !INFINIBAND_USER_ACCESS
source "drivers/infiniband/hw/mthca/Kconfig" source "drivers/infiniband/hw/mthca/Kconfig"
source "drivers/infiniband/hw/qib/Kconfig" source "drivers/infiniband/hw/qib/Kconfig"

View File

@ -266,7 +266,7 @@ static int pvrdma_register_device(struct pvrdma_dev *dev)
} }
ret = ib_device_set_netdev(&dev->ib_dev, dev->netdev, 1); ret = ib_device_set_netdev(&dev->ib_dev, dev->netdev, 1);
if (ret) if (ret)
return ret; goto err_srq_free;
spin_lock_init(&dev->srq_tbl_lock); spin_lock_init(&dev->srq_tbl_lock);
rdma_set_device_sysfs_group(&dev->ib_dev, &pvrdma_attr_group); rdma_set_device_sysfs_group(&dev->ib_dev, &pvrdma_attr_group);

View File

@ -1,7 +1,8 @@
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
config INFINIBAND_RDMAVT config INFINIBAND_RDMAVT
tristate "RDMA verbs transport library" tristate "RDMA verbs transport library"
depends on X86_64 && ARCH_DMA_ADDR_T_64BIT depends on INFINIBAND_VIRT_DMA
depends on X86_64
depends on PCI depends on PCI
select DMA_VIRT_OPS select DMA_VIRT_OPS
---help--- ---help---

View File

@ -2,7 +2,7 @@
config RDMA_RXE config RDMA_RXE
tristate "Software RDMA over Ethernet (RoCE) driver" tristate "Software RDMA over Ethernet (RoCE) driver"
depends on INET && PCI && INFINIBAND depends on INET && PCI && INFINIBAND
depends on !64BIT || ARCH_DMA_ADDR_T_64BIT depends on INFINIBAND_VIRT_DMA
select NET_UDP_TUNNEL select NET_UDP_TUNNEL
select CRYPTO_CRC32 select CRYPTO_CRC32
select DMA_VIRT_OPS select DMA_VIRT_OPS

View File

@ -1,6 +1,7 @@
config RDMA_SIW config RDMA_SIW
tristate "Software RDMA over TCP/IP (iWARP) driver" tristate "Software RDMA over TCP/IP (iWARP) driver"
depends on INET && INFINIBAND && LIBCRC32C depends on INET && INFINIBAND && LIBCRC32C
depends on INFINIBAND_VIRT_DMA
select DMA_VIRT_OPS select DMA_VIRT_OPS
help help
This driver implements the iWARP RDMA transport over This driver implements the iWARP RDMA transport over

View File

@ -696,7 +696,7 @@ struct adxl34x *adxl34x_probe(struct device *dev, int irq,
struct input_dev *input_dev; struct input_dev *input_dev;
const struct adxl34x_platform_data *pdata; const struct adxl34x_platform_data *pdata;
int err, range, i; int err, range, i;
unsigned char revid; int revid;
if (!irq) { if (!irq) {
dev_err(dev, "no IRQ?\n"); dev_err(dev, "no IRQ?\n");

View File

@ -109,6 +109,7 @@ config TOUCHSCREEN_AD7879_SPI
config TOUCHSCREEN_ADC config TOUCHSCREEN_ADC
tristate "Generic ADC based resistive touchscreen" tristate "Generic ADC based resistive touchscreen"
depends on IIO depends on IIO
select IIO_BUFFER
select IIO_BUFFER_CB select IIO_BUFFER_CB
help help
Say Y here if you want to use the generic ADC Say Y here if you want to use the generic ADC

View File

@ -179,7 +179,7 @@ static int rwbf_quirk;
* (used when kernel is launched w/ TXT) * (used when kernel is launched w/ TXT)
*/ */
static int force_on = 0; static int force_on = 0;
int intel_iommu_tboot_noforce; static int intel_iommu_tboot_noforce;
static int no_platform_optin; static int no_platform_optin;
#define ROOT_ENTRY_NR (VTD_PAGE_SIZE/sizeof(struct root_entry)) #define ROOT_ENTRY_NR (VTD_PAGE_SIZE/sizeof(struct root_entry))
@ -4927,7 +4927,8 @@ int __init intel_iommu_init(void)
* Intel IOMMU is required for a TXT/tboot launch or platform * Intel IOMMU is required for a TXT/tboot launch or platform
* opt in, so enforce that. * opt in, so enforce that.
*/ */
force_on = tboot_force_iommu() || platform_optin_force_iommu(); force_on = (!intel_iommu_tboot_noforce && tboot_force_iommu()) ||
platform_optin_force_iommu();
if (iommu_init_mempool()) { if (iommu_init_mempool()) {
if (force_on) if (force_on)

View File

@ -669,6 +669,15 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
} }
} }
static void sdhci_intel_set_uhs_signaling(struct sdhci_host *host,
unsigned int timing)
{
/* Set UHS timing to SDR25 for High Speed mode */
if (timing == MMC_TIMING_MMC_HS || timing == MMC_TIMING_SD_HS)
timing = MMC_TIMING_UHS_SDR25;
sdhci_set_uhs_signaling(host, timing);
}
#define INTEL_HS400_ES_REG 0x78 #define INTEL_HS400_ES_REG 0x78
#define INTEL_HS400_ES_BIT BIT(0) #define INTEL_HS400_ES_BIT BIT(0)
@ -725,7 +734,7 @@ static const struct sdhci_ops sdhci_intel_byt_ops = {
.enable_dma = sdhci_pci_enable_dma, .enable_dma = sdhci_pci_enable_dma,
.set_bus_width = sdhci_set_bus_width, .set_bus_width = sdhci_set_bus_width,
.reset = sdhci_reset, .reset = sdhci_reset,
.set_uhs_signaling = sdhci_set_uhs_signaling, .set_uhs_signaling = sdhci_intel_set_uhs_signaling,
.hw_reset = sdhci_pci_hw_reset, .hw_reset = sdhci_pci_hw_reset,
}; };
@ -735,7 +744,7 @@ static const struct sdhci_ops sdhci_intel_glk_ops = {
.enable_dma = sdhci_pci_enable_dma, .enable_dma = sdhci_pci_enable_dma,
.set_bus_width = sdhci_set_bus_width, .set_bus_width = sdhci_set_bus_width,
.reset = sdhci_cqhci_reset, .reset = sdhci_cqhci_reset,
.set_uhs_signaling = sdhci_set_uhs_signaling, .set_uhs_signaling = sdhci_intel_set_uhs_signaling,
.hw_reset = sdhci_pci_hw_reset, .hw_reset = sdhci_pci_hw_reset,
.irq = sdhci_cqhci_irq, .irq = sdhci_cqhci_irq,
}; };

View File

@ -567,7 +567,7 @@ static void can_restart(struct net_device *dev)
} }
cf->can_id |= CAN_ERR_RESTARTED; cf->can_id |= CAN_ERR_RESTARTED;
netif_rx(skb); netif_rx_ni(skb);
stats->rx_packets++; stats->rx_packets++;
stats->rx_bytes += cf->can_dlc; stats->rx_bytes += cf->can_dlc;

View File

@ -754,8 +754,10 @@ static int flexcan_get_berr_counter(const struct net_device *dev,
int err; int err;
err = pm_runtime_get_sync(priv->dev); err = pm_runtime_get_sync(priv->dev);
if (err < 0) if (err < 0) {
pm_runtime_put_noidle(priv->dev);
return err; return err;
}
err = __flexcan_get_berr_counter(dev, bec); err = __flexcan_get_berr_counter(dev, bec);
@ -1602,14 +1604,10 @@ static int flexcan_chip_start(struct net_device *dev)
} }
err = flexcan_transceiver_enable(priv);
if (err)
goto out_chip_disable;
/* synchronize with the can bus */ /* synchronize with the can bus */
err = flexcan_chip_unfreeze(priv); err = flexcan_chip_unfreeze(priv);
if (err) if (err)
goto out_transceiver_disable; goto out_chip_disable;
priv->can.state = CAN_STATE_ERROR_ACTIVE; priv->can.state = CAN_STATE_ERROR_ACTIVE;
@ -1627,8 +1625,6 @@ static int flexcan_chip_start(struct net_device *dev)
return 0; return 0;
out_transceiver_disable:
flexcan_transceiver_disable(priv);
out_chip_disable: out_chip_disable:
flexcan_chip_disable(priv); flexcan_chip_disable(priv);
return err; return err;
@ -1658,7 +1654,6 @@ static int __flexcan_chip_stop(struct net_device *dev, bool disable_on_error)
priv->write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL, priv->write(priv->reg_ctrl_default & ~FLEXCAN_CTRL_ERR_ALL,
&regs->ctrl); &regs->ctrl);
flexcan_transceiver_disable(priv);
priv->can.state = CAN_STATE_STOPPED; priv->can.state = CAN_STATE_STOPPED;
return 0; return 0;
@ -1691,21 +1686,28 @@ static int flexcan_open(struct net_device *dev)
} }
err = pm_runtime_get_sync(priv->dev); err = pm_runtime_get_sync(priv->dev);
if (err < 0) if (err < 0) {
pm_runtime_put_noidle(priv->dev);
return err; return err;
}
err = open_candev(dev); err = open_candev(dev);
if (err) if (err)
goto out_runtime_put; goto out_runtime_put;
err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev); err = flexcan_transceiver_enable(priv);
if (err) if (err)
goto out_close; goto out_close;
err = request_irq(dev->irq, flexcan_irq, IRQF_SHARED, dev->name, dev);
if (err)
goto out_transceiver_disable;
if (priv->can.ctrlmode & CAN_CTRLMODE_FD) if (priv->can.ctrlmode & CAN_CTRLMODE_FD)
priv->mb_size = sizeof(struct flexcan_mb) + CANFD_MAX_DLEN; priv->mb_size = sizeof(struct flexcan_mb) + CANFD_MAX_DLEN;
else else
priv->mb_size = sizeof(struct flexcan_mb) + CAN_MAX_DLEN; priv->mb_size = sizeof(struct flexcan_mb) + CAN_MAX_DLEN;
priv->mb_count = (sizeof(priv->regs->mb[0]) / priv->mb_size) + priv->mb_count = (sizeof(priv->regs->mb[0]) / priv->mb_size) +
(sizeof(priv->regs->mb[1]) / priv->mb_size); (sizeof(priv->regs->mb[1]) / priv->mb_size);
@ -1753,6 +1755,8 @@ static int flexcan_open(struct net_device *dev)
can_rx_offload_del(&priv->offload); can_rx_offload_del(&priv->offload);
out_free_irq: out_free_irq:
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
out_transceiver_disable:
flexcan_transceiver_disable(priv);
out_close: out_close:
close_candev(dev); close_candev(dev);
out_runtime_put: out_runtime_put:
@ -1771,6 +1775,7 @@ static int flexcan_close(struct net_device *dev)
can_rx_offload_del(&priv->offload); can_rx_offload_del(&priv->offload);
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
flexcan_transceiver_disable(priv);
close_candev(dev); close_candev(dev);
pm_runtime_put(priv->dev); pm_runtime_put(priv->dev);

View File

@ -287,12 +287,12 @@ struct kvaser_pciefd_tx_packet {
static const struct can_bittiming_const kvaser_pciefd_bittiming_const = { static const struct can_bittiming_const kvaser_pciefd_bittiming_const = {
.name = KVASER_PCIEFD_DRV_NAME, .name = KVASER_PCIEFD_DRV_NAME,
.tseg1_min = 1, .tseg1_min = 1,
.tseg1_max = 255, .tseg1_max = 512,
.tseg2_min = 1, .tseg2_min = 1,
.tseg2_max = 32, .tseg2_max = 32,
.sjw_max = 16, .sjw_max = 16,
.brp_min = 1, .brp_min = 1,
.brp_max = 4096, .brp_max = 8192,
.brp_inc = 1, .brp_inc = 1,
}; };

View File

@ -16,7 +16,8 @@ config CAN_M_CAN_PLATFORM
config CAN_M_CAN_TCAN4X5X config CAN_M_CAN_TCAN4X5X
depends on CAN_M_CAN depends on CAN_M_CAN
depends on REGMAP_SPI depends on SPI
select REGMAP_SPI
tristate "TCAN4X5X M_CAN device" tristate "TCAN4X5X M_CAN device"
---help--- ---help---
Say Y here if you want support for Texas Instruments TCAN4x5x Say Y here if you want support for Texas Instruments TCAN4x5x

View File

@ -664,7 +664,7 @@ static int m_can_handle_state_change(struct net_device *dev,
unsigned int ecr; unsigned int ecr;
switch (new_state) { switch (new_state) {
case CAN_STATE_ERROR_ACTIVE: case CAN_STATE_ERROR_WARNING:
/* error warning state */ /* error warning state */
cdev->can.can_stats.error_warning++; cdev->can.can_stats.error_warning++;
cdev->can.state = CAN_STATE_ERROR_WARNING; cdev->can.state = CAN_STATE_ERROR_WARNING;
@ -693,7 +693,7 @@ static int m_can_handle_state_change(struct net_device *dev,
__m_can_get_berr_counter(dev, &bec); __m_can_get_berr_counter(dev, &bec);
switch (new_state) { switch (new_state) {
case CAN_STATE_ERROR_ACTIVE: case CAN_STATE_ERROR_WARNING:
/* error warning state */ /* error warning state */
cf->can_id |= CAN_ERR_CRTL; cf->can_id |= CAN_ERR_CRTL;
cf->data[1] = (bec.txerr > bec.rxerr) ? cf->data[1] = (bec.txerr > bec.rxerr) ?
@ -913,6 +913,8 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
struct net_device_stats *stats = &dev->stats; struct net_device_stats *stats = &dev->stats;
u32 ir; u32 ir;
if (pm_runtime_suspended(cdev->dev))
return IRQ_NONE;
ir = m_can_read(cdev, M_CAN_IR); ir = m_can_read(cdev, M_CAN_IR);
if (!ir) if (!ir)
return IRQ_NONE; return IRQ_NONE;
@ -1366,6 +1368,9 @@ static void m_can_stop(struct net_device *dev)
/* disable all interrupts */ /* disable all interrupts */
m_can_disable_all_interrupts(cdev); m_can_disable_all_interrupts(cdev);
/* Set init mode to disengage from the network */
m_can_config_endisable(cdev, true);
/* set the state as STOPPED */ /* set the state as STOPPED */
cdev->can.state = CAN_STATE_STOPPED; cdev->can.state = CAN_STATE_STOPPED;
} }
@ -1764,6 +1769,12 @@ out:
} }
EXPORT_SYMBOL_GPL(m_can_class_allocate_dev); EXPORT_SYMBOL_GPL(m_can_class_allocate_dev);
void m_can_class_free_dev(struct net_device *net)
{
free_candev(net);
}
EXPORT_SYMBOL_GPL(m_can_class_free_dev);
int m_can_class_register(struct m_can_classdev *m_can_dev) int m_can_class_register(struct m_can_classdev *m_can_dev)
{ {
int ret; int ret;

View File

@ -99,6 +99,7 @@ struct m_can_classdev {
}; };
struct m_can_classdev *m_can_class_allocate_dev(struct device *dev); struct m_can_classdev *m_can_class_allocate_dev(struct device *dev);
void m_can_class_free_dev(struct net_device *net);
int m_can_class_register(struct m_can_classdev *cdev); int m_can_class_register(struct m_can_classdev *cdev);
void m_can_class_unregister(struct m_can_classdev *cdev); void m_can_class_unregister(struct m_can_classdev *cdev);
int m_can_class_get_clocks(struct m_can_classdev *cdev); int m_can_class_get_clocks(struct m_can_classdev *cdev);

View File

@ -467,6 +467,10 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
priv->regmap = devm_regmap_init(&spi->dev, &tcan4x5x_bus, priv->regmap = devm_regmap_init(&spi->dev, &tcan4x5x_bus,
&spi->dev, &tcan4x5x_regmap); &spi->dev, &tcan4x5x_regmap);
if (IS_ERR(priv->regmap)) {
ret = PTR_ERR(priv->regmap);
goto out_clk;
}
tcan4x5x_power_enable(priv->power, 1); tcan4x5x_power_enable(priv->power, 1);
@ -497,10 +501,10 @@ static int tcan4x5x_can_remove(struct spi_device *spi)
{ {
struct tcan4x5x_priv *priv = spi_get_drvdata(spi); struct tcan4x5x_priv *priv = spi_get_drvdata(spi);
tcan4x5x_power_enable(priv->power, 0);
m_can_class_unregister(priv->mcan_dev); m_can_class_unregister(priv->mcan_dev);
tcan4x5x_power_enable(priv->power, 0);
return 0; return 0;
} }

View File

@ -873,7 +873,8 @@ static int ti_hecc_probe(struct platform_device *pdev)
priv->base = devm_ioremap_resource(&pdev->dev, res); priv->base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(priv->base)) { if (IS_ERR(priv->base)) {
dev_err(&pdev->dev, "hecc ioremap failed\n"); dev_err(&pdev->dev, "hecc ioremap failed\n");
return PTR_ERR(priv->base); err = PTR_ERR(priv->base);
goto probe_exit_candev;
} }
/* handle hecc-ram memory */ /* handle hecc-ram memory */
@ -886,7 +887,8 @@ static int ti_hecc_probe(struct platform_device *pdev)
priv->hecc_ram = devm_ioremap_resource(&pdev->dev, res); priv->hecc_ram = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(priv->hecc_ram)) { if (IS_ERR(priv->hecc_ram)) {
dev_err(&pdev->dev, "hecc-ram ioremap failed\n"); dev_err(&pdev->dev, "hecc-ram ioremap failed\n");
return PTR_ERR(priv->hecc_ram); err = PTR_ERR(priv->hecc_ram);
goto probe_exit_candev;
} }
/* handle mbx memory */ /* handle mbx memory */
@ -899,13 +901,14 @@ static int ti_hecc_probe(struct platform_device *pdev)
priv->mbx = devm_ioremap_resource(&pdev->dev, res); priv->mbx = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(priv->mbx)) { if (IS_ERR(priv->mbx)) {
dev_err(&pdev->dev, "mbx ioremap failed\n"); dev_err(&pdev->dev, "mbx ioremap failed\n");
return PTR_ERR(priv->mbx); err = PTR_ERR(priv->mbx);
goto probe_exit_candev;
} }
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!irq) { if (!irq) {
dev_err(&pdev->dev, "No irq resource\n"); dev_err(&pdev->dev, "No irq resource\n");
goto probe_exit; goto probe_exit_candev;
} }
priv->ndev = ndev; priv->ndev = ndev;
@ -969,7 +972,7 @@ probe_exit_release_clk:
clk_put(priv->clk); clk_put(priv->clk);
probe_exit_candev: probe_exit_candev:
free_candev(ndev); free_candev(ndev);
probe_exit:
return err; return err;
} }

View File

@ -367,7 +367,7 @@ static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = {
.tseg2_max = 32, .tseg2_max = 32,
.sjw_max = 16, .sjw_max = 16,
.brp_min = 1, .brp_min = 1,
.brp_max = 4096, .brp_max = 8192,
.brp_inc = 1, .brp_inc = 1,
}; };

View File

@ -326,8 +326,6 @@ static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb,
if (!ctx) if (!ctx)
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
can_put_echo_skb(skb, priv->netdev, ctx->ndx);
if (cf->can_id & CAN_EFF_FLAG) { if (cf->can_id & CAN_EFF_FLAG) {
/* SIDH | SIDL | EIDH | EIDL /* SIDH | SIDL | EIDH | EIDL
* 28 - 21 | 20 19 18 x x x 17 16 | 15 - 8 | 7 - 0 * 28 - 21 | 20 19 18 x x x 17 16 | 15 - 8 | 7 - 0
@ -357,6 +355,8 @@ static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb,
if (cf->can_id & CAN_RTR_FLAG) if (cf->can_id & CAN_RTR_FLAG)
usb_msg.dlc |= MCBA_DLC_RTR_MASK; usb_msg.dlc |= MCBA_DLC_RTR_MASK;
can_put_echo_skb(skb, priv->netdev, ctx->ndx);
err = mcba_usb_xmit(priv, (struct mcba_usb_msg *)&usb_msg, ctx); err = mcba_usb_xmit(priv, (struct mcba_usb_msg *)&usb_msg, ctx);
if (err) if (err)
goto xmit_failed; goto xmit_failed;

View File

@ -156,7 +156,7 @@ void peak_usb_get_ts_time(struct peak_time_ref *time_ref, u32 ts, ktime_t *time)
if (time_ref->ts_dev_1 < time_ref->ts_dev_2) { if (time_ref->ts_dev_1 < time_ref->ts_dev_2) {
/* case when event time (tsw) wraps */ /* case when event time (tsw) wraps */
if (ts < time_ref->ts_dev_1) if (ts < time_ref->ts_dev_1)
delta_ts = 1 << time_ref->adapter->ts_used_bits; delta_ts = BIT_ULL(time_ref->adapter->ts_used_bits);
/* Otherwise, sync time counter (ts_dev_2) has wrapped: /* Otherwise, sync time counter (ts_dev_2) has wrapped:
* handle case when event time (tsn) hasn't. * handle case when event time (tsn) hasn't.
@ -168,7 +168,7 @@ void peak_usb_get_ts_time(struct peak_time_ref *time_ref, u32 ts, ktime_t *time)
* tsn ts * tsn ts
*/ */
} else if (time_ref->ts_dev_1 < ts) { } else if (time_ref->ts_dev_1 < ts) {
delta_ts = -(1 << time_ref->adapter->ts_used_bits); delta_ts = -BIT_ULL(time_ref->adapter->ts_used_bits);
} }
/* add delay between last sync and event timestamps */ /* add delay between last sync and event timestamps */

View File

@ -26,6 +26,7 @@
*/ */
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/delay.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/firmware.h> #include <linux/firmware.h>
#include <linux/if_bridge.h> #include <linux/if_bridge.h>
@ -1818,6 +1819,16 @@ static int gswip_gphy_fw_list(struct gswip_priv *priv,
i++; i++;
} }
/* The standalone PHY11G requires 300ms to be fully
* initialized and ready for any MDIO communication after being
* taken out of reset. For the SoC-internal GPHY variant there
* is no (known) documentation for the minimum time after a
* reset. Use the same value as for the standalone variant as
* some users have reported internal PHYs not being detected
* without any delay.
*/
msleep(300);
return 0; return 0;
remove_gphy: remove_gphy:

View File

@ -125,11 +125,9 @@ static int mv88e6xxx_g1_vtu_vid_write(struct mv88e6xxx_chip *chip,
* Offset 0x08: VTU/STU Data Register 2 * Offset 0x08: VTU/STU Data Register 2
* Offset 0x09: VTU/STU Data Register 3 * Offset 0x09: VTU/STU Data Register 3
*/ */
static int mv88e6185_g1_vtu_stu_data_read(struct mv88e6xxx_chip *chip,
static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip, u16 *regs)
struct mv88e6xxx_vtu_entry *entry)
{ {
u16 regs[3];
int i; int i;
/* Read all 3 VTU/STU Data registers */ /* Read all 3 VTU/STU Data registers */
@ -142,12 +140,45 @@ static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
return err; return err;
} }
/* Extract MemberTag and PortState data */ return 0;
}
static int mv88e6185_g1_vtu_data_read(struct mv88e6xxx_chip *chip,
struct mv88e6xxx_vtu_entry *entry)
{
u16 regs[3];
int err;
int i;
err = mv88e6185_g1_vtu_stu_data_read(chip, regs);
if (err)
return err;
/* Extract MemberTag data */
for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) { for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
unsigned int member_offset = (i % 4) * 4; unsigned int member_offset = (i % 4) * 4;
unsigned int state_offset = member_offset + 2;
entry->member[i] = (regs[i / 4] >> member_offset) & 0x3; entry->member[i] = (regs[i / 4] >> member_offset) & 0x3;
}
return 0;
}
static int mv88e6185_g1_stu_data_read(struct mv88e6xxx_chip *chip,
struct mv88e6xxx_vtu_entry *entry)
{
u16 regs[3];
int err;
int i;
err = mv88e6185_g1_vtu_stu_data_read(chip, regs);
if (err)
return err;
/* Extract PortState data */
for (i = 0; i < mv88e6xxx_num_ports(chip); ++i) {
unsigned int state_offset = (i % 4) * 4 + 2;
entry->state[i] = (regs[i / 4] >> state_offset) & 0x3; entry->state[i] = (regs[i / 4] >> state_offset) & 0x3;
} }
@ -349,6 +380,10 @@ int mv88e6185_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
if (err) if (err)
return err; return err;
err = mv88e6185_g1_stu_data_read(chip, entry);
if (err)
return err;
/* VTU DBNum[3:0] are located in VTU Operation 3:0 /* VTU DBNum[3:0] are located in VTU Operation 3:0
* VTU DBNum[7:4] are located in VTU Operation 11:8 * VTU DBNum[7:4] are located in VTU Operation 11:8
*/ */
@ -374,11 +409,6 @@ int mv88e6352_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
return err; return err;
if (entry->valid) { if (entry->valid) {
/* Fetch (and mask) VLAN PortState data from the STU */
err = mv88e6xxx_g1_vtu_stu_get(chip, entry);
if (err)
return err;
err = mv88e6185_g1_vtu_data_read(chip, entry); err = mv88e6185_g1_vtu_data_read(chip, entry);
if (err) if (err)
return err; return err;
@ -386,6 +416,15 @@ int mv88e6352_g1_vtu_getnext(struct mv88e6xxx_chip *chip,
err = mv88e6xxx_g1_vtu_fid_read(chip, entry); err = mv88e6xxx_g1_vtu_fid_read(chip, entry);
if (err) if (err)
return err; return err;
/* Fetch VLAN PortState data from the STU */
err = mv88e6xxx_g1_vtu_stu_get(chip, entry);
if (err)
return err;
err = mv88e6185_g1_stu_data_read(chip, entry);
if (err)
return err;
} }
return 0; return 0;

View File

@ -2391,7 +2391,8 @@ static int b44_init_one(struct ssb_device *sdev,
goto err_out_free_dev; goto err_out_free_dev;
} }
if (dma_set_mask_and_coherent(sdev->dma_dev, DMA_BIT_MASK(30))) { err = dma_set_mask_and_coherent(sdev->dma_dev, DMA_BIT_MASK(30));
if (err) {
dev_err(sdev->dev, dev_err(sdev->dev,
"Required 30BIT DMA mask unsupported by the system\n"); "Required 30BIT DMA mask unsupported by the system\n");
goto err_out_powerdown; goto err_out_powerdown;

View File

@ -2584,7 +2584,7 @@ static int bnxt_get_module_eeprom(struct net_device *dev,
/* Read A2 portion of the EEPROM */ /* Read A2 portion of the EEPROM */
if (length) { if (length) {
start -= ETH_MODULE_SFF_8436_LEN; start -= ETH_MODULE_SFF_8436_LEN;
rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A2, 1, rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A2, 0,
start, length, data); start, length, data);
} }
return rc; return rc;

View File

@ -1891,6 +1891,8 @@ static int ftgmac100_probe(struct platform_device *pdev)
return 0; return 0;
err_ncsi_dev: err_ncsi_dev:
if (priv->ndev)
ncsi_unregister_dev(priv->ndev);
err_register_netdev: err_register_netdev:
ftgmac100_destroy_mdio(netdev); ftgmac100_destroy_mdio(netdev);
err_setup_mdio: err_setup_mdio:
@ -1911,6 +1913,8 @@ static int ftgmac100_remove(struct platform_device *pdev)
netdev = platform_get_drvdata(pdev); netdev = platform_get_drvdata(pdev);
priv = netdev_priv(netdev); priv = netdev_priv(netdev);
if (priv->ndev)
ncsi_unregister_dev(priv->ndev);
unregister_netdev(netdev); unregister_netdev(netdev);
clk_disable_unprepare(priv->clk); clk_disable_unprepare(priv->clk);

View File

@ -1864,8 +1864,8 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
#define INIT_HCA_LOG_RD_OFFSET (INIT_HCA_QPC_OFFSET + 0x77) #define INIT_HCA_LOG_RD_OFFSET (INIT_HCA_QPC_OFFSET + 0x77)
#define INIT_HCA_MCAST_OFFSET 0x0c0 #define INIT_HCA_MCAST_OFFSET 0x0c0
#define INIT_HCA_MC_BASE_OFFSET (INIT_HCA_MCAST_OFFSET + 0x00) #define INIT_HCA_MC_BASE_OFFSET (INIT_HCA_MCAST_OFFSET + 0x00)
#define INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x12) #define INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x13)
#define INIT_HCA_LOG_MC_HASH_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x16) #define INIT_HCA_LOG_MC_HASH_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x17)
#define INIT_HCA_UC_STEERING_OFFSET (INIT_HCA_MCAST_OFFSET + 0x18) #define INIT_HCA_UC_STEERING_OFFSET (INIT_HCA_MCAST_OFFSET + 0x18)
#define INIT_HCA_LOG_MC_TABLE_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x1b) #define INIT_HCA_LOG_MC_TABLE_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x1b)
#define INIT_HCA_DEVICE_MANAGED_FLOW_STEERING_EN 0x6 #define INIT_HCA_DEVICE_MANAGED_FLOW_STEERING_EN 0x6
@ -1873,7 +1873,7 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
#define INIT_HCA_DRIVER_VERSION_SZ 0x40 #define INIT_HCA_DRIVER_VERSION_SZ 0x40
#define INIT_HCA_FS_PARAM_OFFSET 0x1d0 #define INIT_HCA_FS_PARAM_OFFSET 0x1d0
#define INIT_HCA_FS_BASE_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x00) #define INIT_HCA_FS_BASE_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x00)
#define INIT_HCA_FS_LOG_ENTRY_SZ_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x12) #define INIT_HCA_FS_LOG_ENTRY_SZ_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x13)
#define INIT_HCA_FS_A0_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x18) #define INIT_HCA_FS_A0_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x18)
#define INIT_HCA_FS_LOG_TABLE_SZ_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x1b) #define INIT_HCA_FS_LOG_TABLE_SZ_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x1b)
#define INIT_HCA_FS_ETH_BITS_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x21) #define INIT_HCA_FS_ETH_BITS_OFFSET (INIT_HCA_FS_PARAM_OFFSET + 0x21)

View File

@ -182,8 +182,8 @@ struct mlx4_init_hca_param {
u64 cmpt_base; u64 cmpt_base;
u64 mtt_base; u64 mtt_base;
u64 global_caps; u64 global_caps;
u16 log_mc_entry_sz; u8 log_mc_entry_sz;
u16 log_mc_hash_sz; u8 log_mc_hash_sz;
u16 hca_core_clock; /* Internal Clock Frequency (in MHz) */ u16 hca_core_clock; /* Internal Clock Frequency (in MHz) */
u8 log_num_qps; u8 log_num_qps;
u8 log_num_srqs; u8 log_num_srqs;

View File

@ -1592,6 +1592,10 @@ int mlx5_esw_modify_vport_rate(struct mlx5_eswitch *esw, u16 vport_num,
struct mlx5_vport *vport; struct mlx5_vport *vport;
vport = mlx5_eswitch_get_vport(esw, vport_num); vport = mlx5_eswitch_get_vport(esw, vport_num);
if (!vport->qos.enabled)
return -EOPNOTSUPP;
MLX5_SET(scheduling_context, ctx, max_average_bw, rate_mbps); MLX5_SET(scheduling_context, ctx, max_average_bw, rate_mbps);
return mlx5_modify_scheduling_element_cmd(esw->dev, return mlx5_modify_scheduling_element_cmd(esw->dev,
@ -2369,12 +2373,15 @@ static u32 calculate_vports_min_rate_divider(struct mlx5_eswitch *esw)
max_guarantee = evport->info.min_rate; max_guarantee = evport->info.min_rate;
} }
return max_t(u32, max_guarantee / fw_max_bw_share, 1); if (max_guarantee)
return max_t(u32, max_guarantee / fw_max_bw_share, 1);
return 0;
} }
static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider) static int normalize_vports_min_rate(struct mlx5_eswitch *esw)
{ {
u32 fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share); u32 fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share);
u32 divider = calculate_vports_min_rate_divider(esw);
struct mlx5_vport *evport; struct mlx5_vport *evport;
u32 vport_max_rate; u32 vport_max_rate;
u32 vport_min_rate; u32 vport_min_rate;
@ -2387,9 +2394,9 @@ static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider)
continue; continue;
vport_min_rate = evport->info.min_rate; vport_min_rate = evport->info.min_rate;
vport_max_rate = evport->info.max_rate; vport_max_rate = evport->info.max_rate;
bw_share = MLX5_MIN_BW_SHARE; bw_share = 0;
if (vport_min_rate) if (divider)
bw_share = MLX5_RATE_TO_BW_SHARE(vport_min_rate, bw_share = MLX5_RATE_TO_BW_SHARE(vport_min_rate,
divider, divider,
fw_max_bw_share); fw_max_bw_share);
@ -2414,7 +2421,6 @@ int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport); struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
u32 fw_max_bw_share; u32 fw_max_bw_share;
u32 previous_min_rate; u32 previous_min_rate;
u32 divider;
bool min_rate_supported; bool min_rate_supported;
bool max_rate_supported; bool max_rate_supported;
int err = 0; int err = 0;
@ -2439,8 +2445,7 @@ int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
previous_min_rate = evport->info.min_rate; previous_min_rate = evport->info.min_rate;
evport->info.min_rate = min_rate; evport->info.min_rate = min_rate;
divider = calculate_vports_min_rate_divider(esw); err = normalize_vports_min_rate(esw);
err = normalize_vports_min_rate(esw, divider);
if (err) { if (err) {
evport->info.min_rate = previous_min_rate; evport->info.min_rate = previous_min_rate;
goto unlock; goto unlock;

View File

@ -496,6 +496,13 @@ static void del_sw_hw_rule(struct fs_node *node)
goto out; goto out;
} }
if (rule->dest_attr.type == MLX5_FLOW_DESTINATION_TYPE_PORT &&
--fte->dests_size) {
fte->modify_mask |= BIT(MLX5_SET_FTE_MODIFY_ENABLE_MASK_ACTION);
fte->action.action &= ~MLX5_FLOW_CONTEXT_ACTION_ALLOW;
goto out;
}
if ((fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) && if ((fte->action.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
--fte->dests_size) { --fte->dests_size) {
fte->modify_mask |= fte->modify_mask |=

View File

@ -444,7 +444,8 @@ static void mlxsw_emad_trans_timeout_schedule(struct mlxsw_reg_trans *trans)
if (trans->core->fw_flash_in_progress) if (trans->core->fw_flash_in_progress)
timeout = msecs_to_jiffies(MLXSW_EMAD_TIMEOUT_DURING_FW_FLASH_MS); timeout = msecs_to_jiffies(MLXSW_EMAD_TIMEOUT_DURING_FW_FLASH_MS);
queue_delayed_work(trans->core->emad_wq, &trans->timeout_dw, timeout); queue_delayed_work(trans->core->emad_wq, &trans->timeout_dw,
timeout << trans->retries);
} }
static int mlxsw_emad_transmit(struct mlxsw_core *mlxsw_core, static int mlxsw_emad_transmit(struct mlxsw_core *mlxsw_core,

View File

@ -145,7 +145,8 @@ static void lan743x_intr_software_isr(void *context)
int_sts = lan743x_csr_read(adapter, INT_STS); int_sts = lan743x_csr_read(adapter, INT_STS);
if (int_sts & INT_BIT_SW_GP_) { if (int_sts & INT_BIT_SW_GP_) {
lan743x_csr_write(adapter, INT_STS, INT_BIT_SW_GP_); /* disable the interrupt to prevent repeated re-triggering */
lan743x_csr_write(adapter, INT_EN_CLR, INT_BIT_SW_GP_);
intr->software_isr_flag = 1; intr->software_isr_flag = 1;
} }
} }
@ -1242,13 +1243,13 @@ clean_up_data_descriptor:
goto clear_active; goto clear_active;
if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED)) { if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED)) {
dev_kfree_skb(buffer_info->skb); dev_kfree_skb_any(buffer_info->skb);
goto clear_skb; goto clear_skb;
} }
if (cleanup) { if (cleanup) {
lan743x_ptp_unrequest_tx_timestamp(tx->adapter); lan743x_ptp_unrequest_tx_timestamp(tx->adapter);
dev_kfree_skb(buffer_info->skb); dev_kfree_skb_any(buffer_info->skb);
} else { } else {
ignore_sync = (buffer_info->flags & ignore_sync = (buffer_info->flags &
TX_BUFFER_INFO_FLAG_IGNORE_SYNC) != 0; TX_BUFFER_INFO_FLAG_IGNORE_SYNC) != 0;
@ -1558,7 +1559,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx,
if (required_number_of_descriptors > if (required_number_of_descriptors >
lan743x_tx_get_avail_desc(tx)) { lan743x_tx_get_avail_desc(tx)) {
if (required_number_of_descriptors > (tx->ring_size - 1)) { if (required_number_of_descriptors > (tx->ring_size - 1)) {
dev_kfree_skb(skb); dev_kfree_skb_irq(skb);
} else { } else {
/* save to overflow buffer */ /* save to overflow buffer */
tx->overflow_skb = skb; tx->overflow_skb = skb;
@ -1591,7 +1592,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx,
start_frame_length, start_frame_length,
do_timestamp, do_timestamp,
skb->ip_summed == CHECKSUM_PARTIAL)) { skb->ip_summed == CHECKSUM_PARTIAL)) {
dev_kfree_skb(skb); dev_kfree_skb_irq(skb);
goto unlock; goto unlock;
} }
@ -1610,7 +1611,7 @@ static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx,
* frame assembler clean up was performed inside * frame assembler clean up was performed inside
* lan743x_tx_frame_add_fragment * lan743x_tx_frame_add_fragment
*/ */
dev_kfree_skb(skb); dev_kfree_skb_irq(skb);
goto unlock; goto unlock;
} }
} }

View File

@ -2742,14 +2742,18 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn,
iwarp_info->partial_fpdus = kcalloc((u16)p_hwfn->p_rdma_info->num_qps, iwarp_info->partial_fpdus = kcalloc((u16)p_hwfn->p_rdma_info->num_qps,
sizeof(*iwarp_info->partial_fpdus), sizeof(*iwarp_info->partial_fpdus),
GFP_KERNEL); GFP_KERNEL);
if (!iwarp_info->partial_fpdus) if (!iwarp_info->partial_fpdus) {
rc = -ENOMEM;
goto err; goto err;
}
iwarp_info->max_num_partial_fpdus = (u16)p_hwfn->p_rdma_info->num_qps; iwarp_info->max_num_partial_fpdus = (u16)p_hwfn->p_rdma_info->num_qps;
iwarp_info->mpa_intermediate_buf = kzalloc(buff_size, GFP_KERNEL); iwarp_info->mpa_intermediate_buf = kzalloc(buff_size, GFP_KERNEL);
if (!iwarp_info->mpa_intermediate_buf) if (!iwarp_info->mpa_intermediate_buf) {
rc = -ENOMEM;
goto err; goto err;
}
/* The mpa_bufs array serves for pending RX packets received on the /* The mpa_bufs array serves for pending RX packets received on the
* mpa ll2 that don't have place on the tx ring and require later * mpa ll2 that don't have place on the tx ring and require later
@ -2759,8 +2763,10 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn,
iwarp_info->mpa_bufs = kcalloc(data.input.rx_num_desc, iwarp_info->mpa_bufs = kcalloc(data.input.rx_num_desc,
sizeof(*iwarp_info->mpa_bufs), sizeof(*iwarp_info->mpa_bufs),
GFP_KERNEL); GFP_KERNEL);
if (!iwarp_info->mpa_bufs) if (!iwarp_info->mpa_bufs) {
rc = -ENOMEM;
goto err; goto err;
}
INIT_LIST_HEAD(&iwarp_info->mpa_buf_pending_list); INIT_LIST_HEAD(&iwarp_info->mpa_buf_pending_list);
INIT_LIST_HEAD(&iwarp_info->mpa_buf_list); INIT_LIST_HEAD(&iwarp_info->mpa_buf_list);

View File

@ -2251,7 +2251,8 @@ static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter)
/* Boot either flash image or firmware image from host file system */ /* Boot either flash image or firmware image from host file system */
if (qlcnic_load_fw_file == 1) { if (qlcnic_load_fw_file == 1) {
if (qlcnic_83xx_load_fw_image_from_host(adapter)) err = qlcnic_83xx_load_fw_image_from_host(adapter);
if (err)
return err; return err;
} else { } else {
QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID, QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,

View File

@ -188,6 +188,11 @@ rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb)
dev = skb->dev; dev = skb->dev;
port = rmnet_get_port_rcu(dev); port = rmnet_get_port_rcu(dev);
if (unlikely(!port)) {
atomic_long_inc(&skb->dev->rx_nohandler);
kfree_skb(skb);
goto done;
}
switch (port->rmnet_mode) { switch (port->rmnet_mode) {
case RMNET_EPMODE_VND: case RMNET_EPMODE_VND:

View File

@ -2876,6 +2876,7 @@ static int cpsw_probe(struct platform_device *pdev)
CPSW_MAX_QUEUES, CPSW_MAX_QUEUES); CPSW_MAX_QUEUES, CPSW_MAX_QUEUES);
if (!ndev) { if (!ndev) {
dev_err(dev, "error allocating net_device\n"); dev_err(dev, "error allocating net_device\n");
ret = -ENOMEM;
goto clean_cpts; goto clean_cpts;
} }

View File

@ -221,8 +221,7 @@ static void geneve_rx(struct geneve_dev *geneve, struct geneve_sock *gs,
if (ip_tunnel_collect_metadata() || gs->collect_md) { if (ip_tunnel_collect_metadata() || gs->collect_md) {
__be16 flags; __be16 flags;
flags = TUNNEL_KEY | TUNNEL_GENEVE_OPT | flags = TUNNEL_KEY | (gnvh->oam ? TUNNEL_OAM : 0) |
(gnvh->oam ? TUNNEL_OAM : 0) |
(gnvh->critical ? TUNNEL_CRIT_OPT : 0); (gnvh->critical ? TUNNEL_CRIT_OPT : 0);
tun_dst = udp_tun_rx_dst(skb, geneve_get_sk_family(gs), flags, tun_dst = udp_tun_rx_dst(skb, geneve_get_sk_family(gs), flags,

View File

@ -1092,7 +1092,7 @@ static const struct usb_device_id products[] = {
{QMI_FIXED_INTF(0x05c6, 0x9011, 4)}, {QMI_FIXED_INTF(0x05c6, 0x9011, 4)},
{QMI_FIXED_INTF(0x05c6, 0x9021, 1)}, {QMI_FIXED_INTF(0x05c6, 0x9021, 1)},
{QMI_FIXED_INTF(0x05c6, 0x9022, 2)}, {QMI_FIXED_INTF(0x05c6, 0x9022, 2)},
{QMI_FIXED_INTF(0x05c6, 0x9025, 4)}, /* Alcatel-sbell ASB TL131 TDD LTE (China Mobile) */ {QMI_QUIRK_SET_DTR(0x05c6, 0x9025, 4)}, /* Alcatel-sbell ASB TL131 TDD LTE (China Mobile) */
{QMI_FIXED_INTF(0x05c6, 0x9026, 3)}, {QMI_FIXED_INTF(0x05c6, 0x9026, 3)},
{QMI_FIXED_INTF(0x05c6, 0x902e, 5)}, {QMI_FIXED_INTF(0x05c6, 0x902e, 5)},
{QMI_FIXED_INTF(0x05c6, 0x9031, 5)}, {QMI_FIXED_INTF(0x05c6, 0x9031, 5)},

View File

@ -2811,7 +2811,9 @@ static int rockchip_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
if (!bank->domain) if (!bank->domain)
return -ENXIO; return -ENXIO;
clk_enable(bank->clk);
virq = irq_create_mapping(bank->domain, offset); virq = irq_create_mapping(bank->domain, offset);
clk_disable(bank->clk);
return (virq) ? : -ENXIO; return (virq) ? : -ENXIO;
} }

View File

@ -1275,7 +1275,6 @@ static int _regulator_do_enable(struct regulator_dev *rdev);
/** /**
* set_machine_constraints - sets regulator constraints * set_machine_constraints - sets regulator constraints
* @rdev: regulator source * @rdev: regulator source
* @constraints: constraints to apply
* *
* Allows platform initialisation code to define and constrain * Allows platform initialisation code to define and constrain
* regulator circuits e.g. valid voltage/current ranges, etc. NOTE: * regulator circuits e.g. valid voltage/current ranges, etc. NOTE:
@ -1283,21 +1282,11 @@ static int _regulator_do_enable(struct regulator_dev *rdev);
* regulator operations to proceed i.e. set_voltage, set_current_limit, * regulator operations to proceed i.e. set_voltage, set_current_limit,
* set_mode. * set_mode.
*/ */
static int set_machine_constraints(struct regulator_dev *rdev, static int set_machine_constraints(struct regulator_dev *rdev)
const struct regulation_constraints *constraints)
{ {
int ret = 0; int ret = 0;
const struct regulator_ops *ops = rdev->desc->ops; const struct regulator_ops *ops = rdev->desc->ops;
if (constraints)
rdev->constraints = kmemdup(constraints, sizeof(*constraints),
GFP_KERNEL);
else
rdev->constraints = kzalloc(sizeof(*constraints),
GFP_KERNEL);
if (!rdev->constraints)
return -ENOMEM;
ret = machine_constraints_voltage(rdev, rdev->constraints); ret = machine_constraints_voltage(rdev, rdev->constraints);
if (ret != 0) if (ret != 0)
return ret; return ret;
@ -1811,6 +1800,15 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
} }
} }
if (r == rdev) {
dev_err(dev, "Supply for %s (%s) resolved to itself\n",
rdev->desc->name, rdev->supply_name);
if (!have_full_constraints())
return -EINVAL;
r = dummy_regulator_rdev;
get_device(&r->dev);
}
/* /*
* If the supply's parent device is not the same as the * If the supply's parent device is not the same as the
* regulator's parent device, then ensure the parent device * regulator's parent device, then ensure the parent device
@ -5025,7 +5023,6 @@ struct regulator_dev *
regulator_register(const struct regulator_desc *regulator_desc, regulator_register(const struct regulator_desc *regulator_desc,
const struct regulator_config *cfg) const struct regulator_config *cfg)
{ {
const struct regulation_constraints *constraints = NULL;
const struct regulator_init_data *init_data; const struct regulator_init_data *init_data;
struct regulator_config *config = NULL; struct regulator_config *config = NULL;
static atomic_t regulator_no = ATOMIC_INIT(-1); static atomic_t regulator_no = ATOMIC_INIT(-1);
@ -5164,14 +5161,23 @@ regulator_register(const struct regulator_desc *regulator_desc,
/* set regulator constraints */ /* set regulator constraints */
if (init_data) if (init_data)
constraints = &init_data->constraints; rdev->constraints = kmemdup(&init_data->constraints,
sizeof(*rdev->constraints),
GFP_KERNEL);
else
rdev->constraints = kzalloc(sizeof(*rdev->constraints),
GFP_KERNEL);
if (!rdev->constraints) {
ret = -ENOMEM;
goto wash;
}
if (init_data && init_data->supply_regulator) if (init_data && init_data->supply_regulator)
rdev->supply_name = init_data->supply_regulator; rdev->supply_name = init_data->supply_regulator;
else if (regulator_desc->supply_name) else if (regulator_desc->supply_name)
rdev->supply_name = regulator_desc->supply_name; rdev->supply_name = regulator_desc->supply_name;
ret = set_machine_constraints(rdev, constraints); ret = set_machine_constraints(rdev);
if (ret == -EPROBE_DEFER) { if (ret == -EPROBE_DEFER) {
/* Regulator might be in bypass mode and so needs its supply /* Regulator might be in bypass mode and so needs its supply
* to set the constraints */ * to set the constraints */
@ -5180,7 +5186,7 @@ regulator_register(const struct regulator_desc *regulator_desc,
* that is just being created */ * that is just being created */
ret = regulator_resolve_supply(rdev); ret = regulator_resolve_supply(rdev);
if (!ret) if (!ret)
ret = set_machine_constraints(rdev, constraints); ret = set_machine_constraints(rdev);
else else
rdev_dbg(rdev, "unable to resolve supply early: %pe\n", rdev_dbg(rdev, "unable to resolve supply early: %pe\n",
ERR_PTR(ret)); ERR_PTR(ret));

View File

@ -844,11 +844,14 @@ static int pfuze100_regulator_probe(struct i2c_client *client,
* the switched regulator till yet. * the switched regulator till yet.
*/ */
if (pfuze_chip->flags & PFUZE_FLAG_DISABLE_SW) { if (pfuze_chip->flags & PFUZE_FLAG_DISABLE_SW) {
if (pfuze_chip->regulator_descs[i].sw_reg) { if (pfuze_chip->chip_id == PFUZE100 ||
desc->ops = &pfuze100_sw_disable_regulator_ops; pfuze_chip->chip_id == PFUZE200) {
desc->enable_val = 0x8; if (pfuze_chip->regulator_descs[i].sw_reg) {
desc->disable_val = 0x0; desc->ops = &pfuze100_sw_disable_regulator_ops;
desc->enable_time = 500; desc->enable_val = 0x8;
desc->disable_val = 0x0;
desc->enable_time = 500;
}
} }
} }

View File

@ -342,8 +342,17 @@ static int ti_abb_set_voltage_sel(struct regulator_dev *rdev, unsigned sel)
return ret; return ret;
} }
/* If data is exactly the same, then just update index, no change */
info = &abb->info[sel]; info = &abb->info[sel];
/*
* When Linux kernel is starting up, we are'nt sure of the
* Bias configuration that bootloader has configured.
* So, we get to know the actual setting the first time
* we are asked to transition.
*/
if (abb->current_info_idx == -EINVAL)
goto just_set_abb;
/* If data is exactly the same, then just update index, no change */
oinfo = &abb->info[abb->current_info_idx]; oinfo = &abb->info[abb->current_info_idx];
if (!memcmp(info, oinfo, sizeof(*info))) { if (!memcmp(info, oinfo, sizeof(*info))) {
dev_dbg(dev, "%s: Same data new idx=%d, old idx=%d\n", __func__, dev_dbg(dev, "%s: Same data new idx=%d, old idx=%d\n", __func__,
@ -351,6 +360,7 @@ static int ti_abb_set_voltage_sel(struct regulator_dev *rdev, unsigned sel)
goto out; goto out;
} }
just_set_abb:
ret = ti_abb_set_opp(rdev, abb, info); ret = ti_abb_set_opp(rdev, abb, info);
out: out:

View File

@ -2980,6 +2980,12 @@ static int _dasd_requeue_request(struct dasd_ccw_req *cqr)
if (!block) if (!block)
return -EINVAL; return -EINVAL;
/*
* If the request is an ERP request there is nothing to requeue.
* This will be done with the remaining original request.
*/
if (cqr->refers)
return 0;
spin_lock_irq(&cqr->dq->lock); spin_lock_irq(&cqr->dq->lock);
req = (struct request *) cqr->callback_data; req = (struct request *) cqr->callback_data;
blk_mq_requeue_request(req, false); blk_mq_requeue_request(req, false);

View File

@ -1569,12 +1569,12 @@ start:
*/ */
/* fallthrough */ /* fallthrough */
case CLKS_OFF: case CLKS_OFF:
ufshcd_scsi_block_requests(hba);
hba->clk_gating.state = REQ_CLKS_ON; hba->clk_gating.state = REQ_CLKS_ON;
trace_ufshcd_clk_gating(dev_name(hba->dev), trace_ufshcd_clk_gating(dev_name(hba->dev),
hba->clk_gating.state); hba->clk_gating.state);
queue_work(hba->clk_gating.clk_gating_workq, if (queue_work(hba->clk_gating.clk_gating_workq,
&hba->clk_gating.ungate_work); &hba->clk_gating.ungate_work))
ufshcd_scsi_block_requests(hba);
/* /*
* fall through to check if we should wait for this * fall through to check if we should wait for this
* work to be done or not. * work to be done or not.

View File

@ -494,7 +494,7 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
unsigned long clk_hz; unsigned long clk_hz;
int err; int err;
master = spi_alloc_master(&pdev->dev, sizeof(*bs)); master = devm_spi_alloc_master(&pdev->dev, sizeof(*bs));
if (!master) if (!master)
return -ENOMEM; return -ENOMEM;
@ -524,29 +524,24 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
/* the main area */ /* the main area */
bs->regs = devm_platform_ioremap_resource(pdev, 0); bs->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(bs->regs)) { if (IS_ERR(bs->regs))
err = PTR_ERR(bs->regs); return PTR_ERR(bs->regs);
goto out_master_put;
}
bs->clk = devm_clk_get(&pdev->dev, NULL); bs->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(bs->clk)) { if (IS_ERR(bs->clk)) {
err = PTR_ERR(bs->clk);
dev_err(&pdev->dev, "could not get clk: %d\n", err); dev_err(&pdev->dev, "could not get clk: %d\n", err);
goto out_master_put; return PTR_ERR(bs->clk);
} }
bs->irq = platform_get_irq(pdev, 0); bs->irq = platform_get_irq(pdev, 0);
if (bs->irq <= 0) { if (bs->irq <= 0)
err = bs->irq ? bs->irq : -ENODEV; return bs->irq ? bs->irq : -ENODEV;
goto out_master_put;
}
/* this also enables the HW block */ /* this also enables the HW block */
err = clk_prepare_enable(bs->clk); err = clk_prepare_enable(bs->clk);
if (err) { if (err) {
dev_err(&pdev->dev, "could not prepare clock: %d\n", err); dev_err(&pdev->dev, "could not prepare clock: %d\n", err);
goto out_master_put; return err;
} }
/* just checking if the clock returns a sane value */ /* just checking if the clock returns a sane value */
@ -581,8 +576,6 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
out_clk_disable: out_clk_disable:
clk_disable_unprepare(bs->clk); clk_disable_unprepare(bs->clk);
out_master_put:
spi_master_put(master);
return err; return err;
} }

View File

@ -1007,9 +1007,6 @@ static int fsl_lpspi_remove(struct platform_device *pdev)
spi_controller_get_devdata(controller); spi_controller_get_devdata(controller);
pm_runtime_disable(fsl_lpspi->dev); pm_runtime_disable(fsl_lpspi->dev);
spi_master_put(controller);
return 0; return 0;
} }

View File

@ -680,7 +680,7 @@ static int npcm_fiu_probe(struct platform_device *pdev)
int ret; int ret;
int id; int id;
ctrl = spi_alloc_master(dev, sizeof(*fiu)); ctrl = devm_spi_alloc_master(dev, sizeof(*fiu));
if (!ctrl) if (!ctrl)
return -ENOMEM; return -ENOMEM;

View File

@ -2257,6 +2257,49 @@ struct spi_controller *__spi_alloc_controller(struct device *dev,
} }
EXPORT_SYMBOL_GPL(__spi_alloc_controller); EXPORT_SYMBOL_GPL(__spi_alloc_controller);
static void devm_spi_release_controller(struct device *dev, void *ctlr)
{
spi_controller_put(*(struct spi_controller **)ctlr);
}
/**
* __devm_spi_alloc_controller - resource-managed __spi_alloc_controller()
* @dev: physical device of SPI controller
* @size: how much zeroed driver-private data to allocate
* @slave: whether to allocate an SPI master (false) or SPI slave (true)
* Context: can sleep
*
* Allocate an SPI controller and automatically release a reference on it
* when @dev is unbound from its driver. Drivers are thus relieved from
* having to call spi_controller_put().
*
* The arguments to this function are identical to __spi_alloc_controller().
*
* Return: the SPI controller structure on success, else NULL.
*/
struct spi_controller *__devm_spi_alloc_controller(struct device *dev,
unsigned int size,
bool slave)
{
struct spi_controller **ptr, *ctlr;
ptr = devres_alloc(devm_spi_release_controller, sizeof(*ptr),
GFP_KERNEL);
if (!ptr)
return NULL;
ctlr = __spi_alloc_controller(dev, size, slave);
if (ctlr) {
*ptr = ctlr;
devres_add(dev, ptr);
} else {
devres_free(ptr);
}
return ctlr;
}
EXPORT_SYMBOL_GPL(__devm_spi_alloc_controller);
#ifdef CONFIG_OF #ifdef CONFIG_OF
static int of_spi_get_gpio_numbers(struct spi_controller *ctlr) static int of_spi_get_gpio_numbers(struct spi_controller *ctlr)
{ {
@ -2576,6 +2619,11 @@ int devm_spi_register_controller(struct device *dev,
} }
EXPORT_SYMBOL_GPL(devm_spi_register_controller); EXPORT_SYMBOL_GPL(devm_spi_register_controller);
static int devm_spi_match_controller(struct device *dev, void *res, void *ctlr)
{
return *(struct spi_controller **)res == ctlr;
}
static int __unregister(struct device *dev, void *null) static int __unregister(struct device *dev, void *null)
{ {
spi_unregister_device(to_spi_device(dev)); spi_unregister_device(to_spi_device(dev));
@ -2617,7 +2665,15 @@ void spi_unregister_controller(struct spi_controller *ctlr)
list_del(&ctlr->list); list_del(&ctlr->list);
mutex_unlock(&board_lock); mutex_unlock(&board_lock);
device_unregister(&ctlr->dev); device_del(&ctlr->dev);
/* Release the last reference on the controller if its driver
* has not yet been converted to devm_spi_alloc_master/slave().
*/
if (!devres_find(ctlr->dev.parent, devm_spi_release_controller,
devm_spi_match_controller, ctlr))
put_device(&ctlr->dev);
/* free bus id */ /* free bus id */
mutex_lock(&board_lock); mutex_lock(&board_lock);
if (found == ctlr) if (found == ctlr)

View File

@ -21,6 +21,7 @@ static const struct sdio_device_id sdio_ids[] =
{ SDIO_DEVICE(0x024c, 0x0525), }, { SDIO_DEVICE(0x024c, 0x0525), },
{ SDIO_DEVICE(0x024c, 0x0623), }, { SDIO_DEVICE(0x024c, 0x0623), },
{ SDIO_DEVICE(0x024c, 0x0626), }, { SDIO_DEVICE(0x024c, 0x0626), },
{ SDIO_DEVICE(0x024c, 0x0627), },
{ SDIO_DEVICE(0x024c, 0xb723), }, { SDIO_DEVICE(0x024c, 0xb723), },
{ /* end: all zeroes */ }, { /* end: all zeroes */ },
}; };

View File

@ -49,15 +49,25 @@ static int spk_ttyio_ldisc_open(struct tty_struct *tty)
if (!tty->ops->write) if (!tty->ops->write)
return -EOPNOTSUPP; return -EOPNOTSUPP;
mutex_lock(&speakup_tty_mutex);
if (speakup_tty) {
mutex_unlock(&speakup_tty_mutex);
return -EBUSY;
}
speakup_tty = tty; speakup_tty = tty;
ldisc_data = kmalloc(sizeof(struct spk_ldisc_data), GFP_KERNEL); ldisc_data = kmalloc(sizeof(struct spk_ldisc_data), GFP_KERNEL);
if (!ldisc_data) if (!ldisc_data) {
speakup_tty = NULL;
mutex_unlock(&speakup_tty_mutex);
return -ENOMEM; return -ENOMEM;
}
init_completion(&ldisc_data->completion); init_completion(&ldisc_data->completion);
ldisc_data->buf_free = true; ldisc_data->buf_free = true;
speakup_tty->disc_data = ldisc_data; speakup_tty->disc_data = ldisc_data;
mutex_unlock(&speakup_tty_mutex);
return 0; return 0;
} }

View File

@ -886,8 +886,14 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
struct imx_port *sport = dev_id; struct imx_port *sport = dev_id;
unsigned int usr1, usr2, ucr1, ucr2, ucr3, ucr4; unsigned int usr1, usr2, ucr1, ucr2, ucr3, ucr4;
irqreturn_t ret = IRQ_NONE; irqreturn_t ret = IRQ_NONE;
unsigned long flags = 0;
spin_lock(&sport->port.lock); /*
* IRQs might not be disabled upon entering this interrupt handler,
* e.g. when interrupt handlers are forced to be threaded. To support
* this scenario as well, disable IRQs when acquiring the spinlock.
*/
spin_lock_irqsave(&sport->port.lock, flags);
usr1 = imx_uart_readl(sport, USR1); usr1 = imx_uart_readl(sport, USR1);
usr2 = imx_uart_readl(sport, USR2); usr2 = imx_uart_readl(sport, USR2);
@ -955,7 +961,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id)
ret = IRQ_HANDLED; ret = IRQ_HANDLED;
} }
spin_unlock(&sport->port.lock); spin_unlock_irqrestore(&sport->port.lock, flags);
return ret; return ret;
} }
@ -1960,16 +1966,6 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
unsigned int ucr1; unsigned int ucr1;
unsigned long flags = 0; unsigned long flags = 0;
int locked = 1; int locked = 1;
int retval;
retval = clk_enable(sport->clk_per);
if (retval)
return;
retval = clk_enable(sport->clk_ipg);
if (retval) {
clk_disable(sport->clk_per);
return;
}
if (sport->port.sysrq) if (sport->port.sysrq)
locked = 0; locked = 0;
@ -2005,9 +2001,6 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count)
if (locked) if (locked)
spin_unlock_irqrestore(&sport->port.lock, flags); spin_unlock_irqrestore(&sport->port.lock, flags);
clk_disable(sport->clk_ipg);
clk_disable(sport->clk_per);
} }
/* /*
@ -2108,15 +2101,14 @@ imx_uart_console_setup(struct console *co, char *options)
retval = uart_set_options(&sport->port, co, baud, parity, bits, flow); retval = uart_set_options(&sport->port, co, baud, parity, bits, flow);
clk_disable(sport->clk_ipg);
if (retval) { if (retval) {
clk_unprepare(sport->clk_ipg); clk_disable_unprepare(sport->clk_ipg);
goto error_console; goto error_console;
} }
retval = clk_prepare(sport->clk_per); retval = clk_prepare_enable(sport->clk_per);
if (retval) if (retval)
clk_unprepare(sport->clk_ipg); clk_disable_unprepare(sport->clk_ipg);
error_console: error_console:
return retval; return retval;

View File

@ -21,6 +21,7 @@ LIST_HEAD(efivarfs_list);
static void efivarfs_evict_inode(struct inode *inode) static void efivarfs_evict_inode(struct inode *inode)
{ {
clear_inode(inode); clear_inode(inode);
kfree(inode->i_private);
} }
static const struct super_operations efivarfs_ops = { static const struct super_operations efivarfs_ops = {

View File

@ -2496,7 +2496,8 @@ void ext4_insert_dentry(struct inode *inode,
struct ext4_filename *fname); struct ext4_filename *fname);
static inline void ext4_update_dx_flag(struct inode *inode) static inline void ext4_update_dx_flag(struct inode *inode)
{ {
if (!ext4_has_feature_dir_index(inode->i_sb)) { if (!ext4_has_feature_dir_index(inode->i_sb) &&
ext4_test_inode_flag(inode, EXT4_INODE_INDEX)) {
/* ext4_iget() should have caught this... */ /* ext4_iget() should have caught this... */
WARN_ON_ONCE(ext4_has_feature_metadata_csum(inode->i_sb)); WARN_ON_ONCE(ext4_has_feature_metadata_csum(inode->i_sb));
ext4_clear_inode_flag(inode, EXT4_INODE_INDEX); ext4_clear_inode_flag(inode, EXT4_INODE_INDEX);

View File

@ -2574,13 +2574,13 @@ int gfs2_check_blk_type(struct gfs2_sbd *sdp, u64 no_addr, unsigned int type)
rbm.rgd = rgd; rbm.rgd = rgd;
error = gfs2_rbm_from_block(&rbm, no_addr); error = gfs2_rbm_from_block(&rbm, no_addr);
if (WARN_ON_ONCE(error)) if (!WARN_ON_ONCE(error)) {
goto fail; if (gfs2_testbit(&rbm, false) != type)
error = -ESTALE;
if (gfs2_testbit(&rbm, false) != type) }
error = -ESTALE;
gfs2_glock_dq_uninit(&rgd_gh); gfs2_glock_dq_uninit(&rgd_gh);
fail: fail:
return error; return error;
} }

View File

@ -887,7 +887,7 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
size_t len, loff_t *ppos) size_t len, loff_t *ppos)
{ {
struct simple_attr *attr; struct simple_attr *attr;
u64 val; unsigned long long val;
size_t size; size_t size;
ssize_t ret; ssize_t ret;
@ -905,7 +905,9 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
goto out; goto out;
attr->set_buf[size] = '\0'; attr->set_buf[size] = '\0';
val = simple_strtoll(attr->set_buf, NULL, 0); ret = kstrtoull(attr->set_buf, 0, &val);
if (ret)
goto out;
ret = attr->set(attr->data, val); ret = attr->set(attr->data, val);
if (ret == 0) if (ret == 0)
ret = len; /* on success, claim we got the whole input */ ret = len; /* on success, claim we got the whole input */

Some files were not shown because too many files have changed in this diff Show More