1 // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) 2 /* Copyright 2017-2019 NXP */ 3 4 #include <linux/ethtool_netlink.h> 5 #include <linux/net_tstamp.h> 6 #include <linux/module.h> 7 #include "enetc.h" 8 9 static const u32 enetc_si_regs[] = { 10 ENETC_SIMR, ENETC_SIPMAR0, ENETC_SIPMAR1, ENETC_SICBDRMR, 11 ENETC_SICBDRSR, ENETC_SICBDRBAR0, ENETC_SICBDRBAR1, ENETC_SICBDRPIR, 12 ENETC_SICBDRCIR, ENETC_SICBDRLENR, ENETC_SICAPR0, ENETC_SICAPR1, 13 ENETC_SIUEFDCR 14 }; 15 16 static const u32 enetc_txbdr_regs[] = { 17 ENETC_TBMR, ENETC_TBSR, ENETC_TBBAR0, ENETC_TBBAR1, 18 ENETC_TBPIR, ENETC_TBCIR, ENETC_TBLENR, ENETC_TBIER, ENETC_TBICR0, 19 ENETC_TBICR1 20 }; 21 22 static const u32 enetc_rxbdr_regs[] = { 23 ENETC_RBMR, ENETC_RBSR, ENETC_RBBSR, ENETC_RBCIR, ENETC_RBBAR0, 24 ENETC_RBBAR1, ENETC_RBPIR, ENETC_RBLENR, ENETC_RBIER, ENETC_RBICR0, 25 ENETC_RBICR1 26 }; 27 28 static const u32 enetc_port_regs[] = { 29 ENETC_PMR, ENETC_PSR, ENETC_PSIPMR, ENETC_PSIPMAR0(0), 30 ENETC_PSIPMAR1(0), ENETC_PTXMBAR, ENETC_PCAPR0, ENETC_PCAPR1, 31 ENETC_PSICFGR0(0), ENETC_PRFSCAPR, ENETC_PTCMSDUR(0), 32 ENETC_PM0_CMD_CFG, ENETC_PM0_MAXFRM, ENETC_PM0_IF_MODE 33 }; 34 35 static const u32 enetc_port_mm_regs[] = { 36 ENETC_MMCSR, ENETC_PFPMR, ENETC_PTCFPR(0), ENETC_PTCFPR(1), 37 ENETC_PTCFPR(2), ENETC_PTCFPR(3), ENETC_PTCFPR(4), ENETC_PTCFPR(5), 38 ENETC_PTCFPR(6), ENETC_PTCFPR(7), 39 }; 40 41 static int enetc_get_reglen(struct net_device *ndev) 42 { 43 struct enetc_ndev_priv *priv = netdev_priv(ndev); 44 struct enetc_hw *hw = &priv->si->hw; 45 int len; 46 47 len = ARRAY_SIZE(enetc_si_regs); 48 len += ARRAY_SIZE(enetc_txbdr_regs) * priv->num_tx_rings; 49 len += ARRAY_SIZE(enetc_rxbdr_regs) * priv->num_rx_rings; 50 51 if (hw->port) 52 len += ARRAY_SIZE(enetc_port_regs); 53 54 if (hw->port && !!(priv->si->hw_features & ENETC_SI_F_QBU)) 55 len += ARRAY_SIZE(enetc_port_mm_regs); 56 57 len *= sizeof(u32) * 2; /* store 2 entries per reg: addr and value */ 58 59 return len; 60 } 61 62 static void enetc_get_regs(struct net_device *ndev, struct ethtool_regs *regs, 63 void *regbuf) 64 { 65 struct enetc_ndev_priv *priv = netdev_priv(ndev); 66 struct enetc_hw *hw = &priv->si->hw; 67 u32 *buf = (u32 *)regbuf; 68 int i, j; 69 u32 addr; 70 71 for (i = 0; i < ARRAY_SIZE(enetc_si_regs); i++) { 72 *buf++ = enetc_si_regs[i]; 73 *buf++ = enetc_rd(hw, enetc_si_regs[i]); 74 } 75 76 for (i = 0; i < priv->num_tx_rings; i++) { 77 for (j = 0; j < ARRAY_SIZE(enetc_txbdr_regs); j++) { 78 addr = ENETC_BDR(TX, i, enetc_txbdr_regs[j]); 79 80 *buf++ = addr; 81 *buf++ = enetc_rd(hw, addr); 82 } 83 } 84 85 for (i = 0; i < priv->num_rx_rings; i++) { 86 for (j = 0; j < ARRAY_SIZE(enetc_rxbdr_regs); j++) { 87 addr = ENETC_BDR(RX, i, enetc_rxbdr_regs[j]); 88 89 *buf++ = addr; 90 *buf++ = enetc_rd(hw, addr); 91 } 92 } 93 94 if (!hw->port) 95 return; 96 97 for (i = 0; i < ARRAY_SIZE(enetc_port_regs); i++) { 98 addr = ENETC_PORT_BASE + enetc_port_regs[i]; 99 *buf++ = addr; 100 *buf++ = enetc_rd(hw, addr); 101 } 102 103 if (priv->si->hw_features & ENETC_SI_F_QBU) { 104 for (i = 0; i < ARRAY_SIZE(enetc_port_mm_regs); i++) { 105 addr = ENETC_PORT_BASE + enetc_port_mm_regs[i]; 106 *buf++ = addr; 107 *buf++ = enetc_rd(hw, addr); 108 } 109 } 110 } 111 112 static const struct { 113 int reg; 114 char name[ETH_GSTRING_LEN]; 115 } enetc_si_counters[] = { 116 { ENETC_SIROCT, "SI rx octets" }, 117 { ENETC_SIRFRM, "SI rx frames" }, 118 { ENETC_SIRUCA, "SI rx u-cast frames" }, 119 { ENETC_SIRMCA, "SI rx m-cast frames" }, 120 { ENETC_SITOCT, "SI tx octets" }, 121 { ENETC_SITFRM, "SI tx frames" }, 122 { ENETC_SITUCA, "SI tx u-cast frames" }, 123 { ENETC_SITMCA, "SI tx m-cast frames" }, 124 { ENETC_RBDCR(0), "Rx ring 0 discarded frames" }, 125 { ENETC_RBDCR(1), "Rx ring 1 discarded frames" }, 126 { ENETC_RBDCR(2), "Rx ring 2 discarded frames" }, 127 { ENETC_RBDCR(3), "Rx ring 3 discarded frames" }, 128 { ENETC_RBDCR(4), "Rx ring 4 discarded frames" }, 129 { ENETC_RBDCR(5), "Rx ring 5 discarded frames" }, 130 { ENETC_RBDCR(6), "Rx ring 6 discarded frames" }, 131 { ENETC_RBDCR(7), "Rx ring 7 discarded frames" }, 132 { ENETC_RBDCR(8), "Rx ring 8 discarded frames" }, 133 { ENETC_RBDCR(9), "Rx ring 9 discarded frames" }, 134 { ENETC_RBDCR(10), "Rx ring 10 discarded frames" }, 135 { ENETC_RBDCR(11), "Rx ring 11 discarded frames" }, 136 { ENETC_RBDCR(12), "Rx ring 12 discarded frames" }, 137 { ENETC_RBDCR(13), "Rx ring 13 discarded frames" }, 138 { ENETC_RBDCR(14), "Rx ring 14 discarded frames" }, 139 { ENETC_RBDCR(15), "Rx ring 15 discarded frames" }, 140 }; 141 142 static const struct { 143 int reg; 144 char name[ETH_GSTRING_LEN] __nonstring; 145 } enetc_port_counters[] = { 146 { ENETC_PM_REOCT(0), "MAC rx ethernet octets" }, 147 { ENETC_PM_RALN(0), "MAC rx alignment errors" }, 148 { ENETC_PM_RXPF(0), "MAC rx valid pause frames" }, 149 { ENETC_PM_RFRM(0), "MAC rx valid frames" }, 150 { ENETC_PM_RFCS(0), "MAC rx fcs errors" }, 151 { ENETC_PM_RVLAN(0), "MAC rx VLAN frames" }, 152 { ENETC_PM_RERR(0), "MAC rx frame errors" }, 153 { ENETC_PM_RUCA(0), "MAC rx unicast frames" }, 154 { ENETC_PM_RMCA(0), "MAC rx multicast frames" }, 155 { ENETC_PM_RBCA(0), "MAC rx broadcast frames" }, 156 { ENETC_PM_RDRP(0), "MAC rx dropped packets" }, 157 { ENETC_PM_RPKT(0), "MAC rx packets" }, 158 { ENETC_PM_RUND(0), "MAC rx undersized packets" }, 159 { ENETC_PM_R64(0), "MAC rx 64 byte packets" }, 160 { ENETC_PM_R127(0), "MAC rx 65-127 byte packets" }, 161 { ENETC_PM_R255(0), "MAC rx 128-255 byte packets" }, 162 { ENETC_PM_R511(0), "MAC rx 256-511 byte packets" }, 163 { ENETC_PM_R1023(0), "MAC rx 512-1023 byte packets" }, 164 { ENETC_PM_R1522(0), "MAC rx 1024-1522 byte packets" }, 165 { ENETC_PM_R1523X(0), "MAC rx 1523 to max-octet packets" }, 166 { ENETC_PM_ROVR(0), "MAC rx oversized packets" }, 167 { ENETC_PM_RJBR(0), "MAC rx jabber packets" }, 168 { ENETC_PM_RFRG(0), "MAC rx fragment packets" }, 169 { ENETC_PM_RCNP(0), "MAC rx control packets" }, 170 { ENETC_PM_RDRNTP(0), "MAC rx fifo drop" }, 171 { ENETC_PM_TEOCT(0), "MAC tx ethernet octets" }, 172 { ENETC_PM_TOCT(0), "MAC tx octets" }, 173 { ENETC_PM_TCRSE(0), "MAC tx carrier sense errors" }, 174 { ENETC_PM_TXPF(0), "MAC tx valid pause frames" }, 175 { ENETC_PM_TFRM(0), "MAC tx frames" }, 176 { ENETC_PM_TFCS(0), "MAC tx fcs errors" }, 177 { ENETC_PM_TVLAN(0), "MAC tx VLAN frames" }, 178 { ENETC_PM_TERR(0), "MAC tx frame errors" }, 179 { ENETC_PM_TUCA(0), "MAC tx unicast frames" }, 180 { ENETC_PM_TMCA(0), "MAC tx multicast frames" }, 181 { ENETC_PM_TBCA(0), "MAC tx broadcast frames" }, 182 { ENETC_PM_TPKT(0), "MAC tx packets" }, 183 { ENETC_PM_TUND(0), "MAC tx undersized packets" }, 184 { ENETC_PM_T64(0), "MAC tx 64 byte packets" }, 185 { ENETC_PM_T127(0), "MAC tx 65-127 byte packets" }, 186 { ENETC_PM_T255(0), "MAC tx 128-255 byte packets" }, 187 { ENETC_PM_T511(0), "MAC tx 256-511 byte packets" }, 188 { ENETC_PM_T1023(0), "MAC tx 512-1023 byte packets" }, 189 { ENETC_PM_T1522(0), "MAC tx 1024-1522 byte packets" }, 190 { ENETC_PM_T1523X(0), "MAC tx 1523 to max-octet packets" }, 191 { ENETC_PM_TCNP(0), "MAC tx control packets" }, 192 { ENETC_PM_TDFR(0), "MAC tx deferred packets" }, 193 { ENETC_PM_TMCOL(0), "MAC tx multiple collisions" }, 194 { ENETC_PM_TSCOL(0), "MAC tx single collisions" }, 195 { ENETC_PM_TLCOL(0), "MAC tx late collisions" }, 196 { ENETC_PM_TECOL(0), "MAC tx excessive collisions" }, 197 { ENETC_UFDMF, "SI MAC nomatch u-cast discards" }, 198 { ENETC_MFDMF, "SI MAC nomatch m-cast discards" }, 199 { ENETC_PBFDSIR, "SI MAC nomatch b-cast discards" }, 200 { ENETC_PUFDVFR, "SI VLAN nomatch u-cast discards" }, 201 { ENETC_PMFDVFR, "SI VLAN nomatch m-cast discards" }, 202 { ENETC_PBFDVFR, "SI VLAN nomatch b-cast discards" }, 203 { ENETC_PFDMSAPR, "SI pruning discarded frames" }, 204 { ENETC_PICDR(0), "ICM DR0 discarded frames" }, 205 { ENETC_PICDR(1), "ICM DR1 discarded frames" }, 206 { ENETC_PICDR(2), "ICM DR2 discarded frames" }, 207 { ENETC_PICDR(3), "ICM DR3 discarded frames" }, 208 }; 209 210 static const char rx_ring_stats[][ETH_GSTRING_LEN] = { 211 "Rx ring %2d frames", 212 "Rx ring %2d alloc errors", 213 "Rx ring %2d XDP drops", 214 "Rx ring %2d recycles", 215 "Rx ring %2d recycle failures", 216 "Rx ring %2d redirects", 217 "Rx ring %2d redirect failures", 218 }; 219 220 static const char tx_ring_stats[][ETH_GSTRING_LEN] = { 221 "Tx ring %2d frames", 222 "Tx ring %2d XDP frames", 223 "Tx ring %2d XDP drops", 224 "Tx window drop %2d frames", 225 }; 226 227 static int enetc_get_sset_count(struct net_device *ndev, int sset) 228 { 229 struct enetc_ndev_priv *priv = netdev_priv(ndev); 230 int len; 231 232 if (sset != ETH_SS_STATS) 233 return -EOPNOTSUPP; 234 235 len = ARRAY_SIZE(enetc_si_counters) + 236 ARRAY_SIZE(tx_ring_stats) * priv->num_tx_rings + 237 ARRAY_SIZE(rx_ring_stats) * priv->num_rx_rings; 238 239 if (!enetc_si_is_pf(priv->si)) 240 return len; 241 242 len += ARRAY_SIZE(enetc_port_counters); 243 244 return len; 245 } 246 247 static void enetc_get_strings(struct net_device *ndev, u32 stringset, u8 *data) 248 { 249 struct enetc_ndev_priv *priv = netdev_priv(ndev); 250 int i, j; 251 252 switch (stringset) { 253 case ETH_SS_STATS: 254 for (i = 0; i < ARRAY_SIZE(enetc_si_counters); i++) 255 ethtool_puts(&data, enetc_si_counters[i].name); 256 for (i = 0; i < priv->num_tx_rings; i++) 257 for (j = 0; j < ARRAY_SIZE(tx_ring_stats); j++) 258 ethtool_sprintf(&data, tx_ring_stats[j], i); 259 for (i = 0; i < priv->num_rx_rings; i++) 260 for (j = 0; j < ARRAY_SIZE(rx_ring_stats); j++) 261 ethtool_sprintf(&data, rx_ring_stats[j], i); 262 263 if (!enetc_si_is_pf(priv->si)) 264 break; 265 266 for (i = 0; i < ARRAY_SIZE(enetc_port_counters); i++) 267 ethtool_cpy(&data, enetc_port_counters[i].name); 268 269 break; 270 } 271 } 272 273 static void enetc_get_ethtool_stats(struct net_device *ndev, 274 struct ethtool_stats *stats, u64 *data) 275 { 276 struct enetc_ndev_priv *priv = netdev_priv(ndev); 277 struct enetc_hw *hw = &priv->si->hw; 278 int i, o = 0; 279 280 for (i = 0; i < ARRAY_SIZE(enetc_si_counters); i++) 281 data[o++] = enetc_rd64(hw, enetc_si_counters[i].reg); 282 283 for (i = 0; i < priv->num_tx_rings; i++) { 284 data[o++] = priv->tx_ring[i]->stats.packets; 285 data[o++] = priv->tx_ring[i]->stats.xdp_tx; 286 data[o++] = priv->tx_ring[i]->stats.xdp_tx_drops; 287 data[o++] = priv->tx_ring[i]->stats.win_drop; 288 } 289 290 for (i = 0; i < priv->num_rx_rings; i++) { 291 data[o++] = priv->rx_ring[i]->stats.packets; 292 data[o++] = priv->rx_ring[i]->stats.rx_alloc_errs; 293 data[o++] = priv->rx_ring[i]->stats.xdp_drops; 294 data[o++] = priv->rx_ring[i]->stats.recycles; 295 data[o++] = priv->rx_ring[i]->stats.recycle_failures; 296 data[o++] = priv->rx_ring[i]->stats.xdp_redirect; 297 data[o++] = priv->rx_ring[i]->stats.xdp_redirect_failures; 298 } 299 300 if (!enetc_si_is_pf(priv->si)) 301 return; 302 303 for (i = 0; i < ARRAY_SIZE(enetc_port_counters); i++) 304 data[o++] = enetc_port_rd(hw, enetc_port_counters[i].reg); 305 } 306 307 static void enetc_pause_stats(struct enetc_hw *hw, int mac, 308 struct ethtool_pause_stats *pause_stats) 309 { 310 pause_stats->tx_pause_frames = enetc_port_rd(hw, ENETC_PM_TXPF(mac)); 311 pause_stats->rx_pause_frames = enetc_port_rd(hw, ENETC_PM_RXPF(mac)); 312 } 313 314 static void enetc_get_pause_stats(struct net_device *ndev, 315 struct ethtool_pause_stats *pause_stats) 316 { 317 struct enetc_ndev_priv *priv = netdev_priv(ndev); 318 struct enetc_hw *hw = &priv->si->hw; 319 struct enetc_si *si = priv->si; 320 321 switch (pause_stats->src) { 322 case ETHTOOL_MAC_STATS_SRC_EMAC: 323 enetc_pause_stats(hw, 0, pause_stats); 324 break; 325 case ETHTOOL_MAC_STATS_SRC_PMAC: 326 if (si->hw_features & ENETC_SI_F_QBU) 327 enetc_pause_stats(hw, 1, pause_stats); 328 break; 329 case ETHTOOL_MAC_STATS_SRC_AGGREGATE: 330 ethtool_aggregate_pause_stats(ndev, pause_stats); 331 break; 332 } 333 } 334 335 static void enetc_mac_stats(struct enetc_hw *hw, int mac, 336 struct ethtool_eth_mac_stats *s) 337 { 338 s->FramesTransmittedOK = enetc_port_rd(hw, ENETC_PM_TFRM(mac)); 339 s->SingleCollisionFrames = enetc_port_rd(hw, ENETC_PM_TSCOL(mac)); 340 s->MultipleCollisionFrames = enetc_port_rd(hw, ENETC_PM_TMCOL(mac)); 341 s->FramesReceivedOK = enetc_port_rd(hw, ENETC_PM_RFRM(mac)); 342 s->FrameCheckSequenceErrors = enetc_port_rd(hw, ENETC_PM_RFCS(mac)); 343 s->AlignmentErrors = enetc_port_rd(hw, ENETC_PM_RALN(mac)); 344 s->OctetsTransmittedOK = enetc_port_rd(hw, ENETC_PM_TEOCT(mac)); 345 s->FramesWithDeferredXmissions = enetc_port_rd(hw, ENETC_PM_TDFR(mac)); 346 s->LateCollisions = enetc_port_rd(hw, ENETC_PM_TLCOL(mac)); 347 s->FramesAbortedDueToXSColls = enetc_port_rd(hw, ENETC_PM_TECOL(mac)); 348 s->FramesLostDueToIntMACXmitError = enetc_port_rd(hw, ENETC_PM_TERR(mac)); 349 s->CarrierSenseErrors = enetc_port_rd(hw, ENETC_PM_TCRSE(mac)); 350 s->OctetsReceivedOK = enetc_port_rd(hw, ENETC_PM_REOCT(mac)); 351 s->FramesLostDueToIntMACRcvError = enetc_port_rd(hw, ENETC_PM_RDRNTP(mac)); 352 s->MulticastFramesXmittedOK = enetc_port_rd(hw, ENETC_PM_TMCA(mac)); 353 s->BroadcastFramesXmittedOK = enetc_port_rd(hw, ENETC_PM_TBCA(mac)); 354 s->MulticastFramesReceivedOK = enetc_port_rd(hw, ENETC_PM_RMCA(mac)); 355 s->BroadcastFramesReceivedOK = enetc_port_rd(hw, ENETC_PM_RBCA(mac)); 356 } 357 358 static void enetc_ctrl_stats(struct enetc_hw *hw, int mac, 359 struct ethtool_eth_ctrl_stats *s) 360 { 361 s->MACControlFramesTransmitted = enetc_port_rd(hw, ENETC_PM_TCNP(mac)); 362 s->MACControlFramesReceived = enetc_port_rd(hw, ENETC_PM_RCNP(mac)); 363 } 364 365 static const struct ethtool_rmon_hist_range enetc_rmon_ranges[] = { 366 { 64, 64 }, 367 { 65, 127 }, 368 { 128, 255 }, 369 { 256, 511 }, 370 { 512, 1023 }, 371 { 1024, 1522 }, 372 { 1523, ENETC_MAC_MAXFRM_SIZE }, 373 {}, 374 }; 375 376 static void enetc_rmon_stats(struct enetc_hw *hw, int mac, 377 struct ethtool_rmon_stats *s) 378 { 379 s->undersize_pkts = enetc_port_rd(hw, ENETC_PM_RUND(mac)); 380 s->oversize_pkts = enetc_port_rd(hw, ENETC_PM_ROVR(mac)); 381 s->fragments = enetc_port_rd(hw, ENETC_PM_RFRG(mac)); 382 s->jabbers = enetc_port_rd(hw, ENETC_PM_RJBR(mac)); 383 384 s->hist[0] = enetc_port_rd(hw, ENETC_PM_R64(mac)); 385 s->hist[1] = enetc_port_rd(hw, ENETC_PM_R127(mac)); 386 s->hist[2] = enetc_port_rd(hw, ENETC_PM_R255(mac)); 387 s->hist[3] = enetc_port_rd(hw, ENETC_PM_R511(mac)); 388 s->hist[4] = enetc_port_rd(hw, ENETC_PM_R1023(mac)); 389 s->hist[5] = enetc_port_rd(hw, ENETC_PM_R1522(mac)); 390 s->hist[6] = enetc_port_rd(hw, ENETC_PM_R1523X(mac)); 391 392 s->hist_tx[0] = enetc_port_rd(hw, ENETC_PM_T64(mac)); 393 s->hist_tx[1] = enetc_port_rd(hw, ENETC_PM_T127(mac)); 394 s->hist_tx[2] = enetc_port_rd(hw, ENETC_PM_T255(mac)); 395 s->hist_tx[3] = enetc_port_rd(hw, ENETC_PM_T511(mac)); 396 s->hist_tx[4] = enetc_port_rd(hw, ENETC_PM_T1023(mac)); 397 s->hist_tx[5] = enetc_port_rd(hw, ENETC_PM_T1522(mac)); 398 s->hist_tx[6] = enetc_port_rd(hw, ENETC_PM_T1523X(mac)); 399 } 400 401 static void enetc_get_eth_mac_stats(struct net_device *ndev, 402 struct ethtool_eth_mac_stats *mac_stats) 403 { 404 struct enetc_ndev_priv *priv = netdev_priv(ndev); 405 struct enetc_hw *hw = &priv->si->hw; 406 struct enetc_si *si = priv->si; 407 408 switch (mac_stats->src) { 409 case ETHTOOL_MAC_STATS_SRC_EMAC: 410 enetc_mac_stats(hw, 0, mac_stats); 411 break; 412 case ETHTOOL_MAC_STATS_SRC_PMAC: 413 if (si->hw_features & ENETC_SI_F_QBU) 414 enetc_mac_stats(hw, 1, mac_stats); 415 break; 416 case ETHTOOL_MAC_STATS_SRC_AGGREGATE: 417 ethtool_aggregate_mac_stats(ndev, mac_stats); 418 break; 419 } 420 } 421 422 static void enetc_get_eth_ctrl_stats(struct net_device *ndev, 423 struct ethtool_eth_ctrl_stats *ctrl_stats) 424 { 425 struct enetc_ndev_priv *priv = netdev_priv(ndev); 426 struct enetc_hw *hw = &priv->si->hw; 427 struct enetc_si *si = priv->si; 428 429 switch (ctrl_stats->src) { 430 case ETHTOOL_MAC_STATS_SRC_EMAC: 431 enetc_ctrl_stats(hw, 0, ctrl_stats); 432 break; 433 case ETHTOOL_MAC_STATS_SRC_PMAC: 434 if (si->hw_features & ENETC_SI_F_QBU) 435 enetc_ctrl_stats(hw, 1, ctrl_stats); 436 break; 437 case ETHTOOL_MAC_STATS_SRC_AGGREGATE: 438 ethtool_aggregate_ctrl_stats(ndev, ctrl_stats); 439 break; 440 } 441 } 442 443 static void enetc_get_rmon_stats(struct net_device *ndev, 444 struct ethtool_rmon_stats *rmon_stats, 445 const struct ethtool_rmon_hist_range **ranges) 446 { 447 struct enetc_ndev_priv *priv = netdev_priv(ndev); 448 struct enetc_hw *hw = &priv->si->hw; 449 struct enetc_si *si = priv->si; 450 451 *ranges = enetc_rmon_ranges; 452 453 switch (rmon_stats->src) { 454 case ETHTOOL_MAC_STATS_SRC_EMAC: 455 enetc_rmon_stats(hw, 0, rmon_stats); 456 break; 457 case ETHTOOL_MAC_STATS_SRC_PMAC: 458 if (si->hw_features & ENETC_SI_F_QBU) 459 enetc_rmon_stats(hw, 1, rmon_stats); 460 break; 461 case ETHTOOL_MAC_STATS_SRC_AGGREGATE: 462 ethtool_aggregate_rmon_stats(ndev, rmon_stats); 463 break; 464 } 465 } 466 467 #define ENETC_RSSHASH_L3 (RXH_L2DA | RXH_VLAN | RXH_L3_PROTO | RXH_IP_SRC | \ 468 RXH_IP_DST) 469 #define ENETC_RSSHASH_L4 (ENETC_RSSHASH_L3 | RXH_L4_B_0_1 | RXH_L4_B_2_3) 470 static int enetc_get_rxfh_fields(struct net_device *netdev, 471 struct ethtool_rxfh_fields *rxnfc) 472 { 473 static const u32 rsshash[] = { 474 [TCP_V4_FLOW] = ENETC_RSSHASH_L4, 475 [UDP_V4_FLOW] = ENETC_RSSHASH_L4, 476 [SCTP_V4_FLOW] = ENETC_RSSHASH_L4, 477 [AH_ESP_V4_FLOW] = ENETC_RSSHASH_L3, 478 [IPV4_FLOW] = ENETC_RSSHASH_L3, 479 [TCP_V6_FLOW] = ENETC_RSSHASH_L4, 480 [UDP_V6_FLOW] = ENETC_RSSHASH_L4, 481 [SCTP_V6_FLOW] = ENETC_RSSHASH_L4, 482 [AH_ESP_V6_FLOW] = ENETC_RSSHASH_L3, 483 [IPV6_FLOW] = ENETC_RSSHASH_L3, 484 [ETHER_FLOW] = 0, 485 }; 486 487 if (rxnfc->flow_type >= ARRAY_SIZE(rsshash)) 488 return -EINVAL; 489 490 rxnfc->data = rsshash[rxnfc->flow_type]; 491 492 return 0; 493 } 494 495 /* current HW spec does byte reversal on everything including MAC addresses */ 496 static void ether_addr_copy_swap(u8 *dst, const u8 *src) 497 { 498 int i; 499 500 for (i = 0; i < ETH_ALEN; i++) 501 dst[i] = src[ETH_ALEN - i - 1]; 502 } 503 504 static int enetc_set_cls_entry(struct enetc_si *si, 505 struct ethtool_rx_flow_spec *fs, bool en) 506 { 507 struct ethtool_tcpip4_spec *l4ip4_h, *l4ip4_m; 508 struct ethtool_usrip4_spec *l3ip4_h, *l3ip4_m; 509 struct ethhdr *eth_h, *eth_m; 510 struct enetc_cmd_rfse rfse = { {0} }; 511 512 if (!en) 513 goto done; 514 515 switch (fs->flow_type & 0xff) { 516 case TCP_V4_FLOW: 517 l4ip4_h = &fs->h_u.tcp_ip4_spec; 518 l4ip4_m = &fs->m_u.tcp_ip4_spec; 519 goto l4ip4; 520 case UDP_V4_FLOW: 521 l4ip4_h = &fs->h_u.udp_ip4_spec; 522 l4ip4_m = &fs->m_u.udp_ip4_spec; 523 goto l4ip4; 524 case SCTP_V4_FLOW: 525 l4ip4_h = &fs->h_u.sctp_ip4_spec; 526 l4ip4_m = &fs->m_u.sctp_ip4_spec; 527 l4ip4: 528 rfse.sip_h[0] = l4ip4_h->ip4src; 529 rfse.sip_m[0] = l4ip4_m->ip4src; 530 rfse.dip_h[0] = l4ip4_h->ip4dst; 531 rfse.dip_m[0] = l4ip4_m->ip4dst; 532 rfse.sport_h = ntohs(l4ip4_h->psrc); 533 rfse.sport_m = ntohs(l4ip4_m->psrc); 534 rfse.dport_h = ntohs(l4ip4_h->pdst); 535 rfse.dport_m = ntohs(l4ip4_m->pdst); 536 if (l4ip4_m->tos) 537 netdev_warn(si->ndev, "ToS field is not supported and was ignored\n"); 538 rfse.ethtype_h = ETH_P_IP; /* IPv4 */ 539 rfse.ethtype_m = 0xffff; 540 break; 541 case IP_USER_FLOW: 542 l3ip4_h = &fs->h_u.usr_ip4_spec; 543 l3ip4_m = &fs->m_u.usr_ip4_spec; 544 545 rfse.sip_h[0] = l3ip4_h->ip4src; 546 rfse.sip_m[0] = l3ip4_m->ip4src; 547 rfse.dip_h[0] = l3ip4_h->ip4dst; 548 rfse.dip_m[0] = l3ip4_m->ip4dst; 549 if (l3ip4_m->tos) 550 netdev_warn(si->ndev, "ToS field is not supported and was ignored\n"); 551 rfse.ethtype_h = ETH_P_IP; /* IPv4 */ 552 rfse.ethtype_m = 0xffff; 553 break; 554 case ETHER_FLOW: 555 eth_h = &fs->h_u.ether_spec; 556 eth_m = &fs->m_u.ether_spec; 557 558 ether_addr_copy_swap(rfse.smac_h, eth_h->h_source); 559 ether_addr_copy_swap(rfse.smac_m, eth_m->h_source); 560 ether_addr_copy_swap(rfse.dmac_h, eth_h->h_dest); 561 ether_addr_copy_swap(rfse.dmac_m, eth_m->h_dest); 562 rfse.ethtype_h = ntohs(eth_h->h_proto); 563 rfse.ethtype_m = ntohs(eth_m->h_proto); 564 break; 565 default: 566 return -EOPNOTSUPP; 567 } 568 569 rfse.mode |= ENETC_RFSE_EN; 570 if (fs->ring_cookie != RX_CLS_FLOW_DISC) { 571 rfse.mode |= ENETC_RFSE_MODE_BD; 572 rfse.result = fs->ring_cookie; 573 } 574 done: 575 return enetc_set_fs_entry(si, &rfse, fs->location); 576 } 577 578 static int enetc_get_rxnfc(struct net_device *ndev, struct ethtool_rxnfc *rxnfc, 579 u32 *rule_locs) 580 { 581 struct enetc_ndev_priv *priv = netdev_priv(ndev); 582 int i, j; 583 584 switch (rxnfc->cmd) { 585 case ETHTOOL_GRXRINGS: 586 rxnfc->data = priv->num_rx_rings; 587 break; 588 case ETHTOOL_GRXCLSRLCNT: 589 /* total number of entries */ 590 rxnfc->data = priv->si->num_fs_entries; 591 /* number of entries in use */ 592 rxnfc->rule_cnt = 0; 593 for (i = 0; i < priv->si->num_fs_entries; i++) 594 if (priv->cls_rules[i].used) 595 rxnfc->rule_cnt++; 596 break; 597 case ETHTOOL_GRXCLSRULE: 598 if (rxnfc->fs.location >= priv->si->num_fs_entries) 599 return -EINVAL; 600 601 /* get entry x */ 602 rxnfc->fs = priv->cls_rules[rxnfc->fs.location].fs; 603 break; 604 case ETHTOOL_GRXCLSRLALL: 605 /* total number of entries */ 606 rxnfc->data = priv->si->num_fs_entries; 607 /* array of indexes of used entries */ 608 j = 0; 609 for (i = 0; i < priv->si->num_fs_entries; i++) { 610 if (!priv->cls_rules[i].used) 611 continue; 612 if (j == rxnfc->rule_cnt) 613 return -EMSGSIZE; 614 rule_locs[j++] = i; 615 } 616 /* number of entries in use */ 617 rxnfc->rule_cnt = j; 618 break; 619 default: 620 return -EOPNOTSUPP; 621 } 622 623 return 0; 624 } 625 626 /* i.MX95 ENETC does not support RFS table, but we can use ingress port 627 * filter table to implement Wake-on-LAN filter or drop the matched flow, 628 * so the implementation will be different from enetc_get_rxnfc() and 629 * enetc_set_rxnfc(). Therefore, add enetc4_get_rxnfc() for ENETC v4 PF. 630 */ 631 static int enetc4_get_rxnfc(struct net_device *ndev, struct ethtool_rxnfc *rxnfc, 632 u32 *rule_locs) 633 { 634 struct enetc_ndev_priv *priv = netdev_priv(ndev); 635 636 switch (rxnfc->cmd) { 637 case ETHTOOL_GRXRINGS: 638 rxnfc->data = priv->num_rx_rings; 639 break; 640 default: 641 return -EOPNOTSUPP; 642 } 643 644 return 0; 645 } 646 647 static int enetc_set_rxnfc(struct net_device *ndev, struct ethtool_rxnfc *rxnfc) 648 { 649 struct enetc_ndev_priv *priv = netdev_priv(ndev); 650 int err; 651 652 switch (rxnfc->cmd) { 653 case ETHTOOL_SRXCLSRLINS: 654 if (rxnfc->fs.location >= priv->si->num_fs_entries) 655 return -EINVAL; 656 657 if (rxnfc->fs.ring_cookie >= priv->num_rx_rings && 658 rxnfc->fs.ring_cookie != RX_CLS_FLOW_DISC) 659 return -EINVAL; 660 661 err = enetc_set_cls_entry(priv->si, &rxnfc->fs, true); 662 if (err) 663 return err; 664 priv->cls_rules[rxnfc->fs.location].fs = rxnfc->fs; 665 priv->cls_rules[rxnfc->fs.location].used = 1; 666 break; 667 case ETHTOOL_SRXCLSRLDEL: 668 if (rxnfc->fs.location >= priv->si->num_fs_entries) 669 return -EINVAL; 670 671 err = enetc_set_cls_entry(priv->si, &rxnfc->fs, false); 672 if (err) 673 return err; 674 priv->cls_rules[rxnfc->fs.location].used = 0; 675 break; 676 default: 677 return -EOPNOTSUPP; 678 } 679 680 return 0; 681 } 682 683 static u32 enetc_get_rxfh_key_size(struct net_device *ndev) 684 { 685 struct enetc_ndev_priv *priv = netdev_priv(ndev); 686 687 /* return the size of the RX flow hash key. PF only */ 688 return (priv->si->hw.port) ? ENETC_RSSHASH_KEY_SIZE : 0; 689 } 690 691 static u32 enetc_get_rxfh_indir_size(struct net_device *ndev) 692 { 693 struct enetc_ndev_priv *priv = netdev_priv(ndev); 694 695 /* return the size of the RX flow hash indirection table */ 696 return priv->si->num_rss; 697 } 698 699 static int enetc_get_rss_key_base(struct enetc_si *si) 700 { 701 if (is_enetc_rev1(si)) 702 return ENETC_PRSSK(0); 703 704 return ENETC4_PRSSKR(0); 705 } 706 707 static void enetc_get_rss_key(struct enetc_si *si, const u8 *key) 708 { 709 int base = enetc_get_rss_key_base(si); 710 struct enetc_hw *hw = &si->hw; 711 int i; 712 713 for (i = 0; i < ENETC_RSSHASH_KEY_SIZE / 4; i++) 714 ((u32 *)key)[i] = enetc_port_rd(hw, base + i * 4); 715 } 716 717 static int enetc_get_rxfh(struct net_device *ndev, 718 struct ethtool_rxfh_param *rxfh) 719 { 720 struct enetc_ndev_priv *priv = netdev_priv(ndev); 721 struct enetc_si *si = priv->si; 722 int err = 0; 723 724 /* return hash function */ 725 rxfh->hfunc = ETH_RSS_HASH_TOP; 726 727 /* return hash key */ 728 if (rxfh->key && enetc_si_is_pf(si)) 729 enetc_get_rss_key(si, rxfh->key); 730 731 /* return RSS table */ 732 if (rxfh->indir) 733 err = si->ops->get_rss_table(si, rxfh->indir, si->num_rss); 734 735 return err; 736 } 737 738 void enetc_set_rss_key(struct enetc_si *si, const u8 *bytes) 739 { 740 int base = enetc_get_rss_key_base(si); 741 struct enetc_hw *hw = &si->hw; 742 int i; 743 744 for (i = 0; i < ENETC_RSSHASH_KEY_SIZE / 4; i++) 745 enetc_port_wr(hw, base + i * 4, ((u32 *)bytes)[i]); 746 } 747 EXPORT_SYMBOL_GPL(enetc_set_rss_key); 748 749 static int enetc_set_rxfh(struct net_device *ndev, 750 struct ethtool_rxfh_param *rxfh, 751 struct netlink_ext_ack *extack) 752 { 753 struct enetc_ndev_priv *priv = netdev_priv(ndev); 754 struct enetc_si *si = priv->si; 755 int err = 0; 756 757 /* set hash key, if PF */ 758 if (rxfh->key && enetc_si_is_pf(si)) 759 enetc_set_rss_key(si, rxfh->key); 760 761 /* set RSS table */ 762 if (rxfh->indir) 763 err = si->ops->set_rss_table(si, rxfh->indir, si->num_rss); 764 765 return err; 766 } 767 768 static void enetc_get_ringparam(struct net_device *ndev, 769 struct ethtool_ringparam *ring, 770 struct kernel_ethtool_ringparam *kernel_ring, 771 struct netlink_ext_ack *extack) 772 { 773 struct enetc_ndev_priv *priv = netdev_priv(ndev); 774 775 ring->rx_pending = priv->rx_bd_count; 776 ring->tx_pending = priv->tx_bd_count; 777 778 /* do some h/w sanity checks for BDR length */ 779 if (netif_running(ndev)) { 780 struct enetc_hw *hw = &priv->si->hw; 781 u32 val = enetc_rxbdr_rd(hw, 0, ENETC_RBLENR); 782 783 if (val != priv->rx_bd_count) 784 netif_err(priv, hw, ndev, "RxBDR[RBLENR] = %d!\n", val); 785 786 val = enetc_txbdr_rd(hw, 0, ENETC_TBLENR); 787 788 if (val != priv->tx_bd_count) 789 netif_err(priv, hw, ndev, "TxBDR[TBLENR] = %d!\n", val); 790 } 791 } 792 793 static int enetc_get_coalesce(struct net_device *ndev, 794 struct ethtool_coalesce *ic, 795 struct kernel_ethtool_coalesce *kernel_coal, 796 struct netlink_ext_ack *extack) 797 { 798 struct enetc_ndev_priv *priv = netdev_priv(ndev); 799 struct enetc_int_vector *v = priv->int_vector[0]; 800 u64 clk_freq = priv->sysclk_freq; 801 802 ic->tx_coalesce_usecs = enetc_cycles_to_usecs(priv->tx_ictt, clk_freq); 803 ic->rx_coalesce_usecs = enetc_cycles_to_usecs(v->rx_ictt, clk_freq); 804 805 ic->tx_max_coalesced_frames = ENETC_TXIC_PKTTHR; 806 ic->rx_max_coalesced_frames = ENETC_RXIC_PKTTHR; 807 808 ic->use_adaptive_rx_coalesce = priv->ic_mode & ENETC_IC_RX_ADAPTIVE; 809 810 return 0; 811 } 812 813 static int enetc_set_coalesce(struct net_device *ndev, 814 struct ethtool_coalesce *ic, 815 struct kernel_ethtool_coalesce *kernel_coal, 816 struct netlink_ext_ack *extack) 817 { 818 struct enetc_ndev_priv *priv = netdev_priv(ndev); 819 u64 clk_freq = priv->sysclk_freq; 820 u32 rx_ictt, tx_ictt; 821 int i, ic_mode; 822 bool changed; 823 824 tx_ictt = enetc_usecs_to_cycles(ic->tx_coalesce_usecs, clk_freq); 825 rx_ictt = enetc_usecs_to_cycles(ic->rx_coalesce_usecs, clk_freq); 826 827 if (ic->rx_max_coalesced_frames != ENETC_RXIC_PKTTHR) 828 return -EOPNOTSUPP; 829 830 if (ic->tx_max_coalesced_frames != ENETC_TXIC_PKTTHR) 831 return -EOPNOTSUPP; 832 833 ic_mode = ENETC_IC_NONE; 834 if (ic->use_adaptive_rx_coalesce) { 835 ic_mode |= ENETC_IC_RX_ADAPTIVE; 836 rx_ictt = 0x1; 837 } else { 838 ic_mode |= rx_ictt ? ENETC_IC_RX_MANUAL : 0; 839 } 840 841 ic_mode |= tx_ictt ? ENETC_IC_TX_MANUAL : 0; 842 843 /* commit the settings */ 844 changed = (ic_mode != priv->ic_mode) || (priv->tx_ictt != tx_ictt); 845 846 priv->ic_mode = ic_mode; 847 priv->tx_ictt = tx_ictt; 848 849 for (i = 0; i < priv->bdr_int_num; i++) { 850 struct enetc_int_vector *v = priv->int_vector[i]; 851 852 v->rx_ictt = rx_ictt; 853 v->rx_dim_en = !!(ic_mode & ENETC_IC_RX_ADAPTIVE); 854 } 855 856 if (netif_running(ndev) && changed) { 857 /* reconfigure the operation mode of h/w interrupts, 858 * traffic needs to be paused in the process 859 */ 860 enetc_stop(ndev); 861 enetc_start(ndev); 862 } 863 864 return 0; 865 } 866 867 static int enetc_get_ts_info(struct net_device *ndev, 868 struct kernel_ethtool_ts_info *info) 869 { 870 struct enetc_ndev_priv *priv = netdev_priv(ndev); 871 int *phc_idx; 872 873 phc_idx = symbol_get(enetc_phc_index); 874 if (phc_idx) { 875 info->phc_index = *phc_idx; 876 symbol_put(enetc_phc_index); 877 } 878 879 if (!IS_ENABLED(CONFIG_FSL_ENETC_PTP_CLOCK)) { 880 info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE; 881 882 return 0; 883 } 884 885 info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | 886 SOF_TIMESTAMPING_RX_HARDWARE | 887 SOF_TIMESTAMPING_RAW_HARDWARE | 888 SOF_TIMESTAMPING_TX_SOFTWARE; 889 890 info->tx_types = (1 << HWTSTAMP_TX_OFF) | 891 (1 << HWTSTAMP_TX_ON); 892 893 if (enetc_si_is_pf(priv->si)) 894 info->tx_types |= (1 << HWTSTAMP_TX_ONESTEP_SYNC); 895 896 info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | 897 (1 << HWTSTAMP_FILTER_ALL); 898 899 return 0; 900 } 901 902 static void enetc_get_wol(struct net_device *dev, 903 struct ethtool_wolinfo *wol) 904 { 905 wol->supported = 0; 906 wol->wolopts = 0; 907 908 if (dev->phydev) 909 phy_ethtool_get_wol(dev->phydev, wol); 910 } 911 912 static int enetc_set_wol(struct net_device *dev, 913 struct ethtool_wolinfo *wol) 914 { 915 int ret; 916 917 if (!dev->phydev) 918 return -EOPNOTSUPP; 919 920 ret = phy_ethtool_set_wol(dev->phydev, wol); 921 if (!ret) 922 device_set_wakeup_enable(&dev->dev, wol->wolopts); 923 924 return ret; 925 } 926 927 static void enetc_get_pauseparam(struct net_device *dev, 928 struct ethtool_pauseparam *pause) 929 { 930 struct enetc_ndev_priv *priv = netdev_priv(dev); 931 932 phylink_ethtool_get_pauseparam(priv->phylink, pause); 933 } 934 935 static int enetc_set_pauseparam(struct net_device *dev, 936 struct ethtool_pauseparam *pause) 937 { 938 struct enetc_ndev_priv *priv = netdev_priv(dev); 939 940 return phylink_ethtool_set_pauseparam(priv->phylink, pause); 941 } 942 943 static int enetc_get_link_ksettings(struct net_device *dev, 944 struct ethtool_link_ksettings *cmd) 945 { 946 struct enetc_ndev_priv *priv = netdev_priv(dev); 947 948 if (!priv->phylink) 949 return -EOPNOTSUPP; 950 951 return phylink_ethtool_ksettings_get(priv->phylink, cmd); 952 } 953 954 static int enetc_set_link_ksettings(struct net_device *dev, 955 const struct ethtool_link_ksettings *cmd) 956 { 957 struct enetc_ndev_priv *priv = netdev_priv(dev); 958 959 if (!priv->phylink) 960 return -EOPNOTSUPP; 961 962 return phylink_ethtool_ksettings_set(priv->phylink, cmd); 963 } 964 965 static void enetc_get_mm_stats(struct net_device *ndev, 966 struct ethtool_mm_stats *s) 967 { 968 struct enetc_ndev_priv *priv = netdev_priv(ndev); 969 struct enetc_hw *hw = &priv->si->hw; 970 struct enetc_si *si = priv->si; 971 972 if (!(si->hw_features & ENETC_SI_F_QBU)) 973 return; 974 975 s->MACMergeFrameAssErrorCount = enetc_port_rd(hw, ENETC_MMFAECR); 976 s->MACMergeFrameSmdErrorCount = enetc_port_rd(hw, ENETC_MMFSECR); 977 s->MACMergeFrameAssOkCount = enetc_port_rd(hw, ENETC_MMFAOCR); 978 s->MACMergeFragCountRx = enetc_port_rd(hw, ENETC_MMFCRXR); 979 s->MACMergeFragCountTx = enetc_port_rd(hw, ENETC_MMFCTXR); 980 s->MACMergeHoldCount = enetc_port_rd(hw, ENETC_MMHCR); 981 } 982 983 static int enetc_get_mm(struct net_device *ndev, struct ethtool_mm_state *state) 984 { 985 struct enetc_ndev_priv *priv = netdev_priv(ndev); 986 struct enetc_si *si = priv->si; 987 struct enetc_hw *hw = &si->hw; 988 u32 lafs, rafs, val; 989 990 if (!(si->hw_features & ENETC_SI_F_QBU)) 991 return -EOPNOTSUPP; 992 993 mutex_lock(&priv->mm_lock); 994 995 val = enetc_port_rd(hw, ENETC_PFPMR); 996 state->pmac_enabled = !!(val & ENETC_PFPMR_PMACE); 997 998 val = enetc_port_rd(hw, ENETC_MMCSR); 999 1000 switch (ENETC_MMCSR_GET_VSTS(val)) { 1001 case 0: 1002 state->verify_status = ETHTOOL_MM_VERIFY_STATUS_DISABLED; 1003 break; 1004 case 2: 1005 state->verify_status = ETHTOOL_MM_VERIFY_STATUS_VERIFYING; 1006 break; 1007 case 3: 1008 state->verify_status = ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED; 1009 break; 1010 case 4: 1011 state->verify_status = ETHTOOL_MM_VERIFY_STATUS_FAILED; 1012 break; 1013 case 5: 1014 default: 1015 state->verify_status = ETHTOOL_MM_VERIFY_STATUS_UNKNOWN; 1016 break; 1017 } 1018 1019 rafs = ENETC_MMCSR_GET_RAFS(val); 1020 state->tx_min_frag_size = ethtool_mm_frag_size_add_to_min(rafs); 1021 lafs = ENETC_MMCSR_GET_LAFS(val); 1022 state->rx_min_frag_size = ethtool_mm_frag_size_add_to_min(lafs); 1023 state->tx_enabled = !!(val & ENETC_MMCSR_LPE); /* mirror of MMCSR_ME */ 1024 state->tx_active = state->tx_enabled && 1025 (state->verify_status == ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED || 1026 state->verify_status == ETHTOOL_MM_VERIFY_STATUS_DISABLED); 1027 state->verify_enabled = !(val & ENETC_MMCSR_VDIS); 1028 state->verify_time = ENETC_MMCSR_GET_VT(val); 1029 /* A verifyTime of 128 ms would exceed the 7 bit width 1030 * of the ENETC_MMCSR_VT field 1031 */ 1032 state->max_verify_time = 127; 1033 1034 mutex_unlock(&priv->mm_lock); 1035 1036 return 0; 1037 } 1038 1039 static int enetc_mm_wait_tx_active(struct enetc_hw *hw, int verify_time) 1040 { 1041 int timeout = verify_time * USEC_PER_MSEC * ENETC_MM_VERIFY_RETRIES; 1042 u32 val; 1043 1044 /* This will time out after the standard value of 3 verification 1045 * attempts. To not sleep forever, it relies on a non-zero verify_time, 1046 * guarantee which is provided by the ethtool nlattr policy. 1047 */ 1048 return read_poll_timeout(enetc_port_rd, val, 1049 ENETC_MMCSR_GET_VSTS(val) == 3, 1050 ENETC_MM_VERIFY_SLEEP_US, timeout, 1051 true, hw, ENETC_MMCSR); 1052 } 1053 1054 static void enetc_set_ptcfpr(struct enetc_hw *hw, u8 preemptible_tcs) 1055 { 1056 u32 val; 1057 int tc; 1058 1059 for (tc = 0; tc < 8; tc++) { 1060 val = enetc_port_rd(hw, ENETC_PTCFPR(tc)); 1061 1062 if (preemptible_tcs & BIT(tc)) 1063 val |= ENETC_PTCFPR_FPE; 1064 else 1065 val &= ~ENETC_PTCFPR_FPE; 1066 1067 enetc_port_wr(hw, ENETC_PTCFPR(tc), val); 1068 } 1069 } 1070 1071 /* ENETC does not have an IRQ to notify changes to the MAC Merge TX status 1072 * (active/inactive), but the preemptible traffic classes should only be 1073 * committed to hardware once TX is active. Resort to polling. 1074 */ 1075 void enetc_mm_commit_preemptible_tcs(struct enetc_ndev_priv *priv) 1076 { 1077 struct enetc_hw *hw = &priv->si->hw; 1078 u8 preemptible_tcs = 0; 1079 u32 val; 1080 int err; 1081 1082 val = enetc_port_rd(hw, ENETC_MMCSR); 1083 if (!(val & ENETC_MMCSR_ME)) 1084 goto out; 1085 1086 if (!(val & ENETC_MMCSR_VDIS)) { 1087 err = enetc_mm_wait_tx_active(hw, ENETC_MMCSR_GET_VT(val)); 1088 if (err) 1089 goto out; 1090 } 1091 1092 preemptible_tcs = priv->preemptible_tcs; 1093 out: 1094 enetc_set_ptcfpr(hw, preemptible_tcs); 1095 } 1096 1097 /* FIXME: Workaround for the link partner's verification failing if ENETC 1098 * priorly received too much express traffic. The documentation doesn't 1099 * suggest this is needed. 1100 */ 1101 static void enetc_restart_emac_rx(struct enetc_si *si) 1102 { 1103 u32 val = enetc_port_rd(&si->hw, ENETC_PM0_CMD_CFG); 1104 1105 enetc_port_wr(&si->hw, ENETC_PM0_CMD_CFG, val & ~ENETC_PM0_RX_EN); 1106 1107 if (val & ENETC_PM0_RX_EN) 1108 enetc_port_wr(&si->hw, ENETC_PM0_CMD_CFG, val); 1109 } 1110 1111 static int enetc_set_mm(struct net_device *ndev, struct ethtool_mm_cfg *cfg, 1112 struct netlink_ext_ack *extack) 1113 { 1114 struct enetc_ndev_priv *priv = netdev_priv(ndev); 1115 struct enetc_hw *hw = &priv->si->hw; 1116 struct enetc_si *si = priv->si; 1117 u32 val, add_frag_size; 1118 int err; 1119 1120 if (!(si->hw_features & ENETC_SI_F_QBU)) 1121 return -EOPNOTSUPP; 1122 1123 err = ethtool_mm_frag_size_min_to_add(cfg->tx_min_frag_size, 1124 &add_frag_size, extack); 1125 if (err) 1126 return err; 1127 1128 mutex_lock(&priv->mm_lock); 1129 1130 val = enetc_port_rd(hw, ENETC_PFPMR); 1131 if (cfg->pmac_enabled) 1132 val |= ENETC_PFPMR_PMACE; 1133 else 1134 val &= ~ENETC_PFPMR_PMACE; 1135 enetc_port_wr(hw, ENETC_PFPMR, val); 1136 1137 val = enetc_port_rd(hw, ENETC_MMCSR); 1138 1139 if (cfg->verify_enabled) 1140 val &= ~ENETC_MMCSR_VDIS; 1141 else 1142 val |= ENETC_MMCSR_VDIS; 1143 1144 if (cfg->tx_enabled) 1145 priv->active_offloads |= ENETC_F_QBU; 1146 else 1147 priv->active_offloads &= ~ENETC_F_QBU; 1148 1149 /* If link is up, enable/disable MAC Merge right away */ 1150 if (!(val & ENETC_MMCSR_LINK_FAIL)) { 1151 if (!!(priv->active_offloads & ENETC_F_QBU)) 1152 val |= ENETC_MMCSR_ME; 1153 else 1154 val &= ~ENETC_MMCSR_ME; 1155 } 1156 1157 val &= ~ENETC_MMCSR_VT_MASK; 1158 val |= ENETC_MMCSR_VT(cfg->verify_time); 1159 1160 val &= ~ENETC_MMCSR_RAFS_MASK; 1161 val |= ENETC_MMCSR_RAFS(add_frag_size); 1162 1163 enetc_port_wr(hw, ENETC_MMCSR, val); 1164 1165 enetc_restart_emac_rx(priv->si); 1166 1167 enetc_mm_commit_preemptible_tcs(priv); 1168 1169 mutex_unlock(&priv->mm_lock); 1170 1171 return 0; 1172 } 1173 1174 /* When the link is lost, the verification state machine goes to the FAILED 1175 * state and doesn't restart on its own after a new link up event. 1176 * According to 802.3 Figure 99-8 - Verify state diagram, the LINK_FAIL bit 1177 * should have been sufficient to re-trigger verification, but for ENETC it 1178 * doesn't. As a workaround, we need to toggle the Merge Enable bit to 1179 * re-trigger verification when link comes up. 1180 */ 1181 void enetc_mm_link_state_update(struct enetc_ndev_priv *priv, bool link) 1182 { 1183 struct enetc_hw *hw = &priv->si->hw; 1184 u32 val; 1185 1186 mutex_lock(&priv->mm_lock); 1187 1188 val = enetc_port_rd(hw, ENETC_MMCSR); 1189 1190 if (link) { 1191 val &= ~ENETC_MMCSR_LINK_FAIL; 1192 if (priv->active_offloads & ENETC_F_QBU) 1193 val |= ENETC_MMCSR_ME; 1194 } else { 1195 val |= ENETC_MMCSR_LINK_FAIL; 1196 if (priv->active_offloads & ENETC_F_QBU) 1197 val &= ~ENETC_MMCSR_ME; 1198 } 1199 1200 enetc_port_wr(hw, ENETC_MMCSR, val); 1201 1202 enetc_mm_commit_preemptible_tcs(priv); 1203 1204 mutex_unlock(&priv->mm_lock); 1205 } 1206 EXPORT_SYMBOL_GPL(enetc_mm_link_state_update); 1207 1208 const struct ethtool_ops enetc_pf_ethtool_ops = { 1209 .supported_coalesce_params = ETHTOOL_COALESCE_USECS | 1210 ETHTOOL_COALESCE_MAX_FRAMES | 1211 ETHTOOL_COALESCE_USE_ADAPTIVE_RX, 1212 .get_regs_len = enetc_get_reglen, 1213 .get_regs = enetc_get_regs, 1214 .get_sset_count = enetc_get_sset_count, 1215 .get_strings = enetc_get_strings, 1216 .get_ethtool_stats = enetc_get_ethtool_stats, 1217 .get_pause_stats = enetc_get_pause_stats, 1218 .get_rmon_stats = enetc_get_rmon_stats, 1219 .get_eth_ctrl_stats = enetc_get_eth_ctrl_stats, 1220 .get_eth_mac_stats = enetc_get_eth_mac_stats, 1221 .get_rxnfc = enetc_get_rxnfc, 1222 .set_rxnfc = enetc_set_rxnfc, 1223 .get_rxfh_key_size = enetc_get_rxfh_key_size, 1224 .get_rxfh_indir_size = enetc_get_rxfh_indir_size, 1225 .get_rxfh = enetc_get_rxfh, 1226 .set_rxfh = enetc_set_rxfh, 1227 .get_rxfh_fields = enetc_get_rxfh_fields, 1228 .get_ringparam = enetc_get_ringparam, 1229 .get_coalesce = enetc_get_coalesce, 1230 .set_coalesce = enetc_set_coalesce, 1231 .get_link_ksettings = enetc_get_link_ksettings, 1232 .set_link_ksettings = enetc_set_link_ksettings, 1233 .get_link = ethtool_op_get_link, 1234 .get_ts_info = enetc_get_ts_info, 1235 .get_wol = enetc_get_wol, 1236 .set_wol = enetc_set_wol, 1237 .get_pauseparam = enetc_get_pauseparam, 1238 .set_pauseparam = enetc_set_pauseparam, 1239 .get_mm = enetc_get_mm, 1240 .set_mm = enetc_set_mm, 1241 .get_mm_stats = enetc_get_mm_stats, 1242 }; 1243 1244 const struct ethtool_ops enetc_vf_ethtool_ops = { 1245 .supported_coalesce_params = ETHTOOL_COALESCE_USECS | 1246 ETHTOOL_COALESCE_MAX_FRAMES | 1247 ETHTOOL_COALESCE_USE_ADAPTIVE_RX, 1248 .get_regs_len = enetc_get_reglen, 1249 .get_regs = enetc_get_regs, 1250 .get_sset_count = enetc_get_sset_count, 1251 .get_strings = enetc_get_strings, 1252 .get_ethtool_stats = enetc_get_ethtool_stats, 1253 .get_rxnfc = enetc_get_rxnfc, 1254 .set_rxnfc = enetc_set_rxnfc, 1255 .get_rxfh_indir_size = enetc_get_rxfh_indir_size, 1256 .get_rxfh = enetc_get_rxfh, 1257 .set_rxfh = enetc_set_rxfh, 1258 .get_rxfh_fields = enetc_get_rxfh_fields, 1259 .get_ringparam = enetc_get_ringparam, 1260 .get_coalesce = enetc_get_coalesce, 1261 .set_coalesce = enetc_set_coalesce, 1262 .get_link = ethtool_op_get_link, 1263 .get_ts_info = enetc_get_ts_info, 1264 }; 1265 1266 const struct ethtool_ops enetc4_pf_ethtool_ops = { 1267 .supported_coalesce_params = ETHTOOL_COALESCE_USECS | 1268 ETHTOOL_COALESCE_MAX_FRAMES | 1269 ETHTOOL_COALESCE_USE_ADAPTIVE_RX, 1270 .get_ringparam = enetc_get_ringparam, 1271 .get_coalesce = enetc_get_coalesce, 1272 .set_coalesce = enetc_set_coalesce, 1273 .get_link_ksettings = enetc_get_link_ksettings, 1274 .set_link_ksettings = enetc_set_link_ksettings, 1275 .get_link = ethtool_op_get_link, 1276 .get_wol = enetc_get_wol, 1277 .set_wol = enetc_set_wol, 1278 .get_pauseparam = enetc_get_pauseparam, 1279 .set_pauseparam = enetc_set_pauseparam, 1280 .get_rxnfc = enetc4_get_rxnfc, 1281 .get_rxfh_key_size = enetc_get_rxfh_key_size, 1282 .get_rxfh_indir_size = enetc_get_rxfh_indir_size, 1283 .get_rxfh = enetc_get_rxfh, 1284 .set_rxfh = enetc_set_rxfh, 1285 .get_rxfh_fields = enetc_get_rxfh_fields, 1286 }; 1287 1288 void enetc_set_ethtool_ops(struct net_device *ndev) 1289 { 1290 struct enetc_ndev_priv *priv = netdev_priv(ndev); 1291 1292 ndev->ethtool_ops = priv->si->drvdata->eth_ops; 1293 } 1294 EXPORT_SYMBOL_GPL(enetc_set_ethtool_ops); 1295