Merge 5.10.157 into android12-5.10-lts
Changes in 5.10.157 scsi: scsi_transport_sas: Fix error handling in sas_phy_add() ata: libata-scsi: simplify __ata_scsi_queuecmd() ata: libata-core: do not issue non-internal commands once EH is pending bridge: switchdev: Notify about VLAN protocol changes bridge: switchdev: Fix memory leaks when changing VLAN protocol drm/display: Don't assume dual mode adaptors support i2c sub-addressing nvme: add a bogus subsystem NQN quirk for Micron MTFDKBA2T0TFH nvme-pci: add NVME_QUIRK_BOGUS_NID for Micron Nitro iio: ms5611: Simplify IO callback parameters iio: pressure: ms5611: fixed value compensation bug ceph: do not update snapshot context when there is no new snapshot ceph: avoid putting the realm twice when decoding snaps fails wifi: mac80211: fix memory free error when registering wiphy fail wifi: mac80211_hwsim: fix debugfs attribute ps with rc table support riscv: dts: sifive unleashed: Add PWM controlled LEDs audit: fix undefined behavior in bit shift for AUDIT_BIT wifi: airo: do not assign -1 to unsigned char wifi: mac80211: Fix ack frame idr leak when mesh has no route spi: stm32: fix stm32_spi_prepare_mbr() that halves spi clk for every run selftests/bpf: Add verifier test for release_reference() Revert "net: macsec: report real_dev features when HW offloading is enabled" platform/x86: touchscreen_dmi: Add info for the RCA Cambio W101 v2 2-in-1 scsi: ibmvfc: Avoid path failures during live migration scsi: scsi_debug: Make the READ CAPACITY response compliant with ZBC drm: panel-orientation-quirks: Add quirk for Acer Switch V 10 (SW5-017) block, bfq: fix null pointer dereference in bfq_bio_bfqg() arm64/syscall: Include asm/ptrace.h in syscall_wrapper header. RISC-V: vdso: Do not add missing symbols to version section in linker script MIPS: pic32: treat port as signed integer xfrm: fix "disable_policy" on ipv4 early demux xfrm: replay: Fix ESN wrap around for GSO af_key: Fix send_acquire race with pfkey_register ARM: dts: am335x-pcm-953: Define fixed regulators in root node ASoC: hdac_hda: fix hda pcm buffer overflow issue ASoC: sgtl5000: Reset the CHIP_CLK_CTRL reg on remove ASoC: soc-pcm: Don't zero TDM masks in __soc_pcm_open() scsi: storvsc: Fix handling of srb_status and capacity change events regulator: core: fix kobject release warning and memory leak in regulator_register() spi: dw-dma: decrease reference count in dw_spi_dma_init_mfld() regulator: core: fix UAF in destroy_regulator() bus: sunxi-rsb: Support atomic transfers tee: optee: fix possible memory leak in optee_register_device() ARM: dts: at91: sam9g20ek: enable udc vbus gpio pinctrl net: liquidio: simplify if expression rxrpc: Allow list of in-use local UDP endpoints to be viewed in /proc rxrpc: Use refcount_t rather than atomic_t rxrpc: Fix race between conn bundle lookup and bundle removal [ZDI-CAN-15975] nfc/nci: fix race with opening and closing net: pch_gbe: fix potential memleak in pch_gbe_tx_queue() 9p/fd: fix issue of list_del corruption in p9_fd_cancel() netfilter: conntrack: Fix data-races around ct mark ARM: mxs: fix memory leak in mxs_machine_init() ARM: dts: imx6q-prti6q: Fix ref/tcxo-clock-frequency properties net: ethernet: mtk_eth_soc: fix error handling in mtk_open() net/mlx4: Check retval of mlx4_bitmap_init net/qla3xxx: fix potential memleak in ql3xxx_send() net: pch_gbe: fix pci device refcount leak while module exiting nfp: fill splittable of devlink_port_attrs correctly nfp: add port from netdev validation for EEPROM access macsec: Fix invalid error code set Drivers: hv: vmbus: fix double free in the error path of vmbus_add_channel_work() Drivers: hv: vmbus: fix possible memory leak in vmbus_device_register() netfilter: ipset: Limit the maximal range of consecutive elements to add/delete netfilter: ipset: regression in ip_set_hash_ip.c net/mlx5: Fix FW tracer timestamp calculation net/mlx5: Fix handling of entry refcount when command is not issued to FW tipc: set con sock in tipc_conn_alloc tipc: add an extra conn_get in tipc_conn_alloc tipc: check skb_linearize() return value in tipc_disc_rcv() xfrm: Fix ignored return value in xfrm6_init() sfc: fix potential memleak in __ef100_hard_start_xmit() net: sched: allow act_ct to be built without NF_NAT NFC: nci: fix memory leak in nci_rx_data_packet() regulator: twl6030: re-add TWL6032_SUBCLASS bnx2x: fix pci device refcount leak in bnx2x_vf_is_pcie_pending() dma-buf: fix racing conflict of dma_heap_add() netfilter: flowtable_offload: add missing locking dccp/tcp: Reset saddr on failure after inet6?_hash_connect(). ipv4: Fix error return code in fib_table_insert() s390/dasd: fix no record found for raw_track_access net: arcnet: Fix RESET flag handling arcnet: fix potential memory leak in com20020_probe() nfc: st-nci: fix incorrect validating logic in EVT_TRANSACTION nfc: st-nci: fix memory leaks in EVT_TRANSACTION net: thunderx: Fix the ACPI memory leak s390/crashdump: fix TOD programmable field size net: enetc: manage ENETC_F_QBV in priv->active_offloads only when enabled net: enetc: cache accesses to &priv->si->hw net: enetc: preserve TX ring priority across reconfiguration lib/vdso: use "grep -E" instead of "egrep" usb: dwc3: exynos: Fix remove() function ext4: fix use-after-free in ext4_ext_shift_extents arm64: dts: rockchip: lower rk3399-puma-haikou SD controller clock frequency iio: light: apds9960: fix wrong register for gesture gain iio: core: Fix entry not deleted when iio_register_sw_trigger_type() fails init/Kconfig: fix CC_HAS_ASM_GOTO_TIED_OUTPUT test with dash nios2: add FORCE for vmlinuz.gz mmc: sdhci-brcmstb: Re-organize flags mmc: sdhci-brcmstb: Enable Clock Gating to save power mmc: sdhci-brcmstb: Fix SDHCI_RESET_ALL for CQHCI usb: cdns3: Add support for DRD CDNSP ceph: make ceph_create_session_msg a global symbol ceph: make iterate_sessions a global symbol ceph: flush mdlog before umounting ceph: flush the mdlog before waiting on unsafe reqs ceph: fix off by one bugs in unsafe_request_wait() ceph: put the requests/sessions when it fails to alloc memory ceph: fix possible NULL pointer dereference for req->r_session ceph: Use kcalloc for allocating multiple elements ceph: fix NULL pointer dereference for req->r_session usb: dwc3: gadget: conditionally remove requests usb: dwc3: gadget: Return -ESHUTDOWN on ep disable usb: dwc3: gadget: Clear ep descriptor last nilfs2: fix nilfs_sufile_mark_dirty() not set segment usage as dirty gcov: clang: fix the buffer overflow issue mm: vmscan: fix extreme overreclaim and swap floods KVM: x86: nSVM: leave nested mode on vCPU free KVM: x86: remove exit_int_info warning in svm_handle_exit x86/ioremap: Fix page aligned size calculation in __ioremap_caller() binder: avoid potential data leakage when copying txn binder: read pre-translated fds from sender buffer binder: defer copies of pre-patched txn data binder: fix pointer cast warning binder: Address corner cases in deferred copy and fixup binder: Gracefully handle BINDER_TYPE_FDA objects with num_fds=0 Input: synaptics - switch touchpad on HP Laptop 15-da3001TU to RMI mode ASoC: Intel: bytcht_es8316: Add quirk for the Nanote UMPC-01 serial: 8250: 8250_omap: Avoid RS485 RTS glitch on ->set_termios() Input: goodix - try resetting the controller when no config is set Input: soc_button_array - add use_low_level_irq module parameter Input: soc_button_array - add Acer Switch V 10 to dmi_use_low_level_irq[] xen-pciback: Allow setting PCI_MSIX_FLAGS_MASKALL too xen/platform-pci: add missing free_irq() in error path platform/x86: asus-wmi: add missing pci_dev_put() in asus_wmi_set_xusb2pr() platform/x86: acer-wmi: Enable SW_TABLET_MODE on Switch V 10 (SW5-017) zonefs: fix zone report size in __zonefs_io_error() platform/x86: hp-wmi: Ignore Smart Experience App event tcp: configurable source port perturb table size net: usb: qmi_wwan: add Telit 0x103a composition gpu: host1x: Avoid trying to use GART on Tegra20 dm integrity: flush the journal on suspend dm integrity: clear the journal on suspend wifi: wilc1000: validate pairwise and authentication suite offsets wifi: wilc1000: validate length of IEEE80211_P2P_ATTR_OPER_CHANNEL attribute wifi: wilc1000: validate length of IEEE80211_P2P_ATTR_CHANNEL_LIST attribute wifi: wilc1000: validate number of channels genirq/msi: Shutdown managed interrupts with unsatifiable affinities genirq: Always limit the affinity to online CPUs irqchip/gic-v3: Always trust the managed affinity provided by the core code genirq: Take the proposed affinity at face value if force==true btrfs: free btrfs_path before copying root refs to userspace btrfs: free btrfs_path before copying fspath to userspace btrfs: free btrfs_path before copying subvol info to userspace btrfs: sysfs: normalize the error handling branch in btrfs_init_sysfs() drm/amd/dc/dce120: Fix audio register mapping, stop triggering KASAN drm/amdgpu: always register an MMU notifier for userptr drm/i915: fix TLB invalidation for Gen12 video and compute engines fuse: lock inode unconditionally in fuse_fallocate() Linux 5.10.157 Change-Id: Ie53a7379c392879de240237eb8258857b59564a6 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 156
|
||||
SUBLEVEL = 157
|
||||
EXTRAVERSION =
|
||||
NAME = Dare mighty things
|
||||
|
||||
|
@@ -12,22 +12,20 @@
|
||||
compatible = "phytec,am335x-pcm-953", "phytec,am335x-phycore-som", "ti,am33xx";
|
||||
|
||||
/* Power */
|
||||
regulators {
|
||||
vcc3v3: fixedregulator@1 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc3v3";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-boot-on;
|
||||
};
|
||||
vcc3v3: fixedregulator1 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc3v3";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
vcc1v8: fixedregulator@2 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc1v8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-boot-on;
|
||||
};
|
||||
vcc1v8: fixedregulator2 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc1v8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
/* User IO */
|
||||
|
@@ -39,6 +39,13 @@
|
||||
|
||||
};
|
||||
|
||||
usb1 {
|
||||
pinctrl_usb1_vbus_gpio: usb1_vbus_gpio {
|
||||
atmel,pins =
|
||||
<AT91_PIOC 5 AT91_PERIPH_GPIO AT91_PINCTRL_DEGLITCH>; /* PC5 GPIO */
|
||||
};
|
||||
};
|
||||
|
||||
mmc0_slot1 {
|
||||
pinctrl_board_mmc0_slot1: mmc0_slot1-board {
|
||||
atmel,pins =
|
||||
@@ -84,6 +91,8 @@
|
||||
};
|
||||
|
||||
usb1: gadget@fffa4000 {
|
||||
pinctrl-0 = <&pinctrl_usb1_vbus_gpio>;
|
||||
pinctrl-names = "default";
|
||||
atmel,vbus-gpio = <&pioC 5 GPIO_ACTIVE_HIGH>;
|
||||
status = "okay";
|
||||
};
|
||||
|
@@ -364,8 +364,8 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_wifi>;
|
||||
interrupts-extended = <&gpio1 30 IRQ_TYPE_LEVEL_HIGH>;
|
||||
ref-clock-frequency = "38400000";
|
||||
tcxo-clock-frequency = "19200000";
|
||||
ref-clock-frequency = <38400000>;
|
||||
tcxo-clock-frequency = <19200000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
@@ -387,8 +387,10 @@ static void __init mxs_machine_init(void)
|
||||
|
||||
root = of_find_node_by_path("/");
|
||||
ret = of_property_read_string(root, "model", &soc_dev_attr->machine);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
kfree(soc_dev_attr);
|
||||
return;
|
||||
}
|
||||
|
||||
soc_dev_attr->family = "Freescale MXS Family";
|
||||
soc_dev_attr->soc_id = mxs_get_soc_id();
|
||||
|
@@ -203,7 +203,7 @@
|
||||
cap-sd-highspeed;
|
||||
cd-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>;
|
||||
disable-wp;
|
||||
max-frequency = <150000000>;
|
||||
max-frequency = <40000000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
|
||||
vmmc-supply = <&vcc3v3_baseboard>;
|
||||
|
@@ -8,7 +8,7 @@
|
||||
#ifndef __ASM_SYSCALL_WRAPPER_H
|
||||
#define __ASM_SYSCALL_WRAPPER_H
|
||||
|
||||
struct pt_regs;
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
#define SC_ARM64_REGS_TO_ARGS(x, ...) \
|
||||
__MAP(x,__SC_ARGS \
|
||||
|
@@ -26,6 +26,6 @@ extern char *fw_getcmdline(void);
|
||||
extern void fw_meminit(void);
|
||||
extern char *fw_getenv(char *name);
|
||||
extern unsigned long fw_getenvl(char *name);
|
||||
extern void fw_init_early_console(char port);
|
||||
extern void fw_init_early_console(void);
|
||||
|
||||
#endif /* __ASM_FW_H_ */
|
||||
|
@@ -27,7 +27,7 @@
|
||||
#define U_BRG(x) (UART_BASE(x) + 0x40)
|
||||
|
||||
static void __iomem *uart_base;
|
||||
static char console_port = -1;
|
||||
static int console_port = -1;
|
||||
|
||||
static int __init configure_uart_pins(int port)
|
||||
{
|
||||
@@ -47,7 +47,7 @@ static int __init configure_uart_pins(int port)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init configure_uart(char port, int baud)
|
||||
static void __init configure_uart(int port, int baud)
|
||||
{
|
||||
u32 pbclk;
|
||||
|
||||
@@ -60,7 +60,7 @@ static void __init configure_uart(char port, int baud)
|
||||
uart_base + PIC32_SET(U_STA(port)));
|
||||
}
|
||||
|
||||
static void __init setup_early_console(char port, int baud)
|
||||
static void __init setup_early_console(int port, int baud)
|
||||
{
|
||||
if (configure_uart_pins(port))
|
||||
return;
|
||||
@@ -130,16 +130,15 @@ _out:
|
||||
return baud;
|
||||
}
|
||||
|
||||
void __init fw_init_early_console(char port)
|
||||
void __init fw_init_early_console(void)
|
||||
{
|
||||
char *arch_cmdline = pic32_getcmdline();
|
||||
int baud = -1;
|
||||
int baud, port;
|
||||
|
||||
uart_base = ioremap(PIC32_BASE_UART, 0xc00);
|
||||
|
||||
baud = get_baud_from_cmdline(arch_cmdline);
|
||||
if (port == -1)
|
||||
port = get_port_from_cmdline(arch_cmdline);
|
||||
port = get_port_from_cmdline(arch_cmdline);
|
||||
|
||||
if (port == -1)
|
||||
port = EARLY_CONSOLE_PORT;
|
||||
|
@@ -60,7 +60,7 @@ void __init plat_mem_setup(void)
|
||||
strlcpy(arcs_cmdline, boot_command_line, COMMAND_LINE_SIZE);
|
||||
|
||||
#ifdef CONFIG_EARLY_PRINTK
|
||||
fw_init_early_console(-1);
|
||||
fw_init_early_console();
|
||||
#endif
|
||||
pic32_config_init();
|
||||
}
|
||||
|
@@ -20,7 +20,7 @@ $(obj)/vmlinux.bin: vmlinux FORCE
|
||||
$(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE
|
||||
$(call if_changed,gzip)
|
||||
|
||||
$(obj)/vmImage: $(obj)/vmlinux.gz
|
||||
$(obj)/vmImage: $(obj)/vmlinux.gz FORCE
|
||||
$(call if_changed,uimage)
|
||||
@$(kecho) 'Kernel: $@ is ready'
|
||||
|
||||
|
@@ -3,6 +3,8 @@
|
||||
|
||||
#include "fu540-c000.dtsi"
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
#include <dt-bindings/pwm/pwm.h>
|
||||
|
||||
/* Clock frequency (in Hz) of the PCB crystal for rtcclk */
|
||||
#define RTCCLK_FREQ 1000000
|
||||
@@ -46,6 +48,42 @@
|
||||
compatible = "gpio-restart";
|
||||
gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
led-controller {
|
||||
compatible = "pwm-leds";
|
||||
|
||||
led-d1 {
|
||||
pwms = <&pwm0 0 7812500 PWM_POLARITY_INVERTED>;
|
||||
active-low;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
max-brightness = <255>;
|
||||
label = "d1";
|
||||
};
|
||||
|
||||
led-d2 {
|
||||
pwms = <&pwm0 1 7812500 PWM_POLARITY_INVERTED>;
|
||||
active-low;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
max-brightness = <255>;
|
||||
label = "d2";
|
||||
};
|
||||
|
||||
led-d3 {
|
||||
pwms = <&pwm0 2 7812500 PWM_POLARITY_INVERTED>;
|
||||
active-low;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
max-brightness = <255>;
|
||||
label = "d3";
|
||||
};
|
||||
|
||||
led-d4 {
|
||||
pwms = <&pwm0 3 7812500 PWM_POLARITY_INVERTED>;
|
||||
active-low;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
max-brightness = <255>;
|
||||
label = "d4";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
|
@@ -28,6 +28,9 @@ obj-vdso := $(addprefix $(obj)/, $(obj-vdso))
|
||||
|
||||
obj-y += vdso.o vdso-syms.o
|
||||
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
||||
ifneq ($(filter vgettimeofday, $(vdso-syms)),)
|
||||
CPPFLAGS_vdso.lds += -DHAS_VGETTIMEOFDAY
|
||||
endif
|
||||
|
||||
# Disable -pg to prevent insert call site
|
||||
CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE)
|
||||
|
@@ -64,9 +64,11 @@ VERSION
|
||||
LINUX_4.15 {
|
||||
global:
|
||||
__vdso_rt_sigreturn;
|
||||
#ifdef HAS_VGETTIMEOFDAY
|
||||
__vdso_gettimeofday;
|
||||
__vdso_clock_gettime;
|
||||
__vdso_clock_getres;
|
||||
#endif
|
||||
__vdso_getcpu;
|
||||
__vdso_flush_icache;
|
||||
local: *;
|
||||
|
@@ -44,7 +44,7 @@ struct save_area {
|
||||
u64 fprs[16];
|
||||
u32 fpc;
|
||||
u32 prefix;
|
||||
u64 todpreg;
|
||||
u32 todpreg;
|
||||
u64 timer;
|
||||
u64 todcmp;
|
||||
u64 vxrs_low[16];
|
||||
|
@@ -305,12 +305,6 @@ int svm_set_efer(struct kvm_vcpu *vcpu, u64 efer)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int is_external_interrupt(u32 info)
|
||||
{
|
||||
info &= SVM_EVTINJ_TYPE_MASK | SVM_EVTINJ_VALID;
|
||||
return info == (SVM_EVTINJ_VALID | SVM_EVTINJ_TYPE_INTR);
|
||||
}
|
||||
|
||||
static u32 svm_get_interrupt_shadow(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
@@ -1357,6 +1351,7 @@ static void svm_free_vcpu(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
svm_clear_current_vmcb(svm->vmcb);
|
||||
|
||||
svm_leave_nested(vcpu);
|
||||
svm_free_nested(svm);
|
||||
|
||||
__free_page(pfn_to_page(__sme_clr(svm->vmcb_pa) >> PAGE_SHIFT));
|
||||
@@ -3115,15 +3110,6 @@ static int handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (is_external_interrupt(svm->vmcb->control.exit_int_info) &&
|
||||
exit_code != SVM_EXIT_EXCP_BASE + PF_VECTOR &&
|
||||
exit_code != SVM_EXIT_NPF && exit_code != SVM_EXIT_TASK_SWITCH &&
|
||||
exit_code != SVM_EXIT_INTR && exit_code != SVM_EXIT_NMI)
|
||||
printk(KERN_ERR "%s: unexpected exit_int_info 0x%x "
|
||||
"exit_code 0x%x\n",
|
||||
__func__, svm->vmcb->control.exit_int_info,
|
||||
exit_code);
|
||||
|
||||
if (exit_fastpath != EXIT_FASTPATH_NONE)
|
||||
return 1;
|
||||
|
||||
|
@@ -216,9 +216,15 @@ __ioremap_caller(resource_size_t phys_addr, unsigned long size,
|
||||
* Mappings have to be page-aligned
|
||||
*/
|
||||
offset = phys_addr & ~PAGE_MASK;
|
||||
phys_addr &= PHYSICAL_PAGE_MASK;
|
||||
phys_addr &= PAGE_MASK;
|
||||
size = PAGE_ALIGN(last_addr+1) - phys_addr;
|
||||
|
||||
/*
|
||||
* Mask out any bits not part of the actual physical
|
||||
* address, like memory encryption bits.
|
||||
*/
|
||||
phys_addr &= PHYSICAL_PAGE_MASK;
|
||||
|
||||
retval = memtype_reserve(phys_addr, (u64)phys_addr + size,
|
||||
pcm, &new_pcm);
|
||||
if (retval) {
|
||||
|
@@ -611,6 +611,10 @@ struct bfq_group *bfq_bio_bfqg(struct bfq_data *bfqd, struct bio *bio)
|
||||
struct bfq_group *bfqg;
|
||||
|
||||
while (blkg) {
|
||||
if (!blkg->online) {
|
||||
blkg = blkg->parent;
|
||||
continue;
|
||||
}
|
||||
bfqg = blkg_to_bfqg(blkg);
|
||||
if (bfqg->online) {
|
||||
bio_associate_blkg_from_css(bio, &blkg->blkcg->css);
|
||||
|
@@ -4032,44 +4032,51 @@ void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd)
|
||||
|
||||
int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev)
|
||||
{
|
||||
struct ata_port *ap = dev->link->ap;
|
||||
u8 scsi_op = scmd->cmnd[0];
|
||||
ata_xlat_func_t xlat_func;
|
||||
int rc = 0;
|
||||
|
||||
/*
|
||||
* scsi_queue_rq() will defer commands if scsi_host_in_recovery().
|
||||
* However, this check is done without holding the ap->lock (a libata
|
||||
* specific lock), so we can have received an error irq since then,
|
||||
* therefore we must check if EH is pending, while holding ap->lock.
|
||||
*/
|
||||
if (ap->pflags & (ATA_PFLAG_EH_PENDING | ATA_PFLAG_EH_IN_PROGRESS))
|
||||
return SCSI_MLQUEUE_DEVICE_BUSY;
|
||||
|
||||
if (unlikely(!scmd->cmd_len))
|
||||
goto bad_cdb_len;
|
||||
|
||||
if (dev->class == ATA_DEV_ATA || dev->class == ATA_DEV_ZAC) {
|
||||
if (unlikely(!scmd->cmd_len || scmd->cmd_len > dev->cdb_len))
|
||||
if (unlikely(scmd->cmd_len > dev->cdb_len))
|
||||
goto bad_cdb_len;
|
||||
|
||||
xlat_func = ata_get_xlat_func(dev, scsi_op);
|
||||
} else {
|
||||
if (unlikely(!scmd->cmd_len))
|
||||
} else if (likely((scsi_op != ATA_16) || !atapi_passthru16)) {
|
||||
/* relay SCSI command to ATAPI device */
|
||||
int len = COMMAND_SIZE(scsi_op);
|
||||
|
||||
if (unlikely(len > scmd->cmd_len ||
|
||||
len > dev->cdb_len ||
|
||||
scmd->cmd_len > ATAPI_CDB_LEN))
|
||||
goto bad_cdb_len;
|
||||
|
||||
xlat_func = NULL;
|
||||
if (likely((scsi_op != ATA_16) || !atapi_passthru16)) {
|
||||
/* relay SCSI command to ATAPI device */
|
||||
int len = COMMAND_SIZE(scsi_op);
|
||||
if (unlikely(len > scmd->cmd_len ||
|
||||
len > dev->cdb_len ||
|
||||
scmd->cmd_len > ATAPI_CDB_LEN))
|
||||
goto bad_cdb_len;
|
||||
xlat_func = atapi_xlat;
|
||||
} else {
|
||||
/* ATA_16 passthru, treat as an ATA command */
|
||||
if (unlikely(scmd->cmd_len > 16))
|
||||
goto bad_cdb_len;
|
||||
|
||||
xlat_func = atapi_xlat;
|
||||
} else {
|
||||
/* ATA_16 passthru, treat as an ATA command */
|
||||
if (unlikely(scmd->cmd_len > 16))
|
||||
goto bad_cdb_len;
|
||||
|
||||
xlat_func = ata_get_xlat_func(dev, scsi_op);
|
||||
}
|
||||
xlat_func = ata_get_xlat_func(dev, scsi_op);
|
||||
}
|
||||
|
||||
if (xlat_func)
|
||||
rc = ata_scsi_translate(dev, scmd, xlat_func);
|
||||
else
|
||||
ata_scsi_simulate(dev, scmd);
|
||||
return ata_scsi_translate(dev, scmd, xlat_func);
|
||||
|
||||
return rc;
|
||||
ata_scsi_simulate(dev, scmd);
|
||||
|
||||
return 0;
|
||||
|
||||
bad_cdb_len:
|
||||
DPRINTK("bad CDB len=%u, scsi_op=0x%02x, max=%u\n",
|
||||
|
@@ -268,6 +268,9 @@ EXPORT_SYMBOL_GPL(sunxi_rsb_driver_register);
|
||||
/* common code that starts a transfer */
|
||||
static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
|
||||
{
|
||||
u32 int_mask, status;
|
||||
bool timeout;
|
||||
|
||||
if (readl(rsb->regs + RSB_CTRL) & RSB_CTRL_START_TRANS) {
|
||||
dev_dbg(rsb->dev, "RSB transfer still in progress\n");
|
||||
return -EBUSY;
|
||||
@@ -275,13 +278,23 @@ static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
|
||||
|
||||
reinit_completion(&rsb->complete);
|
||||
|
||||
writel(RSB_INTS_LOAD_BSY | RSB_INTS_TRANS_ERR | RSB_INTS_TRANS_OVER,
|
||||
rsb->regs + RSB_INTE);
|
||||
int_mask = RSB_INTS_LOAD_BSY | RSB_INTS_TRANS_ERR | RSB_INTS_TRANS_OVER;
|
||||
writel(int_mask, rsb->regs + RSB_INTE);
|
||||
writel(RSB_CTRL_START_TRANS | RSB_CTRL_GLOBAL_INT_ENB,
|
||||
rsb->regs + RSB_CTRL);
|
||||
|
||||
if (!wait_for_completion_io_timeout(&rsb->complete,
|
||||
msecs_to_jiffies(100))) {
|
||||
if (irqs_disabled()) {
|
||||
timeout = readl_poll_timeout_atomic(rsb->regs + RSB_INTS,
|
||||
status, (status & int_mask),
|
||||
10, 100000);
|
||||
writel(status, rsb->regs + RSB_INTS);
|
||||
} else {
|
||||
timeout = !wait_for_completion_io_timeout(&rsb->complete,
|
||||
msecs_to_jiffies(100));
|
||||
status = rsb->status;
|
||||
}
|
||||
|
||||
if (timeout) {
|
||||
dev_dbg(rsb->dev, "RSB timeout\n");
|
||||
|
||||
/* abort the transfer */
|
||||
@@ -293,18 +306,18 @@ static int _sunxi_rsb_run_xfer(struct sunxi_rsb *rsb)
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
if (rsb->status & RSB_INTS_LOAD_BSY) {
|
||||
if (status & RSB_INTS_LOAD_BSY) {
|
||||
dev_dbg(rsb->dev, "RSB busy\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (rsb->status & RSB_INTS_TRANS_ERR) {
|
||||
if (rsb->status & RSB_INTS_TRANS_ERR_ACK) {
|
||||
if (status & RSB_INTS_TRANS_ERR) {
|
||||
if (status & RSB_INTS_TRANS_ERR_ACK) {
|
||||
dev_dbg(rsb->dev, "RSB slave nack\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (rsb->status & RSB_INTS_TRANS_ERR_DATA) {
|
||||
if (status & RSB_INTS_TRANS_ERR_DATA) {
|
||||
dev_dbg(rsb->dev, "RSB transfer data error\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
@@ -297,7 +297,7 @@ EXPORT_SYMBOL_GPL(dma_heap_get_name);
|
||||
|
||||
struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info)
|
||||
{
|
||||
struct dma_heap *heap, *err_ret;
|
||||
struct dma_heap *heap, *h, *err_ret;
|
||||
unsigned int minor;
|
||||
int ret;
|
||||
|
||||
@@ -311,15 +311,6 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info)
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
/* check the name is unique */
|
||||
heap = dma_heap_find(exp_info->name);
|
||||
if (heap) {
|
||||
pr_err("dma_heap: Already registered heap named %s\n",
|
||||
exp_info->name);
|
||||
dma_heap_put(heap);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
heap = kzalloc(sizeof(*heap), GFP_KERNEL);
|
||||
if (!heap)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@@ -363,13 +354,27 @@ struct dma_heap *dma_heap_add(const struct dma_heap_export_info *exp_info)
|
||||
/* Make sure it doesn't disappear on us */
|
||||
heap->heap_dev = get_device(heap->heap_dev);
|
||||
|
||||
/* Add heap to the list */
|
||||
mutex_lock(&heap_list_lock);
|
||||
/* check the name is unique */
|
||||
list_for_each_entry(h, &heap_list, list) {
|
||||
if (!strcmp(h->name, exp_info->name)) {
|
||||
mutex_unlock(&heap_list_lock);
|
||||
pr_err("dma_heap: Already registered heap named %s\n",
|
||||
exp_info->name);
|
||||
err_ret = ERR_PTR(-EINVAL);
|
||||
put_device(heap->heap_dev);
|
||||
goto err3;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add heap to the list */
|
||||
list_add(&heap->list, &heap_list);
|
||||
mutex_unlock(&heap_list_lock);
|
||||
|
||||
return heap;
|
||||
|
||||
err3:
|
||||
device_destroy(dma_heap_class, heap->heap_devt);
|
||||
err2:
|
||||
cdev_del(&heap->heap_cdev);
|
||||
err1:
|
||||
|
@@ -341,11 +341,9 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
|
||||
if (r)
|
||||
goto release_object;
|
||||
|
||||
if (args->flags & AMDGPU_GEM_USERPTR_REGISTER) {
|
||||
r = amdgpu_mn_register(bo, args->addr);
|
||||
if (r)
|
||||
goto release_object;
|
||||
}
|
||||
r = amdgpu_mn_register(bo, args->addr);
|
||||
if (r)
|
||||
goto release_object;
|
||||
|
||||
if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE) {
|
||||
r = amdgpu_ttm_tt_get_user_pages(bo, bo->tbo.ttm->pages);
|
||||
|
@@ -361,7 +361,8 @@ static const struct dce_audio_registers audio_regs[] = {
|
||||
audio_regs(2),
|
||||
audio_regs(3),
|
||||
audio_regs(4),
|
||||
audio_regs(5)
|
||||
audio_regs(5),
|
||||
audio_regs(6),
|
||||
};
|
||||
|
||||
#define DCE120_AUD_COMMON_MASK_SH_LIST(mask_sh)\
|
||||
|
@@ -62,23 +62,45 @@
|
||||
ssize_t drm_dp_dual_mode_read(struct i2c_adapter *adapter,
|
||||
u8 offset, void *buffer, size_t size)
|
||||
{
|
||||
u8 zero = 0;
|
||||
char *tmpbuf = NULL;
|
||||
/*
|
||||
* As sub-addressing is not supported by all adaptors,
|
||||
* always explicitly read from the start and discard
|
||||
* any bytes that come before the requested offset.
|
||||
* This way, no matter whether the adaptor supports it
|
||||
* or not, we'll end up reading the proper data.
|
||||
*/
|
||||
struct i2c_msg msgs[] = {
|
||||
{
|
||||
.addr = DP_DUAL_MODE_SLAVE_ADDRESS,
|
||||
.flags = 0,
|
||||
.len = 1,
|
||||
.buf = &offset,
|
||||
.buf = &zero,
|
||||
},
|
||||
{
|
||||
.addr = DP_DUAL_MODE_SLAVE_ADDRESS,
|
||||
.flags = I2C_M_RD,
|
||||
.len = size,
|
||||
.len = size + offset,
|
||||
.buf = buffer,
|
||||
},
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (offset) {
|
||||
tmpbuf = kmalloc(size + offset, GFP_KERNEL);
|
||||
if (!tmpbuf)
|
||||
return -ENOMEM;
|
||||
|
||||
msgs[1].buf = tmpbuf;
|
||||
}
|
||||
|
||||
ret = i2c_transfer(adapter, msgs, ARRAY_SIZE(msgs));
|
||||
if (tmpbuf)
|
||||
memcpy(buffer, tmpbuf + offset, size);
|
||||
|
||||
kfree(tmpbuf);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret != ARRAY_SIZE(msgs))
|
||||
@@ -205,18 +227,6 @@ enum drm_dp_dual_mode_type drm_dp_dual_mode_detect(struct i2c_adapter *adapter)
|
||||
if (ret)
|
||||
return DRM_DP_DUAL_MODE_UNKNOWN;
|
||||
|
||||
/*
|
||||
* Sigh. Some (maybe all?) type 1 adaptors are broken and ack
|
||||
* the offset but ignore it, and instead they just always return
|
||||
* data from the start of the HDMI ID buffer. So for a broken
|
||||
* type 1 HDMI adaptor a single byte read will always give us
|
||||
* 0x44, and for a type 1 DVI adaptor it should give 0x00
|
||||
* (assuming it implements any registers). Fortunately neither
|
||||
* of those values will match the type 2 signature of the
|
||||
* DP_DUAL_MODE_ADAPTOR_ID register so we can proceed with
|
||||
* the type 2 adaptor detection safely even in the presence
|
||||
* of broken type 1 adaptors.
|
||||
*/
|
||||
ret = drm_dp_dual_mode_read(adapter, DP_DUAL_MODE_ADAPTOR_ID,
|
||||
&adaptor_id, sizeof(adaptor_id));
|
||||
DRM_DEBUG_KMS("DP dual mode adaptor ID: %02x (err %zd)\n",
|
||||
@@ -231,11 +241,10 @@ enum drm_dp_dual_mode_type drm_dp_dual_mode_detect(struct i2c_adapter *adapter)
|
||||
return DRM_DP_DUAL_MODE_TYPE2_DVI;
|
||||
}
|
||||
/*
|
||||
* If neither a proper type 1 ID nor a broken type 1 adaptor
|
||||
* as described above, assume type 1, but let the user know
|
||||
* that we may have misdetected the type.
|
||||
* If not a proper type 1 ID, still assume type 1, but let
|
||||
* the user know that we may have misdetected the type.
|
||||
*/
|
||||
if (!is_type1_adaptor(adaptor_id) && adaptor_id != hdmi_id[0])
|
||||
if (!is_type1_adaptor(adaptor_id))
|
||||
DRM_ERROR("Unexpected DP dual mode adaptor ID %02x\n",
|
||||
adaptor_id);
|
||||
|
||||
@@ -339,10 +348,8 @@ EXPORT_SYMBOL(drm_dp_dual_mode_get_tmds_output);
|
||||
* @enable: enable (as opposed to disable) the TMDS output buffers
|
||||
*
|
||||
* Set the state of the TMDS output buffers in the adaptor. For
|
||||
* type2 this is set via the DP_DUAL_MODE_TMDS_OEN register. As
|
||||
* some type 1 adaptors have problems with registers (see comments
|
||||
* in drm_dp_dual_mode_detect()) we avoid touching the register,
|
||||
* making this function a no-op on type 1 adaptors.
|
||||
* type2 this is set via the DP_DUAL_MODE_TMDS_OEN register.
|
||||
* Type1 adaptors do not support any register writes.
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success, negative error code on failure
|
||||
|
@@ -128,6 +128,12 @@ static const struct dmi_system_id orientation_data[] = {
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "One S1003"),
|
||||
},
|
||||
.driver_data = (void *)&lcd800x1280_rightside_up,
|
||||
}, { /* Acer Switch V 10 (SW5-017) */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
|
||||
},
|
||||
.driver_data = (void *)&lcd800x1280_rightside_up,
|
||||
}, { /* Anbernic Win600 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Anbernic"),
|
||||
|
@@ -745,6 +745,10 @@ void intel_gt_invalidate_tlbs(struct intel_gt *gt)
|
||||
if (!i915_mmio_reg_offset(rb.reg))
|
||||
continue;
|
||||
|
||||
if (INTEL_GEN(i915) == 12 && (engine->class == VIDEO_DECODE_CLASS ||
|
||||
engine->class == VIDEO_ENHANCEMENT_CLASS))
|
||||
rb.bit = _MASKED_BIT_ENABLE(rb.bit);
|
||||
|
||||
intel_uncore_write_fw(uncore, rb.reg, rb.bit);
|
||||
}
|
||||
|
||||
|
@@ -1042,6 +1042,10 @@ static bool host1x_drm_wants_iommu(struct host1x_device *dev)
|
||||
struct host1x *host1x = dev_get_drvdata(dev->dev.parent);
|
||||
struct iommu_domain *domain;
|
||||
|
||||
/* Our IOMMU usage policy doesn't currently play well with GART */
|
||||
if (of_machine_is_compatible("nvidia,tegra20"))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* If the Tegra DRM clients are backed by an IOMMU, push buffers are
|
||||
* likely to be allocated beyond the 32-bit boundary if sufficient
|
||||
|
@@ -198,6 +198,10 @@ static void host1x_setup_sid_table(struct host1x *host)
|
||||
|
||||
static bool host1x_wants_iommu(struct host1x *host1x)
|
||||
{
|
||||
/* Our IOMMU usage policy doesn't currently play well with GART */
|
||||
if (of_machine_is_compatible("nvidia,tegra20"))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* If we support addressing a maximum of 32 bits of physical memory
|
||||
* and if the host1x firewall is enabled, there's no need to enable
|
||||
|
@@ -501,13 +501,17 @@ static void vmbus_add_channel_work(struct work_struct *work)
|
||||
* Add the new device to the bus. This will kick off device-driver
|
||||
* binding which eventually invokes the device driver's AddDevice()
|
||||
* method.
|
||||
*
|
||||
* If vmbus_device_register() fails, the 'device_obj' is freed in
|
||||
* vmbus_device_release() as called by device_unregister() in the
|
||||
* error path of vmbus_device_register(). In the outside error
|
||||
* path, there's no need to free it.
|
||||
*/
|
||||
ret = vmbus_device_register(newchannel->device_obj);
|
||||
|
||||
if (ret != 0) {
|
||||
pr_err("unable to add child device object (relid %d)\n",
|
||||
newchannel->offermsg.child_relid);
|
||||
kfree(newchannel->device_obj);
|
||||
goto err_deq_chan;
|
||||
}
|
||||
|
||||
|
@@ -2020,6 +2020,7 @@ int vmbus_device_register(struct hv_device *child_device_obj)
|
||||
ret = device_register(&child_device_obj->device);
|
||||
if (ret) {
|
||||
pr_err("Unable to register child device\n");
|
||||
put_device(&child_device_obj->device);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -58,8 +58,12 @@ int iio_register_sw_trigger_type(struct iio_sw_trigger_type *t)
|
||||
|
||||
t->group = configfs_register_default_group(iio_triggers_group, t->name,
|
||||
&iio_trigger_type_group_type);
|
||||
if (IS_ERR(t->group))
|
||||
if (IS_ERR(t->group)) {
|
||||
mutex_lock(&iio_trigger_types_lock);
|
||||
list_del(&t->list);
|
||||
mutex_unlock(&iio_trigger_types_lock);
|
||||
ret = PTR_ERR(t->group);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@@ -53,9 +53,6 @@
|
||||
#define APDS9960_REG_CONTROL_PGAIN_MASK_SHIFT 2
|
||||
|
||||
#define APDS9960_REG_CONFIG_2 0x90
|
||||
#define APDS9960_REG_CONFIG_2_GGAIN_MASK 0x60
|
||||
#define APDS9960_REG_CONFIG_2_GGAIN_MASK_SHIFT 5
|
||||
|
||||
#define APDS9960_REG_ID 0x92
|
||||
|
||||
#define APDS9960_REG_STATUS 0x93
|
||||
@@ -76,6 +73,9 @@
|
||||
#define APDS9960_REG_GCONF_1_GFIFO_THRES_MASK_SHIFT 6
|
||||
|
||||
#define APDS9960_REG_GCONF_2 0xa3
|
||||
#define APDS9960_REG_GCONF_2_GGAIN_MASK 0x60
|
||||
#define APDS9960_REG_GCONF_2_GGAIN_MASK_SHIFT 5
|
||||
|
||||
#define APDS9960_REG_GOFFSET_U 0xa4
|
||||
#define APDS9960_REG_GOFFSET_D 0xa5
|
||||
#define APDS9960_REG_GPULSE 0xa6
|
||||
@@ -395,9 +395,9 @@ static int apds9960_set_pxs_gain(struct apds9960_data *data, int val)
|
||||
}
|
||||
|
||||
ret = regmap_update_bits(data->regmap,
|
||||
APDS9960_REG_CONFIG_2,
|
||||
APDS9960_REG_CONFIG_2_GGAIN_MASK,
|
||||
idx << APDS9960_REG_CONFIG_2_GGAIN_MASK_SHIFT);
|
||||
APDS9960_REG_GCONF_2,
|
||||
APDS9960_REG_GCONF_2_GGAIN_MASK,
|
||||
idx << APDS9960_REG_GCONF_2_GGAIN_MASK_SHIFT);
|
||||
if (!ret)
|
||||
data->pxs_gain = idx;
|
||||
mutex_unlock(&data->lock);
|
||||
|
@@ -25,13 +25,6 @@ enum {
|
||||
MS5607,
|
||||
};
|
||||
|
||||
struct ms5611_chip_info {
|
||||
u16 prom[MS5611_PROM_WORDS_NB];
|
||||
|
||||
int (*temp_and_pressure_compensate)(struct ms5611_chip_info *chip_info,
|
||||
s32 *temp, s32 *pressure);
|
||||
};
|
||||
|
||||
/*
|
||||
* OverSampling Rate descriptor.
|
||||
* Warning: cmd MUST be kept aligned on a word boundary (see
|
||||
@@ -50,12 +43,15 @@ struct ms5611_state {
|
||||
const struct ms5611_osr *pressure_osr;
|
||||
const struct ms5611_osr *temp_osr;
|
||||
|
||||
int (*reset)(struct device *dev);
|
||||
int (*read_prom_word)(struct device *dev, int index, u16 *word);
|
||||
int (*read_adc_temp_and_pressure)(struct device *dev,
|
||||
u16 prom[MS5611_PROM_WORDS_NB];
|
||||
|
||||
int (*reset)(struct ms5611_state *st);
|
||||
int (*read_prom_word)(struct ms5611_state *st, int index, u16 *word);
|
||||
int (*read_adc_temp_and_pressure)(struct ms5611_state *st,
|
||||
s32 *temp, s32 *pressure);
|
||||
|
||||
struct ms5611_chip_info *chip_info;
|
||||
int (*compensate_temp_and_pressure)(struct ms5611_state *st, s32 *temp,
|
||||
s32 *pressure);
|
||||
struct regulator *vdd;
|
||||
};
|
||||
|
||||
|
@@ -85,8 +85,7 @@ static int ms5611_read_prom(struct iio_dev *indio_dev)
|
||||
struct ms5611_state *st = iio_priv(indio_dev);
|
||||
|
||||
for (i = 0; i < MS5611_PROM_WORDS_NB; i++) {
|
||||
ret = st->read_prom_word(&indio_dev->dev,
|
||||
i, &st->chip_info->prom[i]);
|
||||
ret = st->read_prom_word(st, i, &st->prom[i]);
|
||||
if (ret < 0) {
|
||||
dev_err(&indio_dev->dev,
|
||||
"failed to read prom at %d\n", i);
|
||||
@@ -94,7 +93,7 @@ static int ms5611_read_prom(struct iio_dev *indio_dev)
|
||||
}
|
||||
}
|
||||
|
||||
if (!ms5611_prom_is_valid(st->chip_info->prom, MS5611_PROM_WORDS_NB)) {
|
||||
if (!ms5611_prom_is_valid(st->prom, MS5611_PROM_WORDS_NB)) {
|
||||
dev_err(&indio_dev->dev, "PROM integrity check failed\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -108,28 +107,27 @@ static int ms5611_read_temp_and_pressure(struct iio_dev *indio_dev,
|
||||
int ret;
|
||||
struct ms5611_state *st = iio_priv(indio_dev);
|
||||
|
||||
ret = st->read_adc_temp_and_pressure(&indio_dev->dev, temp, pressure);
|
||||
ret = st->read_adc_temp_and_pressure(st, temp, pressure);
|
||||
if (ret < 0) {
|
||||
dev_err(&indio_dev->dev,
|
||||
"failed to read temperature and pressure\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return st->chip_info->temp_and_pressure_compensate(st->chip_info,
|
||||
temp, pressure);
|
||||
return st->compensate_temp_and_pressure(st, temp, pressure);
|
||||
}
|
||||
|
||||
static int ms5611_temp_and_pressure_compensate(struct ms5611_chip_info *chip_info,
|
||||
static int ms5611_temp_and_pressure_compensate(struct ms5611_state *st,
|
||||
s32 *temp, s32 *pressure)
|
||||
{
|
||||
s32 t = *temp, p = *pressure;
|
||||
s64 off, sens, dt;
|
||||
|
||||
dt = t - (chip_info->prom[5] << 8);
|
||||
off = ((s64)chip_info->prom[2] << 16) + ((chip_info->prom[4] * dt) >> 7);
|
||||
sens = ((s64)chip_info->prom[1] << 15) + ((chip_info->prom[3] * dt) >> 8);
|
||||
dt = t - (st->prom[5] << 8);
|
||||
off = ((s64)st->prom[2] << 16) + ((st->prom[4] * dt) >> 7);
|
||||
sens = ((s64)st->prom[1] << 15) + ((st->prom[3] * dt) >> 8);
|
||||
|
||||
t = 2000 + ((chip_info->prom[6] * dt) >> 23);
|
||||
t = 2000 + ((st->prom[6] * dt) >> 23);
|
||||
if (t < 2000) {
|
||||
s64 off2, sens2, t2;
|
||||
|
||||
@@ -155,17 +153,17 @@ static int ms5611_temp_and_pressure_compensate(struct ms5611_chip_info *chip_inf
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ms5607_temp_and_pressure_compensate(struct ms5611_chip_info *chip_info,
|
||||
static int ms5607_temp_and_pressure_compensate(struct ms5611_state *st,
|
||||
s32 *temp, s32 *pressure)
|
||||
{
|
||||
s32 t = *temp, p = *pressure;
|
||||
s64 off, sens, dt;
|
||||
|
||||
dt = t - (chip_info->prom[5] << 8);
|
||||
off = ((s64)chip_info->prom[2] << 17) + ((chip_info->prom[4] * dt) >> 6);
|
||||
sens = ((s64)chip_info->prom[1] << 16) + ((chip_info->prom[3] * dt) >> 7);
|
||||
dt = t - (st->prom[5] << 8);
|
||||
off = ((s64)st->prom[2] << 17) + ((st->prom[4] * dt) >> 6);
|
||||
sens = ((s64)st->prom[1] << 16) + ((st->prom[3] * dt) >> 7);
|
||||
|
||||
t = 2000 + ((chip_info->prom[6] * dt) >> 23);
|
||||
t = 2000 + ((st->prom[6] * dt) >> 23);
|
||||
if (t < 2000) {
|
||||
s64 off2, sens2, t2, tmp;
|
||||
|
||||
@@ -196,7 +194,7 @@ static int ms5611_reset(struct iio_dev *indio_dev)
|
||||
int ret;
|
||||
struct ms5611_state *st = iio_priv(indio_dev);
|
||||
|
||||
ret = st->reset(&indio_dev->dev);
|
||||
ret = st->reset(st);
|
||||
if (ret < 0) {
|
||||
dev_err(&indio_dev->dev, "failed to reset device\n");
|
||||
return ret;
|
||||
@@ -343,15 +341,6 @@ static int ms5611_write_raw(struct iio_dev *indio_dev,
|
||||
|
||||
static const unsigned long ms5611_scan_masks[] = {0x3, 0};
|
||||
|
||||
static struct ms5611_chip_info chip_info_tbl[] = {
|
||||
[MS5611] = {
|
||||
.temp_and_pressure_compensate = ms5611_temp_and_pressure_compensate,
|
||||
},
|
||||
[MS5607] = {
|
||||
.temp_and_pressure_compensate = ms5607_temp_and_pressure_compensate,
|
||||
}
|
||||
};
|
||||
|
||||
static const struct iio_chan_spec ms5611_channels[] = {
|
||||
{
|
||||
.type = IIO_PRESSURE,
|
||||
@@ -434,7 +423,20 @@ int ms5611_probe(struct iio_dev *indio_dev, struct device *dev,
|
||||
struct ms5611_state *st = iio_priv(indio_dev);
|
||||
|
||||
mutex_init(&st->lock);
|
||||
st->chip_info = &chip_info_tbl[type];
|
||||
|
||||
switch (type) {
|
||||
case MS5611:
|
||||
st->compensate_temp_and_pressure =
|
||||
ms5611_temp_and_pressure_compensate;
|
||||
break;
|
||||
case MS5607:
|
||||
st->compensate_temp_and_pressure =
|
||||
ms5607_temp_and_pressure_compensate;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
st->temp_osr =
|
||||
&ms5611_avail_temp_osr[ARRAY_SIZE(ms5611_avail_temp_osr) - 1];
|
||||
st->pressure_osr =
|
||||
|
@@ -20,17 +20,15 @@
|
||||
|
||||
#include "ms5611.h"
|
||||
|
||||
static int ms5611_i2c_reset(struct device *dev)
|
||||
static int ms5611_i2c_reset(struct ms5611_state *st)
|
||||
{
|
||||
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
|
||||
|
||||
return i2c_smbus_write_byte(st->client, MS5611_RESET);
|
||||
}
|
||||
|
||||
static int ms5611_i2c_read_prom_word(struct device *dev, int index, u16 *word)
|
||||
static int ms5611_i2c_read_prom_word(struct ms5611_state *st, int index,
|
||||
u16 *word)
|
||||
{
|
||||
int ret;
|
||||
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
|
||||
|
||||
ret = i2c_smbus_read_word_swapped(st->client,
|
||||
MS5611_READ_PROM_WORD + (index << 1));
|
||||
@@ -57,11 +55,10 @@ static int ms5611_i2c_read_adc(struct ms5611_state *st, s32 *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ms5611_i2c_read_adc_temp_and_pressure(struct device *dev,
|
||||
static int ms5611_i2c_read_adc_temp_and_pressure(struct ms5611_state *st,
|
||||
s32 *temp, s32 *pressure)
|
||||
{
|
||||
int ret;
|
||||
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
|
||||
const struct ms5611_osr *osr = st->temp_osr;
|
||||
|
||||
ret = i2c_smbus_write_byte(st->client, osr->cmd);
|
||||
|
@@ -15,18 +15,17 @@
|
||||
|
||||
#include "ms5611.h"
|
||||
|
||||
static int ms5611_spi_reset(struct device *dev)
|
||||
static int ms5611_spi_reset(struct ms5611_state *st)
|
||||
{
|
||||
u8 cmd = MS5611_RESET;
|
||||
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
|
||||
|
||||
return spi_write_then_read(st->client, &cmd, 1, NULL, 0);
|
||||
}
|
||||
|
||||
static int ms5611_spi_read_prom_word(struct device *dev, int index, u16 *word)
|
||||
static int ms5611_spi_read_prom_word(struct ms5611_state *st, int index,
|
||||
u16 *word)
|
||||
{
|
||||
int ret;
|
||||
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
|
||||
|
||||
ret = spi_w8r16be(st->client, MS5611_READ_PROM_WORD + (index << 1));
|
||||
if (ret < 0)
|
||||
@@ -37,11 +36,10 @@ static int ms5611_spi_read_prom_word(struct device *dev, int index, u16 *word)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ms5611_spi_read_adc(struct device *dev, s32 *val)
|
||||
static int ms5611_spi_read_adc(struct ms5611_state *st, s32 *val)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[3] = { MS5611_READ_ADC };
|
||||
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
|
||||
|
||||
ret = spi_write_then_read(st->client, buf, 1, buf, 3);
|
||||
if (ret < 0)
|
||||
@@ -52,11 +50,10 @@ static int ms5611_spi_read_adc(struct device *dev, s32 *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ms5611_spi_read_adc_temp_and_pressure(struct device *dev,
|
||||
static int ms5611_spi_read_adc_temp_and_pressure(struct ms5611_state *st,
|
||||
s32 *temp, s32 *pressure)
|
||||
{
|
||||
int ret;
|
||||
struct ms5611_state *st = iio_priv(dev_to_iio_dev(dev));
|
||||
const struct ms5611_osr *osr = st->temp_osr;
|
||||
|
||||
/*
|
||||
@@ -68,7 +65,7 @@ static int ms5611_spi_read_adc_temp_and_pressure(struct device *dev,
|
||||
return ret;
|
||||
|
||||
usleep_range(osr->conv_usec, osr->conv_usec + (osr->conv_usec / 10UL));
|
||||
ret = ms5611_spi_read_adc(dev, temp);
|
||||
ret = ms5611_spi_read_adc(st, temp);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -78,7 +75,7 @@ static int ms5611_spi_read_adc_temp_and_pressure(struct device *dev,
|
||||
return ret;
|
||||
|
||||
usleep_range(osr->conv_usec, osr->conv_usec + (osr->conv_usec / 10UL));
|
||||
return ms5611_spi_read_adc(dev, pressure);
|
||||
return ms5611_spi_read_adc(st, pressure);
|
||||
}
|
||||
|
||||
static int ms5611_spi_probe(struct spi_device *spi)
|
||||
|
@@ -18,6 +18,10 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
static bool use_low_level_irq;
|
||||
module_param(use_low_level_irq, bool, 0444);
|
||||
MODULE_PARM_DESC(use_low_level_irq, "Use low-level triggered IRQ instead of edge triggered");
|
||||
|
||||
struct soc_button_info {
|
||||
const char *name;
|
||||
int acpi_index;
|
||||
@@ -73,6 +77,13 @@ static const struct dmi_system_id dmi_use_low_level_irq[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Acer Switch V 10 SW5-017, same issue as Acer Switch 10 SW5-012. */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Acer One S1003. _LID method messes with power-button GPIO
|
||||
@@ -164,7 +175,8 @@ soc_button_device_create(struct platform_device *pdev,
|
||||
}
|
||||
|
||||
/* See dmi_use_low_level_irq[] comment */
|
||||
if (!autorepeat && dmi_check_system(dmi_use_low_level_irq)) {
|
||||
if (!autorepeat && (use_low_level_irq ||
|
||||
dmi_check_system(dmi_use_low_level_irq))) {
|
||||
irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
|
||||
gpio_keys[n_buttons].irq = irq;
|
||||
gpio_keys[n_buttons].gpio = -ENOENT;
|
||||
|
@@ -191,6 +191,7 @@ static const char * const smbus_pnp_ids[] = {
|
||||
"SYN3221", /* HP 15-ay000 */
|
||||
"SYN323d", /* HP Spectre X360 13-w013dx */
|
||||
"SYN3257", /* HP Envy 13-ad105ng */
|
||||
"SYN3286", /* HP Laptop 15-da3001TU */
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@@ -1059,6 +1059,7 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
|
||||
input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
|
||||
input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
|
||||
|
||||
retry_read_config:
|
||||
/* Read configuration and apply touchscreen parameters */
|
||||
goodix_read_config(ts);
|
||||
|
||||
@@ -1066,6 +1067,16 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
|
||||
touchscreen_parse_properties(ts->input_dev, true, &ts->prop);
|
||||
|
||||
if (!ts->prop.max_x || !ts->prop.max_y || !ts->max_touch_num) {
|
||||
if (!ts->reset_controller_at_probe &&
|
||||
ts->irq_pin_access_method != IRQ_PIN_ACCESS_NONE) {
|
||||
dev_info(&ts->client->dev, "Config not set, resetting controller\n");
|
||||
/* Retry after a controller reset */
|
||||
ts->reset_controller_at_probe = true;
|
||||
error = goodix_reset(ts);
|
||||
if (error)
|
||||
return error;
|
||||
goto retry_read_config;
|
||||
}
|
||||
dev_err(&ts->client->dev,
|
||||
"Invalid config (%d, %d, %d), using defaults\n",
|
||||
ts->prop.max_x, ts->prop.max_y, ts->max_touch_num);
|
||||
|
@@ -1615,7 +1615,7 @@ static int its_select_cpu(struct irq_data *d,
|
||||
|
||||
cpu = cpumask_pick_least_loaded(d, tmpmask);
|
||||
} else {
|
||||
cpumask_and(tmpmask, irq_data_get_affinity_mask(d), cpu_online_mask);
|
||||
cpumask_copy(tmpmask, aff_mask);
|
||||
|
||||
/* If we cannot cross sockets, limit the search to that node */
|
||||
if ((its_dev->its->flags & ITS_FLAGS_WORKAROUND_CAVIUM_23144) &&
|
||||
|
@@ -254,6 +254,7 @@ struct dm_integrity_c {
|
||||
|
||||
struct completion crypto_backoff;
|
||||
|
||||
bool wrote_to_journal;
|
||||
bool journal_uptodate;
|
||||
bool just_formatted;
|
||||
bool recalculate_flag;
|
||||
@@ -2256,6 +2257,8 @@ static void integrity_commit(struct work_struct *w)
|
||||
if (!commit_sections)
|
||||
goto release_flush_bios;
|
||||
|
||||
ic->wrote_to_journal = true;
|
||||
|
||||
i = commit_start;
|
||||
for (n = 0; n < commit_sections; n++) {
|
||||
for (j = 0; j < ic->journal_section_entries; j++) {
|
||||
@@ -2470,10 +2473,6 @@ static void integrity_writer(struct work_struct *w)
|
||||
|
||||
unsigned prev_free_sectors;
|
||||
|
||||
/* the following test is not needed, but it tests the replay code */
|
||||
if (unlikely(dm_post_suspending(ic->ti)) && !ic->meta_dev)
|
||||
return;
|
||||
|
||||
spin_lock_irq(&ic->endio_wait.lock);
|
||||
write_start = ic->committed_section;
|
||||
write_sections = ic->n_committed_sections;
|
||||
@@ -2980,10 +2979,17 @@ static void dm_integrity_postsuspend(struct dm_target *ti)
|
||||
drain_workqueue(ic->commit_wq);
|
||||
|
||||
if (ic->mode == 'J') {
|
||||
if (ic->meta_dev)
|
||||
queue_work(ic->writer_wq, &ic->writer_work);
|
||||
queue_work(ic->writer_wq, &ic->writer_work);
|
||||
drain_workqueue(ic->writer_wq);
|
||||
dm_integrity_flush_buffers(ic, true);
|
||||
if (ic->wrote_to_journal) {
|
||||
init_journal(ic, ic->free_section,
|
||||
ic->journal_sections - ic->free_section, ic->commit_seq);
|
||||
if (ic->free_section) {
|
||||
init_journal(ic, 0, ic->free_section,
|
||||
next_commit_seq(ic->commit_seq));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ic->mode == 'B') {
|
||||
@@ -3011,6 +3017,8 @@ static void dm_integrity_resume(struct dm_target *ti)
|
||||
|
||||
DEBUG_print("resume\n");
|
||||
|
||||
ic->wrote_to_journal = false;
|
||||
|
||||
if (ic->provided_data_sectors != old_provided_data_sectors) {
|
||||
if (ic->provided_data_sectors > old_provided_data_sectors &&
|
||||
ic->mode == 'B' &&
|
||||
|
@@ -12,28 +12,55 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include "sdhci-cqhci.h"
|
||||
#include "sdhci-pltfm.h"
|
||||
#include "cqhci.h"
|
||||
|
||||
#define SDHCI_VENDOR 0x78
|
||||
#define SDHCI_VENDOR_ENHANCED_STRB 0x1
|
||||
#define SDHCI_VENDOR_GATE_SDCLK_EN 0x2
|
||||
|
||||
#define BRCMSTB_PRIV_FLAGS_NO_64BIT BIT(0)
|
||||
#define BRCMSTB_PRIV_FLAGS_BROKEN_TIMEOUT BIT(1)
|
||||
#define BRCMSTB_MATCH_FLAGS_NO_64BIT BIT(0)
|
||||
#define BRCMSTB_MATCH_FLAGS_BROKEN_TIMEOUT BIT(1)
|
||||
#define BRCMSTB_MATCH_FLAGS_HAS_CLOCK_GATE BIT(2)
|
||||
|
||||
#define BRCMSTB_PRIV_FLAGS_HAS_CQE BIT(0)
|
||||
#define BRCMSTB_PRIV_FLAGS_GATE_CLOCK BIT(1)
|
||||
|
||||
#define SDHCI_ARASAN_CQE_BASE_ADDR 0x200
|
||||
|
||||
struct sdhci_brcmstb_priv {
|
||||
void __iomem *cfg_regs;
|
||||
bool has_cqe;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
struct brcmstb_match_priv {
|
||||
void (*hs400es)(struct mmc_host *mmc, struct mmc_ios *ios);
|
||||
struct sdhci_ops *ops;
|
||||
unsigned int flags;
|
||||
const unsigned int flags;
|
||||
};
|
||||
|
||||
static inline void enable_clock_gating(struct sdhci_host *host)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = sdhci_readl(host, SDHCI_VENDOR);
|
||||
reg |= SDHCI_VENDOR_GATE_SDCLK_EN;
|
||||
sdhci_writel(host, reg, SDHCI_VENDOR);
|
||||
}
|
||||
|
||||
void brcmstb_reset(struct sdhci_host *host, u8 mask)
|
||||
{
|
||||
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
||||
struct sdhci_brcmstb_priv *priv = sdhci_pltfm_priv(pltfm_host);
|
||||
|
||||
sdhci_and_cqhci_reset(host, mask);
|
||||
|
||||
/* Reset will clear this, so re-enable it */
|
||||
if (priv->flags & BRCMSTB_PRIV_FLAGS_GATE_CLOCK)
|
||||
enable_clock_gating(host);
|
||||
}
|
||||
|
||||
static void sdhci_brcmstb_hs400es(struct mmc_host *mmc, struct mmc_ios *ios)
|
||||
{
|
||||
struct sdhci_host *host = mmc_priv(mmc);
|
||||
@@ -129,22 +156,23 @@ static struct sdhci_ops sdhci_brcmstb_ops = {
|
||||
static struct sdhci_ops sdhci_brcmstb_ops_7216 = {
|
||||
.set_clock = sdhci_brcmstb_set_clock,
|
||||
.set_bus_width = sdhci_set_bus_width,
|
||||
.reset = sdhci_reset,
|
||||
.reset = brcmstb_reset,
|
||||
.set_uhs_signaling = sdhci_brcmstb_set_uhs_signaling,
|
||||
};
|
||||
|
||||
static struct brcmstb_match_priv match_priv_7425 = {
|
||||
.flags = BRCMSTB_PRIV_FLAGS_NO_64BIT |
|
||||
BRCMSTB_PRIV_FLAGS_BROKEN_TIMEOUT,
|
||||
.flags = BRCMSTB_MATCH_FLAGS_NO_64BIT |
|
||||
BRCMSTB_MATCH_FLAGS_BROKEN_TIMEOUT,
|
||||
.ops = &sdhci_brcmstb_ops,
|
||||
};
|
||||
|
||||
static struct brcmstb_match_priv match_priv_7445 = {
|
||||
.flags = BRCMSTB_PRIV_FLAGS_BROKEN_TIMEOUT,
|
||||
.flags = BRCMSTB_MATCH_FLAGS_BROKEN_TIMEOUT,
|
||||
.ops = &sdhci_brcmstb_ops,
|
||||
};
|
||||
|
||||
static const struct brcmstb_match_priv match_priv_7216 = {
|
||||
.flags = BRCMSTB_MATCH_FLAGS_HAS_CLOCK_GATE,
|
||||
.hs400es = sdhci_brcmstb_hs400es,
|
||||
.ops = &sdhci_brcmstb_ops_7216,
|
||||
};
|
||||
@@ -176,7 +204,7 @@ static int sdhci_brcmstb_add_host(struct sdhci_host *host,
|
||||
bool dma64;
|
||||
int ret;
|
||||
|
||||
if (!priv->has_cqe)
|
||||
if ((priv->flags & BRCMSTB_PRIV_FLAGS_HAS_CQE) == 0)
|
||||
return sdhci_add_host(host);
|
||||
|
||||
dev_dbg(mmc_dev(host->mmc), "CQE is enabled\n");
|
||||
@@ -225,7 +253,6 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev)
|
||||
struct sdhci_brcmstb_priv *priv;
|
||||
struct sdhci_host *host;
|
||||
struct resource *iomem;
|
||||
bool has_cqe = false;
|
||||
struct clk *clk;
|
||||
int res;
|
||||
|
||||
@@ -244,10 +271,6 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev)
|
||||
return res;
|
||||
|
||||
memset(&brcmstb_pdata, 0, sizeof(brcmstb_pdata));
|
||||
if (device_property_read_bool(&pdev->dev, "supports-cqe")) {
|
||||
has_cqe = true;
|
||||
match_priv->ops->irq = sdhci_brcmstb_cqhci_irq;
|
||||
}
|
||||
brcmstb_pdata.ops = match_priv->ops;
|
||||
host = sdhci_pltfm_init(pdev, &brcmstb_pdata,
|
||||
sizeof(struct sdhci_brcmstb_priv));
|
||||
@@ -258,7 +281,10 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev)
|
||||
|
||||
pltfm_host = sdhci_priv(host);
|
||||
priv = sdhci_pltfm_priv(pltfm_host);
|
||||
priv->has_cqe = has_cqe;
|
||||
if (device_property_read_bool(&pdev->dev, "supports-cqe")) {
|
||||
priv->flags |= BRCMSTB_PRIV_FLAGS_HAS_CQE;
|
||||
match_priv->ops->irq = sdhci_brcmstb_cqhci_irq;
|
||||
}
|
||||
|
||||
/* Map in the non-standard CFG registers */
|
||||
iomem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
@@ -273,6 +299,14 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev)
|
||||
if (res)
|
||||
goto err;
|
||||
|
||||
/*
|
||||
* Automatic clock gating does not work for SD cards that may
|
||||
* voltage switch so only enable it for non-removable devices.
|
||||
*/
|
||||
if ((match_priv->flags & BRCMSTB_MATCH_FLAGS_HAS_CLOCK_GATE) &&
|
||||
(host->mmc->caps & MMC_CAP_NONREMOVABLE))
|
||||
priv->flags |= BRCMSTB_PRIV_FLAGS_GATE_CLOCK;
|
||||
|
||||
/*
|
||||
* If the chip has enhanced strobe and it's enabled, add
|
||||
* callback
|
||||
@@ -287,14 +321,14 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev)
|
||||
* properties through mmc_of_parse().
|
||||
*/
|
||||
host->caps = sdhci_readl(host, SDHCI_CAPABILITIES);
|
||||
if (match_priv->flags & BRCMSTB_PRIV_FLAGS_NO_64BIT)
|
||||
if (match_priv->flags & BRCMSTB_MATCH_FLAGS_NO_64BIT)
|
||||
host->caps &= ~SDHCI_CAN_64BIT;
|
||||
host->caps1 = sdhci_readl(host, SDHCI_CAPABILITIES_1);
|
||||
host->caps1 &= ~(SDHCI_SUPPORT_SDR50 | SDHCI_SUPPORT_SDR104 |
|
||||
SDHCI_SUPPORT_DDR50);
|
||||
host->quirks |= SDHCI_QUIRK_MISSING_CAPS;
|
||||
|
||||
if (match_priv->flags & BRCMSTB_PRIV_FLAGS_BROKEN_TIMEOUT)
|
||||
if (match_priv->flags & BRCMSTB_MATCH_FLAGS_BROKEN_TIMEOUT)
|
||||
host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
|
||||
|
||||
res = sdhci_brcmstb_add_host(host, priv);
|
||||
|
@@ -332,7 +332,7 @@ static int __init arc_rimi_init(void)
|
||||
dev->irq = 9;
|
||||
|
||||
if (arcrimi_probe(dev)) {
|
||||
free_netdev(dev);
|
||||
free_arcdev(dev);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -349,7 +349,7 @@ static void __exit arc_rimi_exit(void)
|
||||
iounmap(lp->mem_start);
|
||||
release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1);
|
||||
free_irq(dev->irq, dev);
|
||||
free_netdev(dev);
|
||||
free_arcdev(dev);
|
||||
}
|
||||
|
||||
#ifndef MODULE
|
||||
|
@@ -298,6 +298,10 @@ struct arcnet_local {
|
||||
|
||||
int excnak_pending; /* We just got an excesive nak interrupt */
|
||||
|
||||
/* RESET flag handling */
|
||||
int reset_in_progress;
|
||||
struct work_struct reset_work;
|
||||
|
||||
struct {
|
||||
uint16_t sequence; /* sequence number (incs with each packet) */
|
||||
__be16 aborted_seq;
|
||||
@@ -350,7 +354,9 @@ void arcnet_dump_skb(struct net_device *dev, struct sk_buff *skb, char *desc)
|
||||
|
||||
void arcnet_unregister_proto(struct ArcProto *proto);
|
||||
irqreturn_t arcnet_interrupt(int irq, void *dev_id);
|
||||
|
||||
struct net_device *alloc_arcdev(const char *name);
|
||||
void free_arcdev(struct net_device *dev);
|
||||
|
||||
int arcnet_open(struct net_device *dev);
|
||||
int arcnet_close(struct net_device *dev);
|
||||
|
@@ -387,10 +387,44 @@ static void arcnet_timer(struct timer_list *t)
|
||||
struct arcnet_local *lp = from_timer(lp, t, timer);
|
||||
struct net_device *dev = lp->dev;
|
||||
|
||||
if (!netif_carrier_ok(dev)) {
|
||||
spin_lock_irq(&lp->lock);
|
||||
|
||||
if (!lp->reset_in_progress && !netif_carrier_ok(dev)) {
|
||||
netif_carrier_on(dev);
|
||||
netdev_info(dev, "link up\n");
|
||||
}
|
||||
|
||||
spin_unlock_irq(&lp->lock);
|
||||
}
|
||||
|
||||
static void reset_device_work(struct work_struct *work)
|
||||
{
|
||||
struct arcnet_local *lp;
|
||||
struct net_device *dev;
|
||||
|
||||
lp = container_of(work, struct arcnet_local, reset_work);
|
||||
dev = lp->dev;
|
||||
|
||||
/* Do not bring the network interface back up if an ifdown
|
||||
* was already done.
|
||||
*/
|
||||
if (!netif_running(dev) || !lp->reset_in_progress)
|
||||
return;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
/* Do another check, in case of an ifdown that was triggered in
|
||||
* the small race window between the exit condition above and
|
||||
* acquiring RTNL.
|
||||
*/
|
||||
if (!netif_running(dev) || !lp->reset_in_progress)
|
||||
goto out;
|
||||
|
||||
dev_close(dev);
|
||||
dev_open(dev, NULL);
|
||||
|
||||
out:
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
static void arcnet_reply_tasklet(unsigned long data)
|
||||
@@ -452,12 +486,25 @@ struct net_device *alloc_arcdev(const char *name)
|
||||
lp->dev = dev;
|
||||
spin_lock_init(&lp->lock);
|
||||
timer_setup(&lp->timer, arcnet_timer, 0);
|
||||
INIT_WORK(&lp->reset_work, reset_device_work);
|
||||
}
|
||||
|
||||
return dev;
|
||||
}
|
||||
EXPORT_SYMBOL(alloc_arcdev);
|
||||
|
||||
void free_arcdev(struct net_device *dev)
|
||||
{
|
||||
struct arcnet_local *lp = netdev_priv(dev);
|
||||
|
||||
/* Do not cancel this at ->ndo_close(), as the workqueue itself
|
||||
* indirectly calls the ifdown path through dev_close().
|
||||
*/
|
||||
cancel_work_sync(&lp->reset_work);
|
||||
free_netdev(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(free_arcdev);
|
||||
|
||||
/* Open/initialize the board. This is called sometime after booting when
|
||||
* the 'ifconfig' program is run.
|
||||
*
|
||||
@@ -587,6 +634,10 @@ int arcnet_close(struct net_device *dev)
|
||||
|
||||
/* shut down the card */
|
||||
lp->hw.close(dev);
|
||||
|
||||
/* reset counters */
|
||||
lp->reset_in_progress = 0;
|
||||
|
||||
module_put(lp->hw.owner);
|
||||
return 0;
|
||||
}
|
||||
@@ -820,6 +871,9 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id)
|
||||
|
||||
spin_lock_irqsave(&lp->lock, flags);
|
||||
|
||||
if (lp->reset_in_progress)
|
||||
goto out;
|
||||
|
||||
/* RESET flag was enabled - if device is not running, we must
|
||||
* clear it right away (but nothing else).
|
||||
*/
|
||||
@@ -852,11 +906,14 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id)
|
||||
if (status & RESETflag) {
|
||||
arc_printk(D_NORMAL, dev, "spurious reset (status=%Xh)\n",
|
||||
status);
|
||||
arcnet_close(dev);
|
||||
arcnet_open(dev);
|
||||
|
||||
lp->reset_in_progress = 1;
|
||||
netif_stop_queue(dev);
|
||||
netif_carrier_off(dev);
|
||||
schedule_work(&lp->reset_work);
|
||||
|
||||
/* get out of the interrupt handler! */
|
||||
break;
|
||||
goto out;
|
||||
}
|
||||
/* RX is inhibited - we must have received something.
|
||||
* Prepare to receive into the next buffer.
|
||||
@@ -1052,6 +1109,7 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id)
|
||||
udelay(1);
|
||||
lp->hw.intmask(dev, lp->intmask);
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&lp->lock, flags);
|
||||
return retval;
|
||||
}
|
||||
|
@@ -169,7 +169,7 @@ static int __init com20020_init(void)
|
||||
dev->irq = 9;
|
||||
|
||||
if (com20020isa_probe(dev)) {
|
||||
free_netdev(dev);
|
||||
free_arcdev(dev);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -182,7 +182,7 @@ static void __exit com20020_exit(void)
|
||||
unregister_netdev(my_dev);
|
||||
free_irq(my_dev->irq, my_dev);
|
||||
release_region(my_dev->base_addr, ARCNET_TOTAL_SIZE);
|
||||
free_netdev(my_dev);
|
||||
free_arcdev(my_dev);
|
||||
}
|
||||
|
||||
#ifndef MODULE
|
||||
|
@@ -294,7 +294,7 @@ static void com20020pci_remove(struct pci_dev *pdev)
|
||||
|
||||
unregister_netdev(dev);
|
||||
free_irq(dev->irq, dev);
|
||||
free_netdev(dev);
|
||||
free_arcdev(dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -113,6 +113,7 @@ static int com20020_probe(struct pcmcia_device *p_dev)
|
||||
struct com20020_dev *info;
|
||||
struct net_device *dev;
|
||||
struct arcnet_local *lp;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
dev_dbg(&p_dev->dev, "com20020_attach()\n");
|
||||
|
||||
@@ -142,12 +143,18 @@ static int com20020_probe(struct pcmcia_device *p_dev)
|
||||
info->dev = dev;
|
||||
p_dev->priv = info;
|
||||
|
||||
return com20020_config(p_dev);
|
||||
ret = com20020_config(p_dev);
|
||||
if (ret)
|
||||
goto fail_config;
|
||||
|
||||
return 0;
|
||||
|
||||
fail_config:
|
||||
free_arcdev(dev);
|
||||
fail_alloc_dev:
|
||||
kfree(info);
|
||||
fail_alloc_info:
|
||||
return -ENOMEM;
|
||||
return ret;
|
||||
} /* com20020_attach */
|
||||
|
||||
static void com20020_detach(struct pcmcia_device *link)
|
||||
@@ -177,7 +184,7 @@ static void com20020_detach(struct pcmcia_device *link)
|
||||
dev = info->dev;
|
||||
if (dev) {
|
||||
dev_dbg(&link->dev, "kfree...\n");
|
||||
free_netdev(dev);
|
||||
free_arcdev(dev);
|
||||
}
|
||||
dev_dbg(&link->dev, "kfree2...\n");
|
||||
kfree(info);
|
||||
|
@@ -396,7 +396,7 @@ static int __init com90io_init(void)
|
||||
err = com90io_probe(dev);
|
||||
|
||||
if (err) {
|
||||
free_netdev(dev);
|
||||
free_arcdev(dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -419,7 +419,7 @@ static void __exit com90io_exit(void)
|
||||
|
||||
free_irq(dev->irq, dev);
|
||||
release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
|
||||
free_netdev(dev);
|
||||
free_arcdev(dev);
|
||||
}
|
||||
|
||||
module_init(com90io_init)
|
||||
|
@@ -554,7 +554,7 @@ err_free_irq:
|
||||
err_release_mem:
|
||||
release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1);
|
||||
err_free_dev:
|
||||
free_netdev(dev);
|
||||
free_arcdev(dev);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -672,7 +672,7 @@ static void __exit com90xx_exit(void)
|
||||
release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
|
||||
release_mem_region(dev->mem_start,
|
||||
dev->mem_end - dev->mem_start + 1);
|
||||
free_netdev(dev);
|
||||
free_arcdev(dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -795,16 +795,20 @@ static void bnx2x_vf_enable_traffic(struct bnx2x *bp, struct bnx2x_virtf *vf)
|
||||
|
||||
static u8 bnx2x_vf_is_pcie_pending(struct bnx2x *bp, u8 abs_vfid)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
struct bnx2x_virtf *vf = bnx2x_vf_by_abs_fid(bp, abs_vfid);
|
||||
struct pci_dev *dev;
|
||||
bool pending;
|
||||
|
||||
if (!vf)
|
||||
return false;
|
||||
|
||||
dev = pci_get_domain_bus_and_slot(vf->domain, vf->bus, vf->devfn);
|
||||
if (dev)
|
||||
return bnx2x_is_pcie_pending(dev);
|
||||
return false;
|
||||
if (!dev)
|
||||
return false;
|
||||
pending = bnx2x_is_pcie_pending(dev);
|
||||
pci_dev_put(dev);
|
||||
|
||||
return pending;
|
||||
}
|
||||
|
||||
int bnx2x_vf_flr_clnup_epilog(struct bnx2x *bp, u8 abs_vfid)
|
||||
|
@@ -1798,7 +1798,7 @@ static int liquidio_open(struct net_device *netdev)
|
||||
|
||||
ifstate_set(lio, LIO_IFSTATE_RUNNING);
|
||||
|
||||
if (!OCTEON_CN23XX_PF(oct) || (OCTEON_CN23XX_PF(oct) && !oct->msix_on)) {
|
||||
if (!OCTEON_CN23XX_PF(oct) || !oct->msix_on) {
|
||||
ret = setup_tx_poll_fn(netdev);
|
||||
if (ret)
|
||||
goto err_poll;
|
||||
@@ -1828,7 +1828,7 @@ static int liquidio_open(struct net_device *netdev)
|
||||
return 0;
|
||||
|
||||
err_rx_ctrl:
|
||||
if (!OCTEON_CN23XX_PF(oct) || (OCTEON_CN23XX_PF(oct) && !oct->msix_on))
|
||||
if (!OCTEON_CN23XX_PF(oct) || !oct->msix_on)
|
||||
cleanup_tx_poll_fn(netdev);
|
||||
err_poll:
|
||||
if (lio->ptp_clock) {
|
||||
|
@@ -1438,8 +1438,10 @@ static acpi_status bgx_acpi_match_id(acpi_handle handle, u32 lvl,
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
if (strncmp(string.pointer, bgx_sel, 4))
|
||||
if (strncmp(string.pointer, bgx_sel, 4)) {
|
||||
kfree(string.pointer);
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
|
||||
bgx_acpi_register_phy, NULL, bgx, NULL);
|
||||
|
@@ -1212,7 +1212,7 @@ static void enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
|
||||
/* enable Tx ints by setting pkt thr to 1 */
|
||||
enetc_txbdr_wr(hw, idx, ENETC_TBICR0, ENETC_TBICR0_ICEN | 0x1);
|
||||
|
||||
tbmr = ENETC_TBMR_EN;
|
||||
tbmr = ENETC_TBMR_EN | ENETC_TBMR_SET_PRIO(tx_ring->prio);
|
||||
if (tx_ring->ndev->features & NETIF_F_HW_VLAN_CTAG_TX)
|
||||
tbmr |= ENETC_TBMR_VIH;
|
||||
|
||||
@@ -1272,13 +1272,14 @@ static void enetc_setup_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring)
|
||||
|
||||
static void enetc_setup_bdrs(struct enetc_ndev_priv *priv)
|
||||
{
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < priv->num_tx_rings; i++)
|
||||
enetc_setup_txbdr(&priv->si->hw, priv->tx_ring[i]);
|
||||
enetc_setup_txbdr(hw, priv->tx_ring[i]);
|
||||
|
||||
for (i = 0; i < priv->num_rx_rings; i++)
|
||||
enetc_setup_rxbdr(&priv->si->hw, priv->rx_ring[i]);
|
||||
enetc_setup_rxbdr(hw, priv->rx_ring[i]);
|
||||
}
|
||||
|
||||
static void enetc_clear_rxbdr(struct enetc_hw *hw, struct enetc_bdr *rx_ring)
|
||||
@@ -1311,13 +1312,14 @@ static void enetc_clear_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
|
||||
|
||||
static void enetc_clear_bdrs(struct enetc_ndev_priv *priv)
|
||||
{
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < priv->num_tx_rings; i++)
|
||||
enetc_clear_txbdr(&priv->si->hw, priv->tx_ring[i]);
|
||||
enetc_clear_txbdr(hw, priv->tx_ring[i]);
|
||||
|
||||
for (i = 0; i < priv->num_rx_rings; i++)
|
||||
enetc_clear_rxbdr(&priv->si->hw, priv->rx_ring[i]);
|
||||
enetc_clear_rxbdr(hw, priv->rx_ring[i]);
|
||||
|
||||
udelay(1);
|
||||
}
|
||||
@@ -1325,13 +1327,13 @@ static void enetc_clear_bdrs(struct enetc_ndev_priv *priv)
|
||||
static int enetc_setup_irqs(struct enetc_ndev_priv *priv)
|
||||
{
|
||||
struct pci_dev *pdev = priv->si->pdev;
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
int i, j, err;
|
||||
|
||||
for (i = 0; i < priv->bdr_int_num; i++) {
|
||||
int irq = pci_irq_vector(pdev, ENETC_BDR_INT_BASE_IDX + i);
|
||||
struct enetc_int_vector *v = priv->int_vector[i];
|
||||
int entry = ENETC_BDR_INT_BASE_IDX + i;
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
|
||||
snprintf(v->name, sizeof(v->name), "%s-rxtx%d",
|
||||
priv->ndev->name, i);
|
||||
@@ -1419,13 +1421,14 @@ static void enetc_setup_interrupts(struct enetc_ndev_priv *priv)
|
||||
|
||||
static void enetc_clear_interrupts(struct enetc_ndev_priv *priv)
|
||||
{
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < priv->num_tx_rings; i++)
|
||||
enetc_txbdr_wr(&priv->si->hw, i, ENETC_TBIER, 0);
|
||||
enetc_txbdr_wr(hw, i, ENETC_TBIER, 0);
|
||||
|
||||
for (i = 0; i < priv->num_rx_rings; i++)
|
||||
enetc_rxbdr_wr(&priv->si->hw, i, ENETC_RBIER, 0);
|
||||
enetc_rxbdr_wr(hw, i, ENETC_RBIER, 0);
|
||||
}
|
||||
|
||||
static int enetc_phylink_connect(struct net_device *ndev)
|
||||
@@ -1565,6 +1568,7 @@ static int enetc_setup_tc_mqprio(struct net_device *ndev, void *type_data)
|
||||
{
|
||||
struct enetc_ndev_priv *priv = netdev_priv(ndev);
|
||||
struct tc_mqprio_qopt *mqprio = type_data;
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
struct enetc_bdr *tx_ring;
|
||||
u8 num_tc;
|
||||
int i;
|
||||
@@ -1579,7 +1583,8 @@ static int enetc_setup_tc_mqprio(struct net_device *ndev, void *type_data)
|
||||
/* Reset all ring priorities to 0 */
|
||||
for (i = 0; i < priv->num_tx_rings; i++) {
|
||||
tx_ring = priv->tx_ring[i];
|
||||
enetc_set_bdr_prio(&priv->si->hw, tx_ring->index, 0);
|
||||
tx_ring->prio = 0;
|
||||
enetc_set_bdr_prio(hw, tx_ring->index, tx_ring->prio);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1598,7 +1603,8 @@ static int enetc_setup_tc_mqprio(struct net_device *ndev, void *type_data)
|
||||
*/
|
||||
for (i = 0; i < num_tc; i++) {
|
||||
tx_ring = priv->tx_ring[i];
|
||||
enetc_set_bdr_prio(&priv->si->hw, tx_ring->index, i);
|
||||
tx_ring->prio = i;
|
||||
enetc_set_bdr_prio(hw, tx_ring->index, tx_ring->prio);
|
||||
}
|
||||
|
||||
/* Reset the number of netdev queues based on the TC count */
|
||||
@@ -1679,19 +1685,21 @@ static int enetc_set_rss(struct net_device *ndev, int en)
|
||||
static void enetc_enable_rxvlan(struct net_device *ndev, bool en)
|
||||
{
|
||||
struct enetc_ndev_priv *priv = netdev_priv(ndev);
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < priv->num_rx_rings; i++)
|
||||
enetc_bdr_enable_rxvlan(&priv->si->hw, i, en);
|
||||
enetc_bdr_enable_rxvlan(hw, i, en);
|
||||
}
|
||||
|
||||
static void enetc_enable_txvlan(struct net_device *ndev, bool en)
|
||||
{
|
||||
struct enetc_ndev_priv *priv = netdev_priv(ndev);
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < priv->num_tx_rings; i++)
|
||||
enetc_bdr_enable_txvlan(&priv->si->hw, i, en);
|
||||
enetc_bdr_enable_txvlan(hw, i, en);
|
||||
}
|
||||
|
||||
void enetc_set_features(struct net_device *ndev, netdev_features_t features)
|
||||
|
@@ -58,6 +58,7 @@ struct enetc_bdr {
|
||||
void __iomem *rcir;
|
||||
};
|
||||
u16 index;
|
||||
u16 prio;
|
||||
int bd_count; /* # of BDs */
|
||||
int next_to_use;
|
||||
int next_to_clean;
|
||||
@@ -338,19 +339,20 @@ int enetc_set_psfp(struct net_device *ndev, bool en);
|
||||
|
||||
static inline void enetc_get_max_cap(struct enetc_ndev_priv *priv)
|
||||
{
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
u32 reg;
|
||||
|
||||
reg = enetc_port_rd(&priv->si->hw, ENETC_PSIDCAPR);
|
||||
reg = enetc_port_rd(hw, ENETC_PSIDCAPR);
|
||||
priv->psfp_cap.max_streamid = reg & ENETC_PSIDCAPR_MSK;
|
||||
/* Port stream filter capability */
|
||||
reg = enetc_port_rd(&priv->si->hw, ENETC_PSFCAPR);
|
||||
reg = enetc_port_rd(hw, ENETC_PSFCAPR);
|
||||
priv->psfp_cap.max_psfp_filter = reg & ENETC_PSFCAPR_MSK;
|
||||
/* Port stream gate capability */
|
||||
reg = enetc_port_rd(&priv->si->hw, ENETC_PSGCAPR);
|
||||
reg = enetc_port_rd(hw, ENETC_PSGCAPR);
|
||||
priv->psfp_cap.max_psfp_gate = (reg & ENETC_PSGCAPR_SGIT_MSK);
|
||||
priv->psfp_cap.max_psfp_gatelist = (reg & ENETC_PSGCAPR_GCL_MSK) >> 16;
|
||||
/* Port flow meter capability */
|
||||
reg = enetc_port_rd(&priv->si->hw, ENETC_PFMCAPR);
|
||||
reg = enetc_port_rd(hw, ENETC_PFMCAPR);
|
||||
priv->psfp_cap.max_psfp_meter = reg & ENETC_PFMCAPR_MSK;
|
||||
}
|
||||
|
||||
|
@@ -748,9 +748,6 @@ static void enetc_pf_netdev_setup(struct enetc_si *si, struct net_device *ndev,
|
||||
|
||||
ndev->priv_flags |= IFF_UNICAST_FLT;
|
||||
|
||||
if (si->hw_features & ENETC_SI_F_QBV)
|
||||
priv->active_offloads |= ENETC_F_QBV;
|
||||
|
||||
if (si->hw_features & ENETC_SI_F_PSFP && !enetc_psfp_enable(priv)) {
|
||||
priv->active_offloads |= ENETC_F_QCI;
|
||||
ndev->features |= NETIF_F_HW_TC;
|
||||
@@ -996,7 +993,8 @@ static void enetc_pl_mac_link_up(struct phylink_config *config,
|
||||
struct enetc_ndev_priv *priv;
|
||||
|
||||
priv = netdev_priv(pf->si->ndev);
|
||||
if (priv->active_offloads & ENETC_F_QBV)
|
||||
|
||||
if (pf->si->hw_features & ENETC_SI_F_QBV)
|
||||
enetc_sched_speed_set(priv, speed);
|
||||
|
||||
if (!phylink_autoneg_inband(mode) &&
|
||||
|
@@ -17,8 +17,9 @@ static u16 enetc_get_max_gcl_len(struct enetc_hw *hw)
|
||||
|
||||
void enetc_sched_speed_set(struct enetc_ndev_priv *priv, int speed)
|
||||
{
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
u32 old_speed = priv->speed;
|
||||
u32 pspeed;
|
||||
u32 pspeed, tmp;
|
||||
|
||||
if (speed == old_speed)
|
||||
return;
|
||||
@@ -39,16 +40,15 @@ void enetc_sched_speed_set(struct enetc_ndev_priv *priv, int speed)
|
||||
}
|
||||
|
||||
priv->speed = speed;
|
||||
enetc_port_wr(&priv->si->hw, ENETC_PMR,
|
||||
(enetc_port_rd(&priv->si->hw, ENETC_PMR)
|
||||
& (~ENETC_PMR_PSPEED_MASK))
|
||||
| pspeed);
|
||||
tmp = enetc_port_rd(hw, ENETC_PMR);
|
||||
enetc_port_wr(hw, ENETC_PMR, (tmp & ~ENETC_PMR_PSPEED_MASK) | pspeed);
|
||||
}
|
||||
|
||||
static int enetc_setup_taprio(struct net_device *ndev,
|
||||
struct tc_taprio_qopt_offload *admin_conf)
|
||||
{
|
||||
struct enetc_ndev_priv *priv = netdev_priv(ndev);
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
struct enetc_cbd cbd = {.cmd = 0};
|
||||
struct tgs_gcl_conf *gcl_config;
|
||||
struct tgs_gcl_data *gcl_data;
|
||||
@@ -60,15 +60,16 @@ static int enetc_setup_taprio(struct net_device *ndev,
|
||||
int err;
|
||||
int i;
|
||||
|
||||
if (admin_conf->num_entries > enetc_get_max_gcl_len(&priv->si->hw))
|
||||
if (admin_conf->num_entries > enetc_get_max_gcl_len(hw))
|
||||
return -EINVAL;
|
||||
gcl_len = admin_conf->num_entries;
|
||||
|
||||
tge = enetc_rd(&priv->si->hw, ENETC_QBV_PTGCR_OFFSET);
|
||||
tge = enetc_rd(hw, ENETC_QBV_PTGCR_OFFSET);
|
||||
if (!admin_conf->enable) {
|
||||
enetc_wr(&priv->si->hw,
|
||||
ENETC_QBV_PTGCR_OFFSET,
|
||||
tge & (~ENETC_QBV_TGE));
|
||||
enetc_wr(hw, ENETC_QBV_PTGCR_OFFSET, tge & ~ENETC_QBV_TGE);
|
||||
|
||||
priv->active_offloads &= ~ENETC_F_QBV;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -123,18 +124,18 @@ static int enetc_setup_taprio(struct net_device *ndev,
|
||||
cbd.cls = BDCR_CMD_PORT_GCL;
|
||||
cbd.status_flags = 0;
|
||||
|
||||
enetc_wr(&priv->si->hw, ENETC_QBV_PTGCR_OFFSET,
|
||||
tge | ENETC_QBV_TGE);
|
||||
enetc_wr(hw, ENETC_QBV_PTGCR_OFFSET, tge | ENETC_QBV_TGE);
|
||||
|
||||
err = enetc_send_cmd(priv->si, &cbd);
|
||||
if (err)
|
||||
enetc_wr(&priv->si->hw,
|
||||
ENETC_QBV_PTGCR_OFFSET,
|
||||
tge & (~ENETC_QBV_TGE));
|
||||
enetc_wr(hw, ENETC_QBV_PTGCR_OFFSET, tge & ~ENETC_QBV_TGE);
|
||||
|
||||
dma_unmap_single(&priv->si->pdev->dev, dma, data_size, DMA_TO_DEVICE);
|
||||
kfree(gcl_data);
|
||||
|
||||
if (!err)
|
||||
priv->active_offloads |= ENETC_F_QBV;
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -142,6 +143,8 @@ int enetc_setup_tc_taprio(struct net_device *ndev, void *type_data)
|
||||
{
|
||||
struct tc_taprio_qopt_offload *taprio = type_data;
|
||||
struct enetc_ndev_priv *priv = netdev_priv(ndev);
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
struct enetc_bdr *tx_ring;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
@@ -150,18 +153,20 @@ int enetc_setup_tc_taprio(struct net_device *ndev, void *type_data)
|
||||
if (priv->tx_ring[i]->tsd_enable)
|
||||
return -EBUSY;
|
||||
|
||||
for (i = 0; i < priv->num_tx_rings; i++)
|
||||
enetc_set_bdr_prio(&priv->si->hw,
|
||||
priv->tx_ring[i]->index,
|
||||
taprio->enable ? i : 0);
|
||||
for (i = 0; i < priv->num_tx_rings; i++) {
|
||||
tx_ring = priv->tx_ring[i];
|
||||
tx_ring->prio = taprio->enable ? i : 0;
|
||||
enetc_set_bdr_prio(hw, tx_ring->index, tx_ring->prio);
|
||||
}
|
||||
|
||||
err = enetc_setup_taprio(ndev, taprio);
|
||||
|
||||
if (err)
|
||||
for (i = 0; i < priv->num_tx_rings; i++)
|
||||
enetc_set_bdr_prio(&priv->si->hw,
|
||||
priv->tx_ring[i]->index,
|
||||
taprio->enable ? 0 : i);
|
||||
if (err) {
|
||||
for (i = 0; i < priv->num_tx_rings; i++) {
|
||||
tx_ring = priv->tx_ring[i];
|
||||
tx_ring->prio = taprio->enable ? 0 : i;
|
||||
enetc_set_bdr_prio(hw, tx_ring->index, tx_ring->prio);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -182,7 +187,7 @@ int enetc_setup_tc_cbs(struct net_device *ndev, void *type_data)
|
||||
struct tc_cbs_qopt_offload *cbs = type_data;
|
||||
u32 port_transmit_rate = priv->speed;
|
||||
u8 tc_nums = netdev_get_num_tc(ndev);
|
||||
struct enetc_si *si = priv->si;
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
u32 hi_credit_bit, hi_credit_reg;
|
||||
u32 max_interference_size;
|
||||
u32 port_frame_max_size;
|
||||
@@ -203,15 +208,15 @@ int enetc_setup_tc_cbs(struct net_device *ndev, void *type_data)
|
||||
* lower than this TC have been disabled.
|
||||
*/
|
||||
if (tc == prio_top &&
|
||||
enetc_get_cbs_enable(&si->hw, prio_next)) {
|
||||
enetc_get_cbs_enable(hw, prio_next)) {
|
||||
dev_err(&ndev->dev,
|
||||
"Disable TC%d before disable TC%d\n",
|
||||
prio_next, tc);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
enetc_port_wr(&si->hw, ENETC_PTCCBSR1(tc), 0);
|
||||
enetc_port_wr(&si->hw, ENETC_PTCCBSR0(tc), 0);
|
||||
enetc_port_wr(hw, ENETC_PTCCBSR1(tc), 0);
|
||||
enetc_port_wr(hw, ENETC_PTCCBSR0(tc), 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -228,13 +233,13 @@ int enetc_setup_tc_cbs(struct net_device *ndev, void *type_data)
|
||||
* higher than this TC have been enabled.
|
||||
*/
|
||||
if (tc == prio_next) {
|
||||
if (!enetc_get_cbs_enable(&si->hw, prio_top)) {
|
||||
if (!enetc_get_cbs_enable(hw, prio_top)) {
|
||||
dev_err(&ndev->dev,
|
||||
"Enable TC%d first before enable TC%d\n",
|
||||
prio_top, prio_next);
|
||||
return -EINVAL;
|
||||
}
|
||||
bw_sum += enetc_get_cbs_bw(&si->hw, prio_top);
|
||||
bw_sum += enetc_get_cbs_bw(hw, prio_top);
|
||||
}
|
||||
|
||||
if (bw_sum + bw >= 100) {
|
||||
@@ -243,7 +248,7 @@ int enetc_setup_tc_cbs(struct net_device *ndev, void *type_data)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
enetc_port_rd(&si->hw, ENETC_PTCMSDUR(tc));
|
||||
enetc_port_rd(hw, ENETC_PTCMSDUR(tc));
|
||||
|
||||
/* For top prio TC, the max_interfrence_size is maxSizedFrame.
|
||||
*
|
||||
@@ -263,8 +268,8 @@ int enetc_setup_tc_cbs(struct net_device *ndev, void *type_data)
|
||||
u32 m0, ma, r0, ra;
|
||||
|
||||
m0 = port_frame_max_size * 8;
|
||||
ma = enetc_port_rd(&si->hw, ENETC_PTCMSDUR(prio_top)) * 8;
|
||||
ra = enetc_get_cbs_bw(&si->hw, prio_top) *
|
||||
ma = enetc_port_rd(hw, ENETC_PTCMSDUR(prio_top)) * 8;
|
||||
ra = enetc_get_cbs_bw(hw, prio_top) *
|
||||
port_transmit_rate * 10000ULL;
|
||||
r0 = port_transmit_rate * 1000000ULL;
|
||||
max_interference_size = m0 + ma +
|
||||
@@ -284,10 +289,10 @@ int enetc_setup_tc_cbs(struct net_device *ndev, void *type_data)
|
||||
hi_credit_reg = (u32)div_u64((ENETC_CLK * 100ULL) * hi_credit_bit,
|
||||
port_transmit_rate * 1000000ULL);
|
||||
|
||||
enetc_port_wr(&si->hw, ENETC_PTCCBSR1(tc), hi_credit_reg);
|
||||
enetc_port_wr(hw, ENETC_PTCCBSR1(tc), hi_credit_reg);
|
||||
|
||||
/* Set bw register and enable this traffic class */
|
||||
enetc_port_wr(&si->hw, ENETC_PTCCBSR0(tc), bw | ENETC_CBSE);
|
||||
enetc_port_wr(hw, ENETC_PTCCBSR0(tc), bw | ENETC_CBSE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -297,6 +302,7 @@ int enetc_setup_tc_txtime(struct net_device *ndev, void *type_data)
|
||||
struct enetc_ndev_priv *priv = netdev_priv(ndev);
|
||||
struct tc_etf_qopt_offload *qopt = type_data;
|
||||
u8 tc_nums = netdev_get_num_tc(ndev);
|
||||
struct enetc_hw *hw = &priv->si->hw;
|
||||
int tc;
|
||||
|
||||
if (!tc_nums)
|
||||
@@ -312,12 +318,11 @@ int enetc_setup_tc_txtime(struct net_device *ndev, void *type_data)
|
||||
return -EBUSY;
|
||||
|
||||
/* TSD and Qbv are mutually exclusive in hardware */
|
||||
if (enetc_rd(&priv->si->hw, ENETC_QBV_PTGCR_OFFSET) & ENETC_QBV_TGE)
|
||||
if (enetc_rd(hw, ENETC_QBV_PTGCR_OFFSET) & ENETC_QBV_TGE)
|
||||
return -EBUSY;
|
||||
|
||||
priv->tx_ring[tc]->tsd_enable = qopt->enable;
|
||||
enetc_port_wr(&priv->si->hw, ENETC_PTCTSDR(tc),
|
||||
qopt->enable ? ENETC_TSDE : 0);
|
||||
enetc_port_wr(hw, ENETC_PTCTSDR(tc), qopt->enable ? ENETC_TSDE : 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -2299,7 +2299,10 @@ static int mtk_open(struct net_device *dev)
|
||||
int err = mtk_start_dma(eth);
|
||||
|
||||
if (err)
|
||||
if (err) {
|
||||
phylink_disconnect_phy(mac->phylink);
|
||||
return err;
|
||||
}
|
||||
|
||||
mtk_gdm_config(eth, MTK_GDMA_TO_PDMA);
|
||||
|
||||
|
@@ -697,7 +697,8 @@ static int mlx4_create_zones(struct mlx4_dev *dev,
|
||||
err = mlx4_bitmap_init(*bitmap + k, 1,
|
||||
MLX4_QP_TABLE_RAW_ETH_SIZE - 1, 0,
|
||||
0);
|
||||
mlx4_bitmap_alloc_range(*bitmap + k, 1, 1, 0);
|
||||
if (!err)
|
||||
mlx4_bitmap_alloc_range(*bitmap + k, 1, 1, 0);
|
||||
}
|
||||
|
||||
if (err)
|
||||
|
@@ -959,6 +959,7 @@ static void cmd_work_handler(struct work_struct *work)
|
||||
cmd_ent_get(ent);
|
||||
set_bit(MLX5_CMD_ENT_STATE_PENDING_COMP, &ent->state);
|
||||
|
||||
cmd_ent_get(ent); /* for the _real_ FW event on completion */
|
||||
/* Skip sending command to fw if internal error */
|
||||
if (mlx5_cmd_is_down(dev) || !opcode_allowed(&dev->cmd, ent->op)) {
|
||||
u8 status = 0;
|
||||
@@ -972,7 +973,6 @@ static void cmd_work_handler(struct work_struct *work)
|
||||
return;
|
||||
}
|
||||
|
||||
cmd_ent_get(ent); /* for the _real_ FW event on completion */
|
||||
/* ring doorbell after the descriptor is valid */
|
||||
mlx5_core_dbg(dev, "writing 0x%x to command doorbell\n", 1 << ent->idx);
|
||||
wmb();
|
||||
@@ -1586,8 +1586,8 @@ static void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec, bool force
|
||||
cmd_ent_put(ent); /* timeout work was canceled */
|
||||
|
||||
if (!forced || /* Real FW completion */
|
||||
pci_channel_offline(dev->pdev) || /* FW is inaccessible */
|
||||
dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR)
|
||||
mlx5_cmd_is_down(dev) || /* No real FW completion is expected */
|
||||
!opcode_allowed(cmd, ent->op))
|
||||
cmd_ent_put(ent);
|
||||
|
||||
ent->ts2 = ktime_get_ns();
|
||||
|
@@ -638,7 +638,7 @@ static void mlx5_tracer_handle_timestamp_trace(struct mlx5_fw_tracer *tracer,
|
||||
trace_timestamp = (timestamp_event.timestamp & MASK_52_7) |
|
||||
(str_frmt->timestamp & MASK_6_0);
|
||||
else
|
||||
trace_timestamp = ((timestamp_event.timestamp & MASK_52_7) - 1) |
|
||||
trace_timestamp = ((timestamp_event.timestamp - 1) & MASK_52_7) |
|
||||
(str_frmt->timestamp & MASK_6_0);
|
||||
|
||||
mlx5_tracer_print_trace(str_frmt, dev, trace_timestamp);
|
||||
|
@@ -363,7 +363,7 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
|
||||
return ret;
|
||||
|
||||
attrs.split = eth_port.is_split;
|
||||
attrs.splittable = !attrs.split;
|
||||
attrs.splittable = eth_port.port_lanes > 1 && !attrs.split;
|
||||
attrs.lanes = eth_port.port_lanes;
|
||||
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
|
||||
attrs.phys.port_number = eth_port.label_port;
|
||||
|
@@ -1225,6 +1225,9 @@ nfp_port_get_module_info(struct net_device *netdev,
|
||||
u8 data;
|
||||
|
||||
port = nfp_port_from_netdev(netdev);
|
||||
if (!port)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* update port state to get latest interface */
|
||||
set_bit(NFP_PORT_CHANGED, &port->flags);
|
||||
eth_port = nfp_port_get_eth_port(port);
|
||||
|
@@ -1166,6 +1166,7 @@ static void pch_gbe_tx_queue(struct pch_gbe_adapter *adapter,
|
||||
buffer_info->dma = 0;
|
||||
buffer_info->time_stamp = 0;
|
||||
tx_ring->next_to_use = ring_num;
|
||||
dev_kfree_skb_any(skb);
|
||||
return;
|
||||
}
|
||||
buffer_info->mapped = true;
|
||||
@@ -2481,6 +2482,7 @@ static void pch_gbe_remove(struct pci_dev *pdev)
|
||||
unregister_netdev(netdev);
|
||||
|
||||
pch_gbe_phy_hw_reset(&adapter->hw);
|
||||
pci_dev_put(adapter->ptp_pdev);
|
||||
|
||||
free_netdev(netdev);
|
||||
}
|
||||
@@ -2562,7 +2564,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
|
||||
/* setup the private structure */
|
||||
ret = pch_gbe_sw_init(adapter);
|
||||
if (ret)
|
||||
goto err_free_netdev;
|
||||
goto err_put_dev;
|
||||
|
||||
/* Initialize PHY */
|
||||
ret = pch_gbe_init_phy(adapter);
|
||||
@@ -2620,6 +2622,8 @@ static int pch_gbe_probe(struct pci_dev *pdev,
|
||||
|
||||
err_free_adapter:
|
||||
pch_gbe_phy_hw_reset(&adapter->hw);
|
||||
err_put_dev:
|
||||
pci_dev_put(adapter->ptp_pdev);
|
||||
err_free_netdev:
|
||||
free_netdev(netdev);
|
||||
return ret;
|
||||
|
@@ -2475,6 +2475,7 @@ static netdev_tx_t ql3xxx_send(struct sk_buff *skb,
|
||||
skb_shinfo(skb)->nr_frags);
|
||||
if (tx_cb->seg_count == -1) {
|
||||
netdev_err(ndev, "%s: invalid segment count!\n", __func__);
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
|
@@ -200,6 +200,7 @@ static netdev_tx_t ef100_hard_start_xmit(struct sk_buff *skb,
|
||||
skb->len, skb->data_len, channel->channel);
|
||||
if (!efx->n_channels || !efx->n_tx_channels || !channel) {
|
||||
netif_stop_queue(net_dev);
|
||||
dev_kfree_skb_any(skb);
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
@@ -2648,11 +2648,6 @@ static int macsec_upd_offload(struct sk_buff *skb, struct genl_info *info)
|
||||
if (ret)
|
||||
goto rollback;
|
||||
|
||||
/* Force features update, since they are different for SW MACSec and
|
||||
* HW offloading cases.
|
||||
*/
|
||||
netdev_update_features(dev);
|
||||
|
||||
rtnl_unlock();
|
||||
return 0;
|
||||
|
||||
@@ -3420,16 +3415,9 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define SW_MACSEC_FEATURES \
|
||||
#define MACSEC_FEATURES \
|
||||
(NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST)
|
||||
|
||||
/* If h/w offloading is enabled, use real device features save for
|
||||
* VLAN_FEATURES - they require additional ops
|
||||
* HW_MACSEC - no reason to report it
|
||||
*/
|
||||
#define REAL_DEV_FEATURES(dev) \
|
||||
((dev)->features & ~(NETIF_F_VLAN_FEATURES | NETIF_F_HW_MACSEC))
|
||||
|
||||
static int macsec_dev_init(struct net_device *dev)
|
||||
{
|
||||
struct macsec_dev *macsec = macsec_priv(dev);
|
||||
@@ -3446,12 +3434,8 @@ static int macsec_dev_init(struct net_device *dev)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (macsec_is_offloaded(macsec)) {
|
||||
dev->features = REAL_DEV_FEATURES(real_dev);
|
||||
} else {
|
||||
dev->features = real_dev->features & SW_MACSEC_FEATURES;
|
||||
dev->features |= NETIF_F_LLTX | NETIF_F_GSO_SOFTWARE;
|
||||
}
|
||||
dev->features = real_dev->features & MACSEC_FEATURES;
|
||||
dev->features |= NETIF_F_LLTX | NETIF_F_GSO_SOFTWARE;
|
||||
|
||||
dev->needed_headroom = real_dev->needed_headroom +
|
||||
MACSEC_NEEDED_HEADROOM;
|
||||
@@ -3480,10 +3464,7 @@ static netdev_features_t macsec_fix_features(struct net_device *dev,
|
||||
struct macsec_dev *macsec = macsec_priv(dev);
|
||||
struct net_device *real_dev = macsec->real_dev;
|
||||
|
||||
if (macsec_is_offloaded(macsec))
|
||||
return REAL_DEV_FEATURES(real_dev);
|
||||
|
||||
features &= (real_dev->features & SW_MACSEC_FEATURES) |
|
||||
features &= (real_dev->features & MACSEC_FEATURES) |
|
||||
NETIF_F_GSO_SOFTWARE | NETIF_F_SOFT_FEATURES;
|
||||
features |= NETIF_F_LLTX;
|
||||
|
||||
@@ -3832,7 +3813,6 @@ static int macsec_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
if (macsec_is_offloaded(macsec)) {
|
||||
const struct macsec_ops *ops;
|
||||
struct macsec_context ctx;
|
||||
int ret;
|
||||
|
||||
ops = macsec_get_ops(netdev_priv(dev), &ctx);
|
||||
if (!ops) {
|
||||
|
@@ -1292,6 +1292,7 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
|
||||
{QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x103a, 0)}, /* Telit LE910C4-WWX */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */
|
||||
{QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */
|
||||
|
@@ -5236,7 +5236,7 @@ static int get_wep_tx_idx(struct airo_info *ai)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int set_wep_key(struct airo_info *ai, u16 index, const char *key,
|
||||
static int set_wep_key(struct airo_info *ai, u16 index, const u8 *key,
|
||||
u16 keylen, int perm, int lock)
|
||||
{
|
||||
static const unsigned char macaddr[ETH_ALEN] = { 0x01, 0, 0, 0, 0, 0 };
|
||||
@@ -5287,7 +5287,7 @@ static void proc_wepkey_on_close(struct inode *inode, struct file *file)
|
||||
struct net_device *dev = PDE_DATA(inode);
|
||||
struct airo_info *ai = dev->ml_priv;
|
||||
int i, rc;
|
||||
char key[16];
|
||||
u8 key[16];
|
||||
u16 index = 0;
|
||||
int j = 0;
|
||||
|
||||
@@ -5315,12 +5315,22 @@ static void proc_wepkey_on_close(struct inode *inode, struct file *file)
|
||||
}
|
||||
|
||||
for (i = 0; i < 16*3 && data->wbuffer[i+j]; i++) {
|
||||
int val;
|
||||
|
||||
if (i % 3 == 2)
|
||||
continue;
|
||||
|
||||
val = hex_to_bin(data->wbuffer[i+j]);
|
||||
if (val < 0) {
|
||||
airo_print_err(ai->dev->name, "WebKey passed invalid key hex");
|
||||
return;
|
||||
}
|
||||
switch(i%3) {
|
||||
case 0:
|
||||
key[i/3] = hex_to_bin(data->wbuffer[i+j])<<4;
|
||||
key[i/3] = (u8)val << 4;
|
||||
break;
|
||||
case 1:
|
||||
key[i/3] |= hex_to_bin(data->wbuffer[i+j]);
|
||||
key[i/3] |= (u8)val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -779,6 +779,7 @@ static void hwsim_send_nullfunc(struct mac80211_hwsim_data *data, u8 *mac,
|
||||
struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_hdr *hdr;
|
||||
struct ieee80211_tx_info *cb;
|
||||
|
||||
if (!vp->assoc)
|
||||
return;
|
||||
@@ -800,6 +801,10 @@ static void hwsim_send_nullfunc(struct mac80211_hwsim_data *data, u8 *mac,
|
||||
memcpy(hdr->addr2, mac, ETH_ALEN);
|
||||
memcpy(hdr->addr3, vp->bssid, ETH_ALEN);
|
||||
|
||||
cb = IEEE80211_SKB_CB(skb);
|
||||
cb->control.rates[0].count = 1;
|
||||
cb->control.rates[1].idx = -1;
|
||||
|
||||
rcu_read_lock();
|
||||
mac80211_hwsim_tx_frame(data->hw, skb,
|
||||
rcu_dereference(vif->chanctx_conf)->def.chan);
|
||||
|
@@ -939,30 +939,52 @@ static inline void wilc_wfi_cfg_parse_ch_attr(u8 *buf, u32 len, u8 sta_ch)
|
||||
return;
|
||||
|
||||
while (index + sizeof(*e) <= len) {
|
||||
u16 attr_size;
|
||||
|
||||
e = (struct wilc_attr_entry *)&buf[index];
|
||||
if (e->attr_type == IEEE80211_P2P_ATTR_CHANNEL_LIST)
|
||||
attr_size = le16_to_cpu(e->attr_len);
|
||||
|
||||
if (index + sizeof(*e) + attr_size > len)
|
||||
return;
|
||||
|
||||
if (e->attr_type == IEEE80211_P2P_ATTR_CHANNEL_LIST &&
|
||||
attr_size >= (sizeof(struct wilc_attr_ch_list) - sizeof(*e)))
|
||||
ch_list_idx = index;
|
||||
else if (e->attr_type == IEEE80211_P2P_ATTR_OPER_CHANNEL)
|
||||
else if (e->attr_type == IEEE80211_P2P_ATTR_OPER_CHANNEL &&
|
||||
attr_size == (sizeof(struct wilc_attr_oper_ch) - sizeof(*e)))
|
||||
op_ch_idx = index;
|
||||
|
||||
if (ch_list_idx && op_ch_idx)
|
||||
break;
|
||||
index += le16_to_cpu(e->attr_len) + sizeof(*e);
|
||||
|
||||
index += sizeof(*e) + attr_size;
|
||||
}
|
||||
|
||||
if (ch_list_idx) {
|
||||
u16 attr_size;
|
||||
struct wilc_ch_list_elem *e;
|
||||
int i;
|
||||
unsigned int i;
|
||||
u16 elem_size;
|
||||
|
||||
ch_list = (struct wilc_attr_ch_list *)&buf[ch_list_idx];
|
||||
attr_size = le16_to_cpu(ch_list->attr_len);
|
||||
for (i = 0; i < attr_size;) {
|
||||
/* the number of bytes following the final 'elem' member */
|
||||
elem_size = le16_to_cpu(ch_list->attr_len) -
|
||||
(sizeof(*ch_list) - sizeof(struct wilc_attr_entry));
|
||||
for (i = 0; i < elem_size;) {
|
||||
struct wilc_ch_list_elem *e;
|
||||
|
||||
e = (struct wilc_ch_list_elem *)(ch_list->elem + i);
|
||||
|
||||
i += sizeof(*e);
|
||||
if (i > elem_size)
|
||||
break;
|
||||
|
||||
i += e->no_of_channels;
|
||||
if (i > elem_size)
|
||||
break;
|
||||
|
||||
if (e->op_class == WILC_WLAN_OPERATING_CLASS_2_4GHZ) {
|
||||
memset(e->ch_list, sta_ch, e->no_of_channels);
|
||||
break;
|
||||
}
|
||||
i += e->no_of_channels;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -467,14 +467,25 @@ void *wilc_parse_join_bss_param(struct cfg80211_bss *bss,
|
||||
|
||||
rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, ies->data, ies->len);
|
||||
if (rsn_ie) {
|
||||
int rsn_ie_len = sizeof(struct element) + rsn_ie[1];
|
||||
int offset = 8;
|
||||
|
||||
param->mode_802_11i = 2;
|
||||
param->rsn_found = true;
|
||||
/* extract RSN capabilities */
|
||||
offset += (rsn_ie[offset] * 4) + 2;
|
||||
offset += (rsn_ie[offset] * 4) + 2;
|
||||
memcpy(param->rsn_cap, &rsn_ie[offset], 2);
|
||||
if (offset < rsn_ie_len) {
|
||||
/* skip over pairwise suites */
|
||||
offset += (rsn_ie[offset] * 4) + 2;
|
||||
|
||||
if (offset < rsn_ie_len) {
|
||||
/* skip over authentication suites */
|
||||
offset += (rsn_ie[offset] * 4) + 2;
|
||||
|
||||
if (offset + 1 < rsn_ie_len) {
|
||||
param->mode_802_11i = 2;
|
||||
param->rsn_found = true;
|
||||
memcpy(param->rsn_cap, &rsn_ie[offset], 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (param->rsn_found) {
|
||||
|
@@ -327,7 +327,7 @@ static int st_nci_hci_connectivity_event_received(struct nci_dev *ndev,
|
||||
* AID 81 5 to 16
|
||||
* PARAMETERS 82 0 to 255
|
||||
*/
|
||||
if (skb->len < NFC_MIN_AID_LENGTH + 2 &&
|
||||
if (skb->len < NFC_MIN_AID_LENGTH + 2 ||
|
||||
skb->data[0] != NFC_EVT_TRANSACTION_AID_TAG)
|
||||
return -EPROTO;
|
||||
|
||||
@@ -340,8 +340,10 @@ static int st_nci_hci_connectivity_event_received(struct nci_dev *ndev,
|
||||
|
||||
/* Check next byte is PARAMETERS tag (82) */
|
||||
if (skb->data[transaction->aid_len + 2] !=
|
||||
NFC_EVT_TRANSACTION_PARAMS_TAG)
|
||||
NFC_EVT_TRANSACTION_PARAMS_TAG) {
|
||||
devm_kfree(dev, transaction);
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
transaction->params_len = skb->data[transaction->aid_len + 3];
|
||||
memcpy(transaction->params, skb->data +
|
||||
|
@@ -3252,6 +3252,10 @@ static const struct pci_device_id nvme_id_table[] = {
|
||||
{ PCI_DEVICE(0x1cc1, 0x8201), /* ADATA SX8200PNP 512GB */
|
||||
.driver_data = NVME_QUIRK_NO_DEEPEST_PS |
|
||||
NVME_QUIRK_IGNORE_DEV_SUBNQN, },
|
||||
{ PCI_DEVICE(0x1344, 0x5407), /* Micron Technology Inc NVMe SSD */
|
||||
.driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN },
|
||||
{ PCI_DEVICE(0x1344, 0x6001), /* Micron Nitro NVMe */
|
||||
.driver_data = NVME_QUIRK_BOGUS_NID, },
|
||||
{ PCI_DEVICE(0x1c5c, 0x1504), /* SK Hynix PC400 */
|
||||
.driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
|
||||
{ PCI_DEVICE(0x15b7, 0x2001), /* Sandisk Skyhawk */
|
||||
|
@@ -536,6 +536,15 @@ static const struct dmi_system_id acer_quirks[] __initconst = {
|
||||
},
|
||||
.driver_data = (void *)ACER_CAP_KBD_DOCK,
|
||||
},
|
||||
{
|
||||
.callback = set_force_caps,
|
||||
.ident = "Acer Aspire Switch V 10 SW5-017",
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
|
||||
},
|
||||
.driver_data = (void *)ACER_CAP_KBD_DOCK,
|
||||
},
|
||||
{
|
||||
.callback = set_force_caps,
|
||||
.ident = "Acer One 10 (S1003)",
|
||||
|
@@ -1212,6 +1212,8 @@ static void asus_wmi_set_xusb2pr(struct asus_wmi *asus)
|
||||
pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
|
||||
cpu_to_le32(ports_available));
|
||||
|
||||
pci_dev_put(xhci_pdev);
|
||||
|
||||
pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
|
||||
orig_ports_available, ports_available);
|
||||
}
|
||||
|
@@ -63,6 +63,7 @@ enum hp_wmi_event_ids {
|
||||
HPWMI_PEAKSHIFT_PERIOD = 0x0F,
|
||||
HPWMI_BATTERY_CHARGE_PERIOD = 0x10,
|
||||
HPWMI_SANITIZATION_MODE = 0x17,
|
||||
HPWMI_SMART_EXPERIENCE_APP = 0x21,
|
||||
};
|
||||
|
||||
struct bios_args {
|
||||
@@ -632,6 +633,8 @@ static void hp_wmi_notify(u32 value, void *context)
|
||||
break;
|
||||
case HPWMI_SANITIZATION_MODE:
|
||||
break;
|
||||
case HPWMI_SMART_EXPERIENCE_APP:
|
||||
break;
|
||||
default:
|
||||
pr_info("Unknown event_id - %d - 0x%x\n", event_id, event_data);
|
||||
break;
|
||||
|
@@ -756,6 +756,22 @@ static const struct ts_dmi_data predia_basic_data = {
|
||||
.properties = predia_basic_props,
|
||||
};
|
||||
|
||||
static const struct property_entry rca_cambio_w101_v2_props[] = {
|
||||
PROPERTY_ENTRY_U32("touchscreen-min-x", 4),
|
||||
PROPERTY_ENTRY_U32("touchscreen-min-y", 20),
|
||||
PROPERTY_ENTRY_U32("touchscreen-size-x", 1644),
|
||||
PROPERTY_ENTRY_U32("touchscreen-size-y", 874),
|
||||
PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"),
|
||||
PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-rca-cambio-w101-v2.fw"),
|
||||
PROPERTY_ENTRY_U32("silead,max-fingers", 10),
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct ts_dmi_data rca_cambio_w101_v2_data = {
|
||||
.acpi_name = "MSSL1680:00",
|
||||
.properties = rca_cambio_w101_v2_props,
|
||||
};
|
||||
|
||||
static const struct property_entry rwc_nanote_p8_props[] = {
|
||||
PROPERTY_ENTRY_U32("touchscreen-min-y", 46),
|
||||
PROPERTY_ENTRY_U32("touchscreen-size-x", 1728),
|
||||
@@ -1341,6 +1357,15 @@ const struct dmi_system_id touchscreen_dmi_table[] = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_NAME, "0E57"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* RCA Cambio W101 v2 */
|
||||
/* https://github.com/onitake/gsl-firmware/discussions/193 */
|
||||
.driver_data = (void *)&rca_cambio_w101_v2_data,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "RCA"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "W101SA23T1"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* RWC NANOTE P8 */
|
||||
.driver_data = (void *)&rwc_nanote_p8_data,
|
||||
|
@@ -4928,6 +4928,7 @@ static void regulator_dev_release(struct device *dev)
|
||||
{
|
||||
struct regulator_dev *rdev = dev_get_drvdata(dev);
|
||||
|
||||
debugfs_remove_recursive(rdev->debugfs);
|
||||
kfree(rdev->constraints);
|
||||
of_node_put(rdev->dev.of_node);
|
||||
kfree(rdev);
|
||||
@@ -5401,11 +5402,15 @@ wash:
|
||||
mutex_lock(®ulator_list_mutex);
|
||||
regulator_ena_gpio_free(rdev);
|
||||
mutex_unlock(®ulator_list_mutex);
|
||||
put_device(&rdev->dev);
|
||||
rdev = NULL;
|
||||
clean:
|
||||
if (dangling_of_gpiod)
|
||||
gpiod_put(config->ena_gpiod);
|
||||
if (rdev && rdev->dev.of_node)
|
||||
of_node_put(rdev->dev.of_node);
|
||||
kfree(rdev);
|
||||
kfree(config);
|
||||
put_device(&rdev->dev);
|
||||
rinse:
|
||||
if (dangling_cfg_gpiod)
|
||||
gpiod_put(cfg->ena_gpiod);
|
||||
@@ -5434,7 +5439,6 @@ void regulator_unregister(struct regulator_dev *rdev)
|
||||
|
||||
mutex_lock(®ulator_list_mutex);
|
||||
|
||||
debugfs_remove_recursive(rdev->debugfs);
|
||||
WARN_ON(rdev->open_count);
|
||||
regulator_remove_coupling(rdev);
|
||||
unset_regulator_supplies(rdev);
|
||||
|
@@ -530,6 +530,7 @@ static const struct twlreg_info TWL6030_INFO_##label = { \
|
||||
#define TWL6032_ADJUSTABLE_LDO(label, offset) \
|
||||
static const struct twlreg_info TWL6032_INFO_##label = { \
|
||||
.base = offset, \
|
||||
.features = TWL6032_SUBCLASS, \
|
||||
.desc = { \
|
||||
.name = #label, \
|
||||
.id = TWL6032_REG_##label, \
|
||||
@@ -562,6 +563,7 @@ static const struct twlreg_info TWLFIXED_INFO_##label = { \
|
||||
#define TWL6032_ADJUSTABLE_SMPS(label, offset) \
|
||||
static const struct twlreg_info TWLSMPS_INFO_##label = { \
|
||||
.base = offset, \
|
||||
.features = TWL6032_SUBCLASS, \
|
||||
.desc = { \
|
||||
.name = #label, \
|
||||
.id = TWL6032_REG_##label, \
|
||||
|
@@ -4627,7 +4627,6 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_raw(struct dasd_device *startdev,
|
||||
struct dasd_device *basedev;
|
||||
struct req_iterator iter;
|
||||
struct dasd_ccw_req *cqr;
|
||||
unsigned int first_offs;
|
||||
unsigned int trkcount;
|
||||
unsigned long *idaws;
|
||||
unsigned int size;
|
||||
@@ -4661,7 +4660,6 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_raw(struct dasd_device *startdev,
|
||||
last_trk = (blk_rq_pos(req) + blk_rq_sectors(req) - 1) /
|
||||
DASD_RAW_SECTORS_PER_TRACK;
|
||||
trkcount = last_trk - first_trk + 1;
|
||||
first_offs = 0;
|
||||
|
||||
if (rq_data_dir(req) == READ)
|
||||
cmd = DASD_ECKD_CCW_READ_TRACK;
|
||||
@@ -4705,13 +4703,13 @@ static struct dasd_ccw_req *dasd_eckd_build_cp_raw(struct dasd_device *startdev,
|
||||
|
||||
if (use_prefix) {
|
||||
prefix_LRE(ccw++, data, first_trk, last_trk, cmd, basedev,
|
||||
startdev, 1, first_offs + 1, trkcount, 0, 0);
|
||||
startdev, 1, 0, trkcount, 0, 0);
|
||||
} else {
|
||||
define_extent(ccw++, data, first_trk, last_trk, cmd, basedev, 0);
|
||||
ccw[-1].flags |= CCW_FLAG_CC;
|
||||
|
||||
data += sizeof(struct DE_eckd_data);
|
||||
locate_record_ext(ccw++, data, first_trk, first_offs + 1,
|
||||
locate_record_ext(ccw++, data, first_trk, 0,
|
||||
trkcount, cmd, basedev, 0, 0);
|
||||
}
|
||||
|
||||
|
@@ -635,8 +635,13 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost)
|
||||
memset(vhost->async_crq.msgs, 0, PAGE_SIZE);
|
||||
vhost->async_crq.cur = 0;
|
||||
|
||||
list_for_each_entry(tgt, &vhost->targets, queue)
|
||||
ibmvfc_del_tgt(tgt);
|
||||
list_for_each_entry(tgt, &vhost->targets, queue) {
|
||||
if (vhost->client_migrated)
|
||||
tgt->need_login = 1;
|
||||
else
|
||||
ibmvfc_del_tgt(tgt);
|
||||
}
|
||||
|
||||
scsi_block_requests(vhost->host);
|
||||
ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
|
||||
vhost->job_step = ibmvfc_npiv_login;
|
||||
@@ -2822,9 +2827,12 @@ static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost)
|
||||
/* We need to re-setup the interpartition connection */
|
||||
dev_info(vhost->dev, "Partition migrated, Re-enabling adapter\n");
|
||||
vhost->client_migrated = 1;
|
||||
|
||||
scsi_block_requests(vhost->host);
|
||||
ibmvfc_purge_requests(vhost, DID_REQUEUE);
|
||||
ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
|
||||
ibmvfc_set_host_state(vhost, IBMVFC_LINK_DOWN);
|
||||
ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_REENABLE);
|
||||
wake_up(&vhost->work_wait_q);
|
||||
} else if (crq->format == IBMVFC_PARTNER_FAILED || crq->format == IBMVFC_PARTNER_DEREGISTER) {
|
||||
dev_err(vhost->dev, "Host partner adapter deregistered or failed (rc=%d)\n", crq->format);
|
||||
ibmvfc_purge_requests(vhost, DID_ERROR);
|
||||
|
@@ -1878,6 +1878,13 @@ static int resp_readcap16(struct scsi_cmnd *scp,
|
||||
arr[14] |= 0x40;
|
||||
}
|
||||
|
||||
/*
|
||||
* Since the scsi_debug READ CAPACITY implementation always reports the
|
||||
* total disk capacity, set RC BASIS = 1 for host-managed ZBC devices.
|
||||
*/
|
||||
if (devip->zmodel == BLK_ZONED_HM)
|
||||
arr[12] |= 1 << 4;
|
||||
|
||||
arr[15] = sdebug_lowest_aligned & 0xff;
|
||||
|
||||
if (have_dif_prot) {
|
||||
|
@@ -716,12 +716,17 @@ int sas_phy_add(struct sas_phy *phy)
|
||||
int error;
|
||||
|
||||
error = device_add(&phy->dev);
|
||||
if (!error) {
|
||||
transport_add_device(&phy->dev);
|
||||
transport_configure_device(&phy->dev);
|
||||
}
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
return error;
|
||||
error = transport_add_device(&phy->dev);
|
||||
if (error) {
|
||||
device_del(&phy->dev);
|
||||
return error;
|
||||
}
|
||||
transport_configure_device(&phy->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(sas_phy_add);
|
||||
|
||||
|
@@ -356,16 +356,21 @@ enum storvsc_request_type {
|
||||
};
|
||||
|
||||
/*
|
||||
* SRB status codes and masks; a subset of the codes used here.
|
||||
* SRB status codes and masks. In the 8-bit field, the two high order bits
|
||||
* are flags, while the remaining 6 bits are an integer status code. The
|
||||
* definitions here include only the subset of the integer status codes that
|
||||
* are tested for in this driver.
|
||||
*/
|
||||
|
||||
#define SRB_STATUS_AUTOSENSE_VALID 0x80
|
||||
#define SRB_STATUS_QUEUE_FROZEN 0x40
|
||||
#define SRB_STATUS_INVALID_LUN 0x20
|
||||
#define SRB_STATUS_SUCCESS 0x01
|
||||
#define SRB_STATUS_ABORTED 0x02
|
||||
#define SRB_STATUS_ERROR 0x04
|
||||
#define SRB_STATUS_DATA_OVERRUN 0x12
|
||||
|
||||
/* SRB status integer codes */
|
||||
#define SRB_STATUS_SUCCESS 0x01
|
||||
#define SRB_STATUS_ABORTED 0x02
|
||||
#define SRB_STATUS_ERROR 0x04
|
||||
#define SRB_STATUS_INVALID_REQUEST 0x06
|
||||
#define SRB_STATUS_DATA_OVERRUN 0x12
|
||||
#define SRB_STATUS_INVALID_LUN 0x20
|
||||
|
||||
#define SRB_STATUS(status) \
|
||||
(status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
|
||||
@@ -995,38 +1000,25 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb,
|
||||
void (*process_err_fn)(struct work_struct *work);
|
||||
struct hv_host_device *host_dev = shost_priv(host);
|
||||
|
||||
/*
|
||||
* In some situations, Hyper-V sets multiple bits in the
|
||||
* srb_status, such as ABORTED and ERROR. So process them
|
||||
* individually, with the most specific bits first.
|
||||
*/
|
||||
switch (SRB_STATUS(vm_srb->srb_status)) {
|
||||
case SRB_STATUS_ERROR:
|
||||
case SRB_STATUS_ABORTED:
|
||||
case SRB_STATUS_INVALID_REQUEST:
|
||||
if (vm_srb->srb_status & SRB_STATUS_AUTOSENSE_VALID) {
|
||||
/* Check for capacity change */
|
||||
if ((asc == 0x2a) && (ascq == 0x9)) {
|
||||
process_err_fn = storvsc_device_scan;
|
||||
/* Retry the I/O that triggered this. */
|
||||
set_host_byte(scmnd, DID_REQUEUE);
|
||||
goto do_work;
|
||||
}
|
||||
|
||||
if (vm_srb->srb_status & SRB_STATUS_INVALID_LUN) {
|
||||
set_host_byte(scmnd, DID_NO_CONNECT);
|
||||
process_err_fn = storvsc_remove_lun;
|
||||
goto do_work;
|
||||
}
|
||||
|
||||
if (vm_srb->srb_status & SRB_STATUS_ABORTED) {
|
||||
if (vm_srb->srb_status & SRB_STATUS_AUTOSENSE_VALID &&
|
||||
/* Capacity data has changed */
|
||||
(asc == 0x2a) && (ascq == 0x9)) {
|
||||
process_err_fn = storvsc_device_scan;
|
||||
/*
|
||||
* Retry the I/O that triggered this.
|
||||
* Otherwise, let upper layer deal with the
|
||||
* error when sense message is present
|
||||
*/
|
||||
set_host_byte(scmnd, DID_REQUEUE);
|
||||
goto do_work;
|
||||
}
|
||||
}
|
||||
|
||||
if (vm_srb->srb_status & SRB_STATUS_ERROR) {
|
||||
/*
|
||||
* Let upper layer deal with error when
|
||||
* sense message is present.
|
||||
*/
|
||||
if (vm_srb->srb_status & SRB_STATUS_AUTOSENSE_VALID)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there is an error; offline the device since all
|
||||
@@ -1049,6 +1041,13 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb,
|
||||
default:
|
||||
set_host_byte(scmnd, DID_ERROR);
|
||||
}
|
||||
return;
|
||||
|
||||
case SRB_STATUS_INVALID_LUN:
|
||||
set_host_byte(scmnd, DID_NO_CONNECT);
|
||||
process_err_fn = storvsc_remove_lun;
|
||||
goto do_work;
|
||||
|
||||
}
|
||||
return;
|
||||
|
||||
|
@@ -127,12 +127,15 @@ static int dw_spi_dma_init_mfld(struct device *dev, struct dw_spi *dws)
|
||||
|
||||
dw_spi_dma_sg_burst_init(dws);
|
||||
|
||||
pci_dev_put(dma_dev);
|
||||
|
||||
return 0;
|
||||
|
||||
free_rxchan:
|
||||
dma_release_channel(dws->rxchan);
|
||||
dws->rxchan = NULL;
|
||||
err_exit:
|
||||
pci_dev_put(dma_dev);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
@@ -443,7 +443,7 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz,
|
||||
u32 div, mbrdiv;
|
||||
|
||||
/* Ensure spi->clk_rate is even */
|
||||
div = DIV_ROUND_UP(spi->clk_rate & ~0x1, speed_hz);
|
||||
div = DIV_ROUND_CLOSEST(spi->clk_rate & ~0x1, speed_hz);
|
||||
|
||||
/*
|
||||
* SPI framework set xfer->speed_hz to master->max_speed_hz if
|
||||
|
@@ -80,7 +80,7 @@ static int optee_register_device(const uuid_t *device_uuid)
|
||||
rc = device_register(&optee_device->dev);
|
||||
if (rc) {
|
||||
pr_err("device registration failed, err: %d\n", rc);
|
||||
kfree(optee_device);
|
||||
put_device(&optee_device->dev);
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
@@ -293,6 +293,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
|
||||
{
|
||||
struct omap8250_priv *priv = up->port.private_data;
|
||||
struct uart_8250_dma *dma = up->dma;
|
||||
u8 mcr = serial8250_in_MCR(up);
|
||||
|
||||
if (dma && dma->tx_running) {
|
||||
/*
|
||||
@@ -309,7 +310,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
|
||||
serial_out(up, UART_EFR, UART_EFR_ECB);
|
||||
|
||||
serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
|
||||
serial8250_out_MCR(up, UART_MCR_TCRTLR);
|
||||
serial8250_out_MCR(up, mcr | UART_MCR_TCRTLR);
|
||||
serial_out(up, UART_FCR, up->fcr);
|
||||
|
||||
omap8250_update_scr(up, priv);
|
||||
@@ -325,7 +326,8 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
|
||||
serial_out(up, UART_LCR, 0);
|
||||
|
||||
/* drop TCR + TLR access, we setup XON/XOFF later */
|
||||
serial8250_out_MCR(up, up->mcr);
|
||||
serial8250_out_MCR(up, mcr);
|
||||
|
||||
serial_out(up, UART_IER, up->ier);
|
||||
|
||||
serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
|
||||
@@ -684,7 +686,6 @@ static int omap_8250_startup(struct uart_port *port)
|
||||
|
||||
pm_runtime_get_sync(port->dev);
|
||||
|
||||
up->mcr = 0;
|
||||
serial_out(up, UART_FCR, UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
|
||||
|
||||
serial_out(up, UART_LCR, UART_LCR_WLEN8);
|
||||
|
@@ -97,13 +97,23 @@ static int cdns3_core_init_role(struct cdns3 *cdns)
|
||||
* can be restricted later depending on strap pin configuration.
|
||||
*/
|
||||
if (dr_mode == USB_DR_MODE_UNKNOWN) {
|
||||
if (IS_ENABLED(CONFIG_USB_CDNS3_HOST) &&
|
||||
IS_ENABLED(CONFIG_USB_CDNS3_GADGET))
|
||||
dr_mode = USB_DR_MODE_OTG;
|
||||
else if (IS_ENABLED(CONFIG_USB_CDNS3_HOST))
|
||||
dr_mode = USB_DR_MODE_HOST;
|
||||
else if (IS_ENABLED(CONFIG_USB_CDNS3_GADGET))
|
||||
dr_mode = USB_DR_MODE_PERIPHERAL;
|
||||
if (cdns->version == CDNSP_CONTROLLER_V2) {
|
||||
if (IS_ENABLED(CONFIG_USB_CDNSP_HOST) &&
|
||||
IS_ENABLED(CONFIG_USB_CDNSP_GADGET))
|
||||
dr_mode = USB_DR_MODE_OTG;
|
||||
else if (IS_ENABLED(CONFIG_USB_CDNSP_HOST))
|
||||
dr_mode = USB_DR_MODE_HOST;
|
||||
else if (IS_ENABLED(CONFIG_USB_CDNSP_GADGET))
|
||||
dr_mode = USB_DR_MODE_PERIPHERAL;
|
||||
} else {
|
||||
if (IS_ENABLED(CONFIG_USB_CDNS3_HOST) &&
|
||||
IS_ENABLED(CONFIG_USB_CDNS3_GADGET))
|
||||
dr_mode = USB_DR_MODE_OTG;
|
||||
else if (IS_ENABLED(CONFIG_USB_CDNS3_HOST))
|
||||
dr_mode = USB_DR_MODE_HOST;
|
||||
else if (IS_ENABLED(CONFIG_USB_CDNS3_GADGET))
|
||||
dr_mode = USB_DR_MODE_PERIPHERAL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -55,7 +55,9 @@ struct cdns3_platform_data {
|
||||
* @otg_res: the resource for otg
|
||||
* @otg_v0_regs: pointer to base of v0 otg registers
|
||||
* @otg_v1_regs: pointer to base of v1 otg registers
|
||||
* @otg_cdnsp_regs: pointer to base of CDNSP otg registers
|
||||
* @otg_regs: pointer to base of otg registers
|
||||
* @otg_irq_regs: pointer to interrupt registers
|
||||
* @otg_irq: irq number for otg controller
|
||||
* @dev_irq: irq number for device controller
|
||||
* @wakeup_irq: irq number for wakeup event, it is optional
|
||||
@@ -86,9 +88,12 @@ struct cdns3 {
|
||||
struct resource otg_res;
|
||||
struct cdns3_otg_legacy_regs *otg_v0_regs;
|
||||
struct cdns3_otg_regs *otg_v1_regs;
|
||||
struct cdnsp_otg_regs *otg_cdnsp_regs;
|
||||
struct cdns3_otg_common_regs *otg_regs;
|
||||
struct cdns3_otg_irq_regs *otg_irq_regs;
|
||||
#define CDNS3_CONTROLLER_V0 0
|
||||
#define CDNS3_CONTROLLER_V1 1
|
||||
#define CDNSP_CONTROLLER_V2 2
|
||||
u32 version;
|
||||
bool phyrst_a_enable;
|
||||
|
||||
|
@@ -2,13 +2,12 @@
|
||||
/*
|
||||
* Cadence USBSS DRD Driver.
|
||||
*
|
||||
* Copyright (C) 2018-2019 Cadence.
|
||||
* Copyright (C) 2018-2020 Cadence.
|
||||
* Copyright (C) 2019 Texas Instruments
|
||||
*
|
||||
* Author: Pawel Laszczak <pawell@cadence.com>
|
||||
* Roger Quadros <rogerq@ti.com>
|
||||
*
|
||||
*
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/interrupt.h>
|
||||
@@ -28,8 +27,9 @@
|
||||
*
|
||||
* Returns 0 on success otherwise negative errno
|
||||
*/
|
||||
int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode)
|
||||
static int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode)
|
||||
{
|
||||
u32 __iomem *override_reg;
|
||||
u32 reg;
|
||||
|
||||
switch (mode) {
|
||||
@@ -39,11 +39,24 @@ int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode)
|
||||
break;
|
||||
case USB_DR_MODE_OTG:
|
||||
dev_dbg(cdns->dev, "Set controller to OTG mode\n");
|
||||
if (cdns->version == CDNS3_CONTROLLER_V1) {
|
||||
reg = readl(&cdns->otg_v1_regs->override);
|
||||
reg |= OVERRIDE_IDPULLUP;
|
||||
writel(reg, &cdns->otg_v1_regs->override);
|
||||
|
||||
if (cdns->version == CDNSP_CONTROLLER_V2)
|
||||
override_reg = &cdns->otg_cdnsp_regs->override;
|
||||
else if (cdns->version == CDNS3_CONTROLLER_V1)
|
||||
override_reg = &cdns->otg_v1_regs->override;
|
||||
else
|
||||
override_reg = &cdns->otg_v0_regs->ctrl1;
|
||||
|
||||
reg = readl(override_reg);
|
||||
|
||||
if (cdns->version != CDNS3_CONTROLLER_V0)
|
||||
reg |= OVERRIDE_IDPULLUP;
|
||||
else
|
||||
reg |= OVERRIDE_IDPULLUP_V0;
|
||||
|
||||
writel(reg, override_reg);
|
||||
|
||||
if (cdns->version == CDNS3_CONTROLLER_V1) {
|
||||
/*
|
||||
* Enable work around feature built into the
|
||||
* controller to address issue with RX Sensitivity
|
||||
@@ -55,10 +68,6 @@ int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode)
|
||||
reg |= PHYRST_CFG_PHYRST_A_ENABLE;
|
||||
writel(reg, &cdns->otg_v1_regs->phyrst_cfg);
|
||||
}
|
||||
} else {
|
||||
reg = readl(&cdns->otg_v0_regs->ctrl1);
|
||||
reg |= OVERRIDE_IDPULLUP_V0;
|
||||
writel(reg, &cdns->otg_v0_regs->ctrl1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -123,7 +132,7 @@ bool cdns3_is_device(struct cdns3 *cdns)
|
||||
*/
|
||||
static void cdns3_otg_disable_irq(struct cdns3 *cdns)
|
||||
{
|
||||
writel(0, &cdns->otg_regs->ien);
|
||||
writel(0, &cdns->otg_irq_regs->ien);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -133,7 +142,7 @@ static void cdns3_otg_disable_irq(struct cdns3 *cdns)
|
||||
static void cdns3_otg_enable_irq(struct cdns3 *cdns)
|
||||
{
|
||||
writel(OTGIEN_ID_CHANGE_INT | OTGIEN_VBUSVALID_RISE_INT |
|
||||
OTGIEN_VBUSVALID_FALL_INT, &cdns->otg_regs->ien);
|
||||
OTGIEN_VBUSVALID_FALL_INT, &cdns->otg_irq_regs->ien);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -144,16 +153,21 @@ static void cdns3_otg_enable_irq(struct cdns3 *cdns)
|
||||
*/
|
||||
int cdns3_drd_host_on(struct cdns3 *cdns)
|
||||
{
|
||||
u32 val;
|
||||
u32 val, ready_bit;
|
||||
int ret;
|
||||
|
||||
/* Enable host mode. */
|
||||
writel(OTGCMD_HOST_BUS_REQ | OTGCMD_OTG_DIS,
|
||||
&cdns->otg_regs->cmd);
|
||||
|
||||
if (cdns->version == CDNSP_CONTROLLER_V2)
|
||||
ready_bit = OTGSTS_CDNSP_XHCI_READY;
|
||||
else
|
||||
ready_bit = OTGSTS_CDNS3_XHCI_READY;
|
||||
|
||||
dev_dbg(cdns->dev, "Waiting till Host mode is turned on\n");
|
||||
ret = readl_poll_timeout_atomic(&cdns->otg_regs->sts, val,
|
||||
val & OTGSTS_XHCI_READY, 1, 100000);
|
||||
val & ready_bit, 1, 100000);
|
||||
|
||||
if (ret)
|
||||
dev_err(cdns->dev, "timeout waiting for xhci_ready\n");
|
||||
@@ -189,17 +203,22 @@ void cdns3_drd_host_off(struct cdns3 *cdns)
|
||||
*/
|
||||
int cdns3_drd_gadget_on(struct cdns3 *cdns)
|
||||
{
|
||||
int ret, val;
|
||||
u32 reg = OTGCMD_OTG_DIS;
|
||||
u32 ready_bit;
|
||||
int ret, val;
|
||||
|
||||
/* switch OTG core */
|
||||
writel(OTGCMD_DEV_BUS_REQ | reg, &cdns->otg_regs->cmd);
|
||||
|
||||
dev_dbg(cdns->dev, "Waiting till Device mode is turned on\n");
|
||||
|
||||
if (cdns->version == CDNSP_CONTROLLER_V2)
|
||||
ready_bit = OTGSTS_CDNSP_DEV_READY;
|
||||
else
|
||||
ready_bit = OTGSTS_CDNS3_DEV_READY;
|
||||
|
||||
ret = readl_poll_timeout_atomic(&cdns->otg_regs->sts, val,
|
||||
val & OTGSTS_DEV_READY,
|
||||
1, 100000);
|
||||
val & ready_bit, 1, 100000);
|
||||
if (ret) {
|
||||
dev_err(cdns->dev, "timeout waiting for dev_ready\n");
|
||||
return ret;
|
||||
@@ -244,7 +263,7 @@ static int cdns3_init_otg_mode(struct cdns3 *cdns)
|
||||
|
||||
cdns3_otg_disable_irq(cdns);
|
||||
/* clear all interrupts */
|
||||
writel(~0, &cdns->otg_regs->ivect);
|
||||
writel(~0, &cdns->otg_irq_regs->ivect);
|
||||
|
||||
ret = cdns3_set_mode(cdns, USB_DR_MODE_OTG);
|
||||
if (ret)
|
||||
@@ -313,7 +332,7 @@ static irqreturn_t cdns3_drd_irq(int irq, void *data)
|
||||
if (cdns->in_lpm)
|
||||
return ret;
|
||||
|
||||
reg = readl(&cdns->otg_regs->ivect);
|
||||
reg = readl(&cdns->otg_irq_regs->ivect);
|
||||
|
||||
if (!reg)
|
||||
return IRQ_NONE;
|
||||
@@ -332,7 +351,7 @@ static irqreturn_t cdns3_drd_irq(int irq, void *data)
|
||||
ret = IRQ_WAKE_THREAD;
|
||||
}
|
||||
|
||||
writel(~0, &cdns->otg_regs->ivect);
|
||||
writel(~0, &cdns->otg_irq_regs->ivect);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -347,28 +366,43 @@ int cdns3_drd_init(struct cdns3 *cdns)
|
||||
return PTR_ERR(regs);
|
||||
|
||||
/* Detection of DRD version. Controller has been released
|
||||
* in two versions. Both are similar, but they have same changes
|
||||
* in register maps.
|
||||
* The first register in old version is command register and it's read
|
||||
* only, so driver should read 0 from it. On the other hand, in v1
|
||||
* the first register contains device ID number which is not set to 0.
|
||||
* Driver uses this fact to detect the proper version of
|
||||
* in three versions. All are very similar and are software compatible,
|
||||
* but they have same changes in register maps.
|
||||
* The first register in oldest version is command register and it's
|
||||
* read only. Driver should read 0 from it. On the other hand, in v1
|
||||
* and v2 the first register contains device ID number which is not
|
||||
* set to 0. Driver uses this fact to detect the proper version of
|
||||
* controller.
|
||||
*/
|
||||
cdns->otg_v0_regs = regs;
|
||||
if (!readl(&cdns->otg_v0_regs->cmd)) {
|
||||
cdns->version = CDNS3_CONTROLLER_V0;
|
||||
cdns->otg_v1_regs = NULL;
|
||||
cdns->otg_cdnsp_regs = NULL;
|
||||
cdns->otg_regs = regs;
|
||||
cdns->otg_irq_regs = (struct cdns3_otg_irq_regs *)
|
||||
&cdns->otg_v0_regs->ien;
|
||||
writel(1, &cdns->otg_v0_regs->simulate);
|
||||
dev_dbg(cdns->dev, "DRD version v0 (%08x)\n",
|
||||
readl(&cdns->otg_v0_regs->version));
|
||||
} else {
|
||||
cdns->otg_v0_regs = NULL;
|
||||
cdns->otg_v1_regs = regs;
|
||||
cdns->otg_cdnsp_regs = regs;
|
||||
|
||||
cdns->otg_regs = (void *)&cdns->otg_v1_regs->cmd;
|
||||
cdns->version = CDNS3_CONTROLLER_V1;
|
||||
writel(1, &cdns->otg_v1_regs->simulate);
|
||||
|
||||
if (cdns->otg_cdnsp_regs->did == OTG_CDNSP_DID) {
|
||||
cdns->otg_irq_regs = (struct cdns3_otg_irq_regs *)
|
||||
&cdns->otg_cdnsp_regs->ien;
|
||||
cdns->version = CDNSP_CONTROLLER_V2;
|
||||
} else {
|
||||
cdns->otg_irq_regs = (struct cdns3_otg_irq_regs *)
|
||||
&cdns->otg_v1_regs->ien;
|
||||
writel(1, &cdns->otg_v1_regs->simulate);
|
||||
cdns->version = CDNS3_CONTROLLER_V1;
|
||||
}
|
||||
|
||||
dev_dbg(cdns->dev, "DRD version v1 (ID: %08x, rev: %08x)\n",
|
||||
readl(&cdns->otg_v1_regs->did),
|
||||
readl(&cdns->otg_v1_regs->rid));
|
||||
@@ -378,10 +412,17 @@ int cdns3_drd_init(struct cdns3 *cdns)
|
||||
|
||||
/* Update dr_mode according to STRAP configuration. */
|
||||
cdns->dr_mode = USB_DR_MODE_OTG;
|
||||
if (state == OTGSTS_STRAP_HOST) {
|
||||
|
||||
if ((cdns->version == CDNSP_CONTROLLER_V2 &&
|
||||
state == OTGSTS_CDNSP_STRAP_HOST) ||
|
||||
(cdns->version != CDNSP_CONTROLLER_V2 &&
|
||||
state == OTGSTS_STRAP_HOST)) {
|
||||
dev_dbg(cdns->dev, "Controller strapped to HOST\n");
|
||||
cdns->dr_mode = USB_DR_MODE_HOST;
|
||||
} else if (state == OTGSTS_STRAP_GADGET) {
|
||||
} else if ((cdns->version == CDNSP_CONTROLLER_V2 &&
|
||||
state == OTGSTS_CDNSP_STRAP_GADGET) ||
|
||||
(cdns->version != CDNSP_CONTROLLER_V2 &&
|
||||
state == OTGSTS_STRAP_GADGET)) {
|
||||
dev_dbg(cdns->dev, "Controller strapped to PERIPHERAL\n");
|
||||
cdns->dr_mode = USB_DR_MODE_PERIPHERAL;
|
||||
}
|
||||
|
@@ -1,8 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Cadence USB3 DRD header file.
|
||||
* Cadence USB3 and USBSSP DRD header file.
|
||||
*
|
||||
* Copyright (C) 2018-2019 Cadence.
|
||||
* Copyright (C) 2018-2020 Cadence.
|
||||
*
|
||||
* Author: Pawel Laszczak <pawell@cadence.com>
|
||||
*/
|
||||
@@ -13,7 +13,7 @@
|
||||
#include <linux/phy/phy.h>
|
||||
#include "core.h"
|
||||
|
||||
/* DRD register interface for version v1. */
|
||||
/* DRD register interface for version v1 of cdns3 driver. */
|
||||
struct cdns3_otg_regs {
|
||||
__le32 did;
|
||||
__le32 rid;
|
||||
@@ -38,7 +38,7 @@ struct cdns3_otg_regs {
|
||||
__le32 ctrl2;
|
||||
};
|
||||
|
||||
/* DRD register interface for version v0. */
|
||||
/* DRD register interface for version v0 of cdns3 driver. */
|
||||
struct cdns3_otg_legacy_regs {
|
||||
__le32 cmd;
|
||||
__le32 sts;
|
||||
@@ -57,14 +57,45 @@ struct cdns3_otg_legacy_regs {
|
||||
__le32 ctrl1;
|
||||
};
|
||||
|
||||
/* DRD register interface for cdnsp driver */
|
||||
struct cdnsp_otg_regs {
|
||||
__le32 did;
|
||||
__le32 rid;
|
||||
__le32 cfgs1;
|
||||
__le32 cfgs2;
|
||||
__le32 cmd;
|
||||
__le32 sts;
|
||||
__le32 state;
|
||||
__le32 ien;
|
||||
__le32 ivect;
|
||||
__le32 tmr;
|
||||
__le32 simulate;
|
||||
__le32 adpbc_sts;
|
||||
__le32 adp_ramp_time;
|
||||
__le32 adpbc_ctrl1;
|
||||
__le32 adpbc_ctrl2;
|
||||
__le32 override;
|
||||
__le32 vbusvalid_dbnc_cfg;
|
||||
__le32 sessvalid_dbnc_cfg;
|
||||
__le32 susp_timing_ctrl;
|
||||
};
|
||||
|
||||
#define OTG_CDNSP_DID 0x0004034E
|
||||
|
||||
/*
|
||||
* Common registers interface for both version of DRD.
|
||||
* Common registers interface for both CDNS3 and CDNSP version of DRD.
|
||||
*/
|
||||
struct cdns3_otg_common_regs {
|
||||
__le32 cmd;
|
||||
__le32 sts;
|
||||
__le32 state;
|
||||
__le32 different1;
|
||||
};
|
||||
|
||||
/*
|
||||
* Interrupt related registers. This registers are mapped in different
|
||||
* location for CDNSP controller.
|
||||
*/
|
||||
struct cdns3_otg_irq_regs {
|
||||
__le32 ien;
|
||||
__le32 ivect;
|
||||
};
|
||||
@@ -92,9 +123,9 @@ struct cdns3_otg_common_regs {
|
||||
#define OTGCMD_DEV_BUS_DROP BIT(8)
|
||||
/* Drop the bus for Host mode*/
|
||||
#define OTGCMD_HOST_BUS_DROP BIT(9)
|
||||
/* Power Down USBSS-DEV. */
|
||||
/* Power Down USBSS-DEV - only for CDNS3.*/
|
||||
#define OTGCMD_DEV_POWER_OFF BIT(11)
|
||||
/* Power Down CDNSXHCI. */
|
||||
/* Power Down CDNSXHCI - only for CDNS3. */
|
||||
#define OTGCMD_HOST_POWER_OFF BIT(12)
|
||||
|
||||
/* OTGIEN - bitmasks */
|
||||
@@ -123,20 +154,31 @@ struct cdns3_otg_common_regs {
|
||||
#define OTGSTS_OTG_NRDY_MASK BIT(11)
|
||||
#define OTGSTS_OTG_NRDY(p) ((p) & OTGSTS_OTG_NRDY_MASK)
|
||||
/*
|
||||
* Value of the strap pins.
|
||||
* Value of the strap pins for:
|
||||
* CDNS3:
|
||||
* 000 - no default configuration
|
||||
* 010 - Controller initiall configured as Host
|
||||
* 100 - Controller initially configured as Device
|
||||
* CDNSP:
|
||||
* 000 - No default configuration.
|
||||
* 010 - Controller initiall configured as Host.
|
||||
* 100 - Controller initially configured as Device.
|
||||
*/
|
||||
#define OTGSTS_STRAP(p) (((p) & GENMASK(14, 12)) >> 12)
|
||||
#define OTGSTS_STRAP_NO_DEFAULT_CFG 0x00
|
||||
#define OTGSTS_STRAP_HOST_OTG 0x01
|
||||
#define OTGSTS_STRAP_HOST 0x02
|
||||
#define OTGSTS_STRAP_GADGET 0x04
|
||||
#define OTGSTS_CDNSP_STRAP_HOST 0x01
|
||||
#define OTGSTS_CDNSP_STRAP_GADGET 0x02
|
||||
|
||||
/* Host mode is turned on. */
|
||||
#define OTGSTS_XHCI_READY BIT(26)
|
||||
#define OTGSTS_CDNS3_XHCI_READY BIT(26)
|
||||
#define OTGSTS_CDNSP_XHCI_READY BIT(27)
|
||||
|
||||
/* "Device mode is turned on .*/
|
||||
#define OTGSTS_DEV_READY BIT(27)
|
||||
#define OTGSTS_CDNS3_DEV_READY BIT(27)
|
||||
#define OTGSTS_CDNSP_DEV_READY BIT(26)
|
||||
|
||||
/* OTGSTATE- bitmasks */
|
||||
#define OTGSTATE_DEV_STATE_MASK GENMASK(2, 0)
|
||||
@@ -152,6 +194,8 @@ struct cdns3_otg_common_regs {
|
||||
#define OVERRIDE_IDPULLUP BIT(0)
|
||||
/* Only for CDNS3_CONTROLLER_V0 version */
|
||||
#define OVERRIDE_IDPULLUP_V0 BIT(24)
|
||||
/* Vbusvalid/Sesvalid override select. */
|
||||
#define OVERRIDE_SESS_VLD_SEL BIT(10)
|
||||
|
||||
/* PHYRST_CFG - bitmasks */
|
||||
#define PHYRST_CFG_PHYRST_A_ENABLE BIT(0)
|
||||
@@ -170,6 +214,5 @@ int cdns3_drd_gadget_on(struct cdns3 *cdns);
|
||||
void cdns3_drd_gadget_off(struct cdns3 *cdns);
|
||||
int cdns3_drd_host_on(struct cdns3 *cdns);
|
||||
void cdns3_drd_host_off(struct cdns3 *cdns);
|
||||
int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode);
|
||||
|
||||
#endif /* __LINUX_CDNS3_DRD */
|
||||
|
@@ -37,15 +37,6 @@ struct dwc3_exynos {
|
||||
struct regulator *vdd10;
|
||||
};
|
||||
|
||||
static int dwc3_exynos_remove_child(struct device *dev, void *unused)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
|
||||
platform_device_unregister(pdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dwc3_exynos_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct dwc3_exynos *exynos;
|
||||
@@ -142,7 +133,7 @@ static int dwc3_exynos_remove(struct platform_device *pdev)
|
||||
struct dwc3_exynos *exynos = platform_get_drvdata(pdev);
|
||||
int i;
|
||||
|
||||
device_for_each_child(&pdev->dev, NULL, dwc3_exynos_remove_child);
|
||||
of_platform_depopulate(&pdev->dev);
|
||||
|
||||
for (i = exynos->num_clks - 1; i >= 0; i--)
|
||||
clk_disable_unprepare(exynos->clks[i]);
|
||||
|
@@ -950,7 +950,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
|
||||
static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep, int status)
|
||||
{
|
||||
struct dwc3_request *req;
|
||||
|
||||
@@ -960,19 +960,19 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
|
||||
while (!list_empty(&dep->started_list)) {
|
||||
req = next_request(&dep->started_list);
|
||||
|
||||
dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
|
||||
dwc3_gadget_giveback(dep, req, status);
|
||||
}
|
||||
|
||||
while (!list_empty(&dep->pending_list)) {
|
||||
req = next_request(&dep->pending_list);
|
||||
|
||||
dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
|
||||
dwc3_gadget_giveback(dep, req, status);
|
||||
}
|
||||
|
||||
while (!list_empty(&dep->cancelled_list)) {
|
||||
req = next_request(&dep->cancelled_list);
|
||||
|
||||
dwc3_gadget_giveback(dep, req, -ESHUTDOWN);
|
||||
dwc3_gadget_giveback(dep, req, status);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1001,18 +1001,18 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
|
||||
reg &= ~DWC3_DALEPENA_EP(dep->number);
|
||||
dwc3_writel(dwc->regs, DWC3_DALEPENA, reg);
|
||||
|
||||
dwc3_remove_requests(dwc, dep, -ESHUTDOWN);
|
||||
|
||||
dep->stream_capable = false;
|
||||
dep->type = 0;
|
||||
dep->flags &= DWC3_EP_TXFIFO_RESIZED;
|
||||
|
||||
/* Clear out the ep descriptors for non-ep0 */
|
||||
if (dep->number > 1) {
|
||||
dep->endpoint.comp_desc = NULL;
|
||||
dep->endpoint.desc = NULL;
|
||||
}
|
||||
|
||||
dwc3_remove_requests(dwc, dep);
|
||||
|
||||
dep->stream_capable = false;
|
||||
dep->type = 0;
|
||||
dep->flags &= DWC3_EP_TXFIFO_RESIZED;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2301,7 +2301,7 @@ static void dwc3_stop_active_transfers(struct dwc3 *dwc)
|
||||
if (!dep)
|
||||
continue;
|
||||
|
||||
dwc3_remove_requests(dwc, dep);
|
||||
dwc3_remove_requests(dwc, dep, -ESHUTDOWN);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -137,7 +137,7 @@ static int platform_pci_probe(struct pci_dev *pdev,
|
||||
if (ret) {
|
||||
dev_warn(&pdev->dev, "Unable to set the evtchn callback "
|
||||
"err=%d\n", ret);
|
||||
goto out;
|
||||
goto irq_out;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,13 +145,16 @@ static int platform_pci_probe(struct pci_dev *pdev,
|
||||
grant_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes);
|
||||
ret = gnttab_setup_auto_xlat_frames(grant_frames);
|
||||
if (ret)
|
||||
goto out;
|
||||
goto irq_out;
|
||||
ret = gnttab_init();
|
||||
if (ret)
|
||||
goto grant_out;
|
||||
return 0;
|
||||
grant_out:
|
||||
gnttab_free_auto_xlat_frames();
|
||||
irq_out:
|
||||
if (!xen_have_vector_callback)
|
||||
free_irq(pdev->irq, pdev);
|
||||
out:
|
||||
pci_release_region(pdev, 0);
|
||||
mem_out:
|
||||
|
@@ -190,13 +190,16 @@ static const struct config_field caplist_pm[] = {
|
||||
};
|
||||
|
||||
static struct msi_msix_field_config {
|
||||
u16 enable_bit; /* bit for enabling MSI/MSI-X */
|
||||
unsigned int int_type; /* interrupt type for exclusiveness check */
|
||||
u16 enable_bit; /* bit for enabling MSI/MSI-X */
|
||||
u16 allowed_bits; /* bits allowed to be changed */
|
||||
unsigned int int_type; /* interrupt type for exclusiveness check */
|
||||
} msi_field_config = {
|
||||
.enable_bit = PCI_MSI_FLAGS_ENABLE,
|
||||
.allowed_bits = PCI_MSI_FLAGS_ENABLE,
|
||||
.int_type = INTERRUPT_TYPE_MSI,
|
||||
}, msix_field_config = {
|
||||
.enable_bit = PCI_MSIX_FLAGS_ENABLE,
|
||||
.allowed_bits = PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL,
|
||||
.int_type = INTERRUPT_TYPE_MSIX,
|
||||
};
|
||||
|
||||
@@ -229,7 +232,7 @@ static int msi_msix_flags_write(struct pci_dev *dev, int offset, u16 new_value,
|
||||
return 0;
|
||||
|
||||
if (!dev_data->allow_interrupt_control ||
|
||||
(new_value ^ old_value) & ~field_config->enable_bit)
|
||||
(new_value ^ old_value) & ~field_config->allowed_bits)
|
||||
return PCIBIOS_SET_FAILED;
|
||||
|
||||
if (new_value & field_config->enable_bit) {
|
||||
|
@@ -2811,6 +2811,8 @@ static int btrfs_ioctl_get_subvol_info(struct file *file, void __user *argp)
|
||||
}
|
||||
}
|
||||
|
||||
btrfs_free_path(path);
|
||||
path = NULL;
|
||||
if (copy_to_user(argp, subvol_info, sizeof(*subvol_info)))
|
||||
ret = -EFAULT;
|
||||
|
||||
@@ -2903,6 +2905,8 @@ static int btrfs_ioctl_get_subvol_rootref(struct file *file, void __user *argp)
|
||||
}
|
||||
|
||||
out:
|
||||
btrfs_free_path(path);
|
||||
|
||||
if (!ret || ret == -EOVERFLOW) {
|
||||
rootrefs->num_items = found;
|
||||
/* update min_treeid for next search */
|
||||
@@ -2914,7 +2918,6 @@ out:
|
||||
}
|
||||
|
||||
kfree(rootrefs);
|
||||
btrfs_free_path(path);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -3878,6 +3881,8 @@ static long btrfs_ioctl_ino_to_path(struct btrfs_root *root, void __user *arg)
|
||||
ipath->fspath->val[i] = rel_ptr;
|
||||
}
|
||||
|
||||
btrfs_free_path(path);
|
||||
path = NULL;
|
||||
ret = copy_to_user((void __user *)(unsigned long)ipa->fspath,
|
||||
ipath->fspath, size);
|
||||
if (ret) {
|
||||
|
@@ -1767,8 +1767,11 @@ int __init btrfs_init_sysfs(void)
|
||||
|
||||
#ifdef CONFIG_BTRFS_DEBUG
|
||||
ret = sysfs_create_group(&btrfs_kset->kobj, &btrfs_debug_feature_attr_group);
|
||||
if (ret)
|
||||
goto out2;
|
||||
if (ret) {
|
||||
sysfs_unmerge_group(&btrfs_kset->kobj,
|
||||
&btrfs_static_feature_attr_group);
|
||||
goto out_remove_group;
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
|
105
fs/ceph/caps.c
105
fs/ceph/caps.c
@@ -2294,6 +2294,7 @@ static int caps_are_flushed(struct inode *inode, u64 flush_tid)
|
||||
*/
|
||||
static int unsafe_request_wait(struct inode *inode)
|
||||
{
|
||||
struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
struct ceph_mds_request *req1 = NULL, *req2 = NULL;
|
||||
int ret, err = 0;
|
||||
@@ -2313,6 +2314,76 @@ static int unsafe_request_wait(struct inode *inode)
|
||||
}
|
||||
spin_unlock(&ci->i_unsafe_lock);
|
||||
|
||||
/*
|
||||
* Trigger to flush the journal logs in all the relevant MDSes
|
||||
* manually, or in the worst case we must wait at most 5 seconds
|
||||
* to wait the journal logs to be flushed by the MDSes periodically.
|
||||
*/
|
||||
if (req1 || req2) {
|
||||
struct ceph_mds_request *req;
|
||||
struct ceph_mds_session **sessions;
|
||||
struct ceph_mds_session *s;
|
||||
unsigned int max_sessions;
|
||||
int i;
|
||||
|
||||
mutex_lock(&mdsc->mutex);
|
||||
max_sessions = mdsc->max_sessions;
|
||||
|
||||
sessions = kcalloc(max_sessions, sizeof(s), GFP_KERNEL);
|
||||
if (!sessions) {
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
spin_lock(&ci->i_unsafe_lock);
|
||||
if (req1) {
|
||||
list_for_each_entry(req, &ci->i_unsafe_dirops,
|
||||
r_unsafe_dir_item) {
|
||||
s = req->r_session;
|
||||
if (!s)
|
||||
continue;
|
||||
if (!sessions[s->s_mds]) {
|
||||
s = ceph_get_mds_session(s);
|
||||
sessions[s->s_mds] = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (req2) {
|
||||
list_for_each_entry(req, &ci->i_unsafe_iops,
|
||||
r_unsafe_target_item) {
|
||||
s = req->r_session;
|
||||
if (!s)
|
||||
continue;
|
||||
if (!sessions[s->s_mds]) {
|
||||
s = ceph_get_mds_session(s);
|
||||
sessions[s->s_mds] = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
spin_unlock(&ci->i_unsafe_lock);
|
||||
|
||||
/* the auth MDS */
|
||||
spin_lock(&ci->i_ceph_lock);
|
||||
if (ci->i_auth_cap) {
|
||||
s = ci->i_auth_cap->session;
|
||||
if (!sessions[s->s_mds])
|
||||
sessions[s->s_mds] = ceph_get_mds_session(s);
|
||||
}
|
||||
spin_unlock(&ci->i_ceph_lock);
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
|
||||
/* send flush mdlog request to MDSes */
|
||||
for (i = 0; i < max_sessions; i++) {
|
||||
s = sessions[i];
|
||||
if (s) {
|
||||
send_flush_mdlog(s);
|
||||
ceph_put_mds_session(s);
|
||||
}
|
||||
}
|
||||
kfree(sessions);
|
||||
}
|
||||
|
||||
dout("unsafe_request_wait %p wait on tid %llu %llu\n",
|
||||
inode, req1 ? req1->r_tid : 0ULL, req2 ? req2->r_tid : 0ULL);
|
||||
if (req1) {
|
||||
@@ -2320,15 +2391,19 @@ static int unsafe_request_wait(struct inode *inode)
|
||||
ceph_timeout_jiffies(req1->r_timeout));
|
||||
if (ret)
|
||||
err = -EIO;
|
||||
ceph_mdsc_put_request(req1);
|
||||
}
|
||||
if (req2) {
|
||||
ret = !wait_for_completion_timeout(&req2->r_safe_completion,
|
||||
ceph_timeout_jiffies(req2->r_timeout));
|
||||
if (ret)
|
||||
err = -EIO;
|
||||
ceph_mdsc_put_request(req2);
|
||||
}
|
||||
|
||||
out:
|
||||
if (req1)
|
||||
ceph_mdsc_put_request(req1);
|
||||
if (req2)
|
||||
ceph_mdsc_put_request(req2);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -4310,33 +4385,9 @@ static void flush_dirty_session_caps(struct ceph_mds_session *s)
|
||||
dout("flush_dirty_caps done\n");
|
||||
}
|
||||
|
||||
static void iterate_sessions(struct ceph_mds_client *mdsc,
|
||||
void (*cb)(struct ceph_mds_session *))
|
||||
{
|
||||
int mds;
|
||||
|
||||
mutex_lock(&mdsc->mutex);
|
||||
for (mds = 0; mds < mdsc->max_sessions; ++mds) {
|
||||
struct ceph_mds_session *s;
|
||||
|
||||
if (!mdsc->sessions[mds])
|
||||
continue;
|
||||
|
||||
s = ceph_get_mds_session(mdsc->sessions[mds]);
|
||||
if (!s)
|
||||
continue;
|
||||
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
cb(s);
|
||||
ceph_put_mds_session(s);
|
||||
mutex_lock(&mdsc->mutex);
|
||||
}
|
||||
mutex_unlock(&mdsc->mutex);
|
||||
}
|
||||
|
||||
void ceph_flush_dirty_caps(struct ceph_mds_client *mdsc)
|
||||
{
|
||||
iterate_sessions(mdsc, flush_dirty_session_caps);
|
||||
ceph_mdsc_iterate_sessions(mdsc, flush_dirty_session_caps, true);
|
||||
}
|
||||
|
||||
void __ceph_touch_fmode(struct ceph_inode_info *ci,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user