This is the 4.19.146 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl9jTJEACgkQONu9yGCS aT7XARAAo0FTpcnk62Aqo+Wv1BZOFtDxXTHPsW/1CzK2lebub4CGM0y7cNYBf8XP aEytk/RHKhh+F27htxuHZ6T+izQuWbJaM2h7LDwgaWTlmRh2FPEHTI3iwAgzVnM6 7V5OOcAWkC49CpnsBgEQX++R1SgttHypS+/naZpjeGJwd/ivjLSCBqxqiWt1IT1W Qo/LeOjQEbI58lln/3qS9zs0OLByJ/6Y8poYREngof2sbxaOARk8u1gWefe9kuYG jYcAKFFj3GGMrK+y5V9R6I/XoAB7/DQA/+LTlrLKuqxMXT+fzgLFFd9Yn/LORiYh hlNfvXDTvRL+aZ2LUGXhkUyU24dcO500HxHN7mp5TmWOVgkCa8lruCW5Vu3YLQ0u aXajrc9SGJJ9OZSb9Pm5oCkzIN0Io7GIkNaB5qIErur7egFC4/F5wZdShxnrcJhX yQRCIgCtQk1HoOuQkAKcaq6o/BjDkuOjFleu30JF+EMWm2KjQMN46td6tAnrxVdW CjXQzjYJxnLphZzKwUndmjekZk+OcAgw1E9Qud9F19R306PrL+eVmndh3PZyhNCF tga5vmB0acwWSRMRDsGncR3aG3WUt+xLhCy9gER/8amSJm6bBO9ENCJvALFksEJo T6t2UvMksr6R1ZqrP66EiJjBCgyyfhEhnctLKvW63yNNjcxhmZs= =3vVI -----END PGP SIGNATURE----- Merge 4.19.146 into android-4.19-stable Changes in 4.19.146 ARM: dts: logicpd-torpedo-baseboard: Fix broken audio ARM: dts: logicpd-som-lv-baseboard: Fix broken audio ARM: dts: socfpga: fix register entry for timer3 on Arria10 ARM: dts: ls1021a: fix QuadSPI-memory reg range RDMA/rxe: Fix memleak in rxe_mem_init_user RDMA/rxe: Drop pointless checks in rxe_init_ports RDMA/bnxt_re: Do not report transparent vlan from QP1 drm/sun4i: Fix dsi dcs long write function scsi: libsas: Set data_dir as DMA_NONE if libata marks qc as NODATA RDMA/core: Fix reported speed and width mmc: sdhci-msm: Add retries when all tuning phases are found valid ARM: dts: bcm: HR2: Fixed QSPI compatible string ARM: dts: NSP: Fixed QSPI compatible string ARM: dts: BCM5301X: Fixed QSPI compatible string arm64: dts: ns2: Fixed QSPI compatible string ARC: HSDK: wireup perf irq dmaengine: acpi: Put the CSRT table after using it netfilter: conntrack: allow sctp hearbeat after connection re-use drivers/net/wan/lapbether: Added needed_tailroom NFC: st95hf: Fix memleak in st95hf_in_send_cmd firestream: Fix memleak in fs_open ALSA: hda: Fix 2 channel swapping for Tegra drivers/net/wan/lapbether: Set network_header before transmitting xfs: initialize the shortform attr header padding entry irqchip/eznps: Fix build error for !ARC700 builds nvme-fabrics: don't check state NVME_CTRL_NEW for request acceptance nvme-rdma: serialize controller teardown sequences HID: quirks: Set INCREMENT_USAGE_ON_DUPLICATE for all Saitek X52 devices drivers/net/wan/hdlc_cisco: Add hard_header_len HID: elan: Fix memleak in elan_input_configured ARC: [plat-hsdk]: Switch ethernet phy-mode to rgmii-id cpufreq: intel_pstate: Refuse to turn off with HWP enabled cpufreq: intel_pstate: Fix intel_pstate_get_hwp_max() for turbo disabled ALSA: hda: fix a runtime pm issue in SOF when integrated GPU is disabled drm/amdgpu: Fix bug in reporting voltage for CIK iommu/amd: Do not use IOMMUv2 functionality when SME is active gcov: Disable gcov build with GCC 10 iio: adc: mcp3422: fix locking scope iio: adc: mcp3422: fix locking on error path iio: adc: ti-ads1015: fix conversion when CONFIG_PM is not set iio:light:ltr501 Fix timestamp alignment issue. iio:accel:bmc150-accel: Fix timestamp alignment and prevent data leak. iio:adc:ti-adc084s021 Fix alignment and data leak issues. iio:adc:ina2xx Fix timestamp alignment issue. iio:adc:max1118 Fix alignment of timestamp and data leak issues iio:adc:ti-adc081c Fix alignment and data leak issues iio:magnetometer:ak8975 Fix alignment and data leak issues. iio:light:max44000 Fix timestamp alignment and prevent data leak. iio:chemical:ccs811: Fix timestamp alignment and prevent data leak. iio: accel: kxsd9: Fix alignment of local buffer. iio:accel:mma7455: Fix timestamp alignment and prevent data leak. iio:accel:mma8452: Fix timestamp alignment and prevent data leak. staging: wlan-ng: fix out of bounds read in prism2sta_probe_usb() btrfs: require only sector size alignment for parent eb bytenr btrfs: fix lockdep splat in add_missing_dev btrfs: fix wrong address when faulting in pages in the search ioctl regulator: push allocation in set_consumer_device_supply() out of lock scsi: target: iscsi: Fix data digest calculation scsi: target: iscsi: Fix hang in iscsit_access_np() when getting tpg->np_login_sem drm/tve200: Stabilize enable/disable drm/msm: Disable preemption on all 5xx targets rbd: require global CAP_SYS_ADMIN for mapping and unmapping RDMA/rxe: Fix the parent sysfs read when the interface has 15 chars vgacon: remove software scrollback support fbcon: remove soft scrollback code fbcon: remove now unusued 'softback_lines' cursor() argument KVM: VMX: Don't freeze guest when event delivery causes an APIC-access exit ARM: dts: vfxxx: Add syscon compatible with OCOTP video: fbdev: fix OOB read in vga_8planes_imageblit() staging: greybus: audio: fix uninitialized value issue phy: qcom-qmp: Use correct values for ipq8074 PCIe Gen2 PHY init usb: core: fix slab-out-of-bounds Read in read_descriptors USB: serial: ftdi_sio: add IDs for Xsens Mti USB converter USB: serial: option: support dynamic Quectel USB compositions USB: serial: option: add support for SIM7070/SIM7080/SIM7090 modules usb: Fix out of sync data toggle if a configured device is reconfigured usb: typec: ucsi: acpi: Check the _DEP dependencies gcov: add support for GCC 10.1 Linux 4.19.146 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ic9b467bc37c7cbbc1e9704d662bc0c8fda05416e
This commit is contained in:
commit
443485d847
92 changed files with 505 additions and 877 deletions
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 19
|
PATCHLEVEL = 19
|
||||||
SUBLEVEL = 145
|
SUBLEVEL = 146
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = "People's Front"
|
NAME = "People's Front"
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,8 @@
|
||||||
|
|
||||||
arcpct: pct {
|
arcpct: pct {
|
||||||
compatible = "snps,archs-pct";
|
compatible = "snps,archs-pct";
|
||||||
|
interrupt-parent = <&cpu_intc>;
|
||||||
|
interrupts = <20>;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* TIMER0 with interrupt for clockevent */
|
/* TIMER0 with interrupt for clockevent */
|
||||||
|
@ -173,7 +175,7 @@
|
||||||
reg = <0x8000 0x2000>;
|
reg = <0x8000 0x2000>;
|
||||||
interrupts = <10>;
|
interrupts = <10>;
|
||||||
interrupt-names = "macirq";
|
interrupt-names = "macirq";
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii-id";
|
||||||
snps,pbl = <32>;
|
snps,pbl = <32>;
|
||||||
snps,multicast-filter-bins = <256>;
|
snps,multicast-filter-bins = <256>;
|
||||||
clocks = <&gmacclk>;
|
clocks = <&gmacclk>;
|
||||||
|
@ -191,7 +193,7 @@
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "snps,dwmac-mdio";
|
compatible = "snps,dwmac-mdio";
|
||||||
phy0: ethernet-phy@0 {
|
phy0: ethernet-phy@0 { /* Micrel KSZ9031 */
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
|
ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
|
||||||
ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
|
ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
|
||||||
|
|
|
@ -43,7 +43,6 @@
|
||||||
#define CTOP_AUX_DPC (CTOP_AUX_BASE + 0x02C)
|
#define CTOP_AUX_DPC (CTOP_AUX_BASE + 0x02C)
|
||||||
#define CTOP_AUX_LPC (CTOP_AUX_BASE + 0x030)
|
#define CTOP_AUX_LPC (CTOP_AUX_BASE + 0x030)
|
||||||
#define CTOP_AUX_EFLAGS (CTOP_AUX_BASE + 0x080)
|
#define CTOP_AUX_EFLAGS (CTOP_AUX_BASE + 0x080)
|
||||||
#define CTOP_AUX_IACK (CTOP_AUX_BASE + 0x088)
|
|
||||||
#define CTOP_AUX_GPA1 (CTOP_AUX_BASE + 0x08C)
|
#define CTOP_AUX_GPA1 (CTOP_AUX_BASE + 0x08C)
|
||||||
#define CTOP_AUX_UDMC (CTOP_AUX_BASE + 0x300)
|
#define CTOP_AUX_UDMC (CTOP_AUX_BASE + 0x300)
|
||||||
|
|
||||||
|
|
|
@ -217,7 +217,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
qspi: spi@27200 {
|
qspi: spi@27200 {
|
||||||
compatible = "brcm,spi-bcm-qspi", "brcm,spi-nsp-qspi";
|
compatible = "brcm,spi-nsp-qspi", "brcm,spi-bcm-qspi";
|
||||||
reg = <0x027200 0x184>,
|
reg = <0x027200 0x184>,
|
||||||
<0x027000 0x124>,
|
<0x027000 0x124>,
|
||||||
<0x11c408 0x004>,
|
<0x11c408 0x004>,
|
||||||
|
|
|
@ -274,7 +274,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
qspi: spi@27200 {
|
qspi: spi@27200 {
|
||||||
compatible = "brcm,spi-bcm-qspi", "brcm,spi-nsp-qspi";
|
compatible = "brcm,spi-nsp-qspi", "brcm,spi-bcm-qspi";
|
||||||
reg = <0x027200 0x184>,
|
reg = <0x027200 0x184>,
|
||||||
<0x027000 0x124>,
|
<0x027000 0x124>,
|
||||||
<0x11c408 0x004>,
|
<0x11c408 0x004>,
|
||||||
|
|
|
@ -445,7 +445,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
spi@18029200 {
|
spi@18029200 {
|
||||||
compatible = "brcm,spi-bcm-qspi", "brcm,spi-nsp-qspi";
|
compatible = "brcm,spi-nsp-qspi", "brcm,spi-bcm-qspi";
|
||||||
reg = <0x18029200 0x184>,
|
reg = <0x18029200 0x184>,
|
||||||
<0x18029000 0x124>,
|
<0x18029000 0x124>,
|
||||||
<0x1811b408 0x004>,
|
<0x1811b408 0x004>,
|
||||||
|
|
|
@ -55,6 +55,8 @@
|
||||||
|
|
||||||
&mcbsp2 {
|
&mcbsp2 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&mcbsp2_pins>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&charger {
|
&charger {
|
||||||
|
|
|
@ -84,6 +84,8 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&mcbsp2 {
|
&mcbsp2 {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&mcbsp2_pins>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -168,7 +168,7 @@
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
reg = <0x0 0x1550000 0x0 0x10000>,
|
reg = <0x0 0x1550000 0x0 0x10000>,
|
||||||
<0x0 0x40000000 0x0 0x40000000>;
|
<0x0 0x40000000 0x0 0x20000000>;
|
||||||
reg-names = "QuadSPI", "QuadSPI-memory";
|
reg-names = "QuadSPI", "QuadSPI-memory";
|
||||||
interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clock-names = "qspi_en", "qspi";
|
clock-names = "qspi_en", "qspi";
|
||||||
|
|
|
@ -791,7 +791,7 @@
|
||||||
timer3: timer3@ffd00100 {
|
timer3: timer3@ffd00100 {
|
||||||
compatible = "snps,dw-apb-timer";
|
compatible = "snps,dw-apb-timer";
|
||||||
interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
reg = <0xffd01000 0x100>;
|
reg = <0xffd00100 0x100>;
|
||||||
clocks = <&l4_sys_free_clk>;
|
clocks = <&l4_sys_free_clk>;
|
||||||
clock-names = "timer";
|
clock-names = "timer";
|
||||||
};
|
};
|
||||||
|
|
|
@ -532,7 +532,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
ocotp: ocotp@400a5000 {
|
ocotp: ocotp@400a5000 {
|
||||||
compatible = "fsl,vf610-ocotp";
|
compatible = "fsl,vf610-ocotp", "syscon";
|
||||||
reg = <0x400a5000 0x1000>;
|
reg = <0x400a5000 0x1000>;
|
||||||
clocks = <&clks VF610_CLK_OCOTP>;
|
clocks = <&clks VF610_CLK_OCOTP>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -745,7 +745,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
qspi: spi@66470200 {
|
qspi: spi@66470200 {
|
||||||
compatible = "brcm,spi-bcm-qspi", "brcm,spi-ns2-qspi";
|
compatible = "brcm,spi-ns2-qspi", "brcm,spi-bcm-qspi";
|
||||||
reg = <0x66470200 0x184>,
|
reg = <0x66470200 0x184>,
|
||||||
<0x66470000 0x124>,
|
<0x66470000 0x124>,
|
||||||
<0x67017408 0x004>,
|
<0x67017408 0x004>,
|
||||||
|
|
|
@ -110,7 +110,6 @@ CONFIG_FB_NVIDIA=y
|
||||||
CONFIG_FB_NVIDIA_I2C=y
|
CONFIG_FB_NVIDIA_I2C=y
|
||||||
CONFIG_FB_RADEON=y
|
CONFIG_FB_RADEON=y
|
||||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||||
CONFIG_VGACON_SOFT_SCROLLBACK=y
|
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_SOUND=y
|
CONFIG_SOUND=y
|
||||||
CONFIG_SND=y
|
CONFIG_SND=y
|
||||||
|
|
|
@ -779,7 +779,6 @@ CONFIG_FB_TRIDENT=m
|
||||||
CONFIG_FB_SM501=m
|
CONFIG_FB_SM501=m
|
||||||
CONFIG_FB_IBM_GXT4500=y
|
CONFIG_FB_IBM_GXT4500=y
|
||||||
CONFIG_LCD_PLATFORM=m
|
CONFIG_LCD_PLATFORM=m
|
||||||
CONFIG_VGACON_SOFT_SCROLLBACK=y
|
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
|
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
|
|
|
@ -216,7 +216,6 @@ CONFIG_FB_MODE_HELPERS=y
|
||||||
CONFIG_FB_TILEBLITTING=y
|
CONFIG_FB_TILEBLITTING=y
|
||||||
CONFIG_FB_EFI=y
|
CONFIG_FB_EFI=y
|
||||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||||
CONFIG_VGACON_SOFT_SCROLLBACK=y
|
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
# CONFIG_LOGO_LINUX_MONO is not set
|
# CONFIG_LOGO_LINUX_MONO is not set
|
||||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||||
|
|
|
@ -212,7 +212,6 @@ CONFIG_FB_MODE_HELPERS=y
|
||||||
CONFIG_FB_TILEBLITTING=y
|
CONFIG_FB_TILEBLITTING=y
|
||||||
CONFIG_FB_EFI=y
|
CONFIG_FB_EFI=y
|
||||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||||
CONFIG_VGACON_SOFT_SCROLLBACK=y
|
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
# CONFIG_LOGO_LINUX_MONO is not set
|
# CONFIG_LOGO_LINUX_MONO is not set
|
||||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||||
|
|
|
@ -10128,6 +10128,7 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu)
|
||||||
(exit_reason != EXIT_REASON_EXCEPTION_NMI &&
|
(exit_reason != EXIT_REASON_EXCEPTION_NMI &&
|
||||||
exit_reason != EXIT_REASON_EPT_VIOLATION &&
|
exit_reason != EXIT_REASON_EPT_VIOLATION &&
|
||||||
exit_reason != EXIT_REASON_PML_FULL &&
|
exit_reason != EXIT_REASON_PML_FULL &&
|
||||||
|
exit_reason != EXIT_REASON_APIC_ACCESS &&
|
||||||
exit_reason != EXIT_REASON_TASK_SWITCH)) {
|
exit_reason != EXIT_REASON_TASK_SWITCH)) {
|
||||||
vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
||||||
vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_DELIVERY_EV;
|
vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_DELIVERY_EV;
|
||||||
|
|
|
@ -1013,6 +1013,7 @@ static int fs_open(struct atm_vcc *atm_vcc)
|
||||||
error = make_rate (pcr, r, &tmc0, NULL);
|
error = make_rate (pcr, r, &tmc0, NULL);
|
||||||
if (error) {
|
if (error) {
|
||||||
kfree(tc);
|
kfree(tc);
|
||||||
|
kfree(vcc);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4124,6 +4124,9 @@ static ssize_t rbd_config_info_show(struct device *dev,
|
||||||
{
|
{
|
||||||
struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
|
struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
|
||||||
|
|
||||||
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
return sprintf(buf, "%s\n", rbd_dev->config_info);
|
return sprintf(buf, "%s\n", rbd_dev->config_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4235,6 +4238,9 @@ static ssize_t rbd_image_refresh(struct device *dev,
|
||||||
struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
|
struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
ret = rbd_dev_refresh(rbd_dev);
|
ret = rbd_dev_refresh(rbd_dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -5846,6 +5852,9 @@ static ssize_t do_rbd_add(struct bus_type *bus,
|
||||||
struct rbd_client *rbdc;
|
struct rbd_client *rbdc;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
if (!try_module_get(THIS_MODULE))
|
if (!try_module_get(THIS_MODULE))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
@ -5995,6 +6004,9 @@ static ssize_t do_rbd_remove(struct bus_type *bus,
|
||||||
bool force = false;
|
bool force = false;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
dev_id = -1;
|
dev_id = -1;
|
||||||
opt_buf[0] = '\0';
|
opt_buf[0] = '\0';
|
||||||
sscanf(buf, "%d %5s", &dev_id, opt_buf);
|
sscanf(buf, "%d %5s", &dev_id, opt_buf);
|
||||||
|
|
|
@ -712,7 +712,7 @@ static void intel_pstate_get_hwp_max(unsigned int cpu, int *phy_max,
|
||||||
|
|
||||||
rdmsrl_on_cpu(cpu, MSR_HWP_CAPABILITIES, &cap);
|
rdmsrl_on_cpu(cpu, MSR_HWP_CAPABILITIES, &cap);
|
||||||
WRITE_ONCE(all_cpu_data[cpu]->hwp_cap_cached, cap);
|
WRITE_ONCE(all_cpu_data[cpu]->hwp_cap_cached, cap);
|
||||||
if (global.no_turbo)
|
if (global.no_turbo || global.turbo_disabled)
|
||||||
*current_max = HWP_GUARANTEED_PERF(cap);
|
*current_max = HWP_GUARANTEED_PERF(cap);
|
||||||
else
|
else
|
||||||
*current_max = HWP_HIGHEST_PERF(cap);
|
*current_max = HWP_HIGHEST_PERF(cap);
|
||||||
|
@ -2325,9 +2325,15 @@ static int intel_pstate_update_status(const char *buf, size_t size)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (size == 3 && !strncmp(buf, "off", size))
|
if (size == 3 && !strncmp(buf, "off", size)) {
|
||||||
return intel_pstate_driver ?
|
if (!intel_pstate_driver)
|
||||||
intel_pstate_unregister_driver() : -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (hwp_active)
|
||||||
|
return -EBUSY;
|
||||||
|
|
||||||
|
return intel_pstate_unregister_driver();
|
||||||
|
}
|
||||||
|
|
||||||
if (size == 6 && !strncmp(buf, "active", size)) {
|
if (size == 6 && !strncmp(buf, "active", size)) {
|
||||||
if (intel_pstate_driver) {
|
if (intel_pstate_driver) {
|
||||||
|
|
|
@ -131,11 +131,13 @@ static void acpi_dma_parse_csrt(struct acpi_device *adev, struct acpi_dma *adma)
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_warn(&adev->dev,
|
dev_warn(&adev->dev,
|
||||||
"error in parsing resource group\n");
|
"error in parsing resource group\n");
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
grp = (struct acpi_csrt_group *)((void *)grp + grp->length);
|
grp = (struct acpi_csrt_group *)((void *)grp + grp->length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
acpi_put_table((struct acpi_table_header *)csrt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3566,7 +3566,8 @@ static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
||||||
case AMDGPU_PP_SENSOR_GPU_POWER:
|
case AMDGPU_PP_SENSOR_GPU_POWER:
|
||||||
return smu7_get_gpu_power(hwmgr, (uint32_t *)value);
|
return smu7_get_gpu_power(hwmgr, (uint32_t *)value);
|
||||||
case AMDGPU_PP_SENSOR_VDDGFX:
|
case AMDGPU_PP_SENSOR_VDDGFX:
|
||||||
if ((data->vr_config & 0xff) == 0x2)
|
if ((data->vr_config & VRCONF_VDDGFX_MASK) ==
|
||||||
|
(VR_SVI2_PLANE_2 << VRCONF_VDDGFX_SHIFT))
|
||||||
val_vid = PHM_READ_INDIRECT_FIELD(hwmgr->device,
|
val_vid = PHM_READ_INDIRECT_FIELD(hwmgr->device,
|
||||||
CGS_IND_REG__SMC, PWR_SVI2_STATUS, PLANE2_VID);
|
CGS_IND_REG__SMC, PWR_SVI2_STATUS, PLANE2_VID);
|
||||||
else
|
else
|
||||||
|
|
|
@ -1518,7 +1518,8 @@ struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
|
||||||
|
|
||||||
check_speed_bin(&pdev->dev);
|
check_speed_bin(&pdev->dev);
|
||||||
|
|
||||||
ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 4);
|
/* Restricting nr_rings to 1 to temporarily disable preemption */
|
||||||
|
ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 1);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
a5xx_destroy(&(a5xx_gpu->base.base));
|
a5xx_destroy(&(a5xx_gpu->base.base));
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
|
|
@ -761,7 +761,7 @@ static int sun6i_dsi_dcs_write_long(struct sun6i_dsi *dsi,
|
||||||
regmap_write(dsi->regs, SUN6I_DSI_CMD_TX_REG(0),
|
regmap_write(dsi->regs, SUN6I_DSI_CMD_TX_REG(0),
|
||||||
sun6i_dsi_dcs_build_pkt_hdr(dsi, msg));
|
sun6i_dsi_dcs_build_pkt_hdr(dsi, msg));
|
||||||
|
|
||||||
bounce = kzalloc(msg->tx_len + sizeof(crc), GFP_KERNEL);
|
bounce = kzalloc(ALIGN(msg->tx_len + sizeof(crc), 4), GFP_KERNEL);
|
||||||
if (!bounce)
|
if (!bounce)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -772,7 +772,7 @@ static int sun6i_dsi_dcs_write_long(struct sun6i_dsi *dsi,
|
||||||
memcpy((u8 *)bounce + msg->tx_len, &crc, sizeof(crc));
|
memcpy((u8 *)bounce + msg->tx_len, &crc, sizeof(crc));
|
||||||
len += sizeof(crc);
|
len += sizeof(crc);
|
||||||
|
|
||||||
regmap_bulk_write(dsi->regs, SUN6I_DSI_CMD_TX_REG(1), bounce, len);
|
regmap_bulk_write(dsi->regs, SUN6I_DSI_CMD_TX_REG(1), bounce, DIV_ROUND_UP(len, 4));
|
||||||
regmap_write(dsi->regs, SUN6I_DSI_CMD_CTL_REG, len + 4 - 1);
|
regmap_write(dsi->regs, SUN6I_DSI_CMD_CTL_REG, len + 4 - 1);
|
||||||
kfree(bounce);
|
kfree(bounce);
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
#include <linux/dma-buf.h>
|
#include <linux/dma-buf.h>
|
||||||
#include <linux/of_graph.h>
|
#include <linux/of_graph.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
|
||||||
#include <drm/drmP.h>
|
#include <drm/drmP.h>
|
||||||
#include <drm/drm_panel.h>
|
#include <drm/drm_panel.h>
|
||||||
|
@ -132,9 +133,25 @@ static void tve200_display_enable(struct drm_simple_display_pipe *pipe,
|
||||||
struct drm_connector *connector = priv->connector;
|
struct drm_connector *connector = priv->connector;
|
||||||
u32 format = fb->format->format;
|
u32 format = fb->format->format;
|
||||||
u32 ctrl1 = 0;
|
u32 ctrl1 = 0;
|
||||||
|
int retries;
|
||||||
|
|
||||||
clk_prepare_enable(priv->clk);
|
clk_prepare_enable(priv->clk);
|
||||||
|
|
||||||
|
/* Reset the TVE200 and wait for it to come back online */
|
||||||
|
writel(TVE200_CTRL_4_RESET, priv->regs + TVE200_CTRL_4);
|
||||||
|
for (retries = 0; retries < 5; retries++) {
|
||||||
|
usleep_range(30000, 50000);
|
||||||
|
if (readl(priv->regs + TVE200_CTRL_4) & TVE200_CTRL_4_RESET)
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (retries == 5 &&
|
||||||
|
readl(priv->regs + TVE200_CTRL_4) & TVE200_CTRL_4_RESET) {
|
||||||
|
dev_err(drm->dev, "can't get hardware out of reset\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Function 1 */
|
/* Function 1 */
|
||||||
ctrl1 |= TVE200_CTRL_CSMODE;
|
ctrl1 |= TVE200_CTRL_CSMODE;
|
||||||
/* Interlace mode for CCIR656: parameterize? */
|
/* Interlace mode for CCIR656: parameterize? */
|
||||||
|
@ -231,8 +248,9 @@ static void tve200_display_disable(struct drm_simple_display_pipe *pipe)
|
||||||
|
|
||||||
drm_crtc_vblank_off(crtc);
|
drm_crtc_vblank_off(crtc);
|
||||||
|
|
||||||
/* Disable and Power Down */
|
/* Disable put into reset and Power Down */
|
||||||
writel(0, priv->regs + TVE200_CTRL);
|
writel(0, priv->regs + TVE200_CTRL);
|
||||||
|
writel(TVE200_CTRL_4_RESET, priv->regs + TVE200_CTRL_4);
|
||||||
|
|
||||||
clk_disable_unprepare(priv->clk);
|
clk_disable_unprepare(priv->clk);
|
||||||
}
|
}
|
||||||
|
@ -280,6 +298,8 @@ static int tve200_display_enable_vblank(struct drm_simple_display_pipe *pipe)
|
||||||
struct drm_device *drm = crtc->dev;
|
struct drm_device *drm = crtc->dev;
|
||||||
struct tve200_drm_dev_private *priv = drm->dev_private;
|
struct tve200_drm_dev_private *priv = drm->dev_private;
|
||||||
|
|
||||||
|
/* Clear any IRQs and enable */
|
||||||
|
writel(0xFF, priv->regs + TVE200_INT_CLR);
|
||||||
writel(TVE200_INT_V_STATUS, priv->regs + TVE200_INT_EN);
|
writel(TVE200_INT_V_STATUS, priv->regs + TVE200_INT_EN);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,6 +192,7 @@ static int elan_input_configured(struct hid_device *hdev, struct hid_input *hi)
|
||||||
ret = input_mt_init_slots(input, ELAN_MAX_FINGERS, INPUT_MT_POINTER);
|
ret = input_mt_init_slots(input, ELAN_MAX_FINGERS, INPUT_MT_POINTER);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
hid_err(hdev, "Failed to init elan MT slots: %d\n", ret);
|
hid_err(hdev, "Failed to init elan MT slots: %d\n", ret);
|
||||||
|
input_free_device(input);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,6 +203,7 @@ static int elan_input_configured(struct hid_device *hdev, struct hid_input *hi)
|
||||||
if (ret) {
|
if (ret) {
|
||||||
hid_err(hdev, "Failed to register elan input device: %d\n",
|
hid_err(hdev, "Failed to register elan input device: %d\n",
|
||||||
ret);
|
ret);
|
||||||
|
input_mt_destroy_slots(input);
|
||||||
input_free_device(input);
|
input_free_device(input);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -988,6 +988,8 @@
|
||||||
#define USB_DEVICE_ID_SAITEK_RAT9 0x0cfa
|
#define USB_DEVICE_ID_SAITEK_RAT9 0x0cfa
|
||||||
#define USB_DEVICE_ID_SAITEK_MMO7 0x0cd0
|
#define USB_DEVICE_ID_SAITEK_MMO7 0x0cd0
|
||||||
#define USB_DEVICE_ID_SAITEK_X52 0x075c
|
#define USB_DEVICE_ID_SAITEK_X52 0x075c
|
||||||
|
#define USB_DEVICE_ID_SAITEK_X52_2 0x0255
|
||||||
|
#define USB_DEVICE_ID_SAITEK_X52_PRO 0x0762
|
||||||
|
|
||||||
#define USB_VENDOR_ID_SAMSUNG 0x0419
|
#define USB_VENDOR_ID_SAMSUNG 0x0419
|
||||||
#define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001
|
#define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001
|
||||||
|
|
|
@ -147,6 +147,8 @@ static const struct hid_device_id hid_quirks[] = {
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_RETROUSB, USB_DEVICE_ID_RETROUSB_SNES_RETROPORT), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_RETROUSB, USB_DEVICE_ID_RETROUSB_SNES_RETROPORT), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD), HID_QUIRK_BADPAD },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD), HID_QUIRK_BADPAD },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X52), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X52), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X52_2), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_X52_PRO), HID_QUIRK_INCREMENT_USAGE_ON_DUPLICATE },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD2), HID_QUIRK_NO_INIT_REPORTS },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD2), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD), HID_QUIRK_NO_INIT_REPORTS },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SENNHEISER, USB_DEVICE_ID_SENNHEISER_BTD500USB), HID_QUIRK_NOGET },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SENNHEISER, USB_DEVICE_ID_SENNHEISER_BTD500USB), HID_QUIRK_NOGET },
|
||||||
|
|
|
@ -197,6 +197,14 @@ struct bmc150_accel_data {
|
||||||
struct mutex mutex;
|
struct mutex mutex;
|
||||||
u8 fifo_mode, watermark;
|
u8 fifo_mode, watermark;
|
||||||
s16 buffer[8];
|
s16 buffer[8];
|
||||||
|
/*
|
||||||
|
* Ensure there is sufficient space and correct alignment for
|
||||||
|
* the timestamp if enabled
|
||||||
|
*/
|
||||||
|
struct {
|
||||||
|
__le16 channels[3];
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} scan;
|
||||||
u8 bw_bits;
|
u8 bw_bits;
|
||||||
u32 slope_dur;
|
u32 slope_dur;
|
||||||
u32 slope_thres;
|
u32 slope_thres;
|
||||||
|
@ -915,15 +923,16 @@ static int __bmc150_accel_fifo_flush(struct iio_dev *indio_dev,
|
||||||
* now.
|
* now.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
u16 sample[8];
|
|
||||||
int j, bit;
|
int j, bit;
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
||||||
indio_dev->masklength)
|
indio_dev->masklength)
|
||||||
memcpy(&sample[j++], &buffer[i * 3 + bit], 2);
|
memcpy(&data->scan.channels[j++], &buffer[i * 3 + bit],
|
||||||
|
sizeof(data->scan.channels[0]));
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, sample, tstamp);
|
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
||||||
|
tstamp);
|
||||||
|
|
||||||
tstamp += sample_period;
|
tstamp += sample_period;
|
||||||
}
|
}
|
||||||
|
|
|
@ -212,14 +212,20 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void *p)
|
||||||
const struct iio_poll_func *pf = p;
|
const struct iio_poll_func *pf = p;
|
||||||
struct iio_dev *indio_dev = pf->indio_dev;
|
struct iio_dev *indio_dev = pf->indio_dev;
|
||||||
struct kxsd9_state *st = iio_priv(indio_dev);
|
struct kxsd9_state *st = iio_priv(indio_dev);
|
||||||
|
/*
|
||||||
|
* Ensure correct positioning and alignment of timestamp.
|
||||||
|
* No need to zero initialize as all elements written.
|
||||||
|
*/
|
||||||
|
struct {
|
||||||
|
__be16 chan[4];
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} hw_values;
|
||||||
int ret;
|
int ret;
|
||||||
/* 4 * 16bit values AND timestamp */
|
|
||||||
__be16 hw_values[8];
|
|
||||||
|
|
||||||
ret = regmap_bulk_read(st->map,
|
ret = regmap_bulk_read(st->map,
|
||||||
KXSD9_REG_X,
|
KXSD9_REG_X,
|
||||||
&hw_values,
|
hw_values.chan,
|
||||||
8);
|
sizeof(hw_values.chan));
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(st->dev,
|
dev_err(st->dev,
|
||||||
"error reading data\n");
|
"error reading data\n");
|
||||||
|
@ -227,7 +233,7 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev,
|
iio_push_to_buffers_with_timestamp(indio_dev,
|
||||||
hw_values,
|
&hw_values,
|
||||||
iio_get_time_ns(indio_dev));
|
iio_get_time_ns(indio_dev));
|
||||||
iio_trigger_notify_done(indio_dev->trig);
|
iio_trigger_notify_done(indio_dev->trig);
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,14 @@
|
||||||
|
|
||||||
struct mma7455_data {
|
struct mma7455_data {
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
|
/*
|
||||||
|
* Used to reorganize data. Will ensure correct alignment of
|
||||||
|
* the timestamp if present
|
||||||
|
*/
|
||||||
|
struct {
|
||||||
|
__le16 channels[3];
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} scan;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mma7455_drdy(struct mma7455_data *mma7455)
|
static int mma7455_drdy(struct mma7455_data *mma7455)
|
||||||
|
@ -85,19 +93,19 @@ static irqreturn_t mma7455_trigger_handler(int irq, void *p)
|
||||||
struct iio_poll_func *pf = p;
|
struct iio_poll_func *pf = p;
|
||||||
struct iio_dev *indio_dev = pf->indio_dev;
|
struct iio_dev *indio_dev = pf->indio_dev;
|
||||||
struct mma7455_data *mma7455 = iio_priv(indio_dev);
|
struct mma7455_data *mma7455 = iio_priv(indio_dev);
|
||||||
u8 buf[16]; /* 3 x 16-bit channels + padding + ts */
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = mma7455_drdy(mma7455);
|
ret = mma7455_drdy(mma7455);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
ret = regmap_bulk_read(mma7455->regmap, MMA7455_REG_XOUTL, buf,
|
ret = regmap_bulk_read(mma7455->regmap, MMA7455_REG_XOUTL,
|
||||||
sizeof(__le16) * 3);
|
mma7455->scan.channels,
|
||||||
|
sizeof(mma7455->scan.channels));
|
||||||
if (ret)
|
if (ret)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
iio_push_to_buffers_with_timestamp(indio_dev, &mma7455->scan,
|
||||||
iio_get_time_ns(indio_dev));
|
iio_get_time_ns(indio_dev));
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
|
@ -107,6 +107,12 @@ struct mma8452_data {
|
||||||
u8 data_cfg;
|
u8 data_cfg;
|
||||||
const struct mma_chip_info *chip_info;
|
const struct mma_chip_info *chip_info;
|
||||||
int sleep_val;
|
int sleep_val;
|
||||||
|
|
||||||
|
/* Ensure correct alignment of time stamp when present */
|
||||||
|
struct {
|
||||||
|
__be16 channels[3];
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1088,14 +1094,13 @@ static irqreturn_t mma8452_trigger_handler(int irq, void *p)
|
||||||
struct iio_poll_func *pf = p;
|
struct iio_poll_func *pf = p;
|
||||||
struct iio_dev *indio_dev = pf->indio_dev;
|
struct iio_dev *indio_dev = pf->indio_dev;
|
||||||
struct mma8452_data *data = iio_priv(indio_dev);
|
struct mma8452_data *data = iio_priv(indio_dev);
|
||||||
u8 buffer[16]; /* 3 16-bit channels + padding + ts */
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = mma8452_read(data, (__be16 *)buffer);
|
ret = mma8452_read(data, data->buffer.channels);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, buffer,
|
iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer,
|
||||||
iio_get_time_ns(indio_dev));
|
iio_get_time_ns(indio_dev));
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
|
@ -146,6 +146,11 @@ struct ina2xx_chip_info {
|
||||||
int range_vbus; /* Bus voltage maximum in V */
|
int range_vbus; /* Bus voltage maximum in V */
|
||||||
int pga_gain_vshunt; /* Shunt voltage PGA gain */
|
int pga_gain_vshunt; /* Shunt voltage PGA gain */
|
||||||
bool allow_async_readout;
|
bool allow_async_readout;
|
||||||
|
/* data buffer needs space for channel data and timestamp */
|
||||||
|
struct {
|
||||||
|
u16 chan[4];
|
||||||
|
u64 ts __aligned(8);
|
||||||
|
} scan;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ina2xx_config ina2xx_config[] = {
|
static const struct ina2xx_config ina2xx_config[] = {
|
||||||
|
@ -736,8 +741,6 @@ static int ina2xx_conversion_ready(struct iio_dev *indio_dev)
|
||||||
static int ina2xx_work_buffer(struct iio_dev *indio_dev)
|
static int ina2xx_work_buffer(struct iio_dev *indio_dev)
|
||||||
{
|
{
|
||||||
struct ina2xx_chip_info *chip = iio_priv(indio_dev);
|
struct ina2xx_chip_info *chip = iio_priv(indio_dev);
|
||||||
/* data buffer needs space for channel data and timestap */
|
|
||||||
unsigned short data[4 + sizeof(s64)/sizeof(short)];
|
|
||||||
int bit, ret, i = 0;
|
int bit, ret, i = 0;
|
||||||
s64 time;
|
s64 time;
|
||||||
|
|
||||||
|
@ -756,10 +759,10 @@ static int ina2xx_work_buffer(struct iio_dev *indio_dev)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
data[i++] = val;
|
chip->scan.chan[i++] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, data, time);
|
iio_push_to_buffers_with_timestamp(indio_dev, &chip->scan, time);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -38,6 +38,11 @@ struct max1118 {
|
||||||
struct spi_device *spi;
|
struct spi_device *spi;
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
struct regulator *reg;
|
struct regulator *reg;
|
||||||
|
/* Ensure natural alignment of buffer elements */
|
||||||
|
struct {
|
||||||
|
u8 channels[2];
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} scan;
|
||||||
|
|
||||||
u8 data ____cacheline_aligned;
|
u8 data ____cacheline_aligned;
|
||||||
};
|
};
|
||||||
|
@ -162,7 +167,6 @@ static irqreturn_t max1118_trigger_handler(int irq, void *p)
|
||||||
struct iio_poll_func *pf = p;
|
struct iio_poll_func *pf = p;
|
||||||
struct iio_dev *indio_dev = pf->indio_dev;
|
struct iio_dev *indio_dev = pf->indio_dev;
|
||||||
struct max1118 *adc = iio_priv(indio_dev);
|
struct max1118 *adc = iio_priv(indio_dev);
|
||||||
u8 data[16] = { }; /* 2x 8-bit ADC data + padding + 8 bytes timestamp */
|
|
||||||
int scan_index;
|
int scan_index;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
@ -180,10 +184,10 @@ static irqreturn_t max1118_trigger_handler(int irq, void *p)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
data[i] = ret;
|
adc->scan.channels[i] = ret;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, data,
|
iio_push_to_buffers_with_timestamp(indio_dev, &adc->scan,
|
||||||
iio_get_time_ns(indio_dev));
|
iio_get_time_ns(indio_dev));
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&adc->lock);
|
mutex_unlock(&adc->lock);
|
||||||
|
|
|
@ -99,16 +99,12 @@ static int mcp3422_update_config(struct mcp3422 *adc, u8 newconfig)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mutex_lock(&adc->lock);
|
|
||||||
|
|
||||||
ret = i2c_master_send(adc->i2c, &newconfig, 1);
|
ret = i2c_master_send(adc->i2c, &newconfig, 1);
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
adc->config = newconfig;
|
adc->config = newconfig;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&adc->lock);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,6 +137,8 @@ static int mcp3422_read_channel(struct mcp3422 *adc,
|
||||||
u8 config;
|
u8 config;
|
||||||
u8 req_channel = channel->channel;
|
u8 req_channel = channel->channel;
|
||||||
|
|
||||||
|
mutex_lock(&adc->lock);
|
||||||
|
|
||||||
if (req_channel != MCP3422_CHANNEL(adc->config)) {
|
if (req_channel != MCP3422_CHANNEL(adc->config)) {
|
||||||
config = adc->config;
|
config = adc->config;
|
||||||
config &= ~MCP3422_CHANNEL_MASK;
|
config &= ~MCP3422_CHANNEL_MASK;
|
||||||
|
@ -148,12 +146,18 @@ static int mcp3422_read_channel(struct mcp3422 *adc,
|
||||||
config &= ~MCP3422_PGA_MASK;
|
config &= ~MCP3422_PGA_MASK;
|
||||||
config |= MCP3422_PGA_VALUE(adc->pga[req_channel]);
|
config |= MCP3422_PGA_VALUE(adc->pga[req_channel]);
|
||||||
ret = mcp3422_update_config(adc, config);
|
ret = mcp3422_update_config(adc, config);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
|
mutex_unlock(&adc->lock);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
msleep(mcp3422_read_times[MCP3422_SAMPLE_RATE(adc->config)]);
|
msleep(mcp3422_read_times[MCP3422_SAMPLE_RATE(adc->config)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mcp3422_read(adc, value, &config);
|
ret = mcp3422_read(adc, value, &config);
|
||||||
|
|
||||||
|
mutex_unlock(&adc->lock);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mcp3422_read_raw(struct iio_dev *iio,
|
static int mcp3422_read_raw(struct iio_dev *iio,
|
||||||
|
|
|
@ -36,6 +36,12 @@ struct adc081c {
|
||||||
|
|
||||||
/* 8, 10 or 12 */
|
/* 8, 10 or 12 */
|
||||||
int bits;
|
int bits;
|
||||||
|
|
||||||
|
/* Ensure natural alignment of buffer elements */
|
||||||
|
struct {
|
||||||
|
u16 channel;
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} scan;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define REG_CONV_RES 0x00
|
#define REG_CONV_RES 0x00
|
||||||
|
@ -131,14 +137,13 @@ static irqreturn_t adc081c_trigger_handler(int irq, void *p)
|
||||||
struct iio_poll_func *pf = p;
|
struct iio_poll_func *pf = p;
|
||||||
struct iio_dev *indio_dev = pf->indio_dev;
|
struct iio_dev *indio_dev = pf->indio_dev;
|
||||||
struct adc081c *data = iio_priv(indio_dev);
|
struct adc081c *data = iio_priv(indio_dev);
|
||||||
u16 buf[8]; /* 2 bytes data + 6 bytes padding + 8 bytes timestamp */
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = i2c_smbus_read_word_swapped(data->i2c, REG_CONV_RES);
|
ret = i2c_smbus_read_word_swapped(data->i2c, REG_CONV_RES);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
buf[0] = ret;
|
data->scan.channel = ret;
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
||||||
iio_get_time_ns(indio_dev));
|
iio_get_time_ns(indio_dev));
|
||||||
out:
|
out:
|
||||||
iio_trigger_notify_done(indio_dev->trig);
|
iio_trigger_notify_done(indio_dev->trig);
|
||||||
|
|
|
@ -28,6 +28,11 @@ struct adc084s021 {
|
||||||
struct spi_transfer spi_trans;
|
struct spi_transfer spi_trans;
|
||||||
struct regulator *reg;
|
struct regulator *reg;
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
|
/* Buffer used to align data */
|
||||||
|
struct {
|
||||||
|
__be16 channels[4];
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} scan;
|
||||||
/*
|
/*
|
||||||
* DMA (thus cache coherency maintenance) requires the
|
* DMA (thus cache coherency maintenance) requires the
|
||||||
* transfer buffers to live in their own cache line.
|
* transfer buffers to live in their own cache line.
|
||||||
|
@ -143,14 +148,13 @@ static irqreturn_t adc084s021_buffer_trigger_handler(int irq, void *pollfunc)
|
||||||
struct iio_poll_func *pf = pollfunc;
|
struct iio_poll_func *pf = pollfunc;
|
||||||
struct iio_dev *indio_dev = pf->indio_dev;
|
struct iio_dev *indio_dev = pf->indio_dev;
|
||||||
struct adc084s021 *adc = iio_priv(indio_dev);
|
struct adc084s021 *adc = iio_priv(indio_dev);
|
||||||
__be16 data[8] = {0}; /* 4 * 16-bit words of data + 8 bytes timestamp */
|
|
||||||
|
|
||||||
mutex_lock(&adc->lock);
|
mutex_lock(&adc->lock);
|
||||||
|
|
||||||
if (adc084s021_adc_conversion(adc, &data) < 0)
|
if (adc084s021_adc_conversion(adc, adc->scan.channels) < 0)
|
||||||
dev_err(&adc->spi->dev, "Failed to read data\n");
|
dev_err(&adc->spi->dev, "Failed to read data\n");
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, data,
|
iio_push_to_buffers_with_timestamp(indio_dev, &adc->scan,
|
||||||
iio_get_time_ns(indio_dev));
|
iio_get_time_ns(indio_dev));
|
||||||
mutex_unlock(&adc->lock);
|
mutex_unlock(&adc->lock);
|
||||||
iio_trigger_notify_done(indio_dev->trig);
|
iio_trigger_notify_done(indio_dev->trig);
|
||||||
|
|
|
@ -312,6 +312,7 @@ static const struct iio_chan_spec ads1115_channels[] = {
|
||||||
IIO_CHAN_SOFT_TIMESTAMP(ADS1015_TIMESTAMP),
|
IIO_CHAN_SOFT_TIMESTAMP(ADS1015_TIMESTAMP),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
static int ads1015_set_power_state(struct ads1015_data *data, bool on)
|
static int ads1015_set_power_state(struct ads1015_data *data, bool on)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -329,6 +330,15 @@ static int ads1015_set_power_state(struct ads1015_data *data, bool on)
|
||||||
return ret < 0 ? ret : 0;
|
return ret < 0 ? ret : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else /* !CONFIG_PM */
|
||||||
|
|
||||||
|
static int ads1015_set_power_state(struct ads1015_data *data, bool on)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !CONFIG_PM */
|
||||||
|
|
||||||
static
|
static
|
||||||
int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val)
|
int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val)
|
||||||
{
|
{
|
||||||
|
|
|
@ -78,6 +78,11 @@ struct ccs811_data {
|
||||||
struct ccs811_reading buffer;
|
struct ccs811_reading buffer;
|
||||||
struct iio_trigger *drdy_trig;
|
struct iio_trigger *drdy_trig;
|
||||||
bool drdy_trig_on;
|
bool drdy_trig_on;
|
||||||
|
/* Ensures correct alignment of timestamp if present */
|
||||||
|
struct {
|
||||||
|
s16 channels[2];
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} scan;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct iio_chan_spec ccs811_channels[] = {
|
static const struct iio_chan_spec ccs811_channels[] = {
|
||||||
|
@ -309,17 +314,17 @@ static irqreturn_t ccs811_trigger_handler(int irq, void *p)
|
||||||
struct iio_dev *indio_dev = pf->indio_dev;
|
struct iio_dev *indio_dev = pf->indio_dev;
|
||||||
struct ccs811_data *data = iio_priv(indio_dev);
|
struct ccs811_data *data = iio_priv(indio_dev);
|
||||||
struct i2c_client *client = data->client;
|
struct i2c_client *client = data->client;
|
||||||
s16 buf[8]; /* s16 eCO2 + s16 TVOC + padding + 8 byte timestamp */
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = i2c_smbus_read_i2c_block_data(client, CCS811_ALG_RESULT_DATA, 4,
|
ret = i2c_smbus_read_i2c_block_data(client, CCS811_ALG_RESULT_DATA,
|
||||||
(u8 *)&buf);
|
sizeof(data->scan.channels),
|
||||||
|
(u8 *)data->scan.channels);
|
||||||
if (ret != 4) {
|
if (ret != 4) {
|
||||||
dev_err(&client->dev, "cannot read sensor data\n");
|
dev_err(&client->dev, "cannot read sensor data\n");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
||||||
iio_get_time_ns(indio_dev));
|
iio_get_time_ns(indio_dev));
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
|
|
@ -1245,13 +1245,16 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p)
|
||||||
struct iio_poll_func *pf = p;
|
struct iio_poll_func *pf = p;
|
||||||
struct iio_dev *indio_dev = pf->indio_dev;
|
struct iio_dev *indio_dev = pf->indio_dev;
|
||||||
struct ltr501_data *data = iio_priv(indio_dev);
|
struct ltr501_data *data = iio_priv(indio_dev);
|
||||||
u16 buf[8];
|
struct {
|
||||||
|
u16 channels[3];
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} scan;
|
||||||
__le16 als_buf[2];
|
__le16 als_buf[2];
|
||||||
u8 mask = 0;
|
u8 mask = 0;
|
||||||
int j = 0;
|
int j = 0;
|
||||||
int ret, psdata;
|
int ret, psdata;
|
||||||
|
|
||||||
memset(buf, 0, sizeof(buf));
|
memset(&scan, 0, sizeof(scan));
|
||||||
|
|
||||||
/* figure out which data needs to be ready */
|
/* figure out which data needs to be ready */
|
||||||
if (test_bit(0, indio_dev->active_scan_mask) ||
|
if (test_bit(0, indio_dev->active_scan_mask) ||
|
||||||
|
@ -1270,9 +1273,9 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (test_bit(0, indio_dev->active_scan_mask))
|
if (test_bit(0, indio_dev->active_scan_mask))
|
||||||
buf[j++] = le16_to_cpu(als_buf[1]);
|
scan.channels[j++] = le16_to_cpu(als_buf[1]);
|
||||||
if (test_bit(1, indio_dev->active_scan_mask))
|
if (test_bit(1, indio_dev->active_scan_mask))
|
||||||
buf[j++] = le16_to_cpu(als_buf[0]);
|
scan.channels[j++] = le16_to_cpu(als_buf[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mask & LTR501_STATUS_PS_RDY) {
|
if (mask & LTR501_STATUS_PS_RDY) {
|
||||||
|
@ -1280,10 +1283,10 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p)
|
||||||
&psdata, 2);
|
&psdata, 2);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto done;
|
goto done;
|
||||||
buf[j++] = psdata & LTR501_PS_DATA_MASK;
|
scan.channels[j++] = psdata & LTR501_PS_DATA_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
iio_push_to_buffers_with_timestamp(indio_dev, &scan,
|
||||||
iio_get_time_ns(indio_dev));
|
iio_get_time_ns(indio_dev));
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
|
@ -78,6 +78,11 @@
|
||||||
struct max44000_data {
|
struct max44000_data {
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
|
/* Ensure naturally aligned timestamp */
|
||||||
|
struct {
|
||||||
|
u16 channels[2];
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} scan;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Default scale is set to the minimum of 0.03125 or 1 / (1 << 5) lux */
|
/* Default scale is set to the minimum of 0.03125 or 1 / (1 << 5) lux */
|
||||||
|
@ -491,7 +496,6 @@ static irqreturn_t max44000_trigger_handler(int irq, void *p)
|
||||||
struct iio_poll_func *pf = p;
|
struct iio_poll_func *pf = p;
|
||||||
struct iio_dev *indio_dev = pf->indio_dev;
|
struct iio_dev *indio_dev = pf->indio_dev;
|
||||||
struct max44000_data *data = iio_priv(indio_dev);
|
struct max44000_data *data = iio_priv(indio_dev);
|
||||||
u16 buf[8]; /* 2x u16 + padding + 8 bytes timestamp */
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
unsigned int regval;
|
unsigned int regval;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -501,17 +505,17 @@ static irqreturn_t max44000_trigger_handler(int irq, void *p)
|
||||||
ret = max44000_read_alsval(data);
|
ret = max44000_read_alsval(data);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
buf[index++] = ret;
|
data->scan.channels[index++] = ret;
|
||||||
}
|
}
|
||||||
if (test_bit(MAX44000_SCAN_INDEX_PRX, indio_dev->active_scan_mask)) {
|
if (test_bit(MAX44000_SCAN_INDEX_PRX, indio_dev->active_scan_mask)) {
|
||||||
ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, ®val);
|
ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, ®val);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
buf[index] = regval;
|
data->scan.channels[index] = regval;
|
||||||
}
|
}
|
||||||
mutex_unlock(&data->lock);
|
mutex_unlock(&data->lock);
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
||||||
iio_get_time_ns(indio_dev));
|
iio_get_time_ns(indio_dev));
|
||||||
iio_trigger_notify_done(indio_dev->trig);
|
iio_trigger_notify_done(indio_dev->trig);
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
|
|
@ -381,6 +381,12 @@ struct ak8975_data {
|
||||||
struct iio_mount_matrix orientation;
|
struct iio_mount_matrix orientation;
|
||||||
struct regulator *vdd;
|
struct regulator *vdd;
|
||||||
struct regulator *vid;
|
struct regulator *vid;
|
||||||
|
|
||||||
|
/* Ensure natural alignment of timestamp */
|
||||||
|
struct {
|
||||||
|
s16 channels[3];
|
||||||
|
s64 ts __aligned(8);
|
||||||
|
} scan;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Enable attached power regulator if any. */
|
/* Enable attached power regulator if any. */
|
||||||
|
@ -815,7 +821,6 @@ static void ak8975_fill_buffer(struct iio_dev *indio_dev)
|
||||||
const struct i2c_client *client = data->client;
|
const struct i2c_client *client = data->client;
|
||||||
const struct ak_def *def = data->def;
|
const struct ak_def *def = data->def;
|
||||||
int ret;
|
int ret;
|
||||||
s16 buff[8]; /* 3 x 16 bits axis values + 1 aligned 64 bits timestamp */
|
|
||||||
__le16 fval[3];
|
__le16 fval[3];
|
||||||
|
|
||||||
mutex_lock(&data->lock);
|
mutex_lock(&data->lock);
|
||||||
|
@ -838,12 +843,13 @@ static void ak8975_fill_buffer(struct iio_dev *indio_dev)
|
||||||
mutex_unlock(&data->lock);
|
mutex_unlock(&data->lock);
|
||||||
|
|
||||||
/* Clamp to valid range. */
|
/* Clamp to valid range. */
|
||||||
buff[0] = clamp_t(s16, le16_to_cpu(fval[0]), -def->range, def->range);
|
data->scan.channels[0] = clamp_t(s16, le16_to_cpu(fval[0]), -def->range, def->range);
|
||||||
buff[1] = clamp_t(s16, le16_to_cpu(fval[1]), -def->range, def->range);
|
data->scan.channels[1] = clamp_t(s16, le16_to_cpu(fval[1]), -def->range, def->range);
|
||||||
buff[2] = clamp_t(s16, le16_to_cpu(fval[2]), -def->range, def->range);
|
data->scan.channels[2] = clamp_t(s16, le16_to_cpu(fval[2]), -def->range, def->range);
|
||||||
|
|
||||||
iio_push_to_buffers_with_timestamp(indio_dev, buff,
|
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
||||||
iio_get_time_ns(indio_dev));
|
iio_get_time_ns(indio_dev));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
|
|
|
@ -1711,7 +1711,7 @@ int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u8 *speed, u8 *width)
|
||||||
|
|
||||||
dev_put(netdev);
|
dev_put(netdev);
|
||||||
|
|
||||||
if (!rc) {
|
if (!rc && lksettings.base.speed != (u32)SPEED_UNKNOWN) {
|
||||||
netdev_speed = lksettings.base.speed;
|
netdev_speed = lksettings.base.speed;
|
||||||
} else {
|
} else {
|
||||||
netdev_speed = SPEED_1000;
|
netdev_speed = SPEED_1000;
|
||||||
|
|
|
@ -3033,6 +3033,19 @@ static void bnxt_re_process_res_rawqp1_wc(struct ib_wc *wc,
|
||||||
wc->wc_flags |= IB_WC_GRH;
|
wc->wc_flags |= IB_WC_GRH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool bnxt_re_check_if_vlan_valid(struct bnxt_re_dev *rdev,
|
||||||
|
u16 vlan_id)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Check if the vlan is configured in the host. If not configured, it
|
||||||
|
* can be a transparent VLAN. So dont report the vlan id.
|
||||||
|
*/
|
||||||
|
if (!__vlan_find_dev_deep_rcu(rdev->netdev,
|
||||||
|
htons(ETH_P_8021Q), vlan_id))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool bnxt_re_is_vlan_pkt(struct bnxt_qplib_cqe *orig_cqe,
|
static bool bnxt_re_is_vlan_pkt(struct bnxt_qplib_cqe *orig_cqe,
|
||||||
u16 *vid, u8 *sl)
|
u16 *vid, u8 *sl)
|
||||||
{
|
{
|
||||||
|
@ -3101,9 +3114,11 @@ static void bnxt_re_process_res_shadow_qp_wc(struct bnxt_re_qp *qp,
|
||||||
wc->src_qp = orig_cqe->src_qp;
|
wc->src_qp = orig_cqe->src_qp;
|
||||||
memcpy(wc->smac, orig_cqe->smac, ETH_ALEN);
|
memcpy(wc->smac, orig_cqe->smac, ETH_ALEN);
|
||||||
if (bnxt_re_is_vlan_pkt(orig_cqe, &vlan_id, &sl)) {
|
if (bnxt_re_is_vlan_pkt(orig_cqe, &vlan_id, &sl)) {
|
||||||
wc->vlan_id = vlan_id;
|
if (bnxt_re_check_if_vlan_valid(rdev, vlan_id)) {
|
||||||
wc->sl = sl;
|
wc->vlan_id = vlan_id;
|
||||||
wc->wc_flags |= IB_WC_WITH_VLAN;
|
wc->sl = sl;
|
||||||
|
wc->wc_flags |= IB_WC_WITH_VLAN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
wc->port_num = 1;
|
wc->port_num = 1;
|
||||||
wc->vendor_err = orig_cqe->status;
|
wc->vendor_err = orig_cqe->status;
|
||||||
|
|
|
@ -163,9 +163,6 @@ static int rxe_init_ports(struct rxe_dev *rxe)
|
||||||
|
|
||||||
rxe_init_port_param(port);
|
rxe_init_port_param(port);
|
||||||
|
|
||||||
if (!port->attr.pkey_tbl_len || !port->attr.gid_tbl_len)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
port->pkey_tbl = kcalloc(port->attr.pkey_tbl_len,
|
port->pkey_tbl = kcalloc(port->attr.pkey_tbl_len,
|
||||||
sizeof(*port->pkey_tbl), GFP_KERNEL);
|
sizeof(*port->pkey_tbl), GFP_KERNEL);
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,7 @@ int rxe_mem_init_user(struct rxe_pd *pd, u64 start,
|
||||||
vaddr = page_address(sg_page(sg));
|
vaddr = page_address(sg_page(sg));
|
||||||
if (!vaddr) {
|
if (!vaddr) {
|
||||||
pr_warn("null vaddr\n");
|
pr_warn("null vaddr\n");
|
||||||
|
ib_umem_release(umem);
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto err1;
|
goto err1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1146,7 +1146,7 @@ static ssize_t parent_show(struct device *device,
|
||||||
struct rxe_dev *rxe = container_of(device, struct rxe_dev,
|
struct rxe_dev *rxe = container_of(device, struct rxe_dev,
|
||||||
ib_dev.dev);
|
ib_dev.dev);
|
||||||
|
|
||||||
return snprintf(buf, 16, "%s\n", rxe_parent_name(rxe, 1));
|
return scnprintf(buf, PAGE_SIZE, "%s\n", rxe_parent_name(rxe, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEVICE_ATTR_RO(parent);
|
static DEVICE_ATTR_RO(parent);
|
||||||
|
|
|
@ -776,6 +776,13 @@ int amd_iommu_init_device(struct pci_dev *pdev, int pasids)
|
||||||
|
|
||||||
might_sleep();
|
might_sleep();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When memory encryption is active the device is likely not in a
|
||||||
|
* direct-mapped domain. Forbid using IOMMUv2 functionality for now.
|
||||||
|
*/
|
||||||
|
if (mem_encrypt_active())
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
if (!amd_iommu_v2_supported())
|
if (!amd_iommu_v2_supported())
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
|
|
@ -1060,7 +1060,7 @@ static void sdhci_msm_set_cdr(struct sdhci_host *host, bool enable)
|
||||||
static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
||||||
{
|
{
|
||||||
struct sdhci_host *host = mmc_priv(mmc);
|
struct sdhci_host *host = mmc_priv(mmc);
|
||||||
int tuning_seq_cnt = 3;
|
int tuning_seq_cnt = 10;
|
||||||
u8 phase, tuned_phases[16], tuned_phase_cnt = 0;
|
u8 phase, tuned_phases[16], tuned_phase_cnt = 0;
|
||||||
int rc;
|
int rc;
|
||||||
struct mmc_ios ios = host->mmc->ios;
|
struct mmc_ios ios = host->mmc->ios;
|
||||||
|
@ -1124,6 +1124,22 @@ static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
||||||
} while (++phase < ARRAY_SIZE(tuned_phases));
|
} while (++phase < ARRAY_SIZE(tuned_phases));
|
||||||
|
|
||||||
if (tuned_phase_cnt) {
|
if (tuned_phase_cnt) {
|
||||||
|
if (tuned_phase_cnt == ARRAY_SIZE(tuned_phases)) {
|
||||||
|
/*
|
||||||
|
* All phases valid is _almost_ as bad as no phases
|
||||||
|
* valid. Probably all phases are not really reliable
|
||||||
|
* but we didn't detect where the unreliable place is.
|
||||||
|
* That means we'll essentially be guessing and hoping
|
||||||
|
* we get a good phase. Better to try a few times.
|
||||||
|
*/
|
||||||
|
dev_dbg(mmc_dev(mmc), "%s: All phases valid; try again\n",
|
||||||
|
mmc_hostname(mmc));
|
||||||
|
if (--tuning_seq_cnt) {
|
||||||
|
tuned_phase_cnt = 0;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rc = msm_find_most_appropriate_phase(host, tuned_phases,
|
rc = msm_find_most_appropriate_phase(host, tuned_phases,
|
||||||
tuned_phase_cnt);
|
tuned_phase_cnt);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
|
|
|
@ -374,6 +374,7 @@ static int cisco_ioctl(struct net_device *dev, struct ifreq *ifr)
|
||||||
memcpy(&state(hdlc)->settings, &new_settings, size);
|
memcpy(&state(hdlc)->settings, &new_settings, size);
|
||||||
spin_lock_init(&state(hdlc)->lock);
|
spin_lock_init(&state(hdlc)->lock);
|
||||||
dev->header_ops = &cisco_header_ops;
|
dev->header_ops = &cisco_header_ops;
|
||||||
|
dev->hard_header_len = sizeof(struct hdlc_header);
|
||||||
dev->type = ARPHRD_CISCO;
|
dev->type = ARPHRD_CISCO;
|
||||||
call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE, dev);
|
call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE, dev);
|
||||||
netif_dormant_on(dev);
|
netif_dormant_on(dev);
|
||||||
|
|
|
@ -213,6 +213,8 @@ static void lapbeth_data_transmit(struct net_device *ndev, struct sk_buff *skb)
|
||||||
|
|
||||||
skb->dev = dev = lapbeth->ethdev;
|
skb->dev = dev = lapbeth->ethdev;
|
||||||
|
|
||||||
|
skb_reset_network_header(skb);
|
||||||
|
|
||||||
dev_hard_header(skb, dev, ETH_P_DEC, bcast_addr, NULL, 0);
|
dev_hard_header(skb, dev, ETH_P_DEC, bcast_addr, NULL, 0);
|
||||||
|
|
||||||
dev_queue_xmit(skb);
|
dev_queue_xmit(skb);
|
||||||
|
@ -343,6 +345,7 @@ static int lapbeth_new_device(struct net_device *dev)
|
||||||
*/
|
*/
|
||||||
ndev->needed_headroom = -1 + 3 + 2 + dev->hard_header_len
|
ndev->needed_headroom = -1 + 3 + 2 + dev->hard_header_len
|
||||||
+ dev->needed_headroom;
|
+ dev->needed_headroom;
|
||||||
|
ndev->needed_tailroom = dev->needed_tailroom;
|
||||||
|
|
||||||
lapbeth = netdev_priv(ndev);
|
lapbeth = netdev_priv(ndev);
|
||||||
lapbeth->axdev = ndev;
|
lapbeth->axdev = ndev;
|
||||||
|
|
|
@ -981,7 +981,7 @@ static int st95hf_in_send_cmd(struct nfc_digital_dev *ddev,
|
||||||
rc = down_killable(&stcontext->exchange_lock);
|
rc = down_killable(&stcontext->exchange_lock);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
WARN(1, "Semaphore is not found up in st95hf_in_send_cmd\n");
|
WARN(1, "Semaphore is not found up in st95hf_in_send_cmd\n");
|
||||||
return rc;
|
goto free_skb_resp;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = st95hf_spi_send(&stcontext->spicontext, skb->data,
|
rc = st95hf_spi_send(&stcontext->spicontext, skb->data,
|
||||||
|
|
|
@ -577,7 +577,6 @@ bool __nvmf_check_ready(struct nvme_ctrl *ctrl, struct request *rq,
|
||||||
* which is require to set the queue live in the appropinquate states.
|
* which is require to set the queue live in the appropinquate states.
|
||||||
*/
|
*/
|
||||||
switch (ctrl->state) {
|
switch (ctrl->state) {
|
||||||
case NVME_CTRL_NEW:
|
|
||||||
case NVME_CTRL_CONNECTING:
|
case NVME_CTRL_CONNECTING:
|
||||||
if (req->cmd->common.opcode == nvme_fabrics_command &&
|
if (req->cmd->common.opcode == nvme_fabrics_command &&
|
||||||
req->cmd->fabrics.fctype == nvme_fabrics_type_connect)
|
req->cmd->fabrics.fctype == nvme_fabrics_type_connect)
|
||||||
|
|
|
@ -118,6 +118,7 @@ struct nvme_rdma_ctrl {
|
||||||
struct sockaddr_storage src_addr;
|
struct sockaddr_storage src_addr;
|
||||||
|
|
||||||
struct nvme_ctrl ctrl;
|
struct nvme_ctrl ctrl;
|
||||||
|
struct mutex teardown_lock;
|
||||||
bool use_inline_data;
|
bool use_inline_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -880,6 +881,7 @@ static int nvme_rdma_configure_io_queues(struct nvme_rdma_ctrl *ctrl, bool new)
|
||||||
static void nvme_rdma_teardown_admin_queue(struct nvme_rdma_ctrl *ctrl,
|
static void nvme_rdma_teardown_admin_queue(struct nvme_rdma_ctrl *ctrl,
|
||||||
bool remove)
|
bool remove)
|
||||||
{
|
{
|
||||||
|
mutex_lock(&ctrl->teardown_lock);
|
||||||
blk_mq_quiesce_queue(ctrl->ctrl.admin_q);
|
blk_mq_quiesce_queue(ctrl->ctrl.admin_q);
|
||||||
nvme_rdma_stop_queue(&ctrl->queues[0]);
|
nvme_rdma_stop_queue(&ctrl->queues[0]);
|
||||||
if (ctrl->ctrl.admin_tagset)
|
if (ctrl->ctrl.admin_tagset)
|
||||||
|
@ -887,11 +889,13 @@ static void nvme_rdma_teardown_admin_queue(struct nvme_rdma_ctrl *ctrl,
|
||||||
nvme_cancel_request, &ctrl->ctrl);
|
nvme_cancel_request, &ctrl->ctrl);
|
||||||
blk_mq_unquiesce_queue(ctrl->ctrl.admin_q);
|
blk_mq_unquiesce_queue(ctrl->ctrl.admin_q);
|
||||||
nvme_rdma_destroy_admin_queue(ctrl, remove);
|
nvme_rdma_destroy_admin_queue(ctrl, remove);
|
||||||
|
mutex_unlock(&ctrl->teardown_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nvme_rdma_teardown_io_queues(struct nvme_rdma_ctrl *ctrl,
|
static void nvme_rdma_teardown_io_queues(struct nvme_rdma_ctrl *ctrl,
|
||||||
bool remove)
|
bool remove)
|
||||||
{
|
{
|
||||||
|
mutex_lock(&ctrl->teardown_lock);
|
||||||
if (ctrl->ctrl.queue_count > 1) {
|
if (ctrl->ctrl.queue_count > 1) {
|
||||||
nvme_stop_queues(&ctrl->ctrl);
|
nvme_stop_queues(&ctrl->ctrl);
|
||||||
nvme_rdma_stop_io_queues(ctrl);
|
nvme_rdma_stop_io_queues(ctrl);
|
||||||
|
@ -902,6 +906,7 @@ static void nvme_rdma_teardown_io_queues(struct nvme_rdma_ctrl *ctrl,
|
||||||
nvme_start_queues(&ctrl->ctrl);
|
nvme_start_queues(&ctrl->ctrl);
|
||||||
nvme_rdma_destroy_io_queues(ctrl, remove);
|
nvme_rdma_destroy_io_queues(ctrl, remove);
|
||||||
}
|
}
|
||||||
|
mutex_unlock(&ctrl->teardown_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nvme_rdma_stop_ctrl(struct nvme_ctrl *nctrl)
|
static void nvme_rdma_stop_ctrl(struct nvme_ctrl *nctrl)
|
||||||
|
@ -1955,6 +1960,7 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev,
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
ctrl->ctrl.opts = opts;
|
ctrl->ctrl.opts = opts;
|
||||||
INIT_LIST_HEAD(&ctrl->list);
|
INIT_LIST_HEAD(&ctrl->list);
|
||||||
|
mutex_init(&ctrl->teardown_lock);
|
||||||
|
|
||||||
if (opts->mask & NVMF_OPT_TRSVCID)
|
if (opts->mask & NVMF_OPT_TRSVCID)
|
||||||
port = opts->trsvcid;
|
port = opts->trsvcid;
|
||||||
|
|
|
@ -311,8 +311,8 @@ static const struct qmp_phy_init_tbl ipq8074_pcie_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0xf),
|
QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0xf),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x1),
|
QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x1),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x0),
|
QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x0),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0x1f),
|
QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x3f),
|
QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x1f),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x6),
|
QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x6),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0xf),
|
QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0xf),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x0),
|
QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x0),
|
||||||
|
@ -338,7 +338,6 @@ static const struct qmp_phy_init_tbl ipq8074_pcie_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x0),
|
QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x0),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
|
QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CTRL_BY_PSM, 0x1),
|
QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CTRL_BY_PSM, 0x1),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0xa),
|
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x1),
|
QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x1),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
|
QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x1),
|
QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x1),
|
||||||
|
@ -347,7 +346,6 @@ static const struct qmp_phy_init_tbl ipq8074_pcie_serdes_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0x2f),
|
QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0x2f),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x19),
|
QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x19),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_COM_CLK_EP_DIV, 0x19),
|
QMP_PHY_INIT_CFG(QSERDES_COM_CLK_EP_DIV, 0x19),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x7),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl ipq8074_pcie_tx_tbl[] = {
|
static const struct qmp_phy_init_tbl ipq8074_pcie_tx_tbl[] = {
|
||||||
|
@ -355,6 +353,8 @@ static const struct qmp_phy_init_tbl ipq8074_pcie_tx_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x6),
|
QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x6),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_TX_RES_CODE_LANE_OFFSET, 0x2),
|
QMP_PHY_INIT_CFG(QSERDES_TX_RES_CODE_LANE_OFFSET, 0x2),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_TX_RCV_DETECT_LVL_2, 0x12),
|
QMP_PHY_INIT_CFG(QSERDES_TX_RCV_DETECT_LVL_2, 0x12),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_TX_EMP_POST1_LVL, 0x36),
|
||||||
|
QMP_PHY_INIT_CFG(QSERDES_TX_SLEW_CNTL, 0x0a),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl ipq8074_pcie_rx_tbl[] = {
|
static const struct qmp_phy_init_tbl ipq8074_pcie_rx_tbl[] = {
|
||||||
|
@ -365,7 +365,6 @@ static const struct qmp_phy_init_tbl ipq8074_pcie_rx_tbl[] = {
|
||||||
QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xdb),
|
QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xdb),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
|
QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x4),
|
QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x4),
|
||||||
QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN_HALF, 0x4),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct qmp_phy_init_tbl ipq8074_pcie_pcs_tbl[] = {
|
static const struct qmp_phy_init_tbl ipq8074_pcie_pcs_tbl[] = {
|
||||||
|
@ -818,6 +817,9 @@ static const struct qmp_phy_cfg msm8996_usb3phy_cfg = {
|
||||||
.mask_pcs_ready = PHYSTATUS,
|
.mask_pcs_ready = PHYSTATUS,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char * const ipq8074_pciephy_clk_l[] = {
|
||||||
|
"aux", "cfg_ahb",
|
||||||
|
};
|
||||||
/* list of resets */
|
/* list of resets */
|
||||||
static const char * const ipq8074_pciephy_reset_l[] = {
|
static const char * const ipq8074_pciephy_reset_l[] = {
|
||||||
"phy", "common",
|
"phy", "common",
|
||||||
|
@ -835,8 +837,8 @@ static const struct qmp_phy_cfg ipq8074_pciephy_cfg = {
|
||||||
.rx_tbl_num = ARRAY_SIZE(ipq8074_pcie_rx_tbl),
|
.rx_tbl_num = ARRAY_SIZE(ipq8074_pcie_rx_tbl),
|
||||||
.pcs_tbl = ipq8074_pcie_pcs_tbl,
|
.pcs_tbl = ipq8074_pcie_pcs_tbl,
|
||||||
.pcs_tbl_num = ARRAY_SIZE(ipq8074_pcie_pcs_tbl),
|
.pcs_tbl_num = ARRAY_SIZE(ipq8074_pcie_pcs_tbl),
|
||||||
.clk_list = NULL,
|
.clk_list = ipq8074_pciephy_clk_l,
|
||||||
.num_clks = 0,
|
.num_clks = ARRAY_SIZE(ipq8074_pciephy_clk_l),
|
||||||
.reset_list = ipq8074_pciephy_reset_l,
|
.reset_list = ipq8074_pciephy_reset_l,
|
||||||
.num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
.num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
|
||||||
.vreg_list = NULL,
|
.vreg_list = NULL,
|
||||||
|
|
|
@ -77,6 +77,8 @@
|
||||||
#define QSERDES_COM_CORECLK_DIV_MODE1 0x1bc
|
#define QSERDES_COM_CORECLK_DIV_MODE1 0x1bc
|
||||||
|
|
||||||
/* Only for QMP V2 PHY - TX registers */
|
/* Only for QMP V2 PHY - TX registers */
|
||||||
|
#define QSERDES_TX_EMP_POST1_LVL 0x018
|
||||||
|
#define QSERDES_TX_SLEW_CNTL 0x040
|
||||||
#define QSERDES_TX_RES_CODE_LANE_OFFSET 0x054
|
#define QSERDES_TX_RES_CODE_LANE_OFFSET 0x054
|
||||||
#define QSERDES_TX_DEBUG_BUS_SEL 0x064
|
#define QSERDES_TX_DEBUG_BUS_SEL 0x064
|
||||||
#define QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN 0x068
|
#define QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN 0x068
|
||||||
|
|
|
@ -1300,7 +1300,7 @@ static int set_consumer_device_supply(struct regulator_dev *rdev,
|
||||||
const char *consumer_dev_name,
|
const char *consumer_dev_name,
|
||||||
const char *supply)
|
const char *supply)
|
||||||
{
|
{
|
||||||
struct regulator_map *node;
|
struct regulator_map *node, *new_node;
|
||||||
int has_dev;
|
int has_dev;
|
||||||
|
|
||||||
if (supply == NULL)
|
if (supply == NULL)
|
||||||
|
@ -1311,6 +1311,22 @@ static int set_consumer_device_supply(struct regulator_dev *rdev,
|
||||||
else
|
else
|
||||||
has_dev = 0;
|
has_dev = 0;
|
||||||
|
|
||||||
|
new_node = kzalloc(sizeof(struct regulator_map), GFP_KERNEL);
|
||||||
|
if (new_node == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
new_node->regulator = rdev;
|
||||||
|
new_node->supply = supply;
|
||||||
|
|
||||||
|
if (has_dev) {
|
||||||
|
new_node->dev_name = kstrdup(consumer_dev_name, GFP_KERNEL);
|
||||||
|
if (new_node->dev_name == NULL) {
|
||||||
|
kfree(new_node);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_lock(®ulator_list_mutex);
|
||||||
list_for_each_entry(node, ®ulator_map_list, list) {
|
list_for_each_entry(node, ®ulator_map_list, list) {
|
||||||
if (node->dev_name && consumer_dev_name) {
|
if (node->dev_name && consumer_dev_name) {
|
||||||
if (strcmp(node->dev_name, consumer_dev_name) != 0)
|
if (strcmp(node->dev_name, consumer_dev_name) != 0)
|
||||||
|
@ -1328,26 +1344,19 @@ static int set_consumer_device_supply(struct regulator_dev *rdev,
|
||||||
node->regulator->desc->name,
|
node->regulator->desc->name,
|
||||||
supply,
|
supply,
|
||||||
dev_name(&rdev->dev), rdev_get_name(rdev));
|
dev_name(&rdev->dev), rdev_get_name(rdev));
|
||||||
return -EBUSY;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
node = kzalloc(sizeof(struct regulator_map), GFP_KERNEL);
|
list_add(&new_node->list, ®ulator_map_list);
|
||||||
if (node == NULL)
|
mutex_unlock(®ulator_list_mutex);
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
node->regulator = rdev;
|
|
||||||
node->supply = supply;
|
|
||||||
|
|
||||||
if (has_dev) {
|
|
||||||
node->dev_name = kstrdup(consumer_dev_name, GFP_KERNEL);
|
|
||||||
if (node->dev_name == NULL) {
|
|
||||||
kfree(node);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
list_add(&node->list, ®ulator_map_list);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
mutex_unlock(®ulator_list_mutex);
|
||||||
|
kfree(new_node->dev_name);
|
||||||
|
kfree(new_node);
|
||||||
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unset_regulator_supplies(struct regulator_dev *rdev)
|
static void unset_regulator_supplies(struct regulator_dev *rdev)
|
||||||
|
@ -4408,19 +4417,16 @@ regulator_register(const struct regulator_desc *regulator_desc,
|
||||||
|
|
||||||
/* add consumers devices */
|
/* add consumers devices */
|
||||||
if (init_data) {
|
if (init_data) {
|
||||||
mutex_lock(®ulator_list_mutex);
|
|
||||||
for (i = 0; i < init_data->num_consumer_supplies; i++) {
|
for (i = 0; i < init_data->num_consumer_supplies; i++) {
|
||||||
ret = set_consumer_device_supply(rdev,
|
ret = set_consumer_device_supply(rdev,
|
||||||
init_data->consumer_supplies[i].dev_name,
|
init_data->consumer_supplies[i].dev_name,
|
||||||
init_data->consumer_supplies[i].supply);
|
init_data->consumer_supplies[i].supply);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
mutex_unlock(®ulator_list_mutex);
|
|
||||||
dev_err(dev, "Failed to set supply %s\n",
|
dev_err(dev, "Failed to set supply %s\n",
|
||||||
init_data->consumer_supplies[i].supply);
|
init_data->consumer_supplies[i].supply);
|
||||||
goto unset_supplies;
|
goto unset_supplies;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mutex_unlock(®ulator_list_mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rdev->desc->ops->get_voltage &&
|
if (!rdev->desc->ops->get_voltage &&
|
||||||
|
|
|
@ -223,7 +223,10 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)
|
||||||
task->num_scatter = si;
|
task->num_scatter = si;
|
||||||
}
|
}
|
||||||
|
|
||||||
task->data_dir = qc->dma_dir;
|
if (qc->tf.protocol == ATA_PROT_NODATA)
|
||||||
|
task->data_dir = DMA_NONE;
|
||||||
|
else
|
||||||
|
task->data_dir = qc->dma_dir;
|
||||||
task->scatter = qc->sg;
|
task->scatter = qc->sg;
|
||||||
task->ata_task.retry_count = 1;
|
task->ata_task.retry_count = 1;
|
||||||
task->task_state_flags = SAS_TASK_STATE_PENDING;
|
task->task_state_flags = SAS_TASK_STATE_PENDING;
|
||||||
|
|
|
@ -460,6 +460,15 @@ static int gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol *kcontrol,
|
||||||
val = ucontrol->value.integer.value[0] & mask;
|
val = ucontrol->value.integer.value[0] & mask;
|
||||||
connect = !!val;
|
connect = !!val;
|
||||||
|
|
||||||
|
ret = gb_pm_runtime_get_sync(bundle);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id,
|
||||||
|
GB_AUDIO_INVALID_INDEX, &gbvalue);
|
||||||
|
if (ret)
|
||||||
|
goto exit;
|
||||||
|
|
||||||
/* update ucontrol */
|
/* update ucontrol */
|
||||||
if (gbvalue.value.integer_value[0] != val) {
|
if (gbvalue.value.integer_value[0] != val) {
|
||||||
for (wi = 0; wi < wlist->num_widgets; wi++) {
|
for (wi = 0; wi < wlist->num_widgets; wi++) {
|
||||||
|
@ -473,25 +482,17 @@ static int gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol *kcontrol,
|
||||||
gbvalue.value.integer_value[0] =
|
gbvalue.value.integer_value[0] =
|
||||||
cpu_to_le32(ucontrol->value.integer.value[0]);
|
cpu_to_le32(ucontrol->value.integer.value[0]);
|
||||||
|
|
||||||
ret = gb_pm_runtime_get_sync(bundle);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = gb_audio_gb_set_control(module->mgmt_connection,
|
ret = gb_audio_gb_set_control(module->mgmt_connection,
|
||||||
data->ctl_id,
|
data->ctl_id,
|
||||||
GB_AUDIO_INVALID_INDEX, &gbvalue);
|
GB_AUDIO_INVALID_INDEX, &gbvalue);
|
||||||
|
|
||||||
gb_pm_runtime_put_autosuspend(bundle);
|
|
||||||
|
|
||||||
if (ret) {
|
|
||||||
dev_err_ratelimited(codec->dev,
|
|
||||||
"%d:Error in %s for %s\n", ret,
|
|
||||||
__func__, kcontrol->id.name);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
exit:
|
||||||
|
gb_pm_runtime_put_autosuspend(bundle);
|
||||||
|
if (ret)
|
||||||
|
dev_err_ratelimited(codec_dev, "%d:Error in %s for %s\n", ret,
|
||||||
|
__func__, kcontrol->id.name);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SOC_DAPM_MIXER_GB(xname, kcount, data) \
|
#define SOC_DAPM_MIXER_GB(xname, kcount, data) \
|
||||||
|
|
|
@ -532,13 +532,8 @@ static void hfa384x_usb_defer(struct work_struct *data)
|
||||||
*/
|
*/
|
||||||
void hfa384x_create(struct hfa384x *hw, struct usb_device *usb)
|
void hfa384x_create(struct hfa384x *hw, struct usb_device *usb)
|
||||||
{
|
{
|
||||||
memset(hw, 0, sizeof(*hw));
|
|
||||||
hw->usb = usb;
|
hw->usb = usb;
|
||||||
|
|
||||||
/* set up the endpoints */
|
|
||||||
hw->endp_in = usb_rcvbulkpipe(usb, 1);
|
|
||||||
hw->endp_out = usb_sndbulkpipe(usb, 2);
|
|
||||||
|
|
||||||
/* Set up the waitq */
|
/* Set up the waitq */
|
||||||
init_waitqueue_head(&hw->cmdq);
|
init_waitqueue_head(&hw->cmdq);
|
||||||
|
|
||||||
|
|
|
@ -61,23 +61,14 @@ static int prism2sta_probe_usb(struct usb_interface *interface,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
struct usb_device *dev;
|
struct usb_device *dev;
|
||||||
const struct usb_endpoint_descriptor *epd;
|
struct usb_endpoint_descriptor *bulk_in, *bulk_out;
|
||||||
const struct usb_host_interface *iface_desc = interface->cur_altsetting;
|
struct usb_host_interface *iface_desc = interface->cur_altsetting;
|
||||||
struct wlandevice *wlandev = NULL;
|
struct wlandevice *wlandev = NULL;
|
||||||
struct hfa384x *hw = NULL;
|
struct hfa384x *hw = NULL;
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
if (iface_desc->desc.bNumEndpoints != 2) {
|
result = usb_find_common_endpoints(iface_desc, &bulk_in, &bulk_out, NULL, NULL);
|
||||||
result = -ENODEV;
|
if (result)
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = -EINVAL;
|
|
||||||
epd = &iface_desc->endpoint[1].desc;
|
|
||||||
if (!usb_endpoint_is_bulk_in(epd))
|
|
||||||
goto failed;
|
|
||||||
epd = &iface_desc->endpoint[2].desc;
|
|
||||||
if (!usb_endpoint_is_bulk_out(epd))
|
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
dev = interface_to_usbdev(interface);
|
dev = interface_to_usbdev(interface);
|
||||||
|
@ -96,6 +87,8 @@ static int prism2sta_probe_usb(struct usb_interface *interface,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the hw data */
|
/* Initialize the hw data */
|
||||||
|
hw->endp_in = usb_rcvbulkpipe(dev, bulk_in->bEndpointAddress);
|
||||||
|
hw->endp_out = usb_sndbulkpipe(dev, bulk_out->bEndpointAddress);
|
||||||
hfa384x_create(hw, dev);
|
hfa384x_create(hw, dev);
|
||||||
hw->wlandev = wlandev;
|
hw->wlandev = wlandev;
|
||||||
|
|
||||||
|
|
|
@ -1381,14 +1381,27 @@ static u32 iscsit_do_crypto_hash_sg(
|
||||||
sg = cmd->first_data_sg;
|
sg = cmd->first_data_sg;
|
||||||
page_off = cmd->first_data_sg_off;
|
page_off = cmd->first_data_sg_off;
|
||||||
|
|
||||||
|
if (data_length && page_off) {
|
||||||
|
struct scatterlist first_sg;
|
||||||
|
u32 len = min_t(u32, data_length, sg->length - page_off);
|
||||||
|
|
||||||
|
sg_init_table(&first_sg, 1);
|
||||||
|
sg_set_page(&first_sg, sg_page(sg), len, sg->offset + page_off);
|
||||||
|
|
||||||
|
ahash_request_set_crypt(hash, &first_sg, NULL, len);
|
||||||
|
crypto_ahash_update(hash);
|
||||||
|
|
||||||
|
data_length -= len;
|
||||||
|
sg = sg_next(sg);
|
||||||
|
}
|
||||||
|
|
||||||
while (data_length) {
|
while (data_length) {
|
||||||
u32 cur_len = min_t(u32, data_length, (sg->length - page_off));
|
u32 cur_len = min_t(u32, data_length, sg->length);
|
||||||
|
|
||||||
ahash_request_set_crypt(hash, sg, NULL, cur_len);
|
ahash_request_set_crypt(hash, sg, NULL, cur_len);
|
||||||
crypto_ahash_update(hash);
|
crypto_ahash_update(hash);
|
||||||
|
|
||||||
data_length -= cur_len;
|
data_length -= cur_len;
|
||||||
page_off = 0;
|
|
||||||
/* iscsit_map_iovec has already checked for invalid sg pointers */
|
/* iscsit_map_iovec has already checked for invalid sg pointers */
|
||||||
sg = sg_next(sg);
|
sg = sg_next(sg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1183,7 +1183,7 @@ void iscsit_free_conn(struct iscsi_conn *conn)
|
||||||
}
|
}
|
||||||
|
|
||||||
void iscsi_target_login_sess_out(struct iscsi_conn *conn,
|
void iscsi_target_login_sess_out(struct iscsi_conn *conn,
|
||||||
struct iscsi_np *np, bool zero_tsih, bool new_sess)
|
bool zero_tsih, bool new_sess)
|
||||||
{
|
{
|
||||||
if (!new_sess)
|
if (!new_sess)
|
||||||
goto old_sess_out;
|
goto old_sess_out;
|
||||||
|
@ -1201,7 +1201,6 @@ void iscsi_target_login_sess_out(struct iscsi_conn *conn,
|
||||||
conn->sess = NULL;
|
conn->sess = NULL;
|
||||||
|
|
||||||
old_sess_out:
|
old_sess_out:
|
||||||
iscsi_stop_login_thread_timer(np);
|
|
||||||
/*
|
/*
|
||||||
* If login negotiation fails check if the Time2Retain timer
|
* If login negotiation fails check if the Time2Retain timer
|
||||||
* needs to be restarted.
|
* needs to be restarted.
|
||||||
|
@ -1441,8 +1440,9 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
|
||||||
new_sess_out:
|
new_sess_out:
|
||||||
new_sess = true;
|
new_sess = true;
|
||||||
old_sess_out:
|
old_sess_out:
|
||||||
|
iscsi_stop_login_thread_timer(np);
|
||||||
tpg_np = conn->tpg_np;
|
tpg_np = conn->tpg_np;
|
||||||
iscsi_target_login_sess_out(conn, np, zero_tsih, new_sess);
|
iscsi_target_login_sess_out(conn, zero_tsih, new_sess);
|
||||||
new_sess = false;
|
new_sess = false;
|
||||||
|
|
||||||
if (tpg) {
|
if (tpg) {
|
||||||
|
|
|
@ -22,8 +22,7 @@ extern int iscsit_put_login_tx(struct iscsi_conn *, struct iscsi_login *, u32);
|
||||||
extern void iscsit_free_conn(struct iscsi_conn *);
|
extern void iscsit_free_conn(struct iscsi_conn *);
|
||||||
extern int iscsit_start_kthreads(struct iscsi_conn *);
|
extern int iscsit_start_kthreads(struct iscsi_conn *);
|
||||||
extern void iscsi_post_login_handler(struct iscsi_np *, struct iscsi_conn *, u8);
|
extern void iscsi_post_login_handler(struct iscsi_np *, struct iscsi_conn *, u8);
|
||||||
extern void iscsi_target_login_sess_out(struct iscsi_conn *, struct iscsi_np *,
|
extern void iscsi_target_login_sess_out(struct iscsi_conn *, bool, bool);
|
||||||
bool, bool);
|
|
||||||
extern int iscsi_target_login_thread(void *);
|
extern int iscsi_target_login_thread(void *);
|
||||||
extern void iscsi_handle_login_thread_timeout(struct timer_list *t);
|
extern void iscsi_handle_login_thread_timeout(struct timer_list *t);
|
||||||
|
|
||||||
|
|
|
@ -554,12 +554,11 @@ static bool iscsi_target_sk_check_and_clear(struct iscsi_conn *conn, unsigned in
|
||||||
|
|
||||||
static void iscsi_target_login_drop(struct iscsi_conn *conn, struct iscsi_login *login)
|
static void iscsi_target_login_drop(struct iscsi_conn *conn, struct iscsi_login *login)
|
||||||
{
|
{
|
||||||
struct iscsi_np *np = login->np;
|
|
||||||
bool zero_tsih = login->zero_tsih;
|
bool zero_tsih = login->zero_tsih;
|
||||||
|
|
||||||
iscsi_remove_failed_auth_entry(conn);
|
iscsi_remove_failed_auth_entry(conn);
|
||||||
iscsi_target_nego_release(conn);
|
iscsi_target_nego_release(conn);
|
||||||
iscsi_target_login_sess_out(conn, np, zero_tsih, true);
|
iscsi_target_login_sess_out(conn, zero_tsih, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct conn_timeout {
|
struct conn_timeout {
|
||||||
|
|
|
@ -1204,6 +1204,34 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* usb_disable_device_endpoints -- Disable all endpoints for a device
|
||||||
|
* @dev: the device whose endpoints are being disabled
|
||||||
|
* @skip_ep0: 0 to disable endpoint 0, 1 to skip it.
|
||||||
|
*/
|
||||||
|
static void usb_disable_device_endpoints(struct usb_device *dev, int skip_ep0)
|
||||||
|
{
|
||||||
|
struct usb_hcd *hcd = bus_to_hcd(dev->bus);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (hcd->driver->check_bandwidth) {
|
||||||
|
/* First pass: Cancel URBs, leave endpoint pointers intact. */
|
||||||
|
for (i = skip_ep0; i < 16; ++i) {
|
||||||
|
usb_disable_endpoint(dev, i, false);
|
||||||
|
usb_disable_endpoint(dev, i + USB_DIR_IN, false);
|
||||||
|
}
|
||||||
|
/* Remove endpoints from the host controller internal state */
|
||||||
|
mutex_lock(hcd->bandwidth_mutex);
|
||||||
|
usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
|
||||||
|
mutex_unlock(hcd->bandwidth_mutex);
|
||||||
|
}
|
||||||
|
/* Second pass: remove endpoint pointers */
|
||||||
|
for (i = skip_ep0; i < 16; ++i) {
|
||||||
|
usb_disable_endpoint(dev, i, true);
|
||||||
|
usb_disable_endpoint(dev, i + USB_DIR_IN, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* usb_disable_device - Disable all the endpoints for a USB device
|
* usb_disable_device - Disable all the endpoints for a USB device
|
||||||
* @dev: the device whose endpoints are being disabled
|
* @dev: the device whose endpoints are being disabled
|
||||||
|
@ -1217,7 +1245,6 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf,
|
||||||
void usb_disable_device(struct usb_device *dev, int skip_ep0)
|
void usb_disable_device(struct usb_device *dev, int skip_ep0)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct usb_hcd *hcd = bus_to_hcd(dev->bus);
|
|
||||||
|
|
||||||
/* getting rid of interfaces will disconnect
|
/* getting rid of interfaces will disconnect
|
||||||
* any drivers bound to them (a key side effect)
|
* any drivers bound to them (a key side effect)
|
||||||
|
@ -1263,22 +1290,8 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)
|
||||||
|
|
||||||
dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__,
|
dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__,
|
||||||
skip_ep0 ? "non-ep0" : "all");
|
skip_ep0 ? "non-ep0" : "all");
|
||||||
if (hcd->driver->check_bandwidth) {
|
|
||||||
/* First pass: Cancel URBs, leave endpoint pointers intact. */
|
usb_disable_device_endpoints(dev, skip_ep0);
|
||||||
for (i = skip_ep0; i < 16; ++i) {
|
|
||||||
usb_disable_endpoint(dev, i, false);
|
|
||||||
usb_disable_endpoint(dev, i + USB_DIR_IN, false);
|
|
||||||
}
|
|
||||||
/* Remove endpoints from the host controller internal state */
|
|
||||||
mutex_lock(hcd->bandwidth_mutex);
|
|
||||||
usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
|
|
||||||
mutex_unlock(hcd->bandwidth_mutex);
|
|
||||||
/* Second pass: remove endpoint pointers */
|
|
||||||
}
|
|
||||||
for (i = skip_ep0; i < 16; ++i) {
|
|
||||||
usb_disable_endpoint(dev, i, true);
|
|
||||||
usb_disable_endpoint(dev, i + USB_DIR_IN, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1521,6 +1534,9 @@ EXPORT_SYMBOL_GPL(usb_set_interface);
|
||||||
* The caller must own the device lock.
|
* The caller must own the device lock.
|
||||||
*
|
*
|
||||||
* Return: Zero on success, else a negative error code.
|
* Return: Zero on success, else a negative error code.
|
||||||
|
*
|
||||||
|
* If this routine fails the device will probably be in an unusable state
|
||||||
|
* with endpoints disabled, and interfaces only partially enabled.
|
||||||
*/
|
*/
|
||||||
int usb_reset_configuration(struct usb_device *dev)
|
int usb_reset_configuration(struct usb_device *dev)
|
||||||
{
|
{
|
||||||
|
@ -1536,10 +1552,7 @@ int usb_reset_configuration(struct usb_device *dev)
|
||||||
* calls during probe() are fine
|
* calls during probe() are fine
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 1; i < 16; ++i) {
|
usb_disable_device_endpoints(dev, 1); /* skip ep0*/
|
||||||
usb_disable_endpoint(dev, i, true);
|
|
||||||
usb_disable_endpoint(dev, i + USB_DIR_IN, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
config = dev->actconfig;
|
config = dev->actconfig;
|
||||||
retval = 0;
|
retval = 0;
|
||||||
|
@ -1552,34 +1565,10 @@ int usb_reset_configuration(struct usb_device *dev)
|
||||||
mutex_unlock(hcd->bandwidth_mutex);
|
mutex_unlock(hcd->bandwidth_mutex);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
/* Make sure we have enough bandwidth for each alternate setting 0 */
|
|
||||||
for (i = 0; i < config->desc.bNumInterfaces; i++) {
|
|
||||||
struct usb_interface *intf = config->interface[i];
|
|
||||||
struct usb_host_interface *alt;
|
|
||||||
|
|
||||||
alt = usb_altnum_to_altsetting(intf, 0);
|
/* xHCI adds all endpoints in usb_hcd_alloc_bandwidth */
|
||||||
if (!alt)
|
retval = usb_hcd_alloc_bandwidth(dev, config, NULL, NULL);
|
||||||
alt = &intf->altsetting[0];
|
|
||||||
if (alt != intf->cur_altsetting)
|
|
||||||
retval = usb_hcd_alloc_bandwidth(dev, NULL,
|
|
||||||
intf->cur_altsetting, alt);
|
|
||||||
if (retval < 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* If not, reinstate the old alternate settings */
|
|
||||||
if (retval < 0) {
|
if (retval < 0) {
|
||||||
reset_old_alts:
|
|
||||||
for (i--; i >= 0; i--) {
|
|
||||||
struct usb_interface *intf = config->interface[i];
|
|
||||||
struct usb_host_interface *alt;
|
|
||||||
|
|
||||||
alt = usb_altnum_to_altsetting(intf, 0);
|
|
||||||
if (!alt)
|
|
||||||
alt = &intf->altsetting[0];
|
|
||||||
if (alt != intf->cur_altsetting)
|
|
||||||
usb_hcd_alloc_bandwidth(dev, NULL,
|
|
||||||
alt, intf->cur_altsetting);
|
|
||||||
}
|
|
||||||
usb_enable_lpm(dev);
|
usb_enable_lpm(dev);
|
||||||
mutex_unlock(hcd->bandwidth_mutex);
|
mutex_unlock(hcd->bandwidth_mutex);
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -1588,8 +1577,12 @@ int usb_reset_configuration(struct usb_device *dev)
|
||||||
USB_REQ_SET_CONFIGURATION, 0,
|
USB_REQ_SET_CONFIGURATION, 0,
|
||||||
config->desc.bConfigurationValue, 0,
|
config->desc.bConfigurationValue, 0,
|
||||||
NULL, 0, USB_CTRL_SET_TIMEOUT);
|
NULL, 0, USB_CTRL_SET_TIMEOUT);
|
||||||
if (retval < 0)
|
if (retval < 0) {
|
||||||
goto reset_old_alts;
|
usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
|
||||||
|
usb_enable_lpm(dev);
|
||||||
|
mutex_unlock(hcd->bandwidth_mutex);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
mutex_unlock(hcd->bandwidth_mutex);
|
mutex_unlock(hcd->bandwidth_mutex);
|
||||||
|
|
||||||
/* re-init hc/hcd interface/endpoint state */
|
/* re-init hc/hcd interface/endpoint state */
|
||||||
|
|
|
@ -888,7 +888,11 @@ read_descriptors(struct file *filp, struct kobject *kobj,
|
||||||
size_t srclen, n;
|
size_t srclen, n;
|
||||||
int cfgno;
|
int cfgno;
|
||||||
void *src;
|
void *src;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
retval = usb_lock_device_interruptible(udev);
|
||||||
|
if (retval < 0)
|
||||||
|
return -EINTR;
|
||||||
/* The binary attribute begins with the device descriptor.
|
/* The binary attribute begins with the device descriptor.
|
||||||
* Following that are the raw descriptor entries for all the
|
* Following that are the raw descriptor entries for all the
|
||||||
* configurations (config plus subsidiary descriptors).
|
* configurations (config plus subsidiary descriptors).
|
||||||
|
@ -913,6 +917,7 @@ read_descriptors(struct file *filp, struct kobject *kobj,
|
||||||
off -= srclen;
|
off -= srclen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
usb_unlock_device(udev);
|
||||||
return count - nleft;
|
return count - nleft;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -703,6 +703,7 @@ static const struct usb_device_id id_table_combined[] = {
|
||||||
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) },
|
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) },
|
||||||
{ USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
|
{ USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
|
||||||
{ USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) },
|
{ USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) },
|
||||||
|
{ USB_DEVICE(XSENS_VID, XSENS_MTIUSBCONVERTER_PID) },
|
||||||
{ USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
|
{ USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
|
||||||
{ USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
|
{ USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
|
||||||
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
|
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
|
||||||
|
|
|
@ -160,6 +160,7 @@
|
||||||
#define XSENS_AWINDA_DONGLE_PID 0x0102
|
#define XSENS_AWINDA_DONGLE_PID 0x0102
|
||||||
#define XSENS_MTW_PID 0x0200 /* Xsens MTw */
|
#define XSENS_MTW_PID 0x0200 /* Xsens MTw */
|
||||||
#define XSENS_MTDEVBOARD_PID 0x0300 /* Motion Tracker Development Board */
|
#define XSENS_MTDEVBOARD_PID 0x0300 /* Motion Tracker Development Board */
|
||||||
|
#define XSENS_MTIUSBCONVERTER_PID 0x0301 /* MTi USB converter */
|
||||||
#define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */
|
#define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */
|
||||||
|
|
||||||
/* Xsens devices using FTDI VID */
|
/* Xsens devices using FTDI VID */
|
||||||
|
|
|
@ -1094,14 +1094,18 @@ static const struct usb_device_id option_ids[] = {
|
||||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M),
|
{ USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M),
|
||||||
.driver_info = RSVD(1) | RSVD(3) },
|
.driver_info = RSVD(1) | RSVD(3) },
|
||||||
/* Quectel products using Quectel vendor ID */
|
/* Quectel products using Quectel vendor ID */
|
||||||
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21),
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff),
|
||||||
.driver_info = RSVD(4) },
|
.driver_info = NUMEP2 },
|
||||||
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25),
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0, 0) },
|
||||||
.driver_info = RSVD(4) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25, 0xff, 0xff, 0xff),
|
||||||
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95),
|
.driver_info = NUMEP2 },
|
||||||
.driver_info = RSVD(4) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96),
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95, 0xff, 0xff, 0xff),
|
||||||
.driver_info = RSVD(4) },
|
.driver_info = NUMEP2 },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95, 0xff, 0, 0) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96, 0xff, 0xff, 0xff),
|
||||||
|
.driver_info = NUMEP2 },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff),
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff),
|
||||||
.driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 },
|
.driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0, 0) },
|
||||||
|
@ -1819,6 +1823,8 @@ static const struct usb_device_id option_ids[] = {
|
||||||
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9003, 0xff) }, /* Simcom SIM7500/SIM7600 MBIM mode */
|
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9003, 0xff) }, /* Simcom SIM7500/SIM7600 MBIM mode */
|
||||||
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9011, 0xff), /* Simcom SIM7500/SIM7600 RNDIS mode */
|
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9011, 0xff), /* Simcom SIM7500/SIM7600 RNDIS mode */
|
||||||
.driver_info = RSVD(7) },
|
.driver_info = RSVD(7) },
|
||||||
|
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9205, 0xff) }, /* Simcom SIM7070/SIM7080/SIM7090 AT+ECM mode */
|
||||||
|
{ USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9206, 0xff) }, /* Simcom SIM7070/SIM7080/SIM7090 AT-only mode */
|
||||||
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200),
|
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200),
|
||||||
.driver_info = NCTRL(0) | NCTRL(1) | RSVD(4) },
|
.driver_info = NCTRL(0) | NCTRL(1) | RSVD(4) },
|
||||||
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X220_X500D),
|
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X220_X500D),
|
||||||
|
|
|
@ -64,11 +64,15 @@ static void ucsi_acpi_notify(acpi_handle handle, u32 event, void *data)
|
||||||
|
|
||||||
static int ucsi_acpi_probe(struct platform_device *pdev)
|
static int ucsi_acpi_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
|
struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
|
||||||
struct ucsi_acpi *ua;
|
struct ucsi_acpi *ua;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (adev->dep_unmet)
|
||||||
|
return -EPROBE_DEFER;
|
||||||
|
|
||||||
ua = devm_kzalloc(&pdev->dev, sizeof(*ua), GFP_KERNEL);
|
ua = devm_kzalloc(&pdev->dev, sizeof(*ua), GFP_KERNEL);
|
||||||
if (!ua)
|
if (!ua)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
@ -21,52 +21,6 @@ config VGA_CONSOLE
|
||||||
|
|
||||||
Say Y.
|
Say Y.
|
||||||
|
|
||||||
config VGACON_SOFT_SCROLLBACK
|
|
||||||
bool "Enable Scrollback Buffer in System RAM"
|
|
||||||
depends on VGA_CONSOLE
|
|
||||||
default n
|
|
||||||
help
|
|
||||||
The scrollback buffer of the standard VGA console is located in
|
|
||||||
the VGA RAM. The size of this RAM is fixed and is quite small.
|
|
||||||
If you require a larger scrollback buffer, this can be placed in
|
|
||||||
System RAM which is dynamically allocated during initialization.
|
|
||||||
Placing the scrollback buffer in System RAM will slightly slow
|
|
||||||
down the console.
|
|
||||||
|
|
||||||
If you want this feature, say 'Y' here and enter the amount of
|
|
||||||
RAM to allocate for this buffer. If unsure, say 'N'.
|
|
||||||
|
|
||||||
config VGACON_SOFT_SCROLLBACK_SIZE
|
|
||||||
int "Scrollback Buffer Size (in KB)"
|
|
||||||
depends on VGACON_SOFT_SCROLLBACK
|
|
||||||
range 1 1024
|
|
||||||
default "64"
|
|
||||||
help
|
|
||||||
Enter the amount of System RAM to allocate for scrollback
|
|
||||||
buffers of VGA consoles. Each 64KB will give you approximately
|
|
||||||
16 80x25 screenfuls of scrollback buffer.
|
|
||||||
|
|
||||||
config VGACON_SOFT_SCROLLBACK_PERSISTENT_ENABLE_BY_DEFAULT
|
|
||||||
bool "Persistent Scrollback History for each console by default"
|
|
||||||
depends on VGACON_SOFT_SCROLLBACK
|
|
||||||
default n
|
|
||||||
help
|
|
||||||
Say Y here if the scrollback history should persist by default when
|
|
||||||
switching between consoles. Otherwise, the scrollback history will be
|
|
||||||
flushed each time the console is switched. This feature can also be
|
|
||||||
enabled using the boot command line parameter
|
|
||||||
'vgacon.scrollback_persistent=1'.
|
|
||||||
|
|
||||||
This feature might break your tool of choice to flush the scrollback
|
|
||||||
buffer, e.g. clear(1) will work fine but Debian's clear_console(1)
|
|
||||||
will be broken, which might cause security issues.
|
|
||||||
You can use the escape sequence \e[3J instead if this feature is
|
|
||||||
activated.
|
|
||||||
|
|
||||||
Note that a buffer of VGACON_SOFT_SCROLLBACK_SIZE is taken for each
|
|
||||||
created tty device.
|
|
||||||
So if you use a RAM-constrained system, say N here.
|
|
||||||
|
|
||||||
config MDA_CONSOLE
|
config MDA_CONSOLE
|
||||||
depends on !M68K && !PARISC && ISA
|
depends on !M68K && !PARISC && ISA
|
||||||
tristate "MDA text console (dual-headed)"
|
tristate "MDA text console (dual-headed)"
|
||||||
|
|
|
@ -165,214 +165,6 @@ static inline void vga_set_mem_top(struct vc_data *c)
|
||||||
write_vga(12, (c->vc_visible_origin - vga_vram_base) / 2);
|
write_vga(12, (c->vc_visible_origin - vga_vram_base) / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_VGACON_SOFT_SCROLLBACK
|
|
||||||
/* software scrollback */
|
|
||||||
struct vgacon_scrollback_info {
|
|
||||||
void *data;
|
|
||||||
int tail;
|
|
||||||
int size;
|
|
||||||
int rows;
|
|
||||||
int cnt;
|
|
||||||
int cur;
|
|
||||||
int save;
|
|
||||||
int restore;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct vgacon_scrollback_info *vgacon_scrollback_cur;
|
|
||||||
static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES];
|
|
||||||
static bool scrollback_persistent = \
|
|
||||||
IS_ENABLED(CONFIG_VGACON_SOFT_SCROLLBACK_PERSISTENT_ENABLE_BY_DEFAULT);
|
|
||||||
module_param_named(scrollback_persistent, scrollback_persistent, bool, 0000);
|
|
||||||
MODULE_PARM_DESC(scrollback_persistent, "Enable persistent scrollback for all vga consoles");
|
|
||||||
|
|
||||||
static void vgacon_scrollback_reset(int vc_num, size_t reset_size)
|
|
||||||
{
|
|
||||||
struct vgacon_scrollback_info *scrollback = &vgacon_scrollbacks[vc_num];
|
|
||||||
|
|
||||||
if (scrollback->data && reset_size > 0)
|
|
||||||
memset(scrollback->data, 0, reset_size);
|
|
||||||
|
|
||||||
scrollback->cnt = 0;
|
|
||||||
scrollback->tail = 0;
|
|
||||||
scrollback->cur = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vgacon_scrollback_init(int vc_num)
|
|
||||||
{
|
|
||||||
int pitch = vga_video_num_columns * 2;
|
|
||||||
size_t size = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024;
|
|
||||||
int rows = size / pitch;
|
|
||||||
void *data;
|
|
||||||
|
|
||||||
data = kmalloc_array(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE, 1024,
|
|
||||||
GFP_NOWAIT);
|
|
||||||
|
|
||||||
vgacon_scrollbacks[vc_num].data = data;
|
|
||||||
vgacon_scrollback_cur = &vgacon_scrollbacks[vc_num];
|
|
||||||
|
|
||||||
vgacon_scrollback_cur->rows = rows - 1;
|
|
||||||
vgacon_scrollback_cur->size = rows * pitch;
|
|
||||||
|
|
||||||
vgacon_scrollback_reset(vc_num, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vgacon_scrollback_switch(int vc_num)
|
|
||||||
{
|
|
||||||
if (!scrollback_persistent)
|
|
||||||
vc_num = 0;
|
|
||||||
|
|
||||||
if (!vgacon_scrollbacks[vc_num].data) {
|
|
||||||
vgacon_scrollback_init(vc_num);
|
|
||||||
} else {
|
|
||||||
if (scrollback_persistent) {
|
|
||||||
vgacon_scrollback_cur = &vgacon_scrollbacks[vc_num];
|
|
||||||
} else {
|
|
||||||
size_t size = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024;
|
|
||||||
|
|
||||||
vgacon_scrollback_reset(vc_num, size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vgacon_scrollback_startup(void)
|
|
||||||
{
|
|
||||||
vgacon_scrollback_cur = &vgacon_scrollbacks[0];
|
|
||||||
vgacon_scrollback_init(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vgacon_scrollback_update(struct vc_data *c, int t, int count)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
if (!vgacon_scrollback_cur->data || !vgacon_scrollback_cur->size ||
|
|
||||||
c->vc_num != fg_console)
|
|
||||||
return;
|
|
||||||
|
|
||||||
p = (void *) (c->vc_origin + t * c->vc_size_row);
|
|
||||||
|
|
||||||
while (count--) {
|
|
||||||
if ((vgacon_scrollback_cur->tail + c->vc_size_row) >
|
|
||||||
vgacon_scrollback_cur->size)
|
|
||||||
vgacon_scrollback_cur->tail = 0;
|
|
||||||
|
|
||||||
scr_memcpyw(vgacon_scrollback_cur->data +
|
|
||||||
vgacon_scrollback_cur->tail,
|
|
||||||
p, c->vc_size_row);
|
|
||||||
|
|
||||||
vgacon_scrollback_cur->cnt++;
|
|
||||||
p += c->vc_size_row;
|
|
||||||
vgacon_scrollback_cur->tail += c->vc_size_row;
|
|
||||||
|
|
||||||
if (vgacon_scrollback_cur->tail >= vgacon_scrollback_cur->size)
|
|
||||||
vgacon_scrollback_cur->tail = 0;
|
|
||||||
|
|
||||||
if (vgacon_scrollback_cur->cnt > vgacon_scrollback_cur->rows)
|
|
||||||
vgacon_scrollback_cur->cnt = vgacon_scrollback_cur->rows;
|
|
||||||
|
|
||||||
vgacon_scrollback_cur->cur = vgacon_scrollback_cur->cnt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vgacon_restore_screen(struct vc_data *c)
|
|
||||||
{
|
|
||||||
c->vc_origin = c->vc_visible_origin;
|
|
||||||
vgacon_scrollback_cur->save = 0;
|
|
||||||
|
|
||||||
if (!vga_is_gfx && !vgacon_scrollback_cur->restore) {
|
|
||||||
scr_memcpyw((u16 *) c->vc_origin, (u16 *) c->vc_screenbuf,
|
|
||||||
c->vc_screenbuf_size > vga_vram_size ?
|
|
||||||
vga_vram_size : c->vc_screenbuf_size);
|
|
||||||
vgacon_scrollback_cur->restore = 1;
|
|
||||||
vgacon_scrollback_cur->cur = vgacon_scrollback_cur->cnt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vgacon_scrolldelta(struct vc_data *c, int lines)
|
|
||||||
{
|
|
||||||
int start, end, count, soff;
|
|
||||||
|
|
||||||
if (!lines) {
|
|
||||||
vgacon_restore_screen(c);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!vgacon_scrollback_cur->data)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!vgacon_scrollback_cur->save) {
|
|
||||||
vgacon_cursor(c, CM_ERASE);
|
|
||||||
vgacon_save_screen(c);
|
|
||||||
c->vc_origin = (unsigned long)c->vc_screenbuf;
|
|
||||||
vgacon_scrollback_cur->save = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
vgacon_scrollback_cur->restore = 0;
|
|
||||||
start = vgacon_scrollback_cur->cur + lines;
|
|
||||||
end = start + abs(lines);
|
|
||||||
|
|
||||||
if (start < 0)
|
|
||||||
start = 0;
|
|
||||||
|
|
||||||
if (start > vgacon_scrollback_cur->cnt)
|
|
||||||
start = vgacon_scrollback_cur->cnt;
|
|
||||||
|
|
||||||
if (end < 0)
|
|
||||||
end = 0;
|
|
||||||
|
|
||||||
if (end > vgacon_scrollback_cur->cnt)
|
|
||||||
end = vgacon_scrollback_cur->cnt;
|
|
||||||
|
|
||||||
vgacon_scrollback_cur->cur = start;
|
|
||||||
count = end - start;
|
|
||||||
soff = vgacon_scrollback_cur->tail -
|
|
||||||
((vgacon_scrollback_cur->cnt - end) * c->vc_size_row);
|
|
||||||
soff -= count * c->vc_size_row;
|
|
||||||
|
|
||||||
if (soff < 0)
|
|
||||||
soff += vgacon_scrollback_cur->size;
|
|
||||||
|
|
||||||
count = vgacon_scrollback_cur->cnt - start;
|
|
||||||
|
|
||||||
if (count > c->vc_rows)
|
|
||||||
count = c->vc_rows;
|
|
||||||
|
|
||||||
if (count) {
|
|
||||||
int copysize;
|
|
||||||
|
|
||||||
int diff = c->vc_rows - count;
|
|
||||||
void *d = (void *) c->vc_visible_origin;
|
|
||||||
void *s = (void *) c->vc_screenbuf;
|
|
||||||
|
|
||||||
count *= c->vc_size_row;
|
|
||||||
/* how much memory to end of buffer left? */
|
|
||||||
copysize = min(count, vgacon_scrollback_cur->size - soff);
|
|
||||||
scr_memcpyw(d, vgacon_scrollback_cur->data + soff, copysize);
|
|
||||||
d += copysize;
|
|
||||||
count -= copysize;
|
|
||||||
|
|
||||||
if (count) {
|
|
||||||
scr_memcpyw(d, vgacon_scrollback_cur->data, count);
|
|
||||||
d += count;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (diff)
|
|
||||||
scr_memcpyw(d, s, diff * c->vc_size_row);
|
|
||||||
} else
|
|
||||||
vgacon_cursor(c, CM_MOVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vgacon_flush_scrollback(struct vc_data *c)
|
|
||||||
{
|
|
||||||
size_t size = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024;
|
|
||||||
|
|
||||||
vgacon_scrollback_reset(c->vc_num, size);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define vgacon_scrollback_startup(...) do { } while (0)
|
|
||||||
#define vgacon_scrollback_init(...) do { } while (0)
|
|
||||||
#define vgacon_scrollback_update(...) do { } while (0)
|
|
||||||
#define vgacon_scrollback_switch(...) do { } while (0)
|
|
||||||
|
|
||||||
static void vgacon_restore_screen(struct vc_data *c)
|
static void vgacon_restore_screen(struct vc_data *c)
|
||||||
{
|
{
|
||||||
if (c->vc_origin != c->vc_visible_origin)
|
if (c->vc_origin != c->vc_visible_origin)
|
||||||
|
@ -386,11 +178,6 @@ static void vgacon_scrolldelta(struct vc_data *c, int lines)
|
||||||
vga_set_mem_top(c);
|
vga_set_mem_top(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vgacon_flush_scrollback(struct vc_data *c)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_VGACON_SOFT_SCROLLBACK */
|
|
||||||
|
|
||||||
static const char *vgacon_startup(void)
|
static const char *vgacon_startup(void)
|
||||||
{
|
{
|
||||||
const char *display_desc = NULL;
|
const char *display_desc = NULL;
|
||||||
|
@ -573,10 +360,7 @@ static const char *vgacon_startup(void)
|
||||||
vgacon_xres = screen_info.orig_video_cols * VGA_FONTWIDTH;
|
vgacon_xres = screen_info.orig_video_cols * VGA_FONTWIDTH;
|
||||||
vgacon_yres = vga_scan_lines;
|
vgacon_yres = vga_scan_lines;
|
||||||
|
|
||||||
if (!vga_init_done) {
|
vga_init_done = true;
|
||||||
vgacon_scrollback_startup();
|
|
||||||
vga_init_done = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return display_desc;
|
return display_desc;
|
||||||
}
|
}
|
||||||
|
@ -867,7 +651,6 @@ static int vgacon_switch(struct vc_data *c)
|
||||||
vgacon_doresize(c, c->vc_cols, c->vc_rows);
|
vgacon_doresize(c, c->vc_cols, c->vc_rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
vgacon_scrollback_switch(c->vc_num);
|
|
||||||
return 0; /* Redrawing not needed */
|
return 0; /* Redrawing not needed */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1384,7 +1167,6 @@ static bool vgacon_scroll(struct vc_data *c, unsigned int t, unsigned int b,
|
||||||
oldo = c->vc_origin;
|
oldo = c->vc_origin;
|
||||||
delta = lines * c->vc_size_row;
|
delta = lines * c->vc_size_row;
|
||||||
if (dir == SM_UP) {
|
if (dir == SM_UP) {
|
||||||
vgacon_scrollback_update(c, t, lines);
|
|
||||||
if (c->vc_scr_end + delta >= vga_vram_end) {
|
if (c->vc_scr_end + delta >= vga_vram_end) {
|
||||||
scr_memcpyw((u16 *) vga_vram_base,
|
scr_memcpyw((u16 *) vga_vram_base,
|
||||||
(u16 *) (oldo + delta),
|
(u16 *) (oldo + delta),
|
||||||
|
@ -1448,7 +1230,6 @@ const struct consw vga_con = {
|
||||||
.con_save_screen = vgacon_save_screen,
|
.con_save_screen = vgacon_save_screen,
|
||||||
.con_build_attr = vgacon_build_attr,
|
.con_build_attr = vgacon_build_attr,
|
||||||
.con_invert_region = vgacon_invert_region,
|
.con_invert_region = vgacon_invert_region,
|
||||||
.con_flush_scrollback = vgacon_flush_scrollback,
|
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL(vga_con);
|
EXPORT_SYMBOL(vga_con);
|
||||||
|
|
||||||
|
|
|
@ -234,7 +234,7 @@ static void bit_clear_margins(struct vc_data *vc, struct fb_info *info,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||||
int softback_lines, int fg, int bg)
|
int fg, int bg)
|
||||||
{
|
{
|
||||||
struct fb_cursor cursor;
|
struct fb_cursor cursor;
|
||||||
struct fbcon_ops *ops = info->fbcon_par;
|
struct fbcon_ops *ops = info->fbcon_par;
|
||||||
|
@ -247,15 +247,6 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||||
|
|
||||||
cursor.set = 0;
|
cursor.set = 0;
|
||||||
|
|
||||||
if (softback_lines) {
|
|
||||||
if (y + softback_lines >= vc->vc_rows) {
|
|
||||||
mode = CM_ERASE;
|
|
||||||
ops->cursor_flash = 0;
|
|
||||||
return;
|
|
||||||
} else
|
|
||||||
y += softback_lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
c = scr_readw((u16 *) vc->vc_pos);
|
c = scr_readw((u16 *) vc->vc_pos);
|
||||||
attribute = get_attribute(info, c);
|
attribute = get_attribute(info, c);
|
||||||
src = vc->vc_font.data + ((c & charmask) * (w * vc->vc_font.height));
|
src = vc->vc_font.data + ((c & charmask) * (w * vc->vc_font.height));
|
||||||
|
|
|
@ -102,12 +102,6 @@ static int logo_lines;
|
||||||
/* logo_shown is an index to vc_cons when >= 0; otherwise follows FBCON_LOGO
|
/* logo_shown is an index to vc_cons when >= 0; otherwise follows FBCON_LOGO
|
||||||
enums. */
|
enums. */
|
||||||
static int logo_shown = FBCON_LOGO_CANSHOW;
|
static int logo_shown = FBCON_LOGO_CANSHOW;
|
||||||
/* Software scrollback */
|
|
||||||
static int fbcon_softback_size = 32768;
|
|
||||||
static unsigned long softback_buf, softback_curr;
|
|
||||||
static unsigned long softback_in;
|
|
||||||
static unsigned long softback_top, softback_end;
|
|
||||||
static int softback_lines;
|
|
||||||
/* console mappings */
|
/* console mappings */
|
||||||
static int first_fb_vc;
|
static int first_fb_vc;
|
||||||
static int last_fb_vc = MAX_NR_CONSOLES - 1;
|
static int last_fb_vc = MAX_NR_CONSOLES - 1;
|
||||||
|
@ -148,8 +142,6 @@ static int margin_color;
|
||||||
|
|
||||||
static const struct consw fb_con;
|
static const struct consw fb_con;
|
||||||
|
|
||||||
#define CM_SOFTBACK (8)
|
|
||||||
|
|
||||||
#define advance_row(p, delta) (unsigned short *)((unsigned long)(p) + (delta) * vc->vc_size_row)
|
#define advance_row(p, delta) (unsigned short *)((unsigned long)(p) + (delta) * vc->vc_size_row)
|
||||||
|
|
||||||
static int fbcon_set_origin(struct vc_data *);
|
static int fbcon_set_origin(struct vc_data *);
|
||||||
|
@ -355,18 +347,6 @@ static int get_color(struct vc_data *vc, struct fb_info *info,
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fbcon_update_softback(struct vc_data *vc)
|
|
||||||
{
|
|
||||||
int l = fbcon_softback_size / vc->vc_size_row;
|
|
||||||
|
|
||||||
if (l > 5)
|
|
||||||
softback_end = softback_buf + l * vc->vc_size_row;
|
|
||||||
else
|
|
||||||
/* Smaller scrollback makes no sense, and 0 would screw
|
|
||||||
the operation totally */
|
|
||||||
softback_top = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fb_flashcursor(struct work_struct *work)
|
static void fb_flashcursor(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct fb_info *info = container_of(work, struct fb_info, queue);
|
struct fb_info *info = container_of(work, struct fb_info, queue);
|
||||||
|
@ -396,7 +376,7 @@ static void fb_flashcursor(struct work_struct *work)
|
||||||
c = scr_readw((u16 *) vc->vc_pos);
|
c = scr_readw((u16 *) vc->vc_pos);
|
||||||
mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
|
mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
|
||||||
CM_ERASE : CM_DRAW;
|
CM_ERASE : CM_DRAW;
|
||||||
ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),
|
ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
|
||||||
get_color(vc, info, c, 0));
|
get_color(vc, info, c, 0));
|
||||||
console_unlock();
|
console_unlock();
|
||||||
}
|
}
|
||||||
|
@ -453,13 +433,7 @@ static int __init fb_console_setup(char *this_opt)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strncmp(options, "scrollback:", 11)) {
|
if (!strncmp(options, "scrollback:", 11)) {
|
||||||
options += 11;
|
pr_warn("Ignoring scrollback size option\n");
|
||||||
if (*options) {
|
|
||||||
fbcon_softback_size = simple_strtoul(options, &options, 0);
|
|
||||||
if (*options == 'k' || *options == 'K') {
|
|
||||||
fbcon_softback_size *= 1024;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -988,31 +962,6 @@ static const char *fbcon_startup(void)
|
||||||
|
|
||||||
set_blitting_type(vc, info);
|
set_blitting_type(vc, info);
|
||||||
|
|
||||||
if (info->fix.type != FB_TYPE_TEXT) {
|
|
||||||
if (fbcon_softback_size) {
|
|
||||||
if (!softback_buf) {
|
|
||||||
softback_buf =
|
|
||||||
(unsigned long)
|
|
||||||
kmalloc(fbcon_softback_size,
|
|
||||||
GFP_KERNEL);
|
|
||||||
if (!softback_buf) {
|
|
||||||
fbcon_softback_size = 0;
|
|
||||||
softback_top = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (softback_buf) {
|
|
||||||
kfree((void *) softback_buf);
|
|
||||||
softback_buf = 0;
|
|
||||||
softback_top = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (softback_buf)
|
|
||||||
softback_in = softback_top = softback_curr =
|
|
||||||
softback_buf;
|
|
||||||
softback_lines = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setup default font */
|
/* Setup default font */
|
||||||
if (!p->fontdata && !vc->vc_font.data) {
|
if (!p->fontdata && !vc->vc_font.data) {
|
||||||
if (!fontname[0] || !(font = find_font(fontname)))
|
if (!fontname[0] || !(font = find_font(fontname)))
|
||||||
|
@ -1181,9 +1130,6 @@ static void fbcon_init(struct vc_data *vc, int init)
|
||||||
if (logo)
|
if (logo)
|
||||||
fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows);
|
fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows);
|
||||||
|
|
||||||
if (vc == svc && softback_buf)
|
|
||||||
fbcon_update_softback(vc);
|
|
||||||
|
|
||||||
if (ops->rotate_font && ops->rotate_font(info, vc)) {
|
if (ops->rotate_font && ops->rotate_font(info, vc)) {
|
||||||
ops->rotate = FB_ROTATE_UR;
|
ops->rotate = FB_ROTATE_UR;
|
||||||
set_blitting_type(vc, info);
|
set_blitting_type(vc, info);
|
||||||
|
@ -1346,7 +1292,6 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
|
||||||
{
|
{
|
||||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||||
struct fbcon_ops *ops = info->fbcon_par;
|
struct fbcon_ops *ops = info->fbcon_par;
|
||||||
int y;
|
|
||||||
int c = scr_readw((u16 *) vc->vc_pos);
|
int c = scr_readw((u16 *) vc->vc_pos);
|
||||||
|
|
||||||
ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
|
ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
|
||||||
|
@ -1360,16 +1305,8 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
|
||||||
fbcon_add_cursor_timer(info);
|
fbcon_add_cursor_timer(info);
|
||||||
|
|
||||||
ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
|
ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
|
||||||
if (mode & CM_SOFTBACK) {
|
|
||||||
mode &= ~CM_SOFTBACK;
|
|
||||||
y = softback_lines;
|
|
||||||
} else {
|
|
||||||
if (softback_lines)
|
|
||||||
fbcon_set_origin(vc);
|
|
||||||
y = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ops->cursor(vc, info, mode, y, get_color(vc, info, c, 1),
|
ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
|
||||||
get_color(vc, info, c, 0));
|
get_color(vc, info, c, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1440,8 +1377,6 @@ static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
|
||||||
|
|
||||||
if (con_is_visible(vc)) {
|
if (con_is_visible(vc)) {
|
||||||
update_screen(vc);
|
update_screen(vc);
|
||||||
if (softback_buf)
|
|
||||||
fbcon_update_softback(vc);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1579,99 +1514,6 @@ static __inline__ void ypan_down_redraw(struct vc_data *vc, int t, int count)
|
||||||
scrollback_current = 0;
|
scrollback_current = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fbcon_redraw_softback(struct vc_data *vc, struct display *p,
|
|
||||||
long delta)
|
|
||||||
{
|
|
||||||
int count = vc->vc_rows;
|
|
||||||
unsigned short *d, *s;
|
|
||||||
unsigned long n;
|
|
||||||
int line = 0;
|
|
||||||
|
|
||||||
d = (u16 *) softback_curr;
|
|
||||||
if (d == (u16 *) softback_in)
|
|
||||||
d = (u16 *) vc->vc_origin;
|
|
||||||
n = softback_curr + delta * vc->vc_size_row;
|
|
||||||
softback_lines -= delta;
|
|
||||||
if (delta < 0) {
|
|
||||||
if (softback_curr < softback_top && n < softback_buf) {
|
|
||||||
n += softback_end - softback_buf;
|
|
||||||
if (n < softback_top) {
|
|
||||||
softback_lines -=
|
|
||||||
(softback_top - n) / vc->vc_size_row;
|
|
||||||
n = softback_top;
|
|
||||||
}
|
|
||||||
} else if (softback_curr >= softback_top
|
|
||||||
&& n < softback_top) {
|
|
||||||
softback_lines -=
|
|
||||||
(softback_top - n) / vc->vc_size_row;
|
|
||||||
n = softback_top;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (softback_curr > softback_in && n >= softback_end) {
|
|
||||||
n += softback_buf - softback_end;
|
|
||||||
if (n > softback_in) {
|
|
||||||
n = softback_in;
|
|
||||||
softback_lines = 0;
|
|
||||||
}
|
|
||||||
} else if (softback_curr <= softback_in && n > softback_in) {
|
|
||||||
n = softback_in;
|
|
||||||
softback_lines = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (n == softback_curr)
|
|
||||||
return;
|
|
||||||
softback_curr = n;
|
|
||||||
s = (u16 *) softback_curr;
|
|
||||||
if (s == (u16 *) softback_in)
|
|
||||||
s = (u16 *) vc->vc_origin;
|
|
||||||
while (count--) {
|
|
||||||
unsigned short *start;
|
|
||||||
unsigned short *le;
|
|
||||||
unsigned short c;
|
|
||||||
int x = 0;
|
|
||||||
unsigned short attr = 1;
|
|
||||||
|
|
||||||
start = s;
|
|
||||||
le = advance_row(s, 1);
|
|
||||||
do {
|
|
||||||
c = scr_readw(s);
|
|
||||||
if (attr != (c & 0xff00)) {
|
|
||||||
attr = c & 0xff00;
|
|
||||||
if (s > start) {
|
|
||||||
fbcon_putcs(vc, start, s - start,
|
|
||||||
line, x);
|
|
||||||
x += s - start;
|
|
||||||
start = s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (c == scr_readw(d)) {
|
|
||||||
if (s > start) {
|
|
||||||
fbcon_putcs(vc, start, s - start,
|
|
||||||
line, x);
|
|
||||||
x += s - start + 1;
|
|
||||||
start = s + 1;
|
|
||||||
} else {
|
|
||||||
x++;
|
|
||||||
start++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s++;
|
|
||||||
d++;
|
|
||||||
} while (s < le);
|
|
||||||
if (s > start)
|
|
||||||
fbcon_putcs(vc, start, s - start, line, x);
|
|
||||||
line++;
|
|
||||||
if (d == (u16 *) softback_end)
|
|
||||||
d = (u16 *) softback_buf;
|
|
||||||
if (d == (u16 *) softback_in)
|
|
||||||
d = (u16 *) vc->vc_origin;
|
|
||||||
if (s == (u16 *) softback_end)
|
|
||||||
s = (u16 *) softback_buf;
|
|
||||||
if (s == (u16 *) softback_in)
|
|
||||||
s = (u16 *) vc->vc_origin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fbcon_redraw_move(struct vc_data *vc, struct display *p,
|
static void fbcon_redraw_move(struct vc_data *vc, struct display *p,
|
||||||
int line, int count, int dy)
|
int line, int count, int dy)
|
||||||
{
|
{
|
||||||
|
@ -1811,31 +1653,6 @@ static void fbcon_redraw(struct vc_data *vc, struct display *p,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void fbcon_softback_note(struct vc_data *vc, int t,
|
|
||||||
int count)
|
|
||||||
{
|
|
||||||
unsigned short *p;
|
|
||||||
|
|
||||||
if (vc->vc_num != fg_console)
|
|
||||||
return;
|
|
||||||
p = (unsigned short *) (vc->vc_origin + t * vc->vc_size_row);
|
|
||||||
|
|
||||||
while (count) {
|
|
||||||
scr_memcpyw((u16 *) softback_in, p, vc->vc_size_row);
|
|
||||||
count--;
|
|
||||||
p = advance_row(p, 1);
|
|
||||||
softback_in += vc->vc_size_row;
|
|
||||||
if (softback_in == softback_end)
|
|
||||||
softback_in = softback_buf;
|
|
||||||
if (softback_in == softback_top) {
|
|
||||||
softback_top += vc->vc_size_row;
|
|
||||||
if (softback_top == softback_end)
|
|
||||||
softback_top = softback_buf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
softback_curr = softback_in;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
|
static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
|
||||||
enum con_scroll dir, unsigned int count)
|
enum con_scroll dir, unsigned int count)
|
||||||
{
|
{
|
||||||
|
@ -1858,8 +1675,6 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
|
||||||
case SM_UP:
|
case SM_UP:
|
||||||
if (count > vc->vc_rows) /* Maximum realistic size */
|
if (count > vc->vc_rows) /* Maximum realistic size */
|
||||||
count = vc->vc_rows;
|
count = vc->vc_rows;
|
||||||
if (softback_top)
|
|
||||||
fbcon_softback_note(vc, t, count);
|
|
||||||
if (logo_shown >= 0)
|
if (logo_shown >= 0)
|
||||||
goto redraw_up;
|
goto redraw_up;
|
||||||
switch (p->scrollmode) {
|
switch (p->scrollmode) {
|
||||||
|
@ -2230,14 +2045,6 @@ static int fbcon_switch(struct vc_data *vc)
|
||||||
info = registered_fb[con2fb_map[vc->vc_num]];
|
info = registered_fb[con2fb_map[vc->vc_num]];
|
||||||
ops = info->fbcon_par;
|
ops = info->fbcon_par;
|
||||||
|
|
||||||
if (softback_top) {
|
|
||||||
if (softback_lines)
|
|
||||||
fbcon_set_origin(vc);
|
|
||||||
softback_top = softback_curr = softback_in = softback_buf;
|
|
||||||
softback_lines = 0;
|
|
||||||
fbcon_update_softback(vc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (logo_shown >= 0) {
|
if (logo_shown >= 0) {
|
||||||
struct vc_data *conp2 = vc_cons[logo_shown].d;
|
struct vc_data *conp2 = vc_cons[logo_shown].d;
|
||||||
|
|
||||||
|
@ -2571,9 +2378,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
||||||
int cnt;
|
int cnt;
|
||||||
char *old_data = NULL;
|
char *old_data = NULL;
|
||||||
|
|
||||||
if (con_is_visible(vc) && softback_lines)
|
|
||||||
fbcon_set_origin(vc);
|
|
||||||
|
|
||||||
resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
|
resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
|
||||||
if (p->userfont)
|
if (p->userfont)
|
||||||
old_data = vc->vc_font.data;
|
old_data = vc->vc_font.data;
|
||||||
|
@ -2599,8 +2403,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
||||||
cols /= w;
|
cols /= w;
|
||||||
rows /= h;
|
rows /= h;
|
||||||
vc_resize(vc, cols, rows);
|
vc_resize(vc, cols, rows);
|
||||||
if (con_is_visible(vc) && softback_buf)
|
|
||||||
fbcon_update_softback(vc);
|
|
||||||
} else if (con_is_visible(vc)
|
} else if (con_is_visible(vc)
|
||||||
&& vc->vc_mode == KD_TEXT) {
|
&& vc->vc_mode == KD_TEXT) {
|
||||||
fbcon_clear_margins(vc, 0);
|
fbcon_clear_margins(vc, 0);
|
||||||
|
@ -2759,19 +2561,7 @@ static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table)
|
||||||
|
|
||||||
static u16 *fbcon_screen_pos(struct vc_data *vc, int offset)
|
static u16 *fbcon_screen_pos(struct vc_data *vc, int offset)
|
||||||
{
|
{
|
||||||
unsigned long p;
|
return (u16 *) (vc->vc_origin + offset);
|
||||||
int line;
|
|
||||||
|
|
||||||
if (vc->vc_num != fg_console || !softback_lines)
|
|
||||||
return (u16 *) (vc->vc_origin + offset);
|
|
||||||
line = offset / vc->vc_size_row;
|
|
||||||
if (line >= softback_lines)
|
|
||||||
return (u16 *) (vc->vc_origin + offset -
|
|
||||||
softback_lines * vc->vc_size_row);
|
|
||||||
p = softback_curr + offset;
|
|
||||||
if (p >= softback_end)
|
|
||||||
p += softback_buf - softback_end;
|
|
||||||
return (u16 *) p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
|
static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
|
||||||
|
@ -2785,22 +2575,7 @@ static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
|
||||||
|
|
||||||
x = offset % vc->vc_cols;
|
x = offset % vc->vc_cols;
|
||||||
y = offset / vc->vc_cols;
|
y = offset / vc->vc_cols;
|
||||||
if (vc->vc_num == fg_console)
|
|
||||||
y += softback_lines;
|
|
||||||
ret = pos + (vc->vc_cols - x) * 2;
|
ret = pos + (vc->vc_cols - x) * 2;
|
||||||
} else if (vc->vc_num == fg_console && softback_lines) {
|
|
||||||
unsigned long offset = pos - softback_curr;
|
|
||||||
|
|
||||||
if (pos < softback_curr)
|
|
||||||
offset += softback_end - softback_buf;
|
|
||||||
offset /= 2;
|
|
||||||
x = offset % vc->vc_cols;
|
|
||||||
y = offset / vc->vc_cols;
|
|
||||||
ret = pos + (vc->vc_cols - x) * 2;
|
|
||||||
if (ret == softback_end)
|
|
||||||
ret = softback_buf;
|
|
||||||
if (ret == softback_in)
|
|
||||||
ret = vc->vc_origin;
|
|
||||||
} else {
|
} else {
|
||||||
/* Should not happen */
|
/* Should not happen */
|
||||||
x = y = 0;
|
x = y = 0;
|
||||||
|
@ -2828,106 +2603,11 @@ static void fbcon_invert_region(struct vc_data *vc, u16 * p, int cnt)
|
||||||
a = ((a) & 0x88ff) | (((a) & 0x7000) >> 4) |
|
a = ((a) & 0x88ff) | (((a) & 0x7000) >> 4) |
|
||||||
(((a) & 0x0700) << 4);
|
(((a) & 0x0700) << 4);
|
||||||
scr_writew(a, p++);
|
scr_writew(a, p++);
|
||||||
if (p == (u16 *) softback_end)
|
|
||||||
p = (u16 *) softback_buf;
|
|
||||||
if (p == (u16 *) softback_in)
|
|
||||||
p = (u16 *) vc->vc_origin;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fbcon_scrolldelta(struct vc_data *vc, int lines)
|
|
||||||
{
|
|
||||||
struct fb_info *info = registered_fb[con2fb_map[fg_console]];
|
|
||||||
struct fbcon_ops *ops = info->fbcon_par;
|
|
||||||
struct display *disp = &fb_display[fg_console];
|
|
||||||
int offset, limit, scrollback_old;
|
|
||||||
|
|
||||||
if (softback_top) {
|
|
||||||
if (vc->vc_num != fg_console)
|
|
||||||
return;
|
|
||||||
if (vc->vc_mode != KD_TEXT || !lines)
|
|
||||||
return;
|
|
||||||
if (logo_shown >= 0) {
|
|
||||||
struct vc_data *conp2 = vc_cons[logo_shown].d;
|
|
||||||
|
|
||||||
if (conp2->vc_top == logo_lines
|
|
||||||
&& conp2->vc_bottom == conp2->vc_rows)
|
|
||||||
conp2->vc_top = 0;
|
|
||||||
if (logo_shown == vc->vc_num) {
|
|
||||||
unsigned long p, q;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
p = softback_in;
|
|
||||||
q = vc->vc_origin +
|
|
||||||
logo_lines * vc->vc_size_row;
|
|
||||||
for (i = 0; i < logo_lines; i++) {
|
|
||||||
if (p == softback_top)
|
|
||||||
break;
|
|
||||||
if (p == softback_buf)
|
|
||||||
p = softback_end;
|
|
||||||
p -= vc->vc_size_row;
|
|
||||||
q -= vc->vc_size_row;
|
|
||||||
scr_memcpyw((u16 *) q, (u16 *) p,
|
|
||||||
vc->vc_size_row);
|
|
||||||
}
|
|
||||||
softback_in = softback_curr = p;
|
|
||||||
update_region(vc, vc->vc_origin,
|
|
||||||
logo_lines * vc->vc_cols);
|
|
||||||
}
|
|
||||||
logo_shown = FBCON_LOGO_CANSHOW;
|
|
||||||
}
|
|
||||||
fbcon_cursor(vc, CM_ERASE | CM_SOFTBACK);
|
|
||||||
fbcon_redraw_softback(vc, disp, lines);
|
|
||||||
fbcon_cursor(vc, CM_DRAW | CM_SOFTBACK);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!scrollback_phys_max)
|
|
||||||
return;
|
|
||||||
|
|
||||||
scrollback_old = scrollback_current;
|
|
||||||
scrollback_current -= lines;
|
|
||||||
if (scrollback_current < 0)
|
|
||||||
scrollback_current = 0;
|
|
||||||
else if (scrollback_current > scrollback_max)
|
|
||||||
scrollback_current = scrollback_max;
|
|
||||||
if (scrollback_current == scrollback_old)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (fbcon_is_inactive(vc, info))
|
|
||||||
return;
|
|
||||||
|
|
||||||
fbcon_cursor(vc, CM_ERASE);
|
|
||||||
|
|
||||||
offset = disp->yscroll - scrollback_current;
|
|
||||||
limit = disp->vrows;
|
|
||||||
switch (disp->scrollmode) {
|
|
||||||
case SCROLL_WRAP_MOVE:
|
|
||||||
info->var.vmode |= FB_VMODE_YWRAP;
|
|
||||||
break;
|
|
||||||
case SCROLL_PAN_MOVE:
|
|
||||||
case SCROLL_PAN_REDRAW:
|
|
||||||
limit -= vc->vc_rows;
|
|
||||||
info->var.vmode &= ~FB_VMODE_YWRAP;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (offset < 0)
|
|
||||||
offset += limit;
|
|
||||||
else if (offset >= limit)
|
|
||||||
offset -= limit;
|
|
||||||
|
|
||||||
ops->var.xoffset = 0;
|
|
||||||
ops->var.yoffset = offset * vc->vc_font.height;
|
|
||||||
ops->update_start(info);
|
|
||||||
|
|
||||||
if (!scrollback_current)
|
|
||||||
fbcon_cursor(vc, CM_DRAW);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int fbcon_set_origin(struct vc_data *vc)
|
static int fbcon_set_origin(struct vc_data *vc)
|
||||||
{
|
{
|
||||||
if (softback_lines)
|
|
||||||
fbcon_scrolldelta(vc, softback_lines);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2991,8 +2671,6 @@ static void fbcon_modechanged(struct fb_info *info)
|
||||||
|
|
||||||
fbcon_set_palette(vc, color_table);
|
fbcon_set_palette(vc, color_table);
|
||||||
update_screen(vc);
|
update_screen(vc);
|
||||||
if (softback_buf)
|
|
||||||
fbcon_update_softback(vc);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3434,7 +3112,6 @@ static const struct consw fb_con = {
|
||||||
.con_font_default = fbcon_set_def_font,
|
.con_font_default = fbcon_set_def_font,
|
||||||
.con_font_copy = fbcon_copy_font,
|
.con_font_copy = fbcon_copy_font,
|
||||||
.con_set_palette = fbcon_set_palette,
|
.con_set_palette = fbcon_set_palette,
|
||||||
.con_scrolldelta = fbcon_scrolldelta,
|
|
||||||
.con_set_origin = fbcon_set_origin,
|
.con_set_origin = fbcon_set_origin,
|
||||||
.con_invert_region = fbcon_invert_region,
|
.con_invert_region = fbcon_invert_region,
|
||||||
.con_screen_pos = fbcon_screen_pos,
|
.con_screen_pos = fbcon_screen_pos,
|
||||||
|
@ -3691,9 +3368,6 @@ static void fbcon_exit(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
kfree((void *)softback_buf);
|
|
||||||
softback_buf = 0UL;
|
|
||||||
|
|
||||||
for_each_registered_fb(i) {
|
for_each_registered_fb(i) {
|
||||||
int pending = 0;
|
int pending = 0;
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ struct fbcon_ops {
|
||||||
void (*clear_margins)(struct vc_data *vc, struct fb_info *info,
|
void (*clear_margins)(struct vc_data *vc, struct fb_info *info,
|
||||||
int color, int bottom_only);
|
int color, int bottom_only);
|
||||||
void (*cursor)(struct vc_data *vc, struct fb_info *info, int mode,
|
void (*cursor)(struct vc_data *vc, struct fb_info *info, int mode,
|
||||||
int softback_lines, int fg, int bg);
|
int fg, int bg);
|
||||||
int (*update_start)(struct fb_info *info);
|
int (*update_start)(struct fb_info *info);
|
||||||
int (*rotate_font)(struct fb_info *info, struct vc_data *vc);
|
int (*rotate_font)(struct fb_info *info, struct vc_data *vc);
|
||||||
struct fb_var_screeninfo var; /* copy of the current fb_var_screeninfo */
|
struct fb_var_screeninfo var; /* copy of the current fb_var_screeninfo */
|
||||||
|
|
|
@ -219,7 +219,7 @@ static void ccw_clear_margins(struct vc_data *vc, struct fb_info *info,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||||
int softback_lines, int fg, int bg)
|
int fg, int bg)
|
||||||
{
|
{
|
||||||
struct fb_cursor cursor;
|
struct fb_cursor cursor;
|
||||||
struct fbcon_ops *ops = info->fbcon_par;
|
struct fbcon_ops *ops = info->fbcon_par;
|
||||||
|
@ -236,15 +236,6 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||||
|
|
||||||
cursor.set = 0;
|
cursor.set = 0;
|
||||||
|
|
||||||
if (softback_lines) {
|
|
||||||
if (y + softback_lines >= vc->vc_rows) {
|
|
||||||
mode = CM_ERASE;
|
|
||||||
ops->cursor_flash = 0;
|
|
||||||
return;
|
|
||||||
} else
|
|
||||||
y += softback_lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
c = scr_readw((u16 *) vc->vc_pos);
|
c = scr_readw((u16 *) vc->vc_pos);
|
||||||
attribute = get_attribute(info, c);
|
attribute = get_attribute(info, c);
|
||||||
src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
|
src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
|
||||||
|
|
|
@ -202,7 +202,7 @@ static void cw_clear_margins(struct vc_data *vc, struct fb_info *info,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||||
int softback_lines, int fg, int bg)
|
int fg, int bg)
|
||||||
{
|
{
|
||||||
struct fb_cursor cursor;
|
struct fb_cursor cursor;
|
||||||
struct fbcon_ops *ops = info->fbcon_par;
|
struct fbcon_ops *ops = info->fbcon_par;
|
||||||
|
@ -219,15 +219,6 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||||
|
|
||||||
cursor.set = 0;
|
cursor.set = 0;
|
||||||
|
|
||||||
if (softback_lines) {
|
|
||||||
if (y + softback_lines >= vc->vc_rows) {
|
|
||||||
mode = CM_ERASE;
|
|
||||||
ops->cursor_flash = 0;
|
|
||||||
return;
|
|
||||||
} else
|
|
||||||
y += softback_lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
c = scr_readw((u16 *) vc->vc_pos);
|
c = scr_readw((u16 *) vc->vc_pos);
|
||||||
attribute = get_attribute(info, c);
|
attribute = get_attribute(info, c);
|
||||||
src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
|
src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
|
||||||
|
|
|
@ -249,7 +249,7 @@ static void ud_clear_margins(struct vc_data *vc, struct fb_info *info,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||||
int softback_lines, int fg, int bg)
|
int fg, int bg)
|
||||||
{
|
{
|
||||||
struct fb_cursor cursor;
|
struct fb_cursor cursor;
|
||||||
struct fbcon_ops *ops = info->fbcon_par;
|
struct fbcon_ops *ops = info->fbcon_par;
|
||||||
|
@ -267,15 +267,6 @@ static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||||
|
|
||||||
cursor.set = 0;
|
cursor.set = 0;
|
||||||
|
|
||||||
if (softback_lines) {
|
|
||||||
if (y + softback_lines >= vc->vc_rows) {
|
|
||||||
mode = CM_ERASE;
|
|
||||||
ops->cursor_flash = 0;
|
|
||||||
return;
|
|
||||||
} else
|
|
||||||
y += softback_lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
c = scr_readw((u16 *) vc->vc_pos);
|
c = scr_readw((u16 *) vc->vc_pos);
|
||||||
attribute = get_attribute(info, c);
|
attribute = get_attribute(info, c);
|
||||||
src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.height));
|
src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.height));
|
||||||
|
|
|
@ -80,7 +80,7 @@ static void tile_clear_margins(struct vc_data *vc, struct fb_info *info,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tile_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
static void tile_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||||
int softback_lines, int fg, int bg)
|
int fg, int bg)
|
||||||
{
|
{
|
||||||
struct fb_tilecursor cursor;
|
struct fb_tilecursor cursor;
|
||||||
int use_sw = (vc->vc_cursor_type & 0x10);
|
int use_sw = (vc->vc_cursor_type & 0x10);
|
||||||
|
|
|
@ -1121,7 +1121,7 @@ static void vga_8planes_imageblit(struct fb_info *info, const struct fb_image *i
|
||||||
char oldop = setop(0);
|
char oldop = setop(0);
|
||||||
char oldsr = setsr(0);
|
char oldsr = setsr(0);
|
||||||
char oldmask = selectmask();
|
char oldmask = selectmask();
|
||||||
const char *cdat = image->data;
|
const unsigned char *cdat = image->data;
|
||||||
u32 dx = image->dx;
|
u32 dx = image->dx;
|
||||||
char __iomem *where;
|
char __iomem *where;
|
||||||
int y;
|
int y;
|
||||||
|
|
|
@ -1057,12 +1057,11 @@ int btrfs_get_extent_inline_ref_type(const struct extent_buffer *eb,
|
||||||
if (type == BTRFS_SHARED_BLOCK_REF_KEY) {
|
if (type == BTRFS_SHARED_BLOCK_REF_KEY) {
|
||||||
ASSERT(eb->fs_info);
|
ASSERT(eb->fs_info);
|
||||||
/*
|
/*
|
||||||
* Every shared one has parent tree
|
* Every shared one has parent tree block,
|
||||||
* block, which must be aligned to
|
* which must be aligned to sector size.
|
||||||
* nodesize.
|
|
||||||
*/
|
*/
|
||||||
if (offset &&
|
if (offset &&
|
||||||
IS_ALIGNED(offset, eb->fs_info->nodesize))
|
IS_ALIGNED(offset, eb->fs_info->sectorsize))
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
} else if (is_data == BTRFS_REF_TYPE_DATA) {
|
} else if (is_data == BTRFS_REF_TYPE_DATA) {
|
||||||
|
@ -1071,12 +1070,11 @@ int btrfs_get_extent_inline_ref_type(const struct extent_buffer *eb,
|
||||||
if (type == BTRFS_SHARED_DATA_REF_KEY) {
|
if (type == BTRFS_SHARED_DATA_REF_KEY) {
|
||||||
ASSERT(eb->fs_info);
|
ASSERT(eb->fs_info);
|
||||||
/*
|
/*
|
||||||
* Every shared one has parent tree
|
* Every shared one has parent tree block,
|
||||||
* block, which must be aligned to
|
* which must be aligned to sector size.
|
||||||
* nodesize.
|
|
||||||
*/
|
*/
|
||||||
if (offset &&
|
if (offset &&
|
||||||
IS_ALIGNED(offset, eb->fs_info->nodesize))
|
IS_ALIGNED(offset, eb->fs_info->sectorsize))
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1086,8 +1084,9 @@ int btrfs_get_extent_inline_ref_type(const struct extent_buffer *eb,
|
||||||
}
|
}
|
||||||
|
|
||||||
btrfs_print_leaf((struct extent_buffer *)eb);
|
btrfs_print_leaf((struct extent_buffer *)eb);
|
||||||
btrfs_err(eb->fs_info, "eb %llu invalid extent inline ref type %d",
|
btrfs_err(eb->fs_info,
|
||||||
eb->start, type);
|
"eb %llu iref 0x%lx invalid extent inline ref type %d",
|
||||||
|
eb->start, (unsigned long)iref, type);
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
|
|
||||||
return BTRFS_REF_TYPE_INVALID;
|
return BTRFS_REF_TYPE_INVALID;
|
||||||
|
|
|
@ -2189,7 +2189,8 @@ static noinline int search_ioctl(struct inode *inode,
|
||||||
key.offset = sk->min_offset;
|
key.offset = sk->min_offset;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
ret = fault_in_pages_writeable(ubuf, *buf_size - sk_offset);
|
ret = fault_in_pages_writeable(ubuf + sk_offset,
|
||||||
|
*buf_size - sk_offset);
|
||||||
if (ret)
|
if (ret)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -95,9 +95,10 @@ static void print_extent_item(struct extent_buffer *eb, int slot, int type)
|
||||||
* offset is supposed to be a tree block which
|
* offset is supposed to be a tree block which
|
||||||
* must be aligned to nodesize.
|
* must be aligned to nodesize.
|
||||||
*/
|
*/
|
||||||
if (!IS_ALIGNED(offset, eb->fs_info->nodesize))
|
if (!IS_ALIGNED(offset, eb->fs_info->sectorsize))
|
||||||
pr_info("\t\t\t(parent %llu is NOT ALIGNED to nodesize %llu)\n",
|
pr_info(
|
||||||
offset, (unsigned long long)eb->fs_info->nodesize);
|
"\t\t\t(parent %llu not aligned to sectorsize %u)\n",
|
||||||
|
offset, eb->fs_info->sectorsize);
|
||||||
break;
|
break;
|
||||||
case BTRFS_EXTENT_DATA_REF_KEY:
|
case BTRFS_EXTENT_DATA_REF_KEY:
|
||||||
dref = (struct btrfs_extent_data_ref *)(&iref->offset);
|
dref = (struct btrfs_extent_data_ref *)(&iref->offset);
|
||||||
|
@ -112,8 +113,9 @@ static void print_extent_item(struct extent_buffer *eb, int slot, int type)
|
||||||
* must be aligned to nodesize.
|
* must be aligned to nodesize.
|
||||||
*/
|
*/
|
||||||
if (!IS_ALIGNED(offset, eb->fs_info->nodesize))
|
if (!IS_ALIGNED(offset, eb->fs_info->nodesize))
|
||||||
pr_info("\t\t\t(parent %llu is NOT ALIGNED to nodesize %llu)\n",
|
pr_info(
|
||||||
offset, (unsigned long long)eb->fs_info->nodesize);
|
"\t\t\t(parent %llu not aligned to sectorsize %u)\n",
|
||||||
|
offset, eb->fs_info->sectorsize);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
pr_cont("(extent %llu has INVALID ref type %d)\n",
|
pr_cont("(extent %llu has INVALID ref type %d)\n",
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/sched/mm.h>
|
||||||
#include <linux/bio.h>
|
#include <linux/bio.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/buffer_head.h>
|
#include <linux/buffer_head.h>
|
||||||
|
@ -6292,8 +6293,17 @@ static struct btrfs_device *add_missing_dev(struct btrfs_fs_devices *fs_devices,
|
||||||
u64 devid, u8 *dev_uuid)
|
u64 devid, u8 *dev_uuid)
|
||||||
{
|
{
|
||||||
struct btrfs_device *device;
|
struct btrfs_device *device;
|
||||||
|
unsigned int nofs_flag;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We call this under the chunk_mutex, so we want to use NOFS for this
|
||||||
|
* allocation, however we don't want to change btrfs_alloc_device() to
|
||||||
|
* always do NOFS because we use it in a lot of other GFP_KERNEL safe
|
||||||
|
* places.
|
||||||
|
*/
|
||||||
|
nofs_flag = memalloc_nofs_save();
|
||||||
device = btrfs_alloc_device(NULL, &devid, dev_uuid);
|
device = btrfs_alloc_device(NULL, &devid, dev_uuid);
|
||||||
|
memalloc_nofs_restore(nofs_flag);
|
||||||
if (IS_ERR(device))
|
if (IS_ERR(device))
|
||||||
return device;
|
return device;
|
||||||
|
|
||||||
|
|
|
@ -551,8 +551,8 @@ xfs_attr_shortform_create(xfs_da_args_t *args)
|
||||||
ASSERT(ifp->if_flags & XFS_IFINLINE);
|
ASSERT(ifp->if_flags & XFS_IFINLINE);
|
||||||
}
|
}
|
||||||
xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK);
|
xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK);
|
||||||
hdr = (xfs_attr_sf_hdr_t *)ifp->if_u1.if_data;
|
hdr = (struct xfs_attr_sf_hdr *)ifp->if_u1.if_data;
|
||||||
hdr->count = 0;
|
memset(hdr, 0, sizeof(*hdr));
|
||||||
hdr->totsize = cpu_to_be16(sizeof(*hdr));
|
hdr->totsize = cpu_to_be16(sizeof(*hdr));
|
||||||
xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
|
xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,8 @@ struct ip_ct_sctp {
|
||||||
enum sctp_conntrack state;
|
enum sctp_conntrack state;
|
||||||
|
|
||||||
__be32 vtag[IP_CT_DIR_MAX];
|
__be32 vtag[IP_CT_DIR_MAX];
|
||||||
|
u8 last_dir;
|
||||||
|
u8 flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _NF_CONNTRACK_SCTP_H */
|
#endif /* _NF_CONNTRACK_SCTP_H */
|
||||||
|
|
|
@ -45,6 +45,12 @@
|
||||||
#define CTOP_INST_MOV2B_FLIP_R3_B1_B2_INST 0x5B60
|
#define CTOP_INST_MOV2B_FLIP_R3_B1_B2_INST 0x5B60
|
||||||
#define CTOP_INST_MOV2B_FLIP_R3_B1_B2_LIMM 0x00010422
|
#define CTOP_INST_MOV2B_FLIP_R3_B1_B2_LIMM 0x00010422
|
||||||
|
|
||||||
|
#ifndef AUX_IENABLE
|
||||||
|
#define AUX_IENABLE 0x40c
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CTOP_AUX_IACK (0xFFFFF800 + 0x088)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
/* In order to increase compilation test coverage */
|
/* In order to increase compilation test coverage */
|
||||||
|
|
|
@ -19,7 +19,9 @@
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include "gcov.h"
|
#include "gcov.h"
|
||||||
|
|
||||||
#if (__GNUC__ >= 7)
|
#if (__GNUC__ >= 10)
|
||||||
|
#define GCOV_COUNTERS 8
|
||||||
|
#elif (__GNUC__ >= 7)
|
||||||
#define GCOV_COUNTERS 9
|
#define GCOV_COUNTERS 9
|
||||||
#elif (__GNUC__ > 5) || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)
|
#elif (__GNUC__ > 5) || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)
|
||||||
#define GCOV_COUNTERS 10
|
#define GCOV_COUNTERS 10
|
||||||
|
|
|
@ -65,6 +65,8 @@ static const unsigned int sctp_timeouts[SCTP_CONNTRACK_MAX] = {
|
||||||
[SCTP_CONNTRACK_HEARTBEAT_ACKED] = 210 SECS,
|
[SCTP_CONNTRACK_HEARTBEAT_ACKED] = 210 SECS,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define SCTP_FLAG_HEARTBEAT_VTAG_FAILED 1
|
||||||
|
|
||||||
#define sNO SCTP_CONNTRACK_NONE
|
#define sNO SCTP_CONNTRACK_NONE
|
||||||
#define sCL SCTP_CONNTRACK_CLOSED
|
#define sCL SCTP_CONNTRACK_CLOSED
|
||||||
#define sCW SCTP_CONNTRACK_COOKIE_WAIT
|
#define sCW SCTP_CONNTRACK_COOKIE_WAIT
|
||||||
|
@ -288,6 +290,7 @@ static int sctp_packet(struct nf_conn *ct,
|
||||||
u_int32_t offset, count;
|
u_int32_t offset, count;
|
||||||
unsigned int *timeouts;
|
unsigned int *timeouts;
|
||||||
unsigned long map[256 / sizeof(unsigned long)] = { 0 };
|
unsigned long map[256 / sizeof(unsigned long)] = { 0 };
|
||||||
|
bool ignore = false;
|
||||||
|
|
||||||
sh = skb_header_pointer(skb, dataoff, sizeof(_sctph), &_sctph);
|
sh = skb_header_pointer(skb, dataoff, sizeof(_sctph), &_sctph);
|
||||||
if (sh == NULL)
|
if (sh == NULL)
|
||||||
|
@ -332,15 +335,39 @@ static int sctp_packet(struct nf_conn *ct,
|
||||||
/* Sec 8.5.1 (D) */
|
/* Sec 8.5.1 (D) */
|
||||||
if (sh->vtag != ct->proto.sctp.vtag[dir])
|
if (sh->vtag != ct->proto.sctp.vtag[dir])
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
} else if (sch->type == SCTP_CID_HEARTBEAT ||
|
} else if (sch->type == SCTP_CID_HEARTBEAT) {
|
||||||
sch->type == SCTP_CID_HEARTBEAT_ACK) {
|
if (ct->proto.sctp.vtag[dir] == 0) {
|
||||||
|
pr_debug("Setting %d vtag %x for dir %d\n", sch->type, sh->vtag, dir);
|
||||||
|
ct->proto.sctp.vtag[dir] = sh->vtag;
|
||||||
|
} else if (sh->vtag != ct->proto.sctp.vtag[dir]) {
|
||||||
|
if (test_bit(SCTP_CID_DATA, map) || ignore)
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
|
ct->proto.sctp.flags |= SCTP_FLAG_HEARTBEAT_VTAG_FAILED;
|
||||||
|
ct->proto.sctp.last_dir = dir;
|
||||||
|
ignore = true;
|
||||||
|
continue;
|
||||||
|
} else if (ct->proto.sctp.flags & SCTP_FLAG_HEARTBEAT_VTAG_FAILED) {
|
||||||
|
ct->proto.sctp.flags &= ~SCTP_FLAG_HEARTBEAT_VTAG_FAILED;
|
||||||
|
}
|
||||||
|
} else if (sch->type == SCTP_CID_HEARTBEAT_ACK) {
|
||||||
if (ct->proto.sctp.vtag[dir] == 0) {
|
if (ct->proto.sctp.vtag[dir] == 0) {
|
||||||
pr_debug("Setting vtag %x for dir %d\n",
|
pr_debug("Setting vtag %x for dir %d\n",
|
||||||
sh->vtag, dir);
|
sh->vtag, dir);
|
||||||
ct->proto.sctp.vtag[dir] = sh->vtag;
|
ct->proto.sctp.vtag[dir] = sh->vtag;
|
||||||
} else if (sh->vtag != ct->proto.sctp.vtag[dir]) {
|
} else if (sh->vtag != ct->proto.sctp.vtag[dir]) {
|
||||||
pr_debug("Verification tag check failed\n");
|
if (test_bit(SCTP_CID_DATA, map) || ignore)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
|
if ((ct->proto.sctp.flags & SCTP_FLAG_HEARTBEAT_VTAG_FAILED) == 0 ||
|
||||||
|
ct->proto.sctp.last_dir == dir)
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
|
ct->proto.sctp.flags &= ~SCTP_FLAG_HEARTBEAT_VTAG_FAILED;
|
||||||
|
ct->proto.sctp.vtag[dir] = sh->vtag;
|
||||||
|
ct->proto.sctp.vtag[!dir] = 0;
|
||||||
|
} else if (ct->proto.sctp.flags & SCTP_FLAG_HEARTBEAT_VTAG_FAILED) {
|
||||||
|
ct->proto.sctp.flags &= ~SCTP_FLAG_HEARTBEAT_VTAG_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,6 +402,10 @@ static int sctp_packet(struct nf_conn *ct,
|
||||||
}
|
}
|
||||||
spin_unlock_bh(&ct->lock);
|
spin_unlock_bh(&ct->lock);
|
||||||
|
|
||||||
|
/* allow but do not refresh timeout */
|
||||||
|
if (ignore)
|
||||||
|
return NF_ACCEPT;
|
||||||
|
|
||||||
timeouts = nf_ct_timeout_lookup(ct);
|
timeouts = nf_ct_timeout_lookup(ct);
|
||||||
if (!timeouts)
|
if (!timeouts)
|
||||||
timeouts = sctp_pernet(nf_ct_net(ct))->timeouts;
|
timeouts = sctp_pernet(nf_ct_net(ct))->timeouts;
|
||||||
|
|
|
@ -124,6 +124,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_device_init);
|
||||||
void snd_hdac_device_exit(struct hdac_device *codec)
|
void snd_hdac_device_exit(struct hdac_device *codec)
|
||||||
{
|
{
|
||||||
pm_runtime_put_noidle(&codec->dev);
|
pm_runtime_put_noidle(&codec->dev);
|
||||||
|
/* keep balance of runtime PM child_count in parent device */
|
||||||
|
pm_runtime_set_suspended(&codec->dev);
|
||||||
snd_hdac_bus_remove_device(codec->bus, codec);
|
snd_hdac_bus_remove_device(codec->bus, codec);
|
||||||
kfree(codec->vendor_name);
|
kfree(codec->vendor_name);
|
||||||
kfree(codec->chip_name);
|
kfree(codec->chip_name);
|
||||||
|
|
|
@ -3431,6 +3431,7 @@ static int tegra_hdmi_build_pcms(struct hda_codec *codec)
|
||||||
|
|
||||||
static int patch_tegra_hdmi(struct hda_codec *codec)
|
static int patch_tegra_hdmi(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
|
struct hdmi_spec *spec;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
err = patch_generic_hdmi(codec);
|
err = patch_generic_hdmi(codec);
|
||||||
|
@ -3438,6 +3439,10 @@ static int patch_tegra_hdmi(struct hda_codec *codec)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
codec->patch_ops.build_pcms = tegra_hdmi_build_pcms;
|
codec->patch_ops.build_pcms = tegra_hdmi_build_pcms;
|
||||||
|
spec = codec->spec;
|
||||||
|
spec->chmap.ops.chmap_cea_alloc_validate_get_type =
|
||||||
|
nvhdmi_chmap_cea_alloc_validate_get_type;
|
||||||
|
spec->chmap.ops.chmap_validate = nvhdmi_chmap_validate;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue