This is the 4.19.102 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl461NIACgkQONu9yGCS aT6Mqw//W5xIIcs0Ut+P+QYNN6lCTRJ0AvFUolz79M3pyK/rHUluwTvYJbDAeGE3 sckv96rE1pxj5ZSf6LegXIoALrA4RlYHS8xXkYnRrt6xfrb7UwpqsJtt4Mx+IrJ3 9uFfaWRSvuDfRCraZxLiE2Bl9xVYvaPfFJYBmH383VB+deYNfpwORFsqNDQT+gR6 PZLuV0x//Kerwmd4OvaaHR/fIl8YVKmIz5lu3+3WIuVKxTK6Bbd3YzVu13dhVaX2 mETflLEAO/sYsUQiS4SO22ejLAiWyD8LyMV8s9KeTFQXzML3JpibKnt3ySDfzsFE m8VRlaLcQwB0Ca2AVGHA5QV0+V+2+6qh/IcZl630feBueGQX59qLQkOurD4e/9lm Na6ZkLPTh9UipIfTu9fvA5HY5lPt2VcSWwG2nLluckfJIpKNFVQEB7vuk9zd7468 qkXmj/J1YDdJzt2YgD0WZuKu3f1/No7rXbNmT2Oj0+HNWWvIU9xFNFlIPAxo7pJy kwekd9+gHI0n1OhLRjzYUyf0pD+j0o75ZHsYYsUW0y6cGoWX/LmQ8JPFi+waHiov FOe8FJz/uDtfQnJ4+izAM5Jjbu1LE+L8uGoIExYAv4DuXgPZtI2wtHvP4HHM3Aov mDWLesMgizsroViv57aXC0C1ZPksPpGeHT+HcH7RnDQ0kQmpe3E= =2XGW -----END PGP SIGNATURE----- Merge 4.19.102 into android-4.19 Changes in 4.19.102 vfs: fix do_last() regression x86/resctrl: Fix use-after-free when deleting resource groups x86/resctrl: Fix use-after-free due to inaccurate refcount of rdtgroup x86/resctrl: Fix a deadlock due to inaccurate reference crypto: pcrypt - Fix user-after-free on module unload rsi: add hci detach for hibernation and poweroff rsi: fix use-after-free on failed probe and unbind perf c2c: Fix return type for histogram sorting comparision functions PM / devfreq: Add new name attribute for sysfs tools lib: Fix builds when glibc contains strlcpy() arm64: kbuild: remove compressed images on 'make ARCH=arm64 (dist)clean' ext4: validate the debug_want_extra_isize mount option at parse time mm/mempolicy.c: fix out of bounds write in mpol_parse_str() reiserfs: Fix memory leak of journal device string media: digitv: don't continue if remote control state can't be read media: af9005: uninitialized variable printked media: vp7045: do not read uninitialized values if usb transfer fails media: gspca: zero usb_buf media: dvb-usb/dvb-usb-urb.c: initialize actlen to 0 tomoyo: Use atomic_t for statistics counter ttyprintk: fix a potential deadlock in interrupt context issue Bluetooth: Fix race condition in hci_release_sock() cgroup: Prevent double killing of css when enabling threaded cgroup media: si470x-i2c: Move free() past last use of 'radio' ARM: dts: sun8i: a83t: Correct USB3503 GPIOs polarity ARM: dts: am57xx-beagle-x15/am57xx-idk: Remove "gpios" for endpoint dt nodes ARM: dts: beagle-x15-common: Model 5V0 regulator soc: ti: wkup_m3_ipc: Fix race condition with rproc_boot tools lib traceevent: Fix memory leakage in filter_event rseq: Unregister rseq for clone CLONE_VM clk: sunxi-ng: h6-r: Fix AR100/R_APB2 parent order mac80211: mesh: restrict airtime metric to peered established plinks clk: mmp2: Fix the order of timer mux parents ASoC: rt5640: Fix NULL dereference on module unload ixgbevf: Remove limit of 10 entries for unicast filter list ixgbe: Fix calculation of queue with VFs and flow director on interface flap igb: Fix SGMII SFP module discovery for 100FX/LX. platform/x86: GPD pocket fan: Allow somewhat lower/higher temperature limits ASoC: sti: fix possible sleep-in-atomic qmi_wwan: Add support for Quectel RM500Q parisc: Use proper printk format for resource_size_t wireless: fix enabling channel 12 for custom regulatory domain cfg80211: Fix radar event during another phy CAC mac80211: Fix TKIP replay protection immediately after key setup wireless: wext: avoid gcc -O3 warning netfilter: nft_tunnel: ERSPAN_VERSION must not be null net: dsa: bcm_sf2: Configure IMP port for 2Gb/sec bnxt_en: Fix ipv6 RFS filter matching logic. riscv: delete temporary files iwlwifi: Don't ignore the cap field upon mcc update ARM: dts: am335x-boneblack-common: fix memory size vti[6]: fix packet tx through bpf_redirect() xfrm interface: fix packet tx through bpf_redirect() xfrm: interface: do not confirm neighbor when do pmtu update scsi: fnic: do not queue commands during fwreset ARM: 8955/1: virt: Relax arch timer version check during early boot tee: optee: Fix compilation issue with nommu airo: Fix possible info leak in AIROOLDIOCTL/SIOCDEVPRIVATE airo: Add missing CAP_NET_ADMIN check in AIROOLDIOCTL/SIOCDEVPRIVATE r8152: get default setting of WOL before initializing ARM: dts: am43x-epos-evm: set data pin directions for spi0 and spi1 qlcnic: Fix CPU soft lockup while collecting firmware dump powerpc/fsl/dts: add fsl,erratum-a011043 net/fsl: treat fsl,erratum-a011043 net: fsl/fman: rename IF_MODE_XGMII to IF_MODE_10G seq_tab_next() should increase position index l2t_seq_next should increase position index net: Fix skb->csum update in inet_proto_csum_replace16(). btrfs: do not zero f_bavail if we have available space perf report: Fix no libunwind compiled warning break s390 issue mm/migrate.c: also overwrite error when it is bigger than zero Linux 4.19.102 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ia9b63c7932b66f469ab0e88467e1e07741408f0b
This commit is contained in:
commit
83b584a64c
96 changed files with 606 additions and 234 deletions
|
@ -7,6 +7,13 @@ Description:
|
|||
The name of devfreq object denoted as ... is same as the
|
||||
name of device using devfreq.
|
||||
|
||||
What: /sys/class/devfreq/.../name
|
||||
Date: November 2019
|
||||
Contact: Chanwoo Choi <cw00.choi@samsung.com>
|
||||
Description:
|
||||
The /sys/class/devfreq/.../name shows the name of device
|
||||
of the corresponding devfreq object.
|
||||
|
||||
What: /sys/class/devfreq/.../governor
|
||||
Date: September 2011
|
||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 101
|
||||
SUBLEVEL = 102
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
|
|
@ -131,6 +131,11 @@
|
|||
};
|
||||
|
||||
/ {
|
||||
memory@80000000 {
|
||||
device_type = "memory";
|
||||
reg = <0x80000000 0x20000000>; /* 512 MB */
|
||||
};
|
||||
|
||||
clk_mcasp0_fixed: clk_mcasp0_fixed {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
|
|
|
@ -839,6 +839,7 @@
|
|||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&spi0_pins_default>;
|
||||
pinctrl-1 = <&spi0_pins_sleep>;
|
||||
ti,pindir-d0-out-d1-in = <1>;
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
|
@ -846,6 +847,7 @@
|
|||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&spi1_pins_default>;
|
||||
pinctrl-1 = <&spi1_pins_sleep>;
|
||||
ti,pindir-d0-out-d1-in = <1>;
|
||||
};
|
||||
|
||||
&usb2_phy1 {
|
||||
|
|
|
@ -93,10 +93,6 @@
|
|||
gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
&pcie1_ep {
|
||||
gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
&mmc1 {
|
||||
pinctrl-names = "default", "hs";
|
||||
pinctrl-0 = <&mmc1_pins_default_no_clk_pu>;
|
||||
|
|
|
@ -71,10 +71,6 @@
|
|||
gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
&pcie1_ep {
|
||||
gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
&mailbox5 {
|
||||
status = "okay";
|
||||
mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
|
||||
|
|
|
@ -32,6 +32,27 @@
|
|||
reg = <0x0 0x80000000 0x0 0x80000000>;
|
||||
};
|
||||
|
||||
main_12v0: fixedregulator-main_12v0 {
|
||||
/* main supply */
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "main_12v0";
|
||||
regulator-min-microvolt = <12000000>;
|
||||
regulator-max-microvolt = <12000000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
evm_5v0: fixedregulator-evm_5v0 {
|
||||
/* Output of TPS54531D */
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "evm_5v0";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
vin-supply = <&main_12v0>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
vdd_3v3: fixedregulator-vdd_3v3 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vdd_3v3";
|
||||
|
@ -550,10 +571,6 @@
|
|||
gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
&pcie1_ep {
|
||||
gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
&mcasp3 {
|
||||
#sound-dai-cells = <0>;
|
||||
assigned-clocks = <&l4per_clkctrl DRA7_MCASP3_CLKCTRL 24>;
|
||||
|
|
|
@ -90,7 +90,7 @@
|
|||
initial-mode = <1>; /* initialize in HUB mode */
|
||||
disabled-ports = <1>;
|
||||
intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */
|
||||
reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */
|
||||
reset-gpios = <&pio 4 16 GPIO_ACTIVE_LOW>; /* PE16 */
|
||||
connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */
|
||||
refclk-frequency = <19200000>;
|
||||
};
|
||||
|
|
|
@ -159,10 +159,9 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE
|
|||
#if !defined(ZIMAGE) && defined(CONFIG_ARM_ARCH_TIMER)
|
||||
@ make CNTP_* and CNTPCT accessible from PL1
|
||||
mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1
|
||||
lsr r7, #16
|
||||
and r7, #0xf
|
||||
cmp r7, #1
|
||||
bne 1f
|
||||
ubfx r7, r7, #16, #4
|
||||
teq r7, #0
|
||||
beq 1f
|
||||
mrc p15, 4, r7, c14, c1, 0 @ CNTHCTL
|
||||
orr r7, r7, #3 @ PL1PCEN | PL1PCTEN
|
||||
mcr p15, 4, r7, c14, c1, 0 @ CNTHCTL
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S
|
||||
|
||||
targets := Image Image.gz
|
||||
targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo
|
||||
|
||||
$(obj)/Image: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
|
|
@ -868,8 +868,8 @@ static void print_parisc_device(struct parisc_device *dev)
|
|||
static int count;
|
||||
|
||||
print_pa_hwpath(dev, hw_path);
|
||||
pr_info("%d. %s at 0x%px [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }",
|
||||
++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type,
|
||||
pr_info("%d. %s at %pap [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }",
|
||||
++count, dev->name, &(dev->hpa.start), hw_path, dev->id.hw_type,
|
||||
dev->id.hversion_rev, dev->id.hversion, dev->id.sversion);
|
||||
|
||||
if (dev->num_addrs) {
|
||||
|
|
|
@ -63,6 +63,7 @@ fman@400000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe1000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy0: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -60,6 +60,7 @@ fman@400000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xf1000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy6: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -63,6 +63,7 @@ fman@400000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe3000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy1: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -60,6 +60,7 @@ fman@400000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xf3000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy7: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@400000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe1000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy0: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@400000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe3000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy1: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@400000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe5000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy2: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@400000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe7000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy3: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@400000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe9000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy4: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@400000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xeb000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy5: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -60,6 +60,7 @@ fman@500000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xf1000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy14: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -60,6 +60,7 @@ fman@500000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xf3000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy15: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@500000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe1000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy8: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@500000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe3000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy9: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@500000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe5000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy10: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@500000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe7000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy11: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@500000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xe9000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy12: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -59,6 +59,7 @@ fman@500000 {
|
|||
#size-cells = <0>;
|
||||
compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
|
||||
reg = <0xeb000 0x1000>;
|
||||
fsl,erratum-a011043; /* must ignore read errors */
|
||||
|
||||
pcsphy13: ethernet-phy@0 {
|
||||
reg = <0x0>;
|
||||
|
|
|
@ -55,7 +55,8 @@ quiet_cmd_vdsold = VDSOLD $@
|
|||
cmd_vdsold = $(CC) $(KBUILD_CFLAGS) $(call cc-option, -no-pie) -nostdlib -nostartfiles $(SYSCFLAGS_$(@F)) \
|
||||
-Wl,-T,$(filter-out FORCE,$^) -o $@.tmp && \
|
||||
$(CROSS_COMPILE)objcopy \
|
||||
$(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@
|
||||
$(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ && \
|
||||
rm $@.tmp
|
||||
|
||||
# install commands for the unstripped file
|
||||
quiet_cmd_vdso_install = INSTALL $@
|
||||
|
|
|
@ -2005,7 +2005,7 @@ static struct dentry *rdt_mount(struct file_system_type *fs_type,
|
|||
|
||||
if (rdt_mon_capable) {
|
||||
ret = mongroup_create_dir(rdtgroup_default.kn,
|
||||
NULL, "mon_groups",
|
||||
&rdtgroup_default, "mon_groups",
|
||||
&kn_mongrp);
|
||||
if (ret) {
|
||||
dentry = ERR_PTR(ret);
|
||||
|
@ -2167,7 +2167,11 @@ static void free_all_child_rdtgrp(struct rdtgroup *rdtgrp)
|
|||
list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) {
|
||||
free_rmid(sentry->mon.rmid);
|
||||
list_del(&sentry->mon.crdtgrp_list);
|
||||
kfree(sentry);
|
||||
|
||||
if (atomic_read(&sentry->waitcount) != 0)
|
||||
sentry->flags = RDT_DELETED;
|
||||
else
|
||||
kfree(sentry);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2205,7 +2209,11 @@ static void rmdir_all_sub(void)
|
|||
|
||||
kernfs_remove(rdtgrp->kn);
|
||||
list_del(&rdtgrp->rdtgroup_list);
|
||||
kfree(rdtgrp);
|
||||
|
||||
if (atomic_read(&rdtgrp->waitcount) != 0)
|
||||
rdtgrp->flags = RDT_DELETED;
|
||||
else
|
||||
kfree(rdtgrp);
|
||||
}
|
||||
/* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */
|
||||
update_closid_rmid(cpu_online_mask, &rdtgroup_default);
|
||||
|
@ -2407,7 +2415,7 @@ static int mkdir_mondata_all(struct kernfs_node *parent_kn,
|
|||
/*
|
||||
* Create the mon_data directory first.
|
||||
*/
|
||||
ret = mongroup_create_dir(parent_kn, NULL, "mon_data", &kn);
|
||||
ret = mongroup_create_dir(parent_kn, prgrp, "mon_data", &kn);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -2560,7 +2568,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
|
|||
uint files = 0;
|
||||
int ret;
|
||||
|
||||
prdtgrp = rdtgroup_kn_lock_live(prgrp_kn);
|
||||
prdtgrp = rdtgroup_kn_lock_live(parent_kn);
|
||||
rdt_last_cmd_clear();
|
||||
if (!prdtgrp) {
|
||||
ret = -ENODEV;
|
||||
|
@ -2635,7 +2643,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
|
|||
kernfs_activate(kn);
|
||||
|
||||
/*
|
||||
* The caller unlocks the prgrp_kn upon success.
|
||||
* The caller unlocks the parent_kn upon success.
|
||||
*/
|
||||
return 0;
|
||||
|
||||
|
@ -2646,7 +2654,7 @@ static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
|
|||
out_free_rgrp:
|
||||
kfree(rdtgrp);
|
||||
out_unlock:
|
||||
rdtgroup_kn_unlock(prgrp_kn);
|
||||
rdtgroup_kn_unlock(parent_kn);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2684,7 +2692,7 @@ static int rdtgroup_mkdir_mon(struct kernfs_node *parent_kn,
|
|||
*/
|
||||
list_add_tail(&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list);
|
||||
|
||||
rdtgroup_kn_unlock(prgrp_kn);
|
||||
rdtgroup_kn_unlock(parent_kn);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2727,7 +2735,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
|
|||
* Create an empty mon_groups directory to hold the subset
|
||||
* of tasks and cpus to monitor.
|
||||
*/
|
||||
ret = mongroup_create_dir(kn, NULL, "mon_groups", NULL);
|
||||
ret = mongroup_create_dir(kn, rdtgrp, "mon_groups", NULL);
|
||||
if (ret) {
|
||||
rdt_last_cmd_puts("kernfs subdir error\n");
|
||||
goto out_del_list;
|
||||
|
@ -2743,7 +2751,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node *parent_kn,
|
|||
out_common_fail:
|
||||
mkdir_rdt_prepare_clean(rdtgrp);
|
||||
out_unlock:
|
||||
rdtgroup_kn_unlock(prgrp_kn);
|
||||
rdtgroup_kn_unlock(parent_kn);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2869,13 +2877,13 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp,
|
|||
closid_free(rdtgrp->closid);
|
||||
free_rmid(rdtgrp->mon.rmid);
|
||||
|
||||
rdtgroup_ctrl_remove(kn, rdtgrp);
|
||||
|
||||
/*
|
||||
* Free all the child monitor group rmids.
|
||||
*/
|
||||
free_all_child_rdtgrp(rdtgrp);
|
||||
|
||||
rdtgroup_ctrl_remove(kn, rdtgrp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -505,11 +505,12 @@ static int __init pcrypt_init(void)
|
|||
|
||||
static void __exit pcrypt_exit(void)
|
||||
{
|
||||
crypto_unregister_template(&pcrypt_tmpl);
|
||||
|
||||
pcrypt_fini_padata(&pencrypt);
|
||||
pcrypt_fini_padata(&pdecrypt);
|
||||
|
||||
kset_unregister(pcrypt_kset);
|
||||
crypto_unregister_template(&pcrypt_tmpl);
|
||||
}
|
||||
|
||||
module_init(pcrypt_init);
|
||||
|
|
|
@ -18,10 +18,11 @@
|
|||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
struct ttyprintk_port {
|
||||
struct tty_port port;
|
||||
struct mutex port_write_mutex;
|
||||
spinlock_t spinlock;
|
||||
};
|
||||
|
||||
static struct ttyprintk_port tpk_port;
|
||||
|
@ -100,11 +101,12 @@ static int tpk_open(struct tty_struct *tty, struct file *filp)
|
|||
static void tpk_close(struct tty_struct *tty, struct file *filp)
|
||||
{
|
||||
struct ttyprintk_port *tpkp = tty->driver_data;
|
||||
unsigned long flags;
|
||||
|
||||
mutex_lock(&tpkp->port_write_mutex);
|
||||
spin_lock_irqsave(&tpkp->spinlock, flags);
|
||||
/* flush tpk_printk buffer */
|
||||
tpk_printk(NULL, 0);
|
||||
mutex_unlock(&tpkp->port_write_mutex);
|
||||
spin_unlock_irqrestore(&tpkp->spinlock, flags);
|
||||
|
||||
tty_port_close(&tpkp->port, tty, filp);
|
||||
}
|
||||
|
@ -116,13 +118,14 @@ static int tpk_write(struct tty_struct *tty,
|
|||
const unsigned char *buf, int count)
|
||||
{
|
||||
struct ttyprintk_port *tpkp = tty->driver_data;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
|
||||
/* exclusive use of tpk_printk within this tty */
|
||||
mutex_lock(&tpkp->port_write_mutex);
|
||||
spin_lock_irqsave(&tpkp->spinlock, flags);
|
||||
ret = tpk_printk(buf, count);
|
||||
mutex_unlock(&tpkp->port_write_mutex);
|
||||
spin_unlock_irqrestore(&tpkp->spinlock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -172,7 +175,7 @@ static int __init ttyprintk_init(void)
|
|||
{
|
||||
int ret = -ENOMEM;
|
||||
|
||||
mutex_init(&tpk_port.port_write_mutex);
|
||||
spin_lock_init(&tpk_port.spinlock);
|
||||
|
||||
ttyprintk_driver = tty_alloc_driver(1,
|
||||
TTY_DRIVER_RESET_TERMIOS |
|
||||
|
|
|
@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock);
|
|||
static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"};
|
||||
|
||||
static DEFINE_SPINLOCK(timer_lock);
|
||||
static const char *timer_parent_names[] = {"clk32", "vctcxo_2", "vctcxo_4", "vctcxo"};
|
||||
static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", "vctcxo"};
|
||||
|
||||
static DEFINE_SPINLOCK(reset_lock);
|
||||
|
||||
|
|
|
@ -23,9 +23,9 @@
|
|||
*/
|
||||
|
||||
static const char * const ar100_r_apb2_parents[] = { "osc24M", "osc32k",
|
||||
"pll-periph0", "iosc" };
|
||||
"iosc", "pll-periph0" };
|
||||
static const struct ccu_mux_var_prediv ar100_r_apb2_predivs[] = {
|
||||
{ .index = 2, .shift = 0, .width = 5 },
|
||||
{ .index = 3, .shift = 0, .width = 5 },
|
||||
};
|
||||
|
||||
static struct ccu_div ar100_clk = {
|
||||
|
|
|
@ -1014,6 +1014,14 @@ int devfreq_remove_governor(struct devfreq_governor *governor)
|
|||
}
|
||||
EXPORT_SYMBOL(devfreq_remove_governor);
|
||||
|
||||
static ssize_t name_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct devfreq *devfreq = to_devfreq(dev);
|
||||
return sprintf(buf, "%s\n", dev_name(devfreq->dev.parent));
|
||||
}
|
||||
static DEVICE_ATTR_RO(name);
|
||||
|
||||
static ssize_t governor_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
|
@ -1330,6 +1338,7 @@ static ssize_t trans_stat_show(struct device *dev,
|
|||
static DEVICE_ATTR_RO(trans_stat);
|
||||
|
||||
static struct attribute *devfreq_attrs[] = {
|
||||
&dev_attr_name.attr,
|
||||
&dev_attr_governor.attr,
|
||||
&dev_attr_available_governors.attr,
|
||||
&dev_attr_cur_freq.attr,
|
||||
|
|
|
@ -483,10 +483,10 @@ static int si470x_i2c_remove(struct i2c_client *client)
|
|||
|
||||
free_irq(client->irq, radio);
|
||||
video_unregister_device(&radio->videodev);
|
||||
kfree(radio);
|
||||
|
||||
v4l2_ctrl_handler_free(&radio->hdl);
|
||||
v4l2_device_unregister(&radio->v4l2_dev);
|
||||
kfree(radio);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -563,7 +563,7 @@ static int af9005_boot_packet(struct usb_device *udev, int type, u8 *reply,
|
|||
u8 *buf, int size)
|
||||
{
|
||||
u16 checksum;
|
||||
int act_len, i, ret;
|
||||
int act_len = 0, i, ret;
|
||||
|
||||
memset(buf, 0, size);
|
||||
buf[0] = (u8) (FW_BULKOUT_SIZE & 0xff);
|
||||
|
|
|
@ -233,18 +233,22 @@ static struct rc_map_table rc_map_digitv_table[] = {
|
|||
|
||||
static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
|
||||
{
|
||||
int i;
|
||||
int ret, i;
|
||||
u8 key[5];
|
||||
u8 b[4] = { 0 };
|
||||
|
||||
*event = 0;
|
||||
*state = REMOTE_NO_KEY_PRESSED;
|
||||
|
||||
digitv_ctrl_msg(d,USB_READ_REMOTE,0,NULL,0,&key[1],4);
|
||||
ret = digitv_ctrl_msg(d, USB_READ_REMOTE, 0, NULL, 0, &key[1], 4);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Tell the device we've read the remote. Not sure how necessary
|
||||
this is, but the Nebula SDK does it. */
|
||||
digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0);
|
||||
ret = digitv_ctrl_msg(d, USB_WRITE_REMOTE, 0, b, 4, NULL, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* if something is inside the buffer, simulate key press */
|
||||
if (key[1] != 0)
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf,
|
||||
u16 rlen, int delay_ms)
|
||||
{
|
||||
int actlen,ret = -ENOMEM;
|
||||
int actlen = 0, ret = -ENOMEM;
|
||||
|
||||
if (!d || wbuf == NULL || wlen == 0)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -99,10 +99,14 @@ static int vp7045_power_ctrl(struct dvb_usb_device *d, int onoff)
|
|||
|
||||
static int vp7045_rc_query(struct dvb_usb_device *d)
|
||||
{
|
||||
int ret;
|
||||
u8 key;
|
||||
vp7045_usb_op(d,RC_VAL_READ,NULL,0,&key,1,20);
|
||||
|
||||
deb_rc("remote query key: %x %d\n",key,key);
|
||||
ret = vp7045_usb_op(d, RC_VAL_READ, NULL, 0, &key, 1, 20);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
deb_rc("remote query key: %x\n", key);
|
||||
|
||||
if (key != 0x44) {
|
||||
/*
|
||||
|
@ -118,15 +122,18 @@ static int vp7045_rc_query(struct dvb_usb_device *d)
|
|||
|
||||
static int vp7045_read_eeprom(struct dvb_usb_device *d,u8 *buf, int len, int offset)
|
||||
{
|
||||
int i = 0;
|
||||
u8 v,br[2];
|
||||
int i, ret;
|
||||
u8 v, br[2];
|
||||
for (i=0; i < len; i++) {
|
||||
v = offset + i;
|
||||
vp7045_usb_op(d,GET_EE_VALUE,&v,1,br,2,5);
|
||||
ret = vp7045_usb_op(d, GET_EE_VALUE, &v, 1, br, 2, 5);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
buf[i] = br[1];
|
||||
}
|
||||
deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ",offset, i);
|
||||
debug_dump(buf,i,deb_info);
|
||||
deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ", offset, i);
|
||||
debug_dump(buf, i, deb_info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1473,7 +1473,7 @@ int gspca_dev_probe2(struct usb_interface *intf,
|
|||
pr_err("couldn't kzalloc gspca struct\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL);
|
||||
gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL);
|
||||
if (!gspca_dev->usb_buf) {
|
||||
pr_err("out of memory\n");
|
||||
ret = -ENOMEM;
|
||||
|
|
|
@ -72,7 +72,7 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port)
|
|||
|
||||
/* Force link status for IMP port */
|
||||
reg = core_readl(priv, offset);
|
||||
reg |= (MII_SW_OR | LINK_STS);
|
||||
reg |= (MII_SW_OR | LINK_STS | GMII_SPEED_UP_2G);
|
||||
core_writel(priv, reg, offset);
|
||||
|
||||
/* Enable Broadcast, Multicast, Unicast forwarding to IMP port */
|
||||
|
|
|
@ -8215,11 +8215,23 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1,
|
|||
struct flow_keys *keys1 = &f1->fkeys;
|
||||
struct flow_keys *keys2 = &f2->fkeys;
|
||||
|
||||
if (keys1->addrs.v4addrs.src == keys2->addrs.v4addrs.src &&
|
||||
keys1->addrs.v4addrs.dst == keys2->addrs.v4addrs.dst &&
|
||||
keys1->ports.ports == keys2->ports.ports &&
|
||||
keys1->basic.ip_proto == keys2->basic.ip_proto &&
|
||||
keys1->basic.n_proto == keys2->basic.n_proto &&
|
||||
if (keys1->basic.n_proto != keys2->basic.n_proto ||
|
||||
keys1->basic.ip_proto != keys2->basic.ip_proto)
|
||||
return false;
|
||||
|
||||
if (keys1->basic.n_proto == htons(ETH_P_IP)) {
|
||||
if (keys1->addrs.v4addrs.src != keys2->addrs.v4addrs.src ||
|
||||
keys1->addrs.v4addrs.dst != keys2->addrs.v4addrs.dst)
|
||||
return false;
|
||||
} else {
|
||||
if (memcmp(&keys1->addrs.v6addrs.src, &keys2->addrs.v6addrs.src,
|
||||
sizeof(keys1->addrs.v6addrs.src)) ||
|
||||
memcmp(&keys1->addrs.v6addrs.dst, &keys2->addrs.v6addrs.dst,
|
||||
sizeof(keys1->addrs.v6addrs.dst)))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (keys1->ports.ports == keys2->ports.ports &&
|
||||
keys1->control.flags == keys2->control.flags &&
|
||||
ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr) &&
|
||||
ether_addr_equal(f1->dst_mac_addr, f2->dst_mac_addr))
|
||||
|
|
|
@ -70,8 +70,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos)
|
|||
static void *seq_tab_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
{
|
||||
v = seq_tab_get_idx(seq->private, *pos + 1);
|
||||
if (v)
|
||||
++*pos;
|
||||
++(*pos);
|
||||
return v;
|
||||
}
|
||||
|
||||
|
|
|
@ -683,8 +683,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t *pos)
|
|||
static void *l2t_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
{
|
||||
v = l2t_get_idx(seq, *pos);
|
||||
if (v)
|
||||
++*pos;
|
||||
++(*pos);
|
||||
return v;
|
||||
}
|
||||
|
||||
|
|
|
@ -110,7 +110,7 @@ do { \
|
|||
/* Interface Mode Register (IF_MODE) */
|
||||
|
||||
#define IF_MODE_MASK 0x00000003 /* 30-31 Mask on i/f mode bits */
|
||||
#define IF_MODE_XGMII 0x00000000 /* 30-31 XGMII (10G) interface */
|
||||
#define IF_MODE_10G 0x00000000 /* 30-31 10G interface */
|
||||
#define IF_MODE_GMII 0x00000002 /* 30-31 GMII (1G) interface */
|
||||
#define IF_MODE_RGMII 0x00000004
|
||||
#define IF_MODE_RGMII_AUTO 0x00008000
|
||||
|
@ -440,7 +440,7 @@ static int init(struct memac_regs __iomem *regs, struct memac_cfg *cfg,
|
|||
tmp = 0;
|
||||
switch (phy_if) {
|
||||
case PHY_INTERFACE_MODE_XGMII:
|
||||
tmp |= IF_MODE_XGMII;
|
||||
tmp |= IF_MODE_10G;
|
||||
break;
|
||||
default:
|
||||
tmp |= IF_MODE_GMII;
|
||||
|
|
|
@ -49,6 +49,7 @@ struct tgec_mdio_controller {
|
|||
struct mdio_fsl_priv {
|
||||
struct tgec_mdio_controller __iomem *mdio_base;
|
||||
bool is_little_endian;
|
||||
bool has_a011043;
|
||||
};
|
||||
|
||||
static u32 xgmac_read32(void __iomem *regs,
|
||||
|
@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int phy_id, int regnum)
|
|||
return ret;
|
||||
|
||||
/* Return all Fs if nothing was there */
|
||||
if (xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) {
|
||||
if ((xgmac_read32(®s->mdio_stat, endian) & MDIO_STAT_RD_ER) &&
|
||||
!priv->has_a011043) {
|
||||
dev_err(&bus->dev,
|
||||
"Error while reading PHY%d reg at %d.%hhu\n",
|
||||
phy_id, dev_addr, regnum);
|
||||
|
@ -274,6 +276,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev)
|
|||
priv->is_little_endian = of_property_read_bool(pdev->dev.of_node,
|
||||
"little-endian");
|
||||
|
||||
priv->has_a011043 = of_property_read_bool(pdev->dev.of_node,
|
||||
"fsl,erratum-a011043");
|
||||
|
||||
ret = of_mdiobus_register(bus, np);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "cannot register MDIO bus\n");
|
||||
|
|
|
@ -530,7 +530,7 @@ static s32 igb_set_sfp_media_type_82575(struct e1000_hw *hw)
|
|||
dev_spec->module_plugged = true;
|
||||
if (eth_flags->e1000_base_lx || eth_flags->e1000_base_sx) {
|
||||
hw->phy.media_type = e1000_media_type_internal_serdes;
|
||||
} else if (eth_flags->e100_base_fx) {
|
||||
} else if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) {
|
||||
dev_spec->sgmii_active = true;
|
||||
hw->phy.media_type = e1000_media_type_internal_serdes;
|
||||
} else if (eth_flags->e1000_base_t) {
|
||||
|
@ -657,14 +657,10 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
|
|||
break;
|
||||
}
|
||||
|
||||
/* do not change link mode for 100BaseFX */
|
||||
if (dev_spec->eth_flags.e100_base_fx)
|
||||
break;
|
||||
|
||||
/* change current link mode setting */
|
||||
ctrl_ext &= ~E1000_CTRL_EXT_LINK_MODE_MASK;
|
||||
|
||||
if (hw->phy.media_type == e1000_media_type_copper)
|
||||
if (dev_spec->sgmii_active)
|
||||
ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_SGMII;
|
||||
else
|
||||
ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES;
|
||||
|
|
|
@ -181,7 +181,7 @@ static int igb_get_link_ksettings(struct net_device *netdev,
|
|||
advertising &= ~ADVERTISED_1000baseKX_Full;
|
||||
}
|
||||
}
|
||||
if (eth_flags->e100_base_fx) {
|
||||
if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) {
|
||||
supported |= SUPPORTED_100baseT_Full;
|
||||
advertising |= ADVERTISED_100baseT_Full;
|
||||
}
|
||||
|
|
|
@ -5189,7 +5189,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)
|
|||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
struct hlist_node *node2;
|
||||
struct ixgbe_fdir_filter *filter;
|
||||
u64 action;
|
||||
u8 queue;
|
||||
|
||||
spin_lock(&adapter->fdir_perfect_lock);
|
||||
|
||||
|
@ -5198,17 +5198,34 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)
|
|||
|
||||
hlist_for_each_entry_safe(filter, node2,
|
||||
&adapter->fdir_filter_list, fdir_node) {
|
||||
action = filter->action;
|
||||
if (action != IXGBE_FDIR_DROP_QUEUE && action != 0)
|
||||
action =
|
||||
(action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1;
|
||||
if (filter->action == IXGBE_FDIR_DROP_QUEUE) {
|
||||
queue = IXGBE_FDIR_DROP_QUEUE;
|
||||
} else {
|
||||
u32 ring = ethtool_get_flow_spec_ring(filter->action);
|
||||
u8 vf = ethtool_get_flow_spec_ring_vf(filter->action);
|
||||
|
||||
if (!vf && (ring >= adapter->num_rx_queues)) {
|
||||
e_err(drv, "FDIR restore failed without VF, ring: %u\n",
|
||||
ring);
|
||||
continue;
|
||||
} else if (vf &&
|
||||
((vf > adapter->num_vfs) ||
|
||||
ring >= adapter->num_rx_queues_per_pool)) {
|
||||
e_err(drv, "FDIR restore failed with VF, vf: %hhu, ring: %u\n",
|
||||
vf, ring);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Map the ring onto the absolute queue index */
|
||||
if (!vf)
|
||||
queue = adapter->rx_ring[ring]->reg_idx;
|
||||
else
|
||||
queue = ((vf - 1) *
|
||||
adapter->num_rx_queues_per_pool) + ring;
|
||||
}
|
||||
|
||||
ixgbe_fdir_write_perfect_filter_82599(hw,
|
||||
&filter->filter,
|
||||
filter->sw_idx,
|
||||
(action == IXGBE_FDIR_DROP_QUEUE) ?
|
||||
IXGBE_FDIR_DROP_QUEUE :
|
||||
adapter->rx_ring[action]->reg_idx);
|
||||
&filter->filter, filter->sw_idx, queue);
|
||||
}
|
||||
|
||||
spin_unlock(&adapter->fdir_perfect_lock);
|
||||
|
|
|
@ -2066,11 +2066,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device *netdev)
|
|||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
int count = 0;
|
||||
|
||||
if ((netdev_uc_count(netdev)) > 10) {
|
||||
pr_err("Too many unicast filters - No Space\n");
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
if (!netdev_uc_empty(netdev)) {
|
||||
struct netdev_hw_addr *ha;
|
||||
|
||||
|
|
|
@ -2043,6 +2043,7 @@ static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev,
|
|||
break;
|
||||
}
|
||||
entry += p_hdr->size;
|
||||
cond_resched();
|
||||
}
|
||||
p_dev->ahw->reset.seq_index = index;
|
||||
}
|
||||
|
|
|
@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter,
|
|||
addr += 16;
|
||||
reg_read -= 16;
|
||||
ret += 16;
|
||||
cond_resched();
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&adapter->ahw->mem_lock);
|
||||
|
@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
|
|||
buf_offset += entry->hdr.cap_size;
|
||||
entry_offset += entry->hdr.offset;
|
||||
buffer = fw_dump->data + buf_offset;
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
fw_dump->clr = 1;
|
||||
|
|
|
@ -999,6 +999,7 @@ static const struct usb_device_id products[] = {
|
|||
{QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0125)}, /* Quectel EC25, EC20 R2.0 Mini PCIe */
|
||||
{QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0306)}, /* Quectel EP06/EG06/EM06 */
|
||||
{QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */
|
||||
{QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */
|
||||
|
||||
/* 3. Combined interface devices matching on interface number */
|
||||
{QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
|
||||
|
|
|
@ -5259,6 +5259,11 @@ static int rtl8152_probe(struct usb_interface *intf,
|
|||
|
||||
intf->needs_remote_wakeup = 1;
|
||||
|
||||
if (!rtl_can_wakeup(tp))
|
||||
__rtl_set_wol(tp, 0);
|
||||
else
|
||||
tp->saved_wolopts = __rtl_get_wol(tp);
|
||||
|
||||
tp->rtl_ops.init(tp);
|
||||
queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0);
|
||||
set_ethernet_addr(tp);
|
||||
|
@ -5272,10 +5277,6 @@ static int rtl8152_probe(struct usb_interface *intf,
|
|||
goto out1;
|
||||
}
|
||||
|
||||
if (!rtl_can_wakeup(tp))
|
||||
__rtl_set_wol(tp, 0);
|
||||
|
||||
tp->saved_wolopts = __rtl_get_wol(tp);
|
||||
if (tp->saved_wolopts)
|
||||
device_set_wakeup_enable(&udev->dev, true);
|
||||
else
|
||||
|
|
|
@ -7786,16 +7786,8 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {
|
|||
case AIROGVLIST: ridcode = RID_APLIST; break;
|
||||
case AIROGDRVNAM: ridcode = RID_DRVNAME; break;
|
||||
case AIROGEHTENC: ridcode = RID_ETHERENCAP; break;
|
||||
case AIROGWEPKTMP: ridcode = RID_WEP_TEMP;
|
||||
/* Only super-user can read WEP keys */
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
break;
|
||||
case AIROGWEPKNV: ridcode = RID_WEP_PERM;
|
||||
/* Only super-user can read WEP keys */
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
break;
|
||||
case AIROGWEPKTMP: ridcode = RID_WEP_TEMP; break;
|
||||
case AIROGWEPKNV: ridcode = RID_WEP_PERM; break;
|
||||
case AIROGSTAT: ridcode = RID_STATUS; break;
|
||||
case AIROGSTATSD32: ridcode = RID_STATSDELTA; break;
|
||||
case AIROGSTATSC32: ridcode = RID_STATS; break;
|
||||
|
@ -7809,7 +7801,13 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) {
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL)
|
||||
if (ridcode == RID_WEP_TEMP || ridcode == RID_WEP_PERM) {
|
||||
/* Only super-user can read WEP keys */
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
if ((iobuf = kzalloc(RIDSIZE, GFP_KERNEL)) == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1);
|
||||
|
|
|
@ -217,6 +217,34 @@ enum iwl_nvm_channel_flags {
|
|||
NVM_CHANNEL_DC_HIGH = BIT(12),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum iwl_reg_capa_flags - global flags applied for the whole regulatory
|
||||
* domain.
|
||||
* @REG_CAPA_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the
|
||||
* 2.4Ghz band is allowed.
|
||||
* @REG_CAPA_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the
|
||||
* 5Ghz band is allowed.
|
||||
* @REG_CAPA_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed
|
||||
* for this regulatory domain (valid only in 5Ghz).
|
||||
* @REG_CAPA_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed
|
||||
* for this regulatory domain (valid only in 5Ghz).
|
||||
* @REG_CAPA_MCS_8_ALLOWED: 11ac with MCS 8 is allowed.
|
||||
* @REG_CAPA_MCS_9_ALLOWED: 11ac with MCS 9 is allowed.
|
||||
* @REG_CAPA_40MHZ_FORBIDDEN: 11n channel with a width of 40Mhz is forbidden
|
||||
* for this regulatory domain (valid only in 5Ghz).
|
||||
* @REG_CAPA_DC_HIGH_ENABLED: DC HIGH allowed.
|
||||
*/
|
||||
enum iwl_reg_capa_flags {
|
||||
REG_CAPA_BF_CCD_LOW_BAND = BIT(0),
|
||||
REG_CAPA_BF_CCD_HIGH_BAND = BIT(1),
|
||||
REG_CAPA_160MHZ_ALLOWED = BIT(2),
|
||||
REG_CAPA_80MHZ_ALLOWED = BIT(3),
|
||||
REG_CAPA_MCS_8_ALLOWED = BIT(4),
|
||||
REG_CAPA_MCS_9_ALLOWED = BIT(5),
|
||||
REG_CAPA_40MHZ_FORBIDDEN = BIT(7),
|
||||
REG_CAPA_DC_HIGH_ENABLED = BIT(9),
|
||||
};
|
||||
|
||||
static inline void iwl_nvm_print_channel_flags(struct device *dev, u32 level,
|
||||
int chan, u16 flags)
|
||||
{
|
||||
|
@ -923,6 +951,7 @@ IWL_EXPORT_SYMBOL(iwl_parse_nvm_data);
|
|||
|
||||
static u32 iwl_nvm_get_regdom_bw_flags(const u8 *nvm_chan,
|
||||
int ch_idx, u16 nvm_flags,
|
||||
u16 cap_flags,
|
||||
const struct iwl_cfg *cfg)
|
||||
{
|
||||
u32 flags = NL80211_RRF_NO_HT40;
|
||||
|
@ -966,6 +995,20 @@ static u32 iwl_nvm_get_regdom_bw_flags(const u8 *nvm_chan,
|
|||
(flags & NL80211_RRF_NO_IR))
|
||||
flags |= NL80211_RRF_GO_CONCURRENT;
|
||||
|
||||
/*
|
||||
* cap_flags is per regulatory domain so apply it for every channel
|
||||
*/
|
||||
if (ch_idx >= NUM_2GHZ_CHANNELS) {
|
||||
if (cap_flags & REG_CAPA_40MHZ_FORBIDDEN)
|
||||
flags |= NL80211_RRF_NO_HT40;
|
||||
|
||||
if (!(cap_flags & REG_CAPA_80MHZ_ALLOWED))
|
||||
flags |= NL80211_RRF_NO_80MHZ;
|
||||
|
||||
if (!(cap_flags & REG_CAPA_160MHZ_ALLOWED))
|
||||
flags |= NL80211_RRF_NO_160MHZ;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
@ -977,7 +1020,7 @@ struct regdb_ptrs {
|
|||
struct ieee80211_regdomain *
|
||||
iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
|
||||
int num_of_ch, __le32 *channels, u16 fw_mcc,
|
||||
u16 geo_info)
|
||||
u16 geo_info, u16 cap)
|
||||
{
|
||||
int ch_idx;
|
||||
u16 ch_flags;
|
||||
|
@ -1038,7 +1081,8 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
|
|||
}
|
||||
|
||||
reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx,
|
||||
ch_flags, cfg);
|
||||
ch_flags, cap,
|
||||
cfg);
|
||||
|
||||
/* we can't continue the same rule */
|
||||
if (ch_idx == 0 || prev_reg_rule_flags != reg_rule_flags ||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
*
|
||||
* Copyright(c) 2008 - 2015 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
* Copyright(c) 2018 - 2019 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
|
@ -34,7 +34,7 @@
|
|||
*
|
||||
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
* Copyright(c) 2018 - 2019 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -108,7 +108,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct iwl_cfg *cfg,
|
|||
struct ieee80211_regdomain *
|
||||
iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
|
||||
int num_of_ch, __le32 *channels, u16 fw_mcc,
|
||||
u16 geo_info);
|
||||
u16 geo_info, u16 cap);
|
||||
|
||||
/**
|
||||
* struct iwl_nvm_section - describes an NVM section in memory.
|
||||
|
|
|
@ -317,7 +317,8 @@ struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
|
|||
__le32_to_cpu(resp->n_channels),
|
||||
resp->channels,
|
||||
__le16_to_cpu(resp->mcc),
|
||||
__le16_to_cpu(resp->geo_info));
|
||||
__le16_to_cpu(resp->geo_info),
|
||||
__le16_to_cpu(resp->cap));
|
||||
/* Store the return source id */
|
||||
src_id = resp->source_id;
|
||||
kfree(resp);
|
||||
|
|
|
@ -1129,6 +1129,12 @@ static void rsi_disconnect(struct sdio_func *pfunction)
|
|||
rsi_mac80211_detach(adapter);
|
||||
mdelay(10);
|
||||
|
||||
if (IS_ENABLED(CONFIG_RSI_COEX) && adapter->priv->coex_mode > 1 &&
|
||||
adapter->priv->bt_adapter) {
|
||||
rsi_bt_ops.detach(adapter->priv->bt_adapter);
|
||||
adapter->priv->bt_adapter = NULL;
|
||||
}
|
||||
|
||||
/* Reset Chip */
|
||||
rsi_reset_chip(adapter);
|
||||
|
||||
|
@ -1305,6 +1311,12 @@ static int rsi_freeze(struct device *dev)
|
|||
rsi_dbg(ERR_ZONE,
|
||||
"##### Device can not wake up through WLAN\n");
|
||||
|
||||
if (IS_ENABLED(CONFIG_RSI_COEX) && common->coex_mode > 1 &&
|
||||
common->bt_adapter) {
|
||||
rsi_bt_ops.detach(common->bt_adapter);
|
||||
common->bt_adapter = NULL;
|
||||
}
|
||||
|
||||
ret = rsi_sdio_disable_interrupts(pfunction);
|
||||
|
||||
if (sdev->write_fail)
|
||||
|
@ -1352,6 +1364,12 @@ static void rsi_shutdown(struct device *dev)
|
|||
if (rsi_config_wowlan(adapter, wowlan))
|
||||
rsi_dbg(ERR_ZONE, "Failed to configure WoWLAN\n");
|
||||
|
||||
if (IS_ENABLED(CONFIG_RSI_COEX) && adapter->priv->coex_mode > 1 &&
|
||||
adapter->priv->bt_adapter) {
|
||||
rsi_bt_ops.detach(adapter->priv->bt_adapter);
|
||||
adapter->priv->bt_adapter = NULL;
|
||||
}
|
||||
|
||||
rsi_sdio_disable_interrupts(sdev->pfunction);
|
||||
|
||||
if (sdev->write_fail)
|
||||
|
|
|
@ -291,6 +291,15 @@ static void rsi_rx_done_handler(struct urb *urb)
|
|||
dev_kfree_skb(rx_cb->rx_skb);
|
||||
}
|
||||
|
||||
static void rsi_rx_urb_kill(struct rsi_hw *adapter, u8 ep_num)
|
||||
{
|
||||
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
|
||||
struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1];
|
||||
struct urb *urb = rx_cb->rx_urb;
|
||||
|
||||
usb_kill_urb(urb);
|
||||
}
|
||||
|
||||
/**
|
||||
* rsi_rx_urb_submit() - This function submits the given URB to the USB stack.
|
||||
* @adapter: Pointer to the adapter structure.
|
||||
|
@ -791,10 +800,13 @@ static int rsi_probe(struct usb_interface *pfunction,
|
|||
if (adapter->priv->coex_mode > 1) {
|
||||
status = rsi_rx_urb_submit(adapter, BT_EP, GFP_KERNEL);
|
||||
if (status)
|
||||
goto err1;
|
||||
goto err_kill_wlan_urb;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_kill_wlan_urb:
|
||||
rsi_rx_urb_kill(adapter, WLAN_EP);
|
||||
err1:
|
||||
rsi_deinit_usb_interface(adapter);
|
||||
err:
|
||||
|
@ -818,6 +830,17 @@ static void rsi_disconnect(struct usb_interface *pfunction)
|
|||
return;
|
||||
|
||||
rsi_mac80211_detach(adapter);
|
||||
|
||||
if (IS_ENABLED(CONFIG_RSI_COEX) && adapter->priv->coex_mode > 1 &&
|
||||
adapter->priv->bt_adapter) {
|
||||
rsi_bt_ops.detach(adapter->priv->bt_adapter);
|
||||
adapter->priv->bt_adapter = NULL;
|
||||
}
|
||||
|
||||
if (adapter->priv->coex_mode > 1)
|
||||
rsi_rx_urb_kill(adapter, BT_EP);
|
||||
rsi_rx_urb_kill(adapter, WLAN_EP);
|
||||
|
||||
rsi_reset_card(adapter);
|
||||
rsi_deinit_usb_interface(adapter);
|
||||
rsi_91x_deinit(adapter);
|
||||
|
|
|
@ -127,7 +127,7 @@ static int gpd_pocket_fan_probe(struct platform_device *pdev)
|
|||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(temp_limits); i++) {
|
||||
if (temp_limits[i] < 40000 || temp_limits[i] > 70000) {
|
||||
if (temp_limits[i] < 20000 || temp_limits[i] > 90000) {
|
||||
dev_err(&pdev->dev, "Invalid temp-limit %d (must be between 40000 and 70000)\n",
|
||||
temp_limits[i]);
|
||||
temp_limits[0] = TEMP_LIMIT0_DEFAULT;
|
||||
|
|
|
@ -446,6 +446,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_
|
|||
if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED)))
|
||||
return SCSI_MLQUEUE_HOST_BUSY;
|
||||
|
||||
if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_FWRESET)))
|
||||
return SCSI_MLQUEUE_HOST_BUSY;
|
||||
|
||||
rport = starget_to_rport(scsi_target(sc->device));
|
||||
if (!rport) {
|
||||
FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
|
||||
|
|
|
@ -426,6 +426,8 @@ static void wkup_m3_rproc_boot_thread(struct wkup_m3_ipc *m3_ipc)
|
|||
ret = rproc_boot(m3_ipc->rproc);
|
||||
if (ret)
|
||||
dev_err(dev, "rproc_boot failed\n");
|
||||
else
|
||||
m3_ipc_state = m3_ipc;
|
||||
|
||||
do_exit(0);
|
||||
}
|
||||
|
@ -512,8 +514,6 @@ static int wkup_m3_ipc_probe(struct platform_device *pdev)
|
|||
goto err_put_rproc;
|
||||
}
|
||||
|
||||
m3_ipc_state = m3_ipc;
|
||||
|
||||
return 0;
|
||||
|
||||
err_put_rproc:
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
config OPTEE
|
||||
tristate "OP-TEE"
|
||||
depends on HAVE_ARM_SMCCC
|
||||
depends on MMU
|
||||
help
|
||||
This implements the OP-TEE Trusted Execution Environment (TEE)
|
||||
driver.
|
||||
|
|
|
@ -2167,7 +2167,15 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|||
*/
|
||||
thresh = SZ_4M;
|
||||
|
||||
if (!mixed && total_free_meta - thresh < block_rsv->size)
|
||||
/*
|
||||
* We only want to claim there's no available space if we can no longer
|
||||
* allocate chunks for our metadata profile and our global reserve will
|
||||
* not fit in the free metadata space. If we aren't ->full then we
|
||||
* still can allocate chunks and thus are fine using the currently
|
||||
* calculated f_bavail.
|
||||
*/
|
||||
if (!mixed && block_rsv->space_info->full &&
|
||||
total_free_meta - thresh < block_rsv->size)
|
||||
buf->f_bavail = 0;
|
||||
|
||||
buf->f_type = BTRFS_SUPER_MAGIC;
|
||||
|
|
127
fs/ext4/super.c
127
fs/ext4/super.c
|
@ -1910,6 +1910,13 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
|
|||
arg = JBD2_DEFAULT_MAX_COMMIT_AGE;
|
||||
sbi->s_commit_interval = HZ * arg;
|
||||
} else if (token == Opt_debug_want_extra_isize) {
|
||||
if ((arg & 1) ||
|
||||
(arg < 4) ||
|
||||
(arg > (sbi->s_inode_size - EXT4_GOOD_OLD_INODE_SIZE))) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"Invalid want_extra_isize %d", arg);
|
||||
return -1;
|
||||
}
|
||||
sbi->s_want_extra_isize = arg;
|
||||
} else if (token == Opt_max_batch_time) {
|
||||
sbi->s_max_batch_time = arg;
|
||||
|
@ -3590,40 +3597,6 @@ int ext4_calculate_overhead(struct super_block *sb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void ext4_clamp_want_extra_isize(struct super_block *sb)
|
||||
{
|
||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||
struct ext4_super_block *es = sbi->s_es;
|
||||
unsigned def_extra_isize = sizeof(struct ext4_inode) -
|
||||
EXT4_GOOD_OLD_INODE_SIZE;
|
||||
|
||||
if (sbi->s_inode_size == EXT4_GOOD_OLD_INODE_SIZE) {
|
||||
sbi->s_want_extra_isize = 0;
|
||||
return;
|
||||
}
|
||||
if (sbi->s_want_extra_isize < 4) {
|
||||
sbi->s_want_extra_isize = def_extra_isize;
|
||||
if (ext4_has_feature_extra_isize(sb)) {
|
||||
if (sbi->s_want_extra_isize <
|
||||
le16_to_cpu(es->s_want_extra_isize))
|
||||
sbi->s_want_extra_isize =
|
||||
le16_to_cpu(es->s_want_extra_isize);
|
||||
if (sbi->s_want_extra_isize <
|
||||
le16_to_cpu(es->s_min_extra_isize))
|
||||
sbi->s_want_extra_isize =
|
||||
le16_to_cpu(es->s_min_extra_isize);
|
||||
}
|
||||
}
|
||||
/* Check if enough inode space is available */
|
||||
if ((sbi->s_want_extra_isize > sbi->s_inode_size) ||
|
||||
(EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize >
|
||||
sbi->s_inode_size)) {
|
||||
sbi->s_want_extra_isize = def_extra_isize;
|
||||
ext4_msg(sb, KERN_INFO,
|
||||
"required extra inode space not available");
|
||||
}
|
||||
}
|
||||
|
||||
static void ext4_set_resv_clusters(struct super_block *sb)
|
||||
{
|
||||
ext4_fsblk_t resv_clusters;
|
||||
|
@ -3831,6 +3804,65 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||
*/
|
||||
sbi->s_li_wait_mult = EXT4_DEF_LI_WAIT_MULT;
|
||||
|
||||
if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) {
|
||||
sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE;
|
||||
sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO;
|
||||
} else {
|
||||
sbi->s_inode_size = le16_to_cpu(es->s_inode_size);
|
||||
sbi->s_first_ino = le32_to_cpu(es->s_first_ino);
|
||||
if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) {
|
||||
ext4_msg(sb, KERN_ERR, "invalid first ino: %u",
|
||||
sbi->s_first_ino);
|
||||
goto failed_mount;
|
||||
}
|
||||
if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) ||
|
||||
(!is_power_of_2(sbi->s_inode_size)) ||
|
||||
(sbi->s_inode_size > blocksize)) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"unsupported inode size: %d",
|
||||
sbi->s_inode_size);
|
||||
goto failed_mount;
|
||||
}
|
||||
/*
|
||||
* i_atime_extra is the last extra field available for
|
||||
* [acm]times in struct ext4_inode. Checking for that
|
||||
* field should suffice to ensure we have extra space
|
||||
* for all three.
|
||||
*/
|
||||
if (sbi->s_inode_size >= offsetof(struct ext4_inode, i_atime_extra) +
|
||||
sizeof(((struct ext4_inode *)0)->i_atime_extra)) {
|
||||
sb->s_time_gran = 1;
|
||||
} else {
|
||||
sb->s_time_gran = NSEC_PER_SEC;
|
||||
}
|
||||
}
|
||||
if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) {
|
||||
sbi->s_want_extra_isize = sizeof(struct ext4_inode) -
|
||||
EXT4_GOOD_OLD_INODE_SIZE;
|
||||
if (ext4_has_feature_extra_isize(sb)) {
|
||||
unsigned v, max = (sbi->s_inode_size -
|
||||
EXT4_GOOD_OLD_INODE_SIZE);
|
||||
|
||||
v = le16_to_cpu(es->s_want_extra_isize);
|
||||
if (v > max) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"bad s_want_extra_isize: %d", v);
|
||||
goto failed_mount;
|
||||
}
|
||||
if (sbi->s_want_extra_isize < v)
|
||||
sbi->s_want_extra_isize = v;
|
||||
|
||||
v = le16_to_cpu(es->s_min_extra_isize);
|
||||
if (v > max) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"bad s_min_extra_isize: %d", v);
|
||||
goto failed_mount;
|
||||
}
|
||||
if (sbi->s_want_extra_isize < v)
|
||||
sbi->s_want_extra_isize = v;
|
||||
}
|
||||
}
|
||||
|
||||
if (sbi->s_es->s_mount_opts[0]) {
|
||||
char *s_mount_opts = kstrndup(sbi->s_es->s_mount_opts,
|
||||
sizeof(sbi->s_es->s_mount_opts),
|
||||
|
@ -4069,29 +4101,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||
has_huge_files);
|
||||
sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files);
|
||||
|
||||
if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) {
|
||||
sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE;
|
||||
sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO;
|
||||
} else {
|
||||
sbi->s_inode_size = le16_to_cpu(es->s_inode_size);
|
||||
sbi->s_first_ino = le32_to_cpu(es->s_first_ino);
|
||||
if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) {
|
||||
ext4_msg(sb, KERN_ERR, "invalid first ino: %u",
|
||||
sbi->s_first_ino);
|
||||
goto failed_mount;
|
||||
}
|
||||
if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) ||
|
||||
(!is_power_of_2(sbi->s_inode_size)) ||
|
||||
(sbi->s_inode_size > blocksize)) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"unsupported inode size: %d",
|
||||
sbi->s_inode_size);
|
||||
goto failed_mount;
|
||||
}
|
||||
if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE)
|
||||
sb->s_time_gran = 1 << (EXT4_EPOCH_BITS - 2);
|
||||
}
|
||||
|
||||
sbi->s_desc_size = le16_to_cpu(es->s_desc_size);
|
||||
if (ext4_has_feature_64bit(sb)) {
|
||||
if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE_64BIT ||
|
||||
|
@ -4549,8 +4558,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||
} else if (ret)
|
||||
goto failed_mount4a;
|
||||
|
||||
ext4_clamp_want_extra_isize(sb);
|
||||
|
||||
ext4_set_resv_clusters(sb);
|
||||
|
||||
err = ext4_setup_system_zone(sb);
|
||||
|
@ -5340,8 +5347,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
|
|||
goto restore_opts;
|
||||
}
|
||||
|
||||
ext4_clamp_want_extra_isize(sb);
|
||||
|
||||
if ((old_opts.s_mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) ^
|
||||
test_opt(sb, JOURNAL_CHECKSUM)) {
|
||||
ext4_msg(sb, KERN_ERR, "changing journal_checksum "
|
||||
|
|
|
@ -3376,8 +3376,8 @@ static int do_last(struct nameidata *nd,
|
|||
struct file *file, const struct open_flags *op)
|
||||
{
|
||||
struct dentry *dir = nd->path.dentry;
|
||||
kuid_t dir_uid = dir->d_inode->i_uid;
|
||||
umode_t dir_mode = dir->d_inode->i_mode;
|
||||
kuid_t dir_uid = nd->inode->i_uid;
|
||||
umode_t dir_mode = nd->inode->i_mode;
|
||||
int open_flag = op->open_flag;
|
||||
bool will_truncate = (open_flag & O_TRUNC) != 0;
|
||||
bool got_write = false;
|
||||
|
|
|
@ -629,6 +629,7 @@ static void reiserfs_put_super(struct super_block *s)
|
|||
reiserfs_write_unlock(s);
|
||||
mutex_destroy(&REISERFS_SB(s)->lock);
|
||||
destroy_workqueue(REISERFS_SB(s)->commit_wq);
|
||||
kfree(REISERFS_SB(s)->s_jdev);
|
||||
kfree(s->s_fs_info);
|
||||
s->s_fs_info = NULL;
|
||||
}
|
||||
|
@ -2243,6 +2244,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
|
|||
kfree(qf_names[j]);
|
||||
}
|
||||
#endif
|
||||
kfree(sbi->s_jdev);
|
||||
kfree(sbi);
|
||||
|
||||
s->s_fs_info = NULL;
|
||||
|
|
|
@ -1913,11 +1913,11 @@ static inline void rseq_migrate(struct task_struct *t)
|
|||
|
||||
/*
|
||||
* If parent process has a registered restartable sequences area, the
|
||||
* child inherits. Only applies when forking a process, not a thread.
|
||||
* child inherits. Unregister rseq for a clone with CLONE_VM set.
|
||||
*/
|
||||
static inline void rseq_fork(struct task_struct *t, unsigned long clone_flags)
|
||||
{
|
||||
if (clone_flags & CLONE_THREAD) {
|
||||
if (clone_flags & CLONE_VM) {
|
||||
t->rseq = NULL;
|
||||
t->rseq_len = 0;
|
||||
t->rseq_sig = 0;
|
||||
|
|
|
@ -3050,6 +3050,9 @@ struct cfg80211_external_auth_params {
|
|||
*
|
||||
* @start_radar_detection: Start radar detection in the driver.
|
||||
*
|
||||
* @end_cac: End running CAC, probably because a related CAC
|
||||
* was finished on another phy.
|
||||
*
|
||||
* @update_ft_ies: Provide updated Fast BSS Transition information to the
|
||||
* driver. If the SME is in the driver/firmware, this information can be
|
||||
* used in building Authentication and Reassociation Request frames.
|
||||
|
@ -3364,6 +3367,8 @@ struct cfg80211_ops {
|
|||
struct net_device *dev,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
u32 cac_time_ms);
|
||||
void (*end_cac)(struct wiphy *wiphy,
|
||||
struct net_device *dev);
|
||||
int (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev,
|
||||
struct cfg80211_update_ft_ies_params *ftie);
|
||||
int (*crit_proto_start)(struct wiphy *wiphy,
|
||||
|
|
|
@ -2941,8 +2941,6 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp)
|
|||
for_each_subsys(ss, ssid) {
|
||||
struct cgroup_subsys_state *css = cgroup_css(dsct, ss);
|
||||
|
||||
WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt));
|
||||
|
||||
if (!(cgroup_ss_mask(dsct) & (1 << ss->id)))
|
||||
continue;
|
||||
|
||||
|
@ -2952,6 +2950,8 @@ static int cgroup_apply_control_enable(struct cgroup *cgrp)
|
|||
return PTR_ERR(css);
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt));
|
||||
|
||||
if (css_visible(css)) {
|
||||
ret = css_populate_dir(css);
|
||||
if (ret)
|
||||
|
@ -2987,11 +2987,11 @@ static void cgroup_apply_control_disable(struct cgroup *cgrp)
|
|||
for_each_subsys(ss, ssid) {
|
||||
struct cgroup_subsys_state *css = cgroup_css(dsct, ss);
|
||||
|
||||
WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt));
|
||||
|
||||
if (!css)
|
||||
continue;
|
||||
|
||||
WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt));
|
||||
|
||||
if (css->parent &&
|
||||
!(cgroup_ss_mask(dsct) & (1 << ss->id))) {
|
||||
kill_css(css);
|
||||
|
@ -3278,7 +3278,8 @@ static ssize_t cgroup_type_write(struct kernfs_open_file *of, char *buf,
|
|||
if (strcmp(strstrip(buf), "threaded"))
|
||||
return -EINVAL;
|
||||
|
||||
cgrp = cgroup_kn_lock_live(of->kn, false);
|
||||
/* drain dying csses before we re-apply (threaded) subtree control */
|
||||
cgrp = cgroup_kn_lock_live(of->kn, true);
|
||||
if (!cgrp)
|
||||
return -ENOENT;
|
||||
|
||||
|
|
|
@ -2812,6 +2812,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol)
|
|||
char *flags = strchr(str, '=');
|
||||
int err = 1;
|
||||
|
||||
if (flags)
|
||||
*flags++ = '\0'; /* terminate mode string */
|
||||
|
||||
if (nodelist) {
|
||||
/* NUL-terminate mode or flags string */
|
||||
*nodelist++ = '\0';
|
||||
|
@ -2822,9 +2825,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol)
|
|||
} else
|
||||
nodes_clear(nodes);
|
||||
|
||||
if (flags)
|
||||
*flags++ = '\0'; /* terminate mode string */
|
||||
|
||||
for (mode = 0; mode < MPOL_MAX; mode++) {
|
||||
if (!strcmp(str, policy_modes[mode])) {
|
||||
break;
|
||||
|
|
|
@ -1674,7 +1674,7 @@ static int do_pages_move(struct mm_struct *mm, nodemask_t task_nodes,
|
|||
err1 = do_move_pages_to_node(mm, &pagelist, current_node);
|
||||
if (!err1)
|
||||
err1 = store_status(status, start, current_node, i - start);
|
||||
if (!err)
|
||||
if (err >= 0)
|
||||
err = err1;
|
||||
out:
|
||||
return err;
|
||||
|
|
|
@ -831,6 +831,8 @@ static int hci_sock_release(struct socket *sock)
|
|||
if (!sk)
|
||||
return 0;
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
switch (hci_pi(sk)->channel) {
|
||||
case HCI_CHANNEL_MONITOR:
|
||||
atomic_dec(&monitor_promisc);
|
||||
|
@ -878,6 +880,7 @@ static int hci_sock_release(struct socket *sock)
|
|||
skb_queue_purge(&sk->sk_receive_queue);
|
||||
skb_queue_purge(&sk->sk_write_queue);
|
||||
|
||||
release_sock(sk);
|
||||
sock_put(sk);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -442,6 +442,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
|
|||
}
|
||||
EXPORT_SYMBOL(inet_proto_csum_replace4);
|
||||
|
||||
/**
|
||||
* inet_proto_csum_replace16 - update layer 4 header checksum field
|
||||
* @sum: Layer 4 header checksum field
|
||||
* @skb: sk_buff for the packet
|
||||
* @from: old IPv6 address
|
||||
* @to: new IPv6 address
|
||||
* @pseudohdr: True if layer 4 header checksum includes pseudoheader
|
||||
*
|
||||
* Update layer 4 header as per the update in IPv6 src/dst address.
|
||||
*
|
||||
* There is no need to update skb->csum in this function, because update in two
|
||||
* fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each other
|
||||
* for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs to
|
||||
* update skb->csum, because update in 3 fields a.) IPv4 src/dst address,
|
||||
* b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as
|
||||
* L4 Header checksum for skb->csum calculation.
|
||||
*/
|
||||
void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
|
||||
const __be32 *from, const __be32 *to,
|
||||
bool pseudohdr)
|
||||
|
@ -453,9 +470,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
|
|||
if (skb->ip_summed != CHECKSUM_PARTIAL) {
|
||||
*sum = csum_fold(csum_partial(diff, sizeof(diff),
|
||||
~csum_unfold(*sum)));
|
||||
if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr)
|
||||
skb->csum = ~csum_partial(diff, sizeof(diff),
|
||||
~skb->csum);
|
||||
} else if (pseudohdr)
|
||||
*sum = ~csum_fold(csum_partial(diff, sizeof(diff),
|
||||
csum_unfold(*sum)));
|
||||
|
|
|
@ -208,8 +208,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct net_device *dev,
|
|||
int mtu;
|
||||
|
||||
if (!dst) {
|
||||
dev->stats.tx_carrier_errors++;
|
||||
goto tx_error_icmp;
|
||||
struct rtable *rt;
|
||||
|
||||
fl->u.ip4.flowi4_oif = dev->ifindex;
|
||||
fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
|
||||
rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4);
|
||||
if (IS_ERR(rt)) {
|
||||
dev->stats.tx_carrier_errors++;
|
||||
goto tx_error_icmp;
|
||||
}
|
||||
dst = &rt->dst;
|
||||
skb_dst_set(skb, dst);
|
||||
}
|
||||
|
||||
dst_hold(dst);
|
||||
|
|
|
@ -453,8 +453,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
|
|||
int err = -1;
|
||||
int mtu;
|
||||
|
||||
if (!dst)
|
||||
goto tx_err_link_failure;
|
||||
if (!dst) {
|
||||
fl->u.ip6.flowi6_oif = dev->ifindex;
|
||||
fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC;
|
||||
dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6);
|
||||
if (dst->error) {
|
||||
dst_release(dst);
|
||||
dst = NULL;
|
||||
goto tx_err_link_failure;
|
||||
}
|
||||
skb_dst_set(skb, dst);
|
||||
}
|
||||
|
||||
dst_hold(dst);
|
||||
dst = xfrm_lookup(t->net, dst, fl, NULL, 0);
|
||||
|
|
|
@ -2825,6 +2825,28 @@ static int ieee80211_start_radar_detection(struct wiphy *wiphy,
|
|||
return err;
|
||||
}
|
||||
|
||||
static void ieee80211_end_cac(struct wiphy *wiphy,
|
||||
struct net_device *dev)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
|
||||
mutex_lock(&local->mtx);
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
/* it might be waiting for the local->mtx, but then
|
||||
* by the time it gets it, sdata->wdev.cac_started
|
||||
* will no longer be true
|
||||
*/
|
||||
cancel_delayed_work(&sdata->dfs_cac_timer_work);
|
||||
|
||||
if (sdata->wdev.cac_started) {
|
||||
ieee80211_vif_release_channel(sdata);
|
||||
sdata->wdev.cac_started = false;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&local->mtx);
|
||||
}
|
||||
|
||||
static struct cfg80211_beacon_data *
|
||||
cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
|
||||
{
|
||||
|
@ -3848,6 +3870,7 @@ const struct cfg80211_ops mac80211_config_ops = {
|
|||
#endif
|
||||
.get_channel = ieee80211_cfg_get_channel,
|
||||
.start_radar_detection = ieee80211_start_radar_detection,
|
||||
.end_cac = ieee80211_end_cac,
|
||||
.channel_switch = ieee80211_channel_switch,
|
||||
.set_qos_map = ieee80211_set_qos_map,
|
||||
.set_ap_chanwidth = ieee80211_set_ap_chanwidth,
|
||||
|
|
|
@ -326,6 +326,9 @@ static u32 airtime_link_metric_get(struct ieee80211_local *local,
|
|||
unsigned long fail_avg =
|
||||
ewma_mesh_fail_avg_read(&sta->mesh->fail_avg);
|
||||
|
||||
if (sta->mesh->plink_state != NL80211_PLINK_ESTAB)
|
||||
return MAX_METRIC;
|
||||
|
||||
/* Try to get rate based on HW/SW RC algorithm.
|
||||
* Rate is returned in units of Kbps, correct this
|
||||
* to comply with airtime calculation units
|
||||
|
|
|
@ -266,9 +266,21 @@ int ieee80211_tkip_decrypt_data(struct crypto_cipher *tfm,
|
|||
if ((keyid >> 6) != key->conf.keyidx)
|
||||
return TKIP_DECRYPT_INVALID_KEYIDX;
|
||||
|
||||
if (rx_ctx->ctx.state != TKIP_STATE_NOT_INIT &&
|
||||
(iv32 < rx_ctx->iv32 ||
|
||||
(iv32 == rx_ctx->iv32 && iv16 <= rx_ctx->iv16)))
|
||||
/* Reject replays if the received TSC is smaller than or equal to the
|
||||
* last received value in a valid message, but with an exception for
|
||||
* the case where a new key has been set and no valid frame using that
|
||||
* key has yet received and the local RSC was initialized to 0. This
|
||||
* exception allows the very first frame sent by the transmitter to be
|
||||
* accepted even if that transmitter were to use TSC 0 (IEEE 802.11
|
||||
* described TSC to be initialized to 1 whenever a new key is taken into
|
||||
* use).
|
||||
*/
|
||||
if (iv32 < rx_ctx->iv32 ||
|
||||
(iv32 == rx_ctx->iv32 &&
|
||||
(iv16 < rx_ctx->iv16 ||
|
||||
(iv16 == rx_ctx->iv16 &&
|
||||
(rx_ctx->iv32 || rx_ctx->iv16 ||
|
||||
rx_ctx->ctx.state != TKIP_STATE_NOT_INIT)))))
|
||||
return TKIP_DECRYPT_REPLAY;
|
||||
|
||||
if (only_iv) {
|
||||
|
|
|
@ -235,6 +235,9 @@ static int nft_tunnel_obj_erspan_init(const struct nlattr *attr,
|
|||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (!tb[NFTA_TUNNEL_KEY_ERSPAN_VERSION])
|
||||
return -EINVAL;
|
||||
|
||||
version = ntohl(nla_get_be32(tb[NFTA_TUNNEL_KEY_ERSPAN_VERSION]));
|
||||
switch (version) {
|
||||
case ERSPAN_VERSION:
|
||||
|
|
|
@ -1170,6 +1170,16 @@ rdev_start_radar_detection(struct cfg80211_registered_device *rdev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static inline void
|
||||
rdev_end_cac(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev)
|
||||
{
|
||||
trace_rdev_end_cac(&rdev->wiphy, dev);
|
||||
if (rdev->ops->end_cac)
|
||||
rdev->ops->end_cac(&rdev->wiphy, dev);
|
||||
trace_rdev_return_void(&rdev->wiphy);
|
||||
}
|
||||
|
||||
static inline int
|
||||
rdev_set_mcast_rate(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *dev,
|
||||
|
|
|
@ -2254,14 +2254,15 @@ static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)
|
|||
|
||||
static void handle_channel_custom(struct wiphy *wiphy,
|
||||
struct ieee80211_channel *chan,
|
||||
const struct ieee80211_regdomain *regd)
|
||||
const struct ieee80211_regdomain *regd,
|
||||
u32 min_bw)
|
||||
{
|
||||
u32 bw_flags = 0;
|
||||
const struct ieee80211_reg_rule *reg_rule = NULL;
|
||||
const struct ieee80211_power_rule *power_rule = NULL;
|
||||
u32 bw;
|
||||
|
||||
for (bw = MHZ_TO_KHZ(20); bw >= MHZ_TO_KHZ(5); bw = bw / 2) {
|
||||
for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) {
|
||||
reg_rule = freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq),
|
||||
regd, bw);
|
||||
if (!IS_ERR(reg_rule))
|
||||
|
@ -2317,8 +2318,14 @@ static void handle_band_custom(struct wiphy *wiphy,
|
|||
if (!sband)
|
||||
return;
|
||||
|
||||
/*
|
||||
* We currently assume that you always want at least 20 MHz,
|
||||
* otherwise channel 12 might get enabled if this rule is
|
||||
* compatible to US, which permits 2402 - 2472 MHz.
|
||||
*/
|
||||
for (i = 0; i < sband->n_channels; i++)
|
||||
handle_channel_custom(wiphy, &sband->channels[i], regd);
|
||||
handle_channel_custom(wiphy, &sband->channels[i], regd,
|
||||
MHZ_TO_KHZ(20));
|
||||
}
|
||||
|
||||
/* Used by drivers prior to wiphy registration */
|
||||
|
@ -3833,6 +3840,25 @@ bool regulatory_pre_cac_allowed(struct wiphy *wiphy)
|
|||
return pre_cac_allowed;
|
||||
}
|
||||
|
||||
static void cfg80211_check_and_end_cac(struct cfg80211_registered_device *rdev)
|
||||
{
|
||||
struct wireless_dev *wdev;
|
||||
/* If we finished CAC or received radar, we should end any
|
||||
* CAC running on the same channels.
|
||||
* the check !cfg80211_chandef_dfs_usable contain 2 options:
|
||||
* either all channels are available - those the CAC_FINISHED
|
||||
* event has effected another wdev state, or there is a channel
|
||||
* in unavailable state in wdev chandef - those the RADAR_DETECTED
|
||||
* event has effected another wdev state.
|
||||
* In both cases we should end the CAC on the wdev.
|
||||
*/
|
||||
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
|
||||
if (wdev->cac_started &&
|
||||
!cfg80211_chandef_dfs_usable(&rdev->wiphy, &wdev->chandef))
|
||||
rdev_end_cac(rdev, wdev->netdev);
|
||||
}
|
||||
}
|
||||
|
||||
void regulatory_propagate_dfs_state(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
enum nl80211_dfs_state dfs_state,
|
||||
|
@ -3859,8 +3885,10 @@ void regulatory_propagate_dfs_state(struct wiphy *wiphy,
|
|||
cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state);
|
||||
|
||||
if (event == NL80211_RADAR_DETECTED ||
|
||||
event == NL80211_RADAR_CAC_FINISHED)
|
||||
event == NL80211_RADAR_CAC_FINISHED) {
|
||||
cfg80211_sched_dfs_chan_update(rdev);
|
||||
cfg80211_check_and_end_cac(rdev);
|
||||
}
|
||||
|
||||
nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL);
|
||||
}
|
||||
|
|
|
@ -607,6 +607,11 @@ DEFINE_EVENT(wiphy_netdev_evt, rdev_flush_pmksa,
|
|||
TP_ARGS(wiphy, netdev)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(wiphy_netdev_evt, rdev_end_cac,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev),
|
||||
TP_ARGS(wiphy, netdev)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(station_add_change,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac,
|
||||
struct station_parameters *params),
|
||||
|
|
|
@ -657,7 +657,8 @@ struct iw_statistics *get_wireless_stats(struct net_device *dev)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int iw_handler_get_iwstats(struct net_device * dev,
|
||||
/* noinline to avoid a bogus warning with -O3 */
|
||||
static noinline int iw_handler_get_iwstats(struct net_device * dev,
|
||||
struct iw_request_info * info,
|
||||
union iwreq_data * wrqu,
|
||||
char * extra)
|
||||
|
|
|
@ -268,9 +268,6 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
|
|||
int err = -1;
|
||||
int mtu;
|
||||
|
||||
if (!dst)
|
||||
goto tx_err_link_failure;
|
||||
|
||||
dst_hold(dst);
|
||||
dst = xfrm_lookup_with_ifid(xi->net, dst, fl, NULL, 0, xi->p.if_id);
|
||||
if (IS_ERR(dst)) {
|
||||
|
@ -297,7 +294,7 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, struct flowi *fl)
|
|||
|
||||
mtu = dst_mtu(dst);
|
||||
if (!skb->ignore_df && skb->len > mtu) {
|
||||
skb_dst_update_pmtu(skb, mtu);
|
||||
skb_dst_update_pmtu_no_confirm(skb, mtu);
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
if (mtu < IPV6_MIN_MTU)
|
||||
|
@ -343,6 +340,7 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
{
|
||||
struct xfrm_if *xi = netdev_priv(dev);
|
||||
struct net_device_stats *stats = &xi->dev->stats;
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct flowi fl;
|
||||
int ret;
|
||||
|
||||
|
@ -352,10 +350,33 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
case htons(ETH_P_IPV6):
|
||||
xfrm_decode_session(skb, &fl, AF_INET6);
|
||||
memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));
|
||||
if (!dst) {
|
||||
fl.u.ip6.flowi6_oif = dev->ifindex;
|
||||
fl.u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC;
|
||||
dst = ip6_route_output(dev_net(dev), NULL, &fl.u.ip6);
|
||||
if (dst->error) {
|
||||
dst_release(dst);
|
||||
stats->tx_carrier_errors++;
|
||||
goto tx_err;
|
||||
}
|
||||
skb_dst_set(skb, dst);
|
||||
}
|
||||
break;
|
||||
case htons(ETH_P_IP):
|
||||
xfrm_decode_session(skb, &fl, AF_INET);
|
||||
memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
|
||||
if (!dst) {
|
||||
struct rtable *rt;
|
||||
|
||||
fl.u.ip4.flowi4_oif = dev->ifindex;
|
||||
fl.u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
|
||||
rt = __ip_route_output_key(dev_net(dev), &fl.u.ip4);
|
||||
if (IS_ERR(rt)) {
|
||||
stats->tx_carrier_errors++;
|
||||
goto tx_err;
|
||||
}
|
||||
skb_dst_set(skb, &rt->dst);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto tx_err;
|
||||
|
@ -566,12 +587,9 @@ static void xfrmi_dev_setup(struct net_device *dev)
|
|||
{
|
||||
dev->netdev_ops = &xfrmi_netdev_ops;
|
||||
dev->type = ARPHRD_NONE;
|
||||
dev->hard_header_len = ETH_HLEN;
|
||||
dev->min_header_len = ETH_HLEN;
|
||||
dev->mtu = ETH_DATA_LEN;
|
||||
dev->min_mtu = ETH_MIN_MTU;
|
||||
dev->max_mtu = ETH_DATA_LEN;
|
||||
dev->addr_len = ETH_ALEN;
|
||||
dev->max_mtu = IP_MAX_MTU;
|
||||
dev->flags = IFF_NOARP;
|
||||
dev->needs_free_netdev = true;
|
||||
dev->priv_destructor = xfrmi_dev_free;
|
||||
|
|
|
@ -2254,9 +2254,9 @@ static const char * const tomoyo_memory_headers[TOMOYO_MAX_MEMORY_STAT] = {
|
|||
[TOMOYO_MEMORY_QUERY] = "query message:",
|
||||
};
|
||||
|
||||
/* Timestamp counter for last updated. */
|
||||
static unsigned int tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT];
|
||||
/* Counter for number of updates. */
|
||||
static atomic_t tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT];
|
||||
/* Timestamp counter for last updated. */
|
||||
static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT];
|
||||
|
||||
/**
|
||||
|
@ -2268,10 +2268,7 @@ static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT];
|
|||
*/
|
||||
void tomoyo_update_stat(const u8 index)
|
||||
{
|
||||
/*
|
||||
* I don't use atomic operations because race condition is not fatal.
|
||||
*/
|
||||
tomoyo_stat_updated[index]++;
|
||||
atomic_inc(&tomoyo_stat_updated[index]);
|
||||
tomoyo_stat_modified[index] = ktime_get_real_seconds();
|
||||
}
|
||||
|
||||
|
@ -2291,7 +2288,7 @@ static void tomoyo_read_stat(struct tomoyo_io_buffer *head)
|
|||
for (i = 0; i < TOMOYO_MAX_POLICY_STAT; i++) {
|
||||
tomoyo_io_printf(head, "Policy %-30s %10u",
|
||||
tomoyo_policy_headers[i],
|
||||
tomoyo_stat_updated[i]);
|
||||
atomic_read(&tomoyo_stat_updated[i]));
|
||||
if (tomoyo_stat_modified[i]) {
|
||||
struct tomoyo_time stamp;
|
||||
tomoyo_convert_time(tomoyo_stat_modified[i], &stamp);
|
||||
|
|
|
@ -2435,6 +2435,13 @@ static void rt5640_disable_jack_detect(struct snd_soc_component *component)
|
|||
{
|
||||
struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component);
|
||||
|
||||
/*
|
||||
* soc_remove_component() force-disables jack and thus rt5640->jack
|
||||
* could be NULL at the time of driver's module unloading.
|
||||
*/
|
||||
if (!rt5640->jack)
|
||||
return;
|
||||
|
||||
disable_irq(rt5640->irq);
|
||||
rt5640_cancel_work(rt5640);
|
||||
|
||||
|
|
|
@ -226,7 +226,6 @@ static void uni_player_set_channel_status(struct uniperif *player,
|
|||
* sampling frequency. If no sample rate is already specified, then
|
||||
* set one.
|
||||
*/
|
||||
mutex_lock(&player->ctrl_lock);
|
||||
if (runtime) {
|
||||
switch (runtime->rate) {
|
||||
case 22050:
|
||||
|
@ -303,7 +302,6 @@ static void uni_player_set_channel_status(struct uniperif *player,
|
|||
player->stream_settings.iec958.status[3 + (n * 4)] << 24;
|
||||
SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status);
|
||||
}
|
||||
mutex_unlock(&player->ctrl_lock);
|
||||
|
||||
/* Update the channel status */
|
||||
if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
|
||||
|
@ -365,8 +363,10 @@ static int uni_player_prepare_iec958(struct uniperif *player,
|
|||
|
||||
SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player);
|
||||
|
||||
mutex_lock(&player->ctrl_lock);
|
||||
/* Update the channel status */
|
||||
uni_player_set_channel_status(player, runtime);
|
||||
mutex_unlock(&player->ctrl_lock);
|
||||
|
||||
/* Clear the user validity user bits */
|
||||
SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
|
||||
|
@ -598,7 +598,6 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol,
|
|||
iec958->status[1] = ucontrol->value.iec958.status[1];
|
||||
iec958->status[2] = ucontrol->value.iec958.status[2];
|
||||
iec958->status[3] = ucontrol->value.iec958.status[3];
|
||||
mutex_unlock(&player->ctrl_lock);
|
||||
|
||||
spin_lock_irqsave(&player->irq_lock, flags);
|
||||
if (player->substream && player->substream->runtime)
|
||||
|
@ -608,6 +607,8 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol *kcontrol,
|
|||
uni_player_set_channel_status(player, NULL);
|
||||
|
||||
spin_unlock_irqrestore(&player->irq_lock, flags);
|
||||
mutex_unlock(&player->ctrl_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,15 @@ int strtobool(const char *s, bool *res);
|
|||
* However uClibc headers also define __GLIBC__ hence the hack below
|
||||
*/
|
||||
#if defined(__GLIBC__) && !defined(__UCLIBC__)
|
||||
// pragma diagnostic was introduced in gcc 4.6
|
||||
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wredundant-decls"
|
||||
#endif
|
||||
extern size_t strlcpy(char *dest, const char *src, size_t size);
|
||||
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
#endif
|
||||
|
||||
char *str_error_r(int errnum, char *buf, size_t buflen);
|
||||
|
|
|
@ -95,6 +95,10 @@ int strtobool(const char *s, bool *res)
|
|||
* If libc has strlcpy() then that version will override this
|
||||
* implementation:
|
||||
*/
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wignored-attributes"
|
||||
#endif
|
||||
size_t __weak strlcpy(char *dest, const char *src, size_t size)
|
||||
{
|
||||
size_t ret = strlen(src);
|
||||
|
@ -106,3 +110,6 @@ size_t __weak strlcpy(char *dest, const char *src, size_t size)
|
|||
}
|
||||
return ret;
|
||||
}
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
|
|
@ -1227,8 +1227,10 @@ filter_event(struct event_filter *filter, struct event_format *event,
|
|||
}
|
||||
|
||||
filter_type = add_filter_type(filter, event->id);
|
||||
if (filter_type == NULL)
|
||||
if (filter_type == NULL) {
|
||||
free_arg(arg);
|
||||
return TEP_ERRNO__MEM_ALLOC_FAILED;
|
||||
}
|
||||
|
||||
if (filter_type->filter)
|
||||
free_arg(filter_type->filter);
|
||||
|
|
|
@ -586,8 +586,8 @@ tot_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
|
|||
{
|
||||
struct c2c_hist_entry *c2c_left;
|
||||
struct c2c_hist_entry *c2c_right;
|
||||
unsigned int tot_hitm_left;
|
||||
unsigned int tot_hitm_right;
|
||||
uint64_t tot_hitm_left;
|
||||
uint64_t tot_hitm_right;
|
||||
|
||||
c2c_left = container_of(left, struct c2c_hist_entry, he);
|
||||
c2c_right = container_of(right, struct c2c_hist_entry, he);
|
||||
|
@ -620,7 +620,8 @@ __f ## _cmp(struct perf_hpp_fmt *fmt __maybe_unused, \
|
|||
\
|
||||
c2c_left = container_of(left, struct c2c_hist_entry, he); \
|
||||
c2c_right = container_of(right, struct c2c_hist_entry, he); \
|
||||
return c2c_left->stats.__f - c2c_right->stats.__f; \
|
||||
return (uint64_t) c2c_left->stats.__f - \
|
||||
(uint64_t) c2c_right->stats.__f; \
|
||||
}
|
||||
|
||||
#define STAT_FN(__f) \
|
||||
|
@ -673,7 +674,8 @@ ld_llcmiss_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
|
|||
c2c_left = container_of(left, struct c2c_hist_entry, he);
|
||||
c2c_right = container_of(right, struct c2c_hist_entry, he);
|
||||
|
||||
return llc_miss(&c2c_left->stats) - llc_miss(&c2c_right->stats);
|
||||
return (uint64_t) llc_miss(&c2c_left->stats) -
|
||||
(uint64_t) llc_miss(&c2c_right->stats);
|
||||
}
|
||||
|
||||
static uint64_t total_records(struct c2c_stats *stats)
|
||||
|
|
|
@ -383,10 +383,10 @@ static int report__setup_sample_type(struct report *rep)
|
|||
PERF_SAMPLE_BRANCH_ANY))
|
||||
rep->nonany_branch_mode = true;
|
||||
|
||||
#ifndef HAVE_LIBUNWIND_SUPPORT
|
||||
#if !defined(HAVE_LIBUNWIND_SUPPORT) && !defined(HAVE_DWARF_SUPPORT)
|
||||
if (dwarf_callchain_users) {
|
||||
ui__warning("Please install libunwind development packages "
|
||||
"during the perf build.\n");
|
||||
ui__warning("Please install libunwind or libdw "
|
||||
"development packages during the perf build.\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in a new issue