mirror of https://github.com/torvalds/linux.git
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Cross-merge networking fixes after downstream PR (net-6.16-rc7). Conflicts: Documentation/netlink/specs/ovpn.yaml880d43ca9a("netlink: specs: clean up spaces in brackets")af52020fc5("ovpn: reject unexpected netlink attributes") drivers/net/phy/phy_device.ca44312d58e("net: phy: Don't register LEDs for genphy")f0f2b992d8("net: phy: Don't register LEDs for genphy") https://lore.kernel.org/20250710114926.7ec3a64f@kernel.org drivers/net/wireless/intel/iwlwifi/fw/regulatory.c drivers/net/wireless/intel/iwlwifi/mld/regulatory.c5fde0fcbd7("wifi: iwlwifi: mask reserved bits in chan_state_active_bitmap")ea045a0de3("wifi: iwlwifi: add support for accepting raw DSM tables by firmware") net/ipv6/mcast.cae3264a25a("ipv6: mcast: Delay put pmc->idev in mld_del_delrec()")a8594c956c("ipv6: mcast: Avoid a duplicate pointer check in mld_del_delrec()") https://lore.kernel.org/8cc52891-3653-4b03-a45e-05464fe495cf@kernel.org No adjacent changes. Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
af2d6148d2
1
.mailmap
1
.mailmap
|
|
@ -416,6 +416,7 @@ Kenneth W Chen <kenneth.w.chen@intel.com>
|
|||
Kenneth Westfield <quic_kwestfie@quicinc.com> <kwestfie@codeaurora.org>
|
||||
Kiran Gunda <quic_kgunda@quicinc.com> <kgunda@codeaurora.org>
|
||||
Kirill Tkhai <tkhai@ya.ru> <ktkhai@virtuozzo.com>
|
||||
Kirill A. Shutemov <kas@kernel.org> <kirill.shutemov@linux.intel.com>
|
||||
Kishon Vijay Abraham I <kishon@kernel.org> <kishon@ti.com>
|
||||
Konrad Dybcio <konradybcio@kernel.org> <konrad.dybcio@linaro.org>
|
||||
Konrad Dybcio <konradybcio@kernel.org> <konrad.dybcio@somainline.org>
|
||||
|
|
|
|||
|
|
@ -1732,12 +1732,6 @@ The following nested keys are defined.
|
|||
numa_hint_faults (npn)
|
||||
Number of NUMA hinting faults.
|
||||
|
||||
numa_task_migrated (npn)
|
||||
Number of task migration by NUMA balancing.
|
||||
|
||||
numa_task_swapped (npn)
|
||||
Number of task swap by NUMA balancing.
|
||||
|
||||
pgdemote_kswapd
|
||||
Number of pages demoted by kswapd.
|
||||
|
||||
|
|
|
|||
|
|
@ -52,6 +52,9 @@ properties:
|
|||
'#clock-cells':
|
||||
const: 1
|
||||
|
||||
'#reset-cells':
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
|
|
|||
|
|
@ -160,6 +160,66 @@ attribute-sets:
|
|||
name: link-tx-packets
|
||||
type: uint
|
||||
doc: Number of packets transmitted at the transport level
|
||||
-
|
||||
name: peer-new-input
|
||||
subset-of: peer
|
||||
attributes:
|
||||
-
|
||||
name: id
|
||||
-
|
||||
name: remote-ipv4
|
||||
-
|
||||
name: remote-ipv6
|
||||
-
|
||||
name: remote-ipv6-scope-id
|
||||
-
|
||||
name: remote-port
|
||||
-
|
||||
name: socket
|
||||
-
|
||||
name: vpn-ipv4
|
||||
-
|
||||
name: vpn-ipv6
|
||||
-
|
||||
name: local-ipv4
|
||||
-
|
||||
name: local-ipv6
|
||||
-
|
||||
name: keepalive-interval
|
||||
-
|
||||
name: keepalive-timeout
|
||||
-
|
||||
name: peer-set-input
|
||||
subset-of: peer
|
||||
attributes:
|
||||
-
|
||||
name: id
|
||||
-
|
||||
name: remote-ipv4
|
||||
-
|
||||
name: remote-ipv6
|
||||
-
|
||||
name: remote-ipv6-scope-id
|
||||
-
|
||||
name: remote-port
|
||||
-
|
||||
name: vpn-ipv4
|
||||
-
|
||||
name: vpn-ipv6
|
||||
-
|
||||
name: local-ipv4
|
||||
-
|
||||
name: local-ipv6
|
||||
-
|
||||
name: keepalive-interval
|
||||
-
|
||||
name: keepalive-timeout
|
||||
-
|
||||
name: peer-del-input
|
||||
subset-of: peer
|
||||
attributes:
|
||||
-
|
||||
name: id
|
||||
-
|
||||
name: keyconf
|
||||
attributes:
|
||||
|
|
@ -216,6 +276,33 @@ attribute-sets:
|
|||
obtain the actual cipher IV
|
||||
checks:
|
||||
exact-len: nonce-tail-size
|
||||
|
||||
-
|
||||
name: keyconf-get
|
||||
subset-of: keyconf
|
||||
attributes:
|
||||
-
|
||||
name: peer-id
|
||||
-
|
||||
name: slot
|
||||
-
|
||||
name: key-id
|
||||
-
|
||||
name: cipher-alg
|
||||
-
|
||||
name: keyconf-swap-input
|
||||
subset-of: keyconf
|
||||
attributes:
|
||||
-
|
||||
name: peer-id
|
||||
-
|
||||
name: keyconf-del-input
|
||||
subset-of: keyconf
|
||||
attributes:
|
||||
-
|
||||
name: peer-id
|
||||
-
|
||||
name: slot
|
||||
-
|
||||
name: ovpn
|
||||
attributes:
|
||||
|
|
@ -235,12 +322,66 @@ attribute-sets:
|
|||
type: nest
|
||||
doc: Peer specific cipher configuration
|
||||
nested-attributes: keyconf
|
||||
-
|
||||
name: ovpn-peer-new-input
|
||||
subset-of: ovpn
|
||||
attributes:
|
||||
-
|
||||
name: ifindex
|
||||
-
|
||||
name: peer
|
||||
nested-attributes: peer-new-input
|
||||
-
|
||||
name: ovpn-peer-set-input
|
||||
subset-of: ovpn
|
||||
attributes:
|
||||
-
|
||||
name: ifindex
|
||||
-
|
||||
name: peer
|
||||
nested-attributes: peer-set-input
|
||||
-
|
||||
name: ovpn-peer-del-input
|
||||
subset-of: ovpn
|
||||
attributes:
|
||||
-
|
||||
name: ifindex
|
||||
-
|
||||
name: peer
|
||||
nested-attributes: peer-del-input
|
||||
-
|
||||
name: ovpn-keyconf-get
|
||||
subset-of: ovpn
|
||||
attributes:
|
||||
-
|
||||
name: ifindex
|
||||
-
|
||||
name: keyconf
|
||||
nested-attributes: keyconf-get
|
||||
-
|
||||
name: ovpn-keyconf-swap-input
|
||||
subset-of: ovpn
|
||||
attributes:
|
||||
-
|
||||
name: ifindex
|
||||
-
|
||||
name: keyconf
|
||||
nested-attributes: keyconf-swap-input
|
||||
-
|
||||
name: ovpn-keyconf-del-input
|
||||
subset-of: ovpn
|
||||
attributes:
|
||||
-
|
||||
name: ifindex
|
||||
-
|
||||
name: keyconf
|
||||
nested-attributes: keyconf-del-input
|
||||
|
||||
operations:
|
||||
list:
|
||||
-
|
||||
name: peer-new
|
||||
attribute-set: ovpn
|
||||
attribute-set: ovpn-peer-new-input
|
||||
flags: [admin-perm]
|
||||
doc: Add a remote peer
|
||||
do:
|
||||
|
|
@ -252,7 +393,7 @@ operations:
|
|||
- peer
|
||||
-
|
||||
name: peer-set
|
||||
attribute-set: ovpn
|
||||
attribute-set: ovpn-peer-set-input
|
||||
flags: [admin-perm]
|
||||
doc: modify a remote peer
|
||||
do:
|
||||
|
|
@ -286,7 +427,7 @@ operations:
|
|||
- peer
|
||||
-
|
||||
name: peer-del
|
||||
attribute-set: ovpn
|
||||
attribute-set: ovpn-peer-del-input
|
||||
flags: [admin-perm]
|
||||
doc: Delete existing remote peer
|
||||
do:
|
||||
|
|
@ -316,7 +457,7 @@ operations:
|
|||
- keyconf
|
||||
-
|
||||
name: key-get
|
||||
attribute-set: ovpn
|
||||
attribute-set: ovpn-keyconf-get
|
||||
flags: [admin-perm]
|
||||
doc: Retrieve non-sensitive data about peer key and cipher
|
||||
do:
|
||||
|
|
@ -331,7 +472,7 @@ operations:
|
|||
- keyconf
|
||||
-
|
||||
name: key-swap
|
||||
attribute-set: ovpn
|
||||
attribute-set: ovpn-keyconf-swap-input
|
||||
flags: [admin-perm]
|
||||
doc: Swap primary and secondary session keys for a specific peer
|
||||
do:
|
||||
|
|
@ -350,7 +491,7 @@ operations:
|
|||
mcgrp: peers
|
||||
-
|
||||
name: key-del
|
||||
attribute-set: ovpn
|
||||
attribute-set: ovpn-keyconf-del-input
|
||||
flags: [admin-perm]
|
||||
doc: Delete cipher key for a specific peer
|
||||
do:
|
||||
|
|
|
|||
|
|
@ -10519,7 +10519,7 @@ S: Maintained
|
|||
F: block/partitions/efi.*
|
||||
|
||||
HABANALABS PCI DRIVER
|
||||
M: Ofir Bitton <obitton@habana.ai>
|
||||
M: Yaron Avizrat <yaron.avizrat@intel.com>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Supported
|
||||
C: irc://irc.oftc.net/dri-devel
|
||||
|
|
@ -26961,7 +26961,7 @@ F: arch/x86/kernel/stacktrace.c
|
|||
F: arch/x86/kernel/unwind_*.c
|
||||
|
||||
X86 TRUST DOMAIN EXTENSIONS (TDX)
|
||||
M: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
|
||||
M: Kirill A. Shutemov <kas@kernel.org>
|
||||
R: Dave Hansen <dave.hansen@linux.intel.com>
|
||||
L: x86@kernel.org
|
||||
L: linux-coco@lists.linux.dev
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -2,7 +2,7 @@
|
|||
VERSION = 6
|
||||
PATCHLEVEL = 16
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -687,11 +687,12 @@ lpuart5: serial@29a0000 {
|
|||
};
|
||||
|
||||
wdog0: watchdog@2ad0000 {
|
||||
compatible = "fsl,imx21-wdt";
|
||||
compatible = "fsl,ls1046a-wdt", "fsl,imx21-wdt";
|
||||
reg = <0x0 0x2ad0000 0x0 0x10000>;
|
||||
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(2)>;
|
||||
big-endian;
|
||||
};
|
||||
|
||||
edma0: dma-controller@2c00000 {
|
||||
|
|
|
|||
|
|
@ -464,6 +464,7 @@ reg_vdd_phy: LDO4 {
|
|||
};
|
||||
|
||||
reg_nvcc_sd: LDO5 {
|
||||
regulator-always-on;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-name = "On-module +V3.3_1.8_SD (LDO5)";
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ &ecspi2 {
|
|||
tpm@1 {
|
||||
compatible = "atmel,attpm20p", "tcg,tpm_tis-spi";
|
||||
reg = <0x1>;
|
||||
spi-max-frequency = <36000000>;
|
||||
spi-max-frequency = <25000000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ &ecspi2 {
|
|||
tpm@1 {
|
||||
compatible = "atmel,attpm20p", "tcg,tpm_tis-spi";
|
||||
reg = <0x1>;
|
||||
spi-max-frequency = <36000000>;
|
||||
spi-max-frequency = <25000000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ &ecspi2 {
|
|||
tpm@1 {
|
||||
compatible = "atmel,attpm20p", "tcg,tpm_tis-spi";
|
||||
reg = <0x1>;
|
||||
spi-max-frequency = <36000000>;
|
||||
spi-max-frequency = <25000000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ &ecspi1 {
|
|||
tpm@0 {
|
||||
compatible = "atmel,attpm20p", "tcg,tpm_tis-spi";
|
||||
reg = <0x0>;
|
||||
spi-max-frequency = <36000000>;
|
||||
spi-max-frequency = <25000000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -574,17 +574,17 @@ &sai3 {
|
|||
&scmi_iomuxc {
|
||||
pinctrl_emdio: emdiogrp {
|
||||
fsl,pins = <
|
||||
IMX95_PAD_ENET2_MDC__NETCMIX_TOP_NETC_MDC 0x57e
|
||||
IMX95_PAD_ENET2_MDIO__NETCMIX_TOP_NETC_MDIO 0x97e
|
||||
IMX95_PAD_ENET2_MDC__NETCMIX_TOP_NETC_MDC 0x50e
|
||||
IMX95_PAD_ENET2_MDIO__NETCMIX_TOP_NETC_MDIO 0x90e
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_enetc0: enetc0grp {
|
||||
fsl,pins = <
|
||||
IMX95_PAD_ENET1_TD3__NETCMIX_TOP_ETH0_RGMII_TD3 0x57e
|
||||
IMX95_PAD_ENET1_TD2__NETCMIX_TOP_ETH0_RGMII_TD2 0x57e
|
||||
IMX95_PAD_ENET1_TD1__NETCMIX_TOP_ETH0_RGMII_TD1 0x57e
|
||||
IMX95_PAD_ENET1_TD0__NETCMIX_TOP_ETH0_RGMII_TD0 0x57e
|
||||
IMX95_PAD_ENET1_TD3__NETCMIX_TOP_ETH0_RGMII_TD3 0x50e
|
||||
IMX95_PAD_ENET1_TD2__NETCMIX_TOP_ETH0_RGMII_TD2 0x50e
|
||||
IMX95_PAD_ENET1_TD1__NETCMIX_TOP_ETH0_RGMII_TD1 0x50e
|
||||
IMX95_PAD_ENET1_TD0__NETCMIX_TOP_ETH0_RGMII_TD0 0x50e
|
||||
IMX95_PAD_ENET1_TX_CTL__NETCMIX_TOP_ETH0_RGMII_TX_CTL 0x57e
|
||||
IMX95_PAD_ENET1_TXC__NETCMIX_TOP_ETH0_RGMII_TX_CLK 0x58e
|
||||
IMX95_PAD_ENET1_RX_CTL__NETCMIX_TOP_ETH0_RGMII_RX_CTL 0x57e
|
||||
|
|
@ -598,10 +598,10 @@ IMX95_PAD_ENET1_RD3__NETCMIX_TOP_ETH0_RGMII_RD3 0x57e
|
|||
|
||||
pinctrl_enetc1: enetc1grp {
|
||||
fsl,pins = <
|
||||
IMX95_PAD_ENET2_TD3__NETCMIX_TOP_ETH1_RGMII_TD3 0x57e
|
||||
IMX95_PAD_ENET2_TD2__NETCMIX_TOP_ETH1_RGMII_TD2 0x57e
|
||||
IMX95_PAD_ENET2_TD1__NETCMIX_TOP_ETH1_RGMII_TD1 0x57e
|
||||
IMX95_PAD_ENET2_TD0__NETCMIX_TOP_ETH1_RGMII_TD0 0x57e
|
||||
IMX95_PAD_ENET2_TD3__NETCMIX_TOP_ETH1_RGMII_TD3 0x50e
|
||||
IMX95_PAD_ENET2_TD2__NETCMIX_TOP_ETH1_RGMII_TD2 0x50e
|
||||
IMX95_PAD_ENET2_TD1__NETCMIX_TOP_ETH1_RGMII_TD1 0x50e
|
||||
IMX95_PAD_ENET2_TD0__NETCMIX_TOP_ETH1_RGMII_TD0 0x50e
|
||||
IMX95_PAD_ENET2_TX_CTL__NETCMIX_TOP_ETH1_RGMII_TX_CTL 0x57e
|
||||
IMX95_PAD_ENET2_TXC__NETCMIX_TOP_ETH1_RGMII_TX_CLK 0x58e
|
||||
IMX95_PAD_ENET2_RX_CTL__NETCMIX_TOP_ETH1_RGMII_RX_CTL 0x57e
|
||||
|
|
|
|||
|
|
@ -566,17 +566,17 @@ &wdog3 {
|
|||
&scmi_iomuxc {
|
||||
pinctrl_emdio: emdiogrp{
|
||||
fsl,pins = <
|
||||
IMX95_PAD_ENET1_MDC__NETCMIX_TOP_NETC_MDC 0x57e
|
||||
IMX95_PAD_ENET1_MDIO__NETCMIX_TOP_NETC_MDIO 0x97e
|
||||
IMX95_PAD_ENET1_MDC__NETCMIX_TOP_NETC_MDC 0x50e
|
||||
IMX95_PAD_ENET1_MDIO__NETCMIX_TOP_NETC_MDIO 0x90e
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_enetc0: enetc0grp {
|
||||
fsl,pins = <
|
||||
IMX95_PAD_ENET1_TD3__NETCMIX_TOP_ETH0_RGMII_TD3 0x57e
|
||||
IMX95_PAD_ENET1_TD2__NETCMIX_TOP_ETH0_RGMII_TD2 0x57e
|
||||
IMX95_PAD_ENET1_TD1__NETCMIX_TOP_ETH0_RGMII_TD1 0x57e
|
||||
IMX95_PAD_ENET1_TD0__NETCMIX_TOP_ETH0_RGMII_TD0 0x57e
|
||||
IMX95_PAD_ENET1_TD3__NETCMIX_TOP_ETH0_RGMII_TD3 0x50e
|
||||
IMX95_PAD_ENET1_TD2__NETCMIX_TOP_ETH0_RGMII_TD2 0x50e
|
||||
IMX95_PAD_ENET1_TD1__NETCMIX_TOP_ETH0_RGMII_TD1 0x50e
|
||||
IMX95_PAD_ENET1_TD0__NETCMIX_TOP_ETH0_RGMII_TD0 0x50e
|
||||
IMX95_PAD_ENET1_TX_CTL__NETCMIX_TOP_ETH0_RGMII_TX_CTL 0x57e
|
||||
IMX95_PAD_ENET1_TXC__NETCMIX_TOP_ETH0_RGMII_TX_CLK 0x58e
|
||||
IMX95_PAD_ENET1_RX_CTL__NETCMIX_TOP_ETH0_RGMII_RX_CTL 0x57e
|
||||
|
|
|
|||
|
|
@ -1708,7 +1708,7 @@ pcie0_ep: pcie-ep@4c300000 {
|
|||
<0x9 0 1 0>;
|
||||
reg-names = "dbi","atu", "dbi2", "app", "dma", "addr_space";
|
||||
num-lanes = <1>;
|
||||
interrupts = <GIC_SPI 317 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts = <GIC_SPI 311 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "dma";
|
||||
clocks = <&scmi_clk IMX95_CLK_HSIO>,
|
||||
<&scmi_clk IMX95_CLK_HSIOPLL>,
|
||||
|
|
|
|||
|
|
@ -1090,6 +1090,8 @@ &pmk8280_pon_resin {
|
|||
};
|
||||
|
||||
&pmk8280_rtc {
|
||||
qcom,uefi-rtc-info;
|
||||
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -224,6 +224,7 @@ pmk8550_rtc: rtc@6100 {
|
|||
reg-names = "rtc", "alarm";
|
||||
interrupts = <0x0 0x62 0x1 IRQ_TYPE_EDGE_RISING>;
|
||||
qcom,no-alarm; /* alarm owned by ADSP */
|
||||
qcom,uefi-rtc-info;
|
||||
};
|
||||
|
||||
pmk8550_sdam_2: nvram@7100 {
|
||||
|
|
|
|||
|
|
@ -379,6 +379,18 @@ pmic_int: pmic-int {
|
|||
<0 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
};
|
||||
|
||||
spi1 {
|
||||
spi1_csn0_gpio_pin: spi1-csn0-gpio-pin {
|
||||
rockchip,pins =
|
||||
<3 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up_4ma>;
|
||||
};
|
||||
|
||||
spi1_csn1_gpio_pin: spi1-csn1-gpio-pin {
|
||||
rockchip,pins =
|
||||
<3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up_4ma>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pmu_io_domains {
|
||||
|
|
@ -396,6 +408,17 @@ &sdmmc {
|
|||
vqmmc-supply = <&vccio_sd>;
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
/*
|
||||
* Hardware CS has a very slow rise time of about 6us,
|
||||
* causing transmission errors.
|
||||
* With cs-gpios we have a rise time of about 20ns.
|
||||
*/
|
||||
cs-gpios = <&gpio3 RK_PB1 GPIO_ACTIVE_LOW>, <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spi1_clk &spi1_csn0_gpio_pin &spi1_csn1_gpio_pin &spi1_miso &spi1_mosi>;
|
||||
};
|
||||
|
||||
&tsadc {
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ gmac1_clkin: external-gmac1-clock {
|
|||
|
||||
fan: gpio_fan {
|
||||
compatible = "gpio-fan";
|
||||
fan-supply = <&vcc12v_dcin>;
|
||||
gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;
|
||||
gpio-fan,speed-map =
|
||||
< 0 0>,
|
||||
|
|
|
|||
|
|
@ -211,10 +211,38 @@ &combphy0_ps {
|
|||
status = "okay";
|
||||
};
|
||||
|
||||
&cpu_b0 {
|
||||
cpu-supply = <&vdd_cpu_big_s0>;
|
||||
};
|
||||
|
||||
&cpu_b1 {
|
||||
cpu-supply = <&vdd_cpu_big_s0>;
|
||||
};
|
||||
|
||||
&cpu_b2 {
|
||||
cpu-supply = <&vdd_cpu_big_s0>;
|
||||
};
|
||||
|
||||
&cpu_b3 {
|
||||
cpu-supply = <&vdd_cpu_big_s0>;
|
||||
};
|
||||
|
||||
&cpu_l0 {
|
||||
cpu-supply = <&vdd_cpu_lit_s0>;
|
||||
};
|
||||
|
||||
&cpu_l1 {
|
||||
cpu-supply = <&vdd_cpu_lit_s0>;
|
||||
};
|
||||
|
||||
&cpu_l2 {
|
||||
cpu-supply = <&vdd_cpu_lit_s0>;
|
||||
};
|
||||
|
||||
&cpu_l3 {
|
||||
cpu-supply = <&vdd_cpu_lit_s0>;
|
||||
};
|
||||
|
||||
&gmac0 {
|
||||
phy-mode = "rgmii-id";
|
||||
clock_in_out = "output";
|
||||
|
|
|
|||
|
|
@ -615,7 +615,7 @@ pcie1: pcie@22400000 {
|
|||
<0 0 0 2 &pcie1_intc 1>,
|
||||
<0 0 0 3 &pcie1_intc 2>,
|
||||
<0 0 0 4 &pcie1_intc 3>;
|
||||
linux,pci-domain = <0>;
|
||||
linux,pci-domain = <1>;
|
||||
max-link-speed = <2>;
|
||||
num-ib-windows = <8>;
|
||||
num-viewport = <8>;
|
||||
|
|
|
|||
|
|
@ -578,14 +578,14 @@ hdmim0_tx0_hpd: hdmim0-tx0-hpd {
|
|||
hdmim0_tx0_scl: hdmim0-tx0-scl {
|
||||
rockchip,pins =
|
||||
/* hdmim0_tx0_scl */
|
||||
<4 RK_PB7 5 &pcfg_pull_none>;
|
||||
<4 RK_PB7 5 &pcfg_pull_none_drv_level_5_smt>;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
hdmim0_tx0_sda: hdmim0-tx0-sda {
|
||||
rockchip,pins =
|
||||
/* hdmim0_tx0_sda */
|
||||
<4 RK_PC0 5 &pcfg_pull_none>;
|
||||
<4 RK_PC0 5 &pcfg_pull_none_drv_level_1_smt>;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
|
|
@ -640,14 +640,14 @@ hdmim1_tx0_hpd: hdmim1-tx0-hpd {
|
|||
hdmim1_tx0_scl: hdmim1-tx0-scl {
|
||||
rockchip,pins =
|
||||
/* hdmim1_tx0_scl */
|
||||
<0 RK_PD5 11 &pcfg_pull_none>;
|
||||
<0 RK_PD5 11 &pcfg_pull_none_drv_level_5_smt>;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
hdmim1_tx0_sda: hdmim1-tx0-sda {
|
||||
rockchip,pins =
|
||||
/* hdmim1_tx0_sda */
|
||||
<0 RK_PD4 11 &pcfg_pull_none>;
|
||||
<0 RK_PD4 11 &pcfg_pull_none_drv_level_1_smt>;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
|
|
@ -668,14 +668,14 @@ hdmim1_tx1_hpd: hdmim1-tx1-hpd {
|
|||
hdmim1_tx1_scl: hdmim1-tx1-scl {
|
||||
rockchip,pins =
|
||||
/* hdmim1_tx1_scl */
|
||||
<3 RK_PC6 5 &pcfg_pull_none>;
|
||||
<3 RK_PC6 5 &pcfg_pull_none_drv_level_5_smt>;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
hdmim1_tx1_sda: hdmim1-tx1-sda {
|
||||
rockchip,pins =
|
||||
/* hdmim1_tx1_sda */
|
||||
<3 RK_PC5 5 &pcfg_pull_none>;
|
||||
<3 RK_PC5 5 &pcfg_pull_none_drv_level_1_smt>;
|
||||
};
|
||||
/omit-if-no-ref/
|
||||
hdmim2_rx_cec: hdmim2-rx-cec {
|
||||
|
|
@ -709,14 +709,14 @@ hdmim2_rx_sda: hdmim2-rx-sda {
|
|||
hdmim2_tx0_scl: hdmim2-tx0-scl {
|
||||
rockchip,pins =
|
||||
/* hdmim2_tx0_scl */
|
||||
<3 RK_PC7 5 &pcfg_pull_none>;
|
||||
<3 RK_PC7 5 &pcfg_pull_none_drv_level_5_smt>;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
hdmim2_tx0_sda: hdmim2-tx0-sda {
|
||||
rockchip,pins =
|
||||
/* hdmim2_tx0_sda */
|
||||
<3 RK_PD0 5 &pcfg_pull_none>;
|
||||
<3 RK_PD0 5 &pcfg_pull_none_drv_level_1_smt>;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
|
|
@ -730,14 +730,14 @@ hdmim2_tx1_cec: hdmim2-tx1-cec {
|
|||
hdmim2_tx1_scl: hdmim2-tx1-scl {
|
||||
rockchip,pins =
|
||||
/* hdmim2_tx1_scl */
|
||||
<1 RK_PA4 5 &pcfg_pull_none>;
|
||||
<1 RK_PA4 5 &pcfg_pull_none_drv_level_5_smt>;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
hdmim2_tx1_sda: hdmim2-tx1-sda {
|
||||
rockchip,pins =
|
||||
/* hdmim2_tx1_sda */
|
||||
<1 RK_PA3 5 &pcfg_pull_none>;
|
||||
<1 RK_PA3 5 &pcfg_pull_none_drv_level_1_smt>;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
|
|
|
|||
|
|
@ -321,6 +321,7 @@ &sdmmc {
|
|||
bus-width = <4>;
|
||||
cap-mmc-highspeed;
|
||||
cap-sd-highspeed;
|
||||
cd-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>;
|
||||
disable-wp;
|
||||
max-frequency = <150000000>;
|
||||
no-sdio;
|
||||
|
|
|
|||
|
|
@ -160,14 +160,15 @@ hdmim0_tx1_cec: hdmim0-tx1-cec {
|
|||
hdmim0_tx1_scl: hdmim0-tx1-scl {
|
||||
rockchip,pins =
|
||||
/* hdmim0_tx1_scl */
|
||||
<2 RK_PB5 4 &pcfg_pull_none>;
|
||||
<2 RK_PB5 4 &pcfg_pull_none_drv_level_3_smt>;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
hdmim0_tx1_sda: hdmim0-tx1-sda {
|
||||
rockchip,pins =
|
||||
/* hdmim0_tx1_sda */
|
||||
<2 RK_PB4 4 &pcfg_pull_none>;
|
||||
<2 RK_PB4 4 &pcfg_pull_none_drv_level_1_smt>;
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -474,6 +474,7 @@ &sdmmc {
|
|||
bus-width = <4>;
|
||||
cap-mmc-highspeed;
|
||||
cap-sd-highspeed;
|
||||
cd-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>;
|
||||
disable-wp;
|
||||
max-frequency = <150000000>;
|
||||
no-sdio;
|
||||
|
|
|
|||
|
|
@ -332,6 +332,41 @@ pcfg_pull_none_drv_level_0_smt: pcfg-pull-none-drv-level-0-smt {
|
|||
input-schmitt-enable;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
pcfg_pull_none_drv_level_1_smt: pcfg-pull-none-drv-level-1-smt {
|
||||
bias-disable;
|
||||
drive-strength = <1>;
|
||||
input-schmitt-enable;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
pcfg_pull_none_drv_level_2_smt: pcfg-pull-none-drv-level-2-smt {
|
||||
bias-disable;
|
||||
drive-strength = <2>;
|
||||
input-schmitt-enable;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
pcfg_pull_none_drv_level_3_smt: pcfg-pull-none-drv-level-3-smt {
|
||||
bias-disable;
|
||||
drive-strength = <3>;
|
||||
input-schmitt-enable;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
pcfg_pull_none_drv_level_4_smt: pcfg-pull-none-drv-level-4-smt {
|
||||
bias-disable;
|
||||
drive-strength = <4>;
|
||||
input-schmitt-enable;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
pcfg_pull_none_drv_level_5_smt: pcfg-pull-none-drv-level-5-smt {
|
||||
bias-disable;
|
||||
drive-strength = <5>;
|
||||
input-schmitt-enable;
|
||||
};
|
||||
|
||||
/omit-if-no-ref/
|
||||
pcfg_output_high: pcfg-output-high {
|
||||
output-high;
|
||||
|
|
|
|||
|
|
@ -1444,6 +1444,7 @@ CONFIG_PLATFORM_MHU=y
|
|||
CONFIG_BCM2835_MBOX=y
|
||||
CONFIG_QCOM_APCS_IPC=y
|
||||
CONFIG_MTK_ADSP_MBOX=m
|
||||
CONFIG_QCOM_CPUCP_MBOX=m
|
||||
CONFIG_QCOM_IPCC=y
|
||||
CONFIG_ROCKCHIP_IOMMU=y
|
||||
CONFIG_TEGRA_IOMMU_SMMU=y
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ config X86
|
|||
select ARCH_WANTS_DYNAMIC_TASK_STRUCT
|
||||
select ARCH_WANTS_NO_INSTR
|
||||
select ARCH_WANT_GENERAL_HUGETLB
|
||||
select ARCH_WANT_HUGE_PMD_SHARE
|
||||
select ARCH_WANT_HUGE_PMD_SHARE if X86_64
|
||||
select ARCH_WANT_LD_ORPHAN_WARN
|
||||
select ARCH_WANT_OPTIMIZE_DAX_VMEMMAP if X86_64
|
||||
select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP if X86_64
|
||||
|
|
|
|||
|
|
@ -628,6 +628,7 @@
|
|||
#define MSR_AMD64_OSVW_STATUS 0xc0010141
|
||||
#define MSR_AMD_PPIN_CTL 0xc00102f0
|
||||
#define MSR_AMD_PPIN 0xc00102f1
|
||||
#define MSR_AMD64_CPUID_FN_7 0xc0011002
|
||||
#define MSR_AMD64_CPUID_FN_1 0xc0011004
|
||||
#define MSR_AMD64_LS_CFG 0xc0011020
|
||||
#define MSR_AMD64_DC_CFG 0xc0011022
|
||||
|
|
|
|||
|
|
@ -974,6 +974,16 @@ static void init_amd_zen2(struct cpuinfo_x86 *c)
|
|||
init_spectral_chicken(c);
|
||||
fix_erratum_1386(c);
|
||||
zen2_zenbleed_check(c);
|
||||
|
||||
/* Disable RDSEED on AMD Cyan Skillfish because of an error. */
|
||||
if (c->x86_model == 0x47 && c->x86_stepping == 0x0) {
|
||||
clear_cpu_cap(c, X86_FEATURE_RDSEED);
|
||||
msr_clear_bit(MSR_AMD64_CPUID_FN_7, 18);
|
||||
pr_emerg("RDSEED is not reliable on this platform; disabling.\n");
|
||||
}
|
||||
|
||||
/* Correct misconfigured CPUID on some clients. */
|
||||
clear_cpu_cap(c, X86_FEATURE_INVLPGB);
|
||||
}
|
||||
|
||||
static void init_amd_zen3(struct cpuinfo_x86 *c)
|
||||
|
|
|
|||
|
|
@ -1280,6 +1280,22 @@ static void dpm_async_suspend_parent(struct device *dev, async_func_t func)
|
|||
dpm_async_with_cleanup(dev->parent, func);
|
||||
}
|
||||
|
||||
static void dpm_async_suspend_complete_all(struct list_head *device_list)
|
||||
{
|
||||
struct device *dev;
|
||||
|
||||
guard(mutex)(&async_wip_mtx);
|
||||
|
||||
list_for_each_entry_reverse(dev, device_list, power.entry) {
|
||||
/*
|
||||
* In case the device is being waited for and async processing
|
||||
* has not started for it yet, let the waiters make progress.
|
||||
*/
|
||||
if (!dev->power.work_in_progress)
|
||||
complete_all(&dev->power.completion);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* resume_event - Return a "resume" message for given "suspend" sleep state.
|
||||
* @sleep_state: PM message representing a sleep state.
|
||||
|
|
@ -1456,6 +1472,7 @@ static int dpm_noirq_suspend_devices(pm_message_t state)
|
|||
mutex_lock(&dpm_list_mtx);
|
||||
|
||||
if (error || async_error) {
|
||||
dpm_async_suspend_complete_all(&dpm_late_early_list);
|
||||
/*
|
||||
* Move all devices to the target list to resume them
|
||||
* properly.
|
||||
|
|
@ -1658,6 +1675,7 @@ int dpm_suspend_late(pm_message_t state)
|
|||
mutex_lock(&dpm_list_mtx);
|
||||
|
||||
if (error || async_error) {
|
||||
dpm_async_suspend_complete_all(&dpm_suspended_list);
|
||||
/*
|
||||
* Move all devices to the target list to resume them
|
||||
* properly.
|
||||
|
|
@ -1951,6 +1969,7 @@ int dpm_suspend(pm_message_t state)
|
|||
mutex_lock(&dpm_list_mtx);
|
||||
|
||||
if (error || async_error) {
|
||||
dpm_async_suspend_complete_all(&dpm_prepared_list);
|
||||
/*
|
||||
* Move all devices to the target list to resume them
|
||||
* properly.
|
||||
|
|
|
|||
|
|
@ -2198,9 +2198,7 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
|
|||
goto out;
|
||||
}
|
||||
}
|
||||
ret = nbd_start_device(nbd);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (info->attrs[NBD_ATTR_BACKEND_IDENTIFIER]) {
|
||||
nbd->backend = nla_strdup(info->attrs[NBD_ATTR_BACKEND_IDENTIFIER],
|
||||
GFP_KERNEL);
|
||||
|
|
@ -2216,6 +2214,8 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
|
|||
goto out;
|
||||
}
|
||||
set_bit(NBD_RT_HAS_BACKEND_FILE, &config->runtime_flags);
|
||||
|
||||
ret = nbd_start_device(nbd);
|
||||
out:
|
||||
mutex_unlock(&nbd->config_lock);
|
||||
if (!ret) {
|
||||
|
|
|
|||
|
|
@ -670,7 +670,7 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
|||
hdev->flush = bfusb_flush;
|
||||
hdev->send = bfusb_send_frame;
|
||||
|
||||
set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_LOCAL_COMMANDS);
|
||||
|
||||
if (hci_register_dev(hdev) < 0) {
|
||||
BT_ERR("Can't register HCI device");
|
||||
|
|
|
|||
|
|
@ -398,7 +398,7 @@ static int bpa10x_probe(struct usb_interface *intf,
|
|||
hdev->send = bpa10x_send_frame;
|
||||
hdev->set_diag = bpa10x_set_diag;
|
||||
|
||||
set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RESET_ON_CLOSE);
|
||||
|
||||
err = hci_register_dev(hdev);
|
||||
if (err < 0) {
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ int btbcm_check_bdaddr(struct hci_dev *hdev)
|
|||
if (btbcm_set_bdaddr_from_efi(hdev) != 0) {
|
||||
bt_dev_info(hdev, "BCM: Using default device address (%pMR)",
|
||||
&bda->bdaddr);
|
||||
set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_INVALID_BDADDR);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -467,7 +467,7 @@ static int btbcm_print_controller_features(struct hci_dev *hdev)
|
|||
|
||||
/* Read DMI and disable broken Read LE Min/Max Tx Power */
|
||||
if (dmi_first_match(disable_broken_read_transmit_power))
|
||||
set_bit(HCI_QUIRK_BROKEN_READ_TRANSMIT_POWER, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_READ_TRANSMIT_POWER);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -706,7 +706,7 @@ int btbcm_finalize(struct hci_dev *hdev, bool *fw_load_done, bool use_autobaud_m
|
|||
|
||||
btbcm_check_bdaddr(hdev);
|
||||
|
||||
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_STRICT_DUPLICATE_FILTER);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -769,7 +769,7 @@ int btbcm_setup_apple(struct hci_dev *hdev)
|
|||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_STRICT_DUPLICATE_FILTER);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ int btintel_check_bdaddr(struct hci_dev *hdev)
|
|||
if (!bacmp(&bda->bdaddr, BDADDR_INTEL)) {
|
||||
bt_dev_err(hdev, "Found Intel default device address (%pMR)",
|
||||
&bda->bdaddr);
|
||||
set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_INVALID_BDADDR);
|
||||
}
|
||||
|
||||
kfree_skb(skb);
|
||||
|
|
@ -2027,7 +2027,7 @@ static int btintel_download_fw(struct hci_dev *hdev,
|
|||
*/
|
||||
if (!bacmp(¶ms->otp_bdaddr, BDADDR_ANY)) {
|
||||
bt_dev_info(hdev, "No device address configured");
|
||||
set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_INVALID_BDADDR);
|
||||
}
|
||||
|
||||
download:
|
||||
|
|
@ -2295,7 +2295,7 @@ static int btintel_prepare_fw_download_tlv(struct hci_dev *hdev,
|
|||
*/
|
||||
if (!bacmp(&ver->otp_bd_addr, BDADDR_ANY)) {
|
||||
bt_dev_info(hdev, "No device address configured");
|
||||
set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_INVALID_BDADDR);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2670,7 +2670,7 @@ static u8 btintel_classify_pkt_type(struct hci_dev *hdev, struct sk_buff *skb)
|
|||
* Distinguish ISO data packets form ACL data packets
|
||||
* based on their connection handle value range.
|
||||
*/
|
||||
if (hci_skb_pkt_type(skb) == HCI_ACLDATA_PKT) {
|
||||
if (iso_capable(hdev) && hci_skb_pkt_type(skb) == HCI_ACLDATA_PKT) {
|
||||
__u16 handle = __le16_to_cpu(hci_acl_hdr(skb)->handle);
|
||||
|
||||
if (hci_handle(handle) >= BTINTEL_ISODATA_HANDLE_BASE)
|
||||
|
|
@ -3435,9 +3435,9 @@ static int btintel_setup_combined(struct hci_dev *hdev)
|
|||
}
|
||||
|
||||
/* Apply the common HCI quirks for Intel device */
|
||||
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_STRICT_DUPLICATE_FILTER);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_NON_PERSISTENT_DIAG);
|
||||
|
||||
/* Set up the quality report callback for Intel devices */
|
||||
hdev->set_quality_report = btintel_set_quality_report;
|
||||
|
|
@ -3475,8 +3475,8 @@ static int btintel_setup_combined(struct hci_dev *hdev)
|
|||
*/
|
||||
if (!btintel_test_flag(hdev,
|
||||
INTEL_ROM_LEGACY_NO_WBS_SUPPORT))
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED,
|
||||
&hdev->quirks);
|
||||
hci_set_quirk(hdev,
|
||||
HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
|
||||
err = btintel_legacy_rom_setup(hdev, &ver);
|
||||
break;
|
||||
|
|
@ -3491,11 +3491,11 @@ static int btintel_setup_combined(struct hci_dev *hdev)
|
|||
*
|
||||
* All Legacy bootloader devices support WBS
|
||||
*/
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED,
|
||||
&hdev->quirks);
|
||||
hci_set_quirk(hdev,
|
||||
HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
|
||||
/* These variants don't seem to support LE Coded PHY */
|
||||
set_bit(HCI_QUIRK_BROKEN_LE_CODED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_LE_CODED);
|
||||
|
||||
/* Setup MSFT Extension support */
|
||||
btintel_set_msft_opcode(hdev, ver.hw_variant);
|
||||
|
|
@ -3571,10 +3571,10 @@ static int btintel_setup_combined(struct hci_dev *hdev)
|
|||
*
|
||||
* All Legacy bootloader devices support WBS
|
||||
*/
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
|
||||
/* These variants don't seem to support LE Coded PHY */
|
||||
set_bit(HCI_QUIRK_BROKEN_LE_CODED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_LE_CODED);
|
||||
|
||||
/* Setup MSFT Extension support */
|
||||
btintel_set_msft_opcode(hdev, ver.hw_variant);
|
||||
|
|
@ -3600,7 +3600,7 @@ static int btintel_setup_combined(struct hci_dev *hdev)
|
|||
*
|
||||
* All TLV based devices support WBS
|
||||
*/
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
|
||||
/* Setup MSFT Extension support */
|
||||
btintel_set_msft_opcode(hdev,
|
||||
|
|
|
|||
|
|
@ -2081,9 +2081,9 @@ static int btintel_pcie_setup_internal(struct hci_dev *hdev)
|
|||
}
|
||||
|
||||
/* Apply the common HCI quirks for Intel device */
|
||||
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_STRICT_DUPLICATE_FILTER);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_NON_PERSISTENT_DIAG);
|
||||
|
||||
/* Set up the quality report callback for Intel devices */
|
||||
hdev->set_quality_report = btintel_set_quality_report;
|
||||
|
|
@ -2123,7 +2123,7 @@ static int btintel_pcie_setup_internal(struct hci_dev *hdev)
|
|||
*
|
||||
* All TLV based devices support WBS
|
||||
*/
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
|
||||
/* Setup MSFT Extension support */
|
||||
btintel_set_msft_opcode(hdev,
|
||||
|
|
|
|||
|
|
@ -1141,7 +1141,7 @@ static int btmtksdio_setup(struct hci_dev *hdev)
|
|||
}
|
||||
|
||||
/* Enable WBS with mSBC codec */
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
|
||||
/* Enable GPIO reset mechanism */
|
||||
if (bdev->reset) {
|
||||
|
|
@ -1384,7 +1384,7 @@ static int btmtksdio_probe(struct sdio_func *func,
|
|||
SET_HCIDEV_DEV(hdev, &func->dev);
|
||||
|
||||
hdev->manufacturer = 70;
|
||||
set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_NON_PERSISTENT_SETUP);
|
||||
|
||||
sdio_set_drvdata(func, bdev);
|
||||
|
||||
|
|
|
|||
|
|
@ -872,7 +872,7 @@ static int btmtkuart_probe(struct serdev_device *serdev)
|
|||
SET_HCIDEV_DEV(hdev, &serdev->dev);
|
||||
|
||||
hdev->manufacturer = 70;
|
||||
set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_NON_PERSISTENT_SETUP);
|
||||
|
||||
if (btmtkuart_is_standalone(bdev)) {
|
||||
err = clk_prepare_enable(bdev->osc);
|
||||
|
|
|
|||
|
|
@ -1807,7 +1807,7 @@ static int nxp_serdev_probe(struct serdev_device *serdev)
|
|||
"local-bd-address",
|
||||
(u8 *)&ba, sizeof(ba));
|
||||
if (bacmp(&ba, BDADDR_ANY))
|
||||
set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_USE_BDADDR_PROPERTY);
|
||||
|
||||
if (hci_register_dev(hdev) < 0) {
|
||||
dev_err(&serdev->dev, "Can't register HCI device\n");
|
||||
|
|
|
|||
|
|
@ -739,7 +739,7 @@ static int qca_check_bdaddr(struct hci_dev *hdev, const struct qca_fw_config *co
|
|||
|
||||
bda = (struct hci_rp_read_bd_addr *)skb->data;
|
||||
if (!bacmp(&bda->bdaddr, &config->bdaddr))
|
||||
set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_USE_BDADDR_PROPERTY);
|
||||
|
||||
kfree_skb(skb);
|
||||
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ static int btqcomsmd_setup(struct hci_dev *hdev)
|
|||
/* Devices do not have persistent storage for BD address. Retrieve
|
||||
* it from the firmware node property.
|
||||
*/
|
||||
set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_USE_BDADDR_PROPERTY);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1287,7 +1287,7 @@ void btrtl_set_quirks(struct hci_dev *hdev, struct btrtl_device_info *btrtl_dev)
|
|||
/* Enable controller to do both LE scan and BR/EDR inquiry
|
||||
* simultaneously.
|
||||
*/
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
|
||||
/* Enable central-peripheral role (able to create new connections with
|
||||
* an existing connection in slave role).
|
||||
|
|
@ -1301,7 +1301,7 @@ void btrtl_set_quirks(struct hci_dev *hdev, struct btrtl_device_info *btrtl_dev)
|
|||
case CHIP_ID_8851B:
|
||||
case CHIP_ID_8922A:
|
||||
case CHIP_ID_8852BT:
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
|
||||
/* RTL8852C needs to transmit mSBC data continuously without
|
||||
* the zero length of USB packets for the ALT 6 supported chips
|
||||
|
|
@ -1312,7 +1312,8 @@ void btrtl_set_quirks(struct hci_dev *hdev, struct btrtl_device_info *btrtl_dev)
|
|||
if (btrtl_dev->project_id == CHIP_ID_8852A ||
|
||||
btrtl_dev->project_id == CHIP_ID_8852B ||
|
||||
btrtl_dev->project_id == CHIP_ID_8852C)
|
||||
set_bit(HCI_QUIRK_USE_MSFT_EXT_ADDRESS_FILTER, &hdev->quirks);
|
||||
hci_set_quirk(hdev,
|
||||
HCI_QUIRK_USE_MSFT_EXT_ADDRESS_FILTER);
|
||||
|
||||
hci_set_aosp_capable(hdev);
|
||||
break;
|
||||
|
|
@ -1331,8 +1332,7 @@ void btrtl_set_quirks(struct hci_dev *hdev, struct btrtl_device_info *btrtl_dev)
|
|||
* but it doesn't support any features from page 2 -
|
||||
* it either responds with garbage or with error status
|
||||
*/
|
||||
set_bit(HCI_QUIRK_BROKEN_LOCAL_EXT_FEATURES_PAGE_2,
|
||||
&hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_LOCAL_EXT_FEATURES_PAGE_2);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -327,7 +327,7 @@ static int btsdio_probe(struct sdio_func *func,
|
|||
hdev->send = btsdio_send_frame;
|
||||
|
||||
if (func->vendor == 0x0104 && func->device == 0x00c5)
|
||||
set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RESET_ON_CLOSE);
|
||||
|
||||
err = hci_register_dev(hdev);
|
||||
if (err < 0) {
|
||||
|
|
|
|||
|
|
@ -2472,18 +2472,18 @@ static int btusb_setup_csr(struct hci_dev *hdev)
|
|||
* Probably will need to be expanded in the future;
|
||||
* without these the controller will lock up.
|
||||
*/
|
||||
set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_READ_VOICE_SETTING, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_READ_PAGE_SCAN_TYPE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_STORED_LINK_KEY);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_ERR_DATA_REPORTING);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_NO_SUSPEND_NOTIFIER);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_READ_VOICE_SETTING);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_READ_PAGE_SCAN_TYPE);
|
||||
|
||||
/* Clear the reset quirk since this is not an actual
|
||||
* early Bluetooth 1.1 device from CSR.
|
||||
*/
|
||||
clear_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
||||
clear_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
hci_clear_quirk(hdev, HCI_QUIRK_RESET_ON_CLOSE);
|
||||
hci_clear_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
|
||||
/*
|
||||
* Special workaround for these BT 4.0 chip clones, and potentially more:
|
||||
|
|
@ -3192,6 +3192,32 @@ static const struct qca_device_info qca_devices_table[] = {
|
|||
{ 0x00190200, 40, 4, 16 }, /* WCN785x 2.0 */
|
||||
};
|
||||
|
||||
static u16 qca_extract_board_id(const struct qca_version *ver)
|
||||
{
|
||||
u16 flag = le16_to_cpu(ver->flag);
|
||||
u16 board_id = 0;
|
||||
|
||||
if (((flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) {
|
||||
/* The board_id should be split into two bytes
|
||||
* The 1st byte is chip ID, and the 2nd byte is platform ID
|
||||
* For example, board ID 0x010A, 0x01 is platform ID. 0x0A is chip ID
|
||||
* we have several platforms, and platform IDs are continuously added
|
||||
* Platform ID:
|
||||
* 0x00 is for Mobile
|
||||
* 0x01 is for X86
|
||||
* 0x02 is for Automotive
|
||||
* 0x03 is for Consumer electronic
|
||||
*/
|
||||
board_id = (ver->chip_id << 8) + ver->platform_id;
|
||||
}
|
||||
|
||||
/* Take 0xffff as invalid board ID */
|
||||
if (board_id == 0xffff)
|
||||
board_id = 0;
|
||||
|
||||
return board_id;
|
||||
}
|
||||
|
||||
static int btusb_qca_send_vendor_req(struct usb_device *udev, u8 request,
|
||||
void *data, u16 size)
|
||||
{
|
||||
|
|
@ -3348,21 +3374,11 @@ static void btusb_generate_qca_nvm_name(char *fwname, size_t max_size,
|
|||
const struct qca_version *ver)
|
||||
{
|
||||
u32 rom_version = le32_to_cpu(ver->rom_version);
|
||||
u16 flag = le16_to_cpu(ver->flag);
|
||||
|
||||
if (((flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) {
|
||||
/* The board_id should be split into two bytes
|
||||
* The 1st byte is chip ID, and the 2nd byte is platform ID
|
||||
* For example, board ID 0x010A, 0x01 is platform ID. 0x0A is chip ID
|
||||
* we have several platforms, and platform IDs are continuously added
|
||||
* Platform ID:
|
||||
* 0x00 is for Mobile
|
||||
* 0x01 is for X86
|
||||
* 0x02 is for Automotive
|
||||
* 0x03 is for Consumer electronic
|
||||
*/
|
||||
u16 board_id = (ver->chip_id << 8) + ver->platform_id;
|
||||
const char *variant;
|
||||
int len;
|
||||
u16 board_id;
|
||||
|
||||
board_id = qca_extract_board_id(ver);
|
||||
|
||||
switch (le32_to_cpu(ver->ram_version)) {
|
||||
case WCN6855_2_0_RAM_VERSION_GF:
|
||||
|
|
@ -3370,22 +3386,16 @@ static void btusb_generate_qca_nvm_name(char *fwname, size_t max_size,
|
|||
variant = "_gf";
|
||||
break;
|
||||
default:
|
||||
variant = "";
|
||||
variant = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (board_id == 0) {
|
||||
snprintf(fwname, max_size, "qca/nvm_usb_%08x%s.bin",
|
||||
rom_version, variant);
|
||||
} else {
|
||||
snprintf(fwname, max_size, "qca/nvm_usb_%08x%s_%04x.bin",
|
||||
rom_version, variant, board_id);
|
||||
}
|
||||
} else {
|
||||
snprintf(fwname, max_size, "qca/nvm_usb_%08x.bin",
|
||||
rom_version);
|
||||
}
|
||||
|
||||
len = snprintf(fwname, max_size, "qca/nvm_usb_%08x", rom_version);
|
||||
if (variant)
|
||||
len += snprintf(fwname + len, max_size - len, "%s", variant);
|
||||
if (board_id)
|
||||
len += snprintf(fwname + len, max_size - len, "_%04x", board_id);
|
||||
len += snprintf(fwname + len, max_size - len, ".bin");
|
||||
}
|
||||
|
||||
static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
|
||||
|
|
@ -3494,7 +3504,7 @@ static int btusb_setup_qca(struct hci_dev *hdev)
|
|||
/* Mark HCI_OP_ENHANCED_SETUP_SYNC_CONN as broken as it doesn't seem to
|
||||
* work with the likes of HSP/HFP mSBC.
|
||||
*/
|
||||
set_bit(HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -4008,10 +4018,10 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
}
|
||||
#endif
|
||||
if (id->driver_info & BTUSB_CW6622)
|
||||
set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_STORED_LINK_KEY);
|
||||
|
||||
if (id->driver_info & BTUSB_BCM2045)
|
||||
set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_STORED_LINK_KEY);
|
||||
|
||||
if (id->driver_info & BTUSB_BCM92035)
|
||||
hdev->setup = btusb_setup_bcm92035;
|
||||
|
|
@ -4068,8 +4078,8 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
hdev->reset = btmtk_reset_sync;
|
||||
hdev->set_bdaddr = btmtk_set_bdaddr;
|
||||
hdev->send = btusb_send_frame_mtk;
|
||||
set_bit(HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_NON_PERSISTENT_SETUP);
|
||||
data->recv_acl = btmtk_usb_recv_acl;
|
||||
data->suspend = btmtk_usb_suspend;
|
||||
data->resume = btmtk_usb_resume;
|
||||
|
|
@ -4077,20 +4087,20 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
}
|
||||
|
||||
if (id->driver_info & BTUSB_SWAVE) {
|
||||
set_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_FIXUP_INQUIRY_MODE);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_LOCAL_COMMANDS);
|
||||
}
|
||||
|
||||
if (id->driver_info & BTUSB_INTEL_BOOT) {
|
||||
hdev->manufacturer = 2;
|
||||
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RAW_DEVICE);
|
||||
}
|
||||
|
||||
if (id->driver_info & BTUSB_ATH3012) {
|
||||
data->setup_on_usb = btusb_setup_qca;
|
||||
hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_STRICT_DUPLICATE_FILTER);
|
||||
}
|
||||
|
||||
if (id->driver_info & BTUSB_QCA_ROME) {
|
||||
|
|
@ -4098,7 +4108,7 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
hdev->shutdown = btusb_shutdown_qca;
|
||||
hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
|
||||
hdev->reset = btusb_qca_reset;
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
btusb_check_needs_reset_resume(intf);
|
||||
}
|
||||
|
||||
|
|
@ -4112,7 +4122,7 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
hdev->shutdown = btusb_shutdown_qca;
|
||||
hdev->set_bdaddr = btusb_set_bdaddr_wcn6855;
|
||||
hdev->reset = btusb_qca_reset;
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
hci_set_msft_opcode(hdev, 0xFD70);
|
||||
}
|
||||
|
||||
|
|
@ -4140,35 +4150,35 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
|
||||
if (id->driver_info & BTUSB_ACTIONS_SEMI) {
|
||||
/* Support is advertised, but not implemented */
|
||||
set_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_READ_TRANSMIT_POWER, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_SET_RPA_TIMEOUT, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_EXT_SCAN, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_READ_ENC_KEY_SIZE, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_EXT_CREATE_CONN, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_BROKEN_WRITE_AUTH_PAYLOAD_TIMEOUT, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_ERR_DATA_REPORTING);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_READ_TRANSMIT_POWER);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_SET_RPA_TIMEOUT);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_EXT_SCAN);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_READ_ENC_KEY_SIZE);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_EXT_CREATE_CONN);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_WRITE_AUTH_PAYLOAD_TIMEOUT);
|
||||
}
|
||||
|
||||
if (!reset)
|
||||
set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RESET_ON_CLOSE);
|
||||
|
||||
if (force_scofix || id->driver_info & BTUSB_WRONG_SCO_MTU) {
|
||||
if (!disable_scofix)
|
||||
set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_FIXUP_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
if (id->driver_info & BTUSB_BROKEN_ISOC)
|
||||
data->isoc = NULL;
|
||||
|
||||
if (id->driver_info & BTUSB_WIDEBAND_SPEECH)
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
|
||||
if (id->driver_info & BTUSB_INVALID_LE_STATES)
|
||||
set_bit(HCI_QUIRK_BROKEN_LE_STATES, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_LE_STATES);
|
||||
|
||||
if (id->driver_info & BTUSB_DIGIANSWER) {
|
||||
data->cmdreq_type = USB_TYPE_VENDOR;
|
||||
set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RESET_ON_CLOSE);
|
||||
}
|
||||
|
||||
if (id->driver_info & BTUSB_CSR) {
|
||||
|
|
@ -4177,10 +4187,10 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
|
||||
/* Old firmware would otherwise execute USB reset */
|
||||
if (bcdDevice < 0x117)
|
||||
set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RESET_ON_CLOSE);
|
||||
|
||||
/* This must be set first in case we disable it for fakes */
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
|
||||
/* Fake CSR devices with broken commands */
|
||||
if (le16_to_cpu(udev->descriptor.idVendor) == 0x0a12 &&
|
||||
|
|
@ -4193,7 +4203,7 @@ static int btusb_probe(struct usb_interface *intf,
|
|||
|
||||
/* New sniffer firmware has crippled HCI interface */
|
||||
if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997)
|
||||
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RAW_DEVICE);
|
||||
}
|
||||
|
||||
if (id->driver_info & BTUSB_INTEL_BOOT) {
|
||||
|
|
|
|||
|
|
@ -424,7 +424,7 @@ static int aml_check_bdaddr(struct hci_dev *hdev)
|
|||
|
||||
if (!bacmp(&paddr->bdaddr, AML_BDADDR_DEFAULT)) {
|
||||
bt_dev_info(hdev, "amlbt using default bdaddr (%pM)", &paddr->bdaddr);
|
||||
set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_INVALID_BDADDR);
|
||||
}
|
||||
|
||||
exit:
|
||||
|
|
|
|||
|
|
@ -643,8 +643,8 @@ static int bcm_setup(struct hci_uart *hu)
|
|||
* Allow the bootloader to set a valid address through the
|
||||
* device tree.
|
||||
*/
|
||||
if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hu->hdev->quirks))
|
||||
set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hu->hdev->quirks);
|
||||
if (hci_test_quirk(hu->hdev, HCI_QUIRK_INVALID_BDADDR))
|
||||
hci_set_quirk(hu->hdev, HCI_QUIRK_USE_BDADDR_PROPERTY);
|
||||
|
||||
if (!bcm_request_irq(bcm))
|
||||
err = bcm_setup_sleep(hu);
|
||||
|
|
|
|||
|
|
@ -1435,7 +1435,7 @@ static int bcm4377_check_bdaddr(struct bcm4377_data *bcm4377)
|
|||
|
||||
bda = (struct hci_rp_read_bd_addr *)skb->data;
|
||||
if (!bcm4377_is_valid_bdaddr(bcm4377, &bda->bdaddr))
|
||||
set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &bcm4377->hdev->quirks);
|
||||
hci_set_quirk(bcm4377->hdev, HCI_QUIRK_USE_BDADDR_PROPERTY);
|
||||
|
||||
kfree_skb(skb);
|
||||
return 0;
|
||||
|
|
@ -2389,13 +2389,13 @@ static int bcm4377_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
hdev->setup = bcm4377_hci_setup;
|
||||
|
||||
if (bcm4377->hw->broken_mws_transport_config)
|
||||
set_bit(HCI_QUIRK_BROKEN_MWS_TRANSPORT_CONFIG, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_MWS_TRANSPORT_CONFIG);
|
||||
if (bcm4377->hw->broken_ext_scan)
|
||||
set_bit(HCI_QUIRK_BROKEN_EXT_SCAN, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_EXT_SCAN);
|
||||
if (bcm4377->hw->broken_le_coded)
|
||||
set_bit(HCI_QUIRK_BROKEN_LE_CODED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_LE_CODED);
|
||||
if (bcm4377->hw->broken_le_ext_adv_report_phy)
|
||||
set_bit(HCI_QUIRK_FIXUP_LE_EXT_ADV_REPORT_PHY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_FIXUP_LE_EXT_ADV_REPORT_PHY);
|
||||
|
||||
pci_set_drvdata(pdev, bcm4377);
|
||||
hci_set_drvdata(hdev, bcm4377);
|
||||
|
|
|
|||
|
|
@ -660,7 +660,7 @@ static int intel_setup(struct hci_uart *hu)
|
|||
*/
|
||||
if (!bacmp(¶ms.otp_bdaddr, BDADDR_ANY)) {
|
||||
bt_dev_info(hdev, "No device address configured");
|
||||
set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_INVALID_BDADDR);
|
||||
}
|
||||
|
||||
/* With this Intel bootloader only the hardware variant and device
|
||||
|
|
|
|||
|
|
@ -667,13 +667,13 @@ static int hci_uart_register_dev(struct hci_uart *hu)
|
|||
SET_HCIDEV_DEV(hdev, hu->tty->dev);
|
||||
|
||||
if (test_bit(HCI_UART_RAW_DEVICE, &hu->hdev_flags))
|
||||
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RAW_DEVICE);
|
||||
|
||||
if (test_bit(HCI_UART_EXT_CONFIG, &hu->hdev_flags))
|
||||
set_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_EXTERNAL_CONFIG);
|
||||
|
||||
if (!test_bit(HCI_UART_RESET_ON_INIT, &hu->hdev_flags))
|
||||
set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RESET_ON_CLOSE);
|
||||
|
||||
/* Only call open() for the protocol after hdev is fully initialized as
|
||||
* open() (or a timer/workqueue it starts) may attempt to reference it.
|
||||
|
|
|
|||
|
|
@ -649,11 +649,11 @@ static int ll_setup(struct hci_uart *hu)
|
|||
/* This means that there was an error getting the BD address
|
||||
* during probe, so mark the device as having a bad address.
|
||||
*/
|
||||
set_bit(HCI_QUIRK_INVALID_BDADDR, &hu->hdev->quirks);
|
||||
hci_set_quirk(hu->hdev, HCI_QUIRK_INVALID_BDADDR);
|
||||
} else if (bacmp(&lldev->bdaddr, BDADDR_ANY)) {
|
||||
err = ll_set_bdaddr(hu->hdev, &lldev->bdaddr);
|
||||
if (err)
|
||||
set_bit(HCI_QUIRK_INVALID_BDADDR, &hu->hdev->quirks);
|
||||
hci_set_quirk(hu->hdev, HCI_QUIRK_INVALID_BDADDR);
|
||||
}
|
||||
|
||||
/* Operational speed if any */
|
||||
|
|
|
|||
|
|
@ -439,7 +439,7 @@ static int nokia_setup(struct hci_uart *hu)
|
|||
|
||||
if (btdev->man_id == NOKIA_ID_BCM2048) {
|
||||
hu->hdev->set_bdaddr = btbcm_set_bdaddr;
|
||||
set_bit(HCI_QUIRK_INVALID_BDADDR, &hu->hdev->quirks);
|
||||
hci_set_quirk(hu->hdev, HCI_QUIRK_INVALID_BDADDR);
|
||||
dev_dbg(dev, "bcm2048 has invalid bluetooth address!");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1892,7 +1892,7 @@ static int qca_setup(struct hci_uart *hu)
|
|||
/* Enable controller to do both LE scan and BR/EDR inquiry
|
||||
* simultaneously.
|
||||
*/
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
|
||||
switch (soc_type) {
|
||||
case QCA_QCA2066:
|
||||
|
|
@ -1944,7 +1944,7 @@ static int qca_setup(struct hci_uart *hu)
|
|||
case QCA_WCN7850:
|
||||
qcadev = serdev_device_get_drvdata(hu->serdev);
|
||||
if (qcadev->bdaddr_property_broken)
|
||||
set_bit(HCI_QUIRK_BDADDR_PROPERTY_BROKEN, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BDADDR_PROPERTY_BROKEN);
|
||||
|
||||
hci_set_aosp_capable(hdev);
|
||||
|
||||
|
|
@ -2487,7 +2487,7 @@ static int qca_serdev_probe(struct serdev_device *serdev)
|
|||
hdev = qcadev->serdev_hu.hdev;
|
||||
|
||||
if (power_ctrl_enabled) {
|
||||
set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_NON_PERSISTENT_SETUP);
|
||||
hdev->shutdown = qca_power_off;
|
||||
}
|
||||
|
||||
|
|
@ -2496,11 +2496,11 @@ static int qca_serdev_probe(struct serdev_device *serdev)
|
|||
* be queried via hci. Same with the valid le states quirk.
|
||||
*/
|
||||
if (data->capabilities & QCA_CAP_WIDEBAND_SPEECH)
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED,
|
||||
&hdev->quirks);
|
||||
hci_set_quirk(hdev,
|
||||
HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
|
||||
if (!(data->capabilities & QCA_CAP_VALID_LE_STATES))
|
||||
set_bit(HCI_QUIRK_BROKEN_LE_STATES, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_BROKEN_LE_STATES);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -2550,7 +2550,7 @@ static void qca_serdev_shutdown(struct device *dev)
|
|||
* invoked and the SOC is already in the initial state, so
|
||||
* don't also need to send the VSC.
|
||||
*/
|
||||
if (test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks) ||
|
||||
if (hci_test_quirk(hdev, HCI_QUIRK_NON_PERSISTENT_SETUP) ||
|
||||
hci_dev_test_flag(hdev, HCI_SETUP))
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ static int hci_uart_close(struct hci_dev *hdev)
|
|||
* BT SOC is completely powered OFF during BT OFF, holding port
|
||||
* open may drain the battery.
|
||||
*/
|
||||
if (test_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks)) {
|
||||
if (hci_test_quirk(hdev, HCI_QUIRK_NON_PERSISTENT_SETUP)) {
|
||||
clear_bit(HCI_UART_PROTO_READY, &hu->flags);
|
||||
serdev_device_close(hu->serdev);
|
||||
}
|
||||
|
|
@ -358,13 +358,13 @@ int hci_uart_register_device_priv(struct hci_uart *hu,
|
|||
SET_HCIDEV_DEV(hdev, &hu->serdev->dev);
|
||||
|
||||
if (test_bit(HCI_UART_NO_SUSPEND_NOTIFIER, &hu->flags))
|
||||
set_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_NO_SUSPEND_NOTIFIER);
|
||||
|
||||
if (test_bit(HCI_UART_RAW_DEVICE, &hu->hdev_flags))
|
||||
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RAW_DEVICE);
|
||||
|
||||
if (test_bit(HCI_UART_EXT_CONFIG, &hu->hdev_flags))
|
||||
set_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_EXTERNAL_CONFIG);
|
||||
|
||||
if (test_bit(HCI_UART_INIT_PENDING, &hu->hdev_flags))
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -415,16 +415,16 @@ static int __vhci_create_device(struct vhci_data *data, __u8 opcode)
|
|||
hdev->get_codec_config_data = vhci_get_codec_config_data;
|
||||
hdev->wakeup = vhci_wakeup;
|
||||
hdev->setup = vhci_setup;
|
||||
set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_SYNC_FLOWCTL_SUPPORTED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_NON_PERSISTENT_SETUP);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SYNC_FLOWCTL_SUPPORTED);
|
||||
|
||||
/* bit 6 is for external configuration */
|
||||
if (opcode & 0x40)
|
||||
set_bit(HCI_QUIRK_EXTERNAL_CONFIG, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_EXTERNAL_CONFIG);
|
||||
|
||||
/* bit 7 is for raw device */
|
||||
if (opcode & 0x80)
|
||||
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_RAW_DEVICE);
|
||||
|
||||
if (hci_register_dev(hdev) < 0) {
|
||||
BT_ERR("Can't register HCI device");
|
||||
|
|
|
|||
|
|
@ -327,17 +327,17 @@ static int virtbt_probe(struct virtio_device *vdev)
|
|||
hdev->setup = virtbt_setup_intel;
|
||||
hdev->shutdown = virtbt_shutdown_generic;
|
||||
hdev->set_bdaddr = virtbt_set_bdaddr_intel;
|
||||
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_STRICT_DUPLICATE_FILTER);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
break;
|
||||
|
||||
case VIRTIO_BT_CONFIG_VENDOR_REALTEK:
|
||||
hdev->manufacturer = 93;
|
||||
hdev->setup = virtbt_setup_realtek;
|
||||
hdev->shutdown = virtbt_shutdown_generic;
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_SIMULTANEOUS_DISCOVERY);
|
||||
hci_set_quirk(hdev, HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -720,11 +720,6 @@ static const struct pci_device_id agp_amd64_pci_table[] = {
|
|||
|
||||
MODULE_DEVICE_TABLE(pci, agp_amd64_pci_table);
|
||||
|
||||
static const struct pci_device_id agp_amd64_pci_promisc_table[] = {
|
||||
{ PCI_DEVICE_CLASS(0, 0) },
|
||||
{ }
|
||||
};
|
||||
|
||||
static DEFINE_SIMPLE_DEV_PM_OPS(agp_amd64_pm_ops, NULL, agp_amd64_resume);
|
||||
|
||||
static struct pci_driver agp_amd64_pci_driver = {
|
||||
|
|
@ -739,6 +734,7 @@ static struct pci_driver agp_amd64_pci_driver = {
|
|||
/* Not static due to IOMMU code calling it early. */
|
||||
int __init agp_amd64_init(void)
|
||||
{
|
||||
struct pci_dev *pdev = NULL;
|
||||
int err = 0;
|
||||
|
||||
if (agp_off)
|
||||
|
|
@ -767,9 +763,13 @@ int __init agp_amd64_init(void)
|
|||
}
|
||||
|
||||
/* Look for any AGP bridge */
|
||||
agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table;
|
||||
err = driver_attach(&agp_amd64_pci_driver.driver);
|
||||
if (err == 0 && agp_bridges_found == 0) {
|
||||
for_each_pci_dev(pdev)
|
||||
if (pci_find_capability(pdev, PCI_CAP_ID_AGP))
|
||||
pci_add_dynid(&agp_amd64_pci_driver,
|
||||
pdev->vendor, pdev->device,
|
||||
pdev->subsystem_vendor,
|
||||
pdev->subsystem_device, 0, 0, 0);
|
||||
if (agp_bridges_found == 0) {
|
||||
pci_unregister_driver(&agp_amd64_pci_driver);
|
||||
err = -ENODEV;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -404,6 +404,7 @@ static int scmi_clocks_probe(struct scmi_device *sdev)
|
|||
const struct scmi_handle *handle = sdev->handle;
|
||||
struct scmi_protocol_handle *ph;
|
||||
const struct clk_ops *scmi_clk_ops_db[SCMI_MAX_CLK_OPS] = {};
|
||||
struct scmi_clk *sclks;
|
||||
|
||||
if (!handle)
|
||||
return -ENODEV;
|
||||
|
|
@ -430,18 +431,21 @@ static int scmi_clocks_probe(struct scmi_device *sdev)
|
|||
transport_is_atomic = handle->is_transport_atomic(handle,
|
||||
&atomic_threshold_us);
|
||||
|
||||
for (idx = 0; idx < count; idx++) {
|
||||
struct scmi_clk *sclk;
|
||||
const struct clk_ops *scmi_ops;
|
||||
|
||||
sclk = devm_kzalloc(dev, sizeof(*sclk), GFP_KERNEL);
|
||||
if (!sclk)
|
||||
sclks = devm_kcalloc(dev, count, sizeof(*sclks), GFP_KERNEL);
|
||||
if (!sclks)
|
||||
return -ENOMEM;
|
||||
|
||||
for (idx = 0; idx < count; idx++)
|
||||
hws[idx] = &sclks[idx].hw;
|
||||
|
||||
for (idx = 0; idx < count; idx++) {
|
||||
struct scmi_clk *sclk = &sclks[idx];
|
||||
const struct clk_ops *scmi_ops;
|
||||
|
||||
sclk->info = scmi_proto_clk_ops->info_get(ph, idx);
|
||||
if (!sclk->info) {
|
||||
dev_dbg(dev, "invalid clock info for idx %d\n", idx);
|
||||
devm_kfree(dev, sclk);
|
||||
hws[idx] = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -479,13 +483,11 @@ static int scmi_clocks_probe(struct scmi_device *sdev)
|
|||
if (err) {
|
||||
dev_err(dev, "failed to register clock %d\n", idx);
|
||||
devm_kfree(dev, sclk->parent_data);
|
||||
devm_kfree(dev, sclk);
|
||||
hws[idx] = NULL;
|
||||
} else {
|
||||
dev_dbg(dev, "Registered clock:%s%s\n",
|
||||
sclk->info->name,
|
||||
scmi_ops->enable ? " (atomic ops)" : "");
|
||||
hws[idx] = &sclk->hw;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -219,11 +219,15 @@ static const struct imx95_blk_ctl_dev_data lvds_csr_dev_data = {
|
|||
.clk_reg_offset = 0,
|
||||
};
|
||||
|
||||
static const char * const disp_engine_parents[] = {
|
||||
"videopll1", "dsi_pll", "ldb_pll_div7"
|
||||
};
|
||||
|
||||
static const struct imx95_blk_ctl_clk_dev_data dispmix_csr_clk_dev_data[] = {
|
||||
[IMX95_CLK_DISPMIX_ENG0_SEL] = {
|
||||
.name = "disp_engine0_sel",
|
||||
.parent_names = (const char *[]){"videopll1", "dsi_pll", "ldb_pll_div7", },
|
||||
.num_parents = 4,
|
||||
.parent_names = disp_engine_parents,
|
||||
.num_parents = ARRAY_SIZE(disp_engine_parents),
|
||||
.reg = 0,
|
||||
.bit_idx = 0,
|
||||
.bit_width = 2,
|
||||
|
|
@ -232,8 +236,8 @@ static const struct imx95_blk_ctl_clk_dev_data dispmix_csr_clk_dev_data[] = {
|
|||
},
|
||||
[IMX95_CLK_DISPMIX_ENG1_SEL] = {
|
||||
.name = "disp_engine1_sel",
|
||||
.parent_names = (const char *[]){"videopll1", "dsi_pll", "ldb_pll_div7", },
|
||||
.num_parents = 4,
|
||||
.parent_names = disp_engine_parents,
|
||||
.num_parents = ARRAY_SIZE(disp_engine_parents),
|
||||
.reg = 0,
|
||||
.bit_idx = 2,
|
||||
.bit_width = 2,
|
||||
|
|
|
|||
|
|
@ -862,11 +862,23 @@ EXPORT_SYMBOL_FOR_TESTS_ONLY(drm_framebuffer_free);
|
|||
int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb,
|
||||
const struct drm_framebuffer_funcs *funcs)
|
||||
{
|
||||
unsigned int i;
|
||||
int ret;
|
||||
bool exists;
|
||||
|
||||
if (WARN_ON_ONCE(fb->dev != dev || !fb->format))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < fb->format->num_planes; i++) {
|
||||
if (drm_WARN_ON_ONCE(dev, fb->internal_flags & DRM_FRAMEBUFFER_HAS_HANDLE_REF(i)))
|
||||
fb->internal_flags &= ~DRM_FRAMEBUFFER_HAS_HANDLE_REF(i);
|
||||
if (fb->obj[i]) {
|
||||
exists = drm_gem_object_handle_get_if_exists_unlocked(fb->obj[i]);
|
||||
if (exists)
|
||||
fb->internal_flags |= DRM_FRAMEBUFFER_HAS_HANDLE_REF(i);
|
||||
}
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&fb->filp_head);
|
||||
|
||||
fb->funcs = funcs;
|
||||
|
|
@ -875,7 +887,7 @@ int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb,
|
|||
ret = __drm_mode_object_add(dev, &fb->base, DRM_MODE_OBJECT_FB,
|
||||
false, drm_framebuffer_free);
|
||||
if (ret)
|
||||
goto out;
|
||||
goto err;
|
||||
|
||||
mutex_lock(&dev->mode_config.fb_lock);
|
||||
dev->mode_config.num_fb++;
|
||||
|
|
@ -883,7 +895,16 @@ int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb,
|
|||
mutex_unlock(&dev->mode_config.fb_lock);
|
||||
|
||||
drm_mode_object_register(dev, &fb->base);
|
||||
out:
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
for (i = 0; i < fb->format->num_planes; i++) {
|
||||
if (fb->internal_flags & DRM_FRAMEBUFFER_HAS_HANDLE_REF(i)) {
|
||||
drm_gem_object_handle_put_unlocked(fb->obj[i]);
|
||||
fb->internal_flags &= ~DRM_FRAMEBUFFER_HAS_HANDLE_REF(i);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_framebuffer_init);
|
||||
|
|
@ -960,6 +981,12 @@ EXPORT_SYMBOL(drm_framebuffer_unregister_private);
|
|||
void drm_framebuffer_cleanup(struct drm_framebuffer *fb)
|
||||
{
|
||||
struct drm_device *dev = fb->dev;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < fb->format->num_planes; i++) {
|
||||
if (fb->internal_flags & DRM_FRAMEBUFFER_HAS_HANDLE_REF(i))
|
||||
drm_gem_object_handle_put_unlocked(fb->obj[i]);
|
||||
}
|
||||
|
||||
mutex_lock(&dev->mode_config.fb_lock);
|
||||
list_del(&fb->head);
|
||||
|
|
|
|||
|
|
@ -223,23 +223,34 @@ static void drm_gem_object_handle_get(struct drm_gem_object *obj)
|
|||
}
|
||||
|
||||
/**
|
||||
* drm_gem_object_handle_get_unlocked - acquire reference on user-space handles
|
||||
* drm_gem_object_handle_get_if_exists_unlocked - acquire reference on user-space handle, if any
|
||||
* @obj: GEM object
|
||||
*
|
||||
* Acquires a reference on the GEM buffer object's handle. Required
|
||||
* to keep the GEM object alive. Call drm_gem_object_handle_put_unlocked()
|
||||
* to release the reference.
|
||||
* Acquires a reference on the GEM buffer object's handle. Required to keep
|
||||
* the GEM object alive. Call drm_gem_object_handle_put_if_exists_unlocked()
|
||||
* to release the reference. Does nothing if the buffer object has no handle.
|
||||
*
|
||||
* Returns:
|
||||
* True if a handle exists, or false otherwise
|
||||
*/
|
||||
void drm_gem_object_handle_get_unlocked(struct drm_gem_object *obj)
|
||||
bool drm_gem_object_handle_get_if_exists_unlocked(struct drm_gem_object *obj)
|
||||
{
|
||||
struct drm_device *dev = obj->dev;
|
||||
|
||||
guard(mutex)(&dev->object_name_lock);
|
||||
|
||||
drm_WARN_ON(dev, !obj->handle_count); /* first ref taken in create-tail helper */
|
||||
/*
|
||||
* First ref taken during GEM object creation, if any. Some
|
||||
* drivers set up internal framebuffers with GEM objects that
|
||||
* do not have a GEM handle. Hence, this counter can be zero.
|
||||
*/
|
||||
if (!obj->handle_count)
|
||||
return false;
|
||||
|
||||
drm_gem_object_handle_get(obj);
|
||||
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_object_handle_get_unlocked);
|
||||
|
||||
/**
|
||||
* drm_gem_object_handle_free - release resources bound to userspace handles
|
||||
|
|
@ -272,7 +283,7 @@ static void drm_gem_object_exported_dma_buf_free(struct drm_gem_object *obj)
|
|||
}
|
||||
|
||||
/**
|
||||
* drm_gem_object_handle_put_unlocked - releases reference on user-space handles
|
||||
* drm_gem_object_handle_put_unlocked - releases reference on user-space handle
|
||||
* @obj: GEM object
|
||||
*
|
||||
* Releases a reference on the GEM buffer object's handle. Possibly releases
|
||||
|
|
@ -283,13 +294,13 @@ void drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj)
|
|||
struct drm_device *dev = obj->dev;
|
||||
bool final = false;
|
||||
|
||||
if (WARN_ON(READ_ONCE(obj->handle_count) == 0))
|
||||
if (drm_WARN_ON(dev, READ_ONCE(obj->handle_count) == 0))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Must bump handle count first as this may be the last
|
||||
* ref, in which case the object would disappear before we
|
||||
* checked for a name
|
||||
* ref, in which case the object would disappear before
|
||||
* we checked for a name.
|
||||
*/
|
||||
|
||||
mutex_lock(&dev->object_name_lock);
|
||||
|
|
@ -303,7 +314,6 @@ void drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj)
|
|||
if (final)
|
||||
drm_gem_object_put(obj);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_object_handle_put_unlocked);
|
||||
|
||||
/*
|
||||
* Called at device or object close to release the file's
|
||||
|
|
@ -315,6 +325,9 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
|
|||
struct drm_file *file_priv = data;
|
||||
struct drm_gem_object *obj = ptr;
|
||||
|
||||
if (drm_WARN_ON(obj->dev, !data))
|
||||
return 0;
|
||||
|
||||
if (obj->funcs->close)
|
||||
obj->funcs->close(obj, file_priv);
|
||||
|
||||
|
|
@ -435,7 +448,7 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
|
|||
idr_preload(GFP_KERNEL);
|
||||
spin_lock(&file_priv->table_lock);
|
||||
|
||||
ret = idr_alloc(&file_priv->object_idr, obj, 1, 0, GFP_NOWAIT);
|
||||
ret = idr_alloc(&file_priv->object_idr, NULL, 1, 0, GFP_NOWAIT);
|
||||
|
||||
spin_unlock(&file_priv->table_lock);
|
||||
idr_preload_end();
|
||||
|
|
@ -456,6 +469,11 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
|
|||
goto err_revoke;
|
||||
}
|
||||
|
||||
/* mirrors drm_gem_handle_delete to avoid races */
|
||||
spin_lock(&file_priv->table_lock);
|
||||
obj = idr_replace(&file_priv->object_idr, obj, handle);
|
||||
WARN_ON(obj != NULL);
|
||||
spin_unlock(&file_priv->table_lock);
|
||||
*handlep = handle;
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ void drm_gem_fb_destroy(struct drm_framebuffer *fb)
|
|||
unsigned int i;
|
||||
|
||||
for (i = 0; i < fb->format->num_planes; i++)
|
||||
drm_gem_object_handle_put_unlocked(fb->obj[i]);
|
||||
drm_gem_object_put(fb->obj[i]);
|
||||
|
||||
drm_framebuffer_cleanup(fb);
|
||||
kfree(fb);
|
||||
|
|
@ -182,10 +182,8 @@ int drm_gem_fb_init_with_funcs(struct drm_device *dev,
|
|||
if (!objs[i]) {
|
||||
drm_dbg_kms(dev, "Failed to lookup GEM object\n");
|
||||
ret = -ENOENT;
|
||||
goto err_gem_object_handle_put_unlocked;
|
||||
goto err_gem_object_put;
|
||||
}
|
||||
drm_gem_object_handle_get_unlocked(objs[i]);
|
||||
drm_gem_object_put(objs[i]);
|
||||
|
||||
min_size = (height - 1) * mode_cmd->pitches[i]
|
||||
+ drm_format_info_min_pitch(info, i, width)
|
||||
|
|
@ -195,22 +193,22 @@ int drm_gem_fb_init_with_funcs(struct drm_device *dev,
|
|||
drm_dbg_kms(dev,
|
||||
"GEM object size (%zu) smaller than minimum size (%u) for plane %d\n",
|
||||
objs[i]->size, min_size, i);
|
||||
drm_gem_object_handle_put_unlocked(objs[i]);
|
||||
drm_gem_object_put(objs[i]);
|
||||
ret = -EINVAL;
|
||||
goto err_gem_object_handle_put_unlocked;
|
||||
goto err_gem_object_put;
|
||||
}
|
||||
}
|
||||
|
||||
ret = drm_gem_fb_init(dev, fb, mode_cmd, objs, i, funcs);
|
||||
if (ret)
|
||||
goto err_gem_object_handle_put_unlocked;
|
||||
goto err_gem_object_put;
|
||||
|
||||
return 0;
|
||||
|
||||
err_gem_object_handle_put_unlocked:
|
||||
err_gem_object_put:
|
||||
while (i > 0) {
|
||||
--i;
|
||||
drm_gem_object_handle_put_unlocked(objs[i]);
|
||||
drm_gem_object_put(objs[i]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ void drm_sysfs_lease_event(struct drm_device *dev);
|
|||
|
||||
/* drm_gem.c */
|
||||
int drm_gem_init(struct drm_device *dev);
|
||||
void drm_gem_object_handle_get_unlocked(struct drm_gem_object *obj);
|
||||
bool drm_gem_object_handle_get_if_exists_unlocked(struct drm_gem_object *obj);
|
||||
void drm_gem_object_handle_put_unlocked(struct drm_gem_object *obj);
|
||||
int drm_gem_handle_create_tail(struct drm_file *file_priv,
|
||||
struct drm_gem_object *obj,
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
//! * <https://github.com/erwanvivien/fast_qr>
|
||||
//! * <https://github.com/bjguillot/qr>
|
||||
|
||||
use kernel::{prelude::*, str::CStr};
|
||||
use kernel::prelude::*;
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd)]
|
||||
struct Version(usize);
|
||||
|
|
|
|||
|
|
@ -1938,7 +1938,7 @@ static int get_init_otp_deassert_fragment_len(struct intel_display *display,
|
|||
int index, len;
|
||||
|
||||
if (drm_WARN_ON(display->drm,
|
||||
!data || panel->vbt.dsi.seq_version != 1))
|
||||
!data || panel->vbt.dsi.seq_version >= 3))
|
||||
return 0;
|
||||
|
||||
/* index = 1 to skip sequence byte */
|
||||
|
|
@ -1961,7 +1961,7 @@ static int get_init_otp_deassert_fragment_len(struct intel_display *display,
|
|||
}
|
||||
|
||||
/*
|
||||
* Some v1 VBT MIPI sequences do the deassert in the init OTP sequence.
|
||||
* Some v1/v2 VBT MIPI sequences do the deassert in the init OTP sequence.
|
||||
* The deassert must be done before calling intel_dsi_device_ready, so for
|
||||
* these devices we split the init OTP sequence into a deassert sequence and
|
||||
* the actual init OTP part.
|
||||
|
|
@ -1972,9 +1972,9 @@ static void vlv_fixup_mipi_sequences(struct intel_display *display,
|
|||
u8 *init_otp;
|
||||
int len;
|
||||
|
||||
/* Limit this to v1 vid-mode sequences */
|
||||
/* Limit this to v1/v2 vid-mode sequences */
|
||||
if (panel->vbt.dsi.config->is_cmd_mode ||
|
||||
panel->vbt.dsi.seq_version != 1)
|
||||
panel->vbt.dsi.seq_version >= 3)
|
||||
return;
|
||||
|
||||
/* Only do this if there are otp and assert seqs and no deassert seq */
|
||||
|
|
|
|||
|
|
@ -386,13 +386,13 @@ pvr_power_reset(struct pvr_device *pvr_dev, bool hard_reset)
|
|||
if (!err) {
|
||||
if (hard_reset) {
|
||||
pvr_dev->fw_dev.booted = false;
|
||||
WARN_ON(pm_runtime_force_suspend(from_pvr_device(pvr_dev)->dev));
|
||||
WARN_ON(pvr_power_device_suspend(from_pvr_device(pvr_dev)->dev));
|
||||
|
||||
err = pvr_fw_hard_reset(pvr_dev);
|
||||
if (err)
|
||||
goto err_device_lost;
|
||||
|
||||
err = pm_runtime_force_resume(from_pvr_device(pvr_dev)->dev);
|
||||
err = pvr_power_device_resume(from_pvr_device(pvr_dev)->dev);
|
||||
pvr_dev->fw_dev.booted = true;
|
||||
if (err)
|
||||
goto err_device_lost;
|
||||
|
|
|
|||
|
|
@ -314,14 +314,10 @@ nouveau_debugfs_fini(struct nouveau_drm *drm)
|
|||
drm->debugfs = NULL;
|
||||
}
|
||||
|
||||
int
|
||||
void
|
||||
nouveau_module_debugfs_init(void)
|
||||
{
|
||||
nouveau_debugfs_root = debugfs_create_dir("nouveau", NULL);
|
||||
if (IS_ERR(nouveau_debugfs_root))
|
||||
return PTR_ERR(nouveau_debugfs_root);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ extern void nouveau_debugfs_fini(struct nouveau_drm *);
|
|||
|
||||
extern struct dentry *nouveau_debugfs_root;
|
||||
|
||||
int nouveau_module_debugfs_init(void);
|
||||
void nouveau_module_debugfs_init(void);
|
||||
void nouveau_module_debugfs_fini(void);
|
||||
#else
|
||||
static inline void
|
||||
|
|
@ -42,10 +42,9 @@ nouveau_debugfs_fini(struct nouveau_drm *drm)
|
|||
{
|
||||
}
|
||||
|
||||
static inline int
|
||||
static inline void
|
||||
nouveau_module_debugfs_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
|
|||
|
|
@ -1461,9 +1461,7 @@ nouveau_drm_init(void)
|
|||
if (!nouveau_modeset)
|
||||
return 0;
|
||||
|
||||
ret = nouveau_module_debugfs_init();
|
||||
if (ret)
|
||||
return ret;
|
||||
nouveau_module_debugfs_init();
|
||||
|
||||
#ifdef CONFIG_NOUVEAU_PLATFORM_DRIVER
|
||||
platform_driver_register(&nouveau_platform_driver);
|
||||
|
|
|
|||
|
|
@ -719,7 +719,6 @@ r535_gsp_acpi_caps(acpi_handle handle, CAPS_METHOD_DATA *caps)
|
|||
union acpi_object argv4 = {
|
||||
.buffer.type = ACPI_TYPE_BUFFER,
|
||||
.buffer.length = 4,
|
||||
.buffer.pointer = kmalloc(argv4.buffer.length, GFP_KERNEL),
|
||||
}, *obj;
|
||||
|
||||
caps->status = 0xffff;
|
||||
|
|
@ -727,17 +726,22 @@ r535_gsp_acpi_caps(acpi_handle handle, CAPS_METHOD_DATA *caps)
|
|||
if (!acpi_check_dsm(handle, &NVOP_DSM_GUID, NVOP_DSM_REV, BIT_ULL(0x1a)))
|
||||
return;
|
||||
|
||||
argv4.buffer.pointer = kmalloc(argv4.buffer.length, GFP_KERNEL);
|
||||
if (!argv4.buffer.pointer)
|
||||
return;
|
||||
|
||||
obj = acpi_evaluate_dsm(handle, &NVOP_DSM_GUID, NVOP_DSM_REV, 0x1a, &argv4);
|
||||
if (!obj)
|
||||
return;
|
||||
goto done;
|
||||
|
||||
if (WARN_ON(obj->type != ACPI_TYPE_BUFFER) ||
|
||||
WARN_ON(obj->buffer.length != 4))
|
||||
return;
|
||||
goto done;
|
||||
|
||||
caps->status = 0;
|
||||
caps->optimusCaps = *(u32 *)obj->buffer.pointer;
|
||||
|
||||
done:
|
||||
ACPI_FREE(obj);
|
||||
|
||||
kfree(argv4.buffer.pointer);
|
||||
|
|
@ -754,24 +758,28 @@ r535_gsp_acpi_jt(acpi_handle handle, JT_METHOD_DATA *jt)
|
|||
union acpi_object argv4 = {
|
||||
.buffer.type = ACPI_TYPE_BUFFER,
|
||||
.buffer.length = sizeof(caps),
|
||||
.buffer.pointer = kmalloc(argv4.buffer.length, GFP_KERNEL),
|
||||
}, *obj;
|
||||
|
||||
jt->status = 0xffff;
|
||||
|
||||
argv4.buffer.pointer = kmalloc(argv4.buffer.length, GFP_KERNEL);
|
||||
if (!argv4.buffer.pointer)
|
||||
return;
|
||||
|
||||
obj = acpi_evaluate_dsm(handle, &JT_DSM_GUID, JT_DSM_REV, 0x1, &argv4);
|
||||
if (!obj)
|
||||
return;
|
||||
goto done;
|
||||
|
||||
if (WARN_ON(obj->type != ACPI_TYPE_BUFFER) ||
|
||||
WARN_ON(obj->buffer.length != 4))
|
||||
return;
|
||||
goto done;
|
||||
|
||||
jt->status = 0;
|
||||
jt->jtCaps = *(u32 *)obj->buffer.pointer;
|
||||
jt->jtRevId = (jt->jtCaps & 0xfff00000) >> 20;
|
||||
jt->bSBIOSCaps = 0;
|
||||
|
||||
done:
|
||||
ACPI_FREE(obj);
|
||||
|
||||
kfree(argv4.buffer.pointer);
|
||||
|
|
@ -1744,6 +1752,13 @@ r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
|
|||
nvkm_gsp_sg_free(gsp->subdev.device, &gsp->sr.sgt);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: Debug the GSP firmware / RPC handling to find out why
|
||||
* without this Turing (but none of the other architectures)
|
||||
* ends up resetting all channels after resume.
|
||||
*/
|
||||
msleep(50);
|
||||
}
|
||||
|
||||
ret = r535_gsp_rpc_unloading_guest_driver(gsp, suspend);
|
||||
|
|
|
|||
|
|
@ -261,10 +261,8 @@ static int nvdec_load_falcon_firmware(struct nvdec *nvdec)
|
|||
|
||||
if (!client->group) {
|
||||
virt = dma_alloc_coherent(nvdec->dev, size, &iova, GFP_KERNEL);
|
||||
|
||||
err = dma_mapping_error(nvdec->dev, iova);
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (!virt)
|
||||
return -ENOMEM;
|
||||
} else {
|
||||
virt = tegra_drm_alloc(tegra, size, &iova);
|
||||
if (IS_ERR(virt))
|
||||
|
|
|
|||
|
|
@ -171,14 +171,32 @@ static void xe_devcoredump_snapshot_free(struct xe_devcoredump_snapshot *ss)
|
|||
|
||||
#define XE_DEVCOREDUMP_CHUNK_MAX (SZ_512M + SZ_1G)
|
||||
|
||||
/**
|
||||
* xe_devcoredump_read() - Read data from the Xe device coredump snapshot
|
||||
* @buffer: Destination buffer to copy the coredump data into
|
||||
* @offset: Offset in the coredump data to start reading from
|
||||
* @count: Number of bytes to read
|
||||
* @data: Pointer to the xe_devcoredump structure
|
||||
* @datalen: Length of the data (unused)
|
||||
*
|
||||
* Reads a chunk of the coredump snapshot data into the provided buffer.
|
||||
* If the devcoredump is smaller than 1.5 GB (XE_DEVCOREDUMP_CHUNK_MAX),
|
||||
* it is read directly from a pre-written buffer. For larger devcoredumps,
|
||||
* the pre-written buffer must be periodically repopulated from the snapshot
|
||||
* state due to kmalloc size limitations.
|
||||
*
|
||||
* Return: Number of bytes copied on success, or a negative error code on failure.
|
||||
*/
|
||||
static ssize_t xe_devcoredump_read(char *buffer, loff_t offset,
|
||||
size_t count, void *data, size_t datalen)
|
||||
{
|
||||
struct xe_devcoredump *coredump = data;
|
||||
struct xe_devcoredump_snapshot *ss;
|
||||
ssize_t byte_copied;
|
||||
ssize_t byte_copied = 0;
|
||||
u32 chunk_offset;
|
||||
ssize_t new_chunk_position;
|
||||
bool pm_needed = false;
|
||||
int ret = 0;
|
||||
|
||||
if (!coredump)
|
||||
return -ENODEV;
|
||||
|
|
@ -188,20 +206,19 @@ static ssize_t xe_devcoredump_read(char *buffer, loff_t offset,
|
|||
/* Ensure delayed work is captured before continuing */
|
||||
flush_work(&ss->work);
|
||||
|
||||
if (ss->read.size > XE_DEVCOREDUMP_CHUNK_MAX)
|
||||
pm_needed = ss->read.size > XE_DEVCOREDUMP_CHUNK_MAX;
|
||||
if (pm_needed)
|
||||
xe_pm_runtime_get(gt_to_xe(ss->gt));
|
||||
|
||||
mutex_lock(&coredump->lock);
|
||||
|
||||
if (!ss->read.buffer) {
|
||||
mutex_unlock(&coredump->lock);
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (offset >= ss->read.size) {
|
||||
mutex_unlock(&coredump->lock);
|
||||
return 0;
|
||||
}
|
||||
if (offset >= ss->read.size)
|
||||
goto unlock;
|
||||
|
||||
new_chunk_position = div_u64_rem(offset,
|
||||
XE_DEVCOREDUMP_CHUNK_MAX,
|
||||
|
|
@ -221,12 +238,13 @@ static ssize_t xe_devcoredump_read(char *buffer, loff_t offset,
|
|||
ss->read.size - offset;
|
||||
memcpy(buffer, ss->read.buffer + chunk_offset, byte_copied);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&coredump->lock);
|
||||
|
||||
if (ss->read.size > XE_DEVCOREDUMP_CHUNK_MAX)
|
||||
if (pm_needed)
|
||||
xe_pm_runtime_put(gt_to_xe(ss->gt));
|
||||
|
||||
return byte_copied;
|
||||
return byte_copied ? byte_copied : ret;
|
||||
}
|
||||
|
||||
static void xe_devcoredump_free(void *data)
|
||||
|
|
|
|||
|
|
@ -444,6 +444,7 @@ static int xe_alloc_pf_queue(struct xe_gt *gt, struct pf_queue *pf_queue)
|
|||
#define PF_MULTIPLIER 8
|
||||
pf_queue->num_dw =
|
||||
(num_eus + XE_NUM_HW_ENGINES) * PF_MSG_LEN_DW * PF_MULTIPLIER;
|
||||
pf_queue->num_dw = roundup_pow_of_two(pf_queue->num_dw);
|
||||
#undef PF_MULTIPLIER
|
||||
|
||||
pf_queue->gt = gt;
|
||||
|
|
|
|||
|
|
@ -78,6 +78,9 @@ static struct xe_lmtt_pt *lmtt_pt_alloc(struct xe_lmtt *lmtt, unsigned int level
|
|||
}
|
||||
|
||||
lmtt_assert(lmtt, xe_bo_is_vram(bo));
|
||||
lmtt_debug(lmtt, "level=%u addr=%#llx\n", level, (u64)xe_bo_main_addr(bo, XE_PAGE_SIZE));
|
||||
|
||||
xe_map_memset(lmtt_to_xe(lmtt), &bo->vmap, 0, 0, bo->size);
|
||||
|
||||
pt->level = level;
|
||||
pt->bo = bo;
|
||||
|
|
@ -91,6 +94,9 @@ static struct xe_lmtt_pt *lmtt_pt_alloc(struct xe_lmtt *lmtt, unsigned int level
|
|||
|
||||
static void lmtt_pt_free(struct xe_lmtt_pt *pt)
|
||||
{
|
||||
lmtt_debug(&pt->bo->tile->sriov.pf.lmtt, "level=%u addr=%llx\n",
|
||||
pt->level, (u64)xe_bo_main_addr(pt->bo, XE_PAGE_SIZE));
|
||||
|
||||
xe_bo_unpin_map_no_vm(pt->bo);
|
||||
kfree(pt);
|
||||
}
|
||||
|
|
@ -226,9 +232,14 @@ static void lmtt_write_pte(struct xe_lmtt *lmtt, struct xe_lmtt_pt *pt,
|
|||
|
||||
switch (lmtt->ops->lmtt_pte_size(level)) {
|
||||
case sizeof(u32):
|
||||
lmtt_assert(lmtt, !overflows_type(pte, u32));
|
||||
lmtt_assert(lmtt, !pte || !iosys_map_rd(&pt->bo->vmap, idx * sizeof(u32), u32));
|
||||
|
||||
xe_map_wr(lmtt_to_xe(lmtt), &pt->bo->vmap, idx * sizeof(u32), u32, pte);
|
||||
break;
|
||||
case sizeof(u64):
|
||||
lmtt_assert(lmtt, !pte || !iosys_map_rd(&pt->bo->vmap, idx * sizeof(u64), u64));
|
||||
|
||||
xe_map_wr(lmtt_to_xe(lmtt), &pt->bo->vmap, idx * sizeof(u64), u64, pte);
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -863,7 +863,7 @@ struct dma_fence *xe_migrate_copy(struct xe_migrate *m,
|
|||
if (src_is_vram && xe_migrate_allow_identity(src_L0, &src_it))
|
||||
xe_res_next(&src_it, src_L0);
|
||||
else
|
||||
emit_pte(m, bb, src_L0_pt, src_is_vram, copy_system_ccs,
|
||||
emit_pte(m, bb, src_L0_pt, src_is_vram, copy_system_ccs || use_comp_pat,
|
||||
&src_it, src_L0, src);
|
||||
|
||||
if (dst_is_vram && xe_migrate_allow_identity(src_L0, &dst_it))
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
|
||||
struct xe_modparam xe_modparam = {
|
||||
.probe_display = true,
|
||||
.guc_log_level = 3,
|
||||
.guc_log_level = IS_ENABLED(CONFIG_DRM_XE_DEBUG) ? 3 : 1,
|
||||
.force_probe = CONFIG_DRM_XE_FORCE_PROBE,
|
||||
.wedged_mode = 1,
|
||||
.svm_notifier_size = 512,
|
||||
|
|
|
|||
|
|
@ -140,7 +140,6 @@ static const struct xe_graphics_desc graphics_xelpg = {
|
|||
.has_asid = 1, \
|
||||
.has_atomic_enable_pte_bit = 1, \
|
||||
.has_flat_ccs = 1, \
|
||||
.has_indirect_ring_state = 1, \
|
||||
.has_range_tlb_invalidation = 1, \
|
||||
.has_usm = 1, \
|
||||
.has_64bit_timestamp = 1, \
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ int xe_pm_suspend(struct xe_device *xe)
|
|||
/* FIXME: Super racey... */
|
||||
err = xe_bo_evict_all(xe);
|
||||
if (err)
|
||||
goto err_pxp;
|
||||
goto err_display;
|
||||
|
||||
for_each_gt(gt, xe, id) {
|
||||
err = xe_gt_suspend(gt);
|
||||
|
|
@ -151,7 +151,6 @@ int xe_pm_suspend(struct xe_device *xe)
|
|||
|
||||
err_display:
|
||||
xe_display_pm_resume(xe);
|
||||
err_pxp:
|
||||
xe_pxp_pm_resume(xe->pxp);
|
||||
err:
|
||||
drm_dbg(&xe->drm, "Device suspend failed %d\n", err);
|
||||
|
|
@ -753,11 +752,13 @@ void xe_pm_assert_unbounded_bridge(struct xe_device *xe)
|
|||
}
|
||||
|
||||
/**
|
||||
* xe_pm_set_vram_threshold - Set a vram threshold for allowing/blocking D3Cold
|
||||
* xe_pm_set_vram_threshold - Set a VRAM threshold for allowing/blocking D3Cold
|
||||
* @xe: xe device instance
|
||||
* @threshold: VRAM size in bites for the D3cold threshold
|
||||
* @threshold: VRAM size in MiB for the D3cold threshold
|
||||
*
|
||||
* Returns 0 for success, negative error code otherwise.
|
||||
* Return:
|
||||
* * 0 - success
|
||||
* * -EINVAL - invalid argument
|
||||
*/
|
||||
int xe_pm_set_vram_threshold(struct xe_device *xe, u32 threshold)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -114,10 +114,10 @@ struct fw_blobs_by_type {
|
|||
#define XE_GT_TYPE_ANY XE_GT_TYPE_UNINITIALIZED
|
||||
|
||||
#define XE_GUC_FIRMWARE_DEFS(fw_def, mmp_ver, major_ver) \
|
||||
fw_def(BATTLEMAGE, GT_TYPE_ANY, major_ver(xe, guc, bmg, 70, 44, 1)) \
|
||||
fw_def(LUNARLAKE, GT_TYPE_ANY, major_ver(xe, guc, lnl, 70, 44, 1)) \
|
||||
fw_def(BATTLEMAGE, GT_TYPE_ANY, major_ver(xe, guc, bmg, 70, 45, 2)) \
|
||||
fw_def(LUNARLAKE, GT_TYPE_ANY, major_ver(xe, guc, lnl, 70, 45, 2)) \
|
||||
fw_def(METEORLAKE, GT_TYPE_ANY, major_ver(i915, guc, mtl, 70, 44, 1)) \
|
||||
fw_def(DG2, GT_TYPE_ANY, major_ver(i915, guc, dg2, 70, 44, 1)) \
|
||||
fw_def(DG2, GT_TYPE_ANY, major_ver(i915, guc, dg2, 70, 45, 2)) \
|
||||
fw_def(DG1, GT_TYPE_ANY, major_ver(i915, guc, dg1, 70, 44, 1)) \
|
||||
fw_def(ALDERLAKE_N, GT_TYPE_ANY, major_ver(i915, guc, tgl, 70, 44, 1)) \
|
||||
fw_def(ALDERLAKE_P, GT_TYPE_ANY, major_ver(i915, guc, adlp, 70, 44, 1)) \
|
||||
|
|
|
|||
|
|
@ -38,10 +38,10 @@
|
|||
GRAPHICS_VERSION(2004)
|
||||
GRAPHICS_VERSION_RANGE(3000, 3001)
|
||||
22019338487 MEDIA_VERSION(2000)
|
||||
GRAPHICS_VERSION(2001)
|
||||
GRAPHICS_VERSION(2001), FUNC(xe_rtp_match_not_sriov_vf)
|
||||
MEDIA_VERSION(3000), MEDIA_STEP(A0, B0), FUNC(xe_rtp_match_not_sriov_vf)
|
||||
22019338487_display PLATFORM(LUNARLAKE)
|
||||
16023588340 GRAPHICS_VERSION(2001)
|
||||
16023588340 GRAPHICS_VERSION(2001), FUNC(xe_rtp_match_not_sriov_vf)
|
||||
14019789679 GRAPHICS_VERSION(1255)
|
||||
GRAPHICS_VERSION_RANGE(1270, 2004)
|
||||
no_media_l3 MEDIA_VERSION(3000)
|
||||
|
|
|
|||
|
|
@ -1883,9 +1883,12 @@ u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags)
|
|||
/*
|
||||
* 7 extra bytes are necessary to achieve proper functionality
|
||||
* of implement() working on 8 byte chunks
|
||||
* 1 extra byte for the report ID if it is null (not used) so
|
||||
* we can reserve that extra byte in the first position of the buffer
|
||||
* when sending it to .raw_request()
|
||||
*/
|
||||
|
||||
u32 len = hid_report_len(report) + 7;
|
||||
u32 len = hid_report_len(report) + 7 + (report->id == 0);
|
||||
|
||||
return kzalloc(len, flags);
|
||||
}
|
||||
|
|
@ -1973,7 +1976,7 @@ static struct hid_report *hid_get_report(struct hid_report_enum *report_enum,
|
|||
int __hid_request(struct hid_device *hid, struct hid_report *report,
|
||||
enum hid_class_request reqtype)
|
||||
{
|
||||
char *buf;
|
||||
char *buf, *data_buf;
|
||||
int ret;
|
||||
u32 len;
|
||||
|
||||
|
|
@ -1981,13 +1984,19 @@ int __hid_request(struct hid_device *hid, struct hid_report *report,
|
|||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
data_buf = buf;
|
||||
len = hid_report_len(report);
|
||||
|
||||
if (reqtype == HID_REQ_SET_REPORT)
|
||||
hid_output_report(report, buf);
|
||||
if (report->id == 0) {
|
||||
/* reserve the first byte for the report ID */
|
||||
data_buf++;
|
||||
len++;
|
||||
}
|
||||
|
||||
ret = hid->ll_driver->raw_request(hid, report->id, buf, len,
|
||||
report->type, reqtype);
|
||||
if (reqtype == HID_REQ_SET_REPORT)
|
||||
hid_output_report(report, data_buf);
|
||||
|
||||
ret = hid_hw_raw_request(hid, report->id, buf, len, report->type, reqtype);
|
||||
if (ret < 0) {
|
||||
dbg_hid("unable to complete request: %d\n", ret);
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -3299,7 +3299,7 @@ static const char *keys[KEY_MAX + 1] = {
|
|||
[BTN_STYLUS2] = "Stylus2", [BTN_TOOL_DOUBLETAP] = "ToolDoubleTap",
|
||||
[BTN_TOOL_TRIPLETAP] = "ToolTripleTap", [BTN_TOOL_QUADTAP] = "ToolQuadrupleTap",
|
||||
[BTN_GEAR_DOWN] = "BtnGearDown", [BTN_GEAR_UP] = "BtnGearUp",
|
||||
[BTN_WHEEL] = "BtnWheel", [KEY_OK] = "Ok",
|
||||
[KEY_OK] = "Ok",
|
||||
[KEY_SELECT] = "Select", [KEY_GOTO] = "Goto",
|
||||
[KEY_CLEAR] = "Clear", [KEY_POWER2] = "Power2",
|
||||
[KEY_OPTION] = "Option", [KEY_INFO] = "Info",
|
||||
|
|
|
|||
|
|
@ -2742,7 +2742,11 @@ static unsigned long __evict_a_few(unsigned long nr_buffers)
|
|||
__make_buffer_clean(b);
|
||||
__free_buffer_wake(b);
|
||||
|
||||
if (need_resched()) {
|
||||
dm_bufio_unlock(c);
|
||||
cond_resched();
|
||||
dm_bufio_lock(c);
|
||||
}
|
||||
}
|
||||
|
||||
dm_bufio_unlock(c);
|
||||
|
|
|
|||
|
|
@ -2366,8 +2366,7 @@ static int bitmap_get_stats(void *data, struct md_bitmap_stats *stats)
|
|||
|
||||
if (!bitmap)
|
||||
return -ENOENT;
|
||||
if (!bitmap->mddev->bitmap_info.external &&
|
||||
!bitmap->storage.sb_page)
|
||||
if (!bitmap->storage.sb_page)
|
||||
return -EINVAL;
|
||||
sb = kmap_local_page(bitmap->storage.sb_page);
|
||||
stats->sync_size = le64_to_cpu(sb->sync_size);
|
||||
|
|
|
|||
|
|
@ -1399,7 +1399,7 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
|
|||
}
|
||||
read_bio = bio_alloc_clone(mirror->rdev->bdev, bio, gfp,
|
||||
&mddev->bio_set);
|
||||
|
||||
read_bio->bi_opf &= ~REQ_NOWAIT;
|
||||
r1_bio->bios[rdisk] = read_bio;
|
||||
|
||||
read_bio->bi_iter.bi_sector = r1_bio->sector +
|
||||
|
|
@ -1649,6 +1649,7 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
|
|||
wait_for_serialization(rdev, r1_bio);
|
||||
}
|
||||
|
||||
mbio->bi_opf &= ~REQ_NOWAIT;
|
||||
r1_bio->bios[i] = mbio;
|
||||
|
||||
mbio->bi_iter.bi_sector = (r1_bio->sector + rdev->data_offset);
|
||||
|
|
@ -3428,6 +3429,7 @@ static int raid1_reshape(struct mddev *mddev)
|
|||
/* ok, everything is stopped */
|
||||
oldpool = conf->r1bio_pool;
|
||||
conf->r1bio_pool = newpool;
|
||||
init_waitqueue_head(&conf->r1bio_pool.wait);
|
||||
|
||||
for (d = d2 = 0; d < conf->raid_disks; d++) {
|
||||
struct md_rdev *rdev = conf->mirrors[d].rdev;
|
||||
|
|
|
|||
|
|
@ -1182,8 +1182,11 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
|
|||
}
|
||||
}
|
||||
|
||||
if (!regular_request_wait(mddev, conf, bio, r10_bio->sectors))
|
||||
if (!regular_request_wait(mddev, conf, bio, r10_bio->sectors)) {
|
||||
raid_end_bio_io(r10_bio);
|
||||
return;
|
||||
}
|
||||
|
||||
rdev = read_balance(conf, r10_bio, &max_sectors);
|
||||
if (!rdev) {
|
||||
if (err_rdev) {
|
||||
|
|
@ -1221,6 +1224,7 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
|
|||
r10_bio->master_bio = bio;
|
||||
}
|
||||
read_bio = bio_alloc_clone(rdev->bdev, bio, gfp, &mddev->bio_set);
|
||||
read_bio->bi_opf &= ~REQ_NOWAIT;
|
||||
|
||||
r10_bio->devs[slot].bio = read_bio;
|
||||
r10_bio->devs[slot].rdev = rdev;
|
||||
|
|
@ -1256,6 +1260,7 @@ static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio,
|
|||
conf->mirrors[devnum].rdev;
|
||||
|
||||
mbio = bio_alloc_clone(rdev->bdev, bio, GFP_NOIO, &mddev->bio_set);
|
||||
mbio->bi_opf &= ~REQ_NOWAIT;
|
||||
if (replacement)
|
||||
r10_bio->devs[n_copy].repl_bio = mbio;
|
||||
else
|
||||
|
|
@ -1370,8 +1375,11 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
|
|||
}
|
||||
|
||||
sectors = r10_bio->sectors;
|
||||
if (!regular_request_wait(mddev, conf, bio, sectors))
|
||||
if (!regular_request_wait(mddev, conf, bio, sectors)) {
|
||||
raid_end_bio_io(r10_bio);
|
||||
return;
|
||||
}
|
||||
|
||||
if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
|
||||
(mddev->reshape_backwards
|
||||
? (bio->bi_iter.bi_sector < conf->reshape_safe &&
|
||||
|
|
|
|||
|
|
@ -343,21 +343,19 @@ static void tcan4x5x_get_dt_data(struct m_can_classdev *cdev)
|
|||
of_property_read_bool(cdev->dev->of_node, "ti,nwkrq-voltage-vio");
|
||||
}
|
||||
|
||||
static int tcan4x5x_get_gpios(struct m_can_classdev *cdev,
|
||||
const struct tcan4x5x_version_info *version_info)
|
||||
static int tcan4x5x_get_gpios(struct m_can_classdev *cdev)
|
||||
{
|
||||
struct tcan4x5x_priv *tcan4x5x = cdev_to_priv(cdev);
|
||||
int ret;
|
||||
|
||||
if (version_info->has_wake_pin) {
|
||||
tcan4x5x->device_wake_gpio = devm_gpiod_get(cdev->dev, "device-wake",
|
||||
tcan4x5x->device_wake_gpio = devm_gpiod_get_optional(cdev->dev,
|
||||
"device-wake",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(tcan4x5x->device_wake_gpio)) {
|
||||
if (PTR_ERR(tcan4x5x->device_wake_gpio) == -EPROBE_DEFER)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
tcan4x5x_disable_wake(cdev);
|
||||
}
|
||||
tcan4x5x->device_wake_gpio = NULL;
|
||||
}
|
||||
|
||||
tcan4x5x->reset_gpio = devm_gpiod_get_optional(cdev->dev, "reset",
|
||||
|
|
@ -369,14 +367,31 @@ static int tcan4x5x_get_gpios(struct m_can_classdev *cdev,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (version_info->has_state_pin) {
|
||||
tcan4x5x->device_state_gpio = devm_gpiod_get_optional(cdev->dev,
|
||||
"device-state",
|
||||
GPIOD_IN);
|
||||
if (IS_ERR(tcan4x5x->device_state_gpio)) {
|
||||
if (IS_ERR(tcan4x5x->device_state_gpio))
|
||||
tcan4x5x->device_state_gpio = NULL;
|
||||
tcan4x5x_disable_state(cdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tcan4x5x_check_gpios(struct m_can_classdev *cdev,
|
||||
const struct tcan4x5x_version_info *version_info)
|
||||
{
|
||||
struct tcan4x5x_priv *tcan4x5x = cdev_to_priv(cdev);
|
||||
int ret;
|
||||
|
||||
if (version_info->has_wake_pin && !tcan4x5x->device_wake_gpio) {
|
||||
ret = tcan4x5x_disable_wake(cdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (version_info->has_state_pin && !tcan4x5x->device_state_gpio) {
|
||||
ret = tcan4x5x_disable_state(cdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -468,15 +483,21 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
|
|||
goto out_m_can_class_free_dev;
|
||||
}
|
||||
|
||||
ret = tcan4x5x_get_gpios(mcan_class);
|
||||
if (ret) {
|
||||
dev_err(&spi->dev, "Getting gpios failed %pe\n", ERR_PTR(ret));
|
||||
goto out_power;
|
||||
}
|
||||
|
||||
version_info = tcan4x5x_find_version(priv);
|
||||
if (IS_ERR(version_info)) {
|
||||
ret = PTR_ERR(version_info);
|
||||
goto out_power;
|
||||
}
|
||||
|
||||
ret = tcan4x5x_get_gpios(mcan_class, version_info);
|
||||
ret = tcan4x5x_check_gpios(mcan_class, version_info);
|
||||
if (ret) {
|
||||
dev_err(&spi->dev, "Getting gpios failed %pe\n", ERR_PTR(ret));
|
||||
dev_err(&spi->dev, "Checking gpios failed %pe\n", ERR_PTR(ret));
|
||||
goto out_power;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -401,12 +401,13 @@ struct airoha_npu *airoha_npu_get(struct device *dev, dma_addr_t *stats_addr)
|
|||
return ERR_PTR(-ENODEV);
|
||||
|
||||
pdev = of_find_device_by_node(np);
|
||||
of_node_put(np);
|
||||
|
||||
if (!pdev) {
|
||||
dev_err(dev, "cannot find device node %s\n", np->name);
|
||||
of_node_put(np);
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
of_node_put(np);
|
||||
|
||||
if (!try_module_get(THIS_MODULE)) {
|
||||
dev_err(dev, "failed to get the device driver module\n");
|
||||
|
|
|
|||
|
|
@ -189,13 +189,14 @@ struct fm10k_q_vector {
|
|||
struct fm10k_ring_container rx, tx;
|
||||
|
||||
struct napi_struct napi;
|
||||
struct rcu_head rcu; /* to avoid race with update stats on free */
|
||||
|
||||
cpumask_t affinity_mask;
|
||||
char name[IFNAMSIZ + 9];
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *dbg_q_vector;
|
||||
#endif /* CONFIG_DEBUG_FS */
|
||||
struct rcu_head rcu; /* to avoid race with update stats on free */
|
||||
|
||||
/* for dynamic allocation of rings associated with this q_vector */
|
||||
struct fm10k_ring ring[] ____cacheline_internodealigned_in_smp;
|
||||
|
|
|
|||
|
|
@ -946,6 +946,7 @@ struct i40e_q_vector {
|
|||
u16 reg_idx; /* register index of the interrupt */
|
||||
|
||||
struct napi_struct napi;
|
||||
struct rcu_head rcu; /* to avoid race with update stats on free */
|
||||
|
||||
struct i40e_ring_container rx;
|
||||
struct i40e_ring_container tx;
|
||||
|
|
@ -956,7 +957,6 @@ struct i40e_q_vector {
|
|||
cpumask_t affinity_mask;
|
||||
struct irq_affinity_notify affinity_notify;
|
||||
|
||||
struct rcu_head rcu; /* to avoid race with update stats on free */
|
||||
char name[I40E_INT_NAME_STR_LEN];
|
||||
bool arm_wb_state;
|
||||
bool in_busy_poll;
|
||||
|
|
|
|||
|
|
@ -606,7 +606,7 @@ void ice_debugfs_fwlog_init(struct ice_pf *pf)
|
|||
|
||||
pf->ice_debugfs_pf_fwlog = debugfs_create_dir("fwlog",
|
||||
pf->ice_debugfs_pf);
|
||||
if (IS_ERR(pf->ice_debugfs_pf))
|
||||
if (IS_ERR(pf->ice_debugfs_pf_fwlog))
|
||||
goto err_create_module_files;
|
||||
|
||||
fw_modules_dir = debugfs_create_dir("modules",
|
||||
|
|
|
|||
|
|
@ -2226,7 +2226,8 @@ bool ice_lag_is_switchdev_running(struct ice_pf *pf)
|
|||
struct ice_lag *lag = pf->lag;
|
||||
struct net_device *tmp_nd;
|
||||
|
||||
if (!ice_is_feature_supported(pf, ICE_F_SRIOV_LAG) || !lag)
|
||||
if (!ice_is_feature_supported(pf, ICE_F_SRIOV_LAG) ||
|
||||
!lag || !lag->upper_netdev)
|
||||
return false;
|
||||
|
||||
rcu_read_lock();
|
||||
|
|
|
|||
|
|
@ -511,9 +511,10 @@ struct ixgbe_q_vector {
|
|||
struct ixgbe_ring_container rx, tx;
|
||||
|
||||
struct napi_struct napi;
|
||||
struct rcu_head rcu; /* to avoid race with update stats on free */
|
||||
|
||||
cpumask_t affinity_mask;
|
||||
int numa_node;
|
||||
struct rcu_head rcu; /* to avoid race with update stats on free */
|
||||
char name[IFNAMSIZ + 9];
|
||||
|
||||
/* for dynamic allocation of rings associated with this q_vector */
|
||||
|
|
|
|||
|
|
@ -1161,7 +1161,8 @@ static void mlx5e_lro_update_tcp_hdr(struct mlx5_cqe64 *cqe, struct tcphdr *tcp)
|
|||
}
|
||||
}
|
||||
|
||||
static void mlx5e_lro_update_hdr(struct sk_buff *skb, struct mlx5_cqe64 *cqe,
|
||||
static unsigned int mlx5e_lro_update_hdr(struct sk_buff *skb,
|
||||
struct mlx5_cqe64 *cqe,
|
||||
u32 cqe_bcnt)
|
||||
{
|
||||
struct ethhdr *eth = (struct ethhdr *)(skb->data);
|
||||
|
|
@ -1212,6 +1213,8 @@ static void mlx5e_lro_update_hdr(struct sk_buff *skb, struct mlx5_cqe64 *cqe,
|
|||
tcp->check = tcp_v6_check(payload_len, &ipv6->saddr,
|
||||
&ipv6->daddr, check);
|
||||
}
|
||||
|
||||
return (unsigned int)((unsigned char *)tcp + tcp->doff * 4 - skb->data);
|
||||
}
|
||||
|
||||
static void *mlx5e_shampo_get_packet_hd(struct mlx5e_rq *rq, u16 header_index)
|
||||
|
|
@ -1568,8 +1571,9 @@ static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe,
|
|||
mlx5e_macsec_offload_handle_rx_skb(netdev, skb, cqe);
|
||||
|
||||
if (lro_num_seg > 1) {
|
||||
mlx5e_lro_update_hdr(skb, cqe, cqe_bcnt);
|
||||
skb_shinfo(skb)->gso_size = DIV_ROUND_UP(cqe_bcnt, lro_num_seg);
|
||||
unsigned int hdrlen = mlx5e_lro_update_hdr(skb, cqe, cqe_bcnt);
|
||||
|
||||
skb_shinfo(skb)->gso_size = DIV_ROUND_UP(cqe_bcnt - hdrlen, lro_num_seg);
|
||||
/* Subtract one since we already counted this as one
|
||||
* "regular" packet in mlx5e_complete_rx_cqe()
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -2254,6 +2254,7 @@ static const struct pci_device_id mlx5_core_pci_table[] = {
|
|||
{ PCI_VDEVICE(MELLANOX, 0x1021) }, /* ConnectX-7 */
|
||||
{ PCI_VDEVICE(MELLANOX, 0x1023) }, /* ConnectX-8 */
|
||||
{ PCI_VDEVICE(MELLANOX, 0x1025) }, /* ConnectX-9 */
|
||||
{ PCI_VDEVICE(MELLANOX, 0x1027) }, /* ConnectX-10 */
|
||||
{ PCI_VDEVICE(MELLANOX, 0xa2d2) }, /* BlueField integrated ConnectX-5 network controller */
|
||||
{ PCI_VDEVICE(MELLANOX, 0xa2d3), MLX5_PCI_DEV_IS_VF}, /* BlueField integrated ConnectX-5 network controller VF */
|
||||
{ PCI_VDEVICE(MELLANOX, 0xa2d6) }, /* BlueField-2 integrated ConnectX-6 Dx network controller */
|
||||
|
|
|
|||
|
|
@ -433,6 +433,12 @@ static int intel_crosststamp(ktime_t *device,
|
|||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
*system = (struct system_counterval_t) {
|
||||
.cycles = 0,
|
||||
.cs_id = CSID_X86_ART,
|
||||
.use_nsecs = false,
|
||||
};
|
||||
|
||||
num_snapshot = (readl(ioaddr + GMAC_TIMESTAMP_STATUS) &
|
||||
GMAC_TIMESTAMP_ATSNS_MASK) >>
|
||||
GMAC_TIMESTAMP_ATSNS_SHIFT;
|
||||
|
|
@ -448,7 +454,7 @@ static int intel_crosststamp(ktime_t *device,
|
|||
}
|
||||
|
||||
system->cycles *= intel_priv->crossts_adj;
|
||||
system->cs_id = CSID_X86_ART;
|
||||
|
||||
priv->plat->flags &= ~STMMAC_FLAG_INT_SNAPSHOT_EN;
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -1919,7 +1919,6 @@ static void wx_configure_rx_ring(struct wx *wx,
|
|||
struct wx_ring *ring)
|
||||
{
|
||||
u16 reg_idx = ring->reg_idx;
|
||||
union wx_rx_desc *rx_desc;
|
||||
u64 rdba = ring->dma;
|
||||
u32 rxdctl;
|
||||
|
||||
|
|
@ -1949,9 +1948,9 @@ static void wx_configure_rx_ring(struct wx *wx,
|
|||
memset(ring->rx_buffer_info, 0,
|
||||
sizeof(struct wx_rx_buffer) * ring->count);
|
||||
|
||||
/* initialize Rx descriptor 0 */
|
||||
rx_desc = WX_RX_DESC(ring, 0);
|
||||
rx_desc->wb.upper.length = 0;
|
||||
/* reset ntu and ntc to place SW in sync with hardware */
|
||||
ring->next_to_clean = 0;
|
||||
ring->next_to_use = 0;
|
||||
|
||||
/* enable receive descriptor ring */
|
||||
wr32m(wx, WX_PX_RR_CFG(reg_idx),
|
||||
|
|
@ -2786,6 +2785,8 @@ void wx_update_stats(struct wx *wx)
|
|||
hwstats->fdirmiss += rd32(wx, WX_RDB_FDIR_MISS);
|
||||
}
|
||||
|
||||
/* qmprc is not cleared on read, manual reset it */
|
||||
hwstats->qmprc = 0;
|
||||
for (i = wx->num_vfs * wx->num_rx_queues_per_pool;
|
||||
i < wx->mac.max_rx_queues; i++)
|
||||
hwstats->qmprc += rd32(wx, WX_PX_MPRC(i));
|
||||
|
|
|
|||
|
|
@ -174,10 +174,6 @@ static void wx_dma_sync_frag(struct wx_ring *rx_ring,
|
|||
skb_frag_off(frag),
|
||||
skb_frag_size(frag),
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
/* If the page was released, just unmap it. */
|
||||
if (unlikely(WX_CB(skb)->page_released))
|
||||
page_pool_put_full_page(rx_ring->page_pool, rx_buffer->page, false);
|
||||
}
|
||||
|
||||
static struct wx_rx_buffer *wx_get_rx_buffer(struct wx_ring *rx_ring,
|
||||
|
|
@ -227,10 +223,6 @@ static void wx_put_rx_buffer(struct wx_ring *rx_ring,
|
|||
struct sk_buff *skb,
|
||||
int rx_buffer_pgcnt)
|
||||
{
|
||||
if (!IS_ERR(skb) && WX_CB(skb)->dma == rx_buffer->dma)
|
||||
/* the page has been released from the ring */
|
||||
WX_CB(skb)->page_released = true;
|
||||
|
||||
/* clear contents of rx_buffer */
|
||||
rx_buffer->page = NULL;
|
||||
rx_buffer->skb = NULL;
|
||||
|
|
@ -315,7 +307,7 @@ static bool wx_alloc_mapped_page(struct wx_ring *rx_ring,
|
|||
return false;
|
||||
dma = page_pool_get_dma_addr(page);
|
||||
|
||||
bi->page_dma = dma;
|
||||
bi->dma = dma;
|
||||
bi->page = page;
|
||||
bi->page_offset = 0;
|
||||
|
||||
|
|
@ -352,7 +344,7 @@ void wx_alloc_rx_buffers(struct wx_ring *rx_ring, u16 cleaned_count)
|
|||
DMA_FROM_DEVICE);
|
||||
|
||||
rx_desc->read.pkt_addr =
|
||||
cpu_to_le64(bi->page_dma + bi->page_offset);
|
||||
cpu_to_le64(bi->dma + bi->page_offset);
|
||||
|
||||
rx_desc++;
|
||||
bi++;
|
||||
|
|
@ -365,6 +357,8 @@ void wx_alloc_rx_buffers(struct wx_ring *rx_ring, u16 cleaned_count)
|
|||
|
||||
/* clear the status bits for the next_to_use descriptor */
|
||||
rx_desc->wb.upper.status_error = 0;
|
||||
/* clear the length for the next_to_use descriptor */
|
||||
rx_desc->wb.upper.length = 0;
|
||||
|
||||
cleaned_count--;
|
||||
} while (cleaned_count);
|
||||
|
|
@ -2428,9 +2422,6 @@ static void wx_clean_rx_ring(struct wx_ring *rx_ring)
|
|||
if (rx_buffer->skb) {
|
||||
struct sk_buff *skb = rx_buffer->skb;
|
||||
|
||||
if (WX_CB(skb)->page_released)
|
||||
page_pool_put_full_page(rx_ring->page_pool, rx_buffer->page, false);
|
||||
|
||||
dev_kfree_skb(skb);
|
||||
}
|
||||
|
||||
|
|
@ -2454,6 +2445,9 @@ static void wx_clean_rx_ring(struct wx_ring *rx_ring)
|
|||
}
|
||||
}
|
||||
|
||||
/* Zero out the descriptor ring */
|
||||
memset(rx_ring->desc, 0, rx_ring->size);
|
||||
|
||||
rx_ring->next_to_alloc = 0;
|
||||
rx_ring->next_to_clean = 0;
|
||||
rx_ring->next_to_use = 0;
|
||||
|
|
|
|||
|
|
@ -914,7 +914,6 @@ enum wx_reset_type {
|
|||
struct wx_cb {
|
||||
dma_addr_t dma;
|
||||
u16 append_cnt; /* number of skb's appended */
|
||||
bool page_released;
|
||||
bool dma_released;
|
||||
};
|
||||
|
||||
|
|
@ -1003,7 +1002,6 @@ struct wx_tx_buffer {
|
|||
struct wx_rx_buffer {
|
||||
struct sk_buff *skb;
|
||||
dma_addr_t dma;
|
||||
dma_addr_t page_dma;
|
||||
struct page *page;
|
||||
unsigned int page_offset;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -286,7 +286,7 @@ static void xemaclite_aligned_read(u32 *src_ptr, u8 *dest_ptr,
|
|||
|
||||
/* Read the remaining data */
|
||||
for (; length > 0; length--)
|
||||
*to_u8_ptr = *from_u8_ptr;
|
||||
*to_u8_ptr++ = *from_u8_ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue