mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 09:12:07 +00:00
Merge branch 'bpf-next/net' into for-next
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
commit
09430e47ce
@ -106,6 +106,9 @@ properties:
|
||||
name-prefix:
|
||||
description: For enum the prefix of the values, optional.
|
||||
type: string
|
||||
enum-cnt-name:
|
||||
description: Name of the render-max counter enum entry.
|
||||
type: string
|
||||
# End genetlink-c
|
||||
|
||||
attribute-sets:
|
||||
|
@ -117,6 +117,9 @@ properties:
|
||||
name-prefix:
|
||||
description: For enum the prefix of the values, optional.
|
||||
type: string
|
||||
enum-cnt-name:
|
||||
description: Name of the render-max counter enum entry.
|
||||
type: string
|
||||
# End genetlink-c
|
||||
# Start genetlink-legacy
|
||||
members:
|
||||
|
@ -5,6 +5,7 @@ name: ethtool
|
||||
protocol: genetlink-legacy
|
||||
|
||||
doc: Partial family for Ethtool Netlink.
|
||||
uapi-header: linux/ethtool_netlink_generated.h
|
||||
|
||||
definitions:
|
||||
-
|
||||
@ -12,43 +13,99 @@ definitions:
|
||||
enum-name:
|
||||
type: enum
|
||||
entries: [ vxlan, geneve, vxlan-gpe ]
|
||||
enum-cnt-name: __ethtool-udp-tunnel-type-cnt
|
||||
render-max: true
|
||||
-
|
||||
name: stringset
|
||||
type: enum
|
||||
entries: []
|
||||
header: linux/ethtool.h # skip rendering, no actual definition
|
||||
-
|
||||
name: header-flags
|
||||
type: flags
|
||||
entries: [ compact-bitsets, omit-reply, stats ]
|
||||
name-prefix: ethtool-flag-
|
||||
doc: common ethtool header flags
|
||||
entries:
|
||||
-
|
||||
name: compact-bitsets
|
||||
doc: use compact bitsets in reply
|
||||
-
|
||||
name: omit-reply
|
||||
doc: provide optional reply for SET or ACT requests
|
||||
-
|
||||
name: stats
|
||||
doc: request statistics, if supported by the driver
|
||||
-
|
||||
name: module-fw-flash-status
|
||||
type: enum
|
||||
entries: [ started, in_progress, completed, error ]
|
||||
doc: plug-in module firmware flashing status
|
||||
header: linux/ethtool.h
|
||||
entries:
|
||||
-
|
||||
name: started
|
||||
doc: The firmware flashing process has started.
|
||||
-
|
||||
name: in_progress
|
||||
doc: The firmware flashing process is in progress.
|
||||
-
|
||||
name: completed
|
||||
doc: The firmware flashing process was completed successfully.
|
||||
-
|
||||
name: error
|
||||
doc: The firmware flashing process was stopped due to an error.
|
||||
-
|
||||
name: c33-pse-ext-state
|
||||
enum-name:
|
||||
doc: "groups of PSE extended states functions. IEEE 802.3-2022 33.2.4.4 Variables"
|
||||
type: enum
|
||||
name-prefix: ethtool-c33-pse-ext-state-
|
||||
header: linux/ethtool.h
|
||||
entries:
|
||||
- none
|
||||
- error-condition
|
||||
- mr-mps-valid
|
||||
- mr-pse-enable
|
||||
- option-detect-ted
|
||||
- option-vport-lim
|
||||
- ovld-detected
|
||||
- power-not-available
|
||||
- short-detected
|
||||
-
|
||||
name: none
|
||||
doc: none
|
||||
-
|
||||
name: error-condition
|
||||
doc: Group of error_condition states
|
||||
-
|
||||
name: mr-mps-valid
|
||||
doc: Group of mr_mps_valid states
|
||||
-
|
||||
name: mr-pse-enable
|
||||
doc: Group of mr_pse_enable states
|
||||
-
|
||||
name: option-detect-ted
|
||||
doc: Group of option_detect_ted states
|
||||
-
|
||||
name: option-vport-lim
|
||||
doc: Group of option_vport_lim states
|
||||
-
|
||||
name: ovld-detected
|
||||
doc: Group of ovld_detected states
|
||||
-
|
||||
name: power-not-available
|
||||
doc: Group of power_not_available states
|
||||
-
|
||||
name: short-detected
|
||||
doc: Group of short_detected states
|
||||
-
|
||||
name: phy-upstream-type
|
||||
enum-name:
|
||||
type: enum
|
||||
entries: [ mac, phy ]
|
||||
-
|
||||
name: tcp-data-split
|
||||
type: enum
|
||||
entries: [ unknown, disabled, enabled ]
|
||||
|
||||
attribute-sets:
|
||||
-
|
||||
name: header
|
||||
attr-cnt-name: __ethtool-a-header-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: dev-index
|
||||
type: u32
|
||||
@ -65,7 +122,12 @@ attribute-sets:
|
||||
|
||||
-
|
||||
name: bitset-bit
|
||||
attr-cnt-name: __ethtool-a-bitset-bit-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: index
|
||||
type: u32
|
||||
@ -77,7 +139,12 @@ attribute-sets:
|
||||
type: flag
|
||||
-
|
||||
name: bitset-bits
|
||||
attr-cnt-name: __ethtool-a-bitset-bits-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: bit
|
||||
type: nest
|
||||
@ -85,7 +152,12 @@ attribute-sets:
|
||||
nested-attributes: bitset-bit
|
||||
-
|
||||
name: bitset
|
||||
attr-cnt-name: __ethtool-a-bitset-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: nomask
|
||||
type: flag
|
||||
@ -104,7 +176,12 @@ attribute-sets:
|
||||
type: binary
|
||||
-
|
||||
name: string
|
||||
attr-cnt-name: __ethtool-a-string-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: index
|
||||
type: u32
|
||||
@ -113,7 +190,16 @@ attribute-sets:
|
||||
type: string
|
||||
-
|
||||
name: strings
|
||||
attr-cnt-name: __ethtool-a-strings-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: string
|
||||
type: nest
|
||||
@ -121,7 +207,12 @@ attribute-sets:
|
||||
nested-attributes: string
|
||||
-
|
||||
name: stringset
|
||||
attr-cnt-name: __ethtool-a-stringset-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: id
|
||||
type: u32
|
||||
@ -135,7 +226,12 @@ attribute-sets:
|
||||
nested-attributes: strings
|
||||
-
|
||||
name: stringsets
|
||||
attr-cnt-name: __ethtool-a-stringsets-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: stringset
|
||||
type: nest
|
||||
@ -143,7 +239,12 @@ attribute-sets:
|
||||
nested-attributes: stringset
|
||||
-
|
||||
name: strset
|
||||
attr-cnt-name: __ethtool-a-strset-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -158,7 +259,12 @@ attribute-sets:
|
||||
|
||||
-
|
||||
name: privflags
|
||||
attr-cnt-name: __ethtool-a-privflags-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -170,7 +276,12 @@ attribute-sets:
|
||||
|
||||
-
|
||||
name: rings
|
||||
attr-cnt-name: __ethtool-a-rings-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -205,6 +316,7 @@ attribute-sets:
|
||||
-
|
||||
name: tcp-data-split
|
||||
type: u8
|
||||
enum: tcp-data-split
|
||||
-
|
||||
name: cqe-size
|
||||
type: u32
|
||||
@ -223,31 +335,48 @@ attribute-sets:
|
||||
|
||||
-
|
||||
name: mm-stat
|
||||
attr-cnt-name: __ethtool-a-mm-stat-cnt
|
||||
doc: MAC Merge (802.3)
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: pad
|
||||
type: pad
|
||||
-
|
||||
name: reassembly-errors
|
||||
doc: aMACMergeFrameAssErrorCount
|
||||
type: u64
|
||||
-
|
||||
name: smd-errors
|
||||
doc: aMACMergeFrameSmdErrorCount
|
||||
type: u64
|
||||
-
|
||||
name: reassembly-ok
|
||||
doc: aMACMergeFrameAssOkCount
|
||||
type: u64
|
||||
-
|
||||
name: rx-frag-count
|
||||
doc: aMACMergeFragCountRx
|
||||
type: u64
|
||||
-
|
||||
name: tx-frag-count
|
||||
doc: aMACMergeFragCountTx
|
||||
type: u64
|
||||
-
|
||||
name: hold-count
|
||||
doc: aMACMergeHoldCount
|
||||
type: u64
|
||||
-
|
||||
name: mm
|
||||
attr-cnt-name: __ethtool-a-mm-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -285,7 +414,12 @@ attribute-sets:
|
||||
nested-attributes: mm-stat
|
||||
-
|
||||
name: linkinfo
|
||||
attr-cnt-name: __ethtool-a-linkinfo-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -307,7 +441,12 @@ attribute-sets:
|
||||
type: u8
|
||||
-
|
||||
name: linkmodes
|
||||
attr-cnt-name: __ethtool-a-linkmodes-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -343,7 +482,12 @@ attribute-sets:
|
||||
type: u8
|
||||
-
|
||||
name: linkstate
|
||||
attr-cnt-name: __ethtool-a-linkstate-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -368,7 +512,12 @@ attribute-sets:
|
||||
type: u32
|
||||
-
|
||||
name: debug
|
||||
attr-cnt-name: __ethtool-a-debug-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -379,7 +528,12 @@ attribute-sets:
|
||||
nested-attributes: bitset
|
||||
-
|
||||
name: wol
|
||||
attr-cnt-name: __ethtool-a-wol-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -393,7 +547,12 @@ attribute-sets:
|
||||
type: binary
|
||||
-
|
||||
name: features
|
||||
attr-cnt-name: __ethtool-a-features-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -416,7 +575,12 @@ attribute-sets:
|
||||
nested-attributes: bitset
|
||||
-
|
||||
name: channels
|
||||
attr-cnt-name: __ethtool-a-channels-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -448,7 +612,12 @@ attribute-sets:
|
||||
|
||||
-
|
||||
name: irq-moderation
|
||||
attr-cnt-name: __ethtool-a-irq-moderation-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: usec
|
||||
type: u32
|
||||
@ -460,7 +629,12 @@ attribute-sets:
|
||||
type: u32
|
||||
-
|
||||
name: profile
|
||||
attr-cnt-name: __ethtool-a-profile-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: irq-moderation
|
||||
type: nest
|
||||
@ -468,7 +642,12 @@ attribute-sets:
|
||||
nested-attributes: irq-moderation
|
||||
-
|
||||
name: coalesce
|
||||
attr-cnt-name: __ethtool-a-coalesce-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -565,7 +744,12 @@ attribute-sets:
|
||||
|
||||
-
|
||||
name: pause-stat
|
||||
attr-cnt-name: __ethtool-a-pause-stat-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: pad
|
||||
type: pad
|
||||
@ -577,7 +761,12 @@ attribute-sets:
|
||||
type: u64
|
||||
-
|
||||
name: pause
|
||||
attr-cnt-name: __ethtool-a-pause-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -600,7 +789,12 @@ attribute-sets:
|
||||
type: u32
|
||||
-
|
||||
name: eee
|
||||
attr-cnt-name: __ethtool-a-eee-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -627,7 +821,12 @@ attribute-sets:
|
||||
type: u32
|
||||
-
|
||||
name: ts-stat
|
||||
attr-cnt-name: __ethtool-a-ts-stat-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: tx-pkts
|
||||
type: uint
|
||||
@ -639,7 +838,12 @@ attribute-sets:
|
||||
type: uint
|
||||
-
|
||||
name: tsinfo
|
||||
attr-cnt-name: __ethtool-a-tsinfo-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -665,19 +869,32 @@ attribute-sets:
|
||||
nested-attributes: ts-stat
|
||||
-
|
||||
name: cable-result
|
||||
attr-cnt-name: __ethtool-a-cable-result-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: pair
|
||||
doc: ETHTOOL_A_CABLE_PAIR
|
||||
type: u8
|
||||
-
|
||||
name: code
|
||||
doc: ETHTOOL_A_CABLE_RESULT_CODE
|
||||
type: u8
|
||||
-
|
||||
name: src
|
||||
doc: ETHTOOL_A_CABLE_INF_SRC
|
||||
type: u32
|
||||
-
|
||||
name: cable-fault-length
|
||||
attr-cnt-name: __ethtool-a-cable-fault-length-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: pair
|
||||
type: u8
|
||||
@ -689,7 +906,12 @@ attribute-sets:
|
||||
type: u32
|
||||
-
|
||||
name: cable-nest
|
||||
attr-cnt-name: __ethtool-a-cable-nest-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: result
|
||||
type: nest
|
||||
@ -700,20 +922,31 @@ attribute-sets:
|
||||
nested-attributes: cable-fault-length
|
||||
-
|
||||
name: cable-test
|
||||
attr-cnt-name: __ethtool-a-cable-test-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
nested-attributes: header
|
||||
-
|
||||
name: cable-test-ntf
|
||||
attr-cnt-name: __ethtool-a-cable-test-ntf-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
nested-attributes: header
|
||||
-
|
||||
name: status
|
||||
doc: _STARTED/_COMPLETE
|
||||
type: u8
|
||||
-
|
||||
name: nest
|
||||
@ -721,7 +954,12 @@ attribute-sets:
|
||||
nested-attributes: cable-nest
|
||||
-
|
||||
name: cable-test-tdr-cfg
|
||||
attr-cnt-name: __ethtool-a-cable-test-tdr-cfg-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: first
|
||||
type: u32
|
||||
@ -736,7 +974,12 @@ attribute-sets:
|
||||
type: u8
|
||||
-
|
||||
name: cable-test-tdr-ntf
|
||||
attr-cnt-name: __ethtool-a-cable-test-tdr-ntf-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -750,7 +993,12 @@ attribute-sets:
|
||||
nested-attributes: cable-nest
|
||||
-
|
||||
name: cable-test-tdr
|
||||
attr-cnt-name: __ethtool-a-cable-test-tdr-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -761,7 +1009,12 @@ attribute-sets:
|
||||
nested-attributes: cable-test-tdr-cfg
|
||||
-
|
||||
name: tunnel-udp-entry
|
||||
attr-cnt-name: __ethtool-a-tunnel-udp-entry-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: port
|
||||
type: u16
|
||||
@ -772,7 +1025,12 @@ attribute-sets:
|
||||
enum: udp-tunnel-type
|
||||
-
|
||||
name: tunnel-udp-table
|
||||
attr-cnt-name: __ethtool-a-tunnel-udp-table-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: size
|
||||
type: u32
|
||||
@ -787,14 +1045,24 @@ attribute-sets:
|
||||
nested-attributes: tunnel-udp-entry
|
||||
-
|
||||
name: tunnel-udp
|
||||
attr-cnt-name: __ethtool-a-tunnel-udp-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: table
|
||||
type: nest
|
||||
nested-attributes: tunnel-udp-table
|
||||
-
|
||||
name: tunnel-info
|
||||
attr-cnt-name: __ethtool-a-tunnel-info-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -805,7 +1073,12 @@ attribute-sets:
|
||||
nested-attributes: tunnel-udp
|
||||
-
|
||||
name: fec-stat
|
||||
attr-cnt-name: __ethtool-a-fec-stat-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: pad
|
||||
type: pad
|
||||
@ -823,7 +1096,12 @@ attribute-sets:
|
||||
sub-type: u64
|
||||
-
|
||||
name: fec
|
||||
attr-cnt-name: __ethtool-a-fec-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -844,7 +1122,12 @@ attribute-sets:
|
||||
nested-attributes: fec-stat
|
||||
-
|
||||
name: module-eeprom
|
||||
attr-cnt-name: __ethtool-a-module-eeprom-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -869,7 +1152,12 @@ attribute-sets:
|
||||
type: binary
|
||||
-
|
||||
name: stats-grp
|
||||
attr-cnt-name: __ethtool-a-stats-grp-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: pad
|
||||
type: pad
|
||||
@ -912,7 +1200,12 @@ attribute-sets:
|
||||
name: hist-val
|
||||
-
|
||||
name: stats
|
||||
attr-cnt-name: __ethtool-a-stats-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: pad
|
||||
type: pad
|
||||
@ -933,7 +1226,12 @@ attribute-sets:
|
||||
type: u32
|
||||
-
|
||||
name: phc-vclocks
|
||||
attr-cnt-name: __ethtool-a-phc-vclocks-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -947,7 +1245,12 @@ attribute-sets:
|
||||
sub-type: s32
|
||||
-
|
||||
name: module
|
||||
attr-cnt-name: __ethtool-a-module-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -960,7 +1263,13 @@ attribute-sets:
|
||||
type: u8
|
||||
-
|
||||
name: c33-pse-pw-limit
|
||||
attr-cnt-name: __ethtool-a-c33-pse-pw-limit-cnt
|
||||
attr-max-name: __ethtool-a-c33-pse-pw-limit-max
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: min
|
||||
type: u32
|
||||
@ -969,7 +1278,12 @@ attribute-sets:
|
||||
type: u32
|
||||
-
|
||||
name: pse
|
||||
attr-cnt-name: __ethtool-a-pse-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -1027,7 +1341,12 @@ attribute-sets:
|
||||
nested-attributes: c33-pse-pw-limit
|
||||
-
|
||||
name: rss
|
||||
attr-cnt-name: __ethtool-a-rss-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -1053,7 +1372,12 @@ attribute-sets:
|
||||
type: u32
|
||||
-
|
||||
name: plca
|
||||
attr-cnt-name: __ethtool-a-plca-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -1084,7 +1408,12 @@ attribute-sets:
|
||||
type: u32
|
||||
-
|
||||
name: module-fw-flash
|
||||
attr-cnt-name: __ethtool-a-module-fw-flash-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
@ -1110,7 +1439,12 @@ attribute-sets:
|
||||
type: uint
|
||||
-
|
||||
name: phy
|
||||
attr-cnt-name: __ethtool-a-phy-cnt
|
||||
attributes:
|
||||
-
|
||||
name: unspec
|
||||
type: unused
|
||||
value: 0
|
||||
-
|
||||
name: header
|
||||
type: nest
|
||||
|
@ -124,7 +124,7 @@ To remove a target::
|
||||
|
||||
The interface exposes these parameters of a netconsole target to userspace:
|
||||
|
||||
============== ================================= ============
|
||||
=============== ================================= ============
|
||||
enabled Is this target currently enabled? (read-write)
|
||||
extended Extended mode enabled (read-write)
|
||||
release Prepend kernel release to message (read-write)
|
||||
@ -135,7 +135,8 @@ The interface exposes these parameters of a netconsole target to userspace:
|
||||
remote_ip Remote agent's IP address (read-write)
|
||||
local_mac Local interface's MAC address (read-only)
|
||||
remote_mac Remote agent's MAC address (read-write)
|
||||
============== ================================= ============
|
||||
transmit_errors Number of packet send errors (read-only)
|
||||
=============== ================================= ============
|
||||
|
||||
The "enabled" attribute is also used to control whether the parameters of
|
||||
a target can be updated or not -- you can modify the parameters of only
|
||||
|
@ -56,7 +56,9 @@ If ``name-prefix`` is specified it replaces the ``$family-$enum``
|
||||
portion of the entry name.
|
||||
|
||||
Boolean ``render-max`` controls creation of the max values
|
||||
(which are enabled by default for attribute enums).
|
||||
(which are enabled by default for attribute enums). These max
|
||||
values are named ``__$pfx-MAX`` and ``$pfx-MAX``. The name
|
||||
of the first value can be overridden via ``enum-cnt-name`` property.
|
||||
|
||||
Attributes
|
||||
==========
|
||||
|
@ -16282,7 +16282,7 @@ F: include/linux/inetdevice.h
|
||||
F: include/linux/netdev*
|
||||
F: include/linux/platform_data/wiznet.h
|
||||
F: include/uapi/linux/cn_proc.h
|
||||
F: include/uapi/linux/ethtool_netlink.h
|
||||
F: include/uapi/linux/ethtool_netlink*
|
||||
F: include/uapi/linux/if_*
|
||||
F: include/uapi/linux/net_shaper.h
|
||||
F: include/uapi/linux/netdev*
|
||||
|
@ -3960,20 +3960,27 @@ static struct mvneta_port *mvneta_pcs_to_port(struct phylink_pcs *pcs)
|
||||
return container_of(pcs, struct mvneta_port, phylink_pcs);
|
||||
}
|
||||
|
||||
static int mvneta_pcs_validate(struct phylink_pcs *pcs,
|
||||
unsigned long *supported,
|
||||
const struct phylink_link_state *state)
|
||||
static unsigned int mvneta_pcs_inband_caps(struct phylink_pcs *pcs,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
/* We only support QSGMII, SGMII, 802.3z and RGMII modes.
|
||||
* When in 802.3z mode, we must have AN enabled:
|
||||
/* When operating in an 802.3z mode, we must have AN enabled:
|
||||
* "Bit 2 Field InBandAnEn In-band Auto-Negotiation enable. ...
|
||||
* When <PortType> = 1 (1000BASE-X) this field must be set to 1."
|
||||
* Therefore, inband is "required".
|
||||
*/
|
||||
if (phy_interface_mode_is_8023z(state->interface) &&
|
||||
!phylink_test(state->advertising, Autoneg))
|
||||
return -EINVAL;
|
||||
if (phy_interface_mode_is_8023z(interface))
|
||||
return LINK_INBAND_ENABLE;
|
||||
|
||||
return 0;
|
||||
/* QSGMII, SGMII and RGMII can be configured to use inband
|
||||
* signalling of the AN result. Indicate these as "possible".
|
||||
*/
|
||||
if (interface == PHY_INTERFACE_MODE_SGMII ||
|
||||
interface == PHY_INTERFACE_MODE_QSGMII ||
|
||||
phy_interface_mode_is_rgmii(interface))
|
||||
return LINK_INBAND_DISABLE | LINK_INBAND_ENABLE;
|
||||
|
||||
/* For any other modes, indicate that inband is not supported. */
|
||||
return LINK_INBAND_DISABLE;
|
||||
}
|
||||
|
||||
static void mvneta_pcs_get_state(struct phylink_pcs *pcs,
|
||||
@ -4071,7 +4078,7 @@ static void mvneta_pcs_an_restart(struct phylink_pcs *pcs)
|
||||
}
|
||||
|
||||
static const struct phylink_pcs_ops mvneta_phylink_pcs_ops = {
|
||||
.pcs_validate = mvneta_pcs_validate,
|
||||
.pcs_inband_caps = mvneta_pcs_inband_caps,
|
||||
.pcs_get_state = mvneta_pcs_get_state,
|
||||
.pcs_config = mvneta_pcs_config,
|
||||
.pcs_an_restart = mvneta_pcs_an_restart,
|
||||
|
@ -6224,19 +6224,26 @@ static const struct phylink_pcs_ops mvpp2_phylink_xlg_pcs_ops = {
|
||||
.pcs_config = mvpp2_xlg_pcs_config,
|
||||
};
|
||||
|
||||
static int mvpp2_gmac_pcs_validate(struct phylink_pcs *pcs,
|
||||
unsigned long *supported,
|
||||
const struct phylink_link_state *state)
|
||||
static unsigned int mvpp2_gmac_pcs_inband_caps(struct phylink_pcs *pcs,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
/* When in 802.3z mode, we must have AN enabled:
|
||||
/* When operating in an 802.3z mode, we must have AN enabled:
|
||||
* Bit 2 Field InBandAnEn In-band Auto-Negotiation enable. ...
|
||||
* When <PortType> = 1 (1000BASE-X) this field must be set to 1.
|
||||
* Therefore, inband is "required".
|
||||
*/
|
||||
if (phy_interface_mode_is_8023z(state->interface) &&
|
||||
!phylink_test(state->advertising, Autoneg))
|
||||
return -EINVAL;
|
||||
if (phy_interface_mode_is_8023z(interface))
|
||||
return LINK_INBAND_ENABLE;
|
||||
|
||||
return 0;
|
||||
/* SGMII and RGMII can be configured to use inband signalling of the
|
||||
* AN result. Indicate these as "possible".
|
||||
*/
|
||||
if (interface == PHY_INTERFACE_MODE_SGMII ||
|
||||
phy_interface_mode_is_rgmii(interface))
|
||||
return LINK_INBAND_DISABLE | LINK_INBAND_ENABLE;
|
||||
|
||||
/* For any other modes, indicate that inband is not supported. */
|
||||
return LINK_INBAND_DISABLE;
|
||||
}
|
||||
|
||||
static void mvpp2_gmac_pcs_get_state(struct phylink_pcs *pcs,
|
||||
@ -6343,7 +6350,7 @@ static void mvpp2_gmac_pcs_an_restart(struct phylink_pcs *pcs)
|
||||
}
|
||||
|
||||
static const struct phylink_pcs_ops mvpp2_phylink_gmac_pcs_ops = {
|
||||
.pcs_validate = mvpp2_gmac_pcs_validate,
|
||||
.pcs_inband_caps = mvpp2_gmac_pcs_inband_caps,
|
||||
.pcs_get_state = mvpp2_gmac_pcs_get_state,
|
||||
.pcs_config = mvpp2_gmac_pcs_config,
|
||||
.pcs_an_restart = mvpp2_gmac_pcs_an_restart,
|
||||
|
@ -23,7 +23,7 @@ enum mac_version {
|
||||
RTL_GIGA_MAC_VER_08,
|
||||
RTL_GIGA_MAC_VER_09,
|
||||
RTL_GIGA_MAC_VER_10,
|
||||
RTL_GIGA_MAC_VER_11,
|
||||
/* support for RTL_GIGA_MAC_VER_11 has been removed */
|
||||
/* RTL_GIGA_MAC_VER_12 was handled the same as VER_17 */
|
||||
/* RTL_GIGA_MAC_VER_13 was merged with VER_10 */
|
||||
RTL_GIGA_MAC_VER_14,
|
||||
|
@ -104,7 +104,6 @@ static const struct {
|
||||
[RTL_GIGA_MAC_VER_08] = {"RTL8102e" },
|
||||
[RTL_GIGA_MAC_VER_09] = {"RTL8102e/RTL8103e" },
|
||||
[RTL_GIGA_MAC_VER_10] = {"RTL8101e/RTL8100e" },
|
||||
[RTL_GIGA_MAC_VER_11] = {"RTL8168b/8111b" },
|
||||
[RTL_GIGA_MAC_VER_14] = {"RTL8401" },
|
||||
[RTL_GIGA_MAC_VER_17] = {"RTL8168b/8111b" },
|
||||
[RTL_GIGA_MAC_VER_18] = {"RTL8168cp/8111cp" },
|
||||
@ -623,7 +622,6 @@ struct rtl8169_tc_offsets {
|
||||
|
||||
enum rtl_flag {
|
||||
RTL_FLAG_TASK_RESET_PENDING,
|
||||
RTL_FLAG_TASK_RESET_NO_QUEUE_WAKE,
|
||||
RTL_FLAG_TASK_TX_TIMEOUT,
|
||||
RTL_FLAG_MAX
|
||||
};
|
||||
@ -2336,7 +2334,7 @@ static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)
|
||||
|
||||
/* 8168B family. */
|
||||
{ 0x7c8, 0x380, RTL_GIGA_MAC_VER_17 },
|
||||
/* This one is very old and rare, let's see if anybody complains.
|
||||
/* This one is very old and rare, support has been removed.
|
||||
* { 0x7c8, 0x300, RTL_GIGA_MAC_VER_11 },
|
||||
*/
|
||||
|
||||
@ -3804,7 +3802,6 @@ static void rtl_hw_config(struct rtl8169_private *tp)
|
||||
[RTL_GIGA_MAC_VER_08] = rtl_hw_start_8102e_3,
|
||||
[RTL_GIGA_MAC_VER_09] = rtl_hw_start_8102e_2,
|
||||
[RTL_GIGA_MAC_VER_10] = NULL,
|
||||
[RTL_GIGA_MAC_VER_11] = rtl_hw_start_8168b,
|
||||
[RTL_GIGA_MAC_VER_14] = rtl_hw_start_8401,
|
||||
[RTL_GIGA_MAC_VER_17] = rtl_hw_start_8168b,
|
||||
[RTL_GIGA_MAC_VER_18] = rtl_hw_start_8168cp_1,
|
||||
@ -4680,12 +4677,6 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
||||
if (status & LinkChg)
|
||||
phy_mac_interrupt(tp->phydev);
|
||||
|
||||
if (unlikely(status & RxFIFOOver &&
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_11)) {
|
||||
netif_stop_queue(tp->dev);
|
||||
rtl_schedule_task(tp, RTL_FLAG_TASK_RESET_PENDING);
|
||||
}
|
||||
|
||||
rtl_irq_disable(tp);
|
||||
napi_schedule(&tp->napi);
|
||||
out:
|
||||
@ -4723,8 +4714,6 @@ static void rtl_task(struct work_struct *work)
|
||||
reset:
|
||||
rtl_reset_work(tp);
|
||||
netif_wake_queue(tp->dev);
|
||||
} else if (test_and_clear_bit(RTL_FLAG_TASK_RESET_NO_QUEUE_WAKE, tp->wk.flags)) {
|
||||
rtl_reset_work(tp);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5103,9 +5092,6 @@ static void rtl_set_irq_mask(struct rtl8169_private *tp)
|
||||
|
||||
if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
|
||||
tp->irq_mask |= SYSErr | RxFIFOOver;
|
||||
else if (tp->mac_version == RTL_GIGA_MAC_VER_11)
|
||||
/* special workaround needed */
|
||||
tp->irq_mask |= RxFIFOOver;
|
||||
}
|
||||
|
||||
static int rtl_alloc_irq(struct rtl8169_private *tp)
|
||||
@ -5300,7 +5286,6 @@ static int rtl_jumbo_max(struct rtl8169_private *tp)
|
||||
case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06:
|
||||
return JUMBO_7K;
|
||||
/* RTL8168b */
|
||||
case RTL_GIGA_MAC_VER_11:
|
||||
case RTL_GIGA_MAC_VER_17:
|
||||
return JUMBO_4K;
|
||||
/* RTL8168c */
|
||||
@ -5347,13 +5332,6 @@ static bool rtl_aspm_is_safe(struct rtl8169_private *tp)
|
||||
return false;
|
||||
}
|
||||
|
||||
static umode_t r8169_hwmon_is_visible(const void *drvdata,
|
||||
enum hwmon_sensor_types type,
|
||||
u32 attr, int channel)
|
||||
{
|
||||
return 0444;
|
||||
}
|
||||
|
||||
static int r8169_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
|
||||
u32 attr, int channel, long *val)
|
||||
{
|
||||
@ -5370,7 +5348,7 @@ static int r8169_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
|
||||
}
|
||||
|
||||
static const struct hwmon_ops r8169_hwmon_ops = {
|
||||
.is_visible = r8169_hwmon_is_visible,
|
||||
.visible = 0444,
|
||||
.read = r8169_hwmon_read,
|
||||
};
|
||||
|
||||
|
@ -276,15 +276,6 @@ static void rtl8169sce_hw_phy_config(struct rtl8169_private *tp,
|
||||
rtl_writephy_batch(phydev, phy_reg_init);
|
||||
}
|
||||
|
||||
static void rtl8168bb_hw_phy_config(struct rtl8169_private *tp,
|
||||
struct phy_device *phydev)
|
||||
{
|
||||
phy_write(phydev, 0x1f, 0x0001);
|
||||
phy_set_bits(phydev, 0x16, BIT(0));
|
||||
phy_write(phydev, 0x10, 0xf41b);
|
||||
phy_write(phydev, 0x1f, 0x0000);
|
||||
}
|
||||
|
||||
static void rtl8168bef_hw_phy_config(struct rtl8169_private *tp,
|
||||
struct phy_device *phydev)
|
||||
{
|
||||
@ -1136,7 +1127,6 @@ void r8169_hw_phy_config(struct rtl8169_private *tp, struct phy_device *phydev,
|
||||
[RTL_GIGA_MAC_VER_08] = rtl8102e_hw_phy_config,
|
||||
[RTL_GIGA_MAC_VER_09] = rtl8102e_hw_phy_config,
|
||||
[RTL_GIGA_MAC_VER_10] = NULL,
|
||||
[RTL_GIGA_MAC_VER_11] = rtl8168bb_hw_phy_config,
|
||||
[RTL_GIGA_MAC_VER_14] = rtl8401_hw_phy_config,
|
||||
[RTL_GIGA_MAC_VER_17] = rtl8168bef_hw_phy_config,
|
||||
[RTL_GIGA_MAC_VER_18] = rtl8168cp_1_hw_phy_config,
|
||||
|
@ -13,6 +13,7 @@
|
||||
#define RTASE_HW_VER_906X_7XA 0x00800000
|
||||
#define RTASE_HW_VER_906X_7XC 0x04000000
|
||||
#define RTASE_HW_VER_907XD_V1 0x04800000
|
||||
#define RTASE_HW_VER_907XD_VA 0x08000000
|
||||
|
||||
#define RTASE_RX_DMA_BURST_256 4
|
||||
#define RTASE_TX_DMA_BURST_UNLIMITED 7
|
||||
|
@ -1725,6 +1725,7 @@ static int rtase_get_settings(struct net_device *dev,
|
||||
cmd->base.speed = SPEED_5000;
|
||||
break;
|
||||
case RTASE_HW_VER_907XD_V1:
|
||||
case RTASE_HW_VER_907XD_VA:
|
||||
cmd->base.speed = SPEED_10000;
|
||||
break;
|
||||
}
|
||||
@ -1993,6 +1994,7 @@ static int rtase_check_mac_version_valid(struct rtase_private *tp)
|
||||
case RTASE_HW_VER_906X_7XA:
|
||||
case RTASE_HW_VER_906X_7XC:
|
||||
case RTASE_HW_VER_907XD_V1:
|
||||
case RTASE_HW_VER_907XD_VA:
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
@ -177,8 +177,7 @@ static struct mctp_i2c_client *mctp_i2c_new_client(struct i2c_client *client)
|
||||
return mcli;
|
||||
err:
|
||||
if (mcli) {
|
||||
if (mcli->client)
|
||||
i2c_unregister_device(mcli->client);
|
||||
i2c_unregister_device(mcli->client);
|
||||
kfree(mcli);
|
||||
}
|
||||
return ERR_PTR(rc);
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include <linux/inet.h>
|
||||
#include <linux/configfs.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/u64_stats_sync.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
|
||||
@ -90,6 +91,12 @@ static DEFINE_MUTEX(target_cleanup_list_lock);
|
||||
*/
|
||||
static struct console netconsole_ext;
|
||||
|
||||
struct netconsole_target_stats {
|
||||
u64_stats_t xmit_drop_count;
|
||||
u64_stats_t enomem_count;
|
||||
struct u64_stats_sync syncp;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct netconsole_target - Represents a configured netconsole target.
|
||||
* @list: Links this target into the target_list.
|
||||
@ -97,6 +104,7 @@ static struct console netconsole_ext;
|
||||
* @userdata_group: Links to the userdata configfs hierarchy
|
||||
* @userdata_complete: Cached, formatted string of append
|
||||
* @userdata_length: String length of userdata_complete
|
||||
* @stats: Packet send stats for the target. Used for debugging.
|
||||
* @enabled: On / off knob to enable / disable target.
|
||||
* Visible from userspace (read-write).
|
||||
* We maintain a strict 1:1 correspondence between this and
|
||||
@ -124,6 +132,7 @@ struct netconsole_target {
|
||||
char userdata_complete[MAX_USERDATA_ENTRY_LENGTH * MAX_USERDATA_ITEMS];
|
||||
size_t userdata_length;
|
||||
#endif
|
||||
struct netconsole_target_stats stats;
|
||||
bool enabled;
|
||||
bool extended;
|
||||
bool release;
|
||||
@ -262,6 +271,7 @@ static void netconsole_process_cleanups_core(void)
|
||||
* | remote_ip
|
||||
* | local_mac
|
||||
* | remote_mac
|
||||
* | transmit_errors
|
||||
* | userdata/
|
||||
* | <key>/
|
||||
* | value
|
||||
@ -371,6 +381,21 @@ static ssize_t remote_mac_show(struct config_item *item, char *buf)
|
||||
return sysfs_emit(buf, "%pM\n", to_target(item)->np.remote_mac);
|
||||
}
|
||||
|
||||
static ssize_t transmit_errors_show(struct config_item *item, char *buf)
|
||||
{
|
||||
struct netconsole_target *nt = to_target(item);
|
||||
u64 xmit_drop_count, enomem_count;
|
||||
unsigned int start;
|
||||
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&nt->stats.syncp);
|
||||
xmit_drop_count = u64_stats_read(&nt->stats.xmit_drop_count);
|
||||
enomem_count = u64_stats_read(&nt->stats.enomem_count);
|
||||
} while (u64_stats_fetch_retry(&nt->stats.syncp, start));
|
||||
|
||||
return sysfs_emit(buf, "%llu\n", xmit_drop_count + enomem_count);
|
||||
}
|
||||
|
||||
/*
|
||||
* This one is special -- targets created through the configfs interface
|
||||
* are not enabled (and the corresponding netpoll activated) by default.
|
||||
@ -842,6 +867,7 @@ CONFIGFS_ATTR(, remote_ip);
|
||||
CONFIGFS_ATTR_RO(, local_mac);
|
||||
CONFIGFS_ATTR(, remote_mac);
|
||||
CONFIGFS_ATTR(, release);
|
||||
CONFIGFS_ATTR_RO(, transmit_errors);
|
||||
|
||||
static struct configfs_attribute *netconsole_target_attrs[] = {
|
||||
&attr_enabled,
|
||||
@ -854,6 +880,7 @@ static struct configfs_attribute *netconsole_target_attrs[] = {
|
||||
&attr_remote_ip,
|
||||
&attr_local_mac,
|
||||
&attr_remote_mac,
|
||||
&attr_transmit_errors,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@ -1058,6 +1085,33 @@ static struct notifier_block netconsole_netdev_notifier = {
|
||||
.notifier_call = netconsole_netdev_event,
|
||||
};
|
||||
|
||||
/**
|
||||
* send_udp - Wrapper for netpoll_send_udp that counts errors
|
||||
* @nt: target to send message to
|
||||
* @msg: message to send
|
||||
* @len: length of message
|
||||
*
|
||||
* Calls netpoll_send_udp and classifies the return value. If an error
|
||||
* occurred it increments statistics in nt->stats accordingly.
|
||||
* Only calls netpoll_send_udp if CONFIG_NETCONSOLE_DYNAMIC is disabled.
|
||||
*/
|
||||
static void send_udp(struct netconsole_target *nt, const char *msg, int len)
|
||||
{
|
||||
int result = netpoll_send_udp(&nt->np, msg, len);
|
||||
|
||||
if (IS_ENABLED(CONFIG_NETCONSOLE_DYNAMIC)) {
|
||||
if (result == NET_XMIT_DROP) {
|
||||
u64_stats_update_begin(&nt->stats.syncp);
|
||||
u64_stats_inc(&nt->stats.xmit_drop_count);
|
||||
u64_stats_update_end(&nt->stats.syncp);
|
||||
} else if (result == -ENOMEM) {
|
||||
u64_stats_update_begin(&nt->stats.syncp);
|
||||
u64_stats_inc(&nt->stats.enomem_count);
|
||||
u64_stats_update_end(&nt->stats.syncp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void send_msg_no_fragmentation(struct netconsole_target *nt,
|
||||
const char *msg,
|
||||
int msg_len,
|
||||
@ -1085,7 +1139,7 @@ static void send_msg_no_fragmentation(struct netconsole_target *nt,
|
||||
MAX_PRINT_CHUNK - msg_len,
|
||||
"%s", userdata);
|
||||
|
||||
netpoll_send_udp(&nt->np, buf, msg_len);
|
||||
send_udp(nt, buf, msg_len);
|
||||
}
|
||||
|
||||
static void append_release(char *buf)
|
||||
@ -1178,7 +1232,7 @@ static void send_fragmented_body(struct netconsole_target *nt, char *buf,
|
||||
this_offset += this_chunk;
|
||||
}
|
||||
|
||||
netpoll_send_udp(&nt->np, buf, this_header + this_offset);
|
||||
send_udp(nt, buf, this_header + this_offset);
|
||||
offset += this_offset;
|
||||
}
|
||||
}
|
||||
@ -1288,7 +1342,7 @@ static void write_msg(struct console *con, const char *msg, unsigned int len)
|
||||
tmp = msg;
|
||||
for (left = len; left;) {
|
||||
frag = min(left, MAX_PRINT_CHUNK);
|
||||
netpoll_send_udp(&nt->np, tmp, frag);
|
||||
send_udp(nt, tmp, frag);
|
||||
tmp += frag;
|
||||
left -= frag;
|
||||
}
|
||||
|
@ -235,11 +235,21 @@ static int bcm84881_read_status(struct phy_device *phydev)
|
||||
return genphy_c45_read_mdix(phydev);
|
||||
}
|
||||
|
||||
/* The Broadcom BCM84881 in the Methode DM7052 is unable to provide a SGMII
|
||||
* or 802.3z control word, so inband will not work.
|
||||
*/
|
||||
static unsigned int bcm84881_inband_caps(struct phy_device *phydev,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
return LINK_INBAND_DISABLE;
|
||||
}
|
||||
|
||||
static struct phy_driver bcm84881_drivers[] = {
|
||||
{
|
||||
.phy_id = 0xae025150,
|
||||
.phy_id_mask = 0xfffffff0,
|
||||
.name = "Broadcom BCM84881",
|
||||
.inband_caps = bcm84881_inband_caps,
|
||||
.config_init = bcm84881_config_init,
|
||||
.probe = bcm84881_probe,
|
||||
.get_features = bcm84881_get_features,
|
||||
|
@ -717,6 +717,48 @@ static int marvell_config_aneg_fiber(struct phy_device *phydev)
|
||||
return genphy_check_and_restart_aneg(phydev, changed);
|
||||
}
|
||||
|
||||
static unsigned int m88e1111_inband_caps(struct phy_device *phydev,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
/* In 1000base-X and SGMII modes, the inband mode can be changed
|
||||
* through the Fibre page BMCR ANENABLE bit.
|
||||
*/
|
||||
if (interface == PHY_INTERFACE_MODE_1000BASEX ||
|
||||
interface == PHY_INTERFACE_MODE_SGMII)
|
||||
return LINK_INBAND_DISABLE | LINK_INBAND_ENABLE |
|
||||
LINK_INBAND_BYPASS;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88e1111_config_inband(struct phy_device *phydev, unsigned int modes)
|
||||
{
|
||||
u16 extsr, bmcr;
|
||||
int err;
|
||||
|
||||
if (phydev->interface != PHY_INTERFACE_MODE_1000BASEX &&
|
||||
phydev->interface != PHY_INTERFACE_MODE_SGMII)
|
||||
return -EINVAL;
|
||||
|
||||
if (modes == LINK_INBAND_BYPASS)
|
||||
extsr = MII_M1111_HWCFG_SERIAL_AN_BYPASS;
|
||||
else
|
||||
extsr = 0;
|
||||
|
||||
if (modes == LINK_INBAND_DISABLE)
|
||||
bmcr = 0;
|
||||
else
|
||||
bmcr = BMCR_ANENABLE;
|
||||
|
||||
err = phy_modify(phydev, MII_M1111_PHY_EXT_SR,
|
||||
MII_M1111_HWCFG_SERIAL_AN_BYPASS, extsr);
|
||||
if (err < 0)
|
||||
return extsr;
|
||||
|
||||
return phy_modify_paged(phydev, MII_MARVELL_FIBER_PAGE, MII_BMCR,
|
||||
BMCR_ANENABLE, bmcr);
|
||||
}
|
||||
|
||||
static int m88e1111_config_aneg(struct phy_device *phydev)
|
||||
{
|
||||
int extsr = phy_read(phydev, MII_M1111_PHY_EXT_SR);
|
||||
@ -3677,6 +3719,8 @@ static struct phy_driver marvell_drivers[] = {
|
||||
.name = "Marvell 88E1112",
|
||||
/* PHY_GBIT_FEATURES */
|
||||
.probe = marvell_probe,
|
||||
.inband_caps = m88e1111_inband_caps,
|
||||
.config_inband = m88e1111_config_inband,
|
||||
.config_init = m88e1112_config_init,
|
||||
.config_aneg = marvell_config_aneg,
|
||||
.config_intr = marvell_config_intr,
|
||||
@ -3698,6 +3742,8 @@ static struct phy_driver marvell_drivers[] = {
|
||||
/* PHY_GBIT_FEATURES */
|
||||
.flags = PHY_POLL_CABLE_TEST,
|
||||
.probe = marvell_probe,
|
||||
.inband_caps = m88e1111_inband_caps,
|
||||
.config_inband = m88e1111_config_inband,
|
||||
.config_init = m88e1111gbe_config_init,
|
||||
.config_aneg = m88e1111_config_aneg,
|
||||
.read_status = marvell_read_status,
|
||||
@ -3721,6 +3767,8 @@ static struct phy_driver marvell_drivers[] = {
|
||||
.name = "Marvell 88E1111 (Finisar)",
|
||||
/* PHY_GBIT_FEATURES */
|
||||
.probe = marvell_probe,
|
||||
.inband_caps = m88e1111_inband_caps,
|
||||
.config_inband = m88e1111_config_inband,
|
||||
.config_init = m88e1111gbe_config_init,
|
||||
.config_aneg = m88e1111_config_aneg,
|
||||
.read_status = marvell_read_status,
|
||||
|
@ -1005,6 +1005,59 @@ static int phy_check_link_status(struct phy_device *phydev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* phy_inband_caps - query which in-band signalling modes are supported
|
||||
* @phydev: a pointer to a &struct phy_device
|
||||
* @interface: the interface mode for the PHY
|
||||
*
|
||||
* Returns zero if it is unknown what in-band signalling is supported by the
|
||||
* PHY (e.g. because the PHY driver doesn't implement the method.) Otherwise,
|
||||
* returns a bit mask of the LINK_INBAND_* values from
|
||||
* &enum link_inband_signalling to describe which inband modes are supported
|
||||
* by the PHY for this interface mode.
|
||||
*/
|
||||
unsigned int phy_inband_caps(struct phy_device *phydev,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
if (phydev->drv && phydev->drv->inband_caps)
|
||||
return phydev->drv->inband_caps(phydev, interface);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phy_inband_caps);
|
||||
|
||||
/**
|
||||
* phy_config_inband - configure the desired PHY in-band mode
|
||||
* @phydev: the phy_device struct
|
||||
* @modes: in-band modes to configure
|
||||
*
|
||||
* Description: disables, enables or enables-with-bypass in-band signalling
|
||||
* between the PHY and host system.
|
||||
*
|
||||
* Returns: zero on success, or negative errno value.
|
||||
*/
|
||||
int phy_config_inband(struct phy_device *phydev, unsigned int modes)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!!(modes & LINK_INBAND_DISABLE) +
|
||||
!!(modes & LINK_INBAND_ENABLE) +
|
||||
!!(modes & LINK_INBAND_BYPASS) != 1)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&phydev->lock);
|
||||
if (!phydev->drv)
|
||||
err = -EIO;
|
||||
else if (!phydev->drv->config_inband)
|
||||
err = -EOPNOTSUPP;
|
||||
else
|
||||
err = phydev->drv->config_inband(phydev, modes);
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(phy_config_inband);
|
||||
|
||||
/**
|
||||
* _phy_start_aneg - start auto-negotiation for this PHY device
|
||||
* @phydev: the phy_device struct
|
||||
|
@ -56,7 +56,8 @@ struct phylink {
|
||||
struct phy_device *phydev;
|
||||
phy_interface_t link_interface; /* PHY_INTERFACE_xxx */
|
||||
u8 cfg_link_an_mode; /* MLO_AN_xxx */
|
||||
u8 cur_link_an_mode;
|
||||
u8 req_link_an_mode; /* Requested MLO_AN_xxx mode */
|
||||
u8 act_link_an_mode; /* Active MLO_AN_xxx mode */
|
||||
u8 link_port; /* The current non-phy ethtool port */
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
|
||||
|
||||
@ -74,6 +75,7 @@ struct phylink {
|
||||
|
||||
struct mutex state_mutex;
|
||||
struct phylink_link_state phy_state;
|
||||
unsigned int phy_ib_mode;
|
||||
struct work_struct resolve;
|
||||
unsigned int pcs_neg_mode;
|
||||
unsigned int pcs_state;
|
||||
@ -174,6 +176,24 @@ static const char *phylink_an_mode_str(unsigned int mode)
|
||||
return mode < ARRAY_SIZE(modestr) ? modestr[mode] : "unknown";
|
||||
}
|
||||
|
||||
static const char *phylink_pcs_mode_str(unsigned int mode)
|
||||
{
|
||||
if (!mode)
|
||||
return "none";
|
||||
|
||||
if (mode & PHYLINK_PCS_NEG_OUTBAND)
|
||||
return "outband";
|
||||
|
||||
if (mode & PHYLINK_PCS_NEG_INBAND) {
|
||||
if (mode & PHYLINK_PCS_NEG_ENABLED)
|
||||
return "inband,an-enabled";
|
||||
else
|
||||
return "inband,an-disabled";
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
static unsigned int phylink_interface_signal_rate(phy_interface_t interface)
|
||||
{
|
||||
switch (interface) {
|
||||
@ -971,6 +991,15 @@ static void phylink_resolve_an_pause(struct phylink_link_state *state)
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int phylink_pcs_inband_caps(struct phylink_pcs *pcs,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
if (pcs && pcs->ops->pcs_inband_caps)
|
||||
return pcs->ops->pcs_inband_caps(pcs, interface);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void phylink_pcs_pre_config(struct phylink_pcs *pcs,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
@ -1024,6 +1053,24 @@ static void phylink_pcs_link_up(struct phylink_pcs *pcs, unsigned int neg_mode,
|
||||
pcs->ops->pcs_link_up(pcs, neg_mode, interface, speed, duplex);
|
||||
}
|
||||
|
||||
/* Query inband for a specific interface mode, asking the MAC for the
|
||||
* PCS which will be used to handle the interface mode.
|
||||
*/
|
||||
static unsigned int phylink_inband_caps(struct phylink *pl,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
struct phylink_pcs *pcs;
|
||||
|
||||
if (!pl->mac_ops->mac_select_pcs)
|
||||
return 0;
|
||||
|
||||
pcs = pl->mac_ops->mac_select_pcs(pl->config, interface);
|
||||
if (!pcs)
|
||||
return 0;
|
||||
|
||||
return phylink_pcs_inband_caps(pcs, interface);
|
||||
}
|
||||
|
||||
static void phylink_pcs_poll_stop(struct phylink *pl)
|
||||
{
|
||||
if (pl->cfg_link_an_mode == MLO_AN_INBAND)
|
||||
@ -1065,13 +1112,13 @@ static void phylink_mac_config(struct phylink *pl,
|
||||
|
||||
phylink_dbg(pl,
|
||||
"%s: mode=%s/%s/%s adv=%*pb pause=%02x\n",
|
||||
__func__, phylink_an_mode_str(pl->cur_link_an_mode),
|
||||
__func__, phylink_an_mode_str(pl->act_link_an_mode),
|
||||
phy_modes(st.interface),
|
||||
phy_rate_matching_to_str(st.rate_matching),
|
||||
__ETHTOOL_LINK_MODE_MASK_NBITS, st.advertising,
|
||||
st.pause);
|
||||
|
||||
pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, &st);
|
||||
pl->mac_ops->mac_config(pl->config, pl->act_link_an_mode, &st);
|
||||
}
|
||||
|
||||
static void phylink_pcs_an_restart(struct phylink *pl)
|
||||
@ -1079,13 +1126,14 @@ static void phylink_pcs_an_restart(struct phylink *pl)
|
||||
if (pl->pcs && linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
|
||||
pl->link_config.advertising) &&
|
||||
phy_interface_mode_is_8023z(pl->link_config.interface) &&
|
||||
phylink_autoneg_inband(pl->cur_link_an_mode))
|
||||
phylink_autoneg_inband(pl->act_link_an_mode))
|
||||
pl->pcs->ops->pcs_an_restart(pl->pcs);
|
||||
}
|
||||
|
||||
/**
|
||||
* phylink_pcs_neg_mode() - helper to determine PCS inband mode
|
||||
* @mode: one of %MLO_AN_FIXED, %MLO_AN_PHY, %MLO_AN_INBAND.
|
||||
* @pl: a pointer to a &struct phylink returned from phylink_create()
|
||||
* @pcs: a pointer to &struct phylink_pcs
|
||||
* @interface: interface mode to be used
|
||||
* @advertising: adertisement ethtool link mode mask
|
||||
*
|
||||
@ -1102,11 +1150,21 @@ static void phylink_pcs_an_restart(struct phylink *pl)
|
||||
* Note: this is for cases where the PCS itself is involved in negotiation
|
||||
* (e.g. Clause 37, SGMII and similar) not Clause 73.
|
||||
*/
|
||||
static unsigned int phylink_pcs_neg_mode(unsigned int mode,
|
||||
phy_interface_t interface,
|
||||
const unsigned long *advertising)
|
||||
static void phylink_pcs_neg_mode(struct phylink *pl, struct phylink_pcs *pcs,
|
||||
phy_interface_t interface,
|
||||
const unsigned long *advertising)
|
||||
{
|
||||
unsigned int neg_mode;
|
||||
unsigned int pcs_ib_caps = 0;
|
||||
unsigned int phy_ib_caps = 0;
|
||||
unsigned int neg_mode, mode;
|
||||
enum {
|
||||
INBAND_CISCO_SGMII,
|
||||
INBAND_BASEX,
|
||||
} type;
|
||||
|
||||
mode = pl->req_link_an_mode;
|
||||
|
||||
pl->phy_ib_mode = 0;
|
||||
|
||||
switch (interface) {
|
||||
case PHY_INTERFACE_MODE_SGMII:
|
||||
@ -1119,10 +1177,7 @@ static unsigned int phylink_pcs_neg_mode(unsigned int mode,
|
||||
* inband communication. Note: there exist PHYs that run
|
||||
* with SGMII but do not send the inband data.
|
||||
*/
|
||||
if (!phylink_autoneg_inband(mode))
|
||||
neg_mode = PHYLINK_PCS_NEG_OUTBAND;
|
||||
else
|
||||
neg_mode = PHYLINK_PCS_NEG_INBAND_ENABLED;
|
||||
type = INBAND_CISCO_SGMII;
|
||||
break;
|
||||
|
||||
case PHY_INTERFACE_MODE_1000BASEX:
|
||||
@ -1133,21 +1188,143 @@ static unsigned int phylink_pcs_neg_mode(unsigned int mode,
|
||||
* as well, but drivers may not support this, so may
|
||||
* need to override this.
|
||||
*/
|
||||
if (!phylink_autoneg_inband(mode))
|
||||
type = INBAND_BASEX;
|
||||
break;
|
||||
|
||||
default:
|
||||
pl->pcs_neg_mode = PHYLINK_PCS_NEG_NONE;
|
||||
pl->act_link_an_mode = mode;
|
||||
return;
|
||||
}
|
||||
|
||||
if (pcs)
|
||||
pcs_ib_caps = phylink_pcs_inband_caps(pcs, interface);
|
||||
|
||||
if (pl->phydev)
|
||||
phy_ib_caps = phy_inband_caps(pl->phydev, interface);
|
||||
|
||||
phylink_dbg(pl, "interface %s inband modes: pcs=%02x phy=%02x\n",
|
||||
phy_modes(interface), pcs_ib_caps, phy_ib_caps);
|
||||
|
||||
if (!phylink_autoneg_inband(mode)) {
|
||||
bool pcs_ib_only = false;
|
||||
bool phy_ib_only = false;
|
||||
|
||||
if (pcs_ib_caps && pcs_ib_caps != LINK_INBAND_DISABLE) {
|
||||
/* PCS supports reporting in-band capabilities, and
|
||||
* supports more than disable mode.
|
||||
*/
|
||||
if (pcs_ib_caps & LINK_INBAND_DISABLE)
|
||||
neg_mode = PHYLINK_PCS_NEG_OUTBAND;
|
||||
else if (pcs_ib_caps & LINK_INBAND_ENABLE)
|
||||
pcs_ib_only = true;
|
||||
}
|
||||
|
||||
if (phy_ib_caps && phy_ib_caps != LINK_INBAND_DISABLE) {
|
||||
/* PHY supports in-band capabilities, and supports
|
||||
* more than disable mode.
|
||||
*/
|
||||
if (phy_ib_caps & LINK_INBAND_DISABLE)
|
||||
pl->phy_ib_mode = LINK_INBAND_DISABLE;
|
||||
else if (phy_ib_caps & LINK_INBAND_BYPASS)
|
||||
pl->phy_ib_mode = LINK_INBAND_BYPASS;
|
||||
else if (phy_ib_caps & LINK_INBAND_ENABLE)
|
||||
phy_ib_only = true;
|
||||
}
|
||||
|
||||
/* If either the PCS or PHY requires inband to be enabled,
|
||||
* this is an invalid configuration. Provide a diagnostic
|
||||
* message for this case, but don't try to force the issue.
|
||||
*/
|
||||
if (pcs_ib_only || phy_ib_only)
|
||||
phylink_warn(pl,
|
||||
"firmware wants %s mode, but %s%s%s requires inband\n",
|
||||
phylink_an_mode_str(mode),
|
||||
pcs_ib_only ? "PCS" : "",
|
||||
pcs_ib_only && phy_ib_only ? " and " : "",
|
||||
phy_ib_only ? "PHY" : "");
|
||||
|
||||
neg_mode = PHYLINK_PCS_NEG_OUTBAND;
|
||||
} else if (type == INBAND_CISCO_SGMII || pl->phydev) {
|
||||
/* For SGMII modes which are designed to be used with PHYs, or
|
||||
* Base-X with a PHY, we try to use in-band mode where-ever
|
||||
* possible. However, there are some PHYs e.g. BCM84881 which
|
||||
* do not support in-band.
|
||||
*/
|
||||
const unsigned int inband_ok = LINK_INBAND_ENABLE |
|
||||
LINK_INBAND_BYPASS;
|
||||
const unsigned int outband_ok = LINK_INBAND_DISABLE |
|
||||
LINK_INBAND_BYPASS;
|
||||
/* PCS PHY
|
||||
* D E D E
|
||||
* 0 0 0 0 no information inband enabled
|
||||
* 1 0 0 0 pcs doesn't support outband
|
||||
* 0 1 0 0 pcs required inband enabled
|
||||
* 1 1 0 0 pcs optional inband enabled
|
||||
* 0 0 1 0 phy doesn't support outband
|
||||
* 1 0 1 0 pcs+phy doesn't support outband
|
||||
* 0 1 1 0 pcs required, phy doesn't support, invalid
|
||||
* 1 1 1 0 pcs optional, phy doesn't support, outband
|
||||
* 0 0 0 1 phy required inband enabled
|
||||
* 1 0 0 1 pcs doesn't support, phy required, invalid
|
||||
* 0 1 0 1 pcs+phy required inband enabled
|
||||
* 1 1 0 1 pcs optional, phy required inband enabled
|
||||
* 0 0 1 1 phy optional inband enabled
|
||||
* 1 0 1 1 pcs doesn't support, phy optional, outband
|
||||
* 0 1 1 1 pcs required, phy optional inband enabled
|
||||
* 1 1 1 1 pcs+phy optional inband enabled
|
||||
*/
|
||||
if ((!pcs_ib_caps || pcs_ib_caps & inband_ok) &&
|
||||
(!phy_ib_caps || phy_ib_caps & inband_ok)) {
|
||||
/* In-band supported or unknown at both ends. Enable
|
||||
* in-band mode with or without bypass at the PHY.
|
||||
*/
|
||||
if (phy_ib_caps & LINK_INBAND_ENABLE)
|
||||
pl->phy_ib_mode = LINK_INBAND_ENABLE;
|
||||
else if (phy_ib_caps & LINK_INBAND_BYPASS)
|
||||
pl->phy_ib_mode = LINK_INBAND_BYPASS;
|
||||
|
||||
neg_mode = PHYLINK_PCS_NEG_INBAND_ENABLED;
|
||||
} else if ((!pcs_ib_caps || pcs_ib_caps & outband_ok) &&
|
||||
(!phy_ib_caps || phy_ib_caps & outband_ok)) {
|
||||
/* Either in-band not supported at at least one end.
|
||||
* In-band bypass at the other end is possible.
|
||||
*/
|
||||
if (phy_ib_caps & LINK_INBAND_DISABLE)
|
||||
pl->phy_ib_mode = LINK_INBAND_DISABLE;
|
||||
else if (phy_ib_caps & LINK_INBAND_BYPASS)
|
||||
pl->phy_ib_mode = LINK_INBAND_BYPASS;
|
||||
|
||||
neg_mode = PHYLINK_PCS_NEG_OUTBAND;
|
||||
if (pl->phydev)
|
||||
mode = MLO_AN_PHY;
|
||||
} else {
|
||||
/* invalid */
|
||||
phylink_warn(pl, "%s: incompatible in-band capabilities, trying in-band",
|
||||
phy_modes(interface));
|
||||
neg_mode = PHYLINK_PCS_NEG_INBAND_ENABLED;
|
||||
}
|
||||
} else {
|
||||
/* For Base-X without a PHY */
|
||||
if (pcs_ib_caps == LINK_INBAND_DISABLE)
|
||||
/* If the PCS doesn't support inband, then inband must
|
||||
* be disabled.
|
||||
*/
|
||||
neg_mode = PHYLINK_PCS_NEG_INBAND_DISABLED;
|
||||
else if (pcs_ib_caps == LINK_INBAND_ENABLE)
|
||||
/* If the PCS requires inband, then inband must always
|
||||
* be enabled.
|
||||
*/
|
||||
neg_mode = PHYLINK_PCS_NEG_INBAND_ENABLED;
|
||||
else if (linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
|
||||
advertising))
|
||||
neg_mode = PHYLINK_PCS_NEG_INBAND_ENABLED;
|
||||
else
|
||||
neg_mode = PHYLINK_PCS_NEG_INBAND_DISABLED;
|
||||
break;
|
||||
|
||||
default:
|
||||
neg_mode = PHYLINK_PCS_NEG_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
return neg_mode;
|
||||
pl->pcs_neg_mode = neg_mode;
|
||||
pl->act_link_an_mode = mode;
|
||||
}
|
||||
|
||||
static void phylink_major_config(struct phylink *pl, bool restart,
|
||||
@ -1159,11 +1336,9 @@ static void phylink_major_config(struct phylink *pl, bool restart,
|
||||
unsigned int neg_mode;
|
||||
int err;
|
||||
|
||||
phylink_dbg(pl, "major config %s\n", phy_modes(state->interface));
|
||||
|
||||
pl->pcs_neg_mode = phylink_pcs_neg_mode(pl->cur_link_an_mode,
|
||||
state->interface,
|
||||
state->advertising);
|
||||
phylink_dbg(pl, "major config, requested %s/%s\n",
|
||||
phylink_an_mode_str(pl->req_link_an_mode),
|
||||
phy_modes(state->interface));
|
||||
|
||||
if (pl->mac_ops->mac_select_pcs) {
|
||||
pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface);
|
||||
@ -1177,10 +1352,17 @@ static void phylink_major_config(struct phylink *pl, bool restart,
|
||||
pcs_changed = pl->pcs != pcs;
|
||||
}
|
||||
|
||||
phylink_pcs_neg_mode(pl, pcs, state->interface, state->advertising);
|
||||
|
||||
phylink_dbg(pl, "major config, active %s/%s/%s\n",
|
||||
phylink_an_mode_str(pl->act_link_an_mode),
|
||||
phylink_pcs_mode_str(pl->pcs_neg_mode),
|
||||
phy_modes(state->interface));
|
||||
|
||||
phylink_pcs_poll_stop(pl);
|
||||
|
||||
if (pl->mac_ops->mac_prepare) {
|
||||
err = pl->mac_ops->mac_prepare(pl->config, pl->cur_link_an_mode,
|
||||
err = pl->mac_ops->mac_prepare(pl->config, pl->act_link_an_mode,
|
||||
state->interface);
|
||||
if (err < 0) {
|
||||
phylink_err(pl, "mac_prepare failed: %pe\n",
|
||||
@ -1214,7 +1396,7 @@ static void phylink_major_config(struct phylink *pl, bool restart,
|
||||
if (pl->pcs_state == PCS_STATE_STARTING || pcs_changed)
|
||||
phylink_pcs_enable(pl->pcs);
|
||||
|
||||
neg_mode = pl->cur_link_an_mode;
|
||||
neg_mode = pl->act_link_an_mode;
|
||||
if (pl->pcs && pl->pcs->neg_mode)
|
||||
neg_mode = pl->pcs_neg_mode;
|
||||
|
||||
@ -1230,13 +1412,20 @@ static void phylink_major_config(struct phylink *pl, bool restart,
|
||||
phylink_pcs_an_restart(pl);
|
||||
|
||||
if (pl->mac_ops->mac_finish) {
|
||||
err = pl->mac_ops->mac_finish(pl->config, pl->cur_link_an_mode,
|
||||
err = pl->mac_ops->mac_finish(pl->config, pl->act_link_an_mode,
|
||||
state->interface);
|
||||
if (err < 0)
|
||||
phylink_err(pl, "mac_finish failed: %pe\n",
|
||||
ERR_PTR(err));
|
||||
}
|
||||
|
||||
if (pl->phydev && pl->phy_ib_mode) {
|
||||
err = phy_config_inband(pl->phydev, pl->phy_ib_mode);
|
||||
if (err < 0)
|
||||
phylink_err(pl, "phy_config_inband: %pe\n",
|
||||
ERR_PTR(err));
|
||||
}
|
||||
|
||||
if (pl->sfp_bus) {
|
||||
rate_kbd = phylink_interface_signal_rate(state->interface);
|
||||
if (rate_kbd)
|
||||
@ -1261,17 +1450,16 @@ static int phylink_change_inband_advert(struct phylink *pl)
|
||||
return 0;
|
||||
|
||||
phylink_dbg(pl, "%s: mode=%s/%s adv=%*pb pause=%02x\n", __func__,
|
||||
phylink_an_mode_str(pl->cur_link_an_mode),
|
||||
phylink_an_mode_str(pl->req_link_an_mode),
|
||||
phy_modes(pl->link_config.interface),
|
||||
__ETHTOOL_LINK_MODE_MASK_NBITS, pl->link_config.advertising,
|
||||
pl->link_config.pause);
|
||||
|
||||
/* Recompute the PCS neg mode */
|
||||
pl->pcs_neg_mode = phylink_pcs_neg_mode(pl->cur_link_an_mode,
|
||||
pl->link_config.interface,
|
||||
pl->link_config.advertising);
|
||||
phylink_pcs_neg_mode(pl, pl->pcs, pl->link_config.interface,
|
||||
pl->link_config.advertising);
|
||||
|
||||
neg_mode = pl->cur_link_an_mode;
|
||||
neg_mode = pl->act_link_an_mode;
|
||||
if (pl->pcs->neg_mode)
|
||||
neg_mode = pl->pcs_neg_mode;
|
||||
|
||||
@ -1336,7 +1524,7 @@ static void phylink_mac_initial_config(struct phylink *pl, bool force_restart)
|
||||
{
|
||||
struct phylink_link_state link_state;
|
||||
|
||||
switch (pl->cur_link_an_mode) {
|
||||
switch (pl->req_link_an_mode) {
|
||||
case MLO_AN_PHY:
|
||||
link_state = pl->phy_state;
|
||||
break;
|
||||
@ -1410,14 +1598,14 @@ static void phylink_link_up(struct phylink *pl,
|
||||
|
||||
pl->cur_interface = link_state.interface;
|
||||
|
||||
neg_mode = pl->cur_link_an_mode;
|
||||
neg_mode = pl->act_link_an_mode;
|
||||
if (pl->pcs && pl->pcs->neg_mode)
|
||||
neg_mode = pl->pcs_neg_mode;
|
||||
|
||||
phylink_pcs_link_up(pl->pcs, neg_mode, pl->cur_interface, speed,
|
||||
duplex);
|
||||
|
||||
pl->mac_ops->mac_link_up(pl->config, pl->phydev, pl->cur_link_an_mode,
|
||||
pl->mac_ops->mac_link_up(pl->config, pl->phydev, pl->act_link_an_mode,
|
||||
pl->cur_interface, speed, duplex,
|
||||
!!(link_state.pause & MLO_PAUSE_TX), rx_pause);
|
||||
|
||||
@ -1437,7 +1625,7 @@ static void phylink_link_down(struct phylink *pl)
|
||||
|
||||
if (ndev)
|
||||
netif_carrier_off(ndev);
|
||||
pl->mac_ops->mac_link_down(pl->config, pl->cur_link_an_mode,
|
||||
pl->mac_ops->mac_link_down(pl->config, pl->act_link_an_mode,
|
||||
pl->cur_interface);
|
||||
phylink_info(pl, "Link is Down\n");
|
||||
}
|
||||
@ -1463,10 +1651,10 @@ static void phylink_resolve(struct work_struct *w)
|
||||
} else if (pl->link_failed) {
|
||||
link_state.link = false;
|
||||
retrigger = true;
|
||||
} else if (pl->cur_link_an_mode == MLO_AN_FIXED) {
|
||||
} else if (pl->act_link_an_mode == MLO_AN_FIXED) {
|
||||
phylink_get_fixed_state(pl, &link_state);
|
||||
mac_config = link_state.link;
|
||||
} else if (pl->cur_link_an_mode == MLO_AN_PHY) {
|
||||
} else if (pl->act_link_an_mode == MLO_AN_PHY) {
|
||||
link_state = pl->phy_state;
|
||||
mac_config = link_state.link;
|
||||
} else {
|
||||
@ -1520,7 +1708,7 @@ static void phylink_resolve(struct work_struct *w)
|
||||
}
|
||||
}
|
||||
|
||||
if (pl->cur_link_an_mode != MLO_AN_FIXED)
|
||||
if (pl->act_link_an_mode != MLO_AN_FIXED)
|
||||
phylink_apply_manual_flow(pl, &link_state);
|
||||
|
||||
if (mac_config) {
|
||||
@ -1644,7 +1832,7 @@ int phylink_set_fixed_link(struct phylink *pl,
|
||||
pl->link_config.an_complete = 1;
|
||||
|
||||
pl->cfg_link_an_mode = MLO_AN_FIXED;
|
||||
pl->cur_link_an_mode = pl->cfg_link_an_mode;
|
||||
pl->req_link_an_mode = pl->cfg_link_an_mode;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1732,7 +1920,7 @@ struct phylink *phylink_create(struct phylink_config *config,
|
||||
}
|
||||
}
|
||||
|
||||
pl->cur_link_an_mode = pl->cfg_link_an_mode;
|
||||
pl->req_link_an_mode = pl->cfg_link_an_mode;
|
||||
|
||||
ret = phylink_register_sfp(pl, fwnode);
|
||||
if (ret < 0) {
|
||||
@ -2189,7 +2377,7 @@ void phylink_start(struct phylink *pl)
|
||||
ASSERT_RTNL();
|
||||
|
||||
phylink_info(pl, "configuring for %s/%s link mode\n",
|
||||
phylink_an_mode_str(pl->cur_link_an_mode),
|
||||
phylink_an_mode_str(pl->req_link_an_mode),
|
||||
phy_modes(pl->link_config.interface));
|
||||
|
||||
/* Always set the carrier off */
|
||||
@ -2474,7 +2662,7 @@ int phylink_ethtool_ksettings_get(struct phylink *pl,
|
||||
|
||||
linkmode_copy(kset->link_modes.supported, pl->supported);
|
||||
|
||||
switch (pl->cur_link_an_mode) {
|
||||
switch (pl->act_link_an_mode) {
|
||||
case MLO_AN_FIXED:
|
||||
/* We are using fixed settings. Report these as the
|
||||
* current link settings - and note that these also
|
||||
@ -2505,6 +2693,26 @@ int phylink_ethtool_ksettings_get(struct phylink *pl,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(phylink_ethtool_ksettings_get);
|
||||
|
||||
static bool phylink_validate_pcs_inband_autoneg(struct phylink *pl,
|
||||
phy_interface_t interface,
|
||||
unsigned long *adv)
|
||||
{
|
||||
unsigned int inband = phylink_inband_caps(pl, interface);
|
||||
unsigned int mask;
|
||||
|
||||
/* If the PCS doesn't implement inband support, be permissive. */
|
||||
if (!inband)
|
||||
return true;
|
||||
|
||||
if (linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, adv))
|
||||
mask = LINK_INBAND_ENABLE;
|
||||
else
|
||||
mask = LINK_INBAND_DISABLE;
|
||||
|
||||
/* Check whether the PCS implements the required mode */
|
||||
return !!(inband & mask);
|
||||
}
|
||||
|
||||
/**
|
||||
* phylink_ethtool_ksettings_set() - set the link settings
|
||||
* @pl: a pointer to a &struct phylink returned from phylink_create()
|
||||
@ -2566,7 +2774,7 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
|
||||
/* If we have a fixed link, refuse to change link parameters.
|
||||
* If the link parameters match, accept them but do nothing.
|
||||
*/
|
||||
if (pl->cur_link_an_mode == MLO_AN_FIXED) {
|
||||
if (pl->req_link_an_mode == MLO_AN_FIXED) {
|
||||
if (s->speed != pl->link_config.speed ||
|
||||
s->duplex != pl->link_config.duplex)
|
||||
return -EINVAL;
|
||||
@ -2582,7 +2790,7 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
|
||||
* is our default case) but do not allow the advertisement to
|
||||
* be changed. If the advertisement matches, simply return.
|
||||
*/
|
||||
if (pl->cur_link_an_mode == MLO_AN_FIXED) {
|
||||
if (pl->req_link_an_mode == MLO_AN_FIXED) {
|
||||
if (!linkmode_equal(config.advertising,
|
||||
pl->link_config.advertising))
|
||||
return -EINVAL;
|
||||
@ -2617,7 +2825,7 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
|
||||
linkmode_copy(support, pl->supported);
|
||||
if (phylink_validate(pl, support, &config)) {
|
||||
phylink_err(pl, "validation of %s/%s with support %*pb failed\n",
|
||||
phylink_an_mode_str(pl->cur_link_an_mode),
|
||||
phylink_an_mode_str(pl->req_link_an_mode),
|
||||
phy_modes(config.interface),
|
||||
__ETHTOOL_LINK_MODE_MASK_NBITS, support);
|
||||
return -EINVAL;
|
||||
@ -2635,6 +2843,13 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
|
||||
phylink_is_empty_linkmode(config.advertising))
|
||||
return -EINVAL;
|
||||
|
||||
/* Validate the autonegotiation state. We don't have a PHY in this
|
||||
* situation, so the PCS is the media-facing entity.
|
||||
*/
|
||||
if (!phylink_validate_pcs_inband_autoneg(pl, config.interface,
|
||||
config.advertising))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&pl->state_mutex);
|
||||
pl->link_config.speed = config.speed;
|
||||
pl->link_config.duplex = config.duplex;
|
||||
@ -2717,7 +2932,7 @@ int phylink_ethtool_set_pauseparam(struct phylink *pl,
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (pl->cur_link_an_mode == MLO_AN_FIXED)
|
||||
if (pl->req_link_an_mode == MLO_AN_FIXED)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!phylink_test(pl->supported, Pause) &&
|
||||
@ -2981,7 +3196,7 @@ static int phylink_mii_read(struct phylink *pl, unsigned int phy_id,
|
||||
struct phylink_link_state state;
|
||||
int val = 0xffff;
|
||||
|
||||
switch (pl->cur_link_an_mode) {
|
||||
switch (pl->act_link_an_mode) {
|
||||
case MLO_AN_FIXED:
|
||||
if (phy_id == 0) {
|
||||
phylink_get_fixed_state(pl, &state);
|
||||
@ -3006,7 +3221,7 @@ static int phylink_mii_read(struct phylink *pl, unsigned int phy_id,
|
||||
static int phylink_mii_write(struct phylink *pl, unsigned int phy_id,
|
||||
unsigned int reg, unsigned int val)
|
||||
{
|
||||
switch (pl->cur_link_an_mode) {
|
||||
switch (pl->act_link_an_mode) {
|
||||
case MLO_AN_FIXED:
|
||||
break;
|
||||
|
||||
@ -3176,10 +3391,11 @@ static phy_interface_t phylink_choose_sfp_interface(struct phylink *pl,
|
||||
return interface;
|
||||
}
|
||||
|
||||
static void phylink_sfp_set_config(struct phylink *pl, u8 mode,
|
||||
static void phylink_sfp_set_config(struct phylink *pl,
|
||||
unsigned long *supported,
|
||||
struct phylink_link_state *state)
|
||||
{
|
||||
u8 mode = MLO_AN_INBAND;
|
||||
bool changed = false;
|
||||
|
||||
phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n",
|
||||
@ -3196,9 +3412,9 @@ static void phylink_sfp_set_config(struct phylink *pl, u8 mode,
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (pl->cur_link_an_mode != mode ||
|
||||
if (pl->req_link_an_mode != mode ||
|
||||
pl->link_config.interface != state->interface) {
|
||||
pl->cur_link_an_mode = mode;
|
||||
pl->req_link_an_mode = mode;
|
||||
pl->link_config.interface = state->interface;
|
||||
|
||||
changed = true;
|
||||
@ -3213,8 +3429,7 @@ static void phylink_sfp_set_config(struct phylink *pl, u8 mode,
|
||||
phylink_mac_initial_config(pl, false);
|
||||
}
|
||||
|
||||
static int phylink_sfp_config_phy(struct phylink *pl, u8 mode,
|
||||
struct phy_device *phy)
|
||||
static int phylink_sfp_config_phy(struct phylink *pl, struct phy_device *phy)
|
||||
{
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(support);
|
||||
struct phylink_link_state config;
|
||||
@ -3258,7 +3473,7 @@ static int phylink_sfp_config_phy(struct phylink *pl, u8 mode,
|
||||
|
||||
pl->link_port = pl->sfp_port;
|
||||
|
||||
phylink_sfp_set_config(pl, mode, support, &config);
|
||||
phylink_sfp_set_config(pl, support, &config);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3314,6 +3529,12 @@ static int phylink_sfp_config_optical(struct phylink *pl)
|
||||
phylink_dbg(pl, "optical SFP: chosen %s interface\n",
|
||||
phy_modes(interface));
|
||||
|
||||
if (!phylink_validate_pcs_inband_autoneg(pl, interface,
|
||||
config.advertising)) {
|
||||
phylink_err(pl, "autoneg setting not compatible with PCS");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
config.interface = interface;
|
||||
|
||||
/* Ignore errors if we're expecting a PHY to attach later */
|
||||
@ -3327,7 +3548,7 @@ static int phylink_sfp_config_optical(struct phylink *pl)
|
||||
|
||||
pl->link_port = pl->sfp_port;
|
||||
|
||||
phylink_sfp_set_config(pl, MLO_AN_INBAND, pl->sfp_support, &config);
|
||||
phylink_sfp_set_config(pl, pl->sfp_support, &config);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3398,19 +3619,9 @@ static void phylink_sfp_link_up(void *upstream)
|
||||
phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_LINK);
|
||||
}
|
||||
|
||||
/* The Broadcom BCM84881 in the Methode DM7052 is unable to provide a SGMII
|
||||
* or 802.3z control word, so inband will not work.
|
||||
*/
|
||||
static bool phylink_phy_no_inband(struct phy_device *phy)
|
||||
{
|
||||
return phy->is_c45 && phy_id_compare(phy->c45_ids.device_ids[1],
|
||||
0xae025150, 0xfffffff0);
|
||||
}
|
||||
|
||||
static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
|
||||
{
|
||||
struct phylink *pl = upstream;
|
||||
u8 mode;
|
||||
|
||||
/*
|
||||
* This is the new way of dealing with flow control for PHYs,
|
||||
@ -3421,17 +3632,12 @@ static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
|
||||
*/
|
||||
phy_support_asym_pause(phy);
|
||||
|
||||
if (phylink_phy_no_inband(phy))
|
||||
mode = MLO_AN_PHY;
|
||||
else
|
||||
mode = MLO_AN_INBAND;
|
||||
|
||||
/* Set the PHY's host supported interfaces */
|
||||
phy_interface_and(phy->host_interfaces, phylink_sfp_interfaces,
|
||||
pl->config->supported_interfaces);
|
||||
|
||||
/* Do the initial configuration */
|
||||
return phylink_sfp_config_phy(pl, mode, phy);
|
||||
return phylink_sfp_config_phy(pl, phy);
|
||||
}
|
||||
|
||||
static void phylink_sfp_disconnect_phy(void *upstream,
|
||||
|
@ -57,7 +57,7 @@ static inline void netpoll_poll_disable(struct net_device *dev) { return; }
|
||||
static inline void netpoll_poll_enable(struct net_device *dev) { return; }
|
||||
#endif
|
||||
|
||||
void netpoll_send_udp(struct netpoll *np, const char *msg, int len);
|
||||
int netpoll_send_udp(struct netpoll *np, const char *msg, int len);
|
||||
void netpoll_print_options(struct netpoll *np);
|
||||
int netpoll_parse_options(struct netpoll *np, char *opt);
|
||||
int __netpoll_setup(struct netpoll *np, struct net_device *ndev);
|
||||
|
@ -817,6 +817,24 @@ struct phy_tdr_config {
|
||||
};
|
||||
#define PHY_PAIR_ALL -1
|
||||
|
||||
/**
|
||||
* enum link_inband_signalling - in-band signalling modes that are supported
|
||||
*
|
||||
* @LINK_INBAND_DISABLE: in-band signalling can be disabled
|
||||
* @LINK_INBAND_ENABLE: in-band signalling can be enabled without bypass
|
||||
* @LINK_INBAND_BYPASS: in-band signalling can be enabled with bypass
|
||||
*
|
||||
* The possible and required bits can only be used if the valid bit is set.
|
||||
* If possible is clear, that means inband signalling can not be used.
|
||||
* Required is only valid when possible is set, and means that inband
|
||||
* signalling must be used.
|
||||
*/
|
||||
enum link_inband_signalling {
|
||||
LINK_INBAND_DISABLE = BIT(0),
|
||||
LINK_INBAND_ENABLE = BIT(1),
|
||||
LINK_INBAND_BYPASS = BIT(2),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct phy_plca_cfg - Configuration of the PLCA (Physical Layer Collision
|
||||
* Avoidance) Reconciliation Sublayer.
|
||||
@ -956,6 +974,19 @@ struct phy_driver {
|
||||
*/
|
||||
int (*get_features)(struct phy_device *phydev);
|
||||
|
||||
/**
|
||||
* @inband_caps: query whether in-band is supported for the given PHY
|
||||
* interface mode. Returns a bitmask of bits defined by enum
|
||||
* link_inband_signalling.
|
||||
*/
|
||||
unsigned int (*inband_caps)(struct phy_device *phydev,
|
||||
phy_interface_t interface);
|
||||
|
||||
/**
|
||||
* @config_inband: configure in-band mode for the PHY
|
||||
*/
|
||||
int (*config_inband)(struct phy_device *phydev, unsigned int modes);
|
||||
|
||||
/**
|
||||
* @get_rate_matching: Get the supported type of rate matching for a
|
||||
* particular phy interface. This is used by phy consumers to determine
|
||||
@ -1818,6 +1849,9 @@ int phy_config_aneg(struct phy_device *phydev);
|
||||
int _phy_start_aneg(struct phy_device *phydev);
|
||||
int phy_start_aneg(struct phy_device *phydev);
|
||||
int phy_aneg_done(struct phy_device *phydev);
|
||||
unsigned int phy_inband_caps(struct phy_device *phydev,
|
||||
phy_interface_t interface);
|
||||
int phy_config_inband(struct phy_device *phydev, unsigned int modes);
|
||||
int phy_speed_down(struct phy_device *phydev, bool sync);
|
||||
int phy_speed_up(struct phy_device *phydev);
|
||||
bool phy_check_valid(int speed, int duplex, unsigned long *features);
|
||||
|
@ -419,6 +419,7 @@ struct phylink_pcs {
|
||||
/**
|
||||
* struct phylink_pcs_ops - MAC PCS operations structure.
|
||||
* @pcs_validate: validate the link configuration.
|
||||
* @pcs_inband_caps: query inband support for interface mode.
|
||||
* @pcs_enable: enable the PCS.
|
||||
* @pcs_disable: disable the PCS.
|
||||
* @pcs_pre_config: pre-mac_config method (for errata)
|
||||
@ -434,6 +435,8 @@ struct phylink_pcs {
|
||||
struct phylink_pcs_ops {
|
||||
int (*pcs_validate)(struct phylink_pcs *pcs, unsigned long *supported,
|
||||
const struct phylink_link_state *state);
|
||||
unsigned int (*pcs_inband_caps)(struct phylink_pcs *pcs,
|
||||
phy_interface_t interface);
|
||||
int (*pcs_enable)(struct phylink_pcs *pcs);
|
||||
void (*pcs_disable)(struct phylink_pcs *pcs);
|
||||
void (*pcs_pre_config)(struct phylink_pcs *pcs,
|
||||
@ -470,6 +473,20 @@ struct phylink_pcs_ops {
|
||||
int pcs_validate(struct phylink_pcs *pcs, unsigned long *supported,
|
||||
const struct phylink_link_state *state);
|
||||
|
||||
/**
|
||||
* pcs_inband_caps - query PCS in-band capabilities for interface mode.
|
||||
* @pcs: a pointer to a &struct phylink_pcs.
|
||||
* @interface: interface mode to be queried
|
||||
*
|
||||
* Returns zero if it is unknown what in-band signalling is supported by the
|
||||
* PHY (e.g. because the PHY driver doesn't implement the method.) Otherwise,
|
||||
* returns a bit mask of the LINK_INBAND_* values from
|
||||
* &enum link_inband_signalling to describe which inband modes are supported
|
||||
* for this interface mode.
|
||||
*/
|
||||
unsigned int pcs_inband_caps(struct phylink_pcs *pcs,
|
||||
phy_interface_t interface);
|
||||
|
||||
/**
|
||||
* pcs_enable() - enable the PCS.
|
||||
* @pcs: a pointer to a &struct phylink_pcs.
|
||||
|
@ -440,6 +440,15 @@ static inline void dst_set_expires(struct dst_entry *dst, int timeout)
|
||||
dst->expires = expires;
|
||||
}
|
||||
|
||||
static inline unsigned int dst_dev_overhead(struct dst_entry *dst,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
if (likely(dst))
|
||||
return LL_RESERVED_SPACE(dst->dev);
|
||||
|
||||
return skb->mac_len;
|
||||
}
|
||||
|
||||
INDIRECT_CALLABLE_DECLARE(int ip6_output(struct net *, struct sock *,
|
||||
struct sk_buff *));
|
||||
INDIRECT_CALLABLE_DECLARE(int ip_output(struct net *, struct sock *,
|
||||
|
@ -10,545 +10,12 @@
|
||||
#define _UAPI_LINUX_ETHTOOL_NETLINK_H_
|
||||
|
||||
#include <linux/ethtool.h>
|
||||
|
||||
/* message types - userspace to kernel */
|
||||
enum {
|
||||
ETHTOOL_MSG_USER_NONE,
|
||||
ETHTOOL_MSG_STRSET_GET,
|
||||
ETHTOOL_MSG_LINKINFO_GET,
|
||||
ETHTOOL_MSG_LINKINFO_SET,
|
||||
ETHTOOL_MSG_LINKMODES_GET,
|
||||
ETHTOOL_MSG_LINKMODES_SET,
|
||||
ETHTOOL_MSG_LINKSTATE_GET,
|
||||
ETHTOOL_MSG_DEBUG_GET,
|
||||
ETHTOOL_MSG_DEBUG_SET,
|
||||
ETHTOOL_MSG_WOL_GET,
|
||||
ETHTOOL_MSG_WOL_SET,
|
||||
ETHTOOL_MSG_FEATURES_GET,
|
||||
ETHTOOL_MSG_FEATURES_SET,
|
||||
ETHTOOL_MSG_PRIVFLAGS_GET,
|
||||
ETHTOOL_MSG_PRIVFLAGS_SET,
|
||||
ETHTOOL_MSG_RINGS_GET,
|
||||
ETHTOOL_MSG_RINGS_SET,
|
||||
ETHTOOL_MSG_CHANNELS_GET,
|
||||
ETHTOOL_MSG_CHANNELS_SET,
|
||||
ETHTOOL_MSG_COALESCE_GET,
|
||||
ETHTOOL_MSG_COALESCE_SET,
|
||||
ETHTOOL_MSG_PAUSE_GET,
|
||||
ETHTOOL_MSG_PAUSE_SET,
|
||||
ETHTOOL_MSG_EEE_GET,
|
||||
ETHTOOL_MSG_EEE_SET,
|
||||
ETHTOOL_MSG_TSINFO_GET,
|
||||
ETHTOOL_MSG_CABLE_TEST_ACT,
|
||||
ETHTOOL_MSG_CABLE_TEST_TDR_ACT,
|
||||
ETHTOOL_MSG_TUNNEL_INFO_GET,
|
||||
ETHTOOL_MSG_FEC_GET,
|
||||
ETHTOOL_MSG_FEC_SET,
|
||||
ETHTOOL_MSG_MODULE_EEPROM_GET,
|
||||
ETHTOOL_MSG_STATS_GET,
|
||||
ETHTOOL_MSG_PHC_VCLOCKS_GET,
|
||||
ETHTOOL_MSG_MODULE_GET,
|
||||
ETHTOOL_MSG_MODULE_SET,
|
||||
ETHTOOL_MSG_PSE_GET,
|
||||
ETHTOOL_MSG_PSE_SET,
|
||||
ETHTOOL_MSG_RSS_GET,
|
||||
ETHTOOL_MSG_PLCA_GET_CFG,
|
||||
ETHTOOL_MSG_PLCA_SET_CFG,
|
||||
ETHTOOL_MSG_PLCA_GET_STATUS,
|
||||
ETHTOOL_MSG_MM_GET,
|
||||
ETHTOOL_MSG_MM_SET,
|
||||
ETHTOOL_MSG_MODULE_FW_FLASH_ACT,
|
||||
ETHTOOL_MSG_PHY_GET,
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_MSG_USER_CNT,
|
||||
ETHTOOL_MSG_USER_MAX = __ETHTOOL_MSG_USER_CNT - 1
|
||||
};
|
||||
|
||||
/* message types - kernel to userspace */
|
||||
enum {
|
||||
ETHTOOL_MSG_KERNEL_NONE,
|
||||
ETHTOOL_MSG_STRSET_GET_REPLY,
|
||||
ETHTOOL_MSG_LINKINFO_GET_REPLY,
|
||||
ETHTOOL_MSG_LINKINFO_NTF,
|
||||
ETHTOOL_MSG_LINKMODES_GET_REPLY,
|
||||
ETHTOOL_MSG_LINKMODES_NTF,
|
||||
ETHTOOL_MSG_LINKSTATE_GET_REPLY,
|
||||
ETHTOOL_MSG_DEBUG_GET_REPLY,
|
||||
ETHTOOL_MSG_DEBUG_NTF,
|
||||
ETHTOOL_MSG_WOL_GET_REPLY,
|
||||
ETHTOOL_MSG_WOL_NTF,
|
||||
ETHTOOL_MSG_FEATURES_GET_REPLY,
|
||||
ETHTOOL_MSG_FEATURES_SET_REPLY,
|
||||
ETHTOOL_MSG_FEATURES_NTF,
|
||||
ETHTOOL_MSG_PRIVFLAGS_GET_REPLY,
|
||||
ETHTOOL_MSG_PRIVFLAGS_NTF,
|
||||
ETHTOOL_MSG_RINGS_GET_REPLY,
|
||||
ETHTOOL_MSG_RINGS_NTF,
|
||||
ETHTOOL_MSG_CHANNELS_GET_REPLY,
|
||||
ETHTOOL_MSG_CHANNELS_NTF,
|
||||
ETHTOOL_MSG_COALESCE_GET_REPLY,
|
||||
ETHTOOL_MSG_COALESCE_NTF,
|
||||
ETHTOOL_MSG_PAUSE_GET_REPLY,
|
||||
ETHTOOL_MSG_PAUSE_NTF,
|
||||
ETHTOOL_MSG_EEE_GET_REPLY,
|
||||
ETHTOOL_MSG_EEE_NTF,
|
||||
ETHTOOL_MSG_TSINFO_GET_REPLY,
|
||||
ETHTOOL_MSG_CABLE_TEST_NTF,
|
||||
ETHTOOL_MSG_CABLE_TEST_TDR_NTF,
|
||||
ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY,
|
||||
ETHTOOL_MSG_FEC_GET_REPLY,
|
||||
ETHTOOL_MSG_FEC_NTF,
|
||||
ETHTOOL_MSG_MODULE_EEPROM_GET_REPLY,
|
||||
ETHTOOL_MSG_STATS_GET_REPLY,
|
||||
ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY,
|
||||
ETHTOOL_MSG_MODULE_GET_REPLY,
|
||||
ETHTOOL_MSG_MODULE_NTF,
|
||||
ETHTOOL_MSG_PSE_GET_REPLY,
|
||||
ETHTOOL_MSG_RSS_GET_REPLY,
|
||||
ETHTOOL_MSG_PLCA_GET_CFG_REPLY,
|
||||
ETHTOOL_MSG_PLCA_GET_STATUS_REPLY,
|
||||
ETHTOOL_MSG_PLCA_NTF,
|
||||
ETHTOOL_MSG_MM_GET_REPLY,
|
||||
ETHTOOL_MSG_MM_NTF,
|
||||
ETHTOOL_MSG_MODULE_FW_FLASH_NTF,
|
||||
ETHTOOL_MSG_PHY_GET_REPLY,
|
||||
ETHTOOL_MSG_PHY_NTF,
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_MSG_KERNEL_CNT,
|
||||
ETHTOOL_MSG_KERNEL_MAX = __ETHTOOL_MSG_KERNEL_CNT - 1
|
||||
};
|
||||
|
||||
/* request header */
|
||||
|
||||
enum ethtool_header_flags {
|
||||
ETHTOOL_FLAG_COMPACT_BITSETS = 1 << 0, /* use compact bitsets in reply */
|
||||
ETHTOOL_FLAG_OMIT_REPLY = 1 << 1, /* provide optional reply for SET or ACT requests */
|
||||
ETHTOOL_FLAG_STATS = 1 << 2, /* request statistics, if supported by the driver */
|
||||
};
|
||||
#include <linux/ethtool_netlink_generated.h>
|
||||
|
||||
#define ETHTOOL_FLAG_ALL (ETHTOOL_FLAG_COMPACT_BITSETS | \
|
||||
ETHTOOL_FLAG_OMIT_REPLY | \
|
||||
ETHTOOL_FLAG_STATS)
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_HEADER_UNSPEC,
|
||||
ETHTOOL_A_HEADER_DEV_INDEX, /* u32 */
|
||||
ETHTOOL_A_HEADER_DEV_NAME, /* string */
|
||||
ETHTOOL_A_HEADER_FLAGS, /* u32 - ETHTOOL_FLAG_* */
|
||||
ETHTOOL_A_HEADER_PHY_INDEX, /* u32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_HEADER_CNT,
|
||||
ETHTOOL_A_HEADER_MAX = __ETHTOOL_A_HEADER_CNT - 1
|
||||
};
|
||||
|
||||
/* bit sets */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_BITSET_BIT_UNSPEC,
|
||||
ETHTOOL_A_BITSET_BIT_INDEX, /* u32 */
|
||||
ETHTOOL_A_BITSET_BIT_NAME, /* string */
|
||||
ETHTOOL_A_BITSET_BIT_VALUE, /* flag */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_BITSET_BIT_CNT,
|
||||
ETHTOOL_A_BITSET_BIT_MAX = __ETHTOOL_A_BITSET_BIT_CNT - 1
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_BITSET_BITS_UNSPEC,
|
||||
ETHTOOL_A_BITSET_BITS_BIT, /* nest - _A_BITSET_BIT_* */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_BITSET_BITS_CNT,
|
||||
ETHTOOL_A_BITSET_BITS_MAX = __ETHTOOL_A_BITSET_BITS_CNT - 1
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_BITSET_UNSPEC,
|
||||
ETHTOOL_A_BITSET_NOMASK, /* flag */
|
||||
ETHTOOL_A_BITSET_SIZE, /* u32 */
|
||||
ETHTOOL_A_BITSET_BITS, /* nest - _A_BITSET_BITS_* */
|
||||
ETHTOOL_A_BITSET_VALUE, /* binary */
|
||||
ETHTOOL_A_BITSET_MASK, /* binary */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_BITSET_CNT,
|
||||
ETHTOOL_A_BITSET_MAX = __ETHTOOL_A_BITSET_CNT - 1
|
||||
};
|
||||
|
||||
/* string sets */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STRING_UNSPEC,
|
||||
ETHTOOL_A_STRING_INDEX, /* u32 */
|
||||
ETHTOOL_A_STRING_VALUE, /* string */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_STRING_CNT,
|
||||
ETHTOOL_A_STRING_MAX = __ETHTOOL_A_STRING_CNT - 1
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STRINGS_UNSPEC,
|
||||
ETHTOOL_A_STRINGS_STRING, /* nest - _A_STRINGS_* */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_STRINGS_CNT,
|
||||
ETHTOOL_A_STRINGS_MAX = __ETHTOOL_A_STRINGS_CNT - 1
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STRINGSET_UNSPEC,
|
||||
ETHTOOL_A_STRINGSET_ID, /* u32 */
|
||||
ETHTOOL_A_STRINGSET_COUNT, /* u32 */
|
||||
ETHTOOL_A_STRINGSET_STRINGS, /* nest - _A_STRINGS_* */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_STRINGSET_CNT,
|
||||
ETHTOOL_A_STRINGSET_MAX = __ETHTOOL_A_STRINGSET_CNT - 1
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STRINGSETS_UNSPEC,
|
||||
ETHTOOL_A_STRINGSETS_STRINGSET, /* nest - _A_STRINGSET_* */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_STRINGSETS_CNT,
|
||||
ETHTOOL_A_STRINGSETS_MAX = __ETHTOOL_A_STRINGSETS_CNT - 1
|
||||
};
|
||||
|
||||
/* STRSET */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STRSET_UNSPEC,
|
||||
ETHTOOL_A_STRSET_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_STRSET_STRINGSETS, /* nest - _A_STRINGSETS_* */
|
||||
ETHTOOL_A_STRSET_COUNTS_ONLY, /* flag */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_STRSET_CNT,
|
||||
ETHTOOL_A_STRSET_MAX = __ETHTOOL_A_STRSET_CNT - 1
|
||||
};
|
||||
|
||||
/* LINKINFO */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_LINKINFO_UNSPEC,
|
||||
ETHTOOL_A_LINKINFO_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_LINKINFO_PORT, /* u8 */
|
||||
ETHTOOL_A_LINKINFO_PHYADDR, /* u8 */
|
||||
ETHTOOL_A_LINKINFO_TP_MDIX, /* u8 */
|
||||
ETHTOOL_A_LINKINFO_TP_MDIX_CTRL, /* u8 */
|
||||
ETHTOOL_A_LINKINFO_TRANSCEIVER, /* u8 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_LINKINFO_CNT,
|
||||
ETHTOOL_A_LINKINFO_MAX = __ETHTOOL_A_LINKINFO_CNT - 1
|
||||
};
|
||||
|
||||
/* LINKMODES */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_LINKMODES_UNSPEC,
|
||||
ETHTOOL_A_LINKMODES_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_LINKMODES_AUTONEG, /* u8 */
|
||||
ETHTOOL_A_LINKMODES_OURS, /* bitset */
|
||||
ETHTOOL_A_LINKMODES_PEER, /* bitset */
|
||||
ETHTOOL_A_LINKMODES_SPEED, /* u32 */
|
||||
ETHTOOL_A_LINKMODES_DUPLEX, /* u8 */
|
||||
ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG, /* u8 */
|
||||
ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE, /* u8 */
|
||||
ETHTOOL_A_LINKMODES_LANES, /* u32 */
|
||||
ETHTOOL_A_LINKMODES_RATE_MATCHING, /* u8 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_LINKMODES_CNT,
|
||||
ETHTOOL_A_LINKMODES_MAX = __ETHTOOL_A_LINKMODES_CNT - 1
|
||||
};
|
||||
|
||||
/* LINKSTATE */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_LINKSTATE_UNSPEC,
|
||||
ETHTOOL_A_LINKSTATE_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_LINKSTATE_LINK, /* u8 */
|
||||
ETHTOOL_A_LINKSTATE_SQI, /* u32 */
|
||||
ETHTOOL_A_LINKSTATE_SQI_MAX, /* u32 */
|
||||
ETHTOOL_A_LINKSTATE_EXT_STATE, /* u8 */
|
||||
ETHTOOL_A_LINKSTATE_EXT_SUBSTATE, /* u8 */
|
||||
ETHTOOL_A_LINKSTATE_EXT_DOWN_CNT, /* u32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_LINKSTATE_CNT,
|
||||
ETHTOOL_A_LINKSTATE_MAX = __ETHTOOL_A_LINKSTATE_CNT - 1
|
||||
};
|
||||
|
||||
/* DEBUG */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_DEBUG_UNSPEC,
|
||||
ETHTOOL_A_DEBUG_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_DEBUG_MSGMASK, /* bitset */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_DEBUG_CNT,
|
||||
ETHTOOL_A_DEBUG_MAX = __ETHTOOL_A_DEBUG_CNT - 1
|
||||
};
|
||||
|
||||
/* WOL */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_WOL_UNSPEC,
|
||||
ETHTOOL_A_WOL_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_WOL_MODES, /* bitset */
|
||||
ETHTOOL_A_WOL_SOPASS, /* binary */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_WOL_CNT,
|
||||
ETHTOOL_A_WOL_MAX = __ETHTOOL_A_WOL_CNT - 1
|
||||
};
|
||||
|
||||
/* FEATURES */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_FEATURES_UNSPEC,
|
||||
ETHTOOL_A_FEATURES_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_FEATURES_HW, /* bitset */
|
||||
ETHTOOL_A_FEATURES_WANTED, /* bitset */
|
||||
ETHTOOL_A_FEATURES_ACTIVE, /* bitset */
|
||||
ETHTOOL_A_FEATURES_NOCHANGE, /* bitset */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_FEATURES_CNT,
|
||||
ETHTOOL_A_FEATURES_MAX = __ETHTOOL_A_FEATURES_CNT - 1
|
||||
};
|
||||
|
||||
/* PRIVFLAGS */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PRIVFLAGS_UNSPEC,
|
||||
ETHTOOL_A_PRIVFLAGS_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_PRIVFLAGS_FLAGS, /* bitset */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_PRIVFLAGS_CNT,
|
||||
ETHTOOL_A_PRIVFLAGS_MAX = __ETHTOOL_A_PRIVFLAGS_CNT - 1
|
||||
};
|
||||
|
||||
/* RINGS */
|
||||
|
||||
enum {
|
||||
ETHTOOL_TCP_DATA_SPLIT_UNKNOWN = 0,
|
||||
ETHTOOL_TCP_DATA_SPLIT_DISABLED,
|
||||
ETHTOOL_TCP_DATA_SPLIT_ENABLED,
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_RINGS_UNSPEC,
|
||||
ETHTOOL_A_RINGS_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_RINGS_RX_MAX, /* u32 */
|
||||
ETHTOOL_A_RINGS_RX_MINI_MAX, /* u32 */
|
||||
ETHTOOL_A_RINGS_RX_JUMBO_MAX, /* u32 */
|
||||
ETHTOOL_A_RINGS_TX_MAX, /* u32 */
|
||||
ETHTOOL_A_RINGS_RX, /* u32 */
|
||||
ETHTOOL_A_RINGS_RX_MINI, /* u32 */
|
||||
ETHTOOL_A_RINGS_RX_JUMBO, /* u32 */
|
||||
ETHTOOL_A_RINGS_TX, /* u32 */
|
||||
ETHTOOL_A_RINGS_RX_BUF_LEN, /* u32 */
|
||||
ETHTOOL_A_RINGS_TCP_DATA_SPLIT, /* u8 */
|
||||
ETHTOOL_A_RINGS_CQE_SIZE, /* u32 */
|
||||
ETHTOOL_A_RINGS_TX_PUSH, /* u8 */
|
||||
ETHTOOL_A_RINGS_RX_PUSH, /* u8 */
|
||||
ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN, /* u32 */
|
||||
ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN_MAX, /* u32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_RINGS_CNT,
|
||||
ETHTOOL_A_RINGS_MAX = (__ETHTOOL_A_RINGS_CNT - 1)
|
||||
};
|
||||
|
||||
/* CHANNELS */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CHANNELS_UNSPEC,
|
||||
ETHTOOL_A_CHANNELS_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_CHANNELS_RX_MAX, /* u32 */
|
||||
ETHTOOL_A_CHANNELS_TX_MAX, /* u32 */
|
||||
ETHTOOL_A_CHANNELS_OTHER_MAX, /* u32 */
|
||||
ETHTOOL_A_CHANNELS_COMBINED_MAX, /* u32 */
|
||||
ETHTOOL_A_CHANNELS_RX_COUNT, /* u32 */
|
||||
ETHTOOL_A_CHANNELS_TX_COUNT, /* u32 */
|
||||
ETHTOOL_A_CHANNELS_OTHER_COUNT, /* u32 */
|
||||
ETHTOOL_A_CHANNELS_COMBINED_COUNT, /* u32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_CHANNELS_CNT,
|
||||
ETHTOOL_A_CHANNELS_MAX = (__ETHTOOL_A_CHANNELS_CNT - 1)
|
||||
};
|
||||
|
||||
/* COALESCE */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_COALESCE_UNSPEC,
|
||||
ETHTOOL_A_COALESCE_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_COALESCE_RX_USECS, /* u32 */
|
||||
ETHTOOL_A_COALESCE_RX_MAX_FRAMES, /* u32 */
|
||||
ETHTOOL_A_COALESCE_RX_USECS_IRQ, /* u32 */
|
||||
ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_USECS, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_MAX_FRAMES, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_USECS_IRQ, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ, /* u32 */
|
||||
ETHTOOL_A_COALESCE_STATS_BLOCK_USECS, /* u32 */
|
||||
ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX, /* u8 */
|
||||
ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX, /* u8 */
|
||||
ETHTOOL_A_COALESCE_PKT_RATE_LOW, /* u32 */
|
||||
ETHTOOL_A_COALESCE_RX_USECS_LOW, /* u32 */
|
||||
ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_USECS_LOW, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW, /* u32 */
|
||||
ETHTOOL_A_COALESCE_PKT_RATE_HIGH, /* u32 */
|
||||
ETHTOOL_A_COALESCE_RX_USECS_HIGH, /* u32 */
|
||||
ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_USECS_HIGH, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH, /* u32 */
|
||||
ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL, /* u32 */
|
||||
ETHTOOL_A_COALESCE_USE_CQE_MODE_TX, /* u8 */
|
||||
ETHTOOL_A_COALESCE_USE_CQE_MODE_RX, /* u8 */
|
||||
ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES, /* u32 */
|
||||
ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS, /* u32 */
|
||||
/* nest - _A_PROFILE_IRQ_MODERATION */
|
||||
ETHTOOL_A_COALESCE_RX_PROFILE,
|
||||
/* nest - _A_PROFILE_IRQ_MODERATION */
|
||||
ETHTOOL_A_COALESCE_TX_PROFILE,
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_COALESCE_CNT,
|
||||
ETHTOOL_A_COALESCE_MAX = (__ETHTOOL_A_COALESCE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PROFILE_UNSPEC,
|
||||
/* nest, _A_IRQ_MODERATION_* */
|
||||
ETHTOOL_A_PROFILE_IRQ_MODERATION,
|
||||
__ETHTOOL_A_PROFILE_CNT,
|
||||
ETHTOOL_A_PROFILE_MAX = (__ETHTOOL_A_PROFILE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_IRQ_MODERATION_UNSPEC,
|
||||
ETHTOOL_A_IRQ_MODERATION_USEC, /* u32 */
|
||||
ETHTOOL_A_IRQ_MODERATION_PKTS, /* u32 */
|
||||
ETHTOOL_A_IRQ_MODERATION_COMPS, /* u32 */
|
||||
|
||||
__ETHTOOL_A_IRQ_MODERATION_CNT,
|
||||
ETHTOOL_A_IRQ_MODERATION_MAX = (__ETHTOOL_A_IRQ_MODERATION_CNT - 1)
|
||||
};
|
||||
|
||||
/* PAUSE */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PAUSE_UNSPEC,
|
||||
ETHTOOL_A_PAUSE_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_PAUSE_AUTONEG, /* u8 */
|
||||
ETHTOOL_A_PAUSE_RX, /* u8 */
|
||||
ETHTOOL_A_PAUSE_TX, /* u8 */
|
||||
ETHTOOL_A_PAUSE_STATS, /* nest - _PAUSE_STAT_* */
|
||||
ETHTOOL_A_PAUSE_STATS_SRC, /* u32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_PAUSE_CNT,
|
||||
ETHTOOL_A_PAUSE_MAX = (__ETHTOOL_A_PAUSE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PAUSE_STAT_UNSPEC,
|
||||
ETHTOOL_A_PAUSE_STAT_PAD,
|
||||
|
||||
ETHTOOL_A_PAUSE_STAT_TX_FRAMES,
|
||||
ETHTOOL_A_PAUSE_STAT_RX_FRAMES,
|
||||
|
||||
/* add new constants above here
|
||||
* adjust ETHTOOL_PAUSE_STAT_CNT if adding non-stats!
|
||||
*/
|
||||
__ETHTOOL_A_PAUSE_STAT_CNT,
|
||||
ETHTOOL_A_PAUSE_STAT_MAX = (__ETHTOOL_A_PAUSE_STAT_CNT - 1)
|
||||
};
|
||||
|
||||
/* EEE */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_EEE_UNSPEC,
|
||||
ETHTOOL_A_EEE_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_EEE_MODES_OURS, /* bitset */
|
||||
ETHTOOL_A_EEE_MODES_PEER, /* bitset */
|
||||
ETHTOOL_A_EEE_ACTIVE, /* u8 */
|
||||
ETHTOOL_A_EEE_ENABLED, /* u8 */
|
||||
ETHTOOL_A_EEE_TX_LPI_ENABLED, /* u8 */
|
||||
ETHTOOL_A_EEE_TX_LPI_TIMER, /* u32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_EEE_CNT,
|
||||
ETHTOOL_A_EEE_MAX = (__ETHTOOL_A_EEE_CNT - 1)
|
||||
};
|
||||
|
||||
/* TSINFO */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TSINFO_UNSPEC,
|
||||
ETHTOOL_A_TSINFO_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_TSINFO_TIMESTAMPING, /* bitset */
|
||||
ETHTOOL_A_TSINFO_TX_TYPES, /* bitset */
|
||||
ETHTOOL_A_TSINFO_RX_FILTERS, /* bitset */
|
||||
ETHTOOL_A_TSINFO_PHC_INDEX, /* u32 */
|
||||
ETHTOOL_A_TSINFO_STATS, /* nest - _A_TSINFO_STAT */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_TSINFO_CNT,
|
||||
ETHTOOL_A_TSINFO_MAX = (__ETHTOOL_A_TSINFO_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TS_STAT_UNSPEC,
|
||||
|
||||
ETHTOOL_A_TS_STAT_TX_PKTS, /* uint */
|
||||
ETHTOOL_A_TS_STAT_TX_LOST, /* uint */
|
||||
ETHTOOL_A_TS_STAT_TX_ERR, /* uint */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_TS_STAT_CNT,
|
||||
ETHTOOL_A_TS_STAT_MAX = (__ETHTOOL_A_TS_STAT_CNT - 1)
|
||||
|
||||
};
|
||||
|
||||
/* PHC VCLOCKS */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PHC_VCLOCKS_UNSPEC,
|
||||
ETHTOOL_A_PHC_VCLOCKS_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_PHC_VCLOCKS_NUM, /* u32 */
|
||||
ETHTOOL_A_PHC_VCLOCKS_INDEX, /* array, s32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_PHC_VCLOCKS_CNT,
|
||||
ETHTOOL_A_PHC_VCLOCKS_MAX = (__ETHTOOL_A_PHC_VCLOCKS_CNT - 1)
|
||||
};
|
||||
|
||||
/* CABLE TEST */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_HEADER, /* nest - _A_HEADER_* */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_CABLE_TEST_CNT,
|
||||
ETHTOOL_A_CABLE_TEST_MAX = __ETHTOOL_A_CABLE_TEST_CNT - 1
|
||||
};
|
||||
|
||||
/* CABLE TEST NOTIFY */
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC,
|
||||
@ -582,74 +49,12 @@ enum {
|
||||
ETHTOOL_A_CABLE_INF_SRC_ALCD,
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_RESULT_UNSPEC,
|
||||
ETHTOOL_A_CABLE_RESULT_PAIR, /* u8 ETHTOOL_A_CABLE_PAIR_ */
|
||||
ETHTOOL_A_CABLE_RESULT_CODE, /* u8 ETHTOOL_A_CABLE_RESULT_CODE_ */
|
||||
ETHTOOL_A_CABLE_RESULT_SRC, /* u32 ETHTOOL_A_CABLE_INF_SRC_ */
|
||||
|
||||
__ETHTOOL_A_CABLE_RESULT_CNT,
|
||||
ETHTOOL_A_CABLE_RESULT_MAX = (__ETHTOOL_A_CABLE_RESULT_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC,
|
||||
ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR, /* u8 ETHTOOL_A_CABLE_PAIR_ */
|
||||
ETHTOOL_A_CABLE_FAULT_LENGTH_CM, /* u32 */
|
||||
ETHTOOL_A_CABLE_FAULT_LENGTH_SRC, /* u32 ETHTOOL_A_CABLE_INF_SRC_ */
|
||||
|
||||
__ETHTOOL_A_CABLE_FAULT_LENGTH_CNT,
|
||||
ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = (__ETHTOOL_A_CABLE_FAULT_LENGTH_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED,
|
||||
ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_NEST_UNSPEC,
|
||||
ETHTOOL_A_CABLE_NEST_RESULT, /* nest - ETHTOOL_A_CABLE_RESULT_ */
|
||||
ETHTOOL_A_CABLE_NEST_FAULT_LENGTH, /* nest - ETHTOOL_A_CABLE_FAULT_LENGTH_ */
|
||||
__ETHTOOL_A_CABLE_NEST_CNT,
|
||||
ETHTOOL_A_CABLE_NEST_MAX = (__ETHTOOL_A_CABLE_NEST_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_NTF_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_NTF_HEADER, /* nest - ETHTOOL_A_HEADER_* */
|
||||
ETHTOOL_A_CABLE_TEST_NTF_STATUS, /* u8 - _STARTED/_COMPLETE */
|
||||
ETHTOOL_A_CABLE_TEST_NTF_NEST, /* nest - of results: */
|
||||
|
||||
__ETHTOOL_A_CABLE_TEST_NTF_CNT,
|
||||
ETHTOOL_A_CABLE_TEST_NTF_MAX = (__ETHTOOL_A_CABLE_TEST_NTF_CNT - 1)
|
||||
};
|
||||
|
||||
/* CABLE TEST TDR */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST, /* u32 */
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST, /* u32 */
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP, /* u32 */
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR, /* u8 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = __ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT - 1
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_TDR_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG, /* nest - *_TDR_CFG_* */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_CABLE_TEST_TDR_CNT,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_MAX = __ETHTOOL_A_CABLE_TEST_TDR_CNT - 1
|
||||
};
|
||||
|
||||
/* CABLE TEST TDR NOTIFY */
|
||||
|
||||
enum {
|
||||
@ -689,132 +94,6 @@ enum {
|
||||
ETHTOOL_A_CABLE_TDR_NEST_MAX = (__ETHTOOL_A_CABLE_TDR_NEST_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_TDR_NTF_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_NTF_HEADER, /* nest - ETHTOOL_A_HEADER_* */
|
||||
ETHTOOL_A_CABLE_TEST_TDR_NTF_STATUS, /* u8 - _STARTED/_COMPLETE */
|
||||
ETHTOOL_A_CABLE_TEST_TDR_NTF_NEST, /* nest - of results: */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_CABLE_TEST_TDR_NTF_CNT,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_NTF_MAX = __ETHTOOL_A_CABLE_TEST_TDR_NTF_CNT - 1
|
||||
};
|
||||
|
||||
/* TUNNEL INFO */
|
||||
|
||||
enum {
|
||||
ETHTOOL_UDP_TUNNEL_TYPE_VXLAN,
|
||||
ETHTOOL_UDP_TUNNEL_TYPE_GENEVE,
|
||||
ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE,
|
||||
|
||||
__ETHTOOL_UDP_TUNNEL_TYPE_CNT
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC,
|
||||
|
||||
ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT, /* be16 */
|
||||
ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE, /* u32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT,
|
||||
ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = (__ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC,
|
||||
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE, /* u32 */
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES, /* bitset */
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY, /* nest - _UDP_ENTRY_* */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_TUNNEL_UDP_TABLE_CNT,
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = (__ETHTOOL_A_TUNNEL_UDP_TABLE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TUNNEL_UDP_UNSPEC,
|
||||
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE, /* nest - _UDP_TABLE_* */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_TUNNEL_UDP_CNT,
|
||||
ETHTOOL_A_TUNNEL_UDP_MAX = (__ETHTOOL_A_TUNNEL_UDP_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TUNNEL_INFO_UNSPEC,
|
||||
ETHTOOL_A_TUNNEL_INFO_HEADER, /* nest - _A_HEADER_* */
|
||||
|
||||
ETHTOOL_A_TUNNEL_INFO_UDP_PORTS, /* nest - _UDP_TABLE */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_TUNNEL_INFO_CNT,
|
||||
ETHTOOL_A_TUNNEL_INFO_MAX = (__ETHTOOL_A_TUNNEL_INFO_CNT - 1)
|
||||
};
|
||||
|
||||
/* FEC */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_FEC_UNSPEC,
|
||||
ETHTOOL_A_FEC_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_FEC_MODES, /* bitset */
|
||||
ETHTOOL_A_FEC_AUTO, /* u8 */
|
||||
ETHTOOL_A_FEC_ACTIVE, /* u32 */
|
||||
ETHTOOL_A_FEC_STATS, /* nest - _A_FEC_STAT */
|
||||
|
||||
__ETHTOOL_A_FEC_CNT,
|
||||
ETHTOOL_A_FEC_MAX = (__ETHTOOL_A_FEC_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_FEC_STAT_UNSPEC,
|
||||
ETHTOOL_A_FEC_STAT_PAD,
|
||||
|
||||
ETHTOOL_A_FEC_STAT_CORRECTED, /* array, u64 */
|
||||
ETHTOOL_A_FEC_STAT_UNCORR, /* array, u64 */
|
||||
ETHTOOL_A_FEC_STAT_CORR_BITS, /* array, u64 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_FEC_STAT_CNT,
|
||||
ETHTOOL_A_FEC_STAT_MAX = (__ETHTOOL_A_FEC_STAT_CNT - 1)
|
||||
};
|
||||
|
||||
/* MODULE EEPROM */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_MODULE_EEPROM_UNSPEC,
|
||||
ETHTOOL_A_MODULE_EEPROM_HEADER, /* nest - _A_HEADER_* */
|
||||
|
||||
ETHTOOL_A_MODULE_EEPROM_OFFSET, /* u32 */
|
||||
ETHTOOL_A_MODULE_EEPROM_LENGTH, /* u32 */
|
||||
ETHTOOL_A_MODULE_EEPROM_PAGE, /* u8 */
|
||||
ETHTOOL_A_MODULE_EEPROM_BANK, /* u8 */
|
||||
ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS, /* u8 */
|
||||
ETHTOOL_A_MODULE_EEPROM_DATA, /* binary */
|
||||
|
||||
__ETHTOOL_A_MODULE_EEPROM_CNT,
|
||||
ETHTOOL_A_MODULE_EEPROM_MAX = (__ETHTOOL_A_MODULE_EEPROM_CNT - 1)
|
||||
};
|
||||
|
||||
/* STATS */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STATS_UNSPEC,
|
||||
ETHTOOL_A_STATS_PAD,
|
||||
ETHTOOL_A_STATS_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_STATS_GROUPS, /* bitset */
|
||||
|
||||
ETHTOOL_A_STATS_GRP, /* nest - _A_STATS_GRP_* */
|
||||
|
||||
ETHTOOL_A_STATS_SRC, /* u32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_STATS_CNT,
|
||||
ETHTOOL_A_STATS_MAX = (__ETHTOOL_A_STATS_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_STATS_ETH_PHY,
|
||||
ETHTOOL_STATS_ETH_MAC,
|
||||
@ -825,27 +104,6 @@ enum {
|
||||
__ETHTOOL_STATS_CNT
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STATS_GRP_UNSPEC,
|
||||
ETHTOOL_A_STATS_GRP_PAD,
|
||||
|
||||
ETHTOOL_A_STATS_GRP_ID, /* u32 */
|
||||
ETHTOOL_A_STATS_GRP_SS_ID, /* u32 */
|
||||
|
||||
ETHTOOL_A_STATS_GRP_STAT, /* nest */
|
||||
|
||||
ETHTOOL_A_STATS_GRP_HIST_RX, /* nest */
|
||||
ETHTOOL_A_STATS_GRP_HIST_TX, /* nest */
|
||||
|
||||
ETHTOOL_A_STATS_GRP_HIST_BKT_LOW, /* u32 */
|
||||
ETHTOOL_A_STATS_GRP_HIST_BKT_HI, /* u32 */
|
||||
ETHTOOL_A_STATS_GRP_HIST_VAL, /* u64 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_STATS_GRP_CNT,
|
||||
ETHTOOL_A_STATS_GRP_MAX = (__ETHTOOL_A_STATS_GRP_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
/* 30.3.2.1.5 aSymbolErrorDuringCarrier */
|
||||
ETHTOOL_A_STATS_ETH_PHY_5_SYM_ERR,
|
||||
@ -935,155 +193,6 @@ enum {
|
||||
ETHTOOL_A_STATS_RMON_MAX = (__ETHTOOL_A_STATS_RMON_CNT - 1)
|
||||
};
|
||||
|
||||
/* MODULE */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_MODULE_UNSPEC,
|
||||
ETHTOOL_A_MODULE_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_MODULE_POWER_MODE_POLICY, /* u8 */
|
||||
ETHTOOL_A_MODULE_POWER_MODE, /* u8 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_MODULE_CNT,
|
||||
ETHTOOL_A_MODULE_MAX = (__ETHTOOL_A_MODULE_CNT - 1)
|
||||
};
|
||||
|
||||
/* Power Sourcing Equipment */
|
||||
enum {
|
||||
ETHTOOL_A_C33_PSE_PW_LIMIT_UNSPEC,
|
||||
ETHTOOL_A_C33_PSE_PW_LIMIT_MIN, /* u32 */
|
||||
ETHTOOL_A_C33_PSE_PW_LIMIT_MAX, /* u32 */
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PSE_UNSPEC,
|
||||
ETHTOOL_A_PSE_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_PODL_PSE_ADMIN_STATE, /* u32 */
|
||||
ETHTOOL_A_PODL_PSE_ADMIN_CONTROL, /* u32 */
|
||||
ETHTOOL_A_PODL_PSE_PW_D_STATUS, /* u32 */
|
||||
ETHTOOL_A_C33_PSE_ADMIN_STATE, /* u32 */
|
||||
ETHTOOL_A_C33_PSE_ADMIN_CONTROL, /* u32 */
|
||||
ETHTOOL_A_C33_PSE_PW_D_STATUS, /* u32 */
|
||||
ETHTOOL_A_C33_PSE_PW_CLASS, /* u32 */
|
||||
ETHTOOL_A_C33_PSE_ACTUAL_PW, /* u32 */
|
||||
ETHTOOL_A_C33_PSE_EXT_STATE, /* u32 */
|
||||
ETHTOOL_A_C33_PSE_EXT_SUBSTATE, /* u32 */
|
||||
ETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT, /* u32 */
|
||||
ETHTOOL_A_C33_PSE_PW_LIMIT_RANGES, /* nest - _C33_PSE_PW_LIMIT_* */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_PSE_CNT,
|
||||
ETHTOOL_A_PSE_MAX = (__ETHTOOL_A_PSE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_RSS_UNSPEC,
|
||||
ETHTOOL_A_RSS_HEADER,
|
||||
ETHTOOL_A_RSS_CONTEXT, /* u32 */
|
||||
ETHTOOL_A_RSS_HFUNC, /* u32 */
|
||||
ETHTOOL_A_RSS_INDIR, /* binary */
|
||||
ETHTOOL_A_RSS_HKEY, /* binary */
|
||||
ETHTOOL_A_RSS_INPUT_XFRM, /* u32 */
|
||||
ETHTOOL_A_RSS_START_CONTEXT, /* u32 */
|
||||
|
||||
__ETHTOOL_A_RSS_CNT,
|
||||
ETHTOOL_A_RSS_MAX = (__ETHTOOL_A_RSS_CNT - 1),
|
||||
};
|
||||
|
||||
/* PLCA */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PLCA_UNSPEC,
|
||||
ETHTOOL_A_PLCA_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_PLCA_VERSION, /* u16 */
|
||||
ETHTOOL_A_PLCA_ENABLED, /* u8 */
|
||||
ETHTOOL_A_PLCA_STATUS, /* u8 */
|
||||
ETHTOOL_A_PLCA_NODE_CNT, /* u32 */
|
||||
ETHTOOL_A_PLCA_NODE_ID, /* u32 */
|
||||
ETHTOOL_A_PLCA_TO_TMR, /* u32 */
|
||||
ETHTOOL_A_PLCA_BURST_CNT, /* u32 */
|
||||
ETHTOOL_A_PLCA_BURST_TMR, /* u32 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_PLCA_CNT,
|
||||
ETHTOOL_A_PLCA_MAX = (__ETHTOOL_A_PLCA_CNT - 1)
|
||||
};
|
||||
|
||||
/* MAC Merge (802.3) */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_MM_STAT_UNSPEC,
|
||||
ETHTOOL_A_MM_STAT_PAD,
|
||||
|
||||
/* aMACMergeFrameAssErrorCount */
|
||||
ETHTOOL_A_MM_STAT_REASSEMBLY_ERRORS, /* u64 */
|
||||
/* aMACMergeFrameSmdErrorCount */
|
||||
ETHTOOL_A_MM_STAT_SMD_ERRORS, /* u64 */
|
||||
/* aMACMergeFrameAssOkCount */
|
||||
ETHTOOL_A_MM_STAT_REASSEMBLY_OK, /* u64 */
|
||||
/* aMACMergeFragCountRx */
|
||||
ETHTOOL_A_MM_STAT_RX_FRAG_COUNT, /* u64 */
|
||||
/* aMACMergeFragCountTx */
|
||||
ETHTOOL_A_MM_STAT_TX_FRAG_COUNT, /* u64 */
|
||||
/* aMACMergeHoldCount */
|
||||
ETHTOOL_A_MM_STAT_HOLD_COUNT, /* u64 */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_MM_STAT_CNT,
|
||||
ETHTOOL_A_MM_STAT_MAX = (__ETHTOOL_A_MM_STAT_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_MM_UNSPEC,
|
||||
ETHTOOL_A_MM_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_MM_PMAC_ENABLED, /* u8 */
|
||||
ETHTOOL_A_MM_TX_ENABLED, /* u8 */
|
||||
ETHTOOL_A_MM_TX_ACTIVE, /* u8 */
|
||||
ETHTOOL_A_MM_TX_MIN_FRAG_SIZE, /* u32 */
|
||||
ETHTOOL_A_MM_RX_MIN_FRAG_SIZE, /* u32 */
|
||||
ETHTOOL_A_MM_VERIFY_ENABLED, /* u8 */
|
||||
ETHTOOL_A_MM_VERIFY_STATUS, /* u8 */
|
||||
ETHTOOL_A_MM_VERIFY_TIME, /* u32 */
|
||||
ETHTOOL_A_MM_MAX_VERIFY_TIME, /* u32 */
|
||||
ETHTOOL_A_MM_STATS, /* nest - _A_MM_STAT_* */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_MM_CNT,
|
||||
ETHTOOL_A_MM_MAX = (__ETHTOOL_A_MM_CNT - 1)
|
||||
};
|
||||
|
||||
/* MODULE_FW_FLASH */
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_MODULE_FW_FLASH_UNSPEC,
|
||||
ETHTOOL_A_MODULE_FW_FLASH_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_MODULE_FW_FLASH_FILE_NAME, /* string */
|
||||
ETHTOOL_A_MODULE_FW_FLASH_PASSWORD, /* u32 */
|
||||
ETHTOOL_A_MODULE_FW_FLASH_STATUS, /* u32 */
|
||||
ETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG, /* string */
|
||||
ETHTOOL_A_MODULE_FW_FLASH_DONE, /* uint */
|
||||
ETHTOOL_A_MODULE_FW_FLASH_TOTAL, /* uint */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_MODULE_FW_FLASH_CNT,
|
||||
ETHTOOL_A_MODULE_FW_FLASH_MAX = (__ETHTOOL_A_MODULE_FW_FLASH_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PHY_UNSPEC,
|
||||
ETHTOOL_A_PHY_HEADER, /* nest - _A_HEADER_* */
|
||||
ETHTOOL_A_PHY_INDEX, /* u32 */
|
||||
ETHTOOL_A_PHY_DRVNAME, /* string */
|
||||
ETHTOOL_A_PHY_NAME, /* string */
|
||||
ETHTOOL_A_PHY_UPSTREAM_TYPE, /* u32 */
|
||||
ETHTOOL_A_PHY_UPSTREAM_INDEX, /* u32 */
|
||||
ETHTOOL_A_PHY_UPSTREAM_SFP_NAME, /* string */
|
||||
ETHTOOL_A_PHY_DOWNSTREAM_SFP_NAME, /* string */
|
||||
|
||||
/* add new constants above here */
|
||||
__ETHTOOL_A_PHY_CNT,
|
||||
ETHTOOL_A_PHY_MAX = (__ETHTOOL_A_PHY_CNT - 1)
|
||||
};
|
||||
|
||||
/* generic netlink info */
|
||||
#define ETHTOOL_GENL_NAME "ethtool"
|
||||
|
792
include/uapi/linux/ethtool_netlink_generated.h
Normal file
792
include/uapi/linux/ethtool_netlink_generated.h
Normal file
@ -0,0 +1,792 @@
|
||||
/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
|
||||
/* Do not edit directly, auto-generated from: */
|
||||
/* Documentation/netlink/specs/ethtool.yaml */
|
||||
/* YNL-GEN uapi header */
|
||||
|
||||
#ifndef _UAPI_LINUX_ETHTOOL_NETLINK_GENERATED_H
|
||||
#define _UAPI_LINUX_ETHTOOL_NETLINK_GENERATED_H
|
||||
|
||||
#define ETHTOOL_FAMILY_NAME "ethtool"
|
||||
#define ETHTOOL_FAMILY_VERSION 1
|
||||
|
||||
enum {
|
||||
ETHTOOL_UDP_TUNNEL_TYPE_VXLAN,
|
||||
ETHTOOL_UDP_TUNNEL_TYPE_GENEVE,
|
||||
ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE,
|
||||
|
||||
/* private: */
|
||||
__ETHTOOL_UDP_TUNNEL_TYPE_CNT,
|
||||
ETHTOOL_UDP_TUNNEL_TYPE_MAX = (__ETHTOOL_UDP_TUNNEL_TYPE_CNT - 1)
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ethtool_header_flags - common ethtool header flags
|
||||
* @ETHTOOL_FLAG_COMPACT_BITSETS: use compact bitsets in reply
|
||||
* @ETHTOOL_FLAG_OMIT_REPLY: provide optional reply for SET or ACT requests
|
||||
* @ETHTOOL_FLAG_STATS: request statistics, if supported by the driver
|
||||
*/
|
||||
enum ethtool_header_flags {
|
||||
ETHTOOL_FLAG_COMPACT_BITSETS = 1,
|
||||
ETHTOOL_FLAG_OMIT_REPLY = 2,
|
||||
ETHTOOL_FLAG_STATS = 4,
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_PHY_UPSTREAM_TYPE_MAC,
|
||||
ETHTOOL_PHY_UPSTREAM_TYPE_PHY,
|
||||
};
|
||||
|
||||
enum ethtool_tcp_data_split {
|
||||
ETHTOOL_TCP_DATA_SPLIT_UNKNOWN,
|
||||
ETHTOOL_TCP_DATA_SPLIT_DISABLED,
|
||||
ETHTOOL_TCP_DATA_SPLIT_ENABLED,
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_HEADER_UNSPEC,
|
||||
ETHTOOL_A_HEADER_DEV_INDEX,
|
||||
ETHTOOL_A_HEADER_DEV_NAME,
|
||||
ETHTOOL_A_HEADER_FLAGS,
|
||||
ETHTOOL_A_HEADER_PHY_INDEX,
|
||||
|
||||
__ETHTOOL_A_HEADER_CNT,
|
||||
ETHTOOL_A_HEADER_MAX = (__ETHTOOL_A_HEADER_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_BITSET_BIT_UNSPEC,
|
||||
ETHTOOL_A_BITSET_BIT_INDEX,
|
||||
ETHTOOL_A_BITSET_BIT_NAME,
|
||||
ETHTOOL_A_BITSET_BIT_VALUE,
|
||||
|
||||
__ETHTOOL_A_BITSET_BIT_CNT,
|
||||
ETHTOOL_A_BITSET_BIT_MAX = (__ETHTOOL_A_BITSET_BIT_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_BITSET_BITS_UNSPEC,
|
||||
ETHTOOL_A_BITSET_BITS_BIT,
|
||||
|
||||
__ETHTOOL_A_BITSET_BITS_CNT,
|
||||
ETHTOOL_A_BITSET_BITS_MAX = (__ETHTOOL_A_BITSET_BITS_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_BITSET_UNSPEC,
|
||||
ETHTOOL_A_BITSET_NOMASK,
|
||||
ETHTOOL_A_BITSET_SIZE,
|
||||
ETHTOOL_A_BITSET_BITS,
|
||||
ETHTOOL_A_BITSET_VALUE,
|
||||
ETHTOOL_A_BITSET_MASK,
|
||||
|
||||
__ETHTOOL_A_BITSET_CNT,
|
||||
ETHTOOL_A_BITSET_MAX = (__ETHTOOL_A_BITSET_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STRING_UNSPEC,
|
||||
ETHTOOL_A_STRING_INDEX,
|
||||
ETHTOOL_A_STRING_VALUE,
|
||||
|
||||
__ETHTOOL_A_STRING_CNT,
|
||||
ETHTOOL_A_STRING_MAX = (__ETHTOOL_A_STRING_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STRINGS_UNSPEC,
|
||||
ETHTOOL_A_STRINGS_STRING,
|
||||
|
||||
__ETHTOOL_A_STRINGS_CNT,
|
||||
ETHTOOL_A_STRINGS_MAX = (__ETHTOOL_A_STRINGS_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STRINGSET_UNSPEC,
|
||||
ETHTOOL_A_STRINGSET_ID,
|
||||
ETHTOOL_A_STRINGSET_COUNT,
|
||||
ETHTOOL_A_STRINGSET_STRINGS,
|
||||
|
||||
__ETHTOOL_A_STRINGSET_CNT,
|
||||
ETHTOOL_A_STRINGSET_MAX = (__ETHTOOL_A_STRINGSET_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STRINGSETS_UNSPEC,
|
||||
ETHTOOL_A_STRINGSETS_STRINGSET,
|
||||
|
||||
__ETHTOOL_A_STRINGSETS_CNT,
|
||||
ETHTOOL_A_STRINGSETS_MAX = (__ETHTOOL_A_STRINGSETS_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STRSET_UNSPEC,
|
||||
ETHTOOL_A_STRSET_HEADER,
|
||||
ETHTOOL_A_STRSET_STRINGSETS,
|
||||
ETHTOOL_A_STRSET_COUNTS_ONLY,
|
||||
|
||||
__ETHTOOL_A_STRSET_CNT,
|
||||
ETHTOOL_A_STRSET_MAX = (__ETHTOOL_A_STRSET_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PRIVFLAGS_UNSPEC,
|
||||
ETHTOOL_A_PRIVFLAGS_HEADER,
|
||||
ETHTOOL_A_PRIVFLAGS_FLAGS,
|
||||
|
||||
__ETHTOOL_A_PRIVFLAGS_CNT,
|
||||
ETHTOOL_A_PRIVFLAGS_MAX = (__ETHTOOL_A_PRIVFLAGS_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_RINGS_UNSPEC,
|
||||
ETHTOOL_A_RINGS_HEADER,
|
||||
ETHTOOL_A_RINGS_RX_MAX,
|
||||
ETHTOOL_A_RINGS_RX_MINI_MAX,
|
||||
ETHTOOL_A_RINGS_RX_JUMBO_MAX,
|
||||
ETHTOOL_A_RINGS_TX_MAX,
|
||||
ETHTOOL_A_RINGS_RX,
|
||||
ETHTOOL_A_RINGS_RX_MINI,
|
||||
ETHTOOL_A_RINGS_RX_JUMBO,
|
||||
ETHTOOL_A_RINGS_TX,
|
||||
ETHTOOL_A_RINGS_RX_BUF_LEN,
|
||||
ETHTOOL_A_RINGS_TCP_DATA_SPLIT,
|
||||
ETHTOOL_A_RINGS_CQE_SIZE,
|
||||
ETHTOOL_A_RINGS_TX_PUSH,
|
||||
ETHTOOL_A_RINGS_RX_PUSH,
|
||||
ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN,
|
||||
ETHTOOL_A_RINGS_TX_PUSH_BUF_LEN_MAX,
|
||||
|
||||
__ETHTOOL_A_RINGS_CNT,
|
||||
ETHTOOL_A_RINGS_MAX = (__ETHTOOL_A_RINGS_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_MM_STAT_UNSPEC,
|
||||
ETHTOOL_A_MM_STAT_PAD,
|
||||
ETHTOOL_A_MM_STAT_REASSEMBLY_ERRORS,
|
||||
ETHTOOL_A_MM_STAT_SMD_ERRORS,
|
||||
ETHTOOL_A_MM_STAT_REASSEMBLY_OK,
|
||||
ETHTOOL_A_MM_STAT_RX_FRAG_COUNT,
|
||||
ETHTOOL_A_MM_STAT_TX_FRAG_COUNT,
|
||||
ETHTOOL_A_MM_STAT_HOLD_COUNT,
|
||||
|
||||
__ETHTOOL_A_MM_STAT_CNT,
|
||||
ETHTOOL_A_MM_STAT_MAX = (__ETHTOOL_A_MM_STAT_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_MM_UNSPEC,
|
||||
ETHTOOL_A_MM_HEADER,
|
||||
ETHTOOL_A_MM_PMAC_ENABLED,
|
||||
ETHTOOL_A_MM_TX_ENABLED,
|
||||
ETHTOOL_A_MM_TX_ACTIVE,
|
||||
ETHTOOL_A_MM_TX_MIN_FRAG_SIZE,
|
||||
ETHTOOL_A_MM_RX_MIN_FRAG_SIZE,
|
||||
ETHTOOL_A_MM_VERIFY_ENABLED,
|
||||
ETHTOOL_A_MM_VERIFY_STATUS,
|
||||
ETHTOOL_A_MM_VERIFY_TIME,
|
||||
ETHTOOL_A_MM_MAX_VERIFY_TIME,
|
||||
ETHTOOL_A_MM_STATS,
|
||||
|
||||
__ETHTOOL_A_MM_CNT,
|
||||
ETHTOOL_A_MM_MAX = (__ETHTOOL_A_MM_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_LINKINFO_UNSPEC,
|
||||
ETHTOOL_A_LINKINFO_HEADER,
|
||||
ETHTOOL_A_LINKINFO_PORT,
|
||||
ETHTOOL_A_LINKINFO_PHYADDR,
|
||||
ETHTOOL_A_LINKINFO_TP_MDIX,
|
||||
ETHTOOL_A_LINKINFO_TP_MDIX_CTRL,
|
||||
ETHTOOL_A_LINKINFO_TRANSCEIVER,
|
||||
|
||||
__ETHTOOL_A_LINKINFO_CNT,
|
||||
ETHTOOL_A_LINKINFO_MAX = (__ETHTOOL_A_LINKINFO_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_LINKMODES_UNSPEC,
|
||||
ETHTOOL_A_LINKMODES_HEADER,
|
||||
ETHTOOL_A_LINKMODES_AUTONEG,
|
||||
ETHTOOL_A_LINKMODES_OURS,
|
||||
ETHTOOL_A_LINKMODES_PEER,
|
||||
ETHTOOL_A_LINKMODES_SPEED,
|
||||
ETHTOOL_A_LINKMODES_DUPLEX,
|
||||
ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG,
|
||||
ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE,
|
||||
ETHTOOL_A_LINKMODES_LANES,
|
||||
ETHTOOL_A_LINKMODES_RATE_MATCHING,
|
||||
|
||||
__ETHTOOL_A_LINKMODES_CNT,
|
||||
ETHTOOL_A_LINKMODES_MAX = (__ETHTOOL_A_LINKMODES_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_LINKSTATE_UNSPEC,
|
||||
ETHTOOL_A_LINKSTATE_HEADER,
|
||||
ETHTOOL_A_LINKSTATE_LINK,
|
||||
ETHTOOL_A_LINKSTATE_SQI,
|
||||
ETHTOOL_A_LINKSTATE_SQI_MAX,
|
||||
ETHTOOL_A_LINKSTATE_EXT_STATE,
|
||||
ETHTOOL_A_LINKSTATE_EXT_SUBSTATE,
|
||||
ETHTOOL_A_LINKSTATE_EXT_DOWN_CNT,
|
||||
|
||||
__ETHTOOL_A_LINKSTATE_CNT,
|
||||
ETHTOOL_A_LINKSTATE_MAX = (__ETHTOOL_A_LINKSTATE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_DEBUG_UNSPEC,
|
||||
ETHTOOL_A_DEBUG_HEADER,
|
||||
ETHTOOL_A_DEBUG_MSGMASK,
|
||||
|
||||
__ETHTOOL_A_DEBUG_CNT,
|
||||
ETHTOOL_A_DEBUG_MAX = (__ETHTOOL_A_DEBUG_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_WOL_UNSPEC,
|
||||
ETHTOOL_A_WOL_HEADER,
|
||||
ETHTOOL_A_WOL_MODES,
|
||||
ETHTOOL_A_WOL_SOPASS,
|
||||
|
||||
__ETHTOOL_A_WOL_CNT,
|
||||
ETHTOOL_A_WOL_MAX = (__ETHTOOL_A_WOL_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_FEATURES_UNSPEC,
|
||||
ETHTOOL_A_FEATURES_HEADER,
|
||||
ETHTOOL_A_FEATURES_HW,
|
||||
ETHTOOL_A_FEATURES_WANTED,
|
||||
ETHTOOL_A_FEATURES_ACTIVE,
|
||||
ETHTOOL_A_FEATURES_NOCHANGE,
|
||||
|
||||
__ETHTOOL_A_FEATURES_CNT,
|
||||
ETHTOOL_A_FEATURES_MAX = (__ETHTOOL_A_FEATURES_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CHANNELS_UNSPEC,
|
||||
ETHTOOL_A_CHANNELS_HEADER,
|
||||
ETHTOOL_A_CHANNELS_RX_MAX,
|
||||
ETHTOOL_A_CHANNELS_TX_MAX,
|
||||
ETHTOOL_A_CHANNELS_OTHER_MAX,
|
||||
ETHTOOL_A_CHANNELS_COMBINED_MAX,
|
||||
ETHTOOL_A_CHANNELS_RX_COUNT,
|
||||
ETHTOOL_A_CHANNELS_TX_COUNT,
|
||||
ETHTOOL_A_CHANNELS_OTHER_COUNT,
|
||||
ETHTOOL_A_CHANNELS_COMBINED_COUNT,
|
||||
|
||||
__ETHTOOL_A_CHANNELS_CNT,
|
||||
ETHTOOL_A_CHANNELS_MAX = (__ETHTOOL_A_CHANNELS_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_IRQ_MODERATION_UNSPEC,
|
||||
ETHTOOL_A_IRQ_MODERATION_USEC,
|
||||
ETHTOOL_A_IRQ_MODERATION_PKTS,
|
||||
ETHTOOL_A_IRQ_MODERATION_COMPS,
|
||||
|
||||
__ETHTOOL_A_IRQ_MODERATION_CNT,
|
||||
ETHTOOL_A_IRQ_MODERATION_MAX = (__ETHTOOL_A_IRQ_MODERATION_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PROFILE_UNSPEC,
|
||||
ETHTOOL_A_PROFILE_IRQ_MODERATION,
|
||||
|
||||
__ETHTOOL_A_PROFILE_CNT,
|
||||
ETHTOOL_A_PROFILE_MAX = (__ETHTOOL_A_PROFILE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_COALESCE_UNSPEC,
|
||||
ETHTOOL_A_COALESCE_HEADER,
|
||||
ETHTOOL_A_COALESCE_RX_USECS,
|
||||
ETHTOOL_A_COALESCE_RX_MAX_FRAMES,
|
||||
ETHTOOL_A_COALESCE_RX_USECS_IRQ,
|
||||
ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ,
|
||||
ETHTOOL_A_COALESCE_TX_USECS,
|
||||
ETHTOOL_A_COALESCE_TX_MAX_FRAMES,
|
||||
ETHTOOL_A_COALESCE_TX_USECS_IRQ,
|
||||
ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ,
|
||||
ETHTOOL_A_COALESCE_STATS_BLOCK_USECS,
|
||||
ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX,
|
||||
ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX,
|
||||
ETHTOOL_A_COALESCE_PKT_RATE_LOW,
|
||||
ETHTOOL_A_COALESCE_RX_USECS_LOW,
|
||||
ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW,
|
||||
ETHTOOL_A_COALESCE_TX_USECS_LOW,
|
||||
ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW,
|
||||
ETHTOOL_A_COALESCE_PKT_RATE_HIGH,
|
||||
ETHTOOL_A_COALESCE_RX_USECS_HIGH,
|
||||
ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH,
|
||||
ETHTOOL_A_COALESCE_TX_USECS_HIGH,
|
||||
ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH,
|
||||
ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL,
|
||||
ETHTOOL_A_COALESCE_USE_CQE_MODE_TX,
|
||||
ETHTOOL_A_COALESCE_USE_CQE_MODE_RX,
|
||||
ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES,
|
||||
ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES,
|
||||
ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS,
|
||||
ETHTOOL_A_COALESCE_RX_PROFILE,
|
||||
ETHTOOL_A_COALESCE_TX_PROFILE,
|
||||
|
||||
__ETHTOOL_A_COALESCE_CNT,
|
||||
ETHTOOL_A_COALESCE_MAX = (__ETHTOOL_A_COALESCE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PAUSE_STAT_UNSPEC,
|
||||
ETHTOOL_A_PAUSE_STAT_PAD,
|
||||
ETHTOOL_A_PAUSE_STAT_TX_FRAMES,
|
||||
ETHTOOL_A_PAUSE_STAT_RX_FRAMES,
|
||||
|
||||
__ETHTOOL_A_PAUSE_STAT_CNT,
|
||||
ETHTOOL_A_PAUSE_STAT_MAX = (__ETHTOOL_A_PAUSE_STAT_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PAUSE_UNSPEC,
|
||||
ETHTOOL_A_PAUSE_HEADER,
|
||||
ETHTOOL_A_PAUSE_AUTONEG,
|
||||
ETHTOOL_A_PAUSE_RX,
|
||||
ETHTOOL_A_PAUSE_TX,
|
||||
ETHTOOL_A_PAUSE_STATS,
|
||||
ETHTOOL_A_PAUSE_STATS_SRC,
|
||||
|
||||
__ETHTOOL_A_PAUSE_CNT,
|
||||
ETHTOOL_A_PAUSE_MAX = (__ETHTOOL_A_PAUSE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_EEE_UNSPEC,
|
||||
ETHTOOL_A_EEE_HEADER,
|
||||
ETHTOOL_A_EEE_MODES_OURS,
|
||||
ETHTOOL_A_EEE_MODES_PEER,
|
||||
ETHTOOL_A_EEE_ACTIVE,
|
||||
ETHTOOL_A_EEE_ENABLED,
|
||||
ETHTOOL_A_EEE_TX_LPI_ENABLED,
|
||||
ETHTOOL_A_EEE_TX_LPI_TIMER,
|
||||
|
||||
__ETHTOOL_A_EEE_CNT,
|
||||
ETHTOOL_A_EEE_MAX = (__ETHTOOL_A_EEE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TS_STAT_UNSPEC,
|
||||
ETHTOOL_A_TS_STAT_TX_PKTS,
|
||||
ETHTOOL_A_TS_STAT_TX_LOST,
|
||||
ETHTOOL_A_TS_STAT_TX_ERR,
|
||||
|
||||
__ETHTOOL_A_TS_STAT_CNT,
|
||||
ETHTOOL_A_TS_STAT_MAX = (__ETHTOOL_A_TS_STAT_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TSINFO_UNSPEC,
|
||||
ETHTOOL_A_TSINFO_HEADER,
|
||||
ETHTOOL_A_TSINFO_TIMESTAMPING,
|
||||
ETHTOOL_A_TSINFO_TX_TYPES,
|
||||
ETHTOOL_A_TSINFO_RX_FILTERS,
|
||||
ETHTOOL_A_TSINFO_PHC_INDEX,
|
||||
ETHTOOL_A_TSINFO_STATS,
|
||||
|
||||
__ETHTOOL_A_TSINFO_CNT,
|
||||
ETHTOOL_A_TSINFO_MAX = (__ETHTOOL_A_TSINFO_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_RESULT_UNSPEC,
|
||||
ETHTOOL_A_CABLE_RESULT_PAIR,
|
||||
ETHTOOL_A_CABLE_RESULT_CODE,
|
||||
ETHTOOL_A_CABLE_RESULT_SRC,
|
||||
|
||||
__ETHTOOL_A_CABLE_RESULT_CNT,
|
||||
ETHTOOL_A_CABLE_RESULT_MAX = (__ETHTOOL_A_CABLE_RESULT_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC,
|
||||
ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR,
|
||||
ETHTOOL_A_CABLE_FAULT_LENGTH_CM,
|
||||
ETHTOOL_A_CABLE_FAULT_LENGTH_SRC,
|
||||
|
||||
__ETHTOOL_A_CABLE_FAULT_LENGTH_CNT,
|
||||
ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = (__ETHTOOL_A_CABLE_FAULT_LENGTH_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_NEST_UNSPEC,
|
||||
ETHTOOL_A_CABLE_NEST_RESULT,
|
||||
ETHTOOL_A_CABLE_NEST_FAULT_LENGTH,
|
||||
|
||||
__ETHTOOL_A_CABLE_NEST_CNT,
|
||||
ETHTOOL_A_CABLE_NEST_MAX = (__ETHTOOL_A_CABLE_NEST_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_HEADER,
|
||||
|
||||
__ETHTOOL_A_CABLE_TEST_CNT,
|
||||
ETHTOOL_A_CABLE_TEST_MAX = (__ETHTOOL_A_CABLE_TEST_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_NTF_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_NTF_HEADER,
|
||||
ETHTOOL_A_CABLE_TEST_NTF_STATUS,
|
||||
ETHTOOL_A_CABLE_TEST_NTF_NEST,
|
||||
|
||||
__ETHTOOL_A_CABLE_TEST_NTF_CNT,
|
||||
ETHTOOL_A_CABLE_TEST_NTF_MAX = (__ETHTOOL_A_CABLE_TEST_NTF_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR,
|
||||
|
||||
__ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = (__ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_TDR_NTF_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_NTF_HEADER,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_NTF_STATUS,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_NTF_NEST,
|
||||
|
||||
__ETHTOOL_A_CABLE_TEST_TDR_NTF_CNT,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_NTF_MAX = (__ETHTOOL_A_CABLE_TEST_TDR_NTF_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_CABLE_TEST_TDR_UNSPEC,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_HEADER,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_CFG,
|
||||
|
||||
__ETHTOOL_A_CABLE_TEST_TDR_CNT,
|
||||
ETHTOOL_A_CABLE_TEST_TDR_MAX = (__ETHTOOL_A_CABLE_TEST_TDR_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC,
|
||||
ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT,
|
||||
ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE,
|
||||
|
||||
__ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT,
|
||||
ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = (__ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC,
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE,
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES,
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY,
|
||||
|
||||
__ETHTOOL_A_TUNNEL_UDP_TABLE_CNT,
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = (__ETHTOOL_A_TUNNEL_UDP_TABLE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TUNNEL_UDP_UNSPEC,
|
||||
ETHTOOL_A_TUNNEL_UDP_TABLE,
|
||||
|
||||
__ETHTOOL_A_TUNNEL_UDP_CNT,
|
||||
ETHTOOL_A_TUNNEL_UDP_MAX = (__ETHTOOL_A_TUNNEL_UDP_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_TUNNEL_INFO_UNSPEC,
|
||||
ETHTOOL_A_TUNNEL_INFO_HEADER,
|
||||
ETHTOOL_A_TUNNEL_INFO_UDP_PORTS,
|
||||
|
||||
__ETHTOOL_A_TUNNEL_INFO_CNT,
|
||||
ETHTOOL_A_TUNNEL_INFO_MAX = (__ETHTOOL_A_TUNNEL_INFO_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_FEC_STAT_UNSPEC,
|
||||
ETHTOOL_A_FEC_STAT_PAD,
|
||||
ETHTOOL_A_FEC_STAT_CORRECTED,
|
||||
ETHTOOL_A_FEC_STAT_UNCORR,
|
||||
ETHTOOL_A_FEC_STAT_CORR_BITS,
|
||||
|
||||
__ETHTOOL_A_FEC_STAT_CNT,
|
||||
ETHTOOL_A_FEC_STAT_MAX = (__ETHTOOL_A_FEC_STAT_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_FEC_UNSPEC,
|
||||
ETHTOOL_A_FEC_HEADER,
|
||||
ETHTOOL_A_FEC_MODES,
|
||||
ETHTOOL_A_FEC_AUTO,
|
||||
ETHTOOL_A_FEC_ACTIVE,
|
||||
ETHTOOL_A_FEC_STATS,
|
||||
|
||||
__ETHTOOL_A_FEC_CNT,
|
||||
ETHTOOL_A_FEC_MAX = (__ETHTOOL_A_FEC_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_MODULE_EEPROM_UNSPEC,
|
||||
ETHTOOL_A_MODULE_EEPROM_HEADER,
|
||||
ETHTOOL_A_MODULE_EEPROM_OFFSET,
|
||||
ETHTOOL_A_MODULE_EEPROM_LENGTH,
|
||||
ETHTOOL_A_MODULE_EEPROM_PAGE,
|
||||
ETHTOOL_A_MODULE_EEPROM_BANK,
|
||||
ETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS,
|
||||
ETHTOOL_A_MODULE_EEPROM_DATA,
|
||||
|
||||
__ETHTOOL_A_MODULE_EEPROM_CNT,
|
||||
ETHTOOL_A_MODULE_EEPROM_MAX = (__ETHTOOL_A_MODULE_EEPROM_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STATS_GRP_UNSPEC,
|
||||
ETHTOOL_A_STATS_GRP_PAD,
|
||||
ETHTOOL_A_STATS_GRP_ID,
|
||||
ETHTOOL_A_STATS_GRP_SS_ID,
|
||||
ETHTOOL_A_STATS_GRP_STAT,
|
||||
ETHTOOL_A_STATS_GRP_HIST_RX,
|
||||
ETHTOOL_A_STATS_GRP_HIST_TX,
|
||||
ETHTOOL_A_STATS_GRP_HIST_BKT_LOW,
|
||||
ETHTOOL_A_STATS_GRP_HIST_BKT_HI,
|
||||
ETHTOOL_A_STATS_GRP_HIST_VAL,
|
||||
|
||||
__ETHTOOL_A_STATS_GRP_CNT,
|
||||
ETHTOOL_A_STATS_GRP_MAX = (__ETHTOOL_A_STATS_GRP_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_STATS_UNSPEC,
|
||||
ETHTOOL_A_STATS_PAD,
|
||||
ETHTOOL_A_STATS_HEADER,
|
||||
ETHTOOL_A_STATS_GROUPS,
|
||||
ETHTOOL_A_STATS_GRP,
|
||||
ETHTOOL_A_STATS_SRC,
|
||||
|
||||
__ETHTOOL_A_STATS_CNT,
|
||||
ETHTOOL_A_STATS_MAX = (__ETHTOOL_A_STATS_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PHC_VCLOCKS_UNSPEC,
|
||||
ETHTOOL_A_PHC_VCLOCKS_HEADER,
|
||||
ETHTOOL_A_PHC_VCLOCKS_NUM,
|
||||
ETHTOOL_A_PHC_VCLOCKS_INDEX,
|
||||
|
||||
__ETHTOOL_A_PHC_VCLOCKS_CNT,
|
||||
ETHTOOL_A_PHC_VCLOCKS_MAX = (__ETHTOOL_A_PHC_VCLOCKS_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_MODULE_UNSPEC,
|
||||
ETHTOOL_A_MODULE_HEADER,
|
||||
ETHTOOL_A_MODULE_POWER_MODE_POLICY,
|
||||
ETHTOOL_A_MODULE_POWER_MODE,
|
||||
|
||||
__ETHTOOL_A_MODULE_CNT,
|
||||
ETHTOOL_A_MODULE_MAX = (__ETHTOOL_A_MODULE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_C33_PSE_PW_LIMIT_UNSPEC,
|
||||
ETHTOOL_A_C33_PSE_PW_LIMIT_MIN,
|
||||
ETHTOOL_A_C33_PSE_PW_LIMIT_MAX,
|
||||
|
||||
__ETHTOOL_A_C33_PSE_PW_LIMIT_CNT,
|
||||
__ETHTOOL_A_C33_PSE_PW_LIMIT_MAX = (__ETHTOOL_A_C33_PSE_PW_LIMIT_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PSE_UNSPEC,
|
||||
ETHTOOL_A_PSE_HEADER,
|
||||
ETHTOOL_A_PODL_PSE_ADMIN_STATE,
|
||||
ETHTOOL_A_PODL_PSE_ADMIN_CONTROL,
|
||||
ETHTOOL_A_PODL_PSE_PW_D_STATUS,
|
||||
ETHTOOL_A_C33_PSE_ADMIN_STATE,
|
||||
ETHTOOL_A_C33_PSE_ADMIN_CONTROL,
|
||||
ETHTOOL_A_C33_PSE_PW_D_STATUS,
|
||||
ETHTOOL_A_C33_PSE_PW_CLASS,
|
||||
ETHTOOL_A_C33_PSE_ACTUAL_PW,
|
||||
ETHTOOL_A_C33_PSE_EXT_STATE,
|
||||
ETHTOOL_A_C33_PSE_EXT_SUBSTATE,
|
||||
ETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT,
|
||||
ETHTOOL_A_C33_PSE_PW_LIMIT_RANGES,
|
||||
|
||||
__ETHTOOL_A_PSE_CNT,
|
||||
ETHTOOL_A_PSE_MAX = (__ETHTOOL_A_PSE_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_RSS_UNSPEC,
|
||||
ETHTOOL_A_RSS_HEADER,
|
||||
ETHTOOL_A_RSS_CONTEXT,
|
||||
ETHTOOL_A_RSS_HFUNC,
|
||||
ETHTOOL_A_RSS_INDIR,
|
||||
ETHTOOL_A_RSS_HKEY,
|
||||
ETHTOOL_A_RSS_INPUT_XFRM,
|
||||
ETHTOOL_A_RSS_START_CONTEXT,
|
||||
|
||||
__ETHTOOL_A_RSS_CNT,
|
||||
ETHTOOL_A_RSS_MAX = (__ETHTOOL_A_RSS_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PLCA_UNSPEC,
|
||||
ETHTOOL_A_PLCA_HEADER,
|
||||
ETHTOOL_A_PLCA_VERSION,
|
||||
ETHTOOL_A_PLCA_ENABLED,
|
||||
ETHTOOL_A_PLCA_STATUS,
|
||||
ETHTOOL_A_PLCA_NODE_CNT,
|
||||
ETHTOOL_A_PLCA_NODE_ID,
|
||||
ETHTOOL_A_PLCA_TO_TMR,
|
||||
ETHTOOL_A_PLCA_BURST_CNT,
|
||||
ETHTOOL_A_PLCA_BURST_TMR,
|
||||
|
||||
__ETHTOOL_A_PLCA_CNT,
|
||||
ETHTOOL_A_PLCA_MAX = (__ETHTOOL_A_PLCA_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_MODULE_FW_FLASH_UNSPEC,
|
||||
ETHTOOL_A_MODULE_FW_FLASH_HEADER,
|
||||
ETHTOOL_A_MODULE_FW_FLASH_FILE_NAME,
|
||||
ETHTOOL_A_MODULE_FW_FLASH_PASSWORD,
|
||||
ETHTOOL_A_MODULE_FW_FLASH_STATUS,
|
||||
ETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG,
|
||||
ETHTOOL_A_MODULE_FW_FLASH_DONE,
|
||||
ETHTOOL_A_MODULE_FW_FLASH_TOTAL,
|
||||
|
||||
__ETHTOOL_A_MODULE_FW_FLASH_CNT,
|
||||
ETHTOOL_A_MODULE_FW_FLASH_MAX = (__ETHTOOL_A_MODULE_FW_FLASH_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_A_PHY_UNSPEC,
|
||||
ETHTOOL_A_PHY_HEADER,
|
||||
ETHTOOL_A_PHY_INDEX,
|
||||
ETHTOOL_A_PHY_DRVNAME,
|
||||
ETHTOOL_A_PHY_NAME,
|
||||
ETHTOOL_A_PHY_UPSTREAM_TYPE,
|
||||
ETHTOOL_A_PHY_UPSTREAM_INDEX,
|
||||
ETHTOOL_A_PHY_UPSTREAM_SFP_NAME,
|
||||
ETHTOOL_A_PHY_DOWNSTREAM_SFP_NAME,
|
||||
|
||||
__ETHTOOL_A_PHY_CNT,
|
||||
ETHTOOL_A_PHY_MAX = (__ETHTOOL_A_PHY_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_MSG_USER_NONE = 0,
|
||||
ETHTOOL_MSG_STRSET_GET = 1,
|
||||
ETHTOOL_MSG_LINKINFO_GET,
|
||||
ETHTOOL_MSG_LINKINFO_SET,
|
||||
ETHTOOL_MSG_LINKMODES_GET,
|
||||
ETHTOOL_MSG_LINKMODES_SET,
|
||||
ETHTOOL_MSG_LINKSTATE_GET,
|
||||
ETHTOOL_MSG_DEBUG_GET,
|
||||
ETHTOOL_MSG_DEBUG_SET,
|
||||
ETHTOOL_MSG_WOL_GET,
|
||||
ETHTOOL_MSG_WOL_SET,
|
||||
ETHTOOL_MSG_FEATURES_GET,
|
||||
ETHTOOL_MSG_FEATURES_SET,
|
||||
ETHTOOL_MSG_PRIVFLAGS_GET,
|
||||
ETHTOOL_MSG_PRIVFLAGS_SET,
|
||||
ETHTOOL_MSG_RINGS_GET,
|
||||
ETHTOOL_MSG_RINGS_SET,
|
||||
ETHTOOL_MSG_CHANNELS_GET,
|
||||
ETHTOOL_MSG_CHANNELS_SET,
|
||||
ETHTOOL_MSG_COALESCE_GET,
|
||||
ETHTOOL_MSG_COALESCE_SET,
|
||||
ETHTOOL_MSG_PAUSE_GET,
|
||||
ETHTOOL_MSG_PAUSE_SET,
|
||||
ETHTOOL_MSG_EEE_GET,
|
||||
ETHTOOL_MSG_EEE_SET,
|
||||
ETHTOOL_MSG_TSINFO_GET,
|
||||
ETHTOOL_MSG_CABLE_TEST_ACT,
|
||||
ETHTOOL_MSG_CABLE_TEST_TDR_ACT,
|
||||
ETHTOOL_MSG_TUNNEL_INFO_GET,
|
||||
ETHTOOL_MSG_FEC_GET,
|
||||
ETHTOOL_MSG_FEC_SET,
|
||||
ETHTOOL_MSG_MODULE_EEPROM_GET,
|
||||
ETHTOOL_MSG_STATS_GET,
|
||||
ETHTOOL_MSG_PHC_VCLOCKS_GET,
|
||||
ETHTOOL_MSG_MODULE_GET,
|
||||
ETHTOOL_MSG_MODULE_SET,
|
||||
ETHTOOL_MSG_PSE_GET,
|
||||
ETHTOOL_MSG_PSE_SET,
|
||||
ETHTOOL_MSG_RSS_GET,
|
||||
ETHTOOL_MSG_PLCA_GET_CFG,
|
||||
ETHTOOL_MSG_PLCA_SET_CFG,
|
||||
ETHTOOL_MSG_PLCA_GET_STATUS,
|
||||
ETHTOOL_MSG_MM_GET,
|
||||
ETHTOOL_MSG_MM_SET,
|
||||
ETHTOOL_MSG_MODULE_FW_FLASH_ACT,
|
||||
ETHTOOL_MSG_PHY_GET,
|
||||
|
||||
__ETHTOOL_MSG_USER_CNT,
|
||||
ETHTOOL_MSG_USER_MAX = (__ETHTOOL_MSG_USER_CNT - 1)
|
||||
};
|
||||
|
||||
enum {
|
||||
ETHTOOL_MSG_KERNEL_NONE = 0,
|
||||
ETHTOOL_MSG_STRSET_GET_REPLY = 1,
|
||||
ETHTOOL_MSG_LINKINFO_GET_REPLY,
|
||||
ETHTOOL_MSG_LINKINFO_NTF,
|
||||
ETHTOOL_MSG_LINKMODES_GET_REPLY,
|
||||
ETHTOOL_MSG_LINKMODES_NTF,
|
||||
ETHTOOL_MSG_LINKSTATE_GET_REPLY,
|
||||
ETHTOOL_MSG_DEBUG_GET_REPLY,
|
||||
ETHTOOL_MSG_DEBUG_NTF,
|
||||
ETHTOOL_MSG_WOL_GET_REPLY,
|
||||
ETHTOOL_MSG_WOL_NTF,
|
||||
ETHTOOL_MSG_FEATURES_GET_REPLY,
|
||||
ETHTOOL_MSG_FEATURES_SET_REPLY,
|
||||
ETHTOOL_MSG_FEATURES_NTF,
|
||||
ETHTOOL_MSG_PRIVFLAGS_GET_REPLY,
|
||||
ETHTOOL_MSG_PRIVFLAGS_NTF,
|
||||
ETHTOOL_MSG_RINGS_GET_REPLY,
|
||||
ETHTOOL_MSG_RINGS_NTF,
|
||||
ETHTOOL_MSG_CHANNELS_GET_REPLY,
|
||||
ETHTOOL_MSG_CHANNELS_NTF,
|
||||
ETHTOOL_MSG_COALESCE_GET_REPLY,
|
||||
ETHTOOL_MSG_COALESCE_NTF,
|
||||
ETHTOOL_MSG_PAUSE_GET_REPLY,
|
||||
ETHTOOL_MSG_PAUSE_NTF,
|
||||
ETHTOOL_MSG_EEE_GET_REPLY,
|
||||
ETHTOOL_MSG_EEE_NTF,
|
||||
ETHTOOL_MSG_TSINFO_GET_REPLY,
|
||||
ETHTOOL_MSG_CABLE_TEST_NTF,
|
||||
ETHTOOL_MSG_CABLE_TEST_TDR_NTF,
|
||||
ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY,
|
||||
ETHTOOL_MSG_FEC_GET_REPLY,
|
||||
ETHTOOL_MSG_FEC_NTF,
|
||||
ETHTOOL_MSG_MODULE_EEPROM_GET_REPLY,
|
||||
ETHTOOL_MSG_STATS_GET_REPLY,
|
||||
ETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY,
|
||||
ETHTOOL_MSG_MODULE_GET_REPLY,
|
||||
ETHTOOL_MSG_MODULE_NTF,
|
||||
ETHTOOL_MSG_PSE_GET_REPLY,
|
||||
ETHTOOL_MSG_RSS_GET_REPLY,
|
||||
ETHTOOL_MSG_PLCA_GET_CFG_REPLY,
|
||||
ETHTOOL_MSG_PLCA_GET_STATUS_REPLY,
|
||||
ETHTOOL_MSG_PLCA_NTF,
|
||||
ETHTOOL_MSG_MM_GET_REPLY,
|
||||
ETHTOOL_MSG_MM_NTF,
|
||||
ETHTOOL_MSG_MODULE_FW_FLASH_NTF,
|
||||
ETHTOOL_MSG_PHY_GET_REPLY,
|
||||
ETHTOOL_MSG_PHY_NTF,
|
||||
|
||||
__ETHTOOL_MSG_KERNEL_CNT,
|
||||
ETHTOOL_MSG_KERNEL_MAX = (__ETHTOOL_MSG_KERNEL_CNT - 1)
|
||||
};
|
||||
|
||||
#endif /* _UAPI_LINUX_ETHTOOL_NETLINK_GENERATED_H */
|
@ -390,7 +390,7 @@ netdev_tx_t netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
|
||||
}
|
||||
EXPORT_SYMBOL(netpoll_send_skb);
|
||||
|
||||
void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
|
||||
int netpoll_send_udp(struct netpoll *np, const char *msg, int len)
|
||||
{
|
||||
int total_len, ip_len, udp_len;
|
||||
struct sk_buff *skb;
|
||||
@ -414,7 +414,7 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
|
||||
skb = find_skb(np, total_len + np->dev->needed_tailroom,
|
||||
total_len - len);
|
||||
if (!skb)
|
||||
return;
|
||||
return -ENOMEM;
|
||||
|
||||
skb_copy_to_linear_data(skb, msg, len);
|
||||
skb_put(skb, len);
|
||||
@ -490,7 +490,7 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
|
||||
|
||||
skb->dev = np->dev;
|
||||
|
||||
netpoll_send_skb(np, skb);
|
||||
return (int)netpoll_send_skb(np, skb);
|
||||
}
|
||||
EXPORT_SYMBOL(netpoll_send_udp);
|
||||
|
||||
@ -634,7 +634,8 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!rcu_access_pointer(ndev->npinfo)) {
|
||||
npinfo = rtnl_dereference(ndev->npinfo);
|
||||
if (!npinfo) {
|
||||
npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL);
|
||||
if (!npinfo) {
|
||||
err = -ENOMEM;
|
||||
@ -654,7 +655,6 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
|
||||
goto free_npinfo;
|
||||
}
|
||||
} else {
|
||||
npinfo = rtnl_dereference(ndev->npinfo);
|
||||
refcount_inc(&npinfo->refcnt);
|
||||
}
|
||||
|
||||
|
@ -1169,7 +1169,10 @@ static int __ip_append_data(struct sock *sk,
|
||||
/* [!] NOTE: copy will be negative if pagedlen>0
|
||||
* because then the equation reduces to -fraggap.
|
||||
*/
|
||||
if (copy > 0 && getfrag(from, data + transhdrlen, offset, copy, fraggap, skb) < 0) {
|
||||
if (copy > 0 &&
|
||||
INDIRECT_CALL_1(getfrag, ip_generic_getfrag,
|
||||
from, data + transhdrlen, offset,
|
||||
copy, fraggap, skb) < 0) {
|
||||
err = -EFAULT;
|
||||
kfree_skb(skb);
|
||||
goto error;
|
||||
@ -1213,8 +1216,9 @@ static int __ip_append_data(struct sock *sk,
|
||||
unsigned int off;
|
||||
|
||||
off = skb->len;
|
||||
if (getfrag(from, skb_put(skb, copy),
|
||||
offset, copy, off, skb) < 0) {
|
||||
if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag,
|
||||
from, skb_put(skb, copy),
|
||||
offset, copy, off, skb) < 0) {
|
||||
__skb_trim(skb, off);
|
||||
err = -EFAULT;
|
||||
goto error;
|
||||
@ -1252,7 +1256,8 @@ static int __ip_append_data(struct sock *sk,
|
||||
get_page(pfrag->page);
|
||||
}
|
||||
copy = min_t(int, copy, pfrag->size - pfrag->offset);
|
||||
if (getfrag(from,
|
||||
if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag,
|
||||
from,
|
||||
page_address(pfrag->page) + pfrag->offset,
|
||||
offset, copy, skb->len, skb) < 0)
|
||||
goto error_efault;
|
||||
|
@ -253,14 +253,15 @@ static int ioam6_do_fill(struct net *net, struct sk_buff *skb)
|
||||
}
|
||||
|
||||
static int ioam6_do_inline(struct net *net, struct sk_buff *skb,
|
||||
struct ioam6_lwt_encap *tuninfo)
|
||||
struct ioam6_lwt_encap *tuninfo,
|
||||
struct dst_entry *cache_dst)
|
||||
{
|
||||
struct ipv6hdr *oldhdr, *hdr;
|
||||
int hdrlen, err;
|
||||
|
||||
hdrlen = (tuninfo->eh.hdrlen + 1) << 3;
|
||||
|
||||
err = skb_cow_head(skb, hdrlen + skb->mac_len);
|
||||
err = skb_cow_head(skb, hdrlen + dst_dev_overhead(cache_dst, skb));
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
|
||||
@ -291,7 +292,8 @@ static int ioam6_do_encap(struct net *net, struct sk_buff *skb,
|
||||
struct ioam6_lwt_encap *tuninfo,
|
||||
bool has_tunsrc,
|
||||
struct in6_addr *tunsrc,
|
||||
struct in6_addr *tundst)
|
||||
struct in6_addr *tundst,
|
||||
struct dst_entry *cache_dst)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct ipv6hdr *hdr, *inner_hdr;
|
||||
@ -300,7 +302,7 @@ static int ioam6_do_encap(struct net *net, struct sk_buff *skb,
|
||||
hdrlen = (tuninfo->eh.hdrlen + 1) << 3;
|
||||
len = sizeof(*hdr) + hdrlen;
|
||||
|
||||
err = skb_cow_head(skb, len + skb->mac_len);
|
||||
err = skb_cow_head(skb, len + dst_dev_overhead(cache_dst, skb));
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
|
||||
@ -334,7 +336,7 @@ static int ioam6_do_encap(struct net *net, struct sk_buff *skb,
|
||||
|
||||
static int ioam6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct dst_entry *dst = skb_dst(skb), *cache_dst;
|
||||
struct in6_addr orig_daddr;
|
||||
struct ioam6_lwt *ilwt;
|
||||
int err = -EINVAL;
|
||||
@ -352,6 +354,10 @@ static int ioam6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
|
||||
orig_daddr = ipv6_hdr(skb)->daddr;
|
||||
|
||||
local_bh_disable();
|
||||
cache_dst = dst_cache_get(&ilwt->cache);
|
||||
local_bh_enable();
|
||||
|
||||
switch (ilwt->mode) {
|
||||
case IOAM6_IPTUNNEL_MODE_INLINE:
|
||||
do_inline:
|
||||
@ -359,7 +365,7 @@ static int ioam6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
if (ipv6_hdr(skb)->nexthdr == NEXTHDR_HOP)
|
||||
goto out;
|
||||
|
||||
err = ioam6_do_inline(net, skb, &ilwt->tuninfo);
|
||||
err = ioam6_do_inline(net, skb, &ilwt->tuninfo, cache_dst);
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
@ -369,7 +375,7 @@ static int ioam6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
/* Encapsulation (ip6ip6) */
|
||||
err = ioam6_do_encap(net, skb, &ilwt->tuninfo,
|
||||
ilwt->has_tunsrc, &ilwt->tunsrc,
|
||||
&ilwt->tundst);
|
||||
&ilwt->tundst, cache_dst);
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
@ -387,41 +393,36 @@ static int ioam6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
goto drop;
|
||||
}
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
if (unlikely(!cache_dst)) {
|
||||
struct ipv6hdr *hdr = ipv6_hdr(skb);
|
||||
struct flowi6 fl6;
|
||||
|
||||
if (!ipv6_addr_equal(&orig_daddr, &ipv6_hdr(skb)->daddr)) {
|
||||
local_bh_disable();
|
||||
dst = dst_cache_get(&ilwt->cache);
|
||||
local_bh_enable();
|
||||
memset(&fl6, 0, sizeof(fl6));
|
||||
fl6.daddr = hdr->daddr;
|
||||
fl6.saddr = hdr->saddr;
|
||||
fl6.flowlabel = ip6_flowinfo(hdr);
|
||||
fl6.flowi6_mark = skb->mark;
|
||||
fl6.flowi6_proto = hdr->nexthdr;
|
||||
|
||||
if (unlikely(!dst)) {
|
||||
struct ipv6hdr *hdr = ipv6_hdr(skb);
|
||||
struct flowi6 fl6;
|
||||
|
||||
memset(&fl6, 0, sizeof(fl6));
|
||||
fl6.daddr = hdr->daddr;
|
||||
fl6.saddr = hdr->saddr;
|
||||
fl6.flowlabel = ip6_flowinfo(hdr);
|
||||
fl6.flowi6_mark = skb->mark;
|
||||
fl6.flowi6_proto = hdr->nexthdr;
|
||||
|
||||
dst = ip6_route_output(net, NULL, &fl6);
|
||||
if (dst->error) {
|
||||
err = dst->error;
|
||||
dst_release(dst);
|
||||
goto drop;
|
||||
}
|
||||
|
||||
local_bh_disable();
|
||||
dst_cache_set_ip6(&ilwt->cache, dst, &fl6.saddr);
|
||||
local_bh_enable();
|
||||
cache_dst = ip6_route_output(net, NULL, &fl6);
|
||||
if (cache_dst->error) {
|
||||
err = cache_dst->error;
|
||||
dst_release(cache_dst);
|
||||
goto drop;
|
||||
}
|
||||
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, dst);
|
||||
local_bh_disable();
|
||||
dst_cache_set_ip6(&ilwt->cache, cache_dst, &fl6.saddr);
|
||||
local_bh_enable();
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(cache_dst->dev));
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
}
|
||||
|
||||
if (!ipv6_addr_equal(&orig_daddr, &ipv6_hdr(skb)->daddr)) {
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, cache_dst);
|
||||
return dst_output(net, sk, skb);
|
||||
}
|
||||
out:
|
||||
|
@ -1697,8 +1697,9 @@ static int __ip6_append_data(struct sock *sk,
|
||||
pskb_trim_unique(skb_prev, maxfraglen);
|
||||
}
|
||||
if (copy > 0 &&
|
||||
getfrag(from, data + transhdrlen, offset,
|
||||
copy, fraggap, skb) < 0) {
|
||||
INDIRECT_CALL_1(getfrag, ip_generic_getfrag,
|
||||
from, data + transhdrlen, offset,
|
||||
copy, fraggap, skb) < 0) {
|
||||
err = -EFAULT;
|
||||
kfree_skb(skb);
|
||||
goto error;
|
||||
@ -1742,8 +1743,9 @@ static int __ip6_append_data(struct sock *sk,
|
||||
unsigned int off;
|
||||
|
||||
off = skb->len;
|
||||
if (getfrag(from, skb_put(skb, copy),
|
||||
offset, copy, off, skb) < 0) {
|
||||
if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag,
|
||||
from, skb_put(skb, copy),
|
||||
offset, copy, off, skb) < 0) {
|
||||
__skb_trim(skb, off);
|
||||
err = -EFAULT;
|
||||
goto error;
|
||||
@ -1781,7 +1783,8 @@ static int __ip6_append_data(struct sock *sk,
|
||||
get_page(pfrag->page);
|
||||
}
|
||||
copy = min_t(int, copy, pfrag->size - pfrag->offset);
|
||||
if (getfrag(from,
|
||||
if (INDIRECT_CALL_1(getfrag, ip_generic_getfrag,
|
||||
from,
|
||||
page_address(pfrag->page) + pfrag->offset,
|
||||
offset, copy, skb->len, skb) < 0)
|
||||
goto error_efault;
|
||||
|
@ -125,7 +125,8 @@ static void rpl_destroy_state(struct lwtunnel_state *lwt)
|
||||
}
|
||||
|
||||
static int rpl_do_srh_inline(struct sk_buff *skb, const struct rpl_lwt *rlwt,
|
||||
const struct ipv6_rpl_sr_hdr *srh)
|
||||
const struct ipv6_rpl_sr_hdr *srh,
|
||||
struct dst_entry *cache_dst)
|
||||
{
|
||||
struct ipv6_rpl_sr_hdr *isrh, *csrh;
|
||||
const struct ipv6hdr *oldhdr;
|
||||
@ -153,7 +154,7 @@ static int rpl_do_srh_inline(struct sk_buff *skb, const struct rpl_lwt *rlwt,
|
||||
|
||||
hdrlen = ((csrh->hdrlen + 1) << 3);
|
||||
|
||||
err = skb_cow_head(skb, hdrlen + skb->mac_len);
|
||||
err = skb_cow_head(skb, hdrlen + dst_dev_overhead(cache_dst, skb));
|
||||
if (unlikely(err)) {
|
||||
kfree(buf);
|
||||
return err;
|
||||
@ -186,7 +187,8 @@ static int rpl_do_srh_inline(struct sk_buff *skb, const struct rpl_lwt *rlwt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rpl_do_srh(struct sk_buff *skb, const struct rpl_lwt *rlwt)
|
||||
static int rpl_do_srh(struct sk_buff *skb, const struct rpl_lwt *rlwt,
|
||||
struct dst_entry *cache_dst)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct rpl_iptunnel_encap *tinfo;
|
||||
@ -196,7 +198,7 @@ static int rpl_do_srh(struct sk_buff *skb, const struct rpl_lwt *rlwt)
|
||||
|
||||
tinfo = rpl_encap_lwtunnel(dst->lwtstate);
|
||||
|
||||
return rpl_do_srh_inline(skb, rlwt, tinfo->srh);
|
||||
return rpl_do_srh_inline(skb, rlwt, tinfo->srh, cache_dst);
|
||||
}
|
||||
|
||||
static int rpl_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
@ -208,14 +210,14 @@ static int rpl_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
|
||||
rlwt = rpl_lwt_lwtunnel(orig_dst->lwtstate);
|
||||
|
||||
err = rpl_do_srh(skb, rlwt);
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
local_bh_disable();
|
||||
dst = dst_cache_get(&rlwt->cache);
|
||||
local_bh_enable();
|
||||
|
||||
err = rpl_do_srh(skb, rlwt, dst);
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
if (unlikely(!dst)) {
|
||||
struct ipv6hdr *hdr = ipv6_hdr(skb);
|
||||
struct flowi6 fl6;
|
||||
@ -237,15 +239,15 @@ static int rpl_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
local_bh_disable();
|
||||
dst_cache_set_ip6(&rlwt->cache, dst, &fl6.saddr);
|
||||
local_bh_enable();
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
}
|
||||
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, dst);
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
return dst_output(net, sk, skb);
|
||||
|
||||
drop:
|
||||
@ -262,29 +264,31 @@ static int rpl_input(struct sk_buff *skb)
|
||||
|
||||
rlwt = rpl_lwt_lwtunnel(orig_dst->lwtstate);
|
||||
|
||||
err = rpl_do_srh(skb, rlwt);
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
local_bh_disable();
|
||||
dst = dst_cache_get(&rlwt->cache);
|
||||
local_bh_enable();
|
||||
|
||||
err = rpl_do_srh(skb, rlwt, dst);
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
if (!dst) {
|
||||
ip6_route_input(skb);
|
||||
dst = skb_dst(skb);
|
||||
if (!dst->error) {
|
||||
local_bh_disable();
|
||||
dst_cache_set_ip6(&rlwt->cache, dst,
|
||||
&ipv6_hdr(skb)->saddr);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
} else {
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, dst);
|
||||
}
|
||||
local_bh_enable();
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
return dst_input(skb);
|
||||
|
||||
|
@ -124,8 +124,8 @@ static __be32 seg6_make_flowlabel(struct net *net, struct sk_buff *skb,
|
||||
return flowlabel;
|
||||
}
|
||||
|
||||
/* encapsulate an IPv6 packet within an outer IPv6 header with a given SRH */
|
||||
int seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh, int proto)
|
||||
static int __seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh,
|
||||
int proto, struct dst_entry *cache_dst)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct net *net = dev_net(dst->dev);
|
||||
@ -137,7 +137,7 @@ int seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh, int proto)
|
||||
hdrlen = (osrh->hdrlen + 1) << 3;
|
||||
tot_len = hdrlen + sizeof(*hdr);
|
||||
|
||||
err = skb_cow_head(skb, tot_len + skb->mac_len);
|
||||
err = skb_cow_head(skb, tot_len + dst_dev_overhead(cache_dst, skb));
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
|
||||
@ -197,11 +197,18 @@ int seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh, int proto)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* encapsulate an IPv6 packet within an outer IPv6 header with a given SRH */
|
||||
int seg6_do_srh_encap(struct sk_buff *skb, struct ipv6_sr_hdr *osrh, int proto)
|
||||
{
|
||||
return __seg6_do_srh_encap(skb, osrh, proto, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(seg6_do_srh_encap);
|
||||
|
||||
/* encapsulate an IPv6 packet within an outer IPv6 header with reduced SRH */
|
||||
static int seg6_do_srh_encap_red(struct sk_buff *skb,
|
||||
struct ipv6_sr_hdr *osrh, int proto)
|
||||
struct ipv6_sr_hdr *osrh, int proto,
|
||||
struct dst_entry *cache_dst)
|
||||
{
|
||||
__u8 first_seg = osrh->first_segment;
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
@ -230,7 +237,7 @@ static int seg6_do_srh_encap_red(struct sk_buff *skb,
|
||||
|
||||
tot_len = red_hdrlen + sizeof(struct ipv6hdr);
|
||||
|
||||
err = skb_cow_head(skb, tot_len + skb->mac_len);
|
||||
err = skb_cow_head(skb, tot_len + dst_dev_overhead(cache_dst, skb));
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
|
||||
@ -317,8 +324,8 @@ static int seg6_do_srh_encap_red(struct sk_buff *skb,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* insert an SRH within an IPv6 packet, just after the IPv6 header */
|
||||
int seg6_do_srh_inline(struct sk_buff *skb, struct ipv6_sr_hdr *osrh)
|
||||
static int __seg6_do_srh_inline(struct sk_buff *skb, struct ipv6_sr_hdr *osrh,
|
||||
struct dst_entry *cache_dst)
|
||||
{
|
||||
struct ipv6hdr *hdr, *oldhdr;
|
||||
struct ipv6_sr_hdr *isrh;
|
||||
@ -326,7 +333,7 @@ int seg6_do_srh_inline(struct sk_buff *skb, struct ipv6_sr_hdr *osrh)
|
||||
|
||||
hdrlen = (osrh->hdrlen + 1) << 3;
|
||||
|
||||
err = skb_cow_head(skb, hdrlen + skb->mac_len);
|
||||
err = skb_cow_head(skb, hdrlen + dst_dev_overhead(cache_dst, skb));
|
||||
if (unlikely(err))
|
||||
return err;
|
||||
|
||||
@ -369,9 +376,8 @@ int seg6_do_srh_inline(struct sk_buff *skb, struct ipv6_sr_hdr *osrh)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(seg6_do_srh_inline);
|
||||
|
||||
static int seg6_do_srh(struct sk_buff *skb)
|
||||
static int seg6_do_srh(struct sk_buff *skb, struct dst_entry *cache_dst)
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct seg6_iptunnel_encap *tinfo;
|
||||
@ -384,7 +390,7 @@ static int seg6_do_srh(struct sk_buff *skb)
|
||||
if (skb->protocol != htons(ETH_P_IPV6))
|
||||
return -EINVAL;
|
||||
|
||||
err = seg6_do_srh_inline(skb, tinfo->srh);
|
||||
err = __seg6_do_srh_inline(skb, tinfo->srh, cache_dst);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
@ -402,9 +408,11 @@ static int seg6_do_srh(struct sk_buff *skb)
|
||||
return -EINVAL;
|
||||
|
||||
if (tinfo->mode == SEG6_IPTUN_MODE_ENCAP)
|
||||
err = seg6_do_srh_encap(skb, tinfo->srh, proto);
|
||||
err = __seg6_do_srh_encap(skb, tinfo->srh,
|
||||
proto, cache_dst);
|
||||
else
|
||||
err = seg6_do_srh_encap_red(skb, tinfo->srh, proto);
|
||||
err = seg6_do_srh_encap_red(skb, tinfo->srh,
|
||||
proto, cache_dst);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
@ -425,11 +433,13 @@ static int seg6_do_srh(struct sk_buff *skb)
|
||||
skb_push(skb, skb->mac_len);
|
||||
|
||||
if (tinfo->mode == SEG6_IPTUN_MODE_L2ENCAP)
|
||||
err = seg6_do_srh_encap(skb, tinfo->srh,
|
||||
IPPROTO_ETHERNET);
|
||||
err = __seg6_do_srh_encap(skb, tinfo->srh,
|
||||
IPPROTO_ETHERNET,
|
||||
cache_dst);
|
||||
else
|
||||
err = seg6_do_srh_encap_red(skb, tinfo->srh,
|
||||
IPPROTO_ETHERNET);
|
||||
IPPROTO_ETHERNET,
|
||||
cache_dst);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
@ -444,6 +454,13 @@ static int seg6_do_srh(struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* insert an SRH within an IPv6 packet, just after the IPv6 header */
|
||||
int seg6_do_srh_inline(struct sk_buff *skb, struct ipv6_sr_hdr *osrh)
|
||||
{
|
||||
return __seg6_do_srh_inline(skb, osrh, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(seg6_do_srh_inline);
|
||||
|
||||
static int seg6_input_finish(struct net *net, struct sock *sk,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
@ -458,31 +475,33 @@ static int seg6_input_core(struct net *net, struct sock *sk,
|
||||
struct seg6_lwt *slwt;
|
||||
int err;
|
||||
|
||||
err = seg6_do_srh(skb);
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
slwt = seg6_lwt_lwtunnel(orig_dst->lwtstate);
|
||||
|
||||
local_bh_disable();
|
||||
dst = dst_cache_get(&slwt->cache);
|
||||
local_bh_enable();
|
||||
|
||||
err = seg6_do_srh(skb, dst);
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
if (!dst) {
|
||||
ip6_route_input(skb);
|
||||
dst = skb_dst(skb);
|
||||
if (!dst->error) {
|
||||
local_bh_disable();
|
||||
dst_cache_set_ip6(&slwt->cache, dst,
|
||||
&ipv6_hdr(skb)->saddr);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
} else {
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, dst);
|
||||
}
|
||||
local_bh_enable();
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
if (static_branch_unlikely(&nf_hooks_lwtunnel_enabled))
|
||||
return NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT,
|
||||
@ -528,16 +547,16 @@ static int seg6_output_core(struct net *net, struct sock *sk,
|
||||
struct seg6_lwt *slwt;
|
||||
int err;
|
||||
|
||||
err = seg6_do_srh(skb);
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
slwt = seg6_lwt_lwtunnel(orig_dst->lwtstate);
|
||||
|
||||
local_bh_disable();
|
||||
dst = dst_cache_get(&slwt->cache);
|
||||
local_bh_enable();
|
||||
|
||||
err = seg6_do_srh(skb, dst);
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
if (unlikely(!dst)) {
|
||||
struct ipv6hdr *hdr = ipv6_hdr(skb);
|
||||
struct flowi6 fl6;
|
||||
@ -559,15 +578,15 @@ static int seg6_output_core(struct net *net, struct sock *sk,
|
||||
local_bh_disable();
|
||||
dst_cache_set_ip6(&slwt->cache, dst, &fl6.saddr);
|
||||
local_bh_enable();
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
}
|
||||
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, dst);
|
||||
|
||||
err = skb_cow_head(skb, LL_RESERVED_SPACE(dst->dev));
|
||||
if (unlikely(err))
|
||||
goto drop;
|
||||
|
||||
if (static_branch_unlikely(&nf_hooks_lwtunnel_enabled))
|
||||
return NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, net, sk, skb,
|
||||
NULL, skb_dst(skb)->dev, dst_output);
|
||||
|
@ -801,6 +801,8 @@ class EnumSet(SpecEnumSet):
|
||||
self.user_type = 'int'
|
||||
|
||||
self.value_pfx = yaml.get('name-prefix', f"{family.ident_name}-{yaml['name']}-")
|
||||
self.header = yaml.get('header', None)
|
||||
self.enum_cnt_name = yaml.get('enum-cnt-name', None)
|
||||
|
||||
super().__init__(family, yaml)
|
||||
|
||||
@ -2417,6 +2419,87 @@ def uapi_enum_start(family, cw, obj, ckey='', enum_name='enum-name'):
|
||||
cw.block_start(line=start_line)
|
||||
|
||||
|
||||
def render_uapi_unified(family, cw, max_by_define, separate_ntf):
|
||||
max_name = c_upper(family.get('cmd-max-name', f"{family.op_prefix}MAX"))
|
||||
cnt_name = c_upper(family.get('cmd-cnt-name', f"__{family.op_prefix}MAX"))
|
||||
max_value = f"({cnt_name} - 1)"
|
||||
|
||||
uapi_enum_start(family, cw, family['operations'], 'enum-name')
|
||||
val = 0
|
||||
for op in family.msgs.values():
|
||||
if separate_ntf and ('notify' in op or 'event' in op):
|
||||
continue
|
||||
|
||||
suffix = ','
|
||||
if op.value != val:
|
||||
suffix = f" = {op.value},"
|
||||
val = op.value
|
||||
cw.p(op.enum_name + suffix)
|
||||
val += 1
|
||||
cw.nl()
|
||||
cw.p(cnt_name + ('' if max_by_define else ','))
|
||||
if not max_by_define:
|
||||
cw.p(f"{max_name} = {max_value}")
|
||||
cw.block_end(line=';')
|
||||
if max_by_define:
|
||||
cw.p(f"#define {max_name} {max_value}")
|
||||
cw.nl()
|
||||
|
||||
|
||||
def render_uapi_directional(family, cw, max_by_define):
|
||||
max_name = f"{family.op_prefix}USER_MAX"
|
||||
cnt_name = f"__{family.op_prefix}USER_CNT"
|
||||
max_value = f"({cnt_name} - 1)"
|
||||
|
||||
cw.block_start(line='enum')
|
||||
cw.p(c_upper(f'{family.name}_MSG_USER_NONE = 0,'))
|
||||
val = 0
|
||||
for op in family.msgs.values():
|
||||
if 'do' in op and 'event' not in op:
|
||||
suffix = ','
|
||||
if op.value and op.value != val:
|
||||
suffix = f" = {op.value},"
|
||||
val = op.value
|
||||
cw.p(op.enum_name + suffix)
|
||||
val += 1
|
||||
cw.nl()
|
||||
cw.p(cnt_name + ('' if max_by_define else ','))
|
||||
if not max_by_define:
|
||||
cw.p(f"{max_name} = {max_value}")
|
||||
cw.block_end(line=';')
|
||||
if max_by_define:
|
||||
cw.p(f"#define {max_name} {max_value}")
|
||||
cw.nl()
|
||||
|
||||
max_name = f"{family.op_prefix}KERNEL_MAX"
|
||||
cnt_name = f"__{family.op_prefix}KERNEL_CNT"
|
||||
max_value = f"({cnt_name} - 1)"
|
||||
|
||||
cw.block_start(line='enum')
|
||||
cw.p(c_upper(f'{family.name}_MSG_KERNEL_NONE = 0,'))
|
||||
val = 0
|
||||
for op in family.msgs.values():
|
||||
if ('do' in op and 'reply' in op['do']) or 'notify' in op or 'event' in op:
|
||||
enum_name = op.enum_name
|
||||
if 'event' not in op and 'notify' not in op:
|
||||
enum_name = f'{enum_name}_REPLY'
|
||||
|
||||
suffix = ','
|
||||
if op.value and op.value != val:
|
||||
suffix = f" = {op.value},"
|
||||
val = op.value
|
||||
cw.p(enum_name + suffix)
|
||||
val += 1
|
||||
cw.nl()
|
||||
cw.p(cnt_name + ('' if max_by_define else ','))
|
||||
if not max_by_define:
|
||||
cw.p(f"{max_name} = {max_value}")
|
||||
cw.block_end(line=';')
|
||||
if max_by_define:
|
||||
cw.p(f"#define {max_name} {max_value}")
|
||||
cw.nl()
|
||||
|
||||
|
||||
def render_uapi(family, cw):
|
||||
hdr_prot = f"_UAPI_LINUX_{c_upper(family.uapi_header_name)}_H"
|
||||
hdr_prot = hdr_prot.replace('/', '_')
|
||||
@ -2440,6 +2523,9 @@ def render_uapi(family, cw):
|
||||
if const['type'] == 'enum' or const['type'] == 'flags':
|
||||
enum = family.consts[const['name']]
|
||||
|
||||
if enum.header:
|
||||
continue
|
||||
|
||||
if enum.has_doc():
|
||||
if enum.has_entry_doc():
|
||||
cw.p('/**')
|
||||
@ -2472,9 +2558,12 @@ def render_uapi(family, cw):
|
||||
max_val = f' = {enum.get_mask()},'
|
||||
cw.p(max_name + max_val)
|
||||
else:
|
||||
cnt_name = enum.enum_cnt_name
|
||||
max_name = c_upper(name_pfx + 'max')
|
||||
cw.p('__' + max_name + ',')
|
||||
cw.p(max_name + ' = (__' + max_name + ' - 1)')
|
||||
if not cnt_name:
|
||||
cnt_name = '__' + name_pfx + 'max'
|
||||
cw.p(c_upper(cnt_name) + ',')
|
||||
cw.p(max_name + ' = (' + c_upper(cnt_name) + ' - 1)')
|
||||
cw.block_end(line=';')
|
||||
cw.nl()
|
||||
elif const['type'] == 'const':
|
||||
@ -2515,30 +2604,12 @@ def render_uapi(family, cw):
|
||||
# Commands
|
||||
separate_ntf = 'async-prefix' in family['operations']
|
||||
|
||||
max_name = c_upper(family.get('cmd-max-name', f"{family.op_prefix}MAX"))
|
||||
cnt_name = c_upper(family.get('cmd-cnt-name', f"__{family.op_prefix}MAX"))
|
||||
max_value = f"({cnt_name} - 1)"
|
||||
|
||||
uapi_enum_start(family, cw, family['operations'], 'enum-name')
|
||||
val = 0
|
||||
for op in family.msgs.values():
|
||||
if separate_ntf and ('notify' in op or 'event' in op):
|
||||
continue
|
||||
|
||||
suffix = ','
|
||||
if op.value != val:
|
||||
suffix = f" = {op.value},"
|
||||
val = op.value
|
||||
cw.p(op.enum_name + suffix)
|
||||
val += 1
|
||||
cw.nl()
|
||||
cw.p(cnt_name + ('' if max_by_define else ','))
|
||||
if not max_by_define:
|
||||
cw.p(f"{max_name} = {max_value}")
|
||||
cw.block_end(line=';')
|
||||
if max_by_define:
|
||||
cw.p(f"#define {max_name} {max_value}")
|
||||
cw.nl()
|
||||
if family.msg_id_model == 'unified':
|
||||
render_uapi_unified(family, cw, max_by_define, separate_ntf)
|
||||
elif family.msg_id_model == 'directional':
|
||||
render_uapi_directional(family, cw, max_by_define)
|
||||
else:
|
||||
raise Exception(f'Unsupported message enum-model {family.msg_id_model}')
|
||||
|
||||
if separate_ntf:
|
||||
uapi_enum_start(family, cw, family['operations'], enum_name='async-enum')
|
||||
@ -2662,13 +2733,6 @@ def main():
|
||||
os.sys.exit(1)
|
||||
return
|
||||
|
||||
supported_models = ['unified']
|
||||
if args.mode in ['user', 'kernel']:
|
||||
supported_models += ['directional']
|
||||
if parsed.msg_id_model not in supported_models:
|
||||
print(f'Message enum-model {parsed.msg_id_model} not supported for {args.mode} generation')
|
||||
os.sys.exit(1)
|
||||
|
||||
cw = CodeWriter(BaseNlLib(), args.out_file, overwrite=(not args.cmp_out))
|
||||
|
||||
_, spec_kernel = find_kernel_root(args.spec)
|
||||
@ -2718,12 +2782,17 @@ def main():
|
||||
else:
|
||||
cw.p(f'#include "{hdr_file}"')
|
||||
cw.p('#include "ynl.h"')
|
||||
headers = [parsed.uapi_header]
|
||||
headers = []
|
||||
for definition in parsed['definitions']:
|
||||
if 'header' in definition:
|
||||
headers.append(definition['header'])
|
||||
if args.mode == 'user':
|
||||
headers.append(parsed.uapi_header)
|
||||
seen_header = []
|
||||
for one in headers:
|
||||
cw.p(f"#include <{one}>")
|
||||
if one not in seen_header:
|
||||
cw.p(f"#include <{one}>")
|
||||
seen_header.append(one)
|
||||
cw.nl()
|
||||
|
||||
if args.mode == "user":
|
||||
|
@ -79,7 +79,7 @@ static int open_xsk(int ifindex, struct xsk *xsk, __u32 queue_id)
|
||||
.fill_size = XSK_RING_PROD__DEFAULT_NUM_DESCS,
|
||||
.comp_size = XSK_RING_CONS__DEFAULT_NUM_DESCS,
|
||||
.frame_size = XSK_UMEM__DEFAULT_FRAME_SIZE,
|
||||
.flags = XSK_UMEM__DEFAULT_FLAGS,
|
||||
.flags = XDP_UMEM_TX_METADATA_LEN,
|
||||
.tx_metadata_len = sizeof(struct xsk_tx_metadata),
|
||||
};
|
||||
__u32 idx = 0;
|
||||
@ -551,6 +551,7 @@ static void hwtstamp_enable(const char *ifname)
|
||||
{
|
||||
struct hwtstamp_config cfg = {
|
||||
.rx_filter = HWTSTAMP_FILTER_ALL,
|
||||
.tx_type = HWTSTAMP_TX_ON,
|
||||
};
|
||||
|
||||
hwtstamp_ioctl(SIOCGHWTSTAMP, ifname, &saved_hwtstamp_cfg);
|
||||
|
@ -92,6 +92,9 @@ run_udp() {
|
||||
echo "udp"
|
||||
run_in_netns ${args}
|
||||
|
||||
echo "udp sendmmsg"
|
||||
run_in_netns ${args} -m
|
||||
|
||||
echo "udp gso"
|
||||
run_in_netns ${args} -S 0
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user