Merge 4.14.170 into android-4.14
Changes in 4.14.170 orinoco_usb: fix interface sanity check rsi_91x_usb: fix interface sanity check USB: serial: ir-usb: add missing endpoint sanity check USB: serial: ir-usb: fix link-speed handling USB: serial: ir-usb: fix IrLAP framing usb: dwc3: turn off VBUS when leaving host mode staging: most: net: fix buffer overflow staging: wlan-ng: ensure error return is actually returned staging: vt6656: correct packet types for CTS protect, mode. staging: vt6656: use NULLFUCTION stack on mac80211 staging: vt6656: Fix false Tx excessive retries reporting. serial: 8250_bcm2835aux: Fix line mismatch on driver unbind crypto: chelsio - fix writing tfm flags to wrong place ath9k: fix storage endpoint lookup brcmfmac: fix interface sanity check rtl8xxxu: fix interface sanity check zd1211rw: fix storage endpoint lookup arc: eznps: fix allmodconfig kconfig warning HID: ite: Add USB id match for Acer SW5-012 keyboard dock phy: cpcap-usb: Prevent USB line glitches from waking up modem watchdog: max77620_wdt: fix potential build errors watchdog: rn5t618_wdt: fix module aliases spi: spi-dw: Add lock protect dw_spi rx/tx to prevent concurrent calls drivers/net/b44: Change to non-atomic bit operations on pwol_mask net: wan: sdla: Fix cast from pointer to integer of different size gpio: max77620: Add missing dependency on GPIOLIB_IRQCHIP atm: eni: fix uninitialized variable warning PCI: Add DMA alias quirk for Intel VCA NTB usb-storage: Disable UAS on JMicron SATA enclosure net_sched: ematch: reject invalid TCF_EM_SIMPLE rsi: fix use-after-free on probe errors crypto: af_alg - Use bh_lock_sock in sk_destruct 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 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: gspca: zero usb_buf media: dvb-usb/dvb-usb-urb.c: initialize actlen to 0 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: beagle-x15-common: Model 5V0 regulator soc: ti: wkup_m3_ipc: Fix race condition with rproc_boot mac80211: mesh: restrict airtime metric to peered established plinks clk: mmp2: Fix the order of timer mux parents 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. ASoC: sti: fix possible sleep-in-atomic qmi_wwan: Add support for Quectel RM500Q 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 net: dsa: bcm_sf2: Configure IMP port for 2Gb/sec bnxt_en: Fix ipv6 RFS filter matching logic. ARM: dts: am335x-boneblack-common: fix memory size vti[6]: fix packet tx through bpf_redirect() 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 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 net/sonic: Add mutual exclusion for accessing shared state net/sonic: Use MMIO accessors net/sonic: Fix receive buffer handling net/sonic: Quiesce SONIC before re-initializing descriptor memory 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 Linux 4.14.170 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I7a9c84d82da0b9c258843767c9d57e034b6fc5f0
This commit is contained in:
@@ -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 = 14
|
||||
SUBLEVEL = 169
|
||||
SUBLEVEL = 170
|
||||
EXTRAVERSION =
|
||||
NAME = Petit Gorille
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
menuconfig ARC_PLAT_EZNPS
|
||||
bool "\"EZchip\" ARC dev platform"
|
||||
select CPU_BIG_ENDIAN
|
||||
select CLKSRC_NPS
|
||||
select CLKSRC_NPS if !PHYS_ADDR_T_64BIT
|
||||
select EZNPS_GIC
|
||||
select EZCHIP_NPS_MANAGEMENT_ENET if ETHERNET
|
||||
help
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -18,7 +18,7 @@ include $(srctree)/arch/arm64/boot/dts/Makefile
|
||||
|
||||
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
|
||||
|
||||
DTB_NAMES := $(subst $\",,$(CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES))
|
||||
ifneq ($(DTB_NAMES),)
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -1107,7 +1107,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);
|
||||
@@ -1260,7 +1260,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1294,7 +1298,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);
|
||||
@@ -1491,7 +1499,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;
|
||||
|
||||
@@ -1525,7 +1533,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);
|
||||
if (!prdtgrp) {
|
||||
ret = -ENODEV;
|
||||
goto out_unlock;
|
||||
@@ -1581,7 +1589,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;
|
||||
|
||||
@@ -1592,7 +1600,7 @@ out_destroy:
|
||||
out_free_rgrp:
|
||||
kfree(rdtgrp);
|
||||
out_unlock:
|
||||
rdtgroup_kn_unlock(prgrp_kn);
|
||||
rdtgroup_kn_unlock(parent_kn);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1630,7 +1638,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;
|
||||
}
|
||||
|
||||
@@ -1667,7 +1675,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)
|
||||
goto out_id_free;
|
||||
}
|
||||
@@ -1680,7 +1688,7 @@ out_id_free:
|
||||
out_common_fail:
|
||||
mkdir_rdt_prepare_clean(rdtgrp);
|
||||
out_unlock:
|
||||
rdtgroup_kn_unlock(prgrp_kn);
|
||||
rdtgroup_kn_unlock(parent_kn);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1792,11 +1800,6 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp,
|
||||
closid_free(rdtgrp->closid);
|
||||
free_rmid(rdtgrp->mon.rmid);
|
||||
|
||||
/*
|
||||
* Free all the child monitor group rmids.
|
||||
*/
|
||||
free_all_child_rdtgrp(rdtgrp);
|
||||
|
||||
list_del(&rdtgrp->rdtgroup_list);
|
||||
|
||||
/*
|
||||
@@ -1806,6 +1809,11 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, struct rdtgroup *rdtgrp,
|
||||
kernfs_get(kn);
|
||||
kernfs_remove(rdtgrp->kn);
|
||||
|
||||
/*
|
||||
* Free all the child monitor group rmids.
|
||||
*/
|
||||
free_all_child_rdtgrp(rdtgrp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -139,11 +139,13 @@ void af_alg_release_parent(struct sock *sk)
|
||||
sk = ask->parent;
|
||||
ask = alg_sk(sk);
|
||||
|
||||
lock_sock(sk);
|
||||
local_bh_disable();
|
||||
bh_lock_sock(sk);
|
||||
ask->nokey_refcnt -= nokey;
|
||||
if (!last)
|
||||
last = !--ask->refcnt;
|
||||
release_sock(sk);
|
||||
bh_unlock_sock(sk);
|
||||
local_bh_enable();
|
||||
|
||||
if (last)
|
||||
sock_put(sk);
|
||||
|
||||
@@ -505,11 +505,12 @@ err:
|
||||
|
||||
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);
|
||||
|
||||
@@ -372,7 +372,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb,
|
||||
here = (eni_vcc->descr+skip) & (eni_vcc->words-1);
|
||||
dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci
|
||||
<< MID_DMA_VCI_SHIFT) | MID_DT_JK;
|
||||
j++;
|
||||
dma[j++] = 0;
|
||||
}
|
||||
here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1);
|
||||
if (!eff) size += skip;
|
||||
@@ -445,7 +445,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff *skb,
|
||||
if (size != eff) {
|
||||
dma[j++] = (here << MID_DMA_COUNT_SHIFT) |
|
||||
(vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK;
|
||||
j++;
|
||||
dma[j++] = 0;
|
||||
}
|
||||
if (!j || j > 2*RX_DMA_BUF) {
|
||||
printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n");
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -2693,9 +2693,6 @@ static int chcr_gcm_setauthsize(struct crypto_aead *tfm, unsigned int authsize)
|
||||
aeadctx->mayverify = VERIFY_SW;
|
||||
break;
|
||||
default:
|
||||
|
||||
crypto_tfm_set_flags((struct crypto_tfm *) tfm,
|
||||
CRYPTO_TFM_RES_BAD_KEY_LEN);
|
||||
return -EINVAL;
|
||||
}
|
||||
return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
|
||||
@@ -2720,8 +2717,6 @@ static int chcr_4106_4309_setauthsize(struct crypto_aead *tfm,
|
||||
aeadctx->mayverify = VERIFY_HW;
|
||||
break;
|
||||
default:
|
||||
crypto_tfm_set_flags((struct crypto_tfm *)tfm,
|
||||
CRYPTO_TFM_RES_BAD_KEY_LEN);
|
||||
return -EINVAL;
|
||||
}
|
||||
return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
|
||||
@@ -2762,8 +2757,6 @@ static int chcr_ccm_setauthsize(struct crypto_aead *tfm,
|
||||
aeadctx->mayverify = VERIFY_HW;
|
||||
break;
|
||||
default:
|
||||
crypto_tfm_set_flags((struct crypto_tfm *)tfm,
|
||||
CRYPTO_TFM_RES_BAD_KEY_LEN);
|
||||
return -EINVAL;
|
||||
}
|
||||
return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
|
||||
@@ -2790,8 +2783,7 @@ static int chcr_ccm_common_setkey(struct crypto_aead *aead,
|
||||
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
|
||||
mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_256;
|
||||
} else {
|
||||
crypto_tfm_set_flags((struct crypto_tfm *)aead,
|
||||
CRYPTO_TFM_RES_BAD_KEY_LEN);
|
||||
crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
|
||||
aeadctx->enckey_len = 0;
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -2831,8 +2823,7 @@ static int chcr_aead_rfc4309_setkey(struct crypto_aead *aead, const u8 *key,
|
||||
int error;
|
||||
|
||||
if (keylen < 3) {
|
||||
crypto_tfm_set_flags((struct crypto_tfm *)aead,
|
||||
CRYPTO_TFM_RES_BAD_KEY_LEN);
|
||||
crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
|
||||
aeadctx->enckey_len = 0;
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -2883,8 +2874,7 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, const u8 *key,
|
||||
} else if (keylen == AES_KEYSIZE_256) {
|
||||
ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
|
||||
} else {
|
||||
crypto_tfm_set_flags((struct crypto_tfm *)aead,
|
||||
CRYPTO_TFM_RES_BAD_KEY_LEN);
|
||||
crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
|
||||
pr_err("GCM: Invalid key length %d\n", keylen);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
|
||||
@@ -902,6 +902,14 @@ err_out:
|
||||
}
|
||||
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)
|
||||
{
|
||||
@@ -1200,6 +1208,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,
|
||||
|
||||
@@ -989,6 +989,7 @@ config GPIO_LP87565
|
||||
config GPIO_MAX77620
|
||||
tristate "GPIO support for PMIC MAX77620 and MAX20024"
|
||||
depends on MFD_MAX77620
|
||||
select GPIOLIB_IRQCHIP
|
||||
help
|
||||
GPIO driver for MAX77620 and MAX20024 PMIC from Maxim Semiconductor.
|
||||
MAX77620 PMIC has 8 pins that can be configured as GPIOs. The
|
||||
|
||||
@@ -1029,6 +1029,7 @@
|
||||
#define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10
|
||||
#define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3
|
||||
#define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3
|
||||
#define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012 0x2968
|
||||
#define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710
|
||||
|
||||
#define USB_VENDOR_ID_TEXAS_INSTRUMENTS 0x2047
|
||||
|
||||
@@ -43,6 +43,9 @@ static int ite_event(struct hid_device *hdev, struct hid_field *field,
|
||||
static const struct hid_device_id ite_devices[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) },
|
||||
/* ITE8595 USB kbd ctlr, with Synaptics touchpad connected to it. */
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS,
|
||||
USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(hid, ite_devices);
|
||||
|
||||
@@ -453,10 +453,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;
|
||||
|
||||
@@ -2038,7 +2038,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;
|
||||
|
||||
@@ -137,7 +137,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 */
|
||||
|
||||
@@ -1521,8 +1521,10 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset)
|
||||
int ethaddr_bytes = ETH_ALEN;
|
||||
|
||||
memset(ppattern + offset, 0xff, magicsync);
|
||||
for (j = 0; j < magicsync; j++)
|
||||
set_bit(len++, (unsigned long *) pmask);
|
||||
for (j = 0; j < magicsync; j++) {
|
||||
pmask[len >> 3] |= BIT(len & 7);
|
||||
len++;
|
||||
}
|
||||
|
||||
for (j = 0; j < B44_MAX_PATTERNS; j++) {
|
||||
if ((B44_PATTERN_SIZE - len) >= ETH_ALEN)
|
||||
@@ -1534,7 +1536,8 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, u8 *pmask, int offset)
|
||||
for (k = 0; k< ethaddr_bytes; k++) {
|
||||
ppattern[offset + magicsync +
|
||||
(j * ETH_ALEN) + k] = macaddr[k];
|
||||
set_bit(len++, (unsigned long *) pmask);
|
||||
pmask[len >> 3] |= BIT(len & 7);
|
||||
len++;
|
||||
}
|
||||
}
|
||||
return len - 1;
|
||||
|
||||
@@ -7402,11 +7402,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))
|
||||
|
||||
@@ -66,8 +66,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -682,8 +682,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
|
||||
@@ -439,7 +439,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");
|
||||
|
||||
@@ -562,7 +562,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) {
|
||||
@@ -689,14 +689,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;
|
||||
|
||||
@@ -201,7 +201,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;
|
||||
}
|
||||
|
||||
@@ -5131,7 +5131,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);
|
||||
|
||||
@@ -5140,17 +5140,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);
|
||||
|
||||
@@ -1858,11 +1858,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;
|
||||
|
||||
|
||||
@@ -50,6 +50,8 @@ static int sonic_open(struct net_device *dev)
|
||||
if (sonic_debug > 2)
|
||||
printk("sonic_open: initializing sonic driver.\n");
|
||||
|
||||
spin_lock_init(&lp->lock);
|
||||
|
||||
for (i = 0; i < SONIC_NUM_RRS; i++) {
|
||||
struct sk_buff *skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2);
|
||||
if (skb == NULL) {
|
||||
@@ -101,6 +103,24 @@ static int sonic_open(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Wait for the SONIC to become idle. */
|
||||
static void sonic_quiesce(struct net_device *dev, u16 mask)
|
||||
{
|
||||
struct sonic_local * __maybe_unused lp = netdev_priv(dev);
|
||||
int i;
|
||||
u16 bits;
|
||||
|
||||
for (i = 0; i < 1000; ++i) {
|
||||
bits = SONIC_READ(SONIC_CMD) & mask;
|
||||
if (!bits)
|
||||
return;
|
||||
if (irqs_disabled() || in_interrupt())
|
||||
udelay(20);
|
||||
else
|
||||
usleep_range(100, 200);
|
||||
}
|
||||
WARN_ONCE(1, "command deadline expired! 0x%04x\n", bits);
|
||||
}
|
||||
|
||||
/*
|
||||
* Close the SONIC device
|
||||
@@ -118,6 +138,9 @@ static int sonic_close(struct net_device *dev)
|
||||
/*
|
||||
* stop the SONIC, disable interrupts
|
||||
*/
|
||||
SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS);
|
||||
sonic_quiesce(dev, SONIC_CR_ALL);
|
||||
|
||||
SONIC_WRITE(SONIC_IMR, 0);
|
||||
SONIC_WRITE(SONIC_ISR, 0x7fff);
|
||||
SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
|
||||
@@ -157,6 +180,9 @@ static void sonic_tx_timeout(struct net_device *dev)
|
||||
* put the Sonic into software-reset mode and
|
||||
* disable all interrupts before releasing DMA buffers
|
||||
*/
|
||||
SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS);
|
||||
sonic_quiesce(dev, SONIC_CR_ALL);
|
||||
|
||||
SONIC_WRITE(SONIC_IMR, 0);
|
||||
SONIC_WRITE(SONIC_ISR, 0x7fff);
|
||||
SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
|
||||
@@ -194,8 +220,6 @@ static void sonic_tx_timeout(struct net_device *dev)
|
||||
* wake the tx queue
|
||||
* Concurrently with all of this, the SONIC is potentially writing to
|
||||
* the status flags of the TDs.
|
||||
* Until some mutual exclusion is added, this code will not work with SMP. However,
|
||||
* MIPS Jazz machines and m68k Macs were all uni-processor machines.
|
||||
*/
|
||||
|
||||
static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)
|
||||
@@ -203,7 +227,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)
|
||||
struct sonic_local *lp = netdev_priv(dev);
|
||||
dma_addr_t laddr;
|
||||
int length;
|
||||
int entry = lp->next_tx;
|
||||
int entry;
|
||||
unsigned long flags;
|
||||
|
||||
if (sonic_debug > 2)
|
||||
printk("sonic_send_packet: skb=%p, dev=%p\n", skb, dev);
|
||||
@@ -226,6 +251,10 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&lp->lock, flags);
|
||||
|
||||
entry = lp->next_tx;
|
||||
|
||||
sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */
|
||||
sonic_tda_put(dev, entry, SONIC_TD_FRAG_COUNT, 1); /* single fragment */
|
||||
sonic_tda_put(dev, entry, SONIC_TD_PKTSIZE, length); /* length of packet */
|
||||
@@ -235,10 +264,6 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)
|
||||
sonic_tda_put(dev, entry, SONIC_TD_LINK,
|
||||
sonic_tda_get(dev, entry, SONIC_TD_LINK) | SONIC_EOL);
|
||||
|
||||
/*
|
||||
* Must set tx_skb[entry] only after clearing status, and
|
||||
* before clearing EOL and before stopping queue
|
||||
*/
|
||||
wmb();
|
||||
lp->tx_len[entry] = length;
|
||||
lp->tx_laddr[entry] = laddr;
|
||||
@@ -263,6 +288,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
SONIC_WRITE(SONIC_CMD, SONIC_CR_TXP);
|
||||
|
||||
spin_unlock_irqrestore(&lp->lock, flags);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@@ -275,9 +302,21 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id)
|
||||
struct net_device *dev = dev_id;
|
||||
struct sonic_local *lp = netdev_priv(dev);
|
||||
int status;
|
||||
unsigned long flags;
|
||||
|
||||
/* The lock has two purposes. Firstly, it synchronizes sonic_interrupt()
|
||||
* with sonic_send_packet() so that the two functions can share state.
|
||||
* Secondly, it makes sonic_interrupt() re-entrant, as that is required
|
||||
* by macsonic which must use two IRQs with different priority levels.
|
||||
*/
|
||||
spin_lock_irqsave(&lp->lock, flags);
|
||||
|
||||
status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT;
|
||||
if (!status) {
|
||||
spin_unlock_irqrestore(&lp->lock, flags);
|
||||
|
||||
if (!(status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT))
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
do {
|
||||
if (status & SONIC_INT_PKTRX) {
|
||||
@@ -292,11 +331,12 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id)
|
||||
int td_status;
|
||||
int freed_some = 0;
|
||||
|
||||
/* At this point, cur_tx is the index of a TD that is one of:
|
||||
* unallocated/freed (status set & tx_skb[entry] clear)
|
||||
* allocated and sent (status set & tx_skb[entry] set )
|
||||
* allocated and not yet sent (status clear & tx_skb[entry] set )
|
||||
* still being allocated by sonic_send_packet (status clear & tx_skb[entry] clear)
|
||||
/* The state of a Transmit Descriptor may be inferred
|
||||
* from { tx_skb[entry], td_status } as follows.
|
||||
* { clear, clear } => the TD has never been used
|
||||
* { set, clear } => the TD was handed to SONIC
|
||||
* { set, set } => the TD was handed back
|
||||
* { clear, set } => the TD is available for re-use
|
||||
*/
|
||||
|
||||
if (sonic_debug > 2)
|
||||
@@ -398,10 +438,30 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id)
|
||||
/* load CAM done */
|
||||
if (status & SONIC_INT_LCD)
|
||||
SONIC_WRITE(SONIC_ISR, SONIC_INT_LCD); /* clear the interrupt */
|
||||
} while((status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT));
|
||||
|
||||
status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT;
|
||||
} while (status);
|
||||
|
||||
spin_unlock_irqrestore(&lp->lock, flags);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/* Return the array index corresponding to a given Receive Buffer pointer. */
|
||||
static int index_from_addr(struct sonic_local *lp, dma_addr_t addr,
|
||||
unsigned int last)
|
||||
{
|
||||
unsigned int i = last;
|
||||
|
||||
do {
|
||||
i = (i + 1) & SONIC_RRS_MASK;
|
||||
if (addr == lp->rx_laddr[i])
|
||||
return i;
|
||||
} while (i != last);
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
/*
|
||||
* We have a good packet(s), pass it/them up the network stack.
|
||||
*/
|
||||
@@ -421,6 +481,16 @@ static void sonic_rx(struct net_device *dev)
|
||||
|
||||
status = sonic_rda_get(dev, entry, SONIC_RD_STATUS);
|
||||
if (status & SONIC_RCR_PRX) {
|
||||
u32 addr = (sonic_rda_get(dev, entry,
|
||||
SONIC_RD_PKTPTR_H) << 16) |
|
||||
sonic_rda_get(dev, entry, SONIC_RD_PKTPTR_L);
|
||||
int i = index_from_addr(lp, addr, entry);
|
||||
|
||||
if (i < 0) {
|
||||
WARN_ONCE(1, "failed to find buffer!\n");
|
||||
break;
|
||||
}
|
||||
|
||||
/* Malloc up new buffer. */
|
||||
new_skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2);
|
||||
if (new_skb == NULL) {
|
||||
@@ -442,7 +512,7 @@ static void sonic_rx(struct net_device *dev)
|
||||
|
||||
/* now we have a new skb to replace it, pass the used one up the stack */
|
||||
dma_unmap_single(lp->device, lp->rx_laddr[entry], SONIC_RBSIZE, DMA_FROM_DEVICE);
|
||||
used_skb = lp->rx_skb[entry];
|
||||
used_skb = lp->rx_skb[i];
|
||||
pkt_len = sonic_rda_get(dev, entry, SONIC_RD_PKTLEN);
|
||||
skb_trim(used_skb, pkt_len);
|
||||
used_skb->protocol = eth_type_trans(used_skb, dev);
|
||||
@@ -451,13 +521,13 @@ static void sonic_rx(struct net_device *dev)
|
||||
lp->stats.rx_bytes += pkt_len;
|
||||
|
||||
/* and insert the new skb */
|
||||
lp->rx_laddr[entry] = new_laddr;
|
||||
lp->rx_skb[entry] = new_skb;
|
||||
lp->rx_laddr[i] = new_laddr;
|
||||
lp->rx_skb[i] = new_skb;
|
||||
|
||||
bufadr_l = (unsigned long)new_laddr & 0xffff;
|
||||
bufadr_h = (unsigned long)new_laddr >> 16;
|
||||
sonic_rra_put(dev, entry, SONIC_RR_BUFADR_L, bufadr_l);
|
||||
sonic_rra_put(dev, entry, SONIC_RR_BUFADR_H, bufadr_h);
|
||||
sonic_rra_put(dev, i, SONIC_RR_BUFADR_L, bufadr_l);
|
||||
sonic_rra_put(dev, i, SONIC_RR_BUFADR_H, bufadr_h);
|
||||
} else {
|
||||
/* This should only happen, if we enable accepting broken packets. */
|
||||
lp->stats.rx_errors++;
|
||||
@@ -592,6 +662,7 @@ static int sonic_init(struct net_device *dev)
|
||||
*/
|
||||
SONIC_WRITE(SONIC_CMD, 0);
|
||||
SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS);
|
||||
sonic_quiesce(dev, SONIC_CR_ALL);
|
||||
|
||||
/*
|
||||
* initialize the receive resource area
|
||||
|
||||
@@ -110,6 +110,9 @@
|
||||
#define SONIC_CR_TXP 0x0002
|
||||
#define SONIC_CR_HTX 0x0001
|
||||
|
||||
#define SONIC_CR_ALL (SONIC_CR_LCAM | SONIC_CR_RRRA | \
|
||||
SONIC_CR_RXEN | SONIC_CR_TXP)
|
||||
|
||||
/*
|
||||
* SONIC data configuration bits
|
||||
*/
|
||||
@@ -274,8 +277,9 @@
|
||||
#define SONIC_NUM_RDS SONIC_NUM_RRS /* number of receive descriptors */
|
||||
#define SONIC_NUM_TDS 16 /* number of transmit descriptors */
|
||||
|
||||
#define SONIC_RDS_MASK (SONIC_NUM_RDS-1)
|
||||
#define SONIC_TDS_MASK (SONIC_NUM_TDS-1)
|
||||
#define SONIC_RRS_MASK (SONIC_NUM_RRS - 1)
|
||||
#define SONIC_RDS_MASK (SONIC_NUM_RDS - 1)
|
||||
#define SONIC_TDS_MASK (SONIC_NUM_TDS - 1)
|
||||
|
||||
#define SONIC_RBSIZE 1520 /* size of one resource buffer */
|
||||
|
||||
@@ -321,6 +325,7 @@ struct sonic_local {
|
||||
unsigned int next_tx; /* next free TD */
|
||||
struct device *device; /* generic device */
|
||||
struct net_device_stats stats;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
#define TX_TIMEOUT (3 * HZ)
|
||||
@@ -342,30 +347,30 @@ static void sonic_tx_timeout(struct net_device *dev);
|
||||
as far as we can tell. */
|
||||
/* OpenBSD calls this "SWO". I'd like to think that sonic_buf_put()
|
||||
is a much better name. */
|
||||
static inline void sonic_buf_put(void* base, int bitmode,
|
||||
static inline void sonic_buf_put(u16 *base, int bitmode,
|
||||
int offset, __u16 val)
|
||||
{
|
||||
if (bitmode)
|
||||
#ifdef __BIG_ENDIAN
|
||||
((__u16 *) base + (offset*2))[1] = val;
|
||||
__raw_writew(val, base + (offset * 2) + 1);
|
||||
#else
|
||||
((__u16 *) base + (offset*2))[0] = val;
|
||||
__raw_writew(val, base + (offset * 2) + 0);
|
||||
#endif
|
||||
else
|
||||
((__u16 *) base)[offset] = val;
|
||||
__raw_writew(val, base + (offset * 1) + 0);
|
||||
}
|
||||
|
||||
static inline __u16 sonic_buf_get(void* base, int bitmode,
|
||||
static inline __u16 sonic_buf_get(u16 *base, int bitmode,
|
||||
int offset)
|
||||
{
|
||||
if (bitmode)
|
||||
#ifdef __BIG_ENDIAN
|
||||
return ((volatile __u16 *) base + (offset*2))[1];
|
||||
return __raw_readw(base + (offset * 2) + 1);
|
||||
#else
|
||||
return ((volatile __u16 *) base + (offset*2))[0];
|
||||
return __raw_readw(base + (offset * 2) + 0);
|
||||
#endif
|
||||
else
|
||||
return ((volatile __u16 *) base)[offset];
|
||||
return __raw_readw(base + (offset * 1) + 0);
|
||||
}
|
||||
|
||||
/* Inlines that you should actually use for reading/writing DMA buffers */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -5244,6 +5244,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);
|
||||
@@ -5257,10 +5262,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
|
||||
|
||||
@@ -711,7 +711,7 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb,
|
||||
|
||||
spin_lock_irqsave(&sdla_lock, flags);
|
||||
SDLA_WINDOW(dev, addr);
|
||||
pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK));
|
||||
pbuf = (void *)(dev->mem_start + (addr & SDLA_ADDR_MASK));
|
||||
__sdla_write(dev, pbuf->buf_addr, skb->data, skb->len);
|
||||
SDLA_WINDOW(dev, addr);
|
||||
pbuf->opp_flag = 1;
|
||||
|
||||
@@ -1214,7 +1214,7 @@ err_fw:
|
||||
static int send_eject_command(struct usb_interface *interface)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev(interface);
|
||||
struct usb_host_interface *iface_desc = &interface->altsetting[0];
|
||||
struct usb_host_interface *iface_desc = interface->cur_altsetting;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
unsigned char *cmd;
|
||||
u8 bulk_out_ep;
|
||||
|
||||
@@ -1333,7 +1333,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
desc = &intf->altsetting[0].desc;
|
||||
desc = &intf->cur_altsetting->desc;
|
||||
if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
|
||||
(desc->bInterfaceSubClass != 2) ||
|
||||
(desc->bInterfaceProtocol != 0xff)) {
|
||||
@@ -1346,7 +1346,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
num_of_eps = desc->bNumEndpoints;
|
||||
for (ep = 0; ep < num_of_eps; ep++) {
|
||||
endpoint = &intf->altsetting[0].endpoint[ep].desc;
|
||||
endpoint = &intf->cur_altsetting->endpoint[ep].desc;
|
||||
endpoint_num = usb_endpoint_num(endpoint);
|
||||
if (!usb_endpoint_xfer_bulk(endpoint))
|
||||
continue;
|
||||
|
||||
@@ -7788,16 +7788,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;
|
||||
@@ -7811,7 +7803,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);
|
||||
|
||||
@@ -1613,9 +1613,9 @@ static int ezusb_probe(struct usb_interface *interface,
|
||||
/* set up the endpoint information */
|
||||
/* check out the endpoints */
|
||||
|
||||
iface_desc = &interface->altsetting[0].desc;
|
||||
iface_desc = &interface->cur_altsetting->desc;
|
||||
for (i = 0; i < iface_desc->bNumEndpoints; ++i) {
|
||||
ep = &interface->altsetting[0].endpoint[i].desc;
|
||||
ep = &interface->cur_altsetting->endpoint[i].desc;
|
||||
|
||||
if (usb_endpoint_is_bulk_in(ep)) {
|
||||
/* we found a bulk in endpoint */
|
||||
|
||||
@@ -5921,7 +5921,7 @@ static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv,
|
||||
u8 dir, xtype, num;
|
||||
int ret = 0;
|
||||
|
||||
host_interface = &interface->altsetting[0];
|
||||
host_interface = interface->cur_altsetting;
|
||||
interface_desc = &host_interface->desc;
|
||||
endpoints = interface_desc->bNumEndpoints;
|
||||
|
||||
|
||||
@@ -541,6 +541,7 @@ static int bl_cmd(struct rsi_hw *adapter, u8 cmd, u8 exp_resp, char *str)
|
||||
bl_start_cmd_timer(adapter, timeout);
|
||||
status = bl_write_cmd(adapter, cmd, exp_resp, ®out_val);
|
||||
if (status < 0) {
|
||||
bl_stop_cmd_timer(adapter);
|
||||
rsi_dbg(ERR_ZONE,
|
||||
"%s: Command %s (%0x) writing failed..\n",
|
||||
__func__, str, cmd);
|
||||
@@ -656,10 +657,9 @@ static int ping_pong_write(struct rsi_hw *adapter, u8 cmd, u8 *addr, u32 size)
|
||||
}
|
||||
|
||||
status = bl_cmd(adapter, cmd_req, cmd_resp, str);
|
||||
if (status) {
|
||||
bl_stop_cmd_timer(adapter);
|
||||
if (status)
|
||||
return status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -749,10 +749,9 @@ static int auto_fw_upgrade(struct rsi_hw *adapter, u8 *flash_content,
|
||||
|
||||
status = bl_cmd(adapter, EOF_REACHED, FW_LOADING_SUCCESSFUL,
|
||||
"EOF_REACHED");
|
||||
if (status) {
|
||||
bl_stop_cmd_timer(adapter);
|
||||
if (status)
|
||||
return status;
|
||||
}
|
||||
|
||||
rsi_dbg(INFO_ZONE, "FW loading is done and FW is running..\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -773,6 +772,7 @@ static int rsi_load_firmware(struct rsi_hw *adapter)
|
||||
status = hif_ops->master_reg_read(adapter, SWBL_REGOUT,
|
||||
®out_val, 2);
|
||||
if (status < 0) {
|
||||
bl_stop_cmd_timer(adapter);
|
||||
rsi_dbg(ERR_ZONE,
|
||||
"%s: REGOUT read failed\n", __func__);
|
||||
return status;
|
||||
|
||||
@@ -105,7 +105,7 @@ static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface,
|
||||
__le16 buffer_size;
|
||||
int ii, bep_found = 0;
|
||||
|
||||
iface_desc = &(interface->altsetting[0]);
|
||||
iface_desc = interface->cur_altsetting;
|
||||
|
||||
for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
|
||||
endpoint = &(iface_desc->endpoint[ii].desc);
|
||||
|
||||
@@ -1272,7 +1272,7 @@ static void print_id(struct usb_device *udev)
|
||||
static int eject_installer(struct usb_interface *intf)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
struct usb_host_interface *iface_desc = &intf->altsetting[0];
|
||||
struct usb_host_interface *iface_desc = intf->cur_altsetting;
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
unsigned char *cmd;
|
||||
u8 bulk_out_ep;
|
||||
|
||||
@@ -4019,6 +4019,40 @@ static void quirk_mic_x200_dma_alias(struct pci_dev *pdev)
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2260, quirk_mic_x200_dma_alias);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2264, quirk_mic_x200_dma_alias);
|
||||
|
||||
/*
|
||||
* Intel Visual Compute Accelerator (VCA) is a family of PCIe add-in devices
|
||||
* exposing computational units via Non Transparent Bridges (NTB, PEX 87xx).
|
||||
*
|
||||
* Similarly to MIC x200, we need to add DMA aliases to allow buffer access
|
||||
* when IOMMU is enabled. These aliases allow computational unit access to
|
||||
* host memory. These aliases mark the whole VCA device as one IOMMU
|
||||
* group.
|
||||
*
|
||||
* All possible slot numbers (0x20) are used, since we are unable to tell
|
||||
* what slot is used on other side. This quirk is intended for both host
|
||||
* and computational unit sides. The VCA devices have up to five functions
|
||||
* (four for DMA channels and one additional).
|
||||
*/
|
||||
static void quirk_pex_vca_alias(struct pci_dev *pdev)
|
||||
{
|
||||
const unsigned int num_pci_slots = 0x20;
|
||||
unsigned int slot;
|
||||
|
||||
for (slot = 0; slot < num_pci_slots; slot++) {
|
||||
pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x0));
|
||||
pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x1));
|
||||
pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x2));
|
||||
pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x3));
|
||||
pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x4));
|
||||
}
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2954, quirk_pex_vca_alias);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2955, quirk_pex_vca_alias);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2956, quirk_pex_vca_alias);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2958, quirk_pex_vca_alias);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2959, quirk_pex_vca_alias);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x295A, quirk_pex_vca_alias);
|
||||
|
||||
/*
|
||||
* The IOMMU and interrupt controller on Broadcom Vulcan/Cavium ThunderX2 are
|
||||
* associated not at the root bus, but at a bridge below. This quirk avoids
|
||||
|
||||
@@ -115,7 +115,7 @@ struct cpcap_usb_ints_state {
|
||||
enum cpcap_gpio_mode {
|
||||
CPCAP_DM_DP,
|
||||
CPCAP_MDM_RX_TX,
|
||||
CPCAP_UNKNOWN,
|
||||
CPCAP_UNKNOWN_DISABLED, /* Seems to disable USB lines */
|
||||
CPCAP_OTG_DM_DP,
|
||||
};
|
||||
|
||||
@@ -379,7 +379,8 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP);
|
||||
/* Disable lines to prevent glitches from waking up mdm6600 */
|
||||
error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED);
|
||||
if (error)
|
||||
goto out_err;
|
||||
|
||||
@@ -406,6 +407,11 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata)
|
||||
if (error)
|
||||
goto out_err;
|
||||
|
||||
/* Enable UART mode */
|
||||
error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP);
|
||||
if (error)
|
||||
goto out_err;
|
||||
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
@@ -418,7 +424,8 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP);
|
||||
/* Disable lines to prevent glitches from waking up mdm6600 */
|
||||
error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@@ -458,6 +465,11 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata)
|
||||
if (error)
|
||||
goto out_err;
|
||||
|
||||
/* Enable USB mode */
|
||||
error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP);
|
||||
if (error)
|
||||
goto out_err;
|
||||
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -375,6 +375,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);
|
||||
}
|
||||
@@ -461,8 +463,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:
|
||||
|
||||
@@ -180,9 +180,11 @@ static inline u32 rx_max(struct dw_spi *dws)
|
||||
|
||||
static void dw_writer(struct dw_spi *dws)
|
||||
{
|
||||
u32 max = tx_max(dws);
|
||||
u32 max;
|
||||
u16 txw = 0;
|
||||
|
||||
spin_lock(&dws->buf_lock);
|
||||
max = tx_max(dws);
|
||||
while (max--) {
|
||||
/* Set the tx word if the transfer's original "tx" is not null */
|
||||
if (dws->tx_end - dws->len) {
|
||||
@@ -194,13 +196,16 @@ static void dw_writer(struct dw_spi *dws)
|
||||
dw_write_io_reg(dws, DW_SPI_DR, txw);
|
||||
dws->tx += dws->n_bytes;
|
||||
}
|
||||
spin_unlock(&dws->buf_lock);
|
||||
}
|
||||
|
||||
static void dw_reader(struct dw_spi *dws)
|
||||
{
|
||||
u32 max = rx_max(dws);
|
||||
u32 max;
|
||||
u16 rxw;
|
||||
|
||||
spin_lock(&dws->buf_lock);
|
||||
max = rx_max(dws);
|
||||
while (max--) {
|
||||
rxw = dw_read_io_reg(dws, DW_SPI_DR);
|
||||
/* Care rx only if the transfer's original "rx" is not null */
|
||||
@@ -212,6 +217,7 @@ static void dw_reader(struct dw_spi *dws)
|
||||
}
|
||||
dws->rx += dws->n_bytes;
|
||||
}
|
||||
spin_unlock(&dws->buf_lock);
|
||||
}
|
||||
|
||||
static void int_error_stop(struct dw_spi *dws, const char *msg)
|
||||
@@ -284,18 +290,20 @@ static int dw_spi_transfer_one(struct spi_master *master,
|
||||
{
|
||||
struct dw_spi *dws = spi_master_get_devdata(master);
|
||||
struct chip_data *chip = spi_get_ctldata(spi);
|
||||
unsigned long flags;
|
||||
u8 imask = 0;
|
||||
u16 txlevel = 0;
|
||||
u32 cr0;
|
||||
int ret;
|
||||
|
||||
dws->dma_mapped = 0;
|
||||
|
||||
spin_lock_irqsave(&dws->buf_lock, flags);
|
||||
dws->tx = (void *)transfer->tx_buf;
|
||||
dws->tx_end = dws->tx + transfer->len;
|
||||
dws->rx = transfer->rx_buf;
|
||||
dws->rx_end = dws->rx + transfer->len;
|
||||
dws->len = transfer->len;
|
||||
spin_unlock_irqrestore(&dws->buf_lock, flags);
|
||||
|
||||
spi_enable_chip(dws, 0);
|
||||
|
||||
@@ -486,6 +494,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
|
||||
dws->type = SSI_MOTO_SPI;
|
||||
dws->dma_inited = 0;
|
||||
dws->dma_addr = (dma_addr_t)(dws->paddr + DW_SPI_DR);
|
||||
spin_lock_init(&dws->buf_lock);
|
||||
|
||||
ret = request_irq(dws->irq, dw_spi_irq, IRQF_SHARED, dev_name(dev),
|
||||
master);
|
||||
|
||||
@@ -117,6 +117,7 @@ struct dw_spi {
|
||||
size_t len;
|
||||
void *tx;
|
||||
void *tx_end;
|
||||
spinlock_t buf_lock;
|
||||
void *rx;
|
||||
void *rx_end;
|
||||
int dma_mapped;
|
||||
|
||||
@@ -62,6 +62,8 @@
|
||||
#define RATE_AUTO 12
|
||||
|
||||
#define MAX_RATE 12
|
||||
#define VNT_B_RATES (BIT(RATE_1M) | BIT(RATE_2M) |\
|
||||
BIT(RATE_5M) | BIT(RATE_11M))
|
||||
|
||||
/*
|
||||
* device specific
|
||||
|
||||
@@ -107,9 +107,11 @@ static int vnt_int_report_rate(struct vnt_private *priv, u8 pkt_no, u8 tsr)
|
||||
|
||||
info->status.rates[0].count = tx_retry;
|
||||
|
||||
if (!(tsr & (TSR_TMO | TSR_RETRYTMO))) {
|
||||
if (!(tsr & TSR_TMO)) {
|
||||
info->status.rates[0].idx = idx;
|
||||
info->flags |= IEEE80211_TX_STAT_ACK;
|
||||
|
||||
if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
|
||||
info->flags |= IEEE80211_TX_STAT_ACK;
|
||||
}
|
||||
|
||||
ieee80211_tx_status_irqsafe(priv->hw, context->skb);
|
||||
|
||||
@@ -977,6 +977,7 @@ vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS);
|
||||
ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS);
|
||||
ieee80211_hw_set(priv->hw, SUPPORTS_PS);
|
||||
ieee80211_hw_set(priv->hw, PS_NULLFUNC_STACK);
|
||||
|
||||
priv->hw->max_signal = 100;
|
||||
|
||||
|
||||
@@ -288,11 +288,9 @@ static u16 vnt_rxtx_datahead_g(struct vnt_usb_send_context *tx_context,
|
||||
PK_TYPE_11B, &buf->b);
|
||||
|
||||
/* Get Duration and TimeStamp */
|
||||
if (ieee80211_is_pspoll(hdr->frame_control)) {
|
||||
__le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15));
|
||||
|
||||
buf->duration_a = dur;
|
||||
buf->duration_b = dur;
|
||||
if (ieee80211_is_nullfunc(hdr->frame_control)) {
|
||||
buf->duration_a = hdr->duration_id;
|
||||
buf->duration_b = hdr->duration_id;
|
||||
} else {
|
||||
buf->duration_a = vnt_get_duration_le(priv,
|
||||
tx_context->pkt_type, need_ack);
|
||||
@@ -381,10 +379,8 @@ static u16 vnt_rxtx_datahead_ab(struct vnt_usb_send_context *tx_context,
|
||||
tx_context->pkt_type, &buf->ab);
|
||||
|
||||
/* Get Duration and TimeStampOff */
|
||||
if (ieee80211_is_pspoll(hdr->frame_control)) {
|
||||
__le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15));
|
||||
|
||||
buf->duration = dur;
|
||||
if (ieee80211_is_nullfunc(hdr->frame_control)) {
|
||||
buf->duration = hdr->duration_id;
|
||||
} else {
|
||||
buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type,
|
||||
need_ack);
|
||||
@@ -825,10 +821,14 @@ int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)
|
||||
if (info->band == NL80211_BAND_5GHZ) {
|
||||
pkt_type = PK_TYPE_11A;
|
||||
} else {
|
||||
if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
|
||||
pkt_type = PK_TYPE_11GB;
|
||||
else
|
||||
pkt_type = PK_TYPE_11GA;
|
||||
if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
|
||||
if (priv->basic_rates & VNT_B_RATES)
|
||||
pkt_type = PK_TYPE_11GB;
|
||||
else
|
||||
pkt_type = PK_TYPE_11GA;
|
||||
} else {
|
||||
pkt_type = PK_TYPE_11A;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
pkt_type = PK_TYPE_11B;
|
||||
|
||||
@@ -945,7 +945,7 @@ int prism2mgmt_flashdl_state(struct wlandevice *wlandev, void *msgp)
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -119,7 +119,7 @@ static int bcm2835aux_serial_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct bcm2835aux_data *data = platform_get_drvdata(pdev);
|
||||
|
||||
serial8250_unregister_port(data->uart.port.line);
|
||||
serial8250_unregister_port(data->line);
|
||||
clk_disable_unprepare(data->clk);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1031,6 +1031,9 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc)
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
|
||||
/* de-assert DRVVBUS for HOST and OTG mode */
|
||||
dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE);
|
||||
}
|
||||
|
||||
static void dwc3_get_properties(struct dwc3 *dwc)
|
||||
|
||||
@@ -49,9 +49,10 @@ static int buffer_size;
|
||||
static int xbof = -1;
|
||||
|
||||
static int ir_startup (struct usb_serial *serial);
|
||||
static int ir_open(struct tty_struct *tty, struct usb_serial_port *port);
|
||||
static int ir_prepare_write_buffer(struct usb_serial_port *port,
|
||||
void *dest, size_t size);
|
||||
static int ir_write(struct tty_struct *tty, struct usb_serial_port *port,
|
||||
const unsigned char *buf, int count);
|
||||
static int ir_write_room(struct tty_struct *tty);
|
||||
static void ir_write_bulk_callback(struct urb *urb);
|
||||
static void ir_process_read_urb(struct urb *urb);
|
||||
static void ir_set_termios(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, struct ktermios *old_termios);
|
||||
@@ -81,8 +82,9 @@ static struct usb_serial_driver ir_device = {
|
||||
.num_ports = 1,
|
||||
.set_termios = ir_set_termios,
|
||||
.attach = ir_startup,
|
||||
.open = ir_open,
|
||||
.prepare_write_buffer = ir_prepare_write_buffer,
|
||||
.write = ir_write,
|
||||
.write_room = ir_write_room,
|
||||
.write_bulk_callback = ir_write_bulk_callback,
|
||||
.process_read_urb = ir_process_read_urb,
|
||||
};
|
||||
|
||||
@@ -199,6 +201,9 @@ static int ir_startup(struct usb_serial *serial)
|
||||
struct usb_irda_cs_descriptor *irda_desc;
|
||||
int rates;
|
||||
|
||||
if (serial->num_bulk_in < 1 || serial->num_bulk_out < 1)
|
||||
return -ENODEV;
|
||||
|
||||
irda_desc = irda_usb_find_class_desc(serial, 0);
|
||||
if (!irda_desc) {
|
||||
dev_err(&serial->dev->dev,
|
||||
@@ -255,35 +260,102 @@ static int ir_startup(struct usb_serial *serial)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ir_open(struct tty_struct *tty, struct usb_serial_port *port)
|
||||
static int ir_write(struct tty_struct *tty, struct usb_serial_port *port,
|
||||
const unsigned char *buf, int count)
|
||||
{
|
||||
int i;
|
||||
struct urb *urb = NULL;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
|
||||
port->write_urbs[i]->transfer_flags = URB_ZERO_PACKET;
|
||||
if (port->bulk_out_size == 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* Start reading from the device */
|
||||
return usb_serial_generic_open(tty, port);
|
||||
}
|
||||
if (count == 0)
|
||||
return 0;
|
||||
|
||||
static int ir_prepare_write_buffer(struct usb_serial_port *port,
|
||||
void *dest, size_t size)
|
||||
{
|
||||
unsigned char *buf = dest;
|
||||
int count;
|
||||
count = min(count, port->bulk_out_size - 1);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
if (__test_and_clear_bit(0, &port->write_urbs_free)) {
|
||||
urb = port->write_urbs[0];
|
||||
port->tx_bytes += count;
|
||||
}
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
|
||||
if (!urb)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* The first byte of the packet we send to the device contains an
|
||||
* inbound header which indicates an additional number of BOFs and
|
||||
* outbound header which indicates an additional number of BOFs and
|
||||
* a baud rate change.
|
||||
*
|
||||
* See section 5.4.2.2 of the USB IrDA spec.
|
||||
*/
|
||||
*buf = ir_xbof | ir_baud;
|
||||
*(u8 *)urb->transfer_buffer = ir_xbof | ir_baud;
|
||||
|
||||
count = kfifo_out_locked(&port->write_fifo, buf + 1, size - 1,
|
||||
&port->lock);
|
||||
return count + 1;
|
||||
memcpy(urb->transfer_buffer + 1, buf, count);
|
||||
|
||||
urb->transfer_buffer_length = count + 1;
|
||||
urb->transfer_flags = URB_ZERO_PACKET;
|
||||
|
||||
ret = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (ret) {
|
||||
dev_err(&port->dev, "failed to submit write urb: %d\n", ret);
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
__set_bit(0, &port->write_urbs_free);
|
||||
port->tx_bytes -= count;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static void ir_write_bulk_callback(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
int status = urb->status;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
__set_bit(0, &port->write_urbs_free);
|
||||
port->tx_bytes -= urb->transfer_buffer_length - 1;
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
|
||||
switch (status) {
|
||||
case 0:
|
||||
break;
|
||||
case -ENOENT:
|
||||
case -ECONNRESET:
|
||||
case -ESHUTDOWN:
|
||||
dev_dbg(&port->dev, "write urb stopped: %d\n", status);
|
||||
return;
|
||||
case -EPIPE:
|
||||
dev_err(&port->dev, "write urb stopped: %d\n", status);
|
||||
return;
|
||||
default:
|
||||
dev_err(&port->dev, "nonzero write-urb status: %d\n", status);
|
||||
break;
|
||||
}
|
||||
|
||||
usb_serial_port_softint(port);
|
||||
}
|
||||
|
||||
static int ir_write_room(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
int count = 0;
|
||||
|
||||
if (port->bulk_out_size == 0)
|
||||
return 0;
|
||||
|
||||
if (test_bit(0, &port->write_urbs_free))
|
||||
count = port->bulk_out_size - 1;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static void ir_process_read_urb(struct urb *urb)
|
||||
@@ -336,34 +408,34 @@ static void ir_set_termios(struct tty_struct *tty,
|
||||
|
||||
switch (baud) {
|
||||
case 2400:
|
||||
ir_baud = USB_IRDA_BR_2400;
|
||||
ir_baud = USB_IRDA_LS_2400;
|
||||
break;
|
||||
case 9600:
|
||||
ir_baud = USB_IRDA_BR_9600;
|
||||
ir_baud = USB_IRDA_LS_9600;
|
||||
break;
|
||||
case 19200:
|
||||
ir_baud = USB_IRDA_BR_19200;
|
||||
ir_baud = USB_IRDA_LS_19200;
|
||||
break;
|
||||
case 38400:
|
||||
ir_baud = USB_IRDA_BR_38400;
|
||||
ir_baud = USB_IRDA_LS_38400;
|
||||
break;
|
||||
case 57600:
|
||||
ir_baud = USB_IRDA_BR_57600;
|
||||
ir_baud = USB_IRDA_LS_57600;
|
||||
break;
|
||||
case 115200:
|
||||
ir_baud = USB_IRDA_BR_115200;
|
||||
ir_baud = USB_IRDA_LS_115200;
|
||||
break;
|
||||
case 576000:
|
||||
ir_baud = USB_IRDA_BR_576000;
|
||||
ir_baud = USB_IRDA_LS_576000;
|
||||
break;
|
||||
case 1152000:
|
||||
ir_baud = USB_IRDA_BR_1152000;
|
||||
ir_baud = USB_IRDA_LS_1152000;
|
||||
break;
|
||||
case 4000000:
|
||||
ir_baud = USB_IRDA_BR_4000000;
|
||||
ir_baud = USB_IRDA_LS_4000000;
|
||||
break;
|
||||
default:
|
||||
ir_baud = USB_IRDA_BR_9600;
|
||||
ir_baud = USB_IRDA_LS_9600;
|
||||
baud = 9600;
|
||||
}
|
||||
|
||||
|
||||
@@ -163,12 +163,15 @@ UNUSUAL_DEV(0x2537, 0x1068, 0x0000, 0x9999,
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_UAS),
|
||||
|
||||
/* Reported-by: Takeo Nakayama <javhera@gmx.com> */
|
||||
/*
|
||||
* Initially Reported-by: Takeo Nakayama <javhera@gmx.com>
|
||||
* UAS Ignore Reported by Steven Ellis <sellis@redhat.com>
|
||||
*/
|
||||
UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999,
|
||||
"JMicron",
|
||||
"JMS566",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_NO_REPORT_OPCODES),
|
||||
US_FL_NO_REPORT_OPCODES | US_FL_IGNORE_UAS),
|
||||
|
||||
/* Reported-by: Hans de Goede <hdegoede@redhat.com> */
|
||||
UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999,
|
||||
|
||||
@@ -563,6 +563,7 @@ config MAX63XX_WATCHDOG
|
||||
config MAX77620_WATCHDOG
|
||||
tristate "Maxim Max77620 Watchdog Timer"
|
||||
depends on MFD_MAX77620 || COMPILE_TEST
|
||||
select WATCHDOG_CORE
|
||||
help
|
||||
This is the driver for the Max77620 watchdog timer.
|
||||
Say 'Y' here to enable the watchdog timer support for
|
||||
|
||||
@@ -193,6 +193,7 @@ static struct platform_driver rn5t618_wdt_driver = {
|
||||
|
||||
module_platform_driver(rn5t618_wdt_driver);
|
||||
|
||||
MODULE_ALIAS("platform:rn5t618-wdt");
|
||||
MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>");
|
||||
MODULE_DESCRIPTION("RN5T618 watchdog driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
@@ -2114,7 +2114,15 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
*/
|
||||
thresh = 4 * 1024 * 1024;
|
||||
|
||||
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
@@ -1828,6 +1828,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;
|
||||
@@ -3509,40 +3516,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;
|
||||
@@ -3750,6 +3723,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),
|
||||
@@ -3985,29 +4017,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 ||
|
||||
@@ -4462,8 +4471,6 @@ no_journal:
|
||||
if (ext4_setup_super(sb, es, sb_rdonly(sb)))
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
|
||||
ext4_clamp_want_extra_isize(sb);
|
||||
|
||||
ext4_set_resv_clusters(sb);
|
||||
|
||||
err = ext4_setup_system_zone(sb);
|
||||
@@ -5252,8 +5259,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 "
|
||||
|
||||
@@ -3380,8 +3380,8 @@ static int do_last(struct nameidata *nd,
|
||||
int *opened)
|
||||
{
|
||||
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 @@ error_unlocked:
|
||||
kfree(qf_names[j]);
|
||||
}
|
||||
#endif
|
||||
kfree(sbi->s_jdev);
|
||||
kfree(sbi);
|
||||
|
||||
s->s_fs_info = NULL;
|
||||
|
||||
@@ -119,11 +119,22 @@ struct usb_irda_cs_descriptor {
|
||||
* 6 - 115200 bps
|
||||
* 7 - 576000 bps
|
||||
* 8 - 1.152 Mbps
|
||||
* 9 - 5 mbps
|
||||
* 9 - 4 Mbps
|
||||
* 10..15 - Reserved
|
||||
*/
|
||||
#define USB_IRDA_STATUS_LINK_SPEED 0x0f
|
||||
|
||||
#define USB_IRDA_LS_NO_CHANGE 0
|
||||
#define USB_IRDA_LS_2400 1
|
||||
#define USB_IRDA_LS_9600 2
|
||||
#define USB_IRDA_LS_19200 3
|
||||
#define USB_IRDA_LS_38400 4
|
||||
#define USB_IRDA_LS_57600 5
|
||||
#define USB_IRDA_LS_115200 6
|
||||
#define USB_IRDA_LS_576000 7
|
||||
#define USB_IRDA_LS_1152000 8
|
||||
#define USB_IRDA_LS_4000000 9
|
||||
|
||||
/* The following is a 4-bit value used only for
|
||||
* outbound header:
|
||||
*
|
||||
|
||||
@@ -2843,6 +2843,9 @@ struct cfg80211_pmk_conf {
|
||||
*
|
||||
* @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.
|
||||
@@ -3148,6 +3151,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,
|
||||
|
||||
@@ -2888,8 +2888,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;
|
||||
|
||||
@@ -2899,6 +2897,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)
|
||||
@@ -2934,11 +2934,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);
|
||||
@@ -3225,7 +3225,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;
|
||||
|
||||
|
||||
@@ -2728,6 +2728,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';
|
||||
@@ -2738,9 +2741,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;
|
||||
|
||||
@@ -826,6 +826,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);
|
||||
@@ -873,6 +875,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;
|
||||
}
|
||||
|
||||
@@ -419,6 +419,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)
|
||||
@@ -430,9 +447,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);
|
||||
|
||||
@@ -2800,6 +2800,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)
|
||||
{
|
||||
@@ -3730,6 +3752,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
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user