Networking changes for 6.13.

The most significant set of changes is the per netns RTNL. The new
 behavior is disabled by default, regression risk should be contained.
 
 Notably the new config knob PTP_1588_CLOCK_VMCLOCK will inherit its
 default value from PTP_1588_CLOCK_KVM, as the first is intended to be
 a more reliable replacement for the latter.
 
 Core
 ----
 
  - Started a very large, in-progress, effort to make the RTNL lock
    scope per network-namespace, thus reducing the lock contention
    significantly in the containerized use-case, comprising:
    - RCU-ified some relevant slices of the FIB control path
    - introduce basic per netns locking helpers
    - namespacified the IPv4 address hash table
    - remove rtnl_register{,_module}() in favour of rtnl_register_many()
    - refactor rtnl_{new,del,set}link() moving as much validation as
      possible out of RTNL lock
    - convert all phonet doit() and dumpit() handlers to RCU
    - convert IPv4 addresses manipulation to per-netns RTNL
    - convert virtual interface creation to per-netns RTNL
    the per-netns lock infra is guarded by the CONFIG_DEBUG_NET_SMALL_RTNL
    knob, disabled by default ad interim.
 
  - Introduce NAPI suspension, to efficiently switching between busy
    polling (NAPI processing suspended) and normal processing.
 
  - Migrate the IPv4 routing input, output and control path from direct
    ToS usage to DSCP macros. This is a work in progress to make ECN
    handling consistent and reliable.
 
  - Add drop reasons support to the IPv4 rotue input path, allowing
    better introspection in case of packets drop.
 
  - Make FIB seqnum lockless, dropping RTNL protection for read
    access.
 
  - Make inet{,v6} addresses hashing less predicable.
 
  - Allow providing timestamp OPT_ID via cmsg, to correlate TX packets
    and timestamps
 
 Things we sprinkled into general kernel code
 --------------------------------------------
 
  - Add small file operations for debugfs, to reduce the struct ops size.
 
  - Refactoring and optimization for the implementation of page_frag API,
    This is a preparatory work to consolidate the page_frag
    implementation.
 
 Netfilter
 ---------
 
  - Optimize set element transactions to reduce memory consumption
 
  - Extended netlink error reporting for attribute parser failure.
 
  - Make legacy xtables configs user selectable, giving users
    the option to configure iptables without enabling any other config.
 
  - Address a lot of false-positive RCU issues, pointed by recent
    CI improvements.
 
 BPF
 ---
 
  - Put xsk sockets on a struct diet and add various cleanups. Overall,
    this helps to bump performance by 12% for some workloads.
 
  - Extend BPF selftests to increase coverage of XDP features in
    combination with BPF cpumap.
 
  - Optimize and homogenize bpf_csum_diff helper for all archs and also
    add a batch of new BPF selftests for it.
 
  - Extend netkit with an option to delegate skb->{mark,priority}
    scrubbing to its BPF program.
 
  - Make the bpf_get_netns_cookie() helper available also to tc(x) BPF
    programs.
 
 Protocols
 ---------
 
  - Introduces 4-tuple hash for connected udp sockets, speeding-up
    significantly connected sockets lookup.
 
  - Add a fastpath for some TCP timers that usually expires after close,
    the socket lock contention.
 
  - Add inbound and outbound xfrm state caches to speed up state lookups.
 
  - Avoid sending MPTCP advertisements on stale subflows, reducing
    risks on loosing them.
 
  - Make neighbours table flushing more scalable, maintaining per device
    neigh lists.
 
 Driver API
 ----------
 
  - Introduce a unified interface to configure transmission H/W shaping,
    and expose it to user-space via generic-netlink.
 
  - Add support for per-NAPI config via netlink. This makes napi
    configuration persistent across queues removal and re-creation.
    Requires driver updates, currently supported drivers are:
    nVidia/Mellanox mlx4 and mlx5, Broadcom brcm and Intel ice.
 
  - Add ethtool support for writing SFP / PHY firmware blocks.
 
  - Track RSS context allocation from ethtool core.
 
  - Implement support for mirroring to DSA CPU port, via TC mirror
    offload.
 
  - Consolidate FDB updates notification, to avoid duplicates on
    device-specific entries.
 
  - Expose DPLL clock quality level to the user-space.
 
  - Support master-slave PHY config via device tree.
 
 Tests and tooling
 -----------------
 
  - forwarding: introduce deferred commands, to simplify
    the cleanup phase
 
 Drivers
 -------
 
  - Updated several drivers - Amazon vNic, Google vNic, Microsoft vNic,
    Intel e1000e and Broadcom Tigon3 - to use netdev-genl to link the
    IRQs and queues to NAPI IDs, allowing busy polling and better
    introspection.
 
  - Ethernet high-speed NICs:
    - nVidia/Mellanox:
      - mlx5:
        - a large refactor to implement support for cross E-Switch
          scheduling
        - refactor H/W conter management to let it scale better
        - H/W GRO cleanups
    - Intel (100G, ice)::
      - adds support for ethtool reset
      - implement support for per TX queue H/W shaping
    - AMD/Solarflare:
      - implement per device queue stats support
    - Broadcom (bnxt):
      - improve wildcard l4proto on IPv4/IPv6 ntuple rules
    - Marvell Octeon:
      - Adds representor support for each Resource Virtualization Unit
        (RVU) device.
    - Hisilicon:
      - adds support for the BMC Gigabit Ethernet
    - IBM (EMAC):
      - driver cleanup and modernization
    - Cisco (VIC):
      - raise the queues number limit to 256
 
  - Ethernet virtual:
    - Google vNIC:
      - implements page pool support
    - macsec:
      - inherit lower device's features and TSO limits when offloading
    - virtio_net:
      - enable premapped mode by default
      - support for XDP socket(AF_XDP) zerocopy TX
    - wireguard:
      - set the TSO max size to be GSO_MAX_SIZE, to aggregate larger
        packets.
 
  - Ethernet NICs embedded and virtual:
    - Broadcom ASP:
      - enable software timestamping
    - Freescale:
      - add enetc4 PF driver
    - MediaTek: Airoha SoC:
      - implement BQL support
    - RealTek r8169:
      - enable TSO by default on r8168/r8125
      - implement extended ethtool stats
    - Renesas AVB:
      - enable TX checksum offload
    - Synopsys (stmmac):
      - support header splitting for vlan tagged packets
      - move common code for DWMAC4 and DWXGMAC into a separate FPE
        module.
      - Add the dwmac driver support for T-HEAD TH1520 SoC
    - Synopsys (xpcs):
      - driver refactor and cleanup
    - TI:
      - icssg_prueth: add VLAN offload support
    - Xilinx emaclite:
      - adds clock support
 
  - Ethernet switches:
    - Microchip:
      - implement support for the lan969x Ethernet switch family
      - add LAN9646 switch support to KSZ DSA driver
 
  - Ethernet PHYs:
    - Marvel: 88q2x: enable auto negotiation
    - Microchip: add support for LAN865X Rev B1 and LAN867X Rev C1/C2
 
  - PTP:
    - Add support for the Amazon virtual clock device
    - Add PtP driver for s390 clocks
 
  - WiFi:
    - mac80211
      - EHT 1024 aggregation size for transmissions
      - new operation to indicate that a new interface is to be added
      - support radio separation of multi-band devices
      - move wireless extension spy implementation to libiw
    - Broadcom:
      - brcmfmac: optional LPO clock support
    - Microchip:
      - add support for Atmel WILC3000
    - Qualcomm (ath12k):
      - firmware coredump collection support
      - add debugfs support for a multitude of statistics
    - Qualcomm (ath5k):
      -  Arcadyan ARV45XX AR2417 & Gigaset SX76[23] AR241[34]A support
    - Realtek:
      - rtw88: 8821au and 8812au USB adapters support
      - rtw89: add thermal protection
      - rtw89: fine tune BT-coexsitence to improve user experience
      - rtw89: firmware secure boot for WiFi 6 chip
 
  - Bluetooth
      - add Qualcomm WCN785x support for ids Foxconn 0xe0fc/0xe0f3 and
        0x13d3:0x3623
      - add Realtek RTL8852BE support for id Foxconn 0xe123
      - add MediaTek MT7920 support for wireless module ids
      - btintel_pcie: add handshake between driver and firmware
      - btintel_pcie: add recovery mechanism
      - btnxpuart: add GPIO support to power save feature
 
 Signed-off-by: Paolo Abeni <pabeni@redhat.com>
 -----BEGIN PGP SIGNATURE-----
 
 iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmc8sukSHHBhYmVuaUBy
 ZWRoYXQuY29tAAoJECkkeY3MjxOkLEYQAIMM6Qjh0bh3Byr3gOS1xZzXG+APLjP4
 9Jr0p3i+X53i90jvVqzeVO5FTc95MVHSKZ3kvPkDMXSLUaEJxocNHCI5Dzl/2/qL
 wWdpUB6/ou+jKB4Bn6Z8OvVODT7qrr0tVa9M2/fuKWrIsOU/ntIhG8EhnGddk5U/
 vKPSf5PUIb81uNRnF58VusY3wrT1dEoh9VfJYxL+ST+inPxjEAMy6Y+lmlsjGaSX
 jrS+Pp9KYiUwl3Qt0AQs+cG4OHkJdjbnChrfosWwpkiyddO8klVq06+wX/TiSzfF
 b9VZtBfy/GZs3lkE1mQkcILdtX5pP3YHQdpsuxFfVI0JHVszx2ck7WdoRux/8F0v
 kKZsYcO7bH9I1wMFP66Ff9hIbdEQaeucK+KdDkXyPNMfP91Vzmfjii8IBxOC36Ie
 BbOeFUrXyTxxJ2u0vf/X9JtIq8bcrkNrSd1n1jlGPMqG3FVzsY95+Oi4qfsyeUbl
 lS1PlVTqPMPFdX54HnxM3y2rJjhd7iXhkvmtuXNjRFThXlOiK3maAPWlM1aZ3b8u
 Vjs4JFUsW0tleZG+RzANjsGjXbf7AiPUGLZt+acem0K+fcjG4i5aGIAJrxwa/ORx
 eG74IZRt5cOI371W7gNLGHjwnuge8tFPgOWcRP2eozNm7jvMYALBejYS7eWUTvaf
 THcvVM+bupEZ
 =GzPr
 -----END PGP SIGNATURE-----

Merge tag 'net-next-6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next

Pull networking updates from Paolo Abeni:
 "The most significant set of changes is the per netns RTNL. The new
  behavior is disabled by default, regression risk should be contained.

  Notably the new config knob PTP_1588_CLOCK_VMCLOCK will inherit its
  default value from PTP_1588_CLOCK_KVM, as the first is intended to be
  a more reliable replacement for the latter.

  Core:

   - Started a very large, in-progress, effort to make the RTNL lock
     scope per network-namespace, thus reducing the lock contention
     significantly in the containerized use-case, comprising:
       - RCU-ified some relevant slices of the FIB control path
       - introduce basic per netns locking helpers
       - namespacified the IPv4 address hash table
       - remove rtnl_register{,_module}() in favour of
         rtnl_register_many()
       - refactor rtnl_{new,del,set}link() moving as much validation as
         possible out of RTNL lock
       - convert all phonet doit() and dumpit() handlers to RCU
       - convert IPv4 addresses manipulation to per-netns RTNL
       - convert virtual interface creation to per-netns RTNL
     the per-netns lock infrastructure is guarded by the
     CONFIG_DEBUG_NET_SMALL_RTNL knob, disabled by default ad interim.

   - Introduce NAPI suspension, to efficiently switching between busy
     polling (NAPI processing suspended) and normal processing.

   - Migrate the IPv4 routing input, output and control path from direct
     ToS usage to DSCP macros. This is a work in progress to make ECN
     handling consistent and reliable.

   - Add drop reasons support to the IPv4 rotue input path, allowing
     better introspection in case of packets drop.

   - Make FIB seqnum lockless, dropping RTNL protection for read access.

   - Make inet{,v6} addresses hashing less predicable.

   - Allow providing timestamp OPT_ID via cmsg, to correlate TX packets
     and timestamps

  Things we sprinkled into general kernel code:

   - Add small file operations for debugfs, to reduce the struct ops
     size.

   - Refactoring and optimization for the implementation of page_frag
     API, This is a preparatory work to consolidate the page_frag
     implementation.

  Netfilter:

   - Optimize set element transactions to reduce memory consumption

   - Extended netlink error reporting for attribute parser failure.

   - Make legacy xtables configs user selectable, giving users the
     option to configure iptables without enabling any other config.

   - Address a lot of false-positive RCU issues, pointed by recent CI
     improvements.

  BPF:

   - Put xsk sockets on a struct diet and add various cleanups. Overall,
     this helps to bump performance by 12% for some workloads.

   - Extend BPF selftests to increase coverage of XDP features in
     combination with BPF cpumap.

   - Optimize and homogenize bpf_csum_diff helper for all archs and also
     add a batch of new BPF selftests for it.

   - Extend netkit with an option to delegate skb->{mark,priority}
     scrubbing to its BPF program.

   - Make the bpf_get_netns_cookie() helper available also to tc(x) BPF
     programs.

  Protocols:

   - Introduces 4-tuple hash for connected udp sockets, speeding-up
     significantly connected sockets lookup.

   - Add a fastpath for some TCP timers that usually expires after
     close, the socket lock contention.

   - Add inbound and outbound xfrm state caches to speed up state
     lookups.

   - Avoid sending MPTCP advertisements on stale subflows, reducing
     risks on loosing them.

   - Make neighbours table flushing more scalable, maintaining per
     device neigh lists.

  Driver API:

   - Introduce a unified interface to configure transmission H/W
     shaping, and expose it to user-space via generic-netlink.

   - Add support for per-NAPI config via netlink. This makes napi
     configuration persistent across queues removal and re-creation.
     Requires driver updates, currently supported drivers are:
     nVidia/Mellanox mlx4 and mlx5, Broadcom brcm and Intel ice.

   - Add ethtool support for writing SFP / PHY firmware blocks.

   - Track RSS context allocation from ethtool core.

   - Implement support for mirroring to DSA CPU port, via TC mirror
     offload.

   - Consolidate FDB updates notification, to avoid duplicates on
     device-specific entries.

   - Expose DPLL clock quality level to the user-space.

   - Support master-slave PHY config via device tree.

  Tests and tooling:

   - forwarding: introduce deferred commands, to simplify the cleanup
     phase

  Drivers:

   - Updated several drivers - Amazon vNic, Google vNic, Microsoft vNic,
     Intel e1000e and Broadcom Tigon3 - to use netdev-genl to link the
     IRQs and queues to NAPI IDs, allowing busy polling and better
     introspection.

   - Ethernet high-speed NICs:
      - nVidia/Mellanox:
         - mlx5:
           - a large refactor to implement support for cross E-Switch
             scheduling
           - refactor H/W conter management to let it scale better
           - H/W GRO cleanups
      - Intel (100G, ice)::
         - add support for ethtool reset
         - implement support for per TX queue H/W shaping
      - AMD/Solarflare:
         - implement per device queue stats support
      - Broadcom (bnxt):
         - improve wildcard l4proto on IPv4/IPv6 ntuple rules
      - Marvell Octeon:
         - Add representor support for each Resource Virtualization Unit
           (RVU) device.
      - Hisilicon:
         - add support for the BMC Gigabit Ethernet
      - IBM (EMAC):
         - driver cleanup and modernization
      - Cisco (VIC):
         - raise the queues number limit to 256

   - Ethernet virtual:
      - Google vNIC:
         - implement page pool support
      - macsec:
         - inherit lower device's features and TSO limits when
           offloading
      - virtio_net:
         - enable premapped mode by default
         - support for XDP socket(AF_XDP) zerocopy TX
      - wireguard:
         - set the TSO max size to be GSO_MAX_SIZE, to aggregate larger
           packets.

   - Ethernet NICs embedded and virtual:
      - Broadcom ASP:
         - enable software timestamping
      - Freescale:
         - add enetc4 PF driver
      - MediaTek: Airoha SoC:
         - implement BQL support
      - RealTek r8169:
         - enable TSO by default on r8168/r8125
         - implement extended ethtool stats
      - Renesas AVB:
         - enable TX checksum offload
      - Synopsys (stmmac):
         - support header splitting for vlan tagged packets
         - move common code for DWMAC4 and DWXGMAC into a separate FPE
           module.
         - add dwmac driver support for T-HEAD TH1520 SoC
      - Synopsys (xpcs):
         - driver refactor and cleanup
      - TI:
         - icssg_prueth: add VLAN offload support
      - Xilinx emaclite:
         - add clock support

   - Ethernet switches:
      - Microchip:
         - implement support for the lan969x Ethernet switch family
         - add LAN9646 switch support to KSZ DSA driver

   - Ethernet PHYs:
      - Marvel: 88q2x: enable auto negotiation
      - Microchip: add support for LAN865X Rev B1 and LAN867X Rev C1/C2

   - PTP:
      - Add support for the Amazon virtual clock device
      - Add PtP driver for s390 clocks

   - WiFi:
      - mac80211
         - EHT 1024 aggregation size for transmissions
         - new operation to indicate that a new interface is to be added
         - support radio separation of multi-band devices
         - move wireless extension spy implementation to libiw
      - Broadcom:
         - brcmfmac: optional LPO clock support
      - Microchip:
         - add support for Atmel WILC3000
      - Qualcomm (ath12k):
         - firmware coredump collection support
         - add debugfs support for a multitude of statistics
      - Qualcomm (ath5k):
         -  Arcadyan ARV45XX AR2417 & Gigaset SX76[23] AR241[34]A support
      - Realtek:
         - rtw88: 8821au and 8812au USB adapters support
         - rtw89: add thermal protection
         - rtw89: fine tune BT-coexsitence to improve user experience
         - rtw89: firmware secure boot for WiFi 6 chip

   - Bluetooth
      - add Qualcomm WCN785x support for ids Foxconn 0xe0fc/0xe0f3 and
        0x13d3:0x3623
      - add Realtek RTL8852BE support for id Foxconn 0xe123
      - add MediaTek MT7920 support for wireless module ids
      - btintel_pcie: add handshake between driver and firmware
      - btintel_pcie: add recovery mechanism
      - btnxpuart: add GPIO support to power save feature"

* tag 'net-next-6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next: (1475 commits)
  mm: page_frag: fix a compile error when kernel is not compiled
  Documentation: tipc: fix formatting issue in tipc.rst
  selftests: nic_performance: Add selftest for performance of NIC driver
  selftests: nic_link_layer: Add selftest case for speed and duplex states
  selftests: nic_link_layer: Add link layer selftest for NIC driver
  bnxt_en: Add FW trace coredump segments to the coredump
  bnxt_en: Add a new ethtool -W dump flag
  bnxt_en: Add 2 parameters to bnxt_fill_coredump_seg_hdr()
  bnxt_en: Add functions to copy host context memory
  bnxt_en: Do not free FW log context memory
  bnxt_en: Manage the FW trace context memory
  bnxt_en: Allocate backing store memory for FW trace logs
  bnxt_en: Add a 'force' parameter to bnxt_free_ctx_mem()
  bnxt_en: Refactor bnxt_free_ctx_mem()
  bnxt_en: Add mem_valid bit to struct bnxt_ctx_mem_type
  bnxt_en: Update firmware interface spec to 1.10.3.85
  selftests/bpf: Add some tests with sockmap SK_PASS
  bpf: fix recursive lock when verdict program return SK_PASS
  wireguard: device: support big tcp GSO
  wireguard: selftests: load nf_conntrack if not present
  ...
This commit is contained in:
Linus Torvalds 2024-11-21 08:28:08 -08:00
commit fcc79e1714
1754 changed files with 77543 additions and 52328 deletions

View File

@ -1553,6 +1553,7 @@
failslab= failslab=
fail_usercopy= fail_usercopy=
fail_page_alloc= fail_page_alloc=
fail_skb_realloc=
fail_make_request=[KNL] fail_make_request=[KNL]
General fault injection mechanism. General fault injection mechanism.
Format: <interval>,<probability>,<space>,<times> Format: <interval>,<probability>,<space>,<times>

View File

@ -151,6 +151,77 @@ the more significant 4-byte word.
We always think of our offsets as if there were no quirk, and we translate We always think of our offsets as if there were no quirk, and we translate
them afterwards, before accessing the memory region. them afterwards, before accessing the memory region.
Note on buffer lengths not multiple of 4
----------------------------------------
To deal with memory layout quirks where groups of 4 bytes are laid out "little
endian" relative to each other, but "big endian" within the group itself, the
concept of groups of 4 bytes is intrinsic to the packing API (not to be
confused with the memory access, which is performed byte by byte, though).
With buffer lengths not multiple of 4, this means one group will be incomplete.
Depending on the quirks, this may lead to discontinuities in the bit fields
accessible through the buffer. The packing API assumes discontinuities were not
the intention of the memory layout, so it avoids them by effectively logically
shortening the most significant group of 4 octets to the number of octets
actually available.
Example with a 31 byte sized buffer given below. Physical buffer offsets are
implicit, and increase from left to right within a group, and from top to
bottom within a column.
No quirks:
::
31 29 28 | Group 7 (most significant)
27 26 25 24 | Group 6
23 22 21 20 | Group 5
19 18 17 16 | Group 4
15 14 13 12 | Group 3
11 10 9 8 | Group 2
7 6 5 4 | Group 1
3 2 1 0 | Group 0 (least significant)
QUIRK_LSW32_IS_FIRST:
::
3 2 1 0 | Group 0 (least significant)
7 6 5 4 | Group 1
11 10 9 8 | Group 2
15 14 13 12 | Group 3
19 18 17 16 | Group 4
23 22 21 20 | Group 5
27 26 25 24 | Group 6
30 29 28 | Group 7 (most significant)
QUIRK_LITTLE_ENDIAN:
::
30 28 29 | Group 7 (most significant)
24 25 26 27 | Group 6
20 21 22 23 | Group 5
16 17 18 19 | Group 4
12 13 14 15 | Group 3
8 9 10 11 | Group 2
4 5 6 7 | Group 1
0 1 2 3 | Group 0 (least significant)
QUIRK_LITTLE_ENDIAN | QUIRK_LSW32_IS_FIRST:
::
0 1 2 3 | Group 0 (least significant)
4 5 6 7 | Group 1
8 9 10 11 | Group 2
12 13 14 15 | Group 3
16 17 18 19 | Group 4
20 21 22 23 | Group 5
24 25 26 27 | Group 6
28 29 30 | Group 7 (most significant)
Intended use Intended use
------------ ------------

View File

@ -34,6 +34,12 @@ properties:
firmware-name: firmware-name:
maxItems: 1 maxItems: 1
device-wakeup-gpios:
maxItems: 1
description:
Host-To-Chip power save mechanism is driven by this GPIO
connected to BT_WAKE_IN pin of the NXP chipset.
required: required:
- compatible - compatible
@ -41,10 +47,12 @@ additionalProperties: false
examples: examples:
- | - |
#include <dt-bindings/gpio/gpio.h>
serial { serial {
bluetooth { bluetooth {
compatible = "nxp,88w8987-bt"; compatible = "nxp,88w8987-bt";
fw-init-baudrate = <3000000>; fw-init-baudrate = <3000000>;
firmware-name = "uartuart8987_bt_v0.bin"; firmware-name = "uartuart8987_bt_v0.bin";
device-wakeup-gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
}; };
}; };

View File

@ -34,6 +34,7 @@ properties:
- microchip,ksz9563 - microchip,ksz9563
- microchip,ksz8563 - microchip,ksz8563
- microchip,ksz8567 - microchip,ksz8567
- microchip,lan9646
reset-gpios: reset-gpios:
description: description:
@ -81,6 +82,26 @@ properties:
interrupts: interrupts:
maxItems: 1 maxItems: 1
mdio:
$ref: /schemas/net/mdio.yaml#
unevaluatedProperties: false
properties:
mdio-parent-bus:
$ref: /schemas/types.yaml#/definitions/phandle
description:
Phandle pointing to the MDIO bus controller connected to the
secondary MDIO interface. This property should be used when
the internal MDIO bus is accessed via a secondary MDIO
interface rather than the primary management interface.
patternProperties:
"^ethernet-phy@[0-9a-f]$":
type: object
$ref: /schemas/net/ethernet-phy.yaml#
unevaluatedProperties: false
description:
Integrated PHY node
required: required:
- compatible - compatible
- reg - reg
@ -138,7 +159,6 @@ examples:
pinctrl-0 = <&pinctrl_spi_ksz>; pinctrl-0 = <&pinctrl_spi_ksz>;
cs-gpios = <&pioC 25 0>; cs-gpios = <&pioC 25 0>;
id = <1>;
ksz9477: switch@0 { ksz9477: switch@0 {
compatible = "microchip,ksz9477"; compatible = "microchip,ksz9477";

View File

@ -147,7 +147,7 @@ examples:
#include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/interrupt-controller/irq.h>
platform { platform {
switch { ethernet-switch {
compatible = "realtek,rtl8366rb"; compatible = "realtek,rtl8366rb";
/* 22 = MDIO (has input reads), 21 = MDC (clock, output only) */ /* 22 = MDIO (has input reads), 21 = MDC (clock, output only) */
mdc-gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; mdc-gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>;
@ -163,35 +163,35 @@ examples:
#interrupt-cells = <1>; #interrupt-cells = <1>;
}; };
ports { ethernet-ports {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
port@0 { ethernet-port@0 {
reg = <0>; reg = <0>;
label = "lan0"; label = "lan0";
phy-handle = <&phy0>; phy-handle = <&phy0>;
}; };
port@1 { ethernet-port@1 {
reg = <1>; reg = <1>;
label = "lan1"; label = "lan1";
phy-handle = <&phy1>; phy-handle = <&phy1>;
}; };
port@2 { ethernet-port@2 {
reg = <2>; reg = <2>;
label = "lan2"; label = "lan2";
phy-handle = <&phy2>; phy-handle = <&phy2>;
}; };
port@3 { ethernet-port@3 {
reg = <3>; reg = <3>;
label = "lan3"; label = "lan3";
phy-handle = <&phy3>; phy-handle = <&phy3>;
}; };
port@4 { ethernet-port@4 {
reg = <4>; reg = <4>;
label = "wan"; label = "wan";
phy-handle = <&phy4>; phy-handle = <&phy4>;
}; };
port@5 { ethernet-port@5 {
reg = <5>; reg = <5>;
ethernet = <&gmac0>; ethernet = <&gmac0>;
phy-mode = "rgmii"; phy-mode = "rgmii";
@ -241,7 +241,7 @@ examples:
#include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/interrupt-controller/irq.h>
platform { platform {
switch { ethernet-switch {
compatible = "realtek,rtl8365mb"; compatible = "realtek,rtl8365mb";
mdc-gpios = <&gpio1 16 GPIO_ACTIVE_HIGH>; mdc-gpios = <&gpio1 16 GPIO_ACTIVE_HIGH>;
mdio-gpios = <&gpio1 17 GPIO_ACTIVE_HIGH>; mdio-gpios = <&gpio1 17 GPIO_ACTIVE_HIGH>;
@ -255,30 +255,30 @@ examples:
#interrupt-cells = <1>; #interrupt-cells = <1>;
}; };
ports { ethernet-ports {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
port@0 { ethernet-port@0 {
reg = <0>; reg = <0>;
label = "swp0"; label = "swp0";
phy-handle = <&ethphy0>; phy-handle = <&ethphy0>;
}; };
port@1 { ethernet-port@1 {
reg = <1>; reg = <1>;
label = "swp1"; label = "swp1";
phy-handle = <&ethphy1>; phy-handle = <&ethphy1>;
}; };
port@2 { ethernet-port@2 {
reg = <2>; reg = <2>;
label = "swp2"; label = "swp2";
phy-handle = <&ethphy2>; phy-handle = <&ethphy2>;
}; };
port@3 { ethernet-port@3 {
reg = <3>; reg = <3>;
label = "swp3"; label = "swp3";
phy-handle = <&ethphy3>; phy-handle = <&ethphy3>;
}; };
port@6 { ethernet-port@6 {
reg = <6>; reg = <6>;
ethernet = <&fec1>; ethernet = <&fec1>;
phy-mode = "rgmii"; phy-mode = "rgmii";
@ -330,7 +330,7 @@ examples:
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
switch@29 { ethernet-switch@29 {
compatible = "realtek,rtl8365mb"; compatible = "realtek,rtl8365mb";
reg = <29>; reg = <29>;
@ -344,36 +344,36 @@ examples:
#interrupt-cells = <1>; #interrupt-cells = <1>;
}; };
ports { ethernet-ports {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
port@0 { ethernet-port@0 {
reg = <0>; reg = <0>;
label = "lan4"; label = "lan4";
}; };
port@1 { ethernet-port@1 {
reg = <1>; reg = <1>;
label = "lan3"; label = "lan3";
}; };
port@2 { ethernet-port@2 {
reg = <2>; reg = <2>;
label = "lan2"; label = "lan2";
}; };
port@3 { ethernet-port@3 {
reg = <3>; reg = <3>;
label = "lan1"; label = "lan1";
}; };
port@4 { ethernet-port@4 {
reg = <4>; reg = <4>;
label = "wan"; label = "wan";
}; };
port@7 { ethernet-port@7 {
reg = <7>; reg = <7>;
ethernet = <&ethernet>; ethernet = <&ethernet>;
phy-mode = "rgmii"; phy-mode = "rgmii";

View File

@ -158,6 +158,27 @@ properties:
Mark the corresponding energy efficient ethernet mode as Mark the corresponding energy efficient ethernet mode as
broken and request the ethernet to stop advertising it. broken and request the ethernet to stop advertising it.
timing-role:
$ref: /schemas/types.yaml#/definitions/string
enum:
- forced-master
- forced-slave
- preferred-master
- preferred-slave
description: |
Specifies the timing role of the PHY in the network link. This property is
required for setups where the role must be explicitly assigned via the
device tree due to limitations in hardware strapping or incorrect strap
configurations.
It is applicable to Single Pair Ethernet (1000/100/10Base-T1) and other
PHY types, including 1000Base-T, where it controls whether the PHY should
be a master (clock source) or a slave (clock receiver).
- 'forced-master': The PHY is forced to operate as a master.
- 'forced-slave': The PHY is forced to operate as a slave.
- 'preferred-master': Prefer the PHY to be master but allow negotiation.
- 'preferred-slave': Prefer the PHY to be slave but allow negotiation.
pses: pses:
$ref: /schemas/types.yaml#/definitions/phandle-array $ref: /schemas/types.yaml#/definitions/phandle-array
maxItems: 1 maxItems: 1

View File

@ -20,10 +20,13 @@ maintainers:
properties: properties:
compatible: compatible:
items: oneOf:
- items:
- enum: - enum:
- pci1957,ee01 - pci1957,ee01
- const: fsl,enetc-mdio - const: fsl,enetc-mdio
- items:
- const: pci1131,ee00
reg: reg:
maxItems: 1 maxItems: 1

View File

@ -20,14 +20,25 @@ maintainers:
properties: properties:
compatible: compatible:
items: oneOf:
- items:
- enum: - enum:
- pci1957,e100 - pci1957,e100
- const: fsl,enetc - const: fsl,enetc
- enum:
- pci1131,e101
reg: reg:
maxItems: 1 maxItems: 1
clocks:
items:
- description: MAC transmit/receive reference clock
clock-names:
items:
- const: ref
mdio: mdio:
$ref: mdio.yaml $ref: mdio.yaml
unevaluatedProperties: false unevaluatedProperties: false
@ -40,6 +51,17 @@ required:
allOf: allOf:
- $ref: /schemas/pci/pci-device.yaml - $ref: /schemas/pci/pci-device.yaml
- $ref: ethernet-controller.yaml - $ref: ethernet-controller.yaml
- if:
not:
properties:
compatible:
contains:
enum:
- pci1131,e101
then:
properties:
clocks: false
clock-names: false
unevaluatedProperties: false unevaluatedProperties: false

View File

@ -183,6 +183,13 @@ properties:
description: description:
Register bits of stop mode control, the format is <&gpr req_gpr req_bit>. Register bits of stop mode control, the format is <&gpr req_gpr req_bit>.
fsl,pps-channel:
$ref: /schemas/types.yaml#/definitions/uint32
default: 0
description:
Specifies to which timer instance the PPS signal is routed.
enum: [0, 1, 2, 3]
mdio: mdio:
$ref: mdio.yaml# $ref: mdio.yaml#
unevaluatedProperties: false unevaluatedProperties: false

View File

@ -48,6 +48,12 @@ properties:
firmware-name: firmware-name:
description: specify the name of PHY firmware to load description: specify the name of PHY firmware to load
marvell,mdi-cfg-order:
$ref: /schemas/types.yaml#/definitions/uint32
enum: [0, 1]
description:
force normal (0) or reverse (1) order of MDI pairs, overriding MDI_CFG bootstrap pin.
nvmem-cells: nvmem-cells:
description: phandle to the firmware nvmem cell description: phandle to the firmware nvmem cell
maxItems: 1 maxItems: 1

View File

@ -53,37 +53,21 @@ examples:
ethernet-phy@1 { ethernet-phy@1 {
reg = <1>; reg = <1>;
marvell,reg-init = <3 0x10 0 0x5777>,
<3 0x11 0 0x00aa>,
<3 0x12 0 0x4105>,
<3 0x13 0 0x0a60>;
interrupt-parent = <&gpio>; interrupt-parent = <&gpio>;
interrupts = <10 8>; /* Pin 10, active low */ interrupts = <10 8>; /* Pin 10, active low */
}; };
ethernet-phy@2 { ethernet-phy@2 {
reg = <2>; reg = <2>;
marvell,reg-init = <3 0x10 0 0x5777>,
<3 0x11 0 0x00aa>,
<3 0x12 0 0x4105>,
<3 0x13 0 0x0a60>;
interrupt-parent = <&gpio>; interrupt-parent = <&gpio>;
interrupts = <10 8>; /* Pin 10, active low */ interrupts = <10 8>; /* Pin 10, active low */
}; };
ethernet-phy@3 { ethernet-phy@3 {
reg = <3>; reg = <3>;
marvell,reg-init = <3 0x10 0 0x5777>,
<3 0x11 0 0x00aa>,
<3 0x12 0 0x4105>,
<3 0x13 0 0x0a60>;
interrupt-parent = <&gpio>; interrupt-parent = <&gpio>;
interrupts = <10 8>; /* Pin 10, active low */ interrupts = <10 8>; /* Pin 10, active low */
}; };
ethernet-phy@4 { ethernet-phy@4 {
reg = <4>; reg = <4>;
marvell,reg-init = <3 0x10 0 0x5777>,
<3 0x11 0 0x00aa>,
<3 0x12 0 0x4105>,
<3 0x13 0 0x0a60>;
interrupt-parent = <&gpio>; interrupt-parent = <&gpio>;
interrupts = <10 8>; /* Pin 10, active low */ interrupts = <10 8>; /* Pin 10, active low */
}; };
@ -96,37 +80,21 @@ examples:
ethernet-phy@1 { ethernet-phy@1 {
reg = <1>; reg = <1>;
marvell,reg-init = <3 0x10 0 0x5777>,
<3 0x11 0 0x00aa>,
<3 0x12 0 0x4105>,
<3 0x13 0 0x0a60>;
interrupt-parent = <&gpio>; interrupt-parent = <&gpio>;
interrupts = <12 8>; /* Pin 12, active low */ interrupts = <12 8>; /* Pin 12, active low */
}; };
ethernet-phy@2 { ethernet-phy@2 {
reg = <2>; reg = <2>;
marvell,reg-init = <3 0x10 0 0x5777>,
<3 0x11 0 0x00aa>,
<3 0x12 0 0x4105>,
<3 0x13 0 0x0a60>;
interrupt-parent = <&gpio>; interrupt-parent = <&gpio>;
interrupts = <12 8>; /* Pin 12, active low */ interrupts = <12 8>; /* Pin 12, active low */
}; };
ethernet-phy@3 { ethernet-phy@3 {
reg = <3>; reg = <3>;
marvell,reg-init = <3 0x10 0 0x5777>,
<3 0x11 0 0x00aa>,
<3 0x12 0 0x4105>,
<3 0x13 0 0x0a60>;
interrupt-parent = <&gpio>; interrupt-parent = <&gpio>;
interrupts = <12 8>; /* Pin 12, active low */ interrupts = <12 8>; /* Pin 12, active low */
}; };
ethernet-phy@4 { ethernet-phy@4 {
reg = <4>; reg = <4>;
marvell,reg-init = <3 0x10 0 0x5777>,
<3 0x11 0 0x00aa>,
<3 0x12 0 0x4105>,
<3 0x13 0 0x0a60>;
interrupt-parent = <&gpio>; interrupt-parent = <&gpio>;
interrupts = <12 8>; /* Pin 12, active low */ interrupts = <12 8>; /* Pin 12, active low */
}; };

View File

@ -9,6 +9,7 @@ title: Microchip Sparx5 Ethernet switch controller
maintainers: maintainers:
- Steen Hegelund <steen.hegelund@microchip.com> - Steen Hegelund <steen.hegelund@microchip.com>
- Lars Povlsen <lars.povlsen@microchip.com> - Lars Povlsen <lars.povlsen@microchip.com>
- Daniel Machon <daniel.machon@microchip.com>
description: | description: |
The SparX-5 Enterprise Ethernet switch family provides a rich set of The SparX-5 Enterprise Ethernet switch family provides a rich set of
@ -34,7 +35,24 @@ properties:
pattern: "^switch@[0-9a-f]+$" pattern: "^switch@[0-9a-f]+$"
compatible: compatible:
const: microchip,sparx5-switch oneOf:
- enum:
- microchip,lan9691-switch
- microchip,sparx5-switch
- items:
- enum:
- microchip,lan969c-switch
- microchip,lan969b-switch
- microchip,lan969a-switch
- microchip,lan9699-switch
- microchip,lan9698-switch
- microchip,lan9697-switch
- microchip,lan9696-switch
- microchip,lan9695-switch
- microchip,lan9694-switch
- microchip,lan9693-switch
- microchip,lan9692-switch
- const: microchip,lan9691-switch
reg: reg:
items: items:

View File

@ -17,6 +17,7 @@ properties:
- enum: - enum:
- nxp,nq310 - nxp,nq310
- nxp,pn547 - nxp,pn547
- nxp,pn553
- const: nxp,nxp-nci-i2c - const: nxp,nxp-nci-i2c
enable-gpios: enable-gpios:

View File

@ -0,0 +1,104 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/net/nxp,netc-blk-ctrl.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: NETC Blocks Control
description:
Usually, NETC has 2 blocks of 64KB registers, integrated endpoint register
block (IERB) and privileged register block (PRB). IERB is used for pre-boot
initialization for all NETC devices, such as ENETC, Timer, EMIDO and so on.
And PRB controls global reset and global error handling for NETC. Moreover,
for the i.MX platform, there is also a NETCMIX block for link configuration,
such as MII protocol, PCS protocol, etc.
maintainers:
- Wei Fang <wei.fang@nxp.com>
- Clark Wang <xiaoning.wang@nxp.com>
properties:
compatible:
enum:
- nxp,imx95-netc-blk-ctrl
reg:
maxItems: 3
reg-names:
items:
- const: ierb
- const: prb
- const: netcmix
"#address-cells":
const: 2
"#size-cells":
const: 2
ranges: true
clocks:
maxItems: 1
clock-names:
items:
- const: ipg
power-domains:
maxItems: 1
patternProperties:
"^pcie@[0-9a-f]+$":
$ref: /schemas/pci/host-generic-pci.yaml#
required:
- compatible
- reg
- reg-names
- "#address-cells"
- "#size-cells"
- ranges
additionalProperties: false
examples:
- |
bus {
#address-cells = <2>;
#size-cells = <2>;
system-controller@4cde0000 {
compatible = "nxp,imx95-netc-blk-ctrl";
reg = <0x0 0x4cde0000 0x0 0x10000>,
<0x0 0x4cdf0000 0x0 0x10000>,
<0x0 0x4c81000c 0x0 0x18>;
reg-names = "ierb", "prb", "netcmix";
#address-cells = <2>;
#size-cells = <2>;
ranges;
clocks = <&scmi_clk 98>;
clock-names = "ipg";
power-domains = <&scmi_devpd 18>;
pcie@4cb00000 {
compatible = "pci-host-ecam-generic";
reg = <0x0 0x4cb00000 0x0 0x100000>;
#address-cells = <3>;
#size-cells = <2>;
device_type = "pci";
bus-range = <0x1 0x1>;
ranges = <0x82000000 0x0 0x4cce0000 0x0 0x4cce0000 0x0 0x20000
0xc2000000 0x0 0x4cd10000 0x0 0x4cd10000 0x0 0x10000>;
mdio@0,0 {
compatible = "pci1131,ee00";
reg = <0x010000 0 0 0 0>;
#address-cells = <1>;
#size-cells = <0>;
};
};
};
};

View File

@ -62,6 +62,22 @@ allOf:
reference clock output when RMII mode enabled. reference clock output when RMII mode enabled.
Only supported on TJA1100 and TJA1101. Only supported on TJA1100 and TJA1101.
- if:
properties:
compatible:
contains:
enum:
- ethernet-phy-id001b.b010
- ethernet-phy-id001b.b013
- ethernet-phy-id001b.b030
- ethernet-phy-id001b.b031
then:
properties:
nxp,rmii-refclk-out:
type: boolean
description: Enable 50MHz RMII reference clock output on REF_CLK pin.
patternProperties: patternProperties:
"^ethernet-phy@[0-9a-f]+$": "^ethernet-phy@[0-9a-f]+$":
type: object type: object

View File

@ -18,7 +18,16 @@ allOf:
properties: properties:
compatible: compatible:
enum: oneOf:
- items:
- enum:
- qcom,qcs8300-ethqos
- const: qcom,sa8775p-ethqos
- items:
- enum:
- qcom,qcs615-ethqos
- const: qcom,sm8150-ethqos
- enum:
- qcom,qcs404-ethqos - qcom,qcs404-ethqos
- qcom,sa8775p-ethqos - qcom,sa8775p-ethqos
- qcom,sc8280xp-ethqos - qcom,sc8280xp-ethqos

View File

@ -59,6 +59,9 @@ properties:
clocks: clocks:
maxItems: 1 maxItems: 1
iommus:
maxItems: 1
power-domains: power-domains:
maxItems: 1 maxItems: 1
@ -123,7 +126,6 @@ examples:
reg = <1>; reg = <1>;
interrupt-parent = <&irqc0>; interrupt-parent = <&irqc0>;
interrupts = <0 IRQ_TYPE_LEVEL_LOW>; interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
micrel,led-mode = <1>;
reset-gpios = <&gpio5 31 GPIO_ACTIVE_LOW>; reset-gpios = <&gpio5 31 GPIO_ACTIVE_LOW>;
}; };
}; };

View File

@ -132,7 +132,7 @@ examples:
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&cpm_phy0_pins &cps_phy0_pins>; pinctrl-0 = <&cpm_phy0_pins &cps_phy0_pins>;
reg = <0>; reg = <0>;
interrupt = <&cpm_gpio2 18 IRQ_TYPE_EDGE_FALLING>; interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
sfp = <&sfp2>; sfp = <&sfp2>;
}; };
}; };

View File

@ -26,6 +26,7 @@ select:
- snps,dwmac-3.610 - snps,dwmac-3.610
- snps,dwmac-3.70a - snps,dwmac-3.70a
- snps,dwmac-3.710 - snps,dwmac-3.710
- snps,dwmac-3.72a
- snps,dwmac-4.00 - snps,dwmac-4.00
- snps,dwmac-4.10a - snps,dwmac-4.10a
- snps,dwmac-4.20a - snps,dwmac-4.20a
@ -90,6 +91,7 @@ properties:
- snps,dwmac-3.610 - snps,dwmac-3.610
- snps,dwmac-3.70a - snps,dwmac-3.70a
- snps,dwmac-3.710 - snps,dwmac-3.710
- snps,dwmac-3.72a
- snps,dwmac-4.00 - snps,dwmac-4.00
- snps,dwmac-4.10a - snps,dwmac-4.10a
- snps,dwmac-4.20a - snps,dwmac-4.20a
@ -99,6 +101,7 @@ properties:
- snps,dwxgmac-2.10 - snps,dwxgmac-2.10
- starfive,jh7100-dwmac - starfive,jh7100-dwmac
- starfive,jh7110-dwmac - starfive,jh7110-dwmac
- thead,th1520-gmac
reg: reg:
minItems: 1 minItems: 1
@ -560,7 +563,7 @@ properties:
max read outstanding req. limit max read outstanding req. limit
snps,kbbe: snps,kbbe:
$ref: /schemas/types.yaml#/definitions/uint32 $ref: /schemas/types.yaml#/definitions/flag
description: description:
do not cross 1KiB boundary. do not cross 1KiB boundary.

View File

@ -0,0 +1,110 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/net/thead,th1520-gmac.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: T-HEAD TH1520 GMAC Ethernet controller
maintainers:
- Drew Fustini <dfustini@tenstorrent.com>
description: |
The TH1520 GMAC is described in the TH1520 Peripheral Interface User Manual
https://git.beagleboard.org/beaglev-ahead/beaglev-ahead/-/tree/main/docs
Features include
- Compliant with IEEE802.3 Specification
- IEEE 1588-2008 standard for precision networked clock synchronization
- Supports 10/100/1000Mbps data transfer rate
- Supports RGMII/MII interface
- Preamble and start of frame data (SFD) insertion in Transmit path
- Preamble and SFD deletion in the Receive path
- Automatic CRC and pad generation options for receive frames
- MDIO master interface for PHY device configuration and management
The GMAC Registers consists of two parts
- APB registers are used to configure clock frequency/clock enable/clock
direction/PHY interface type.
- AHB registers are use to configure GMAC core (DesignWare Core part).
GMAC core register consists of DMA registers and GMAC registers.
select:
properties:
compatible:
contains:
enum:
- thead,th1520-gmac
required:
- compatible
allOf:
- $ref: snps,dwmac.yaml#
properties:
compatible:
items:
- enum:
- thead,th1520-gmac
- const: snps,dwmac-3.70a
reg:
items:
- description: DesignWare GMAC IP core registers
- description: GMAC APB registers
reg-names:
items:
- const: dwmac
- const: apb
clocks:
items:
- description: GMAC main clock
- description: Peripheral registers interface clock
clock-names:
items:
- const: stmmaceth
- const: pclk
interrupts:
items:
- description: Combined signal for various interrupt events
interrupt-names:
items:
- const: macirq
required:
- clocks
- clock-names
unevaluatedProperties: false
examples:
- |
gmac0: ethernet@e7070000 {
compatible = "thead,th1520-gmac", "snps,dwmac-3.70a";
reg = <0xe7070000 0x2000>, <0xec003000 0x1000>;
reg-names = "dwmac", "apb";
clocks = <&clk 1>, <&clk 2>;
clock-names = "stmmaceth", "pclk";
interrupts = <66>;
interrupt-names = "macirq";
phy-mode = "rgmii-id";
snps,fixed-burst;
snps,axi-config = <&stmmac_axi_setup>;
snps,pbl = <32>;
phy-handle = <&phy0>;
mdio {
#address-cells = <1>;
#size-cells = <0>;
compatible = "snps,dwmac-mdio";
phy0: ethernet-phy@0 {
reg = <0>;
};
};
};

View File

@ -53,6 +53,7 @@ properties:
- pci14e4,4488 # BCM4377 - pci14e4,4488 # BCM4377
- pci14e4,4425 # BCM4378 - pci14e4,4425 # BCM4378
- pci14e4,4433 # BCM4387 - pci14e4,4433 # BCM4387
- pci14e4,449d # BCM43752
reg: reg:
description: SDIO function number for the device (for most cases description: SDIO function number for the device (for most cases
@ -121,6 +122,14 @@ properties:
NVRAM. This would normally be filled in by the bootloader from platform NVRAM. This would normally be filled in by the bootloader from platform
configuration data. configuration data.
clocks:
items:
- description: External Low Power Clock input (32.768KHz)
clock-names:
items:
- const: lpo
required: required:
- compatible - compatible
- reg - reg

View File

@ -16,7 +16,11 @@ description:
properties: properties:
compatible: compatible:
const: microchip,wilc1000 oneOf:
- items:
- const: microchip,wilc3000
- const: microchip,wilc1000
- const: microchip,wilc1000
reg: true reg: true

View File

@ -50,6 +50,9 @@ properties:
vddrfa1p7-supply: vddrfa1p7-supply:
description: VDD_RFA_1P7 supply regulator handle description: VDD_RFA_1P7 supply regulator handle
vddrfa1p8-supply:
description: VDD_RFA_1P8 supply regulator handle
vddpcie0p9-supply: vddpcie0p9-supply:
description: VDD_PCIE_0P9 supply regulator handle description: VDD_PCIE_0P9 supply regulator handle
@ -77,6 +80,22 @@ allOf:
- vddrfa1p7-supply - vddrfa1p7-supply
- vddpcie0p9-supply - vddpcie0p9-supply
- vddpcie1p8-supply - vddpcie1p8-supply
- if:
properties:
compatible:
contains:
const: pci17cb,1103
then:
required:
- vddrfacmn-supply
- vddaon-supply
- vddwlcx-supply
- vddwlmx-supply
- vddrfa0p8-supply
- vddrfa1p2-supply
- vddrfa1p8-supply
- vddpcie0p9-supply
- vddpcie1p8-supply
additionalProperties: false additionalProperties: false
@ -99,6 +118,16 @@ examples:
compatible = "pci17cb,1103"; compatible = "pci17cb,1103";
reg = <0x10000 0x0 0x0 0x0 0x0>; reg = <0x10000 0x0 0x0 0x0 0x0>;
vddrfacmn-supply = <&vreg_pmu_rfa_cmn_0p8>;
vddaon-supply = <&vreg_pmu_aon_0p8>;
vddwlcx-supply = <&vreg_pmu_wlcx_0p8>;
vddwlmx-supply = <&vreg_pmu_wlmx_0p8>;
vddpcie1p8-supply = <&vreg_pmu_pcie_1p8>;
vddpcie0p9-supply = <&vreg_pmu_pcie_0p9>;
vddrfa0p8-supply = <&vreg_pmu_rfa_0p8>;
vddrfa1p2-supply = <&vreg_pmu_rfa_1p2>;
vddrfa1p8-supply = <&vreg_pmu_rfa_1p7>;
qcom,ath11k-calibration-variant = "LE_X13S"; qcom,ath11k-calibration-variant = "LE_X13S";
}; };
}; };

View File

@ -29,6 +29,9 @@ properties:
interrupts: interrupts:
maxItems: 1 maxItems: 1
clocks:
maxItems: 1
phy-handle: true phy-handle: true
local-mac-address: true local-mac-address: true
@ -45,6 +48,7 @@ required:
- compatible - compatible
- reg - reg
- interrupts - interrupts
- clocks
- phy-handle - phy-handle
additionalProperties: false additionalProperties: false
@ -56,6 +60,7 @@ examples:
reg = <0x40e00000 0x10000>; reg = <0x40e00000 0x10000>;
interrupt-parent = <&axi_intc_1>; interrupt-parent = <&axi_intc_1>;
interrupts = <1>; interrupts = <1>;
clocks = <&dummy>;
local-mac-address = [00 00 00 00 00 00]; local-mac-address = [00 00 00 00 00 00];
phy-handle = <&phy0>; phy-handle = <&phy0>;
xlnx,rx-ping-pong; xlnx,rx-ping-pong;

View File

@ -45,6 +45,32 @@ Available fault injection capabilities
ALLOW_ERROR_INJECTION() macro, by setting debugfs entries ALLOW_ERROR_INJECTION() macro, by setting debugfs entries
under /sys/kernel/debug/fail_function. No boot option supported. under /sys/kernel/debug/fail_function. No boot option supported.
- fail_skb_realloc
inject skb (socket buffer) reallocation events into the network path. The
primary goal is to identify and prevent issues related to pointer
mismanagement in the network subsystem. By forcing skb reallocation at
strategic points, this feature creates scenarios where existing pointers to
skb headers become invalid.
When the fault is injected and the reallocation is triggered, cached pointers
to skb headers and data no longer reference valid memory locations. This
deliberate invalidation helps expose code paths where proper pointer updating
is neglected after a reallocation event.
By creating these controlled fault scenarios, the system can catch instances
where stale pointers are used, potentially leading to memory corruption or
system instability.
To select the interface to act on, write the network name to
/sys/kernel/debug/fail_skb_realloc/devname.
If this field is left empty (which is the default value), skb reallocation
will be forced on all network interfaces.
The effectiveness of this fault detection is enhanced when KASAN is
enabled, as it helps identify invalid memory references and use-after-free
(UAF) issues.
- NVMe fault injection - NVMe fault injection
inject NVMe status code and retry flag on devices permitted by setting inject NVMe status code and retry flag on devices permitted by setting
@ -216,6 +242,19 @@ configuration of fault-injection capabilities.
use a negative errno, you better use 'printf' instead of 'echo', e.g.: use a negative errno, you better use 'printf' instead of 'echo', e.g.:
$ printf %#x -12 > retval $ printf %#x -12 > retval
- /sys/kernel/debug/fail_skb_realloc/devname:
Specifies the network interface on which to force SKB reallocation. If
left empty, SKB reallocation will be applied to all network interfaces.
Example usage::
# Force skb reallocation on eth0
echo "eth0" > /sys/kernel/debug/fail_skb_realloc/devname
# Clear the selection and force skb reallocation on all interfaces
echo "" > /sys/kernel/debug/fail_skb_realloc/devname
Boot option Boot option
^^^^^^^^^^^ ^^^^^^^^^^^
@ -227,6 +266,7 @@ use the boot option::
fail_usercopy= fail_usercopy=
fail_make_request= fail_make_request=
fail_futex= fail_futex=
fail_skb_realloc=
mmc_core.fail_request=<interval>,<probability>,<space>,<times> mmc_core.fail_request=<interval>,<probability>,<space>,<times>
proc entries proc entries

View File

@ -85,6 +85,36 @@ definitions:
This may happen for example if dpll device was previously This may happen for example if dpll device was previously
locked on an input pin of type PIN_TYPE_SYNCE_ETH_PORT. locked on an input pin of type PIN_TYPE_SYNCE_ETH_PORT.
render-max: true render-max: true
-
type: enum
name: clock-quality-level
doc: |
level of quality of a clock device. This mainly applies when
the dpll lock-status is DPLL_LOCK_STATUS_HOLDOVER.
The current list is defined according to the table 11-7 contained
in ITU-T G.8264/Y.1364 document. One may extend this list freely
by other ITU-T defined clock qualities, or different ones defined
by another standardization body (for those, please use
different prefix).
entries:
-
name: itu-opt1-prc
value: 1
-
name: itu-opt1-ssu-a
-
name: itu-opt1-ssu-b
-
name: itu-opt1-eec1
-
name: itu-opt1-prtc
-
name: itu-opt1-eprtc
-
name: itu-opt1-eeec
-
name: itu-opt1-eprc
render-max: true
- -
type: const type: const
name: temp-divider name: temp-divider
@ -252,6 +282,17 @@ attribute-sets:
name: lock-status-error name: lock-status-error
type: u32 type: u32
enum: lock-status-error enum: lock-status-error
-
name: clock-quality-level
type: u32
enum: clock-quality-level
multi-attr: true
doc: |
Level of quality of a clock device. This mainly applies when
the dpll lock-status is DPLL_LOCK_STATUS_HOLDOVER. This could
be put to message multiple times to indicate possible parallel
quality levels (e.g. one specified by ITU option 1 and another
one specified by option 2).
- -
name: pin name: pin
enum-name: dpll_a_pin enum-name: dpll_a_pin

View File

@ -96,7 +96,12 @@ attribute-sets:
name: bits name: bits
type: nest type: nest
nested-attributes: bitset-bits nested-attributes: bitset-bits
-
name: value
type: binary
-
name: mask
type: binary
- -
name: string name: string
attributes: attributes:
@ -1951,3 +1956,7 @@ operations:
- upstream-sfp-name - upstream-sfp-name
- downstream-sfp-name - downstream-sfp-name
dump: *phy-get-op dump: *phy-get-op
-
name: phy-ntf
doc: Notification for change in PHY devices.
notify: phy-get

View File

@ -0,0 +1,362 @@
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
name: net-shaper
doc: |
Networking HW rate limiting configuration.
This API allows configuring HW shapers available on the network
devices at different levels (queues, network device) and allows
arbitrary manipulation of the scheduling tree of the involved
shapers.
Each @shaper is identified within the given device, by a @handle,
comprising both a @scope and an @id.
Depending on the @scope value, the shapers are attached to specific
HW objects (queues, devices) or, for @node scope, represent a
scheduling group, that can be placed in an arbitrary location of
the scheduling tree.
Shapers can be created with two different operations: the @set
operation, to create and update a single "attached" shaper, and
the @group operation, to create and update a scheduling
group. Only the @group operation can create @node scope shapers.
Existing shapers can be deleted/reset via the @delete operation.
The user can query the running configuration via the @get operation.
Different devices can provide different feature sets, e.g. with no
support for complex scheduling hierarchy, or for some shaping
parameters. The user can introspect the HW capabilities via the
@cap-get operation.
definitions:
-
type: enum
name: scope
doc: Defines the shaper @id interpretation.
render-max: true
entries:
- name: unspec
doc: The scope is not specified.
-
name: netdev
doc: The main shaper for the given network device.
-
name: queue
doc: |
The shaper is attached to the given device queue,
the @id represents the queue number.
-
name: node
doc: |
The shaper allows grouping of queues or other
node shapers; can be nested in either @netdev
shapers or other @node shapers, allowing placement
in any location of the scheduling tree, except
leaves and root.
-
type: enum
name: metric
doc: Different metric supported by the shaper.
entries:
-
name: bps
doc: Shaper operates on a bits per second basis.
-
name: pps
doc: Shaper operates on a packets per second basis.
attribute-sets:
-
name: net-shaper
attributes:
-
name: handle
type: nest
nested-attributes: handle
doc: Unique identifier for the given shaper inside the owning device.
-
name: metric
type: u32
enum: metric
doc: Metric used by the given shaper for bw-min, bw-max and burst.
-
name: bw-min
type: uint
doc: Guaranteed bandwidth for the given shaper.
-
name: bw-max
type: uint
doc: Maximum bandwidth for the given shaper or 0 when unlimited.
-
name: burst
type: uint
doc: |
Maximum burst-size for shaping. Should not be interpreted
as a quantum.
-
name: priority
type: u32
doc: |
Scheduling priority for the given shaper. The priority
scheduling is applied to sibling shapers.
-
name: weight
type: u32
doc: |
Relative weight for round robin scheduling of the
given shaper.
The scheduling is applied to all sibling shapers
with the same priority.
-
name: ifindex
type: u32
doc: Interface index owning the specified shaper.
-
name: parent
type: nest
nested-attributes: handle
doc: |
Identifier for the parent of the affected shaper.
Only needed for @group operation.
-
name: leaves
type: nest
multi-attr: true
nested-attributes: leaf-info
doc: |
Describes a set of leaves shapers for a @group operation.
-
name: handle
attributes:
-
name: scope
type: u32
enum: scope
doc: Defines the shaper @id interpretation.
-
name: id
type: u32
doc: |
Numeric identifier of a shaper. The id semantic depends on
the scope. For @queue scope it's the queue id and for @node
scope it's the node identifier.
-
name: leaf-info
subset-of: net-shaper
attributes:
-
name: handle
-
name: priority
-
name: weight
-
name: caps
attributes:
-
name: ifindex
type: u32
doc: Interface index queried for shapers capabilities.
-
name: scope
type: u32
enum: scope
doc: The scope to which the queried capabilities apply.
-
name: support-metric-bps
type: flag
doc: The device accepts 'bps' metric for bw-min, bw-max and burst.
-
name: support-metric-pps
type: flag
doc: The device accepts 'pps' metric for bw-min, bw-max and burst.
-
name: support-nesting
type: flag
doc: |
The device supports nesting shaper belonging to this scope
below 'node' scoped shapers. Only 'queue' and 'node'
scope can have flag 'support-nesting'.
-
name: support-bw-min
type: flag
doc: The device supports a minimum guaranteed B/W.
-
name: support-bw-max
type: flag
doc: The device supports maximum B/W shaping.
-
name: support-burst
type: flag
doc: The device supports a maximum burst size.
-
name: support-priority
type: flag
doc: The device supports priority scheduling.
-
name: support-weight
type: flag
doc: The device supports weighted round robin scheduling.
operations:
list:
-
name: get
doc: |
Get information about a shaper for a given device.
attribute-set: net-shaper
do:
pre: net-shaper-nl-pre-doit
post: net-shaper-nl-post-doit
request:
attributes: &ns-binding
- ifindex
- handle
reply:
attributes: &ns-attrs
- ifindex
- parent
- handle
- metric
- bw-min
- bw-max
- burst
- priority
- weight
dump:
pre: net-shaper-nl-pre-dumpit
post: net-shaper-nl-post-dumpit
request:
attributes:
- ifindex
reply:
attributes: *ns-attrs
-
name: set
doc: |
Create or update the specified shaper.
The set operation can't be used to create a @node scope shaper,
use the @group operation instead.
attribute-set: net-shaper
flags: [ admin-perm ]
do:
pre: net-shaper-nl-pre-doit
post: net-shaper-nl-post-doit
request:
attributes:
- ifindex
- handle
- metric
- bw-min
- bw-max
- burst
- priority
- weight
-
name: delete
doc: |
Clear (remove) the specified shaper. When deleting
a @node shaper, reattach all the node's leaves to the
deleted node's parent.
If, after the removal, the parent shaper has no more
leaves and the parent shaper scope is @node, the parent
node is deleted, recursively.
When deleting a @queue shaper or a @netdev shaper,
the shaper disappears from the hierarchy, but the
queue/device can still send traffic: it has an implicit
node with infinite bandwidth. The queue's implicit node
feeds an implicit RR node at the root of the hierarchy.
attribute-set: net-shaper
flags: [ admin-perm ]
do:
pre: net-shaper-nl-pre-doit
post: net-shaper-nl-post-doit
request:
attributes: *ns-binding
-
name: group
doc: |
Create or update a scheduling group, attaching the specified
@leaves shapers under the specified node identified by @handle.
The @leaves shapers scope must be @queue and the node shaper
scope must be either @node or @netdev.
When the node shaper has @node scope, if the @handle @id is not
specified, a new shaper of such scope is created, otherwise the
specified node must already exist.
When updating an existing node shaper, the specified @leaves are
added to the existing node; such node will also retain any preexisting
leave.
The @parent handle for a new node shaper defaults to the parent
of all the leaves, provided all the leaves share the same parent.
Otherwise @parent handle must be specified.
The user can optionally provide shaping attributes for the node
shaper.
The operation is atomic, on failure no change is applied to
the device shaping configuration, otherwise the @node shaper
full identifier, comprising @binding and @handle, is provided
as the reply.
attribute-set: net-shaper
flags: [ admin-perm ]
do:
pre: net-shaper-nl-pre-doit
post: net-shaper-nl-post-doit
request:
attributes:
- ifindex
- parent
- handle
- metric
- bw-min
- bw-max
- burst
- priority
- weight
- leaves
reply:
attributes: *ns-binding
-
name: cap-get
doc: |
Get the shaper capabilities supported by the given device
for the specified scope.
attribute-set: caps
do:
pre: net-shaper-nl-cap-pre-doit
post: net-shaper-nl-cap-post-doit
request:
attributes:
- ifindex
- scope
reply:
attributes: &cap-attrs
- ifindex
- scope
- support-metric-bps
- support-metric-pps
- support-nesting
- support-bw-min
- support-bw-max
- support-burst
- support-priority
- support-weight
dump:
pre: net-shaper-nl-cap-pre-dumpit
post: net-shaper-nl-cap-post-dumpit
request:
attributes:
- ifindex
reply:
attributes: *cap-attrs

View File

@ -248,6 +248,26 @@ attribute-sets:
threaded mode. If NAPI is not in threaded mode (i.e. uses normal threaded mode. If NAPI is not in threaded mode (i.e. uses normal
softirq context), the attribute will be absent. softirq context), the attribute will be absent.
type: u32 type: u32
-
name: defer-hard-irqs
doc: The number of consecutive empty polls before IRQ deferral ends
and hardware IRQs are re-enabled.
type: u32
checks:
max: s32-max
-
name: gro-flush-timeout
doc: The timeout, in nanoseconds, of when to trigger the NAPI watchdog
timer which schedules NAPI processing. Additionally, a non-zero
value will also prevent GRO from flushing recent super-frames at
the end of a NAPI cycle. This may add receive latency in exchange
for reducing the number of frames processed by the network stack.
type: uint
-
name: irq-suspend-timeout
doc: The timeout, in nanoseconds, of how long to suspend irq
processing, if event polling finds events
type: uint
- -
name: queue name: queue
attributes: attributes:
@ -636,6 +656,9 @@ operations:
- ifindex - ifindex
- irq - irq
- pid - pid
- defer-hard-irqs
- gro-flush-timeout
- irq-suspend-timeout
dump: dump:
request: request:
attributes: attributes:
@ -676,6 +699,18 @@ operations:
reply: reply:
attributes: attributes:
- id - id
-
name: napi-set
doc: Set configurable NAPI instance settings.
attribute-set: napi
flags: [ admin-perm ]
do:
request:
attributes:
- id
- defer-hard-irqs
- gro-flush-timeout
- irq-suspend-timeout
kernel-family: kernel-family:
headers: [ "linux/list.h"] headers: [ "linux/list.h"]

View File

@ -920,6 +920,13 @@ definitions:
- name: l2 - name: l2
- name: l3 - name: l3
-
name: netkit-scrub
type: enum
entries:
- name: none
- name: default
attribute-sets: attribute-sets:
- -
name: link-attrs name: link-attrs
@ -1137,6 +1144,10 @@ attribute-sets:
name: dpll-pin name: dpll-pin
type: nest type: nest
nested-attributes: link-dpll-pin-attrs nested-attributes: link-dpll-pin-attrs
-
name: max-pacing-offload-horizon
type: uint
doc: EDT offload horizon supported by the device (in nsec).
- -
name: af-spec-attrs name: af-spec-attrs
attributes: attributes:
@ -2147,6 +2158,14 @@ attribute-sets:
name: mode name: mode
type: u32 type: u32
enum: netkit-mode enum: netkit-mode
-
name: scrub
type: u32
enum: netkit-scrub
-
name: peer-scrub
type: u32
enum: netkit-scrub
sub-messages: sub-messages:
- -

View File

@ -0,0 +1,442 @@
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
name: rt-neigh
protocol: netlink-raw
protonum: 0
doc:
IP neighbour management over rtnetlink.
definitions:
-
name: ndmsg
type: struct
members:
-
name: family
type: u8
-
name: pad
type: pad
len: 3
-
name: ifindex
type: s32
-
name: state
type: u16
enum: nud-state
-
name: flags
type: u8
enum: ntf-flags
-
name: type
type: u8
enum: rtm-type
-
name: ndtmsg
type: struct
members:
-
name: family
type: u8
-
name: pad
type: pad
len: 3
-
name: nud-state
type: flags
entries:
- incomplete
- reachable
- stale
- delay
- probe
- failed
- noarp
- permanent
-
name: ntf-flags
type: flags
entries:
- use
- self
- master
- proxy
- ext-learned
- offloaded
- sticky
- router
-
name: ntf-ext-flags
type: flags
entries:
- managed
- locked
-
name: rtm-type
type: enum
entries:
- unspec
- unicast
- local
- broadcast
- anycast
- multicast
- blackhole
- unreachable
- prohibit
- throw
- nat
- xresolve
-
name: nda-cacheinfo
type: struct
members:
-
name: confirmed
type: u32
-
name: used
type: u32
-
name: updated
type: u32
-
name: refcnt
type: u32
-
name: ndt-config
type: struct
members:
-
name: key-len
type: u16
-
name: entry-size
type: u16
-
name: entries
type: u32
-
name: last-flush
type: u32
-
name: last-rand
type: u32
-
name: hash-rnd
type: u32
-
name: hash-mask
type: u32
-
name: hash-chain-gc
type: u32
-
name: proxy-qlen
type: u32
-
name: ndt-stats
type: struct
members:
-
name: allocs
type: u64
-
name: destroys
type: u64
-
name: hash-grows
type: u64
-
name: res-failed
type: u64
-
name: lookups
type: u64
-
name: hits
type: u64
-
name: rcv-probes-mcast
type: u64
-
name: rcv-probes-ucast
type: u64
-
name: periodic-gc-runs
type: u64
-
name: forced-gc-runs
type: u64
-
name: table-fulls
type: u64
attribute-sets:
-
name: neighbour-attrs
attributes:
-
name: unspec
type: binary
value: 0
-
name: dst
type: binary
display-hint: ipv4
-
name: lladr
type: binary
display-hint: mac
-
name: cacheinfo
type: binary
struct: nda-cacheinfo
-
name: probes
type: u32
-
name: vlan
type: u16
-
name: port
type: u16
-
name: vni
type: u32
-
name: ifindex
type: u32
-
name: master
type: u32
-
name: link-netnsid
type: s32
-
name: src-vni
type: u32
-
name: protocol
type: u8
-
name: nh-id
type: u32
-
name: fdb-ext-attrs
type: binary
-
name: flags-ext
type: u32
enum: ntf-ext-flags
-
name: ndm-state-mask
type: u16
-
name: ndm-flags-mask
type: u8
-
name: ndt-attrs
attributes:
-
name: name
type: string
-
name: thresh1
type: u32
-
name: thresh2
type: u32
-
name: thresh3
type: u32
-
name: config
type: binary
struct: ndt-config
-
name: parms
type: nest
nested-attributes: ndtpa-attrs
-
name: stats
type: binary
struct: ndt-stats
-
name: gc-interval
type: u64
-
name: pad
type: pad
-
name: ndtpa-attrs
attributes:
-
name: ifindex
type: u32
-
name: refcnt
type: u32
-
name: reachable-time
type: u64
-
name: base-reachable-time
type: u64
-
name: retrans-time
type: u64
-
name: gc-staletime
type: u64
-
name: delay-probe-time
type: u64
-
name: queue-len
type: u32
-
name: app-probes
type: u32
-
name: ucast-probes
type: u32
-
name: mcast-probes
type: u32
-
name: anycast-delay
type: u64
-
name: proxy-delay
type: u64
-
name: proxy-qlen
type: u32
-
name: locktime
type: u64
-
name: queue-lenbytes
type: u32
-
name: mcast-reprobes
type: u32
-
name: pad
type: pad
-
name: interval-probe-time-ms
type: u64
operations:
enum-model: directional
list:
-
name: newneigh
doc: Add new neighbour entry
fixed-header: ndmsg
attribute-set: neighbour-attrs
do:
request:
value: 28
attributes: &neighbour-all
- dst
- lladdr
- probes
- vlan
- port
- vni
- ifindex
- master
- protocol
- nh-id
- flags-ext
- fdb-ext-attrs
-
name: delneigh
doc: Remove an existing neighbour entry
fixed-header: ndmsg
attribute-set: neighbour-attrs
do:
request:
value: 29
attributes:
- dst
- ifindex
-
name: delneigh-ntf
doc: Notify a neighbour deletion
value: 29
notify: delneigh
fixed-header: ndmsg
-
name: getneigh
doc: Get or dump neighbour entries
fixed-header: ndmsg
attribute-set: neighbour-attrs
do:
request:
value: 30
attributes:
- dst
reply:
value: 28
attributes: *neighbour-all
dump:
request:
attributes:
- ifindex
- master
reply:
attributes: *neighbour-all
-
name: newneigh-ntf
doc: Notify a neighbour creation
value: 28
notify: getneigh
fixed-header: ndmsg
-
name: getneightbl
doc: Get or dump neighbour tables
fixed-header: ndtmsg
attribute-set: ndt-attrs
dump:
request:
value: 66
reply:
value: 64
attributes:
- name
- thresh1
- thresh2
- thresh3
- config
- parms
- stats
- gc-interval
-
name: setneightbl
doc: Set neighbour tables
fixed-header: ndtmsg
attribute-set: ndt-attrs
do:
request:
value: 67
attributes:
- name
- thresh1
- thresh2
- thresh3
- parms
- gc-interval
mcast-groups:
list:
-
name: rtnlgrp-neigh
value: 3

View File

@ -0,0 +1,242 @@
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
name: rt-rule
protocol: netlink-raw
protonum: 0
doc:
FIB rule management over rtnetlink.
definitions:
-
name: rtgenmsg
type: struct
members:
-
name: family
type: u8
-
name: pad
type: pad
len: 3
-
name: fib-rule-hdr
type: struct
members:
-
name: family
type: u8
-
name: dst-len
type: u8
-
name: src-len
type: u8
-
name: tos
type: u8
-
name: table
type: u8
-
name: res1
type: pad
len: 1
-
name: res2
type: pad
len: 1
-
name: action
type: u8
enum: fr-act
-
name: flags
type: u32
-
name: fr-act
type: enum
entries:
- unspec
- to-tbl
- goto
- nop
- res3
- res4
- blackhole
- unreachable
- prohibit
-
name: fib-rule-port-range
type: struct
members:
-
name: start
type: u16
-
name: end
type: u16
-
name: fib-rule-uid-range
type: struct
members:
-
name: start
type: u32
-
name: end
type: u32
attribute-sets:
-
name: fib-rule-attrs
attributes:
-
name: dst
type: u32
-
name: src
type: u32
-
name: iifname
type: string
-
name: goto
type: u32
-
name: unused2
type: pad
-
name: priority
type: u32
-
name: unused3
type: pad
-
name: unused4
type: pad
-
name: unused5
type: pad
-
name: fwmark
type: u32
display-hint: hex
-
name: flow
type: u32
-
name: tun-id
type: u64
-
name: suppress-ifgroup
type: u32
-
name: suppress-prefixlen
type: u32
display-hint: hex
-
name: table
type: u32
-
name: fwmask
type: u32
display-hint: hex
-
name: oifname
type: string
-
name: pad
type: pad
-
name: l3mdev
type: u8
-
name: uid-range
type: binary
struct: fib-rule-uid-range
-
name: protocol
type: u8
-
name: ip-proto
type: u8
-
name: sport-range
type: binary
struct: fib-rule-port-range
-
name: dport-range
type: binary
struct: fib-rule-port-range
-
name: dscp
type: u8
operations:
enum-model: directional
fixed-header: fib-rule-hdr
list:
-
name: newrule
doc: Add new FIB rule
attribute-set: fib-rule-attrs
do:
request:
value: 32
attributes: &fib-rule-all
- iifname
- oifname
- priority
- fwmark
- flow
- tun-id
- fwmask
- table
- suppress-prefixlen
- suppress-ifgroup
- goto
- l3mdev
- uid-range
- protocol
- ip-proto
- sport-range
- dport-range
- dscp
-
name: newrule-ntf
doc: Notify a rule creation
value: 32
notify: newrule
-
name: delrule
doc: Remove an existing FIB rule
attribute-set: fib-rule-attrs
do:
request:
value: 33
attributes: *fib-rule-all
-
name: delrule-ntf
doc: Notify a rule deletion
value: 33
notify: delrule
-
name: getrule
doc: Dump all FIB rules
attribute-set: fib-rule-attrs
dump:
request:
value: 34
reply:
value: 32
attributes: *fib-rule-all
mcast-groups:
list:
-
name: rtnlgrp-ipv4-rule
value: 8
-
name: rtnlgrp-ipv6-rule
value: 19

View File

@ -622,7 +622,7 @@ definitions:
- -
name: max-P name: max-P
type: u32 type: u32
doc: probabilty, high resolution doc: probability, high resolution
- -
name: stats name: stats
type: binary type: binary

View File

@ -2916,6 +2916,17 @@ from the bond (``ifenslave -d bond0 eth0``). The bonding driver will
then restore the MAC addresses that the slaves had before they were then restore the MAC addresses that the slaves had before they were
enslaved. enslaved.
9. What bonding modes support native XDP?
------------------------------------------
* balance-rr (0)
* active-backup (1)
* balance-xor (2)
* 802.3ad (4)
Note that the vlan+srcmac hash policy does not support native XDP.
For other bonding modes, the XDP program must be loaded with generic mode.
16. Resources and Links 16. Resources and Links
======================= =======================

View File

@ -101,6 +101,37 @@ example, if Rx packets are 10 and Netdev (software statistics) displays
rx_bytes as "X", then ethtool (hardware statistics) will display rx_bytes as rx_bytes as "X", then ethtool (hardware statistics) will display rx_bytes as
"X+40" (4 bytes CRC x 10 packets). "X+40" (4 bytes CRC x 10 packets).
ethtool reset
-------------
The driver supports 3 types of resets:
- PF reset - resets only components associated with the given PF, does not
impact other PFs
- CORE reset - whole adapter is affected, reset all PFs
- GLOBAL reset - same as CORE but mac and phy components are also reinitialized
These are mapped to ethtool reset flags as follow:
- PF reset:
# ethtool --reset <ethX> irq dma filter offload
- CORE reset:
# ethtool --reset <ethX> irq-shared dma-shared filter-shared offload-shared \
ram-shared
- GLOBAL reset:
# ethtool --reset <ethX> irq-shared dma-shared filter-shared offload-shared \
mac-shared phy-shared ram-shared
In switchdev mode you can reset a VF using port representor:
# ethtool --reset <repr> irq dma filter offload
Viewing Link Messages Viewing Link Messages
--------------------- ---------------------

View File

@ -14,6 +14,7 @@ Contents
- `Basic packet flow`_ - `Basic packet flow`_
- `Devlink health reporters`_ - `Devlink health reporters`_
- `Quality of service`_ - `Quality of service`_
- `RVU representors`_
Overview Overview
======== ========
@ -340,3 +341,93 @@ Setup HTB offload
# tc class add dev <interface> parent 1: classid 1:2 htb rate 10Gbit prio 2 quantum 188416 # tc class add dev <interface> parent 1: classid 1:2 htb rate 10Gbit prio 2 quantum 188416
# tc class add dev <interface> parent 1: classid 1:3 htb rate 10Gbit prio 2 quantum 32768 # tc class add dev <interface> parent 1: classid 1:3 htb rate 10Gbit prio 2 quantum 32768
RVU Representors
================
RVU representor driver adds support for creation of representor devices for
RVU PFs' VFs in the system. Representor devices are created when user enables
the switchdev mode.
Switchdev mode can be enabled either before or after setting up SRIOV numVFs.
All representor devices share a single NIXLF but each has a dedicated Rx/Tx
queues. RVU PF representor driver registers a separate netdev for each
Rx/Tx queue pair.
Current HW does not support built-in switch which can do L2 learning and
forwarding packets between representee and representor. Hence, packet path
between representee and it's representor is achieved by setting up appropriate
NPC MCAM filters.
Transmit packets matching these filters will be loopbacked through hardware
loopback channel/interface (i.e, instead of sending them out of MAC interface).
Which will again match the installed filters and will be forwarded.
This way representee => representor and representor => representee packet
path is achieved. These rules get installed when representors are created
and gets active/deactivate based on the representor/representee interface state.
Usage example:
- Change device to switchdev mode::
# devlink dev eswitch set pci/0002:1c:00.0 mode switchdev
- List of representor devices on the system::
# ip link show
Rpf1vf0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether f6:43:83:ee:26:21 brd ff:ff:ff:ff:ff:ff
Rpf1vf1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 12:b2:54:0e:24:54 brd ff:ff:ff:ff:ff:ff
Rpf1vf2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 4a:12:c4:4c:32:62 brd ff:ff:ff:ff:ff:ff
Rpf1vf3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether ca:cb:68:0e:e2:6e brd ff:ff:ff:ff:ff:ff
Rpf2vf0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 06:cc:ad:b4:f0:93 brd ff:ff:ff:ff:ff:ff
To delete the representors devices from the system. Change the device to legacy mode.
- Change device to legacy mode::
# devlink dev eswitch set pci/0002:1c:00.0 mode legacy
RVU representors can be managed using devlink ports
(see :ref:`Documentation/networking/devlink/devlink-port.rst <devlink_port>`) interface.
- Show devlink ports of representors::
# devlink port
pci/0002:1c:00.0/0: type eth netdev Rpf1vf0 flavour physical port 0 splittable false
pci/0002:1c:00.0/1: type eth netdev Rpf1vf1 flavour pcivf controller 0 pfnum 1 vfnum 1 external false splittable false
pci/0002:1c:00.0/2: type eth netdev Rpf1vf2 flavour pcivf controller 0 pfnum 1 vfnum 2 external false splittable false
pci/0002:1c:00.0/3: type eth netdev Rpf1vf3 flavour pcivf controller 0 pfnum 1 vfnum 3 external false splittable false
Function attributes
===================
The RVU representor support function attributes for representors.
Port function configuration of the representors are supported through devlink eswitch port.
MAC address setup
-----------------
RVU representor driver support devlink port function attr mechanism to setup MAC
address. (refer to Documentation/networking/devlink/devlink-port.rst)
- To setup MAC address for port 2::
# devlink port function set pci/0002:1c:00.0/2 hw_addr 5c:a1:1b:5e:43:11
# devlink port show pci/0002:1c:00.0/2
pci/0002:1c:00.0/2: type eth netdev Rpf1vf2 flavour pcivf controller 0 pfnum 1 vfnum 2 external false splittable false
function:
hw_addr 5c:a1:1b:5e:43:11
TC offload
==========
The rvu representor driver implements support for offloading tc rules using port representors.
- Drop packets with vlan id 3::
# tc filter add dev Rpf1vf0 protocol 802.1Q parent ffff: flower vlan_id 3 vlan_ethtype ipv4 skip_sw action drop
- Redirect packets with vlan id 5 and IPv4 packets to eth1, after stripping vlan header.::
# tc filter add dev Rpf1vf0 ingress protocol 802.1Q flower vlan_id 5 vlan_ethtype ipv4 skip_sw action vlan pop action mirred ingress redirect dev eth1

View File

@ -27,3 +27,46 @@ driver takes over.
devlink dev info provides version information for all three components. In devlink dev info provides version information for all three components. In
addition to the version the hg commit hash of the build is included as a addition to the version the hg commit hash of the build is included as a
separate entry. separate entry.
Statistics
----------
RPC (Rx parser)
~~~~~~~~~~~~~~~
- ``rpc_unkn_etype``: frames containing unknown EtherType
- ``rpc_unkn_ext_hdr``: frames containing unknown IPv6 extension header
- ``rpc_ipv4_frag``: frames containing IPv4 fragment
- ``rpc_ipv6_frag``: frames containing IPv6 fragment
- ``rpc_ipv4_esp``: frames with IPv4 ESP encapsulation
- ``rpc_ipv6_esp``: frames with IPv6 ESP encapsulation
- ``rpc_tcp_opt_err``: frames which encountered TCP option parsing error
- ``rpc_out_of_hdr_err``: frames where header was larger than parsable region
- ``ovr_size_err``: oversized frames
PCIe
~~~~
The fbnic driver exposes PCIe hardware performance statistics through debugfs
(``pcie_stats``). These statistics provide insights into PCIe transaction
behavior and potential performance bottlenecks.
1. PCIe Transaction Counters:
These counters track PCIe transaction activity:
- ``pcie_ob_rd_tlp``: Outbound read Transaction Layer Packets count
- ``pcie_ob_rd_dword``: DWORDs transferred in outbound read transactions
- ``pcie_ob_wr_tlp``: Outbound write Transaction Layer Packets count
- ``pcie_ob_wr_dword``: DWORDs transferred in outbound write
transactions
- ``pcie_ob_cpl_tlp``: Outbound completion TLP count
- ``pcie_ob_cpl_dword``: DWORDs transferred in outbound completion TLPs
2. PCIe Resource Monitoring:
These counters indicate PCIe resource exhaustion events:
- ``pcie_ob_rd_no_tag``: Read requests dropped due to tag unavailability
- ``pcie_ob_rd_no_cpl_cred``: Read requests dropped due to completion
credit exhaustion
- ``pcie_ob_rd_no_np_cred``: Read requests dropped due to non-posted
credit exhaustion

View File

@ -7,12 +7,13 @@
============================================ ============================================
t7xx driver for MTK PCIe based T700 5G modem t7xx driver for MTK PCIe based T700 5G modem
============================================ ============================================
The t7xx driver is a WWAN PCIe host driver developed for linux or Chrome OS platforms The t7xx driver is a WWAN PCIe host driver developed for linux or Chrome OS
for data exchange over PCIe interface between Host platform & MediaTek's T700 5G modem. platforms for data exchange over PCIe interface between Host platform &
The driver exposes an interface conforming to the MBIM protocol [1]. Any front end MediaTek's T700 5G modem.
application (e.g. Modem Manager) could easily manage the MBIM interface to enable The driver exposes an interface conforming to the MBIM protocol [1]. Any front
data communication towards WWAN. The driver also provides an interface to interact end application (e.g. Modem Manager) could easily manage the MBIM interface to
with the MediaTek's modem via AT commands. enable data communication towards WWAN. The driver also provides an interface
to interact with the MediaTek's modem via AT commands.
Basic usage Basic usage
=========== ===========
@ -45,8 +46,8 @@ The driver provides sysfs interfaces to userspace.
t7xx_mode t7xx_mode
--------- ---------
The sysfs interface provides userspace with access to the device mode, this interface The sysfs interface provides userspace with access to the device mode, this
supports read and write operations. interface supports read and write operations.
Device mode: Device mode:
@ -67,6 +68,28 @@ Write from userspace to set the device mode.
:: ::
$ echo fastboot_switching > /sys/bus/pci/devices/${bdf}/t7xx_mode $ echo fastboot_switching > /sys/bus/pci/devices/${bdf}/t7xx_mode
t7xx_debug_ports
----------------
The sysfs interface provides userspace with access to enable/disable the debug
ports, this interface supports read and write operations.
Debug port status:
- ``1`` represents enable debug ports
- ``0`` represents disable debug ports
Currently supported debug ports (ADB/MIPC).
Read from userspace to get the current debug ports status.
::
$ cat /sys/bus/pci/devices/${bdf}/t7xx_debug_ports
Write from userspace to set the debug ports status.
::
$ echo 1 > /sys/bus/pci/devices/${bdf}/t7xx_debug_ports
Management application development Management application development
================================== ==================================
The driver and userspace interfaces are described below. The MBIM protocol is The driver and userspace interfaces are described below. The MBIM protocol is
@ -139,6 +162,25 @@ Please note that driver needs to be reloaded to export /dev/wwan0fastboot0
port, because device needs a cold reset after enter ``fastboot_switching`` port, because device needs a cold reset after enter ``fastboot_switching``
mode. mode.
ADB port userspace ABI
----------------------
/dev/wwan0adb0 character device
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The driver exposes a ADB protocol interface by implementing ADB WWAN Port.
The userspace end of the ADB channel pipe is a /dev/wwan0adb0 character device.
Application shall use this interface for ADB protocol communication.
MIPC port userspace ABI
-----------------------
/dev/wwan0mipc0 character device
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The driver exposes a diagnostic interface by implementing MIPC (Modem
Information Process Center) WWAN Port. The userspace end of the MIPC channel
pipe is a /dev/wwan0mipc0 character device.
Application shall use this interface for MTK modem diagnostic communication.
The MediaTek's T700 modem supports the 3GPP TS 27.007 [4] specification. The MediaTek's T700 modem supports the 3GPP TS 27.007 [4] specification.
References References
@ -164,3 +206,9 @@ speak the Mobile Interface Broadband Model (MBIM) protocol"*
[5] *fastboot "a mechanism for communicating with bootloaders"* [5] *fastboot "a mechanism for communicating with bootloaders"*
- https://android.googlesource.com/platform/system/core/+/refs/heads/main/fastboot/README.md - https://android.googlesource.com/platform/system/core/+/refs/heads/main/fastboot/README.md
[6] *ADB (Android Debug Bridge) "a mechanism to keep track of Android devices
and emulators instances connected to or running on a given host developer
machine with ADB protocol"*
- https://android.googlesource.com/platform/packages/modules/adb/+/refs/heads/main/README.md

View File

@ -40,6 +40,27 @@ The ``octeontx2 AF`` driver implements the following driver-specific parameters.
- runtime - runtime
- Use to set the quantum which hardware uses for scheduling among transmit queues. - Use to set the quantum which hardware uses for scheduling among transmit queues.
Hardware uses weighted DWRR algorithm to schedule among all transmit queues. Hardware uses weighted DWRR algorithm to schedule among all transmit queues.
* - ``npc_mcam_high_zone_percent``
- u8
- runtime
- Use to set the number of high priority zone entries in NPC MCAM that can be allocated
by a user, out of the three priority zone categories high, mid and low.
* - ``npc_def_rule_cntr``
- bool
- runtime
- Use to enable or disable hit counters for the default rules in NPC MCAM.
Its not guaranteed that counters gets enabled and mapped to all the default rules,
since the counters are scarce and driver follows a best effort approach.
The default rule serves as the primary packet steering rule for a specific PF or VF,
based on its DMAC address which is installed by AF driver as part of its initialization.
Sample command to read hit counters for default rule from debugfs is as follows,
cat /sys/kernel/debug/cn10k/npc/mcam_rules
* - ``nix_maxlf``
- u16
- runtime
- Use to set the maximum number of LFs in NIX hardware block. This would be useful
to increase the availability of default resources allocated to enabled LFs like
MCAM entries for example.
The ``octeontx2 PF`` driver implements the following driver-specific parameters. The ``octeontx2 PF`` driver implements the following driver-specific parameters.

View File

@ -0,0 +1,17 @@
.. SPDX-License-Identifier: GPL-2.0
======================
Networking Diagnostics
======================
.. toctree::
:maxdepth: 2
twisted_pair_layer1_diagnostics.rst
.. only:: subproject and html
Indices
=======
* :ref:`genindex`

View File

@ -0,0 +1,767 @@
.. SPDX-License-Identifier: GPL-2.0
Diagnostic Concept for Investigating Twisted Pair Ethernet Variants at OSI Layer 1
==================================================================================
Introduction
------------
This documentation is designed for two primary audiences:
1. **Users and System Administrators**: For those dealing with real-world
Ethernet issues, this guide provides a practical, step-by-step
troubleshooting flow to help identify and resolve common problems in Twisted
Pair Ethernet at OSI Layer 1. If you're facing unstable links, speed drops,
or mysterious network issues, jump right into the step-by-step guide and
follow it through to find your solution.
2. **Kernel Developers**: For developers working with network drivers and PHY
support, this documentation outlines the diagnostic process and highlights
areas where the Linux kernels diagnostic interfaces could be extended or
improved. By understanding the diagnostic flow, developers can better
prioritize future enhancements.
Step-by-Step Diagnostic Guide from Linux (General Ethernet)
-----------------------------------------------------------
This diagnostic guide covers common Ethernet troubleshooting scenarios,
focusing on **link stability and detection** across different Ethernet
environments, including **Single-Pair Ethernet (SPE)** and **Multi-Pair
Ethernet (MPE)**, as well as power delivery technologies like **PoDL** (Power
over Data Line) and **PoE** (Clause 33 PSE).
The guide is designed to help users diagnose physical layer (Layer 1) issues on
systems running **Linux kernel version 6.11 or newer**, utilizing **ethtool
version 6.10 or later** and **iproute2 version 6.4.0 or later**.
In this guide, we assume that users may have **limited or no access to the link
partner** and will focus on diagnosing issues locally.
Diagnostic Scenarios
~~~~~~~~~~~~~~~~~~~~
- **Link is up and stable, but no data transfer**: If the link is stable but
there are issues with data transmission, refer to the **OSI Layer 2
Troubleshooting Guide**.
- **Link is unstable**: Link resets, speed drops, or other fluctuations
indicate potential issues at the hardware or physical layer.
- **No link detected**: The interface is up, but no link is established.
Verify Interface Status
~~~~~~~~~~~~~~~~~~~~~~~
Begin by verifying the status of the Ethernet interface to check if it is
administratively up. Unlike `ethtool`, which provides information on the link
and PHY status, it does not show the **administrative state** of the interface.
To check this, you should use the `ip` command, which describes the interface
state within the angle brackets `"<>"` in its output.
For example, in the output `<NO-CARRIER,BROADCAST,MULTICAST,UP>`, the important
keywords are:
- **UP**: The interface is in the administrative "UP" state.
- **NO-CARRIER**: The interface is administratively up, but no physical link is
detected.
If the output shows `<BROADCAST,MULTICAST>`, this indicates the interface is in
the administrative "DOWN" state.
- **Command:** `ip link show dev <interface>`
- **Expected Output:**
.. code-block:: bash
4: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 ...
link/ether 88:14:2b:00:96:f2 brd ff:ff:ff:ff:ff:ff
- **Interpreting the Output:**
- **Administrative UP State**:
- If the output contains **"UP"**, the interface is administratively up,
and the system is trying to establish a physical link.
- If you also see **"NO-CARRIER"**, it means the physical link has not been
detected, indicating potential Layer 1 issues like a cable fault,
misconfiguration, or no connection at the link partner. In this case,
proceed to the **Inspect Link Status and PHY Configuration** section.
- **Administrative DOWN State**:
- If the output lacks **"UP"** and shows only states like
**"<BROADCAST,MULTICAST>"**, it means the interface is administratively
down. In this case, bring the interface up using the following command:
.. code-block:: bash
ip link set dev <interface> up
- **Next Steps**:
- If the interface is **administratively up** but shows **NO-CARRIER**,
proceed to the **Inspect Link Status and PHY Configuration** section to
troubleshoot potential physical layer issues.
- If the interface was **administratively down** and you have brought it up,
ensure to **repeat this verification step** to confirm the new state of the
interface before proceeding
- **If the interface is up and the link is detected**:
- If the output shows **"UP"** and there is **no `NO-CARRIER`**, the
interface is administratively up, and the physical link has been
successfully established. If everything is working as expected, the Layer
1 diagnostics are complete, and no further action is needed.
- If the interface is up and the link is detected but **no data is being
transferred**, the issue is likely beyond Layer 1, and you should proceed
with diagnosing the higher layers of the OSI model. This may involve
checking Layer 2 configurations (such as VLANs or MAC address issues),
Layer 3 settings (like IP addresses, routing, or ARP), or Layer 4 and
above (firewalls, services, etc.).
- If the **link is unstable** or **frequently resetting or dropping**, this
may indicate a physical layer issue such as a faulty cable, interference,
or power delivery problems. In this case, proceed with the next step in
this guide.
Inspect Link Status and PHY Configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Use `ethtool -I` to check the link status, PHY configuration, supported link
modes, and additional statistics such as the **Link Down Events** counter. This
step is essential for diagnosing Layer 1 problems such as speed mismatches,
duplex issues, and link instability.
For both **Single-Pair Ethernet (SPE)** and **Multi-Pair Ethernet (MPE)**
devices, you will use this step to gather key details about the link. **SPE**
links generally support a single speed and mode without autonegotiation (with
the exception of **10BaseT1L**), while **MPE** devices typically support
multiple link modes and autonegotiation.
- **Command:** `ethtool -I <interface>`
- **Example Output for SPE Interface (Non-autonegotiation)**:
.. code-block:: bash
Settings for spe4:
Supported ports: [ TP ]
Supported link modes: 100baseT1/Full
Supported pause frame use: No
Supports auto-negotiation: No
Supported FEC modes: Not reported
Advertised link modes: Not applicable
Advertised pause frame use: No
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: 100Mb/s
Duplex: Full
Auto-negotiation: off
master-slave cfg: forced slave
master-slave status: slave
Port: Twisted Pair
PHYAD: 6
Transceiver: external
MDI-X: Unknown
Supports Wake-on: d
Wake-on: d
Link detected: yes
SQI: 7/7
Link Down Events: 2
- **Example Output for MPE Interface (Autonegotiation)**:
.. code-block:: bash
Settings for eth1:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Supported pause frame use: Symmetric Receive-only
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Link partner advertised pause frame use: Symmetric Receive-only
Link partner advertised auto-negotiation: Yes
Link partner advertised FEC modes: Not reported
Speed: 100Mb/s
Duplex: Full
Auto-negotiation: on
Port: Twisted Pair
PHYAD: 10
Transceiver: internal
MDI-X: Unknown
Supports Wake-on: pg
Wake-on: p
Link detected: yes
Link Down Events: 1
- **Next Steps**:
- Record the output provided by `ethtool`, particularly noting the
**master-slave status**, **speed**, **duplex**, and other relevant fields.
This information will be useful for further analysis or troubleshooting.
Once the **ethtool** output has been collected and stored, move on to the
next diagnostic step.
Check Power Delivery (PoDL or PoE)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If it is known that **PoDL** or **PoE** is **not implemented** on the system,
or the **PSE** (Power Sourcing Equipment) is managed by proprietary user-space
software or external tools, you can skip this step. In such cases, verify power
delivery through alternative methods, such as checking hardware indicators
(LEDs), using multimeters, or consulting vendor-specific software for
monitoring power status.
If **PoDL** or **PoE** is implemented and managed directly by Linux, follow
these steps to ensure power is being delivered correctly:
- **Command:** `ethtool --show-pse <interface>`
- **Expected Output Examples**:
1. **PSE Not Supported**:
If no PSE is attached or the interface does not support PSE, the following
output is expected:
.. code-block:: bash
netlink error: No PSE is attached
netlink error: Operation not supported
2. **PoDL (Single-Pair Ethernet)**:
When PoDL is implemented, you might see the following attributes:
.. code-block:: bash
PSE attributes for eth1:
PoDL PSE Admin State: enabled
PoDL PSE Power Detection Status: delivering power
3. **PoE (Clause 33 PSE)**:
For standard PoE, the output may look like this:
.. code-block:: bash
PSE attributes for eth1:
Clause 33 PSE Admin State: enabled
Clause 33 PSE Power Detection Status: delivering power
Clause 33 PSE Available Power Limit: 18000
- **Adjust Power Limit (if needed)**:
- Sometimes, the available power limit may not be sufficient for the link
partner. You can increase the power limit as needed.
- **Command:** `ethtool --set-pse <interface> c33-pse-avail-pw-limit <limit>`
Example:
.. code-block:: bash
ethtool --set-pse eth1 c33-pse-avail-pw-limit 18000
ethtool --show-pse eth1
**Expected Output** after adjusting the power limit:
.. code-block:: bash
Clause 33 PSE Available Power Limit: 18000
- **Next Steps**:
- **PoE or PoDL Not Used**: If **PoE** or **PoDL** is not implemented or used
on the system, proceed to the next diagnostic step, as power delivery is
not relevant for this setup.
- **PoE or PoDL Controlled Externally**: If **PoE** or **PoDL** is used but
is not managed by the Linux kernel's **PSE-PD** framework (i.e., it is
controlled by proprietary user-space software or external tools), this part
is out of scope for this documentation. Please consult vendor-specific
documentation or external tools for monitoring and managing power delivery.
- **PSE Admin State Disabled**:
- If the `PSE Admin State:` is **disabled**, enable it by running one of
the following commands:
.. code-block:: bash
ethtool --set-pse <devname> podl-pse-admin-control enable
or, for Clause 33 PSE (PoE):
ethtool --set-pse <devname> c33-pse-admin-control enable
- After enabling the PSE Admin State, return to the start of the **Check
Power Delivery (PoDL or PoE)** step to recheck the power delivery status.
- **Power Not Delivered**: If the `Power Detection Status` shows something
other than "delivering power" (e.g., `over current`), troubleshoot the
**PSE**. Check for potential issues such as a short circuit in the cable,
insufficient power delivery, or a fault in the PSE itself.
- **Power Delivered but No Link**: If power is being delivered but no link is
established, proceed with further diagnostics by performing **Cable
Diagnostics** or reviewing the **Inspect Link Status and PHY
Configuration** steps to identify any underlying issues with the physical
link or settings.
Cable Diagnostics
~~~~~~~~~~~~~~~~~
Use `ethtool` to test for physical layer issues such as cable faults. The test
results can vary depending on the cable's condition, the technology in use, and
the state of the link partner. The results from the cable test will help in
diagnosing issues like open circuits, shorts, impedance mismatches, and
noise-related problems.
- **Command:** `ethtool --cable-test <interface>`
The following are the typical outputs for **Single-Pair Ethernet (SPE)** and
**Multi-Pair Ethernet (MPE)**:
- **For Single-Pair Ethernet (SPE)**:
- **Expected Output (SPE)**:
.. code-block:: bash
Cable test completed for device eth1.
Pair A, fault length: 25.00m
Pair A code Open Circuit
This indicates an open circuit or cable fault at the reported distance, but
results can be influenced by the link partner's state. Refer to the
**"Troubleshooting Based on Cable Test Results"** section for further
interpretation of these results.
- **For Multi-Pair Ethernet (MPE)**:
- **Expected Output (MPE)**:
.. code-block:: bash
Cable test completed for device eth0.
Pair A code OK
Pair B code OK
Pair C code Open Circuit
Here, Pair C is reported as having an open circuit, while Pairs A and B are
functioning correctly. However, if autonegotiation is in use on Pairs A and
B, the cable test may be disrupted. Refer to the **"Troubleshooting Based on
Cable Test Results"** section for a detailed explanation of these issues and
how to resolve them.
For detailed descriptions of the different possible cable test results, please
refer to the **"Troubleshooting Based on Cable Test Results"** section.
Troubleshooting Based on Cable Test Results
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
After running the cable test, the results can help identify specific issues in
the physical connection. However, it is important to note that **cable testing
results heavily depend on the capabilities and characteristics of both the
local hardware and the link partner**. The accuracy and reliability of the
results can vary significantly between different hardware implementations.
In some cases, this can introduce **blind spots** in the current cable testing
implementation, where certain results may not accurately reflect the actual
physical state of the cable. For example:
- An **Open Circuit** result might not only indicate a damaged or disconnected
cable but also occur if the cable is properly attached to a powered-down link
partner.
- Some PHYs may report a **Short within Pair** if the link partner is in
**forced slave mode**, even though there is no actual short in the cable.
To help users interpret the results more effectively, it could be beneficial to
extend the **kernel UAPI** (User API) to provide additional context or
**possible variants** of issues based on the hardwares characteristics. Since
these quirks are often hardware-specific, the **kernel driver** would be an
ideal source of such information. By providing flags or hints related to
potential false positives for each test result, users would have a better
understanding of what to verify and where to investigate further.
Until such improvements are made, users should be aware of these limitations
and manually verify cable issues as needed. Physical inspections may help
resolve uncertainties related to false positive results.
The results can be one of the following:
- **OK**:
- The cable is functioning correctly, and no issues were detected.
- **Next Steps**: If you are still experiencing issues, it might be related
to higher-layer problems, such as duplex mismatches or speed negotiation,
which are not physical-layer issues.
- **Special Case for `BaseT1` (1000/100/10BaseT1)**: In `BaseT1` systems, an
"OK" result typically also means that the link is up and likely in **slave
mode**, since cable tests usually only pass in this mode. For some
**10BaseT1L** PHYs, an "OK" result may occur even if the cable is too long
for the PHY's configured range (for example, when the range is configured
for short-distance mode).
- **Open Circuit**:
- An **Open Circuit** result typically indicates that the cable is damaged or
disconnected at the reported fault length. Consider these possibilities:
- If the link partner is in **admin down** state or powered off, you might
still get an "Open Circuit" result even if the cable is functional.
- **Next Steps**: Inspect the cable at the fault length for visible damage
or loose connections. Verify the link partner is powered on and in the
correct mode.
- **Short within Pair**:
- A **Short within Pair** indicates an unintended connection within the same
pair of wires, typically caused by physical damage to the cable.
- **Next Steps**: Replace or repair the cable and check for any physical
damage or improperly crimped connectors.
- **Short to Another Pair**:
- A **Short to Another Pair** means the wires from different pairs are
shorted, which could occur due to physical damage or incorrect wiring.
- **Next Steps**: Replace or repair the damaged cable. Inspect the cable for
incorrect terminations or pinched wiring.
- **Impedance Mismatch**:
- **Impedance Mismatch** indicates a reflection caused by an impedance
discontinuity in the cable. This can happen when a part of the cable has
abnormal impedance (e.g., when different cable types are spliced together
or when there is a defect in the cable).
- **Next Steps**: Check the cable quality and ensure consistent impedance
throughout its length. Replace any sections of the cable that do not meet
specifications.
- **Noise**:
- **Noise** means that the Time Domain Reflectometry (TDR) test could not
complete due to excessive noise on the cable, which can be caused by
interference from electromagnetic sources.
- **Next Steps**: Identify and eliminate sources of electromagnetic
interference (EMI) near the cable. Consider using shielded cables or
rerouting the cable away from noise sources.
- **Resolution Not Possible**:
- **Resolution Not Possible** means that the TDR test could not detect the
issue due to the resolution limitations of the test or because the fault is
beyond the distance that the test can measure.
- **Next Steps**: Inspect the cable manually if possible, or use alternative
diagnostic tools that can handle greater distances or higher resolution.
- **Unknown**:
- An **Unknown** result may occur when the test cannot classify the fault or
when a specific issue is outside the scope of the tool's detection
capabilities.
- **Next Steps**: Re-run the test, verify the link partner's state, and inspect
the cable manually if necessary.
Verify Link Partner PHY Configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If the cable test passes but the link is still not functioning correctly, its
essential to verify the configuration of the link partners PHY. Mismatches in
speed, duplex settings, or master-slave roles can cause connection issues.
Autonegotiation Mismatch
^^^^^^^^^^^^^^^^^^^^^^^^
- If both link partners support autonegotiation, ensure that autonegotiation is
enabled on both sides and that all supported link modes are advertised. A
mismatch can lead to connectivity problems or sub optimal performance.
- **Quick Fix:** Reset autonegotiation to the default settings, which will
advertise all default link modes:
.. code-block:: bash
ethtool -s <interface> autoneg on
- **Command to check configuration:** `ethtool <interface>`
- **Expected Output:** Ensure that both sides advertise compatible link modes.
If autonegotiation is off, verify that both link partners are configured for
the same speed and duplex.
The following example shows a case where the local PHY advertises fewer link
modes than it supports. This will reduce the number of overlapping link modes
with the link partner. In the worst case, there will be no common link modes,
and the link will not be created:
.. code-block:: bash
Settings for eth0:
Supported link modes: 1000baseT/Full, 100baseT/Full
Advertised link modes: 1000baseT/Full
Speed: 1000Mb/s
Duplex: Full
Auto-negotiation: on
Combined Mode Mismatch (Autonegotiation on One Side, Forced on the Other)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- One possible issue occurs when one side is using **autonegotiation** (as in
most modern systems), and the other side is set to a **forced link mode**
(e.g., older hardware with single-speed hubs). In such cases, modern PHYs
will attempt to detect the forced mode on the other side. If the link is
established, you may notice:
- **No or empty "Link partner advertised link modes"**.
- **"Link partner advertised auto-negotiation:"** will be **"no"** or not
present.
- This type of detection does not always work reliably:
- Typically, the modern PHY will default to **Half Duplex**, even if the link
partner is actually configured for **Full Duplex**.
- Some PHYs may not work reliably if the link partner switches from one
forced mode to another. In this case, only a down/up cycle may help.
- **Next Steps**: Set both sides to the same fixed speed and duplex mode to
avoid potential detection issues.
.. code-block:: bash
ethtool -s <interface> speed 1000 duplex full autoneg off
Master/Slave Role Mismatch (BaseT1 and 1000BaseT PHYs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- In **BaseT1** systems (e.g., 1000BaseT1, 100BaseT1), link establishment
requires that one device is configured as **master** and the other as
**slave**. A mismatch in this master-slave configuration can prevent the link
from being established. However, **1000BaseT** also supports configurable
master/slave roles and can face similar issues.
- **Role Preference in 1000BaseT**: The **1000BaseT** specification allows link
partners to negotiate master-slave roles or role preferences during
autonegotiation. Some PHYs have hardware limitations or bugs that prevent
them from functioning properly in certain roles. In such cases, drivers may
force these PHYs into a specific role (e.g., **forced master** or **forced
slave**) or try a weaker option by setting preferences. If both link partners
have the same issue and are forced into the same mode (e.g., both forced into
master mode), they will not be able to establish a link.
- **Next Steps**: Ensure that one side is configured as **master** and the
other as **slave** to avoid this issue, particularly when hardware
limitations are involved, or try the weaker **preferred** option instead of
**forced**. Check for any driver-related restrictions or forced modes.
- **Command to force master/slave mode**:
.. code-block:: bash
ethtool -s <interface> master-slave forced-master
or:
.. code-block:: bash
ethtool -s <interface> master-slave forced-master speed 1000 duplex full autoneg off
- **Check the current master/slave status**:
.. code-block:: bash
ethtool <interface>
Example Output:
.. code-block:: bash
master-slave cfg: forced-master
master-slave status: master
- **Hardware Bugs and Driver Forcing**: If a known hardware issue forces the
PHY into a specific mode, its essential to check the driver source code or
hardware documentation for details. Ensure that the roles are compatible
across both link partners, and if both PHYs are forced into the same mode,
adjust one side accordingly to resolve the mismatch.
Monitor Link Resets and Speed Drops
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If the link is unstable, showing frequent resets or speed drops, this may
indicate issues with the cable, PHY configuration, or environmental factors.
While there is still no completely unified way in Linux to directly monitor
downshift events or link speed changes via user space tools, both the Linux
kernel logs and `ethtool` can provide valuable insights, especially if the
driver supports reporting such events.
- **Monitor Kernel Logs for Link Resets and Speed Drops**:
- The Linux kernel will print link status changes, including downshift
events, in the system logs. These messages typically include speed changes,
duplex mode, and downshifted link speed (if the driver supports it).
- **Command to monitor kernel logs in real-time:**
.. code-block:: bash
dmesg -w | grep "Link is Up\|Link is Down"
- Example Output (if a downshift occurs):
.. code-block:: bash
eth0: Link is Up - 100Mbps/Full (downshifted) - flow control rx/tx
eth0: Link is Down
This indicates that the link has been established but has downshifted from
a higher speed.
- **Note**: Not all drivers or PHYs support downshift reporting, so you may
not see this information for all devices.
- **Monitor Link Down Events Using `ethtool`**:
- Starting with the latest kernel and `ethtool` versions, you can track
**Link Down Events** using the `ethtool -I` command. This will provide
counters for link drops, helping to diagnose link instability issues if
supported by the driver.
- **Command to monitor link down events:**
.. code-block:: bash
ethtool -I <interface>
- Example Output (if supported):
.. code-block:: bash
PSE attributes for eth1:
Link Down Events: 5
This indicates that the link has dropped 5 times. Frequent link down events
may indicate cable or environmental issues that require further
investigation.
- **Check Link Status and Speed**:
- Even though downshift counts or events are not easily tracked, you can
still use `ethtool` to manually check the current link speed and status.
- **Command:** `ethtool <interface>`
- **Expected Output:**
.. code-block:: bash
Speed: 1000Mb/s
Duplex: Full
Auto-negotiation: on
Link detected: yes
Any inconsistencies in the expected speed or duplex setting could indicate
an issue.
- **Disable Energy-Efficient Ethernet (EEE) for Diagnostics**:
- **EEE** (Energy-Efficient Ethernet) can be a source of link instability due
to transitions in and out of low-power states. For diagnostic purposes, it
may be useful to **temporarily** disable EEE to determine if it is
contributing to link instability. This is **not a generic recommendation**
for disabling power management.
- **Next Steps**: Disable EEE and monitor if the link becomes stable. If
disabling EEE resolves the issue, report the bug so that the driver can be
fixed.
- **Command:**
.. code-block:: bash
ethtool --set-eee <interface> eee off
- **Important**: If disabling EEE resolves the instability, the issue should
be reported to the maintainers as a bug, and the driver should be corrected
to handle EEE properly without causing instability. Disabling EEE
permanently should not be seen as a solution.
- **Monitor Error Counters**:
- While some NIC drivers and PHYs provide error counters, there is no unified
set of PHY-specific counters across all hardware. Additionally, not all
PHYs provide useful information related to errors like CRC errors, frame
drops, or link flaps. Therefore, this step is dependent on the specific
hardware and driver support.
- **Next Steps**: Use `ethtool -S <interface>` to check if your driver
provides useful error counters. In some cases, counters may provide
information about errors like link flaps or physical layer problems (e.g.,
excessive CRC errors), but results can vary significantly depending on the
PHY.
- **Command:** `ethtool -S <interface>`
- **Example Output (if supported)**:
.. code-block:: bash
rx_crc_errors: 123
tx_errors: 45
rx_frame_errors: 78
- **Note**: If no meaningful error counters are available or if counters are
not supported, you may need to rely on physical inspections (e.g., cable
condition) or kernel log messages (e.g., link up/down events) to further
diagnose the issue.
When All Else Fails...
~~~~~~~~~~~~~~~~~~~~~~
So you've checked the cables, monitored the logs, disabled EEE, and still...
nothing? Dont worry, youre not alone. Sometimes, Ethernet gremlins just dont
want to cooperate.
But before you throw in the towel (or the Ethernet cable), take a deep breath.
Its always possible that:
1. Your PHY has a unique, undocumented personality.
2. The problem is lying dormant, waiting for just the right moment to magically
resolve itself (hey, it happens!).
3. Or, it could be that the ultimate solution simply hasnt been invented yet.
If none of the above bring you comfort, theres one final step: contribute! If
you've uncovered new or unusual issues, or have creative diagnostic methods,
feel free to share your findings and extend this documentation. Together, we
can hunt down every elusive network issue - one twisted pair at a time.
Remember: sometimes the solution is just a reboot away, but if not, its time to
dig deeper - or report that bug!

View File

@ -236,6 +236,7 @@ Userspace to kernel:
``ETHTOOL_MSG_MM_GET`` get MAC merge layer state ``ETHTOOL_MSG_MM_GET`` get MAC merge layer state
``ETHTOOL_MSG_MM_SET`` set MAC merge layer parameters ``ETHTOOL_MSG_MM_SET`` set MAC merge layer parameters
``ETHTOOL_MSG_MODULE_FW_FLASH_ACT`` flash transceiver module firmware ``ETHTOOL_MSG_MODULE_FW_FLASH_ACT`` flash transceiver module firmware
``ETHTOOL_MSG_PHY_GET`` get Ethernet PHY information
===================================== ================================= ===================================== =================================
Kernel to userspace: Kernel to userspace:
@ -283,6 +284,8 @@ Kernel to userspace:
``ETHTOOL_MSG_PLCA_NTF`` PLCA RS parameters ``ETHTOOL_MSG_PLCA_NTF`` PLCA RS parameters
``ETHTOOL_MSG_MM_GET_REPLY`` MAC merge layer status ``ETHTOOL_MSG_MM_GET_REPLY`` MAC merge layer status
``ETHTOOL_MSG_MODULE_FW_FLASH_NTF`` transceiver module flash updates ``ETHTOOL_MSG_MODULE_FW_FLASH_NTF`` transceiver module flash updates
``ETHTOOL_MSG_PHY_GET_REPLY`` Ethernet PHY information
``ETHTOOL_MSG_PHY_NTF`` Ethernet PHY information change
======================================== ================================= ======================================== =================================
``GET`` requests are sent by userspace applications to retrieve device ``GET`` requests are sent by userspace applications to retrieve device

View File

@ -14,6 +14,7 @@ Contents:
can can
can_ucan_protocol can_ucan_protocol
device_drivers/index device_drivers/index
diagnostic/index
dsa/index dsa/index
devlink/index devlink/index
caif/index caif/index

View File

@ -104,6 +104,9 @@ Driver Support
.. kernel-doc:: include/linux/netdevice.h .. kernel-doc:: include/linux/netdevice.h
:internal: :internal:
.. kernel-doc:: include/net/net_shaper.h
:internal:
PHY Support PHY Support
----------- -----------

View File

@ -192,6 +192,33 @@ is reused to control the delay of the timer, while
``napi_defer_hard_irqs`` controls the number of consecutive empty polls ``napi_defer_hard_irqs`` controls the number of consecutive empty polls
before NAPI gives up and goes back to using hardware IRQs. before NAPI gives up and goes back to using hardware IRQs.
The above parameters can also be set on a per-NAPI basis using netlink via
netdev-genl. When used with netlink and configured on a per-NAPI basis, the
parameters mentioned above use hyphens instead of underscores:
``gro-flush-timeout`` and ``napi-defer-hard-irqs``.
Per-NAPI configuration can be done programmatically in a user application
or by using a script included in the kernel source tree:
``tools/net/ynl/cli.py``.
For example, using the script:
.. code-block:: bash
$ kernel-source/tools/net/ynl/cli.py \
--spec Documentation/netlink/specs/netdev.yaml \
--do napi-set \
--json='{"id": 345,
"defer-hard-irqs": 111,
"gro-flush-timeout": 11111}'
Similarly, the parameter ``irq-suspend-timeout`` can be set using netlink
via netdev-genl. There is no global sysfs parameter for this value.
``irq-suspend-timeout`` is used to determine how long an application can
completely suspend IRQs. It is used in combination with SO_PREFER_BUSY_POLL,
which can be set on a per-epoll context basis with ``EPIOCSPARAMS`` ioctl.
.. _poll: .. _poll:
Busy polling Busy polling
@ -207,6 +234,46 @@ selected sockets or using the global ``net.core.busy_poll`` and
``net.core.busy_read`` sysctls. An io_uring API for NAPI busy polling ``net.core.busy_read`` sysctls. An io_uring API for NAPI busy polling
also exists. also exists.
epoll-based busy polling
------------------------
It is possible to trigger packet processing directly from calls to
``epoll_wait``. In order to use this feature, a user application must ensure
all file descriptors which are added to an epoll context have the same NAPI ID.
If the application uses a dedicated acceptor thread, the application can obtain
the NAPI ID of the incoming connection using SO_INCOMING_NAPI_ID and then
distribute that file descriptor to a worker thread. The worker thread would add
the file descriptor to its epoll context. This would ensure each worker thread
has an epoll context with FDs that have the same NAPI ID.
Alternatively, if the application uses SO_REUSEPORT, a bpf or ebpf program can
be inserted to distribute incoming connections to threads such that each thread
is only given incoming connections with the same NAPI ID. Care must be taken to
carefully handle cases where a system may have multiple NICs.
In order to enable busy polling, there are two choices:
1. ``/proc/sys/net/core/busy_poll`` can be set with a time in useconds to busy
loop waiting for events. This is a system-wide setting and will cause all
epoll-based applications to busy poll when they call epoll_wait. This may
not be desirable as many applications may not have the need to busy poll.
2. Applications using recent kernels can issue an ioctl on the epoll context
file descriptor to set (``EPIOCSPARAMS``) or get (``EPIOCGPARAMS``) ``struct
epoll_params``:, which user programs can define as follows:
.. code-block:: c
struct epoll_params {
uint32_t busy_poll_usecs;
uint16_t busy_poll_budget;
uint8_t prefer_busy_poll;
/* pad the struct to a multiple of 64bits */
uint8_t __pad;
};
IRQ mitigation IRQ mitigation
--------------- ---------------
@ -222,12 +289,111 @@ Such applications can pledge to the kernel that they will perform a busy
polling operation periodically, and the driver should keep the device IRQs polling operation periodically, and the driver should keep the device IRQs
permanently masked. This mode is enabled by using the ``SO_PREFER_BUSY_POLL`` permanently masked. This mode is enabled by using the ``SO_PREFER_BUSY_POLL``
socket option. To avoid system misbehavior the pledge is revoked socket option. To avoid system misbehavior the pledge is revoked
if ``gro_flush_timeout`` passes without any busy poll call. if ``gro_flush_timeout`` passes without any busy poll call. For epoll-based
busy polling applications, the ``prefer_busy_poll`` field of ``struct
epoll_params`` can be set to 1 and the ``EPIOCSPARAMS`` ioctl can be issued to
enable this mode. See the above section for more details.
The NAPI budget for busy polling is lower than the default (which makes The NAPI budget for busy polling is lower than the default (which makes
sense given the low latency intention of normal busy polling). This is sense given the low latency intention of normal busy polling). This is
not the case with IRQ mitigation, however, so the budget can be adjusted not the case with IRQ mitigation, however, so the budget can be adjusted
with the ``SO_BUSY_POLL_BUDGET`` socket option. with the ``SO_BUSY_POLL_BUDGET`` socket option. For epoll-based busy polling
applications, the ``busy_poll_budget`` field can be adjusted to the desired value
in ``struct epoll_params`` and set on a specific epoll context using the ``EPIOCSPARAMS``
ioctl. See the above section for more details.
It is important to note that choosing a large value for ``gro_flush_timeout``
will defer IRQs to allow for better batch processing, but will induce latency
when the system is not fully loaded. Choosing a small value for
``gro_flush_timeout`` can cause interference of the user application which is
attempting to busy poll by device IRQs and softirq processing. This value
should be chosen carefully with these tradeoffs in mind. epoll-based busy
polling applications may be able to mitigate how much user processing happens
by choosing an appropriate value for ``maxevents``.
Users may want to consider an alternate approach, IRQ suspension, to help deal
with these tradeoffs.
IRQ suspension
--------------
IRQ suspension is a mechanism wherein device IRQs are masked while epoll
triggers NAPI packet processing.
While application calls to epoll_wait successfully retrieve events, the kernel will
defer the IRQ suspension timer. If the kernel does not retrieve any events
while busy polling (for example, because network traffic levels subsided), IRQ
suspension is disabled and the IRQ mitigation strategies described above are
engaged.
This allows users to balance CPU consumption with network processing
efficiency.
To use this mechanism:
1. The per-NAPI config parameter ``irq-suspend-timeout`` should be set to the
maximum time (in nanoseconds) the application can have its IRQs
suspended. This is done using netlink, as described above. This timeout
serves as a safety mechanism to restart IRQ driver interrupt processing if
the application has stalled. This value should be chosen so that it covers
the amount of time the user application needs to process data from its
call to epoll_wait, noting that applications can control how much data
they retrieve by setting ``max_events`` when calling epoll_wait.
2. The sysfs parameter or per-NAPI config parameters ``gro_flush_timeout``
and ``napi_defer_hard_irqs`` can be set to low values. They will be used
to defer IRQs after busy poll has found no data.
3. The ``prefer_busy_poll`` flag must be set to true. This can be done using
the ``EPIOCSPARAMS`` ioctl as described above.
4. The application uses epoll as described above to trigger NAPI packet
processing.
As mentioned above, as long as subsequent calls to epoll_wait return events to
userland, the ``irq-suspend-timeout`` is deferred and IRQs are disabled. This
allows the application to process data without interference.
Once a call to epoll_wait results in no events being found, IRQ suspension is
automatically disabled and the ``gro_flush_timeout`` and
``napi_defer_hard_irqs`` mitigation mechanisms take over.
It is expected that ``irq-suspend-timeout`` will be set to a value much larger
than ``gro_flush_timeout`` as ``irq-suspend-timeout`` should suspend IRQs for
the duration of one userland processing cycle.
While it is not stricly necessary to use ``napi_defer_hard_irqs`` and
``gro_flush_timeout`` to use IRQ suspension, their use is strongly
recommended.
IRQ suspension causes the system to alternate between polling mode and
irq-driven packet delivery. During busy periods, ``irq-suspend-timeout``
overrides ``gro_flush_timeout`` and keeps the system busy polling, but when
epoll finds no events, the setting of ``gro_flush_timeout`` and
``napi_defer_hard_irqs`` determine the next step.
There are essentially three possible loops for network processing and
packet delivery:
1) hardirq -> softirq -> napi poll; basic interrupt delivery
2) timer -> softirq -> napi poll; deferred irq processing
3) epoll -> busy-poll -> napi poll; busy looping
Loop 2 can take control from Loop 1, if ``gro_flush_timeout`` and
``napi_defer_hard_irqs`` are set.
If ``gro_flush_timeout`` and ``napi_defer_hard_irqs`` are set, Loops 2
and 3 "wrestle" with each other for control.
During busy periods, ``irq-suspend-timeout`` is used as timer in Loop 2,
which essentially tilts network processing in favour of Loop 3.
If ``gro_flush_timeout`` and ``napi_defer_hard_irqs`` are not set, Loop 3
cannot take control from Loop 1.
Therefore, setting ``gro_flush_timeout`` and ``napi_defer_hard_irqs`` is
the recommended usage, because otherwise setting ``irq-suspend-timeout``
might not have any discernible effect.
.. _threaded: .. _threaded:

View File

@ -5,46 +5,48 @@
inet_connection_sock struct fast path usage breakdown inet_connection_sock struct fast path usage breakdown
===================================================== =====================================================
=================================== ====================== =================== =================== ========================================================================================================================================================
Type Name fastpath_tx_access fastpath_rx_access comment Type Name fastpath_tx_access fastpath_rx_access comment
..struct ..inet_connection_sock =================================== ====================== =================== =================== ========================================================================================================================================================
struct_inet_sock icsk_inet read_mostly read_mostly tcp_init_buffer_space,tcp_init_transfer,tcp_finish_connect,tcp_connect,tcp_send_rcvq,tcp_send_syn_data struct inet_sock icsk_inet read_mostly read_mostly tcp_init_buffer_space,tcp_init_transfer,tcp_finish_connect,tcp_connect,tcp_send_rcvq,tcp_send_syn_data
struct_request_sock_queue icsk_accept_queue - - struct request_sock_queue icsk_accept_queue
struct_inet_bind_bucket icsk_bind_hash read_mostly - tcp_set_state struct inet_bind_bucket icsk_bind_hash read_mostly tcp_set_state
struct_inet_bind2_bucket icsk_bind2_hash read_mostly - tcp_set_state,inet_put_port struct inet_bind2_bucket icsk_bind2_hash read_mostly tcp_set_state,inet_put_port
unsigned_long icsk_timeout read_mostly - inet_csk_reset_xmit_timer,tcp_connect unsigned_long icsk_timeout read_mostly inet_csk_reset_xmit_timer,tcp_connect
struct_timer_list icsk_retransmit_timer read_mostly - inet_csk_reset_xmit_timer,tcp_connect struct timer_list icsk_retransmit_timer read_mostly inet_csk_reset_xmit_timer,tcp_connect
struct_timer_list icsk_delack_timer read_mostly - inet_csk_reset_xmit_timer,tcp_connect struct timer_list icsk_delack_timer read_mostly inet_csk_reset_xmit_timer,tcp_connect
u32 icsk_rto read_write - tcp_cwnd_validate,tcp_schedule_loss_probe,tcp_connect_init,tcp_connect,tcp_write_xmit,tcp_push_one u32 icsk_rto read_write tcp_cwnd_validate,tcp_schedule_loss_probe,tcp_connect_init,tcp_connect,tcp_write_xmit,tcp_push_one
u32 icsk_rto_min - - u32 icsk_rto_min
u32 icsk_delack_max - - u32 icsk_delack_max
u32 icsk_pmtu_cookie read_write - tcp_sync_mss,tcp_current_mss,tcp_send_syn_data,tcp_connect_init,tcp_connect u32 icsk_pmtu_cookie read_write tcp_sync_mss,tcp_current_mss,tcp_send_syn_data,tcp_connect_init,tcp_connect
struct_tcp_congestion_ops icsk_ca_ops read_write - tcp_cwnd_validate,tcp_tso_segs,tcp_ca_dst_init,tcp_connect_init,tcp_connect,tcp_write_xmit struct tcp_congestion_ops icsk_ca_ops read_write tcp_cwnd_validate,tcp_tso_segs,tcp_ca_dst_init,tcp_connect_init,tcp_connect,tcp_write_xmit
struct_inet_connection_sock_af_ops icsk_af_ops read_mostly - tcp_finish_connect,tcp_send_syn_data,tcp_mtup_init,tcp_mtu_check_reprobe,tcp_mtu_probe,tcp_connect_init,tcp_connect,__tcp_transmit_skb struct inet_connection_sock_af_ops icsk_af_ops read_mostly tcp_finish_connect,tcp_send_syn_data,tcp_mtup_init,tcp_mtu_check_reprobe,tcp_mtu_probe,tcp_connect_init,tcp_connect,__tcp_transmit_skb
struct_tcp_ulp_ops* icsk_ulp_ops - - struct tcp_ulp_ops* icsk_ulp_ops
void* icsk_ulp_data - - void* icsk_ulp_data
u8:5 icsk_ca_state read_write - tcp_cwnd_application_limited,tcp_set_ca_state,tcp_enter_cwr,tcp_tso_should_defer,tcp_mtu_probe,tcp_schedule_loss_probe,tcp_write_xmit,__tcp_transmit_skb u8:5 icsk_ca_state read_write tcp_cwnd_application_limited,tcp_set_ca_state,tcp_enter_cwr,tcp_tso_should_defer,tcp_mtu_probe,tcp_schedule_loss_probe,tcp_write_xmit,__tcp_transmit_skb
u8:1 icsk_ca_initialized read_write - tcp_init_transfer,tcp_init_congestion_control,tcp_init_transfer,tcp_finish_connect,tcp_connect u8:1 icsk_ca_initialized read_write tcp_init_transfer,tcp_init_congestion_control,tcp_init_transfer,tcp_finish_connect,tcp_connect
u8:1 icsk_ca_setsockopt - - u8:1 icsk_ca_setsockopt
u8:1 icsk_ca_dst_locked write_mostly - tcp_ca_dst_init,tcp_connect_init,tcp_connect u8:1 icsk_ca_dst_locked write_mostly tcp_ca_dst_init,tcp_connect_init,tcp_connect
u8 icsk_retransmits write_mostly - tcp_connect_init,tcp_connect u8 icsk_retransmits write_mostly tcp_connect_init,tcp_connect
u8 icsk_pending read_write - inet_csk_reset_xmit_timer,tcp_connect,tcp_check_probe_timer,__tcp_push_pending_frames,tcp_rearm_rto,tcp_event_new_data_sent,tcp_event_new_data_sent u8 icsk_pending read_write inet_csk_reset_xmit_timer,tcp_connect,tcp_check_probe_timer,__tcp_push_pending_frames,tcp_rearm_rto,tcp_event_new_data_sent,tcp_event_new_data_sent
u8 icsk_backoff write_mostly - tcp_write_queue_purge,tcp_connect_init u8 icsk_backoff write_mostly tcp_write_queue_purge,tcp_connect_init
u8 icsk_syn_retries - - u8 icsk_syn_retries
u8 icsk_probes_out - - u8 icsk_probes_out
u16 icsk_ext_hdr_len read_mostly - __tcp_mtu_to_mss,tcp_mtu_to_rss,tcp_mtu_probe,tcp_write_xmit,tcp_mtu_to_mss, u16 icsk_ext_hdr_len read_mostly __tcp_mtu_to_mss,tcp_mtu_to_rss,tcp_mtu_probe,tcp_write_xmit,tcp_mtu_to_mss,
struct_icsk_ack_u8 pending read_write read_write inet_csk_ack_scheduled,__tcp_cleanup_rbuf,tcp_cleanup_rbuf,inet_csk_clear_xmit_timer,tcp_event_ack-sent,inet_csk_reset_xmit_timer struct icsk_ack_u8 pending read_write read_write inet_csk_ack_scheduled,__tcp_cleanup_rbuf,tcp_cleanup_rbuf,inet_csk_clear_xmit_timer,tcp_event_ack-sent,inet_csk_reset_xmit_timer
struct_icsk_ack_u8 quick read_write write_mostly tcp_dec_quickack_mode,tcp_event_ack_sent,__tcp_transmit_skb,__tcp_select_window,__tcp_cleanup_rbuf struct icsk_ack_u8 quick read_write write_mostly tcp_dec_quickack_mode,tcp_event_ack_sent,__tcp_transmit_skb,__tcp_select_window,__tcp_cleanup_rbuf
struct_icsk_ack_u8 pingpong - - struct icsk_ack_u8 pingpong
struct_icsk_ack_u8 retry write_mostly read_write inet_csk_clear_xmit_timer,tcp_rearm_rto,tcp_event_new_data_sent,tcp_write_xmit,__tcp_send_ack,tcp_send_ack, struct icsk_ack_u8 retry write_mostly read_write inet_csk_clear_xmit_timer,tcp_rearm_rto,tcp_event_new_data_sent,tcp_write_xmit,__tcp_send_ack,tcp_send_ack,
struct_icsk_ack_u8 ato read_mostly write_mostly tcp_dec_quickack_mode,tcp_event_ack_sent,__tcp_transmit_skb,__tcp_send_ack,tcp_send_ack struct icsk_ack_u8 ato read_mostly write_mostly tcp_dec_quickack_mode,tcp_event_ack_sent,__tcp_transmit_skb,__tcp_send_ack,tcp_send_ack
struct_icsk_ack_unsigned_long timeout read_write read_write inet_csk_reset_xmit_timer,tcp_connect struct icsk_ack_unsigned_long timeout read_write read_write inet_csk_reset_xmit_timer,tcp_connect
struct_icsk_ack_u32 lrcvtime read_write - tcp_finish_connect,tcp_connect,tcp_event_data_sent,__tcp_transmit_skb struct icsk_ack_u32 lrcvtime read_write tcp_finish_connect,tcp_connect,tcp_event_data_sent,__tcp_transmit_skb
struct_icsk_ack_u16 rcv_mss write_mostly read_mostly __tcp_select_window,__tcp_cleanup_rbuf,tcp_initialize_rcv_mss,tcp_connect_init struct icsk_ack_u16 rcv_mss write_mostly read_mostly __tcp_select_window,__tcp_cleanup_rbuf,tcp_initialize_rcv_mss,tcp_connect_init
struct_icsk_mtup_int search_high read_write - tcp_mtup_init,tcp_sync_mss,tcp_connect_init,tcp_mtu_check_reprobe,tcp_write_xmit struct icsk_mtup_int search_high read_write tcp_mtup_init,tcp_sync_mss,tcp_connect_init,tcp_mtu_check_reprobe,tcp_write_xmit
struct_icsk_mtup_int search_low read_write - tcp_mtu_probe,tcp_mtu_check_reprobe,tcp_write_xmit,tcp_sync_mss,tcp_connect_init,tcp_mtup_init struct icsk_mtup_int search_low read_write tcp_mtu_probe,tcp_mtu_check_reprobe,tcp_write_xmit,tcp_sync_mss,tcp_connect_init,tcp_mtup_init
struct_icsk_mtup_u32:31 probe_size read_write - tcp_mtup_init,tcp_connect_init,__tcp_transmit_skb struct icsk_mtup_u32:31 probe_size read_write tcp_mtup_init,tcp_connect_init,__tcp_transmit_skb
struct_icsk_mtup_u32:1 enabled read_write - tcp_mtup_init,tcp_sync_mss,tcp_connect_init,tcp_mtu_probe,tcp_write_xmit struct icsk_mtup_u32:1 enabled read_write tcp_mtup_init,tcp_sync_mss,tcp_connect_init,tcp_mtu_probe,tcp_write_xmit
struct_icsk_mtup_u32 probe_timestamp read_write - tcp_mtup_init,tcp_connect_init,tcp_mtu_check_reprobe,tcp_mtu_probe struct icsk_mtup_u32 probe_timestamp read_write tcp_mtup_init,tcp_connect_init,tcp_mtu_check_reprobe,tcp_mtu_probe
u32 icsk_probes_tstamp - - u32 icsk_probes_tstamp
u32 icsk_user_timeout - - u32 icsk_user_timeout
u64[104/sizeof(u64)] icsk_ca_priv - - u64[104/sizeof(u64)] icsk_ca_priv
=================================== ====================== =================== =================== ========================================================================================================================================================

View File

@ -5,40 +5,42 @@
inet_sock struct fast path usage breakdown inet_sock struct fast path usage breakdown
========================================== ==========================================
======================= ===================== =================== =================== ======================================================================================================
Type Name fastpath_tx_access fastpath_rx_access comment Type Name fastpath_tx_access fastpath_rx_access comment
..struct ..inet_sock ======================= ===================== =================== =================== ======================================================================================================
struct_sock sk read_mostly read_mostly tcp_init_buffer_space,tcp_init_transfer,tcp_finish_connect,tcp_connect,tcp_send_rcvq,tcp_send_syn_data struct sock sk read_mostly read_mostly tcp_init_buffer_space,tcp_init_transfer,tcp_finish_connect,tcp_connect,tcp_send_rcvq,tcp_send_syn_data
struct_ipv6_pinfo* pinet6 - - struct ipv6_pinfo* pinet6
be16 inet_sport read_mostly - __tcp_transmit_skb be16 inet_sport read_mostly __tcp_transmit_skb
be32 inet_daddr read_mostly - ip_select_ident_segs be32 inet_daddr read_mostly ip_select_ident_segs
be32 inet_rcv_saddr - - be32 inet_rcv_saddr
be16 inet_dport read_mostly - __tcp_transmit_skb be16 inet_dport read_mostly __tcp_transmit_skb
u16 inet_num - - u16 inet_num
be32 inet_saddr - - be32 inet_saddr
s16 uc_ttl read_mostly - __ip_queue_xmit/ip_select_ttl s16 uc_ttl read_mostly __ip_queue_xmit/ip_select_ttl
u16 cmsg_flags - - u16 cmsg_flags
struct_ip_options_rcu* inet_opt read_mostly - __ip_queue_xmit struct ip_options_rcu* inet_opt read_mostly __ip_queue_xmit
u16 inet_id read_mostly - ip_select_ident_segs u16 inet_id read_mostly ip_select_ident_segs
u8 tos read_mostly - ip_queue_xmit u8 tos read_mostly ip_queue_xmit
u8 min_ttl - - u8 min_ttl
u8 mc_ttl - - u8 mc_ttl
u8 pmtudisc - - u8 pmtudisc
u8:1 recverr - - u8:1 recverr
u8:1 is_icsk - - u8:1 is_icsk
u8:1 freebind - - u8:1 freebind
u8:1 hdrincl - - u8:1 hdrincl
u8:1 mc_loop - - u8:1 mc_loop
u8:1 transparent - - u8:1 transparent
u8:1 mc_all - - u8:1 mc_all
u8:1 nodefrag - - u8:1 nodefrag
u8:1 bind_address_no_port - - u8:1 bind_address_no_port
u8:1 recverr_rfc4884 - - u8:1 recverr_rfc4884
u8:1 defer_connect read_mostly - tcp_sendmsg_fastopen u8:1 defer_connect read_mostly tcp_sendmsg_fastopen
u8 rcv_tos - - u8 rcv_tos
u8 convert_csum - - u8 convert_csum
int uc_index - - int uc_index
int mc_index - - int mc_index
be32 mc_addr - - be32 mc_addr
struct_ip_mc_socklist* mc_list - - struct ip_mc_socklist* mc_list
struct_inet_cork_full cork read_mostly - __tcp_transmit_skb struct inet_cork_full cork read_mostly __tcp_transmit_skb
struct local_port_range - - struct local_port_range
======================= ===================== =================== =================== ======================================================================================================

View File

@ -5,39 +5,40 @@
net_device struct fast path usage breakdown net_device struct fast path usage breakdown
=========================================== ===========================================
=================================== =========================== =================== =================== ===================================================================================
Type Name fastpath_tx_access fastpath_rx_access Comments Type Name fastpath_tx_access fastpath_rx_access Comments
..struct ..net_device =================================== =========================== =================== =================== ===================================================================================
unsigned_long:32 priv_flags read_mostly - __dev_queue_xmit(tx) unsigned_long:32 priv_flags read_mostly __dev_queue_xmit(tx)
unsigned_long:1 lltx read_mostly - HARD_TX_LOCK,HARD_TX_TRYLOCK,HARD_TX_UNLOCK(tx) unsigned_long:1 lltx read_mostly HARD_TX_LOCK,HARD_TX_TRYLOCK,HARD_TX_UNLOCK(tx)
char name[16] - - char name[16]
struct_netdev_name_node* name_node struct netdev_name_node* name_node
struct_dev_ifalias* ifalias struct dev_ifalias* ifalias
unsigned_long mem_end unsigned_long mem_end
unsigned_long mem_start unsigned_long mem_start
unsigned_long base_addr unsigned_long base_addr
unsigned_long state read_mostly read_mostly netif_running(dev) unsigned_long state read_mostly read_mostly netif_running(dev)
struct_list_head dev_list struct list_head dev_list
struct_list_head napi_list struct list_head napi_list
struct_list_head unreg_list struct list_head unreg_list
struct_list_head close_list struct list_head close_list
struct_list_head ptype_all read_mostly - dev_nit_active(tx) struct list_head ptype_all read_mostly dev_nit_active(tx)
struct_list_head ptype_specific read_mostly deliver_ptype_list_skb/__netif_receive_skb_core(rx) struct list_head ptype_specific read_mostly deliver_ptype_list_skb/__netif_receive_skb_core(rx)
struct adj_list struct adj_list
unsigned_int flags read_mostly read_mostly __dev_queue_xmit,__dev_xmit_skb,ip6_output,__ip6_finish_output(tx);ip6_rcv_core(rx) unsigned_int flags read_mostly read_mostly __dev_queue_xmit,__dev_xmit_skb,ip6_output,__ip6_finish_output(tx);ip6_rcv_core(rx)
xdp_features_t xdp_features xdp_features_t xdp_features
struct_net_device_ops* netdev_ops read_mostly - netdev_core_pick_tx,netdev_start_xmit(tx) struct net_device_ops* netdev_ops read_mostly netdev_core_pick_tx,netdev_start_xmit(tx)
struct_xdp_metadata_ops* xdp_metadata_ops struct xdp_metadata_ops* xdp_metadata_ops
int ifindex - read_mostly ip6_rcv_core int ifindex read_mostly ip6_rcv_core
unsigned_short gflags unsigned_short gflags
unsigned_short hard_header_len read_mostly read_mostly ip6_xmit(tx);gro_list_prepare(rx) unsigned_short hard_header_len read_mostly read_mostly ip6_xmit(tx);gro_list_prepare(rx)
unsigned_int mtu read_mostly - ip_finish_output2 unsigned_int mtu read_mostly ip_finish_output2
unsigned_short needed_headroom read_mostly - LL_RESERVED_SPACE/ip_finish_output2 unsigned_short needed_headroom read_mostly LL_RESERVED_SPACE/ip_finish_output2
unsigned_short needed_tailroom unsigned_short needed_tailroom
netdev_features_t features read_mostly read_mostly HARD_TX_LOCK,netif_skb_features,sk_setup_caps(tx);netif_elide_gro(rx) netdev_features_t features read_mostly read_mostly HARD_TX_LOCK,netif_skb_features,sk_setup_caps(tx);netif_elide_gro(rx)
netdev_features_t hw_features netdev_features_t hw_features
netdev_features_t wanted_features netdev_features_t wanted_features
netdev_features_t vlan_features netdev_features_t vlan_features
netdev_features_t hw_enc_features - - netif_skb_features netdev_features_t hw_enc_features netif_skb_features
netdev_features_t mpls_features netdev_features_t mpls_features
netdev_features_t gso_partial_features read_mostly gso_features_check netdev_features_t gso_partial_features read_mostly gso_features_check
unsigned_int min_mtu unsigned_int min_mtu
@ -46,18 +47,17 @@ unsigned_short type
unsigned_char min_header_len unsigned_char min_header_len
unsigned_char name_assign_type unsigned_char name_assign_type
int group int group
struct_net_device_stats stats struct net_device_stats stats
struct_net_device_core_stats* core_stats struct net_device_core_stats* core_stats
atomic_t carrier_up_count atomic_t carrier_up_count
atomic_t carrier_down_count atomic_t carrier_down_count
struct_iw_handler_def* wireless_handlers struct iw_handler_def* wireless_handlers
struct_iw_public_data* wireless_data struct ethtool_ops* ethtool_ops
struct_ethtool_ops* ethtool_ops struct l3mdev_ops* l3mdev_ops
struct_l3mdev_ops* l3mdev_ops struct ndisc_ops* ndisc_ops
struct_ndisc_ops* ndisc_ops struct xfrmdev_ops* xfrmdev_ops
struct_xfrmdev_ops* xfrmdev_ops struct tlsdev_ops* tlsdev_ops
struct_tlsdev_ops* tlsdev_ops struct header_ops* header_ops read_mostly ip_finish_output2,ip6_finish_output2(tx)
struct_header_ops* header_ops read_mostly - ip_finish_output2,ip6_finish_output2(tx)
unsigned_char operstate unsigned_char operstate
unsigned_char link_mode unsigned_char link_mode
unsigned_char if_port unsigned_char if_port
@ -73,113 +73,120 @@ unsigned_short dev_id
unsigned_short dev_port unsigned_short dev_port
spinlock_t addr_list_lock spinlock_t addr_list_lock
int irq int irq
struct_netdev_hw_addr_list uc struct netdev_hw_addr_list uc
struct_netdev_hw_addr_list mc struct netdev_hw_addr_list mc
struct_netdev_hw_addr_list dev_addrs struct netdev_hw_addr_list dev_addrs
struct_kset* queues_kset struct kset* queues_kset
struct_list_head unlink_list struct list_head unlink_list
unsigned_int promiscuity unsigned_int promiscuity
unsigned_int allmulti unsigned_int allmulti
bool uc_promisc bool uc_promisc
unsigned_char nested_level unsigned_char nested_level
struct_in_device* ip_ptr read_mostly read_mostly __in_dev_get struct in_device* ip_ptr read_mostly read_mostly __in_dev_get
struct_inet6_dev* ip6_ptr read_mostly read_mostly __in6_dev_get struct hlist_head fib_nh_head
struct_vlan_info* vlan_info struct inet6_dev* ip6_ptr read_mostly read_mostly __in6_dev_get
struct_dsa_port* dsa_ptr struct vlan_info* vlan_info
struct_tipc_bearer* tipc_ptr struct dsa_port* dsa_ptr
struct tipc_bearer* tipc_ptr
void* atalk_ptr void* atalk_ptr
void* ax25_ptr void* ax25_ptr
struct_wireless_dev* ieee80211_ptr struct wireless_dev* ieee80211_ptr
struct_wpan_dev* ieee802154_ptr struct wpan_dev* ieee802154_ptr
struct_mpls_dev* mpls_ptr struct mpls_dev* mpls_ptr
struct_mctp_dev* mctp_ptr struct mctp_dev* mctp_ptr
unsigned_char* dev_addr unsigned_char* dev_addr
struct_netdev_queue* _rx read_mostly - netdev_get_rx_queue(rx) struct netdev_queue* _rx read_mostly netdev_get_rx_queue(rx)
unsigned_int num_rx_queues unsigned_int num_rx_queues
unsigned_int real_num_rx_queues - read_mostly get_rps_cpu unsigned_int real_num_rx_queues read_mostly get_rps_cpu
struct_bpf_prog* xdp_prog - read_mostly netif_elide_gro() struct bpf_prog* xdp_prog read_mostly netif_elide_gro()
unsigned_long gro_flush_timeout - read_mostly napi_complete_done unsigned_long gro_flush_timeout read_mostly napi_complete_done
u32 napi_defer_hard_irqs - read_mostly napi_complete_done u32 napi_defer_hard_irqs read_mostly napi_complete_done
unsigned_int gro_max_size - read_mostly skb_gro_receive unsigned_int gro_max_size read_mostly skb_gro_receive
unsigned_int gro_ipv4_max_size - read_mostly skb_gro_receive unsigned_int gro_ipv4_max_size read_mostly skb_gro_receive
rx_handler_func_t* rx_handler read_mostly - __netif_receive_skb_core rx_handler_func_t* rx_handler read_mostly __netif_receive_skb_core
void* rx_handler_data read_mostly - void* rx_handler_data read_mostly
struct_netdev_queue* ingress_queue read_mostly - struct netdev_queue* ingress_queue read_mostly
struct_bpf_mprog_entry tcx_ingress - read_mostly sch_handle_ingress struct bpf_mprog_entry tcx_ingress read_mostly sch_handle_ingress
struct_nf_hook_entries* nf_hooks_ingress struct nf_hook_entries* nf_hooks_ingress
unsigned_char broadcast[32] unsigned_char broadcast[32]
struct_cpu_rmap* rx_cpu_rmap struct cpu_rmap* rx_cpu_rmap
struct_hlist_node index_hlist struct hlist_node index_hlist
struct_netdev_queue* _tx read_mostly - netdev_get_tx_queue(tx) struct netdev_queue* _tx read_mostly netdev_get_tx_queue(tx)
unsigned_int num_tx_queues - - unsigned_int num_tx_queues
unsigned_int real_num_tx_queues read_mostly - skb_tx_hash,netdev_core_pick_tx(tx) unsigned_int real_num_tx_queues read_mostly skb_tx_hash,netdev_core_pick_tx(tx)
unsigned_int tx_queue_len unsigned_int tx_queue_len
spinlock_t tx_global_lock spinlock_t tx_global_lock
struct_xdp_dev_bulk_queue__percpu* xdp_bulkq struct xdp_dev_bulk_queue__percpu* xdp_bulkq
struct_xps_dev_maps* xps_maps[2] read_mostly - __netif_set_xps_queue struct xps_dev_maps* xps_maps[2] read_mostly __netif_set_xps_queue
struct_bpf_mprog_entry tcx_egress read_mostly - sch_handle_egress struct bpf_mprog_entry tcx_egress read_mostly sch_handle_egress
struct_nf_hook_entries* nf_hooks_egress read_mostly - struct nf_hook_entries* nf_hooks_egress read_mostly
struct_hlist_head qdisc_hash[16] struct hlist_head qdisc_hash[16]
struct_timer_list watchdog_timer struct timer_list watchdog_timer
int watchdog_timeo int watchdog_timeo
u32 proto_down_reason u32 proto_down_reason
struct_list_head todo_list struct list_head todo_list
int__percpu* pcpu_refcnt int__percpu* pcpu_refcnt
refcount_t dev_refcnt refcount_t dev_refcnt
struct_ref_tracker_dir refcnt_tracker struct ref_tracker_dir refcnt_tracker
struct_list_head link_watch_list struct list_head link_watch_list
enum:8 reg_state enum:8 reg_state
bool dismantle bool dismantle
enum:16 rtnl_link_state enum:16 rtnl_link_state
bool needs_free_netdev bool needs_free_netdev
void*priv_destructor struct_net_device void*priv_destructor struct net_device
struct_netpoll_info* npinfo - read_mostly napi_poll/napi_poll_lock struct netpoll_info* npinfo read_mostly napi_poll/napi_poll_lock
possible_net_t nd_net - read_mostly (dev_net)napi_busy_loop,tcp_v(4/6)_rcv,ip(v6)_rcv,ip(6)_input,ip(6)_input_finish possible_net_t nd_net read_mostly (dev_net)napi_busy_loop,tcp_v(4/6)_rcv,ip(v6)_rcv,ip(6)_input,ip(6)_input_finish
void* ml_priv void* ml_priv
enum_netdev_ml_priv_type ml_priv_type enum_netdev_ml_priv_type ml_priv_type
struct_pcpu_lstats__percpu* lstats read_mostly dev_lstats_add() struct pcpu_lstats__percpu* lstats read_mostly dev_lstats_add()
struct_pcpu_sw_netstats__percpu* tstats read_mostly dev_sw_netstats_tx_add() struct pcpu_sw_netstats__percpu* tstats read_mostly dev_sw_netstats_tx_add()
struct_pcpu_dstats__percpu* dstats struct pcpu_dstats__percpu* dstats
struct_garp_port* garp_port struct garp_port* garp_port
struct_mrp_port* mrp_port struct mrp_port* mrp_port
struct_dm_hw_stat_delta* dm_private struct dm_hw_stat_delta* dm_private
struct_device dev - - struct device dev
struct_attribute_group* sysfs_groups[4] struct attribute_group* sysfs_groups[4]
struct_attribute_group* sysfs_rx_queue_group struct attribute_group* sysfs_rx_queue_group
struct_rtnl_link_ops* rtnl_link_ops struct rtnl_link_ops* rtnl_link_ops
unsigned_int gso_max_size read_mostly - sk_dst_gso_max_size unsigned_int gso_max_size read_mostly sk_dst_gso_max_size
unsigned_int tso_max_size unsigned_int tso_max_size
u16 gso_max_segs read_mostly - gso_max_segs u16 gso_max_segs read_mostly gso_max_segs
u16 tso_max_segs u16 tso_max_segs
unsigned_int gso_ipv4_max_size read_mostly - sk_dst_gso_max_size unsigned_int gso_ipv4_max_size read_mostly sk_dst_gso_max_size
struct_dcbnl_rtnl_ops* dcbnl_ops struct dcbnl_rtnl_ops* dcbnl_ops
s16 num_tc read_mostly - skb_tx_hash s16 num_tc read_mostly skb_tx_hash
struct_netdev_tc_txq tc_to_txq[16] read_mostly - skb_tx_hash struct netdev_tc_txq tc_to_txq[16] read_mostly skb_tx_hash
u8 prio_tc_map[16] u8 prio_tc_map[16]
unsigned_int fcoe_ddp_xid unsigned_int fcoe_ddp_xid
struct_netprio_map* priomap struct netprio_map* priomap
struct_phy_device* phydev struct phy_device* phydev
struct_sfp_bus* sfp_bus struct sfp_bus* sfp_bus
struct_lock_class_key* qdisc_tx_busylock struct lock_class_key* qdisc_tx_busylock
bool proto_down bool proto_down
unsigned:1 wol_enabled unsigned:1 wol_enabled
unsigned:1 threaded - - napi_poll(napi_enable,dev_set_threaded) unsigned:1 threaded napi_poll(napi_enable,dev_set_threaded)
unsigned_long:1 see_all_hwtstamp_requests unsigned_long:1 see_all_hwtstamp_requests
unsigned_long:1 change_proto_down unsigned_long:1 change_proto_down
unsigned_long:1 netns_local unsigned_long:1 netns_local
unsigned_long:1 fcoe_mtu unsigned_long:1 fcoe_mtu
struct_list_head net_notifier_list struct list_head net_notifier_list
struct_macsec_ops* macsec_ops struct macsec_ops* macsec_ops
struct_udp_tunnel_nic_info* udp_tunnel_nic_info struct udp_tunnel_nic_info* udp_tunnel_nic_info
struct_udp_tunnel_nic* udp_tunnel_nic struct udp_tunnel_nic* udp_tunnel_nic
unsigned_int xdp_zc_max_segs unsigned_int xdp_zc_max_segs
struct_bpf_xdp_entity xdp_state[3] struct bpf_xdp_entity xdp_state[3]
u8 dev_addr_shadow[32] u8 dev_addr_shadow[32]
netdevice_tracker linkwatch_dev_tracker netdevice_tracker linkwatch_dev_tracker
netdevice_tracker watchdog_dev_tracker netdevice_tracker watchdog_dev_tracker
netdevice_tracker dev_registered_tracker netdevice_tracker dev_registered_tracker
struct_rtnl_hw_stats64* offload_xstats_l3 struct rtnl_hw_stats64* offload_xstats_l3
struct_devlink_port* devlink_port struct devlink_port* devlink_port
struct_dpll_pin* dpll_pin struct dpll_pin* dpll_pin
struct hlist_head page_pools struct hlist_head page_pools
struct dim_irq_moder* irq_moder struct dim_irq_moder* irq_moder
u64 max_pacing_offload_horizon
struct_napi_config* napi_config
unsigned_long gro_flush_timeout
u32 napi_defer_hard_irqs
struct hlist_head neighbours[2]
=================================== =========================== =================== =================== ===================================================================================

View File

@ -5,8 +5,9 @@
netns_ipv4 struct fast path usage breakdown netns_ipv4 struct fast path usage breakdown
=========================================== ===========================================
=============================== ============================================ =================== =================== =================================================
Type Name fastpath_tx_access fastpath_rx_access comment Type Name fastpath_tx_access fastpath_rx_access comment
..struct ..netns_ipv4 =============================== ============================================ =================== =================== =================================================
struct_inet_timewait_death_row tcp_death_row struct_inet_timewait_death_row tcp_death_row
struct_udp_table* udp_table struct_udp_table* udp_table
struct_ctl_table_header* forw_hdr struct_ctl_table_header* forw_hdr
@ -38,99 +39,99 @@ u8 sysctl_icmp_ignore_bogus_error_responses
u8 sysctl_icmp_errors_use_inbound_ifaddr u8 sysctl_icmp_errors_use_inbound_ifaddr
int sysctl_icmp_ratelimit int sysctl_icmp_ratelimit
int sysctl_icmp_ratemask int sysctl_icmp_ratemask
u32 ip_rt_min_pmtu - - u32 ip_rt_min_pmtu
int ip_rt_mtu_expires - - int ip_rt_mtu_expires
int ip_rt_min_advmss - - int ip_rt_min_advmss
struct_local_ports ip_local_ports - - struct_local_ports ip_local_ports
u8 sysctl_tcp_ecn - - u8 sysctl_tcp_ecn
u8 sysctl_tcp_ecn_fallback - - u8 sysctl_tcp_ecn_fallback
u8 sysctl_ip_default_ttl - - ip4_dst_hoplimit/ip_select_ttl u8 sysctl_ip_default_ttl ip4_dst_hoplimit/ip_select_ttl
u8 sysctl_ip_no_pmtu_disc - - u8 sysctl_ip_no_pmtu_disc
u8 sysctl_ip_fwd_use_pmtu read_mostly - ip_dst_mtu_maybe_forward/ip_skb_dst_mtu u8 sysctl_ip_fwd_use_pmtu read_mostly ip_dst_mtu_maybe_forward/ip_skb_dst_mtu
u8 sysctl_ip_fwd_update_priority - - ip_forward u8 sysctl_ip_fwd_update_priority ip_forward
u8 sysctl_ip_nonlocal_bind - - u8 sysctl_ip_nonlocal_bind
u8 sysctl_ip_autobind_reuse - - u8 sysctl_ip_autobind_reuse
u8 sysctl_ip_dynaddr - - u8 sysctl_ip_dynaddr
u8 sysctl_ip_early_demux - read_mostly ip(6)_rcv_finish_core u8 sysctl_ip_early_demux read_mostly ip(6)_rcv_finish_core
u8 sysctl_raw_l3mdev_accept - - u8 sysctl_raw_l3mdev_accept
u8 sysctl_tcp_early_demux - read_mostly ip(6)_rcv_finish_core u8 sysctl_tcp_early_demux read_mostly ip(6)_rcv_finish_core
u8 sysctl_udp_early_demux u8 sysctl_udp_early_demux
u8 sysctl_nexthop_compat_mode - - u8 sysctl_nexthop_compat_mode
u8 sysctl_fwmark_reflect - - u8 sysctl_fwmark_reflect
u8 sysctl_tcp_fwmark_accept - - u8 sysctl_tcp_fwmark_accept
u8 sysctl_tcp_l3mdev_accept - - u8 sysctl_tcp_l3mdev_accept read_mostly __inet6_lookup_established/inet_request_bound_dev_if
u8 sysctl_tcp_mtu_probing - - u8 sysctl_tcp_mtu_probing
int sysctl_tcp_mtu_probe_floor - - int sysctl_tcp_mtu_probe_floor
int sysctl_tcp_base_mss - - int sysctl_tcp_base_mss
int sysctl_tcp_min_snd_mss read_mostly - __tcp_mtu_to_mss(tcp_write_xmit) int sysctl_tcp_min_snd_mss read_mostly __tcp_mtu_to_mss(tcp_write_xmit)
int sysctl_tcp_probe_threshold - - tcp_mtu_probe(tcp_write_xmit) int sysctl_tcp_probe_threshold tcp_mtu_probe(tcp_write_xmit)
u32 sysctl_tcp_probe_interval - - tcp_mtu_check_reprobe(tcp_write_xmit) u32 sysctl_tcp_probe_interval tcp_mtu_check_reprobe(tcp_write_xmit)
int sysctl_tcp_keepalive_time - - int sysctl_tcp_keepalive_time
int sysctl_tcp_keepalive_intvl - - int sysctl_tcp_keepalive_intvl
u8 sysctl_tcp_keepalive_probes - - u8 sysctl_tcp_keepalive_probes
u8 sysctl_tcp_syn_retries - - u8 sysctl_tcp_syn_retries
u8 sysctl_tcp_synack_retries - - u8 sysctl_tcp_synack_retries
u8 sysctl_tcp_syncookies - - generated_on_syn u8 sysctl_tcp_syncookies generated_on_syn
u8 sysctl_tcp_migrate_req - - reuseport u8 sysctl_tcp_migrate_req reuseport
u8 sysctl_tcp_comp_sack_nr - - __tcp_ack_snd_check u8 sysctl_tcp_comp_sack_nr __tcp_ack_snd_check
int sysctl_tcp_reordering - read_mostly tcp_may_raise_cwnd/tcp_cong_control int sysctl_tcp_reordering read_mostly tcp_may_raise_cwnd/tcp_cong_control
u8 sysctl_tcp_retries1 - - u8 sysctl_tcp_retries1
u8 sysctl_tcp_retries2 - - u8 sysctl_tcp_retries2
u8 sysctl_tcp_orphan_retries - - u8 sysctl_tcp_orphan_retries
u8 sysctl_tcp_tw_reuse - - timewait_sock_ops u8 sysctl_tcp_tw_reuse timewait_sock_ops
int sysctl_tcp_fin_timeout - - TCP_LAST_ACK/tcp_rcv_state_process int sysctl_tcp_fin_timeout TCP_LAST_ACK/tcp_rcv_state_process
unsigned_int sysctl_tcp_notsent_lowat read_mostly - tcp_notsent_lowat/tcp_stream_memory_free unsigned_int sysctl_tcp_notsent_lowat read_mostly tcp_notsent_lowat/tcp_stream_memory_free
u8 sysctl_tcp_sack - - tcp_syn_options u8 sysctl_tcp_sack tcp_syn_options
u8 sysctl_tcp_window_scaling - - tcp_syn_options,tcp_parse_options u8 sysctl_tcp_window_scaling tcp_syn_options,tcp_parse_options
u8 sysctl_tcp_timestamps u8 sysctl_tcp_timestamps
u8 sysctl_tcp_early_retrans read_mostly - tcp_schedule_loss_probe(tcp_write_xmit) u8 sysctl_tcp_early_retrans read_mostly tcp_schedule_loss_probe(tcp_write_xmit)
u8 sysctl_tcp_recovery - - tcp_fastretrans_alert u8 sysctl_tcp_recovery tcp_fastretrans_alert
u8 sysctl_tcp_thin_linear_timeouts - - tcp_retrans_timer(on_thin_streams) u8 sysctl_tcp_thin_linear_timeouts tcp_retrans_timer(on_thin_streams)
u8 sysctl_tcp_slow_start_after_idle - - unlikely(tcp_cwnd_validate-network-not-starved) u8 sysctl_tcp_slow_start_after_idle unlikely(tcp_cwnd_validate-network-not-starved)
u8 sysctl_tcp_retrans_collapse - - u8 sysctl_tcp_retrans_collapse
u8 sysctl_tcp_stdurg - - unlikely(tcp_check_urg) u8 sysctl_tcp_stdurg unlikely(tcp_check_urg)
u8 sysctl_tcp_rfc1337 - - u8 sysctl_tcp_rfc1337
u8 sysctl_tcp_abort_on_overflow - - u8 sysctl_tcp_abort_on_overflow
u8 sysctl_tcp_fack - - u8 sysctl_tcp_fack
int sysctl_tcp_max_reordering - - tcp_check_sack_reordering int sysctl_tcp_max_reordering tcp_check_sack_reordering
int sysctl_tcp_adv_win_scale - - tcp_init_buffer_space int sysctl_tcp_adv_win_scale tcp_init_buffer_space
u8 sysctl_tcp_dsack - - partial_packet_or_retrans_in_tcp_data_queue u8 sysctl_tcp_dsack partial_packet_or_retrans_in_tcp_data_queue
u8 sysctl_tcp_app_win - - tcp_win_from_space u8 sysctl_tcp_app_win tcp_win_from_space
u8 sysctl_tcp_frto - - tcp_enter_loss u8 sysctl_tcp_frto tcp_enter_loss
u8 sysctl_tcp_nometrics_save - - TCP_LAST_ACK/tcp_update_metrics u8 sysctl_tcp_nometrics_save TCP_LAST_ACK/tcp_update_metrics
u8 sysctl_tcp_no_ssthresh_metrics_save - - TCP_LAST_ACK/tcp_(update/init)_metrics u8 sysctl_tcp_no_ssthresh_metrics_save TCP_LAST_ACK/tcp_(update/init)_metrics
u8 sysctl_tcp_moderate_rcvbuf read_mostly read_mostly tcp_tso_should_defer(tx);tcp_rcv_space_adjust(rx) u8 sysctl_tcp_moderate_rcvbuf read_mostly read_mostly tcp_tso_should_defer(tx);tcp_rcv_space_adjust(rx)
u8 sysctl_tcp_tso_win_divisor read_mostly - tcp_tso_should_defer(tcp_write_xmit) u8 sysctl_tcp_tso_win_divisor read_mostly tcp_tso_should_defer(tcp_write_xmit)
u8 sysctl_tcp_workaround_signed_windows - - tcp_select_window u8 sysctl_tcp_workaround_signed_windows tcp_select_window
int sysctl_tcp_limit_output_bytes read_mostly - tcp_small_queue_check(tcp_write_xmit) int sysctl_tcp_limit_output_bytes read_mostly tcp_small_queue_check(tcp_write_xmit)
int sysctl_tcp_challenge_ack_limit - - int sysctl_tcp_challenge_ack_limit
int sysctl_tcp_min_rtt_wlen read_mostly - tcp_ack_update_rtt int sysctl_tcp_min_rtt_wlen read_mostly tcp_ack_update_rtt
u8 sysctl_tcp_min_tso_segs - - unlikely(icsk_ca_ops-written) u8 sysctl_tcp_min_tso_segs unlikely(icsk_ca_ops-written)
u8 sysctl_tcp_tso_rtt_log read_mostly - tcp_tso_autosize u8 sysctl_tcp_tso_rtt_log read_mostly tcp_tso_autosize
u8 sysctl_tcp_autocorking read_mostly - tcp_push/tcp_should_autocork u8 sysctl_tcp_autocorking read_mostly tcp_push/tcp_should_autocork
u8 sysctl_tcp_reflect_tos - - tcp_v(4/6)_send_synack u8 sysctl_tcp_reflect_tos tcp_v(4/6)_send_synack
int sysctl_tcp_invalid_ratelimit - - int sysctl_tcp_invalid_ratelimit
int sysctl_tcp_pacing_ss_ratio - - default_cong_cont(tcp_update_pacing_rate) int sysctl_tcp_pacing_ss_ratio default_cong_cont(tcp_update_pacing_rate)
int sysctl_tcp_pacing_ca_ratio - - default_cong_cont(tcp_update_pacing_rate) int sysctl_tcp_pacing_ca_ratio default_cong_cont(tcp_update_pacing_rate)
int sysctl_tcp_wmem[3] read_mostly - tcp_wmem_schedule(sendmsg/sendpage) int sysctl_tcp_wmem[3] read_mostly tcp_wmem_schedule(sendmsg/sendpage)
int sysctl_tcp_rmem[3] - read_mostly __tcp_grow_window(tx),tcp_rcv_space_adjust(rx) int sysctl_tcp_rmem[3] read_mostly __tcp_grow_window(tx),tcp_rcv_space_adjust(rx)
unsigned_int sysctl_tcp_child_ehash_entries unsigned_int sysctl_tcp_child_ehash_entries
unsigned_long sysctl_tcp_comp_sack_delay_ns - - __tcp_ack_snd_check unsigned_long sysctl_tcp_comp_sack_delay_ns __tcp_ack_snd_check
unsigned_long sysctl_tcp_comp_sack_slack_ns - - __tcp_ack_snd_check unsigned_long sysctl_tcp_comp_sack_slack_ns __tcp_ack_snd_check
int sysctl_max_syn_backlog - - int sysctl_max_syn_backlog
int sysctl_tcp_fastopen - - int sysctl_tcp_fastopen
struct_tcp_congestion_ops tcp_congestion_control - - init_cc struct_tcp_congestion_ops tcp_congestion_control init_cc
struct_tcp_fastopen_context tcp_fastopen_ctx - - struct_tcp_fastopen_context tcp_fastopen_ctx
unsigned_int sysctl_tcp_fastopen_blackhole_timeout - - unsigned_int sysctl_tcp_fastopen_blackhole_timeout
atomic_t tfo_active_disable_times - - atomic_t tfo_active_disable_times
unsigned_long tfo_active_disable_stamp - - unsigned_long tfo_active_disable_stamp
u32 tcp_challenge_timestamp - - u32 tcp_challenge_timestamp
u32 tcp_challenge_count - - u32 tcp_challenge_count
u8 sysctl_tcp_plb_enabled - - u8 sysctl_tcp_plb_enabled
u8 sysctl_tcp_plb_idle_rehash_rounds - - u8 sysctl_tcp_plb_idle_rehash_rounds
u8 sysctl_tcp_plb_rehash_rounds - - u8 sysctl_tcp_plb_rehash_rounds
u8 sysctl_tcp_plb_suspend_rto_sec - - u8 sysctl_tcp_plb_suspend_rto_sec
int sysctl_tcp_plb_cong_thresh - - int sysctl_tcp_plb_cong_thresh
int sysctl_udp_wmem_min int sysctl_udp_wmem_min
int sysctl_udp_rmem_min int sysctl_udp_rmem_min
u8 sysctl_fib_notify_on_flag_change u8 sysctl_fib_notify_on_flag_change
@ -156,3 +157,4 @@ struct_fib_notifier_ops* ipmr_notifier_ops
unsigned_int ipmr_seq unsigned_int ipmr_seq
atomic_t rt_genid atomic_t rt_genid
siphash_key_t ip_id_key siphash_key_t ip_id_key
=============================== ============================================ =================== =================== =================================================

View File

@ -5,21 +5,22 @@
netns_ipv4 enum fast path usage breakdown netns_ipv4 enum fast path usage breakdown
=========================================== ===========================================
============== ===================================== =================== =================== ==================================================
Type Name fastpath_tx_access fastpath_rx_access comment Type Name fastpath_tx_access fastpath_rx_access comment
..enum ============== ===================================== =================== =================== ==================================================
unsigned_long LINUX_MIB_TCPKEEPALIVE write_mostly - tcp_keepalive_timer unsigned_long LINUX_MIB_TCPKEEPALIVE write_mostly tcp_keepalive_timer
unsigned_long LINUX_MIB_DELAYEDACKS write_mostly - tcp_delack_timer_handler,tcp_delack_timer unsigned_long LINUX_MIB_DELAYEDACKS write_mostly tcp_delack_timer_handler,tcp_delack_timer
unsigned_long LINUX_MIB_DELAYEDACKLOCKED write_mostly - tcp_delack_timer_handler,tcp_delack_timer unsigned_long LINUX_MIB_DELAYEDACKLOCKED write_mostly tcp_delack_timer_handler,tcp_delack_timer
unsigned_long LINUX_MIB_TCPAUTOCORKING write_mostly - tcp_push,tcp_sendmsg_locked unsigned_long LINUX_MIB_TCPAUTOCORKING write_mostly tcp_push,tcp_sendmsg_locked
unsigned_long LINUX_MIB_TCPFROMZEROWINDOWADV write_mostly - tcp_select_window,tcp_transmit-skb unsigned_long LINUX_MIB_TCPFROMZEROWINDOWADV write_mostly tcp_select_window,tcp_transmit-skb
unsigned_long LINUX_MIB_TCPTOZEROWINDOWADV write_mostly - tcp_select_window,tcp_transmit-skb unsigned_long LINUX_MIB_TCPTOZEROWINDOWADV write_mostly tcp_select_window,tcp_transmit-skb
unsigned_long LINUX_MIB_TCPWANTZEROWINDOWADV write_mostly - tcp_select_window,tcp_transmit-skb unsigned_long LINUX_MIB_TCPWANTZEROWINDOWADV write_mostly tcp_select_window,tcp_transmit-skb
unsigned_long LINUX_MIB_TCPORIGDATASENT write_mostly - tcp_write_xmit unsigned_long LINUX_MIB_TCPORIGDATASENT write_mostly tcp_write_xmit
unsigned_long LINUX_MIB_TCPHPHITS - write_mostly tcp_rcv_established,tcp_v4_do_rcv,tcp_v6_do_rcv unsigned_long LINUX_MIB_TCPHPHITS write_mostly tcp_rcv_established,tcp_v4_do_rcv,tcp_v6_do_rcv
unsigned_long LINUX_MIB_TCPRCVCOALESCE - write_mostly tcp_try_coalesce,tcp_queue_rcv,tcp_rcv_established unsigned_long LINUX_MIB_TCPRCVCOALESCE write_mostly tcp_try_coalesce,tcp_queue_rcv,tcp_rcv_established
unsigned_long LINUX_MIB_TCPPUREACKS - write_mostly tcp_ack,tcp_rcv_established unsigned_long LINUX_MIB_TCPPUREACKS write_mostly tcp_ack,tcp_rcv_established
unsigned_long LINUX_MIB_TCPHPACKS - write_mostly tcp_ack,tcp_rcv_established unsigned_long LINUX_MIB_TCPHPACKS write_mostly tcp_ack,tcp_rcv_established
unsigned_long LINUX_MIB_TCPDELIVERED - write_mostly tcp_newly_delivered,tcp_ack,tcp_rcv_established unsigned_long LINUX_MIB_TCPDELIVERED write_mostly tcp_newly_delivered,tcp_ack,tcp_rcv_established
unsigned_long LINUX_MIB_SYNCOOKIESSENT unsigned_long LINUX_MIB_SYNCOOKIESSENT
unsigned_long LINUX_MIB_SYNCOOKIESRECV unsigned_long LINUX_MIB_SYNCOOKIESRECV
unsigned_long LINUX_MIB_SYNCOOKIESFAILED unsigned_long LINUX_MIB_SYNCOOKIESFAILED
@ -133,3 +134,4 @@ unsigned_long LINUX_MIB_TCPDSACKIGNOREDDUBIOUS
unsigned_long LINUX_MIB_TCPMIGRATEREQSUCCESS unsigned_long LINUX_MIB_TCPMIGRATEREQSUCCESS
unsigned_long LINUX_MIB_TCPMIGRATEREQFAILURE unsigned_long LINUX_MIB_TCPMIGRATEREQFAILURE
unsigned_long __LINUX_MIB_MAX unsigned_long __LINUX_MIB_MAX
============== ===================================== =================== =================== ==================================================

View File

@ -5,90 +5,91 @@
tcp_sock struct fast path usage breakdown tcp_sock struct fast path usage breakdown
========================================= =========================================
============================= ======================= =================== =================== ==================================================================================================================================================================================================================
Type Name fastpath_tx_access fastpath_rx_access Comments Type Name fastpath_tx_access fastpath_rx_access Comments
..struct ..tcp_sock ============================= ======================= =================== =================== ==================================================================================================================================================================================================================
struct_inet_connection_sock inet_conn struct inet_connection_sock inet_conn
u16 tcp_header_len read_mostly read_mostly tcp_bound_to_half_wnd,tcp_current_mss(tx);tcp_rcv_established(rx) u16 tcp_header_len read_mostly read_mostly tcp_bound_to_half_wnd,tcp_current_mss(tx);tcp_rcv_established(rx)
u16 gso_segs read_mostly - tcp_xmit_size_goal u16 gso_segs read_mostly tcp_xmit_size_goal
__be32 pred_flags read_write read_mostly tcp_select_window(tx);tcp_rcv_established(rx) __be32 pred_flags read_write read_mostly tcp_select_window(tx);tcp_rcv_established(rx)
u64 bytes_received - read_write tcp_rcv_nxt_update(rx) u64 bytes_received read_write tcp_rcv_nxt_update(rx)
u32 segs_in - read_write tcp_v6_rcv(rx) u32 segs_in read_write tcp_v6_rcv(rx)
u32 data_segs_in - read_write tcp_v6_rcv(rx) u32 data_segs_in read_write tcp_v6_rcv(rx)
u32 rcv_nxt read_mostly read_write tcp_cleanup_rbuf,tcp_send_ack,tcp_inq_hint,tcp_transmit_skb,tcp_receive_window(tx);tcp_v6_do_rcv,tcp_rcv_established,tcp_data_queue,tcp_receive_window,tcp_rcv_nxt_update(write)(rx) u32 rcv_nxt read_mostly read_write tcp_cleanup_rbuf,tcp_send_ack,tcp_inq_hint,tcp_transmit_skb,tcp_receive_window(tx);tcp_v6_do_rcv,tcp_rcv_established,tcp_data_queue,tcp_receive_window,tcp_rcv_nxt_update(write)(rx)
u32 copied_seq - read_mostly tcp_cleanup_rbuf,tcp_rcv_space_adjust,tcp_inq_hint u32 copied_seq read_mostly tcp_cleanup_rbuf,tcp_rcv_space_adjust,tcp_inq_hint
u32 rcv_wup - read_write __tcp_cleanup_rbuf,tcp_receive_window,tcp_receive_established u32 rcv_wup read_write __tcp_cleanup_rbuf,tcp_receive_window,tcp_receive_established
u32 snd_nxt read_write read_mostly tcp_rate_check_app_limited,__tcp_transmit_skb,tcp_event_new_data_sent(write)(tx);tcp_rcv_established,tcp_ack,tcp_clean_rtx_queue(rx) u32 snd_nxt read_write read_mostly tcp_rate_check_app_limited,__tcp_transmit_skb,tcp_event_new_data_sent(write)(tx);tcp_rcv_established,tcp_ack,tcp_clean_rtx_queue(rx)
u32 segs_out read_write - __tcp_transmit_skb u32 segs_out read_write __tcp_transmit_skb
u32 data_segs_out read_write - __tcp_transmit_skb,tcp_update_skb_after_send u32 data_segs_out read_write __tcp_transmit_skb,tcp_update_skb_after_send
u64 bytes_sent read_write - __tcp_transmit_skb u64 bytes_sent read_write __tcp_transmit_skb
u64 bytes_acked - read_write tcp_snd_una_update/tcp_ack u64 bytes_acked read_write tcp_snd_una_update/tcp_ack
u32 dsack_dups u32 dsack_dups
u32 snd_una read_mostly read_write tcp_wnd_end,tcp_urg_mode,tcp_minshall_check,tcp_cwnd_validate(tx);tcp_ack,tcp_may_update_window,tcp_clean_rtx_queue(write),tcp_ack_tstamp(rx) u32 snd_una read_mostly read_write tcp_wnd_end,tcp_urg_mode,tcp_minshall_check,tcp_cwnd_validate(tx);tcp_ack,tcp_may_update_window,tcp_clean_rtx_queue(write),tcp_ack_tstamp(rx)
u32 snd_sml read_write - tcp_minshall_check,tcp_minshall_update u32 snd_sml read_write tcp_minshall_check,tcp_minshall_update
u32 rcv_tstamp - read_mostly tcp_ack u32 rcv_tstamp read_mostly tcp_ack
u32 lsndtime read_write - tcp_slow_start_after_idle_check,tcp_event_data_sent u32 lsndtime read_write tcp_slow_start_after_idle_check,tcp_event_data_sent
u32 last_oow_ack_time u32 last_oow_ack_time
u32 compressed_ack_rcv_nxt u32 compressed_ack_rcv_nxt
u32 tsoffset read_mostly read_mostly tcp_established_options(tx);tcp_fast_parse_options(rx) u32 tsoffset read_mostly read_mostly tcp_established_options(tx);tcp_fast_parse_options(rx)
struct_list_head tsq_node - - struct list_head tsq_node
struct_list_head tsorted_sent_queue read_write - tcp_update_skb_after_send struct list_head tsorted_sent_queue read_write tcp_update_skb_after_send
u32 snd_wl1 - read_mostly tcp_may_update_window u32 snd_wl1 read_mostly tcp_may_update_window
u32 snd_wnd read_mostly read_mostly tcp_wnd_end,tcp_tso_should_defer(tx);tcp_fast_path_on(rx) u32 snd_wnd read_mostly read_mostly tcp_wnd_end,tcp_tso_should_defer(tx);tcp_fast_path_on(rx)
u32 max_window read_mostly - tcp_bound_to_half_wnd,forced_push u32 max_window read_mostly tcp_bound_to_half_wnd,forced_push
u32 mss_cache read_mostly read_mostly tcp_rate_check_app_limited,tcp_current_mss,tcp_sync_mss,tcp_sndbuf_expand,tcp_tso_should_defer(tx);tcp_update_pacing_rate,tcp_clean_rtx_queue(rx) u32 mss_cache read_mostly read_mostly tcp_rate_check_app_limited,tcp_current_mss,tcp_sync_mss,tcp_sndbuf_expand,tcp_tso_should_defer(tx);tcp_update_pacing_rate,tcp_clean_rtx_queue(rx)
u32 window_clamp read_mostly read_write tcp_rcv_space_adjust,__tcp_select_window u32 window_clamp read_mostly read_write tcp_rcv_space_adjust,__tcp_select_window
u32 rcv_ssthresh read_mostly - __tcp_select_window u32 rcv_ssthresh read_mostly __tcp_select_window
u8 scaling_ratio read_mostly read_mostly tcp_win_from_space u8 scaling_ratio read_mostly read_mostly tcp_win_from_space
struct tcp_rack struct tcp_rack
u16 advmss - read_mostly tcp_rcv_space_adjust u16 advmss read_mostly tcp_rcv_space_adjust
u8 compressed_ack u8 compressed_ack
u8:2 dup_ack_counter u8:2 dup_ack_counter
u8:1 tlp_retrans u8:1 tlp_retrans
u8:1 tcp_usec_ts read_mostly read_mostly u8:1 tcp_usec_ts read_mostly read_mostly
u32 chrono_start read_write - tcp_chrono_start/stop(tcp_write_xmit,tcp_cwnd_validate,tcp_send_syn_data) u32 chrono_start read_write tcp_chrono_start/stop(tcp_write_xmit,tcp_cwnd_validate,tcp_send_syn_data)
u32[3] chrono_stat read_write - tcp_chrono_start/stop(tcp_write_xmit,tcp_cwnd_validate,tcp_send_syn_data) u32[3] chrono_stat read_write tcp_chrono_start/stop(tcp_write_xmit,tcp_cwnd_validate,tcp_send_syn_data)
u8:2 chrono_type read_write - tcp_chrono_start/stop(tcp_write_xmit,tcp_cwnd_validate,tcp_send_syn_data) u8:2 chrono_type read_write tcp_chrono_start/stop(tcp_write_xmit,tcp_cwnd_validate,tcp_send_syn_data)
u8:1 rate_app_limited - read_write tcp_rate_gen u8:1 rate_app_limited read_write tcp_rate_gen
u8:1 fastopen_connect u8:1 fastopen_connect
u8:1 fastopen_no_cookie u8:1 fastopen_no_cookie
u8:1 is_sack_reneg - read_mostly tcp_skb_entail,tcp_ack u8:1 is_sack_reneg read_mostly tcp_skb_entail,tcp_ack
u8:2 fastopen_client_fail u8:2 fastopen_client_fail
u8:4 nonagle read_write - tcp_skb_entail,tcp_push_pending_frames u8:4 nonagle read_write tcp_skb_entail,tcp_push_pending_frames
u8:1 thin_lto u8:1 thin_lto
u8:1 recvmsg_inq u8:1 recvmsg_inq
u8:1 repair read_mostly - tcp_write_xmit u8:1 repair read_mostly tcp_write_xmit
u8:1 frto u8:1 frto
u8 repair_queue - - u8 repair_queue
u8:2 save_syn u8:2 save_syn
u8:1 syn_data u8:1 syn_data
u8:1 syn_fastopen u8:1 syn_fastopen
u8:1 syn_fastopen_exp u8:1 syn_fastopen_exp
u8:1 syn_fastopen_ch u8:1 syn_fastopen_ch
u8:1 syn_data_acked u8:1 syn_data_acked
u8:1 is_cwnd_limited read_mostly - tcp_cwnd_validate,tcp_is_cwnd_limited u8:1 is_cwnd_limited read_mostly tcp_cwnd_validate,tcp_is_cwnd_limited
u32 tlp_high_seq - read_mostly tcp_ack u32 tlp_high_seq read_mostly tcp_ack
u32 tcp_tx_delay u32 tcp_tx_delay
u64 tcp_wstamp_ns read_write - tcp_pacing_check,tcp_tso_should_defer,tcp_update_skb_after_send u64 tcp_wstamp_ns read_write tcp_pacing_check,tcp_tso_should_defer,tcp_update_skb_after_send
u64 tcp_clock_cache read_write read_write tcp_mstamp_refresh(tcp_write_xmit/tcp_rcv_space_adjust),__tcp_transmit_skb,tcp_tso_should_defer;timer u64 tcp_clock_cache read_write read_write tcp_mstamp_refresh(tcp_write_xmit/tcp_rcv_space_adjust),__tcp_transmit_skb,tcp_tso_should_defer;timer
u64 tcp_mstamp read_write read_write tcp_mstamp_refresh(tcp_write_xmit/tcp_rcv_space_adjust)(tx);tcp_rcv_space_adjust,tcp_rate_gen,tcp_clean_rtx_queue,tcp_ack_update_rtt/tcp_time_stamp(rx);timer u64 tcp_mstamp read_write read_write tcp_mstamp_refresh(tcp_write_xmit/tcp_rcv_space_adjust)(tx);tcp_rcv_space_adjust,tcp_rate_gen,tcp_clean_rtx_queue,tcp_ack_update_rtt/tcp_time_stamp(rx);timer
u32 srtt_us read_mostly read_write tcp_tso_should_defer(tx);tcp_update_pacing_rate,__tcp_set_rto,tcp_rtt_estimator(rx) u32 srtt_us read_mostly read_write tcp_tso_should_defer(tx);tcp_update_pacing_rate,__tcp_set_rto,tcp_rtt_estimator(rx)
u32 mdev_us read_write - tcp_rtt_estimator u32 mdev_us read_write tcp_rtt_estimator
u32 mdev_max_us u32 mdev_max_us
u32 rttvar_us - read_mostly __tcp_set_rto u32 rttvar_us read_mostly __tcp_set_rto
u32 rtt_seq read_write tcp_rtt_estimator u32 rtt_seq read_write tcp_rtt_estimator
struct_minmax rtt_min - read_mostly tcp_min_rtt/tcp_rate_gen,tcp_min_rtttcp_update_rtt_min struct minmax rtt_min read_mostly tcp_min_rtt/tcp_rate_gen,tcp_min_rtttcp_update_rtt_min
u32 packets_out read_write read_write tcp_packets_in_flight(tx/rx);tcp_slow_start_after_idle_check,tcp_nagle_check,tcp_rate_skb_sent,tcp_event_new_data_sent,tcp_cwnd_validate,tcp_write_xmit(tx);tcp_ack,tcp_clean_rtx_queue,tcp_update_pacing_rate(rx) u32 packets_out read_write read_write tcp_packets_in_flight(tx/rx);tcp_slow_start_after_idle_check,tcp_nagle_check,tcp_rate_skb_sent,tcp_event_new_data_sent,tcp_cwnd_validate,tcp_write_xmit(tx);tcp_ack,tcp_clean_rtx_queue,tcp_update_pacing_rate(rx)
u32 retrans_out - read_mostly tcp_packets_in_flight,tcp_rate_check_app_limited u32 retrans_out read_mostly tcp_packets_in_flight,tcp_rate_check_app_limited
u32 max_packets_out - read_write tcp_cwnd_validate u32 max_packets_out read_write tcp_cwnd_validate
u32 cwnd_usage_seq - read_write tcp_cwnd_validate u32 cwnd_usage_seq read_write tcp_cwnd_validate
u16 urg_data - read_mostly tcp_fast_path_check u16 urg_data read_mostly tcp_fast_path_check
u8 ecn_flags read_write - tcp_ecn_send u8 ecn_flags read_write tcp_ecn_send
u8 keepalive_probes u8 keepalive_probes
u32 reordering read_mostly - tcp_sndbuf_expand u32 reordering read_mostly tcp_sndbuf_expand
u32 reord_seen u32 reord_seen
u32 snd_up read_write read_mostly tcp_mark_urg,tcp_urg_mode,__tcp_transmit_skb(tx);tcp_clean_rtx_queue(rx) u32 snd_up read_write read_mostly tcp_mark_urg,tcp_urg_mode,__tcp_transmit_skb(tx);tcp_clean_rtx_queue(rx)
struct_tcp_options_received rx_opt read_mostly read_write tcp_established_options(tx);tcp_fast_path_on,tcp_ack_update_window,tcp_is_sack,tcp_data_queue,tcp_rcv_established,tcp_ack_update_rtt(rx) struct tcp_options_received rx_opt read_mostly read_write tcp_established_options(tx);tcp_fast_path_on,tcp_ack_update_window,tcp_is_sack,tcp_data_queue,tcp_rcv_established,tcp_ack_update_rtt(rx)
u32 snd_ssthresh - read_mostly tcp_update_pacing_rate u32 snd_ssthresh read_mostly tcp_update_pacing_rate
u32 snd_cwnd read_mostly read_mostly tcp_snd_cwnd,tcp_rate_check_app_limited,tcp_tso_should_defer(tx);tcp_update_pacing_rate u32 snd_cwnd read_mostly read_mostly tcp_snd_cwnd,tcp_rate_check_app_limited,tcp_tso_should_defer(tx);tcp_update_pacing_rate
u32 snd_cwnd_cnt u32 snd_cwnd_cnt
u32 snd_cwnd_clamp u32 snd_cwnd_clamp
@ -99,28 +100,28 @@ u32 prr_delivered
u32 prr_out read_mostly read_mostly tcp_rate_skb_sent,tcp_newly_delivered(tx);tcp_ack,tcp_rate_gen,tcp_clean_rtx_queue(rx) u32 prr_out read_mostly read_mostly tcp_rate_skb_sent,tcp_newly_delivered(tx);tcp_ack,tcp_rate_gen,tcp_clean_rtx_queue(rx)
u32 delivered read_mostly read_write tcp_rate_skb_sent, tcp_newly_delivered(tx);tcp_ack, tcp_rate_gen, tcp_clean_rtx_queue (rx) u32 delivered read_mostly read_write tcp_rate_skb_sent, tcp_newly_delivered(tx);tcp_ack, tcp_rate_gen, tcp_clean_rtx_queue (rx)
u32 delivered_ce read_mostly read_write tcp_rate_skb_sent(tx);tcp_rate_gen(rx) u32 delivered_ce read_mostly read_write tcp_rate_skb_sent(tx);tcp_rate_gen(rx)
u32 lost - read_mostly tcp_ack u32 lost read_mostly tcp_ack
u32 app_limited read_write read_mostly tcp_rate_check_app_limited,tcp_rate_skb_sent(tx);tcp_rate_gen(rx) u32 app_limited read_write read_mostly tcp_rate_check_app_limited,tcp_rate_skb_sent(tx);tcp_rate_gen(rx)
u64 first_tx_mstamp read_write - tcp_rate_skb_sent u64 first_tx_mstamp read_write tcp_rate_skb_sent
u64 delivered_mstamp read_write - tcp_rate_skb_sent u64 delivered_mstamp read_write tcp_rate_skb_sent
u32 rate_delivered - read_mostly tcp_rate_gen u32 rate_delivered read_mostly tcp_rate_gen
u32 rate_interval_us - read_mostly rate_delivered,rate_app_limited u32 rate_interval_us read_mostly rate_delivered,rate_app_limited
u32 rcv_wnd read_write read_mostly tcp_select_window,tcp_receive_window,tcp_fast_path_check u32 rcv_wnd read_write read_mostly tcp_select_window,tcp_receive_window,tcp_fast_path_check
u32 write_seq read_write - tcp_rate_check_app_limited,tcp_write_queue_empty,tcp_skb_entail,forced_push,tcp_mark_push u32 write_seq read_write tcp_rate_check_app_limited,tcp_write_queue_empty,tcp_skb_entail,forced_push,tcp_mark_push
u32 notsent_lowat read_mostly - tcp_stream_memory_free u32 notsent_lowat read_mostly tcp_stream_memory_free
u32 pushed_seq read_write - tcp_mark_push,forced_push u32 pushed_seq read_write tcp_mark_push,forced_push
u32 lost_out read_mostly read_mostly tcp_left_out(tx);tcp_packets_in_flight(tx/rx);tcp_rate_check_app_limited(rx) u32 lost_out read_mostly read_mostly tcp_left_out(tx);tcp_packets_in_flight(tx/rx);tcp_rate_check_app_limited(rx)
u32 sacked_out read_mostly read_mostly tcp_left_out(tx);tcp_packets_in_flight(tx/rx);tcp_clean_rtx_queue(rx) u32 sacked_out read_mostly read_mostly tcp_left_out(tx);tcp_packets_in_flight(tx/rx);tcp_clean_rtx_queue(rx)
struct_hrtimer pacing_timer struct hrtimer pacing_timer
struct_hrtimer compressed_ack_timer struct hrtimer compressed_ack_timer
struct_sk_buff* lost_skb_hint read_mostly tcp_clean_rtx_queue struct sk_buff* lost_skb_hint read_mostly tcp_clean_rtx_queue
struct_sk_buff* retransmit_skb_hint read_mostly - tcp_clean_rtx_queue struct sk_buff* retransmit_skb_hint read_mostly tcp_clean_rtx_queue
struct_rb_root out_of_order_queue - read_mostly tcp_data_queue,tcp_fast_path_check struct rb_root out_of_order_queue read_mostly tcp_data_queue,tcp_fast_path_check
struct_sk_buff* ooo_last_skb struct sk_buff* ooo_last_skb
struct_tcp_sack_block[1] duplicate_sack struct tcp_sack_block[1] duplicate_sack
struct_tcp_sack_block[4] selective_acks struct tcp_sack_block[4] selective_acks
struct_tcp_sack_block[4] recv_sack_cache struct tcp_sack_block[4] recv_sack_cache
struct_sk_buff* highest_sack read_write - tcp_event_new_data_sent struct sk_buff* highest_sack read_write tcp_event_new_data_sent
int lost_cnt_hint int lost_cnt_hint
u32 prior_ssthresh u32 prior_ssthresh
u32 high_seq u32 high_seq
@ -133,7 +134,7 @@ u32 rto_stamp
u16 total_rto u16 total_rto
u16 total_rto_recoveries u16 total_rto_recoveries
u32 total_rto_time u32 total_rto_time
u32 urg_seq - - u32 urg_seq
unsigned_int keepalive_time unsigned_int keepalive_time
unsigned_int keepalive_intvl unsigned_int keepalive_intvl
int linger2 int linger2
@ -142,16 +143,17 @@ u8:1 bpf_chg_cc_inprogress
u16 timeout_rehash u16 timeout_rehash
u32 rcv_ooopack u32 rcv_ooopack
u32 rcv_rtt_last_tsecr u32 rcv_rtt_last_tsecr
struct rcv_rtt_est - read_write tcp_rcv_space_adjust,tcp_rcv_established struct rcv_rtt_est read_write tcp_rcv_space_adjust,tcp_rcv_established
struct rcvq_space - read_write tcp_rcv_space_adjust struct rcvq_space read_write tcp_rcv_space_adjust
struct mtu_probe struct mtu_probe
u32 plb_rehash u32 plb_rehash
u32 mtu_info u32 mtu_info
bool is_mptcp bool is_mptcp
bool smc_hs_congested bool smc_hs_congested
bool syn_smc bool syn_smc
struct_tcp_sock_af_ops* af_specific struct tcp_sock_af_ops* af_specific
struct_tcp_md5sig_info* md5sig_info struct tcp_md5sig_info* md5sig_info
struct_tcp_fastopen_request* fastopen_req struct tcp_fastopen_request* fastopen_req
struct_request_sock* fastopen_rsk struct request_sock* fastopen_rsk
struct_saved_syn* saved_syn struct saved_syn* saved_syn
============================= ======================= =================== =================== ==================================================================================================================================================================================================================

View File

@ -156,7 +156,7 @@ usage is not complete but it should make the outline of the usage clear.
my_entity->bytes, my_entity->bytes,
&dim_sample); &dim_sample);
/* Call net DIM */ /* Call net DIM */
net_dim(&my_entity->dim, dim_sample); net_dim(&my_entity->dim, &dim_sample);
... ...
} }

View File

@ -194,6 +194,20 @@ SOF_TIMESTAMPING_OPT_ID:
among all possibly concurrently outstanding timestamp requests for among all possibly concurrently outstanding timestamp requests for
that socket. that socket.
The process can optionally override the default generated ID, by
passing a specific ID with control message SCM_TS_OPT_ID (not
supported for TCP sockets)::
struct msghdr *msg;
...
cmsg = CMSG_FIRSTHDR(msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_TS_OPT_ID;
cmsg->cmsg_len = CMSG_LEN(sizeof(__u32));
*((__u32 *) CMSG_DATA(cmsg)) = opt_id;
err = sendmsg(fd, msg, 0);
SOF_TIMESTAMPING_OPT_ID_TCP: SOF_TIMESTAMPING_OPT_ID_TCP:
Pass this modifier along with SOF_TIMESTAMPING_OPT_ID for new TCP Pass this modifier along with SOF_TIMESTAMPING_OPT_ID for new TCP
timestamping applications. SOF_TIMESTAMPING_OPT_ID defines how the timestamping applications. SOF_TIMESTAMPING_OPT_ID defines how the

View File

@ -112,7 +112,7 @@ More Information
- How to contribute to TIPC: - How to contribute to TIPC:
- http://tipc.io/contacts.html http://tipc.io/contacts.html
- More details about TIPC specification: - More details about TIPC specification:

View File

@ -9016,9 +9016,16 @@ F: drivers/dma/fsl-edma*.*
FREESCALE ENETC ETHERNET DRIVERS FREESCALE ENETC ETHERNET DRIVERS
M: Claudiu Manoil <claudiu.manoil@nxp.com> M: Claudiu Manoil <claudiu.manoil@nxp.com>
M: Vladimir Oltean <vladimir.oltean@nxp.com> M: Vladimir Oltean <vladimir.oltean@nxp.com>
M: Wei Fang <wei.fang@nxp.com>
M: Clark Wang <xiaoning.wang@nxp.com>
L: imx@lists.linux.dev
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/net/fsl,enetc*.yaml
F: Documentation/devicetree/bindings/net/nxp,netc-blk-ctrl.yaml
F: drivers/net/ethernet/freescale/enetc/ F: drivers/net/ethernet/freescale/enetc/
F: include/linux/fsl/enetc_mdio.h
F: include/linux/fsl/netc_global.h
FREESCALE eTSEC ETHERNET DRIVER (GIANFAR) FREESCALE eTSEC ETHERNET DRIVER (GIANFAR)
M: Claudiu Manoil <claudiu.manoil@nxp.com> M: Claudiu Manoil <claudiu.manoil@nxp.com>
@ -10271,6 +10278,12 @@ S: Maintained
W: http://www.hisilicon.com W: http://www.hisilicon.com
F: drivers/net/ethernet/hisilicon/hns3/ F: drivers/net/ethernet/hisilicon/hns3/
HISILICON NETWORK HIBMCGE DRIVER
M: Jijie Shao <shaojijie@huawei.com>
L: netdev@vger.kernel.org
S: Maintained
F: drivers/net/ethernet/hisilicon/hibmcge/
HISILICON NETWORK SUBSYSTEM DRIVER HISILICON NETWORK SUBSYSTEM DRIVER
M: Jian Shen <shenjian15@huawei.com> M: Jian Shen <shenjian15@huawei.com>
M: Salil Mehta <salil.mehta@huawei.com> M: Salil Mehta <salil.mehta@huawei.com>
@ -14462,8 +14475,10 @@ M: Qingfang Deng <dqfext@gmail.com>
M: SkyLake Huang <SkyLake.Huang@mediatek.com> M: SkyLake Huang <SkyLake.Huang@mediatek.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/phy/mediatek-ge-soc.c F: drivers/net/phy/mediatek/mtk-ge-soc.c
F: drivers/net/phy/mediatek-ge.c F: drivers/net/phy/mediatek/mtk-phy-lib.c
F: drivers/net/phy/mediatek/mtk-ge.c
F: drivers/net/phy/mediatek/mtk.h
F: drivers/phy/mediatek/phy-mtk-xfi-tphy.c F: drivers/phy/mediatek/phy-mtk-xfi-tphy.c
MEDIATEK I2C CONTROLLER DRIVER MEDIATEK I2C CONTROLLER DRIVER
@ -15184,6 +15199,13 @@ S: Maintained
F: drivers/misc/lan966x_pci.c F: drivers/misc/lan966x_pci.c
F: drivers/misc/lan966x_pci.dtso F: drivers/misc/lan966x_pci.dtso
MICROCHIP LAN969X ETHERNET DRIVER
M: Daniel Machon <daniel.machon@microchip.com>
M: UNGLinuxDriver@microchip.com
L: netdev@vger.kernel.org
S: Maintained
F: drivers/net/ethernet/microchip/lan969x/*
MICROCHIP LCDFB DRIVER MICROCHIP LCDFB DRIVER
M: Nicolas Ferre <nicolas.ferre@microchip.com> M: Nicolas Ferre <nicolas.ferre@microchip.com>
L: linux-fbdev@vger.kernel.org L: linux-fbdev@vger.kernel.org
@ -16111,10 +16133,13 @@ F: include/linux/platform_data/wiznet.h
F: include/uapi/linux/cn_proc.h F: include/uapi/linux/cn_proc.h
F: include/uapi/linux/ethtool_netlink.h F: include/uapi/linux/ethtool_netlink.h
F: include/uapi/linux/if_* F: include/uapi/linux/if_*
F: include/uapi/linux/net_shaper.h
F: include/uapi/linux/netdev* F: include/uapi/linux/netdev*
F: tools/testing/selftests/drivers/net/ F: tools/testing/selftests/drivers/net/
X: Documentation/devicetree/bindings/net/bluetooth/ X: Documentation/devicetree/bindings/net/bluetooth/
X: Documentation/devicetree/bindings/net/can/
X: Documentation/devicetree/bindings/net/wireless/ X: Documentation/devicetree/bindings/net/wireless/
X: drivers/net/can/
X: drivers/net/wireless/ X: drivers/net/wireless/
NETWORKING DRIVERS (WIRELESS) NETWORKING DRIVERS (WIRELESS)
@ -16203,6 +16228,7 @@ X: include/net/mac80211.h
X: include/net/wext.h X: include/net/wext.h
X: net/9p/ X: net/9p/
X: net/bluetooth/ X: net/bluetooth/
X: net/can/
X: net/mac80211/ X: net/mac80211/
X: net/rfkill/ X: net/rfkill/
X: net/wireless/ X: net/wireless/
@ -16291,7 +16317,7 @@ F: include/net/mptcp.h
F: include/trace/events/mptcp.h F: include/trace/events/mptcp.h
F: include/uapi/linux/mptcp*.h F: include/uapi/linux/mptcp*.h
F: net/mptcp/ F: net/mptcp/
F: tools/testing/selftests/bpf/*/*mptcp*.c F: tools/testing/selftests/bpf/*/*mptcp*.[ch]
F: tools/testing/selftests/net/mptcp/ F: tools/testing/selftests/net/mptcp/
NETWORKING [TCP] NETWORKING [TCP]
@ -17458,6 +17484,7 @@ S: Supported
F: Documentation/core-api/packing.rst F: Documentation/core-api/packing.rst
F: include/linux/packing.h F: include/linux/packing.h
F: lib/packing.c F: lib/packing.c
F: lib/packing_test.c
PADATA PARALLEL EXECUTION MECHANISM PADATA PARALLEL EXECUTION MECHANISM
M: Steffen Klassert <steffen.klassert@secunet.com> M: Steffen Klassert <steffen.klassert@secunet.com>
@ -18663,6 +18690,13 @@ S: Maintained
F: drivers/ptp/ptp_vclock.c F: drivers/ptp/ptp_vclock.c
F: net/ethtool/phc_vclocks.c F: net/ethtool/phc_vclocks.c
PTP VMCLOCK SUPPORT
M: David Woodhouse <dwmw2@infradead.org>
L: netdev@vger.kernel.org
S: Maintained
F: drivers/ptp/ptp_vmclock.c
F: include/uapi/linux/vmclock-abi.h
PTRACE SUPPORT PTRACE SUPPORT
M: Oleg Nesterov <oleg@redhat.com> M: Oleg Nesterov <oleg@redhat.com>
S: Maintained S: Maintained
@ -19946,8 +19980,10 @@ L: linux-riscv@lists.infradead.org
S: Maintained S: Maintained
T: git https://github.com/pdp7/linux.git T: git https://github.com/pdp7/linux.git
F: Documentation/devicetree/bindings/clock/thead,th1520-clk-ap.yaml F: Documentation/devicetree/bindings/clock/thead,th1520-clk-ap.yaml
F: Documentation/devicetree/bindings/net/thead,th1520-gmac.yaml
F: arch/riscv/boot/dts/thead/ F: arch/riscv/boot/dts/thead/
F: drivers/clk/thead/clk-th1520-ap.c F: drivers/clk/thead/clk-th1520-ap.c
F: drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c
F: include/dt-bindings/clock/thead,th1520-clk-ap.h F: include/dt-bindings/clock/thead,th1520-clk-ap.h
RNBD BLOCK DRIVERS RNBD BLOCK DRIVERS
@ -20340,6 +20376,12 @@ F: Documentation/arch/s390/pci.rst
F: arch/s390/pci/ F: arch/s390/pci/
F: drivers/pci/hotplug/s390_pci_hpc.c F: drivers/pci/hotplug/s390_pci_hpc.c
S390 PTP DRIVER
M: Sven Schnelle <svens@linux.ibm.com>
L: linux-s390@vger.kernel.org
S: Supported
F: drivers/ptp/ptp_s390.c
S390 SCM DRIVER S390 SCM DRIVER
M: Vineeth Vijayan <vneethv@linux.ibm.com> M: Vineeth Vijayan <vneethv@linux.ibm.com>
L: linux-s390@vger.kernel.org L: linux-s390@vger.kernel.org
@ -21020,6 +21062,7 @@ M: Jan Karcher <jaka@linux.ibm.com>
R: D. Wythe <alibuda@linux.alibaba.com> R: D. Wythe <alibuda@linux.alibaba.com>
R: Tony Lu <tonylu@linux.alibaba.com> R: Tony Lu <tonylu@linux.alibaba.com>
R: Wen Gu <guwen@linux.alibaba.com> R: Wen Gu <guwen@linux.alibaba.com>
L: linux-rdma@vger.kernel.org
L: linux-s390@vger.kernel.org L: linux-s390@vger.kernel.org
S: Supported S: Supported
F: net/smc/ F: net/smc/
@ -22280,12 +22323,6 @@ S: Maintained
F: Documentation/devicetree/bindings/input/allwinner,sun4i-a10-lradc-keys.yaml F: Documentation/devicetree/bindings/input/allwinner,sun4i-a10-lradc-keys.yaml
F: drivers/input/keyboard/sun4i-lradc-keys.c F: drivers/input/keyboard/sun4i-lradc-keys.c
SUNDANCE NETWORK DRIVER
M: Denis Kirjanov <kda@linux-powerpc.org>
L: netdev@vger.kernel.org
S: Maintained
F: drivers/net/ethernet/dlink/sundance.c
SUNPLUS ETHERNET DRIVER SUNPLUS ETHERNET DRIVER
M: Wells Lu <wellslutw@gmail.com> M: Wells Lu <wellslutw@gmail.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org

View File

@ -146,6 +146,8 @@
#define SCM_DEVMEM_DMABUF SO_DEVMEM_DMABUF #define SCM_DEVMEM_DMABUF SO_DEVMEM_DMABUF
#define SO_DEVMEM_DONTNEED 80 #define SO_DEVMEM_DONTNEED 80
#define SCM_TS_OPT_ID 81
#if !defined(__KERNEL__) #if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 #if __BITS_PER_LONG == 64

View File

@ -275,7 +275,6 @@ CONFIG_DM9102=m
CONFIG_ULI526X=m CONFIG_ULI526X=m
CONFIG_PCMCIA_XIRCOM=m CONFIG_PCMCIA_XIRCOM=m
CONFIG_DL2K=m CONFIG_DL2K=m
CONFIG_SUNDANCE=m
CONFIG_PCMCIA_FMVJ18X=m CONFIG_PCMCIA_FMVJ18X=m
CONFIG_E100=m CONFIG_E100=m
CONFIG_E1000=m CONFIG_E1000=m

View File

@ -157,6 +157,8 @@
#define SCM_DEVMEM_DMABUF SO_DEVMEM_DMABUF #define SCM_DEVMEM_DMABUF SO_DEVMEM_DMABUF
#define SO_DEVMEM_DONTNEED 80 #define SO_DEVMEM_DONTNEED 80
#define SCM_TS_OPT_ID 81
#if !defined(__KERNEL__) #if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 #if __BITS_PER_LONG == 64

View File

@ -138,6 +138,8 @@
#define SCM_DEVMEM_DMABUF SO_DEVMEM_DMABUF #define SCM_DEVMEM_DMABUF SO_DEVMEM_DMABUF
#define SO_DEVMEM_DONTNEED 80 #define SO_DEVMEM_DONTNEED 80
#define SCM_TS_OPT_ID 0x404C
#if !defined(__KERNEL__) #if !defined(__KERNEL__)
#if __BITS_PER_LONG == 64 #if __BITS_PER_LONG == 64

View File

@ -25,15 +25,6 @@
: "=r"(_t) \ : "=r"(_t) \
: "r"(_r), "0"(_t)); : "r"(_r), "0"(_t));
static inline unsigned short from32to16(unsigned int x)
{
/* 32 bits --> 16 bits + carry */
x = (x & 0xffff) + (x >> 16);
/* 16 bits + carry --> 16 bits including carry */
x = (x & 0xffff) + (x >> 16);
return (unsigned short)x;
}
static inline unsigned int do_csum(const unsigned char * buff, int len) static inline unsigned int do_csum(const unsigned char * buff, int len)
{ {
int odd, count; int odd, count;
@ -85,7 +76,7 @@ static inline unsigned int do_csum(const unsigned char * buff, int len)
} }
if (len & 1) if (len & 1)
result += le16_to_cpu(*buff); result += le16_to_cpu(*buff);
result = from32to16(result); result = csum_from32to16(result);
if (odd) if (odd)
result = swab16(result); result = swab16(result);
out: out:
@ -102,7 +93,7 @@ __wsum csum_partial(const void *buff, int len, __wsum sum)
{ {
unsigned int result = do_csum(buff, len); unsigned int result = do_csum(buff, len);
addc(result, sum); addc(result, sum);
return (__force __wsum)from32to16(result); return (__force __wsum)csum_from32to16(result);
} }
EXPORT_SYMBOL(csum_partial); EXPORT_SYMBOL(csum_partial);

View File

@ -435,7 +435,6 @@ CONFIG_DM9102=m
CONFIG_ULI526X=m CONFIG_ULI526X=m
CONFIG_PCMCIA_XIRCOM=m CONFIG_PCMCIA_XIRCOM=m
CONFIG_DL2K=m CONFIG_DL2K=m
CONFIG_SUNDANCE=m
CONFIG_S2IO=m CONFIG_S2IO=m
CONFIG_FEC_MPC52xx=m CONFIG_FEC_MPC52xx=m
CONFIG_GIANFAR=m CONFIG_GIANFAR=m

View File

@ -94,5 +94,6 @@ struct stp_stzi {
int stp_sync_check(void); int stp_sync_check(void);
int stp_island_check(void); int stp_island_check(void);
void stp_queue_work(void); void stp_queue_work(void);
bool stp_enabled(void);
#endif /* __S390_STP_H */ #endif /* __S390_STP_H */

View File

@ -96,6 +96,7 @@ extern unsigned char ptff_function_mask[16];
#define PTFF_QAF 0x00 /* query available functions */ #define PTFF_QAF 0x00 /* query available functions */
#define PTFF_QTO 0x01 /* query tod offset */ #define PTFF_QTO 0x01 /* query tod offset */
#define PTFF_QSI 0x02 /* query steering information */ #define PTFF_QSI 0x02 /* query steering information */
#define PTFF_QPT 0x03 /* query physical clock */
#define PTFF_QUI 0x04 /* query UTC information */ #define PTFF_QUI 0x04 /* query UTC information */
#define PTFF_ATO 0x40 /* adjust tod offset */ #define PTFF_ATO 0x40 /* adjust tod offset */
#define PTFF_STO 0x41 /* set tod offset */ #define PTFF_STO 0x41 /* set tod offset */
@ -252,6 +253,11 @@ static __always_inline unsigned long tod_to_ns(unsigned long todval)
return ((todval >> 9) * 125) + (((todval & 0x1ff) * 125) >> 9); return ((todval >> 9) * 125) + (((todval & 0x1ff) * 125) >> 9);
} }
static __always_inline u128 eitod_to_ns(u128 todval)
{
return (todval * 125) >> 9;
}
/** /**
* tod_after - compare two 64 bit TOD values * tod_after - compare two 64 bit TOD values
* @a: first 64 bit TOD timestamp * @a: first 64 bit TOD timestamp

View File

@ -254,6 +254,7 @@ static struct clocksource clocksource_tod = {
.shift = 24, .shift = 24,
.flags = CLOCK_SOURCE_IS_CONTINUOUS, .flags = CLOCK_SOURCE_IS_CONTINUOUS,
.vdso_clock_mode = VDSO_CLOCKMODE_TOD, .vdso_clock_mode = VDSO_CLOCKMODE_TOD,
.id = CSID_S390_TOD,
}; };
struct clocksource * __init clocksource_default_clock(void) struct clocksource * __init clocksource_default_clock(void)
@ -467,6 +468,12 @@ static void __init stp_reset(void)
} }
} }
bool stp_enabled(void)
{
return test_bit(CLOCK_SYNC_HAS_STP, &clock_sync_flags) && stp_online;
}
EXPORT_SYMBOL(stp_enabled);
static void stp_timeout(struct timer_list *unused) static void stp_timeout(struct timer_list *unused)
{ {
queue_work(time_sync_wq, &stp_work); queue_work(time_sync_wq, &stp_work);

View File

@ -139,6 +139,8 @@
#define SCM_DEVMEM_DMABUF SO_DEVMEM_DMABUF #define SCM_DEVMEM_DMABUF SO_DEVMEM_DMABUF
#define SO_DEVMEM_DONTNEED 0x0059 #define SO_DEVMEM_DONTNEED 0x0059
#define SCM_TS_OPT_ID 0x005a
#if !defined(__KERNEL__) #if !defined(__KERNEL__)

View File

@ -103,26 +103,8 @@ typedef struct page *pgtable_t;
#define __pgd(x) ((pgd_t) { (x) } ) #define __pgd(x) ((pgd_t) { (x) } )
#define __pgprot(x) ((pgprot_t) { (x) } ) #define __pgprot(x) ((pgprot_t) { (x) } )
/*
* Pure 2^n version of get_order
* Use 'nsau' instructions if supported by the processor or the generic version.
*/
#if XCHAL_HAVE_NSA
static inline __attribute_const__ int get_order(unsigned long size)
{
int lz;
asm ("nsau %0, %1" : "=r" (lz) : "r" ((size - 1) >> PAGE_SHIFT));
return 32 - lz;
}
#else
# include <asm-generic/getorder.h> # include <asm-generic/getorder.h>
#endif
struct page; struct page;
struct vm_area_struct; struct vm_area_struct;
extern void clear_page(void *page); extern void clear_page(void *page);

View File

@ -541,11 +541,10 @@ static const struct bcm_subver_table bcm_usb_subver_table[] = {
static const char *btbcm_get_board_name(struct device *dev) static const char *btbcm_get_board_name(struct device *dev)
{ {
#ifdef CONFIG_OF #ifdef CONFIG_OF
struct device_node *root; struct device_node *root __free(device_node) = of_find_node_by_path("/");
char *board_type; char *board_type;
const char *tmp; const char *tmp;
root = of_find_node_by_path("/");
if (!root) if (!root)
return NULL; return NULL;
@ -555,7 +554,6 @@ static const char *btbcm_get_board_name(struct device *dev)
/* get rid of any '/' in the compatible string */ /* get rid of any '/' in the compatible string */
board_type = devm_kstrdup(dev, tmp, GFP_KERNEL); board_type = devm_kstrdup(dev, tmp, GFP_KERNEL);
strreplace(board_type, '/', '-'); strreplace(board_type, '/', '-');
of_node_put(root);
return board_type; return board_type;
#else #else

View File

@ -1040,7 +1040,7 @@ static int btintel_download_firmware_payload(struct hci_dev *hdev,
* as needed. * as needed.
* *
* Send set of commands with 4 byte alignment from the * Send set of commands with 4 byte alignment from the
* firmware data buffer as a single Data fragement. * firmware data buffer as a single Data fragment.
*/ */
if (!(frag_len % 4)) { if (!(frag_len % 4)) {
err = btintel_secure_send(hdev, 0x01, frag_len, fw_ptr); err = btintel_secure_send(hdev, 0x01, frag_len, fw_ptr);
@ -1252,6 +1252,12 @@ static void btintel_reset_to_bootloader(struct hci_dev *hdev)
struct intel_reset params; struct intel_reset params;
struct sk_buff *skb; struct sk_buff *skb;
/* PCIe transport uses shared hardware reset mechanism for recovery
* which gets triggered in pcie *setup* function on error.
*/
if (hdev->bus == HCI_PCI)
return;
/* Send Intel Reset command. This will result in /* Send Intel Reset command. This will result in
* re-enumeration of BT controller. * re-enumeration of BT controller.
* *
@ -1267,6 +1273,7 @@ static void btintel_reset_to_bootloader(struct hci_dev *hdev)
* boot_param: Boot address * boot_param: Boot address
* *
*/ */
params.reset_type = 0x01; params.reset_type = 0x01;
params.patch_enable = 0x01; params.patch_enable = 0x01;
params.ddc_reload = 0x01; params.ddc_reload = 0x01;
@ -1841,6 +1848,37 @@ static int btintel_boot_wait(struct hci_dev *hdev, ktime_t calltime, int msec)
return 0; return 0;
} }
static int btintel_boot_wait_d0(struct hci_dev *hdev, ktime_t calltime,
int msec)
{
ktime_t delta, rettime;
unsigned long long duration;
int err;
bt_dev_info(hdev, "Waiting for device transition to d0");
err = btintel_wait_on_flag_timeout(hdev, INTEL_WAIT_FOR_D0,
TASK_INTERRUPTIBLE,
msecs_to_jiffies(msec));
if (err == -EINTR) {
bt_dev_err(hdev, "Device d0 move interrupted");
return -EINTR;
}
if (err) {
bt_dev_err(hdev, "Device d0 move timeout");
return -ETIMEDOUT;
}
rettime = ktime_get();
delta = ktime_sub(rettime, calltime);
duration = (unsigned long long)ktime_to_ns(delta) >> 10;
bt_dev_info(hdev, "Device moved to D0 in %llu usecs", duration);
return 0;
}
static int btintel_boot(struct hci_dev *hdev, u32 boot_addr) static int btintel_boot(struct hci_dev *hdev, u32 boot_addr)
{ {
ktime_t calltime; ktime_t calltime;
@ -1849,6 +1887,7 @@ static int btintel_boot(struct hci_dev *hdev, u32 boot_addr)
calltime = ktime_get(); calltime = ktime_get();
btintel_set_flag(hdev, INTEL_BOOTING); btintel_set_flag(hdev, INTEL_BOOTING);
btintel_set_flag(hdev, INTEL_WAIT_FOR_D0);
err = btintel_send_intel_reset(hdev, boot_addr); err = btintel_send_intel_reset(hdev, boot_addr);
if (err) { if (err) {
@ -1861,13 +1900,28 @@ static int btintel_boot(struct hci_dev *hdev, u32 boot_addr)
* is done by the operational firmware sending bootup notification. * is done by the operational firmware sending bootup notification.
* *
* Booting into operational firmware should not take longer than * Booting into operational firmware should not take longer than
* 1 second. However if that happens, then just fail the setup * 5 second. However if that happens, then just fail the setup
* since something went wrong. * since something went wrong.
*/ */
err = btintel_boot_wait(hdev, calltime, 1000); err = btintel_boot_wait(hdev, calltime, 5000);
if (err == -ETIMEDOUT) if (err == -ETIMEDOUT) {
btintel_reset_to_bootloader(hdev); btintel_reset_to_bootloader(hdev);
goto exit_error;
}
if (hdev->bus == HCI_PCI) {
/* In case of PCIe, after receiving bootup event, driver performs
* D0 entry by writing 0 to sleep control register (check
* btintel_pcie_recv_event())
* Firmware acks with alive interrupt indicating host is full ready to
* perform BT operation. Lets wait here till INTEL_WAIT_FOR_D0
* bit is cleared.
*/
calltime = ktime_get();
err = btintel_boot_wait_d0(hdev, calltime, 2000);
}
exit_error:
return err; return err;
} }
@ -2693,20 +2747,32 @@ static int btintel_set_dsbr(struct hci_dev *hdev, struct intel_version_tlv *ver)
struct btintel_dsbr_cmd cmd; struct btintel_dsbr_cmd cmd;
struct sk_buff *skb; struct sk_buff *skb;
u32 dsbr, cnvi;
u8 status; u8 status;
u32 dsbr;
bool apply_dsbr;
int err; int err;
/* DSBR command needs to be sent for BlazarI + B0 step product after cnvi = ver->cnvi_top & 0xfff;
* downloading IML image. /* DSBR command needs to be sent for,
* 1. BlazarI or BlazarIW + B0 step product in IML image.
* 2. Gale Peak2 or BlazarU in OP image.
*/ */
apply_dsbr = (ver->img_type == BTINTEL_IMG_IML &&
((ver->cnvi_top & 0xfff) == BTINTEL_CNVI_BLAZARI) &&
INTEL_CNVX_TOP_STEP(ver->cnvi_top) == 0x01);
if (!apply_dsbr) switch (cnvi) {
case BTINTEL_CNVI_BLAZARI:
case BTINTEL_CNVI_BLAZARIW:
if (ver->img_type == BTINTEL_IMG_IML &&
INTEL_CNVX_TOP_STEP(ver->cnvi_top) == 0x01)
break;
return 0; return 0;
case BTINTEL_CNVI_GAP:
case BTINTEL_CNVI_BLAZARU:
if (ver->img_type == BTINTEL_IMG_OP &&
hdev->bus == HCI_USB)
break;
return 0;
default:
return 0;
}
dsbr = 0; dsbr = 0;
err = btintel_uefi_get_dsbr(&dsbr); err = btintel_uefi_get_dsbr(&dsbr);
@ -2749,6 +2815,13 @@ int btintel_bootloader_setup_tlv(struct hci_dev *hdev,
*/ */
boot_param = 0x00000000; boot_param = 0x00000000;
/* In case of PCIe, this function might get called multiple times with
* same hdev instance if there is any error on firmware download.
* Need to clear stale bits of previous firmware download attempt.
*/
for (int i = 0; i < __INTEL_NUM_FLAGS; i++)
btintel_clear_flag(hdev, i);
btintel_set_flag(hdev, INTEL_BOOTLOADER); btintel_set_flag(hdev, INTEL_BOOTLOADER);
err = btintel_prepare_fw_download_tlv(hdev, ver, &boot_param); err = btintel_prepare_fw_download_tlv(hdev, ver, &boot_param);
@ -2835,7 +2908,7 @@ void btintel_set_msft_opcode(struct hci_dev *hdev, u8 hw_variant)
case 0x12: /* ThP */ case 0x12: /* ThP */
case 0x13: /* HrP */ case 0x13: /* HrP */
case 0x14: /* CcP */ case 0x14: /* CcP */
/* All Intel new genration controllers support the Microsoft vendor /* All Intel new generation controllers support the Microsoft vendor
* extension are using 0xFC1E for VsMsftOpCode. * extension are using 0xFC1E for VsMsftOpCode.
*/ */
case 0x17: case 0x17:
@ -3273,7 +3346,7 @@ int btintel_configure_setup(struct hci_dev *hdev, const char *driver_name)
} }
EXPORT_SYMBOL_GPL(btintel_configure_setup); EXPORT_SYMBOL_GPL(btintel_configure_setup);
static int btintel_diagnostics(struct hci_dev *hdev, struct sk_buff *skb) int btintel_diagnostics(struct hci_dev *hdev, struct sk_buff *skb)
{ {
struct intel_tlv *tlv = (void *)&skb->data[5]; struct intel_tlv *tlv = (void *)&skb->data[5];
@ -3301,6 +3374,7 @@ static int btintel_diagnostics(struct hci_dev *hdev, struct sk_buff *skb)
recv_frame: recv_frame:
return hci_recv_frame(hdev, skb); return hci_recv_frame(hdev, skb);
} }
EXPORT_SYMBOL_GPL(btintel_diagnostics);
int btintel_recv_event(struct hci_dev *hdev, struct sk_buff *skb) int btintel_recv_event(struct hci_dev *hdev, struct sk_buff *skb)
{ {
@ -3320,7 +3394,8 @@ int btintel_recv_event(struct hci_dev *hdev, struct sk_buff *skb)
* indicating that the bootup completed. * indicating that the bootup completed.
*/ */
btintel_bootup(hdev, ptr, len); btintel_bootup(hdev, ptr, len);
break; kfree_skb(skb);
return 0;
case 0x06: case 0x06:
/* When the firmware loading completes the /* When the firmware loading completes the
* device sends out a vendor specific event * device sends out a vendor specific event
@ -3328,7 +3403,8 @@ int btintel_recv_event(struct hci_dev *hdev, struct sk_buff *skb)
* loading. * loading.
*/ */
btintel_secure_send_result(hdev, ptr, len); btintel_secure_send_result(hdev, ptr, len);
break; kfree_skb(skb);
return 0;
} }
} }

View File

@ -53,6 +53,9 @@ struct intel_tlv {
} __packed; } __packed;
#define BTINTEL_CNVI_BLAZARI 0x900 #define BTINTEL_CNVI_BLAZARI 0x900
#define BTINTEL_CNVI_BLAZARIW 0x901
#define BTINTEL_CNVI_GAP 0x910
#define BTINTEL_CNVI_BLAZARU 0x930
#define BTINTEL_IMG_BOOTLOADER 0x01 /* Bootloader image */ #define BTINTEL_IMG_BOOTLOADER 0x01 /* Bootloader image */
#define BTINTEL_IMG_IML 0x02 /* Intermediate image */ #define BTINTEL_IMG_IML 0x02 /* Intermediate image */
@ -178,6 +181,7 @@ enum {
INTEL_ROM_LEGACY, INTEL_ROM_LEGACY,
INTEL_ROM_LEGACY_NO_WBS_SUPPORT, INTEL_ROM_LEGACY_NO_WBS_SUPPORT,
INTEL_ACPI_RESET_ACTIVE, INTEL_ACPI_RESET_ACTIVE,
INTEL_WAIT_FOR_D0,
__INTEL_NUM_FLAGS, __INTEL_NUM_FLAGS,
}; };
@ -249,6 +253,7 @@ int btintel_bootloader_setup_tlv(struct hci_dev *hdev,
int btintel_shutdown_combined(struct hci_dev *hdev); int btintel_shutdown_combined(struct hci_dev *hdev);
void btintel_hw_error(struct hci_dev *hdev, u8 code); void btintel_hw_error(struct hci_dev *hdev, u8 code);
void btintel_print_fseq_info(struct hci_dev *hdev); void btintel_print_fseq_info(struct hci_dev *hdev);
int btintel_diagnostics(struct hci_dev *hdev, struct sk_buff *skb);
#else #else
static inline int btintel_check_bdaddr(struct hci_dev *hdev) static inline int btintel_check_bdaddr(struct hci_dev *hdev)
@ -382,4 +387,9 @@ static inline void btintel_hw_error(struct hci_dev *hdev, u8 code)
static inline void btintel_print_fseq_info(struct hci_dev *hdev) static inline void btintel_print_fseq_info(struct hci_dev *hdev)
{ {
} }
static inline int btintel_diagnostics(struct hci_dev *hdev, struct sk_buff *skb)
{
return -EOPNOTSUPP;
}
#endif #endif

View File

@ -48,6 +48,17 @@ MODULE_DEVICE_TABLE(pci, btintel_pcie_table);
#define BTINTEL_PCIE_HCI_EVT_PKT 0x00000004 #define BTINTEL_PCIE_HCI_EVT_PKT 0x00000004
#define BTINTEL_PCIE_HCI_ISO_PKT 0x00000005 #define BTINTEL_PCIE_HCI_ISO_PKT 0x00000005
/* Alive interrupt context */
enum {
BTINTEL_PCIE_ROM,
BTINTEL_PCIE_FW_DL,
BTINTEL_PCIE_HCI_RESET,
BTINTEL_PCIE_INTEL_HCI_RESET1,
BTINTEL_PCIE_INTEL_HCI_RESET2,
BTINTEL_PCIE_D0,
BTINTEL_PCIE_D3
};
static inline void ipc_print_ia_ring(struct hci_dev *hdev, struct ia *ia, static inline void ipc_print_ia_ring(struct hci_dev *hdev, struct ia *ia,
u16 queue_num) u16 queue_num)
{ {
@ -64,24 +75,6 @@ static inline void ipc_print_urbd1(struct hci_dev *hdev, struct urbd1 *urbd1,
index, urbd1->frbd_tag, urbd1->status, urbd1->fixed); index, urbd1->frbd_tag, urbd1->status, urbd1->fixed);
} }
static int btintel_pcie_poll_bit(struct btintel_pcie_data *data, u32 offset,
u32 bits, u32 mask, int timeout_us)
{
int t = 0;
u32 reg;
do {
reg = btintel_pcie_rd_reg32(data, offset);
if ((reg & mask) == (bits & mask))
return t;
udelay(POLL_INTERVAL_US);
t += POLL_INTERVAL_US;
} while (t < timeout_us);
return -ETIMEDOUT;
}
static struct btintel_pcie_data *btintel_pcie_get_data(struct msix_entry *entry) static struct btintel_pcie_data *btintel_pcie_get_data(struct msix_entry *entry)
{ {
u8 queue = entry->entry; u8 queue = entry->entry;
@ -237,10 +230,47 @@ static void btintel_pcie_reset_ia(struct btintel_pcie_data *data)
memset(data->ia.cr_tia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); memset(data->ia.cr_tia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES);
} }
static void btintel_pcie_reset_bt(struct btintel_pcie_data *data) static int btintel_pcie_reset_bt(struct btintel_pcie_data *data)
{ {
btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, u32 reg;
BTINTEL_PCIE_CSR_FUNC_CTRL_SW_RESET); int retry = 3;
reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG);
reg &= ~(BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_ENA |
BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_INIT |
BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_INIT);
reg |= BTINTEL_PCIE_CSR_FUNC_CTRL_BUS_MASTER_DISCON;
btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg);
do {
reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG);
if (reg & BTINTEL_PCIE_CSR_FUNC_CTRL_BUS_MASTER_STS)
break;
usleep_range(10000, 12000);
} while (--retry > 0);
usleep_range(10000, 12000);
reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG);
reg &= ~(BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_ENA |
BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_INIT |
BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_INIT);
reg |= BTINTEL_PCIE_CSR_FUNC_CTRL_SW_RESET;
btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg);
usleep_range(10000, 12000);
reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG);
bt_dev_dbg(data->hdev, "csr register after reset: 0x%8.8x", reg);
reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG);
/* If shared hardware reset is success then boot stage register shall be
* set to 0
*/
return reg == 0 ? 0 : -ENODEV;
} }
/* This function enables BT function by setting BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_INIT bit in /* This function enables BT function by setting BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_INIT bit in
@ -252,6 +282,7 @@ static void btintel_pcie_reset_bt(struct btintel_pcie_data *data)
static int btintel_pcie_enable_bt(struct btintel_pcie_data *data) static int btintel_pcie_enable_bt(struct btintel_pcie_data *data)
{ {
int err; int err;
u32 reg;
data->gp0_received = false; data->gp0_received = false;
@ -267,22 +298,17 @@ static int btintel_pcie_enable_bt(struct btintel_pcie_data *data)
data->boot_stage_cache = 0x0; data->boot_stage_cache = 0x0;
/* Set MAC_INIT bit to start primary bootloader */ /* Set MAC_INIT bit to start primary bootloader */
btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG);
reg &= ~(BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_INIT |
btintel_pcie_set_reg_bits(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, BTINTEL_PCIE_CSR_FUNC_CTRL_BUS_MASTER_DISCON |
BTINTEL_PCIE_CSR_FUNC_CTRL_SW_RESET);
reg |= (BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_ENA |
BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_INIT); BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_INIT);
/* Wait until MAC_ACCESS is granted */ btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg);
err = btintel_pcie_poll_bit(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG,
BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_ACCESS_STS,
BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_ACCESS_STS,
BTINTEL_DEFAULT_MAC_ACCESS_TIMEOUT_US);
if (err < 0)
return -ENODEV;
/* MAC is ready. Enable BT FUNC */ /* MAC is ready. Enable BT FUNC */
btintel_pcie_set_reg_bits(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, btintel_pcie_set_reg_bits(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG,
BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_ENA |
BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_INIT); BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_INIT);
btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG);
@ -290,8 +316,9 @@ static int btintel_pcie_enable_bt(struct btintel_pcie_data *data)
/* wait for interrupt from the device after booting up to primary /* wait for interrupt from the device after booting up to primary
* bootloader. * bootloader.
*/ */
data->alive_intr_ctxt = BTINTEL_PCIE_ROM;
err = wait_event_timeout(data->gp0_wait_q, data->gp0_received, err = wait_event_timeout(data->gp0_wait_q, data->gp0_received,
msecs_to_jiffies(BTINTEL_DEFAULT_INTR_TIMEOUT)); msecs_to_jiffies(BTINTEL_DEFAULT_INTR_TIMEOUT_MS));
if (!err) if (!err)
return -ETIME; return -ETIME;
@ -302,12 +329,77 @@ static int btintel_pcie_enable_bt(struct btintel_pcie_data *data)
return 0; return 0;
} }
/* BIT(0) - ROM, BIT(1) - IML and BIT(3) - OP
* Sometimes during firmware image switching from ROM to IML or IML to OP image,
* the previous image bit is not cleared by firmware when alive interrupt is
* received. Driver needs to take care of these sticky bits when deciding the
* current image running on controller.
* Ex: 0x10 and 0x11 - both represents that controller is running IML
*/
static inline bool btintel_pcie_in_rom(struct btintel_pcie_data *data)
{
return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_ROM &&
!(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_IML) &&
!(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW);
}
static inline bool btintel_pcie_in_op(struct btintel_pcie_data *data)
{
return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW;
}
static inline bool btintel_pcie_in_iml(struct btintel_pcie_data *data)
{
return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_IML &&
!(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW);
}
static inline bool btintel_pcie_in_d3(struct btintel_pcie_data *data)
{
return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY;
}
static inline bool btintel_pcie_in_d0(struct btintel_pcie_data *data)
{
return !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY);
}
static void btintel_pcie_wr_sleep_cntrl(struct btintel_pcie_data *data,
u32 dxstate)
{
bt_dev_dbg(data->hdev, "writing sleep_ctl_reg: 0x%8.8x", dxstate);
btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_IPC_SLEEP_CTL_REG, dxstate);
}
static inline char *btintel_pcie_alivectxt_state2str(u32 alive_intr_ctxt)
{
switch (alive_intr_ctxt) {
case BTINTEL_PCIE_ROM:
return "rom";
case BTINTEL_PCIE_FW_DL:
return "fw_dl";
case BTINTEL_PCIE_D0:
return "d0";
case BTINTEL_PCIE_D3:
return "d3";
case BTINTEL_PCIE_HCI_RESET:
return "hci_reset";
case BTINTEL_PCIE_INTEL_HCI_RESET1:
return "intel_reset1";
case BTINTEL_PCIE_INTEL_HCI_RESET2:
return "intel_reset2";
default:
return "unknown";
}
}
/* This function handles the MSI-X interrupt for gp0 cause (bit 0 in /* This function handles the MSI-X interrupt for gp0 cause (bit 0 in
* BTINTEL_PCIE_CSR_MSIX_HW_INT_CAUSES) which is sent for boot stage and image response. * BTINTEL_PCIE_CSR_MSIX_HW_INT_CAUSES) which is sent for boot stage and image response.
*/ */
static void btintel_pcie_msix_gp0_handler(struct btintel_pcie_data *data) static void btintel_pcie_msix_gp0_handler(struct btintel_pcie_data *data)
{ {
u32 reg; bool submit_rx, signal_waitq;
u32 reg, old_ctxt;
/* This interrupt is for three different causes and it is not easy to /* This interrupt is for three different causes and it is not easy to
* know what causes the interrupt. So, it compares each register value * know what causes the interrupt. So, it compares each register value
@ -317,20 +409,87 @@ static void btintel_pcie_msix_gp0_handler(struct btintel_pcie_data *data)
if (reg != data->boot_stage_cache) if (reg != data->boot_stage_cache)
data->boot_stage_cache = reg; data->boot_stage_cache = reg;
bt_dev_dbg(data->hdev, "Alive context: %s old_boot_stage: 0x%8.8x new_boot_stage: 0x%8.8x",
btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt),
data->boot_stage_cache, reg);
reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IMG_RESPONSE_REG); reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IMG_RESPONSE_REG);
if (reg != data->img_resp_cache) if (reg != data->img_resp_cache)
data->img_resp_cache = reg; data->img_resp_cache = reg;
data->gp0_received = true; data->gp0_received = true;
/* If the boot stage is OP or IML, reset IA and start RX again */ old_ctxt = data->alive_intr_ctxt;
if (data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW || submit_rx = false;
data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_IML) { signal_waitq = false;
switch (data->alive_intr_ctxt) {
case BTINTEL_PCIE_ROM:
data->alive_intr_ctxt = BTINTEL_PCIE_FW_DL;
signal_waitq = true;
break;
case BTINTEL_PCIE_FW_DL:
/* Error case is already handled. Ideally control shall not
* reach here
*/
break;
case BTINTEL_PCIE_INTEL_HCI_RESET1:
if (btintel_pcie_in_op(data)) {
submit_rx = true;
break;
}
if (btintel_pcie_in_iml(data)) {
submit_rx = true;
data->alive_intr_ctxt = BTINTEL_PCIE_FW_DL;
break;
}
break;
case BTINTEL_PCIE_INTEL_HCI_RESET2:
if (btintel_test_and_clear_flag(data->hdev, INTEL_WAIT_FOR_D0)) {
btintel_wake_up_flag(data->hdev, INTEL_WAIT_FOR_D0);
data->alive_intr_ctxt = BTINTEL_PCIE_D0;
}
break;
case BTINTEL_PCIE_D0:
if (btintel_pcie_in_d3(data)) {
data->alive_intr_ctxt = BTINTEL_PCIE_D3;
signal_waitq = true;
break;
}
break;
case BTINTEL_PCIE_D3:
if (btintel_pcie_in_d0(data)) {
data->alive_intr_ctxt = BTINTEL_PCIE_D0;
submit_rx = true;
signal_waitq = true;
break;
}
break;
case BTINTEL_PCIE_HCI_RESET:
data->alive_intr_ctxt = BTINTEL_PCIE_D0;
submit_rx = true;
signal_waitq = true;
break;
default:
bt_dev_err(data->hdev, "Unknown state: 0x%2.2x",
data->alive_intr_ctxt);
break;
}
if (submit_rx) {
btintel_pcie_reset_ia(data); btintel_pcie_reset_ia(data);
btintel_pcie_start_rx(data); btintel_pcie_start_rx(data);
} }
if (signal_waitq) {
bt_dev_dbg(data->hdev, "wake up gp0 wait_q");
wake_up(&data->gp0_wait_q); wake_up(&data->gp0_wait_q);
}
if (old_ctxt != data->alive_intr_ctxt)
bt_dev_dbg(data->hdev, "alive context changed: %s -> %s",
btintel_pcie_alivectxt_state2str(old_ctxt),
btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt));
} }
/* This function handles the MSX-X interrupt for rx queue 0 which is for TX /* This function handles the MSX-X interrupt for rx queue 0 which is for TX
@ -364,6 +523,83 @@ static void btintel_pcie_msix_tx_handle(struct btintel_pcie_data *data)
} }
} }
static int btintel_pcie_recv_event(struct hci_dev *hdev, struct sk_buff *skb)
{
struct hci_event_hdr *hdr = (void *)skb->data;
const char diagnostics_hdr[] = { 0x87, 0x80, 0x03 };
struct btintel_pcie_data *data = hci_get_drvdata(hdev);
if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff &&
hdr->plen > 0) {
const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1;
unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1;
if (btintel_test_flag(hdev, INTEL_BOOTLOADER)) {
switch (skb->data[2]) {
case 0x02:
/* When switching to the operational firmware
* the device sends a vendor specific event
* indicating that the bootup completed.
*/
btintel_bootup(hdev, ptr, len);
/* If bootup event is from operational image,
* driver needs to write sleep control register to
* move into D0 state
*/
if (btintel_pcie_in_op(data)) {
btintel_pcie_wr_sleep_cntrl(data, BTINTEL_PCIE_STATE_D0);
data->alive_intr_ctxt = BTINTEL_PCIE_INTEL_HCI_RESET2;
kfree_skb(skb);
return 0;
}
if (btintel_pcie_in_iml(data)) {
/* In case of IML, there is no concept
* of D0 transition. Just mimic as if
* IML moved to D0 by clearing INTEL_WAIT_FOR_D0
* bit and waking up the task waiting on
* INTEL_WAIT_FOR_D0. This is required
* as intel_boot() is common function for
* both IML and OP image loading.
*/
if (btintel_test_and_clear_flag(data->hdev,
INTEL_WAIT_FOR_D0))
btintel_wake_up_flag(data->hdev,
INTEL_WAIT_FOR_D0);
}
kfree_skb(skb);
return 0;
case 0x06:
/* When the firmware loading completes the
* device sends out a vendor specific event
* indicating the result of the firmware
* loading.
*/
btintel_secure_send_result(hdev, ptr, len);
kfree_skb(skb);
return 0;
}
}
/* Handle all diagnostics events separately. May still call
* hci_recv_frame.
*/
if (len >= sizeof(diagnostics_hdr) &&
memcmp(&skb->data[2], diagnostics_hdr,
sizeof(diagnostics_hdr)) == 0) {
return btintel_diagnostics(hdev, skb);
}
/* This is a debug event that comes from IML and OP image when it
* starts execution. There is no need pass this event to stack.
*/
if (skb->data[2] == 0x97)
return 0;
}
return hci_recv_frame(hdev, skb);
}
/* Process the received rx data /* Process the received rx data
* It check the frame header to identify the data type and create skb * It check the frame header to identify the data type and create skb
* and calling HCI API * and calling HCI API
@ -465,7 +701,7 @@ static int btintel_pcie_recv_frame(struct btintel_pcie_data *data,
hdev->stat.byte_rx += plen; hdev->stat.byte_rx += plen;
if (pcie_pkt_type == BTINTEL_PCIE_HCI_EVT_PKT) if (pcie_pkt_type == BTINTEL_PCIE_HCI_EVT_PKT)
ret = btintel_recv_event(hdev, new_skb); ret = btintel_pcie_recv_event(hdev, new_skb);
else else
ret = hci_recv_frame(hdev, new_skb); ret = hci_recv_frame(hdev, new_skb);
@ -516,10 +752,8 @@ static int btintel_pcie_submit_rx_work(struct btintel_pcie_data *data, u8 status
buf += sizeof(*rfh_hdr); buf += sizeof(*rfh_hdr);
skb = alloc_skb(len, GFP_ATOMIC); skb = alloc_skb(len, GFP_ATOMIC);
if (!skb) { if (!skb)
ret = -ENOMEM;
goto resubmit; goto resubmit;
}
skb_put_data(skb, buf, len); skb_put_data(skb, buf, len);
skb_queue_tail(&data->rx_skb_q, skb); skb_queue_tail(&data->rx_skb_q, skb);
@ -734,13 +968,9 @@ static int btintel_pcie_config_pcie(struct pci_dev *pdev,
return err; return err;
} }
err = pcim_iomap_regions(pdev, BIT(0), KBUILD_MODNAME); data->base_addr = pcim_iomap_region(pdev, 0, KBUILD_MODNAME);
if (err) if (IS_ERR(data->base_addr))
return err; return PTR_ERR(data->base_addr);
data->base_addr = pcim_iomap_table(pdev)[0];
if (!data->base_addr)
return -ENODEV;
err = btintel_pcie_setup_irq(data); err = btintel_pcie_setup_irq(data);
if (err) if (err)
@ -1053,8 +1283,11 @@ static int btintel_pcie_send_frame(struct hci_dev *hdev,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct btintel_pcie_data *data = hci_get_drvdata(hdev); struct btintel_pcie_data *data = hci_get_drvdata(hdev);
struct hci_command_hdr *cmd;
__u16 opcode = ~0;
int ret; int ret;
u32 type; u32 type;
u32 old_ctxt;
/* Due to the fw limitation, the type header of the packet should be /* Due to the fw limitation, the type header of the packet should be
* 4 bytes unlike 1 byte for UART. In UART, the firmware can read * 4 bytes unlike 1 byte for UART. In UART, the firmware can read
@ -1073,6 +1306,8 @@ static int btintel_pcie_send_frame(struct hci_dev *hdev,
switch (hci_skb_pkt_type(skb)) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
type = BTINTEL_PCIE_HCI_CMD_PKT; type = BTINTEL_PCIE_HCI_CMD_PKT;
cmd = (void *)skb->data;
opcode = le16_to_cpu(cmd->opcode);
if (btintel_test_flag(hdev, INTEL_BOOTLOADER)) { if (btintel_test_flag(hdev, INTEL_BOOTLOADER)) {
struct hci_command_hdr *cmd = (void *)skb->data; struct hci_command_hdr *cmd = (void *)skb->data;
__u16 opcode = le16_to_cpu(cmd->opcode); __u16 opcode = le16_to_cpu(cmd->opcode);
@ -1111,6 +1346,30 @@ static int btintel_pcie_send_frame(struct hci_dev *hdev,
bt_dev_err(hdev, "Failed to send frame (%d)", ret); bt_dev_err(hdev, "Failed to send frame (%d)", ret);
goto exit_error; goto exit_error;
} }
if (type == BTINTEL_PCIE_HCI_CMD_PKT &&
(opcode == HCI_OP_RESET || opcode == 0xfc01)) {
old_ctxt = data->alive_intr_ctxt;
data->alive_intr_ctxt =
(opcode == 0xfc01 ? BTINTEL_PCIE_INTEL_HCI_RESET1 :
BTINTEL_PCIE_HCI_RESET);
bt_dev_dbg(data->hdev, "sent cmd: 0x%4.4x alive context changed: %s -> %s",
opcode, btintel_pcie_alivectxt_state2str(old_ctxt),
btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt));
if (opcode == HCI_OP_RESET) {
data->gp0_received = false;
ret = wait_event_timeout(data->gp0_wait_q,
data->gp0_received,
msecs_to_jiffies(BTINTEL_DEFAULT_INTR_TIMEOUT_MS));
if (!ret) {
hdev->stat.err_tx++;
bt_dev_err(hdev, "No alive interrupt received for %s",
btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt));
ret = -ETIME;
goto exit_error;
}
}
}
hdev->stat.byte_tx += skb->len; hdev->stat.byte_tx += skb->len;
kfree_skb(skb); kfree_skb(skb);
@ -1128,7 +1387,7 @@ static void btintel_pcie_release_hdev(struct btintel_pcie_data *data)
data->hdev = NULL; data->hdev = NULL;
} }
static int btintel_pcie_setup(struct hci_dev *hdev) static int btintel_pcie_setup_internal(struct hci_dev *hdev)
{ {
const u8 param[1] = { 0xFF }; const u8 param[1] = { 0xFF };
struct intel_version_tlv ver_tlv; struct intel_version_tlv ver_tlv;
@ -1219,6 +1478,32 @@ exit_error:
return err; return err;
} }
static int btintel_pcie_setup(struct hci_dev *hdev)
{
int err, fw_dl_retry = 0;
struct btintel_pcie_data *data = hci_get_drvdata(hdev);
while ((err = btintel_pcie_setup_internal(hdev)) && fw_dl_retry++ < 1) {
bt_dev_err(hdev, "Firmware download retry count: %d",
fw_dl_retry);
err = btintel_pcie_reset_bt(data);
if (err) {
bt_dev_err(hdev, "Failed to do shr reset: %d", err);
break;
}
usleep_range(10000, 12000);
btintel_pcie_reset_ia(data);
btintel_pcie_config_msix(data);
err = btintel_pcie_enable_bt(data);
if (err) {
bt_dev_err(hdev, "Failed to enable hardware: %d", err);
break;
}
btintel_pcie_start_rx(data);
}
return err;
}
static int btintel_pcie_setup_hdev(struct btintel_pcie_data *data) static int btintel_pcie_setup_hdev(struct btintel_pcie_data *data)
{ {
int err; int err;

View File

@ -12,6 +12,7 @@
#define BTINTEL_PCIE_CSR_HW_REV_REG (BTINTEL_PCIE_CSR_BASE + 0x028) #define BTINTEL_PCIE_CSR_HW_REV_REG (BTINTEL_PCIE_CSR_BASE + 0x028)
#define BTINTEL_PCIE_CSR_RF_ID_REG (BTINTEL_PCIE_CSR_BASE + 0x09C) #define BTINTEL_PCIE_CSR_RF_ID_REG (BTINTEL_PCIE_CSR_BASE + 0x09C)
#define BTINTEL_PCIE_CSR_BOOT_STAGE_REG (BTINTEL_PCIE_CSR_BASE + 0x108) #define BTINTEL_PCIE_CSR_BOOT_STAGE_REG (BTINTEL_PCIE_CSR_BASE + 0x108)
#define BTINTEL_PCIE_CSR_IPC_SLEEP_CTL_REG (BTINTEL_PCIE_CSR_BASE + 0x114)
#define BTINTEL_PCIE_CSR_CI_ADDR_LSB_REG (BTINTEL_PCIE_CSR_BASE + 0x118) #define BTINTEL_PCIE_CSR_CI_ADDR_LSB_REG (BTINTEL_PCIE_CSR_BASE + 0x118)
#define BTINTEL_PCIE_CSR_CI_ADDR_MSB_REG (BTINTEL_PCIE_CSR_BASE + 0x11C) #define BTINTEL_PCIE_CSR_CI_ADDR_MSB_REG (BTINTEL_PCIE_CSR_BASE + 0x11C)
#define BTINTEL_PCIE_CSR_IMG_RESPONSE_REG (BTINTEL_PCIE_CSR_BASE + 0x12C) #define BTINTEL_PCIE_CSR_IMG_RESPONSE_REG (BTINTEL_PCIE_CSR_BASE + 0x12C)
@ -22,6 +23,8 @@
#define BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_INIT (BIT(6)) #define BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_INIT (BIT(6))
#define BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_INIT (BIT(7)) #define BTINTEL_PCIE_CSR_FUNC_CTRL_FUNC_INIT (BIT(7))
#define BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_ACCESS_STS (BIT(20)) #define BTINTEL_PCIE_CSR_FUNC_CTRL_MAC_ACCESS_STS (BIT(20))
#define BTINTEL_PCIE_CSR_FUNC_CTRL_BUS_MASTER_STS (BIT(28))
#define BTINTEL_PCIE_CSR_FUNC_CTRL_BUS_MASTER_DISCON (BIT(29))
#define BTINTEL_PCIE_CSR_FUNC_CTRL_SW_RESET (BIT(31)) #define BTINTEL_PCIE_CSR_FUNC_CTRL_SW_RESET (BIT(31))
/* Value for BTINTEL_PCIE_CSR_BOOT_STAGE register */ /* Value for BTINTEL_PCIE_CSR_BOOT_STAGE register */
@ -32,6 +35,7 @@
#define BTINTEL_PCIE_CSR_BOOT_STAGE_IML_LOCKDOWN (BIT(11)) #define BTINTEL_PCIE_CSR_BOOT_STAGE_IML_LOCKDOWN (BIT(11))
#define BTINTEL_PCIE_CSR_BOOT_STAGE_MAC_ACCESS_ON (BIT(16)) #define BTINTEL_PCIE_CSR_BOOT_STAGE_MAC_ACCESS_ON (BIT(16))
#define BTINTEL_PCIE_CSR_BOOT_STAGE_ALIVE (BIT(23)) #define BTINTEL_PCIE_CSR_BOOT_STAGE_ALIVE (BIT(23))
#define BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY (BIT(24))
/* Registers for MSI-X */ /* Registers for MSI-X */
#define BTINTEL_PCIE_CSR_MSIX_BASE (0x2000) #define BTINTEL_PCIE_CSR_MSIX_BASE (0x2000)
@ -55,6 +59,16 @@ enum msix_hw_int_causes {
BTINTEL_PCIE_MSIX_HW_INT_CAUSES_GP0 = BIT(0), /* cause 32 */ BTINTEL_PCIE_MSIX_HW_INT_CAUSES_GP0 = BIT(0), /* cause 32 */
}; };
/* PCIe device states
* Host-Device interface is active
* Host-Device interface is inactive(as reflected by IPC_SLEEP_CONTROL_CSR_AD)
* Host-Device interface is inactive(as reflected by IPC_SLEEP_CONTROL_CSR_AD)
*/
enum {
BTINTEL_PCIE_STATE_D0 = 0,
BTINTEL_PCIE_STATE_D3_HOT = 2,
BTINTEL_PCIE_STATE_D3_COLD = 3,
};
#define BTINTEL_PCIE_MSIX_NON_AUTO_CLEAR_CAUSE BIT(7) #define BTINTEL_PCIE_MSIX_NON_AUTO_CLEAR_CAUSE BIT(7)
/* Minimum and Maximum number of MSI-X Vector /* Minimum and Maximum number of MSI-X Vector
@ -67,7 +81,7 @@ enum msix_hw_int_causes {
#define BTINTEL_DEFAULT_MAC_ACCESS_TIMEOUT_US 200000 #define BTINTEL_DEFAULT_MAC_ACCESS_TIMEOUT_US 200000
/* Default interrupt timeout in msec */ /* Default interrupt timeout in msec */
#define BTINTEL_DEFAULT_INTR_TIMEOUT 3000 #define BTINTEL_DEFAULT_INTR_TIMEOUT_MS 3000
/* The number of descriptors in TX/RX queues */ /* The number of descriptors in TX/RX queues */
#define BTINTEL_DESCS_COUNT 16 #define BTINTEL_DESCS_COUNT 16
@ -343,6 +357,7 @@ struct rxq {
* @ia: Index Array struct * @ia: Index Array struct
* @txq: TX Queue struct * @txq: TX Queue struct
* @rxq: RX Queue struct * @rxq: RX Queue struct
* @alive_intr_ctxt: Alive interrupt context
*/ */
struct btintel_pcie_data { struct btintel_pcie_data {
struct pci_dev *pdev; struct pci_dev *pdev;
@ -389,6 +404,7 @@ struct btintel_pcie_data {
struct ia ia; struct ia ia;
struct txq txq; struct txq txq;
struct rxq rxq; struct rxq rxq;
u32 alive_intr_ctxt;
}; };
static inline u32 btintel_pcie_rd_reg32(struct btintel_pcie_data *data, static inline u32 btintel_pcie_rd_reg32(struct btintel_pcie_data *data,

View File

@ -324,7 +324,7 @@ int btmtk_setup_firmware(struct hci_dev *hdev, const char *fwname,
wmt_params.data = NULL; wmt_params.data = NULL;
wmt_params.status = NULL; wmt_params.status = NULL;
/* Activate funciton the firmware providing to */ /* Activate function the firmware providing to */
err = wmt_cmd_sync(hdev, &wmt_params); err = wmt_cmd_sync(hdev, &wmt_params);
if (err < 0) { if (err < 0) {
bt_dev_err(hdev, "Failed to send wmt rst (%d)", err); bt_dev_err(hdev, "Failed to send wmt rst (%d)", err);
@ -1215,7 +1215,6 @@ static int btmtk_usb_isointf_init(struct hci_dev *hdev)
struct sk_buff *skb; struct sk_buff *skb;
int err; int err;
init_usb_anchor(&btmtk_data->isopkt_anchor);
spin_lock_init(&btmtk_data->isorxlock); spin_lock_init(&btmtk_data->isorxlock);
__set_mtk_intr_interface(hdev); __set_mtk_intr_interface(hdev);

View File

@ -681,7 +681,7 @@ static int btmtksdio_open(struct hci_dev *hdev)
if (err < 0) if (err < 0)
goto err_release_irq; goto err_release_irq;
/* Explitly set write-1-clear method */ /* Explicitly set write-1-clear method */
val = sdio_readl(bdev->func, MTK_REG_CHCR, &err); val = sdio_readl(bdev->func, MTK_REG_CHCR, &err);
if (err < 0) if (err < 0)
goto err_release_irq; goto err_release_irq;
@ -1328,6 +1328,8 @@ static int btmtksdio_probe(struct sdio_func *func,
{ {
struct btmtksdio_dev *bdev; struct btmtksdio_dev *bdev;
struct hci_dev *hdev; struct hci_dev *hdev;
struct device_node *old_node;
bool restore_node;
int err; int err;
bdev = devm_kzalloc(&func->dev, sizeof(*bdev), GFP_KERNEL); bdev = devm_kzalloc(&func->dev, sizeof(*bdev), GFP_KERNEL);
@ -1396,7 +1398,7 @@ static int btmtksdio_probe(struct sdio_func *func,
if (pm_runtime_enabled(bdev->dev)) if (pm_runtime_enabled(bdev->dev))
pm_runtime_disable(bdev->dev); pm_runtime_disable(bdev->dev);
/* As explaination in drivers/mmc/core/sdio_bus.c tells us: /* As explanation in drivers/mmc/core/sdio_bus.c tells us:
* Unbound SDIO functions are always suspended. * Unbound SDIO functions are always suspended.
* During probe, the function is set active and the usage count * During probe, the function is set active and the usage count
* is incremented. If the driver supports runtime PM, * is incremented. If the driver supports runtime PM,
@ -1411,13 +1413,24 @@ static int btmtksdio_probe(struct sdio_func *func,
if (err) if (err)
bt_dev_err(hdev, "failed to initialize device wakeup"); bt_dev_err(hdev, "failed to initialize device wakeup");
restore_node = false;
if (!of_device_is_compatible(bdev->dev->of_node, "mediatek,mt7921s-bluetooth")) {
restore_node = true;
old_node = bdev->dev->of_node;
bdev->dev->of_node = of_find_compatible_node(NULL, NULL, bdev->dev->of_node = of_find_compatible_node(NULL, NULL,
"mediatek,mt7921s-bluetooth"); "mediatek,mt7921s-bluetooth");
}
bdev->reset = devm_gpiod_get_optional(bdev->dev, "reset", bdev->reset = devm_gpiod_get_optional(bdev->dev, "reset",
GPIOD_OUT_LOW); GPIOD_OUT_LOW);
if (IS_ERR(bdev->reset)) if (IS_ERR(bdev->reset))
err = PTR_ERR(bdev->reset); err = PTR_ERR(bdev->reset);
if (restore_node) {
of_node_put(bdev->dev->of_node);
bdev->dev->of_node = old_node;
}
return err; return err;
} }

View File

@ -327,7 +327,7 @@ mtk_stp_split(struct btmtkuart_dev *bdev, const unsigned char *data, int count,
if (count <= 0) if (count <= 0)
return NULL; return NULL;
/* Tranlate to how much the size of data H4 can handle so far */ /* Translate to how much the size of data H4 can handle so far */
*sz_h4 = min_t(int, count, bdev->stp_dlen); *sz_h4 = min_t(int, count, bdev->stp_dlen);
/* Update the remaining size of STP packet */ /* Update the remaining size of STP packet */

View File

@ -16,6 +16,7 @@
#include <linux/crc8.h> #include <linux/crc8.h>
#include <linux/crc32.h> #include <linux/crc32.h>
#include <linux/string_helpers.h> #include <linux/string_helpers.h>
#include <linux/gpio/consumer.h>
#include <net/bluetooth/bluetooth.h> #include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h> #include <net/bluetooth/hci_core.h>
@ -34,16 +35,17 @@
/* NXP HW err codes */ /* NXP HW err codes */
#define BTNXPUART_IR_HW_ERR 0xb0 #define BTNXPUART_IR_HW_ERR 0xb0
#define FIRMWARE_W8987 "uart8987_bt_v0.bin" #define FIRMWARE_W8987 "uart8987_bt.bin"
#define FIRMWARE_W8987_OLD "uartuart8987_bt.bin" #define FIRMWARE_W8987_OLD "uartuart8987_bt.bin"
#define FIRMWARE_W8997 "uart8997_bt_v4.bin" #define FIRMWARE_W8997 "uart8997_bt_v4.bin"
#define FIRMWARE_W8997_OLD "uartuart8997_bt_v4.bin" #define FIRMWARE_W8997_OLD "uartuart8997_bt_v4.bin"
#define FIRMWARE_W9098 "uart9098_bt_v1.bin" #define FIRMWARE_W9098 "uart9098_bt_v1.bin"
#define FIRMWARE_W9098_OLD "uartuart9098_bt_v1.bin" #define FIRMWARE_W9098_OLD "uartuart9098_bt_v1.bin"
#define FIRMWARE_IW416 "uartiw416_bt_v0.bin" #define FIRMWARE_IW416 "uartiw416_bt.bin"
#define FIRMWARE_IW416_OLD "uartiw416_bt_v0.bin"
#define FIRMWARE_IW612 "uartspi_n61x_v1.bin.se" #define FIRMWARE_IW612 "uartspi_n61x_v1.bin.se"
#define FIRMWARE_IW615 "uartspi_iw610_v0.bin" #define FIRMWARE_IW610 "uartspi_iw610.bin"
#define FIRMWARE_SECURE_IW615 "uartspi_iw610_v0.bin.se" #define FIRMWARE_SECURE_IW610 "uartspi_iw610.bin.se"
#define FIRMWARE_IW624 "uartiw624_bt.bin" #define FIRMWARE_IW624 "uartiw624_bt.bin"
#define FIRMWARE_SECURE_IW624 "uartiw624_bt.bin.se" #define FIRMWARE_SECURE_IW624 "uartiw624_bt.bin.se"
#define FIRMWARE_AW693 "uartaw693_bt.bin" #define FIRMWARE_AW693 "uartaw693_bt.bin"
@ -59,8 +61,8 @@
#define CHIP_ID_IW624c 0x8001 #define CHIP_ID_IW624c 0x8001
#define CHIP_ID_AW693a0 0x8200 #define CHIP_ID_AW693a0 0x8200
#define CHIP_ID_AW693a1 0x8201 #define CHIP_ID_AW693a1 0x8201
#define CHIP_ID_IW615a0 0x8800 #define CHIP_ID_IW610a0 0x8800
#define CHIP_ID_IW615a1 0x8801 #define CHIP_ID_IW610a1 0x8801
#define FW_SECURE_MASK 0xc0 #define FW_SECURE_MASK 0xc0
#define FW_OPEN 0x00 #define FW_OPEN 0x00
@ -81,6 +83,7 @@
#define WAKEUP_METHOD_BREAK 1 #define WAKEUP_METHOD_BREAK 1
#define WAKEUP_METHOD_EXT_BREAK 2 #define WAKEUP_METHOD_EXT_BREAK 2
#define WAKEUP_METHOD_RTS 3 #define WAKEUP_METHOD_RTS 3
#define WAKEUP_METHOD_GPIO 4
#define WAKEUP_METHOD_INVALID 0xff #define WAKEUP_METHOD_INVALID 0xff
/* power save mode status */ /* power save mode status */
@ -134,6 +137,7 @@ struct ps_data {
bool driver_sent_cmd; bool driver_sent_cmd;
u16 h2c_ps_interval; u16 h2c_ps_interval;
u16 c2h_ps_interval; u16 c2h_ps_interval;
struct gpio_desc *h2c_ps_gpio;
struct hci_dev *hdev; struct hci_dev *hdev;
struct work_struct work; struct work_struct work;
struct timer_list ps_timer; struct timer_list ps_timer;
@ -364,7 +368,7 @@ static void ps_control(struct hci_dev *hdev, u8 ps_state)
{ {
struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev); struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev);
struct ps_data *psdata = &nxpdev->psdata; struct ps_data *psdata = &nxpdev->psdata;
int status; int status = 0;
if (psdata->ps_state == ps_state || if (psdata->ps_state == ps_state ||
!test_bit(BTNXPUART_SERDEV_OPEN, &nxpdev->tx_state)) !test_bit(BTNXPUART_SERDEV_OPEN, &nxpdev->tx_state))
@ -372,6 +376,14 @@ static void ps_control(struct hci_dev *hdev, u8 ps_state)
mutex_lock(&psdata->ps_lock); mutex_lock(&psdata->ps_lock);
switch (psdata->cur_h2c_wakeupmode) { switch (psdata->cur_h2c_wakeupmode) {
case WAKEUP_METHOD_GPIO:
if (ps_state == PS_STATE_AWAKE)
gpiod_set_value_cansleep(psdata->h2c_ps_gpio, 0);
else
gpiod_set_value_cansleep(psdata->h2c_ps_gpio, 1);
bt_dev_dbg(hdev, "Set h2c_ps_gpio: %s",
str_high_low(ps_state == PS_STATE_SLEEP));
break;
case WAKEUP_METHOD_DTR: case WAKEUP_METHOD_DTR:
if (ps_state == PS_STATE_AWAKE) if (ps_state == PS_STATE_AWAKE)
status = serdev_device_set_tiocm(nxpdev->serdev, TIOCM_DTR, 0); status = serdev_device_set_tiocm(nxpdev->serdev, TIOCM_DTR, 0);
@ -421,15 +433,29 @@ static void ps_timeout_func(struct timer_list *t)
} }
} }
static void ps_setup(struct hci_dev *hdev) static int ps_setup(struct hci_dev *hdev)
{ {
struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev); struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev);
struct serdev_device *serdev = nxpdev->serdev;
struct ps_data *psdata = &nxpdev->psdata; struct ps_data *psdata = &nxpdev->psdata;
psdata->h2c_ps_gpio = devm_gpiod_get_optional(&serdev->dev, "device-wakeup",
GPIOD_OUT_LOW);
if (IS_ERR(psdata->h2c_ps_gpio)) {
bt_dev_err(hdev, "Error fetching device-wakeup-gpios: %ld",
PTR_ERR(psdata->h2c_ps_gpio));
return PTR_ERR(psdata->h2c_ps_gpio);
}
if (!psdata->h2c_ps_gpio)
psdata->h2c_wakeup_gpio = 0xff;
psdata->hdev = hdev; psdata->hdev = hdev;
INIT_WORK(&psdata->work, ps_work_func); INIT_WORK(&psdata->work, ps_work_func);
mutex_init(&psdata->ps_lock); mutex_init(&psdata->ps_lock);
timer_setup(&psdata->ps_timer, ps_timeout_func, 0); timer_setup(&psdata->ps_timer, ps_timeout_func, 0);
return 0;
} }
static bool ps_wakeup(struct btnxpuart_dev *nxpdev) static bool ps_wakeup(struct btnxpuart_dev *nxpdev)
@ -515,6 +541,9 @@ static int send_wakeup_method_cmd(struct hci_dev *hdev, void *data)
pcmd.c2h_wakeupmode = psdata->c2h_wakeupmode; pcmd.c2h_wakeupmode = psdata->c2h_wakeupmode;
pcmd.c2h_wakeup_gpio = psdata->c2h_wakeup_gpio; pcmd.c2h_wakeup_gpio = psdata->c2h_wakeup_gpio;
switch (psdata->h2c_wakeupmode) { switch (psdata->h2c_wakeupmode) {
case WAKEUP_METHOD_GPIO:
pcmd.h2c_wakeupmode = BT_CTRL_WAKEUP_METHOD_GPIO;
break;
case WAKEUP_METHOD_DTR: case WAKEUP_METHOD_DTR:
pcmd.h2c_wakeupmode = BT_CTRL_WAKEUP_METHOD_DSR; pcmd.h2c_wakeupmode = BT_CTRL_WAKEUP_METHOD_DSR;
break; break;
@ -549,6 +578,7 @@ static void ps_init(struct hci_dev *hdev)
{ {
struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev); struct btnxpuart_dev *nxpdev = hci_get_drvdata(hdev);
struct ps_data *psdata = &nxpdev->psdata; struct ps_data *psdata = &nxpdev->psdata;
u8 default_h2c_wakeup_mode = DEFAULT_H2C_WAKEUP_MODE;
serdev_device_set_tiocm(nxpdev->serdev, 0, TIOCM_RTS); serdev_device_set_tiocm(nxpdev->serdev, 0, TIOCM_RTS);
usleep_range(5000, 10000); usleep_range(5000, 10000);
@ -560,8 +590,17 @@ static void ps_init(struct hci_dev *hdev)
psdata->c2h_wakeup_gpio = 0xff; psdata->c2h_wakeup_gpio = 0xff;
psdata->cur_h2c_wakeupmode = WAKEUP_METHOD_INVALID; psdata->cur_h2c_wakeupmode = WAKEUP_METHOD_INVALID;
if (psdata->h2c_ps_gpio)
default_h2c_wakeup_mode = WAKEUP_METHOD_GPIO;
psdata->h2c_ps_interval = PS_DEFAULT_TIMEOUT_PERIOD_MS; psdata->h2c_ps_interval = PS_DEFAULT_TIMEOUT_PERIOD_MS;
switch (DEFAULT_H2C_WAKEUP_MODE) {
switch (default_h2c_wakeup_mode) {
case WAKEUP_METHOD_GPIO:
psdata->h2c_wakeupmode = WAKEUP_METHOD_GPIO;
gpiod_set_value_cansleep(psdata->h2c_ps_gpio, 0);
usleep_range(5000, 10000);
break;
case WAKEUP_METHOD_DTR: case WAKEUP_METHOD_DTR:
psdata->h2c_wakeupmode = WAKEUP_METHOD_DTR; psdata->h2c_wakeupmode = WAKEUP_METHOD_DTR;
serdev_device_set_tiocm(nxpdev->serdev, 0, TIOCM_DTR); serdev_device_set_tiocm(nxpdev->serdev, 0, TIOCM_DTR);
@ -946,12 +985,12 @@ static char *nxp_get_fw_name_from_chipid(struct hci_dev *hdev, u16 chipid,
else else
bt_dev_err(hdev, "Illegal loader version %02x", loader_ver); bt_dev_err(hdev, "Illegal loader version %02x", loader_ver);
break; break;
case CHIP_ID_IW615a0: case CHIP_ID_IW610a0:
case CHIP_ID_IW615a1: case CHIP_ID_IW610a1:
if ((loader_ver & FW_SECURE_MASK) == FW_OPEN) if ((loader_ver & FW_SECURE_MASK) == FW_OPEN)
fw_name = FIRMWARE_IW615; fw_name = FIRMWARE_IW610;
else if ((loader_ver & FW_SECURE_MASK) != FW_AUTH_ILLEGAL) else if ((loader_ver & FW_SECURE_MASK) != FW_AUTH_ILLEGAL)
fw_name = FIRMWARE_SECURE_IW615; fw_name = FIRMWARE_SECURE_IW610;
else else
bt_dev_err(hdev, "Illegal loader version %02x", loader_ver); bt_dev_err(hdev, "Illegal loader version %02x", loader_ver);
break; break;
@ -971,6 +1010,9 @@ static char *nxp_get_old_fw_name_from_chipid(struct hci_dev *hdev, u16 chipid,
case CHIP_ID_W9098: case CHIP_ID_W9098:
fw_name_old = FIRMWARE_W9098_OLD; fw_name_old = FIRMWARE_W9098_OLD;
break; break;
case CHIP_ID_IW416:
fw_name_old = FIRMWARE_IW416_OLD;
break;
} }
return fw_name_old; return fw_name_old;
} }
@ -1275,6 +1317,9 @@ static int nxp_enqueue(struct hci_dev *hdev, struct sk_buff *skb)
psdata->c2h_wakeup_gpio = wakeup_parm.c2h_wakeup_gpio; psdata->c2h_wakeup_gpio = wakeup_parm.c2h_wakeup_gpio;
psdata->h2c_wakeup_gpio = wakeup_parm.h2c_wakeup_gpio; psdata->h2c_wakeup_gpio = wakeup_parm.h2c_wakeup_gpio;
switch (wakeup_parm.h2c_wakeupmode) { switch (wakeup_parm.h2c_wakeupmode) {
case BT_CTRL_WAKEUP_METHOD_GPIO:
psdata->h2c_wakeupmode = WAKEUP_METHOD_GPIO;
break;
case BT_CTRL_WAKEUP_METHOD_DSR: case BT_CTRL_WAKEUP_METHOD_DSR:
psdata->h2c_wakeupmode = WAKEUP_METHOD_DTR; psdata->h2c_wakeupmode = WAKEUP_METHOD_DTR;
break; break;
@ -1505,13 +1550,17 @@ static int nxp_serdev_probe(struct serdev_device *serdev)
if (hci_register_dev(hdev) < 0) { if (hci_register_dev(hdev) < 0) {
dev_err(&serdev->dev, "Can't register HCI device\n"); dev_err(&serdev->dev, "Can't register HCI device\n");
hci_free_dev(hdev); goto probe_fail;
return -ENODEV;
} }
ps_setup(hdev); if (ps_setup(hdev))
goto probe_fail;
return 0; return 0;
probe_fail:
hci_free_dev(hdev);
return -ENODEV;
} }
static void nxp_serdev_remove(struct serdev_device *serdev) static void nxp_serdev_remove(struct serdev_device *serdev)

View File

@ -1371,7 +1371,7 @@ int btrtl_shutdown_realtek(struct hci_dev *hdev)
/* According to the vendor driver, BT must be reset on close to avoid /* According to the vendor driver, BT must be reset on close to avoid
* firmware crash. * firmware crash.
*/ */
skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT); skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_CMD_TIMEOUT);
if (IS_ERR(skb)) { if (IS_ERR(skb)) {
ret = PTR_ERR(skb); ret = PTR_ERR(skb);
bt_dev_err(hdev, "HCI reset during shutdown failed"); bt_dev_err(hdev, "HCI reset during shutdown failed");

View File

@ -371,6 +371,12 @@ static const struct usb_device_id quirks_table[] = {
/* QCA WCN785x chipset */ /* QCA WCN785x chipset */
{ USB_DEVICE(0x0cf3, 0xe700), .driver_info = BTUSB_QCA_WCN6855 | { USB_DEVICE(0x0cf3, 0xe700), .driver_info = BTUSB_QCA_WCN6855 |
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe0fc), .driver_info = BTUSB_QCA_WCN6855 |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe0f3), .driver_info = BTUSB_QCA_WCN6855 |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x13d3, 0x3623), .driver_info = BTUSB_QCA_WCN6855 |
BTUSB_WIDEBAND_SPEECH },
/* Broadcom BCM2035 */ /* Broadcom BCM2035 */
{ USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 }, { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
@ -524,6 +530,8 @@ static const struct usb_device_id quirks_table[] = {
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x13d3, 0x3591), .driver_info = BTUSB_REALTEK | { USB_DEVICE(0x13d3, 0x3591), .driver_info = BTUSB_REALTEK |
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe123), .driver_info = BTUSB_REALTEK |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe125), .driver_info = BTUSB_REALTEK | { USB_DEVICE(0x0489, 0xe125), .driver_info = BTUSB_REALTEK |
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
@ -563,6 +571,16 @@ static const struct usb_device_id quirks_table[] = {
{ USB_DEVICE(0x043e, 0x3109), .driver_info = BTUSB_MEDIATEK | { USB_DEVICE(0x043e, 0x3109), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
/* Additional MediaTek MT7920 Bluetooth devices */
{ USB_DEVICE(0x0489, 0xe134), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x13d3, 0x3620), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x13d3, 0x3621), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x13d3, 0x3622), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH },
/* Additional MediaTek MT7921 Bluetooth devices */ /* Additional MediaTek MT7921 Bluetooth devices */
{ USB_DEVICE(0x0489, 0xe0c8), .driver_info = BTUSB_MEDIATEK | { USB_DEVICE(0x0489, 0xe0c8), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
@ -630,12 +648,24 @@ static const struct usb_device_id quirks_table[] = {
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
/* Additional MediaTek MT7925 Bluetooth devices */ /* Additional MediaTek MT7925 Bluetooth devices */
{ USB_DEVICE(0x0489, 0xe111), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe113), .driver_info = BTUSB_MEDIATEK | { USB_DEVICE(0x0489, 0xe113), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe118), .driver_info = BTUSB_MEDIATEK | { USB_DEVICE(0x0489, 0xe118), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe11e), .driver_info = BTUSB_MEDIATEK | { USB_DEVICE(0x0489, 0xe11e), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe124), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe139), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe14f), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe150), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x0489, 0xe151), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x13d3, 0x3602), .driver_info = BTUSB_MEDIATEK | { USB_DEVICE(0x13d3, 0x3602), .driver_info = BTUSB_MEDIATEK |
BTUSB_WIDEBAND_SPEECH }, BTUSB_WIDEBAND_SPEECH },
{ USB_DEVICE(0x13d3, 0x3603), .driver_info = BTUSB_MEDIATEK | { USB_DEVICE(0x13d3, 0x3603), .driver_info = BTUSB_MEDIATEK |
@ -846,6 +876,7 @@ struct btusb_data {
int (*suspend)(struct hci_dev *hdev); int (*suspend)(struct hci_dev *hdev);
int (*resume)(struct hci_dev *hdev); int (*resume)(struct hci_dev *hdev);
int (*disconnect)(struct hci_dev *hdev);
int oob_wake_irq; /* irq for out-of-band wake-on-bt */ int oob_wake_irq; /* irq for out-of-band wake-on-bt */
unsigned cmd_timeout_cnt; unsigned cmd_timeout_cnt;
@ -1061,7 +1092,7 @@ static inline void btusb_free_frags(struct btusb_data *data)
static int btusb_recv_event(struct btusb_data *data, struct sk_buff *skb) static int btusb_recv_event(struct btusb_data *data, struct sk_buff *skb)
{ {
if (data->intr_interval) { if (data->intr_interval) {
/* Trigger dequeue immediatelly if an event is received */ /* Trigger dequeue immediately if an event is received */
schedule_delayed_work(&data->rx_work, 0); schedule_delayed_work(&data->rx_work, 0);
} }
@ -2616,13 +2647,14 @@ static void btusb_mtk_claim_iso_intf(struct btusb_data *data)
} }
set_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags); set_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
init_usb_anchor(&btmtk_data->isopkt_anchor);
} }
static void btusb_mtk_release_iso_intf(struct btusb_data *data) static void btusb_mtk_release_iso_intf(struct hci_dev *hdev)
{ {
struct btmtk_data *btmtk_data = hci_get_priv(data->hdev); struct btmtk_data *btmtk_data = hci_get_priv(hdev);
if (btmtk_data->isopkt_intf) { if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) {
usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor); usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor);
clear_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags); clear_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags);
@ -2636,6 +2668,16 @@ static void btusb_mtk_release_iso_intf(struct btusb_data *data)
clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags); clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags);
} }
static int btusb_mtk_disconnect(struct hci_dev *hdev)
{
/* This function describes the specific additional steps taken by MediaTek
* when Bluetooth usb driver's resume function is called.
*/
btusb_mtk_release_iso_intf(hdev);
return 0;
}
static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data) static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
{ {
struct btusb_data *data = hci_get_drvdata(hdev); struct btusb_data *data = hci_get_drvdata(hdev);
@ -2652,8 +2694,8 @@ static int btusb_mtk_reset(struct hci_dev *hdev, void *rst_data)
if (err < 0) if (err < 0)
return err; return err;
if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags)) /* Release MediaTek ISO data interface */
btusb_mtk_release_iso_intf(data); btusb_mtk_release_iso_intf(hdev);
btusb_stop_traffic(data); btusb_stop_traffic(data);
usb_kill_anchored_urbs(&data->tx_anchor); usb_kill_anchored_urbs(&data->tx_anchor);
@ -2698,22 +2740,24 @@ static int btusb_mtk_setup(struct hci_dev *hdev)
btmtk_data->reset_sync = btusb_mtk_reset; btmtk_data->reset_sync = btusb_mtk_reset;
/* Claim ISO data interface and endpoint */ /* Claim ISO data interface and endpoint */
if (!test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) {
btmtk_data->isopkt_intf = usb_ifnum_to_if(data->udev, MTK_ISO_IFNUM); btmtk_data->isopkt_intf = usb_ifnum_to_if(data->udev, MTK_ISO_IFNUM);
if (btmtk_data->isopkt_intf)
btusb_mtk_claim_iso_intf(data); btusb_mtk_claim_iso_intf(data);
}
return btmtk_usb_setup(hdev); return btmtk_usb_setup(hdev);
} }
static int btusb_mtk_shutdown(struct hci_dev *hdev) static int btusb_mtk_shutdown(struct hci_dev *hdev)
{ {
struct btusb_data *data = hci_get_drvdata(hdev); int ret;
struct btmtk_data *btmtk_data = hci_get_priv(hdev);
if (test_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags)) ret = btmtk_usb_shutdown(hdev);
btusb_mtk_release_iso_intf(data);
return btmtk_usb_shutdown(hdev); /* Release MediaTek iso interface after shutdown */
btusb_mtk_release_iso_intf(hdev);
return ret;
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
@ -3825,6 +3869,7 @@ static int btusb_probe(struct usb_interface *intf,
data->recv_acl = btmtk_usb_recv_acl; data->recv_acl = btmtk_usb_recv_acl;
data->suspend = btmtk_usb_suspend; data->suspend = btmtk_usb_suspend;
data->resume = btmtk_usb_resume; data->resume = btmtk_usb_resume;
data->disconnect = btusb_mtk_disconnect;
} }
if (id->driver_info & BTUSB_SWAVE) { if (id->driver_info & BTUSB_SWAVE) {
@ -3896,6 +3941,8 @@ static int btusb_probe(struct usb_interface *intf,
set_bit(HCI_QUIRK_BROKEN_SET_RPA_TIMEOUT, &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_EXT_SCAN, &hdev->quirks);
set_bit(HCI_QUIRK_BROKEN_READ_ENC_KEY_SIZE, &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);
} }
if (!reset) if (!reset)
@ -4013,6 +4060,9 @@ static void btusb_disconnect(struct usb_interface *intf)
if (data->diag) if (data->diag)
usb_set_intfdata(data->diag, NULL); usb_set_intfdata(data->diag, NULL);
if (data->disconnect)
data->disconnect(hdev);
hci_unregister_dev(hdev); hci_unregister_dev(hdev);
if (intf == data->intf) { if (intf == data->intf) {

View File

@ -1068,17 +1068,17 @@ static struct clk *bcm_get_txco(struct device *dev)
struct clk *clk; struct clk *clk;
/* New explicit name */ /* New explicit name */
clk = devm_clk_get(dev, "txco"); clk = devm_clk_get_optional(dev, "txco");
if (!IS_ERR(clk) || PTR_ERR(clk) == -EPROBE_DEFER) if (clk)
return clk; return clk;
/* Deprecated name */ /* Deprecated name */
clk = devm_clk_get(dev, "extclk"); clk = devm_clk_get_optional(dev, "extclk");
if (!IS_ERR(clk) || PTR_ERR(clk) == -EPROBE_DEFER) if (clk)
return clk; return clk;
/* Original code used no name at all */ /* Original code used no name at all */
return devm_clk_get(dev, NULL); return devm_clk_get_optional(dev, NULL);
} }
static int bcm_get_resources(struct bcm_device *dev) static int bcm_get_resources(struct bcm_device *dev)
@ -1093,21 +1093,12 @@ static int bcm_get_resources(struct bcm_device *dev)
return 0; return 0;
dev->txco_clk = bcm_get_txco(dev->dev); dev->txco_clk = bcm_get_txco(dev->dev);
if (IS_ERR(dev->txco_clk))
/* Handle deferred probing */
if (dev->txco_clk == ERR_PTR(-EPROBE_DEFER))
return PTR_ERR(dev->txco_clk); return PTR_ERR(dev->txco_clk);
/* Ignore all other errors as before */ dev->lpo_clk = devm_clk_get_optional(dev->dev, "lpo");
if (IS_ERR(dev->txco_clk))
dev->txco_clk = NULL;
dev->lpo_clk = devm_clk_get(dev->dev, "lpo");
if (dev->lpo_clk == ERR_PTR(-EPROBE_DEFER))
return PTR_ERR(dev->lpo_clk);
if (IS_ERR(dev->lpo_clk)) if (IS_ERR(dev->lpo_clk))
dev->lpo_clk = NULL; return PTR_ERR(dev->lpo_clk);
/* Check if we accidentally fetched the lpo clock twice */ /* Check if we accidentally fetched the lpo clock twice */
if (dev->lpo_clk && clk_is_match(dev->lpo_clk, dev->txco_clk)) { if (dev->lpo_clk && clk_is_match(dev->lpo_clk, dev->txco_clk)) {

View File

@ -594,7 +594,7 @@ static void hci_uart_tty_wakeup(struct tty_struct *tty)
* Called by tty low level driver when receive data is * Called by tty low level driver when receive data is
* available. * available.
* *
* Arguments: tty pointer to tty isntance data * Arguments: tty pointer to tty instance data
* data pointer to received data * data pointer to received data
* flags pointer to flags for data * flags pointer to flags for data
* count count of received data in bytes * count count of received data in bytes

View File

@ -305,7 +305,7 @@ static void ll_device_woke_up(struct hci_uart *hu)
hci_uart_tx_wakeup(hu); hci_uart_tx_wakeup(hu);
} }
/* Enqueue frame for transmittion (padding, crc, etc) */ /* Enqueue frame for transmission (padding, crc, etc) */
/* may be called from two simultaneous tasklets */ /* may be called from two simultaneous tasklets */
static int ll_enqueue(struct hci_uart *hu, struct sk_buff *skb) static int ll_enqueue(struct hci_uart *hu, struct sk_buff *skb)
{ {

View File

@ -501,7 +501,7 @@ static int nokia_close(struct hci_uart *hu)
return 0; return 0;
} }
/* Enqueue frame for transmittion (padding, crc, etc) */ /* Enqueue frame for transmission (padding, crc, etc) */
static int nokia_enqueue(struct hci_uart *hu, struct sk_buff *skb) static int nokia_enqueue(struct hci_uart *hu, struct sk_buff *skb)
{ {
struct nokia_bt_dev *btdev = hu->priv; struct nokia_bt_dev *btdev = hu->priv;

View File

@ -873,7 +873,7 @@ static void device_woke_up(struct hci_uart *hu)
hci_uart_tx_wakeup(hu); hci_uart_tx_wakeup(hu);
} }
/* Enqueue frame for transmittion (padding, crc, etc) may be called from /* Enqueue frame for transmission (padding, crc, etc) may be called from
* two simultaneous tasklets. * two simultaneous tasklets.
*/ */
static int qca_enqueue(struct hci_uart *hu, struct sk_buff *skb) static int qca_enqueue(struct hci_uart *hu, struct sk_buff *skb)
@ -1059,7 +1059,7 @@ static void qca_controller_memdump(struct work_struct *work)
if (!seq_no) { if (!seq_no) {
/* This is the first frame of memdump packet from /* This is the first frame of memdump packet from
* the controller, Disable IBS to recevie dump * the controller, Disable IBS to receive dump
* with out any interruption, ideally time required for * with out any interruption, ideally time required for
* the controller to send the dump is 8 seconds. let us * the controller to send the dump is 8 seconds. let us
* start timer to handle this asynchronous activity. * start timer to handle this asynchronous activity.
@ -2294,13 +2294,6 @@ static int qca_init_regulators(struct qca_power *qca,
return 0; return 0;
} }
static void qca_clk_disable_unprepare(void *data)
{
struct clk *clk = data;
clk_disable_unprepare(clk);
}
static int qca_serdev_probe(struct serdev_device *serdev) static int qca_serdev_probe(struct serdev_device *serdev)
{ {
struct qca_serdev *qcadev; struct qca_serdev *qcadev;
@ -2358,7 +2351,7 @@ static int qca_serdev_probe(struct serdev_device *serdev)
* Backward compatibility with old DT sources. If the * Backward compatibility with old DT sources. If the
* node doesn't have the 'enable-gpios' property then * node doesn't have the 'enable-gpios' property then
* let's use the power sequencer. Otherwise, let's * let's use the power sequencer. Otherwise, let's
* drive everything outselves. * drive everything ourselves.
*/ */
qcadev->bt_power->pwrseq = devm_pwrseq_get(&serdev->dev, qcadev->bt_power->pwrseq = devm_pwrseq_get(&serdev->dev,
"bluetooth"); "bluetooth");
@ -2433,25 +2426,12 @@ static int qca_serdev_probe(struct serdev_device *serdev)
if (!qcadev->bt_en) if (!qcadev->bt_en)
power_ctrl_enabled = false; power_ctrl_enabled = false;
qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL); qcadev->susclk = devm_clk_get_optional_enabled_with_rate(
&serdev->dev, NULL, SUSCLK_RATE_32KHZ);
if (IS_ERR(qcadev->susclk)) { if (IS_ERR(qcadev->susclk)) {
dev_warn(&serdev->dev, "failed to acquire clk\n"); dev_warn(&serdev->dev, "failed to acquire clk\n");
return PTR_ERR(qcadev->susclk); return PTR_ERR(qcadev->susclk);
} }
err = clk_set_rate(qcadev->susclk, SUSCLK_RATE_32KHZ);
if (err)
return err;
err = clk_prepare_enable(qcadev->susclk);
if (err)
return err;
err = devm_add_action_or_reset(&serdev->dev,
qca_clk_disable_unprepare,
qcadev->susclk);
if (err)
return err;
} }
err = hci_uart_register_device(&qcadev->serdev_hu, &qca_proto); err = hci_uart_register_device(&qcadev->serdev_hu, &qca_proto);
@ -2530,7 +2510,7 @@ static void qca_serdev_shutdown(struct device *dev)
hci_dev_test_flag(hdev, HCI_SETUP)) hci_dev_test_flag(hdev, HCI_SETUP))
return; return;
/* The serdev must be in open state when conrol logic arrives /* The serdev must be in open state when control logic arrives
* here, so also fix the use-after-free issue caused by that * here, so also fix the use-after-free issue caused by that
* the serdev is flushed or wrote after it is closed. * the serdev is flushed or wrote after it is closed.
*/ */

View File

@ -169,6 +169,27 @@ dpll_msg_add_temp(struct sk_buff *msg, struct dpll_device *dpll,
return 0; return 0;
} }
static int
dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct dpll_device *dpll,
struct netlink_ext_ack *extack)
{
const struct dpll_device_ops *ops = dpll_device_ops(dpll);
DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) = { 0 };
enum dpll_clock_quality_level ql;
int ret;
if (!ops->clock_quality_level_get)
return 0;
ret = ops->clock_quality_level_get(dpll, dpll_priv(dpll), qls, extack);
if (ret)
return ret;
for_each_set_bit(ql, qls, DPLL_CLOCK_QUALITY_LEVEL_MAX)
if (nla_put_u32(msg, DPLL_A_CLOCK_QUALITY_LEVEL, ql))
return -EMSGSIZE;
return 0;
}
static int static int
dpll_msg_add_pin_prio(struct sk_buff *msg, struct dpll_pin *pin, dpll_msg_add_pin_prio(struct sk_buff *msg, struct dpll_pin *pin,
struct dpll_pin_ref *ref, struct dpll_pin_ref *ref,
@ -557,6 +578,9 @@ dpll_device_get_one(struct dpll_device *dpll, struct sk_buff *msg,
if (ret) if (ret)
return ret; return ret;
ret = dpll_msg_add_lock_status(msg, dpll, extack); ret = dpll_msg_add_lock_status(msg, dpll, extack);
if (ret)
return ret;
ret = dpll_msg_add_clock_quality_level(msg, dpll, extack);
if (ret) if (ret)
return ret; return ret;
ret = dpll_msg_add_mode(msg, dpll, extack); ret = dpll_msg_add_mode(msg, dpll, extack);

View File

@ -25,8 +25,8 @@
* Bit 8 = 0x00100 = uLaw (instead of aLaw) * Bit 8 = 0x00100 = uLaw (instead of aLaw)
* Bit 9 = 0x00200 = Disable DTMF detect on all B-channels via hardware * Bit 9 = 0x00200 = Disable DTMF detect on all B-channels via hardware
* Bit 10 = spare * Bit 10 = spare
* Bit 11 = 0x00800 = Force PCM bus into slave mode. (otherwhise auto) * Bit 11 = 0x00800 = Force PCM bus into slave mode. (otherwise auto)
* or Bit 12 = 0x01000 = Force PCM bus into master mode. (otherwhise auto) * or Bit 12 = 0x01000 = Force PCM bus into master mode. (otherwise auto)
* Bit 13 = spare * Bit 13 = spare
* Bit 14 = 0x04000 = Use external ram (128K) * Bit 14 = 0x04000 = Use external ram (128K)
* Bit 15 = 0x08000 = Use external ram (512K) * Bit 15 = 0x08000 = Use external ram (512K)
@ -41,7 +41,7 @@
* port: (optional or required for all ports on all installed cards) * port: (optional or required for all ports on all installed cards)
* HFC-4S/HFC-8S only bits: * HFC-4S/HFC-8S only bits:
* Bit 0 = 0x001 = Use master clock for this S/T interface * Bit 0 = 0x001 = Use master clock for this S/T interface
* (ony once per chip). * (only once per chip).
* Bit 1 = 0x002 = transmitter line setup (non capacitive mode) * Bit 1 = 0x002 = transmitter line setup (non capacitive mode)
* Don't use this unless you know what you are doing! * Don't use this unless you know what you are doing!
* Bit 2 = 0x004 = Disable E-channel. (No E-channel processing) * Bit 2 = 0x004 = Disable E-channel. (No E-channel processing)
@ -82,7 +82,7 @@
* By default (0), the PCM bus id is 100 for the card that is PCM master. * By default (0), the PCM bus id is 100 for the card that is PCM master.
* If multiple cards are PCM master (because they are not interconnected), * If multiple cards are PCM master (because they are not interconnected),
* each card with PCM master will have increasing PCM id. * each card with PCM master will have increasing PCM id.
* All PCM busses with the same ID are expected to be connected and have * All PCM buses with the same ID are expected to be connected and have
* common time slots slots. * common time slots slots.
* Only one chip of the PCM bus must be master, the others slave. * Only one chip of the PCM bus must be master, the others slave.
* -1 means no support of PCM bus not even. * -1 means no support of PCM bus not even.
@ -930,7 +930,7 @@ hfcmulti_resync(struct hfc_multi *locked, struct hfc_multi *newmaster, int rm)
if (newmaster) { if (newmaster) {
hc = newmaster; hc = newmaster;
if (debug & DEBUG_HFCMULTI_PLXSD) if (debug & DEBUG_HFCMULTI_PLXSD)
printk(KERN_DEBUG "id=%d (0x%p) = syncronized with " printk(KERN_DEBUG "id=%d (0x%p) = synchronized with "
"interface.\n", hc->id, hc); "interface.\n", hc->id, hc);
/* Enable new sync master */ /* Enable new sync master */
plx_acc_32 = hc->plx_membase + PLX_GPIOC; plx_acc_32 = hc->plx_membase + PLX_GPIOC;
@ -949,7 +949,7 @@ hfcmulti_resync(struct hfc_multi *locked, struct hfc_multi *newmaster, int rm)
hc = pcmmaster; hc = pcmmaster;
if (debug & DEBUG_HFCMULTI_PLXSD) if (debug & DEBUG_HFCMULTI_PLXSD)
printk(KERN_DEBUG printk(KERN_DEBUG
"id=%d (0x%p) = PCM master syncronized " "id=%d (0x%p) = PCM master synchronized "
"with QUARTZ\n", hc->id, hc); "with QUARTZ\n", hc->id, hc);
if (hc->ctype == HFC_TYPE_E1) { if (hc->ctype == HFC_TYPE_E1) {
/* Use the crystal clock for the PCM /* Use the crystal clock for the PCM
@ -2001,7 +2001,7 @@ next_frame:
if (Zspace <= 0) if (Zspace <= 0)
Zspace += hc->Zlen; Zspace += hc->Zlen;
Zspace -= 4; /* keep not too full, so pointers will not overrun */ Zspace -= 4; /* keep not too full, so pointers will not overrun */
/* fill transparent data only to maxinum transparent load (minus 4) */ /* fill transparent data only to maximum transparent load (minus 4) */
if (bch && test_bit(FLG_TRANSPARENT, &bch->Flags)) if (bch && test_bit(FLG_TRANSPARENT, &bch->Flags))
Zspace = Zspace - hc->Zlen + hc->max_trans; Zspace = Zspace - hc->Zlen + hc->max_trans;
if (Zspace <= 0) /* no space of 4 bytes */ if (Zspace <= 0) /* no space of 4 bytes */
@ -4672,7 +4672,7 @@ init_e1_port_hw(struct hfc_multi *hc, struct hm_map *m)
if (debug & DEBUG_HFCMULTI_INIT) if (debug & DEBUG_HFCMULTI_INIT)
printk(KERN_DEBUG printk(KERN_DEBUG
"%s: PORT set optical " "%s: PORT set optical "
"interfacs: card(%d) " "interface: card(%d) "
"port(%d)\n", "port(%d)\n",
__func__, __func__,
HFC_cnt + 1, 1); HFC_cnt + 1, 1);

View File

@ -641,6 +641,7 @@ config NETDEVSIM
depends on PTP_1588_CLOCK_MOCK || PTP_1588_CLOCK_MOCK=n depends on PTP_1588_CLOCK_MOCK || PTP_1588_CLOCK_MOCK=n
select NET_DEVLINK select NET_DEVLINK
select PAGE_POOL select PAGE_POOL
select NET_SHAPER
help help
This driver is a developer testing tool and software model that can This driver is a developer testing tool and software model that can
be used to test various control path networking APIs, especially be used to test various control path networking APIs, especially

View File

@ -3206,15 +3206,11 @@ static int amt_newlink(struct net *net, struct net_device *dev,
goto err; goto err;
} }
if (data[IFLA_AMT_RELAY_PORT]) amt->relay_port = nla_get_be16_default(data[IFLA_AMT_RELAY_PORT],
amt->relay_port = nla_get_be16(data[IFLA_AMT_RELAY_PORT]); htons(IANA_AMT_UDP_PORT));
else
amt->relay_port = htons(IANA_AMT_UDP_PORT);
if (data[IFLA_AMT_GATEWAY_PORT]) amt->gw_port = nla_get_be16_default(data[IFLA_AMT_GATEWAY_PORT],
amt->gw_port = nla_get_be16(data[IFLA_AMT_GATEWAY_PORT]); htons(IANA_AMT_UDP_PORT));
else
amt->gw_port = htons(IANA_AMT_UDP_PORT);
if (!amt->relay_port) { if (!amt->relay_port) {
NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_AMT_DISCOVERY_IP], NL_SET_ERR_MSG_ATTR(extack, tb[IFLA_AMT_DISCOVERY_IP],

View File

@ -84,7 +84,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
if (skb_copy_bits(skb, BAREUDP_BASE_HLEN, &ipversion, if (skb_copy_bits(skb, BAREUDP_BASE_HLEN, &ipversion,
sizeof(ipversion))) { sizeof(ipversion))) {
DEV_STATS_INC(bareudp->dev, rx_dropped); dev_core_stats_rx_dropped_inc(bareudp->dev);
goto drop; goto drop;
} }
ipversion >>= 4; ipversion >>= 4;
@ -94,7 +94,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
} else if (ipversion == 6 && bareudp->multi_proto_mode) { } else if (ipversion == 6 && bareudp->multi_proto_mode) {
proto = htons(ETH_P_IPV6); proto = htons(ETH_P_IPV6);
} else { } else {
DEV_STATS_INC(bareudp->dev, rx_dropped); dev_core_stats_rx_dropped_inc(bareudp->dev);
goto drop; goto drop;
} }
} else if (bareudp->ethertype == htons(ETH_P_MPLS_UC)) { } else if (bareudp->ethertype == htons(ETH_P_MPLS_UC)) {
@ -108,7 +108,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
ipv4_is_multicast(tunnel_hdr->daddr)) { ipv4_is_multicast(tunnel_hdr->daddr)) {
proto = htons(ETH_P_MPLS_MC); proto = htons(ETH_P_MPLS_MC);
} else { } else {
DEV_STATS_INC(bareudp->dev, rx_dropped); dev_core_stats_rx_dropped_inc(bareudp->dev);
goto drop; goto drop;
} }
} else { } else {
@ -124,7 +124,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
(addr_type & IPV6_ADDR_MULTICAST)) { (addr_type & IPV6_ADDR_MULTICAST)) {
proto = htons(ETH_P_MPLS_MC); proto = htons(ETH_P_MPLS_MC);
} else { } else {
DEV_STATS_INC(bareudp->dev, rx_dropped); dev_core_stats_rx_dropped_inc(bareudp->dev);
goto drop; goto drop;
} }
} }
@ -136,7 +136,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
proto, proto,
!net_eq(bareudp->net, !net_eq(bareudp->net,
dev_net(bareudp->dev)))) { dev_net(bareudp->dev)))) {
DEV_STATS_INC(bareudp->dev, rx_dropped); dev_core_stats_rx_dropped_inc(bareudp->dev);
goto drop; goto drop;
} }
@ -144,7 +144,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
tun_dst = udp_tun_rx_dst(skb, family, key, 0, 0); tun_dst = udp_tun_rx_dst(skb, family, key, 0, 0);
if (!tun_dst) { if (!tun_dst) {
DEV_STATS_INC(bareudp->dev, rx_dropped); dev_core_stats_rx_dropped_inc(bareudp->dev);
goto drop; goto drop;
} }
skb_dst_set(skb, &tun_dst->dst); skb_dst_set(skb, &tun_dst->dst);
@ -317,7 +317,7 @@ static int bareudp_xmit_skb(struct sk_buff *skb, struct net_device *dev,
__be32 saddr; __be32 saddr;
int err; int err;
if (!skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB))) if (skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB)))
return -EINVAL; return -EINVAL;
if (!sock) if (!sock)
@ -387,7 +387,7 @@ static int bareudp6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
__be16 sport; __be16 sport;
int err; int err;
if (!skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB))) if (skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB)))
return -EINVAL; return -EINVAL;
if (!sock) if (!sock)

View File

@ -1480,7 +1480,7 @@ static void bond_netpoll_cleanup(struct net_device *bond_dev)
slave_disable_netpoll(slave); slave_disable_netpoll(slave);
} }
static int bond_netpoll_setup(struct net_device *dev, struct netpoll_info *ni) static int bond_netpoll_setup(struct net_device *dev)
{ {
struct bonding *bond = netdev_priv(dev); struct bonding *bond = netdev_priv(dev);
struct list_head *iter; struct list_head *iter;
@ -1549,6 +1549,7 @@ static void bond_compute_features(struct bonding *bond)
{ {
unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE | unsigned int dst_release_flag = IFF_XMIT_DST_RELEASE |
IFF_XMIT_DST_RELEASE_PERM; IFF_XMIT_DST_RELEASE_PERM;
netdev_features_t gso_partial_features = NETIF_F_GSO_ESP;
netdev_features_t vlan_features = BOND_VLAN_FEATURES; netdev_features_t vlan_features = BOND_VLAN_FEATURES;
netdev_features_t enc_features = BOND_ENC_FEATURES; netdev_features_t enc_features = BOND_ENC_FEATURES;
#ifdef CONFIG_XFRM_OFFLOAD #ifdef CONFIG_XFRM_OFFLOAD
@ -1581,6 +1582,9 @@ static void bond_compute_features(struct bonding *bond)
BOND_XFRM_FEATURES); BOND_XFRM_FEATURES);
#endif /* CONFIG_XFRM_OFFLOAD */ #endif /* CONFIG_XFRM_OFFLOAD */
if (slave->dev->hw_enc_features & NETIF_F_GSO_PARTIAL)
gso_partial_features &= slave->dev->gso_partial_features;
mpls_features = netdev_increment_features(mpls_features, mpls_features = netdev_increment_features(mpls_features,
slave->dev->mpls_features, slave->dev->mpls_features,
BOND_MPLS_FEATURES); BOND_MPLS_FEATURES);
@ -1594,6 +1598,11 @@ static void bond_compute_features(struct bonding *bond)
} }
bond_dev->hard_header_len = max_hard_header_len; bond_dev->hard_header_len = max_hard_header_len;
if (gso_partial_features & NETIF_F_GSO_ESP)
bond_dev->gso_partial_features |= NETIF_F_GSO_ESP;
else
bond_dev->gso_partial_features &= ~NETIF_F_GSO_ESP;
done: done:
bond_dev->vlan_features = vlan_features; bond_dev->vlan_features = vlan_features;
bond_dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL | bond_dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL |
@ -5690,8 +5699,11 @@ static int bond_xdp_set(struct net_device *dev, struct bpf_prog *prog,
ASSERT_RTNL(); ASSERT_RTNL();
if (!bond_xdp_check(bond)) if (!bond_xdp_check(bond)) {
BOND_NL_ERR(dev, extack,
"No native XDP support for the current bonding mode");
return -EOPNOTSUPP; return -EOPNOTSUPP;
}
old_prog = bond->xdp_prog; old_prog = bond->xdp_prog;
bond->xdp_prog = prog; bond->xdp_prog = prog;

View File

@ -188,14 +188,10 @@ static int vxcan_newlink(struct net *net, struct net_device *dev,
/* register peer device */ /* register peer device */
if (data && data[VXCAN_INFO_PEER]) { if (data && data[VXCAN_INFO_PEER]) {
struct nlattr *nla_peer; struct nlattr *nla_peer = data[VXCAN_INFO_PEER];
nla_peer = data[VXCAN_INFO_PEER];
ifmp = nla_data(nla_peer); ifmp = nla_data(nla_peer);
err = rtnl_nla_parse_ifinfomsg(peer_tb, nla_peer, extack); rtnl_nla_parse_ifinfomsg(peer_tb, nla_peer, extack);
if (err < 0)
return err;
tbp = peer_tb; tbp = peer_tb;
} }
@ -208,9 +204,6 @@ static int vxcan_newlink(struct net *net, struct net_device *dev,
} }
peer_net = rtnl_link_get_net(net, tbp); peer_net = rtnl_link_get_net(net, tbp);
if (IS_ERR(peer_net))
return PTR_ERR(peer_net);
peer = rtnl_create_link(peer_net, ifname, name_assign_type, peer = rtnl_create_link(peer_net, ifname, name_assign_type,
&vxcan_link_ops, tbp, extack); &vxcan_link_ops, tbp, extack);
if (IS_ERR(peer)) { if (IS_ERR(peer)) {
@ -302,6 +295,7 @@ static struct rtnl_link_ops vxcan_link_ops = {
.newlink = vxcan_newlink, .newlink = vxcan_newlink,
.dellink = vxcan_dellink, .dellink = vxcan_dellink,
.policy = vxcan_policy, .policy = vxcan_policy,
.peer_type = VXCAN_INFO_PEER,
.maxtype = VXCAN_INFO_MAX, .maxtype = VXCAN_INFO_MAX,
.get_link_net = vxcan_get_link_net, .get_link_net = vxcan_get_link_net,
}; };

View File

@ -989,8 +989,7 @@ void b53_get_strings(struct dsa_switch *ds, int port, u32 stringset,
if (stringset == ETH_SS_STATS) { if (stringset == ETH_SS_STATS) {
for (i = 0; i < mib_size; i++) for (i = 0; i < mib_size; i++)
strscpy(data + i * ETH_GSTRING_LEN, ethtool_puts(&data, mibs[i].name);
mibs[i].name, ETH_GSTRING_LEN);
} else if (stringset == ETH_SS_PHY_STATS) { } else if (stringset == ETH_SS_PHY_STATS) {
phydev = b53_get_phy_device(ds, port); phydev = b53_get_phy_device(ds, port);
if (!phydev) if (!phydev)

View File

@ -370,7 +370,7 @@ MODULE_DEVICE_TABLE(of, b53_mmap_of_table);
static struct platform_driver b53_mmap_driver = { static struct platform_driver b53_mmap_driver = {
.probe = b53_mmap_probe, .probe = b53_mmap_probe,
.remove_new = b53_mmap_remove, .remove = b53_mmap_remove,
.shutdown = b53_mmap_shutdown, .shutdown = b53_mmap_shutdown,
.driver = { .driver = {
.name = "b53-switch", .name = "b53-switch",

View File

@ -682,7 +682,7 @@ static void b53_srab_shutdown(struct platform_device *pdev)
static struct platform_driver b53_srab_driver = { static struct platform_driver b53_srab_driver = {
.probe = b53_srab_probe, .probe = b53_srab_probe,
.remove_new = b53_srab_remove, .remove = b53_srab_remove,
.shutdown = b53_srab_shutdown, .shutdown = b53_srab_shutdown,
.driver = { .driver = {
.name = "b53-srab-switch", .name = "b53-srab-switch",

View File

@ -513,12 +513,12 @@ static void bcm_sf2_crossbar_setup(struct bcm_sf2_priv *priv)
u32 reg; u32 reg;
int i; int i;
mask = BIT(priv->num_crossbar_int_ports) - 1; mask = BIT(priv->num_crossbar_ext_bits) - 1;
reg = reg_readl(priv, REG_CROSSBAR); reg = reg_readl(priv, REG_CROSSBAR);
switch (priv->type) { switch (priv->type) {
case BCM4908_DEVICE_ID: case BCM4908_DEVICE_ID:
shift = CROSSBAR_BCM4908_INT_P7 * priv->num_crossbar_int_ports; shift = CROSSBAR_BCM4908_INT_P7 * priv->num_crossbar_ext_bits;
reg &= ~(mask << shift); reg &= ~(mask << shift);
if (0) /* FIXME */ if (0) /* FIXME */
reg |= CROSSBAR_BCM4908_EXT_SERDES << shift; reg |= CROSSBAR_BCM4908_EXT_SERDES << shift;
@ -536,7 +536,7 @@ static void bcm_sf2_crossbar_setup(struct bcm_sf2_priv *priv)
reg = reg_readl(priv, REG_CROSSBAR); reg = reg_readl(priv, REG_CROSSBAR);
for (i = 0; i < priv->num_crossbar_int_ports; i++) { for (i = 0; i < priv->num_crossbar_int_ports; i++) {
shift = i * priv->num_crossbar_int_ports; shift = i * priv->num_crossbar_ext_bits;
dev_dbg(dev, "crossbar int port #%d - ext port #%d\n", i, dev_dbg(dev, "crossbar int port #%d - ext port #%d\n", i,
(reg >> shift) & mask); (reg >> shift) & mask);
@ -1183,8 +1183,8 @@ static void bcm_sf2_sw_get_strings(struct dsa_switch *ds, int port,
int cnt = b53_get_sset_count(ds, port, stringset); int cnt = b53_get_sset_count(ds, port, stringset);
b53_get_strings(ds, port, stringset, data); b53_get_strings(ds, port, stringset, data);
bcm_sf2_cfp_get_strings(ds, port, stringset, data += cnt * ETH_GSTRING_LEN;
data + cnt * ETH_GSTRING_LEN); bcm_sf2_cfp_get_strings(ds, port, stringset, &data);
} }
static void bcm_sf2_sw_get_ethtool_stats(struct dsa_switch *ds, int port, static void bcm_sf2_sw_get_ethtool_stats(struct dsa_switch *ds, int port,
@ -1260,6 +1260,7 @@ struct bcm_sf2_of_data {
unsigned int core_reg_align; unsigned int core_reg_align;
unsigned int num_cfp_rules; unsigned int num_cfp_rules;
unsigned int num_crossbar_int_ports; unsigned int num_crossbar_int_ports;
unsigned int num_crossbar_ext_bits;
}; };
static const u16 bcm_sf2_4908_reg_offsets[] = { static const u16 bcm_sf2_4908_reg_offsets[] = {
@ -1288,6 +1289,7 @@ static const struct bcm_sf2_of_data bcm_sf2_4908_data = {
.reg_offsets = bcm_sf2_4908_reg_offsets, .reg_offsets = bcm_sf2_4908_reg_offsets,
.num_cfp_rules = 256, .num_cfp_rules = 256,
.num_crossbar_int_ports = 2, .num_crossbar_int_ports = 2,
.num_crossbar_ext_bits = 2,
}; };
/* Register offsets for the SWITCH_REG_* block */ /* Register offsets for the SWITCH_REG_* block */
@ -1399,6 +1401,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
priv->core_reg_align = data->core_reg_align; priv->core_reg_align = data->core_reg_align;
priv->num_cfp_rules = data->num_cfp_rules; priv->num_cfp_rules = data->num_cfp_rules;
priv->num_crossbar_int_ports = data->num_crossbar_int_ports; priv->num_crossbar_int_ports = data->num_crossbar_int_ports;
priv->num_crossbar_ext_bits = data->num_crossbar_ext_bits;
priv->rcdev = devm_reset_control_get_optional_exclusive(&pdev->dev, priv->rcdev = devm_reset_control_get_optional_exclusive(&pdev->dev,
"switch"); "switch");
@ -1620,7 +1623,7 @@ static SIMPLE_DEV_PM_OPS(bcm_sf2_pm_ops,
static struct platform_driver bcm_sf2_driver = { static struct platform_driver bcm_sf2_driver = {
.probe = bcm_sf2_sw_probe, .probe = bcm_sf2_sw_probe,
.remove_new = bcm_sf2_sw_remove, .remove = bcm_sf2_sw_remove,
.shutdown = bcm_sf2_sw_shutdown, .shutdown = bcm_sf2_sw_shutdown,
.driver = { .driver = {
.name = "brcm-sf2", .name = "brcm-sf2",

View File

@ -75,6 +75,7 @@ struct bcm_sf2_priv {
unsigned int core_reg_align; unsigned int core_reg_align;
unsigned int num_cfp_rules; unsigned int num_cfp_rules;
unsigned int num_crossbar_int_ports; unsigned int num_crossbar_int_ports;
unsigned int num_crossbar_ext_bits;
/* spinlock protecting access to the indirect registers */ /* spinlock protecting access to the indirect registers */
spinlock_t indir_lock; spinlock_t indir_lock;
@ -227,8 +228,8 @@ int bcm_sf2_set_rxnfc(struct dsa_switch *ds, int port,
int bcm_sf2_cfp_rst(struct bcm_sf2_priv *priv); int bcm_sf2_cfp_rst(struct bcm_sf2_priv *priv);
void bcm_sf2_cfp_exit(struct dsa_switch *ds); void bcm_sf2_cfp_exit(struct dsa_switch *ds);
int bcm_sf2_cfp_resume(struct dsa_switch *ds); int bcm_sf2_cfp_resume(struct dsa_switch *ds);
void bcm_sf2_cfp_get_strings(struct dsa_switch *ds, int port, void bcm_sf2_cfp_get_strings(struct dsa_switch *ds, int port, u32 stringset,
u32 stringset, uint8_t *data); uint8_t **data);
void bcm_sf2_cfp_get_ethtool_stats(struct dsa_switch *ds, int port, void bcm_sf2_cfp_get_ethtool_stats(struct dsa_switch *ds, int port,
uint64_t *data); uint64_t *data);
int bcm_sf2_cfp_get_sset_count(struct dsa_switch *ds, int port, int sset); int bcm_sf2_cfp_get_sset_count(struct dsa_switch *ds, int port, int sset);

View File

@ -1279,27 +1279,19 @@ static const struct bcm_sf2_cfp_stat {
}, },
}; };
void bcm_sf2_cfp_get_strings(struct dsa_switch *ds, int port, void bcm_sf2_cfp_get_strings(struct dsa_switch *ds, int port, u32 stringset,
u32 stringset, uint8_t *data) uint8_t **data)
{ {
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
unsigned int s = ARRAY_SIZE(bcm_sf2_cfp_stats); unsigned int i, j;
char buf[ETH_GSTRING_LEN];
unsigned int i, j, iter;
if (stringset != ETH_SS_STATS) if (stringset != ETH_SS_STATS)
return; return;
for (i = 1; i < priv->num_cfp_rules; i++) { for (i = 1; i < priv->num_cfp_rules; i++)
for (j = 0; j < s; j++) { for (j = 0; j < ARRAY_SIZE(bcm_sf2_cfp_stats); j++)
snprintf(buf, sizeof(buf), ethtool_sprintf(data, "CFP%03d_%sCntr", i,
"CFP%03d_%sCntr", bcm_sf2_cfp_stats[j].name);
i, bcm_sf2_cfp_stats[j].name);
iter = (i - 1) * s + j;
strscpy(data + iter * ETH_GSTRING_LEN,
buf, ETH_GSTRING_LEN);
}
}
} }
void bcm_sf2_cfp_get_ethtool_stats(struct dsa_switch *ds, int port, void bcm_sf2_cfp_get_ethtool_stats(struct dsa_switch *ds, int port,

View File

@ -121,8 +121,7 @@ static void dsa_loop_get_strings(struct dsa_switch *ds, int port,
return; return;
for (i = 0; i < __DSA_LOOP_CNT_MAX; i++) for (i = 0; i < __DSA_LOOP_CNT_MAX; i++)
memcpy(data + i * ETH_GSTRING_LEN, ethtool_puts(&data, ps->ports[port].mib[i].name);
ps->ports[port].mib[i].name, ETH_GSTRING_LEN);
} }
static void dsa_loop_get_ethtool_stats(struct dsa_switch *ds, int port, static void dsa_loop_get_ethtool_stats(struct dsa_switch *ds, int port,

View File

@ -294,12 +294,8 @@ static void hellcreek_get_strings(struct dsa_switch *ds, int port,
{ {
int i; int i;
for (i = 0; i < ARRAY_SIZE(hellcreek_counter); ++i) { for (i = 0; i < ARRAY_SIZE(hellcreek_counter); ++i)
const struct hellcreek_counter *counter = &hellcreek_counter[i]; ethtool_puts(&data, hellcreek_counter[i].name);
strscpy(data + i * ETH_GSTRING_LEN,
counter->name, ETH_GSTRING_LEN);
}
} }
static int hellcreek_get_sset_count(struct dsa_switch *ds, int port, int sset) static int hellcreek_get_sset_count(struct dsa_switch *ds, int port, int sset)
@ -2105,7 +2101,7 @@ MODULE_DEVICE_TABLE(of, hellcreek_of_match);
static struct platform_driver hellcreek_driver = { static struct platform_driver hellcreek_driver = {
.probe = hellcreek_probe, .probe = hellcreek_probe,
.remove_new = hellcreek_remove, .remove = hellcreek_remove,
.shutdown = hellcreek_shutdown, .shutdown = hellcreek_shutdown,
.driver = { .driver = {
.name = "hellcreek", .name = "hellcreek",

View File

@ -2249,7 +2249,7 @@ MODULE_DEVICE_TABLE(of, gswip_of_match);
static struct platform_driver gswip_driver = { static struct platform_driver gswip_driver = {
.probe = gswip_probe, .probe = gswip_probe,
.remove_new = gswip_remove, .remove = gswip_remove,
.shutdown = gswip_shutdown, .shutdown = gswip_shutdown,
.driver = { .driver = {
.name = "gswip", .name = "gswip",

View File

@ -1131,6 +1131,10 @@ void ksz9477_config_cpu_port(struct dsa_switch *ds)
if (i == dev->cpu_port) if (i == dev->cpu_port)
continue; continue;
ksz_port_stp_state_set(ds, i, BR_STATE_DISABLED); ksz_port_stp_state_set(ds, i, BR_STATE_DISABLED);
/* Power down the internal PHY if port is unused. */
if (dsa_is_unused_port(ds, i) && dev->info->internal_phy[i])
ksz_pwrite16(dev, i, 0x100, BMCR_PDOWN);
} }
} }

View File

@ -2,7 +2,7 @@
/* /*
* Microchip KSZ9477 series register access through I2C * Microchip KSZ9477 series register access through I2C
* *
* Copyright (C) 2018-2019 Microchip Technology Inc. * Copyright (C) 2018-2024 Microchip Technology Inc.
*/ */
#include <linux/i2c.h> #include <linux/i2c.h>
@ -16,6 +16,8 @@ KSZ_REGMAP_TABLE(ksz9477, not_used, 16, 0, 0);
static int ksz9477_i2c_probe(struct i2c_client *i2c) static int ksz9477_i2c_probe(struct i2c_client *i2c)
{ {
const struct ksz_chip_data *chip;
struct device *ddev = &i2c->dev;
struct regmap_config rc; struct regmap_config rc;
struct ksz_device *dev; struct ksz_device *dev;
int i, ret; int i, ret;
@ -24,6 +26,12 @@ static int ksz9477_i2c_probe(struct i2c_client *i2c)
if (!dev) if (!dev)
return -ENOMEM; return -ENOMEM;
chip = device_get_match_data(ddev);
if (!chip)
return -EINVAL;
/* Save chip id to do special initialization when probing. */
dev->chip_id = chip->chip_id;
for (i = 0; i < __KSZ_NUM_REGMAPS; i++) { for (i = 0; i < __KSZ_NUM_REGMAPS; i++) {
rc = ksz9477_regmap_config[i]; rc = ksz9477_regmap_config[i];
rc.lock_arg = &dev->regmap_mutex; rc.lock_arg = &dev->regmap_mutex;
@ -111,6 +119,10 @@ static const struct of_device_id ksz9477_dt_ids[] = {
.compatible = "microchip,ksz9567", .compatible = "microchip,ksz9567",
.data = &ksz_switch_chips[KSZ9567] .data = &ksz_switch_chips[KSZ9567]
}, },
{
.compatible = "microchip,lan9646",
.data = &ksz_switch_chips[LAN9646]
},
{}, {},
}; };
MODULE_DEVICE_TABLE(of, ksz9477_dt_ids); MODULE_DEVICE_TABLE(of, ksz9477_dt_ids);

Some files were not shown because too many files have changed in this diff Show More