Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'net-enetc-improve-statistics-for-v1-and-add-statistics-for-v4'

Wei Fang says:

====================
net: enetc: improve statistics for v1 and add statistics for v4

For ENETC v1, some standardized statistics were redundantly included in
the unstructured statistics, so remove these duplicated entries.
Previously, the unstructured statistics only contained eMAC data and
did not include pMAC data; add pMAC statistics to ensure completeness.

For ENETC v4, the driver previously reported MAC statistics only for the
internal ENETC (Pseudo MAC). Extend the implementation to provide
additional statistics for both the internal ENETC and the standalone
ENETC.
====================

Link: https://patch.msgid.link/20260408055849.1314033-1-wei.fang@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+519 -102
+2
drivers/net/ethernet/freescale/enetc/enetc.h
··· 264 264 }; 265 265 266 266 #define ENETC_REV1 0x1 267 + #define ENETC_REV4 0x4 268 + 267 269 enum enetc_errata { 268 270 ENETC_ERR_VLAN_ISOL = BIT(0), 269 271 ENETC_ERR_UCMCSWP = BIT(1),
+192
drivers/net/ethernet/freescale/enetc/enetc4_hw.h
··· 64 64 #define ENETC4_PPAUONTR 0x108 65 65 #define ENETC4_PPAUOFFTR 0x10c 66 66 67 + /* Port ingress congestion DRa (a=0,1,2,3) discard count register */ 68 + #define ENETC4_PICDRDCR(a) ((a) * 0x10 + 0x140) 69 + 67 70 /* Port Station interface promiscuous MAC mode register */ 68 71 #define ENETC4_PSIPMMR 0x200 69 72 #define PSIPMMR_SI_MAC_UP(a) BIT(a) /* a = SI index */ ··· 75 72 /* Port Station interface promiscuous VLAN mode register */ 76 73 #define ENETC4_PSIPVMR 0x204 77 74 75 + /* Port broadcast frames dropped due to MAC filtering register */ 76 + #define ENETC4_PBFDSIR 0x208 77 + 78 + /* Port frame drop MAC source address pruning register */ 79 + #define ENETC4_PFDMSAPR 0x20c 80 + 78 81 /* Port RSS key register n. n = 0,1,2,...,9 */ 79 82 #define ENETC4_PRSSKR(n) ((n) * 0x4 + 0x250) 80 83 81 84 /* Port station interface MAC address filtering capability register */ 82 85 #define ENETC4_PSIMAFCAPR 0x280 83 86 #define PSIMAFCAPR_NUM_MAC_AFTE GENMASK(11, 0) 87 + 88 + /* Port unicast frames dropped due to MAC filtering register */ 89 + #define ENETC4_PUFDMFR 0x284 90 + 91 + /* Port multicast frames dropped due to MAC filtering register */ 92 + #define ENETC4_PMFDMFR 0x288 84 93 85 94 /* Port station interface VLAN filtering capability register */ 86 95 #define ENETC4_PSIVLANFCAPR 0x2c0 ··· 101 86 /* Port station interface VLAN filtering mode register */ 102 87 #define ENETC4_PSIVLANFMR 0x2c4 103 88 #define PSIVLANFMR_VS BIT(0) 89 + 90 + /* Port unicast frames dropped VLAN filtering register */ 91 + #define ENETC4_PUFDVFR 0x2d0 92 + 93 + /* Port multicast frames dropped VLAN filtering register */ 94 + #define ENETC4_PMFDVFR 0x2d4 95 + 96 + /* Port broadcast frames dropped VLAN filtering register */ 97 + #define ENETC4_PBFDVFR 0x2d8 104 98 105 99 /* Port Station interface a primary MAC address registers */ 106 100 #define ENETC4_PSIPMAR0(a) ((a) * 0x80 + 0x2000) ··· 165 141 #define ENETC4_PSR 0x4104 166 142 #define PSR_RX_BUSY BIT(1) 167 143 144 + /* Port Rx discard count register */ 145 + #define ENETC4_PRXDCR 0x41c0 146 + 147 + /* Port Rx discard count read-reset register */ 148 + #define ENETC4_PRXDCRRR 0x41c4 149 + 150 + /* Port Rx discard count reason register 0 */ 151 + #define ENETC4_PRXDCRR0 0x41c8 152 + 153 + /* Port Rx discard count reason register 1 */ 154 + #define ENETC4_PRXDCRR1 0x41cc 155 + 168 156 /* Port traffic class a transmit maximum SDU register */ 169 157 #define ENETC4_PTCTMSDUR(a) ((a) * 0x20 + 0x4208) 170 158 #define PTCTMSDUR_MAXSDU GENMASK(15, 0) ··· 231 195 #define PM_SINGLE_STEP_OFFSET GENMASK(15, 7) 232 196 #define PM_SINGLE_STEP_OFFSET_SET(o) FIELD_PREP(PM_SINGLE_STEP_OFFSET, o) 233 197 #define PM_SINGLE_STEP_EN BIT(31) 198 + 199 + /* Port MAC 0/1 Receive Ethernet Octets Counter */ 200 + #define ENETC4_PM_REOCT(mac) (0x5100 + (mac) * 0x400) 201 + 202 + /* Port MAC 0/1 Receive Octets Counter */ 203 + #define ENETC4_PM_ROCT(mac) (0x5108 + (mac) * 0x400) 204 + 205 + /* Port MAC 0/1 Receive Alignment Error Counter Register */ 206 + #define ENETC4_PM_RALN(mac) (0x5110 + (mac) * 0x400) 207 + 208 + /* Port MAC 0/1 Receive Valid Pause Frame Counter */ 209 + #define ENETC4_PM_RXPF(mac) (0x5118 + (mac) * 0x400) 210 + 211 + /* Port MAC 0/1 Receive Frame Counter */ 212 + #define ENETC4_PM_RFRM(mac) (0x5120 + (mac) * 0x400) 213 + 214 + /* Port MAC 0/1 Receive Frame Check Sequence Error Counter */ 215 + #define ENETC4_PM_RFCS(mac) (0x5128 + (mac) * 0x400) 216 + 217 + /* Port MAC 0/1 Receive VLAN Frame Counter */ 218 + #define ENETC4_PM_RVLAN(mac) (0x5130 + (mac) * 0x400) 219 + 220 + /* Port MAC 0/1 Receive Frame Error Counter */ 221 + #define ENETC4_PM_RERR(mac) (0x5138 + (mac) * 0x400) 222 + 223 + /* Port MAC 0/1 Receive Unicast Frame Counter */ 224 + #define ENETC4_PM_RUCA(mac) (0x5140 + (mac) * 0x400) 225 + 226 + /* Port MAC 0/1 Receive Multicast Frame Counter */ 227 + #define ENETC4_PM_RMCA(mac) (0x5148 + (mac) * 0x400) 228 + 229 + /* Port MAC 0/1 Receive Broadcast Frame Counter */ 230 + #define ENETC4_PM_RBCA(mac) (0x5150 + (mac) * 0x400) 231 + 232 + /* Port MAC 0/1 Receive Dropped Packets Counter */ 233 + #define ENETC4_PM_RDRP(mac) (0x5158 + (mac) * 0x400) 234 + 235 + /* Port MAC 0/1 Receive Packets Counter */ 236 + #define ENETC4_PM_RPKT(mac) (0x5160 + (mac) * 0x400) 237 + 238 + /* Port MAC 0/1 Receive Undersized Packet Counter */ 239 + #define ENETC4_PM_RUND(mac) (0x5168 + (mac) * 0x400) 240 + 241 + /* Port MAC 0/1 Receive 64-Octet Packet Counter */ 242 + #define ENETC4_PM_R64(mac) (0x5170 + (mac) * 0x400) 243 + 244 + /* Port MAC 0/1 Receive 65 to 127-Octet Packet Counter */ 245 + #define ENETC4_PM_R127(mac) (0x5178 + (mac) * 0x400) 246 + 247 + /* Port MAC 0/1 Receive 128 to 255-Octet Packet Counter */ 248 + #define ENETC4_PM_R255(mac) (0x5180 + (mac) * 0x400) 249 + 250 + /* Port MAC 0/1 Receive 256 to 511-Octet Packet Counter */ 251 + #define ENETC4_PM_R511(mac) (0x5188 + (mac) * 0x400) 252 + 253 + /* Port MAC 0/1 Receive 512 to 1023-Octet Packet Counter */ 254 + #define ENETC4_PM_R1023(mac) (0x5190 + (mac) * 0x400) 255 + 256 + /* Port MAC 0/1 Receive 1024 to 1522-Octet Packet Counter */ 257 + #define ENETC4_PM_R1522(mac) (0x5198 + (mac) * 0x400) 258 + 259 + /* Port MAC 0/1 Receive 1523 to Max-Octet Packet Counter */ 260 + #define ENETC4_PM_R1523X(mac) (0x51a0 + (mac) * 0x400) 261 + 262 + /* Port MAC 0/1 Receive Oversized Packet Counter */ 263 + #define ENETC4_PM_ROVR(mac) (0x51a8 + (mac) * 0x400) 264 + 265 + /* Port MAC 0/1 Receive Jabber Packet Counter */ 266 + #define ENETC4_PM_RJBR(mac) (0x51b0 + (mac) * 0x400) 267 + 268 + /* Port MAC 0/1 Receive Fragment Packet Counter */ 269 + #define ENETC4_PM_RFRG(mac) (0x51b8 + (mac) * 0x400) 270 + 271 + /* Port MAC 0/1 Receive Control Packet Counter */ 272 + #define ENETC4_PM_RCNP(mac) (0x51c0 + (mac) * 0x400) 273 + 274 + /* Port MAC 0/1 Receive Dropped Not Truncated Packets Counter */ 275 + #define ENETC4_PM_RDRNTP(mac) (0x51c8 + (mac) * 0x400) 276 + 277 + /* Port MAC 0/1 Transmit Ethernet Octets Counter */ 278 + #define ENETC4_PM_TEOCT(mac) (0x5200 + (mac) * 0x400) 279 + 280 + /* Port MAC 0/1 Transmit Octets Counter */ 281 + #define ENETC4_PM_TOCT(mac) (0x5208 + (mac) * 0x400) 282 + 283 + /* Port MAC 0/1 Transmit Valid Pause Frame Counter */ 284 + #define ENETC4_PM_TXPF(mac) (0x5218 + (mac) * 0x400) 285 + 286 + /* Port MAC 0/1 Transmit Frame Counter */ 287 + #define ENETC4_PM_TFRM(mac) (0x5220 + (mac) * 0x400) 288 + 289 + /* Port MAC 0/1 Transmit Frame Check Sequence Error Counter */ 290 + #define ENETC4_PM_TFCS(mac) (0x5228 + (mac) * 0x400) 291 + 292 + /* Port MAC 0/1 Transmit VLAN Frame Counter */ 293 + #define ENETC4_PM_TVLAN(mac) (0x5230 + (mac) * 0x400) 294 + 295 + /* Port MAC 0/1 Transmit Frame Error Counter */ 296 + #define ENETC4_PM_TERR(mac) (0x5238 + (mac) * 0x400) 297 + 298 + /* Port MAC 0/1 Transmit Unicast Frame Counter */ 299 + #define ENETC4_PM_TUCA(mac) (0x5240 + (mac) * 0x400) 300 + 301 + /* Port MAC 0/1 Transmit Multicast Frame Counter */ 302 + #define ENETC4_PM_TMCA(mac) (0x5248 + (mac) * 0x400) 303 + 304 + /* Port MAC 0/1 Transmit Broadcast Frame Counter */ 305 + #define ENETC4_PM_TBCA(mac) (0x5250 + (mac) * 0x400) 306 + 307 + /* Port MAC 0/1 Transmit Packets Counter */ 308 + #define ENETC4_PM_TPKT(mac) (0x5260 + (mac) * 0x400) 309 + 310 + /* Port MAC 0/1 Transmit Undersized Packet Counter */ 311 + #define ENETC4_PM_TUND(mac) (0x5268 + (mac) * 0x400) 312 + 313 + /* Port MAC 0/1 Transmit 64-Octet Packet Counter */ 314 + #define ENETC4_PM_T64(mac) (0x5270 + (mac) * 0x400) 315 + 316 + /* Port MAC 0/1 Transmit 65 to 127-Octet Packet Counter */ 317 + #define ENETC4_PM_T127(mac) (0x5278 + (mac) * 0x400) 318 + 319 + /* Port MAC 0/1 Transmit 128 to 255-Octet Packet Counter */ 320 + #define ENETC4_PM_T255(mac) (0x5280 + (mac) * 0x400) 321 + 322 + /* Port MAC 0/1 Transmit 256 to 511-Octet Packet Counter */ 323 + #define ENETC4_PM_T511(mac) (0x5288 + (mac) * 0x400) 324 + 325 + /* Port MAC 0/1 Transmit 512 to 1023-Octet Packet Counter */ 326 + #define ENETC4_PM_T1023(mac) (0x5290 + (mac) * 0x400) 327 + 328 + /* Port MAC 0/1 Transmit 1024 to 1522-Octet Packet Counter */ 329 + #define ENETC4_PM_T1522(mac) (0x5298 + (mac) * 0x400) 330 + 331 + /* Port MAC 0/1 Transmit 1523 to TX_MTU-Octet Packet Counter */ 332 + #define ENETC4_PM_T1523X(mac) (0x52a0 + (mac) * 0x400) 333 + 334 + /* Port MAC 0/1 Transmit Control Packet Counter */ 335 + #define ENETC4_PM_TCNP(mac) (0x52c0 + (mac) * 0x400) 336 + 337 + /* Port MAC 0/1 Transmit Deferred Packet Counter */ 338 + #define ENETC4_PM_TDFR(mac) (0x52d0 + (mac) * 0x400) 339 + 340 + /* Port MAC 0/1 Transmit Multiple Collisions Counter */ 341 + #define ENETC4_PM_TMCOL(mac) (0x52d8 + (mac) * 0x400) 342 + 343 + /* Port MAC 0/1 Transmit Single Collision */ 344 + #define ENETC4_PM_TSCOL(mac) (0x52e0 + (mac) * 0x400) 345 + 346 + /* Port MAC 0/1 Transmit Late Collision Counter */ 347 + #define ENETC4_PM_TLCOL(mac) (0x52e8 + (mac) * 0x400) 348 + 349 + /* Port MAC 0/1 Transmit Excessive Collisions Counter */ 350 + #define ENETC4_PM_TECOL(mac) (0x52f0 + (mac) * 0x400) 351 + 352 + /* Port MAC 0/1 Transmit Invalid Octets Counter */ 353 + #define ENETC4_PM_TIOCT(mac) (0x52f8 + (mac) * 0x400) 234 354 235 355 /* Port MAC 0 Interface Mode Control Register */ 236 356 #define ENETC4_PM_IF_MODE(mac) (0x5300 + (mac) * 0x400)
+325 -102
drivers/net/ethernet/freescale/enetc/enetc_ethtool.c
··· 124 124 { ENETC_SITFRM, "SI tx frames" }, 125 125 { ENETC_SITUCA, "SI tx u-cast frames" }, 126 126 { ENETC_SITMCA, "SI tx m-cast frames" }, 127 - { ENETC_RBDCR(0), "Rx ring 0 discarded frames" }, 128 - { ENETC_RBDCR(1), "Rx ring 1 discarded frames" }, 129 - { ENETC_RBDCR(2), "Rx ring 2 discarded frames" }, 130 - { ENETC_RBDCR(3), "Rx ring 3 discarded frames" }, 131 - { ENETC_RBDCR(4), "Rx ring 4 discarded frames" }, 132 - { ENETC_RBDCR(5), "Rx ring 5 discarded frames" }, 133 - { ENETC_RBDCR(6), "Rx ring 6 discarded frames" }, 134 - { ENETC_RBDCR(7), "Rx ring 7 discarded frames" }, 135 - { ENETC_RBDCR(8), "Rx ring 8 discarded frames" }, 136 - { ENETC_RBDCR(9), "Rx ring 9 discarded frames" }, 137 - { ENETC_RBDCR(10), "Rx ring 10 discarded frames" }, 138 - { ENETC_RBDCR(11), "Rx ring 11 discarded frames" }, 139 - { ENETC_RBDCR(12), "Rx ring 12 discarded frames" }, 140 - { ENETC_RBDCR(13), "Rx ring 13 discarded frames" }, 141 - { ENETC_RBDCR(14), "Rx ring 14 discarded frames" }, 142 - { ENETC_RBDCR(15), "Rx ring 15 discarded frames" }, 143 127 }; 144 128 145 129 static const struct { 146 130 int reg; 147 131 char name[ETH_GSTRING_LEN] __nonstring; 148 - } enetc_pm_counters[] = { 149 - { ENETC_PM_REOCT(0), "MAC rx ethernet octets" }, 150 - { ENETC_PM_RALN(0), "MAC rx alignment errors" }, 151 - { ENETC_PM_RXPF(0), "MAC rx valid pause frames" }, 152 - { ENETC_PM_RFRM(0), "MAC rx valid frames" }, 153 - { ENETC_PM_RFCS(0), "MAC rx fcs errors" }, 154 - { ENETC_PM_RVLAN(0), "MAC rx VLAN frames" }, 155 - { ENETC_PM_RERR(0), "MAC rx frame errors" }, 156 - { ENETC_PM_RUCA(0), "MAC rx unicast frames" }, 157 - { ENETC_PM_RMCA(0), "MAC rx multicast frames" }, 158 - { ENETC_PM_RBCA(0), "MAC rx broadcast frames" }, 159 - { ENETC_PM_RDRP(0), "MAC rx dropped packets" }, 160 - { ENETC_PM_RPKT(0), "MAC rx packets" }, 161 - { ENETC_PM_RUND(0), "MAC rx undersized packets" }, 162 - { ENETC_PM_R64(0), "MAC rx 64 byte packets" }, 163 - { ENETC_PM_R127(0), "MAC rx 65-127 byte packets" }, 164 - { ENETC_PM_R255(0), "MAC rx 128-255 byte packets" }, 165 - { ENETC_PM_R511(0), "MAC rx 256-511 byte packets" }, 166 - { ENETC_PM_R1023(0), "MAC rx 512-1023 byte packets" }, 167 - { ENETC_PM_R1522(0), "MAC rx 1024-1522 byte packets" }, 168 - { ENETC_PM_R1523X(0), "MAC rx 1523 to max-octet packets" }, 169 - { ENETC_PM_ROVR(0), "MAC rx oversized packets" }, 170 - { ENETC_PM_RJBR(0), "MAC rx jabber packets" }, 171 - { ENETC_PM_RFRG(0), "MAC rx fragment packets" }, 172 - { ENETC_PM_RCNP(0), "MAC rx control packets" }, 173 - { ENETC_PM_RDRNTP(0), "MAC rx fifo drop" }, 174 - { ENETC_PM_TEOCT(0), "MAC tx ethernet octets" }, 175 - { ENETC_PM_TOCT(0), "MAC tx octets" }, 176 - { ENETC_PM_TCRSE(0), "MAC tx carrier sense errors" }, 177 - { ENETC_PM_TXPF(0), "MAC tx valid pause frames" }, 178 - { ENETC_PM_TFRM(0), "MAC tx frames" }, 179 - { ENETC_PM_TFCS(0), "MAC tx fcs errors" }, 180 - { ENETC_PM_TVLAN(0), "MAC tx VLAN frames" }, 181 - { ENETC_PM_TERR(0), "MAC tx frame errors" }, 182 - { ENETC_PM_TUCA(0), "MAC tx unicast frames" }, 183 - { ENETC_PM_TMCA(0), "MAC tx multicast frames" }, 184 - { ENETC_PM_TBCA(0), "MAC tx broadcast frames" }, 185 - { ENETC_PM_TPKT(0), "MAC tx packets" }, 186 - { ENETC_PM_TUND(0), "MAC tx undersized packets" }, 187 - { ENETC_PM_T64(0), "MAC tx 64 byte packets" }, 188 - { ENETC_PM_T127(0), "MAC tx 65-127 byte packets" }, 189 - { ENETC_PM_T255(0), "MAC tx 128-255 byte packets" }, 190 - { ENETC_PM_T511(0), "MAC tx 256-511 byte packets" }, 191 - { ENETC_PM_T1023(0), "MAC tx 512-1023 byte packets" }, 192 - { ENETC_PM_T1522(0), "MAC tx 1024-1522 byte packets" }, 193 - { ENETC_PM_T1523X(0), "MAC tx 1523 to max-octet packets" }, 194 - { ENETC_PM_TCNP(0), "MAC tx control packets" }, 195 - { ENETC_PM_TDFR(0), "MAC tx deferred packets" }, 196 - { ENETC_PM_TMCOL(0), "MAC tx multiple collisions" }, 197 - { ENETC_PM_TSCOL(0), "MAC tx single collisions" }, 198 - { ENETC_PM_TLCOL(0), "MAC tx late collisions" }, 199 - { ENETC_PM_TECOL(0), "MAC tx excessive collisions" }, 132 + } enetc_emac_counters[] = { 133 + { ENETC_PM_RVLAN(0), "eMAC rx VLAN frames" }, 134 + { ENETC_PM_RERR(0), "eMAC rx frame errors" }, 135 + { ENETC_PM_RUCA(0), "eMAC rx unicast frames" }, 136 + { ENETC_PM_RDRP(0), "eMAC rx dropped packets" }, 137 + { ENETC_PM_RPKT(0), "eMAC rx packets" }, 138 + { ENETC_PM_TOCT(0), "eMAC tx octets" }, 139 + { ENETC_PM_TFCS(0), "eMAC tx fcs errors" }, 140 + { ENETC_PM_TVLAN(0), "eMAC tx VLAN frames" }, 141 + { ENETC_PM_TUCA(0), "eMAC tx unicast frames" }, 142 + { ENETC_PM_TPKT(0), "eMAC tx packets" }, 143 + { ENETC_PM_TUND(0), "eMAC tx undersized packets" }, 144 + }; 145 + 146 + static const struct { 147 + int reg; 148 + char name[ETH_GSTRING_LEN] __nonstring; 149 + } enetc_pmac_counters[] = { 150 + { ENETC_PM_RVLAN(1), "pMAC rx VLAN frames" }, 151 + { ENETC_PM_RERR(1), "pMAC rx frame errors" }, 152 + { ENETC_PM_RUCA(1), "pMAC rx unicast frames" }, 153 + { ENETC_PM_RDRP(1), "pMAC rx dropped packets" }, 154 + { ENETC_PM_RPKT(1), "pMAC rx packets" }, 155 + { ENETC_PM_TOCT(1), "pMAC tx octets" }, 156 + { ENETC_PM_TFCS(1), "pMAC tx fcs errors" }, 157 + { ENETC_PM_TVLAN(1), "pMAC tx VLAN frames" }, 158 + { ENETC_PM_TUCA(1), "pMAC tx unicast frames" }, 159 + { ENETC_PM_TPKT(1), "pMAC tx packets" }, 160 + { ENETC_PM_TUND(1), "pMAC tx undersized packets" }, 200 161 }; 201 162 202 163 static const struct { ··· 177 216 { ENETC_PICDR(3), "ICM DR3 discarded frames" }, 178 217 }; 179 218 219 + static const struct { 220 + int reg; 221 + char name[ETH_GSTRING_LEN] __nonstring; 222 + } enetc4_emac_counters[] = { 223 + { ENETC4_PM_ROCT(0), "eMAC rx octets" }, 224 + { ENETC4_PM_RVLAN(0), "eMAC rx VLAN frames" }, 225 + { ENETC4_PM_RERR(0), "eMAC rx frame errors" }, 226 + { ENETC4_PM_RUCA(0), "eMAC rx unicast frames" }, 227 + { ENETC4_PM_RDRP(0), "eMAC rx dropped packets" }, 228 + { ENETC4_PM_RPKT(0), "eMAC rx packets" }, 229 + { ENETC4_PM_TOCT(0), "eMAC tx octets" }, 230 + { ENETC4_PM_TVLAN(0), "eMAC tx VLAN frames" }, 231 + { ENETC4_PM_TFCS(0), "eMAC tx fcs errors" }, 232 + { ENETC4_PM_TUCA(0), "eMAC tx unicast frames" }, 233 + { ENETC4_PM_TPKT(0), "eMAC tx packets" }, 234 + { ENETC4_PM_TUND(0), "eMAC tx undersized packets" }, 235 + { ENETC4_PM_TIOCT(0), "eMAC tx invalid octets" }, 236 + }; 237 + 238 + static const struct { 239 + int reg; 240 + char name[ETH_GSTRING_LEN] __nonstring; 241 + } enetc4_pmac_counters[] = { 242 + { ENETC4_PM_ROCT(1), "pMAC rx octets" }, 243 + { ENETC4_PM_RVLAN(1), "pMAC rx VLAN frames" }, 244 + { ENETC4_PM_RERR(1), "pMAC rx frame errors" }, 245 + { ENETC4_PM_RUCA(1), "pMAC rx unicast frames" }, 246 + { ENETC4_PM_RDRP(1), "pMAC rx dropped packets" }, 247 + { ENETC4_PM_RPKT(1), "pMAC rx packets" }, 248 + { ENETC4_PM_TOCT(1), "pMAC tx octets" }, 249 + { ENETC4_PM_TVLAN(1), "pMAC tx VLAN frames" }, 250 + { ENETC4_PM_TFCS(1), "pMAC tx fcs errors" }, 251 + { ENETC4_PM_TUCA(1), "pMAC tx unicast frames" }, 252 + { ENETC4_PM_TPKT(1), "pMAC tx packets" }, 253 + { ENETC4_PM_TUND(1), "pMAC tx undersized packets" }, 254 + { ENETC4_PM_TIOCT(1), "pMAC tx invalid octets" }, 255 + }; 256 + 257 + static const struct { 258 + int reg; 259 + char name[ETH_GSTRING_LEN] __nonstring; 260 + } enetc4_port_counters[] = { 261 + { ENETC4_PICDRDCR(0), "ICM DR0 discarded frames" }, 262 + { ENETC4_PICDRDCR(1), "ICM DR1 discarded frames" }, 263 + { ENETC4_PICDRDCR(2), "ICM DR2 discarded frames" }, 264 + { ENETC4_PICDRDCR(3), "ICM DR3 discarded frames" }, 265 + { ENETC4_PUFDMFR, "MAC filter discarded unicast" }, 266 + { ENETC4_PMFDMFR, "MAC filter discarded multicast" }, 267 + { ENETC4_PBFDSIR, "MAC filter discarded broadcast" }, 268 + { ENETC4_PFDMSAPR, "MAC SA pruning discarded frames" }, 269 + { ENETC4_PUFDVFR, "VLAN filter discarded unicast" }, 270 + { ENETC4_PMFDVFR, "VLAN filter discarded multicast" }, 271 + { ENETC4_PBFDVFR, "VLAN filter discarded broadcast" }, 272 + { ENETC4_PRXDCR, "MAC rx discarded frames" }, 273 + { ENETC4_PRXDCRRR, "MAC rx discard read-reset" }, 274 + { ENETC4_PRXDCRR0, "MAC rx discard reason 0" }, 275 + { ENETC4_PRXDCRR1, "MAC rx discard reason 1" }, 276 + }; 277 + 180 278 static const char rx_ring_stats[][ETH_GSTRING_LEN] = { 181 279 "Rx ring %2d frames", 182 280 "Rx ring %2d alloc errors", ··· 244 224 "Rx ring %2d recycle failures", 245 225 "Rx ring %2d redirects", 246 226 "Rx ring %2d redirect failures", 227 + "Rx ring %2d discarded frames", 247 228 }; 248 229 249 230 static const char tx_ring_stats[][ETH_GSTRING_LEN] = { ··· 257 236 static int enetc_get_sset_count(struct net_device *ndev, int sset) 258 237 { 259 238 struct enetc_ndev_priv *priv = netdev_priv(ndev); 239 + struct enetc_si *si = priv->si; 260 240 int len; 261 241 262 242 if (sset != ETH_SS_STATS) ··· 267 245 ARRAY_SIZE(tx_ring_stats) * priv->num_tx_rings + 268 246 ARRAY_SIZE(rx_ring_stats) * priv->num_rx_rings; 269 247 270 - if (!enetc_si_is_pf(priv->si)) 248 + if (!enetc_si_is_pf(si)) 271 249 return len; 272 250 273 - len += ARRAY_SIZE(enetc_port_counters); 274 - len += ARRAY_SIZE(enetc_pm_counters); 251 + if (is_enetc_rev1(si)) { 252 + len += ARRAY_SIZE(enetc_port_counters); 253 + len += ARRAY_SIZE(enetc_emac_counters); 254 + if (si->hw_features & ENETC_SI_F_QBU) 255 + len += ARRAY_SIZE(enetc_pmac_counters); 256 + } else { 257 + len += ARRAY_SIZE(enetc4_port_counters); 258 + 259 + if (enetc_is_pseudo_mac(si)) 260 + return len; 261 + 262 + len += ARRAY_SIZE(enetc4_emac_counters); 263 + if (si->hw_features & ENETC_SI_F_QBU) 264 + len += ARRAY_SIZE(enetc4_pmac_counters); 265 + } 275 266 276 267 return len; 268 + } 269 + 270 + static void enetc_get_pf_strings(struct enetc_si *si, u8 *data) 271 + { 272 + int i; 273 + 274 + for (i = 0; i < ARRAY_SIZE(enetc_port_counters); i++) 275 + ethtool_cpy(&data, enetc_port_counters[i].name); 276 + 277 + for (i = 0; i < ARRAY_SIZE(enetc_emac_counters); i++) 278 + ethtool_cpy(&data, enetc_emac_counters[i].name); 279 + 280 + if (!(si->hw_features & ENETC_SI_F_QBU)) 281 + return; 282 + 283 + for (i = 0; i < ARRAY_SIZE(enetc_pmac_counters); i++) 284 + ethtool_cpy(&data, enetc_pmac_counters[i].name); 285 + } 286 + 287 + static void enetc4_get_pf_strings(struct enetc_si *si, u8 *data) 288 + { 289 + int i; 290 + 291 + for (i = 0; i < ARRAY_SIZE(enetc4_port_counters); i++) 292 + ethtool_cpy(&data, enetc4_port_counters[i].name); 293 + 294 + if (enetc_is_pseudo_mac(si)) 295 + return; 296 + 297 + for (i = 0; i < ARRAY_SIZE(enetc4_emac_counters); i++) 298 + ethtool_cpy(&data, enetc4_emac_counters[i].name); 299 + 300 + if (!(si->hw_features & ENETC_SI_F_QBU)) 301 + return; 302 + 303 + for (i = 0; i < ARRAY_SIZE(enetc4_pmac_counters); i++) 304 + ethtool_cpy(&data, enetc4_pmac_counters[i].name); 277 305 } 278 306 279 307 static void enetc_get_strings(struct net_device *ndev, u32 stringset, u8 *data) 280 308 { 281 309 struct enetc_ndev_priv *priv = netdev_priv(ndev); 310 + struct enetc_si *si = priv->si; 282 311 int i, j; 283 312 284 313 switch (stringset) { ··· 343 270 for (j = 0; j < ARRAY_SIZE(rx_ring_stats); j++) 344 271 ethtool_sprintf(&data, rx_ring_stats[j], i); 345 272 346 - if (!enetc_si_is_pf(priv->si)) 273 + if (!enetc_si_is_pf(si)) 347 274 break; 348 275 349 - for (i = 0; i < ARRAY_SIZE(enetc_port_counters); i++) 350 - ethtool_cpy(&data, enetc_port_counters[i].name); 351 - 352 - for (i = 0; i < ARRAY_SIZE(enetc_pm_counters); i++) 353 - ethtool_cpy(&data, enetc_pm_counters[i].name); 276 + if (is_enetc_rev1(si)) 277 + enetc_get_pf_strings(si, data); 278 + else 279 + enetc4_get_pf_strings(si, data); 354 280 355 281 break; 356 282 } 283 + } 284 + 285 + static void enetc_pf_get_ethtool_stats(struct enetc_si *si, int *o, u64 *data) 286 + { 287 + struct enetc_hw *hw = &si->hw; 288 + int i; 289 + 290 + for (i = 0; i < ARRAY_SIZE(enetc_port_counters); i++) 291 + data[(*o)++] = enetc_port_rd(hw, enetc_port_counters[i].reg); 292 + 293 + for (i = 0; i < ARRAY_SIZE(enetc_emac_counters); i++) 294 + data[(*o)++] = enetc_port_rd64(hw, enetc_emac_counters[i].reg); 295 + 296 + if (!(si->hw_features & ENETC_SI_F_QBU)) 297 + return; 298 + 299 + for (i = 0; i < ARRAY_SIZE(enetc_pmac_counters); i++) 300 + data[(*o)++] = enetc_port_rd64(hw, enetc_pmac_counters[i].reg); 301 + } 302 + 303 + static void enetc4_pf_get_ethtool_stats(struct enetc_si *si, int *o, u64 *data) 304 + { 305 + struct enetc_hw *hw = &si->hw; 306 + int i; 307 + 308 + for (i = 0; i < ARRAY_SIZE(enetc4_port_counters); i++) 309 + data[(*o)++] = enetc_port_rd(hw, enetc4_port_counters[i].reg); 310 + 311 + if (enetc_is_pseudo_mac(si)) 312 + return; 313 + 314 + for (i = 0; i < ARRAY_SIZE(enetc4_emac_counters); i++) 315 + data[(*o)++] = enetc_port_rd64(hw, enetc4_emac_counters[i].reg); 316 + 317 + if (!(si->hw_features & ENETC_SI_F_QBU)) 318 + return; 319 + 320 + for (i = 0; i < ARRAY_SIZE(enetc4_pmac_counters); i++) 321 + data[(*o)++] = enetc_port_rd64(hw, enetc4_pmac_counters[i].reg); 357 322 } 358 323 359 324 static void enetc_get_ethtool_stats(struct net_device *ndev, 360 325 struct ethtool_stats *stats, u64 *data) 361 326 { 362 327 struct enetc_ndev_priv *priv = netdev_priv(ndev); 363 - struct enetc_hw *hw = &priv->si->hw; 328 + struct enetc_si *si = priv->si; 329 + struct enetc_hw *hw = &si->hw; 364 330 int i, o = 0; 365 331 366 332 for (i = 0; i < ARRAY_SIZE(enetc_si_counters); i++) ··· 420 308 data[o++] = priv->rx_ring[i]->stats.recycle_failures; 421 309 data[o++] = priv->rx_ring[i]->stats.xdp_redirect; 422 310 data[o++] = priv->rx_ring[i]->stats.xdp_redirect_failures; 311 + data[o++] = enetc_rd(hw, ENETC_RBDCR(i)); 423 312 } 424 313 425 - if (!enetc_si_is_pf(priv->si)) 314 + if (!enetc_si_is_pf(si)) 426 315 return; 427 316 428 - for (i = 0; i < ARRAY_SIZE(enetc_port_counters); i++) 429 - data[o++] = enetc_port_rd(hw, enetc_port_counters[i].reg); 430 - 431 - for (i = 0; i < ARRAY_SIZE(enetc_pm_counters); i++) 432 - data[o++] = enetc_port_rd64(hw, enetc_pm_counters[i].reg); 317 + if (is_enetc_rev1(si)) 318 + enetc_pf_get_ethtool_stats(si, &o, data); 319 + else 320 + enetc4_pf_get_ethtool_stats(si, &o, data); 433 321 } 434 322 435 - static void enetc_pause_stats(struct enetc_hw *hw, int mac, 323 + static void enetc_pause_stats(struct enetc_si *si, int mac, 436 324 struct ethtool_pause_stats *pause_stats) 437 325 { 438 - pause_stats->tx_pause_frames = enetc_port_rd64(hw, ENETC_PM_TXPF(mac)); 439 - pause_stats->rx_pause_frames = enetc_port_rd64(hw, ENETC_PM_RXPF(mac)); 326 + struct enetc_hw *hw = &si->hw; 327 + 328 + switch (si->pdev->revision) { 329 + case ENETC_REV1: 330 + pause_stats->tx_pause_frames = enetc_port_rd64(hw, ENETC_PM_TXPF(mac)); 331 + pause_stats->rx_pause_frames = enetc_port_rd64(hw, ENETC_PM_RXPF(mac)); 332 + break; 333 + case ENETC_REV4: 334 + pause_stats->tx_pause_frames = enetc_port_rd64(hw, ENETC4_PM_TXPF(mac)); 335 + pause_stats->rx_pause_frames = enetc_port_rd64(hw, ENETC4_PM_RXPF(mac)); 336 + break; 337 + default: 338 + break; 339 + } 440 340 } 441 341 442 342 static void enetc_get_pause_stats(struct net_device *ndev, 443 343 struct ethtool_pause_stats *pause_stats) 444 344 { 445 345 struct enetc_ndev_priv *priv = netdev_priv(ndev); 446 - struct enetc_hw *hw = &priv->si->hw; 447 346 struct enetc_si *si = priv->si; 448 347 449 348 switch (pause_stats->src) { 450 349 case ETHTOOL_MAC_STATS_SRC_EMAC: 451 - enetc_pause_stats(hw, 0, pause_stats); 350 + enetc_pause_stats(si, 0, pause_stats); 452 351 break; 453 352 case ETHTOOL_MAC_STATS_SRC_PMAC: 454 353 if (si->hw_features & ENETC_SI_F_QBU) 455 - enetc_pause_stats(hw, 1, pause_stats); 354 + enetc_pause_stats(si, 1, pause_stats); 456 355 break; 457 356 case ETHTOOL_MAC_STATS_SRC_AGGREGATE: 458 357 ethtool_aggregate_pause_stats(ndev, pause_stats); ··· 494 371 s->BroadcastFramesReceivedOK = enetc_port_rd64(hw, ENETC_PM_RBCA(mac)); 495 372 } 496 373 497 - static void enetc_ctrl_stats(struct enetc_hw *hw, int mac, 374 + static void enetc4_mac_stats(struct enetc_hw *hw, int mac, 375 + struct ethtool_eth_mac_stats *s) 376 + { 377 + s->FramesTransmittedOK = enetc_port_rd64(hw, ENETC4_PM_TFRM(mac)); 378 + s->SingleCollisionFrames = enetc_port_rd64(hw, ENETC4_PM_TSCOL(mac)); 379 + s->MultipleCollisionFrames = enetc_port_rd64(hw, ENETC4_PM_TMCOL(mac)); 380 + s->FramesReceivedOK = enetc_port_rd64(hw, ENETC4_PM_RFRM(mac)); 381 + s->FrameCheckSequenceErrors = enetc_port_rd64(hw, ENETC4_PM_RFCS(mac)); 382 + s->AlignmentErrors = enetc_port_rd64(hw, ENETC4_PM_RALN(mac)); 383 + s->OctetsTransmittedOK = enetc_port_rd64(hw, ENETC4_PM_TEOCT(mac)); 384 + s->FramesWithDeferredXmissions = enetc_port_rd64(hw, ENETC4_PM_TDFR(mac)); 385 + s->LateCollisions = enetc_port_rd64(hw, ENETC4_PM_TLCOL(mac)); 386 + s->FramesAbortedDueToXSColls = enetc_port_rd64(hw, ENETC4_PM_TECOL(mac)); 387 + s->FramesLostDueToIntMACXmitError = enetc_port_rd64(hw, ENETC4_PM_TERR(mac)); 388 + s->OctetsReceivedOK = enetc_port_rd64(hw, ENETC4_PM_REOCT(mac)); 389 + s->FramesLostDueToIntMACRcvError = enetc_port_rd64(hw, ENETC4_PM_RDRNTP(mac)); 390 + s->MulticastFramesXmittedOK = enetc_port_rd64(hw, ENETC4_PM_TMCA(mac)); 391 + s->BroadcastFramesXmittedOK = enetc_port_rd64(hw, ENETC4_PM_TBCA(mac)); 392 + s->MulticastFramesReceivedOK = enetc_port_rd64(hw, ENETC4_PM_RMCA(mac)); 393 + s->BroadcastFramesReceivedOK = enetc_port_rd64(hw, ENETC4_PM_RBCA(mac)); 394 + } 395 + 396 + static void enetc_ctrl_stats(struct enetc_si *si, int mac, 498 397 struct ethtool_eth_ctrl_stats *s) 499 398 { 500 - s->MACControlFramesTransmitted = enetc_port_rd64(hw, ENETC_PM_TCNP(mac)); 501 - s->MACControlFramesReceived = enetc_port_rd64(hw, ENETC_PM_RCNP(mac)); 399 + struct enetc_hw *hw = &si->hw; 400 + 401 + switch (si->pdev->revision) { 402 + case ENETC_REV1: 403 + s->MACControlFramesTransmitted = enetc_port_rd64(hw, ENETC_PM_TCNP(mac)); 404 + s->MACControlFramesReceived = enetc_port_rd64(hw, ENETC_PM_RCNP(mac)); 405 + break; 406 + case ENETC_REV4: 407 + s->MACControlFramesTransmitted = enetc_port_rd64(hw, ENETC4_PM_TCNP(mac)); 408 + s->MACControlFramesReceived = enetc_port_rd64(hw, ENETC4_PM_RCNP(mac)); 409 + break; 410 + default: 411 + break; 412 + } 502 413 } 503 414 504 415 static const struct ethtool_rmon_hist_range enetc_rmon_ranges[] = { ··· 571 414 s->hist_tx[6] = enetc_port_rd64(hw, ENETC_PM_T1523X(mac)); 572 415 } 573 416 417 + static void enetc4_rmon_stats(struct enetc_hw *hw, int mac, 418 + struct ethtool_rmon_stats *s) 419 + { 420 + s->undersize_pkts = enetc_port_rd64(hw, ENETC4_PM_RUND(mac)); 421 + s->oversize_pkts = enetc_port_rd64(hw, ENETC4_PM_ROVR(mac)); 422 + s->fragments = enetc_port_rd64(hw, ENETC4_PM_RFRG(mac)); 423 + s->jabbers = enetc_port_rd64(hw, ENETC4_PM_RJBR(mac)); 424 + 425 + s->hist[0] = enetc_port_rd64(hw, ENETC4_PM_R64(mac)); 426 + s->hist[1] = enetc_port_rd64(hw, ENETC4_PM_R127(mac)); 427 + s->hist[2] = enetc_port_rd64(hw, ENETC4_PM_R255(mac)); 428 + s->hist[3] = enetc_port_rd64(hw, ENETC4_PM_R511(mac)); 429 + s->hist[4] = enetc_port_rd64(hw, ENETC4_PM_R1023(mac)); 430 + s->hist[5] = enetc_port_rd64(hw, ENETC4_PM_R1522(mac)); 431 + s->hist[6] = enetc_port_rd64(hw, ENETC4_PM_R1523X(mac)); 432 + 433 + s->hist_tx[0] = enetc_port_rd64(hw, ENETC4_PM_T64(mac)); 434 + s->hist_tx[1] = enetc_port_rd64(hw, ENETC4_PM_T127(mac)); 435 + s->hist_tx[2] = enetc_port_rd64(hw, ENETC4_PM_T255(mac)); 436 + s->hist_tx[3] = enetc_port_rd64(hw, ENETC4_PM_T511(mac)); 437 + s->hist_tx[4] = enetc_port_rd64(hw, ENETC4_PM_T1023(mac)); 438 + s->hist_tx[5] = enetc_port_rd64(hw, ENETC4_PM_T1522(mac)); 439 + s->hist_tx[6] = enetc_port_rd64(hw, ENETC4_PM_T1523X(mac)); 440 + } 441 + 442 + static void enetc_get_mac_stats(struct enetc_si *si, int mac, 443 + struct ethtool_eth_mac_stats *mac_stats) 444 + { 445 + struct enetc_hw *hw = &si->hw; 446 + 447 + switch (si->pdev->revision) { 448 + case ENETC_REV1: 449 + enetc_mac_stats(hw, mac, mac_stats); 450 + break; 451 + case ENETC_REV4: 452 + enetc4_mac_stats(hw, mac, mac_stats); 453 + break; 454 + default: 455 + break; 456 + } 457 + } 458 + 574 459 static void enetc_get_eth_mac_stats(struct net_device *ndev, 575 460 struct ethtool_eth_mac_stats *mac_stats) 576 461 { 577 462 struct enetc_ndev_priv *priv = netdev_priv(ndev); 578 - struct enetc_hw *hw = &priv->si->hw; 579 463 struct enetc_si *si = priv->si; 580 464 581 465 switch (mac_stats->src) { 582 466 case ETHTOOL_MAC_STATS_SRC_EMAC: 583 - enetc_mac_stats(hw, 0, mac_stats); 467 + enetc_get_mac_stats(si, 0, mac_stats); 584 468 break; 585 469 case ETHTOOL_MAC_STATS_SRC_PMAC: 586 470 if (si->hw_features & ENETC_SI_F_QBU) 587 - enetc_mac_stats(hw, 1, mac_stats); 471 + enetc_get_mac_stats(si, 1, mac_stats); 588 472 break; 589 473 case ETHTOOL_MAC_STATS_SRC_AGGREGATE: 590 474 ethtool_aggregate_mac_stats(ndev, mac_stats); ··· 679 481 struct ethtool_eth_ctrl_stats *ctrl_stats) 680 482 { 681 483 struct enetc_ndev_priv *priv = netdev_priv(ndev); 682 - struct enetc_hw *hw = &priv->si->hw; 683 484 struct enetc_si *si = priv->si; 684 485 685 486 switch (ctrl_stats->src) { 686 487 case ETHTOOL_MAC_STATS_SRC_EMAC: 687 - enetc_ctrl_stats(hw, 0, ctrl_stats); 488 + enetc_ctrl_stats(si, 0, ctrl_stats); 688 489 break; 689 490 case ETHTOOL_MAC_STATS_SRC_PMAC: 690 491 if (si->hw_features & ENETC_SI_F_QBU) 691 - enetc_ctrl_stats(hw, 1, ctrl_stats); 492 + enetc_ctrl_stats(si, 1, ctrl_stats); 692 493 break; 693 494 case ETHTOOL_MAC_STATS_SRC_AGGREGATE: 694 495 ethtool_aggregate_ctrl_stats(ndev, ctrl_stats); 496 + break; 497 + } 498 + } 499 + 500 + static void enetc_get_mac_rmon_stats(struct enetc_si *si, int mac, 501 + struct ethtool_rmon_stats *rmon_stats) 502 + { 503 + struct enetc_hw *hw = &si->hw; 504 + 505 + switch (si->pdev->revision) { 506 + case ENETC_REV1: 507 + enetc_rmon_stats(hw, mac, rmon_stats); 508 + break; 509 + case ENETC_REV4: 510 + enetc4_rmon_stats(hw, mac, rmon_stats); 511 + break; 512 + default: 695 513 break; 696 514 } 697 515 } ··· 717 503 const struct ethtool_rmon_hist_range **ranges) 718 504 { 719 505 struct enetc_ndev_priv *priv = netdev_priv(ndev); 720 - struct enetc_hw *hw = &priv->si->hw; 721 506 struct enetc_si *si = priv->si; 722 507 723 508 *ranges = enetc_rmon_ranges; 724 509 725 510 switch (rmon_stats->src) { 726 511 case ETHTOOL_MAC_STATS_SRC_EMAC: 727 - enetc_rmon_stats(hw, 0, rmon_stats); 512 + enetc_get_mac_rmon_stats(si, 0, rmon_stats); 728 513 break; 729 514 case ETHTOOL_MAC_STATS_SRC_PMAC: 730 515 if (si->hw_features & ENETC_SI_F_QBU) 731 - enetc_rmon_stats(hw, 1, rmon_stats); 516 + enetc_get_mac_rmon_stats(si, 1, rmon_stats); 732 517 break; 733 518 case ETHTOOL_MAC_STATS_SRC_AGGREGATE: 734 519 ethtool_aggregate_rmon_stats(ndev, rmon_stats); ··· 1569 1356 .supported_coalesce_params = ETHTOOL_COALESCE_USECS | 1570 1357 ETHTOOL_COALESCE_MAX_FRAMES | 1571 1358 ETHTOOL_COALESCE_USE_ADAPTIVE_RX, 1359 + .get_sset_count = enetc_get_sset_count, 1360 + .get_strings = enetc_get_strings, 1361 + .get_ethtool_stats = enetc_get_ethtool_stats, 1572 1362 .get_eth_mac_stats = enetc_ppm_get_eth_mac_stats, 1573 1363 .get_rx_ring_count = enetc_get_rx_ring_count, 1574 1364 .get_rxfh_key_size = enetc_get_rxfh_key_size, ··· 1614 1398 .supported_coalesce_params = ETHTOOL_COALESCE_USECS | 1615 1399 ETHTOOL_COALESCE_MAX_FRAMES | 1616 1400 ETHTOOL_COALESCE_USE_ADAPTIVE_RX, 1401 + .get_sset_count = enetc_get_sset_count, 1402 + .get_strings = enetc_get_strings, 1403 + .get_ethtool_stats = enetc_get_ethtool_stats, 1404 + .get_pause_stats = enetc_get_pause_stats, 1405 + .get_rmon_stats = enetc_get_rmon_stats, 1406 + .get_eth_ctrl_stats = enetc_get_eth_ctrl_stats, 1407 + .get_eth_mac_stats = enetc_get_eth_mac_stats, 1617 1408 .get_ringparam = enetc_get_ringparam, 1618 1409 .get_coalesce = enetc_get_coalesce, 1619 1410 .set_coalesce = enetc_set_coalesce,